<?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>101634</bug_id>
          
          <creation_ts>2012-11-08 13:15:12 -0800</creation_ts>
          <short_desc>Sever Chromium&apos;s dependence on WebKitSystemInterface media control drawing functions in RenderThemeMac</short_desc>
          <delta_ts>2012-11-13 19:16:39 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</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>
          <dependson>101713</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Robert Sesek">rsesek</reporter>
          <assigned_to name="Robert Sesek">rsesek</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>eric</cc>
    
    <cc>mjs</cc>
    
    <cc>morrita</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>762100</commentid>
    <comment_count>0</comment_count>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-08 13:15:12 -0800</bug_when>
    <thetext>Chromium has RenderThemeChromiumMac that inherits from RenderThemeMac. In RenderThemeMac::paintMedia*, there are various calls to functions in WebKitSystemInterface that Chromium doesn&apos;t actually use because it has RenderMediaControlsChromium to paint its media controls. However, since RenderThemeChromiumMac inherits the base implementation in RenderThemeMac, those functions are needed for linking. If we just #if PLATFORM(MAC) guard the impls in RenderThemeMac, the Chromium port will no longer depend on those functions.

This pattern was established in https://bugs.webkit.org/show_bug.cgi?id=37204.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762106</commentid>
    <comment_count>1</comment_count>
      <attachid>173105</attachid>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-08 13:18:29 -0800</bug_when>
    <thetext>Created attachment 173105
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762114</commentid>
    <comment_count>2</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-11-08 13:28:17 -0800</bug_when>
    <thetext>Should we add a RenderThemeAppleMac.mm to hold this apple-mac specific code?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762117</commentid>
    <comment_count>3</comment_count>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-08 13:30:06 -0800</bug_when>
    <thetext>There was some discussion of that on bug 37204, but this was done instead. There&apos;s one or two other functions that do this #if-guarding, so it could make sense to have RenderThemeMac be pure virtual for the functions that differ between PLATFORM(MAC) and PLATFORM(CHROMIUM).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762444</commentid>
    <comment_count>4</comment_count>
      <attachid>173105</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-11-08 19:05:20 -0800</bug_when>
    <thetext>Comment on attachment 173105
Patch

Ok.  We might want to revisit the relationship between these classes, but that doesn&apos;t need to block your work on removing Chromium&apos;s WebKitSystemInterface dependency.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762510</commentid>
    <comment_count>5</comment_count>
      <attachid>173105</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-08 21:03:08 -0800</bug_when>
    <thetext>Comment on attachment 173105
Patch

Clearing flags on attachment: 173105

Committed r134004: &lt;http://trac.webkit.org/changeset/134004&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762511</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-08 21:03:13 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762515</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2012-11-08 21:10:24 -0800</bug_when>
    <thetext>This is RenderThemeMac. Why does it need PLATFORM(MAC) #idefs?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762516</commentid>
    <comment_count>8</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2012-11-08 21:11:32 -0800</bug_when>
    <thetext>Is there any point in trying to share RenderThemeChromiumMac and RenderThemeMac code?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762524</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-11-08 21:22:28 -0800</bug_when>
    <thetext>&gt; This is RenderThemeMac. Why does it need PLATFORM(MAC) #idefs?

Because the code is shared by apple-mac and chromium-mac.  I&apos;ve just added you to a thread on this topic.  I thought I had sent it to webkit-dev, but apparently I only sent it to the people I meant to CC.  We might want to forward the thread to webkit-dev.

&gt; Is there any point in trying to share RenderThemeChromiumMac and RenderThemeMac code?

That topic was discussed in bug 37204.  Apparently sharing code allowed us to delete a large amount of code.

Personally, I find these names confusing.  We might want to restructure things a bit is that it&apos;s more clear what code is shared between apple-mac and chromium-mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762585</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-08 22:43:41 -0800</bug_when>
    <thetext>Re-opened since this is blocked by bug 101713</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>763154</commentid>
    <comment_count>11</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2012-11-09 10:43:48 -0800</bug_when>
    <thetext>For this specific case, maybe there should be a RenderMediaControlsMac.cpp to split out the media-control-related calls, along the lines of RenderMediaControlsChromium.cpp. That would perhaps reduce the amount of ifdefing required.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>763400</commentid>
    <comment_count>12</comment_count>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-09 15:41:03 -0800</bug_when>
    <thetext>There&apos;s three other non-video methods that are currently #if-guarded, so I like Adam&apos;s suggestion of splitting out into RenderThemeAppleMac. If you&apos;d prefer, though, I could create a RenderMediaControlsMac.mm/cpp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>763401</commentid>
    <comment_count>13</comment_count>
      <attachid>173385</attachid>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-09 15:41:19 -0800</bug_when>
    <thetext>Created attachment 173385
RenderThemeAppleMac,v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>763464</commentid>
    <comment_count>14</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2012-11-09 16:58:26 -0800</bug_when>
    <thetext>Instead of making the Mac port version be &quot;AppleMac&quot;, I&apos;d suggest using &quot;MacShared&quot; for the base class to be shared between &quot;Mac&quot; and &quot;ChromiumMac&quot;. The Mac port has always been identified by &quot;mac&quot;, PLATFORM(MAC), etc, and I don&apos;t think we should introduce the term &quot;AppleMac&quot; in only this one place.

Also let&apos;s use a separate bug for distinct changes, especially since the new patch doesn&apos;t even do what the title of this bug says.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764598</commentid>
    <comment_count>15</comment_count>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-12 11:19:02 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Instead of making the Mac port version be &quot;AppleMac&quot;, I&apos;d suggest using &quot;MacShared&quot; for the base class to be shared between &quot;Mac&quot; and &quot;ChromiumMac&quot;. The Mac port has always been identified by &quot;mac&quot;, PLATFORM(MAC), etc, and I don&apos;t think we should introduce the term &quot;AppleMac&quot; in only this one place.

Done.

&gt; Also let&apos;s use a separate bug for distinct changes, especially since the new patch doesn&apos;t even do what the title of this bug says.

The reason why I repurposed this bug is because the first patch was rolled out. I&apos;ve retitled the bug to be more accurate description of what this is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764610</commentid>
    <comment_count>16</comment_count>
      <attachid>173677</attachid>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-12 11:25:54 -0800</bug_when>
    <thetext>Created attachment 173677
RenderThemeMacShared,v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765703</commentid>
    <comment_count>17</comment_count>
      <attachid>173677</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-11-13 09:46:19 -0800</bug_when>
    <thetext>Comment on attachment 173677
RenderThemeMacShared,v1

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

I didn&apos;t verify that you&apos;ve moved all this code identically, but the overall shape of this change looks like it matches what mjs asked for.

&gt; Source/WebCore/rendering/RenderThemeMac.mm:56
&gt; +    : RenderThemeMacShared()

Do you need to explicitly call the base class constructor?  Usually the compiler will do that for you.

&gt; Source/WebCore/rendering/RenderThemeMacShared.h:30
&gt; +

Looks like you&apos;ve got an extra blank line here.

&gt; Source/WebCore/rendering/RenderThemeMacShared.mm:67
&gt; +

Here too</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766031</commentid>
    <comment_count>18</comment_count>
      <attachid>173677</attachid>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-13 14:03:36 -0800</bug_when>
    <thetext>Comment on attachment 173677
RenderThemeMacShared,v1

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

Thanks for the review!

&gt;&gt; Source/WebCore/rendering/RenderThemeMac.mm:56
&gt;&gt; +    : RenderThemeMacShared()
&gt; 
&gt; Do you need to explicitly call the base class constructor?  Usually the compiler will do that for you.

Nope, left over from the old ctor.

&gt;&gt; Source/WebCore/rendering/RenderThemeMacShared.h:30
&gt;&gt; +
&gt; 
&gt; Looks like you&apos;ve got an extra blank line here.

Done.

&gt;&gt; Source/WebCore/rendering/RenderThemeMacShared.mm:67
&gt;&gt; +
&gt; 
&gt; Here too

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766032</commentid>
    <comment_count>19</comment_count>
      <attachid>173983</attachid>
    <who name="Robert Sesek">rsesek</who>
    <bug_when>2012-11-13 14:03:54 -0800</bug_when>
    <thetext>Created attachment 173983
RenderThemeMacShared,v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766316</commentid>
    <comment_count>20</comment_count>
      <attachid>173983</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-13 19:16:34 -0800</bug_when>
    <thetext>Comment on attachment 173983
RenderThemeMacShared,v2

Clearing flags on attachment: 173983

Committed r134520: &lt;http://trac.webkit.org/changeset/134520&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766317</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-13 19:16:39 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173105</attachid>
            <date>2012-11-08 13:18:29 -0800</date>
            <delta_ts>2012-11-09 15:41:15 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-101634-20121108161637.patch</filename>
            <type>text/plain</type>
            <size>13948</size>
            <attacher name="Robert Sesek">rsesek</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzOTM2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNjYwZWVjZThkNjQyMDI2
ODg5NjUwYWI0NWFlZjgyNTg4Njk4N2U4MC4uYTEzNTc1ZTA4YzE0N2YzYTZiOGM3NTNhOGMzMjI2
MWY0ZDBmMTQ3OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMzIEBACisyMDEyLTExLTA4ICBSb2Jl
cnQgU2VzZWsgIDxyc2VzZWtAY2hyb21pdW0ub3JnPgorCisgICAgICAgIEd1YXJkIGNhbGxzIHRv
IFdlYktpdFN5c3RlbUludGVyZmFjZSBtZWRpYSBjb250cm9sIGRyYXdpbmcgZnVuY3Rpb25zIGlu
IFJlbmRlclRoZW1lTWFjIHdpdGggUExBVEZPUk0oTUFDKQorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNjM0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBqdXN0IGRpc2FibGluZyB1
bnVzZWQgY29kZSBpbiBDaHJvbWl1bSBwb3J0LgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
clRoZW1lTWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmFkanVzdE1l
ZGlhU2xpZGVyVGh1bWJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpw
YWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hYzo6cGFpbnRNZWRpYU11dGVCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWM6OnBhaW50TWVkaWFQbGF5QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjOjpwYWludE1lZGlhU2Vla0JhY2tCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFTZWVrRm9yd2FyZEJ1dHRvbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVNsaWRlclRyYWNrKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2xpZGVyVGh1bWIpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFSZXdpbmRCdXR0b24pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0
dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhVG9nZ2xl
Q2xvc2VkQ2FwdGlvbnNCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6
OnBhaW50TWVkaWFDb250cm9sc0JhY2tncm91bmQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWM6OnBhaW50TWVkaWFDdXJyZW50VGltZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVRpbWVSZW1haW5pbmcpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJDb250YWluZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVZvbHVtZVNsaWRl
clRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVs
bFNjcmVlblZvbHVtZVNsaWRlclRyYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjOjpwYWludE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRodW1iKToKKwogMjAxMi0xMS0w
OCAgRWxsaW90dCBTcHJlaG4gIDxlc3ByZWhuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBTa2lw
IGZyYW1lIG93bmVyIGRpc2Nvbm5lY3Qgd2hlbiB0aGVyZSdzIG5vIGZyYW1lcwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tIGIvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tCmluZGV4IGUwODM3ZmRjNWQ0MTE4NjVl
MjMxZDhlYmU0ZjJhMjU2N2E1NDZlODAuLmQ0MzBlNjExNTQ3NzgzZjhiMjAxMzE4YmY0NzdkYmQw
MGY3ZDZmOTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVt
ZU1hYy5tbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0K
QEAgLTE3ODYsNiArMTc4Niw3IEBAIHZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFNsaWRlclRo
dW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAogCiB2b2lkIFJlbmRl
clRoZW1lTWFjOjphZGp1c3RNZWRpYVNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0CiB7CisjaWYgUExBVEZPUk0oTUFDKQogICAgIGludCB3a1BhcnQ7CiAgICAgc3dpdGNo
IChzdHlsZS0+YXBwZWFyYW5jZSgpKSB7CiAgICAgY2FzZSBNZWRpYVNsaWRlclRodW1iUGFydDoK
QEAgLTE4MTQsNiArMTgxNSw5IEBAIHZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdE1lZGlhU2xp
ZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKICAgICBmbG9hdCB6b29tTGV2
ZWwgPSBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwogICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgo
c3RhdGljX2Nhc3Q8aW50Pih3aWR0aCAqIHpvb21MZXZlbCksIEZpeGVkKSk7CiAgICAgc3R5bGUt
PnNldEhlaWdodChMZW5ndGgoc3RhdGljX2Nhc3Q8aW50PihoZWlnaHQgKiB6b29tTGV2ZWwpLCBG
aXhlZCkpOworI2Vsc2UKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyNlbmRpZgogfQogCiBl
bnVtIFdLTWVkaWFDb250cm9sbGVyVGhlbWVTdGF0ZSB7IApAQCAtMTg1MSw2ICsxODU1LDcgQEAg
c3RhdGljIEZsb2F0UmVjdCBnZXRVbnpvb21lZFJlY3RBbmRBZGp1c3RDdXJyZW50Q29udGV4dChS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFAKIAogYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRp
YUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKKyNpZiBQTEFURk9STShNQUMpCiAgICAgTm9kZSog
bm9kZSA9IG8tPm5vZGUoKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
QEAgLTE4NjAsMTAgKzE4NjUsMTUgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYUZ1
bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8KICAgICAgICAg
d2tEcmF3TWVkaWFVSVBhcnQobWVkaWFDb250cm9sRWxlbWVudFR5cGUobm9kZSksIG1lZGlhQ29u
dHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBh
cnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKIH0KIAog
Ym9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKKyNpZiBQ
TEFURk9STShNQUMpCiAgICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKICAgICBOb2RlKiBtZWRp
YU5vZGUgPSBub2RlID8gbm9kZS0+c2hhZG93SG9zdCgpIDogMDsKICAgICBpZiAoIW1lZGlhTm9k
ZSB8fCAoIW1lZGlhTm9kZS0+aGFzVGFnTmFtZSh2aWRlb1RhZykgJiYgIW1lZGlhTm9kZS0+aGFz
VGFnTmFtZShhdWRpb1RhZykpKQpAQCAtMTg3NCwxMCArMTg4NCwxNSBAQCBib29sIFJlbmRlclRo
ZW1lTWFjOjpwYWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50
SW5mbyYgcGFpbgogICAgICAgICB3a0RyYXdNZWRpYVVJUGFydChtZWRpYUNvbnRyb2xFbGVtZW50
VHlwZShub2RlKSwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4
dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIH0KICAgICByZXR1
cm4gZmFsc2U7CisjZWxzZQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBm
YWxzZTsKKyNlbmRpZgogfQogCiBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhUGxheUJ1
dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJ
bnRSZWN0JiByKQogeworI2lmIFBMQVRGT1JNKE1BQykKICAgICBOb2RlKiBub2RlID0gby0+bm9k
ZSgpOwogICAgIE5vZGUqIG1lZGlhTm9kZSA9IG5vZGUgPyBub2RlLT5zaGFkb3dIb3N0KCkgOiAw
OwogICAgIGlmICghbWVkaWFOb2RlIHx8ICghbWVkaWFOb2RlLT5oYXNUYWdOYW1lKHZpZGVvVGFn
KSAmJiAhbWVkaWFOb2RlLT5oYXNUYWdOYW1lKGF1ZGlvVGFnKSkpCkBAIC0xODg4LDEwICsxOTAz
LDE1IEBAIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWluCiAgICAgICAgIHdrRHJhd01lZGlhVUlQYXJ0
KG1lZGlhQ29udHJvbEVsZW1lbnRUeXBlKG5vZGUpLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBs
b2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2Rl
KSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCiB9CiAKIGJvb2wgUmVuZGVyVGhlbWVN
YWM6OnBhaW50TWVkaWFTZWVrQmFja0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogeworI2lmIFBMQVRGT1JNKE1BQykK
ICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwpAQCAtMTg5OSwxMCArMTkxOSwxNSBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpw
YWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
CiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFTZWVrQmFja0J1dHRvbiwgbWVk
aWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRp
YVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCiB9CiAKIGJv
b2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFTZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewor
I2lmIFBMQVRGT1JNKE1BQykKICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwogICAgIGlmICgh
bm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTkxMCwxMCArMTkzNSwxNSBAQCBib29s
IFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBQYWludEluZgogICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwogICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlh
U2Vla0ZvcndhcmRCdXR0b24sIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5j
Z0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICByZXR1
cm4gZmFsc2U7CisjZWxzZQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBm
YWxzZTsKKyNlbmRpZgogfQogCiBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2xpZGVy
VHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcikKIHsKKyNpZiBQTEFURk9STShNQUMpCiAgICAgTm9kZSogbm9kZSA9IG8tPm5v
ZGUoKTsKICAgICBFbGVtZW50KiBtZWRpYU5vZGUgPSBub2RlID8gbm9kZS0+c2hhZG93SG9zdCgp
IDogMDsKICAgICBpZiAoIW1lZGlhTm9kZSB8fCAhbWVkaWFOb2RlLT5pc01lZGlhRWxlbWVudCgp
KQpAQCAtMTkzOCwxMCArMTk2OCwxNSBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlh
U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaQogICAgIHdr
RHJhd01lZGlhU2xpZGVyVHJhY2sobWVkaWFDb250cm9sbGVyVGhlbWUoKSwgY29udGV4dCwgdW56
b29tZWRSZWN0LCAKICAgICAgICAgdGltZUxvYWRlZCwgY3VycmVudFRpbWUsIGR1cmF0aW9uLCBn
ZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKKyNlbHNl
CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCiB9
CiAKIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFTbGlkZXJUaHVtYihSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewor
I2lmIFBMQVRGT1JNKE1BQykKICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwogICAgIGlmICgh
bm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTk0OSwxMCArMTk4NCwxNSBAQCBib29s
IFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBQYWludEluZm8mIHBhaQogICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwogICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlh
U2xpZGVyVGh1bWIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRl
eHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICByZXR1cm4gZmFs
c2U7CisjZWxzZQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsK
KyNlbmRpZgogfQogICAgIAogYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVJld2luZEJ1
dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJ
bnRSZWN0JiByKQogeworI2lmIFBMQVRGT1JNKE1BQykKICAgICBOb2RlKiBub2RlID0gby0+bm9k
ZSgpOwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTk2MCwxMCAr
MjAwMCwxNSBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhUmV3aW5kQnV0dG9uKFJl
bmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYQogICAgIExvY2FsQ3VycmVudEdyYXBo
aWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwogICAgIHdrRHJhd01l
ZGlhVUlQYXJ0KE1lZGlhUmV3aW5kQnV0dG9uLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2Nh
bENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7
CiAgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICByZXR1cm4gZmFsc2U7CisjZW5kaWYKIH0KIAogYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRN
ZWRpYVJldHVyblRvUmVhbHRpbWVCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKKyNpZiBQTEFURk9STShNQUMpCiAg
ICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKQEAgLTE5NzEsMTAgKzIwMTYsMTUgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFp
bnRNZWRpYVJldHVyblRvUmVhbHRpbWVCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWkK
ICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5j
b250ZXh0KTsKICAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVJldHVyblRvUmVhbHRpbWVCdXR0
b24sIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwg
Z2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICByZXR1cm4gZmFsc2U7CisjZWxz
ZQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgog
fQogCiBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhVG9nZ2xlQ2xvc2VkQ2FwdGlvbnNC
dXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcikKIHsKKyNpZiBQTEFURk9STShNQUMpCiAgICAgTm9kZSogbm9kZSA9IG8tPm5v
ZGUoKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE5ODQsMTAg
KzIwMzQsMTUgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVRvZ2dsZUNsb3NlZENh
cHRpb25zQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QKICAgICBMb2NhbEN1cnJlbnRHcmFw
aGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKICAgICB3a0RyYXdN
ZWRpYVVJUGFydChtZWRpYUNvbnRyb2xFbGVtZW50VHlwZShub2RlKSwgbWVkaWFDb250cm9sbGVy
VGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRl
RmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCiB9CiAgCiBib29sIFJlbmRlclRo
ZW1lTWFjOjpwYWludE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kKFJlbmRlck9iamVjdCogbywgY29u
c3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CisjaWYgUExBVEZP
Uk0oTUFDKQogICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CiAgICAgaWYgKCFub2RlKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CkBAIC0xOTk1LDEwICsyMDUwLDE1IEBAIGJvb2wgUmVuZGVyVGhl
bWVNYWM6OnBhaW50TWVkaWFDb250cm9sc0JhY2tncm91bmQoUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBQYWludEluCiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChw
YWludEluZm8uY29udGV4dCk7CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFUaW1lbGluZUNv
bnRhaW5lciwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgp
LCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsK
KyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vu
ZGlmCiB9CiAKIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFDdXJyZW50VGltZShSZW5k
ZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQogeworI2lmIFBMQVRGT1JNKE1BQykKICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwogICAg
IGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjAwOCwxMCArMjA2OCwxNSBA
QCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhQ3VycmVudFRpbWUoUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBQYWludEluZm8mIHBhaQogICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3QgPSBn
ZXRVbnpvb21lZFJlY3RBbmRBZGp1c3RDdXJyZW50Q29udGV4dChvLCBwYWludEluZm8sIHIpOwog
ICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlhQ3VycmVudFRpbWVEaXNwbGF5LCBtZWRpYUNvbnRy
b2xsZXJUaGVtZSgpLCBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpLCB1bnpvb21lZFJlY3Qs
IGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CiAgICAgcmV0dXJuIGZhbHNlOworI2Vs
c2UKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYK
IH0KIAogYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVRpbWVSZW1haW5pbmcoUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikK
IHsKKyNpZiBQTEFURk9STShNQUMpCiAgICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKICAgICBp
ZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIwMjEsMTAgKzIwODYsMTUgQEAg
Ym9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVRpbWVSZW1haW5pbmcoUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBQYWludEluZm8mIHAKICAgICBGbG9hdFJlY3QgdW56b29tZWRSZWN0ID0gZ2V0
VW56b29tZWRSZWN0QW5kQWRqdXN0Q3VycmVudENvbnRleHQobywgcGFpbnRJbmZvLCByKTsKICAg
ICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVRpbWVSZW1haW5pbmdEaXNwbGF5LCBtZWRpYUNvbnRy
b2xsZXJUaGVtZSgpLCBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpLCB1bnpvb21lZFJlY3Qs
IGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CiAgICAgcmV0dXJuIGZhbHNlOworI2Vs
c2UKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYK
IH0KIAogYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlckNvbnRhaW5l
cihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByKQogeworI2lmIFBMQVRGT1JNKE1BQykKICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgp
OwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjAzMiwxMCArMjEw
MiwxNSBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhVm9sdW1lU2xpZGVyQ29udGFp
bmVyKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbgogICAgIExvY2FsQ3VycmVudEdyYXBoaWNz
Q29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwogICAgIHdrRHJhd01lZGlh
VUlQYXJ0KE1lZGlhVm9sdW1lU2xpZGVyQ29udGFpbmVyLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgp
LCBsb2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhu
b2RlKSk7CiAgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKIH0KIAogYm9vbCBSZW5kZXJUaGVtZU1hYzo6
cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CisjaWYgUExBVEZPUk0oTUFDKQog
ICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1
cm4gZmFsc2U7CkBAIC0yMDQzLDEwICsyMTE4LDE1IEBAIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBh
aW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5m
CiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFWb2x1bWVTbGlkZXIsIG1lZGlh
Q29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFV
SVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgogfQogICAgIAog
Ym9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7
CisjaWYgUExBVEZPUk0oTUFDKQogICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CiAgICAgaWYg
KCFub2RlKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDU0LDEwICsyMTM0LDE1IEBAIGJv
b2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFBhaW50SW5mCiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxv
Y2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVk
aWFWb2x1bWVTbGlkZXJUaHVtYiwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0
LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJl
dHVybiBmYWxzZTsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJu
IGZhbHNlOworI2VuZGlmCiB9CiAKIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFGdWxs
U2NyZWVuVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKKyNpZiBQTEFURk9STShNQUMpCiAgICAg
Tm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKQEAgLTIwNjUsMTAgKzIxNTAsMTUgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRN
ZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnMKICAg
ICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250
ZXh0KTsKICAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXIs
IG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0
TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICByZXR1cm4gZmFsc2U7CisjZWxzZQor
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgogfQog
CiBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRo
dW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHIpCiB7CisjaWYgUExBVEZPUk0oTUFDKQogICAgIE5vZGUqIG5vZGUgPSBvLT5ub2Rl
KCk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDc2LDYgKzIx
NjYsMTAgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVT
bGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnMKICAgICBMb2NhbEN1cnJlbnRHcmFwaGlj
c0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKICAgICB3a0RyYXdNZWRp
YVVJUGFydChNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUaHVtYiwgbWVkaWFDb250cm9sbGVy
VGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRl
RmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCiB9CiAKIFN0cmluZyBSZW5kZXJU
aGVtZU1hYzo6ZXh0cmFNZWRpYUNvbnRyb2xzU3R5bGVTaGVldCgpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173385</attachid>
            <date>2012-11-09 15:41:19 -0800</date>
            <delta_ts>2012-11-12 11:25:50 -0800</delta_ts>
            <desc>RenderThemeAppleMac,v1</desc>
            <filename>bug-101634-20121109183926.patch</filename>
            <type>text/plain</type>
            <size>46451</size>
            <attacher name="Robert Sesek">rsesek</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM0MTEwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2MxZjI0OWExYjIwMDUz
NmEwZDI4OTgzZTJlNTRlYTZhNTE1YzU2YS4uMzNjNDVkNDIwMzU4NmRjYTA3N2ExNThhZDlkZTNl
Yjk0OGI1NDQ4OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDEyLTExLTA5ICBSb2Jl
cnQgU2VzZWsgIDxyc2VzZWtAY2hyb21pdW0ub3JnPgorCisgICAgICAgIEZhY3RvciBvdXQgUExB
VEZPUk0oTUFDKS1zcGVjaWZpYyBjb2RlIGZyb20gUmVuZGVyVGhlbWVNYWMgaW50byBhIG5ldyBS
ZW5kZXJUaGVtZUFwcGxlTWFjCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xMDE2MzQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBObyBuZXcgdGVzdHMsIGp1c3QgcmVmYWN0b3JpbmcuCisKKyAgICAgICAgKiBX
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlclRoZW1lQXBwbGVNYWMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAg
KFJlbmRlclRoZW1lQXBwbGVNYWMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZUFw
cGxlTWFjLm1tOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUFwcGxlTWFjOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVBcHBsZU1h
Yzo6UmVuZGVyVGhlbWVBcHBsZU1hYyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUFw
cGxlTWFjOjp+UmVuZGVyVGhlbWVBcHBsZU1hYyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUFwcGxlTWFjOjpkb2N1bWVudFZpZXdGb3IpOgorICAgICAgICAoV2ViQ29yZTo6bWVkaWFD
b250cm9sbGVyVGhlbWUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVBcHBsZU1hYzo6
YWRqdXN0TWVkaWFTbGlkZXJUaHVtYlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TWVkaWFV
SVBhcnRTdGF0ZUZsYWdzKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFVuem9vbWVkUmVjdEFuZEFk
anVzdEN1cnJlbnRDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQXBwbGVN
YWM6OnBhaW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFNdXRlQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFQbGF5QnV0dG9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFTZWVrQmFja0J1dHRvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUFwcGxlTWFjOjpwYWludE1lZGlhU2Vla0Zvcndh
cmRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRN
ZWRpYVNsaWRlclRyYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQXBwbGVNYWM6
OnBhaW50TWVkaWFTbGlkZXJUaHVtYik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUFw
cGxlTWFjOjpwYWludE1lZGlhUmV3aW5kQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFUb2dnbGVDbG9zZWRD
YXB0aW9uc0J1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUFwcGxlTWFjOjpw
YWludE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFDdXJyZW50VGltZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZUFwcGxlTWFjOjpwYWludE1lZGlhVGltZVJlbWFpbmluZyk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUFwcGxlTWFjOjpwYWludE1lZGlhVm9sdW1lU2xpZGVyQ29udGFp
bmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFW
b2x1bWVTbGlkZXJUcmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUFwcGxlTWFj
OjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVGh1bWIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUcmFjayk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUFwcGxlTWFjOjpwYWludE1lZGlhRnVsbFNjcmVl
blZvbHVtZVNsaWRlclRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQXBwbGVN
YWM6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVBcHBsZU1hYzo6ZXh0cmFGdWxsU2NyZWVuU3R5bGVTaGVldCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUFwcGxlTWFjOjpoYXNPd25EaXNhYmxlZFN0YXRlSGFuZGxpbmdG
b3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVBcHBsZU1hYzo6dXNlc01lZGlhQ29u
dHJvbFN0YXR1c0Rpc3BsYXkpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVBcHBsZU1h
Yzo6dXNlc01lZGlhQ29udHJvbFZvbHVtZVNsaWRlcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUFwcGxlTWFjOjp2b2x1bWVTbGlkZXJPZmZzZXRGcm9tTXV0ZUJ1dHRvbik6CisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLmg6CisgICAgICAgIChSZW5kZXJUaGVtZU1h
Yyk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tOgorICAgICAgICAoV2Vi
Q29yZSk6CisKIDIwMTItMTEtMDkgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RAZ21h
aWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHIxMzQxMDEuCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2og
Yi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXgg
MWJjZGQxOGM2NzdkYzY5ZWFjZTVjNDVlNGU4Mzc5OTViMTY1OGMyMy4uYzcxMDU5ODQ2MzM1YjY5
OTQwNmNmYzExNWE3YzM1MzU3MDlkNzRiMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtNjc3LDYgKzY3Nyw4IEBACiAJCTFDRjZC
RTE0MEU5QkI0NjcwMDI1RTFDRCAvKiBPYmpDTm9kZUZpbHRlckNvbmRpdGlvbi5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFDRjZCRTEyMEU5QkI0Njcw
MDI1RTFDRCAvKiBPYmpDTm9kZUZpbHRlckNvbmRpdGlvbi5tbSAqLzsgfTsKIAkJMUNGNkJFMTUw
RTlCQjQ2NzAwMjVFMUNEIC8qIE9iakNOb2RlRmlsdGVyQ29uZGl0aW9uLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQ0Y2QkUxMzBFOUJCNDY3MDAyNUUx
Q0QgLyogT2JqQ05vZGVGaWx0ZXJDb25kaXRpb24uaCAqLzsgfTsKIAkJMUNGQUUzMjMwQTZENkEz
RjAwMzI1OTNEIC8qIGxpYm9iamMuZHlsaWIgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAxQ0ZBRTMyMjBBNkQ2QTNGMDAzMjU5M0QgLyogbGlib2JqYy5k
eWxpYiAqLzsgfTsKKwkJMUVGQUREOTkxNjREODg3RjAwRTJEQzc5IC8qIFJlbmRlclRoZW1lQXBw
bGVNYWMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFF
RkFERDk3MTY0RDg4N0YwMEUyREM3OSAvKiBSZW5kZXJUaGVtZUFwcGxlTWFjLmggKi87IH07CisJ
CTFFRkFERDlBMTY0RDg4N0YwMEUyREM3OSAvKiBSZW5kZXJUaGVtZUFwcGxlTWFjLm1tIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUVGQUREOTgxNjREODg3
RjAwRTJEQzc5IC8qIFJlbmRlclRoZW1lQXBwbGVNYWMubW0gKi87IH07CiAJCTFGM0MzQkVBMTM1
Q0FGM0MwMEI4QzFBQyAvKiBNZWRpYUNvbnRyb2xzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFGM0MzQkU4MTM1Q0FGM0MwMEI4QzFBQyAvKiBNZWRp
YUNvbnRyb2xzLmNwcCAqLzsgfTsKIAkJMUYzQzNCRUIxMzVDQUYzQzAwQjhDMUFDIC8qIE1lZGlh
Q29udHJvbHMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDFGM0MzQkU5MTM1Q0FGM0MwMEI4QzFBQyAvKiBNZWRpYUNvbnRyb2xzLmggKi87IH07CiAJCTFG
M0YxOTUzMTQ5OUNBNzYwMEE1QUVBNyAvKiBQT0RGcmVlTGlzdEFyZW5hLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxRjNGMTk1MjE0OTlDQTc2MDBBNUFF
QTcgLyogUE9ERnJlZUxpc3RBcmVuYS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFBy
aXZhdGUsICk7IH07IH07CkBAIC03Nzk2LDYgKzc3OTgsOCBAQAogCQkxQ0Y2QkUxMjBFOUJCNDY3
MDAyNUUxQ0QgLyogT2JqQ05vZGVGaWx0ZXJDb25kaXRpb24ubW0gKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5vYmpjcHA7IHBhdGggPSBPYmpDTm9kZUZpbHRlckNvbmRpdGlvbi5tbTsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMUNGNkJFMTMwRTlCQjQ2NzAwMjVFMUNEIC8qIE9iakNO
b2RlRmlsdGVyQ29uZGl0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE9i
akNOb2RlRmlsdGVyQ29uZGl0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFD
RkFFMzIyMEE2RDZBM0YwMDMyNTkzRCAvKiBsaWJvYmpjLmR5bGliICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5keWxpYiI7
IG5hbWUgPSBsaWJvYmpjLmR5bGliOyBwYXRoID0gL3Vzci9saWIvbGlib2JqYy5keWxpYjsgc291
cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMUVGQUREOTcxNjREODg3RjAwRTJEQzc5IC8q
IFJlbmRlclRoZW1lQXBwbGVNYWMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
UmVuZGVyVGhlbWVBcHBsZU1hYy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxRUZB
REQ5ODE2NEQ4ODdGMDBFMkRDNzkgLyogUmVuZGVyVGhlbWVBcHBsZU1hYy5tbSAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IFJlbmRlclRoZW1lQXBwbGVNYWMubW07IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFGM0MzQkU4MTM1Q0FGM0MwMEI4QzFBQyAvKiBN
ZWRpYUNvbnRyb2xzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE1l
ZGlhQ29udHJvbHMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxRjNDM0JFOTEz
NUNBRjNDMDBCOEMxQUMgLyogTWVkaWFDb250cm9scy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBNZWRpYUNvbnRyb2xzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTFGM0YxOTUyMTQ5OUNBNzYwMEE1QUVBNyAvKiBQT0RGcmVlTGlzdEFyZW5hLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBPREZyZWVMaXN0QXJlbmEuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKQEAgLTIxNjQ1LDYgKzIxNjQ5LDggQEAKIAkJCQk4NkZGODg1RjE1REUz
QjgyMDBCRDZCMjggLyogUmVuZGVyVGV4dFRyYWNrQ3VlLmggKi8sCiAJCQkJQkNFQTQ4NEEwOTdE
OTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1lLmNwcCAqLywKIAkJCQlCQ0VBNDg0QjA5N0Q5MzAy
MDA5NEM5RTQgLyogUmVuZGVyVGhlbWUuaCAqLywKKwkJCQkxRUZBREQ5NzE2NEQ4ODdGMDBFMkRD
NzkgLyogUmVuZGVyVGhlbWVBcHBsZU1hYy5oICovLAorCQkJCTFFRkFERDk4MTY0RDg4N0YwMEUy
REM3OSAvKiBSZW5kZXJUaGVtZUFwcGxlTWFjLm1tICovLAogCQkJCUJDRUE0ODQ4MDk3RDkzMDIw
MDk0QzlFNCAvKiBSZW5kZXJUaGVtZU1hYy5oICovLAogCQkJCUJDRUE0ODQ5MDk3RDkzMDIwMDk0
QzlFNCAvKiBSZW5kZXJUaGVtZU1hYy5tbSAqLywKIAkJCQk5Mzk1NUE0MjAzRDcyOTMyMDA4NjM1
Q0UgLyogUmVuZGVyVHJlZUFzVGV4dC5jcHAgKi8sCkBAIC0yNTY5NSw2ICsyNTcwMSw3IEBACiAJ
CQkJRTE0MjRDOEExNjRCM0I0RTAwRjMyRDQwIC8qIFBsYXRmb3JtQ29va2llSmFyLmggaW4gSGVh
ZGVycyAqLywKIAkJCQlFMTQyNEM5NDE2NEI1MkM4MDBGMzJENDAgLyogQ29va2llSmFyLmggaW4g
SGVhZGVycyAqLywKIAkJCQkxNDExRENCMTE2NEMzOUE4MDBENDlCQzEgLyogV2lkdGhDYWNoZS5o
IGluIEhlYWRlcnMgKi8sCisJCQkJMUVGQUREOTkxNjREODg3RjAwRTJEQzc5IC8qIFJlbmRlclRo
ZW1lQXBwbGVNYWMuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjg3ODIsNiArMjg3ODksNyBAQAogCQkJ
CTRGQzg1MzRDMTY0NDI3MjMwMEQxQzI3NSAvKiBDYWNoZWRNZXRhZGF0YS5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlFMTQyNEM5MDE2NEI0NjBCMDBGMzJENDAgLyogQ29va2llSmFyTWFjLm1tIGlu
IFNvdXJjZXMgKi8sCiAJCQkJRTE0MjRDOTMxNjRCNTJDODAwRjMyRDQwIC8qIENvb2tpZUphci5j
cHAgaW4gU291cmNlcyAqLywKKwkJCQkxRUZBREQ5QTE2NEQ4ODdGMDBFMkRDNzkgLyogUmVuZGVy
VGhlbWVBcHBsZU1hYy5tbSBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBs
b3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQXBwbGVNYWMuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJUaGVtZUFwcGxlTWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGYxY2RiMjA0NDc0ZjZkOTll
YWMwYTFmNzc0OThhZGFiODI4ZTcwNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJUaGVtZUFwcGxlTWFjLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAq
IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB0aGVtZSBpbXBsZW1lbnRhdGlvbiBmb3IgZm9ybSBj
b250cm9scyBpbiBXZWJDb3JlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAw
NywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBBcHBsZSBDb21wdXRlciwgSW5jLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKwor
I2lmbmRlZiBSZW5kZXJUaGVtZUFwcGxlTWFjX2gKKyNkZWZpbmUgUmVuZGVyVGhlbWVBcHBsZU1h
Y19oCisKKyNpbXBvcnQgIlJlbmRlclRoZW1lTWFjLmgiCisjaW1wb3J0IDx3dGYvUmV0YWluUHRy
Lmg+CisKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJQcm9ncmVzczsKK2Ns
YXNzIFJlbmRlclN0eWxlOworCitjbGFzcyBSZW5kZXJUaGVtZUFwcGxlTWFjIDogcHVibGljIFJl
bmRlclRoZW1lTWFjIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJUaGVt
ZT4gY3JlYXRlKCk7CisKKyAgICB2aXJ0dWFsIE5TVmlldyogZG9jdW1lbnRWaWV3Rm9yKFJlbmRl
ck9iamVjdCopIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgUmVuZGVyVGhlbWVBcHBsZU1hYygp
OworICAgIHZpcnR1YWwgflJlbmRlclRoZW1lQXBwbGVNYWMoKTsKKworI2lmIEVOQUJMRShWSURF
TykKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9v
bCBwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFNdXRlQnV0dG9uKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0
dWFsIGJvb2wgcGFpbnRNZWRpYVNlZWtCYWNrQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVNl
ZWtGb3J3YXJkQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVNsaWRlclRyYWNrKFJlbmRlck9i
amVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRNZWRpYVNsaWRlclRodW1iKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVJld2luZEJ1dHRv
bihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAg
dmlydHVhbCBib29sIHBhaW50TWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wg
cGFpbnRNZWRpYVRvZ2dsZUNsb3NlZENhcHRpb25zQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRp
YUNvbnRyb2xzQmFja2dyb3VuZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFDdXJyZW50VGltZShSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVh
bCBib29sIHBhaW50TWVkaWFUaW1lUmVtYWluaW5nKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVZvbHVt
ZVNsaWRlckNvbnRhaW5lcihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJ
bnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFGdWxsU2NyZWVuVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJ
bmZvJiwgY29uc3QgSW50UmVjdCYpIE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCBwYWludE1l
ZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKSBPVkVSUklERTsKKworICAgIC8vIE1lZGlhIGNvbnRyb2xz
CisgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFNZWRpYUNvbnRyb2xzU3R5bGVTaGVldCgpOworI2lm
IEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKKyAgICB2aXJ0dWFsIFN0cmluZyBleHRyYUZ1bGxTY3Jl
ZW5TdHlsZVNoZWV0KCk7CisjZW5kaWYKKworICAgIHZpcnR1YWwgYm9vbCBoYXNPd25EaXNhYmxl
ZFN0YXRlSGFuZGxpbmdGb3IoQ29udHJvbFBhcnQpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCB1
c2VzTWVkaWFDb250cm9sU3RhdHVzRGlzcGxheSgpOworICAgIHZpcnR1YWwgYm9vbCB1c2VzTWVk
aWFDb250cm9sVm9sdW1lU2xpZGVyKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdE1l
ZGlhU2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVhbCBJbnRQ
b2ludCB2b2x1bWVTbGlkZXJPZmZzZXRGcm9tTXV0ZUJ1dHRvbihSZW5kZXJCb3gqLCBjb25zdCBJ
bnRTaXplJikgY29uc3QgT1ZFUlJJREU7CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIFJlbmRlclRoZW1lQXBwbGVNYWNfaApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQXBwbGVNYWMubW0gYi9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVBcHBsZU1hYy5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xNWNjMmI0
MzY4Nzg0N2YyODdiZGNhNTExOGM0NGY4YjE0YjU2MjUyCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQXBwbGVNYWMubW0KQEAgLTAsMCArMSw0
MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDks
IDIwMTAsIDIwMTEsIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW1wb3J0
ICJjb25maWcuaCIKKyNpbXBvcnQgIlJlbmRlclRoZW1lQXBwbGVNYWMuaCIKKworI2ltcG9ydCAi
RWxlbWVudC5oIgorI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0Q0cuaCIKKyNpbXBvcnQgIkhUTUxN
ZWRpYUVsZW1lbnQuaCIKKyNpbXBvcnQgIkxvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dC5oIgor
I2ltcG9ydCAiTWVkaWFDb250cm9sRWxlbWVudHMuaCIKKyNpbXBvcnQgIlBhaW50SW5mby5oIgor
I2ltcG9ydCAiUmVuZGVyTWVkaWEuaCIKKyNpbXBvcnQgIlJlbmRlck1lZGlhQ29udHJvbHMuaCIK
KyNpbXBvcnQgIlJlbmRlclZpZXcuaCIKKyNpbXBvcnQgIlRpbWVSYW5nZXMuaCIKKyNpbXBvcnQg
IlRoZW1lTWFjLmgiCisjaW1wb3J0ICJXZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCisjaW1wb3J0
ICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2ltcG9ydCA8Q2FyYm9uL0NhcmJvbi5oPgorI2lt
cG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitQYXNzUmVmUHRy
PFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqKQoreworICAgIHN0
YXRpYyBSZW5kZXJUaGVtZSogcnQgPSBSZW5kZXJUaGVtZUFwcGxlTWFjOjpjcmVhdGUoKS5sZWFr
UmVmKCk7CisgICAgcmV0dXJuIHJ0OworfQorCitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5k
ZXJUaGVtZUFwcGxlTWFjOjpjcmVhdGUoKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVu
ZGVyVGhlbWVBcHBsZU1hYyk7Cit9CisKK1JlbmRlclRoZW1lQXBwbGVNYWM6OlJlbmRlclRoZW1l
QXBwbGVNYWMoKQorICAgIDogUmVuZGVyVGhlbWVNYWMoKQoreworfQorCitSZW5kZXJUaGVtZUFw
cGxlTWFjOjp+UmVuZGVyVGhlbWVBcHBsZU1hYygpCit7Cit9CisKK05TVmlldyogUmVuZGVyVGhl
bWVBcHBsZU1hYzo6ZG9jdW1lbnRWaWV3Rm9yKFJlbmRlck9iamVjdCogbykgY29uc3QKK3sKKyAg
ICByZXR1cm4gVGhlbWVNYWM6OmVuc3VyZWRWaWV3KG8tPnZpZXcoKS0+ZnJhbWVWaWV3KCkpOwor
fQorCisjaWYgRU5BQkxFKFZJREVPKQorCit0eXBlZGVmIGVudW0geworICAgIE1lZGlhQ29udHJv
bGxlclRoZW1lQ2xhc3NpYyAgID0gMSwKKyAgICBNZWRpYUNvbnRyb2xsZXJUaGVtZVF1aWNrVGlt
ZSA9IDIKK30gTWVkaWFDb250cm9sbGVyVGhlbWVTdHlsZTsKKworc3RhdGljIGludCBtZWRpYUNv
bnRyb2xsZXJUaGVtZSgpCit7CisgICAgc3RhdGljIGludCBjb250cm9sbGVyVGhlbWUgPSAtMTsK
KworICAgIGlmIChjb250cm9sbGVyVGhlbWUgIT0gLTEpCisgICAgICAgIHJldHVybiBjb250cm9s
bGVyVGhlbWU7CisKKyAgICBjb250cm9sbGVyVGhlbWUgPSBNZWRpYUNvbnRyb2xsZXJUaGVtZUNs
YXNzaWM7CisKKyAgICBCb29sZWFuIHZhbGlkS2V5OworICAgIEJvb2xlYW4gdXNlUVRNZWRpYVVJ
UHJlZiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoQ0ZTVFIoIlVzZVF1aWNrVGlt
ZU1lZGlhVUkiKSwgQ0ZTVFIoImNvbS5hcHBsZS5XZWJDb3JlIiksICZ2YWxpZEtleSk7CisKKyAg
ICBpZiAodmFsaWRLZXkgJiYgIXVzZVFUTWVkaWFVSVByZWYpCisgICAgICAgIHJldHVybiBjb250
cm9sbGVyVGhlbWU7CisKKyAgICBjb250cm9sbGVyVGhlbWUgPSBNZWRpYUNvbnRyb2xsZXJUaGVt
ZVF1aWNrVGltZTsKKyAgICByZXR1cm4gY29udHJvbGxlclRoZW1lOworfQorCitjb25zdCBpbnQg
bWVkaWFTbGlkZXJUaHVtYldpZHRoID0gMTM7Citjb25zdCBpbnQgbWVkaWFTbGlkZXJUaHVtYkhl
aWdodCA9IDE0OworCit2b2lkIFJlbmRlclRoZW1lQXBwbGVNYWM6OmFkanVzdE1lZGlhU2xpZGVy
VGh1bWJTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgd2tQYXJ0Owor
ICAgIHN3aXRjaCAoc3R5bGUtPmFwcGVhcmFuY2UoKSkgeworICAgIGNhc2UgTWVkaWFTbGlkZXJU
aHVtYlBhcnQ6CisgICAgICAgIHdrUGFydCA9IE1lZGlhU2xpZGVyVGh1bWI7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgTWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQ6CisgICAgICAgIHdrUGFy
dCA9IE1lZGlhVm9sdW1lU2xpZGVyVGh1bWI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTWVk
aWFGdWxsU2NyZWVuVm9sdW1lU2xpZGVyVGh1bWJQYXJ0OgorICAgICAgICB3a1BhcnQgPSBNZWRp
YUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUaHVtYjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVs
dDoKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB3aWR0aCA9IG1lZGlhU2xpZGVy
VGh1bWJXaWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gbWVkaWFTbGlkZXJUaHVtYkhlaWdodDsKKwor
ICAgIGlmIChtZWRpYUNvbnRyb2xsZXJUaGVtZSgpID09IE1lZGlhQ29udHJvbGxlclRoZW1lUXVp
Y2tUaW1lKSB7CisgICAgICAgIENHU2l6ZSBzaXplOworICAgICAgICB3a01lYXN1cmVNZWRpYVVJ
UGFydCh3a1BhcnQsIE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1lLCBOVUxMLCAmc2l6ZSk7
CisgICAgICAgIHdpZHRoID0gc2l6ZS53aWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gc2l6ZS5oZWln
aHQ7CisgICAgfQorCisgICAgZmxvYXQgem9vbUxldmVsID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20o
KTsKKyAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHN0YXRpY19jYXN0PGludD4od2lkdGggKiB6
b29tTGV2ZWwpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHN0YXRpY19j
YXN0PGludD4oaGVpZ2h0ICogem9vbUxldmVsKSwgRml4ZWQpKTsKK30KKworZW51bSBXS01lZGlh
Q29udHJvbGxlclRoZW1lU3RhdGUgeworICAgIE1lZGlhVUlQYXJ0RGlzYWJsZWRGbGFnID0gMSA8
PCAwLAorICAgIE1lZGlhVUlQYXJ0UHJlc3NlZEZsYWcgPSAxIDw8IDEsCisgICAgTWVkaWFVSVBh
cnREcmF3RW5kQ2Fwc0ZsYWcgPSAxIDw8IDMsCit9OworCitzdGF0aWMgdW5zaWduZWQgZ2V0TWVk
aWFVSVBhcnRTdGF0ZUZsYWdzKE5vZGUqIG5vZGUpCit7CisgICAgdW5zaWduZWQgZmxhZ3MgPSAw
OworCisgICAgaWYgKG5vZGUtPmRpc2FibGVkKCkpCisgICAgICAgIGZsYWdzIHw9IE1lZGlhVUlQ
YXJ0RGlzYWJsZWRGbGFnOworICAgIGVsc2UgaWYgKG5vZGUtPmFjdGl2ZSgpKQorICAgICAgICBm
bGFncyB8PSBNZWRpYVVJUGFydFByZXNzZWRGbGFnOworICAgIHJldHVybiBmbGFnczsKK30KKwor
Ly8gVXRpbGl0eSB0byBzY2FsZSB3aGVuIHRoZSBVSSBwYXJ0IGFyZSBub3Qgc2NhbGVkIGJ5IHdr
RHJhd01lZGlhVUlQYXJ0CitzdGF0aWMgRmxvYXRSZWN0IGdldFVuem9vbWVkUmVjdEFuZEFkanVz
dEN1cnJlbnRDb250ZXh0KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QgJm9yaWdpbmFsUmVjdCkKK3sKKyAgICBmbG9hdCB6b29tTGV2ZWwg
PSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisgICAgRmxvYXRSZWN0IHVuem9vbWVkUmVj
dChvcmlnaW5hbFJlY3QpOworICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZiAmJiBtZWRpYUNvbnRy
b2xsZXJUaGVtZSgpID09IE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1lKSB7CisgICAgICAg
IHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7
CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgpIC8g
em9vbUxldmVsKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpvb21l
ZFJlY3QueCgpLCB1bnpvb21lZFJlY3QueSgpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQt
PnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOworICAgICAgICBwYWludElu
Zm8uY29udGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0Lnko
KSk7CisgICAgfQorICAgIHJldHVybiB1bnpvb21lZFJlY3Q7Cit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVBcHBsZU1hYzo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2Rl
KiBub2RlID0gby0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKG5vZGUtPmlzTWVkaWFDb250cm9sRWxlbWVudCgpKSB7CisgICAgICAgIExv
Y2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQp
OworICAgICAgICB3a0RyYXdNZWRpYVVJUGFydChtZWRpYUNvbnRyb2xFbGVtZW50VHlwZShub2Rl
KSwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBn
ZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYU11dGVCdXR0b24oUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYg
cikKK3sKKyAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOworICAgIE5vZGUqIG1lZGlhTm9kZSA9
IG5vZGUgPyBub2RlLT5zaGFkb3dIb3N0KCkgOiAwOworICAgIGlmICghbWVkaWFOb2RlIHx8ICgh
bWVkaWFOb2RlLT5oYXNUYWdOYW1lKHZpZGVvVGFnKSAmJiAhbWVkaWFOb2RlLT5oYXNUYWdOYW1l
KGF1ZGlvVGFnKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChub2RlLT5pc01l
ZGlhQ29udHJvbEVsZW1lbnQoKSkgeworICAgICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRl
eHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICAgICAgd2tEcmF3TWVkaWFV
SVBhcnQobWVkaWFDb250cm9sRWxlbWVudFR5cGUobm9kZSksIG1lZGlhQ29udHJvbGxlclRoZW1l
KCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdz
KG5vZGUpKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1l
QXBwbGVNYWM6OnBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgTm9kZSogbm9kZSA9
IG8tPm5vZGUoKTsKKyAgICBOb2RlKiBtZWRpYU5vZGUgPSBub2RlID8gbm9kZS0+c2hhZG93SG9z
dCgpIDogMDsKKyAgICBpZiAoIW1lZGlhTm9kZSB8fCAoIW1lZGlhTm9kZS0+aGFzVGFnTmFtZSh2
aWRlb1RhZykgJiYgIW1lZGlhTm9kZS0+aGFzVGFnTmFtZShhdWRpb1RhZykpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobm9kZS0+aXNNZWRpYUNvbnRyb2xFbGVtZW50KCkpIHsK
KyAgICAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludElu
Zm8uY29udGV4dCk7CisgICAgICAgIHdrRHJhd01lZGlhVUlQYXJ0KG1lZGlhQ29udHJvbEVsZW1l
bnRUeXBlKG5vZGUpLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2NhbENvbnRleHQuY2dDb250
ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CisgICAgfQorICAgIHJl
dHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUFwcGxlTWFjOjpwYWludE1lZGlhU2Vl
a0JhY2tCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywg
Y29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOworICAgIGlm
ICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhp
Y3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgd2tEcmF3TWVk
aWFVSVBhcnQoTWVkaWFTZWVrQmFja0J1dHRvbiwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9j
YWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkp
OworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUFwcGxlTWFjOjpwYWlu
dE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBub2RlID0gby0+bm9k
ZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxD
dXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Cisg
ICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFTZWVrRm9yd2FyZEJ1dHRvbiwgbWVkaWFDb250cm9s
bGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0
YXRlRmxhZ3Mobm9kZSkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUFwcGxlTWFjOjpwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBub2Rl
ID0gby0+bm9kZSgpOworICAgIEVsZW1lbnQqIG1lZGlhTm9kZSA9IG5vZGUgPyBub2RlLT5zaGFk
b3dIb3N0KCkgOiAwOworICAgIGlmICghbWVkaWFOb2RlIHx8ICFtZWRpYU5vZGUtPmlzTWVkaWFF
bGVtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEhUTUxNZWRpYUVsZW1lbnQq
IG1lZGlhRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihtZWRpYU5vZGUp
OworICAgIGlmICghbWVkaWFFbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBS
ZWZQdHI8VGltZVJhbmdlcz4gdGltZVJhbmdlcyA9IG1lZGlhRWxlbWVudC0+YnVmZmVyZWQoKTsK
KyAgICBFeGNlcHRpb25Db2RlIGlnbm9yZWRFeGNlcHRpb247CisgICAgZmxvYXQgdGltZUxvYWRl
ZCA9IHRpbWVSYW5nZXMtPmxlbmd0aCgpID8gdGltZVJhbmdlcy0+ZW5kKDAsIGlnbm9yZWRFeGNl
cHRpb24pIDogMDsKKyAgICBmbG9hdCBjdXJyZW50VGltZSA9IG1lZGlhRWxlbWVudC0+Y3VycmVu
dFRpbWUoKTsKKyAgICBmbG9hdCBkdXJhdGlvbiA9IG1lZGlhRWxlbWVudC0+ZHVyYXRpb24oKTsK
KyAgICBpZiAoaXNuYW4oZHVyYXRpb24pKQorICAgICAgICBkdXJhdGlvbiA9IDA7CisKKyAgICBD
b250ZXh0Q29udGFpbmVyIGNnQ29udGV4dENvbnRhaW5lcihwYWludEluZm8uY29udGV4dCk7Cisg
ICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOwor
ICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRl
eHQpOworICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3QgPSBnZXRVbnpvb21lZFJlY3RBbmRBZGp1
c3RDdXJyZW50Q29udGV4dChvLCBwYWludEluZm8sIHIpOworICAgIHdrRHJhd01lZGlhU2xpZGVy
VHJhY2sobWVkaWFDb250cm9sbGVyVGhlbWUoKSwgY29udGV4dCwgdW56b29tZWRSZWN0LAorICAg
ICAgICB0aW1lTG9hZGVkLCBjdXJyZW50VGltZSwgZHVyYXRpb24sIGdldE1lZGlhVUlQYXJ0U3Rh
dGVGbGFncyhub2RlKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1l
QXBwbGVNYWM6OnBhaW50TWVkaWFTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIG5vZGUg
PSBvLT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250
ZXh0KTsKKyAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVNsaWRlclRodW1iLCBtZWRpYUNvbnRy
b2xsZXJUaGVtZSgpLCBsb2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0
U3RhdGVGbGFncyhub2RlKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRo
ZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFSZXdpbmRCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBu
b2RlID0gby0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7CisgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFSZXdpbmRCdXR0b24sIG1lZGlh
Q29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFV
SVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYVJldHVyblRvUmVhbHRpbWVCdXR0b24oUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikK
K3sKKyAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29u
dGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFSZXR1
cm5Ub1JlYWx0aW1lQnV0dG9uLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2NhbENvbnRleHQu
Y2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFUb2dn
bGVDbG9zZWRDYXB0aW9uc0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIG5vZGUgPSBvLT5ub2Rl
KCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFub2Rl
LT5pc01lZGlhQ29udHJvbEVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
TG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4
dCk7CisgICAgd2tEcmF3TWVkaWFVSVBhcnQobWVkaWFDb250cm9sRWxlbWVudFR5cGUobm9kZSks
IG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0
TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZChSZW5k
ZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQoreworICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxD
b250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVRp
bWVsaW5lQ29udGFpbmVyLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2NhbENvbnRleHQuY2dD
b250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQXBwbGVNYWM6OnBhaW50TWVkaWFDdXJyZW50
VGltZShSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJ
bnRSZWN0JiByKQoreworICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CisgICAgaWYgKCFub2Rl
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDb250ZXh0Q29udGFpbmVyIGNnQ29udGV4
dENvbnRhaW5lcihwYWludEluZm8uY29udGV4dCk7CisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVT
YXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisgICAgRmxvYXRSZWN0IHVuem9v
bWVkUmVjdCA9IGdldFVuem9vbWVkUmVjdEFuZEFkanVzdEN1cnJlbnRDb250ZXh0KG8sIHBhaW50
SW5mbywgcik7CisgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFDdXJyZW50VGltZURpc3BsYXks
IG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCksIHVu
em9vbWVkUmVjdCwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYVRpbWVSZW1h
aW5pbmcoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOworICAgIGlmICghbm9k
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ29udGV4dENvbnRhaW5lciBjZ0NvbnRl
eHRDb250YWluZXIocGFpbnRJbmZvLmNvbnRleHQpOworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRl
U2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworICAgIEZsb2F0UmVjdCB1bnpv
b21lZFJlY3QgPSBnZXRVbnpvb21lZFJlY3RBbmRBZGp1c3RDdXJyZW50Q29udGV4dChvLCBwYWlu
dEluZm8sIHIpOworICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlhVGltZVJlbWFpbmluZ0Rpc3Bs
YXksIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCks
IHVuem9vbWVkUmVjdCwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYVZvbHVt
ZVNsaWRlckNvbnRhaW5lcihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7Cisg
ICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBMb2NhbEN1cnJlbnRH
cmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICB3a0Ry
YXdNZWRpYVVJUGFydChNZWRpYVZvbHVtZVNsaWRlckNvbnRhaW5lciwgbWVkaWFDb250cm9sbGVy
VGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRl
RmxhZ3Mobm9kZSkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUFw
cGxlTWFjOjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBu
b2RlID0gby0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7CisgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFWb2x1bWVTbGlkZXIsIG1lZGlh
Q29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFV
SVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9iamVj
dCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7Cisg
ICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQo
cGFpbnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlhVm9sdW1lU2xp
ZGVyVGh1bWIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQo
KSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVBcHBsZU1hYzo6cGFpbnRNZWRpYUZ1bGxTY3JlZW5Wb2x1
bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CisgICAg
aWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBMb2NhbEN1cnJlbnRHcmFw
aGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICB3a0RyYXdN
ZWRpYVVJUGFydChNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXIsIG1lZGlhQ29udHJvbGxlclRo
ZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZs
YWdzKG5vZGUpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVBcHBs
ZU1hYzo6cGFpbnRNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3Qq
IG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAg
IE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBh
aW50SW5mby5jb250ZXh0KTsKKyAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYUZ1bGxTY3JlZW5W
b2x1bWVTbGlkZXJUaHVtYiwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNn
Q29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOworICAgIHJldHVy
biBmYWxzZTsKK30KKworU3RyaW5nIFJlbmRlclRoZW1lQXBwbGVNYWM6OmV4dHJhTWVkaWFDb250
cm9sc1N0eWxlU2hlZXQoKQoreworICAgIGlmIChtZWRpYUNvbnRyb2xsZXJUaGVtZSgpID09IE1l
ZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1lKQorICAgICAgICByZXR1cm4gU3RyaW5nKG1lZGlh
Q29udHJvbHNRdWlja1RpbWVVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2YobWVkaWFDb250cm9s
c1F1aWNrVGltZVVzZXJBZ2VudFN0eWxlU2hlZXQpKTsKKworICAgIHJldHVybiBTdHJpbmcoKTsK
K30KKworI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKK1N0cmluZyBSZW5kZXJUaGVtZUFwcGxl
TWFjOjpleHRyYUZ1bGxTY3JlZW5TdHlsZVNoZWV0KCkKK3sKKyAgICBpZiAobWVkaWFDb250cm9s
bGVyVGhlbWUoKSA9PSBNZWRpYUNvbnRyb2xsZXJUaGVtZVF1aWNrVGltZSkKKyAgICAgICAgcmV0
dXJuIFN0cmluZyhmdWxsc2NyZWVuUXVpY2tUaW1lVXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9m
KGZ1bGxzY3JlZW5RdWlja1RpbWVVc2VyQWdlbnRTdHlsZVNoZWV0KSk7CisKKyAgICByZXR1cm4g
U3RyaW5nKCk7Cit9CisjZW5kaWYKKworYm9vbCBSZW5kZXJUaGVtZUFwcGxlTWFjOjpoYXNPd25E
aXNhYmxlZFN0YXRlSGFuZGxpbmdGb3IoQ29udHJvbFBhcnQgcGFydCkgY29uc3QKK3sKKyAgICBp
ZiAocGFydCA9PSBNZWRpYU11dGVCdXR0b25QYXJ0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICByZXR1cm4gbWVkaWFDb250cm9sbGVyVGhlbWUoKSA9PSBNZWRpYUNvbnRyb2xsZXJUaGVt
ZUNsYXNzaWM7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVBcHBsZU1hYzo6dXNlc01lZGlhQ29udHJv
bFN0YXR1c0Rpc3BsYXkoKQoreworICAgIHJldHVybiBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpID09
IE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1lOworfQorCitib29sIFJlbmRlclRoZW1lQXBw
bGVNYWM6OnVzZXNNZWRpYUNvbnRyb2xWb2x1bWVTbGlkZXIoKSBjb25zdAoreworICAgIHJldHVy
biBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpID09IE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1l
OworfQorCitJbnRQb2ludCBSZW5kZXJUaGVtZUFwcGxlTWFjOjp2b2x1bWVTbGlkZXJPZmZzZXRG
cm9tTXV0ZUJ1dHRvbihSZW5kZXJCb3gqIG11dGVCdXR0b25Cb3gsIGNvbnN0IEludFNpemUmIHNp
emUpIGNvbnN0Cit7CisgICAgcmV0dXJuIFJlbmRlck1lZGlhQ29udHJvbHM6OnZvbHVtZVNsaWRl
ck9mZnNldEZyb21NdXRlQnV0dG9uKG11dGVCdXR0b25Cb3gsIHNpemUpOworfQorCisjZW5kaWYg
Ly8gRU5BQkxFKFZJREVPKQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaCBiL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oCmluZGV4IDMyODg0NzFhZGVkNDA1MjlmNjJjMDU0
N2ZhZjI2ODY0MDViNzllYTYuLjc1NWU4MWVjMDVjYzE1MDJkNDdjMzNmNzg4YmY1YTcxOGFlZGUy
ZTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oCkBAIC0zNyw4
ICszNyw2IEBAIGNsYXNzIFJlbmRlclN0eWxlOwogCiBjbGFzcyBSZW5kZXJUaGVtZU1hYyA6IHB1
YmxpYyBSZW5kZXJUaGVtZSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVy
VGhlbWU+IGNyZWF0ZSgpOwotCiAgICAgLy8gQSBtZXRob2QgYXNraW5nIGlmIHRoZSBjb250cm9s
IGNoYW5nZXMgaXRzIHRpbnQgd2hlbiB0aGUgd2luZG93IGhhcyBmb2N1cyBvciBub3QuCiAgICAg
dmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCopIGNv
bnN0OwogCkBAIC0xMDAsNyArOTgsNyBAQCBwdWJsaWM6CiAgICAgLy8gQ29udHJvbHMgY29sb3Ig
dmFsdWVzIHJldHVybmVkIGZyb20gcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpLiBzeXN0ZW1Db2xv
cigpIHdpbGwgYmUgdXNlZCB3aGVuIGZhbHNlLgogICAgIHZpcnR1YWwgYm9vbCB1c2VzVGVzdE1v
ZGVGb2N1c1JpbmdDb2xvcigpIGNvbnN0OwogICAgIC8vIEEgdmlldyBhc3NvY2lhdGVkIHRvIHRo
ZSBjb250YWluZWQgZG9jdW1lbnQuIFN1YmNsYXNzZXMgbWF5IG5vdCBoYXZlIHN1Y2ggYSB2aWV3
IGFuZCByZXR1cm4gYSBmYWtlLgotICAgIHZpcnR1YWwgTlNWaWV3KiBkb2N1bWVudFZpZXdGb3Io
UmVuZGVyT2JqZWN0KikgY29uc3Q7CisgICAgdmlydHVhbCBOU1ZpZXcqIGRvY3VtZW50Vmlld0Zv
cihSZW5kZXJPYmplY3QqKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRQbHVn
SW5TbmFwc2hvdE92ZXJsYXkoUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4qLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBMYXlvdXRQb2ludCYpIGNvbnN0IE9WRVJSSURFOwogCkBAIC0xNDksMzcgKzE0
Nyw4IEBAIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZFJlc3Vs
dHNCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYp
OwogCiAjaWYgRU5BQkxFKFZJREVPKQotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNj
cmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0
Jik7Ci0gICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCos
IGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOwotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVu
ZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1
YWwgYm9vbCBwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3Qg
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlh
U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOwotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgYm9vbCBw
YWludE1lZGlhUmV3aW5kQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVJldHVyblRvUmVhbHRp
bWVCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYp
OwotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhVG9nZ2xlQ2xvc2VkQ2FwdGlvbnNCdXR0b24o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kKFJlbmRlck9iamVjdCosIGNv
bnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRN
ZWRpYUN1cnJlbnRUaW1lKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVRpbWVSZW1haW5pbmcoUmVuZGVy
T2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwg
Ym9vbCBwYWludE1lZGlhVm9sdW1lU2xpZGVyQ29udGFpbmVyKFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRp
YVZvbHVtZVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVZvbHVtZVNsaWRlclRodW1i
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2
aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0JikgT1ZFUlJJREU7Ci0gICAg
dmlydHVhbCBib29sIHBhaW50TWVkaWFGdWxsU2NyZWVuVm9sdW1lU2xpZGVyVGh1bWIoUmVuZGVy
T2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpIE9WRVJSSURFOwotCi0g
ICAgLy8gTWVkaWEgY29udHJvbHMKLSAgICB2aXJ0dWFsIFN0cmluZyBleHRyYU1lZGlhQ29udHJv
bHNTdHlsZVNoZWV0KCk7Ci0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgIHZpcnR1YWwg
U3RyaW5nIGV4dHJhRnVsbFNjcmVlblN0eWxlU2hlZXQoKTsKLSNlbmRpZgotCisgICAgdmlydHVh
bCB2b2lkIGFkanVzdE1lZGlhU2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3QgPSAw
OwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Nsb3NlZENhcHRpb25pbmcoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGhhc093bkRpc2FibGVkU3RhdGVIYW5kbGlu
Z0ZvcihDb250cm9sUGFydCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHVzZXNNZWRpYUNvbnRy
b2xTdGF0dXNEaXNwbGF5KCk7Ci0gICAgdmlydHVhbCBib29sIHVzZXNNZWRpYUNvbnRyb2xWb2x1
bWVTbGlkZXIoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVkaWFTbGlkZXJUaHVt
YlNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAgICB2aXJ0dWFsIEludFBvaW50IHZvbHVtZVNs
aWRlck9mZnNldEZyb21NdXRlQnV0dG9uKFJlbmRlckJveCosIGNvbnN0IEludFNpemUmKSBjb25z
dCBPVkVSUklERTsKICNlbmRpZgogICAgIAogICAgIHZpcnR1YWwgYm9vbCBzaG91bGRTaG93UGxh
Y2Vob2xkZXJXaGVuRm9jdXNlZCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclRoZW1lTWFjLm1tCmluZGV4IGUwODM3ZmRjNWQ0MTE4NjVlMjMxZDhlYmU0ZjJhMjU2N2E1
NDZlODAuLjExYjg0MTRiMmNlNjQ1NDlmZGNlMzU3MGU1NTNjNTJiMDVmZDlkYzggMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbQorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0KQEAgLTE0NCwxOSArMTQ0LDYg
QEAgZW51bSB7CiAgICAgbGVmdFBhZGRpbmcKIH07CiAKLSNpZiBQTEFURk9STShNQUMpCi1QYXNz
UmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqKQotewot
ICAgIHN0YXRpYyBSZW5kZXJUaGVtZSogcnQgPSBSZW5kZXJUaGVtZU1hYzo6Y3JlYXRlKCkubGVh
a1JlZigpOwotICAgIHJldHVybiBydDsKLX0KLSNlbmRpZgotCi1QYXNzUmVmUHRyPFJlbmRlclRo
ZW1lPiBSZW5kZXJUaGVtZU1hYzo6Y3JlYXRlKCkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3
IFJlbmRlclRoZW1lTWFjKTsKLX0KLQogUmVuZGVyVGhlbWVNYWM6OlJlbmRlclRoZW1lTWFjKCkK
ICAgICA6IG1faXNTbGlkZXJUaHVtYkhvcml6b250YWxQcmVzc2VkKGZhbHNlKQogICAgICwgbV9p
c1NsaWRlclRodW1iVmVydGljYWxQcmVzc2VkKGZhbHNlKQpAQCAtNDk3LDE2ICs0ODQsNiBAQCBi
b29sIFJlbmRlclRoZW1lTWFjOjp1c2VzVGVzdE1vZGVGb2N1c1JpbmdDb2xvcigpIGNvbnN0CiAg
ICAgcmV0dXJuIFdlYkNvcmU6OnVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9yKCk7CiB9CiAKLU5T
VmlldyogUmVuZGVyVGhlbWVNYWM6OmRvY3VtZW50Vmlld0ZvcihSZW5kZXJPYmplY3QqIG8pIGNv
bnN0Ci17Ci0jaWYgUExBVEZPUk0oTUFDKQotICAgIHJldHVybiBUaGVtZU1hYzo6ZW5zdXJlZFZp
ZXcoby0+dmlldygpLT5mcmFtZVZpZXcoKSk7Ci0jZWxzZQotICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgIHJldHVybiAwOwotI2VuZGlmCi19Ci0KIGJvb2wgUmVuZGVyVGhlbWVNYWM6Omlz
Q29udHJvbFN0eWxlZChjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEJvcmRlckRhdGEm
IGJvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxs
TGF5ZXImIGJhY2tncm91bmQsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3IpIGNvbnN0CiB7
CkBAIC0xNzI2LDMyICsxNzAzLDYgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hG
aWVsZFJlc3VsdHNCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEkKICAgICByZXR1
cm4gZmFsc2U7CiB9CiAKLSNpZiBFTkFCTEUoVklERU8pCi10eXBlZGVmIGVudW0gewotICAgIE1l
ZGlhQ29udHJvbGxlclRoZW1lQ2xhc3NpYyAgID0gMSwKLSAgICBNZWRpYUNvbnRyb2xsZXJUaGVt
ZVF1aWNrVGltZSA9IDIKLX0gTWVkaWFDb250cm9sbGVyVGhlbWVTdHlsZTsKLQotc3RhdGljIGlu
dCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpCi17Ci0gICAgc3RhdGljIGludCBjb250cm9sbGVyVGhl
bWUgPSAtMTsKLSAgICAKLSAgICBpZiAoY29udHJvbGxlclRoZW1lICE9IC0xKQotICAgICAgICBy
ZXR1cm4gY29udHJvbGxlclRoZW1lOwotCi0gICAgY29udHJvbGxlclRoZW1lID0gTWVkaWFDb250
cm9sbGVyVGhlbWVDbGFzc2ljOwotCi0gICAgQm9vbGVhbiB2YWxpZEtleTsKLSAgICBCb29sZWFu
IHVzZVFUTWVkaWFVSVByZWYgPSBDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKENGU1RS
KCJVc2VRdWlja1RpbWVNZWRpYVVJIiksIENGU1RSKCJjb20uYXBwbGUuV2ViQ29yZSIpLCAmdmFs
aWRLZXkpOwotCi0gICAgaWYgKHZhbGlkS2V5ICYmICF1c2VRVE1lZGlhVUlQcmVmKQotICAgICAg
ICByZXR1cm4gY29udHJvbGxlclRoZW1lOwotCi0gICAgY29udHJvbGxlclRoZW1lID0gTWVkaWFD
b250cm9sbGVyVGhlbWVRdWlja1RpbWU7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJUaGVtZTsKLX0K
LSNlbmRpZgotCiAjaWYgRU5BQkxFKERBVEFMSVNUX0VMRU1FTlQpCiBJbnRTaXplIFJlbmRlclRo
ZW1lTWFjOjpzbGlkZXJUaWNrU2l6ZSgpIGNvbnN0CiB7CkBAIC0xNzY2LDggKzE3MTcsNiBAQCBp
bnQgUmVuZGVyVGhlbWVNYWM6OnNsaWRlclRpY2tPZmZzZXRGcm9tVHJhY2tDZW50ZXIoKSBjb25z
dAogCiBjb25zdCBpbnQgc2xpZGVyVGh1bWJXaWR0aCA9IDE1OwogY29uc3QgaW50IHNsaWRlclRo
dW1iSGVpZ2h0ID0gMTU7Ci1jb25zdCBpbnQgbWVkaWFTbGlkZXJUaHVtYldpZHRoID0gMTM7Ci1j
b25zdCBpbnQgbWVkaWFTbGlkZXJUaHVtYkhlaWdodCA9IDE0OwogCiB2b2lkIFJlbmRlclRoZW1l
TWFjOjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50Kikg
Y29uc3QKIHsKQEAgLTE3ODIsMzU1ICsxNzMxLDYgQEAgdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRq
dXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0CiAj
ZW5kaWYKIH0KIAotI2lmIEVOQUJMRShWSURFTykKLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRq
dXN0TWVkaWFTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAg
IGludCB3a1BhcnQ7Ci0gICAgc3dpdGNoIChzdHlsZS0+YXBwZWFyYW5jZSgpKSB7Ci0gICAgY2Fz
ZSBNZWRpYVNsaWRlclRodW1iUGFydDoKLSAgICAgICAgd2tQYXJ0ID0gTWVkaWFTbGlkZXJUaHVt
YjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNZWRpYVZvbHVtZVNsaWRlclRodW1iUGFydDoK
LSAgICAgICAgd2tQYXJ0ID0gTWVkaWFWb2x1bWVTbGlkZXJUaHVtYjsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUaHVtYlBhcnQ6Ci0gICAgICAg
IHdrUGFydCA9IE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRodW1iOwotICAgICAgICBicmVh
azsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IHdpZHRo
ID0gbWVkaWFTbGlkZXJUaHVtYldpZHRoOwotICAgIGludCBoZWlnaHQgPSBtZWRpYVNsaWRlclRo
dW1iSGVpZ2h0OwotCi0gICAgaWYgKG1lZGlhQ29udHJvbGxlclRoZW1lKCkgPT0gTWVkaWFDb250
cm9sbGVyVGhlbWVRdWlja1RpbWUpIHsKLSAgICAgICAgQ0dTaXplIHNpemU7Ci0gICAgICAgIHdr
TWVhc3VyZU1lZGlhVUlQYXJ0KHdrUGFydCwgTWVkaWFDb250cm9sbGVyVGhlbWVRdWlja1RpbWUs
IE5VTEwsICZzaXplKTsKLSAgICAgICAgd2lkdGggPSBzaXplLndpZHRoOwotICAgICAgICBoZWln
aHQgPSBzaXplLmhlaWdodDsKLSAgICB9Ci0KLSAgICBmbG9hdCB6b29tTGV2ZWwgPSBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpOwotICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc3RhdGljX2Nhc3Q8
aW50Pih3aWR0aCAqIHpvb21MZXZlbCksIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEhlaWdodChM
ZW5ndGgoc3RhdGljX2Nhc3Q8aW50PihoZWlnaHQgKiB6b29tTGV2ZWwpLCBGaXhlZCkpOwotfQot
Ci1lbnVtIFdLTWVkaWFDb250cm9sbGVyVGhlbWVTdGF0ZSB7IAotICAgIE1lZGlhVUlQYXJ0RGlz
YWJsZWRGbGFnID0gMSA8PCAwLAotICAgIE1lZGlhVUlQYXJ0UHJlc3NlZEZsYWcgPSAxIDw8IDEs
Ci0gICAgTWVkaWFVSVBhcnREcmF3RW5kQ2Fwc0ZsYWcgPSAxIDw8IDMsCi19OwotCi1zdGF0aWMg
dW5zaWduZWQgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKE5vZGUqIG5vZGUpCi17Ci0gICAgdW5z
aWduZWQgZmxhZ3MgPSAwOwotCi0gICAgaWYgKG5vZGUtPmRpc2FibGVkKCkpCi0gICAgICAgIGZs
YWdzIHw9IE1lZGlhVUlQYXJ0RGlzYWJsZWRGbGFnOwotICAgIGVsc2UgaWYgKG5vZGUtPmFjdGl2
ZSgpKQotICAgICAgICBmbGFncyB8PSBNZWRpYVVJUGFydFByZXNzZWRGbGFnOwotICAgIHJldHVy
biBmbGFnczsKLX0KLQotLy8gVXRpbGl0eSB0byBzY2FsZSB3aGVuIHRoZSBVSSBwYXJ0IGFyZSBu
b3Qgc2NhbGVkIGJ5IHdrRHJhd01lZGlhVUlQYXJ0Ci1zdGF0aWMgRmxvYXRSZWN0IGdldFVuem9v
bWVkUmVjdEFuZEFkanVzdEN1cnJlbnRDb250ZXh0KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QgJm9yaWdpbmFsUmVjdCkKLXsKLSAgICBm
bG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgRmxvYXRS
ZWN0IHVuem9vbWVkUmVjdChvcmlnaW5hbFJlY3QpOwotICAgIGlmICh6b29tTGV2ZWwgIT0gMS4w
ZiAmJiBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpID09IE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tU
aW1lKSB7Ci0gICAgICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lkdGgo
KSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29tZWRS
ZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRy
YW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3QueSgpKTsKLSAgICAgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOwot
ICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgpLCAt
dW56b29tZWRSZWN0LnkoKSk7Ci0gICAgfQotICAgIHJldHVybiB1bnpvb21lZFJlY3Q7Ci19Ci0K
LQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikK
LXsKLSAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG5vZGUtPmlzTWVkaWFDb250cm9sRWxlbWVudCgpKSB7
Ci0gICAgICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJ
bmZvLmNvbnRleHQpOwotICAgICAgICB3a0RyYXdNZWRpYVVJUGFydChtZWRpYUNvbnRyb2xFbGVt
ZW50VHlwZShub2RlKSwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29u
dGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFNdXRlQnV0
dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKLSAgICBOb2RlKiBtZWRp
YU5vZGUgPSBub2RlID8gbm9kZS0+c2hhZG93SG9zdCgpIDogMDsKLSAgICBpZiAoIW1lZGlhTm9k
ZSB8fCAoIW1lZGlhTm9kZS0+aGFzVGFnTmFtZSh2aWRlb1RhZykgJiYgIW1lZGlhTm9kZS0+aGFz
VGFnTmFtZShhdWRpb1RhZykpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobm9k
ZS0+aXNNZWRpYUNvbnRyb2xFbGVtZW50KCkpIHsKLSAgICAgICAgTG9jYWxDdXJyZW50R3JhcGhp
Y3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0gICAgICAgIHdrRHJh
d01lZGlhVUlQYXJ0KG1lZGlhQ29udHJvbEVsZW1lbnRUeXBlKG5vZGUpLCBtZWRpYUNvbnRyb2xs
ZXJUaGVtZSgpLCBsb2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3Rh
dGVGbGFncyhub2RlKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5k
ZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBOb2RlKiBub2Rl
ID0gby0+bm9kZSgpOwotICAgIE5vZGUqIG1lZGlhTm9kZSA9IG5vZGUgPyBub2RlLT5zaGFkb3dI
b3N0KCkgOiAwOwotICAgIGlmICghbWVkaWFOb2RlIHx8ICghbWVkaWFOb2RlLT5oYXNUYWdOYW1l
KHZpZGVvVGFnKSAmJiAhbWVkaWFOb2RlLT5oYXNUYWdOYW1lKGF1ZGlvVGFnKSkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmIChub2RlLT5pc01lZGlhQ29udHJvbEVsZW1lbnQoKSkg
ewotICAgICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50
SW5mby5jb250ZXh0KTsKLSAgICAgICAgd2tEcmF3TWVkaWFVSVBhcnQobWVkaWFDb250cm9sRWxl
bWVudFR5cGUobm9kZSksIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0Nv
bnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2Vla0Jh
Y2tCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcikKLXsKLSAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwotICAgIGlmICgh
bm9kZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3ND
b250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0gICAgd2tEcmF3TWVkaWFV
SVBhcnQoTWVkaWFTZWVrQmFja0J1dHRvbiwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxD
b250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVNl
ZWtGb3J3YXJkQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKLSAg
ICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIExvY2FsQ3VycmVudEdy
YXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHdrRHJh
d01lZGlhVUlQYXJ0KE1lZGlhU2Vla0ZvcndhcmRCdXR0b24sIG1lZGlhQ29udHJvbGxlclRoZW1l
KCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdz
KG5vZGUpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBh
aW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7
Ci0gICAgRWxlbWVudCogbWVkaWFOb2RlID0gbm9kZSA/IG5vZGUtPnNoYWRvd0hvc3QoKSA6IDA7
Ci0gICAgaWYgKCFtZWRpYU5vZGUgfHwgIW1lZGlhTm9kZS0+aXNNZWRpYUVsZW1lbnQoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50
ID0gc3RhdGljX2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG1lZGlhTm9kZSk7Ci0gICAgaWYgKCFt
ZWRpYUVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFJlZlB0cjxUaW1lUmFu
Z2VzPiB0aW1lUmFuZ2VzID0gbWVkaWFFbGVtZW50LT5idWZmZXJlZCgpOwotICAgIEV4Y2VwdGlv
bkNvZGUgaWdub3JlZEV4Y2VwdGlvbjsKLSAgICBmbG9hdCB0aW1lTG9hZGVkID0gdGltZVJhbmdl
cy0+bGVuZ3RoKCkgPyB0aW1lUmFuZ2VzLT5lbmQoMCwgaWdub3JlZEV4Y2VwdGlvbikgOiAwOwot
ICAgIGZsb2F0IGN1cnJlbnRUaW1lID0gbWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpOwotICAg
IGZsb2F0IGR1cmF0aW9uID0gbWVkaWFFbGVtZW50LT5kdXJhdGlvbigpOwotICAgIGlmIChpc25h
bihkdXJhdGlvbikpCi0gICAgICAgIGR1cmF0aW9uID0gMDsKLSAKLSAgICBDb250ZXh0Q29udGFp
bmVyIGNnQ29udGV4dENvbnRhaW5lcihwYWludEluZm8uY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0
UmVmIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOwotICAgIEdyYXBoaWNz
Q29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotICAgIEZs
b2F0UmVjdCB1bnpvb21lZFJlY3QgPSBnZXRVbnpvb21lZFJlY3RBbmRBZGp1c3RDdXJyZW50Q29u
dGV4dChvLCBwYWludEluZm8sIHIpOwotICAgIHdrRHJhd01lZGlhU2xpZGVyVHJhY2sobWVkaWFD
b250cm9sbGVyVGhlbWUoKSwgY29udGV4dCwgdW56b29tZWRSZWN0LCAKLSAgICAgICAgdGltZUxv
YWRlZCwgY3VycmVudFRpbWUsIGR1cmF0aW9uLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9k
ZSkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRN
ZWRpYVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKLSAg
ICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIExvY2FsQ3VycmVudEdy
YXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHdrRHJh
d01lZGlhVUlQYXJ0KE1lZGlhU2xpZGVyVGh1bWIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxv
Y2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUp
KTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0gICAgCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWlu
dE1lZGlhUmV3aW5kQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWlu
dEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsK
LSAgICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBMb2NhbEN1
cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAg
ICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVJld2luZEJ1dHRvbiwgbWVkaWFDb250cm9sbGVyVGhl
bWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxh
Z3Mobm9kZSkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6
cGFpbnRNZWRpYVJldHVyblRvUmVhbHRpbWVCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBOb2RlKiBub2Rl
ID0gby0+bm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IAotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZv
LmNvbnRleHQpOwotICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlhUmV0dXJuVG9SZWFsdGltZUJ1
dHRvbiwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCBy
LCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVRvZ2dsZUNsb3NlZENhcHRpb25zQnV0
dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKLSAgICBpZiAoIW5vZGUp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIW5vZGUtPmlzTWVkaWFDb250cm9sRWxl
bWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBMb2NhbEN1cnJlbnRHcmFwaGlj
c0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICB3a0RyYXdNZWRp
YVVJUGFydChtZWRpYUNvbnRyb2xFbGVtZW50VHlwZShub2RlKSwgbWVkaWFDb250cm9sbGVyVGhl
bWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxh
Z3Mobm9kZSkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLSAKLWJvb2wgUmVuZGVyVGhlbWVNYWM6
OnBhaW50TWVkaWFDb250cm9sc0JhY2tncm91bmQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBOb2RlKiBub2RlID0g
by0+bm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
TG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4
dCk7Ci0gICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFUaW1lbGluZUNvbnRhaW5lciwgbWVkaWFD
b250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJ
UGFydFN0YXRlRmxhZ3Mobm9kZSkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5k
ZXJUaGVtZU1hYzo6cGFpbnRNZWRpYUN1cnJlbnRUaW1lKFJlbmRlck9iamVjdCogbywgY29uc3Qg
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9k
ZSA9IG8tPm5vZGUoKTsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIENvbnRleHRDb250YWluZXIgY2dDb250ZXh0Q29udGFpbmVyKHBhaW50SW5mby5jb250ZXh0
KTsKLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5j
b250ZXh0KTsKLSAgICBGbG9hdFJlY3QgdW56b29tZWRSZWN0ID0gZ2V0VW56b29tZWRSZWN0QW5k
QWRqdXN0Q3VycmVudENvbnRleHQobywgcGFpbnRJbmZvLCByKTsKLSAgICB3a0RyYXdNZWRpYVVJ
UGFydChNZWRpYUN1cnJlbnRUaW1lRGlzcGxheSwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgY2dD
b250ZXh0Q29udGFpbmVyLmNvbnRleHQoKSwgdW56b29tZWRSZWN0LCBnZXRNZWRpYVVJUGFydFN0
YXRlRmxhZ3Mobm9kZSkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVt
ZU1hYzo6cGFpbnRNZWRpYVRpbWVSZW1haW5pbmcoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBOb2RlKiBub2RlID0g
by0+bm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
Q29udGV4dENvbnRhaW5lciBjZ0NvbnRleHRDb250YWluZXIocGFpbnRJbmZvLmNvbnRleHQpOwot
ICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRl
eHQpOwotICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3QgPSBnZXRVbnpvb21lZFJlY3RBbmRBZGp1
c3RDdXJyZW50Q29udGV4dChvLCBwYWludEluZm8sIHIpOwotICAgIHdrRHJhd01lZGlhVUlQYXJ0
KE1lZGlhVGltZVJlbWFpbmluZ0Rpc3BsYXksIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGNnQ29u
dGV4dENvbnRhaW5lci5jb250ZXh0KCksIHVuem9vbWVkUmVjdCwgZ2V0TWVkaWFVSVBhcnRTdGF0
ZUZsYWdzKG5vZGUpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVN
YWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJDb250YWluZXIoUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBOb2RlKiBu
b2RlID0gby0+bm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7Ci0gICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFWb2x1bWVTbGlkZXJDb250YWlu
ZXIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwg
Z2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJP
YmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQot
ewotICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7Ci0gICAgaWYgKCFub2RlKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250
ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVZvbHVt
ZVNsaWRlciwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgp
LCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwotICAgIHJldHVybiBmYWxzZTsK
LX0KLSAgICAKLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJUaHVt
YihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByKQotewotICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7Ci0gICAgaWYgKCFub2RlKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQg
bG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICB3a0RyYXdNZWRpYVVJUGFydChN
ZWRpYVZvbHVtZVNsaWRlclRodW1iLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2NhbENvbnRl
eHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVsbFNj
cmVlblZvbHVtZVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTm9kZSogbm9kZSA9IG8tPm5vZGUo
KTsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBMb2Nh
bEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsK
LSAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXIsIG1lZGlh
Q29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFV
SVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVu
ZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFGdWxsU2NyZWVuVm9sdW1lU2xpZGVyVGh1bWIoUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikK
LXsKLSAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIAotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlh
RnVsbFNjcmVlblZvbHVtZVNsaWRlclRodW1iLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2Nh
bENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1TdHJpbmcgUmVuZGVyVGhlbWVNYWM6OmV4dHJhTWVk
aWFDb250cm9sc1N0eWxlU2hlZXQoKQotewotI2lmIFBMQVRGT1JNKE1BQykKLSAgICBpZiAobWVk
aWFDb250cm9sbGVyVGhlbWUoKSA9PSBNZWRpYUNvbnRyb2xsZXJUaGVtZVF1aWNrVGltZSkKLSAg
ICAgICAgcmV0dXJuIFN0cmluZyhtZWRpYUNvbnRyb2xzUXVpY2tUaW1lVXNlckFnZW50U3R5bGVT
aGVldCwgc2l6ZW9mKG1lZGlhQ29udHJvbHNRdWlja1RpbWVVc2VyQWdlbnRTdHlsZVNoZWV0KSk7
Ci0KLSAgICByZXR1cm4gU3RyaW5nKCk7Ci0jZWxzZQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgIHJldHVybiBTdHJpbmcoKTsKLSNlbmRpZgotfQotCi0jaWYgRU5BQkxFKEZVTExTQ1JF
RU5fQVBJKQotU3RyaW5nIFJlbmRlclRoZW1lTWFjOjpleHRyYUZ1bGxTY3JlZW5TdHlsZVNoZWV0
KCkKLXsKLSNpZiBQTEFURk9STShNQUMpCi0gICAgaWYgKG1lZGlhQ29udHJvbGxlclRoZW1lKCkg
PT0gTWVkaWFDb250cm9sbGVyVGhlbWVRdWlja1RpbWUpCi0gICAgICAgIHJldHVybiBTdHJpbmco
ZnVsbHNjcmVlblF1aWNrVGltZVVzZXJBZ2VudFN0eWxlU2hlZXQsIHNpemVvZihmdWxsc2NyZWVu
UXVpY2tUaW1lVXNlckFnZW50U3R5bGVTaGVldCkpOwotICAgIAotICAgIHJldHVybiBTdHJpbmco
KTsKLSNlbHNlCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIFN0cmluZygp
OwotI2VuZGlmCi19Ci0jZW5kaWYKLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6aGFzT3duRGlzYWJs
ZWRTdGF0ZUhhbmRsaW5nRm9yKENvbnRyb2xQYXJ0IHBhcnQpIGNvbnN0Ci17Ci0gICAgaWYgKHBh
cnQgPT0gTWVkaWFNdXRlQnV0dG9uUGFydCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
cmV0dXJuIG1lZGlhQ29udHJvbGxlclRoZW1lKCkgPT0gTWVkaWFDb250cm9sbGVyVGhlbWVDbGFz
c2ljOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjp1c2VzTWVkaWFDb250cm9sU3RhdHVzRGlz
cGxheSgpCi17Ci0gICAgcmV0dXJuIG1lZGlhQ29udHJvbGxlclRoZW1lKCkgPT0gTWVkaWFDb250
cm9sbGVyVGhlbWVRdWlja1RpbWU7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnVzZXNNZWRp
YUNvbnRyb2xWb2x1bWVTbGlkZXIoKSBjb25zdAotewotICAgIHJldHVybiBtZWRpYUNvbnRyb2xs
ZXJUaGVtZSgpID09IE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1lOwotfQotCi1JbnRQb2lu
dCBSZW5kZXJUaGVtZU1hYzo6dm9sdW1lU2xpZGVyT2Zmc2V0RnJvbU11dGVCdXR0b24oUmVuZGVy
Qm94KiBtdXRlQnV0dG9uQm94LCBjb25zdCBJbnRTaXplJiBzaXplKSBjb25zdAotewotICAgIHJl
dHVybiBSZW5kZXJNZWRpYUNvbnRyb2xzOjp2b2x1bWVTbGlkZXJPZmZzZXRGcm9tTXV0ZUJ1dHRv
bihtdXRlQnV0dG9uQm94LCBzaXplKTsKLX0KLQotI2VuZGlmIC8vIEVOQUJMRShWSURFTykKLQog
Ym9vbCBSZW5kZXJUaGVtZU1hYzo6c2hvdWxkU2hvd1BsYWNlaG9sZGVyV2hlbkZvY3VzZWQoKSBj
b25zdAogewogI2lmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173677</attachid>
            <date>2012-11-12 11:25:54 -0800</date>
            <delta_ts>2012-11-13 14:03:48 -0800</delta_ts>
            <desc>RenderThemeMacShared,v1</desc>
            <filename>bug-101634-20121112142356.patch</filename>
            <type>text/plain</type>
            <size>194705</size>
            <attacher name="Robert Sesek">rsesek</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM0MjQ2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMGVhNDRjNzUyMWNjZDMx
Nzk4ZmJiZjViMmI2MTczZmE4NDBjZGJiMS4uOWZkOTI2ZTVhZTQ1Yjc5Y2I1MzliZmNkNjQ2NjNh
YzdhZmVjMzI2NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1NCBAQAorMjAxMi0xMS0xMiAgUm9i
ZXJ0IFNlc2VrICA8cnNlc2VrQGNocm9taXVtLm9yZz4KKworICAgICAgICBTZXZlciBDaHJvbWl1
bSdzIGRlcGVuZGVuY2Ugb24gV2ViS2l0U3lzdGVtSW50ZXJmYWNlIG1lZGlhIGNvbnRyb2wgZHJh
d2luZyBmdW5jdGlvbnMgaW4gUmVuZGVyVGhlbWVNYWMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwMTYzNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgc3BsaXRzIG91dCB0aGUgY29tbW9uIG1ldGhv
ZHMgYmV0d2VlbiBSZW5kZXJUaGVtZU1hYyBhbmQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYworICAg
ICAgICBpbnRvIFJlbmRlclRoZW1lTWFjU2hhcmVkLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywg
anVzdCByZWZhY3RvcmluZy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwOiBS
ZW1vdmUgUmVuZGVyVGhlbWVNYWMubW0gZnJvbSBwbGF0Zm9ybS8gc291cmNlcyBsaXN0LCBzaW5j
ZSBpdCdzIHBhcnQgb2YgcmVuZGVyaW5nLworICAgICAgICAqIFdlYkNvcmUuZ3lwaTogQWRkIFJl
bmRlclRoZW1lTWFjU2hhcmVkLntoLG1tfQorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvajogQWRkIFJlbmRlclRoZW1lTWFjU2hhcmVkLntoLG1tfQorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLmg6CisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlclRoZW1lQ2hyb21pdW1NYWMubW06CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUNocm9taXVtTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpleHRyYURlZmF1bHRTdHls
ZVNoZWV0KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaDoKKyAgICAgICAg
KFJlbmRlclRoZW1lTWFjKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW06
CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lOjp0aGVt
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmNyZWF0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6UmVuZGVyVGhlbWVNYWMpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6On5SZW5kZXJUaGVtZU1hYyk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6ZG9jdW1lbnRWaWV3Rm9yKToKKyAgICAgICAgKFdlYkNv
cmU6Om1lZGlhQ29udHJvbGxlclRoZW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjOjpwYWludE1lZGlhU2xpZGVyVHJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWM6OnBhaW50TWVkaWFSZXdpbmRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWM6OnBhaW50TWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRy
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVsbFNj
cmVlblZvbHVtZVNsaWRlclRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
OjpleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjOjpleHRyYUZ1bGxTY3JlZW5TdHlsZVNoZWV0KToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQuaDogQ29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lTWFjLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJl
bmRlclRoZW1lTWFjU2hhcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzdXBwb3J0c0NvbnRyb2xUaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2Nyb2xsYmFyQ29udHJvbFNpemVGb3JQYXJ0KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpzdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRDb2xv
cnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnN1cHBvcnRzQ2xv
c2VkQ2FwdGlvbmluZyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
dXBkYXRlQWN0aXZlU3RhdGUpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1No
YXJlZC5tbTogQ29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1l
TWFjLm1tLgorICAgICAgICAoLVtXZWJDb3JlUmVuZGVyVGhlbWVOb3RpZmljYXRpb25PYnNlcnZl
ciBpbml0V2l0aFRoZW1lOldlYkNvcmU6Ol0pOgorICAgICAgICAoLVtXZWJDb3JlUmVuZGVyVGhl
bWVOb3RpZmljYXRpb25PYnNlcnZlciBzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6XSk6CisgICAgICAg
ICgtW1dlYkNvcmVUZXh0RmllbGRDZWxsIF9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTppblZp
ZXc6aW5jbHVkZUZvY3VzOl0pOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6UmVuZGVyVGhlbWVNYWNTaGFyZWQpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6On5SZW5kZXJUaGVtZU1hY1NoYXJlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1BY3RpdmVTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3JtQWN0aXZlTGlzdEJveFNl
bGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6cGxhdGZvcm1BY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUluYWN0aXZl
TGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1Gb2N1c1JpbmdDb2xvcik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6dG9Gb250V2VpZ2h0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpzeXN0ZW1Gb250KToKKyAgICAg
ICAgKFdlYkNvcmU6OmNvbnZlcnROU0NvbG9yVG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpt
ZW51QmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZU1hY1NoYXJlZDo6c3lzdGVtQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjppc0NvbnRyb2xTdHlsZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFJlcGFpbnRSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjppbmZsYXRlUmVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udmVydFRvUGFpbnRpbmdSZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjp1cGRhdGVDaGVja2VkU3RhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnVwZGF0ZUVuYWJsZWRT
dGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dXBkYXRlRm9j
dXNlZFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjp1cGRh
dGVQcmVzc2VkU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OmNvbnRyb2xTdXBwb3J0c1RpbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
U2hhcmVkOjpjb250cm9sU2l6ZUZvckZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnNldENvbnRyb2xTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpzaXplRm9yRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2l6ZUZvclN5c3RlbUZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWNTaGFyZWQ6OnNldFNpemVGcm9tRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6c2V0Rm9udEZyb21Db250cm9sU2l6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udHJvbFNpemVGb3JTeXN0ZW1Gb250KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFRleHRGaWVsZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0VGV4dEZpZWxkU3R5
bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50Q2Fwc0xv
Y2tJbmRpY2F0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBh
aW50VGV4dEFyZWEpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFk
anVzdFRleHRBcmVhU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFy
ZWQ6OnBvcHVwQnV0dG9uTWFyZ2lucyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6cG9wdXBCdXR0b25TaXplcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6cG9wdXBCdXR0b25QYWRkaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwYWludE1lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjU2hhcmVkOjptZXRlclNpemVGb3JCb3VuZHMpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50TWV0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OnN1cHBvcnRzTWV0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OmxldmVsSW5kaWNhdG9yU3R5bGVGb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmxldmVsSW5kaWNhdG9yRm9yKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwcm9ncmVzc0JhclNpemVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwcm9ncmVzc0Jhck1hcmdpbnMpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6Om1pbmltdW1Qcm9ncmVzc0Jh
ckhlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YW5pbWF0
aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0Jhcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0Jhcik6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0UHJvZ3Jlc3NCYXJTdHls
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRQcm9ncmVz
c0Jhcik6CisgICAgICAgIChXZWJDb3JlOjpUb3BHcmFkaWVudEludGVycG9sYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkJvdHRvbUdyYWRpZW50SW50ZXJwb2xhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWFpbkdyYWRpZW50SW50ZXJwb2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhY2tHcmFk
aWVudEludGVycG9sYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVk
OjpwYWludE1lbnVMaXN0QnV0dG9uR3JhZGllbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwYWludE1lbnVMaXN0QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6
Om1lbnVMaXN0QnV0dG9uU2l6ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OmFkanVzdE1lbnVMaXN0U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdU
b3ApOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJu
YWxQYWRkaW5nQm90dG9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVk
OjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpzZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bWVudUxpc3RTaXplcyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bWluaW11bU1lbnVMaXN0U2l6ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2xpZGVyVHJhY2tTdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTbGlkZXJUcmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2xpZGVyVGh1
bWJTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRT
bGlkZXJUaHVtYik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFp
bnRTZWFyY2hGaWVsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
c2V0U2VhcmNoQ2VsbFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzZWFyY2hGaWVsZFNpemVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
U2hhcmVkOjpzZXRTZWFyY2hGaWVsZFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24pOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmNhbmNlbEJ1dHRvblNpemVzKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTZWFyY2hGaWVs
ZENhbmNlbEJ1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpyZXN1bHRzQnV0dG9uU2l6ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2VhcmNoRmll
bGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1
dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWlu
dFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2xpZGVyVGlja1NpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnNsaWRlclRpY2tPZmZzZXRGcm9tVHJhY2tDZW50ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNsaWRlclRodW1iU2l6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2hvdWxkU2hvd1BsYWNlaG9s
ZGVyV2hlbkZvY3VzZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OnBvcHVwQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpz
ZWFyY2gpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNlYXJjaE1l
bnVUZW1wbGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2xp
ZGVyVGh1bWJIb3Jpem9udGFsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzbGlkZXJUaHVtYlZlcnRpY2FsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjU2hhcmVkOjp0ZXh0RmllbGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OmZpbGVMaXN0TmFtZUZvcldpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpwYWludFBsdWdJblNuYXBzaG90T3ZlcmxheSk6CisKIDIwMTItMTEtMTIg
IENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgogCiAgICAgICAgIFVu
cmV2aWV3ZWQuIEZpeCBtYWtlIGRpc3RjaGVjay4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2Vi
Q29yZS5neXAKaW5kZXggMGRmZDI3NzA5OTFjNTgxMDBmOTQ4NjNiOTQ1MDg1ODZiZWI0MjdlMS4u
ZDAyNzdhOTllMDUyZWY5NzEyZGU3OWI5MjU4NTgyMjZkYzRlNThmMCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKKysrIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXAvV2ViQ29yZS5neXAKQEAgLTE3NDUsNyArMTc0NSw2IEBACiAgICAgICAgICAg
XSwKICAgICAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgICAgICcuLi9lZGl0aW5nL1NtYXJ0
UmVwbGFjZUNGLmNwcCcsCi0gICAgICAgICAgICAnLi4vcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFj
Lm1tJywKICAgICAgICAgICAgICcuLi8uLi9XZWJLaXQvbWFjL1dlYkNvcmVTdXBwb3J0L1dlYlN5
c3RlbUludGVyZmFjZS5tbScsCiAgICAgICAgICAgXSwKICAgICAgICAgICAnc291cmNlcy8nOiBb
CkBAIC0xNzY2LDcgKzE3NjUsNiBAQAogICAgICAgICAgICAgIyBDaGVycnktcGljayBzb21lIGZp
bGVzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgYnkgYnJvYWRlciByZWdleHBzLgogICAgICAgICAg
ICAgIyBTb21lIG9mIHRoZXNlIGFyZSB1c2VkIGluc3RlYWQgb2YgQ2hyb21pdW0gcGxhdGZvcm0g
ZmlsZXMsIHNlZQogICAgICAgICAgICAgIyB0aGUgc3BlY2lmaWMgZXhjbHVzaW9ucyBpbiB0aGUg
ImV4Y2x1ZGUiIGxpc3QgYmVsb3cuCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAncmVuZGVyaW5n
L1JlbmRlclRoZW1lTWFjXFwubW0kJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbG9yTWFjXFwubW0kJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUn
LCAncGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0XFwu
bW0kJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0Zs
b2F0UG9pbnRNYWNcXC5tbSQnXSwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
Z3lwaSBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA2ZmM1YzYwNjIzOGJkZjFl
YzY0ZTk2Y2I1YjYzODVjMTUzZjgxMTM3Li4yOTliMzI4OTFkNjZiNjMzZWE3MWY4MzliNmI0MThh
OTc3OTFjMjJjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zNDY0LDYgKzM0NjQsOCBAQAogICAgICAg
ICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmgnLAogICAgICAgICAgICAg
J3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvUmVu
ZGVyVGhlbWVNYWMubW0nLAorICAgICAgICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1No
YXJlZC5oJywKKyAgICAgICAgICAgICdyZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQubW0n
LAogICAgICAgICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVtZVNhZmFyaS5jcHAnLAogICAgICAg
ICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVtZVNhZmFyaS5oJywKICAgICAgICAgICAgICdyZW5k
ZXJpbmcvUmVuZGVyVGhlbWVXaW4uY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCA5NDRkNjIxMjRkZDcwMDI1NTJiNGU4YzU2
MWY3ZGMxNzRiNTcxMDE0Li4zMGJlYWI4M2ZjNzAxZjhlYWU1NGE5NzZkZmZjZTk0NzY5ZDA1N2Zh
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCkBAIC02NzcsNiArNjc3LDggQEAKIAkJMUNGNkJFMTQwRTlCQjQ2NzAwMjVFMUNEIC8qIE9i
akNOb2RlRmlsdGVyQ29uZGl0aW9uLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMUNGNkJFMTIwRTlCQjQ2NzAwMjVFMUNEIC8qIE9iakNOb2RlRmlsdGVy
Q29uZGl0aW9uLm1tICovOyB9OwogCQkxQ0Y2QkUxNTBFOUJCNDY3MDAyNUUxQ0QgLyogT2JqQ05v
ZGVGaWx0ZXJDb25kaXRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDFDRjZCRTEzMEU5QkI0NjcwMDI1RTFDRCAvKiBPYmpDTm9kZUZpbHRlckNvbmRp
dGlvbi5oICovOyB9OwogCQkxQ0ZBRTMyMzBBNkQ2QTNGMDAzMjU5M0QgLyogbGlib2JqYy5keWxp
YiBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFDRkFF
MzIyMEE2RDZBM0YwMDMyNTkzRCAvKiBsaWJvYmpjLmR5bGliICovOyB9OworCQkxRTUwMDg0NzE2
NTE2QUQ4MDBCN0UwOTggLyogUmVuZGVyVGhlbWVNYWNTaGFyZWQuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFFNTAwODQ1MTY1MTZBRDgwMEI3RTA5OCAv
KiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5oICovOyB9OworCQkxRTUwMDg0ODE2NTE2QUQ4MDBCN0Uw
OTggLyogUmVuZGVyVGhlbWVNYWNTaGFyZWQubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAxRTUwMDg0NjE2NTE2QUQ4MDBCN0UwOTggLyogUmVuZGVyVGhl
bWVNYWNTaGFyZWQubW0gKi87IH07CiAJCTFGM0MzQkVBMTM1Q0FGM0MwMEI4QzFBQyAvKiBNZWRp
YUNvbnRyb2xzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDFGM0MzQkU4MTM1Q0FGM0MwMEI4QzFBQyAvKiBNZWRpYUNvbnRyb2xzLmNwcCAqLzsgfTsK
IAkJMUYzQzNCRUIxMzVDQUYzQzAwQjhDMUFDIC8qIE1lZGlhQ29udHJvbHMuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFGM0MzQkU5MTM1Q0FGM0MwMEI4
QzFBQyAvKiBNZWRpYUNvbnRyb2xzLmggKi87IH07CiAJCTFGM0YxOTUzMTQ5OUNBNzYwMEE1QUVB
NyAvKiBQT0RGcmVlTGlzdEFyZW5hLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAxRjNGMTk1MjE0OTlDQTc2MDBBNUFFQTcgLyogUE9ERnJlZUxpc3RBcmVu
YS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC03
Nzk3LDYgKzc3OTksOCBAQAogCQkxQ0Y2QkUxMjBFOUJCNDY3MDAyNUUxQ0QgLyogT2JqQ05vZGVG
aWx0ZXJDb25kaXRpb24ubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGgg
PSBPYmpDTm9kZUZpbHRlckNvbmRpdGlvbi5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMUNGNkJFMTMwRTlCQjQ2NzAwMjVFMUNEIC8qIE9iakNOb2RlRmlsdGVyQ29uZGl0aW9uLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE9iakNOb2RlRmlsdGVyQ29uZGl0aW9u
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFDRkFFMzIyMEE2RDZBM0YwMDMyNTkz
RCAvKiBsaWJvYmpjLmR5bGliICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93
bkZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5keWxpYiI7IG5hbWUgPSBsaWJvYmpjLmR5bGli
OyBwYXRoID0gL3Vzci9saWIvbGlib2JqYy5keWxpYjsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+
IjsgfTsKKwkJMUU1MDA4NDUxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVk
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlclRoZW1lTWFjU2hhcmVk
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFFNTAwODQ2MTY1MTZBRDgwMEI3RTA5
OCAvKiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9i
amNwcDsgcGF0aCA9IFJlbmRlclRoZW1lTWFjU2hhcmVkLm1tOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkxRjNDM0JFODEzNUNBRjNDMDBCOEMxQUMgLyogTWVkaWFDb250cm9scy5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBNZWRpYUNvbnRyb2xzLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMUYzQzNCRTkxMzVDQUYzQzAwQjhDMUFDIC8q
IE1lZGlhQ29udHJvbHMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTWVkaWFD
b250cm9scy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxRjNGMTk1MjE0OTlDQTc2
MDBBNUFFQTcgLyogUE9ERnJlZUxpc3RBcmVuYS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBQT0RGcmVlTGlzdEFyZW5hLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBA
IC0yMTY1MSw2ICsyMTY1NSw4IEBACiAJCQkJQkNFQTQ4NEIwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlclRoZW1lLmggKi8sCiAJCQkJQkNFQTQ4NDgwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRo
ZW1lTWFjLmggKi8sCiAJCQkJQkNFQTQ4NDkwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1l
TWFjLm1tICovLAorCQkJCTFFNTAwODQ1MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1h
Y1NoYXJlZC5oICovLAorCQkJCTFFNTAwODQ2MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVt
ZU1hY1NoYXJlZC5tbSAqLywKIAkJCQk5Mzk1NUE0MjAzRDcyOTMyMDA4NjM1Q0UgLyogUmVuZGVy
VHJlZUFzVGV4dC5jcHAgKi8sCiAJCQkJOTM5NTVBNDEwM0Q3MjkzMjAwODYzNUNFIC8qIFJlbmRl
clRyZWVBc1RleHQuaCAqLywKIAkJCQlFNEI0MUUzMzBDQkZCNjA5MDBBRjJFQ0UgLyogUmVuZGVy
VmlkZW8uY3BwICovLApAQCAtMjU2OTksNiArMjU3MDUsNyBAQAogCQkJCUUxNDI0Qzk0MTY0QjUy
QzgwMEYzMkQ0MCAvKiBDb29raWVKYXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0MTFEQ0IxMTY0
QzM5QTgwMEQ0OUJDMSAvKiBXaWR0aENhY2hlLmggaW4gSGVhZGVycyAqLywKIAkJCQk1NzBCNzhD
MDE2NTBDRTgxMDAxREJFMUIgLyogU2VsZWN0UnVsZUZlYXR1cmVTZXQuaCBpbiBIZWFkZXJzICov
LAorCQkJCTFFNTAwODQ3MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5o
IGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vz
c2luZyA9IDA7CiAJCX07CkBAIC0yODc4Nyw2ICsyODc5NCw3IEBACiAJCQkJRTE0MjRDOTAxNjRC
NDYwQjAwRjMyRDQwIC8qIENvb2tpZUphck1hYy5tbSBpbiBTb3VyY2VzICovLAogCQkJCUUxNDI0
QzkzMTY0QjUyQzgwMEYzMkQ0MCAvKiBDb29raWVKYXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
NTcwQjc4QkYxNjUwQ0U4MTAwMURCRTFCIC8qIFNlbGVjdFJ1bGVGZWF0dXJlU2V0LmNwcCBpbiBT
b3VyY2VzICovLAorCQkJCTFFNTAwODQ4MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1h
Y1NoYXJlZC5tbSBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50
UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1NYWMuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLmgKaW5kZXggMWY1YTgxNDg0OTFiNDhkOWIyMzgxZWE3
YmNlOTU0MzExOTg0MGZhOC4uNWFjZDEzYWY1MDlhY2YxNWEwZmFkNjc4ODQ3ZjBlMGRjODY1OTUx
NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21p
dW1NYWMuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1
bU1hYy5oCkBAIC0yNSwxMSArMjUsMTEgQEAKICNkZWZpbmUgUmVuZGVyVGhlbWVDaHJvbWl1bU1h
Y19oCiAKICNpbXBvcnQgIlJlbmRlclRoZW1lQ2hyb21pdW1Db21tb24uaCIKLSNpbXBvcnQgIlJl
bmRlclRoZW1lTWFjLmgiCisjaW1wb3J0ICJSZW5kZXJUaGVtZU1hY1NoYXJlZC5oIgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIFJlbmRlclRoZW1lQ2hyb21pdW1NYWMgOiBwdWJsaWMg
UmVuZGVyVGhlbWVNYWMgeworY2xhc3MgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYyA6IHB1YmxpYyBS
ZW5kZXJUaGVtZU1hY1NoYXJlZCB7CiBwdWJsaWM6CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVu
ZGVyVGhlbWU+IGNyZWF0ZSgpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyVGhlbWVDaHJvbWl1bU1hYy5tbSBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJUaGVtZUNocm9taXVtTWFjLm1tCmluZGV4IDU2ZDllYTYwN2IxNDRmMzZlOGU0OWFhMGU4
NzYyZmJkNTc3OWZlMGMuLjkxZmU2YmE2Njg0NTg4MTgwZmE3NGFiYmY1MGMwZTJmNjViMDAyZTUg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVt
TWFjLm1tCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVt
TWFjLm1tCkBAIC05OSw3ICs5OSw3IEBAIGludCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwb3B1
cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAogICAgIGlmIChz
dHlsZS0+YXBwZWFyYW5jZSgpID09IFRleHRGaWVsZFBhcnQpCiAgICAgICAgIHJldHVybiBhdXRv
ZmlsbFBvcHVwSG9yaXpvbnRhbFBhZGRpbmc7CiAKLSAgICByZXR1cm4gUmVuZGVyVGhlbWVNYWM6
OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChzdHlsZSk7CisgICAgcmV0dXJuIFJlbmRlclRoZW1l
TWFjU2hhcmVkOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpOwogfQogCiBpbnQgUmVu
ZGVyVGhlbWVDaHJvbWl1bU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHls
ZSogc3R5bGUpIGNvbnN0CkBAIC0xMDcsNyArMTA3LDcgQEAgaW50IFJlbmRlclRoZW1lQ2hyb21p
dW1NYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25z
dAogICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IFRleHRGaWVsZFBhcnQpCiAgICAgICAg
IHJldHVybiBhdXRvZmlsbFBvcHVwSG9yaXpvbnRhbFBhZGRpbmc7CiAKLSAgICByZXR1cm4gUmVu
ZGVyVGhlbWVNYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoc3R5bGUpOworICAgIHJldHVy
biBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChzdHlsZSk7
CiB9CiAKIC8vIFVwZGF0ZXMgdGhlIGNvbnRyb2wgdGludCAoYS5rLmEuIGFjdGl2ZSBzdGF0ZSkg
b2YgfGNlbGx8IChmcm9tIHxvfCkuCkBAIC0xNzEsNyArMTcxLDcgQEAgU3RyaW5nIFJlbmRlclRo
ZW1lQ2hyb21pdW1NYWM6OmV4dHJhRnVsbFNjcmVlblN0eWxlU2hlZXQoKQogCiBTdHJpbmcgUmVu
ZGVyVGhlbWVDaHJvbWl1bU1hYzo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpCiB7Ci0gICAgcmV0
dXJuIFJlbmRlclRoZW1lTWFjOjpleHRyYURlZmF1bHRTdHlsZVNoZWV0KCkgKworICAgIHJldHVy
biBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpICsKICAgICAg
ICAgICAgU3RyaW5nKHRoZW1lQ2hyb21pdW1Vc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2YodGhl
bWVDaHJvbWl1bVVzZXJBZ2VudFN0eWxlU2hlZXQpKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyVGhlbWVNYWMuaAppbmRleCAzMjg4NDcxYWRlZDQwNTI5ZjYyYzA1NDdmYWYy
Njg2NDA1Yjc5ZWE2Li4yNjNmNjM2NDk4MjM4NjIzNjczNmVlMDBlZTA0MGE4ZTcwYTQxOWVkIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaApAQCAtMjMsMTMxICsy
MywyNSBAQAogI2lmbmRlZiBSZW5kZXJUaGVtZU1hY19oCiAjZGVmaW5lIFJlbmRlclRoZW1lTWFj
X2gKIAotI2ltcG9ydCAiUmVuZGVyVGhlbWUuaCIKLSNpbXBvcnQgPHd0Zi9IYXNoTWFwLmg+Cisj
aW1wb3J0ICJSZW5kZXJUaGVtZU1hY1NoYXJlZC5oIgogI2ltcG9ydCA8d3RmL1JldGFpblB0ci5o
PgogCiAKLU9CSkNfQ0xBU1MgV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXI7
Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgUmVuZGVyUHJvZ3Jlc3M7CiBjbGFzcyBS
ZW5kZXJTdHlsZTsKIAotY2xhc3MgUmVuZGVyVGhlbWVNYWMgOiBwdWJsaWMgUmVuZGVyVGhlbWUg
eworY2xhc3MgUmVuZGVyVGhlbWVNYWMgOiBwdWJsaWMgUmVuZGVyVGhlbWVNYWNTaGFyZWQgewog
cHVibGljOgogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKIAot
ICAgIC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgY29udHJvbCBjaGFuZ2VzIGl0cyB0aW50IHdo
ZW4gdGhlIHdpbmRvdyBoYXMgZm9jdXMgb3Igbm90LgotICAgIHZpcnR1YWwgYm9vbCBjb250cm9s
U3VwcG9ydHNUaW50cyhjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKLQotICAgIC8vIEEgZ2Vu
ZXJhbCBtZXRob2QgYXNraW5nIGlmIGFueSBjb250cm9sIHRpbnRpbmcgaXMgc3VwcG9ydGVkIGF0
IGFsbC4KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNDb250cm9sVGludHMoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UmVwYWludFJlY3QoY29uc3Qg
UmVuZGVyT2JqZWN0KiwgSW50UmVjdCYpIE9WRVJSSURFOwotCi0gICAgdmlydHVhbCBib29sIGlz
Q29udHJvbFN0eWxlZChjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IEJvcmRlckRhdGEmLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsbExheWVyJiwgY29uc3QgQ29s
b3ImIGJhY2tncm91bmRDb2xvcikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3Jt
QWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDb2xv
ciBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29s
b3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVj
dGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1J
bmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIENvbG9yIHBsYXRmb3JtSW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9y
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkgY29u
c3Q7Ci0KLSAgICB2aXJ0dWFsIFNjcm9sbGJhckNvbnRyb2xTaXplIHNjcm9sbGJhckNvbnRyb2xT
aXplRm9yUGFydChDb250cm9sUGFydCkgeyByZXR1cm4gU21hbGxTY3JvbGxiYXI7IH0KLSAgICAK
LSAgICB2aXJ0dWFsIHZvaWQgcGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKLQotICAgIC8vIFN5
c3RlbSBmb250cy4KLSAgICB2aXJ0dWFsIHZvaWQgc3lzdGVtRm9udChpbnQgY3NzVmFsdWVJZCwg
Rm9udERlc2NyaXB0aW9uJikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGludCBtaW5pbXVtTWVudUxp
c3RTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xp
ZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotCi0jaWYgRU5BQkxF
KERBVEFMSVNUX0VMRU1FTlQpCi0gICAgdmlydHVhbCBJbnRTaXplIHNsaWRlclRpY2tTaXplKCkg
Y29uc3QgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBpbnQgc2xpZGVyVGlja09mZnNldEZyb21UcmFj
a0NlbnRlcigpIGNvbnN0IE9WRVJSSURFOwotI2VuZGlmCi0KLSAgICB2aXJ0dWFsIGludCBwb3B1
cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAgICB2aXJ0dWFsIGlu
dCBwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKikgY29uc3Q7Ci0gICAgdmly
dHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdUb3AoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGludCBwb3B1cEludGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSopIGNv
bnN0OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBwYWludENhcHNMb2NrSW5kaWNhdG9yKFJlbmRl
ck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBPVkVSUklERTsKLQot
ICAgIHZpcnR1YWwgYm9vbCBwb3BzTWVudUJ5QXJyb3dLZXlzKCkgY29uc3QgT1ZFUlJJREUgeyBy
ZXR1cm4gdHJ1ZTsgfQotCi0jaWYgRU5BQkxFKE1FVEVSX0VMRU1FTlQpCi0gICAgdmlydHVhbCBJ
bnRTaXplIG1ldGVyU2l6ZUZvckJvdW5kcyhjb25zdCBSZW5kZXJNZXRlciosIGNvbnN0IEludFJl
Y3QmKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZXRlcihSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCBi
b29sIHN1cHBvcnRzTWV0ZXIoQ29udHJvbFBhcnQpIGNvbnN0OwotI2VuZGlmCi0KLSNpZiBFTkFC
TEUoUFJPR1JFU1NfRUxFTUVOVCkKLSAgICAvLyBSZXR1cm5zIHRoZSByZXBlYXQgaW50ZXJ2YWwg
b2YgdGhlIGFuaW1hdGlvbiBmb3IgdGhlIHByb2dyZXNzIGJhci4KLSAgICB2aXJ0dWFsIGRvdWJs
ZSBhbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikg
Y29uc3Q7Ci0gICAgLy8gUmV0dXJucyB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBmb3Ig
dGhlIHByb2dyZXNzIGJhci4KLSAgICB2aXJ0dWFsIGRvdWJsZSBhbmltYXRpb25EdXJhdGlvbkZv
clByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3Q7Ci0jZW5kaWYKLQotICAgIHZpcnR1
YWwgQ29sb3Igc3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0OwotICAgIC8vIENvbnRy
b2xzIGNvbG9yIHZhbHVlcyByZXR1cm5lZCBmcm9tIHBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKS4g
c3lzdGVtQ29sb3IoKSB3aWxsIGJlIHVzZWQgd2hlbiBmYWxzZS4KLSAgICB2aXJ0dWFsIGJvb2wg
dXNlc1Rlc3RNb2RlRm9jdXNSaW5nQ29sb3IoKSBjb25zdDsKLSAgICAvLyBBIHZpZXcgYXNzb2Np
YXRlZCB0byB0aGUgY29udGFpbmVkIGRvY3VtZW50LiBTdWJjbGFzc2VzIG1heSBub3QgaGF2ZSBz
dWNoIGEgdmlldyBhbmQgcmV0dXJuIGEgZmFrZS4KICAgICB2aXJ0dWFsIE5TVmlldyogZG9jdW1l
bnRWaWV3Rm9yKFJlbmRlck9iamVjdCopIGNvbnN0OwogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50
UGx1Z0luU25hcHNob3RPdmVybGF5KFJlbmRlclNuYXBzaG90dGVkUGx1Z0luKiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgTGF5b3V0UG9pbnQmKSBjb25zdCBPVkVSUklERTsKLQogcHJvdGVjdGVk
OgogICAgIFJlbmRlclRoZW1lTWFjKCk7CiAgICAgdmlydHVhbCB+UmVuZGVyVGhlbWVNYWMoKTsK
IAotICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRDb2xvcnMoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxk
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0VGV4dEZpZWxkU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0
eWxlKiwgRWxlbWVudCopIGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIHBhaW50VGV4dEFyZWEo
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZp
cnR1YWwgdm9pZCBhZGp1c3RUZXh0QXJlYVN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHls
ZSosIEVsZW1lbnQqKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUq
LCBFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZW51TGlzdEJ1dHRv
bihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAg
dmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJl
bmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1F
TlQpCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdFByb2dyZXNzQmFyU3R5bGUoU3R5bGVSZXNvbHZl
ciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBwYWlu
dFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKLSNlbmRpZgotCi0gICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVHJhY2soUmVuZGVy
T2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwg
dm9pZCBhZGp1c3RTbGlkZXJUcmFja1N0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRodW1iKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0U2xpZGVyVGh1bWJTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVs
ZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAg
dmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRl
clN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJj
aEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxl
bWVudCopIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0
dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZShTdHlsZVJl
c29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0gICAgdmlydHVhbCBib29s
IHBhaW50U2VhcmNoRmllbGREZWNvcmF0aW9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVs
ZFJlc3VsdHNEZWNvcmF0aW9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxl
bWVudCopIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkUmVzdWx0c0Rl
Y29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYp
OwotCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxl
KFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29u
c3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotCiAjaWYgRU5BQkxFKFZJREVPKQogICAg
IHZpcnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CiAgICAgdmlydHVhbCBib29sIHBhaW50
TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKQEAgLTE3NCw4NyArNjgsMTIgQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgU3Ry
aW5nIGV4dHJhRnVsbFNjcmVlblN0eWxlU2hlZXQoKTsKICNlbmRpZgogCi0gICAgdmlydHVhbCBi
b29sIHN1cHBvcnRzQ2xvc2VkQ2FwdGlvbmluZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAg
ICB2aXJ0dWFsIGJvb2wgaGFzT3duRGlzYWJsZWRTdGF0ZUhhbmRsaW5nRm9yKENvbnRyb2xQYXJ0
KSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgdXNlc01lZGlhQ29udHJvbFN0YXR1c0Rpc3BsYXko
KTsKICAgICB2aXJ0dWFsIGJvb2wgdXNlc01lZGlhQ29udHJvbFZvbHVtZVNsaWRlcigpIGNvbnN0
OwogICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZWRpYVNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHls
ZSopIGNvbnN0OwogICAgIHZpcnR1YWwgSW50UG9pbnQgdm9sdW1lU2xpZGVyT2Zmc2V0RnJvbU11
dGVCdXR0b24oUmVuZGVyQm94KiwgY29uc3QgSW50U2l6ZSYpIGNvbnN0IE9WRVJSSURFOwogI2Vu
ZGlmCi0gICAgCi0gICAgdmlydHVhbCBib29sIHNob3VsZFNob3dQbGFjZWhvbGRlcldoZW5Gb2N1
c2VkKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCBTdHJpbmcgZmlsZUxpc3ROYW1l
Rm9yV2lkdGgoY29uc3QgRmlsZUxpc3QqLCBjb25zdCBGb250JiwgaW50IHdpZHRoLCBib29sIG11
bHRpcGxlRmlsZXNBbGxvd2VkKSBjb25zdCBPVkVSUklERTsKLQotICAgIEludFJlY3QgaW5mbGF0
ZVJlY3QoY29uc3QgSW50UmVjdCYsIGNvbnN0IEludFNpemUmLCBjb25zdCBpbnQqIG1hcmdpbnMs
IGZsb2F0IHpvb21MZXZlbCA9IDEuMGYpIGNvbnN0OwotCi0gICAgRmxvYXRSZWN0IGNvbnZlcnRU
b1BhaW50aW5nUmVjdChjb25zdCBSZW5kZXJPYmplY3QqIGlucHV0UmVuZGVyZXIsIGNvbnN0IFJl
bmRlck9iamVjdCogcGFydFJlbmRlcmVyLCBjb25zdCBGbG9hdFJlY3QmIGlucHV0UmVjdCwgY29u
c3QgSW50UmVjdCYgcikgY29uc3Q7Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBjb250cm9sIHNpemUg
YmFzZWQgb2ZmIHRoZSBmb250LiAgVXNlZCBieSBzb21lIG9mIHRoZSBjb250cm9scyAobGlrZSBi
dXR0b25zKS4KLSAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplRm9yRm9udChSZW5kZXJTdHls
ZSopIGNvbnN0OwotICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KFJl
bmRlclN0eWxlKikgY29uc3Q7Ci0gICAgdm9pZCBzZXRDb250cm9sU2l6ZShOU0NlbGwqLCBjb25z
dCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50U2l6ZSYgbWluU2l6ZSwgZmxvYXQgem9vbUxldmVs
ID0gMS4wZik7Ci0gICAgdm9pZCBzZXRTaXplRnJvbUZvbnQoUmVuZGVyU3R5bGUqLCBjb25zdCBJ
bnRTaXplKiBzaXplcykgY29uc3Q7Ci0gICAgSW50U2l6ZSBzaXplRm9yRm9udChSZW5kZXJTdHls
ZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdDsKLSAgICBJbnRTaXplIHNpemVGb3JTeXN0
ZW1Gb250KFJlbmRlclN0eWxlKiwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0OwotICAgIHZv
aWQgc2V0Rm9udEZyb21Db250cm9sU2l6ZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBO
U0NvbnRyb2xTaXplKSBjb25zdDsKLQotICAgIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2Vs
bCosIGNvbnN0IFJlbmRlck9iamVjdCopOwotICAgIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKE5T
Q2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOwotICAgIHZvaWQgdXBkYXRlRm9jdXNlZFN0YXRl
KE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOwotICAgIHZvaWQgdXBkYXRlUHJlc3NlZFN0
YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOwotICAgIC8vIEFuIG9wdGlvbmFsIGhv
b2sgZm9yIHN1YmNsYXNzZXMgdG8gdXBkYXRlIHRoZSBjb250cm9sIHRpbnQgb2YgTlNDZWxsLgot
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVBY3RpdmVTdGF0ZShOU0NlbGwqLCBjb25zdCBSZW5kZXJP
YmplY3QqKSB7fQotCi0gICAgLy8gSGVscGVycyBmb3IgYWRqdXN0aW5nIGFwcGVhcmFuY2UgYW5k
IGZvciBwYWludGluZwotCi0gICAgdm9pZCBzZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZShjb25zdCBS
ZW5kZXJPYmplY3QqLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgY29uc3QgSW50U2l6ZSogcG9wdXBC
dXR0b25TaXplcygpIGNvbnN0OwotICAgIGNvbnN0IGludCogcG9wdXBCdXR0b25NYXJnaW5zKCkg
Y29uc3Q7Ci0gICAgY29uc3QgaW50KiBwb3B1cEJ1dHRvblBhZGRpbmcoTlNDb250cm9sU2l6ZSkg
Y29uc3Q7Ci0gICAgdm9pZCBwYWludE1lbnVMaXN0QnV0dG9uR3JhZGllbnRzKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICBjb25zdCBJbnRTaXpl
KiBtZW51TGlzdFNpemVzKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBJbnRTaXplKiBzZWFyY2hGaWVs
ZFNpemVzKCkgY29uc3Q7Ci0gICAgY29uc3QgSW50U2l6ZSogY2FuY2VsQnV0dG9uU2l6ZXMoKSBj
b25zdDsKLSAgICBjb25zdCBJbnRTaXplKiByZXN1bHRzQnV0dG9uU2l6ZXMoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFNlYXJjaENlbGxTdGF0ZShSZW5kZXJPYmplY3QqLCBjb25zdCBJbnRSZWN0Jik7
Ci0gICAgdm9pZCBzZXRTZWFyY2hGaWVsZFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAgICAK
LSAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBCdXR0b24oKSBjb25zdDsKLSAgICBOU1NlYXJj
aEZpZWxkQ2VsbCogc2VhcmNoKCkgY29uc3Q7Ci0gICAgTlNNZW51KiBzZWFyY2hNZW51VGVtcGxh
dGUoKSBjb25zdDsKLSAgICBOU1NsaWRlckNlbGwqIHNsaWRlclRodW1iSG9yaXpvbnRhbCgpIGNv
bnN0OwotICAgIE5TU2xpZGVyQ2VsbCogc2xpZGVyVGh1bWJWZXJ0aWNhbCgpIGNvbnN0OwotICAg
IE5TVGV4dEZpZWxkQ2VsbCogdGV4dEZpZWxkKCkgY29uc3Q7Ci0KLSNpZiBFTkFCTEUoTUVURVJf
RUxFTUVOVCkKLSAgICBOU0xldmVsSW5kaWNhdG9yU3R5bGUgbGV2ZWxJbmRpY2F0b3JTdHlsZUZv
cihDb250cm9sUGFydCkgY29uc3Q7Ci0gICAgTlNMZXZlbEluZGljYXRvckNlbGwqIGxldmVsSW5k
aWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKikgY29uc3Q7Ci0jZW5kaWYKLQotI2lmIEVOQUJM
RShQUk9HUkVTU19FTEVNRU5UKQotICAgIGludCBtaW5pbXVtUHJvZ3Jlc3NCYXJIZWlnaHQoUmVu
ZGVyU3R5bGUqKSBjb25zdDsKLSAgICBjb25zdCBJbnRTaXplKiBwcm9ncmVzc0JhclNpemVzKCkg
Y29uc3Q7Ci0gICAgY29uc3QgaW50KiBwcm9ncmVzc0Jhck1hcmdpbnMoTlNDb250cm9sU2l6ZSkg
Y29uc3Q7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgICBtdXRhYmxlIFJldGFpblB0cjxOU1BvcFVw
QnV0dG9uQ2VsbD4gbV9wb3B1cEJ1dHRvbjsKLSAgICBtdXRhYmxlIFJldGFpblB0cjxOU1NlYXJj
aEZpZWxkQ2VsbD4gbV9zZWFyY2g7Ci0gICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNNZW51PiBtX3Nl
YXJjaE1lbnVUZW1wbGF0ZTsKLSAgICBtdXRhYmxlIFJldGFpblB0cjxOU1NsaWRlckNlbGw+IG1f
c2xpZGVyVGh1bWJIb3Jpem9udGFsOwotICAgIG11dGFibGUgUmV0YWluUHRyPE5TU2xpZGVyQ2Vs
bD4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsOwotICAgIG11dGFibGUgUmV0YWluUHRyPE5TTGV2ZWxJ
bmRpY2F0b3JDZWxsPiBtX2xldmVsSW5kaWNhdG9yOwotICAgIG11dGFibGUgUmV0YWluUHRyPE5T
VGV4dEZpZWxkQ2VsbD4gbV90ZXh0RmllbGQ7Ci0KLSAgICBib29sIG1faXNTbGlkZXJUaHVtYkhv
cml6b250YWxQcmVzc2VkOwotICAgIGJvb2wgbV9pc1NsaWRlclRodW1iVmVydGljYWxQcmVzc2Vk
OwotCi0gICAgbXV0YWJsZSBIYXNoTWFwPGludCwgUkdCQTMyPiBtX3N5c3RlbUNvbG9yQ2FjaGU7
Ci0KLSAgICBSZXRhaW5QdHI8V2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXI+
IG1fbm90aWZpY2F0aW9uT2JzZXJ2ZXI7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0gYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0KaW5kZXggZTA4MzdmZGM1
ZDQxMTg2NWUyMzFkOGViZTRmMmEyNTY3YTU0NmU4MC4uY2YwNWNhZDg3OWNjMDhmNzliM2MzODBi
N2E4OWU0ZjNhZTAwNmZmZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclRoZW1lTWFjLm1tCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVt
ZU1hYy5tbQpAQCAtMjAsMTcxMyArMjAsNTQgQEAKICNpbXBvcnQgImNvbmZpZy5oIgogI2ltcG9y
dCAiUmVuZGVyVGhlbWVNYWMuaCIKIAotI2ltcG9ydCAiQml0bWFwSW1hZ2UuaCIKLSNpbXBvcnQg
IkNvbG9yTWFjLmgiCi0jaW1wb3J0ICJDU1NWYWx1ZUxpc3QuaCIKLSNpbXBvcnQgIkNTU1ZhbHVl
S2V5d29yZHMuaCIKLSNpbXBvcnQgIkRvY3VtZW50LmgiCiAjaW1wb3J0ICJFbGVtZW50LmgiCi0j
aW1wb3J0ICJGaWxlTGlzdC5oIgotI2ltcG9ydCAiRnJhbWVWaWV3LmgiCiAjaW1wb3J0ICJHcmFw
aGljc0NvbnRleHRDRy5oIgotI2ltcG9ydCAiSFRNTElucHV0RWxlbWVudC5oIgogI2ltcG9ydCAi
SFRNTE1lZGlhRWxlbWVudC5oIgotI2ltcG9ydCAiSFRNTE5hbWVzLmgiCi0jaW1wb3J0ICJJbWFn
ZS5oIgotI2ltcG9ydCAiSW1hZ2VCdWZmZXIuaCIKICNpbXBvcnQgIkxvY2FsQ3VycmVudEdyYXBo
aWNzQ29udGV4dC5oIgotI2ltcG9ydCAiTG9jYWxpemVkU3RyaW5ncy5oIgogI2ltcG9ydCAiTWVk
aWFDb250cm9sRWxlbWVudHMuaCIKICNpbXBvcnQgIlBhaW50SW5mby5oIgogI2ltcG9ydCAiUmVu
ZGVyTWVkaWEuaCIKICNpbXBvcnQgIlJlbmRlck1lZGlhQ29udHJvbHMuaCIKLSNpbXBvcnQgIlJl
bmRlclNsaWRlci5oIgotI2ltcG9ydCAiUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4uaCIKICNpbXBv
cnQgIlJlbmRlclZpZXcuaCIKLSNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5oIgotI2ltcG9ydCAiU3Ry
aW5nVHJ1bmNhdG9yLmgiCi0jaW1wb3J0ICJTdHlsZVJlc29sdmVyLmgiCiAjaW1wb3J0ICJUaW1l
UmFuZ2VzLmgiCiAjaW1wb3J0ICJUaGVtZU1hYy5oIgotI2ltcG9ydCAiV2ViQ29yZU5TQ2VsbEV4
dHJhcy5oIgogI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgogI2ltcG9ydCAiVXNl
ckFnZW50U3R5bGVTaGVldHMuaCIKICNpbXBvcnQgPENhcmJvbi9DYXJib24uaD4KICNpbXBvcnQg
PENvY29hL0NvY29hLmg+CiAjaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+Ci0jaW1wb3J0IDx3dGYv
U3RkTGliRXh0cmFzLmg+Ci0jaW1wb3J0IDxtYXRoLmg+CiAKLSNpbXBvcnQgIlJlbmRlclByb2dy
ZXNzLmgiCi0KLSNpZiBFTkFCTEUoTUVURVJfRUxFTUVOVCkKLSNpbmNsdWRlICJSZW5kZXJNZXRl
ci5oIgotI2luY2x1ZGUgIkhUTUxNZXRlckVsZW1lbnQuaCIKLSNlbmRpZgotCi0KLXVzaW5nIG5h
bWVzcGFjZSBzdGQ7Ci0KLS8vIFRoZSBtZXRob2RzIGluIHRoaXMgZmlsZSBhcmUgc3BlY2lmaWMg
dG8gdGhlIE1hYyBPUyBYIHBsYXRmb3JtLgotCi0vLyBGSVhNRTogVGhlIHBsYXRmb3JtLWluZGVw
ZW5kZW50IGNvZGUgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgZmFjdG9yZWQgb3V0IGFuZCBtZXJn
ZWQgd2l0aCBSZW5kZXJUaGVtZVNhZmFyaS4gCi0KLS8vIFdlIGVzdGltYXRlIHRoZSBhbmltYXRp
b24gcmF0ZSBvZiBhIE1hYyBPUyBYIHByb2dyZXNzIGJhciBpcyAzMyBmcHMuCi0vLyBIYXJkIGNv
ZGUgdGhlIHZhbHVlIGhlcmUgYmVjYXVzZSB3ZSBoYXZlbid0IGZvdW5kIEFQSSBmb3IgaXQuCi1j
b25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25GcmFtZVJhdGUgPSAwLjAzMzsKLQotLy8gTWFj
IE9TIFggcHJvZ3Jlc3MgYmFyIGFuaW1hdGlvbiBzZWVtcyB0byBoYXZlIDI1NiBmcmFtZXMuCi1j
b25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25OdW1GcmFtZXMgPSAyNTY7Ci0KLUBpbnRlcmZh
Y2UgV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIgOiBOU09iamVjdAotewot
ICAgIFdlYkNvcmU6OlJlbmRlclRoZW1lICpfdGhlbWU7Ci19Ci0KLS0gKGlkKWluaXRXaXRoVGhl
bWU6KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWU7Ci0tICh2b2lkKXN5c3RlbUNvbG9yc0Rp
ZENoYW5nZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb247Ci0KLUBlbmQKLQotQGltcGxl
bWVudGF0aW9uIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyCi0KLS0gKGlk
KWluaXRXaXRoVGhlbWU6KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWUKLXsKLSAgICBpZiAo
IShzZWxmID0gW3N1cGVyIGluaXRdKSkKLSAgICAgICAgcmV0dXJuIG5pbDsKLQotICAgIF90aGVt
ZSA9IHRoZW1lOyAgICAKLSAgICByZXR1cm4gc2VsZjsKLX0KLQotLSAodm9pZClzeXN0ZW1Db2xv
cnNEaWRDaGFuZ2U6KE5TTm90aWZpY2F0aW9uICopdW51c2VkTm90aWZpY2F0aW9uCi17Ci0gICAg
QVNTRVJUX1VOVVNFRCh1bnVzZWROb3RpZmljYXRpb24sIFtbdW51c2VkTm90aWZpY2F0aW9uIG5h
bWVdIGlzRXF1YWxUb1N0cmluZzpOU1N5c3RlbUNvbG9yc0RpZENoYW5nZU5vdGlmaWNhdGlvbl0p
OwotICAgIF90aGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKLX0KLQotQGVuZAotCi1A
aW50ZXJmYWNlIE5TVGV4dEZpZWxkQ2VsbCAoV0tEZXRhaWxzKQotLSAoQ0ZEaWN0aW9uYXJ5UmVm
KV9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNlbGxGcmFtZSBpblZpZXc6KE5T
VmlldyAqKWNvbnRyb2xWaWV3IGluY2x1ZGVGb2N1czooQk9PTClpbmNsdWRlRm9jdXM7Ci1AZW5k
Ci0KLQotQGludGVyZmFjZSBXZWJDb3JlVGV4dEZpZWxkQ2VsbCA6IE5TVGV4dEZpZWxkQ2VsbAot
LSAoQ0ZEaWN0aW9uYXJ5UmVmKV9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNl
bGxGcmFtZSBpblZpZXc6KE5TVmlldyAqKWNvbnRyb2xWaWV3IGluY2x1ZGVGb2N1czooQk9PTClp
bmNsdWRlRm9jdXM7Ci1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBXZWJDb3JlVGV4dEZpZWxkQ2Vs
bAotLSAoQ0ZEaWN0aW9uYXJ5UmVmKV9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTooTlNSZWN0
KWNlbGxGcmFtZSBpblZpZXc6KE5TVmlldyAqKWNvbnRyb2xWaWV3IGluY2x1ZGVGb2N1czooQk9P
TClpbmNsdWRlRm9jdXMKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHBvc3QtTGlvbi1vbmx5
IHdvcmthcm91bmQgZm9yIDxyZGFyOi8vcHJvYmxlbS8xMTM4NTQ2MT4uIFdoZW4gdGhhdCBidWcg
aXMgcmVzb2x2ZWQsIHdlIHNob3VsZCByZW1vdmUgdGhpcyBjb2RlLgotICAgIENGTXV0YWJsZURp
Y3Rpb25hcnlSZWYgY29yZVVJRHJhd09wdGlvbnMgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxl
Q29weShOVUxMLCAwLCBbc3VwZXIgX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOmNlbGxGcmFt
ZSBpblZpZXc6Y29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOmluY2x1ZGVGb2N1c10pOwotICAgIENG
RGljdGlvbmFyeVNldFZhbHVlKGNvcmVVSURyYXdPcHRpb25zLCBAImJvcmRlcnMgb25seSIsIGtD
RkJvb2xlYW5UcnVlKTsKLSAgICByZXR1cm4gKENGRGljdGlvbmFyeVJlZilbTlNNYWtlQ29sbGVj
dGFibGUoY29yZVVJRHJhd09wdGlvbnMpIGF1dG9yZWxlYXNlXTsKLX0KLUBlbmQKLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1lbnVtIHsKLSAg
ICB0b3BNYXJnaW4sCi0gICAgcmlnaHRNYXJnaW4sCi0gICAgYm90dG9tTWFyZ2luLAotICAgIGxl
ZnRNYXJnaW4KLX07Ci0KLWVudW0gewotICAgIHRvcFBhZGRpbmcsCi0gICAgcmlnaHRQYWRkaW5n
LAotICAgIGJvdHRvbVBhZGRpbmcsCi0gICAgbGVmdFBhZGRpbmcKLX07Ci0KLSNpZiBQTEFURk9S
TShNQUMpCi1QYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdl
KFBhZ2UqKQotewotICAgIHN0YXRpYyBSZW5kZXJUaGVtZSogcnQgPSBSZW5kZXJUaGVtZU1hYzo6
Y3JlYXRlKCkubGVha1JlZigpOwotICAgIHJldHVybiBydDsKLX0KLSNlbmRpZgotCi1QYXNzUmVm
UHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZU1hYzo6Y3JlYXRlKCkKLXsKLSAgICByZXR1cm4g
YWRvcHRSZWYobmV3IFJlbmRlclRoZW1lTWFjKTsKLX0KLQotUmVuZGVyVGhlbWVNYWM6OlJlbmRl
clRoZW1lTWFjKCkKLSAgICA6IG1faXNTbGlkZXJUaHVtYkhvcml6b250YWxQcmVzc2VkKGZhbHNl
KQotICAgICwgbV9pc1NsaWRlclRodW1iVmVydGljYWxQcmVzc2VkKGZhbHNlKQotICAgICwgbV9u
b3RpZmljYXRpb25PYnNlcnZlcihBZG9wdE5TLCBbW1dlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNh
dGlvbk9ic2VydmVyIGFsbG9jXSBpbml0V2l0aFRoZW1lOnRoaXNdKQotewotICAgIFtbTlNOb3Rp
ZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6bV9ub3RpZmljYXRpb25P
YnNlcnZlci5nZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzZWxlY3RvcjpAc2VsZWN0b3Ioc3lzdGVtQ29sb3JzRGlkQ2hhbmdlOikK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5hbWU6TlNTeXN0ZW1Db2xvcnNEaWRDaGFuZ2VOb3RpZmljYXRpb24KLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6bmls
XTsKLX0KLQotUmVuZGVyVGhlbWVNYWM6On5SZW5kZXJUaGVtZU1hYygpCi17Ci0gICAgW1tOU05v
dGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNlcnZlcjptX25vdGlmaWNh
dGlvbk9ic2VydmVyLmdldCgpXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVNYWM6OnBsYXRmb3Jt
QWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBOU0NvbG9yKiBj
b2xvciA9IFtbTlNDb2xvciBzZWxlY3RlZFRleHRCYWNrZ3JvdW5kQ29sb3JdIGNvbG9yVXNpbmdD
b2xvclNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2VdOwotICAgIHJldHVybiBDb2xvcihz
dGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIHJlZENvbXBvbmVudF0pLCBzdGF0aWNfY2Fz
dDxpbnQ+KDI1NS4wICogW2NvbG9yIGdyZWVuQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4o
MjU1LjAgKiBbY29sb3IgYmx1ZUNvbXBvbmVudF0pKTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVN
YWM6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewot
ICAgIE5TQ29sb3IqIGNvbG9yID0gW1tOU0NvbG9yIHNlY29uZGFyeVNlbGVjdGVkQ29udHJvbENv
bG9yXSBjb2xvclVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXTsKLSAg
ICByZXR1cm4gQ29sb3Ioc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciByZWRDb21wb25l
bnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBncmVlbkNvbXBvbmVudF0pLCBz
dGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIGJsdWVDb21wb25lbnRdKSk7Ci19Ci0KLUNv
bG9yIFJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3Jv
dW5kQ29sb3IoKSBjb25zdAotewotICAgIE5TQ29sb3IqIGNvbG9yID0gW1tOU0NvbG9yIGFsdGVy
bmF0ZVNlbGVjdGVkQ29udHJvbENvbG9yXSBjb2xvclVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZp
Y2VSR0JDb2xvclNwYWNlXTsKLSAgICByZXR1cm4gQ29sb3Ioc3RhdGljX2Nhc3Q8aW50PigyNTUu
MCAqIFtjb2xvciByZWRDb21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xv
ciBncmVlbkNvbXBvbmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIGJsdWVD
b21wb25lbnRdKSk7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUFjdGl2ZUxp
c3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBDb2xv
cjo6d2hpdGU7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUluYWN0aXZlTGlz
dEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvbG9y
OjpibGFjazsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVNYWM6OnBsYXRmb3JtRm9jdXNSaW5nQ29s
b3IoKSBjb25zdAotewotICAgIGlmICh1c2VzVGVzdE1vZGVGb2N1c1JpbmdDb2xvcigpKQotICAg
ICAgICByZXR1cm4gb2xkQXF1YUZvY3VzUmluZ0NvbG9yKCk7Ci0KLSAgICByZXR1cm4gc3lzdGVt
Q29sb3IoQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcik7Ci19Ci0KLUNvbG9yIFJlbmRlclRo
ZW1lTWFjOjpwbGF0Zm9ybUluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5k
Q29sb3IoKTsKLX0KLQotc3RhdGljIEZvbnRXZWlnaHQgdG9Gb250V2VpZ2h0KE5TSW50ZWdlciBh
cHBLaXRGb250V2VpZ2h0KQotewotICAgIEFTU0VSVChhcHBLaXRGb250V2VpZ2h0ID4gMCAmJiBh
cHBLaXRGb250V2VpZ2h0IDwgMTUpOwotICAgIGlmIChhcHBLaXRGb250V2VpZ2h0ID4gMTQpCi0g
ICAgICAgIGFwcEtpdEZvbnRXZWlnaHQgPSAxNDsKLSAgICBlbHNlIGlmIChhcHBLaXRGb250V2Vp
Z2h0IDwgMSkKLSAgICAgICAgYXBwS2l0Rm9udFdlaWdodCA9IDE7Ci0KLSAgICBzdGF0aWMgRm9u
dFdlaWdodCBmb250V2VpZ2h0c1tdID0gewotICAgICAgICBGb250V2VpZ2h0MTAwLAotICAgICAg
ICBGb250V2VpZ2h0MTAwLAotICAgICAgICBGb250V2VpZ2h0MjAwLAotICAgICAgICBGb250V2Vp
Z2h0MzAwLAotICAgICAgICBGb250V2VpZ2h0NDAwLAotICAgICAgICBGb250V2VpZ2h0NTAwLAot
ICAgICAgICBGb250V2VpZ2h0NjAwLAotICAgICAgICBGb250V2VpZ2h0NjAwLAotICAgICAgICBG
b250V2VpZ2h0NzAwLAotICAgICAgICBGb250V2VpZ2h0ODAwLAotICAgICAgICBGb250V2VpZ2h0
ODAwLAotICAgICAgICBGb250V2VpZ2h0OTAwLAotICAgICAgICBGb250V2VpZ2h0OTAwLAotICAg
ICAgICBGb250V2VpZ2h0OTAwCi0gICAgfTsKLSAgICByZXR1cm4gZm9udFdlaWdodHNbYXBwS2l0
Rm9udFdlaWdodCAtIDFdOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjpzeXN0ZW1Gb250KGlu
dCBjc3NWYWx1ZUlkLCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsK
LSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgc3lzdGVtRm9udCwgKCkp
OwotICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBzbWFsbFN5c3RlbUZv
bnQsICgpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgbWVudUZv
bnQsICgpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgbGFiZWxG
b250LCAoKSk7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIG1pbmlD
b250cm9sRm9udCwgKCkpOwotICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9u
LCBzbWFsbENvbnRyb2xGb250LCAoKSk7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVz
Y3JpcHRpb24sIGNvbnRyb2xGb250LCAoKSk7Ci0KLSAgICBGb250RGVzY3JpcHRpb24qIGNhY2hl
ZERlc2M7Ci0gICAgTlNGb250KiBmb250ID0gbmlsOwotICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkg
ewotICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGxDYXB0aW9uOgotICAgICAgICAgICAgY2FjaGVk
RGVzYyA9ICZzbWFsbFN5c3RlbUZvbnQ7Ci0gICAgICAgICAgICBpZiAoIXNtYWxsU3lzdGVtRm9u
dC5pc0Fic29sdXRlU2l6ZSgpKQotICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3Rl
bUZvbnRPZlNpemU6W05TRm9udCBzbWFsbFN5c3RlbUZvbnRTaXplXV07Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZU1lbnU6Ci0gICAgICAgICAgICBjYWNoZWREZXNj
ID0gJm1lbnVGb250OwotICAgICAgICAgICAgaWYgKCFtZW51Rm9udC5pc0Fic29sdXRlU2l6ZSgp
KQotICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IG1lbnVGb250T2ZTaXplOltOU0ZvbnQg
c3lzdGVtRm9udFNpemVdXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1Zh
bHVlU3RhdHVzQmFyOgotICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZsYWJlbEZvbnQ7Ci0gICAg
ICAgICAgICBpZiAoIWxhYmVsRm9udC5pc0Fic29sdXRlU2l6ZSgpKQotICAgICAgICAgICAgICAg
IGZvbnQgPSBbTlNGb250IGxhYmVsRm9udE9mU2l6ZTpbTlNGb250IGxhYmVsRm9udFNpemVdXTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0TWluaUNvbnRy
b2w6Ci0gICAgICAgICAgICBjYWNoZWREZXNjID0gJm1pbmlDb250cm9sRm9udDsKLSAgICAgICAg
ICAgIGlmICghbWluaUNvbnRyb2xGb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAg
ICAgZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZvbnRTaXpl
Rm9yQ29udHJvbFNpemU6TlNNaW5pQ29udHJvbFNpemVdXTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0U21hbGxDb250cm9sOgotICAgICAgICAgICAgY2Fj
aGVkRGVzYyA9ICZzbWFsbENvbnRyb2xGb250OwotICAgICAgICAgICAgaWYgKCFzbWFsbENvbnRy
b2xGb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAgICAgZm9udCA9IFtOU0ZvbnQg
c3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6TlNT
bWFsbENvbnRyb2xTaXplXV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NW
YWx1ZVdlYmtpdENvbnRyb2w6Ci0gICAgICAgICAgICBjYWNoZWREZXNjID0gJmNvbnRyb2xGb250
OwotICAgICAgICAgICAgaWYgKCFjb250cm9sRm9udC5pc0Fic29sdXRlU2l6ZSgpKQotICAgICAg
ICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1G
b250U2l6ZUZvckNvbnRyb2xTaXplOk5TUmVndWxhckNvbnRyb2xTaXplXV07Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhY2hlZERlc2MgPSAmc3lz
dGVtRm9udDsKLSAgICAgICAgICAgIGlmICghc3lzdGVtRm9udC5pc0Fic29sdXRlU2l6ZSgpKQot
ICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBz
eXN0ZW1Gb250U2l6ZV1dOwotICAgIH0KLQotICAgIGlmIChmb250KSB7Ci0gICAgICAgIE5TRm9u
dE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJd
OwotICAgICAgICBjYWNoZWREZXNjLT5zZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKLSAgICAgICAg
Y2FjaGVkRGVzYy0+c2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsK
LSAgICAgICAgY2FjaGVkRGVzYy0+Zmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoW2ZvbnQgZmFtaWx5
TmFtZV0pOwotICAgICAgICBjYWNoZWREZXNjLT5zZXRTcGVjaWZpZWRTaXplKFtmb250IHBvaW50
U2l6ZV0pOwotICAgICAgICBjYWNoZWREZXNjLT5zZXRXZWlnaHQodG9Gb250V2VpZ2h0KFtmb250
TWFuYWdlciB3ZWlnaHRPZkZvbnQ6Zm9udF0pKTsKLSAgICAgICAgY2FjaGVkRGVzYy0+c2V0SXRh
bGljKFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6Zm9udF0gJiBOU0l0YWxpY0ZvbnRNYXNrKTsK
LSAgICB9Ci0gICAgZm9udERlc2NyaXB0aW9uID0gKmNhY2hlZERlc2M7Ci19Ci0KLXN0YXRpYyBS
R0JBMzIgY29udmVydE5TQ29sb3JUb0NvbG9yKE5TQ29sb3IgKmNvbG9yKQotewotICAgIE5TQ29s
b3IgKmNvbG9ySW5Db2xvclNwYWNlID0gW2NvbG9yIGNvbG9yVXNpbmdDb2xvclNwYWNlTmFtZTpO
U0RldmljZVJHQkNvbG9yU3BhY2VdOwotICAgIGlmIChjb2xvckluQ29sb3JTcGFjZSkgewotICAg
ICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHNjYWxlRmFjdG9yID0gbmV4dGFmdGVyKDI1Ni4wLCAw
LjApOwotICAgICAgICByZXR1cm4gbWFrZVJHQihzdGF0aWNfY2FzdDxpbnQ+KHNjYWxlRmFjdG9y
ICogW2NvbG9ySW5Db2xvclNwYWNlIHJlZENvbXBvbmVudF0pLAotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8aW50PihzY2FsZUZhY3RvciAqIFtjb2xvckluQ29sb3JTcGFjZSBncmVlbkNvbXBvbmVu
dF0pLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzY2FsZUZhY3RvciAqIFtjb2xvcklu
Q29sb3JTcGFjZSBibHVlQ29tcG9uZW50XSkpOwotICAgIH0KLQotICAgIC8vIFRoaXMgY29udmVy
c2lvbiBhYm92ZSBjYW4gZmFpbCBpZiB0aGUgTlNDb2xvciBpbiBxdWVzdGlvbiBpcyBhbiBOU1Bh
dHRlcm5Db2xvciAKLSAgICAvLyAoYXMgbWFueSBzeXN0ZW0gY29sb3JzIGFyZSkuIFRoZXNlIGNv
bG9ycyBhcmUgYWN0dWFsbHkgYSByZXBlYXRpbmcgcGF0dGVybgotICAgIC8vIG5vdCBqdXN0IGEg
c29saWQgY29sb3IuIFRvIHdvcmsgYXJvdW5kIHRoaXMgd2Ugc2ltcGx5IGRyYXcgYSAxeDEgaW1h
Z2Ugb2YKLSAgICAvLyB0aGUgY29sb3IgYW5kIHVzZSB0aGF0IHBpeGVsJ3MgY29sb3IuIEl0IG1p
Z2h0IGJlIGJldHRlciB0byB1c2UgYW4gYXZlcmFnZSBvZgotICAgIC8vIHRoZSBjb2xvcnMgaW4g
dGhlIHBhdHRlcm4gaW5zdGVhZC4KLSAgICBOU0JpdG1hcEltYWdlUmVwICpvZmZzY3JlZW5SZXAg
PSBbW05TQml0bWFwSW1hZ2VSZXAgYWxsb2NdIGluaXRXaXRoQml0bWFwRGF0YVBsYW5lczpuaWwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzV2lkZToxCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBp
eGVsc0hpZ2g6MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlOjgKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNhbXBsZXNQZXJQaXhlbDo0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxwaGE6WUVT
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFuYXI6Tk8KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xv
clNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRl
c1BlclJvdzo0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyUGl4ZWw6MzJdOwotCi0gICAgW05T
R3JhcGhpY3NDb250ZXh0IHNhdmVHcmFwaGljc1N0YXRlXTsKLSAgICBbTlNHcmFwaGljc0NvbnRl
eHQgc2V0Q3VycmVudENvbnRleHQ6W05TR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdp
dGhCaXRtYXBJbWFnZVJlcDpvZmZzY3JlZW5SZXBdXTsKLSAgICBOU0VyYXNlUmVjdChOU01ha2VS
ZWN0KDAsIDAsIDEsIDEpKTsKLSAgICBbY29sb3IgZHJhd1N3YXRjaEluUmVjdDpOU01ha2VSZWN0
KDAsIDAsIDEsIDEpXTsKLSAgICBbTlNHcmFwaGljc0NvbnRleHQgcmVzdG9yZUdyYXBoaWNzU3Rh
dGVdOwotCi0gICAgTlNVSW50ZWdlciBwaXhlbFs0XTsKLSAgICBbb2Zmc2NyZWVuUmVwIGdldFBp
eGVsOnBpeGVsIGF0WDowIHk6MF07Ci0KLSAgICBbb2Zmc2NyZWVuUmVwIHJlbGVhc2VdOwotCi0g
ICAgcmV0dXJuIG1ha2VSR0IocGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSk7Ci19Ci0KLXN0
YXRpYyBSR0JBMzIgbWVudUJhY2tncm91bmRDb2xvcigpCi17Ci0gICAgTlNCaXRtYXBJbWFnZVJl
cCAqb2Zmc2NyZWVuUmVwID0gW1tOU0JpdG1hcEltYWdlUmVwIGFsbG9jXSBpbml0V2l0aEJpdG1h
cERhdGFQbGFuZXM6bmlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1dpZGU6MQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBwaXhlbHNIaWdoOjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBs
ZTo4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyUGl4ZWw6NAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGhhc0FscGhhOllFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGxhbmFyOk5PCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnl0ZXNQZXJSb3c6NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclBpeGVs
OjMyXTsKLQotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0dDb250ZXh0
UmVmPihbW05TR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhCaXRtYXBJbWFnZVJl
cDpvZmZzY3JlZW5SZXBdIGdyYXBoaWNzUG9ydF0pOwotICAgIENHUmVjdCByZWN0ID0gQ0dSZWN0
TWFrZSgwLCAwLCAxLCAxKTsKLSAgICBISVRoZW1lTWVudURyYXdJbmZvIGRyYXdJbmZvOwotICAg
IGRyYXdJbmZvLnZlcnNpb24gPSAgMDsKLSAgICBkcmF3SW5mby5tZW51VHlwZSA9IGtUaGVtZU1l
bnVUeXBlUG9wVXA7Ci0gICAgSElUaGVtZURyYXdNZW51QmFja2dyb3VuZCgmcmVjdCwgJmRyYXdJ
bmZvLCBjb250ZXh0LCBrSElUaGVtZU9yaWVudGF0aW9uSW52ZXJ0ZWQpOwotCi0gICAgTlNVSW50
ZWdlciBwaXhlbFs0XTsKLSAgICBbb2Zmc2NyZWVuUmVwIGdldFBpeGVsOnBpeGVsIGF0WDowIHk6
MF07Ci0KLSAgICBbb2Zmc2NyZWVuUmVwIHJlbGVhc2VdOwotCi0gICAgcmV0dXJuIG1ha2VSR0Io
cGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6
OnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCkKLXsKLSAgICBtX3N5c3RlbUNvbG9yQ2FjaGUuY2xl
YXIoKTsKLSAgICBSZW5kZXJUaGVtZTo6cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKLX0KLQot
Q29sb3IgUmVuZGVyVGhlbWVNYWM6OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1ZUlkKSBjb25zdAot
ewotICAgIHsKLSAgICAgICAgSGFzaE1hcDxpbnQsIFJHQkEzMj46Oml0ZXJhdG9yIGl0ID0gbV9z
eXN0ZW1Db2xvckNhY2hlLmZpbmQoY3NzVmFsdWVJZCk7Ci0gICAgICAgIGlmIChpdCAhPSBtX3N5
c3RlbUNvbG9yQ2FjaGUuZW5kKCkpCi0gICAgICAgICAgICByZXR1cm4gaXQtPnZhbHVlOwotICAg
IH0KLQotICAgIENvbG9yIGNvbG9yOwotICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgewotICAgICAg
ICBjYXNlIENTU1ZhbHVlQWN0aXZlYm9yZGVyOgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0
TlNDb2xvclRvQ29sb3IoW05TQ29sb3Iga2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUFjdGl2ZWNhcHRpb246Ci0g
ICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dG
cmFtZVRleHRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFs
dWVBcHB3b3Jrc3BhY2U6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xv
cihbTlNDb2xvciBoZWFkZXJDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgQ1NTVmFsdWVCYWNrZ3JvdW5kOgotICAgICAgICAgICAgLy8gVXNlIHRoZW1lIGluZGVwZW5k
ZW50IGRlZmF1bHQKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlQnV0
dG9uZmFjZToKLSAgICAgICAgICAgIC8vIFdlIHVzZSB0aGlzIHZhbHVlIGluc3RlYWQgb2YgTlND
b2xvcidzIGNvbnRyb2xDb2xvciB0byBhdm9pZCB3ZWJzaXRlIGluY29tcGF0aWJpbGl0aWVzLgot
ICAgICAgICAgICAgLy8gV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgdG8gdXNlIHRoZSBOU0Nv
bG9yIGluIGZ1dHVyZS4KLSAgICAgICAgICAgIGNvbG9yID0gMHhGRkMwQzBDMDsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlQnV0dG9uaGlnaGxpZ2h0OgotICAgICAg
ICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEhpZ2hs
aWdodENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUJ1
dHRvbnNoYWRvdzoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtO
U0NvbG9yIGNvbnRyb2xTaGFkb3dDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgQ1NTVmFsdWVCdXR0b250ZXh0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlND
b2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbFRleHRDb2xvcl0pOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVDYXB0aW9udGV4dDoKLSAgICAgICAgICAgIGNvbG9y
ID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVHcmF5dGV4dDoKLSAgICAgICAgICAgIGNv
bG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGRpc2FibGVkQ29udHJvbFRleHRD
b2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVIaWdobGln
aHQ6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBz
ZWxlY3RlZFRleHRCYWNrZ3JvdW5kQ29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENTU1ZhbHVlSGlnaGxpZ2h0dGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVy
dE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNlbGVjdGVkVGV4dENvbG9yXSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlYm9yZGVyOgotICAgICAgICAg
ICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEJhY2tncm91
bmRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVJbmFj
dGl2ZWNhcHRpb246Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihb
TlNDb2xvciBjb250cm9sQmFja2dyb3VuZENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlY2FwdGlvbnRleHQ6Ci0gICAgICAgICAgICBjb2xv
ciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3JdKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlSW5mb2JhY2tncm91bmQ6Ci0gICAgICAg
ICAgICAvLyBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIE5TQ29sb3IgZm9yIHRoaXMgc28gd2Ug
dXNlIGEgaGFyZCBjb2RlZCB2YWx1ZS4KLSAgICAgICAgICAgIGNvbG9yID0gMHhGRkZCRkNDNTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlSW5mb3RleHQ6Ci0gICAg
ICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3Jd
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlTWVudToKLSAgICAg
ICAgICAgIGNvbG9yID0gbWVudUJhY2tncm91bmRDb2xvcigpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVNZW51dGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29u
dmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNlbGVjdGVkTWVudUl0ZW1UZXh0Q29sb3JdKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlU2Nyb2xsYmFyOgotICAg
ICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igc2Nyb2xsQmFy
Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlVGV4dDoK
LSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRD
b2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRk
YXJrc2hhZG93OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05T
Q29sb3IgY29udHJvbERhcmtTaGFkb3dDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRzaGFkb3c6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZl
cnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzaGFkb3dDb2xvcl0pOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRmYWNlOgotICAgICAgICAgICAgLy8gV2Ug
dXNlIHRoaXMgdmFsdWUgaW5zdGVhZCBvZiBOU0NvbG9yJ3MgY29udHJvbENvbG9yIHRvIGF2b2lk
IHdlYnNpdGUgaW5jb21wYXRpYmlsaXRpZXMuCi0gICAgICAgICAgICAvLyBXZSBtYXkgd2FudCB0
byBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIE5TQ29sb3IgaW4gZnV0dXJlLgotICAgICAgICAgICAg
Y29sb3IgPSAweEZGQzBDMEMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NT
VmFsdWVUaHJlZWRoaWdobGlnaHQ6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9y
VG9Db2xvcihbTlNDb2xvciBoaWdobGlnaHRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRsaWdodHNoYWRvdzoKLSAgICAgICAgICAgIGNvbG9y
ID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xMaWdodEhpZ2hsaWdodENv
bG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEZv
Y3VzUmluZ0NvbG9yOgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3Io
W05TQ29sb3Iga2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVdpbmRvdzoKLSAgICAgICAgICAgIGNvbG9yID0gY29u
dmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0JhY2tncm91bmRDb2xvcl0pOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3dmcmFtZToKLSAgICAg
ICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0ZyYW1l
Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlV2luZG93
dGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9y
IHdpbmRvd0ZyYW1lVGV4dENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAg
ICBpZiAoIWNvbG9yLmlzVmFsaWQoKSkKLSAgICAgICAgY29sb3IgPSBSZW5kZXJUaGVtZTo6c3lz
dGVtQ29sb3IoY3NzVmFsdWVJZCk7Ci0KLSAgICBpZiAoY29sb3IuaXNWYWxpZCgpKQotICAgICAg
ICBtX3N5c3RlbUNvbG9yQ2FjaGUuc2V0KGNzc1ZhbHVlSWQsIGNvbG9yLnJnYigpKTsKLQotICAg
IHJldHVybiBjb2xvcjsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6dXNlc1Rlc3RNb2RlRm9j
dXNSaW5nQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBXZWJDb3JlOjp1c2VzVGVzdE1vZGVG
b2N1c1JpbmdDb2xvcigpOwotfQotCi1OU1ZpZXcqIFJlbmRlclRoZW1lTWFjOjpkb2N1bWVudFZp
ZXdGb3IoUmVuZGVyT2JqZWN0KiBvKSBjb25zdAotewotI2lmIFBMQVRGT1JNKE1BQykKLSAgICBy
ZXR1cm4gVGhlbWVNYWM6OmVuc3VyZWRWaWV3KG8tPnZpZXcoKS0+ZnJhbWVWaWV3KCkpOwotI2Vs
c2UKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotfQot
Ci1ib29sIFJlbmRlclRoZW1lTWFjOjppc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVyU3R5bGUq
IHN0eWxlLCBjb25zdCBCb3JkZXJEYXRhJiBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgRmlsbExheWVyJiBiYWNrZ3JvdW5kLCBjb25zdCBDb2xvciYg
YmFja2dyb3VuZENvbG9yKSBjb25zdAotewotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09
IFRleHRGaWVsZFBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBUZXh0QXJlYVBhcnQgfHwg
c3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBMaXN0Ym94UGFydCkKLSAgICAgICAgcmV0dXJuIHN0eWxl
LT5ib3JkZXIoKSAhPSBib3JkZXI7Ci0gICAgICAgIAotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGhv
cnJpYmxlLCBidXQgdGhlcmUgaXMgbm90IG11Y2ggZWxzZSB0aGF0IGNhbiBiZSBkb25lLiAgTWVu
dSBsaXN0cyBjYW5ub3QgZHJhdyBwcm9wZXJseSB3aGVuCi0gICAgLy8gc2NhbGVkLiAgVGhleSBj
YW4ndCByZWFsbHkgZHJhdyBwcm9wZXJseSB3aGVuIHRyYW5zZm9ybWVkIGVpdGhlci4gIFdlIGNh
bid0IGRldGVjdCB0aGUgdHJhbnNmb3JtIGNhc2UgYXQgc3R5bGUKLSAgICAvLyBhZGp1c3RtZW50
IHRpbWUgc28gdGhhdCB3aWxsIGp1c3QgaGF2ZSB0byBzdGF5IGJyb2tlbi4gIFdlIGNhbiBob3dl
dmVyIGRldGVjdCB0aGF0IHdlJ3JlIHpvb21pbmcuICBJZiB6b29taW5nCi0gICAgLy8gaXMgaW4g
ZWZmZWN0IHdlIHRyZWF0IGl0IGxpa2UgdGhlIGNvbnRyb2wgaXMgc3R5bGVkLgotICAgIGlmIChz
dHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCAmJiBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpICE9IDEuMGYpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIFJlbmRlclRo
ZW1lOjppc0NvbnRyb2xTdHlsZWQoc3R5bGUsIGJvcmRlciwgYmFja2dyb3VuZCwgYmFja2dyb3Vu
ZENvbG9yKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0UmVwYWludFJlY3QoY29u
c3QgUmVuZGVyT2JqZWN0KiBvLCBJbnRSZWN0JiByKQotewotICAgIENvbnRyb2xQYXJ0IHBhcnQg
PSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7Ci0gICAgCi0jaWYgVVNFKE5FV19USEVNRSkKLSAg
ICBzd2l0Y2ggKHBhcnQpIHsKLSAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6Ci0gICAgICAgIGNh
c2UgUmFkaW9QYXJ0OgotICAgICAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgotICAgICAgICBjYXNl
IFNxdWFyZUJ1dHRvblBhcnQ6Ci0gICAgICAgIGNhc2UgRGVmYXVsdEJ1dHRvblBhcnQ6Ci0gICAg
ICAgIGNhc2UgQnV0dG9uUGFydDoKLSAgICAgICAgY2FzZSBJbm5lclNwaW5CdXR0b25QYXJ0Ogot
ICAgICAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjphZGp1c3RSZXBhaW50UmVjdChvLCByKTsK
LSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotCi0g
ICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAg
aWYgKHBhcnQgPT0gTWVudWxpc3RQYXJ0KSB7Ci0gICAgICAgIHNldFBvcHVwQnV0dG9uQ2VsbFN0
YXRlKG8sIHIpOwotICAgICAgICBJbnRTaXplIHNpemUgPSBwb3B1cEJ1dHRvblNpemVzKClbW3Bv
cHVwQnV0dG9uKCkgY29udHJvbFNpemVdXTsKLSAgICAgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5o
ZWlnaHQoKSAqIHpvb21MZXZlbCk7Ci0gICAgICAgIHNpemUuc2V0V2lkdGgoci53aWR0aCgpKTsK
LSAgICAgICAgciA9IGluZmxhdGVSZWN0KHIsIHNpemUsIHBvcHVwQnV0dG9uTWFyZ2lucygpLCB6
b29tTGV2ZWwpOwotICAgIH0KLX0KLQotSW50UmVjdCBSZW5kZXJUaGVtZU1hYzo6aW5mbGF0ZVJl
Y3QoY29uc3QgSW50UmVjdCYgciwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgaW50KiBtYXJn
aW5zLCBmbG9hdCB6b29tTGV2ZWwpIGNvbnN0Ci17Ci0gICAgLy8gT25seSBkbyB0aGUgaW5mbGF0
aW9uIGlmIHRoZSBhdmFpbGFibGUgd2lkdGgvaGVpZ2h0IGFyZSB0b28gc21hbGwuICBPdGhlcndp
c2UgdHJ5IHRvCi0gICAgLy8gZml0IHRoZSBnbG93L2NoZWNrIHNwYWNlIGludG8gdGhlIGF2YWls
YWJsZSBib3gncyB3aWR0aC9oZWlnaHQuCi0gICAgaW50IHdpZHRoRGVsdGEgPSByLndpZHRoKCkg
LSAoc2l6ZS53aWR0aCgpICsgbWFyZ2luc1tsZWZ0TWFyZ2luXSAqIHpvb21MZXZlbCArIG1hcmdp
bnNbcmlnaHRNYXJnaW5dICogem9vbUxldmVsKTsKLSAgICBpbnQgaGVpZ2h0RGVsdGEgPSByLmhl
aWdodCgpIC0gKHNpemUuaGVpZ2h0KCkgKyBtYXJnaW5zW3RvcE1hcmdpbl0gKiB6b29tTGV2ZWwg
KyBtYXJnaW5zW2JvdHRvbU1hcmdpbl0gKiB6b29tTGV2ZWwpOwotICAgIEludFJlY3QgcmVzdWx0
KHIpOwotICAgIGlmICh3aWR0aERlbHRhIDwgMCkgewotICAgICAgICByZXN1bHQuc2V0WChyZXN1
bHQueCgpIC0gbWFyZ2luc1tsZWZ0TWFyZ2luXSAqIHpvb21MZXZlbCk7Ci0gICAgICAgIHJlc3Vs
dC5zZXRXaWR0aChyZXN1bHQud2lkdGgoKSAtIHdpZHRoRGVsdGEpOwotICAgIH0KLSAgICBpZiAo
aGVpZ2h0RGVsdGEgPCAwKSB7Ci0gICAgICAgIHJlc3VsdC5zZXRZKHJlc3VsdC55KCkgLSBtYXJn
aW5zW3RvcE1hcmdpbl0gKiB6b29tTGV2ZWwpOwotICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KHJl
c3VsdC5oZWlnaHQoKSAtIGhlaWdodERlbHRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQotRmxvYXRSZWN0IFJlbmRlclRoZW1lTWFjOjpjb252ZXJ0VG9QYWludGluZ1JlY3QoY29u
c3QgUmVuZGVyT2JqZWN0KiBpbnB1dFJlbmRlcmVyLCBjb25zdCBSZW5kZXJPYmplY3QqIHBhcnRS
ZW5kZXJlciwgY29uc3QgRmxvYXRSZWN0JiBpbnB1dFJlY3QsIGNvbnN0IEludFJlY3QmIHIpIGNv
bnN0Ci17Ci0gICAgRmxvYXRSZWN0IHBhcnRSZWN0KGlucHV0UmVjdCk7Ci0gICAgCi0gICAgLy8g
Q29tcHV0ZSBhbiBvZmZzZXQgYmV0d2VlbiB0aGUgcGFydCByZW5kZXJlciBhbmQgdGhlIGlucHV0
IHJlbmRlcmVyCi0gICAgRmxvYXRTaXplIG9mZnNldEZyb21JbnB1dFJlbmRlcmVyOwotICAgIGNv
bnN0IFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBwYXJ0UmVuZGVyZXI7Ci0gICAgd2hpbGUgKHJl
bmRlcmVyICYmIHJlbmRlcmVyICE9IGlucHV0UmVuZGVyZXIpIHsKLSAgICAgICAgUmVuZGVyT2Jq
ZWN0KiBjb250YWluaW5nUmVuZGVyZXIgPSByZW5kZXJlci0+Y29udGFpbmVyKCk7Ci0gICAgICAg
IG9mZnNldEZyb21JbnB1dFJlbmRlcmVyIC09IHJvdW5kZWRJbnRTaXplKHJlbmRlcmVyLT5vZmZz
ZXRGcm9tQ29udGFpbmVyKGNvbnRhaW5pbmdSZW5kZXJlciwgTGF5b3V0UG9pbnQoKSkpOwotICAg
ICAgICByZW5kZXJlciA9IGNvbnRhaW5pbmdSZW5kZXJlcjsKLSAgICB9Ci0gICAgLy8gSWYgdGhl
IGlucHV0IHJlbmRlcmVyIHdhcyBub3QgYSBjb250YWluZXIsIHNvbWV0aGluZyB3ZW50IHdyb25n
Ci0gICAgQVNTRVJUKHJlbmRlcmVyID09IGlucHV0UmVuZGVyZXIpOwotICAgIC8vIE1vdmUgdGhl
IHJlY3QgaW50byBwYXJ0UmVuZGVyZXIncyBjb29yZHMKLSAgICBwYXJ0UmVjdC5tb3ZlKG9mZnNl
dEZyb21JbnB1dFJlbmRlcmVyKTsKLSAgICAvLyBBY2NvdW50IGZvciB0aGUgbG9jYWwgZHJhd2lu
ZyBvZmZzZXQgKHR4LCB0eSkKLSAgICBwYXJ0UmVjdC5tb3ZlKHIueCgpLCByLnkoKSk7Ci0KLSAg
ICByZXR1cm4gcGFydFJlY3Q7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnVwZGF0ZUNoZWNr
ZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKLXsKLSAgICBib29s
IG9sZEluZGV0ZXJtaW5hdGUgPSBbY2VsbCBzdGF0ZV0gPT0gTlNNaXhlZFN0YXRlOwotICAgIGJv
b2wgaW5kZXRlcm1pbmF0ZSA9IGlzSW5kZXRlcm1pbmF0ZShvKTsKLSAgICBib29sIGNoZWNrZWQg
PSBpc0NoZWNrZWQobyk7Ci0KLSAgICBpZiAob2xkSW5kZXRlcm1pbmF0ZSAhPSBpbmRldGVybWlu
YXRlKSB7Ci0gICAgICAgIFtjZWxsIHNldFN0YXRlOmluZGV0ZXJtaW5hdGUgPyBOU01peGVkU3Rh
dGUgOiAoY2hlY2tlZCA/IE5TT25TdGF0ZSA6IE5TT2ZmU3RhdGUpXTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIGJvb2wgb2xkQ2hlY2tlZCA9IFtjZWxsIHN0YXRlXSA9PSBOU09uU3Rh
dGU7Ci0gICAgaWYgKGNoZWNrZWQgIT0gb2xkQ2hlY2tlZCkKLSAgICAgICAgW2NlbGwgc2V0U3Rh
dGU6Y2hlY2tlZCA/IE5TT25TdGF0ZSA6IE5TT2ZmU3RhdGVdOwotfQotCi12b2lkIFJlbmRlclRo
ZW1lTWFjOjp1cGRhdGVFbmFibGVkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJPYmpl
Y3QqIG8pCi17Ci0gICAgYm9vbCBvbGRFbmFibGVkID0gW2NlbGwgaXNFbmFibGVkXTsKLSAgICBi
b29sIGVuYWJsZWQgPSBpc0VuYWJsZWQobyk7Ci0gICAgaWYgKGVuYWJsZWQgIT0gb2xkRW5hYmxl
ZCkKLSAgICAgICAgW2NlbGwgc2V0RW5hYmxlZDplbmFibGVkXTsKLX0KLQotdm9pZCBSZW5kZXJU
aGVtZU1hYzo6dXBkYXRlRm9jdXNlZFN0YXRlKE5TQ2VsbCogY2VsbCwgY29uc3QgUmVuZGVyT2Jq
ZWN0KiBvKQotewotICAgIGJvb2wgb2xkRm9jdXNlZCA9IFtjZWxsIHNob3dzRmlyc3RSZXNwb25k
ZXJdOwotICAgIGJvb2wgZm9jdXNlZCA9IGlzRm9jdXNlZChvKSAmJiBvLT5zdHlsZSgpLT5vdXRs
aW5lU3R5bGVJc0F1dG8oKTsKLSAgICBpZiAoZm9jdXNlZCAhPSBvbGRGb2N1c2VkKQotICAgICAg
ICBbY2VsbCBzZXRTaG93c0ZpcnN0UmVzcG9uZGVyOmZvY3VzZWRdOwotfQotCi12b2lkIFJlbmRl
clRoZW1lTWFjOjp1cGRhdGVQcmVzc2VkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJP
YmplY3QqIG8pCi17Ci0gICAgYm9vbCBvbGRQcmVzc2VkID0gW2NlbGwgaXNIaWdobGlnaHRlZF07
Ci0gICAgYm9vbCBwcmVzc2VkID0gKG8tPm5vZGUoKSAmJiBvLT5ub2RlKCktPmFjdGl2ZSgpKTsK
LSAgICBpZiAocHJlc3NlZCAhPSBvbGRQcmVzc2VkKQotICAgICAgICBbY2VsbCBzZXRIaWdobGln
aHRlZDpwcmVzc2VkXTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6Y29udHJvbFN1cHBvcnRz
VGludHMoY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBjb25zdAotewotICAgIC8vIEFuIGFsdGVybmF0
ZSB3YXkgdG8gaW1wbGVtZW50IHRoaXMgd291bGQgYmUgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBj
ZWxsIG9iamVjdAotICAgIC8vIGFuZCBjYWxsIHRoZSBwcml2YXRlIF9uZWVkUmVkcmF3T25XaW5k
b3dDaGFuZ2VkS2V5U3RhdGUgbWV0aG9kLiBBbiBhZHZhbnRhZ2Ugb2YKLSAgICAvLyB0aGF0IHdv
dWxkIGJlIHRoYXQgd2Ugd291bGQgbWF0Y2ggQXBwS2l0IGJlaGF2aW9yIG1vcmUgY2xvc2VseSwg
YnV0IGEgZGlzYWR2YW50YWdlCi0gICAgLy8gd291bGQgYmUgdGhhdCB3ZSB3b3VsZCByZWx5IG9u
IGFuIEFwcEtpdCBTUEkgbWV0aG9kLgotCi0gICAgaWYgKCFpc0VuYWJsZWQobykpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIENoZWNrYm94ZXMgb25seSBoYXZlIHRpbnQgd2hlbiBj
aGVja2VkLgotICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gQ2hlY2tib3hQYXJ0
KQotICAgICAgICByZXR1cm4gaXNDaGVja2VkKG8pOwotCi0gICAgLy8gRm9yIG5vdyBhc3N1bWUg
b3RoZXIgY29udHJvbHMgaGF2ZSB0aW50IGlmIGVuYWJsZWQuCi0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLU5TQ29udHJvbFNpemUgUmVuZGVyVGhlbWVNYWM6OmNvbnRyb2xTaXplRm9yRm9udChSZW5k
ZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGZvbnRTaXplID0gc3R5bGUtPmZvbnRT
aXplKCk7Ci0gICAgaWYgKGZvbnRTaXplID49IDE2KQotICAgICAgICByZXR1cm4gTlNSZWd1bGFy
Q29udHJvbFNpemU7Ci0gICAgaWYgKGZvbnRTaXplID49IDExKQotICAgICAgICByZXR1cm4gTlNT
bWFsbENvbnRyb2xTaXplOwotICAgIHJldHVybiBOU01pbmlDb250cm9sU2l6ZTsKLX0KLQotdm9p
ZCBSZW5kZXJUaGVtZU1hYzo6c2V0Q29udHJvbFNpemUoTlNDZWxsKiBjZWxsLCBjb25zdCBJbnRT
aXplKiBzaXplcywgY29uc3QgSW50U2l6ZSYgbWluU2l6ZSwgZmxvYXQgem9vbUxldmVsKQotewot
ICAgIE5TQ29udHJvbFNpemUgc2l6ZTsKLSAgICBpZiAobWluU2l6ZS53aWR0aCgpID49IHN0YXRp
Y19jYXN0PGludD4oc2l6ZXNbTlNSZWd1bGFyQ29udHJvbFNpemVdLndpZHRoKCkgKiB6b29tTGV2
ZWwpICYmCi0gICAgICAgIG1pblNpemUuaGVpZ2h0KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXpl
c1tOU1JlZ3VsYXJDb250cm9sU2l6ZV0uaGVpZ2h0KCkgKiB6b29tTGV2ZWwpKQotICAgICAgICBz
aXplID0gTlNSZWd1bGFyQ29udHJvbFNpemU7Ci0gICAgZWxzZSBpZiAobWluU2l6ZS53aWR0aCgp
ID49IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNTbWFsbENvbnRyb2xTaXplXS53aWR0aCgpICog
em9vbUxldmVsKSAmJgotICAgICAgICAgICAgIG1pblNpemUuaGVpZ2h0KCkgPj0gc3RhdGljX2Nh
c3Q8aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLmhlaWdodCgpICogem9vbUxldmVsKSkK
LSAgICAgICAgc2l6ZSA9IE5TU21hbGxDb250cm9sU2l6ZTsKLSAgICBlbHNlCi0gICAgICAgIHNp
emUgPSBOU01pbmlDb250cm9sU2l6ZTsKLSAgICBpZiAoc2l6ZSAhPSBbY2VsbCBjb250cm9sU2l6
ZV0pIC8vIE9ubHkgdXBkYXRlIGlmIHdlIGhhdmUgdG8sIHNpbmNlIEFwcEtpdCBkb2VzIHdvcmsg
ZXZlbiBpZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZS4KLSAgICAgICAgW2NlbGwgc2V0Q29udHJvbFNp
emU6c2l6ZV07Ci19Ci0KLUludFNpemUgUmVuZGVyVGhlbWVNYWM6OnNpemVGb3JGb250KFJlbmRl
clN0eWxlKiBzdHlsZSwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0Ci17Ci0gICAgaWYgKHN0
eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikgewotICAgICAgICBJbnRTaXplIHJlc3VsdCA9
IHNpemVzW2NvbnRyb2xTaXplRm9yRm9udChzdHlsZSldOwotICAgICAgICByZXR1cm4gSW50U2l6
ZShyZXN1bHQud2lkdGgoKSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCksIHJlc3VsdC5oZWlnaHQo
KSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZXNbY29u
dHJvbFNpemVGb3JGb250KHN0eWxlKV07Ci19Ci0KLUludFNpemUgUmVuZGVyVGhlbWVNYWM6OnNp
emVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50U2l6ZSogc2l6ZXMp
IGNvbnN0Ci17Ci0gICAgaWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikgewotICAg
ICAgICBJbnRTaXplIHJlc3VsdCA9IHNpemVzW2NvbnRyb2xTaXplRm9yU3lzdGVtRm9udChzdHls
ZSldOwotICAgICAgICByZXR1cm4gSW50U2l6ZShyZXN1bHQud2lkdGgoKSAqIHN0eWxlLT5lZmZl
Y3RpdmVab29tKCksIHJlc3VsdC5oZWlnaHQoKSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpOwot
ICAgIH0KLSAgICByZXR1cm4gc2l6ZXNbY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KHN0eWxlKV07
Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldFNpemVGcm9tRm9udChSZW5kZXJTdHlsZSog
c3R5bGUsIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBDaGVj
ayBpcyBmbGF3ZWQsIHNpbmNlIGl0IGRvZXNuJ3QgdGFrZSBtaW4td2lkdGgvbWF4LXdpZHRoIGlu
dG8gYWNjb3VudC4KLSAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yRm9udChzdHlsZSwgc2l6ZXMp
OwotICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmIHNpemUud2lk
dGgoKSA+IDApCi0gICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBG
aXhlZCkpOwotICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkgJiYgc2l6ZS5oZWlnaHQo
KSA+IDApCi0gICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIEZp
eGVkKSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldEZvbnRGcm9tQ29udHJvbFNpemUo
U3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgTlNDb250cm9sU2l6ZSBjb250cm9s
U2l6ZSkgY29uc3QKLXsKLSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKLSAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKLQot
ICAgIE5TRm9udCogZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3Rl
bUZvbnRTaXplRm9yQ29udHJvbFNpemU6Y29udHJvbFNpemVdXTsKLSAgICBmb250RGVzY3JpcHRp
b24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoW2ZvbnQgZmFtaWx5TmFtZV0pOwotICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoW2ZvbnQgcG9pbnRTaXplXSAqIHN0eWxlLT5lZmZl
Y3RpdmVab29tKCkpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKFtmb250
IHBvaW50U2l6ZV0gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKLQotICAgIC8vIFJlc2V0IGxp
bmUgaGVpZ2h0Ci0gICAgc3R5bGUtPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxM
aW5lSGVpZ2h0KCkpOwotCi0gICAgaWYgKHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERl
c2NyaXB0aW9uKSkKLSAgICAgICAgc3R5bGUtPmZvbnQoKS51cGRhdGUoMCk7Ci19Ci0KLU5TQ29u
dHJvbFNpemUgUmVuZGVyVGhlbWVNYWM6OmNvbnRyb2xTaXplRm9yU3lzdGVtRm9udChSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGZvbnRTaXplID0gc3R5bGUtPmZvbnRTaXpl
KCk7Ci0gICAgaWYgKGZvbnRTaXplID49IFtOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9s
U2l6ZTpOU1JlZ3VsYXJDb250cm9sU2l6ZV0pCi0gICAgICAgIHJldHVybiBOU1JlZ3VsYXJDb250
cm9sU2l6ZTsKLSAgICBpZiAoZm9udFNpemUgPj0gW05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNv
bnRyb2xTaXplOk5TU21hbGxDb250cm9sU2l6ZV0pCi0gICAgICAgIHJldHVybiBOU1NtYWxsQ29u
dHJvbFNpemU7Ci0gICAgcmV0dXJuIE5TTWluaUNvbnRyb2xTaXplOwotfQotCi1ib29sIFJlbmRl
clRoZW1lTWFjOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5m
byYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIExvY2FsQ3VycmVudEdyYXBo
aWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotCi0jaWYgX19NQUNf
T1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSAxMDcwCi0gICAgYm9vbCB1c2VOU1RleHRGaWVs
ZENlbGwgPSBvLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkKLSAgICAgICAgJiYgby0+c3R5bGUo
KS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKSA9PSBD
b2xvcjo6d2hpdGUKLSAgICAgICAgJiYgIW8tPnN0eWxlKCktPmhhc0JhY2tncm91bmRJbWFnZSgp
OwotCi0gICAgLy8gV2UgZG8gbm90IHVzZSBOU1RleHRGaWVsZENlbGwgdG8gZHJhdyBzdHlsZWQg
dGV4dCBmaWVsZHMgb24gTGlvbiBhbmQgU25vd0xlb3BhcmQgYmVjYXVzZQotICAgIC8vIHRoZXJl
IGFyZSBhIG51bWJlciBvZiBidWdzIG9uIHRob3NlIHBsYXRmb3JtcyB0aGF0IHJlcXVpcmUgTlNU
ZXh0RmllbGRDZWxsIHRvIGJlIGluIGNoYXJnZQotICAgIC8vIG9mIHBhaW50aW5nIGl0cyBvd24g
YmFja2dyb3VuZC4gV2UgbmVlZCBXZWJDb3JlIHRvIHBhaW50IHN0eWxlZCBiYWNrZ3JvdW5kcywg
c28gd2UnbGwgdXNlCi0gICAgLy8gdGhpcyBXZWJDb3JlU3lzdGVtSW50ZXJmYWNlIGZ1bmN0aW9u
IGluc3RlYWQuCi0gICAgaWYgKCF1c2VOU1RleHRGaWVsZENlbGwpIHsKLSAgICAgICAgd2tEcmF3
QmV6ZWxlZFRleHRGaWVsZENlbGwociwgaXNFbmFibGVkKG8pICYmICFpc1JlYWRPbmx5Q29udHJv
bChvKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIE5TVGV4
dEZpZWxkQ2VsbCAqdGV4dEZpZWxkID0gdGhpcy0+dGV4dEZpZWxkKCk7Ci0KLSAgICBHcmFwaGlj
c0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKLQotICAg
IFt0ZXh0RmllbGQgc2V0RW5hYmxlZDooaXNFbmFibGVkKG8pICYmICFpc1JlYWRPbmx5Q29udHJv
bChvKSldOwotICAgIFt0ZXh0RmllbGQgZHJhd1dpdGhGcmFtZTpOU1JlY3QocikgaW5WaWV3OmRv
Y3VtZW50Vmlld0ZvcihvKV07Ci0KLSAgICBbdGV4dEZpZWxkIHNldENvbnRyb2xWaWV3Om5pbF07
Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFRl
eHRGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25z
dAotewotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWludENhcHNMb2NrSW5kaWNhdG9yKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQotewotICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHdrRHJhd0NhcHNMb2NrSW5kaWNhdG9y
KGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgcik7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCogbywg
Y29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTG9j
YWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7
Ci0gICAgd2tEcmF3QmV6ZWxlZFRleHRBcmVhKHIsIGlzRW5hYmxlZChvKSAmJiAhaXNSZWFkT25s
eUNvbnRyb2wobykpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1h
Yzo6YWRqdXN0VGV4dEFyZWFTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3QKLXsKLX0KLQotY29uc3QgaW50KiBSZW5kZXJUaGVtZU1hYzo6cG9wdXBCdXR0
b25NYXJnaW5zKCkgY29uc3QKLXsKLSAgICBzdGF0aWMgY29uc3QgaW50IG1hcmdpbnNbM11bNF0g
PQotICAgIHsKLSAgICAgICAgeyAwLCAzLCAxLCAzIH0sCi0gICAgICAgIHsgMCwgMywgMiwgMyB9
LAotICAgICAgICB7IDAsIDEsIDAsIDEgfQotICAgIH07Ci0gICAgcmV0dXJuIG1hcmdpbnNbW3Bv
cHVwQnV0dG9uKCkgY29udHJvbFNpemVdXTsKLX0KLQotY29uc3QgSW50U2l6ZSogUmVuZGVyVGhl
bWVNYWM6OnBvcHVwQnV0dG9uU2l6ZXMoKSBjb25zdAotewotICAgIHN0YXRpYyBjb25zdCBJbnRT
aXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIxKSwgSW50U2l6ZSgwLCAxOCksIEludFNpemUo
MCwgMTUpIH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQotCi1jb25zdCBpbnQqIFJlbmRlclRoZW1l
TWFjOjpwb3B1cEJ1dHRvblBhZGRpbmcoTlNDb250cm9sU2l6ZSBzaXplKSBjb25zdAotewotICAg
IHN0YXRpYyBjb25zdCBpbnQgcGFkZGluZ1szXVs0XSA9Ci0gICAgewotICAgICAgICB7IDIsIDI2
LCAzLCA4IH0sCi0gICAgICAgIHsgMiwgMjMsIDMsIDggfSwKLSAgICAgICAgeyAyLCAyMiwgMywg
MTAgfQotICAgIH07Ci0gICAgcmV0dXJuIHBhZGRpbmdbc2l6ZV07Ci19Ci0KLWJvb2wgUmVuZGVy
VGhlbWVNYWM6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBMb2NhbEN1cnJlbnRHcmFwaGlj
c0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICBzZXRQb3B1cEJ1
dHRvbkNlbGxTdGF0ZShvLCByKTsKLQotICAgIE5TUG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRv
biA9IHRoaXMtPnBvcHVwQnV0dG9uKCk7Ci0KLSAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHls
ZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgSW50U2l6ZSBzaXplID0gcG9wdXBCdXR0b25TaXpl
cygpW1twb3B1cEJ1dHRvbiBjb250cm9sU2l6ZV1dOwotICAgIHNpemUuc2V0SGVpZ2h0KHNpemUu
aGVpZ2h0KCkgKiB6b29tTGV2ZWwpOwotICAgIHNpemUuc2V0V2lkdGgoci53aWR0aCgpKTsKLQot
ICAgIC8vIE5vdyBpbmZsYXRlIGl0IHRvIGFjY291bnQgZm9yIHRoZSBzaGFkb3cuCi0gICAgSW50
UmVjdCBpbmZsYXRlZFJlY3QgPSByOwotICAgIGlmIChyLndpZHRoKCkgPj0gbWluaW11bU1lbnVM
aXN0U2l6ZShvLT5zdHlsZSgpKSkKLSAgICAgICAgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3Qo
aW5mbGF0ZWRSZWN0LCBzaXplLCBwb3B1cEJ1dHRvbk1hcmdpbnMoKSwgem9vbUxldmVsKTsKLQot
ICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRl
eHQpOwotICAgIAotICAgIC8vIE9uIExlb3BhcmQsIHRoZSBjZWxsIHdpbGwgZHJhdyBvdXRzaWRl
IG9mIHRoZSBnaXZlbiByZWN0LCBzbyB3ZSBoYXZlIHRvIGNsaXAgdG8gdGhlIHJlY3QKLSAgICBw
YWludEluZm8uY29udGV4dC0+Y2xpcChpbmZsYXRlZFJlY3QpOwotCi0gICAgaWYgKHpvb21MZXZl
bCAhPSAxLjBmKSB7Ci0gICAgICAgIGluZmxhdGVkUmVjdC5zZXRXaWR0aChpbmZsYXRlZFJlY3Qu
d2lkdGgoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIGluZmxhdGVkUmVjdC5zZXRIZWlnaHQoaW5m
bGF0ZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnRyYW5zbGF0ZShpbmZsYXRlZFJlY3QueCgpLCBpbmZsYXRlZFJlY3QueSgpKTsKLSAgICAg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZl
bCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC1pbmZsYXRlZFJlY3Qu
eCgpLCAtaW5mbGF0ZWRSZWN0LnkoKSk7Ci0gICAgfQotCi0gICAgTlNWaWV3ICp2aWV3ID0gZG9j
dW1lbnRWaWV3Rm9yKG8pOwotICAgIFtwb3B1cEJ1dHRvbiBkcmF3V2l0aEZyYW1lOmluZmxhdGVk
UmVjdCBpblZpZXc6dmlld107Ci0jaWYgIUJVVFRPTl9DRUxMX0RSQVdfV0lUSF9GUkFNRV9EUkFX
U19GT0NVU19SSU5HCi0gICAgaWYgKGlzRm9jdXNlZChvKSAmJiBvLT5zdHlsZSgpLT5vdXRsaW5l
U3R5bGVJc0F1dG8oKSkKLSAgICAgICAgW3BvcHVwQnV0dG9uIF93ZWJfZHJhd0ZvY3VzUmluZ1dp
dGhGcmFtZTppbmZsYXRlZFJlY3QgaW5WaWV3OnZpZXddOwotI2VuZGlmCi0gICAgW3BvcHVwQnV0
dG9uIHNldENvbnRyb2xWaWV3Om5pbF07Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZiBF
TkFCTEUoTUVURVJfRUxFTUVOVCkKLQotSW50U2l6ZSBSZW5kZXJUaGVtZU1hYzo6bWV0ZXJTaXpl
Rm9yQm91bmRzKGNvbnN0IFJlbmRlck1ldGVyKiByZW5kZXJNZXRlciwgY29uc3QgSW50UmVjdCYg
Ym91bmRzKSBjb25zdAotewotICAgIGlmIChOb0NvbnRyb2xQYXJ0ID09IHJlbmRlck1ldGVyLT5z
dHlsZSgpLT5hcHBlYXJhbmNlKCkpCi0gICAgICAgIHJldHVybiBib3VuZHMuc2l6ZSgpOwotCi0g
ICAgTlNMZXZlbEluZGljYXRvckNlbGwqIGNlbGwgPSBsZXZlbEluZGljYXRvckZvcihyZW5kZXJN
ZXRlcik7Ci0gICAgLy8gTWFrZXMgZW5vdWdoIHJvb20gZm9yIGNlbGwncyBpbnRyaW5zaWMgc2l6
ZS4KLSAgICBOU1NpemUgY2VsbFNpemUgPSBbY2VsbCBjZWxsU2l6ZUZvckJvdW5kczpJbnRSZWN0
KEludFBvaW50KCksIGJvdW5kcy5zaXplKCkpXTsKLSAgICByZXR1cm4gSW50U2l6ZShib3VuZHMu
d2lkdGgoKSA8IGNlbGxTaXplLndpZHRoID8gY2VsbFNpemUud2lkdGggOiBib3VuZHMud2lkdGgo
KSwKLSAgICAgICAgICAgICAgICAgICBib3VuZHMuaGVpZ2h0KCkgPCBjZWxsU2l6ZS5oZWlnaHQg
PyBjZWxsU2l6ZS5oZWlnaHQgOiBib3VuZHMuaGVpZ2h0KCkpOwotfQotCi1ib29sIFJlbmRlclRo
ZW1lTWFjOjpwYWludE1ldGVyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAoIXJlbmRl
ck9iamVjdC0+aXNNZXRlcigpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIExvY2FsQ3Vy
cmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotCi0g
ICAgTlNMZXZlbEluZGljYXRvckNlbGwqIGNlbGwgPSBsZXZlbEluZGljYXRvckZvcih0b1JlbmRl
ck1ldGVyKHJlbmRlck9iamVjdCkpOwotICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3Rh
dGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotCi0gICAgW2NlbGwgZHJhd1dpdGhGcmFtZTpy
ZWN0IGluVmlldzpkb2N1bWVudFZpZXdGb3IocmVuZGVyT2JqZWN0KV07Ci0gICAgW2NlbGwgc2V0
Q29udHJvbFZpZXc6bmlsXTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhl
bWVNYWM6OnN1cHBvcnRzTWV0ZXIoQ29udHJvbFBhcnQgcGFydCkgY29uc3QKLXsKLSAgICBzd2l0
Y2ggKHBhcnQpIHsKLSAgICBjYXNlIFJlbGV2YW5jeUxldmVsSW5kaWNhdG9yUGFydDoKLSAgICBj
YXNlIERpc2NyZXRlQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6Ci0gICAgY2FzZSBSYXRpbmdM
ZXZlbEluZGljYXRvclBhcnQ6Ci0gICAgY2FzZSBNZXRlclBhcnQ6Ci0gICAgY2FzZSBDb250aW51
b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAg
IGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLU5TTGV2ZWxJbmRp
Y2F0b3JTdHlsZSBSZW5kZXJUaGVtZU1hYzo6bGV2ZWxJbmRpY2F0b3JTdHlsZUZvcihDb250cm9s
UGFydCBwYXJ0KSBjb25zdAotewotICAgIHN3aXRjaCAocGFydCkgewotICAgIGNhc2UgUmVsZXZh
bmN5TGV2ZWxJbmRpY2F0b3JQYXJ0OgotICAgICAgICByZXR1cm4gTlNSZWxldmFuY3lMZXZlbElu
ZGljYXRvclN0eWxlOwotICAgIGNhc2UgRGlzY3JldGVDYXBhY2l0eUxldmVsSW5kaWNhdG9yUGFy
dDoKLSAgICAgICAgcmV0dXJuIE5TRGlzY3JldGVDYXBhY2l0eUxldmVsSW5kaWNhdG9yU3R5bGU7
Ci0gICAgY2FzZSBSYXRpbmdMZXZlbEluZGljYXRvclBhcnQ6Ci0gICAgICAgIHJldHVybiBOU1Jh
dGluZ0xldmVsSW5kaWNhdG9yU3R5bGU7Ci0gICAgY2FzZSBNZXRlclBhcnQ6Ci0gICAgY2FzZSBD
b250aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6Ci0gICAgZGVmYXVsdDoKLSAgICAg
ICAgcmV0dXJuIE5TQ29udGludW91c0NhcGFjaXR5TGV2ZWxJbmRpY2F0b3JTdHlsZTsKLSAgICB9
Ci0gICAgCi19Ci0KLU5TTGV2ZWxJbmRpY2F0b3JDZWxsKiBSZW5kZXJUaGVtZU1hYzo6bGV2ZWxJ
bmRpY2F0b3JGb3IoY29uc3QgUmVuZGVyTWV0ZXIqIHJlbmRlck1ldGVyKSBjb25zdAotewotICAg
IFJlbmRlclN0eWxlKiBzdHlsZSA9IHJlbmRlck1ldGVyLT5zdHlsZSgpOwotICAgIEFTU0VSVChz
dHlsZS0+YXBwZWFyYW5jZSgpICE9IE5vQ29udHJvbFBhcnQpOwotCi0gICAgaWYgKCFtX2xldmVs
SW5kaWNhdG9yKQotICAgICAgICBtX2xldmVsSW5kaWNhdG9yLmFkb3B0TlMoW1tOU0xldmVsSW5k
aWNhdG9yQ2VsbCBhbGxvY10gaW5pdFdpdGhMZXZlbEluZGljYXRvclN0eWxlOk5TQ29udGludW91
c0NhcGFjaXR5TGV2ZWxJbmRpY2F0b3JTdHlsZV0pOwotICAgIE5TTGV2ZWxJbmRpY2F0b3JDZWxs
KiBjZWxsID0gbV9sZXZlbEluZGljYXRvci5nZXQoKTsKLQotICAgIEhUTUxNZXRlckVsZW1lbnQq
IGVsZW1lbnQgPSByZW5kZXJNZXRlci0+bWV0ZXJFbGVtZW50KCk7Ci0gICAgZG91YmxlIHZhbHVl
ID0gZWxlbWVudC0+dmFsdWUoKTsKLQotICAgIC8vIEJlY2F1c2UgTlNMZXZlbEluZGljYXRvckNl
bGwgZG9lcyBub3Qgc3VwcG9ydCBvcHRpbXVtLWluLXRoZS1taWRkbGUgdHlwZSBjb2xvcmluZywK
LSAgICAvLyB3ZSBleHBsaWNpdGx5IGNvbnRyb2wgdGhlIGNvbG9yIGluc3RlYWQgZ2l2aW5nIGxv
dyBhbmQgaGlnaCB2YWx1ZSB0byBOU0xldmVsSW5kaWNhdG9yQ2VsbCBhcyBpcy4KLSAgICBzd2l0
Y2ggKGVsZW1lbnQtPmdhdWdlUmVnaW9uKCkpIHsKLSAgICBjYXNlIEhUTUxNZXRlckVsZW1lbnQ6
OkdhdWdlUmVnaW9uT3B0aW11bToKLSAgICAgICAgLy8gTWFrZSBtZXRlciB0aGUgZ3JlZW4KLSAg
ICAgICAgW2NlbGwgc2V0V2FybmluZ1ZhbHVlOnZhbHVlICsgMV07Ci0gICAgICAgIFtjZWxsIHNl
dENyaXRpY2FsVmFsdWU6dmFsdWUgKyAyXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIVE1M
TWV0ZXJFbGVtZW50OjpHYXVnZVJlZ2lvblN1Ym9wdGltYWw6Ci0gICAgICAgIC8vIE1ha2UgdGhl
IG1ldGVyIHllbGxvdwotICAgICAgICBbY2VsbCBzZXRXYXJuaW5nVmFsdWU6dmFsdWUgLSAxXTsK
LSAgICAgICAgW2NlbGwgc2V0Q3JpdGljYWxWYWx1ZTp2YWx1ZSArIDFdOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIEhUTUxNZXRlckVsZW1lbnQ6OkdhdWdlUmVnaW9uRXZlbkxlc3NHb29kOgot
ICAgICAgICAvLyBNYWtlIHRoZSBtZXRlciByZWQKLSAgICAgICAgW2NlbGwgc2V0V2FybmluZ1Zh
bHVlOnZhbHVlIC0gMl07Ci0gICAgICAgIFtjZWxsIHNldENyaXRpY2FsVmFsdWU6dmFsdWUgLSAx
XTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgW2NlbGwgc2V0TGV2ZWxJbmRpY2F0b3JT
dHlsZTpsZXZlbEluZGljYXRvclN0eWxlRm9yKHN0eWxlLT5hcHBlYXJhbmNlKCkpXTsKLSAgICBb
Y2VsbCBzZXRCYXNlV3JpdGluZ0RpcmVjdGlvbjpzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpID8gTlNXcml0aW5nRGlyZWN0aW9uTGVmdFRvUmlnaHQgOiBOU1dyaXRpbmdEaXJlY3Rpb25S
aWdodFRvTGVmdF07Ci0gICAgW2NlbGwgc2V0TWluVmFsdWU6ZWxlbWVudC0+bWluKCldOwotICAg
IFtjZWxsIHNldE1heFZhbHVlOmVsZW1lbnQtPm1heCgpXTsKLSAgICBSZXRhaW5QdHI8TlNOdW1i
ZXI+IHZhbHVlT2JqZWN0ID0gW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6dmFsdWVdOwotICAg
IFtjZWxsIHNldE9iamVjdFZhbHVlOnZhbHVlT2JqZWN0LmdldCgpXTsKLQotICAgIHJldHVybiBj
ZWxsOwotfQotCi0jZW5kaWYKLQotI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQotY29uc3Qg
SW50U2l6ZSogUmVuZGVyVGhlbWVNYWM6OnByb2dyZXNzQmFyU2l6ZXMoKSBjb25zdAotewotICAg
IHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIwKSwgSW50U2l6
ZSgwLCAxMiksIEludFNpemUoMCwgMTIpIH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQotCi1jb25z
dCBpbnQqIFJlbmRlclRoZW1lTWFjOjpwcm9ncmVzc0Jhck1hcmdpbnMoTlNDb250cm9sU2l6ZSBj
b250cm9sU2l6ZSkgY29uc3QKLXsKLSAgICBzdGF0aWMgY29uc3QgaW50IG1hcmdpbnNbM11bNF0g
PQotICAgIHsKLSAgICAgICAgeyAwLCAwLCAxLCAwIH0sCi0gICAgICAgIHsgMCwgMCwgMSwgMCB9
LAotICAgICAgICB7IDAsIDAsIDEsIDAgfSwKLSAgICB9OwotICAgIHJldHVybiBtYXJnaW5zW2Nv
bnRyb2xTaXplXTsKLX0KLQotaW50IFJlbmRlclRoZW1lTWFjOjptaW5pbXVtUHJvZ3Jlc3NCYXJI
ZWlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIHJldHVybiBzaXplRm9yU3lz
dGVtRm9udChzdHlsZSwgcHJvZ3Jlc3NCYXJTaXplcygpKS5oZWlnaHQoKTsKLX0KLSAgICAKLWRv
dWJsZSBSZW5kZXJUaGVtZU1hYzo6YW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0Jh
cihSZW5kZXJQcm9ncmVzcyopIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByb2dyZXNzQW5pbWF0aW9u
RnJhbWVSYXRlOwotfQotCi1kb3VibGUgUmVuZGVyVGhlbWVNYWM6OmFuaW1hdGlvbkR1cmF0aW9u
Rm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdAotewotICAgIHJldHVybiBwcm9n
cmVzc0FuaW1hdGlvbk51bUZyYW1lcyAqIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVSYXRlOwotfQot
Ci12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKFN0eWxlUmVzb2x2
ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdAotewotfQotCi1ib29sIFJlbmRlclRo
ZW1lTWFjOjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAo
IXJlbmRlck9iamVjdC0+aXNQcm9ncmVzcygpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IGZsb2F0IHpvb21MZXZlbCA9IHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgp
OwotICAgIGludCBjb250cm9sU2l6ZSA9IGNvbnRyb2xTaXplRm9yRm9udChyZW5kZXJPYmplY3Qt
PnN0eWxlKCkpOwotICAgIEludFNpemUgc2l6ZSA9IHByb2dyZXNzQmFyU2l6ZXMoKVtjb250cm9s
U2l6ZV07Ci0gICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7Ci0g
ICAgc2l6ZS5zZXRXaWR0aChyZWN0LndpZHRoKCkpOwotICAgIAotICAgIC8vIE5vdyBpbmZsYXRl
IGl0IHRvIGFjY291bnQgZm9yIHRoZSBzaGFkb3cuCi0gICAgSW50UmVjdCBpbmZsYXRlZFJlY3Qg
PSByZWN0OwotICAgIGlmIChyZWN0LmhlaWdodCgpIDw9IG1pbmltdW1Qcm9ncmVzc0JhckhlaWdo
dChyZW5kZXJPYmplY3QtPnN0eWxlKCkpKQotICAgICAgICBpbmZsYXRlZFJlY3QgPSBpbmZsYXRl
UmVjdChpbmZsYXRlZFJlY3QsIHNpemUsIHByb2dyZXNzQmFyTWFyZ2lucyhjb250cm9sU2l6ZSks
IHpvb21MZXZlbCk7Ci0gICAgCi0gICAgUmVuZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0g
dG9SZW5kZXJQcm9ncmVzcyhyZW5kZXJPYmplY3QpOwotICAgIEhJVGhlbWVUcmFja0RyYXdJbmZv
IHRyYWNrSW5mbzsKLSAgICB0cmFja0luZm8udmVyc2lvbiA9IDA7Ci0gICAgaWYgKGNvbnRyb2xT
aXplID09IE5TUmVndWxhckNvbnRyb2xTaXplKQotICAgICAgICB0cmFja0luZm8ua2luZCA9IHJl
bmRlclByb2dyZXNzLT5wb3NpdGlvbigpIDwgMCA/IGtUaGVtZUxhcmdlSW5kZXRlcm1pbmF0ZUJh
ciA6IGtUaGVtZUxhcmdlUHJvZ3Jlc3NCYXI7Ci0gICAgZWxzZQotICAgICAgICB0cmFja0luZm8u
a2luZCA9IHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigpIDwgMCA/IGtUaGVtZU1lZGl1bUluZGV0
ZXJtaW5hdGVCYXIgOiBrVGhlbWVNZWRpdW1Qcm9ncmVzc0JhcjsKLSAgICAKLSAgICB0cmFja0lu
Zm8uYm91bmRzID0gSW50UmVjdChJbnRQb2ludCgpLCBpbmZsYXRlZFJlY3Quc2l6ZSgpKTsKLSAg
ICB0cmFja0luZm8ubWluID0gMDsKLSAgICB0cmFja0luZm8ubWF4ID0gbnVtZXJpY19saW1pdHM8
U0ludDMyPjo6bWF4KCk7Ci0gICAgdHJhY2tJbmZvLnZhbHVlID0gbHJvdW5kKHJlbmRlclByb2dy
ZXNzLT5wb3NpdGlvbigpICogbmV4dGFmdGVyKHRyYWNrSW5mby5tYXgsIDApKTsKLSAgICB0cmFj
a0luZm8udHJhY2tJbmZvLnByb2dyZXNzLnBoYXNlID0gbHJvdW5kKHJlbmRlclByb2dyZXNzLT5h
bmltYXRpb25Qcm9ncmVzcygpICogbmV4dGFmdGVyKHByb2dyZXNzQW5pbWF0aW9uTnVtRnJhbWVz
LCAwKSk7Ci0gICAgdHJhY2tJbmZvLmF0dHJpYnV0ZXMgPSBrVGhlbWVUcmFja0hvcml6b250YWw7
Ci0gICAgdHJhY2tJbmZvLmVuYWJsZVN0YXRlID0gaXNBY3RpdmUocmVuZGVyT2JqZWN0KSA/IGtU
aGVtZVRyYWNrQWN0aXZlIDoga1RoZW1lVHJhY2tJbmFjdGl2ZTsKLSAgICB0cmFja0luZm8ucmVz
ZXJ2ZWQgPSAwOwotICAgIHRyYWNrSW5mby5maWxsZXIxID0gMDsKLQotICAgIE93blB0cjxJbWFn
ZUJ1ZmZlcj4gaW1hZ2VCdWZmZXIgPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGluZmxhdGVkUmVjdC5z
aXplKCksIDEpOwotICAgIGlmICghaW1hZ2VCdWZmZXIpCi0gICAgICAgIHJldHVybiB0cnVlOwot
Ci0gICAgQ29udGV4dENvbnRhaW5lciBjZ0NvbnRleHRDb250YWluZXIoaW1hZ2VCdWZmZXItPmNv
bnRleHQoKSk7Ci0gICAgQ0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5l
ci5jb250ZXh0KCk7Ci0gICAgSElUaGVtZURyYXdUcmFjaygmdHJhY2tJbmZvLCAwLCBjZ0NvbnRl
eHQsIGtISVRoZW1lT3JpZW50YXRpb25Ob3JtYWwpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0U3Rh
dGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0KLSAgICBpZiAoIXJlbmRl
clByb2dyZXNzLT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKLSAgICAgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgyICogaW5mbGF0ZWRSZWN0LngoKSArIGluZmxh
dGVkUmVjdC53aWR0aCgpLCAwKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZs
b2F0U2l6ZSgtMSwgMSkpOwotICAgIH0KLSAgICAKLSAgICBwYWludEluZm8uY29udGV4dC0+ZHJh
d0ltYWdlQnVmZmVyKGltYWdlQnVmZmVyLmdldCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBpbmZs
YXRlZFJlY3QubG9jYXRpb24oKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfSAgICAKLSNlbmRpZgot
Ci1jb25zdCBmbG9hdCBiYXNlRm9udFNpemUgPSAxMS4wZjsKLWNvbnN0IGZsb2F0IGJhc2VBcnJv
d0hlaWdodCA9IDQuMGY7Ci1jb25zdCBmbG9hdCBiYXNlQXJyb3dXaWR0aCA9IDUuMGY7Ci1jb25z
dCBmbG9hdCBiYXNlU3BhY2VCZXR3ZWVuQXJyb3dzID0gMi4wZjsKLWNvbnN0IGludCBhcnJvd1Bh
ZGRpbmdMZWZ0ID0gNjsKLWNvbnN0IGludCBhcnJvd1BhZGRpbmdSaWdodCA9IDY7Ci1jb25zdCBp
bnQgcGFkZGluZ0JlZm9yZVNlcGFyYXRvciA9IDQ7Ci1jb25zdCBpbnQgYmFzZUJvcmRlclJhZGl1
cyA9IDU7Ci1jb25zdCBpbnQgc3R5bGVkUG9wdXBQYWRkaW5nTGVmdCA9IDg7Ci1jb25zdCBpbnQg
c3R5bGVkUG9wdXBQYWRkaW5nVG9wID0gMTsKLWNvbnN0IGludCBzdHlsZWRQb3B1cFBhZGRpbmdC
b3R0b20gPSAyOwotCi1zdGF0aWMgdm9pZCBUb3BHcmFkaWVudEludGVycG9sYXRlKHZvaWQqLCBj
b25zdCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCi17Ci0gICAgc3RhdGljIGZs
b2F0IGRhcmtbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuNGYgfTsKLSAgICBzdGF0aWMgZmxv
YXQgbGlnaHRbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuMTVmIH07Ci0gICAgZmxvYXQgYSA9
IGluRGF0YVswXTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykK
LSAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ld
OwotfQotCi1zdGF0aWMgdm9pZCBCb3R0b21HcmFkaWVudEludGVycG9sYXRlKHZvaWQqLCBjb25z
dCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCi17Ci0gICAgc3RhdGljIGZsb2F0
IGRhcmtbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuMGYgfTsKLSAgICBzdGF0aWMgZmxvYXQg
bGlnaHRbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuM2YgfTsKLSAgICBmbG9hdCBhID0gaW5E
YXRhWzBdOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAg
ICAgICBvdXREYXRhW2ldID0gKDEuMGYgLSBhKSAqIGRhcmtbaV0gKyBhICogbGlnaHRbaV07Ci19
Ci0KLXN0YXRpYyB2b2lkIE1haW5HcmFkaWVudEludGVycG9sYXRlKHZvaWQqLCBjb25zdCBDR0Zs
b2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCi17Ci0gICAgc3RhdGljIGZsb2F0IGRhcmtb
NF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMTVmIH07Ci0gICAgc3RhdGljIGZsb2F0IGxpZ2h0
WzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07Ci0gICAgZmxvYXQgYSA9IGluRGF0YVsw
XTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAg
b3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ldOwotfQotCi1z
dGF0aWMgdm9pZCBUcmFja0dyYWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQq
IGluRGF0YSwgQ0dGbG9hdCogb3V0RGF0YSkKLXsKLSAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9
IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC42NzhmIH07Ci0gICAgc3RhdGljIGZsb2F0IGxpZ2h0WzRd
ID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjEzZiB9OwotICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07
Ci0gICAgaW50IGkgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIG91
dERhdGFbaV0gPSAoMS4wZiAtIGEpICogZGFya1tpXSArIGEgKiBsaWdodFtpXTsKLX0KLQotdm9p
ZCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50cyhSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewot
ICAgIGlmIChyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ29udGV4dENvbnRh
aW5lciBjZ0NvbnRleHRDb250YWluZXIocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIENHQ29udGV4
dFJlZiBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLQotICAgIEdyYXBo
aWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotCi0g
ICAgUm91bmRlZFJlY3QgYm9yZGVyID0gby0+c3R5bGUoKS0+Z2V0Um91bmRlZEJvcmRlckZvcihy
LCBvLT52aWV3KCkpOwotICAgIGludCByYWRpdXMgPSBib3JkZXIucmFkaWkoKS50b3BMZWZ0KCku
d2lkdGgoKTsKLQotICAgIENHQ29sb3JTcGFjZVJlZiBjc3BhY2UgPSBkZXZpY2VSR0JDb2xvclNw
YWNlUmVmKCk7Ci0KLSAgICBGbG9hdFJlY3QgdG9wR3JhZGllbnQoci54KCksIHIueSgpLCByLndp
ZHRoKCksIHIuaGVpZ2h0KCkgLyAyLjBmKTsKLSAgICBzdHJ1Y3QgQ0dGdW5jdGlvbkNhbGxiYWNr
cyB0b3BDYWxsYmFja3MgPSB7IDAsIFRvcEdyYWRpZW50SW50ZXJwb2xhdGUsIE5VTEwgfTsKLSAg
ICBSZXRhaW5QdHI8Q0dGdW5jdGlvblJlZj4gdG9wRnVuY3Rpb24oQWRvcHRDRiwgQ0dGdW5jdGlv
bkNyZWF0ZShOVUxMLCAxLCBOVUxMLCA0LCBOVUxMLCAmdG9wQ2FsbGJhY2tzKSk7Ci0gICAgUmV0
YWluUHRyPENHU2hhZGluZ1JlZj4gdG9wU2hhZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVB
eGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKHRvcEdyYWRpZW50LngoKSwgdG9wR3JhZGllbnQueSgp
KSwgQ0dQb2ludE1ha2UodG9wR3JhZGllbnQueCgpLCB0b3BHcmFkaWVudC5tYXhZKCkpLCB0b3BG
dW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICBGbG9hdFJlY3QgYm90dG9tR3Jh
ZGllbnQoci54KCkgKyByYWRpdXMsIHIueSgpICsgci5oZWlnaHQoKSAvIDIuMGYsIHIud2lkdGgo
KSAtIDIuMGYgKiByYWRpdXMsIHIuaGVpZ2h0KCkgLyAyLjBmKTsKLSAgICBzdHJ1Y3QgQ0dGdW5j
dGlvbkNhbGxiYWNrcyBib3R0b21DYWxsYmFja3MgPSB7IDAsIEJvdHRvbUdyYWRpZW50SW50ZXJw
b2xhdGUsIE5VTEwgfTsKLSAgICBSZXRhaW5QdHI8Q0dGdW5jdGlvblJlZj4gYm90dG9tRnVuY3Rp
b24oQWRvcHRDRiwgQ0dGdW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBOVUxMLCA0LCBOVUxMLCAmYm90
dG9tQ2FsbGJhY2tzKSk7Ci0gICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gYm90dG9tU2hhZGlu
ZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKGJvdHRv
bUdyYWRpZW50LngoKSwgIGJvdHRvbUdyYWRpZW50LnkoKSksIENHUG9pbnRNYWtlKGJvdHRvbUdy
YWRpZW50LngoKSwgYm90dG9tR3JhZGllbnQubWF4WSgpKSwgYm90dG9tRnVuY3Rpb24uZ2V0KCks
IGZhbHNlLCBmYWxzZSkpOwotCi0gICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3MgbWFpbkNh
bGxiYWNrcyA9IHsgMCwgTWFpbkdyYWRpZW50SW50ZXJwb2xhdGUsIE5VTEwgfTsKLSAgICBSZXRh
aW5QdHI8Q0dGdW5jdGlvblJlZj4gbWFpbkZ1bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25DcmVh
dGUoTlVMTCwgMSwgTlVMTCwgNCwgTlVMTCwgJm1haW5DYWxsYmFja3MpKTsKLSAgICBSZXRhaW5Q
dHI8Q0dTaGFkaW5nUmVmPiBtYWluU2hhZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlh
bChjc3BhY2UsIENHUG9pbnRNYWtlKHIueCgpLCAgci55KCkpLCBDR1BvaW50TWFrZShyLngoKSwg
ci5tYXhZKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgUmV0
YWluUHRyPENHU2hhZGluZ1JlZj4gbGVmdFNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRl
QXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShyLngoKSwgIHIueSgpKSwgQ0dQb2ludE1ha2Uoci54
KCkgKyByYWRpdXMsIHIueSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsK
LQotICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IHJpZ2h0U2hhZGluZyhBZG9wdENGLCBDR1No
YWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKHIubWF4WCgpLCAgci55KCkpLCBD
R1BvaW50TWFrZShyLm1heFgoKSAtIHJhZGl1cywgci55KCkpLCBtYWluRnVuY3Rpb24uZ2V0KCks
IGZhbHNlLCBmYWxzZSkpOwotCi0gICAgewotICAgICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNh
dmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKLSAgICAgICAgQ0dDb250ZXh0Q2xp
cFRvUmVjdChjb250ZXh0LCByKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5k
ZWRSZWN0Q2xpcChib3JkZXIpOwotICAgICAgICBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVy
LmNvbnRleHQoKTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1NoYWRpbmcoY29udGV4dCwgbWFpblNo
YWRpbmcuZ2V0KCkpOwotICAgIH0KLSAgICAKLSAgICB7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4
dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotICAgICAgICBDR0Nv
bnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIHRvcEdyYWRpZW50KTsKLSAgICAgICAgcGFpbnRJbmZv
LmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xpcChSb3VuZGVkUmVjdChlbmNsb3NpbmdJbnRSZWN0
KHRvcEdyYWRpZW50KSwgYm9yZGVyLnJhZGlpKCkudG9wTGVmdCgpLCBib3JkZXIucmFkaWkoKS50
b3BSaWdodCgpLCBJbnRTaXplKCksIEludFNpemUoKSkpOwotICAgICAgICBjb250ZXh0ID0gY2dD
b250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1NoYWRpbmco
Y29udGV4dCwgdG9wU2hhZGluZy5nZXQoKSk7Ci0gICAgfQotICAgIAotICAgIGlmICghYm90dG9t
R3JhZGllbnQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIg
c3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotICAgICAgICBDR0NvbnRleHRDbGlwVG9S
ZWN0KGNvbnRleHQsIGJvdHRvbUdyYWRpZW50KTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQt
PmFkZFJvdW5kZWRSZWN0Q2xpcChSb3VuZGVkUmVjdChlbmNsb3NpbmdJbnRSZWN0KGJvdHRvbUdy
YWRpZW50KSwgSW50U2l6ZSgpLCBJbnRTaXplKCksIGJvcmRlci5yYWRpaSgpLmJvdHRvbUxlZnQo
KSwgYm9yZGVyLnJhZGlpKCkuYm90dG9tUmlnaHQoKSkpOwotICAgICAgICBjb250ZXh0ID0gY2dD
b250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1NoYWRpbmco
Y29udGV4dCwgYm90dG9tU2hhZGluZy5nZXQoKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBH
cmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsK
LSAgICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjb250ZXh0LCByKTsKLSAgICAgICAgcGFpbnRJ
bmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xpcChib3JkZXIpOwotICAgICAgICBjb250ZXh0
ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1No
YWRpbmcoY29udGV4dCwgbGVmdFNoYWRpbmcuZ2V0KCkpOwotICAgICAgICBDR0NvbnRleHREcmF3
U2hhZGluZyhjb250ZXh0LCByaWdodFNoYWRpbmcuZ2V0KCkpOwotICAgIH0KLX0KLQotYm9vbCBS
ZW5kZXJUaGVtZU1hYzo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIEludFJlY3Qg
Ym91bmRzID0gSW50UmVjdChyLngoKSArIG8tPnN0eWxlKCktPmJvcmRlckxlZnRXaWR0aCgpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnkoKSArIG8tPnN0eWxlKCktPmJvcmRlclRv
cFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIud2lkdGgoKSAtIG8tPnN0
eWxlKCktPmJvcmRlckxlZnRXaWR0aCgpIC0gby0+c3R5bGUoKS0+Ym9yZGVyUmlnaHRXaWR0aCgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhlaWdodCgpIC0gby0+c3R5bGUoKS0+
Ym9yZGVyVG9wV2lkdGgoKSAtIG8tPnN0eWxlKCktPmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAg
IC8vIERyYXcgdGhlIGdyYWRpZW50cyB0byBnaXZlIHRoZSBzdHlsZWQgcG9wdXAgbWVudSBhIGJ1
dHRvbiBhcHBlYXJhbmNlCi0gICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50cyhvLCBwYWlu
dEluZm8sIGJvdW5kcyk7Ci0KLSAgICAvLyBTaW5jZSB3ZSBhY3R1YWxseSBrbm93IHRoZSBzaXpl
IG9mIHRoZSBjb250cm9sIGhlcmUsIHdlIHJlc3RyaWN0IHRoZSBmb250IHNjYWxlIHRvIG1ha2Ug
c3VyZSB0aGUgYXJyb3dzIHdpbGwgZml0IHZlcnRpY2FsbHkgaW4gdGhlIGJvdW5kcwotICAgIGZs
b2F0IGZvbnRTY2FsZSA9IG1pbihvLT5zdHlsZSgpLT5mb250U2l6ZSgpIC8gYmFzZUZvbnRTaXpl
LCBib3VuZHMuaGVpZ2h0KCkgLyAoYmFzZUFycm93SGVpZ2h0ICogMiArIGJhc2VTcGFjZUJldHdl
ZW5BcnJvd3MpKTsKLSAgICBmbG9hdCBjZW50ZXJZID0gYm91bmRzLnkoKSArIGJvdW5kcy5oZWln
aHQoKSAvIDIuMGY7Ci0gICAgZmxvYXQgYXJyb3dIZWlnaHQgPSBiYXNlQXJyb3dIZWlnaHQgKiBm
b250U2NhbGU7Ci0gICAgZmxvYXQgYXJyb3dXaWR0aCA9IGJhc2VBcnJvd1dpZHRoICogZm9udFNj
YWxlOwotICAgIGZsb2F0IGxlZnRFZGdlID0gYm91bmRzLm1heFgoKSAtIGFycm93UGFkZGluZ1Jp
Z2h0ICogby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpIC0gYXJyb3dXaWR0aDsKLSAgICBmbG9h
dCBzcGFjZUJldHdlZW5BcnJvd3MgPSBiYXNlU3BhY2VCZXR3ZWVuQXJyb3dzICogZm9udFNjYWxl
OwotCi0gICAgaWYgKGJvdW5kcy53aWR0aCgpIDwgYXJyb3dXaWR0aCArIGFycm93UGFkZGluZ0xl
ZnQgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAKLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5m
by5jb250ZXh0KTsKLQotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3Ioby0+c3R5
bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpLCBvLT5zdHlsZSgp
LT5jb2xvclNwYWNlKCkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VTdHlsZShO
b1N0cm9rZSk7Ci0KLSAgICBGbG9hdFBvaW50IGFycm93MVszXTsKLSAgICBhcnJvdzFbMF0gPSBG
bG9hdFBvaW50KGxlZnRFZGdlLCBjZW50ZXJZIC0gc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7
Ci0gICAgYXJyb3cxWzFdID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGgsIGNlbnRl
clkgLSBzcGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKLSAgICBhcnJvdzFbMl0gPSBGbG9hdFBv
aW50KGxlZnRFZGdlICsgYXJyb3dXaWR0aCAvIDIuMGYsIGNlbnRlclkgLSBzcGFjZUJldHdlZW5B
cnJvd3MgLyAyLjBmIC0gYXJyb3dIZWlnaHQpOwotCi0gICAgLy8gRHJhdyB0aGUgdG9wIGFycm93
Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdDb252ZXhQb2x5Z29uKDMsIGFycm93MSwgdHJ1
ZSk7Ci0KLSAgICBGbG9hdFBvaW50IGFycm93MlszXTsKLSAgICBhcnJvdzJbMF0gPSBGbG9hdFBv
aW50KGxlZnRFZGdlLCBjZW50ZXJZICsgc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7Ci0gICAg
YXJyb3cyWzFdID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGgsIGNlbnRlclkgKyBz
cGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKLSAgICBhcnJvdzJbMl0gPSBGbG9hdFBvaW50KGxl
ZnRFZGdlICsgYXJyb3dXaWR0aCAvIDIuMGYsIGNlbnRlclkgKyBzcGFjZUJldHdlZW5BcnJvd3Mg
LyAyLjBmICsgYXJyb3dIZWlnaHQpOwotCi0gICAgLy8gRHJhdyB0aGUgYm90dG9tIGFycm93Ci0g
ICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdDb252ZXhQb2x5Z29uKDMsIGFycm93MiwgdHJ1ZSk7
Ci0KLSAgICBDb2xvciBsZWZ0U2VwYXJhdG9yQ29sb3IoMCwgMCwgMCwgNDApOwotICAgIENvbG9y
IHJpZ2h0U2VwYXJhdG9yQ29sb3IoMjU1LCAyNTUsIDI1NSwgNDApOwotCi0gICAgLy8gRklYTUU6
IFNob3VsZCB0aGUgc2VwYXJhdG9yIHRoaWNrbmVzcyBhbmQgc3BhY2UgYmUgc2NhbGVkIHVwIGJ5
IGZvbnRTY2FsZT8KLSAgICBpbnQgc2VwYXJhdG9yU3BhY2UgPSAyOyAvLyBEZWxpYmVyYXRlbHkg
aWdub3JlcyB6b29tIHNpbmNlIGl0IGxvb2tzIG5pY2VyIGlmIGl0IHN0YXlzIHRoaW4uCi0gICAg
aW50IGxlZnRFZGdlT2ZTZXBhcmF0b3IgPSBzdGF0aWNfY2FzdDxpbnQ+KGxlZnRFZGdlIC0gYXJy
b3dQYWRkaW5nTGVmdCAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7IC8vIEZJWE1FOiBS
b3VuZD8KLQotICAgIC8vIERyYXcgdGhlIHNlcGFyYXRvciB0byB0aGUgbGVmdCBvZiB0aGUgYXJy
b3dzCi0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcygxLjBmKTsgLy8g
RGVsaWJlcmF0ZWx5IGlnbm9yZXMgem9vbSBzaW5jZSBpdCBsb29rcyBuaWNlciBpZiBpdCBzdGF5
cyB0aGluLgotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VTdHlsZShTb2xpZFN0cm9r
ZSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGxlZnRTZXBhcmF0b3JD
b2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdM
aW5lKEludFBvaW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IsIGJvdW5kcy55KCkpLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yLCBib3Vu
ZHMubWF4WSgpKSk7Ci0KLSAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Iocmln
aHRTZXBhcmF0b3JDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgcGFpbnRJbmZvLmNv
bnRleHQtPmRyYXdMaW5lKEludFBvaW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IgKyBzZXBhcmF0b3JT
cGFjZSwgYm91bmRzLnkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFBv
aW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IgKyBzZXBhcmF0b3JTcGFjZSwgYm91bmRzLm1heFkoKSkp
OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IEludFNpemUqIG1lbnVMaXN0
QnV0dG9uU2l6ZXMoKQotewotICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJ
bnRTaXplKDAsIDIxKSwgSW50U2l6ZSgwLCAxOCksIEludFNpemUoMCwgMTUpIH07Ci0gICAgcmV0
dXJuIHNpemVzOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RNZW51TGlzdFN0eWxl
KFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVu
dCogZSkgY29uc3QKLXsKLSAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplID0gY29udHJvbFNp
emVGb3JGb250KHN0eWxlKTsKLQotICAgIHN0eWxlLT5yZXNldEJvcmRlcigpOwotICAgIHN0eWxl
LT5yZXNldFBhZGRpbmcoKTsKLSAgICAKLSAgICAvLyBIZWlnaHQgaXMgbG9ja2VkIHRvIGF1dG8u
Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0bykpOwotCi0gICAgLy8gV2hpdGUtc3Bh
Y2UgaXMgbG9ja2VkIHRvIHByZQotICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7Ci0KLSAg
ICAvLyBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgdG8gYmxhY2sgb3IgZ3JheSB3aGVuIHdlIGhh
dmUgdGhlIGFxdWEgbG9vay4KLSAgICAvLyBDYXN0IHRvIFJHQjMyIGlzIHRvIHdvcmsgYXJvdW5k
IGEgY29tcGlsZXIgYnVnLgotICAgIHN0eWxlLT5zZXRDb2xvcihlICYmIGUtPmlzRW5hYmxlZEZv
cm1Db250cm9sKCkgPyBzdGF0aWNfY2FzdDxSR0JBMzI+KENvbG9yOjpibGFjaykgOiBDb2xvcjo6
ZGFya0dyYXkpOwotCi0gICAgLy8gU2V0IHRoZSBidXR0b24ncyB2ZXJ0aWNhbCBzaXplLgotICAg
IHNldFNpemVGcm9tRm9udChzdHlsZSwgbWVudUxpc3RCdXR0b25TaXplcygpKTsKLQotICAgIC8v
IE91ciBmb250IGlzIGxvY2tlZCB0byB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIGZvbnQgc2l6ZSBm
b3IgdGhlIGNvbnRyb2wuICBUbyBjbGFyaWZ5LCB3ZSBmaXJzdCB1c2UgdGhlIENTUy1zcGVjaWZp
ZWQgZm9udCB0byBmaWd1cmUgb3V0Ci0gICAgLy8gYSByZWFzb25hYmxlIGNvbnRyb2wgc2l6ZSwg
YnV0IG9uY2UgdGhhdCBjb250cm9sIHNpemUgaXMgZGV0ZXJtaW5lZCwgd2UgdGhyb3cgdGhhdCBm
b250IGF3YXkgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUKLSAgICAvLyBzeXN0ZW0gZm9udCBmb3Ig
dGhlIGNvbnRyb2wgc2l6ZSBpbnN0ZWFkLgotICAgIHNldEZvbnRGcm9tQ29udHJvbFNpemUoc3R5
bGVSZXNvbHZlciwgc3R5bGUsIGNvbnRyb2xTaXplKTsKLQotICAgIHN0eWxlLT5zZXRCb3hTaGFk
b3cobnVsbHB0cik7Ci19Ci0KLWludCBSZW5kZXJUaGVtZU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRp
bmdMZWZ0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBpZiAoc3R5bGUtPmFwcGVh
cmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCi0gICAgICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRp
bmcoY29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbbGVmdFBhZGRpbmddICogc3R5bGUtPmVmZmVj
dGl2ZVpvb20oKTsKLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRv
blBhcnQpCi0gICAgICAgIHJldHVybiBzdHlsZWRQb3B1cFBhZGRpbmdMZWZ0ICogc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFJlbmRlclRoZW1lTWFjOjpw
b3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAg
ICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCi0gICAgICAgIHJldHVy
biBwb3B1cEJ1dHRvblBhZGRpbmcoY29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbcmlnaHRQYWRk
aW5nXSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNl
KCkgPT0gTWVudWxpc3RCdXR0b25QYXJ0KSB7Ci0gICAgICAgIGZsb2F0IGZvbnRTY2FsZSA9IHN0
eWxlLT5mb250U2l6ZSgpIC8gYmFzZUZvbnRTaXplOwotICAgICAgICBmbG9hdCBhcnJvd1dpZHRo
ID0gYmFzZUFycm93V2lkdGggKiBmb250U2NhbGU7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxpbnQ+KGNlaWxmKGFycm93V2lkdGggKyAoYXJyb3dQYWRkaW5nTGVmdCArIGFycm93UGFkZGlu
Z1JpZ2h0ICsgcGFkZGluZ0JlZm9yZVNlcGFyYXRvcikgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgp
KSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUmVuZGVyVGhlbWVNYWM6OnBvcHVw
SW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBpZiAo
c3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCi0gICAgICAgIHJldHVybiBwb3B1
cEJ1dHRvblBhZGRpbmcoY29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbdG9wUGFkZGluZ10gKiBz
dHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1l
bnVsaXN0QnV0dG9uUGFydCkKLSAgICAgICAgcmV0dXJuIHN0eWxlZFBvcHVwUGFkZGluZ1RvcCAq
IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBSZW5kZXJU
aGVtZU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBj
b25zdAotewotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKLSAg
ICAgICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUp
KVtib3R0b21QYWRkaW5nXSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgaWYgKHN0eWxl
LT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RCdXR0b25QYXJ0KQotICAgICAgICByZXR1cm4gc3R5
bGVkUG9wdXBQYWRkaW5nQm90dG9tICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICByZXR1
cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHls
ZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKLXsK
LSAgICBmbG9hdCBmb250U2NhbGUgPSBzdHlsZS0+Zm9udFNpemUoKSAvIGJhc2VGb250U2l6ZTsK
LQotICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyUmFkaXVz
KEludFNpemUoaW50KGJhc2VCb3JkZXJSYWRpdXMgKyBmb250U2NhbGUgLSAxKSwgaW50KGJhc2VC
b3JkZXJSYWRpdXMgKyBmb250U2NhbGUgLSAxKSkpOyAvLyBGSVhNRTogUm91bmQgdXA/Ci0KLSAg
ICBjb25zdCBpbnQgbWluSGVpZ2h0ID0gMTU7Ci0gICAgc3R5bGUtPnNldE1pbkhlaWdodChMZW5n
dGgobWluSGVpZ2h0LCBGaXhlZCkpOwotICAgIAotICAgIHN0eWxlLT5zZXRMaW5lSGVpZ2h0KFJl
bmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1h
Yzo6c2V0UG9wdXBCdXR0b25DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBJ
bnRSZWN0JiByKQotewotICAgIE5TUG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRvbiA9IHRoaXMt
PnBvcHVwQnV0dG9uKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNlZCBvZmYg
dGhlIHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgotICAgIHNldENvbnRyb2xTaXplKHBv
cHVwQnV0dG9uLCBwb3B1cEJ1dHRvblNpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHlsZSgpLT5lZmZl
Y3RpdmVab29tKCkpOwotCi0gICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNw
b25kIHRvLgotICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKLSAgICB1cGRh
dGVDaGVja2VkU3RhdGUocG9wdXBCdXR0b24sIG8pOwotICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShw
b3B1cEJ1dHRvbiwgbyk7Ci0gICAgdXBkYXRlUHJlc3NlZFN0YXRlKHBvcHVwQnV0dG9uLCBvKTsK
LSNpZiBCVVRUT05fQ0VMTF9EUkFXX1dJVEhfRlJBTUVfRFJBV1NfRk9DVVNfUklORwotICAgIHVw
ZGF0ZUZvY3VzZWRTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7Ci0jZW5kaWYKLX0KLQotY29uc3QgSW50
U2l6ZSogUmVuZGVyVGhlbWVNYWM6Om1lbnVMaXN0U2l6ZXMoKSBjb25zdAotewotICAgIHN0YXRp
YyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDksIDApLCBJbnRTaXplKDUsIDAp
LCBJbnRTaXplKDAsIDApIH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQotCi1pbnQgUmVuZGVyVGhl
bWVNYWM6Om1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewot
ICAgIHJldHVybiBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgbWVudUxpc3RTaXplcygpKS53aWR0
aCgpOwotfQotCi1jb25zdCBpbnQgdHJhY2tXaWR0aCA9IDU7Ci1jb25zdCBpbnQgdHJhY2tSYWRp
dXMgPSAyOwotCi12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RTbGlkZXJUcmFja1N0eWxlKFN0
eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAg
IHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6
OnBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBJbnRSZWN0IGJvdW5kcyA9IHI7Ci0gICAg
ZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgIGZsb2F0
IHpvb21lZFRyYWNrV2lkdGggPSB0cmFja1dpZHRoICogem9vbUxldmVsOwotCi0gICAgaWYgKG8t
PnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSAgU2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgby0+c3R5
bGUoKS0+YXBwZWFyYW5jZSgpID09ICBNZWRpYVNsaWRlclBhcnQpIHsKLSAgICAgICAgYm91bmRz
LnNldEhlaWdodCh6b29tZWRUcmFja1dpZHRoKTsKLSAgICAgICAgYm91bmRzLnNldFkoci55KCkg
KyByLmhlaWdodCgpIC8gMiAtIHpvb21lZFRyYWNrV2lkdGggLyAyKTsKLSAgICB9IGVsc2UgaWYg
KG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpIHsKLSAgICAg
ICAgYm91bmRzLnNldFdpZHRoKHpvb21lZFRyYWNrV2lkdGgpOwotICAgICAgICBib3VuZHMuc2V0
WChyLngoKSArIHIud2lkdGgoKSAvIDIgLSB6b29tZWRUcmFja1dpZHRoIC8gMik7Ci0gICAgfQot
Ci0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBsb2NhbENvbnRleHQuY2dDb250
ZXh0KCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGNzcGFjZSA9IGRldmljZVJHQkNvbG9yU3BhY2VS
ZWYoKTsKLQotI2lmIEVOQUJMRShEQVRBTElTVF9FTEVNRU5UKQotICAgIHBhaW50U2xpZGVyVGlj
a3MobywgcGFpbnRJbmZvLCByKTsKLSNlbmRpZgotCi0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVT
YXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0Q2xpcFRv
UmVjdChjb250ZXh0LCBib3VuZHMpOwotCi0gICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3Mg
bWFpbkNhbGxiYWNrcyA9IHsgMCwgVHJhY2tHcmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07Ci0g
ICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+IG1haW5GdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0
aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZtYWluQ2FsbGJhY2tzKSk7Ci0gICAg
UmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbWFpblNoYWRpbmc7Ci0gICAgaWYgKG8tPnN0eWxlKCkt
PmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpCi0gICAgICAgIG1haW5TaGFkaW5n
LmFkb3B0Q0YoQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShib3VuZHMu
eCgpLCAgYm91bmRzLm1heFkoKSksIENHUG9pbnRNYWtlKGJvdW5kcy5tYXhYKCksIGJvdW5kcy5t
YXhZKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOwotICAgIGVsc2UKLSAg
ICAgICAgbWFpblNoYWRpbmcuYWRvcHRDRihDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENH
UG9pbnRNYWtlKGJvdW5kcy54KCksICBib3VuZHMueSgpKSwgQ0dQb2ludE1ha2UoYm91bmRzLngo
KSwgYm91bmRzLm1heFkoKSksIG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7Ci0K
LSAgICBJbnRTaXplIHJhZGl1cyh0cmFja1JhZGl1cywgdHJhY2tSYWRpdXMpOwotICAgIHBhaW50
SW5mby5jb250ZXh0LT5hZGRSb3VuZGVkUmVjdENsaXAoUm91bmRlZFJlY3QoYm91bmRzLCByYWRp
dXMsIHJhZGl1cywgcmFkaXVzLCByYWRpdXMpKTsKLSAgICBjb250ZXh0ID0gbG9jYWxDb250ZXh0
LmNnQ29udGV4dCgpOwotICAgIENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIG1haW5TaGFk
aW5nLmdldCgpKTsKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhl
bWVNYWM6OmFkanVzdFNsaWRlclRodW1iU3R5bGUoU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZl
ciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAotewotICAgIFJl
bmRlclRoZW1lOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBl
bGVtZW50KTsKLSAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotfQotCi1jb25zdCBm
bG9hdCB2ZXJ0aWNhbFNsaWRlckhlaWdodFBhZGRpbmcgPSAwLjFmOwotCi1ib29sIFJlbmRlclRo
ZW1lTWFjOjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTlNTbGlkZXJDZWxsKiBzbGlk
ZXJUaHVtYkNlbGwgPSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0
aWNhbFBhcnQKLSAgICAgICAgPyBzbGlkZXJUaHVtYlZlcnRpY2FsKCkKLSAgICAgICAgOiBzbGlk
ZXJUaHVtYkhvcml6b250YWwoKTsKLQotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBs
b2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotCi0gICAgLy8gVXBkYXRlIHRoZSB2YXJp
b3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgotICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKHNsaWRlclRo
dW1iQ2VsbCwgbyk7Ci0gICAgdXBkYXRlRW5hYmxlZFN0YXRlKHNsaWRlclRodW1iQ2VsbCwgbyk7
Ci0gICAgdXBkYXRlRm9jdXNlZFN0YXRlKHNsaWRlclRodW1iQ2VsbCwgKG8tPm5vZGUoKSAmJiBv
LT5ub2RlKCktPmZvY3VzRGVsZWdhdGUoKS0+cmVuZGVyZXIoKSkgPyBvLT5ub2RlKCktPmZvY3Vz
RGVsZWdhdGUoKS0+cmVuZGVyZXIoKSA6IG8pOwotCi0gICAgLy8gVXBkYXRlIHRoZSBwcmVzc2Vk
IHN0YXRlIHVzaW5nIHRoZSBOU0NlbGwgdHJhY2tpbmcgbWV0aG9kcywgc2luY2UgdGhhdCdzIGhv
dyBOU1NsaWRlckNlbGwga2VlcHMgdHJhY2sgb2YgaXQuCi0gICAgYm9vbCBvbGRQcmVzc2VkOwot
ICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBh
cnQpCi0gICAgICAgIG9sZFByZXNzZWQgPSBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQ7
Ci0gICAgZWxzZQotICAgICAgICBvbGRQcmVzc2VkID0gbV9pc1NsaWRlclRodW1iSG9yaXpvbnRh
bFByZXNzZWQ7Ci0KLSAgICBib29sIHByZXNzZWQgPSBpc1ByZXNzZWQobyk7Ci0KLSAgICBpZiAo
by0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQotICAg
ICAgICBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQgPSBwcmVzc2VkOwotICAgIGVsc2UK
LSAgICAgICAgbV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFByZXNzZWQgPSBwcmVzc2VkOwotCi0g
ICAgaWYgKHByZXNzZWQgIT0gb2xkUHJlc3NlZCkgewotICAgICAgICBpZiAocHJlc3NlZCkKLSAg
ICAgICAgICAgIFtzbGlkZXJUaHVtYkNlbGwgc3RhcnRUcmFja2luZ0F0Ok5TUG9pbnQoKSBpblZp
ZXc6bmlsXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgW3NsaWRlclRodW1iQ2VsbCBzdG9w
VHJhY2tpbmc6TlNQb2ludCgpIGF0Ok5TUG9pbnQoKSBpblZpZXc6bmlsIG1vdXNlSXNVcDpZRVNd
OwotICAgIH0KLQotICAgIEZsb2F0UmVjdCBib3VuZHMgPSByOwotICAgIC8vIE1ha2UgdGhlIGhl
aWdodCBvZiB0aGUgdmVydGljYWwgc2xpZGVyIHNsaWdodGx5IGxhcmdlciBzbyBOU1NsaWRlckNl
bGwgd2lsbCBkcmF3IGEgdmVydGljYWwgc2xpZGVyLgotICAgIGlmIChvLT5zdHlsZSgpLT5hcHBl
YXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCi0gICAgICAgIGJvdW5kcy5zZXRI
ZWlnaHQoYm91bmRzLmhlaWdodCgpICsgdmVydGljYWxTbGlkZXJIZWlnaHRQYWRkaW5nICogby0+
c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKLQotICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2
ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotICAgIGZsb2F0IHpvb21MZXZlbCA9
IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKLSAgICAKLSAgICBGbG9hdFJlY3QgdW56b29t
ZWRSZWN0ID0gYm91bmRzOwotICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgewotICAgICAgICB1
bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOwot
ICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVuem9vbWVkUmVjdC5oZWlnaHQoKSAvIHpv
b21MZXZlbCk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUodW56b29tZWRS
ZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5z
Y2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKLSAgICAgICAgcGFpbnRJbmZv
LmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0LngoKSwgLXVuem9vbWVkUmVjdC55KCkp
OwotICAgIH0KLQotI2lmIFBMQVRGT1JNKENIUk9NSVVNKQotICAgIHBhaW50SW5mby5jb250ZXh0
LT50cmFuc2xhdGUoMCwgdW56b29tZWRSZWN0LnkoKSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQt
PnNjYWxlKEZsb2F0U2l6ZSgxLCAtMSkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xh
dGUoMCwgLSh1bnpvb21lZFJlY3QueSgpICsgdW56b29tZWRSZWN0LmhlaWdodCgpKSk7Ci0jZW5k
aWYKLQotICAgIFtzbGlkZXJUaHVtYkNlbGwgZHJhd0ludGVyaW9yV2l0aEZyYW1lOnVuem9vbWVk
UmVjdCBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8pXTsKLSAgICBbc2xpZGVyVGh1bWJDZWxsIHNl
dENvbnRyb2xWaWV3Om5pbF07Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVy
VGhlbWVNYWM6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBMb2NhbEN1cnJlbnRHcmFw
aGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICBOU1NlYXJj
aEZpZWxkQ2VsbCogc2VhcmNoID0gdGhpcy0+c2VhcmNoKCk7Ci0KLSAgICBzZXRTZWFyY2hDZWxs
U3RhdGUobywgcik7Ci0KLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
KnBhaW50SW5mby5jb250ZXh0KTsKLQotICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCkt
PmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIEludFJlY3QgdW56b29tZWRSZWN0ID0gcjsKLSAgICAK
LSAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsKLSAgICAgICAgdW56b29tZWRSZWN0LnNldFdp
ZHRoKHVuem9vbWVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgdW56b29tZWRS
ZWN0LnNldEhlaWdodCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOwotICAgICAg
ICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54KCksIHVuem9vbWVk
UmVjdC55KCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpv
b21MZXZlbCwgem9vbUxldmVsKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xh
dGUoLXVuem9vbWVkUmVjdC54KCksIC11bnpvb21lZFJlY3QueSgpKTsKLSAgICB9Ci0KLSAgICAv
LyBTZXQgdGhlIHNlYXJjaCBidXR0b24gdG8gbmlsIGJlZm9yZSBkcmF3aW5nLiAgVGhlbiByZXNl
dCBpdCBzbyB3ZSBjYW4gZHJhdyBpdCBsYXRlci4KLSAgICBbc2VhcmNoIHNldFNlYXJjaEJ1dHRv
bkNlbGw6bmlsXTsKLQotICAgIFtzZWFyY2ggZHJhd1dpdGhGcmFtZTpOU1JlY3QodW56b29tZWRS
ZWN0KSBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8pXTsKLQotICAgIFtzZWFyY2ggc2V0Q29udHJv
bFZpZXc6bmlsXTsKLSAgICBbc2VhcmNoIHJlc2V0U2VhcmNoQnV0dG9uQ2VsbF07Ci0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldFNlYXJjaENlbGxTdGF0
ZShSZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmKQotewotICAgIE5TU2VhcmNoRmllbGRD
ZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKLQotICAgIFtzZWFyY2ggc2V0Q29udHJvbFNp
emU6Y29udHJvbFNpemVGb3JGb250KG8tPnN0eWxlKCkpXTsKLQotICAgIC8vIFVwZGF0ZSB0aGUg
dmFyaW91cyBzdGF0ZXMgd2UgcmVzcG9uZCB0by4KLSAgICB1cGRhdGVBY3RpdmVTdGF0ZShzZWFy
Y2gsIG8pOwotICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShzZWFyY2gsIG8pOwotICAgIHVwZGF0ZUZv
Y3VzZWRTdGF0ZShzZWFyY2gsIG8pOwotfQotCi1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1h
Yzo6c2VhcmNoRmllbGRTaXplcygpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUg
c2l6ZXNbM10gPSB7IEludFNpemUoMCwgMjIpLCBJbnRTaXplKDAsIDE5KSwgSW50U2l6ZSgwLCAx
NykgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldFNl
YXJjaEZpZWxkU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhl
IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGlu
ZyB0byBkby4KLSAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYg
IXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8v
IFVzZSB0aGUgZm9udCBzaXplIHRvIGRldGVybWluZSB0aGUgaW50cmluc2ljIHdpZHRoIG9mIHRo
ZSBjb250cm9sLgotICAgIHNldFNpemVGcm9tRm9udChzdHlsZSwgc2VhcmNoRmllbGRTaXplcygp
KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2VhcmNoRmllbGRTdHlsZShTdHls
ZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBj
b25zdAotewotICAgIC8vIE92ZXJyaWRlIGJvcmRlci4KLSAgICBzdHlsZS0+cmVzZXRCb3JkZXIo
KTsKLSAgICBjb25zdCBzaG9ydCBib3JkZXJXaWR0aCA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJMZWZ0V2lkdGgoYm9yZGVyV2lkdGgpOwotICAgIHN0
eWxlLT5zZXRCb3JkZXJMZWZ0U3R5bGUoSU5TRVQpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdo
dFdpZHRoKGJvcmRlcldpZHRoKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyUmlnaHRTdHlsZShJTlNF
VCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJvcmRlcldpZHRoKTsKLSAgICBz
dHlsZS0+c2V0Qm9yZGVyQm90dG9tU3R5bGUoSU5TRVQpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJU
b3BXaWR0aChib3JkZXJXaWR0aCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclRvcFN0eWxlKElOU0VU
KTsgICAgCi0gICAgCi0gICAgLy8gT3ZlcnJpZGUgaGVpZ2h0LgotICAgIHN0eWxlLT5zZXRIZWln
aHQoTGVuZ3RoKEF1dG8pKTsKLSAgICBzZXRTZWFyY2hGaWVsZFNpemUoc3R5bGUpOwotICAgIAot
ICAgIC8vIE92ZXJyaWRlIHBhZGRpbmcgc2l6ZSB0byBtYXRjaCBBcHBLaXQgdGV4dCBwb3NpdGlv
bmluZy4KLSAgICBjb25zdCBpbnQgcGFkZGluZyA9IDEgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgp
OwotICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKLSAg
ICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotICAgIHN0
eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotICAgIHN0eWxlLT5z
ZXRQYWRkaW5nQm90dG9tKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotICAgIAotICAgIE5TQ29u
dHJvbFNpemUgY29udHJvbFNpemUgPSBjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpOwotICAgIHNl
dEZvbnRGcm9tQ29udHJvbFNpemUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGNvbnRyb2xTaXplKTsK
LQotICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhl
bWVNYWM6OnBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBFbGVtZW50
KiBpbnB1dCA9IG8tPm5vZGUoKS0+c2hhZG93SG9zdCgpOwotICAgIGlmICghaW5wdXQpCi0gICAg
ICAgIGlucHV0ID0gdG9FbGVtZW50KG8tPm5vZGUoKSk7Ci0KLSAgICBpZiAoIWlucHV0LT5yZW5k
ZXJlcigpLT5pc0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBMb2NhbEN1cnJl
bnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICBz
ZXRTZWFyY2hDZWxsU3RhdGUoaW5wdXQtPnJlbmRlcmVyKCksIHIpOwotCi0gICAgTlNTZWFyY2hG
aWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOwotCi0gICAgaWYgKGlucHV0LT5pc0Vu
YWJsZWRGb3JtQ29udHJvbCgpICYmIChpbnB1dC0+aXNUZXh0Rm9ybUNvbnRyb2woKSAmJiAhc3Rh
dGljX2Nhc3Q8SFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQqPihpbnB1dCktPnJlYWRPbmx5KCkp
KSB7Ci0gICAgICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKFtzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0s
IG8pOwotICAgICAgICB1cGRhdGVQcmVzc2VkU3RhdGUoW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxs
XSwgbyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdIGlz
SGlnaGxpZ2h0ZWRdKQotICAgICAgICBbW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSBzZXRIaWdo
bGlnaHRlZDpOT107Ci0KLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
KnBhaW50SW5mby5jb250ZXh0KTsKLQotICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCkt
PmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5kcyA9IFtzZWFyY2gg
Y2FuY2VsQnV0dG9uUmVjdEZvckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRlckJveCgpLT5waXhl
bFNuYXBwZWRCb3JkZXJCb3hSZWN0KCkpXTsKLQotI2lmIEVOQUJMRShJTlBVVF9TUEVFQ0gpCi0g
ICAgLy8gVGFrZSBjYXJlIG9mIGNhc2VzIHdoZXJlIHRoZSBjYW5jZWwgYnV0dG9uIHdhcyBub3Qg
YWxpZ25lZCB3aXRoIHRoZSByaWdodCBib3JkZXIgb2YgdGhlIGlucHV0IGVsZW1lbnQgKGZvciBl
LmcuCi0gICAgLy8gd2hlbiBzcGVlY2ggaW5wdXQgaXMgZW5hYmxlZCBmb3IgdGhlIGlucHV0IGVs
ZW1lbnQuCi0gICAgSW50UmVjdCBhYnNCb3VuZGluZ0JveCA9IGlucHV0LT5yZW5kZXJlcigpLT5h
YnNvbHV0ZUJvdW5kaW5nQm94UmVjdCgpOwotICAgIGludCBhYnNSaWdodCA9IGFic0JvdW5kaW5n
Qm94LngoKSArIGFic0JvdW5kaW5nQm94LndpZHRoKCkgLSBpbnB1dC0+cmVuZGVyQm94KCktPnBh
ZGRpbmdSaWdodCgpIC0gaW5wdXQtPnJlbmRlckJveCgpLT5ib3JkZXJSaWdodCgpOwotICAgIGlu
dCBzcGFjZVRvUmlnaHRPZkNhbmNlbEJ1dHRvbiA9IGFic1JpZ2h0IC0gKHIueCgpICsgci53aWR0
aCgpKTsKLSAgICBsb2NhbEJvdW5kcy5zZXRYKGxvY2FsQm91bmRzLngoKSAtIHNwYWNlVG9SaWdo
dE9mQ2FuY2VsQnV0dG9uKTsKLSNlbmRpZgotCi0gICAgbG9jYWxCb3VuZHMgPSBjb252ZXJ0VG9Q
YWludGluZ1JlY3QoaW5wdXQtPnJlbmRlcmVyKCksIG8sIGxvY2FsQm91bmRzLCByKTsKLQotICAg
IEZsb2F0UmVjdCB1bnpvb21lZFJlY3QobG9jYWxCb3VuZHMpOwotICAgIGlmICh6b29tTGV2ZWwg
IT0gMS4wZikgewotICAgICAgICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0Lndp
ZHRoKCkgLyB6b29tTGV2ZWwpOwotICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVuem9v
bWVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0
LT50cmFuc2xhdGUodW56b29tZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7Ci0gICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwp
KTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0Lngo
KSwgLXVuem9vbWVkUmVjdC55KCkpOwotICAgIH0KLQotICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRv
bkNlbGxdIGRyYXdXaXRoRnJhbWU6dW56b29tZWRSZWN0IGluVmlldzpkb2N1bWVudFZpZXdGb3Io
byldOwotICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdIHNldENvbnRyb2xWaWV3Om5pbF07
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6
Y2FuY2VsQnV0dG9uU2l6ZXMoKSBjb25zdAotewotICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNp
emVzWzNdID0geyBJbnRTaXplKDE2LCAxMyksIEludFNpemUoMTMsIDExKSwgSW50U2l6ZSgxMywg
OSkgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVz
dFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Ci17Ci0gICAgSW50U2l6ZSBzaXplID0gc2l6ZUZvclN5
c3RlbUZvbnQoc3R5bGUsIGNhbmNlbEJ1dHRvblNpemVzKCkpOwotICAgIHN0eWxlLT5zZXRXaWR0
aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVu
Z3RoKHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxs
cHRyKTsKLX0KLQotY29uc3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWM6OnJlc3VsdHNCdXR0b25T
aXplcygpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IElu
dFNpemUoMTksIDEzKSwgSW50U2l6ZSgxNywgMTEpLCBJbnRTaXplKDE3LCA5KSB9OwotICAgIHJl
dHVybiBzaXplczsKLX0KK25hbWVzcGFjZSBXZWJDb3JlIHsKIAotY29uc3QgaW50IGVtcHR5UmVz
dWx0c09mZnNldCA9IDk7Ci12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RTZWFyY2hGaWVsZERl
Y29yYXRpb25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KikgY29uc3QKLXsKLSAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwg
cmVzdWx0c0J1dHRvblNpemVzKCkpOwotICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53
aWR0aCgpIC0gZW1wdHlSZXN1bHRzT2Zmc2V0LCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRIZWln
aHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEJveFNoYWRv
dyhudWxscHRyKTsKLX0KK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLWJvb2wgUmVuZGVy
VGhlbWVNYWM6OnBhaW50U2VhcmNoRmllbGREZWNvcmF0aW9uKFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKQorUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVu
ZGVyVGhlbWU6OnRoZW1lRm9yUGFnZShQYWdlKikKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAg
c3RhdGljIFJlbmRlclRoZW1lKiBydCA9IFJlbmRlclRoZW1lTWFjOjpjcmVhdGUoKS5sZWFrUmVm
KCk7CisgICAgcmV0dXJuIHJ0OwogfQogCi12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RTZWFy
Y2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCopIGNvbnN0CitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJU
aGVtZU1hYzo6Y3JlYXRlKCkKIHsKLSAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9u
dChzdHlsZSwgcmVzdWx0c0J1dHRvblNpemVzKCkpOwotICAgIHN0eWxlLT5zZXRXaWR0aChMZW5n
dGgoc2l6ZS53aWR0aCgpLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNp
emUuaGVpZ2h0KCksIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsK
KyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1lTWFjKTsKIH0KIAotYm9vbCBSZW5k
ZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uKFJlbmRlck9iamVj
dCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitSZW5k
ZXJUaGVtZU1hYzo6UmVuZGVyVGhlbWVNYWMoKQorICAgIDogUmVuZGVyVGhlbWVNYWNTaGFyZWQo
KQogewotICAgIE5vZGUqIGlucHV0ID0gby0+bm9kZSgpLT5zaGFkb3dIb3N0KCk7Ci0gICAgaWYg
KCFpbnB1dCkKLSAgICAgICAgaW5wdXQgPSBvLT5ub2RlKCk7Ci0gICAgaWYgKCFpbnB1dC0+cmVu
ZGVyZXIoKS0+aXNCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgTG9jYWxDdXJy
ZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0gICAg
c2V0U2VhcmNoQ2VsbFN0YXRlKGlucHV0LT5yZW5kZXJlcigpLCByKTsKLQotICAgIE5TU2VhcmNo
RmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKLQotICAgIGlmIChbc2VhcmNoIHNl
YXJjaE1lbnVUZW1wbGF0ZV0gIT0gbmlsKQotICAgICAgICBbc2VhcmNoIHNldFNlYXJjaE1lbnVU
ZW1wbGF0ZTpuaWxdOwotCi0gICAgdXBkYXRlQWN0aXZlU3RhdGUoW3NlYXJjaCBzZWFyY2hCdXR0
b25DZWxsXSwgbyk7Ci0KLSAgICBGbG9hdFJlY3QgbG9jYWxCb3VuZHMgPSBbc2VhcmNoIHNlYXJj
aEJ1dHRvblJlY3RGb3JCb3VuZHM6TlNSZWN0KGlucHV0LT5yZW5kZXJCb3goKS0+cGl4ZWxTbmFw
cGVkQm9yZGVyQm94UmVjdCgpKV07Ci0gICAgbG9jYWxCb3VuZHMgPSBjb252ZXJ0VG9QYWludGlu
Z1JlY3QoaW5wdXQtPnJlbmRlcmVyKCksIG8sIGxvY2FsQm91bmRzLCByKTsKLQotICAgIFtbc2Vh
cmNoIHNlYXJjaEJ1dHRvbkNlbGxdIGRyYXdXaXRoRnJhbWU6bG9jYWxCb3VuZHMgaW5WaWV3OmRv
Y3VtZW50Vmlld0ZvcihvKV07Ci0gICAgW1tzZWFyY2ggc2VhcmNoQnV0dG9uQ2VsbF0gc2V0Q29u
dHJvbFZpZXc6bmlsXTsKLSAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWNvbnN0IGludCByZXN1bHRz
QXJyb3dXaWR0aCA9IDU7Ci12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RTZWFyY2hGaWVsZFJl
c3VsdHNCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVt
ZW50KikgY29uc3QKK1JlbmRlclRoZW1lTWFjOjp+UmVuZGVyVGhlbWVNYWMoKQogewotICAgIElu
dFNpemUgc2l6ZSA9IHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCByZXN1bHRzQnV0dG9uU2l6ZXMo
KSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCkgKyByZXN1bHRzQXJy
b3dXaWR0aCwgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChzaXplLmhlaWdo
dCgpLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CiB9CiAKLWJv
b2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitO
U1ZpZXcqIFJlbmRlclRoZW1lTWFjOjpkb2N1bWVudFZpZXdGb3IoUmVuZGVyT2JqZWN0KiBvKSBj
b25zdAogewotICAgIE5vZGUqIGlucHV0ID0gby0+bm9kZSgpLT5zaGFkb3dIb3N0KCk7Ci0gICAg
aWYgKCFpbnB1dCkKLSAgICAgICAgaW5wdXQgPSBvLT5ub2RlKCk7Ci0gICAgaWYgKCFpbnB1dC0+
cmVuZGVyZXIoKS0+aXNCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgTG9jYWxD
dXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0g
ICAgc2V0U2VhcmNoQ2VsbFN0YXRlKGlucHV0LT5yZW5kZXJlcigpLCByKTsKLQotICAgIE5TU2Vh
cmNoRmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKLQotICAgIHVwZGF0ZUFjdGl2
ZVN0YXRlKFtzZWFyY2ggc2VhcmNoQnV0dG9uQ2VsbF0sIG8pOwotCi0gICAgaWYgKCFbc2VhcmNo
IHNlYXJjaE1lbnVUZW1wbGF0ZV0pCi0gICAgICAgIFtzZWFyY2ggc2V0U2VhcmNoTWVudVRlbXBs
YXRlOnNlYXJjaE1lbnVUZW1wbGF0ZSgpXTsKLQotICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2
ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotICAgIGZsb2F0IHpvb21MZXZlbCA9
IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5k
cyA9IFtzZWFyY2ggc2VhcmNoQnV0dG9uUmVjdEZvckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRl
ckJveCgpLT5waXhlbFNuYXBwZWRCb3JkZXJCb3hSZWN0KCkpXTsKLSAgICBsb2NhbEJvdW5kcyA9
IGNvbnZlcnRUb1BhaW50aW5nUmVjdChpbnB1dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3VuZHMs
IHIpOwotICAgIAotICAgIEludFJlY3QgdW56b29tZWRSZWN0KGxvY2FsQm91bmRzKTsKLSAgICBp
ZiAoem9vbUxldmVsICE9IDEuMGYpIHsKLSAgICAgICAgdW56b29tZWRSZWN0LnNldFdpZHRoKHVu
em9vbWVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgdW56b29tZWRSZWN0LnNl
dEhlaWdodCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOwotICAgICAgICBwYWlu
dEluZm8uY29udGV4dC0+dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54KCksIHVuem9vbWVkUmVjdC55
KCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZl
bCwgem9vbUxldmVsKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLXVu
em9vbWVkUmVjdC54KCksIC11bnpvb21lZFJlY3QueSgpKTsKLSAgICB9Ci0KLSAgICBbW3NlYXJj
aCBzZWFyY2hCdXR0b25DZWxsXSBkcmF3V2l0aEZyYW1lOnVuem9vbWVkUmVjdCBpblZpZXc6ZG9j
dW1lbnRWaWV3Rm9yKG8pXTsKLSAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSBzZXRDb250
cm9sVmlldzpuaWxdOwotICAgIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gVGhlbWVN
YWM6OmVuc3VyZWRWaWV3KG8tPnZpZXcoKS0+ZnJhbWVWaWV3KCkpOwogfQogCiAjaWYgRU5BQkxF
KFZJREVPKQorCiB0eXBlZGVmIGVudW0gewogICAgIE1lZGlhQ29udHJvbGxlclRoZW1lQ2xhc3Np
YyAgID0gMSwKICAgICBNZWRpYUNvbnRyb2xsZXJUaGVtZVF1aWNrVGltZSA9IDIKQEAgLTE3MzUs
NyArNzYsNyBAQCB0eXBlZGVmIGVudW0gewogc3RhdGljIGludCBtZWRpYUNvbnRyb2xsZXJUaGVt
ZSgpCiB7CiAgICAgc3RhdGljIGludCBjb250cm9sbGVyVGhlbWUgPSAtMTsKLSAgICAKKwogICAg
IGlmIChjb250cm9sbGVyVGhlbWUgIT0gLTEpCiAgICAgICAgIHJldHVybiBjb250cm9sbGVyVGhl
bWU7CiAKQEAgLTE3NTAsNDAgKzkxLDEwIEBAIHN0YXRpYyBpbnQgbWVkaWFDb250cm9sbGVyVGhl
bWUoKQogICAgIGNvbnRyb2xsZXJUaGVtZSA9IE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1l
OwogICAgIHJldHVybiBjb250cm9sbGVyVGhlbWU7CiB9Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShE
QVRBTElTVF9FTEVNRU5UKQotSW50U2l6ZSBSZW5kZXJUaGVtZU1hYzo6c2xpZGVyVGlja1NpemUo
KSBjb25zdAotewotICAgIHJldHVybiBJbnRTaXplKDEsIDMpOwotfQotCi1pbnQgUmVuZGVyVGhl
bWVNYWM6OnNsaWRlclRpY2tPZmZzZXRGcm9tVHJhY2tDZW50ZXIoKSBjb25zdAotewotICAgIHJl
dHVybiAtOTsKLX0KLSNlbmRpZgogCi1jb25zdCBpbnQgc2xpZGVyVGh1bWJXaWR0aCA9IDE1Owot
Y29uc3QgaW50IHNsaWRlclRodW1iSGVpZ2h0ID0gMTU7CiBjb25zdCBpbnQgbWVkaWFTbGlkZXJU
aHVtYldpZHRoID0gMTM7CiBjb25zdCBpbnQgbWVkaWFTbGlkZXJUaHVtYkhlaWdodCA9IDE0Owog
Ci12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KikgY29uc3QKLXsKLSAgICBmbG9hdCB6b29tTGV2ZWwgPSBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpOwotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRo
dW1iSG9yaXpvbnRhbFBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZl
cnRpY2FsUGFydCkgewotICAgICAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHN0YXRpY19jYXN0
PGludD4oc2xpZGVyVGh1bWJXaWR0aCAqIHpvb21MZXZlbCksIEZpeGVkKSk7Ci0gICAgICAgIHN0
eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHN0YXRpY19jYXN0PGludD4oc2xpZGVyVGh1bWJIZWlnaHQg
KiB6b29tTGV2ZWwpLCBGaXhlZCkpOwotICAgIH0gCi0KLSNpZiBFTkFCTEUoVklERU8pCi0gICAg
YWRqdXN0TWVkaWFTbGlkZXJUaHVtYlNpemUoc3R5bGUpOwotI2VuZGlmCi19Ci0KLSNpZiBFTkFC
TEUoVklERU8pCi0KIHZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdE1lZGlhU2xpZGVyVGh1bWJT
aXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKIHsKICAgICBpbnQgd2tQYXJ0OwpAQCAtMTgx
Niw3ICsxMjcsNyBAQCB2b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RNZWRpYVNsaWRlclRodW1i
U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5n
dGgoc3RhdGljX2Nhc3Q8aW50PihoZWlnaHQgKiB6b29tTGV2ZWwpLCBGaXhlZCkpOwogfQogCi1l
bnVtIFdLTWVkaWFDb250cm9sbGVyVGhlbWVTdGF0ZSB7IAorZW51bSBXS01lZGlhQ29udHJvbGxl
clRoZW1lU3RhdGUgewogICAgIE1lZGlhVUlQYXJ0RGlzYWJsZWRGbGFnID0gMSA8PCAwLAogICAg
IE1lZGlhVUlQYXJ0UHJlc3NlZEZsYWcgPSAxIDw8IDEsCiAgICAgTWVkaWFVSVBhcnREcmF3RW5k
Q2Fwc0ZsYWcgPSAxIDw8IDMsCkBAIC0xODQ4LDcgKzE1OSw2IEBAIHN0YXRpYyBGbG9hdFJlY3Qg
Z2V0VW56b29tZWRSZWN0QW5kQWRqdXN0Q3VycmVudENvbnRleHQoUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBQCiAgICAgcmV0dXJuIHVuem9vbWVkUmVjdDsKIH0KIAotCiBib29sIFJlbmRlclRoZW1l
TWFjOjpwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIE5vZGUqIG5vZGUg
PSBvLT5ub2RlKCk7CkBAIC0xOTMwLDEyICsyNDAsMTIgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6
cGFpbnRNZWRpYVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBw
YWkKICAgICBmbG9hdCBkdXJhdGlvbiA9IG1lZGlhRWxlbWVudC0+ZHVyYXRpb24oKTsKICAgICBp
ZiAoaXNuYW4oZHVyYXRpb24pKQogICAgICAgICBkdXJhdGlvbiA9IDA7Ci0gCisKICAgICBDb250
ZXh0Q29udGFpbmVyIGNnQ29udGV4dENvbnRhaW5lcihwYWludEluZm8uY29udGV4dCk7CiAgICAg
Q0dDb250ZXh0UmVmIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOwogICAg
IEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQp
OwogICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3QgPSBnZXRVbnpvb21lZFJlY3RBbmRBZGp1c3RD
dXJyZW50Q29udGV4dChvLCBwYWludEluZm8sIHIpOwotICAgIHdrRHJhd01lZGlhU2xpZGVyVHJh
Y2sobWVkaWFDb250cm9sbGVyVGhlbWUoKSwgY29udGV4dCwgdW56b29tZWRSZWN0LCAKKyAgICB3
a0RyYXdNZWRpYVNsaWRlclRyYWNrKG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGNvbnRleHQsIHVu
em9vbWVkUmVjdCwKICAgICAgICAgdGltZUxvYWRlZCwgY3VycmVudFRpbWUsIGR1cmF0aW9uLCBn
ZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKIH0KQEAg
LTE5NTAsMTMgKzI2MCwxMyBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2xpZGVy
VGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaQogICAgIHdrRHJhd01l
ZGlhVUlQYXJ0KE1lZGlhU2xpZGVyVGh1bWIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2Fs
Q29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsK
ICAgICByZXR1cm4gZmFsc2U7CiB9Ci0gICAgCisKIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50
TWVkaWFSZXdpbmRCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwog
ICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAorCiAgICAgTG9jYWxD
dXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CiAg
ICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFSZXdpbmRCdXR0b24sIG1lZGlhQ29udHJvbGxlclRo
ZW1lKCksIGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZs
YWdzKG5vZGUpKTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xOTY3LDcgKzI3Nyw3IEBAIGJvb2wg
UmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpCiAgICAgTm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKICAgICBpZiAo
IW5vZGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKKwogICAgIExvY2FsQ3VycmVudEdy
YXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwogICAgIHdrRHJh
d01lZGlhVUlQYXJ0KE1lZGlhUmV0dXJuVG9SZWFsdGltZUJ1dHRvbiwgbWVkaWFDb250cm9sbGVy
VGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRl
RmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTE5ODUsNyArMjk1LDcgQEAgYm9v
bCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVRvZ2dsZUNsb3NlZENhcHRpb25zQnV0dG9uKFJl
bmRlck9iamVjdCogbywgY29uc3QKICAgICB3a0RyYXdNZWRpYVVJUGFydChtZWRpYUNvbnRyb2xF
bGVtZW50VHlwZShub2RlKSwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNn
Q29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVy
biBmYWxzZTsKIH0KLSAKKwogYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYUNvbnRyb2xz
QmFja2dyb3VuZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByKQogewogICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CkBAIC0yMDQ0
LDcgKzM1NCw3IEBAIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFWb2x1bWVTbGlkZXJU
cmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mCiAgICAgd2tEcmF3TWVkaWFVSVBh
cnQoTWVkaWFWb2x1bWVTbGlkZXIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4
dC5jZ0NvbnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICBy
ZXR1cm4gZmFsc2U7CiB9Ci0gICAgCisKIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFW
b2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CkBA
IC0yMDYxLDcgKzM3MSw3IEBAIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFGdWxsU2Ny
ZWVuVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zCiAgICAgTm9kZSogbm9k
ZSA9IG8tPm5vZGUoKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAKKwogICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJ
bmZvLmNvbnRleHQpOwogICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlhRnVsbFNjcmVlblZvbHVt
ZVNsaWRlciwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgp
LCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsK
QEAgLTIwNzIsNyArMzgyLDcgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYUZ1bGxT
Y3JlZW5Wb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnMKICAgICBOb2RlKiBu
b2RlID0gby0+bm9kZSgpOwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIAorCiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWlu
dEluZm8uY29udGV4dCk7CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFGdWxsU2NyZWVuVm9s
dW1lU2xpZGVyVGh1bWIsIG1lZGlhQ29udHJvbGxlclRoZW1lKCksIGxvY2FsQ29udGV4dC5jZ0Nv
bnRleHQoKSwgciwgZ2V0TWVkaWFVSVBhcnRTdGF0ZUZsYWdzKG5vZGUpKTsKICAgICByZXR1cm4g
ZmFsc2U7CkBAIC0yMDgwLDI5ICszOTAsMTkgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRN
ZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnMKIAog
U3RyaW5nIFJlbmRlclRoZW1lTWFjOjpleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCkKIHsK
LSNpZiBQTEFURk9STShNQUMpCiAgICAgaWYgKG1lZGlhQ29udHJvbGxlclRoZW1lKCkgPT0gTWVk
aWFDb250cm9sbGVyVGhlbWVRdWlja1RpbWUpCiAgICAgICAgIHJldHVybiBTdHJpbmcobWVkaWFD
b250cm9sc1F1aWNrVGltZVVzZXJBZ2VudFN0eWxlU2hlZXQsIHNpemVvZihtZWRpYUNvbnRyb2xz
UXVpY2tUaW1lVXNlckFnZW50U3R5bGVTaGVldCkpOwogCiAgICAgcmV0dXJuIFN0cmluZygpOwot
I2Vsc2UKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci0j
ZW5kaWYKIH0KIAogI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKIFN0cmluZyBSZW5kZXJUaGVt
ZU1hYzo6ZXh0cmFGdWxsU2NyZWVuU3R5bGVTaGVldCgpCiB7Ci0jaWYgUExBVEZPUk0oTUFDKQog
ICAgIGlmIChtZWRpYUNvbnRyb2xsZXJUaGVtZSgpID09IE1lZGlhQ29udHJvbGxlclRoZW1lUXVp
Y2tUaW1lKQogICAgICAgICByZXR1cm4gU3RyaW5nKGZ1bGxzY3JlZW5RdWlja1RpbWVVc2VyQWdl
bnRTdHlsZVNoZWV0LCBzaXplb2YoZnVsbHNjcmVlblF1aWNrVGltZVVzZXJBZ2VudFN0eWxlU2hl
ZXQpKTsKLSAgICAKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci0jZWxzZQotICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworCiAgICAgcmV0dXJuIFN0cmluZygpOwotI2VuZGlmCiB9CiAjZW5kaWYKIApA
QCAtMjEzMSwxNDUgKzQzMSw0IEBAIEludFBvaW50IFJlbmRlclRoZW1lTWFjOjp2b2x1bWVTbGlk
ZXJPZmZzZXRGcm9tTXV0ZUJ1dHRvbihSZW5kZXJCb3gqIG11dGVCdXR0b25CCiAKICNlbmRpZiAv
LyBFTkFCTEUoVklERU8pCiAKLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnNob3VsZFNob3dQbGFjZWhv
bGRlcldoZW5Gb2N1c2VkKCkgY29uc3QKLXsKLSNpZiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JF
UVVJUkVEID49IDEwNzAKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gICAgcmV0dXJuIGZhbHNl
OwotI2VuZGlmCi19Ci0KLU5TUG9wVXBCdXR0b25DZWxsKiBSZW5kZXJUaGVtZU1hYzo6cG9wdXBC
dXR0b24oKSBjb25zdAotewotICAgIGlmICghbV9wb3B1cEJ1dHRvbikgewotICAgICAgICBtX3Bv
cHVwQnV0dG9uLmFkb3B0TlMoW1tOU1BvcFVwQnV0dG9uQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxs
OkAiIiBwdWxsc0Rvd246Tk9dKTsKLSAgICAgICAgW21fcG9wdXBCdXR0b24uZ2V0KCkgc2V0VXNl
c0l0ZW1Gcm9tTWVudTpOT107Ci0gICAgICAgIFttX3BvcHVwQnV0dG9uLmdldCgpIHNldEZvY3Vz
UmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gbV9wb3B1cEJ1dHRvbi5nZXQoKTsKLX0KLQotTlNTZWFyY2hGaWVsZENlbGwqIFJlbmRlclRo
ZW1lTWFjOjpzZWFyY2goKSBjb25zdAotewotICAgIGlmICghbV9zZWFyY2gpIHsKLSAgICAgICAg
bV9zZWFyY2guYWRvcHROUyhbW05TU2VhcmNoRmllbGRDZWxsIGFsbG9jXSBpbml0VGV4dENlbGw6
QCIiXSk7Ci0gICAgICAgIFttX3NlYXJjaC5nZXQoKSBzZXRCZXplbFN0eWxlOk5TVGV4dEZpZWxk
Um91bmRlZEJlemVsXTsKLSAgICAgICAgW21fc2VhcmNoLmdldCgpIHNldEJlemVsZWQ6WUVTXTsK
LSAgICAgICAgW21fc2VhcmNoLmdldCgpIHNldEVkaXRhYmxlOllFU107Ci0gICAgICAgIFttX3Nl
YXJjaC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4dGVyaW9yXTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gbV9zZWFyY2guZ2V0KCk7Ci19Ci0KLU5TTWVudSogUmVuZGVyVGhl
bWVNYWM6OnNlYXJjaE1lbnVUZW1wbGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3NlYXJjaE1l
bnVUZW1wbGF0ZSkKLSAgICAgICAgbV9zZWFyY2hNZW51VGVtcGxhdGUuYWRvcHROUyhbW05TTWVu
dSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiJdKTsKLQotICAgIHJldHVybiBtX3NlYXJjaE1lbnVU
ZW1wbGF0ZS5nZXQoKTsKLX0KLQotTlNTbGlkZXJDZWxsKiBSZW5kZXJUaGVtZU1hYzo6c2xpZGVy
VGh1bWJIb3Jpem9udGFsKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fc2xpZGVyVGh1bWJIb3Jpem9u
dGFsKSB7Ci0gICAgICAgIG1fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmFkb3B0TlMoW1tOU1NsaWRl
ckNlbGwgYWxsb2NdIGluaXRdKTsKLSAgICAgICAgW21fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmdl
dCgpIHNldFNsaWRlclR5cGU6TlNMaW5lYXJTbGlkZXJdOwotICAgICAgICBbbV9zbGlkZXJUaHVt
Ykhvcml6b250YWwuZ2V0KCkgc2V0Q29udHJvbFNpemU6TlNTbWFsbENvbnRyb2xTaXplXTsKLSAg
ICAgICAgW21fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNG
b2N1c1JpbmdUeXBlRXh0ZXJpb3JdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbV9zbGlkZXJU
aHVtYkhvcml6b250YWwuZ2V0KCk7Ci19Ci0KLU5TU2xpZGVyQ2VsbCogUmVuZGVyVGhlbWVNYWM6
OnNsaWRlclRodW1iVmVydGljYWwoKSBjb25zdAotewotICAgIGlmICghbV9zbGlkZXJUaHVtYlZl
cnRpY2FsKSB7Ci0gICAgICAgIG1fc2xpZGVyVGh1bWJWZXJ0aWNhbC5hZG9wdE5TKFtbTlNTbGlk
ZXJDZWxsIGFsbG9jXSBpbml0XSk7Ci0gICAgICAgIFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0
KCkgc2V0U2xpZGVyVHlwZTpOU0xpbmVhclNsaWRlcl07Ci0gICAgICAgIFttX3NsaWRlclRodW1i
VmVydGljYWwuZ2V0KCkgc2V0Q29udHJvbFNpemU6TlNTbWFsbENvbnRyb2xTaXplXTsKLSAgICAg
ICAgW21fc2xpZGVyVGh1bWJWZXJ0aWNhbC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNS
aW5nVHlwZUV4dGVyaW9yXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1fc2xpZGVyVGh1bWJW
ZXJ0aWNhbC5nZXQoKTsKLX0KLQotTlNUZXh0RmllbGRDZWxsKiBSZW5kZXJUaGVtZU1hYzo6dGV4
dEZpZWxkKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fdGV4dEZpZWxkKSB7Ci0gICAgICAgIG1fdGV4
dEZpZWxkLmFkb3B0TlMoW1tXZWJDb3JlVGV4dEZpZWxkQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxs
OkAiIl0pOwotICAgICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0QmV6ZWxlZDpZRVNdOwotICAg
ICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0RWRpdGFibGU6WUVTXTsKLSAgICAgICAgW21fdGV4
dEZpZWxkLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOwot
I2lmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gMTA3MAotICAgICAgICBbbV90
ZXh0RmllbGQuZ2V0KCkgc2V0RHJhd3NCYWNrZ3JvdW5kOllFU107Ci0gICAgICAgIFttX3RleHRG
aWVsZC5nZXQoKSBzZXRCYWNrZ3JvdW5kQ29sb3I6W05TQ29sb3Igd2hpdGVDb2xvcl1dOwotI2Vs
c2UKLSAgICAgICAgLy8gUG9zdC1MaW9uLCBXZWJDb3JlIGNhbiBiZSBpbiBjaGFyZ2Ugb2YgcGFp
bnRpbm5nIHRoZSBiYWNrZ3JvdW5kIHRoYW5rcyB0bwotICAgICAgICAvLyB0aGUgd29ya2Fyb3Vu
ZCBpbiBwbGFjZSBmb3IgPHJkYXI6Ly9wcm9ibGVtLzExMzg1NDYxPiwgd2hpY2ggaXMgaW1wbGVt
ZW50ZWQKLSAgICAgICAgLy8gYWJvdmUgYXMgX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lLgot
ICAgICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0RHJhd3NCYWNrZ3JvdW5kOk5PXTsKLSNlbmRp
ZgotICAgIH0KLQotICAgIHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsKLX0KLQotU3RyaW5nIFJl
bmRlclRoZW1lTWFjOjpmaWxlTGlzdE5hbWVGb3JXaWR0aChjb25zdCBGaWxlTGlzdCogZmlsZUxp
c3QsIGNvbnN0IEZvbnQmIGZvbnQsIGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dl
ZCkgY29uc3QKLXsKLSAgICBpZiAod2lkdGggPD0gMCkKLSAgICAgICAgcmV0dXJuIFN0cmluZygp
OwotCi0gICAgU3RyaW5nIHN0clRvVHJ1bmNhdGU7Ci0gICAgaWYgKGZpbGVMaXN0LT5pc0VtcHR5
KCkpCi0gICAgICAgIHN0clRvVHJ1bmNhdGUgPSBmaWxlTGlzdERlZmF1bHRMYWJlbChtdWx0aXBs
ZUZpbGVzQWxsb3dlZCk7Ci0gICAgZWxzZSBpZiAoZmlsZUxpc3QtPmxlbmd0aCgpID09IDEpCi0g
ICAgICAgIHN0clRvVHJ1bmNhdGUgPSBbW05TRmlsZU1hbmFnZXIgZGVmYXVsdE1hbmFnZXJdIGRp
c3BsYXlOYW1lQXRQYXRoOihmaWxlTGlzdC0+aXRlbSgwKS0+cGF0aCgpKV07Ci0gICAgZWxzZQot
ICAgICAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKG11bHRpcGxlRmls
ZVVwbG9hZFRleHQoZmlsZUxpc3QtPmxlbmd0aCgpKSwgd2lkdGgsIGZvbnQsIFN0cmluZ1RydW5j
YXRvcjo6RW5hYmxlUm91bmRpbmdIYWNrcyk7Ci0KLSAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9y
OjpjZW50ZXJUcnVuY2F0ZShzdHJUb1RydW5jYXRlLCB3aWR0aCwgZm9udCwgU3RyaW5nVHJ1bmNh
dG9yOjpFbmFibGVSb3VuZGluZ0hhY2tzKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6cGFp
bnRQbHVnSW5TbmFwc2hvdE92ZXJsYXkoUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4qIHJlbmRlcmVy
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zm
c2V0KSBjb25zdAotewotICAgIExheW91dFVuaXQgY1dpZHRoID0gcmVuZGVyZXItPmNvbnRlbnRX
aWR0aCgpOwotICAgIExheW91dFVuaXQgY0hlaWdodCA9IHJlbmRlcmVyLT5jb250ZW50SGVpZ2h0
KCk7Ci0gICAgaWYgKCFjV2lkdGggfHwgIWNIZWlnaHQpCi0gICAgICAgIHJldHVybjsKLQotICAg
IEdyYXBoaWNzQ29udGV4dCogY29udGV4dCA9IHBhaW50SW5mby5jb250ZXh0OwotICAgIEdyYXBo
aWNzQ29udGV4dFN0YXRlU2F2ZXIgc2F2ZXIoKmNvbnRleHQpOwotCi0gICAgTGF5b3V0U2l6ZSBi
b3JkZXJBbmRQYWRkaW5nKHJlbmRlcmVyLT5ib3JkZXJMZWZ0KCkgKyByZW5kZXJlci0+cGFkZGlu
Z0xlZnQoKSwgcmVuZGVyZXItPmJvcmRlclRvcCgpICsgcmVuZGVyZXItPnBhZGRpbmdUb3AoKSk7
Ci0KLSAgICBMYXlvdXRTaXplIGNvbnRlbnRTaXplKGNXaWR0aCwgY0hlaWdodCk7Ci0gICAgTGF5
b3V0UG9pbnQgY29udGVudExvY2F0aW9uID0gcGFpbnRPZmZzZXQ7Ci0gICAgY29udGVudExvY2F0
aW9uLm1vdmUoYm9yZGVyQW5kUGFkZGluZyk7Ci0KLSAgICBSZWZQdHI8R3JhZGllbnQ+IGcgPSBH
cmFkaWVudDo6Y3JlYXRlKGNvbnRlbnRMb2NhdGlvbiwgRmxvYXRQb2ludChjb250ZW50TG9jYXRp
b24ueCgpLCBjb250ZW50TG9jYXRpb24ueSgpICsgY0hlaWdodCkpOwotICAgIGctPmFkZENvbG9y
U3RvcCgwLCAgQ29sb3IoLjVmLCAuNSwgLjUsIC43KSk7Ci0gICAgZy0+YWRkQ29sb3JTdG9wKC4y
LCBDb2xvciguNTRmLCAuNTQsIC41NCwgLjMpKTsKLSAgICBnLT5hZGRDb2xvclN0b3AoLjYsIENv
bG9yKC42MmYsIC42MiwgLjYyLCAuMykpOwotICAgIGctPmFkZENvbG9yU3RvcCgxLCAgQ29sb3Io
LjdmLCAuNywgLjcsIC45NSkpOwotICAgIGNvbnRleHQtPnNldEZpbGxHcmFkaWVudChnLnJlbGVh
c2UoKSk7Ci0gICAgY29udGV4dC0+ZmlsbFJlY3QocGl4ZWxTbmFwcGVkSW50UmVjdChMYXlvdXRS
ZWN0KGNvbnRlbnRMb2NhdGlvbiwgY29udGVudFNpemUpKSk7Ci0KLSAgICBzdGF0aWMgY29uc3Qg
ZmxvYXQgZGlhbWV0ZXIgPSA1MCwgdHJpYW5nbGVSYWRpdXMgPSAxMjsKLSAgICBMYXlvdXRQb2lu
dCBjZW50ZXIgPSBjb250ZW50TG9jYXRpb247Ci0gICAgY2VudGVyLm1vdmUoY1dpZHRoIC8gMiwg
Y0hlaWdodCAvIDIpOwotICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvciguNGYsIC40LCAu
NCwgLjcpLCBDb2xvclNwYWNlU1JHQik7Ci0gICAgY29udGV4dC0+ZmlsbEVsbGlwc2UoRmxvYXRS
ZWN0KGNlbnRlci54KCkgLSBkaWFtZXRlciAvIDIsIGNlbnRlci55KCkgLSBkaWFtZXRlciAvIDIs
IGRpYW1ldGVyLCBkaWFtZXRlcikpOwotCi0gICAgUGF0aCBwOwotICAgIHAubW92ZVRvKEZsb2F0
UG9pbnQoY2VudGVyLngoKSAtIHRyaWFuZ2xlUmFkaXVzICogMyAvIDQsIGNlbnRlci55KCkgLSB0
cmlhbmdsZVJhZGl1cykpOwotICAgIHAuYWRkTGluZVRvKEZsb2F0UG9pbnQoY2VudGVyLngoKSAr
IHRyaWFuZ2xlUmFkaXVzICogNSAvIDQsIGNlbnRlci55KCkpKTsKLSAgICBwLmFkZExpbmVUbyhG
bG9hdFBvaW50KGNlbnRlci54KCkgLSB0cmlhbmdsZVJhZGl1cyAqIDMgLyA0LCBjZW50ZXIueSgp
ICsgdHJpYW5nbGVSYWRpdXMpKTsKLSAgICBwLmNsb3NlU3VicGF0aCgpOwotICAgIGNvbnRleHQt
PnNldEZpbGxDb2xvcihDb2xvcigxLmYsIDEuZiwgMS5mLCAuOWYpLCBDb2xvclNwYWNlU1JHQik7
Ci0gICAgY29udGV4dC0+ZmlsbFBhdGgocCk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJl
ZC5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjU2hhcmVkLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uODFjMjVjMmFjNjYzN2I5YmE0ZDI1ZTc4MDI4NTkyNzJiYTkxYzY4YgotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJl
ZC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHRo
ZW1lIGltcGxlbWVudGF0aW9uIGZvciBmb3JtIGNvbnRyb2xzIGluIFdlYkNvcmUuCisgKgorICog
Q29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAy
MDEyIEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFJlbmRlclRoZW1lTWFjU2hhcmVk
X2gKKyNkZWZpbmUgUmVuZGVyVGhlbWVNYWNTaGFyZWRfaAorCisjaW1wb3J0ICJSZW5kZXJUaGVt
ZS5oIgorI2ltcG9ydCA8d3RmL0hhc2hNYXAuaD4KKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4K
KworCitPQkpDX0NMQVNTIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyOwor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclByb2dyZXNzOworY2xhc3MgUmVu
ZGVyU3R5bGU7CisKK2NsYXNzIFJlbmRlclRoZW1lTWFjU2hhcmVkIDogcHVibGljIFJlbmRlclRo
ZW1lIHsKK3B1YmxpYzoKKyAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIGNvbnRyb2wgY2hh
bmdlcyBpdHMgdGludCB3aGVuIHRoZSB3aW5kb3cgaGFzIGZvY3VzIG9yIG5vdC4KKyAgICB2aXJ0
dWFsIGJvb2wgY29udHJvbFN1cHBvcnRzVGludHMoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7
CisKKyAgICAvLyBBIGdlbmVyYWwgbWV0aG9kIGFza2luZyBpZiBhbnkgY29udHJvbCB0aW50aW5n
IGlzIHN1cHBvcnRlZCBhdCBhbGwuCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzQ29udHJvbFRp
bnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFJl
cGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCosIEludFJlY3QmKSBPVkVSUklERTsKKworICAg
IHZpcnR1YWwgYm9vbCBpc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBC
b3JkZXJEYXRhJiwgY29uc3QgRmlsbExheWVyJiwgY29uc3QgQ29sb3ImIGJhY2tncm91bmRDb2xv
cikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFj
a2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZl
U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0
Zm9ybUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICB2
aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cigpIGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3Jt
SW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmly
dHVhbCBDb2xvciBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFs
IFNjcm9sbGJhckNvbnRyb2xTaXplIHNjcm9sbGJhckNvbnRyb2xTaXplRm9yUGFydChDb250cm9s
UGFydCkgeyByZXR1cm4gU21hbGxTY3JvbGxiYXI7IH0KKworICAgIHZpcnR1YWwgdm9pZCBwbGF0
Zm9ybUNvbG9yc0RpZENoYW5nZSgpOworCisgICAgLy8gU3lzdGVtIGZvbnRzLgorICAgIHZpcnR1
YWwgdm9pZCBzeXN0ZW1Gb250KGludCBjc3NWYWx1ZUlkLCBGb250RGVzY3JpcHRpb24mKSBjb25z
dDsKKworICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5bGUqKSBj
b25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3Q7CisKKyNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVOVCkKKyAg
ICB2aXJ0dWFsIEludFNpemUgc2xpZGVyVGlja1NpemUoKSBjb25zdCBPVkVSUklERTsKKyAgICB2
aXJ0dWFsIGludCBzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3QgT1ZFUlJJ
REU7CisjZW5kaWYKKworICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChS
ZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5n
UmlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBwb3B1cEludGVybmFs
UGFkZGluZ1RvcChSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHBvcHVwSW50
ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRDYXBzTG9ja0luZGljYXRvcihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0JikgT1ZFUlJJREU7CisKKyAgICB2aXJ0dWFsIGJvb2wgcG9wc01lbnVC
eUFycm93S2V5cygpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworI2lmIEVOQUJM
RShNRVRFUl9FTEVNRU5UKQorICAgIHZpcnR1YWwgSW50U2l6ZSBtZXRlclNpemVGb3JCb3VuZHMo
Y29uc3QgUmVuZGVyTWV0ZXIqLCBjb25zdCBJbnRSZWN0JikgY29uc3QgT1ZFUlJJREU7CisgICAg
dmlydHVhbCBib29sIHBhaW50TWV0ZXIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwg
Y29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c01ldGVyKENvbnRyb2xQ
YXJ0KSBjb25zdDsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCisgICAg
Ly8gUmV0dXJucyB0aGUgcmVwZWF0IGludGVydmFsIG9mIHRoZSBhbmltYXRpb24gZm9yIHRoZSBw
cm9ncmVzcyBiYXIuCisgICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxG
b3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OworICAgIC8vIFJldHVybnMgdGhl
IGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gZm9yIHRoZSBwcm9ncmVzcyBiYXIuCisgICAgdmly
dHVhbCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVz
cyopIGNvbnN0OworI2VuZGlmCisKKyAgICB2aXJ0dWFsIENvbG9yIHN5c3RlbUNvbG9yKGludCBj
c3NWYWx1ZUlkKSBjb25zdDsKKyAgICAvLyBDb250cm9scyBjb2xvciB2YWx1ZXMgcmV0dXJuZWQg
ZnJvbSBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkuIHN5c3RlbUNvbG9yKCkgd2lsbCBiZSB1c2Vk
IHdoZW4gZmFsc2UuCisgICAgdmlydHVhbCBib29sIHVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9y
KCkgY29uc3Q7CisgICAgLy8gQSB2aWV3IGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRhaW5lZCBkb2N1
bWVudC4gU3ViY2xhc3NlcyBtYXkgbm90IGhhdmUgc3VjaCBhIHZpZXcgYW5kIHJldHVybiBhIGZh
a2UuCisgICAgdmlydHVhbCBOU1ZpZXcqIGRvY3VtZW50Vmlld0ZvcihSZW5kZXJPYmplY3QqKSBj
b25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRQbHVnSW5TbmFwc2hvdE92ZXJsYXko
UmVuZGVyU25hcHNob3R0ZWRQbHVnSW4qLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBMYXlvdXRQ
b2ludCYpIGNvbnN0IE9WRVJSSURFOworCitwcm90ZWN0ZWQ6CisgICAgUmVuZGVyVGhlbWVNYWNT
aGFyZWQoKTsKKyAgICB2aXJ0dWFsIH5SZW5kZXJUaGVtZU1hY1NoYXJlZCgpOworCisgICAgdmly
dHVhbCBib29sIHN1cHBvcnRzU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9ycygpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9p
ZCBhZGp1c3RUZXh0RmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJPYmpl
Y3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lk
IGFkanVzdFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVu
dCopIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RNZW51TGlzdFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQq
KSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9i
amVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUq
LCBFbGVtZW50KikgY29uc3Q7CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVy
U3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50UHJvZ3Jlc3NC
YXIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworI2Vu
ZGlmCisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIGFkanVz
dFNsaWRlclRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCop
IGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RTbGlkZXJUaHVtYlN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1l
bnQqKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkKFJlbmRlck9i
amVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0U2VhcmNoRmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBF
bGVtZW50KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5j
ZWxCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29u
c3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oUmVuZGVy
T2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVh
bCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBS
ZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFy
Y2hGaWVsZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0Rl
Y29yYXRpb25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29u
c3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoU3R5bGVSZXNv
bHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBw
YWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAgdmlydHVhbCB2
b2lkIGFkanVzdE1lZGlhU2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3QgPSAwOwor
ICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Nsb3NlZENhcHRpb25pbmcoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9CisjZW5kaWYKKworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRTaG93UGxhY2Vob2xk
ZXJXaGVuRm9jdXNlZCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZpcnR1YWwgU3RyaW5nIGZp
bGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVMaXN0KiwgY29uc3QgRm9udCYsIGludCB3aWR0
aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dlZCkgY29uc3QgT1ZFUlJJREU7CisKKyAgICBJbnRS
ZWN0IGluZmxhdGVSZWN0KGNvbnN0IEludFJlY3QmLCBjb25zdCBJbnRTaXplJiwgY29uc3QgaW50
KiBtYXJnaW5zLCBmbG9hdCB6b29tTGV2ZWwgPSAxLjBmKSBjb25zdDsKKworICAgIEZsb2F0UmVj
dCBjb252ZXJ0VG9QYWludGluZ1JlY3QoY29uc3QgUmVuZGVyT2JqZWN0KiBpbnB1dFJlbmRlcmVy
LCBjb25zdCBSZW5kZXJPYmplY3QqIHBhcnRSZW5kZXJlciwgY29uc3QgRmxvYXRSZWN0JiBpbnB1
dFJlY3QsIGNvbnN0IEludFJlY3QmKSBjb25zdDsKKworICAgIC8vIEdldCB0aGUgY29udHJvbCBz
aXplIGJhc2VkIG9mZiB0aGUgZm9udC4gVXNlZCBieSBzb21lIG9mIHRoZSBjb250cm9scyAobGlr
ZSBidXR0b25zKS4KKyAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplRm9yRm9udChSZW5kZXJT
dHlsZSopIGNvbnN0OworICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemVGb3JTeXN0ZW1Gb250
KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdm9pZCBzZXRDb250cm9sU2l6ZShOU0NlbGwqLCBj
b25zdCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50U2l6ZSYgbWluU2l6ZSwgZmxvYXQgem9vbUxl
dmVsID0gMS4wZik7CisgICAgdm9pZCBzZXRTaXplRnJvbUZvbnQoUmVuZGVyU3R5bGUqLCBjb25z
dCBJbnRTaXplKiBzaXplcykgY29uc3Q7CisgICAgSW50U2l6ZSBzaXplRm9yRm9udChSZW5kZXJT
dHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdDsKKyAgICBJbnRTaXplIHNpemVGb3JT
eXN0ZW1Gb250KFJlbmRlclN0eWxlKiwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0OworICAg
IHZvaWQgc2V0Rm9udEZyb21Db250cm9sU2l6ZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUq
LCBOU0NvbnRyb2xTaXplKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlKE5T
Q2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRl
KE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIHZvaWQgdXBkYXRlRm9jdXNlZFN0
YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIHZvaWQgdXBkYXRlUHJlc3Nl
ZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIC8vIEFuIG9wdGlvbmFs
IGhvb2sgZm9yIHN1YmNsYXNzZXMgdG8gdXBkYXRlIHRoZSBjb250cm9sIHRpbnQgb2YgTlNDZWxs
LgorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVBY3RpdmVTdGF0ZShOU0NlbGwqLCBjb25zdCBSZW5k
ZXJPYmplY3QqKSB7IH0KKworICAgIC8vIEhlbHBlcnMgZm9yIGFkanVzdGluZyBhcHBlYXJhbmNl
IGFuZCBmb3IgcGFpbnRpbmcKKworICAgIHZvaWQgc2V0UG9wdXBCdXR0b25DZWxsU3RhdGUoY29u
c3QgUmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVjdCYpOworICAgIGNvbnN0IEludFNpemUqIHBv
cHVwQnV0dG9uU2l6ZXMoKSBjb25zdDsKKyAgICBjb25zdCBpbnQqIHBvcHVwQnV0dG9uTWFyZ2lu
cygpIGNvbnN0OworICAgIGNvbnN0IGludCogcG9wdXBCdXR0b25QYWRkaW5nKE5TQ29udHJvbFNp
emUpIGNvbnN0OworICAgIHZvaWQgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50cyhSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgY29uc3QgSW50
U2l6ZSogbWVudUxpc3RTaXplcygpIGNvbnN0OworCisgICAgY29uc3QgSW50U2l6ZSogc2VhcmNo
RmllbGRTaXplcygpIGNvbnN0OworICAgIGNvbnN0IEludFNpemUqIGNhbmNlbEJ1dHRvblNpemVz
KCkgY29uc3Q7CisgICAgY29uc3QgSW50U2l6ZSogcmVzdWx0c0J1dHRvblNpemVzKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRTZWFyY2hDZWxsU3RhdGUoUmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVj
dCYpOworICAgIHZvaWQgc2V0U2VhcmNoRmllbGRTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisK
KyAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBCdXR0b24oKSBjb25zdDsKKyAgICBOU1NlYXJj
aEZpZWxkQ2VsbCogc2VhcmNoKCkgY29uc3Q7CisgICAgTlNNZW51KiBzZWFyY2hNZW51VGVtcGxh
dGUoKSBjb25zdDsKKyAgICBOU1NsaWRlckNlbGwqIHNsaWRlclRodW1iSG9yaXpvbnRhbCgpIGNv
bnN0OworICAgIE5TU2xpZGVyQ2VsbCogc2xpZGVyVGh1bWJWZXJ0aWNhbCgpIGNvbnN0OworICAg
IE5TVGV4dEZpZWxkQ2VsbCogdGV4dEZpZWxkKCkgY29uc3Q7CisKKyNpZiBFTkFCTEUoTUVURVJf
RUxFTUVOVCkKKyAgICBOU0xldmVsSW5kaWNhdG9yU3R5bGUgbGV2ZWxJbmRpY2F0b3JTdHlsZUZv
cihDb250cm9sUGFydCkgY29uc3Q7CisgICAgTlNMZXZlbEluZGljYXRvckNlbGwqIGxldmVsSW5k
aWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKikgY29uc3Q7CisjZW5kaWYKKworI2lmIEVOQUJM
RShQUk9HUkVTU19FTEVNRU5UKQorICAgIGludCBtaW5pbXVtUHJvZ3Jlc3NCYXJIZWlnaHQoUmVu
ZGVyU3R5bGUqKSBjb25zdDsKKyAgICBjb25zdCBJbnRTaXplKiBwcm9ncmVzc0JhclNpemVzKCkg
Y29uc3Q7CisgICAgY29uc3QgaW50KiBwcm9ncmVzc0Jhck1hcmdpbnMoTlNDb250cm9sU2l6ZSkg
Y29uc3Q7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIFJldGFpblB0cjxOU1BvcFVw
QnV0dG9uQ2VsbD4gbV9wb3B1cEJ1dHRvbjsKKyAgICBtdXRhYmxlIFJldGFpblB0cjxOU1NlYXJj
aEZpZWxkQ2VsbD4gbV9zZWFyY2g7CisgICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNNZW51PiBtX3Nl
YXJjaE1lbnVUZW1wbGF0ZTsKKyAgICBtdXRhYmxlIFJldGFpblB0cjxOU1NsaWRlckNlbGw+IG1f
c2xpZGVyVGh1bWJIb3Jpem9udGFsOworICAgIG11dGFibGUgUmV0YWluUHRyPE5TU2xpZGVyQ2Vs
bD4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsOworICAgIG11dGFibGUgUmV0YWluUHRyPE5TTGV2ZWxJ
bmRpY2F0b3JDZWxsPiBtX2xldmVsSW5kaWNhdG9yOworICAgIG11dGFibGUgUmV0YWluUHRyPE5T
VGV4dEZpZWxkQ2VsbD4gbV90ZXh0RmllbGQ7CisKKyAgICBib29sIG1faXNTbGlkZXJUaHVtYkhv
cml6b250YWxQcmVzc2VkOworICAgIGJvb2wgbV9pc1NsaWRlclRodW1iVmVydGljYWxQcmVzc2Vk
OworCisgICAgbXV0YWJsZSBIYXNoTWFwPGludCwgUkdCQTMyPiBtX3N5c3RlbUNvbG9yQ2FjaGU7
CisKKyAgICBSZXRhaW5QdHI8V2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXI+
IG1fbm90aWZpY2F0aW9uT2JzZXJ2ZXI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBSZW5kZXJUaGVtZU1hY1NoYXJlZF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQubW0gYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjk5NjVjMjFhY2U4
Mzc2OWY4NDIzYTFmNmEyMjZmN2U0ZmQ4YjI0NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5tbQpAQCAtMCwwICsxLDE4NzUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIw
MTAsIDIwMTEsIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW1wb3J0ICJj
b25maWcuaCIKKyNpbXBvcnQgIlJlbmRlclRoZW1lTWFjU2hhcmVkLmgiCisKKyNpbXBvcnQgIkJp
dG1hcEltYWdlLmgiCisjaW1wb3J0ICJDb2xvck1hYy5oIgorI2ltcG9ydCAiQ1NTVmFsdWVMaXN0
LmgiCisjaW1wb3J0ICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW1wb3J0ICJEb2N1bWVudC5oIgor
I2ltcG9ydCAiRWxlbWVudC5oIgorI2ltcG9ydCAiRmlsZUxpc3QuaCIKKyNpbXBvcnQgIkZyYW1l
Vmlldy5oIgorI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0Q0cuaCIKKyNpbXBvcnQgIkhUTUxJbnB1
dEVsZW1lbnQuaCIKKyNpbXBvcnQgIkhUTUxNZWRpYUVsZW1lbnQuaCIKKyNpbXBvcnQgIkhUTUxO
YW1lcy5oIgorI2ltcG9ydCAiSW1hZ2UuaCIKKyNpbXBvcnQgIkltYWdlQnVmZmVyLmgiCisjaW1w
b3J0ICJMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQuaCIKKyNpbXBvcnQgIkxvY2FsaXplZFN0
cmluZ3MuaCIKKyNpbXBvcnQgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW1wb3J0ICJQYWlu
dEluZm8uaCIKKyNpbXBvcnQgIlJlbmRlck1lZGlhLmgiCisjaW1wb3J0ICJSZW5kZXJNZWRpYUNv
bnRyb2xzLmgiCisjaW1wb3J0ICJSZW5kZXJTbGlkZXIuaCIKKyNpbXBvcnQgIlJlbmRlclNuYXBz
aG90dGVkUGx1Z0luLmgiCisjaW1wb3J0ICJSZW5kZXJWaWV3LmgiCisjaW1wb3J0ICJTaGFyZWRC
dWZmZXIuaCIKKyNpbXBvcnQgIlN0cmluZ1RydW5jYXRvci5oIgorI2ltcG9ydCAiU3R5bGVSZXNv
bHZlci5oIgorI2ltcG9ydCAiVGltZVJhbmdlcy5oIgorI2ltcG9ydCAiVGhlbWVNYWMuaCIKKyNp
bXBvcnQgIldlYkNvcmVOU0NlbGxFeHRyYXMuaCIKKyNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRl
cmZhY2UuaCIKKyNpbXBvcnQgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW1wb3J0IDxDYXJi
b24vQ2FyYm9uLmg+CisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8d3RmL1JldGFp
blB0ci5oPgorI2ltcG9ydCA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2ltcG9ydCA8bWF0aC5oPgor
CisjaW1wb3J0ICJSZW5kZXJQcm9ncmVzcy5oIgorCisjaWYgRU5BQkxFKE1FVEVSX0VMRU1FTlQp
CisjaW5jbHVkZSAiUmVuZGVyTWV0ZXIuaCIKKyNpbmNsdWRlICJIVE1MTWV0ZXJFbGVtZW50Lmgi
CisjZW5kaWYKKworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvLyBUaGUgbWV0aG9kcyBpbiB0
aGlzIGZpbGUgYXJlIHNwZWNpZmljIHRvIHRoZSBNYWMgT1MgWCBwbGF0Zm9ybS4KKworLy8gRklY
TUU6IFRoZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBjb2RlIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJl
IGZhY3RvcmVkIG91dCBhbmQgbWVyZ2VkIHdpdGggUmVuZGVyVGhlbWVTYWZhcmkuCisKKy8vIFdl
IGVzdGltYXRlIHRoZSBhbmltYXRpb24gcmF0ZSBvZiBhIE1hYyBPUyBYIHByb2dyZXNzIGJhciBp
cyAzMyBmcHMuCisvLyBIYXJkIGNvZGUgdGhlIHZhbHVlIGhlcmUgYmVjYXVzZSB3ZSBoYXZlbid0
IGZvdW5kIEFQSSBmb3IgaXQuCitjb25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25GcmFtZVJh
dGUgPSAwLjAzMzsKKworLy8gTWFjIE9TIFggcHJvZ3Jlc3MgYmFyIGFuaW1hdGlvbiBzZWVtcyB0
byBoYXZlIDI1NiBmcmFtZXMuCitjb25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25OdW1GcmFt
ZXMgPSAyNTY7CisKK0BpbnRlcmZhY2UgV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2Jz
ZXJ2ZXIgOiBOU09iamVjdAoreworICAgIFdlYkNvcmU6OlJlbmRlclRoZW1lICpfdGhlbWU7Cit9
CisKKy0gKGlkKWluaXRXaXRoVGhlbWU6KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWU7Cist
ICh2b2lkKXN5c3RlbUNvbG9yc0RpZENoYW5nZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRp
b247CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNh
dGlvbk9ic2VydmVyCisKKy0gKGlkKWluaXRXaXRoVGhlbWU6KFdlYkNvcmU6OlJlbmRlclRoZW1l
ICopdGhlbWUKK3sKKyAgICBpZiAoIShzZWxmID0gW3N1cGVyIGluaXRdKSkKKyAgICAgICAgcmV0
dXJuIG5pbDsKKworICAgIF90aGVtZSA9IHRoZW1lOworICAgIHJldHVybiBzZWxmOworfQorCist
ICh2b2lkKXN5c3RlbUNvbG9yc0RpZENoYW5nZTooTlNOb3RpZmljYXRpb24gKil1bnVzZWROb3Rp
ZmljYXRpb24KK3sKKyAgICBBU1NFUlRfVU5VU0VEKHVudXNlZE5vdGlmaWNhdGlvbiwgW1t1bnVz
ZWROb3RpZmljYXRpb24gbmFtZV0gaXNFcXVhbFRvU3RyaW5nOk5TU3lzdGVtQ29sb3JzRGlkQ2hh
bmdlTm90aWZpY2F0aW9uXSk7CisgICAgX3RoZW1lLT5wbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgp
OworfQorCitAZW5kCisKK0BpbnRlcmZhY2UgTlNUZXh0RmllbGRDZWxsIChXS0RldGFpbHMpCist
IChDRkRpY3Rpb25hcnlSZWYpX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOihOU1JlY3QpY2Vs
bEZyYW1lIGluVmlldzooTlNWaWV3ICopY29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOihCT09MKWlu
Y2x1ZGVGb2N1czsKK0BlbmQKKworCitAaW50ZXJmYWNlIFdlYkNvcmVUZXh0RmllbGRDZWxsIDog
TlNUZXh0RmllbGRDZWxsCistIChDRkRpY3Rpb25hcnlSZWYpX2NvcmVVSURyYXdPcHRpb25zV2l0
aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1lIGluVmlldzooTlNWaWV3ICopY29udHJvbFZpZXcgaW5j
bHVkZUZvY3VzOihCT09MKWluY2x1ZGVGb2N1czsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFdl
YkNvcmVUZXh0RmllbGRDZWxsCistIChDRkRpY3Rpb25hcnlSZWYpX2NvcmVVSURyYXdPcHRpb25z
V2l0aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1lIGluVmlldzooTlNWaWV3ICopY29udHJvbFZpZXcg
aW5jbHVkZUZvY3VzOihCT09MKWluY2x1ZGVGb2N1cworeworICAgIC8vIEZJWE1FOiBUaGlzIGlz
IGEgcG9zdC1MaW9uLW9ubHkgd29ya2Fyb3VuZCBmb3IgPHJkYXI6Ly9wcm9ibGVtLzExMzg1NDYx
Pi4gV2hlbiB0aGF0IGJ1ZyBpcyByZXNvbHZlZCwgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzIGNvZGUu
CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBjb3JlVUlEcmF3T3B0aW9ucyA9IENGRGljdGlv
bmFyeUNyZWF0ZU11dGFibGVDb3B5KE5VTEwsIDAsIFtzdXBlciBfY29yZVVJRHJhd09wdGlvbnNX
aXRoRnJhbWU6Y2VsbEZyYW1lIGluVmlldzpjb250cm9sVmlldyBpbmNsdWRlRm9jdXM6aW5jbHVk
ZUZvY3VzXSk7CisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29yZVVJRHJhd09wdGlvbnMsIEAi
Ym9yZGVycyBvbmx5Iiwga0NGQm9vbGVhblRydWUpOworICAgIHJldHVybiAoQ0ZEaWN0aW9uYXJ5
UmVmKVtOU01ha2VDb2xsZWN0YWJsZShjb3JlVUlEcmF3T3B0aW9ucykgYXV0b3JlbGVhc2VdOwor
fQorQGVuZAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFt
ZXM7CisKK2VudW0geworICAgIHRvcE1hcmdpbiwKKyAgICByaWdodE1hcmdpbiwKKyAgICBib3R0
b21NYXJnaW4sCisgICAgbGVmdE1hcmdpbgorfTsKKworZW51bSB7CisgICAgdG9wUGFkZGluZywK
KyAgICByaWdodFBhZGRpbmcsCisgICAgYm90dG9tUGFkZGluZywKKyAgICBsZWZ0UGFkZGluZwor
fTsKKworUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OlJlbmRlclRoZW1lTWFjU2hhcmVkKCkKKyAgICA6
IG1faXNTbGlkZXJUaHVtYkhvcml6b250YWxQcmVzc2VkKGZhbHNlKQorICAgICwgbV9pc1NsaWRl
clRodW1iVmVydGljYWxQcmVzc2VkKGZhbHNlKQorICAgICwgbV9ub3RpZmljYXRpb25PYnNlcnZl
cihBZG9wdE5TLCBbW1dlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyIGFsbG9j
XSBpbml0V2l0aFRoZW1lOnRoaXNdKQoreworICAgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVm
YXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6bV9ub3RpZmljYXRpb25PYnNlcnZlci5nZXQoKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxl
Y3RvcjpAc2VsZWN0b3Ioc3lzdGVtQ29sb3JzRGlkQ2hhbmdlOikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6TlNTeXN0ZW1D
b2xvcnNEaWRDaGFuZ2VOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6bmlsXTsKK30KKworUmVuZGVyVGhl
bWVNYWNTaGFyZWQ6On5SZW5kZXJUaGVtZU1hY1NoYXJlZCgpCit7CisgICAgW1tOU05vdGlmaWNh
dGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNlcnZlcjptX25vdGlmaWNhdGlvbk9i
c2VydmVyLmdldCgpXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3Jt
QWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBOU0NvbG9yKiBj
b2xvciA9IFtbTlNDb2xvciBzZWxlY3RlZFRleHRCYWNrZ3JvdW5kQ29sb3JdIGNvbG9yVXNpbmdD
b2xvclNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2VdOworICAgIHJldHVybiBDb2xvcihz
dGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIHJlZENvbXBvbmVudF0pLCBzdGF0aWNfY2Fz
dDxpbnQ+KDI1NS4wICogW2NvbG9yIGdyZWVuQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4o
MjU1LjAgKiBbY29sb3IgYmx1ZUNvbXBvbmVudF0pKTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dAoreworICAgIE5TQ29sb3IqIGNvbG9yID0gW1tOU0NvbG9yIHNlY29uZGFyeVNlbGVjdGVkQ29u
dHJvbENvbG9yXSBjb2xvclVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNl
XTsKKyAgICByZXR1cm4gQ29sb3Ioc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciByZWRD
b21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBncmVlbkNvbXBvbmVu
dF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIGJsdWVDb21wb25lbnRdKSk7Cit9
CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIE5TQ29sb3IqIGNvbG9yID0gW1tO
U0NvbG9yIGFsdGVybmF0ZVNlbGVjdGVkQ29udHJvbENvbG9yXSBjb2xvclVzaW5nQ29sb3JTcGFj
ZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXTsKKyAgICByZXR1cm4gQ29sb3Ioc3RhdGljX2Nh
c3Q8aW50PigyNTUuMCAqIFtjb2xvciByZWRDb21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50Pigy
NTUuMCAqIFtjb2xvciBncmVlbkNvbXBvbmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICog
W2NvbG9yIGJsdWVDb21wb25lbnRdKSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjU2hhcmVk
OjpwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAor
eworICAgIHJldHVybiBDb2xvcjo6d2hpdGU7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpwbGF0Zm9ybUluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNv
bnN0Cit7CisgICAgcmV0dXJuIENvbG9yOjpibGFjazsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OnBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25zdAoreworICAgIGlmICh1c2Vz
VGVzdE1vZGVGb2N1c1JpbmdDb2xvcigpKQorICAgICAgICByZXR1cm4gb2xkQXF1YUZvY3VzUmlu
Z0NvbG9yKCk7CisKKyAgICByZXR1cm4gc3lzdGVtQ29sb3IoQ1NTVmFsdWVXZWJraXRGb2N1c1Jp
bmdDb2xvcik7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUluYWN0
aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKTsKK30KKworc3RhdGlj
IEZvbnRXZWlnaHQgdG9Gb250V2VpZ2h0KE5TSW50ZWdlciBhcHBLaXRGb250V2VpZ2h0KQorewor
ICAgIEFTU0VSVChhcHBLaXRGb250V2VpZ2h0ID4gMCAmJiBhcHBLaXRGb250V2VpZ2h0IDwgMTUp
OworICAgIGlmIChhcHBLaXRGb250V2VpZ2h0ID4gMTQpCisgICAgICAgIGFwcEtpdEZvbnRXZWln
aHQgPSAxNDsKKyAgICBlbHNlIGlmIChhcHBLaXRGb250V2VpZ2h0IDwgMSkKKyAgICAgICAgYXBw
S2l0Rm9udFdlaWdodCA9IDE7CisKKyAgICBzdGF0aWMgRm9udFdlaWdodCBmb250V2VpZ2h0c1td
ID0geworICAgICAgICBGb250V2VpZ2h0MTAwLAorICAgICAgICBGb250V2VpZ2h0MTAwLAorICAg
ICAgICBGb250V2VpZ2h0MjAwLAorICAgICAgICBGb250V2VpZ2h0MzAwLAorICAgICAgICBGb250
V2VpZ2h0NDAwLAorICAgICAgICBGb250V2VpZ2h0NTAwLAorICAgICAgICBGb250V2VpZ2h0NjAw
LAorICAgICAgICBGb250V2VpZ2h0NjAwLAorICAgICAgICBGb250V2VpZ2h0NzAwLAorICAgICAg
ICBGb250V2VpZ2h0ODAwLAorICAgICAgICBGb250V2VpZ2h0ODAwLAorICAgICAgICBGb250V2Vp
Z2h0OTAwLAorICAgICAgICBGb250V2VpZ2h0OTAwLAorICAgICAgICBGb250V2VpZ2h0OTAwCisg
ICAgfTsKKyAgICByZXR1cm4gZm9udFdlaWdodHNbYXBwS2l0Rm9udFdlaWdodCAtIDFdOworfQor
Cit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzeXN0ZW1Gb250KGludCBjc3NWYWx1ZUlkLCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgc3lzdGVtRm9udCwgKCkpOworICAgIERFRklORV9T
VEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBzbWFsbFN5c3RlbUZvbnQsICgpKTsKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgbWVudUZvbnQsICgpKTsKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgbGFiZWxGb250LCAoKSk7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIG1pbmlDb250cm9sRm9udCwgKCkp
OworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBzbWFsbENvbnRyb2xG
b250LCAoKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIGNvbnRy
b2xGb250LCAoKSk7CisKKyAgICBGb250RGVzY3JpcHRpb24qIGNhY2hlZERlc2M7CisgICAgTlNG
b250KiBmb250ID0gbmlsOworICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgeworICAgICAgICBjYXNl
IENTU1ZhbHVlU21hbGxDYXB0aW9uOgorICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZzbWFsbFN5
c3RlbUZvbnQ7CisgICAgICAgICAgICBpZiAoIXNtYWxsU3lzdGVtRm9udC5pc0Fic29sdXRlU2l6
ZSgpKQorICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05T
Rm9udCBzbWFsbFN5c3RlbUZvbnRTaXplXV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBDU1NWYWx1ZU1lbnU6CisgICAgICAgICAgICBjYWNoZWREZXNjID0gJm1lbnVGb250Owor
ICAgICAgICAgICAgaWYgKCFtZW51Rm9udC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAg
ICAgIGZvbnQgPSBbTlNGb250IG1lbnVGb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVd
XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlU3RhdHVzQmFyOgor
ICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZsYWJlbEZvbnQ7CisgICAgICAgICAgICBpZiAoIWxh
YmVsRm9udC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250
IGxhYmVsRm9udE9mU2l6ZTpbTlNGb250IGxhYmVsRm9udFNpemVdXTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0TWluaUNvbnRyb2w6CisgICAgICAgICAg
ICBjYWNoZWREZXNjID0gJm1pbmlDb250cm9sRm9udDsKKyAgICAgICAgICAgIGlmICghbWluaUNv
bnRyb2xGb250LmlzQWJzb2x1dGVTaXplKCkpCisgICAgICAgICAgICAgICAgZm9udCA9IFtOU0Zv
bnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6
TlNNaW5pQ29udHJvbFNpemVdXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENT
U1ZhbHVlV2Via2l0U21hbGxDb250cm9sOgorICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZzbWFs
bENvbnRyb2xGb250OworICAgICAgICAgICAgaWYgKCFzbWFsbENvbnRyb2xGb250LmlzQWJzb2x1
dGVTaXplKCkpCisgICAgICAgICAgICAgICAgZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6
ZTpbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6TlNTbWFsbENvbnRyb2xTaXpl
XV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdENvbnRy
b2w6CisgICAgICAgICAgICBjYWNoZWREZXNjID0gJmNvbnRyb2xGb250OworICAgICAgICAgICAg
aWYgKCFjb250cm9sRm9udC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAgIGZvbnQg
PSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRy
b2xTaXplOk5TUmVndWxhckNvbnRyb2xTaXplXV07CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhY2hlZERlc2MgPSAmc3lzdGVtRm9udDsKKyAgICAg
ICAgICAgIGlmICghc3lzdGVtRm9udC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAg
IGZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZV1d
OworICAgIH0KKworICAgIGlmIChmb250KSB7CisgICAgICAgIE5TRm9udE1hbmFnZXIgKmZvbnRN
YW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdOworICAgICAgICBjYWNo
ZWREZXNjLT5zZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0
R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICAgICAgY2FjaGVk
RGVzYy0+Zmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoW2ZvbnQgZmFtaWx5TmFtZV0pOworICAgICAg
ICBjYWNoZWREZXNjLT5zZXRTcGVjaWZpZWRTaXplKFtmb250IHBvaW50U2l6ZV0pOworICAgICAg
ICBjYWNoZWREZXNjLT5zZXRXZWlnaHQodG9Gb250V2VpZ2h0KFtmb250TWFuYWdlciB3ZWlnaHRP
ZkZvbnQ6Zm9udF0pKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0SXRhbGljKFtmb250TWFuYWdl
ciB0cmFpdHNPZkZvbnQ6Zm9udF0gJiBOU0l0YWxpY0ZvbnRNYXNrKTsKKyAgICB9CisgICAgZm9u
dERlc2NyaXB0aW9uID0gKmNhY2hlZERlc2M7Cit9CisKK3N0YXRpYyBSR0JBMzIgY29udmVydE5T
Q29sb3JUb0NvbG9yKE5TQ29sb3IgKmNvbG9yKQoreworICAgIE5TQ29sb3IgKmNvbG9ySW5Db2xv
clNwYWNlID0gW2NvbG9yIGNvbG9yVXNpbmdDb2xvclNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9y
U3BhY2VdOworICAgIGlmIChjb2xvckluQ29sb3JTcGFjZSkgeworICAgICAgICBzdGF0aWMgY29u
c3QgZG91YmxlIHNjYWxlRmFjdG9yID0gbmV4dGFmdGVyKDI1Ni4wLCAwLjApOworICAgICAgICBy
ZXR1cm4gbWFrZVJHQihzdGF0aWNfY2FzdDxpbnQ+KHNjYWxlRmFjdG9yICogW2NvbG9ySW5Db2xv
clNwYWNlIHJlZENvbXBvbmVudF0pLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzY2Fs
ZUZhY3RvciAqIFtjb2xvckluQ29sb3JTcGFjZSBncmVlbkNvbXBvbmVudF0pLAorICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8aW50PihzY2FsZUZhY3RvciAqIFtjb2xvckluQ29sb3JTcGFjZSBibHVl
Q29tcG9uZW50XSkpOworICAgIH0KKworICAgIC8vIFRoaXMgY29udmVyc2lvbiBhYm92ZSBjYW4g
ZmFpbCBpZiB0aGUgTlNDb2xvciBpbiBxdWVzdGlvbiBpcyBhbiBOU1BhdHRlcm5Db2xvcgorICAg
IC8vIChhcyBtYW55IHN5c3RlbSBjb2xvcnMgYXJlKS4gVGhlc2UgY29sb3JzIGFyZSBhY3R1YWxs
eSBhIHJlcGVhdGluZyBwYXR0ZXJuCisgICAgLy8gbm90IGp1c3QgYSBzb2xpZCBjb2xvci4gVG8g
d29yayBhcm91bmQgdGhpcyB3ZSBzaW1wbHkgZHJhdyBhIDF4MSBpbWFnZSBvZgorICAgIC8vIHRo
ZSBjb2xvciBhbmQgdXNlIHRoYXQgcGl4ZWwncyBjb2xvci4gSXQgbWlnaHQgYmUgYmV0dGVyIHRv
IHVzZSBhbiBhdmVyYWdlIG9mCisgICAgLy8gdGhlIGNvbG9ycyBpbiB0aGUgcGF0dGVybiBpbnN0
ZWFkLgorICAgIE5TQml0bWFwSW1hZ2VSZXAgKm9mZnNjcmVlblJlcCA9IFtbTlNCaXRtYXBJbWFn
ZVJlcCBhbGxvY10gaW5pdFdpdGhCaXRtYXBEYXRhUGxhbmVzOm5pbAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBwaXhlbHNXaWRlOjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzSGlnaDoxCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGU6OAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlclBp
eGVsOjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBbHBoYTpZRVMKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpc1BsYW5hcjpOTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VOYW1lOk5TRGV2
aWNlUkdCQ29sb3JTcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyUm93OjQKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJpdHNQZXJQaXhlbDozMl07CisKKyAgICBbTlNHcmFwaGljc0NvbnRleHQg
c2F2ZUdyYXBoaWNzU3RhdGVdOworICAgIFtOU0dyYXBoaWNzQ29udGV4dCBzZXRDdXJyZW50Q29u
dGV4dDpbTlNHcmFwaGljc0NvbnRleHQgZ3JhcGhpY3NDb250ZXh0V2l0aEJpdG1hcEltYWdlUmVw
Om9mZnNjcmVlblJlcF1dOworICAgIE5TRXJhc2VSZWN0KE5TTWFrZVJlY3QoMCwgMCwgMSwgMSkp
OworICAgIFtjb2xvciBkcmF3U3dhdGNoSW5SZWN0Ok5TTWFrZVJlY3QoMCwgMCwgMSwgMSldOwor
ICAgIFtOU0dyYXBoaWNzQ29udGV4dCByZXN0b3JlR3JhcGhpY3NTdGF0ZV07CisKKyAgICBOU1VJ
bnRlZ2VyIHBpeGVsWzRdOworICAgIFtvZmZzY3JlZW5SZXAgZ2V0UGl4ZWw6cGl4ZWwgYXRYOjAg
eTowXTsKKworICAgIFtvZmZzY3JlZW5SZXAgcmVsZWFzZV07CisKKyAgICByZXR1cm4gbWFrZVJH
QihwaXhlbFswXSwgcGl4ZWxbMV0sIHBpeGVsWzJdKTsKK30KKworc3RhdGljIFJHQkEzMiBtZW51
QmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBOU0JpdG1hcEltYWdlUmVwICpvZmZzY3JlZW5SZXAg
PSBbW05TQml0bWFwSW1hZ2VSZXAgYWxsb2NdIGluaXRXaXRoQml0bWFwRGF0YVBsYW5lczpuaWwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzV2lkZToxCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBp
eGVsc0hpZ2g6MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlOjgKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNhbXBsZXNQZXJQaXhlbDo0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxwaGE6WUVT
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFuYXI6Tk8KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xv
clNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRl
c1BlclJvdzo0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyUGl4ZWw6MzJdOworCisgICAgQ0dD
b250ZXh0UmVmIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDR0NvbnRleHRSZWY+KFtbTlNHcmFwaGlj
c0NvbnRleHQgZ3JhcGhpY3NDb250ZXh0V2l0aEJpdG1hcEltYWdlUmVwOm9mZnNjcmVlblJlcF0g
Z3JhcGhpY3NQb3J0XSk7CisgICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RNYWtlKDAsIDAsIDEsIDEp
OworICAgIEhJVGhlbWVNZW51RHJhd0luZm8gZHJhd0luZm87CisgICAgZHJhd0luZm8udmVyc2lv
biA9ICAwOworICAgIGRyYXdJbmZvLm1lbnVUeXBlID0ga1RoZW1lTWVudVR5cGVQb3BVcDsKKyAg
ICBISVRoZW1lRHJhd01lbnVCYWNrZ3JvdW5kKCZyZWN0LCAmZHJhd0luZm8sIGNvbnRleHQsIGtI
SVRoZW1lT3JpZW50YXRpb25JbnZlcnRlZCk7CisKKyAgICBOU1VJbnRlZ2VyIHBpeGVsWzRdOwor
ICAgIFtvZmZzY3JlZW5SZXAgZ2V0UGl4ZWw6cGl4ZWwgYXRYOjAgeTowXTsKKworICAgIFtvZmZz
Y3JlZW5SZXAgcmVsZWFzZV07CisKKyAgICByZXR1cm4gbWFrZVJHQihwaXhlbFswXSwgcGl4ZWxb
MV0sIHBpeGVsWzJdKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1D
b2xvcnNEaWRDaGFuZ2UoKQoreworICAgIG1fc3lzdGVtQ29sb3JDYWNoZS5jbGVhcigpOworICAg
IFJlbmRlclRoZW1lOjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOworfQorCitDb2xvciBSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0Cit7Cisg
ICAgeworICAgICAgICBIYXNoTWFwPGludCwgUkdCQTMyPjo6aXRlcmF0b3IgaXQgPSBtX3N5c3Rl
bUNvbG9yQ2FjaGUuZmluZChjc3NWYWx1ZUlkKTsKKyAgICAgICAgaWYgKGl0ICE9IG1fc3lzdGVt
Q29sb3JDYWNoZS5lbmQoKSkKKyAgICAgICAgICAgIHJldHVybiBpdC0+dmFsdWU7CisgICAgfQor
CisgICAgQ29sb3IgY29sb3I7CisgICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7CisgICAgICAgIGNh
c2UgQ1NTVmFsdWVBY3RpdmVib3JkZXI6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0Nv
bG9yVG9Db2xvcihbTlNDb2xvciBrZXlib2FyZEZvY3VzSW5kaWNhdG9yQ29sb3JdKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlQWN0aXZlY2FwdGlvbjoKKyAgICAg
ICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0ZyYW1l
VGV4dENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUFw
cHdvcmtzcGFjZToKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtO
U0NvbG9yIGhlYWRlckNvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBD
U1NWYWx1ZUJhY2tncm91bmQ6CisgICAgICAgICAgICAvLyBVc2UgdGhlbWUgaW5kZXBlbmRlbnQg
ZGVmYXVsdAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVCdXR0b25m
YWNlOgorICAgICAgICAgICAgLy8gV2UgdXNlIHRoaXMgdmFsdWUgaW5zdGVhZCBvZiBOU0NvbG9y
J3MgY29udHJvbENvbG9yIHRvIGF2b2lkIHdlYnNpdGUgaW5jb21wYXRpYmlsaXRpZXMuCisgICAg
ICAgICAgICAvLyBXZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIE5TQ29sb3Ig
aW4gZnV0dXJlLgorICAgICAgICAgICAgY29sb3IgPSAweEZGQzBDMEMwOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVCdXR0b25oaWdobGlnaHQ6CisgICAgICAgICAg
ICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sSGlnaGxpZ2h0
Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlQnV0dG9u
c2hhZG93OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29s
b3IgY29udHJvbFNoYWRvd0NvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBDU1NWYWx1ZUJ1dHRvbnRleHQ6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9y
VG9Db2xvcihbTlNDb2xvciBjb250cm9sVGV4dENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBDU1NWYWx1ZUNhcHRpb250ZXh0OgorICAgICAgICAgICAgY29sb3IgPSBj
b252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgdGV4dENvbG9yXSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUdyYXl0ZXh0OgorICAgICAgICAgICAgY29sb3Ig
PSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgZGlzYWJsZWRDb250cm9sVGV4dENvbG9y
XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUhpZ2hsaWdodDoK
KyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNlbGVj
dGVkVGV4dEJhY2tncm91bmRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQ1NTVmFsdWVIaWdobGlnaHR0ZXh0OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlND
b2xvclRvQ29sb3IoW05TQ29sb3Igc2VsZWN0ZWRUZXh0Q29sb3JdKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVib3JkZXI6CisgICAgICAgICAgICBj
b2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sQmFja2dyb3VuZENv
bG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZl
Y2FwdGlvbjoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0Nv
bG9yIGNvbnRyb2xCYWNrZ3JvdW5kQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVjYXB0aW9udGV4dDoKKyAgICAgICAgICAgIGNvbG9yID0g
Y29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVJbmZvYmFja2dyb3VuZDoKKyAgICAgICAgICAg
IC8vIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgTlNDb2xvciBmb3IgdGhpcyBzbyB3ZSB1c2Ug
YSBoYXJkIGNvZGVkIHZhbHVlLgorICAgICAgICAgICAgY29sb3IgPSAweEZGRkJGQ0M1OworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVJbmZvdGV4dDoKKyAgICAgICAg
ICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVNZW51OgorICAgICAgICAg
ICAgY29sb3IgPSBtZW51QmFja2dyb3VuZENvbG9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBDU1NWYWx1ZU1lbnV0ZXh0OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0
TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igc2VsZWN0ZWRNZW51SXRlbVRleHRDb2xvcl0pOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVTY3JvbGxiYXI6CisgICAgICAg
ICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzY3JvbGxCYXJDb2xv
cl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUZXh0OgorICAg
ICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgdGV4dENvbG9y
XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGRhcmtz
aGFkb3c6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xv
ciBjb250cm9sRGFya1NoYWRvd0NvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBDU1NWYWx1ZVRocmVlZHNoYWRvdzoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5T
Q29sb3JUb0NvbG9yKFtOU0NvbG9yIHNoYWRvd0NvbG9yXSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGZhY2U6CisgICAgICAgICAgICAvLyBXZSB1c2Ug
dGhpcyB2YWx1ZSBpbnN0ZWFkIG9mIE5TQ29sb3IncyBjb250cm9sQ29sb3IgdG8gYXZvaWQgd2Vi
c2l0ZSBpbmNvbXBhdGliaWxpdGllcy4KKyAgICAgICAgICAgIC8vIFdlIG1heSB3YW50IHRvIGNo
YW5nZSB0aGlzIHRvIHVzZSB0aGUgTlNDb2xvciBpbiBmdXR1cmUuCisgICAgICAgICAgICBjb2xv
ciA9IDB4RkZDMEMwQzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1
ZVRocmVlZGhpZ2hsaWdodDoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0Nv
bG9yKFtOU0NvbG9yIGhpZ2hsaWdodENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBDU1NWYWx1ZVRocmVlZGxpZ2h0c2hhZG93OgorICAgICAgICAgICAgY29sb3IgPSBj
b252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbExpZ2h0SGlnaGxpZ2h0Q29sb3Jd
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0Rm9jdXNS
aW5nQ29sb3I6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlND
b2xvciBrZXlib2FyZEZvY3VzSW5kaWNhdG9yQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIENTU1ZhbHVlV2luZG93OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0
TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igd2luZG93QmFja2dyb3VuZENvbG9yXSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdpbmRvd2ZyYW1lOgorICAgICAgICAg
ICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igd2luZG93RnJhbWVDb2xv
cl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3d0ZXh0
OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igd2lu
ZG93RnJhbWVUZXh0Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlm
ICghY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBjb2xvciA9IFJlbmRlclRoZW1lOjpzeXN0ZW1D
b2xvcihjc3NWYWx1ZUlkKTsKKworICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIG1f
c3lzdGVtQ29sb3JDYWNoZS5zZXQoY3NzVmFsdWVJZCwgY29sb3IucmdiKCkpOworCisgICAgcmV0
dXJuIGNvbG9yOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjp1c2VzVGVzdE1vZGVG
b2N1c1JpbmdDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdlYkNvcmU6OnVzZXNUZXN0TW9k
ZUZvY3VzUmluZ0NvbG9yKCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmlzQ29u
dHJvbFN0eWxlZChjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEJvcmRlckRhdGEmIGJv
cmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxsTGF5
ZXImIGJhY2tncm91bmQsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3IpIGNvbnN0Cit7Cisg
ICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gVGV4dEZpZWxkUGFydCB8fCBzdHlsZS0+YXBw
ZWFyYW5jZSgpID09IFRleHRBcmVhUGFydCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IExpc3Ri
b3hQYXJ0KQorICAgICAgICByZXR1cm4gc3R5bGUtPmJvcmRlcigpICE9IGJvcmRlcjsKKworICAg
IC8vIEZJWE1FOiBUaGlzIGlzIGhvcnJpYmxlLCBidXQgdGhlcmUgaXMgbm90IG11Y2ggZWxzZSB0
aGF0IGNhbiBiZSBkb25lLiAgTWVudSBsaXN0cyBjYW5ub3QgZHJhdyBwcm9wZXJseSB3aGVuCisg
ICAgLy8gc2NhbGVkLiAgVGhleSBjYW4ndCByZWFsbHkgZHJhdyBwcm9wZXJseSB3aGVuIHRyYW5z
Zm9ybWVkIGVpdGhlci4gIFdlIGNhbid0IGRldGVjdCB0aGUgdHJhbnNmb3JtIGNhc2UgYXQgc3R5
bGUKKyAgICAvLyBhZGp1c3RtZW50IHRpbWUgc28gdGhhdCB3aWxsIGp1c3QgaGF2ZSB0byBzdGF5
IGJyb2tlbi4gIFdlIGNhbiBob3dldmVyIGRldGVjdCB0aGF0IHdlJ3JlIHpvb21pbmcuICBJZiB6
b29taW5nCisgICAgLy8gaXMgaW4gZWZmZWN0IHdlIHRyZWF0IGl0IGxpa2UgdGhlIGNvbnRyb2wg
aXMgc3R5bGVkLgorICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCAm
JiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpICE9IDEuMGYpCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgcmV0dXJuIFJlbmRlclRoZW1lOjppc0NvbnRyb2xTdHlsZWQoc3R5bGUsIGJvcmRlciwg
YmFja2dyb3VuZCwgYmFja2dyb3VuZENvbG9yKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1No
YXJlZDo6YWRqdXN0UmVwYWludFJlY3QoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBJbnRSZWN0JiBy
KQoreworICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisK
KyNpZiBVU0UoTkVXX1RIRU1FKQorICAgIHN3aXRjaCAocGFydCkgeworICAgICAgICBjYXNlIENo
ZWNrYm94UGFydDoKKyAgICAgICAgY2FzZSBSYWRpb1BhcnQ6CisgICAgICAgIGNhc2UgUHVzaEJ1
dHRvblBhcnQ6CisgICAgICAgIGNhc2UgU3F1YXJlQnV0dG9uUGFydDoKKyAgICAgICAgY2FzZSBE
ZWZhdWx0QnV0dG9uUGFydDoKKyAgICAgICAgY2FzZSBCdXR0b25QYXJ0OgorICAgICAgICBjYXNl
IElubmVyU3BpbkJ1dHRvblBhcnQ6CisgICAgICAgICAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmFk
anVzdFJlcGFpbnRSZWN0KG8sIHIpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJl
YWs7CisgICAgfQorI2VuZGlmCisKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5l
ZmZlY3RpdmVab29tKCk7CisKKyAgICBpZiAocGFydCA9PSBNZW51bGlzdFBhcnQpIHsKKyAgICAg
ICAgc2V0UG9wdXBCdXR0b25DZWxsU3RhdGUobywgcik7CisgICAgICAgIEludFNpemUgc2l6ZSA9
IHBvcHVwQnV0dG9uU2l6ZXMoKVtbcG9wdXBCdXR0b24oKSBjb250cm9sU2l6ZV1dOworICAgICAg
ICBzaXplLnNldEhlaWdodChzaXplLmhlaWdodCgpICogem9vbUxldmVsKTsKKyAgICAgICAgc2l6
ZS5zZXRXaWR0aChyLndpZHRoKCkpOworICAgICAgICByID0gaW5mbGF0ZVJlY3Qociwgc2l6ZSwg
cG9wdXBCdXR0b25NYXJnaW5zKCksIHpvb21MZXZlbCk7CisgICAgfQorfQorCitJbnRSZWN0IFJl
bmRlclRoZW1lTWFjU2hhcmVkOjppbmZsYXRlUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJ
bnRTaXplJiBzaXplLCBjb25zdCBpbnQqIG1hcmdpbnMsIGZsb2F0IHpvb21MZXZlbCkgY29uc3QK
K3sKKyAgICAvLyBPbmx5IGRvIHRoZSBpbmZsYXRpb24gaWYgdGhlIGF2YWlsYWJsZSB3aWR0aC9o
ZWlnaHQgYXJlIHRvbyBzbWFsbC4gIE90aGVyd2lzZSB0cnkgdG8KKyAgICAvLyBmaXQgdGhlIGds
b3cvY2hlY2sgc3BhY2UgaW50byB0aGUgYXZhaWxhYmxlIGJveCdzIHdpZHRoL2hlaWdodC4KKyAg
ICBpbnQgd2lkdGhEZWx0YSA9IHIud2lkdGgoKSAtIChzaXplLndpZHRoKCkgKyBtYXJnaW5zW2xl
ZnRNYXJnaW5dICogem9vbUxldmVsICsgbWFyZ2luc1tyaWdodE1hcmdpbl0gKiB6b29tTGV2ZWwp
OworICAgIGludCBoZWlnaHREZWx0YSA9IHIuaGVpZ2h0KCkgLSAoc2l6ZS5oZWlnaHQoKSArIG1h
cmdpbnNbdG9wTWFyZ2luXSAqIHpvb21MZXZlbCArIG1hcmdpbnNbYm90dG9tTWFyZ2luXSAqIHpv
b21MZXZlbCk7CisgICAgSW50UmVjdCByZXN1bHQocik7CisgICAgaWYgKHdpZHRoRGVsdGEgPCAw
KSB7CisgICAgICAgIHJlc3VsdC5zZXRYKHJlc3VsdC54KCkgLSBtYXJnaW5zW2xlZnRNYXJnaW5d
ICogem9vbUxldmVsKTsKKyAgICAgICAgcmVzdWx0LnNldFdpZHRoKHJlc3VsdC53aWR0aCgpIC0g
d2lkdGhEZWx0YSk7CisgICAgfQorICAgIGlmIChoZWlnaHREZWx0YSA8IDApIHsKKyAgICAgICAg
cmVzdWx0LnNldFkocmVzdWx0LnkoKSAtIG1hcmdpbnNbdG9wTWFyZ2luXSAqIHpvb21MZXZlbCk7
CisgICAgICAgIHJlc3VsdC5zZXRIZWlnaHQocmVzdWx0LmhlaWdodCgpIC0gaGVpZ2h0RGVsdGEp
OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitGbG9hdFJlY3QgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OmNvbnZlcnRUb1BhaW50aW5nUmVjdChjb25zdCBSZW5kZXJPYmplY3QqIGlucHV0
UmVuZGVyZXIsIGNvbnN0IFJlbmRlck9iamVjdCogcGFydFJlbmRlcmVyLCBjb25zdCBGbG9hdFJl
Y3QmIGlucHV0UmVjdCwgY29uc3QgSW50UmVjdCYgcikgY29uc3QKK3sKKyAgICBGbG9hdFJlY3Qg
cGFydFJlY3QoaW5wdXRSZWN0KTsKKworICAgIC8vIENvbXB1dGUgYW4gb2Zmc2V0IGJldHdlZW4g
dGhlIHBhcnQgcmVuZGVyZXIgYW5kIHRoZSBpbnB1dCByZW5kZXJlcgorICAgIEZsb2F0U2l6ZSBv
ZmZzZXRGcm9tSW5wdXRSZW5kZXJlcjsKKyAgICBjb25zdCBSZW5kZXJPYmplY3QqIHJlbmRlcmVy
ID0gcGFydFJlbmRlcmVyOworICAgIHdoaWxlIChyZW5kZXJlciAmJiByZW5kZXJlciAhPSBpbnB1
dFJlbmRlcmVyKSB7CisgICAgICAgIFJlbmRlck9iamVjdCogY29udGFpbmluZ1JlbmRlcmVyID0g
cmVuZGVyZXItPmNvbnRhaW5lcigpOworICAgICAgICBvZmZzZXRGcm9tSW5wdXRSZW5kZXJlciAt
PSByb3VuZGVkSW50U2l6ZShyZW5kZXJlci0+b2Zmc2V0RnJvbUNvbnRhaW5lcihjb250YWluaW5n
UmVuZGVyZXIsIExheW91dFBvaW50KCkpKTsKKyAgICAgICAgcmVuZGVyZXIgPSBjb250YWluaW5n
UmVuZGVyZXI7CisgICAgfQorICAgIC8vIElmIHRoZSBpbnB1dCByZW5kZXJlciB3YXMgbm90IGEg
Y29udGFpbmVyLCBzb21ldGhpbmcgd2VudCB3cm9uZworICAgIEFTU0VSVChyZW5kZXJlciA9PSBp
bnB1dFJlbmRlcmVyKTsKKyAgICAvLyBNb3ZlIHRoZSByZWN0IGludG8gcGFydFJlbmRlcmVyJ3Mg
Y29vcmRzCisgICAgcGFydFJlY3QubW92ZShvZmZzZXRGcm9tSW5wdXRSZW5kZXJlcik7CisgICAg
Ly8gQWNjb3VudCBmb3IgdGhlIGxvY2FsIGRyYXdpbmcgb2Zmc2V0ICh0eCwgdHkpCisgICAgcGFy
dFJlY3QubW92ZShyLngoKSwgci55KCkpOworCisgICAgcmV0dXJuIHBhcnRSZWN0OworfQorCit2
b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjp1cGRhdGVDaGVja2VkU3RhdGUoTlNDZWxsKiBjZWxs
LCBjb25zdCBSZW5kZXJPYmplY3QqIG8pCit7CisgICAgYm9vbCBvbGRJbmRldGVybWluYXRlID0g
W2NlbGwgc3RhdGVdID09IE5TTWl4ZWRTdGF0ZTsKKyAgICBib29sIGluZGV0ZXJtaW5hdGUgPSBp
c0luZGV0ZXJtaW5hdGUobyk7CisgICAgYm9vbCBjaGVja2VkID0gaXNDaGVja2VkKG8pOworCisg
ICAgaWYgKG9sZEluZGV0ZXJtaW5hdGUgIT0gaW5kZXRlcm1pbmF0ZSkgeworICAgICAgICBbY2Vs
bCBzZXRTdGF0ZTppbmRldGVybWluYXRlID8gTlNNaXhlZFN0YXRlIDogKGNoZWNrZWQgPyBOU09u
U3RhdGUgOiBOU09mZlN0YXRlKV07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29s
IG9sZENoZWNrZWQgPSBbY2VsbCBzdGF0ZV0gPT0gTlNPblN0YXRlOworICAgIGlmIChjaGVja2Vk
ICE9IG9sZENoZWNrZWQpCisgICAgICAgIFtjZWxsIHNldFN0YXRlOmNoZWNrZWQgPyBOU09uU3Rh
dGUgOiBOU09mZlN0YXRlXTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dXBkYXRl
RW5hYmxlZFN0YXRlKE5TQ2VsbCogY2VsbCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvKQoreworICAg
IGJvb2wgb2xkRW5hYmxlZCA9IFtjZWxsIGlzRW5hYmxlZF07CisgICAgYm9vbCBlbmFibGVkID0g
aXNFbmFibGVkKG8pOworICAgIGlmIChlbmFibGVkICE9IG9sZEVuYWJsZWQpCisgICAgICAgIFtj
ZWxsIHNldEVuYWJsZWQ6ZW5hYmxlZF07Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OnVwZGF0ZUZvY3VzZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykK
K3sKKyAgICBib29sIG9sZEZvY3VzZWQgPSBbY2VsbCBzaG93c0ZpcnN0UmVzcG9uZGVyXTsKKyAg
ICBib29sIGZvY3VzZWQgPSBpc0ZvY3VzZWQobykgJiYgby0+c3R5bGUoKS0+b3V0bGluZVN0eWxl
SXNBdXRvKCk7CisgICAgaWYgKGZvY3VzZWQgIT0gb2xkRm9jdXNlZCkKKyAgICAgICAgW2NlbGwg
c2V0U2hvd3NGaXJzdFJlc3BvbmRlcjpmb2N1c2VkXTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6dXBkYXRlUHJlc3NlZFN0YXRlKE5TQ2VsbCogY2VsbCwgY29uc3QgUmVuZGVyT2Jq
ZWN0KiBvKQoreworICAgIGJvb2wgb2xkUHJlc3NlZCA9IFtjZWxsIGlzSGlnaGxpZ2h0ZWRdOwor
ICAgIGJvb2wgcHJlc3NlZCA9IChvLT5ub2RlKCkgJiYgby0+bm9kZSgpLT5hY3RpdmUoKSk7Cisg
ICAgaWYgKHByZXNzZWQgIT0gb2xkUHJlc3NlZCkKKyAgICAgICAgW2NlbGwgc2V0SGlnaGxpZ2h0
ZWQ6cHJlc3NlZF07Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmNvbnRyb2xTdXBw
b3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKK3sKKyAgICAvLyBBbiBhbHRl
cm5hdGUgd2F5IHRvIGltcGxlbWVudCB0aGlzIHdvdWxkIGJlIHRvIGdldCB0aGUgYXBwcm9wcmlh
dGUgY2VsbCBvYmplY3QKKyAgICAvLyBhbmQgY2FsbCB0aGUgcHJpdmF0ZSBfbmVlZFJlZHJhd09u
V2luZG93Q2hhbmdlZEtleVN0YXRlIG1ldGhvZC4gQW4gYWR2YW50YWdlIG9mCisgICAgLy8gdGhh
dCB3b3VsZCBiZSB0aGF0IHdlIHdvdWxkIG1hdGNoIEFwcEtpdCBiZWhhdmlvciBtb3JlIGNsb3Nl
bHksIGJ1dCBhIGRpc2FkdmFudGFnZQorICAgIC8vIHdvdWxkIGJlIHRoYXQgd2Ugd291bGQgcmVs
eSBvbiBhbiBBcHBLaXQgU1BJIG1ldGhvZC4KKworICAgIGlmICghaXNFbmFibGVkKG8pKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDaGVja2JveGVzIG9ubHkgaGF2ZSB0aW50IHdo
ZW4gY2hlY2tlZC4KKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IENoZWNrYm94
UGFydCkKKyAgICAgICAgcmV0dXJuIGlzQ2hlY2tlZChvKTsKKworICAgIC8vIEZvciBub3cgYXNz
dW1lIG90aGVyIGNvbnRyb2xzIGhhdmUgdGludCBpZiBlbmFibGVkLgorICAgIHJldHVybiB0cnVl
OworfQorCitOU0NvbnRyb2xTaXplIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpjb250cm9sU2l6ZUZv
ckZvbnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBmb250U2l6ZSA9IHN0
eWxlLT5mb250U2l6ZSgpOworICAgIGlmIChmb250U2l6ZSA+PSAxNikKKyAgICAgICAgcmV0dXJu
IE5TUmVndWxhckNvbnRyb2xTaXplOworICAgIGlmIChmb250U2l6ZSA+PSAxMSkKKyAgICAgICAg
cmV0dXJuIE5TU21hbGxDb250cm9sU2l6ZTsKKyAgICByZXR1cm4gTlNNaW5pQ29udHJvbFNpemU7
Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNldENvbnRyb2xTaXplKE5TQ2VsbCog
Y2VsbCwgY29uc3QgSW50U2l6ZSogc2l6ZXMsIGNvbnN0IEludFNpemUmIG1pblNpemUsIGZsb2F0
IHpvb21MZXZlbCkKK3sKKyAgICBOU0NvbnRyb2xTaXplIHNpemU7CisgICAgaWYgKG1pblNpemUu
d2lkdGgoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TUmVndWxhckNvbnRyb2xTaXplXS53
aWR0aCgpICogem9vbUxldmVsKSAmJgorICAgICAgICBtaW5TaXplLmhlaWdodCgpID49IHN0YXRp
Y19jYXN0PGludD4oc2l6ZXNbTlNSZWd1bGFyQ29udHJvbFNpemVdLmhlaWdodCgpICogem9vbUxl
dmVsKSkKKyAgICAgICAgc2l6ZSA9IE5TUmVndWxhckNvbnRyb2xTaXplOworICAgIGVsc2UgaWYg
KG1pblNpemUud2lkdGgoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TU21hbGxDb250cm9s
U2l6ZV0ud2lkdGgoKSAqIHpvb21MZXZlbCkgJiYKKyAgICAgICAgICAgICBtaW5TaXplLmhlaWdo
dCgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNTbWFsbENvbnRyb2xTaXplXS5oZWlnaHQo
KSAqIHpvb21MZXZlbCkpCisgICAgICAgIHNpemUgPSBOU1NtYWxsQ29udHJvbFNpemU7CisgICAg
ZWxzZQorICAgICAgICBzaXplID0gTlNNaW5pQ29udHJvbFNpemU7CisgICAgaWYgKHNpemUgIT0g
W2NlbGwgY29udHJvbFNpemVdKSAvLyBPbmx5IHVwZGF0ZSBpZiB3ZSBoYXZlIHRvLCBzaW5jZSBB
cHBLaXQgZG9lcyB3b3JrIGV2ZW4gaWYgdGhlIHNpemUgaXMgdGhlIHNhbWUuCisgICAgICAgIFtj
ZWxsIHNldENvbnRyb2xTaXplOnNpemVdOworfQorCitJbnRTaXplIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzaXplRm9yRm9udChSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEludFNpemUqIHNpemVz
KSBjb25zdAoreworICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpICE9IDEuMGYpIHsKKyAg
ICAgICAgSW50U2l6ZSByZXN1bHQgPSBzaXplc1tjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpXTsK
KyAgICAgICAgcmV0dXJuIEludFNpemUocmVzdWx0LndpZHRoKCkgKiBzdHlsZS0+ZWZmZWN0aXZl
Wm9vbSgpLCByZXN1bHQuaGVpZ2h0KCkgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICB9
CisgICAgcmV0dXJuIHNpemVzW2NvbnRyb2xTaXplRm9yRm9udChzdHlsZSldOworfQorCitJbnRT
aXplIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzaXplRm9yU3lzdGVtRm9udChSZW5kZXJTdHlsZSog
c3R5bGUsIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdAoreworICAgIGlmIChzdHlsZS0+ZWZm
ZWN0aXZlWm9vbSgpICE9IDEuMGYpIHsKKyAgICAgICAgSW50U2l6ZSByZXN1bHQgPSBzaXplc1tj
b250cm9sU2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUpXTsKKyAgICAgICAgcmV0dXJuIEludFNpemUo
cmVzdWx0LndpZHRoKCkgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpLCByZXN1bHQuaGVpZ2h0KCkg
KiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemVzW2NvbnRy
b2xTaXplRm9yU3lzdGVtRm9udChzdHlsZSldOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzZXRTaXplRnJvbUZvbnQoUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBJbnRTaXplKiBz
aXplcykgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogQ2hlY2sgaXMgZmxhd2VkLCBzaW5jZSBpdCBk
b2Vzbid0IHRha2UgbWluLXdpZHRoL21heC13aWR0aCBpbnRvIGFjY291bnQuCisgICAgSW50U2l6
ZSBzaXplID0gc2l6ZUZvckZvbnQoc3R5bGUsIHNpemVzKTsKKyAgICBpZiAoc3R5bGUtPndpZHRo
KCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiBzaXplLndpZHRoKCkgPiAwKQorICAgICAgICBzdHls
ZS0+c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSwgRml4ZWQpKTsKKyAgICBpZiAoc3R5bGUt
PmhlaWdodCgpLmlzQXV0bygpICYmIHNpemUuaGVpZ2h0KCkgPiAwKQorICAgICAgICBzdHlsZS0+
c2V0SGVpZ2h0KExlbmd0aChzaXplLmhlaWdodCgpLCBGaXhlZCkpOworfQorCit2b2lkIFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpzZXRGb250RnJvbUNvbnRyb2xTaXplKFN0eWxlUmVzb2x2ZXIqLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIE5TQ29udHJvbFNpemUgY29udHJvbFNpemUpIGNvbnN0Cit7Cisg
ICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKKyAgICBmb250RGVzY3JpcHRpb24u
c2V0SXNBYnNvbHV0ZVNpemUodHJ1ZSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkoRm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWlseSk7CisKKyAgICBOU0ZvbnQqIGZvbnQg
PSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRy
b2xTaXplOmNvbnRyb2xTaXplXV07CisgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCku
c2V0RmFtaWx5KFtmb250IGZhbWlseU5hbWVdKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29t
cHV0ZWRTaXplKFtmb250IHBvaW50U2l6ZV0gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAg
ICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShbZm9udCBwb2ludFNpemVdICogc3R5
bGUtPmVmZmVjdGl2ZVpvb20oKSk7CisKKyAgICAvLyBSZXNldCBsaW5lIGhlaWdodAorICAgIHN0
eWxlLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKwor
ICAgIGlmIChzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbikpCisgICAg
ICAgIHN0eWxlLT5mb250KCkudXBkYXRlKDApOworfQorCitOU0NvbnRyb2xTaXplIFJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpjb250cm9sU2l6ZUZvclN5c3RlbUZvbnQoUmVuZGVyU3R5bGUqIHN0eWxl
KSBjb25zdAoreworICAgIGludCBmb250U2l6ZSA9IHN0eWxlLT5mb250U2l6ZSgpOworICAgIGlm
IChmb250U2l6ZSA+PSBbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6TlNSZWd1
bGFyQ29udHJvbFNpemVdKQorICAgICAgICByZXR1cm4gTlNSZWd1bGFyQ29udHJvbFNpemU7Cisg
ICAgaWYgKGZvbnRTaXplID49IFtOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6ZTpO
U1NtYWxsQ29udHJvbFNpemVdKQorICAgICAgICByZXR1cm4gTlNTbWFsbENvbnRyb2xTaXplOwor
ICAgIHJldHVybiBOU01pbmlDb250cm9sU2l6ZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1No
YXJlZDo6cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0Nv
bnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKworI2lmIF9fTUFDX09TX1hf
VkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gMTA3MAorICAgIGJvb2wgdXNlTlNUZXh0RmllbGRDZWxs
ID0gby0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpCisgICAgICAgICYmIG8tPnN0eWxlKCktPnZp
c2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcikgPT0gQ29sb3I6
OndoaXRlCisgICAgICAgICYmICFvLT5zdHlsZSgpLT5oYXNCYWNrZ3JvdW5kSW1hZ2UoKTsKKwor
ICAgIC8vIFdlIGRvIG5vdCB1c2UgTlNUZXh0RmllbGRDZWxsIHRvIGRyYXcgc3R5bGVkIHRleHQg
ZmllbGRzIG9uIExpb24gYW5kIFNub3dMZW9wYXJkIGJlY2F1c2UKKyAgICAvLyB0aGVyZSBhcmUg
YSBudW1iZXIgb2YgYnVncyBvbiB0aG9zZSBwbGF0Zm9ybXMgdGhhdCByZXF1aXJlIE5TVGV4dEZp
ZWxkQ2VsbCB0byBiZSBpbiBjaGFyZ2UKKyAgICAvLyBvZiBwYWludGluZyBpdHMgb3duIGJhY2tn
cm91bmQuIFdlIG5lZWQgV2ViQ29yZSB0byBwYWludCBzdHlsZWQgYmFja2dyb3VuZHMsIHNvIHdl
J2xsIHVzZQorICAgIC8vIHRoaXMgV2ViQ29yZVN5c3RlbUludGVyZmFjZSBmdW5jdGlvbiBpbnN0
ZWFkLgorICAgIGlmICghdXNlTlNUZXh0RmllbGRDZWxsKSB7CisgICAgICAgIHdrRHJhd0JlemVs
ZWRUZXh0RmllbGRDZWxsKHIsIGlzRW5hYmxlZChvKSAmJiAhaXNSZWFkT25seUNvbnRyb2wobykp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICBOU1RleHRGaWVs
ZENlbGwgKnRleHRGaWVsZCA9IHRoaXMtPnRleHRGaWVsZCgpOworCisgICAgR3JhcGhpY3NDb250
ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisKKyAgICBbdGV4
dEZpZWxkIHNldEVuYWJsZWQ6KGlzRW5hYmxlZChvKSAmJiAhaXNSZWFkT25seUNvbnRyb2wobykp
XTsKKyAgICBbdGV4dEZpZWxkIGRyYXdXaXRoRnJhbWU6TlNSZWN0KHIpIGluVmlldzpkb2N1bWVu
dFZpZXdGb3IobyldOworCisgICAgW3RleHRGaWVsZCBzZXRDb250cm9sVmlldzpuaWxdOworCisg
ICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RU
ZXh0RmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29u
c3QKK3sKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRDYXBzTG9ja0luZGlj
YXRvcihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcikKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRl
eHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICB3a0RyYXdDYXBzTG9ja0lu
ZGljYXRvcihsb2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIpOworCisgICAgcmV0dXJuIGZhbHNl
OworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFRleHRBcmVhKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7CisgICAgd2tEcmF3QmV6ZWxlZFRleHRBcmVhKHIsIGlzRW5hYmxlZChvKSAmJiAh
aXNSZWFkT25seUNvbnRyb2wobykpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0VGV4dEFyZWFTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVu
ZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3QKK3sKK30KKworY29uc3QgaW50KiBSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6cG9wdXBCdXR0b25NYXJnaW5zKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29u
c3QgaW50IG1hcmdpbnNbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAwLCAzLCAxLCAzIH0sCisg
ICAgICAgIHsgMCwgMywgMiwgMyB9LAorICAgICAgICB7IDAsIDEsIDAsIDEgfQorICAgIH07Cisg
ICAgcmV0dXJuIG1hcmdpbnNbW3BvcHVwQnV0dG9uKCkgY29udHJvbFNpemVdXTsKK30KKworY29u
c3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwQnV0dG9uU2l6ZXMoKSBjb25z
dAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIx
KSwgSW50U2l6ZSgwLCAxOCksIEludFNpemUoMCwgMTUpIH07CisgICAgcmV0dXJuIHNpemVzOwor
fQorCitjb25zdCBpbnQqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwb3B1cEJ1dHRvblBhZGRpbmco
TlNDb250cm9sU2l6ZSBzaXplKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBpbnQgcGFkZGlu
Z1szXVs0XSA9CisgICAgeworICAgICAgICB7IDIsIDI2LCAzLCA4IH0sCisgICAgICAgIHsgMiwg
MjMsIDMsIDggfSwKKyAgICAgICAgeyAyLCAyMiwgMywgMTAgfQorICAgIH07CisgICAgcmV0dXJu
IHBhZGRpbmdbc2l6ZV07Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50TWVu
dUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcikKK3sKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250
ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICBzZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZShvLCBy
KTsKKworICAgIE5TUG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRvbiA9IHRoaXMtPnBvcHVwQnV0
dG9uKCk7CisKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29t
KCk7CisgICAgSW50U2l6ZSBzaXplID0gcG9wdXBCdXR0b25TaXplcygpW1twb3B1cEJ1dHRvbiBj
b250cm9sU2l6ZV1dOworICAgIHNpemUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tTGV2
ZWwpOworICAgIHNpemUuc2V0V2lkdGgoci53aWR0aCgpKTsKKworICAgIC8vIE5vdyBpbmZsYXRl
IGl0IHRvIGFjY291bnQgZm9yIHRoZSBzaGFkb3cuCisgICAgSW50UmVjdCBpbmZsYXRlZFJlY3Qg
PSByOworICAgIGlmIChyLndpZHRoKCkgPj0gbWluaW11bU1lbnVMaXN0U2l6ZShvLT5zdHlsZSgp
KSkKKyAgICAgICAgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3QoaW5mbGF0ZWRSZWN0LCBzaXpl
LCBwb3B1cEJ1dHRvbk1hcmdpbnMoKSwgem9vbUxldmVsKTsKKworICAgIEdyYXBoaWNzQ29udGV4
dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworCisgICAgLy8gT24g
TGVvcGFyZCwgdGhlIGNlbGwgd2lsbCBkcmF3IG91dHNpZGUgb2YgdGhlIGdpdmVuIHJlY3QsIHNv
IHdlIGhhdmUgdG8gY2xpcCB0byB0aGUgcmVjdAorICAgIHBhaW50SW5mby5jb250ZXh0LT5jbGlw
KGluZmxhdGVkUmVjdCk7CisKKyAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsKKyAgICAgICAg
aW5mbGF0ZWRSZWN0LnNldFdpZHRoKGluZmxhdGVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsK
KyAgICAgICAgaW5mbGF0ZWRSZWN0LnNldEhlaWdodChpbmZsYXRlZFJlY3QuaGVpZ2h0KCkgLyB6
b29tTGV2ZWwpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKGluZmxhdGVk
UmVjdC54KCksIGluZmxhdGVkUmVjdC55KCkpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+
c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9vbUxldmVsKSk7CisgICAgICAgIHBhaW50SW5m
by5jb250ZXh0LT50cmFuc2xhdGUoLWluZmxhdGVkUmVjdC54KCksIC1pbmZsYXRlZFJlY3QueSgp
KTsKKyAgICB9CisKKyAgICBOU1ZpZXcgKnZpZXcgPSBkb2N1bWVudFZpZXdGb3Iobyk7CisgICAg
W3BvcHVwQnV0dG9uIGRyYXdXaXRoRnJhbWU6aW5mbGF0ZWRSZWN0IGluVmlldzp2aWV3XTsKKyNp
ZiAhQlVUVE9OX0NFTExfRFJBV19XSVRIX0ZSQU1FX0RSQVdTX0ZPQ1VTX1JJTkcKKyAgICBpZiAo
aXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91dGxpbmVTdHlsZUlzQXV0bygpKQorICAgICAg
ICBbcG9wdXBCdXR0b24gX3dlYl9kcmF3Rm9jdXNSaW5nV2l0aEZyYW1lOmluZmxhdGVkUmVjdCBp
blZpZXc6dmlld107CisjZW5kaWYKKyAgICBbcG9wdXBCdXR0b24gc2V0Q29udHJvbFZpZXc6bmls
XTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmIEVOQUJMRShNRVRFUl9FTEVNRU5UKQor
CitJbnRTaXplIFJlbmRlclRoZW1lTWFjU2hhcmVkOjptZXRlclNpemVGb3JCb3VuZHMoY29uc3Qg
UmVuZGVyTWV0ZXIqIHJlbmRlck1ldGVyLCBjb25zdCBJbnRSZWN0JiBib3VuZHMpIGNvbnN0Cit7
CisgICAgaWYgKE5vQ29udHJvbFBhcnQgPT0gcmVuZGVyTWV0ZXItPnN0eWxlKCktPmFwcGVhcmFu
Y2UoKSkKKyAgICAgICAgcmV0dXJuIGJvdW5kcy5zaXplKCk7CisKKyAgICBOU0xldmVsSW5kaWNh
dG9yQ2VsbCogY2VsbCA9IGxldmVsSW5kaWNhdG9yRm9yKHJlbmRlck1ldGVyKTsKKyAgICAvLyBN
YWtlcyBlbm91Z2ggcm9vbSBmb3IgY2VsbCdzIGludHJpbnNpYyBzaXplLgorICAgIE5TU2l6ZSBj
ZWxsU2l6ZSA9IFtjZWxsIGNlbGxTaXplRm9yQm91bmRzOkludFJlY3QoSW50UG9pbnQoKSwgYm91
bmRzLnNpemUoKSldOworICAgIHJldHVybiBJbnRTaXplKGJvdW5kcy53aWR0aCgpIDwgY2VsbFNp
emUud2lkdGggPyBjZWxsU2l6ZS53aWR0aCA6IGJvdW5kcy53aWR0aCgpLAorICAgICAgICAgICAg
ICAgICAgIGJvdW5kcy5oZWlnaHQoKSA8IGNlbGxTaXplLmhlaWdodCA/IGNlbGxTaXplLmhlaWdo
dCA6IGJvdW5kcy5oZWlnaHQoKSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBh
aW50TWV0ZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghcmVuZGVyT2JqZWN0LT5p
c01ldGVyKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhp
Y3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisKKyAgICBOU0xldmVs
SW5kaWNhdG9yQ2VsbCogY2VsbCA9IGxldmVsSW5kaWNhdG9yRm9yKHRvUmVuZGVyTWV0ZXIocmVu
ZGVyT2JqZWN0KSk7CisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpw
YWludEluZm8uY29udGV4dCk7CisKKyAgICBbY2VsbCBkcmF3V2l0aEZyYW1lOnJlY3QgaW5WaWV3
OmRvY3VtZW50Vmlld0ZvcihyZW5kZXJPYmplY3QpXTsKKyAgICBbY2VsbCBzZXRDb250cm9sVmll
dzpuaWxdOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJl
ZDo6c3VwcG9ydHNNZXRlcihDb250cm9sUGFydCBwYXJ0KSBjb25zdAoreworICAgIHN3aXRjaCAo
cGFydCkgeworICAgIGNhc2UgUmVsZXZhbmN5TGV2ZWxJbmRpY2F0b3JQYXJ0OgorICAgIGNhc2Ug
RGlzY3JldGVDYXBhY2l0eUxldmVsSW5kaWNhdG9yUGFydDoKKyAgICBjYXNlIFJhdGluZ0xldmVs
SW5kaWNhdG9yUGFydDoKKyAgICBjYXNlIE1ldGVyUGFydDoKKyAgICBjYXNlIENvbnRpbnVvdXND
YXBhY2l0eUxldmVsSW5kaWNhdG9yUGFydDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworTlNMZXZlbEluZGljYXRv
clN0eWxlIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpsZXZlbEluZGljYXRvclN0eWxlRm9yKENvbnRy
b2xQYXJ0IHBhcnQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2FzZSBSZWxl
dmFuY3lMZXZlbEluZGljYXRvclBhcnQ6CisgICAgICAgIHJldHVybiBOU1JlbGV2YW5jeUxldmVs
SW5kaWNhdG9yU3R5bGU7CisgICAgY2FzZSBEaXNjcmV0ZUNhcGFjaXR5TGV2ZWxJbmRpY2F0b3JQ
YXJ0OgorICAgICAgICByZXR1cm4gTlNEaXNjcmV0ZUNhcGFjaXR5TGV2ZWxJbmRpY2F0b3JTdHls
ZTsKKyAgICBjYXNlIFJhdGluZ0xldmVsSW5kaWNhdG9yUGFydDoKKyAgICAgICAgcmV0dXJuIE5T
UmF0aW5nTGV2ZWxJbmRpY2F0b3JTdHlsZTsKKyAgICBjYXNlIE1ldGVyUGFydDoKKyAgICBjYXNl
IENvbnRpbnVvdXNDYXBhY2l0eUxldmVsSW5kaWNhdG9yUGFydDoKKyAgICBkZWZhdWx0OgorICAg
ICAgICByZXR1cm4gTlNDb250aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclN0eWxlOworICAg
IH0KKworfQorCitOU0xldmVsSW5kaWNhdG9yQ2VsbCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6Omxl
dmVsSW5kaWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKiByZW5kZXJNZXRlcikgY29uc3QKK3sK
KyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSByZW5kZXJNZXRlci0+c3R5bGUoKTsKKyAgICBBU1NF
UlQoc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBOb0NvbnRyb2xQYXJ0KTsKKworICAgIGlmICghbV9s
ZXZlbEluZGljYXRvcikKKyAgICAgICAgbV9sZXZlbEluZGljYXRvci5hZG9wdE5TKFtbTlNMZXZl
bEluZGljYXRvckNlbGwgYWxsb2NdIGluaXRXaXRoTGV2ZWxJbmRpY2F0b3JTdHlsZTpOU0NvbnRp
bnVvdXNDYXBhY2l0eUxldmVsSW5kaWNhdG9yU3R5bGVdKTsKKyAgICBOU0xldmVsSW5kaWNhdG9y
Q2VsbCogY2VsbCA9IG1fbGV2ZWxJbmRpY2F0b3IuZ2V0KCk7CisKKyAgICBIVE1MTWV0ZXJFbGVt
ZW50KiBlbGVtZW50ID0gcmVuZGVyTWV0ZXItPm1ldGVyRWxlbWVudCgpOworICAgIGRvdWJsZSB2
YWx1ZSA9IGVsZW1lbnQtPnZhbHVlKCk7CisKKyAgICAvLyBCZWNhdXNlIE5TTGV2ZWxJbmRpY2F0
b3JDZWxsIGRvZXMgbm90IHN1cHBvcnQgb3B0aW11bS1pbi10aGUtbWlkZGxlIHR5cGUgY29sb3Jp
bmcsCisgICAgLy8gd2UgZXhwbGljaXRseSBjb250cm9sIHRoZSBjb2xvciBpbnN0ZWFkIGdpdmlu
ZyBsb3cgYW5kIGhpZ2ggdmFsdWUgdG8gTlNMZXZlbEluZGljYXRvckNlbGwgYXMgaXMuCisgICAg
c3dpdGNoIChlbGVtZW50LT5nYXVnZVJlZ2lvbigpKSB7CisgICAgY2FzZSBIVE1MTWV0ZXJFbGVt
ZW50OjpHYXVnZVJlZ2lvbk9wdGltdW06CisgICAgICAgIC8vIE1ha2UgbWV0ZXIgdGhlIGdyZWVu
CisgICAgICAgIFtjZWxsIHNldFdhcm5pbmdWYWx1ZTp2YWx1ZSArIDFdOworICAgICAgICBbY2Vs
bCBzZXRDcml0aWNhbFZhbHVlOnZhbHVlICsgMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
SFRNTE1ldGVyRWxlbWVudDo6R2F1Z2VSZWdpb25TdWJvcHRpbWFsOgorICAgICAgICAvLyBNYWtl
IHRoZSBtZXRlciB5ZWxsb3cKKyAgICAgICAgW2NlbGwgc2V0V2FybmluZ1ZhbHVlOnZhbHVlIC0g
MV07CisgICAgICAgIFtjZWxsIHNldENyaXRpY2FsVmFsdWU6dmFsdWUgKyAxXTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBIVE1MTWV0ZXJFbGVtZW50OjpHYXVnZVJlZ2lvbkV2ZW5MZXNzR29v
ZDoKKyAgICAgICAgLy8gTWFrZSB0aGUgbWV0ZXIgcmVkCisgICAgICAgIFtjZWxsIHNldFdhcm5p
bmdWYWx1ZTp2YWx1ZSAtIDJdOworICAgICAgICBbY2VsbCBzZXRDcml0aWNhbFZhbHVlOnZhbHVl
IC0gMV07CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIFtjZWxsIHNldExldmVsSW5kaWNh
dG9yU3R5bGU6bGV2ZWxJbmRpY2F0b3JTdHlsZUZvcihzdHlsZS0+YXBwZWFyYW5jZSgpKV07Cisg
ICAgW2NlbGwgc2V0QmFzZVdyaXRpbmdEaXJlY3Rpb246c3R5bGUtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSA/IE5TV3JpdGluZ0RpcmVjdGlvbkxlZnRUb1JpZ2h0IDogTlNXcml0aW5nRGlyZWN0
aW9uUmlnaHRUb0xlZnRdOworICAgIFtjZWxsIHNldE1pblZhbHVlOmVsZW1lbnQtPm1pbigpXTsK
KyAgICBbY2VsbCBzZXRNYXhWYWx1ZTplbGVtZW50LT5tYXgoKV07CisgICAgUmV0YWluUHRyPE5T
TnVtYmVyPiB2YWx1ZU9iamVjdCA9IFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOnZhbHVlXTsK
KyAgICBbY2VsbCBzZXRPYmplY3RWYWx1ZTp2YWx1ZU9iamVjdC5nZXQoKV07CisKKyAgICByZXR1
cm4gY2VsbDsKK30KKworI2VuZGlmCisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKK2Nv
bnN0IEludFNpemUqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwcm9ncmVzc0JhclNpemVzKCkgY29u
c3QKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6ZSgwLCAy
MCksIEludFNpemUoMCwgMTIpLCBJbnRTaXplKDAsIDEyKSB9OworICAgIHJldHVybiBzaXplczsK
K30KKworY29uc3QgaW50KiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cHJvZ3Jlc3NCYXJNYXJnaW5z
KE5TQ29udHJvbFNpemUgY29udHJvbFNpemUpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IGlu
dCBtYXJnaW5zWzNdWzRdID0KKyAgICB7CisgICAgICAgIHsgMCwgMCwgMSwgMCB9LAorICAgICAg
ICB7IDAsIDAsIDEsIDAgfSwKKyAgICAgICAgeyAwLCAwLCAxLCAwIH0sCisgICAgfTsKKyAgICBy
ZXR1cm4gbWFyZ2luc1tjb250cm9sU2l6ZV07Cit9CisKK2ludCBSZW5kZXJUaGVtZU1hY1NoYXJl
ZDo6bWluaW11bVByb2dyZXNzQmFySGVpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sK
KyAgICByZXR1cm4gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIHByb2dyZXNzQmFyU2l6ZXMoKSku
aGVpZ2h0KCk7Cit9CisKK2RvdWJsZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YW5pbWF0aW9uUmVw
ZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0Cit7CisgICAg
cmV0dXJuIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVSYXRlOworfQorCitkb3VibGUgUmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jl
c3MqKSBjb25zdAoreworICAgIHJldHVybiBwcm9ncmVzc0FuaW1hdGlvbk51bUZyYW1lcyAqIHBy
b2dyZXNzQW5pbWF0aW9uRnJhbWVSYXRlOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVk
OjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVs
ZW1lbnQqKSBjb25zdAoreworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFBy
b2dyZXNzQmFyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIXJlbmRlck9iamVjdC0+
aXNQcm9ncmVzcygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZsb2F0IHpvb21MZXZl
bCA9IHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIGludCBjb250
cm9sU2l6ZSA9IGNvbnRyb2xTaXplRm9yRm9udChyZW5kZXJPYmplY3QtPnN0eWxlKCkpOworICAg
IEludFNpemUgc2l6ZSA9IHByb2dyZXNzQmFyU2l6ZXMoKVtjb250cm9sU2l6ZV07CisgICAgc2l6
ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7CisgICAgc2l6ZS5zZXRXaWR0
aChyZWN0LndpZHRoKCkpOworCisgICAgLy8gTm93IGluZmxhdGUgaXQgdG8gYWNjb3VudCBmb3Ig
dGhlIHNoYWRvdy4KKyAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IHJlY3Q7CisgICAgaWYgKHJl
Y3QuaGVpZ2h0KCkgPD0gbWluaW11bVByb2dyZXNzQmFySGVpZ2h0KHJlbmRlck9iamVjdC0+c3R5
bGUoKSkpCisgICAgICAgIGluZmxhdGVkUmVjdCA9IGluZmxhdGVSZWN0KGluZmxhdGVkUmVjdCwg
c2l6ZSwgcHJvZ3Jlc3NCYXJNYXJnaW5zKGNvbnRyb2xTaXplKSwgem9vbUxldmVsKTsKKworICAg
IFJlbmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcyA9IHRvUmVuZGVyUHJvZ3Jlc3MocmVuZGVy
T2JqZWN0KTsKKyAgICBISVRoZW1lVHJhY2tEcmF3SW5mbyB0cmFja0luZm87CisgICAgdHJhY2tJ
bmZvLnZlcnNpb24gPSAwOworICAgIGlmIChjb250cm9sU2l6ZSA9PSBOU1JlZ3VsYXJDb250cm9s
U2l6ZSkKKyAgICAgICAgdHJhY2tJbmZvLmtpbmQgPSByZW5kZXJQcm9ncmVzcy0+cG9zaXRpb24o
KSA8IDAgPyBrVGhlbWVMYXJnZUluZGV0ZXJtaW5hdGVCYXIgOiBrVGhlbWVMYXJnZVByb2dyZXNz
QmFyOworICAgIGVsc2UKKyAgICAgICAgdHJhY2tJbmZvLmtpbmQgPSByZW5kZXJQcm9ncmVzcy0+
cG9zaXRpb24oKSA8IDAgPyBrVGhlbWVNZWRpdW1JbmRldGVybWluYXRlQmFyIDoga1RoZW1lTWVk
aXVtUHJvZ3Jlc3NCYXI7CisKKyAgICB0cmFja0luZm8uYm91bmRzID0gSW50UmVjdChJbnRQb2lu
dCgpLCBpbmZsYXRlZFJlY3Quc2l6ZSgpKTsKKyAgICB0cmFja0luZm8ubWluID0gMDsKKyAgICB0
cmFja0luZm8ubWF4ID0gbnVtZXJpY19saW1pdHM8U0ludDMyPjo6bWF4KCk7CisgICAgdHJhY2tJ
bmZvLnZhbHVlID0gbHJvdW5kKHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigpICogbmV4dGFmdGVy
KHRyYWNrSW5mby5tYXgsIDApKTsKKyAgICB0cmFja0luZm8udHJhY2tJbmZvLnByb2dyZXNzLnBo
YXNlID0gbHJvdW5kKHJlbmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVzcygpICogbmV4dGFm
dGVyKHByb2dyZXNzQW5pbWF0aW9uTnVtRnJhbWVzLCAwKSk7CisgICAgdHJhY2tJbmZvLmF0dHJp
YnV0ZXMgPSBrVGhlbWVUcmFja0hvcml6b250YWw7CisgICAgdHJhY2tJbmZvLmVuYWJsZVN0YXRl
ID0gaXNBY3RpdmUocmVuZGVyT2JqZWN0KSA/IGtUaGVtZVRyYWNrQWN0aXZlIDoga1RoZW1lVHJh
Y2tJbmFjdGl2ZTsKKyAgICB0cmFja0luZm8ucmVzZXJ2ZWQgPSAwOworICAgIHRyYWNrSW5mby5m
aWxsZXIxID0gMDsKKworICAgIE93blB0cjxJbWFnZUJ1ZmZlcj4gaW1hZ2VCdWZmZXIgPSBJbWFn
ZUJ1ZmZlcjo6Y3JlYXRlKGluZmxhdGVkUmVjdC5zaXplKCksIDEpOworICAgIGlmICghaW1hZ2VC
dWZmZXIpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgQ29udGV4dENvbnRhaW5lciBjZ0Nv
bnRleHRDb250YWluZXIoaW1hZ2VCdWZmZXItPmNvbnRleHQoKSk7CisgICAgQ0dDb250ZXh0UmVm
IGNnQ29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7CisgICAgSElUaGVtZURy
YXdUcmFjaygmdHJhY2tJbmZvLCAwLCBjZ0NvbnRleHQsIGtISVRoZW1lT3JpZW50YXRpb25Ob3Jt
YWwpOworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludElu
Zm8uY29udGV4dCk7CisKKyAgICBpZiAoIXJlbmRlclByb2dyZXNzLT5zdHlsZSgpLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0
ZSgyICogaW5mbGF0ZWRSZWN0LngoKSArIGluZmxhdGVkUmVjdC53aWR0aCgpLCAwKTsKKyAgICAg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSgtMSwgMSkpOworICAgIH0KKwor
ICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3SW1hZ2VCdWZmZXIoaW1hZ2VCdWZmZXIuZ2V0KCks
IENvbG9yU3BhY2VEZXZpY2VSR0IsIGluZmxhdGVkUmVjdC5sb2NhdGlvbigpKTsKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisjZW5kaWYKKworY29uc3QgZmxvYXQgYmFzZUZvbnRTaXplID0gMTEuMGY7
Citjb25zdCBmbG9hdCBiYXNlQXJyb3dIZWlnaHQgPSA0LjBmOworY29uc3QgZmxvYXQgYmFzZUFy
cm93V2lkdGggPSA1LjBmOworY29uc3QgZmxvYXQgYmFzZVNwYWNlQmV0d2VlbkFycm93cyA9IDIu
MGY7Citjb25zdCBpbnQgYXJyb3dQYWRkaW5nTGVmdCA9IDY7Citjb25zdCBpbnQgYXJyb3dQYWRk
aW5nUmlnaHQgPSA2OworY29uc3QgaW50IHBhZGRpbmdCZWZvcmVTZXBhcmF0b3IgPSA0OworY29u
c3QgaW50IGJhc2VCb3JkZXJSYWRpdXMgPSA1OworY29uc3QgaW50IHN0eWxlZFBvcHVwUGFkZGlu
Z0xlZnQgPSA4OworY29uc3QgaW50IHN0eWxlZFBvcHVwUGFkZGluZ1RvcCA9IDE7Citjb25zdCBp
bnQgc3R5bGVkUG9wdXBQYWRkaW5nQm90dG9tID0gMjsKKworc3RhdGljIHZvaWQgVG9wR3JhZGll
bnRJbnRlcnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBvdXRE
YXRhKQoreworICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAw
LjRmIH07CisgICAgc3RhdGljIGZsb2F0IGxpZ2h0WzRdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAw
LjE1ZiB9OworICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07CisgICAgaW50IGkgPSAwOworICAgIGZv
ciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIG91dERhdGFbaV0gPSAoMS4wZiAtIGEpICog
ZGFya1tpXSArIGEgKiBsaWdodFtpXTsKK30KKworc3RhdGljIHZvaWQgQm90dG9tR3JhZGllbnRJ
bnRlcnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBvdXREYXRh
KQoreworICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAwLjBm
IH07CisgICAgc3RhdGljIGZsb2F0IGxpZ2h0WzRdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAwLjNm
IH07CisgICAgZmxvYXQgYSA9IGluRGF0YVswXTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChp
ID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJr
W2ldICsgYSAqIGxpZ2h0W2ldOworfQorCitzdGF0aWMgdm9pZCBNYWluR3JhZGllbnRJbnRlcnBv
bGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBvdXREYXRhKQorewor
ICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjE1ZiB9Owor
ICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9Owor
ICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07CisgICAgaW50IGkgPSAwOworICAgIGZvciAoaSA9IDA7
IGkgPCA0OyBpKyspCisgICAgICAgIG91dERhdGFbaV0gPSAoMS4wZiAtIGEpICogZGFya1tpXSAr
IGEgKiBsaWdodFtpXTsKK30KKworc3RhdGljIHZvaWQgVHJhY2tHcmFkaWVudEludGVycG9sYXRl
KHZvaWQqLCBjb25zdCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCit7CisgICAg
c3RhdGljIGZsb2F0IGRhcmtbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuNjc4ZiB9OworICAg
IHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4xM2YgfTsKKyAg
ICBmbG9hdCBhID0gaW5EYXRhWzBdOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBp
IDwgNDsgaSsrKQorICAgICAgICBvdXREYXRhW2ldID0gKDEuMGYgLSBhKSAqIGRhcmtbaV0gKyBh
ICogbGlnaHRbaV07Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50TWVudUxp
c3RCdXR0b25HcmFkaWVudHMoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIENvbnRleHRDb250YWluZXIgY2dDb250ZXh0Q29udGFpbmVyKHBhaW50
SW5mby5jb250ZXh0KTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IGNnQ29udGV4dENvbnRh
aW5lci5jb250ZXh0KCk7CisKKyAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2
ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKworICAgIFJvdW5kZWRSZWN0IGJvcmRlciA9IG8tPnN0
eWxlKCktPmdldFJvdW5kZWRCb3JkZXJGb3Iociwgby0+dmlldygpKTsKKyAgICBpbnQgcmFkaXVz
ID0gYm9yZGVyLnJhZGlpKCkudG9wTGVmdCgpLndpZHRoKCk7CisKKyAgICBDR0NvbG9yU3BhY2VS
ZWYgY3NwYWNlID0gZGV2aWNlUkdCQ29sb3JTcGFjZVJlZigpOworCisgICAgRmxvYXRSZWN0IHRv
cEdyYWRpZW50KHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdodCgpIC8gMi4wZik7Cisg
ICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3MgdG9wQ2FsbGJhY2tzID0geyAwLCBUb3BHcmFk
aWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+IHRv
cEZ1bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25DcmVhdGUoTlVMTCwgMSwgTlVMTCwgNCwgTlVM
TCwgJnRvcENhbGxiYWNrcykpOworICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IHRvcFNoYWRp
bmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZSh0b3BH
cmFkaWVudC54KCksIHRvcEdyYWRpZW50LnkoKSksIENHUG9pbnRNYWtlKHRvcEdyYWRpZW50Lngo
KSwgdG9wR3JhZGllbnQubWF4WSgpKSwgdG9wRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkp
OworCisgICAgRmxvYXRSZWN0IGJvdHRvbUdyYWRpZW50KHIueCgpICsgcmFkaXVzLCByLnkoKSAr
IHIuaGVpZ2h0KCkgLyAyLjBmLCByLndpZHRoKCkgLSAyLjBmICogcmFkaXVzLCByLmhlaWdodCgp
IC8gMi4wZik7CisgICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3MgYm90dG9tQ2FsbGJhY2tz
ID0geyAwLCBCb3R0b21HcmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWluUHRy
PENHRnVuY3Rpb25SZWY+IGJvdHRvbUZ1bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25DcmVhdGUo
TlVMTCwgMSwgTlVMTCwgNCwgTlVMTCwgJmJvdHRvbUNhbGxiYWNrcykpOworICAgIFJldGFpblB0
cjxDR1NoYWRpbmdSZWY+IGJvdHRvbVNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhp
YWwoY3NwYWNlLCBDR1BvaW50TWFrZShib3R0b21HcmFkaWVudC54KCksICBib3R0b21HcmFkaWVu
dC55KCkpLCBDR1BvaW50TWFrZShib3R0b21HcmFkaWVudC54KCksIGJvdHRvbUdyYWRpZW50Lm1h
eFkoKSksIGJvdHRvbUZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIHN0cnVj
dCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIG1haW5DYWxsYmFja3MgPSB7IDAsIE1haW5HcmFkaWVudElu
dGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+IG1haW5GdW5j
dGlvbihBZG9wdENGLCBDR0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZt
YWluQ2FsbGJhY2tzKSk7CisgICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbWFpblNoYWRpbmco
QWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShyLngoKSwg
IHIueSgpKSwgQ0dQb2ludE1ha2Uoci54KCksIHIubWF4WSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgp
LCBmYWxzZSwgZmFsc2UpKTsKKworICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IGxlZnRTaGFk
aW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2Uoci54
KCksICByLnkoKSksIENHUG9pbnRNYWtlKHIueCgpICsgcmFkaXVzLCByLnkoKSksIG1haW5GdW5j
dGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVm
PiByaWdodFNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1Bv
aW50TWFrZShyLm1heFgoKSwgIHIueSgpKSwgQ0dQb2ludE1ha2Uoci5tYXhYKCkgLSByYWRpdXMs
IHIueSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIHsKKyAg
ICAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29u
dGV4dCk7CisgICAgICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgcik7CisgICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT5hZGRSb3VuZGVkUmVjdENsaXAoYm9yZGVyKTsKKyAgICAgICAg
Y29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7CisgICAgICAgIENHQ29udGV4
dERyYXdTaGFkaW5nKGNvbnRleHQsIG1haW5TaGFkaW5nLmdldCgpKTsKKyAgICB9CisKKyAgICB7
CisgICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZv
LmNvbnRleHQpOworICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIHRvcEdyYWRp
ZW50KTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xpcChSb3Vu
ZGVkUmVjdChlbmNsb3NpbmdJbnRSZWN0KHRvcEdyYWRpZW50KSwgYm9yZGVyLnJhZGlpKCkudG9w
TGVmdCgpLCBib3JkZXIucmFkaWkoKS50b3BSaWdodCgpLCBJbnRTaXplKCksIEludFNpemUoKSkp
OworICAgICAgICBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKKyAgICAg
ICAgQ0dDb250ZXh0RHJhd1NoYWRpbmcoY29udGV4dCwgdG9wU2hhZGluZy5nZXQoKSk7CisgICAg
fQorCisgICAgaWYgKCFib3R0b21HcmFkaWVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgR3JhcGhp
Y3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisgICAg
ICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgYm90dG9tR3JhZGllbnQpOworICAgICAg
ICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKFJvdW5kZWRSZWN0KGVuY2xv
c2luZ0ludFJlY3QoYm90dG9tR3JhZGllbnQpLCBJbnRTaXplKCksIEludFNpemUoKSwgYm9yZGVy
LnJhZGlpKCkuYm90dG9tTGVmdCgpLCBib3JkZXIucmFkaWkoKS5ib3R0b21SaWdodCgpKSk7Cisg
ICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOworICAgICAgICBD
R0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBib3R0b21TaGFkaW5nLmdldCgpKTsKKyAgICB9
CisKKyAgICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigq
cGFpbnRJbmZvLmNvbnRleHQpOworICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQs
IHIpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKGJvcmRl
cik7CisgICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOworICAg
ICAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBsZWZ0U2hhZGluZy5nZXQoKSk7Cisg
ICAgICAgIENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIHJpZ2h0U2hhZGluZy5nZXQoKSk7
CisgICAgfQorfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludE1lbnVMaXN0QnV0
dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHIpCit7CisgICAgSW50UmVjdCBib3VuZHMgPSBJbnRSZWN0KHIueCgpICsgby0+c3R5
bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIu
eSgpICsgby0+c3R5bGUoKS0+Ym9yZGVyVG9wV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgci53aWR0aCgpIC0gby0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCkgLSBvLT5z
dHlsZSgpLT5ib3JkZXJSaWdodFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHIuaGVpZ2h0KCkgLSBvLT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpIC0gby0+c3R5bGUoKS0+
Ym9yZGVyQm90dG9tV2lkdGgoKSk7CisgICAgLy8gRHJhdyB0aGUgZ3JhZGllbnRzIHRvIGdpdmUg
dGhlIHN0eWxlZCBwb3B1cCBtZW51IGEgYnV0dG9uIGFwcGVhcmFuY2UKKyAgICBwYWludE1lbnVM
aXN0QnV0dG9uR3JhZGllbnRzKG8sIHBhaW50SW5mbywgYm91bmRzKTsKKworICAgIC8vIFNpbmNl
IHdlIGFjdHVhbGx5IGtub3cgdGhlIHNpemUgb2YgdGhlIGNvbnRyb2wgaGVyZSwgd2UgcmVzdHJp
Y3QgdGhlIGZvbnQgc2NhbGUgdG8gbWFrZSBzdXJlIHRoZSBhcnJvd3Mgd2lsbCBmaXQgdmVydGlj
YWxseSBpbiB0aGUgYm91bmRzCisgICAgZmxvYXQgZm9udFNjYWxlID0gbWluKG8tPnN0eWxlKCkt
PmZvbnRTaXplKCkgLyBiYXNlRm9udFNpemUsIGJvdW5kcy5oZWlnaHQoKSAvIChiYXNlQXJyb3dI
ZWlnaHQgKiAyICsgYmFzZVNwYWNlQmV0d2VlbkFycm93cykpOworICAgIGZsb2F0IGNlbnRlclkg
PSBib3VuZHMueSgpICsgYm91bmRzLmhlaWdodCgpIC8gMi4wZjsKKyAgICBmbG9hdCBhcnJvd0hl
aWdodCA9IGJhc2VBcnJvd0hlaWdodCAqIGZvbnRTY2FsZTsKKyAgICBmbG9hdCBhcnJvd1dpZHRo
ID0gYmFzZUFycm93V2lkdGggKiBmb250U2NhbGU7CisgICAgZmxvYXQgbGVmdEVkZ2UgPSBib3Vu
ZHMubWF4WCgpIC0gYXJyb3dQYWRkaW5nUmlnaHQgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29t
KCkgLSBhcnJvd1dpZHRoOworICAgIGZsb2F0IHNwYWNlQmV0d2VlbkFycm93cyA9IGJhc2VTcGFj
ZUJldHdlZW5BcnJvd3MgKiBmb250U2NhbGU7CisKKyAgICBpZiAoYm91bmRzLndpZHRoKCkgPCBh
cnJvd1dpZHRoICsgYXJyb3dQYWRkaW5nTGVmdCAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20o
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZl
ciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisKKyAgICBwYWludEluZm8uY29udGV4
dC0+c2V0RmlsbENvbG9yKG8tPnN0eWxlKCktPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9w
ZXJ0eUNvbG9yKSwgby0+c3R5bGUoKS0+Y29sb3JTcGFjZSgpKTsKKyAgICBwYWludEluZm8uY29u
dGV4dC0+c2V0U3Ryb2tlU3R5bGUoTm9TdHJva2UpOworCisgICAgRmxvYXRQb2ludCBhcnJvdzFb
M107CisgICAgYXJyb3cxWzBdID0gRmxvYXRQb2ludChsZWZ0RWRnZSwgY2VudGVyWSAtIHNwYWNl
QmV0d2VlbkFycm93cyAvIDIuMGYpOworICAgIGFycm93MVsxXSA9IEZsb2F0UG9pbnQobGVmdEVk
Z2UgKyBhcnJvd1dpZHRoLCBjZW50ZXJZIC0gc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7Cisg
ICAgYXJyb3cxWzJdID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGggLyAyLjBmLCBj
ZW50ZXJZIC0gc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZiAtIGFycm93SGVpZ2h0KTsKKworICAg
IC8vIERyYXcgdGhlIHRvcCBhcnJvdworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4
UG9seWdvbigzLCBhcnJvdzEsIHRydWUpOworCisgICAgRmxvYXRQb2ludCBhcnJvdzJbM107Cisg
ICAgYXJyb3cyWzBdID0gRmxvYXRQb2ludChsZWZ0RWRnZSwgY2VudGVyWSArIHNwYWNlQmV0d2Vl
bkFycm93cyAvIDIuMGYpOworICAgIGFycm93MlsxXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBh
cnJvd1dpZHRoLCBjZW50ZXJZICsgc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7CisgICAgYXJy
b3cyWzJdID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGggLyAyLjBmLCBjZW50ZXJZ
ICsgc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZiArIGFycm93SGVpZ2h0KTsKKworICAgIC8vIERy
YXcgdGhlIGJvdHRvbSBhcnJvdworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9s
eWdvbigzLCBhcnJvdzIsIHRydWUpOworCisgICAgQ29sb3IgbGVmdFNlcGFyYXRvckNvbG9yKDAs
IDAsIDAsIDQwKTsKKyAgICBDb2xvciByaWdodFNlcGFyYXRvckNvbG9yKDI1NSwgMjU1LCAyNTUs
IDQwKTsKKworICAgIC8vIEZJWE1FOiBTaG91bGQgdGhlIHNlcGFyYXRvciB0aGlja25lc3MgYW5k
IHNwYWNlIGJlIHNjYWxlZCB1cCBieSBmb250U2NhbGU/CisgICAgaW50IHNlcGFyYXRvclNwYWNl
ID0gMjsgLy8gRGVsaWJlcmF0ZWx5IGlnbm9yZXMgem9vbSBzaW5jZSBpdCBsb29rcyBuaWNlciBp
ZiBpdCBzdGF5cyB0aGluLgorICAgIGludCBsZWZ0RWRnZU9mU2VwYXJhdG9yID0gc3RhdGljX2Nh
c3Q8aW50PihsZWZ0RWRnZSAtIGFycm93UGFkZGluZ0xlZnQgKiBvLT5zdHlsZSgpLT5lZmZlY3Rp
dmVab29tKCkpOyAvLyBGSVhNRTogUm91bmQ/CisKKyAgICAvLyBEcmF3IHRoZSBzZXBhcmF0b3Ig
dG8gdGhlIGxlZnQgb2YgdGhlIGFycm93cworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJv
a2VUaGlja25lc3MoMS4wZik7IC8vIERlbGliZXJhdGVseSBpZ25vcmVzIHpvb20gc2luY2UgaXQg
bG9va3MgbmljZXIgaWYgaXQgc3RheXMgdGhpbi4KKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0
U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJv
a2VDb2xvcihsZWZ0U2VwYXJhdG9yQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIHBh
aW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yLCBi
b3VuZHMueSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50UG9pbnQobGVm
dEVkZ2VPZlNlcGFyYXRvciwgYm91bmRzLm1heFkoKSkpOworCisgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnNldFN0cm9rZUNvbG9yKHJpZ2h0U2VwYXJhdG9yQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VS
R0IpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChsZWZ0RWRnZU9m
U2VwYXJhdG9yICsgc2VwYXJhdG9yU3BhY2UsIGJvdW5kcy55KCkpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yICsgc2VwYXJhdG9y
U3BhY2UsIGJvdW5kcy5tYXhZKCkpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBj
b25zdCBJbnRTaXplKiBtZW51TGlzdEJ1dHRvblNpemVzKCkKK3sKKyAgICBzdGF0aWMgY29uc3Qg
SW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6ZSgwLCAyMSksIEludFNpemUoMCwgMTgpLCBJbnRT
aXplKDAsIDE1KSB9OworICAgIHJldHVybiBzaXplczsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6YWRqdXN0TWVudUxpc3RTdHlsZShTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVy
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgTlNDb250cm9s
U2l6ZSBjb250cm9sU2l6ZSA9IGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSk7CisKKyAgICBzdHls
ZS0+cmVzZXRCb3JkZXIoKTsKKyAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisKKyAgICAvLyBI
ZWlnaHQgaXMgbG9ja2VkIHRvIGF1dG8uCisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0
bykpOworCisgICAgLy8gV2hpdGUtc3BhY2UgaXMgbG9ja2VkIHRvIHByZQorICAgIHN0eWxlLT5z
ZXRXaGl0ZVNwYWNlKFBSRSk7CisKKyAgICAvLyBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgdG8g
YmxhY2sgb3IgZ3JheSB3aGVuIHdlIGhhdmUgdGhlIGFxdWEgbG9vay4KKyAgICAvLyBDYXN0IHRv
IFJHQjMyIGlzIHRvIHdvcmsgYXJvdW5kIGEgY29tcGlsZXIgYnVnLgorICAgIHN0eWxlLT5zZXRD
b2xvcihlICYmIGUtPmlzRW5hYmxlZEZvcm1Db250cm9sKCkgPyBzdGF0aWNfY2FzdDxSR0JBMzI+
KENvbG9yOjpibGFjaykgOiBDb2xvcjo6ZGFya0dyYXkpOworCisgICAgLy8gU2V0IHRoZSBidXR0
b24ncyB2ZXJ0aWNhbCBzaXplLgorICAgIHNldFNpemVGcm9tRm9udChzdHlsZSwgbWVudUxpc3RC
dXR0b25TaXplcygpKTsKKworICAgIC8vIE91ciBmb250IGlzIGxvY2tlZCB0byB0aGUgYXBwcm9w
cmlhdGUgc3lzdGVtIGZvbnQgc2l6ZSBmb3IgdGhlIGNvbnRyb2wuICBUbyBjbGFyaWZ5LCB3ZSBm
aXJzdCB1c2UgdGhlIENTUy1zcGVjaWZpZWQgZm9udCB0byBmaWd1cmUgb3V0CisgICAgLy8gYSBy
ZWFzb25hYmxlIGNvbnRyb2wgc2l6ZSwgYnV0IG9uY2UgdGhhdCBjb250cm9sIHNpemUgaXMgZGV0
ZXJtaW5lZCwgd2UgdGhyb3cgdGhhdCBmb250IGF3YXkgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUK
KyAgICAvLyBzeXN0ZW0gZm9udCBmb3IgdGhlIGNvbnRyb2wgc2l6ZSBpbnN0ZWFkLgorICAgIHNl
dEZvbnRGcm9tQ29udHJvbFNpemUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGNvbnRyb2xTaXplKTsK
KworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Cit9CisKK2ludCBSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlKiBzdHlsZSkg
Y29uc3QKK3sKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCisg
ICAgICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRpbmcoY29udHJvbFNpemVGb3JGb250KHN0eWxl
KSlbbGVmdFBhZGRpbmddICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBpZiAoc3R5bGUt
PmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQpCisgICAgICAgIHJldHVybiBzdHls
ZWRQb3B1cFBhZGRpbmdMZWZ0ICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICByZXR1cm4g
MDsKK30KKworaW50IFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwb3B1cEludGVybmFsUGFkZGluZ1Jp
Z2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFu
Y2UoKSA9PSBNZW51bGlzdFBhcnQpCisgICAgICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRpbmco
Y29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbcmlnaHRQYWRkaW5nXSAqIHN0eWxlLT5lZmZlY3Rp
dmVab29tKCk7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RCdXR0b25Q
YXJ0KSB7CisgICAgICAgIGZsb2F0IGZvbnRTY2FsZSA9IHN0eWxlLT5mb250U2l6ZSgpIC8gYmFz
ZUZvbnRTaXplOworICAgICAgICBmbG9hdCBhcnJvd1dpZHRoID0gYmFzZUFycm93V2lkdGggKiBm
b250U2NhbGU7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKGFycm93V2lk
dGggKyAoYXJyb3dQYWRkaW5nTGVmdCArIGFycm93UGFkZGluZ1JpZ2h0ICsgcGFkZGluZ0JlZm9y
ZVNlcGFyYXRvcikgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKSk7CisgICAgfQorICAgIHJldHVy
biAwOworfQorCitpbnQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
VG9wKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFu
Y2UoKSA9PSBNZW51bGlzdFBhcnQpCisgICAgICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRpbmco
Y29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbdG9wUGFkZGluZ10gKiBzdHlsZS0+ZWZmZWN0aXZl
Wm9vbSgpOworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0QnV0dG9uUGFy
dCkKKyAgICAgICAgcmV0dXJuIHN0eWxlZFBvcHVwUGFkZGluZ1RvcCAqIHN0eWxlLT5lZmZlY3Rp
dmVab29tKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAorewor
ICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAgICAgcmV0
dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVtib3R0b21Q
YWRkaW5nXSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJh
bmNlKCkgPT0gTWVudWxpc3RCdXR0b25QYXJ0KQorICAgICAgICByZXR1cm4gc3R5bGVkUG9wdXBQ
YWRkaW5nQm90dG9tICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICByZXR1cm4gMDsKK30K
Kwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShT
dHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAg
ICBmbG9hdCBmb250U2NhbGUgPSBzdHlsZS0+Zm9udFNpemUoKSAvIGJhc2VGb250U2l6ZTsKKwor
ICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyUmFkaXVzKElu
dFNpemUoaW50KGJhc2VCb3JkZXJSYWRpdXMgKyBmb250U2NhbGUgLSAxKSwgaW50KGJhc2VCb3Jk
ZXJSYWRpdXMgKyBmb250U2NhbGUgLSAxKSkpOyAvLyBGSVhNRTogUm91bmQgdXA/CisKKyAgICBj
b25zdCBpbnQgbWluSGVpZ2h0ID0gMTU7CisgICAgc3R5bGUtPnNldE1pbkhlaWdodChMZW5ndGgo
bWluSGVpZ2h0LCBGaXhlZCkpOworCisgICAgc3R5bGUtPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5
bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVk
OjpzZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZShjb25zdCBSZW5kZXJPYmplY3QqIG8sIGNvbnN0IElu
dFJlY3QmIHIpCit7CisgICAgTlNQb3BVcEJ1dHRvbkNlbGwqIHBvcHVwQnV0dG9uID0gdGhpcy0+
cG9wdXBCdXR0b24oKTsKKworICAgIC8vIFNldCB0aGUgY29udHJvbCBzaXplIGJhc2VkIG9mZiB0
aGUgcmVjdGFuZ2xlIHdlJ3JlIHBhaW50aW5nIGludG8uCisgICAgc2V0Q29udHJvbFNpemUocG9w
dXBCdXR0b24sIHBvcHVwQnV0dG9uU2l6ZXMoKSwgci5zaXplKCksIG8tPnN0eWxlKCktPmVmZmVj
dGl2ZVpvb20oKSk7CisKKyAgICAvLyBVcGRhdGUgdGhlIHZhcmlvdXMgc3RhdGVzIHdlIHJlc3Bv
bmQgdG8uCisgICAgdXBkYXRlQWN0aXZlU3RhdGUocG9wdXBCdXR0b24sIG8pOworICAgIHVwZGF0
ZUNoZWNrZWRTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7CisgICAgdXBkYXRlRW5hYmxlZFN0YXRlKHBv
cHVwQnV0dG9uLCBvKTsKKyAgICB1cGRhdGVQcmVzc2VkU3RhdGUocG9wdXBCdXR0b24sIG8pOwor
I2lmIEJVVFRPTl9DRUxMX0RSQVdfV0lUSF9GUkFNRV9EUkFXU19GT0NVU19SSU5HCisgICAgdXBk
YXRlRm9jdXNlZFN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKKyNlbmRpZgorfQorCitjb25zdCBJbnRT
aXplKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bWVudUxpc3RTaXplcygpIGNvbnN0Cit7CisgICAg
c3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoOSwgMCksIEludFNpemUo
NSwgMCksIEludFNpemUoMCwgMCkgfTsKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK2ludCBSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6bWluaW11bU1lbnVMaXN0U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0Cit7CisgICAgcmV0dXJuIHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCBtZW51TGlzdFNp
emVzKCkpLndpZHRoKCk7Cit9CisKK2NvbnN0IGludCB0cmFja1dpZHRoID0gNTsKK2NvbnN0IGlu
dCB0cmFja1JhZGl1cyA9IDI7CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNs
aWRlclRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVu
dCopIGNvbnN0Cit7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKK30KKworYm9v
bCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIElu
dFJlY3QgYm91bmRzID0gcjsKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZl
Y3RpdmVab29tKCk7CisgICAgZmxvYXQgem9vbWVkVHJhY2tXaWR0aCA9IHRyYWNrV2lkdGggKiB6
b29tTGV2ZWw7CisKKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09ICBTbGlkZXJI
b3Jpem9udGFsUGFydCB8fCBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gIE1lZGlhU2xpZGVy
UGFydCkgeworICAgICAgICBib3VuZHMuc2V0SGVpZ2h0KHpvb21lZFRyYWNrV2lkdGgpOworICAg
ICAgICBib3VuZHMuc2V0WShyLnkoKSArIHIuaGVpZ2h0KCkgLyAyIC0gem9vbWVkVHJhY2tXaWR0
aCAvIDIpOworICAgIH0gZWxzZSBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRl
clZlcnRpY2FsUGFydCkgeworICAgICAgICBib3VuZHMuc2V0V2lkdGgoem9vbWVkVHJhY2tXaWR0
aCk7CisgICAgICAgIGJvdW5kcy5zZXRYKHIueCgpICsgci53aWR0aCgpIC8gMiAtIHpvb21lZFRy
YWNrV2lkdGggLyAyKTsKKyAgICB9CisKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQg
bG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4
dCA9IGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKTsKKyAgICBDR0NvbG9yU3BhY2VSZWYgY3NwYWNl
ID0gZGV2aWNlUkdCQ29sb3JTcGFjZVJlZigpOworCisjaWYgRU5BQkxFKERBVEFMSVNUX0VMRU1F
TlQpCisgICAgcGFpbnRTbGlkZXJUaWNrcyhvLCBwYWludEluZm8sIHIpOworI2VuZGlmCisKKyAg
ICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0
KTsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIGJvdW5kcyk7CisKKyAgICBzdHJ1
Y3QgQ0dGdW5jdGlvbkNhbGxiYWNrcyBtYWluQ2FsbGJhY2tzID0geyAwLCBUcmFja0dyYWRpZW50
SW50ZXJwb2xhdGUsIE5VTEwgfTsKKyAgICBSZXRhaW5QdHI8Q0dGdW5jdGlvblJlZj4gbWFpbkZ1
bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25DcmVhdGUoTlVMTCwgMSwgTlVMTCwgNCwgTlVMTCwg
Jm1haW5DYWxsYmFja3MpKTsKKyAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiBtYWluU2hhZGlu
ZzsKKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclZlcnRpY2FsUGFy
dCkKKyAgICAgICAgbWFpblNoYWRpbmcuYWRvcHRDRihDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3Bh
Y2UsIENHUG9pbnRNYWtlKGJvdW5kcy54KCksICBib3VuZHMubWF4WSgpKSwgQ0dQb2ludE1ha2Uo
Ym91bmRzLm1heFgoKSwgYm91bmRzLm1heFkoKSksIG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2Us
IGZhbHNlKSk7CisgICAgZWxzZQorICAgICAgICBtYWluU2hhZGluZy5hZG9wdENGKENHU2hhZGlu
Z0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2UoYm91bmRzLngoKSwgIGJvdW5kcy55KCkp
LCBDR1BvaW50TWFrZShib3VuZHMueCgpLCBib3VuZHMubWF4WSgpKSwgbWFpbkZ1bmN0aW9uLmdl
dCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIEludFNpemUgcmFkaXVzKHRyYWNrUmFkaXVzLCB0
cmFja1JhZGl1cyk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xpcChS
b3VuZGVkUmVjdChib3VuZHMsIHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIHJhZGl1cykpOworICAg
IGNvbnRleHQgPSBsb2NhbENvbnRleHQuY2dDb250ZXh0KCk7CisgICAgQ0dDb250ZXh0RHJhd1No
YWRpbmcoY29udGV4dCwgbWFpblNoYWRpbmcuZ2V0KCkpOworCisgICAgcmV0dXJuIGZhbHNlOwor
fQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKFN0
eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCog
ZWxlbWVudCkgY29uc3QKK3sKKyAgICBSZW5kZXJUaGVtZTo6YWRqdXN0U2xpZGVyVGh1bWJTdHls
ZShzdHlsZVJlc29sdmVyLCBzdHlsZSwgZWxlbWVudCk7CisgICAgc3R5bGUtPnNldEJveFNoYWRv
dyhudWxscHRyKTsKK30KKworY29uc3QgZmxvYXQgdmVydGljYWxTbGlkZXJIZWlnaHRQYWRkaW5n
ID0gMC4xZjsKKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTbGlkZXJUaHVtYihS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQoreworICAgIE5TU2xpZGVyQ2VsbCogc2xpZGVyVGh1bWJDZWxsID0gby0+c3R5bGUoKS0+
YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0CisgICAgICAgID8gc2xpZGVy
VGh1bWJWZXJ0aWNhbCgpCisgICAgICAgIDogc2xpZGVyVGh1bWJIb3Jpem9udGFsKCk7CisKKyAg
ICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250
ZXh0KTsKKworICAgIC8vIFVwZGF0ZSB0aGUgdmFyaW91cyBzdGF0ZXMgd2UgcmVzcG9uZCB0by4K
KyAgICB1cGRhdGVBY3RpdmVTdGF0ZShzbGlkZXJUaHVtYkNlbGwsIG8pOworICAgIHVwZGF0ZUVu
YWJsZWRTdGF0ZShzbGlkZXJUaHVtYkNlbGwsIG8pOworICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShz
bGlkZXJUaHVtYkNlbGwsIChvLT5ub2RlKCkgJiYgby0+bm9kZSgpLT5mb2N1c0RlbGVnYXRlKCkt
PnJlbmRlcmVyKCkpID8gby0+bm9kZSgpLT5mb2N1c0RlbGVnYXRlKCktPnJlbmRlcmVyKCkgOiBv
KTsKKworICAgIC8vIFVwZGF0ZSB0aGUgcHJlc3NlZCBzdGF0ZSB1c2luZyB0aGUgTlNDZWxsIHRy
YWNraW5nIG1ldGhvZHMsIHNpbmNlIHRoYXQncyBob3cgTlNTbGlkZXJDZWxsIGtlZXBzIHRyYWNr
IG9mIGl0LgorICAgIGJvb2wgb2xkUHJlc3NlZDsKKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFy
YW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQorICAgICAgICBvbGRQcmVzc2VkID0g
bV9pc1NsaWRlclRodW1iVmVydGljYWxQcmVzc2VkOworICAgIGVsc2UKKyAgICAgICAgb2xkUHJl
c3NlZCA9IG1faXNTbGlkZXJUaHVtYkhvcml6b250YWxQcmVzc2VkOworCisgICAgYm9vbCBwcmVz
c2VkID0gaXNQcmVzc2VkKG8pOworCisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9
PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkKKyAgICAgICAgbV9pc1NsaWRlclRodW1iVmVydGlj
YWxQcmVzc2VkID0gcHJlc3NlZDsKKyAgICBlbHNlCisgICAgICAgIG1faXNTbGlkZXJUaHVtYkhv
cml6b250YWxQcmVzc2VkID0gcHJlc3NlZDsKKworICAgIGlmIChwcmVzc2VkICE9IG9sZFByZXNz
ZWQpIHsKKyAgICAgICAgaWYgKHByZXNzZWQpCisgICAgICAgICAgICBbc2xpZGVyVGh1bWJDZWxs
IHN0YXJ0VHJhY2tpbmdBdDpOU1BvaW50KCkgaW5WaWV3Om5pbF07CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIFtzbGlkZXJUaHVtYkNlbGwgc3RvcFRyYWNraW5nOk5TUG9pbnQoKSBhdDpOU1Bv
aW50KCkgaW5WaWV3Om5pbCBtb3VzZUlzVXA6WUVTXTsKKyAgICB9CisKKyAgICBGbG9hdFJlY3Qg
Ym91bmRzID0gcjsKKyAgICAvLyBNYWtlIHRoZSBoZWlnaHQgb2YgdGhlIHZlcnRpY2FsIHNsaWRl
ciBzbGlnaHRseSBsYXJnZXIgc28gTlNTbGlkZXJDZWxsIHdpbGwgZHJhdyBhIHZlcnRpY2FsIHNs
aWRlci4KKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVy
dGljYWxQYXJ0KQorICAgICAgICBib3VuZHMuc2V0SGVpZ2h0KGJvdW5kcy5oZWlnaHQoKSArIHZl
cnRpY2FsU2xpZGVySGVpZ2h0UGFkZGluZyAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7
CisKKyAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5j
b250ZXh0KTsKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29t
KCk7CisKKyAgICBGbG9hdFJlY3QgdW56b29tZWRSZWN0ID0gYm91bmRzOworICAgIGlmICh6b29t
TGV2ZWwgIT0gMS4wZikgeworICAgICAgICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRS
ZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOworICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0
KHVuem9vbWVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHBhaW50SW5mby5j
b250ZXh0LT50cmFuc2xhdGUodW56b29tZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7Cisg
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29t
TGV2ZWwpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRS
ZWN0LngoKSwgLXVuem9vbWVkUmVjdC55KCkpOworICAgIH0KKworI2lmIFBMQVRGT1JNKENIUk9N
SVVNKQorICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoMCwgdW56b29tZWRSZWN0Lnko
KSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSgxLCAtMSkpOworICAg
IHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoMCwgLSh1bnpvb21lZFJlY3QueSgpICsgdW56
b29tZWRSZWN0LmhlaWdodCgpKSk7CisjZW5kaWYKKworICAgIFtzbGlkZXJUaHVtYkNlbGwgZHJh
d0ludGVyaW9yV2l0aEZyYW1lOnVuem9vbWVkUmVjdCBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8p
XTsKKyAgICBbc2xpZGVyVGh1bWJDZWxsIHNldENvbnRyb2xWaWV3Om5pbF07CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2VhcmNoRmll
bGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcikKK3sKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0
KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoID0gdGhp
cy0+c2VhcmNoKCk7CisKKyAgICBzZXRTZWFyY2hDZWxsU3RhdGUobywgcik7CisKKyAgICBHcmFw
aGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKwor
ICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAg
IEludFJlY3QgdW56b29tZWRSZWN0ID0gcjsKKworICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikg
eworICAgICAgICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0LndpZHRoKCkgLyB6
b29tTGV2ZWwpOworICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVuem9vbWVkUmVjdC5o
ZWlnaHQoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xh
dGUodW56b29tZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7CisgICAgICAgIHBhaW50SW5m
by5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0LngoKSwgLXVuem9v
bWVkUmVjdC55KCkpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgc2VhcmNoIGJ1dHRvbiB0byBu
aWwgYmVmb3JlIGRyYXdpbmcuICBUaGVuIHJlc2V0IGl0IHNvIHdlIGNhbiBkcmF3IGl0IGxhdGVy
LgorICAgIFtzZWFyY2ggc2V0U2VhcmNoQnV0dG9uQ2VsbDpuaWxdOworCisgICAgW3NlYXJjaCBk
cmF3V2l0aEZyYW1lOk5TUmVjdCh1bnpvb21lZFJlY3QpIGluVmlldzpkb2N1bWVudFZpZXdGb3Io
byldOworCisgICAgW3NlYXJjaCBzZXRDb250cm9sVmlldzpuaWxdOworICAgIFtzZWFyY2ggcmVz
ZXRTZWFyY2hCdXR0b25DZWxsXTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6c2V0U2VhcmNoQ2VsbFN0YXRlKFJlbmRlck9iamVjdCogbywgY29u
c3QgSW50UmVjdCYpCit7CisgICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNl
YXJjaCgpOworCisgICAgW3NlYXJjaCBzZXRDb250cm9sU2l6ZTpjb250cm9sU2l6ZUZvckZvbnQo
by0+c3R5bGUoKSldOworCisgICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNw
b25kIHRvLgorICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKHNlYXJjaCwgbyk7CisgICAgdXBkYXRlRW5h
YmxlZFN0YXRlKHNlYXJjaCwgbyk7CisgICAgdXBkYXRlRm9jdXNlZFN0YXRlKHNlYXJjaCwgbyk7
Cit9CisKK2NvbnN0IEludFNpemUqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzZWFyY2hGaWVsZFNp
emVzKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50
U2l6ZSgwLCAyMiksIEludFNpemUoMCwgMTkpLCBJbnRTaXplKDAsIDE3KSB9OworICAgIHJldHVy
biBzaXplczsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2V0U2VhcmNoRmllbGRT
aXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICAvLyBJZiB0aGUgd2lkdGggYW5k
IGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgor
ICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhl
aWdodCgpLmlzQXV0bygpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBVc2UgdGhlIGZvbnQg
c2l6ZSB0byBkZXRlcm1pbmUgdGhlIGludHJpbnNpYyB3aWR0aCBvZiB0aGUgY29udHJvbC4KKyAg
ICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIHNlYXJjaEZpZWxkU2l6ZXMoKSk7Cit9CisKK3ZvaWQg
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoU3R5bGVSZXNvbHZl
ciogc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sK
KyAgICAvLyBPdmVycmlkZSBib3JkZXIuCisgICAgc3R5bGUtPnJlc2V0Qm9yZGVyKCk7CisgICAg
Y29uc3Qgc2hvcnQgYm9yZGVyV2lkdGggPSAyICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAg
ICBzdHlsZS0+c2V0Qm9yZGVyTGVmdFdpZHRoKGJvcmRlcldpZHRoKTsKKyAgICBzdHlsZS0+c2V0
Qm9yZGVyTGVmdFN0eWxlKElOU0VUKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyUmlnaHRXaWR0aChi
b3JkZXJXaWR0aCk7CisgICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0U3R5bGUoSU5TRVQpOworICAg
IHN0eWxlLT5zZXRCb3JkZXJCb3R0b21XaWR0aChib3JkZXJXaWR0aCk7CisgICAgc3R5bGUtPnNl
dEJvcmRlckJvdHRvbVN0eWxlKElOU0VUKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyVG9wV2lkdGgo
Ym9yZGVyV2lkdGgpOworICAgIHN0eWxlLT5zZXRCb3JkZXJUb3BTdHlsZShJTlNFVCk7CisKKyAg
ICAvLyBPdmVycmlkZSBoZWlnaHQuCisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0bykp
OworICAgIHNldFNlYXJjaEZpZWxkU2l6ZShzdHlsZSk7CisKKyAgICAvLyBPdmVycmlkZSBwYWRk
aW5nIHNpemUgdG8gbWF0Y2ggQXBwS2l0IHRleHQgcG9zaXRpb25pbmcuCisgICAgY29uc3QgaW50
IHBhZGRpbmcgPSAxICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBzdHlsZS0+c2V0UGFk
ZGluZ0xlZnQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdS
aWdodChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1RvcChM
ZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ0JvdHRvbShMZW5n
dGgocGFkZGluZywgRml4ZWQpKTsKKworICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemUgPSBj
b250cm9sU2l6ZUZvckZvbnQoc3R5bGUpOworICAgIHNldEZvbnRGcm9tQ29udHJvbFNpemUoc3R5
bGVSZXNvbHZlciwgc3R5bGUsIGNvbnRyb2xTaXplKTsKKworICAgIHN0eWxlLT5zZXRCb3hTaGFk
b3cobnVsbHB0cik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2VhcmNo
RmllbGRDYW5jZWxCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBFbGVtZW50KiBpbnB1dCA9IG8tPm5vZGUo
KS0+c2hhZG93SG9zdCgpOworICAgIGlmICghaW5wdXQpCisgICAgICAgIGlucHV0ID0gdG9FbGVt
ZW50KG8tPm5vZGUoKSk7CisKKyAgICBpZiAoIWlucHV0LT5yZW5kZXJlcigpLT5pc0JveCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQg
bG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICBzZXRTZWFyY2hDZWxsU3RhdGUo
aW5wdXQtPnJlbmRlcmVyKCksIHIpOworCisgICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9
IHRoaXMtPnNlYXJjaCgpOworCisgICAgaWYgKGlucHV0LT5pc0VuYWJsZWRGb3JtQ29udHJvbCgp
ICYmIChpbnB1dC0+aXNUZXh0Rm9ybUNvbnRyb2woKSAmJiAhc3RhdGljX2Nhc3Q8SFRNTFRleHRG
b3JtQ29udHJvbEVsZW1lbnQqPihpbnB1dCktPnJlYWRPbmx5KCkpKSB7CisgICAgICAgIHVwZGF0
ZUFjdGl2ZVN0YXRlKFtzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0sIG8pOworICAgICAgICB1cGRh
dGVQcmVzc2VkU3RhdGUoW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSwgbyk7CisgICAgfQorICAg
IGVsc2UgaWYgKFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdIGlzSGlnaGxpZ2h0ZWRdKQorICAg
ICAgICBbW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSBzZXRIaWdobGlnaHRlZDpOT107CisKKyAg
ICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0
KTsKKworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsK
KworICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5kcyA9IFtzZWFyY2ggY2FuY2VsQnV0dG9uUmVjdEZv
ckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRlckJveCgpLT5waXhlbFNuYXBwZWRCb3JkZXJCb3hS
ZWN0KCkpXTsKKworI2lmIEVOQUJMRShJTlBVVF9TUEVFQ0gpCisgICAgLy8gVGFrZSBjYXJlIG9m
IGNhc2VzIHdoZXJlIHRoZSBjYW5jZWwgYnV0dG9uIHdhcyBub3QgYWxpZ25lZCB3aXRoIHRoZSBy
aWdodCBib3JkZXIgb2YgdGhlIGlucHV0IGVsZW1lbnQgKGZvciBlLmcuCisgICAgLy8gd2hlbiBz
cGVlY2ggaW5wdXQgaXMgZW5hYmxlZCBmb3IgdGhlIGlucHV0IGVsZW1lbnQuCisgICAgSW50UmVj
dCBhYnNCb3VuZGluZ0JveCA9IGlucHV0LT5yZW5kZXJlcigpLT5hYnNvbHV0ZUJvdW5kaW5nQm94
UmVjdCgpOworICAgIGludCBhYnNSaWdodCA9IGFic0JvdW5kaW5nQm94LngoKSArIGFic0JvdW5k
aW5nQm94LndpZHRoKCkgLSBpbnB1dC0+cmVuZGVyQm94KCktPnBhZGRpbmdSaWdodCgpIC0gaW5w
dXQtPnJlbmRlckJveCgpLT5ib3JkZXJSaWdodCgpOworICAgIGludCBzcGFjZVRvUmlnaHRPZkNh
bmNlbEJ1dHRvbiA9IGFic1JpZ2h0IC0gKHIueCgpICsgci53aWR0aCgpKTsKKyAgICBsb2NhbEJv
dW5kcy5zZXRYKGxvY2FsQm91bmRzLngoKSAtIHNwYWNlVG9SaWdodE9mQ2FuY2VsQnV0dG9uKTsK
KyNlbmRpZgorCisgICAgbG9jYWxCb3VuZHMgPSBjb252ZXJ0VG9QYWludGluZ1JlY3QoaW5wdXQt
PnJlbmRlcmVyKCksIG8sIGxvY2FsQm91bmRzLCByKTsKKworICAgIEZsb2F0UmVjdCB1bnpvb21l
ZFJlY3QobG9jYWxCb3VuZHMpOworICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgeworICAgICAg
ICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwp
OworICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVuem9vbWVkUmVjdC5oZWlnaHQoKSAv
IHpvb21MZXZlbCk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUodW56b29t
ZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0
LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAgICAgcGFpbnRJ
bmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0LngoKSwgLXVuem9vbWVkUmVjdC55
KCkpOworICAgIH0KKworICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdIGRyYXdXaXRoRnJh
bWU6dW56b29tZWRSZWN0IGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOworICAgIFtbc2VhcmNo
IGNhbmNlbEJ1dHRvbkNlbGxdIHNldENvbnRyb2xWaWV3Om5pbF07CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitjb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y2FuY2VsQnV0dG9u
U2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJ
bnRTaXplKDE2LCAxMyksIEludFNpemUoMTMsIDExKSwgSW50U2l6ZSgxMywgOSkgfTsKKyAgICBy
ZXR1cm4gc2l6ZXM7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJj
aEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHls
ZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgSW50U2l6ZSBzaXplID0gc2l6ZUZvclN5c3RlbUZv
bnQoc3R5bGUsIGNhbmNlbEJ1dHRvblNpemVzKCkpOworICAgIHN0eWxlLT5zZXRXaWR0aChMZW5n
dGgoc2l6ZS53aWR0aCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNp
emUuaGVpZ2h0KCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsK
K30KKworY29uc3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnJlc3VsdHNCdXR0b25T
aXplcygpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IElu
dFNpemUoMTksIDEzKSwgSW50U2l6ZSgxNywgMTEpLCBJbnRTaXplKDE3LCA5KSB9OworICAgIHJl
dHVybiBzaXplczsKK30KKworY29uc3QgaW50IGVtcHR5UmVzdWx0c09mZnNldCA9IDk7Cit2b2lk
IFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZShT
dHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAg
ICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgcmVzdWx0c0J1dHRvblNp
emVzKCkpOworICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpIC0gZW1wdHlS
ZXN1bHRzT2Zmc2V0LCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUu
aGVpZ2h0KCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTZWFyY2hGaWVsZERlY29yYXRpb24o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpCit7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTZWFy
Y2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgSW50U2l6ZSBzaXplID0gc2l6ZUZvclN5
c3RlbUZvbnQoc3R5bGUsIHJlc3VsdHNCdXR0b25TaXplcygpKTsKKyAgICBzdHlsZS0+c2V0V2lk
dGgoTGVuZ3RoKHNpemUud2lkdGgoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExl
bmd0aChzaXplLmhlaWdodCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVs
bHB0cik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2VhcmNoRmllbGRS
ZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIGlucHV0ID0gby0+bm9kZSgpLT5z
aGFkb3dIb3N0KCk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgICAgaW5wdXQgPSBvLT5ub2RlKCk7
CisgICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWlu
dEluZm8uY29udGV4dCk7CisgICAgc2V0U2VhcmNoQ2VsbFN0YXRlKGlucHV0LT5yZW5kZXJlcigp
LCByKTsKKworICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsK
KworICAgIGlmIChbc2VhcmNoIHNlYXJjaE1lbnVUZW1wbGF0ZV0gIT0gbmlsKQorICAgICAgICBb
c2VhcmNoIHNldFNlYXJjaE1lbnVUZW1wbGF0ZTpuaWxdOworCisgICAgdXBkYXRlQWN0aXZlU3Rh
dGUoW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSwgbyk7CisKKyAgICBGbG9hdFJlY3QgbG9jYWxC
b3VuZHMgPSBbc2VhcmNoIHNlYXJjaEJ1dHRvblJlY3RGb3JCb3VuZHM6TlNSZWN0KGlucHV0LT5y
ZW5kZXJCb3goKS0+cGl4ZWxTbmFwcGVkQm9yZGVyQm94UmVjdCgpKV07CisgICAgbG9jYWxCb3Vu
ZHMgPSBjb252ZXJ0VG9QYWludGluZ1JlY3QoaW5wdXQtPnJlbmRlcmVyKCksIG8sIGxvY2FsQm91
bmRzLCByKTsKKworICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdIGRyYXdXaXRoRnJhbWU6
bG9jYWxCb3VuZHMgaW5WaWV3OmRvY3VtZW50Vmlld0ZvcihvKV07CisgICAgW1tzZWFyY2ggc2Vh
cmNoQnV0dG9uQ2VsbF0gc2V0Q29udHJvbFZpZXc6bmlsXTsKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2NvbnN0IGludCByZXN1bHRzQXJyb3dXaWR0aCA9IDU7Cit2b2lkIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25TdHlsZShTdHlsZVJlc29sdmVy
KiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBJbnRTaXplIHNp
emUgPSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgcmVzdWx0c0J1dHRvblNpemVzKCkpOworICAg
IHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpICsgcmVzdWx0c0Fycm93V2lkdGgs
IEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4
ZWQpKTsKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworfQorCitib29sIFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQorewor
ICAgIE5vZGUqIGlucHV0ID0gby0+bm9kZSgpLT5zaGFkb3dIb3N0KCk7CisgICAgaWYgKCFpbnB1
dCkKKyAgICAgICAgaW5wdXQgPSBvLT5ub2RlKCk7CisgICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIo
KS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3Jh
cGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgc2V0U2Vh
cmNoQ2VsbFN0YXRlKGlucHV0LT5yZW5kZXJlcigpLCByKTsKKworICAgIE5TU2VhcmNoRmllbGRD
ZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKKworICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKFtz
ZWFyY2ggc2VhcmNoQnV0dG9uQ2VsbF0sIG8pOworCisgICAgaWYgKCFbc2VhcmNoIHNlYXJjaE1l
bnVUZW1wbGF0ZV0pCisgICAgICAgIFtzZWFyY2ggc2V0U2VhcmNoTWVudVRlbXBsYXRlOnNlYXJj
aE1lbnVUZW1wbGF0ZSgpXTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVT
YXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5kcyA9IFtzZWFy
Y2ggc2VhcmNoQnV0dG9uUmVjdEZvckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRlckJveCgpLT5w
aXhlbFNuYXBwZWRCb3JkZXJCb3hSZWN0KCkpXTsKKyAgICBsb2NhbEJvdW5kcyA9IGNvbnZlcnRU
b1BhaW50aW5nUmVjdChpbnB1dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3VuZHMsIHIpOworCisg
ICAgSW50UmVjdCB1bnpvb21lZFJlY3QobG9jYWxCb3VuZHMpOworICAgIGlmICh6b29tTGV2ZWwg
IT0gMS4wZikgeworICAgICAgICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0Lndp
ZHRoKCkgLyB6b29tTGV2ZWwpOworICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVuem9v
bWVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0
LT50cmFuc2xhdGUodW56b29tZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7CisgICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwp
KTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0Lngo
KSwgLXVuem9vbWVkUmVjdC55KCkpOworICAgIH0KKworICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRv
bkNlbGxdIGRyYXdXaXRoRnJhbWU6dW56b29tZWRSZWN0IGluVmlldzpkb2N1bWVudFZpZXdGb3Io
byldOworICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdIHNldENvbnRyb2xWaWV3Om5pbF07
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVOVCkK
K0ludFNpemUgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNsaWRlclRpY2tTaXplKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gSW50U2l6ZSgxLCAzKTsKK30KKworaW50IFJlbmRlclRoZW1lTWFjU2hhcmVk
OjpzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
LTk7Cit9CisjZW5kaWYKKworY29uc3QgaW50IHNsaWRlclRodW1iV2lkdGggPSAxNTsKK2NvbnN0
IGludCBzbGlkZXJUaHVtYkhlaWdodCA9IDE1OworCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVk
OjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29u
c3QKK3sKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAg
IGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgfHwg
c3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgeworICAgICAg
ICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHN0YXRpY19jYXN0PGludD4oc2xpZGVyVGh1bWJXaWR0
aCAqIHpvb21MZXZlbCksIEZpeGVkKSk7CisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KHN0YXRpY19jYXN0PGludD4oc2xpZGVyVGh1bWJIZWlnaHQgKiB6b29tTGV2ZWwpLCBGaXhlZCkp
OworICAgIH0KKworI2lmIEVOQUJMRShWSURFTykKKyAgICBhZGp1c3RNZWRpYVNsaWRlclRodW1i
U2l6ZShzdHlsZSk7CisjZW5kaWYKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2hv
dWxkU2hvd1BsYWNlaG9sZGVyV2hlbkZvY3VzZWQoKSBjb25zdAoreworI2lmIF9fTUFDX09TX1hf
VkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MAorICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAg
ICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworTlNQb3BVcEJ1dHRvbkNlbGwqIFJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpwb3B1cEJ1dHRvbigpIGNvbnN0Cit7CisgICAgaWYgKCFtX3BvcHVwQnV0
dG9uKSB7CisgICAgICAgIG1fcG9wdXBCdXR0b24uYWRvcHROUyhbW05TUG9wVXBCdXR0b25DZWxs
IGFsbG9jXSBpbml0VGV4dENlbGw6QCIiIHB1bGxzRG93bjpOT10pOworICAgICAgICBbbV9wb3B1
cEJ1dHRvbi5nZXQoKSBzZXRVc2VzSXRlbUZyb21NZW51Ok5PXTsKKyAgICAgICAgW21fcG9wdXBC
dXR0b24uZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07Cisg
ICAgfQorCisgICAgcmV0dXJuIG1fcG9wdXBCdXR0b24uZ2V0KCk7Cit9CisKK05TU2VhcmNoRmll
bGRDZWxsKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2VhcmNoKCkgY29uc3QKK3sKKyAgICBpZiAo
IW1fc2VhcmNoKSB7CisgICAgICAgIG1fc2VhcmNoLmFkb3B0TlMoW1tOU1NlYXJjaEZpZWxkQ2Vs
bCBhbGxvY10gaW5pdFRleHRDZWxsOkAiIl0pOworICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0
QmV6ZWxTdHlsZTpOU1RleHRGaWVsZFJvdW5kZWRCZXplbF07CisgICAgICAgIFttX3NlYXJjaC5n
ZXQoKSBzZXRCZXplbGVkOllFU107CisgICAgICAgIFttX3NlYXJjaC5nZXQoKSBzZXRFZGl0YWJs
ZTpZRVNdOworICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3Vz
UmluZ1R5cGVFeHRlcmlvcl07CisgICAgfQorCisgICAgcmV0dXJuIG1fc2VhcmNoLmdldCgpOwor
fQorCitOU01lbnUqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzZWFyY2hNZW51VGVtcGxhdGUoKSBj
b25zdAoreworICAgIGlmICghbV9zZWFyY2hNZW51VGVtcGxhdGUpCisgICAgICAgIG1fc2VhcmNo
TWVudVRlbXBsYXRlLmFkb3B0TlMoW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXSk7
CisKKyAgICByZXR1cm4gbV9zZWFyY2hNZW51VGVtcGxhdGUuZ2V0KCk7Cit9CisKK05TU2xpZGVy
Q2VsbCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNsaWRlclRodW1iSG9yaXpvbnRhbCgpIGNvbnN0
Cit7CisgICAgaWYgKCFtX3NsaWRlclRodW1iSG9yaXpvbnRhbCkgeworICAgICAgICBtX3NsaWRl
clRodW1iSG9yaXpvbnRhbC5hZG9wdE5TKFtbTlNTbGlkZXJDZWxsIGFsbG9jXSBpbml0XSk7Cisg
ICAgICAgIFttX3NsaWRlclRodW1iSG9yaXpvbnRhbC5nZXQoKSBzZXRTbGlkZXJUeXBlOk5TTGlu
ZWFyU2xpZGVyXTsKKyAgICAgICAgW21fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmdldCgpIHNldENv
bnRyb2xTaXplOk5TU21hbGxDb250cm9sU2l6ZV07CisgICAgICAgIFttX3NsaWRlclRodW1iSG9y
aXpvbnRhbC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4dGVyaW9yXTsK
KyAgICB9CisKKyAgICByZXR1cm4gbV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0KCk7Cit9CisK
K05TU2xpZGVyQ2VsbCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNsaWRlclRodW1iVmVydGljYWwo
KSBjb25zdAoreworICAgIGlmICghbV9zbGlkZXJUaHVtYlZlcnRpY2FsKSB7CisgICAgICAgIG1f
c2xpZGVyVGh1bWJWZXJ0aWNhbC5hZG9wdE5TKFtbTlNTbGlkZXJDZWxsIGFsbG9jXSBpbml0XSk7
CisgICAgICAgIFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0KCkgc2V0U2xpZGVyVHlwZTpOU0xp
bmVhclNsaWRlcl07CisgICAgICAgIFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0KCkgc2V0Q29u
dHJvbFNpemU6TlNTbWFsbENvbnRyb2xTaXplXTsKKyAgICAgICAgW21fc2xpZGVyVGh1bWJWZXJ0
aWNhbC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4dGVyaW9yXTsKKyAg
ICB9CisKKyAgICByZXR1cm4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgpOworfQorCitOU1Rl
eHRGaWVsZENlbGwqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjp0ZXh0RmllbGQoKSBjb25zdAorewor
ICAgIGlmICghbV90ZXh0RmllbGQpIHsKKyAgICAgICAgbV90ZXh0RmllbGQuYWRvcHROUyhbW1dl
YkNvcmVUZXh0RmllbGRDZWxsIGFsbG9jXSBpbml0VGV4dENlbGw6QCIiXSk7CisgICAgICAgIFtt
X3RleHRGaWVsZC5nZXQoKSBzZXRCZXplbGVkOllFU107CisgICAgICAgIFttX3RleHRGaWVsZC5n
ZXQoKSBzZXRFZGl0YWJsZTpZRVNdOworICAgICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0Rm9j
dXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisjaWYgX19NQUNfT1NfWF9WRVJT
SU9OX01JTl9SRVFVSVJFRCA8PSAxMDcwCisgICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBzZXRE
cmF3c0JhY2tncm91bmQ6WUVTXTsKKyAgICAgICAgW21fdGV4dEZpZWxkLmdldCgpIHNldEJhY2tn
cm91bmRDb2xvcjpbTlNDb2xvciB3aGl0ZUNvbG9yXV07CisjZWxzZQorICAgICAgICAvLyBQb3N0
LUxpb24sIFdlYkNvcmUgY2FuIGJlIGluIGNoYXJnZSBvZiBwYWludGlubmcgdGhlIGJhY2tncm91
bmQgdGhhbmtzIHRvCisgICAgICAgIC8vIHRoZSB3b3JrYXJvdW5kIGluIHBsYWNlIGZvciA8cmRh
cjovL3Byb2JsZW0vMTEzODU0NjE+LCB3aGljaCBpcyBpbXBsZW1lbnRlZAorICAgICAgICAvLyBh
Ym92ZSBhcyBfY29yZVVJRHJhd09wdGlvbnNXaXRoRnJhbWUuCisgICAgICAgIFttX3RleHRGaWVs
ZC5nZXQoKSBzZXREcmF3c0JhY2tncm91bmQ6Tk9dOworI2VuZGlmCisgICAgfQorCisgICAgcmV0
dXJuIG1fdGV4dEZpZWxkLmdldCgpOworfQorCitTdHJpbmcgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OmZpbGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVMaXN0KiBmaWxlTGlzdCwgY29uc3QgRm9u
dCYgZm9udCwgaW50IHdpZHRoLCBib29sIG11bHRpcGxlRmlsZXNBbGxvd2VkKSBjb25zdAorewor
ICAgIGlmICh3aWR0aCA8PSAwKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBTdHJp
bmcgc3RyVG9UcnVuY2F0ZTsKKyAgICBpZiAoZmlsZUxpc3QtPmlzRW1wdHkoKSkKKyAgICAgICAg
c3RyVG9UcnVuY2F0ZSA9IGZpbGVMaXN0RGVmYXVsdExhYmVsKG11bHRpcGxlRmlsZXNBbGxvd2Vk
KTsKKyAgICBlbHNlIGlmIChmaWxlTGlzdC0+bGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgc3RyVG9U
cnVuY2F0ZSA9IFtbTlNGaWxlTWFuYWdlciBkZWZhdWx0TWFuYWdlcl0gZGlzcGxheU5hbWVBdFBh
dGg6KGZpbGVMaXN0LT5pdGVtKDApLT5wYXRoKCkpXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVy
biBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUobXVsdGlwbGVGaWxlVXBsb2FkVGV4dChm
aWxlTGlzdC0+bGVuZ3RoKCkpLCB3aWR0aCwgZm9udCwgU3RyaW5nVHJ1bmNhdG9yOjpFbmFibGVS
b3VuZGluZ0hhY2tzKTsKKworICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OmNlbnRlclRydW5j
YXRlKHN0clRvVHJ1bmNhdGUsIHdpZHRoLCBmb250LCBTdHJpbmdUcnVuY2F0b3I6OkVuYWJsZVJv
dW5kaW5nSGFja3MpOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFBsdWdJ
blNuYXBzaG90T3ZlcmxheShSZW5kZXJTbmFwc2hvdHRlZFBsdWdJbiogcmVuZGVyZXIsIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQpIGNv
bnN0Cit7CisgICAgTGF5b3V0VW5pdCBjV2lkdGggPSByZW5kZXJlci0+Y29udGVudFdpZHRoKCk7
CisgICAgTGF5b3V0VW5pdCBjSGVpZ2h0ID0gcmVuZGVyZXItPmNvbnRlbnRIZWlnaHQoKTsKKyAg
ICBpZiAoIWNXaWR0aCB8fCAhY0hlaWdodCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0ID0gcGFpbnRJbmZvLmNvbnRleHQ7CisgICAgR3JhcGhpY3NDb250
ZXh0U3RhdGVTYXZlciBzYXZlcigqY29udGV4dCk7CisKKyAgICBMYXlvdXRTaXplIGJvcmRlckFu
ZFBhZGRpbmcocmVuZGVyZXItPmJvcmRlckxlZnQoKSArIHJlbmRlcmVyLT5wYWRkaW5nTGVmdCgp
LCByZW5kZXJlci0+Ym9yZGVyVG9wKCkgKyByZW5kZXJlci0+cGFkZGluZ1RvcCgpKTsKKworICAg
IExheW91dFNpemUgY29udGVudFNpemUoY1dpZHRoLCBjSGVpZ2h0KTsKKyAgICBMYXlvdXRQb2lu
dCBjb250ZW50TG9jYXRpb24gPSBwYWludE9mZnNldDsKKyAgICBjb250ZW50TG9jYXRpb24ubW92
ZShib3JkZXJBbmRQYWRkaW5nKTsKKworICAgIFJlZlB0cjxHcmFkaWVudD4gZyA9IEdyYWRpZW50
OjpjcmVhdGUoY29udGVudExvY2F0aW9uLCBGbG9hdFBvaW50KGNvbnRlbnRMb2NhdGlvbi54KCks
IGNvbnRlbnRMb2NhdGlvbi55KCkgKyBjSGVpZ2h0KSk7CisgICAgZy0+YWRkQ29sb3JTdG9wKDAs
ICBDb2xvciguNWYsIC41LCAuNSwgLjcpKTsKKyAgICBnLT5hZGRDb2xvclN0b3AoLjIsIENvbG9y
KC41NGYsIC41NCwgLjU0LCAuMykpOworICAgIGctPmFkZENvbG9yU3RvcCguNiwgQ29sb3IoLjYy
ZiwgLjYyLCAuNjIsIC4zKSk7CisgICAgZy0+YWRkQ29sb3JTdG9wKDEsICBDb2xvciguN2YsIC43
LCAuNywgLjk1KSk7CisgICAgY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGcucmVsZWFzZSgpKTsK
KyAgICBjb250ZXh0LT5maWxsUmVjdChwaXhlbFNuYXBwZWRJbnRSZWN0KExheW91dFJlY3QoY29u
dGVudExvY2F0aW9uLCBjb250ZW50U2l6ZSkpKTsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBk
aWFtZXRlciA9IDUwLCB0cmlhbmdsZVJhZGl1cyA9IDEyOworICAgIExheW91dFBvaW50IGNlbnRl
ciA9IGNvbnRlbnRMb2NhdGlvbjsKKyAgICBjZW50ZXIubW92ZShjV2lkdGggLyAyLCBjSGVpZ2h0
IC8gMik7CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yKC40ZiwgLjQsIC40LCAuNyks
IENvbG9yU3BhY2VTUkdCKTsKKyAgICBjb250ZXh0LT5maWxsRWxsaXBzZShGbG9hdFJlY3QoY2Vu
dGVyLngoKSAtIGRpYW1ldGVyIC8gMiwgY2VudGVyLnkoKSAtIGRpYW1ldGVyIC8gMiwgZGlhbWV0
ZXIsIGRpYW1ldGVyKSk7CisKKyAgICBQYXRoIHA7CisgICAgcC5tb3ZlVG8oRmxvYXRQb2ludChj
ZW50ZXIueCgpIC0gdHJpYW5nbGVSYWRpdXMgKiAzIC8gNCwgY2VudGVyLnkoKSAtIHRyaWFuZ2xl
UmFkaXVzKSk7CisgICAgcC5hZGRMaW5lVG8oRmxvYXRQb2ludChjZW50ZXIueCgpICsgdHJpYW5n
bGVSYWRpdXMgKiA1IC8gNCwgY2VudGVyLnkoKSkpOworICAgIHAuYWRkTGluZVRvKEZsb2F0UG9p
bnQoY2VudGVyLngoKSAtIHRyaWFuZ2xlUmFkaXVzICogMyAvIDQsIGNlbnRlci55KCkgKyB0cmlh
bmdsZVJhZGl1cykpOworICAgIHAuY2xvc2VTdWJwYXRoKCk7CisgICAgY29udGV4dC0+c2V0Rmls
bENvbG9yKENvbG9yKDEuZiwgMS5mLCAxLmYsIC45ZiksIENvbG9yU3BhY2VTUkdCKTsKKyAgICBj
b250ZXh0LT5maWxsUGF0aChwKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173983</attachid>
            <date>2012-11-13 14:03:54 -0800</date>
            <delta_ts>2012-11-13 19:16:34 -0800</delta_ts>
            <desc>RenderThemeMacShared,v2</desc>
            <filename>bug-101634-20121113170153.patch</filename>
            <type>text/plain</type>
            <size>194712</size>
            <attacher name="Robert Sesek">rsesek</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM0NDc2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNjE1ZWRkYTM1ZDI0NWVk
MjNiMDk5ZDUyMWU5Nzk1MmY2ZTczMWQ2Yi4uNDIxODU3OWJkYmNjNjFiYjNiZWFlYTE0NzIxMzk4
YThjMDg4MWE0MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1NCBAQAorMjAxMi0xMS0xMiAgUm9i
ZXJ0IFNlc2VrICA8cnNlc2VrQGNocm9taXVtLm9yZz4KKworICAgICAgICBTZXZlciBDaHJvbWl1
bSdzIGRlcGVuZGVuY2Ugb24gV2ViS2l0U3lzdGVtSW50ZXJmYWNlIG1lZGlhIGNvbnRyb2wgZHJh
d2luZyBmdW5jdGlvbnMgaW4gUmVuZGVyVGhlbWVNYWMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwMTYzNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgc3BsaXRzIG91dCB0aGUgY29tbW9uIG1ldGhv
ZHMgYmV0d2VlbiBSZW5kZXJUaGVtZU1hYyBhbmQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYworICAg
ICAgICBpbnRvIFJlbmRlclRoZW1lTWFjU2hhcmVkLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywg
anVzdCByZWZhY3RvcmluZy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwOiBS
ZW1vdmUgUmVuZGVyVGhlbWVNYWMubW0gZnJvbSBwbGF0Zm9ybS8gc291cmNlcyBsaXN0LCBzaW5j
ZSBpdCdzIHBhcnQgb2YgcmVuZGVyaW5nLworICAgICAgICAqIFdlYkNvcmUuZ3lwaTogQWRkIFJl
bmRlclRoZW1lTWFjU2hhcmVkLntoLG1tfQorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvajogQWRkIFJlbmRlclRoZW1lTWFjU2hhcmVkLntoLG1tfQorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLmg6CisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlclRoZW1lQ2hyb21pdW1NYWMubW06CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUNocm9taXVtTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpleHRyYURlZmF1bHRTdHls
ZVNoZWV0KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaDoKKyAgICAgICAg
KFJlbmRlclRoZW1lTWFjKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW06
CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lOjp0aGVt
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmNyZWF0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6UmVuZGVyVGhlbWVNYWMpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6On5SZW5kZXJUaGVtZU1hYyk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6ZG9jdW1lbnRWaWV3Rm9yKToKKyAgICAgICAgKFdlYkNv
cmU6Om1lZGlhQ29udHJvbGxlclRoZW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjOjpwYWludE1lZGlhU2xpZGVyVHJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWM6OnBhaW50TWVkaWFSZXdpbmRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWM6OnBhaW50TWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRy
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhRnVsbFNj
cmVlblZvbHVtZVNsaWRlclRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
OjpleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjOjpleHRyYUZ1bGxTY3JlZW5TdHlsZVNoZWV0KToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQuaDogQ29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lTWFjLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJl
bmRlclRoZW1lTWFjU2hhcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzdXBwb3J0c0NvbnRyb2xUaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2Nyb2xsYmFyQ29udHJvbFNpemVGb3JQYXJ0KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpzdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRDb2xv
cnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnN1cHBvcnRzQ2xv
c2VkQ2FwdGlvbmluZyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
dXBkYXRlQWN0aXZlU3RhdGUpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1No
YXJlZC5tbTogQ29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1l
TWFjLm1tLgorICAgICAgICAoLVtXZWJDb3JlUmVuZGVyVGhlbWVOb3RpZmljYXRpb25PYnNlcnZl
ciBpbml0V2l0aFRoZW1lOldlYkNvcmU6Ol0pOgorICAgICAgICAoLVtXZWJDb3JlUmVuZGVyVGhl
bWVOb3RpZmljYXRpb25PYnNlcnZlciBzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6XSk6CisgICAgICAg
ICgtW1dlYkNvcmVUZXh0RmllbGRDZWxsIF9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTppblZp
ZXc6aW5jbHVkZUZvY3VzOl0pOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6UmVuZGVyVGhlbWVNYWNTaGFyZWQpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6On5SZW5kZXJUaGVtZU1hY1NoYXJlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1BY3RpdmVTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3JtQWN0aXZlTGlzdEJveFNl
bGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6cGxhdGZvcm1BY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUluYWN0aXZl
TGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1Gb2N1c1JpbmdDb2xvcik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6dG9Gb250V2VpZ2h0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpzeXN0ZW1Gb250KToKKyAgICAg
ICAgKFdlYkNvcmU6OmNvbnZlcnROU0NvbG9yVG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpt
ZW51QmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZU1hY1NoYXJlZDo6c3lzdGVtQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjppc0NvbnRyb2xTdHlsZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFJlcGFpbnRSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjppbmZsYXRlUmVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udmVydFRvUGFpbnRpbmdSZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjp1cGRhdGVDaGVja2VkU3RhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnVwZGF0ZUVuYWJsZWRT
dGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dXBkYXRlRm9j
dXNlZFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjp1cGRh
dGVQcmVzc2VkU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OmNvbnRyb2xTdXBwb3J0c1RpbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
U2hhcmVkOjpjb250cm9sU2l6ZUZvckZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnNldENvbnRyb2xTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpzaXplRm9yRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2l6ZUZvclN5c3RlbUZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWNTaGFyZWQ6OnNldFNpemVGcm9tRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6c2V0Rm9udEZyb21Db250cm9sU2l6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udHJvbFNpemVGb3JTeXN0ZW1Gb250KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFRleHRGaWVsZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0VGV4dEZpZWxkU3R5
bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50Q2Fwc0xv
Y2tJbmRpY2F0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBh
aW50VGV4dEFyZWEpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFk
anVzdFRleHRBcmVhU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFy
ZWQ6OnBvcHVwQnV0dG9uTWFyZ2lucyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6cG9wdXBCdXR0b25TaXplcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6cG9wdXBCdXR0b25QYWRkaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwYWludE1lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjU2hhcmVkOjptZXRlclNpemVGb3JCb3VuZHMpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50TWV0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OnN1cHBvcnRzTWV0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OmxldmVsSW5kaWNhdG9yU3R5bGVGb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmxldmVsSW5kaWNhdG9yRm9yKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwcm9ncmVzc0JhclNpemVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwcm9ncmVzc0Jhck1hcmdpbnMpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6Om1pbmltdW1Qcm9ncmVzc0Jh
ckhlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YW5pbWF0
aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0Jhcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0Jhcik6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0UHJvZ3Jlc3NCYXJTdHls
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRQcm9ncmVz
c0Jhcik6CisgICAgICAgIChXZWJDb3JlOjpUb3BHcmFkaWVudEludGVycG9sYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkJvdHRvbUdyYWRpZW50SW50ZXJwb2xhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWFpbkdyYWRpZW50SW50ZXJwb2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhY2tHcmFk
aWVudEludGVycG9sYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVk
OjpwYWludE1lbnVMaXN0QnV0dG9uR3JhZGllbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwYWludE1lbnVMaXN0QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6
Om1lbnVMaXN0QnV0dG9uU2l6ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OmFkanVzdE1lbnVMaXN0U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdU
b3ApOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJu
YWxQYWRkaW5nQm90dG9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVk
OjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpzZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bWVudUxpc3RTaXplcyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bWluaW11bU1lbnVMaXN0U2l6ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2xpZGVyVHJhY2tTdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTbGlkZXJUcmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2xpZGVyVGh1
bWJTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRT
bGlkZXJUaHVtYik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFp
bnRTZWFyY2hGaWVsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
c2V0U2VhcmNoQ2VsbFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzZWFyY2hGaWVsZFNpemVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
U2hhcmVkOjpzZXRTZWFyY2hGaWVsZFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24pOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmNhbmNlbEJ1dHRvblNpemVzKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTZWFyY2hGaWVs
ZENhbmNlbEJ1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpyZXN1bHRzQnV0dG9uU2l6ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2VhcmNoRmll
bGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1
dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWlu
dFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2xpZGVyVGlja1NpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnNsaWRlclRpY2tPZmZzZXRGcm9tVHJhY2tDZW50ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNsaWRlclRodW1iU2l6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2hvdWxkU2hvd1BsYWNlaG9s
ZGVyV2hlbkZvY3VzZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OnBvcHVwQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hhcmVkOjpz
ZWFyY2gpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNlYXJjaE1l
bnVUZW1wbGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2xp
ZGVyVGh1bWJIb3Jpem9udGFsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzbGlkZXJUaHVtYlZlcnRpY2FsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjU2hhcmVkOjp0ZXh0RmllbGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OmZpbGVMaXN0TmFtZUZvcldpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lTWFjU2hhcmVkOjpwYWludFBsdWdJblNuYXBzaG90T3ZlcmxheSk6CisKIDIwMTItMTEtMTMg
IE1pbGlhbiBXb2xmZiAgPG1pbGlhbi53b2xmZkBrZGFiLmNvbT4KIAogICAgICAgICBbUXRdIFFO
WCBidWlsZCBmYWlscyBkdWUgdG8gc2lnbmF0dXJlIGNoYW5nZSBpbiBnbDIuaCBoZWFkZXIgKGds
U2hhZGVyU291cmNlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2Vi
Q29yZS5neXAgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAppbmRleCBi
MWI2NDQwZDRlZTZiZDg4OWRiYzFjNjA2Yzc3MjIyNDViOThlZmY2Li43YmY4NGNlYjE2ZmM0YWRk
ZTI5MGJlMGQ4NmY1MDg4YzFmMTIxMzM4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLmd5cC9XZWJDb3JlLmd5cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJD
b3JlLmd5cApAQCAtMTc0Niw3ICsxNzQ2LDYgQEAKICAgICAgICAgICBdLAogICAgICAgICAgICdz
b3VyY2VzJzogWwogICAgICAgICAgICAgJy4uL2VkaXRpbmcvU21hcnRSZXBsYWNlQ0YuY3BwJywK
LSAgICAgICAgICAgICcuLi9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0nLAogICAgICAgICAg
ICAgJy4uLy4uL1dlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViU3lzdGVtSW50ZXJmYWNlLm1t
JywKICAgICAgICAgICBdLAogICAgICAgICAgICdzb3VyY2VzLyc6IFsKQEAgLTE3NjcsNyArMTc2
Niw2IEBACiAgICAgICAgICAgICAjIENoZXJyeS1waWNrIHNvbWUgZmlsZXMgdGhhdCBjYW4ndCBi
ZSBpbmNsdWRlZCBieSBicm9hZGVyIHJlZ2V4cHMuCiAgICAgICAgICAgICAjIFNvbWUgb2YgdGhl
c2UgYXJlIHVzZWQgaW5zdGVhZCBvZiBDaHJvbWl1bSBwbGF0Zm9ybSBmaWxlcywgc2VlCiAgICAg
ICAgICAgICAjIHRoZSBzcGVjaWZpYyBleGNsdXNpb25zIGluIHRoZSAiZXhjbHVkZSIgbGlzdCBi
ZWxvdy4KLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdyZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNc
XC5tbSQnXSwKICAgICAgICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9ncmFwaGljcy9tYWMv
Q29sb3JNYWNcXC5tbSQnXSwKICAgICAgICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9ncmFw
aGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHRcXC5tbSQnXSwKICAgICAgICAg
ICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9ncmFwaGljcy9tYWMvRmxvYXRQb2ludE1hY1xcLm1t
JCddLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IGNlZjk0Yjk5MzAzMzQzZDg3ZDhlZWM1ZTliNTJhNDRl
MTRiMDBjZGEuLjQ4NjZiMzJkOTg5ODUyYzNkZmQ2ZTk1MDU4ZTIxNjI4MzFiZjQwNjcgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkKQEAgLTM0NjMsNiArMzQ2Myw4IEBACiAgICAgICAgICAgICAncmVuZGVyaW5n
L1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uaCcsCiAgICAgICAgICAgICAncmVuZGVyaW5nL1JlbmRl
clRoZW1lTWFjLmgnLAogICAgICAgICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbScs
CisgICAgICAgICAgICAncmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjU2hhcmVkLmgnLAorICAgICAg
ICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5tbScsCiAgICAgICAgICAgICAn
cmVuZGVyaW5nL1JlbmRlclRoZW1lU2FmYXJpLmNwcCcsCiAgICAgICAgICAgICAncmVuZGVyaW5n
L1JlbmRlclRoZW1lU2FmYXJpLmgnLAogICAgICAgICAgICAgJ3JlbmRlcmluZy9SZW5kZXJUaGVt
ZVdpbi5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCmluZGV4IGI1MDFlOWI3OWY3OTA1YzM3Mzg4N2Q0M2U2NjZmZmZiZWY4NjhkNzIu
Ljk3Yzg2MzYyMTdhYmQwNjRhYmM2MDExYWZjMWY5NTg2YTVhMTU3MDQgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTY3Nyw2ICs2
NzcsOCBAQAogCQkxQ0Y2QkUxNDBFOUJCNDY3MDAyNUUxQ0QgLyogT2JqQ05vZGVGaWx0ZXJDb25k
aXRpb24ubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAx
Q0Y2QkUxMjBFOUJCNDY3MDAyNUUxQ0QgLyogT2JqQ05vZGVGaWx0ZXJDb25kaXRpb24ubW0gKi87
IH07CiAJCTFDRjZCRTE1MEU5QkI0NjcwMDI1RTFDRCAvKiBPYmpDTm9kZUZpbHRlckNvbmRpdGlv
bi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUNGNkJF
MTMwRTlCQjQ2NzAwMjVFMUNEIC8qIE9iakNOb2RlRmlsdGVyQ29uZGl0aW9uLmggKi87IH07CiAJ
CTFDRkFFMzIzMEE2RDZBM0YwMDMyNTkzRCAvKiBsaWJvYmpjLmR5bGliIGluIEZyYW1ld29ya3Mg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUNGQUUzMjIwQTZENkEzRjAwMzI1
OTNEIC8qIGxpYm9iamMuZHlsaWIgKi87IH07CisJCTFFNTAwODQ3MTY1MTZBRDgwMEI3RTA5OCAv
KiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMUU1MDA4NDUxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1lTWFj
U2hhcmVkLmggKi87IH07CisJCTFFNTAwODQ4MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVt
ZU1hY1NoYXJlZC5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDFFNTAwODQ2MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5tbSAq
LzsgfTsKIAkJMUYzQzNCRUExMzVDQUYzQzAwQjhDMUFDIC8qIE1lZGlhQ29udHJvbHMuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUYzQzNCRTgxMzVD
QUYzQzAwQjhDMUFDIC8qIE1lZGlhQ29udHJvbHMuY3BwICovOyB9OwogCQkxRjNDM0JFQjEzNUNB
RjNDMDBCOEMxQUMgLyogTWVkaWFDb250cm9scy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMUYzQzNCRTkxMzVDQUYzQzAwQjhDMUFDIC8qIE1lZGlhQ29u
dHJvbHMuaCAqLzsgfTsKIAkJMUYzRjE5NTMxNDk5Q0E3NjAwQTVBRUE3IC8qIFBPREZyZWVMaXN0
QXJlbmEuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFG
M0YxOTUyMTQ5OUNBNzYwMEE1QUVBNyAvKiBQT0RGcmVlTGlzdEFyZW5hLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTc3OTYsNiArNzc5OCw4IEBA
CiAJCTFDRjZCRTEyMEU5QkI0NjcwMDI1RTFDRCAvKiBPYmpDTm9kZUZpbHRlckNvbmRpdGlvbi5t
bSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IE9iakNOb2RlRmlsdGVy
Q29uZGl0aW9uLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxQ0Y2QkUxMzBFOUJC
NDY3MDAyNUUxQ0QgLyogT2JqQ05vZGVGaWx0ZXJDb25kaXRpb24uaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gT2JqQ05vZGVGaWx0ZXJDb25kaXRpb24uaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJMUNGQUUzMjIwQTZENkEzRjAwMzI1OTNEIC8qIGxpYm9iamMuZHls
aWIgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSAiY29t
cGlsZWQubWFjaC1vLmR5bGliIjsgbmFtZSA9IGxpYm9iamMuZHlsaWI7IHBhdGggPSAvdXNyL2xp
Yi9saWJvYmpjLmR5bGliOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkxRTUwMDg0
NTE2NTE2QUQ4MDBCN0UwOTggLyogUmVuZGVyVGhlbWVNYWNTaGFyZWQuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyVGhlbWVNYWNTaGFyZWQuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKKwkJMUU1MDA4NDYxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1l
TWFjU2hhcmVkLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gUmVu
ZGVyVGhlbWVNYWNTaGFyZWQubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFGM0Mz
QkU4MTM1Q0FGM0MwMEI4QzFBQyAvKiBNZWRpYUNvbnRyb2xzLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE1lZGlhQ29udHJvbHMuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkxRjNDM0JFOTEzNUNBRjNDMDBCOEMxQUMgLyogTWVkaWFDb250cm9scy5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBNZWRpYUNvbnRyb2xzLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFGM0YxOTUyMTQ5OUNBNzYwMEE1QUVBNyAvKiBQT0RG
cmVlTGlzdEFyZW5hLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBPREZyZWVM
aXN0QXJlbmEuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIxNjY2LDYgKzIxNjcw
LDggQEAKIAkJCQlCQ0VBNDg0QjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWUuaCAqLywK
IAkJCQlCQ0VBNDg0ODA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWVNYWMuaCAqLywKIAkJ
CQlCQ0VBNDg0OTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWVNYWMubW0gKi8sCisJCQkJ
MUU1MDA4NDUxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVkLmggKi8sCisJ
CQkJMUU1MDA4NDYxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVkLm1tICov
LAogCQkJCTkzOTU1QTQyMDNENzI5MzIwMDg2MzVDRSAvKiBSZW5kZXJUcmVlQXNUZXh0LmNwcCAq
LywKIAkJCQk5Mzk1NUE0MTAzRDcyOTMyMDA4NjM1Q0UgLyogUmVuZGVyVHJlZUFzVGV4dC5oICov
LAogCQkJCUU0QjQxRTMzMENCRkI2MDkwMEFGMkVDRSAvKiBSZW5kZXJWaWRlby5jcHAgKi8sCkBA
IC0yNTcxNCw2ICsyNTcyMCw3IEBACiAJCQkJRTE0MjRDOTQxNjRCNTJDODAwRjMyRDQwIC8qIENv
b2tpZUphci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTQxMURDQjExNjRDMzlBODAwRDQ5QkMxIC8q
IFdpZHRoQ2FjaGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTU3MEI3OEMwMTY1MENFODEwMDFEQkUx
QiAvKiBTZWxlY3RSdWxlRmVhdHVyZVNldC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUU1MDA4NDcx
NjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVkLmggaW4gSGVhZGVycyAqLywK
IAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsK
QEAgLTI4ODAxLDYgKzI4ODA4LDcgQEAKIAkJCQlFMTQyNEM5MDE2NEI0NjBCMDBGMzJENDAgLyog
Q29va2llSmFyTWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJRTE0MjRDOTMxNjRCNTJDODAwRjMy
RDQwIC8qIENvb2tpZUphci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1NzBCNzhCRjE2NTBDRTgx
MDAxREJFMUIgLyogU2VsZWN0UnVsZUZlYXR1cmVTZXQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
MUU1MDA4NDgxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVkLm1tIGluIFNv
dXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9
IDA7CiAJCX07CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhl
bWVDaHJvbWl1bU1hYy5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hy
b21pdW1NYWMuaAppbmRleCAxZjVhODE0ODQ5MWI0OGQ5YjIzODFlYTdiY2U5NTQzMTE5ODQwZmE4
Li41YWNkMTNhZjUwOWFjZjE1YTBmYWQ2Nzg4NDdmMGUwZGM4NjU5NTE0IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bU1hYy5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLmgKQEAgLTI1LDEx
ICsyNSwxMSBAQAogI2RlZmluZSBSZW5kZXJUaGVtZUNocm9taXVtTWFjX2gKIAogI2ltcG9ydCAi
UmVuZGVyVGhlbWVDaHJvbWl1bUNvbW1vbi5oIgotI2ltcG9ydCAiUmVuZGVyVGhlbWVNYWMuaCIK
KyNpbXBvcnQgIlJlbmRlclRoZW1lTWFjU2hhcmVkLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotY2xhc3MgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYyA6IHB1YmxpYyBSZW5kZXJUaGVtZU1hYyB7
CitjbGFzcyBSZW5kZXJUaGVtZUNocm9taXVtTWFjIDogcHVibGljIFJlbmRlclRoZW1lTWFjU2hh
cmVkIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gY3JlYXRl
KCk7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUNo
cm9taXVtTWFjLm1tIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21p
dW1NYWMubW0KaW5kZXggNTZkOWVhNjA3YjE0NGYzNmU4ZTQ5YWEwZTg3NjJmYmQ1Nzc5ZmUwYy4u
OTFmZTZiYTY2ODQ1ODgxODBmYTc0YWJiZjUwYzBlMmY2NWIwMDJlNSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1NYWMubW0KKysrIGIvU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1NYWMubW0KQEAgLTk5LDcg
Kzk5LDcgQEAgaW50IFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
TGVmdChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiAgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNl
KCkgPT0gVGV4dEZpZWxkUGFydCkKICAgICAgICAgcmV0dXJuIGF1dG9maWxsUG9wdXBIb3Jpem9u
dGFsUGFkZGluZzsKIAotICAgIHJldHVybiBSZW5kZXJUaGVtZU1hYzo6cG9wdXBJbnRlcm5hbFBh
ZGRpbmdMZWZ0KHN0eWxlKTsKKyAgICByZXR1cm4gUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVw
SW50ZXJuYWxQYWRkaW5nTGVmdChzdHlsZSk7CiB9CiAKIGludCBSZW5kZXJUaGVtZUNocm9taXVt
TWFjOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QK
QEAgLTEwNyw3ICsxMDcsNyBAQCBpbnQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiAgICAgaWYgKHN0eWxl
LT5hcHBlYXJhbmNlKCkgPT0gVGV4dEZpZWxkUGFydCkKICAgICAgICAgcmV0dXJuIGF1dG9maWxs
UG9wdXBIb3Jpem9udGFsUGFkZGluZzsKIAotICAgIHJldHVybiBSZW5kZXJUaGVtZU1hYzo6cG9w
dXBJbnRlcm5hbFBhZGRpbmdSaWdodChzdHlsZSk7CisgICAgcmV0dXJuIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KHN0eWxlKTsKIH0KIAogLy8gVXBkYXRl
cyB0aGUgY29udHJvbCB0aW50IChhLmsuYS4gYWN0aXZlIHN0YXRlKSBvZiB8Y2VsbHwgKGZyb20g
fG98KS4KQEAgLTE3MSw3ICsxNzEsNyBAQCBTdHJpbmcgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6
ZXh0cmFGdWxsU2NyZWVuU3R5bGVTaGVldCgpCiAKIFN0cmluZyBSZW5kZXJUaGVtZUNocm9taXVt
TWFjOjpleHRyYURlZmF1bHRTdHlsZVNoZWV0KCkKIHsKLSAgICByZXR1cm4gUmVuZGVyVGhlbWVN
YWM6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKSArCisgICAgcmV0dXJuIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjpleHRyYURlZmF1bHRTdHlsZVNoZWV0KCkgKwogICAgICAgICAgICBTdHJpbmcodGhl
bWVDaHJvbWl1bVVzZXJBZ2VudFN0eWxlU2hlZXQsIHNpemVvZih0aGVtZUNocm9taXVtVXNlckFn
ZW50U3R5bGVTaGVldCkpOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyVGhlbWVNYWMuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVt
ZU1hYy5oCmluZGV4IDMyODg0NzFhZGVkNDA1MjlmNjJjMDU0N2ZhZjI2ODY0MDViNzllYTYuLjAz
ZDgwOWVkNmM4NzlhODNlYjIwYjk1MjdkNmVjZjg1ZTI4OWYyYjUgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oCkBAIC0yMywxMzEgKzIzLDI0IEBACiAjaWZuZGVm
IFJlbmRlclRoZW1lTWFjX2gKICNkZWZpbmUgUmVuZGVyVGhlbWVNYWNfaAogCi0jaW1wb3J0ICJS
ZW5kZXJUaGVtZS5oIgotI2ltcG9ydCA8d3RmL0hhc2hNYXAuaD4KKyNpbXBvcnQgIlJlbmRlclRo
ZW1lTWFjU2hhcmVkLmgiCiAjaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+CiAKLQotT0JKQ19DTEFT
UyBXZWJDb3JlUmVuZGVyVGhlbWVOb3RpZmljYXRpb25PYnNlcnZlcjsKLQogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiBjbGFzcyBSZW5kZXJQcm9ncmVzczsKIGNsYXNzIFJlbmRlclN0eWxlOwogCi1j
bGFzcyBSZW5kZXJUaGVtZU1hYyA6IHB1YmxpYyBSZW5kZXJUaGVtZSB7CitjbGFzcyBSZW5kZXJU
aGVtZU1hYyA6IHB1YmxpYyBSZW5kZXJUaGVtZU1hY1NoYXJlZCB7CiBwdWJsaWM6CiAgICAgc3Rh
dGljIFBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IGNyZWF0ZSgpOwogCi0gICAgLy8gQSBtZXRob2Qg
YXNraW5nIGlmIHRoZSBjb250cm9sIGNoYW5nZXMgaXRzIHRpbnQgd2hlbiB0aGUgd2luZG93IGhh
cyBmb2N1cyBvciBub3QuCi0gICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1RpbnRzKGNv
bnN0IFJlbmRlck9iamVjdCopIGNvbnN0OwotCi0gICAgLy8gQSBnZW5lcmFsIG1ldGhvZCBhc2tp
bmcgaWYgYW55IGNvbnRyb2wgdGludGluZyBpcyBzdXBwb3J0ZWQgYXQgYWxsLgotICAgIHZpcnR1
YWwgYm9vbCBzdXBwb3J0c0NvbnRyb2xUaW50cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQot
ICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RSZXBhaW50UmVjdChjb25zdCBSZW5kZXJPYmplY3QqLCBJ
bnRSZWN0JikgT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDb250cm9sU3R5bGVkKGNv
bnN0IFJlbmRlclN0eWxlKiwgY29uc3QgQm9yZGVyRGF0YSYsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGaWxsTGF5ZXImLCBjb25zdCBDb2xvciYgYmFja2dyb3VuZENv
bG9yKSBjb25zdDsKLQotICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25C
YWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5hY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIENvbG9yIHBs
YXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OwotICAg
IHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1BY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENv
bG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZlTGlzdEJveFNl
bGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZv
cm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIENvbG9yIHBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25zdDsKLQotICAgIHZpcnR1
YWwgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2Nyb2xsYmFyQ29udHJvbFNpemVGb3JQYXJ0KENvbnRy
b2xQYXJ0KSB7IHJldHVybiBTbWFsbFNjcm9sbGJhcjsgfQotICAgIAotICAgIHZpcnR1YWwgdm9p
ZCBwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOwotCi0gICAgLy8gU3lzdGVtIGZvbnRzLgotICAg
IHZpcnR1YWwgdm9pZCBzeXN0ZW1Gb250KGludCBjc3NWYWx1ZUlkLCBGb250RGVzY3JpcHRpb24m
KSBjb25zdDsKLQotICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5
bGUqKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVu
ZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0KLSNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVO
VCkKLSAgICB2aXJ0dWFsIEludFNpemUgc2xpZGVyVGlja1NpemUoKSBjb25zdCBPVkVSUklERTsK
LSAgICB2aXJ0dWFsIGludCBzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3Qg
T1ZFUlJJREU7Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5n
TGVmdChSZW5kZXJTdHlsZSopIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQ
YWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBwb3B1cElu
dGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSopIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHBv
cHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKikgY29uc3Q7Ci0gICAgCi0gICAg
dmlydHVhbCBib29sIHBhaW50Q2Fwc0xvY2tJbmRpY2F0b3IoUmVuZGVyT2JqZWN0KiwgY29uc3Qg
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpIE9WRVJSSURFOwotCi0gICAgdmlydHVhbCBib29s
IHBvcHNNZW51QnlBcnJvd0tleXMoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiB0cnVlOyB9Ci0K
LSNpZiBFTkFCTEUoTUVURVJfRUxFTUVOVCkKLSAgICB2aXJ0dWFsIEludFNpemUgbWV0ZXJTaXpl
Rm9yQm91bmRzKGNvbnN0IFJlbmRlck1ldGVyKiwgY29uc3QgSW50UmVjdCYpIGNvbnN0IE9WRVJS
SURFOwotICAgIHZpcnR1YWwgYm9vbCBwYWludE1ldGVyKFJlbmRlck9iamVjdCosIGNvbnN0IFBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNNZXRl
cihDb250cm9sUGFydCkgY29uc3Q7Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShQUk9HUkVTU19FTEVN
RU5UKQotICAgIC8vIFJldHVybnMgdGhlIHJlcGVhdCBpbnRlcnZhbCBvZiB0aGUgYW5pbWF0aW9u
IGZvciB0aGUgcHJvZ3Jlc3MgYmFyLgotICAgIHZpcnR1YWwgZG91YmxlIGFuaW1hdGlvblJlcGVh
dEludGVydmFsRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdDsKLSAgICAvLyBS
ZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGZvciB0aGUgcHJvZ3Jlc3MgYmFy
LgotICAgIHZpcnR1YWwgZG91YmxlIGFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVu
ZGVyUHJvZ3Jlc3MqKSBjb25zdDsKLSNlbmRpZgotCi0gICAgdmlydHVhbCBDb2xvciBzeXN0ZW1D
b2xvcihpbnQgY3NzVmFsdWVJZCkgY29uc3Q7Ci0gICAgLy8gQ29udHJvbHMgY29sb3IgdmFsdWVz
IHJldHVybmVkIGZyb20gcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpLiBzeXN0ZW1Db2xvcigpIHdp
bGwgYmUgdXNlZCB3aGVuIGZhbHNlLgotICAgIHZpcnR1YWwgYm9vbCB1c2VzVGVzdE1vZGVGb2N1
c1JpbmdDb2xvcigpIGNvbnN0OwotICAgIC8vIEEgdmlldyBhc3NvY2lhdGVkIHRvIHRoZSBjb250
YWluZWQgZG9jdW1lbnQuIFN1YmNsYXNzZXMgbWF5IG5vdCBoYXZlIHN1Y2ggYSB2aWV3IGFuZCBy
ZXR1cm4gYSBmYWtlLgogICAgIHZpcnR1YWwgTlNWaWV3KiBkb2N1bWVudFZpZXdGb3IoUmVuZGVy
T2JqZWN0KikgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRQbHVnSW5TbmFwc2hvdE92
ZXJsYXkoUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4qLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBM
YXlvdXRQb2ludCYpIGNvbnN0IE9WRVJSSURFOwotCiBwcm90ZWN0ZWQ6CiAgICAgUmVuZGVyVGhl
bWVNYWMoKTsKICAgICB2aXJ0dWFsIH5SZW5kZXJUaGVtZU1hYygpOwogCi0gICAgdmlydHVhbCBi
b29sIHN1cHBvcnRzU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9ycygpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RUZXh0RmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50Kikg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGFkanVz
dFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNv
bnN0OwotCi0gICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiwgY29u
c3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RN
ZW51TGlzdFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25z
dDsKLQotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCos
IGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRq
dXN0TWVudUxpc3RCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7Ci0KLSNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKLSAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUq
LCBFbGVtZW50KikgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHBhaW50UHJvZ3Jlc3NCYXIoUmVu
ZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotI2VuZGlmCi0K
LSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRl
clRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0
OwotCi0gICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiwgY29u
c3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RT
bGlkZXJUaHVtYlN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBj
b25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCos
IGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRq
dXN0U2VhcmNoRmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50
KikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0
b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0g
ICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotCi0gICAgdmlydHVhbCB2b2lk
IGFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJT
dHlsZSosIEVsZW1lbnQqKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVs
ZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOwotCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRp
b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0g
ICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlcios
IFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBwYWludFNl
YXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7Ci0KICNpZiBFTkFCTEUoVklERU8pCiAgICAgdmlydHVhbCBib29sIHBh
aW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYVBsYXlCdXR0b24o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwpAQCAtMTc0
LDg3ICs2NywxMiBAQCBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFGdWxsU2Ny
ZWVuU3R5bGVTaGVldCgpOwogI2VuZGlmCiAKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNDbG9z
ZWRDYXB0aW9uaW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgYm9vbCBo
YXNPd25EaXNhYmxlZFN0YXRlSGFuZGxpbmdGb3IoQ29udHJvbFBhcnQpIGNvbnN0OwogICAgIHZp
cnR1YWwgYm9vbCB1c2VzTWVkaWFDb250cm9sU3RhdHVzRGlzcGxheSgpOwogICAgIHZpcnR1YWwg
Ym9vbCB1c2VzTWVkaWFDb250cm9sVm9sdW1lU2xpZGVyKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2
b2lkIGFkanVzdE1lZGlhU2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CiAgICAg
dmlydHVhbCBJbnRQb2ludCB2b2x1bWVTbGlkZXJPZmZzZXRGcm9tTXV0ZUJ1dHRvbihSZW5kZXJC
b3gqLCBjb25zdCBJbnRTaXplJikgY29uc3QgT1ZFUlJJREU7CiAjZW5kaWYKLSAgICAKLSAgICB2
aXJ0dWFsIGJvb2wgc2hvdWxkU2hvd1BsYWNlaG9sZGVyV2hlbkZvY3VzZWQoKSBjb25zdDsKLQot
cHJpdmF0ZToKLSAgICB2aXJ0dWFsIFN0cmluZyBmaWxlTGlzdE5hbWVGb3JXaWR0aChjb25zdCBG
aWxlTGlzdCosIGNvbnN0IEZvbnQmLCBpbnQgd2lkdGgsIGJvb2wgbXVsdGlwbGVGaWxlc0FsbG93
ZWQpIGNvbnN0IE9WRVJSSURFOwotCi0gICAgSW50UmVjdCBpbmZsYXRlUmVjdChjb25zdCBJbnRS
ZWN0JiwgY29uc3QgSW50U2l6ZSYsIGNvbnN0IGludCogbWFyZ2lucywgZmxvYXQgem9vbUxldmVs
ID0gMS4wZikgY29uc3Q7Ci0KLSAgICBGbG9hdFJlY3QgY29udmVydFRvUGFpbnRpbmdSZWN0KGNv
bnN0IFJlbmRlck9iamVjdCogaW5wdXRSZW5kZXJlciwgY29uc3QgUmVuZGVyT2JqZWN0KiBwYXJ0
UmVuZGVyZXIsIGNvbnN0IEZsb2F0UmVjdCYgaW5wdXRSZWN0LCBjb25zdCBJbnRSZWN0JiByKSBj
b25zdDsKLSAgICAKLSAgICAvLyBHZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNlZCBvZmYgdGhlIGZv
bnQuICBVc2VkIGJ5IHNvbWUgb2YgdGhlIGNvbnRyb2xzIChsaWtlIGJ1dHRvbnMpLgotICAgIE5T
Q29udHJvbFNpemUgY29udHJvbFNpemVGb3JGb250KFJlbmRlclN0eWxlKikgY29uc3Q7Ci0gICAg
TlNDb250cm9sU2l6ZSBjb250cm9sU2l6ZUZvclN5c3RlbUZvbnQoUmVuZGVyU3R5bGUqKSBjb25z
dDsKLSAgICB2b2lkIHNldENvbnRyb2xTaXplKE5TQ2VsbCosIGNvbnN0IEludFNpemUqIHNpemVz
LCBjb25zdCBJbnRTaXplJiBtaW5TaXplLCBmbG9hdCB6b29tTGV2ZWwgPSAxLjBmKTsKLSAgICB2
b2lkIHNldFNpemVGcm9tRm9udChSZW5kZXJTdHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBj
b25zdDsKLSAgICBJbnRTaXplIHNpemVGb3JGb250KFJlbmRlclN0eWxlKiwgY29uc3QgSW50U2l6
ZSogc2l6ZXMpIGNvbnN0OwotICAgIEludFNpemUgc2l6ZUZvclN5c3RlbUZvbnQoUmVuZGVyU3R5
bGUqLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3Q7Ci0gICAgdm9pZCBzZXRGb250RnJvbUNv
bnRyb2xTaXplKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIE5TQ29udHJvbFNpemUpIGNv
bnN0OwotCi0gICAgdm9pZCB1cGRhdGVDaGVja2VkU3RhdGUoTlNDZWxsKiwgY29uc3QgUmVuZGVy
T2JqZWN0Kik7Ci0gICAgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGUoTlNDZWxsKiwgY29uc3QgUmVu
ZGVyT2JqZWN0Kik7Ci0gICAgdm9pZCB1cGRhdGVGb2N1c2VkU3RhdGUoTlNDZWxsKiwgY29uc3Qg
UmVuZGVyT2JqZWN0Kik7Ci0gICAgdm9pZCB1cGRhdGVQcmVzc2VkU3RhdGUoTlNDZWxsKiwgY29u
c3QgUmVuZGVyT2JqZWN0Kik7Ci0gICAgLy8gQW4gb3B0aW9uYWwgaG9vayBmb3Igc3ViY2xhc3Nl
cyB0byB1cGRhdGUgdGhlIGNvbnRyb2wgdGludCBvZiBOU0NlbGwuCi0gICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUFjdGl2ZVN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopIHt9Ci0KLSAg
ICAvLyBIZWxwZXJzIGZvciBhZGp1c3RpbmcgYXBwZWFyYW5jZSBhbmQgZm9yIHBhaW50aW5nCi0K
LSAgICB2b2lkIHNldFBvcHVwQnV0dG9uQ2VsbFN0YXRlKGNvbnN0IFJlbmRlck9iamVjdCosIGNv
bnN0IEludFJlY3QmKTsKLSAgICBjb25zdCBJbnRTaXplKiBwb3B1cEJ1dHRvblNpemVzKCkgY29u
c3Q7Ci0gICAgY29uc3QgaW50KiBwb3B1cEJ1dHRvbk1hcmdpbnMoKSBjb25zdDsKLSAgICBjb25z
dCBpbnQqIHBvcHVwQnV0dG9uUGFkZGluZyhOU0NvbnRyb2xTaXplKSBjb25zdDsKLSAgICB2b2lk
IHBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudHMoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJ
bmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIGNvbnN0IEludFNpemUqIG1lbnVMaXN0U2l6ZXMo
KSBjb25zdDsKLQotICAgIGNvbnN0IEludFNpemUqIHNlYXJjaEZpZWxkU2l6ZXMoKSBjb25zdDsK
LSAgICBjb25zdCBJbnRTaXplKiBjYW5jZWxCdXR0b25TaXplcygpIGNvbnN0OwotICAgIGNvbnN0
IEludFNpemUqIHJlc3VsdHNCdXR0b25TaXplcygpIGNvbnN0OwotICAgIHZvaWQgc2V0U2VhcmNo
Q2VsbFN0YXRlKFJlbmRlck9iamVjdCosIGNvbnN0IEludFJlY3QmKTsKLSAgICB2b2lkIHNldFNl
YXJjaEZpZWxkU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OwotICAgIAotICAgIE5TUG9wVXBCdXR0
b25DZWxsKiBwb3B1cEJ1dHRvbigpIGNvbnN0OwotICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFy
Y2goKSBjb25zdDsKLSAgICBOU01lbnUqIHNlYXJjaE1lbnVUZW1wbGF0ZSgpIGNvbnN0OwotICAg
IE5TU2xpZGVyQ2VsbCogc2xpZGVyVGh1bWJIb3Jpem9udGFsKCkgY29uc3Q7Ci0gICAgTlNTbGlk
ZXJDZWxsKiBzbGlkZXJUaHVtYlZlcnRpY2FsKCkgY29uc3Q7Ci0gICAgTlNUZXh0RmllbGRDZWxs
KiB0ZXh0RmllbGQoKSBjb25zdDsKLQotI2lmIEVOQUJMRShNRVRFUl9FTEVNRU5UKQotICAgIE5T
TGV2ZWxJbmRpY2F0b3JTdHlsZSBsZXZlbEluZGljYXRvclN0eWxlRm9yKENvbnRyb2xQYXJ0KSBj
b25zdDsKLSAgICBOU0xldmVsSW5kaWNhdG9yQ2VsbCogbGV2ZWxJbmRpY2F0b3JGb3IoY29uc3Qg
UmVuZGVyTWV0ZXIqKSBjb25zdDsKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1F
TlQpCi0gICAgaW50IG1pbmltdW1Qcm9ncmVzc0JhckhlaWdodChSZW5kZXJTdHlsZSopIGNvbnN0
OwotICAgIGNvbnN0IEludFNpemUqIHByb2dyZXNzQmFyU2l6ZXMoKSBjb25zdDsKLSAgICBjb25z
dCBpbnQqIHByb2dyZXNzQmFyTWFyZ2lucyhOU0NvbnRyb2xTaXplKSBjb25zdDsKLSNlbmRpZgot
Ci1wcml2YXRlOgotICAgIG11dGFibGUgUmV0YWluUHRyPE5TUG9wVXBCdXR0b25DZWxsPiBtX3Bv
cHVwQnV0dG9uOwotICAgIG11dGFibGUgUmV0YWluUHRyPE5TU2VhcmNoRmllbGRDZWxsPiBtX3Nl
YXJjaDsKLSAgICBtdXRhYmxlIFJldGFpblB0cjxOU01lbnU+IG1fc2VhcmNoTWVudVRlbXBsYXRl
OwotICAgIG11dGFibGUgUmV0YWluUHRyPE5TU2xpZGVyQ2VsbD4gbV9zbGlkZXJUaHVtYkhvcml6
b250YWw7Ci0gICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNTbGlkZXJDZWxsPiBtX3NsaWRlclRodW1i
VmVydGljYWw7Ci0gICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNMZXZlbEluZGljYXRvckNlbGw+IG1f
bGV2ZWxJbmRpY2F0b3I7Ci0gICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNUZXh0RmllbGRDZWxsPiBt
X3RleHRGaWVsZDsKLQotICAgIGJvb2wgbV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFByZXNzZWQ7
Ci0gICAgYm9vbCBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQ7Ci0KLSAgICBtdXRhYmxl
IEhhc2hNYXA8aW50LCBSR0JBMzI+IG1fc3lzdGVtQ29sb3JDYWNoZTsKLQotICAgIFJldGFpblB0
cjxXZWJDb3JlUmVuZGVyVGhlbWVOb3RpZmljYXRpb25PYnNlcnZlcj4gbV9ub3RpZmljYXRpb25P
YnNlcnZlcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbSBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbQppbmRleCBlMDgzN2ZkYzVkNDExODY1ZTIzMWQ4ZWJl
NGYyYTI1NjdhNTQ2ZTgwLi5mYWRkMDkwMTFhZmY5N2QwZWZlNDgxY2JiNzViMDJmMGZkNjUwZGYx
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0K
KysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tCkBAIC0yMCwx
NzEzICsyMCw1MyBAQAogI2ltcG9ydCAiY29uZmlnLmgiCiAjaW1wb3J0ICJSZW5kZXJUaGVtZU1h
Yy5oIgogCi0jaW1wb3J0ICJCaXRtYXBJbWFnZS5oIgotI2ltcG9ydCAiQ29sb3JNYWMuaCIKLSNp
bXBvcnQgIkNTU1ZhbHVlTGlzdC5oIgotI2ltcG9ydCAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgotI2lt
cG9ydCAiRG9jdW1lbnQuaCIKICNpbXBvcnQgIkVsZW1lbnQuaCIKLSNpbXBvcnQgIkZpbGVMaXN0
LmgiCi0jaW1wb3J0ICJGcmFtZVZpZXcuaCIKICNpbXBvcnQgIkdyYXBoaWNzQ29udGV4dENHLmgi
Ci0jaW1wb3J0ICJIVE1MSW5wdXRFbGVtZW50LmgiCiAjaW1wb3J0ICJIVE1MTWVkaWFFbGVtZW50
LmgiCi0jaW1wb3J0ICJIVE1MTmFtZXMuaCIKLSNpbXBvcnQgIkltYWdlLmgiCi0jaW1wb3J0ICJJ
bWFnZUJ1ZmZlci5oIgogI2ltcG9ydCAiTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0LmgiCi0j
aW1wb3J0ICJMb2NhbGl6ZWRTdHJpbmdzLmgiCiAjaW1wb3J0ICJNZWRpYUNvbnRyb2xFbGVtZW50
cy5oIgogI2ltcG9ydCAiUGFpbnRJbmZvLmgiCiAjaW1wb3J0ICJSZW5kZXJNZWRpYS5oIgogI2lt
cG9ydCAiUmVuZGVyTWVkaWFDb250cm9scy5oIgotI2ltcG9ydCAiUmVuZGVyU2xpZGVyLmgiCi0j
aW1wb3J0ICJSZW5kZXJTbmFwc2hvdHRlZFBsdWdJbi5oIgogI2ltcG9ydCAiUmVuZGVyVmlldy5o
IgotI2ltcG9ydCAiU2hhcmVkQnVmZmVyLmgiCi0jaW1wb3J0ICJTdHJpbmdUcnVuY2F0b3IuaCIK
LSNpbXBvcnQgIlN0eWxlUmVzb2x2ZXIuaCIKICNpbXBvcnQgIlRpbWVSYW5nZXMuaCIKICNpbXBv
cnQgIlRoZW1lTWFjLmgiCi0jaW1wb3J0ICJXZWJDb3JlTlNDZWxsRXh0cmFzLmgiCiAjaW1wb3J0
ICJXZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCiAjaW1wb3J0ICJVc2VyQWdlbnRTdHlsZVNoZWV0
cy5oIgogI2ltcG9ydCA8Q2FyYm9uL0NhcmJvbi5oPgogI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4K
ICNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4K
LSNpbXBvcnQgPG1hdGguaD4KIAotI2ltcG9ydCAiUmVuZGVyUHJvZ3Jlc3MuaCIKLQotI2lmIEVO
QUJMRShNRVRFUl9FTEVNRU5UKQotI2luY2x1ZGUgIlJlbmRlck1ldGVyLmgiCi0jaW5jbHVkZSAi
SFRNTE1ldGVyRWxlbWVudC5oIgotI2VuZGlmCi0KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQot
Ly8gVGhlIG1ldGhvZHMgaW4gdGhpcyBmaWxlIGFyZSBzcGVjaWZpYyB0byB0aGUgTWFjIE9TIFgg
cGxhdGZvcm0uCi0KLS8vIEZJWE1FOiBUaGUgcGxhdGZvcm0taW5kZXBlbmRlbnQgY29kZSBpbiB0
aGlzIGNsYXNzIHNob3VsZCBiZSBmYWN0b3JlZCBvdXQgYW5kIG1lcmdlZCB3aXRoIFJlbmRlclRo
ZW1lU2FmYXJpLiAKLQotLy8gV2UgZXN0aW1hdGUgdGhlIGFuaW1hdGlvbiByYXRlIG9mIGEgTWFj
IE9TIFggcHJvZ3Jlc3MgYmFyIGlzIDMzIGZwcy4KLS8vIEhhcmQgY29kZSB0aGUgdmFsdWUgaGVy
ZSBiZWNhdXNlIHdlIGhhdmVuJ3QgZm91bmQgQVBJIGZvciBpdC4KLWNvbnN0IGRvdWJsZSBwcm9n
cmVzc0FuaW1hdGlvbkZyYW1lUmF0ZSA9IDAuMDMzOwotCi0vLyBNYWMgT1MgWCBwcm9ncmVzcyBi
YXIgYW5pbWF0aW9uIHNlZW1zIHRvIGhhdmUgMjU2IGZyYW1lcy4KLWNvbnN0IGRvdWJsZSBwcm9n
cmVzc0FuaW1hdGlvbk51bUZyYW1lcyA9IDI1NjsKLQotQGludGVyZmFjZSBXZWJDb3JlUmVuZGVy
VGhlbWVOb3RpZmljYXRpb25PYnNlcnZlciA6IE5TT2JqZWN0Ci17Ci0gICAgV2ViQ29yZTo6UmVu
ZGVyVGhlbWUgKl90aGVtZTsKLX0KLQotLSAoaWQpaW5pdFdpdGhUaGVtZTooV2ViQ29yZTo6UmVu
ZGVyVGhlbWUgKil0aGVtZTsKLS0gKHZvaWQpc3lzdGVtQ29sb3JzRGlkQ2hhbmdlOihOU05vdGlm
aWNhdGlvbiAqKW5vdGlmaWNhdGlvbjsKLQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gV2ViQ29y
ZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIKLQotLSAoaWQpaW5pdFdpdGhUaGVtZToo
V2ViQ29yZTo6UmVuZGVyVGhlbWUgKil0aGVtZQotewotICAgIGlmICghKHNlbGYgPSBbc3VwZXIg
aW5pdF0pKQotICAgICAgICByZXR1cm4gbmlsOwotCi0gICAgX3RoZW1lID0gdGhlbWU7ICAgIAot
ICAgIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKXN5c3RlbUNvbG9yc0RpZENoYW5nZTooTlNO
b3RpZmljYXRpb24gKil1bnVzZWROb3RpZmljYXRpb24KLXsKLSAgICBBU1NFUlRfVU5VU0VEKHVu
dXNlZE5vdGlmaWNhdGlvbiwgW1t1bnVzZWROb3RpZmljYXRpb24gbmFtZV0gaXNFcXVhbFRvU3Ry
aW5nOk5TU3lzdGVtQ29sb3JzRGlkQ2hhbmdlTm90aWZpY2F0aW9uXSk7Ci0gICAgX3RoZW1lLT5w
bGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOwotfQotCi1AZW5kCi0KLUBpbnRlcmZhY2UgTlNUZXh0
RmllbGRDZWxsIChXS0RldGFpbHMpCi0tIChDRkRpY3Rpb25hcnlSZWYpX2NvcmVVSURyYXdPcHRp
b25zV2l0aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1lIGluVmlldzooTlNWaWV3ICopY29udHJvbFZp
ZXcgaW5jbHVkZUZvY3VzOihCT09MKWluY2x1ZGVGb2N1czsKLUBlbmQKLQotCi1AaW50ZXJmYWNl
IFdlYkNvcmVUZXh0RmllbGRDZWxsIDogTlNUZXh0RmllbGRDZWxsCi0tIChDRkRpY3Rpb25hcnlS
ZWYpX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1lIGluVmlldzoo
TlNWaWV3ICopY29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOihCT09MKWluY2x1ZGVGb2N1czsKLUBl
bmQKLQotQGltcGxlbWVudGF0aW9uIFdlYkNvcmVUZXh0RmllbGRDZWxsCi0tIChDRkRpY3Rpb25h
cnlSZWYpX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1lIGluVmll
dzooTlNWaWV3ICopY29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOihCT09MKWluY2x1ZGVGb2N1cwot
ewotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgcG9zdC1MaW9uLW9ubHkgd29ya2Fyb3VuZCBmb3Ig
PHJkYXI6Ly9wcm9ibGVtLzExMzg1NDYxPi4gV2hlbiB0aGF0IGJ1ZyBpcyByZXNvbHZlZCwgd2Ug
c2hvdWxkIHJlbW92ZSB0aGlzIGNvZGUuCi0gICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBjb3Jl
VUlEcmF3T3B0aW9ucyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KE5VTEwsIDAsIFtz
dXBlciBfY29yZVVJRHJhd09wdGlvbnNXaXRoRnJhbWU6Y2VsbEZyYW1lIGluVmlldzpjb250cm9s
VmlldyBpbmNsdWRlRm9jdXM6aW5jbHVkZUZvY3VzXSk7Ci0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFs
dWUoY29yZVVJRHJhd09wdGlvbnMsIEAiYm9yZGVycyBvbmx5Iiwga0NGQm9vbGVhblRydWUpOwot
ICAgIHJldHVybiAoQ0ZEaWN0aW9uYXJ5UmVmKVtOU01ha2VDb2xsZWN0YWJsZShjb3JlVUlEcmF3
T3B0aW9ucykgYXV0b3JlbGVhc2VdOwotfQotQGVuZAotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0K
LXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLWVudW0gewotICAgIHRvcE1hcmdpbiwKLSAg
ICByaWdodE1hcmdpbiwKLSAgICBib3R0b21NYXJnaW4sCi0gICAgbGVmdE1hcmdpbgotfTsKLQot
ZW51bSB7Ci0gICAgdG9wUGFkZGluZywKLSAgICByaWdodFBhZGRpbmcsCi0gICAgYm90dG9tUGFk
ZGluZywKLSAgICBsZWZ0UGFkZGluZwotfTsKLQotI2lmIFBMQVRGT1JNKE1BQykKLVBhc3NSZWZQ
dHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lOjp0aGVtZUZvclBhZ2UoUGFnZSopCi17Ci0gICAg
c3RhdGljIFJlbmRlclRoZW1lKiBydCA9IFJlbmRlclRoZW1lTWFjOjpjcmVhdGUoKS5sZWFrUmVm
KCk7Ci0gICAgcmV0dXJuIHJ0OwotfQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+
IFJlbmRlclRoZW1lTWFjOjpjcmVhdGUoKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVu
ZGVyVGhlbWVNYWMpOwotfQotCi1SZW5kZXJUaGVtZU1hYzo6UmVuZGVyVGhlbWVNYWMoKQotICAg
IDogbV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFByZXNzZWQoZmFsc2UpCi0gICAgLCBtX2lzU2xp
ZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQoZmFsc2UpCi0gICAgLCBtX25vdGlmaWNhdGlvbk9ic2Vy
dmVyKEFkb3B0TlMsIFtbV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIgYWxs
b2NdIGluaXRXaXRoVGhlbWU6dGhpc10pCi17Ci0gICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBk
ZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjptX25vdGlmaWNhdGlvbk9ic2VydmVyLmdldCgpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNl
bGVjdG9yOkBzZWxlY3RvcihzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpOU1N5c3Rl
bUNvbG9yc0RpZENoYW5nZU5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDpuaWxdOwotfQotCi1SZW5kZXJU
aGVtZU1hYzo6flJlbmRlclRoZW1lTWFjKCkKLXsKLSAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVy
IGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9ic2VydmVyOm1fbm90aWZpY2F0aW9uT2JzZXJ2ZXIuZ2V0
KCldOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25C
YWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIE5TQ29sb3IqIGNvbG9yID0gW1tOU0NvbG9y
IHNlbGVjdGVkVGV4dEJhY2tncm91bmRDb2xvcl0gY29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5T
RGV2aWNlUkdCQ29sb3JTcGFjZV07Ci0gICAgcmV0dXJuIENvbG9yKHN0YXRpY19jYXN0PGludD4o
MjU1LjAgKiBbY29sb3IgcmVkQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBb
Y29sb3IgZ3JlZW5Db21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBi
bHVlQ29tcG9uZW50XSkpOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1JbmFj
dGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgTlNDb2xvciogY29s
b3IgPSBbW05TQ29sb3Igc2Vjb25kYXJ5U2VsZWN0ZWRDb250cm9sQ29sb3JdIGNvbG9yVXNpbmdD
b2xvclNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2VdOwotICAgIHJldHVybiBDb2xvcihz
dGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIHJlZENvbXBvbmVudF0pLCBzdGF0aWNfY2Fz
dDxpbnQ+KDI1NS4wICogW2NvbG9yIGdyZWVuQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4o
MjU1LjAgKiBbY29sb3IgYmx1ZUNvbXBvbmVudF0pKTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVN
YWM6OnBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0
Ci17Ci0gICAgTlNDb2xvciogY29sb3IgPSBbW05TQ29sb3IgYWx0ZXJuYXRlU2VsZWN0ZWRDb250
cm9sQ29sb3JdIGNvbG9yVXNpbmdDb2xvclNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2Vd
OwotICAgIHJldHVybiBDb2xvcihzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIHJlZENv
bXBvbmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIGdyZWVuQ29tcG9uZW50
XSksIHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgYmx1ZUNvbXBvbmVudF0pKTsKLX0K
LQotQ29sb3IgUmVuZGVyVGhlbWVNYWM6OnBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkZv
cmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvbG9yOjp3aGl0ZTsKLX0KLQot
Q29sb3IgUmVuZGVyVGhlbWVNYWM6OnBsYXRmb3JtSW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9y
ZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ29sb3I6OmJsYWNrOwotfQotCi1D
b2xvciBSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpIGNvbnN0Ci17Ci0g
ICAgaWYgKHVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9yKCkpCi0gICAgICAgIHJldHVybiBvbGRB
cXVhRm9jdXNSaW5nQ29sb3IoKTsKLQotICAgIHJldHVybiBzeXN0ZW1Db2xvcihDU1NWYWx1ZVdl
YmtpdEZvY3VzUmluZ0NvbG9yKTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVNYWM6OnBsYXRmb3Jt
SW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gcGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpOwotfQotCi1z
dGF0aWMgRm9udFdlaWdodCB0b0ZvbnRXZWlnaHQoTlNJbnRlZ2VyIGFwcEtpdEZvbnRXZWlnaHQp
Ci17Ci0gICAgQVNTRVJUKGFwcEtpdEZvbnRXZWlnaHQgPiAwICYmIGFwcEtpdEZvbnRXZWlnaHQg
PCAxNSk7Ci0gICAgaWYgKGFwcEtpdEZvbnRXZWlnaHQgPiAxNCkKLSAgICAgICAgYXBwS2l0Rm9u
dFdlaWdodCA9IDE0OwotICAgIGVsc2UgaWYgKGFwcEtpdEZvbnRXZWlnaHQgPCAxKQotICAgICAg
ICBhcHBLaXRGb250V2VpZ2h0ID0gMTsKLQotICAgIHN0YXRpYyBGb250V2VpZ2h0IGZvbnRXZWln
aHRzW10gPSB7Ci0gICAgICAgIEZvbnRXZWlnaHQxMDAsCi0gICAgICAgIEZvbnRXZWlnaHQxMDAs
Ci0gICAgICAgIEZvbnRXZWlnaHQyMDAsCi0gICAgICAgIEZvbnRXZWlnaHQzMDAsCi0gICAgICAg
IEZvbnRXZWlnaHQ0MDAsCi0gICAgICAgIEZvbnRXZWlnaHQ1MDAsCi0gICAgICAgIEZvbnRXZWln
aHQ2MDAsCi0gICAgICAgIEZvbnRXZWlnaHQ2MDAsCi0gICAgICAgIEZvbnRXZWlnaHQ3MDAsCi0g
ICAgICAgIEZvbnRXZWlnaHQ4MDAsCi0gICAgICAgIEZvbnRXZWlnaHQ4MDAsCi0gICAgICAgIEZv
bnRXZWlnaHQ5MDAsCi0gICAgICAgIEZvbnRXZWlnaHQ5MDAsCi0gICAgICAgIEZvbnRXZWlnaHQ5
MDAKLSAgICB9OwotICAgIHJldHVybiBmb250V2VpZ2h0c1thcHBLaXRGb250V2VpZ2h0IC0gMV07
Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnN5c3RlbUZvbnQoaW50IGNzc1ZhbHVlSWQsIEZv
bnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIERFRklORV9TVEFU
SUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBzeXN0ZW1Gb250LCAoKSk7Ci0gICAgREVGSU5FX1NU
QVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIHNtYWxsU3lzdGVtRm9udCwgKCkpOwotICAgIERF
RklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBtZW51Rm9udCwgKCkpOwotICAgIERF
RklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBsYWJlbEZvbnQsICgpKTsKLSAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgbWluaUNvbnRyb2xGb250LCAoKSk7
Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIHNtYWxsQ29udHJvbEZv
bnQsICgpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgY29udHJv
bEZvbnQsICgpKTsKLQotICAgIEZvbnREZXNjcmlwdGlvbiogY2FjaGVkRGVzYzsKLSAgICBOU0Zv
bnQqIGZvbnQgPSBuaWw7Ci0gICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7Ci0gICAgICAgIGNhc2Ug
Q1NTVmFsdWVTbWFsbENhcHRpb246Ci0gICAgICAgICAgICBjYWNoZWREZXNjID0gJnNtYWxsU3lz
dGVtRm9udDsKLSAgICAgICAgICAgIGlmICghc21hbGxTeXN0ZW1Gb250LmlzQWJzb2x1dGVTaXpl
KCkpCi0gICAgICAgICAgICAgICAgZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNG
b250IHNtYWxsU3lzdGVtRm9udFNpemVdXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENTU1ZhbHVlTWVudToKLSAgICAgICAgICAgIGNhY2hlZERlc2MgPSAmbWVudUZvbnQ7Ci0g
ICAgICAgICAgICBpZiAoIW1lbnVGb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAg
ICAgZm9udCA9IFtOU0ZvbnQgbWVudUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZV1d
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVTdGF0dXNCYXI6Ci0g
ICAgICAgICAgICBjYWNoZWREZXNjID0gJmxhYmVsRm9udDsKLSAgICAgICAgICAgIGlmICghbGFi
ZWxGb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAgICAgZm9udCA9IFtOU0ZvbnQg
bGFiZWxGb250T2ZTaXplOltOU0ZvbnQgbGFiZWxGb250U2l6ZV1dOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRNaW5pQ29udHJvbDoKLSAgICAgICAgICAg
IGNhY2hlZERlc2MgPSAmbWluaUNvbnRyb2xGb250OwotICAgICAgICAgICAgaWYgKCFtaW5pQ29u
dHJvbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKLSAgICAgICAgICAgICAgICBmb250ID0gW05TRm9u
dCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6ZTpO
U01pbmlDb250cm9sU2l6ZV1dOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NT
VmFsdWVXZWJraXRTbWFsbENvbnRyb2w6Ci0gICAgICAgICAgICBjYWNoZWREZXNjID0gJnNtYWxs
Q29udHJvbEZvbnQ7Ci0gICAgICAgICAgICBpZiAoIXNtYWxsQ29udHJvbEZvbnQuaXNBYnNvbHV0
ZVNpemUoKSkKLSAgICAgICAgICAgICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXpl
OltOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6ZTpOU1NtYWxsQ29udHJvbFNpemVd
XTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0Q29udHJv
bDoKLSAgICAgICAgICAgIGNhY2hlZERlc2MgPSAmY29udHJvbEZvbnQ7Ci0gICAgICAgICAgICBp
ZiAoIWNvbnRyb2xGb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAgICAgZm9udCA9
IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJv
bFNpemU6TlNSZWd1bGFyQ29udHJvbFNpemVdXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBkZWZhdWx0OgotICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZzeXN0ZW1Gb250OwotICAgICAg
ICAgICAgaWYgKCFzeXN0ZW1Gb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAgICAg
Zm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZvbnRTaXplXV07
Ci0gICAgfQotCi0gICAgaWYgKGZvbnQpIHsKLSAgICAgICAgTlNGb250TWFuYWdlciAqZm9udE1h
bmFnZXIgPSBbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl07Ci0gICAgICAgIGNhY2hl
ZERlc2MtPnNldElzQWJzb2x1dGVTaXplKHRydWUpOwotICAgICAgICBjYWNoZWREZXNjLT5zZXRH
ZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOwotICAgICAgICBjYWNoZWRE
ZXNjLT5maXJzdEZhbWlseSgpLnNldEZhbWlseShbZm9udCBmYW1pbHlOYW1lXSk7Ci0gICAgICAg
IGNhY2hlZERlc2MtPnNldFNwZWNpZmllZFNpemUoW2ZvbnQgcG9pbnRTaXplXSk7Ci0gICAgICAg
IGNhY2hlZERlc2MtPnNldFdlaWdodCh0b0ZvbnRXZWlnaHQoW2ZvbnRNYW5hZ2VyIHdlaWdodE9m
Rm9udDpmb250XSkpOwotICAgICAgICBjYWNoZWREZXNjLT5zZXRJdGFsaWMoW2ZvbnRNYW5hZ2Vy
IHRyYWl0c09mRm9udDpmb250XSAmIE5TSXRhbGljRm9udE1hc2spOwotICAgIH0KLSAgICBmb250
RGVzY3JpcHRpb24gPSAqY2FjaGVkRGVzYzsKLX0KLQotc3RhdGljIFJHQkEzMiBjb252ZXJ0TlND
b2xvclRvQ29sb3IoTlNDb2xvciAqY29sb3IpCi17Ci0gICAgTlNDb2xvciAqY29sb3JJbkNvbG9y
U3BhY2UgPSBbY29sb3IgY29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29sb3JT
cGFjZV07Ci0gICAgaWYgKGNvbG9ySW5Db2xvclNwYWNlKSB7Ci0gICAgICAgIHN0YXRpYyBjb25z
dCBkb3VibGUgc2NhbGVGYWN0b3IgPSBuZXh0YWZ0ZXIoMjU2LjAsIDAuMCk7Ci0gICAgICAgIHJl
dHVybiBtYWtlUkdCKHN0YXRpY19jYXN0PGludD4oc2NhbGVGYWN0b3IgKiBbY29sb3JJbkNvbG9y
U3BhY2UgcmVkQ29tcG9uZW50XSksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNjYWxl
RmFjdG9yICogW2NvbG9ySW5Db2xvclNwYWNlIGdyZWVuQ29tcG9uZW50XSksCi0gICAgICAgICAg
ICBzdGF0aWNfY2FzdDxpbnQ+KHNjYWxlRmFjdG9yICogW2NvbG9ySW5Db2xvclNwYWNlIGJsdWVD
b21wb25lbnRdKSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBjb252ZXJzaW9uIGFib3ZlIGNhbiBm
YWlsIGlmIHRoZSBOU0NvbG9yIGluIHF1ZXN0aW9uIGlzIGFuIE5TUGF0dGVybkNvbG9yIAotICAg
IC8vIChhcyBtYW55IHN5c3RlbSBjb2xvcnMgYXJlKS4gVGhlc2UgY29sb3JzIGFyZSBhY3R1YWxs
eSBhIHJlcGVhdGluZyBwYXR0ZXJuCi0gICAgLy8gbm90IGp1c3QgYSBzb2xpZCBjb2xvci4gVG8g
d29yayBhcm91bmQgdGhpcyB3ZSBzaW1wbHkgZHJhdyBhIDF4MSBpbWFnZSBvZgotICAgIC8vIHRo
ZSBjb2xvciBhbmQgdXNlIHRoYXQgcGl4ZWwncyBjb2xvci4gSXQgbWlnaHQgYmUgYmV0dGVyIHRv
IHVzZSBhbiBhdmVyYWdlIG9mCi0gICAgLy8gdGhlIGNvbG9ycyBpbiB0aGUgcGF0dGVybiBpbnN0
ZWFkLgotICAgIE5TQml0bWFwSW1hZ2VSZXAgKm9mZnNjcmVlblJlcCA9IFtbTlNCaXRtYXBJbWFn
ZVJlcCBhbGxvY10gaW5pdFdpdGhCaXRtYXBEYXRhUGxhbmVzOm5pbAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBwaXhlbHNXaWRlOjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzSGlnaDoxCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGU6OAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlclBp
eGVsOjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBbHBoYTpZRVMKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpc1BsYW5hcjpOTwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VOYW1lOk5TRGV2
aWNlUkdCQ29sb3JTcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyUm93OjQKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJpdHNQZXJQaXhlbDozMl07Ci0KLSAgICBbTlNHcmFwaGljc0NvbnRleHQg
c2F2ZUdyYXBoaWNzU3RhdGVdOwotICAgIFtOU0dyYXBoaWNzQ29udGV4dCBzZXRDdXJyZW50Q29u
dGV4dDpbTlNHcmFwaGljc0NvbnRleHQgZ3JhcGhpY3NDb250ZXh0V2l0aEJpdG1hcEltYWdlUmVw
Om9mZnNjcmVlblJlcF1dOwotICAgIE5TRXJhc2VSZWN0KE5TTWFrZVJlY3QoMCwgMCwgMSwgMSkp
OwotICAgIFtjb2xvciBkcmF3U3dhdGNoSW5SZWN0Ok5TTWFrZVJlY3QoMCwgMCwgMSwgMSldOwot
ICAgIFtOU0dyYXBoaWNzQ29udGV4dCByZXN0b3JlR3JhcGhpY3NTdGF0ZV07Ci0KLSAgICBOU1VJ
bnRlZ2VyIHBpeGVsWzRdOwotICAgIFtvZmZzY3JlZW5SZXAgZ2V0UGl4ZWw6cGl4ZWwgYXRYOjAg
eTowXTsKLQotICAgIFtvZmZzY3JlZW5SZXAgcmVsZWFzZV07Ci0KLSAgICByZXR1cm4gbWFrZVJH
QihwaXhlbFswXSwgcGl4ZWxbMV0sIHBpeGVsWzJdKTsKLX0KLQotc3RhdGljIFJHQkEzMiBtZW51
QmFja2dyb3VuZENvbG9yKCkKLXsKLSAgICBOU0JpdG1hcEltYWdlUmVwICpvZmZzY3JlZW5SZXAg
PSBbW05TQml0bWFwSW1hZ2VSZXAgYWxsb2NdIGluaXRXaXRoQml0bWFwRGF0YVBsYW5lczpuaWwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzV2lkZToxCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBp
eGVsc0hpZ2g6MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlOjgKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNhbXBsZXNQZXJQaXhlbDo0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxwaGE6WUVT
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFuYXI6Tk8KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xv
clNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRl
c1BlclJvdzo0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyUGl4ZWw6MzJdOwotCi0gICAgQ0dD
b250ZXh0UmVmIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDR0NvbnRleHRSZWY+KFtbTlNHcmFwaGlj
c0NvbnRleHQgZ3JhcGhpY3NDb250ZXh0V2l0aEJpdG1hcEltYWdlUmVwOm9mZnNjcmVlblJlcF0g
Z3JhcGhpY3NQb3J0XSk7Ci0gICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RNYWtlKDAsIDAsIDEsIDEp
OwotICAgIEhJVGhlbWVNZW51RHJhd0luZm8gZHJhd0luZm87Ci0gICAgZHJhd0luZm8udmVyc2lv
biA9ICAwOwotICAgIGRyYXdJbmZvLm1lbnVUeXBlID0ga1RoZW1lTWVudVR5cGVQb3BVcDsKLSAg
ICBISVRoZW1lRHJhd01lbnVCYWNrZ3JvdW5kKCZyZWN0LCAmZHJhd0luZm8sIGNvbnRleHQsIGtI
SVRoZW1lT3JpZW50YXRpb25JbnZlcnRlZCk7Ci0KLSAgICBOU1VJbnRlZ2VyIHBpeGVsWzRdOwot
ICAgIFtvZmZzY3JlZW5SZXAgZ2V0UGl4ZWw6cGl4ZWwgYXRYOjAgeTowXTsKLQotICAgIFtvZmZz
Y3JlZW5SZXAgcmVsZWFzZV07Ci0KLSAgICByZXR1cm4gbWFrZVJHQihwaXhlbFswXSwgcGl4ZWxb
MV0sIHBpeGVsWzJdKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1Db2xvcnNE
aWRDaGFuZ2UoKQotewotICAgIG1fc3lzdGVtQ29sb3JDYWNoZS5jbGVhcigpOwotICAgIFJlbmRl
clRoZW1lOjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOwotfQotCi1Db2xvciBSZW5kZXJUaGVt
ZU1hYzo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0Ci17Ci0gICAgewotICAgICAg
ICBIYXNoTWFwPGludCwgUkdCQTMyPjo6aXRlcmF0b3IgaXQgPSBtX3N5c3RlbUNvbG9yQ2FjaGUu
ZmluZChjc3NWYWx1ZUlkKTsKLSAgICAgICAgaWYgKGl0ICE9IG1fc3lzdGVtQ29sb3JDYWNoZS5l
bmQoKSkKLSAgICAgICAgICAgIHJldHVybiBpdC0+dmFsdWU7Ci0gICAgfQotCi0gICAgQ29sb3Ig
Y29sb3I7Ci0gICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVB
Y3RpdmVib3JkZXI6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihb
TlNDb2xvciBrZXlib2FyZEZvY3VzSW5kaWNhdG9yQ29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIENTU1ZhbHVlQWN0aXZlY2FwdGlvbjoKLSAgICAgICAgICAgIGNvbG9y
ID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0ZyYW1lVGV4dENvbG9yXSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUFwcHdvcmtzcGFjZToK
LSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGhlYWRl
ckNvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUJhY2tn
cm91bmQ6Ci0gICAgICAgICAgICAvLyBVc2UgdGhlbWUgaW5kZXBlbmRlbnQgZGVmYXVsdAotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVCdXR0b25mYWNlOgotICAgICAg
ICAgICAgLy8gV2UgdXNlIHRoaXMgdmFsdWUgaW5zdGVhZCBvZiBOU0NvbG9yJ3MgY29udHJvbENv
bG9yIHRvIGF2b2lkIHdlYnNpdGUgaW5jb21wYXRpYmlsaXRpZXMuCi0gICAgICAgICAgICAvLyBX
ZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIE5TQ29sb3IgaW4gZnV0dXJlLgot
ICAgICAgICAgICAgY29sb3IgPSAweEZGQzBDMEMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ1NTVmFsdWVCdXR0b25oaWdobGlnaHQ6Ci0gICAgICAgICAgICBjb2xvciA9IGNv
bnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sSGlnaGxpZ2h0Q29sb3JdKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlQnV0dG9uc2hhZG93OgotICAg
ICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbFNo
YWRvd0NvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUJ1
dHRvbnRleHQ6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlND
b2xvciBjb250cm9sVGV4dENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBDU1NWYWx1ZUNhcHRpb250ZXh0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xv
clRvQ29sb3IoW05TQ29sb3IgdGV4dENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBDU1NWYWx1ZUdyYXl0ZXh0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlND
b2xvclRvQ29sb3IoW05TQ29sb3IgZGlzYWJsZWRDb250cm9sVGV4dENvbG9yXSk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUhpZ2hsaWdodDoKLSAgICAgICAgICAg
IGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNlbGVjdGVkVGV4dEJhY2tn
cm91bmRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVI
aWdobGlnaHR0ZXh0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3Io
W05TQ29sb3Igc2VsZWN0ZWRUZXh0Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVib3JkZXI6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZl
cnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sQmFja2dyb3VuZENvbG9yXSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlY2FwdGlvbjoKLSAg
ICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xC
YWNrZ3JvdW5kQ29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1Zh
bHVlSW5hY3RpdmVjYXB0aW9udGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29s
b3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ1NTVmFsdWVJbmZvYmFja2dyb3VuZDoKLSAgICAgICAgICAgIC8vIFRoZXJlIGlz
IG5vIGNvcnJlc3BvbmRpbmcgTlNDb2xvciBmb3IgdGhpcyBzbyB3ZSB1c2UgYSBoYXJkIGNvZGVk
IHZhbHVlLgotICAgICAgICAgICAgY29sb3IgPSAweEZGRkJGQ0M1OwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVJbmZvdGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0g
Y29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVNZW51OgotICAgICAgICAgICAgY29sb3IgPSBt
ZW51QmFja2dyb3VuZENvbG9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBD
U1NWYWx1ZU1lbnV0ZXh0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29s
b3IoW05TQ29sb3Igc2VsZWN0ZWRNZW51SXRlbVRleHRDb2xvcl0pOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVTY3JvbGxiYXI6Ci0gICAgICAgICAgICBjb2xvciA9
IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzY3JvbGxCYXJDb2xvcl0pOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUZXh0OgotICAgICAgICAgICAgY29s
b3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgdGV4dENvbG9yXSk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGRhcmtzaGFkb3c6Ci0gICAg
ICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sRGFy
a1NoYWRvd0NvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1
ZVRocmVlZHNoYWRvdzoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9y
KFtOU0NvbG9yIHNoYWRvd0NvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVRocmVlZGZhY2U6Ci0gICAgICAgICAgICAvLyBXZSB1c2UgdGhpcyB2YWx1ZSBp
bnN0ZWFkIG9mIE5TQ29sb3IncyBjb250cm9sQ29sb3IgdG8gYXZvaWQgd2Vic2l0ZSBpbmNvbXBh
dGliaWxpdGllcy4KLSAgICAgICAgICAgIC8vIFdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIHRv
IHVzZSB0aGUgTlNDb2xvciBpbiBmdXR1cmUuCi0gICAgICAgICAgICBjb2xvciA9IDB4RkZDMEMw
QzA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGhpZ2hs
aWdodDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9y
IGhpZ2hsaWdodENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NW
YWx1ZVRocmVlZGxpZ2h0c2hhZG93OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xv
clRvQ29sb3IoW05TQ29sb3IgY29udHJvbExpZ2h0SGlnaGxpZ2h0Q29sb3JdKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0Rm9jdXNSaW5nQ29sb3I6Ci0g
ICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBrZXlib2Fy
ZEZvY3VzSW5kaWNhdG9yQ29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IENTU1ZhbHVlV2luZG93OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29s
b3IoW05TQ29sb3Igd2luZG93QmFja2dyb3VuZENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBDU1NWYWx1ZVdpbmRvd2ZyYW1lOgotICAgICAgICAgICAgY29sb3IgPSBj
b252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igd2luZG93RnJhbWVDb2xvcl0pOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3d0ZXh0OgotICAgICAgICAg
ICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igd2luZG93RnJhbWVUZXh0
Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghY29sb3IuaXNW
YWxpZCgpKQotICAgICAgICBjb2xvciA9IFJlbmRlclRoZW1lOjpzeXN0ZW1Db2xvcihjc3NWYWx1
ZUlkKTsKLQotICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpCi0gICAgICAgIG1fc3lzdGVtQ29sb3JD
YWNoZS5zZXQoY3NzVmFsdWVJZCwgY29sb3IucmdiKCkpOwotCi0gICAgcmV0dXJuIGNvbG9yOwot
fQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjp1c2VzVGVzdE1vZGVGb2N1c1JpbmdDb2xvcigpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIFdlYkNvcmU6OnVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9yKCk7
Ci19Ci0KLU5TVmlldyogUmVuZGVyVGhlbWVNYWM6OmRvY3VtZW50Vmlld0ZvcihSZW5kZXJPYmpl
Y3QqIG8pIGNvbnN0Ci17Ci0jaWYgUExBVEZPUk0oTUFDKQotICAgIHJldHVybiBUaGVtZU1hYzo6
ZW5zdXJlZFZpZXcoby0+dmlldygpLT5mcmFtZVZpZXcoKSk7Ci0jZWxzZQotICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLWJvb2wgUmVuZGVyVGhl
bWVNYWM6OmlzQ29udHJvbFN0eWxlZChjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEJv
cmRlckRhdGEmIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBGaWxsTGF5ZXImIGJhY2tncm91bmQsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3Ip
IGNvbnN0Ci17Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gVGV4dEZpZWxkUGFydCB8
fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IFRleHRBcmVhUGFydCB8fCBzdHlsZS0+YXBwZWFyYW5j
ZSgpID09IExpc3Rib3hQYXJ0KQotICAgICAgICByZXR1cm4gc3R5bGUtPmJvcmRlcigpICE9IGJv
cmRlcjsKLSAgICAgICAgCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgaG9ycmlibGUsIGJ1dCB0aGVy
ZSBpcyBub3QgbXVjaCBlbHNlIHRoYXQgY2FuIGJlIGRvbmUuICBNZW51IGxpc3RzIGNhbm5vdCBk
cmF3IHByb3Blcmx5IHdoZW4KLSAgICAvLyBzY2FsZWQuICBUaGV5IGNhbid0IHJlYWxseSBkcmF3
IHByb3Blcmx5IHdoZW4gdHJhbnNmb3JtZWQgZWl0aGVyLiAgV2UgY2FuJ3QgZGV0ZWN0IHRoZSB0
cmFuc2Zvcm0gY2FzZSBhdCBzdHlsZQotICAgIC8vIGFkanVzdG1lbnQgdGltZSBzbyB0aGF0IHdp
bGwganVzdCBoYXZlIHRvIHN0YXkgYnJva2VuLiAgV2UgY2FuIGhvd2V2ZXIgZGV0ZWN0IHRoYXQg
d2UncmUgem9vbWluZy4gIElmIHpvb21pbmcKLSAgICAvLyBpcyBpbiBlZmZlY3Qgd2UgdHJlYXQg
aXQgbGlrZSB0aGUgY29udHJvbCBpcyBzdHlsZWQuCi0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNl
KCkgPT0gTWVudWxpc3RQYXJ0ICYmIHN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmlzQ29udHJvbFN0
eWxlZChzdHlsZSwgYm9yZGVyLCBiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kQ29sb3IpOwotfQotCi12
b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RSZXBhaW50UmVjdChjb25zdCBSZW5kZXJPYmplY3Qq
IG8sIEludFJlY3QmIHIpCi17Ci0gICAgQ29udHJvbFBhcnQgcGFydCA9IG8tPnN0eWxlKCktPmFw
cGVhcmFuY2UoKTsKLSAgICAKLSNpZiBVU0UoTkVXX1RIRU1FKQotICAgIHN3aXRjaCAocGFydCkg
ewotICAgICAgICBjYXNlIENoZWNrYm94UGFydDoKLSAgICAgICAgY2FzZSBSYWRpb1BhcnQ6Ci0g
ICAgICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6Ci0gICAgICAgIGNhc2UgU3F1YXJlQnV0dG9uUGFy
dDoKLSAgICAgICAgY2FzZSBEZWZhdWx0QnV0dG9uUGFydDoKLSAgICAgICAgY2FzZSBCdXR0b25Q
YXJ0OgotICAgICAgICBjYXNlIElubmVyU3BpbkJ1dHRvblBhcnQ6Ci0gICAgICAgICAgICByZXR1
cm4gUmVuZGVyVGhlbWU6OmFkanVzdFJlcGFpbnRSZWN0KG8sIHIpOwotICAgICAgICBkZWZhdWx0
OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBmbG9hdCB6b29tTGV2
ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICBpZiAocGFydCA9PSBNZW51
bGlzdFBhcnQpIHsKLSAgICAgICAgc2V0UG9wdXBCdXR0b25DZWxsU3RhdGUobywgcik7Ci0gICAg
ICAgIEludFNpemUgc2l6ZSA9IHBvcHVwQnV0dG9uU2l6ZXMoKVtbcG9wdXBCdXR0b24oKSBjb250
cm9sU2l6ZV1dOwotICAgICAgICBzaXplLnNldEhlaWdodChzaXplLmhlaWdodCgpICogem9vbUxl
dmVsKTsKLSAgICAgICAgc2l6ZS5zZXRXaWR0aChyLndpZHRoKCkpOwotICAgICAgICByID0gaW5m
bGF0ZVJlY3Qociwgc2l6ZSwgcG9wdXBCdXR0b25NYXJnaW5zKCksIHpvb21MZXZlbCk7Ci0gICAg
fQotfQotCi1JbnRSZWN0IFJlbmRlclRoZW1lTWFjOjppbmZsYXRlUmVjdChjb25zdCBJbnRSZWN0
JiByLCBjb25zdCBJbnRTaXplJiBzaXplLCBjb25zdCBpbnQqIG1hcmdpbnMsIGZsb2F0IHpvb21M
ZXZlbCkgY29uc3QKLXsKLSAgICAvLyBPbmx5IGRvIHRoZSBpbmZsYXRpb24gaWYgdGhlIGF2YWls
YWJsZSB3aWR0aC9oZWlnaHQgYXJlIHRvbyBzbWFsbC4gIE90aGVyd2lzZSB0cnkgdG8KLSAgICAv
LyBmaXQgdGhlIGdsb3cvY2hlY2sgc3BhY2UgaW50byB0aGUgYXZhaWxhYmxlIGJveCdzIHdpZHRo
L2hlaWdodC4KLSAgICBpbnQgd2lkdGhEZWx0YSA9IHIud2lkdGgoKSAtIChzaXplLndpZHRoKCkg
KyBtYXJnaW5zW2xlZnRNYXJnaW5dICogem9vbUxldmVsICsgbWFyZ2luc1tyaWdodE1hcmdpbl0g
KiB6b29tTGV2ZWwpOwotICAgIGludCBoZWlnaHREZWx0YSA9IHIuaGVpZ2h0KCkgLSAoc2l6ZS5o
ZWlnaHQoKSArIG1hcmdpbnNbdG9wTWFyZ2luXSAqIHpvb21MZXZlbCArIG1hcmdpbnNbYm90dG9t
TWFyZ2luXSAqIHpvb21MZXZlbCk7Ci0gICAgSW50UmVjdCByZXN1bHQocik7Ci0gICAgaWYgKHdp
ZHRoRGVsdGEgPCAwKSB7Ci0gICAgICAgIHJlc3VsdC5zZXRYKHJlc3VsdC54KCkgLSBtYXJnaW5z
W2xlZnRNYXJnaW5dICogem9vbUxldmVsKTsKLSAgICAgICAgcmVzdWx0LnNldFdpZHRoKHJlc3Vs
dC53aWR0aCgpIC0gd2lkdGhEZWx0YSk7Ci0gICAgfQotICAgIGlmIChoZWlnaHREZWx0YSA8IDAp
IHsKLSAgICAgICAgcmVzdWx0LnNldFkocmVzdWx0LnkoKSAtIG1hcmdpbnNbdG9wTWFyZ2luXSAq
IHpvb21MZXZlbCk7Ci0gICAgICAgIHJlc3VsdC5zZXRIZWlnaHQocmVzdWx0LmhlaWdodCgpIC0g
aGVpZ2h0RGVsdGEpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1GbG9hdFJlY3Qg
UmVuZGVyVGhlbWVNYWM6OmNvbnZlcnRUb1BhaW50aW5nUmVjdChjb25zdCBSZW5kZXJPYmplY3Qq
IGlucHV0UmVuZGVyZXIsIGNvbnN0IFJlbmRlck9iamVjdCogcGFydFJlbmRlcmVyLCBjb25zdCBG
bG9hdFJlY3QmIGlucHV0UmVjdCwgY29uc3QgSW50UmVjdCYgcikgY29uc3QKLXsKLSAgICBGbG9h
dFJlY3QgcGFydFJlY3QoaW5wdXRSZWN0KTsKLSAgICAKLSAgICAvLyBDb21wdXRlIGFuIG9mZnNl
dCBiZXR3ZWVuIHRoZSBwYXJ0IHJlbmRlcmVyIGFuZCB0aGUgaW5wdXQgcmVuZGVyZXIKLSAgICBG
bG9hdFNpemUgb2Zmc2V0RnJvbUlucHV0UmVuZGVyZXI7Ci0gICAgY29uc3QgUmVuZGVyT2JqZWN0
KiByZW5kZXJlciA9IHBhcnRSZW5kZXJlcjsKLSAgICB3aGlsZSAocmVuZGVyZXIgJiYgcmVuZGVy
ZXIgIT0gaW5wdXRSZW5kZXJlcikgewotICAgICAgICBSZW5kZXJPYmplY3QqIGNvbnRhaW5pbmdS
ZW5kZXJlciA9IHJlbmRlcmVyLT5jb250YWluZXIoKTsKLSAgICAgICAgb2Zmc2V0RnJvbUlucHV0
UmVuZGVyZXIgLT0gcm91bmRlZEludFNpemUocmVuZGVyZXItPm9mZnNldEZyb21Db250YWluZXIo
Y29udGFpbmluZ1JlbmRlcmVyLCBMYXlvdXRQb2ludCgpKSk7Ci0gICAgICAgIHJlbmRlcmVyID0g
Y29udGFpbmluZ1JlbmRlcmVyOwotICAgIH0KLSAgICAvLyBJZiB0aGUgaW5wdXQgcmVuZGVyZXIg
d2FzIG5vdCBhIGNvbnRhaW5lciwgc29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICBBU1NFUlQocmVu
ZGVyZXIgPT0gaW5wdXRSZW5kZXJlcik7Ci0gICAgLy8gTW92ZSB0aGUgcmVjdCBpbnRvIHBhcnRS
ZW5kZXJlcidzIGNvb3JkcwotICAgIHBhcnRSZWN0Lm1vdmUob2Zmc2V0RnJvbUlucHV0UmVuZGVy
ZXIpOwotICAgIC8vIEFjY291bnQgZm9yIHRoZSBsb2NhbCBkcmF3aW5nIG9mZnNldCAodHgsIHR5
KQotICAgIHBhcnRSZWN0Lm1vdmUoci54KCksIHIueSgpKTsKLQotICAgIHJldHVybiBwYXJ0UmVj
dDsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6dXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2VsbCog
Y2VsbCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvKQotewotICAgIGJvb2wgb2xkSW5kZXRlcm1pbmF0
ZSA9IFtjZWxsIHN0YXRlXSA9PSBOU01peGVkU3RhdGU7Ci0gICAgYm9vbCBpbmRldGVybWluYXRl
ID0gaXNJbmRldGVybWluYXRlKG8pOwotICAgIGJvb2wgY2hlY2tlZCA9IGlzQ2hlY2tlZChvKTsK
LQotICAgIGlmIChvbGRJbmRldGVybWluYXRlICE9IGluZGV0ZXJtaW5hdGUpIHsKLSAgICAgICAg
W2NlbGwgc2V0U3RhdGU6aW5kZXRlcm1pbmF0ZSA/IE5TTWl4ZWRTdGF0ZSA6IChjaGVja2VkID8g
TlNPblN0YXRlIDogTlNPZmZTdGF0ZSldOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
Ym9vbCBvbGRDaGVja2VkID0gW2NlbGwgc3RhdGVdID09IE5TT25TdGF0ZTsKLSAgICBpZiAoY2hl
Y2tlZCAhPSBvbGRDaGVja2VkKQotICAgICAgICBbY2VsbCBzZXRTdGF0ZTpjaGVja2VkID8gTlNP
blN0YXRlIDogTlNPZmZTdGF0ZV07Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnVwZGF0ZUVu
YWJsZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKLXsKLSAgICBi
b29sIG9sZEVuYWJsZWQgPSBbY2VsbCBpc0VuYWJsZWRdOwotICAgIGJvb2wgZW5hYmxlZCA9IGlz
RW5hYmxlZChvKTsKLSAgICBpZiAoZW5hYmxlZCAhPSBvbGRFbmFibGVkKQotICAgICAgICBbY2Vs
bCBzZXRFbmFibGVkOmVuYWJsZWRdOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjp1cGRhdGVG
b2N1c2VkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJPYmplY3QqIG8pCi17Ci0gICAg
Ym9vbCBvbGRGb2N1c2VkID0gW2NlbGwgc2hvd3NGaXJzdFJlc3BvbmRlcl07Ci0gICAgYm9vbCBm
b2N1c2VkID0gaXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91dGxpbmVTdHlsZUlzQXV0bygp
OwotICAgIGlmIChmb2N1c2VkICE9IG9sZEZvY3VzZWQpCi0gICAgICAgIFtjZWxsIHNldFNob3dz
Rmlyc3RSZXNwb25kZXI6Zm9jdXNlZF07Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnVwZGF0
ZVByZXNzZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKLXsKLSAg
ICBib29sIG9sZFByZXNzZWQgPSBbY2VsbCBpc0hpZ2hsaWdodGVkXTsKLSAgICBib29sIHByZXNz
ZWQgPSAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+YWN0aXZlKCkpOwotICAgIGlmIChwcmVzc2Vk
ICE9IG9sZFByZXNzZWQpCi0gICAgICAgIFtjZWxsIHNldEhpZ2hsaWdodGVkOnByZXNzZWRdOwot
fQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpjb250cm9sU3VwcG9ydHNUaW50cyhjb25zdCBSZW5k
ZXJPYmplY3QqIG8pIGNvbnN0Ci17Ci0gICAgLy8gQW4gYWx0ZXJuYXRlIHdheSB0byBpbXBsZW1l
bnQgdGhpcyB3b3VsZCBiZSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNlbGwgb2JqZWN0Ci0gICAg
Ly8gYW5kIGNhbGwgdGhlIHByaXZhdGUgX25lZWRSZWRyYXdPbldpbmRvd0NoYW5nZWRLZXlTdGF0
ZSBtZXRob2QuIEFuIGFkdmFudGFnZSBvZgotICAgIC8vIHRoYXQgd291bGQgYmUgdGhhdCB3ZSB3
b3VsZCBtYXRjaCBBcHBLaXQgYmVoYXZpb3IgbW9yZSBjbG9zZWx5LCBidXQgYSBkaXNhZHZhbnRh
Z2UKLSAgICAvLyB3b3VsZCBiZSB0aGF0IHdlIHdvdWxkIHJlbHkgb24gYW4gQXBwS2l0IFNQSSBt
ZXRob2QuCi0KLSAgICBpZiAoIWlzRW5hYmxlZChvKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgLy8gQ2hlY2tib3hlcyBvbmx5IGhhdmUgdGludCB3aGVuIGNoZWNrZWQuCi0gICAgaWYg
KG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBDaGVja2JveFBhcnQpCi0gICAgICAgIHJldHVy
biBpc0NoZWNrZWQobyk7Ci0KLSAgICAvLyBGb3Igbm93IGFzc3VtZSBvdGhlciBjb250cm9scyBo
YXZlIHRpbnQgaWYgZW5hYmxlZC4KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotTlNDb250cm9sU2l6
ZSBSZW5kZXJUaGVtZU1hYzo6Y29udHJvbFNpemVGb3JGb250KFJlbmRlclN0eWxlKiBzdHlsZSkg
Y29uc3QKLXsKLSAgICBpbnQgZm9udFNpemUgPSBzdHlsZS0+Zm9udFNpemUoKTsKLSAgICBpZiAo
Zm9udFNpemUgPj0gMTYpCi0gICAgICAgIHJldHVybiBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKLSAg
ICBpZiAoZm9udFNpemUgPj0gMTEpCi0gICAgICAgIHJldHVybiBOU1NtYWxsQ29udHJvbFNpemU7
Ci0gICAgcmV0dXJuIE5TTWluaUNvbnRyb2xTaXplOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFj
OjpzZXRDb250cm9sU2l6ZShOU0NlbGwqIGNlbGwsIGNvbnN0IEludFNpemUqIHNpemVzLCBjb25z
dCBJbnRTaXplJiBtaW5TaXplLCBmbG9hdCB6b29tTGV2ZWwpCi17Ci0gICAgTlNDb250cm9sU2l6
ZSBzaXplOwotICAgIGlmIChtaW5TaXplLndpZHRoKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXpl
c1tOU1JlZ3VsYXJDb250cm9sU2l6ZV0ud2lkdGgoKSAqIHpvb21MZXZlbCkgJiYKLSAgICAgICAg
bWluU2l6ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TUmVndWxhckNvbnRy
b2xTaXplXS5oZWlnaHQoKSAqIHpvb21MZXZlbCkpCi0gICAgICAgIHNpemUgPSBOU1JlZ3VsYXJD
b250cm9sU2l6ZTsKLSAgICBlbHNlIGlmIChtaW5TaXplLndpZHRoKCkgPj0gc3RhdGljX2Nhc3Q8
aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLndpZHRoKCkgKiB6b29tTGV2ZWwpICYmCi0g
ICAgICAgICAgICAgbWluU2l6ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05T
U21hbGxDb250cm9sU2l6ZV0uaGVpZ2h0KCkgKiB6b29tTGV2ZWwpKQotICAgICAgICBzaXplID0g
TlNTbWFsbENvbnRyb2xTaXplOwotICAgIGVsc2UKLSAgICAgICAgc2l6ZSA9IE5TTWluaUNvbnRy
b2xTaXplOwotICAgIGlmIChzaXplICE9IFtjZWxsIGNvbnRyb2xTaXplXSkgLy8gT25seSB1cGRh
dGUgaWYgd2UgaGF2ZSB0bywgc2luY2UgQXBwS2l0IGRvZXMgd29yayBldmVuIGlmIHRoZSBzaXpl
IGlzIHRoZSBzYW1lLgotICAgICAgICBbY2VsbCBzZXRDb250cm9sU2l6ZTpzaXplXTsKLX0KLQot
SW50U2l6ZSBSZW5kZXJUaGVtZU1hYzo6c2l6ZUZvckZvbnQoUmVuZGVyU3R5bGUqIHN0eWxlLCBj
b25zdCBJbnRTaXplKiBzaXplcykgY29uc3QKLXsKLSAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpv
b20oKSAhPSAxLjBmKSB7Ci0gICAgICAgIEludFNpemUgcmVzdWx0ID0gc2l6ZXNbY29udHJvbFNp
emVGb3JGb250KHN0eWxlKV07Ci0gICAgICAgIHJldHVybiBJbnRTaXplKHJlc3VsdC53aWR0aCgp
ICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSwgcmVzdWx0LmhlaWdodCgpICogc3R5bGUtPmVmZmVj
dGl2ZVpvb20oKSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplc1tjb250cm9sU2l6ZUZvckZvbnQo
c3R5bGUpXTsKLX0KLQotSW50U2l6ZSBSZW5kZXJUaGVtZU1hYzo6c2l6ZUZvclN5c3RlbUZvbnQo
UmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3QKLXsKLSAgICBp
ZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSAxLjBmKSB7Ci0gICAgICAgIEludFNpemUgcmVz
dWx0ID0gc2l6ZXNbY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KHN0eWxlKV07Ci0gICAgICAgIHJl
dHVybiBJbnRTaXplKHJlc3VsdC53aWR0aCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSwgcmVz
dWx0LmhlaWdodCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7Ci0gICAgfQotICAgIHJldHVy
biBzaXplc1tjb250cm9sU2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUpXTsKLX0KLQotdm9pZCBSZW5k
ZXJUaGVtZU1hYzo6c2V0U2l6ZUZyb21Gb250KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50
U2l6ZSogc2l6ZXMpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IENoZWNrIGlzIGZsYXdlZCwgc2lu
Y2UgaXQgZG9lc24ndCB0YWtlIG1pbi13aWR0aC9tYXgtd2lkdGggaW50byBhY2NvdW50LgotICAg
IEludFNpemUgc2l6ZSA9IHNpemVGb3JGb250KHN0eWxlLCBzaXplcyk7Ci0gICAgaWYgKHN0eWxl
LT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgc2l6ZS53aWR0aCgpID4gMCkKLSAgICAg
ICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIEZpeGVkKSk7Ci0gICAgaWYg
KHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSAmJiBzaXplLmhlaWdodCgpID4gMCkKLSAgICAgICAg
c3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKLX0KLQotdm9p
ZCBSZW5kZXJUaGVtZU1hYzo6c2V0Rm9udEZyb21Db250cm9sU2l6ZShTdHlsZVJlc29sdmVyKiwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKSBjb25zdAotewot
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9u
LnNldElzQWJzb2x1dGVTaXplKHRydWUpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmlj
RmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHkpOwotCi0gICAgTlNGb250KiBmb250
ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250
cm9sU2l6ZTpjb250cm9sU2l6ZV1dOwotICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgp
LnNldEZhbWlseShbZm9udCBmYW1pbHlOYW1lXSk7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldENv
bXB1dGVkU2l6ZShbZm9udCBwb2ludFNpemVdICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7Ci0g
ICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoW2ZvbnQgcG9pbnRTaXplXSAqIHN0
eWxlLT5lZmZlY3RpdmVab29tKCkpOwotCi0gICAgLy8gUmVzZXQgbGluZSBoZWlnaHQKLSAgICBz
dHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci0K
LSAgICBpZiAoc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pKQotICAg
ICAgICBzdHlsZS0+Zm9udCgpLnVwZGF0ZSgwKTsKLX0KLQotTlNDb250cm9sU2l6ZSBSZW5kZXJU
aGVtZU1hYzo6Y29udHJvbFNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKLXsKLSAgICBpbnQgZm9udFNpemUgPSBzdHlsZS0+Zm9udFNpemUoKTsKLSAgICBpZiAoZm9u
dFNpemUgPj0gW05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TUmVndWxhckNv
bnRyb2xTaXplXSkKLSAgICAgICAgcmV0dXJuIE5TUmVndWxhckNvbnRyb2xTaXplOwotICAgIGlm
IChmb250U2l6ZSA+PSBbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6TlNTbWFs
bENvbnRyb2xTaXplXSkKLSAgICAgICAgcmV0dXJuIE5TU21hbGxDb250cm9sU2l6ZTsKLSAgICBy
ZXR1cm4gTlNNaW5pQ29udHJvbFNpemU7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50
VGV4dEZpZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmIHIpCi17Ci0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2Fs
Q29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0KLSNpZiBfX01BQ19PU19YX1ZFUlNJT05fTUlO
X1JFUVVJUkVEIDw9IDEwNzAKLSAgICBib29sIHVzZU5TVGV4dEZpZWxkQ2VsbCA9IG8tPnN0eWxl
KCktPmhhc0FwcGVhcmFuY2UoKQotICAgICAgICAmJiBvLT5zdHlsZSgpLT52aXNpdGVkRGVwZW5k
ZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpID09IENvbG9yOjp3aGl0ZQotICAg
ICAgICAmJiAhby0+c3R5bGUoKS0+aGFzQmFja2dyb3VuZEltYWdlKCk7Ci0KLSAgICAvLyBXZSBk
byBub3QgdXNlIE5TVGV4dEZpZWxkQ2VsbCB0byBkcmF3IHN0eWxlZCB0ZXh0IGZpZWxkcyBvbiBM
aW9uIGFuZCBTbm93TGVvcGFyZCBiZWNhdXNlCi0gICAgLy8gdGhlcmUgYXJlIGEgbnVtYmVyIG9m
IGJ1Z3Mgb24gdGhvc2UgcGxhdGZvcm1zIHRoYXQgcmVxdWlyZSBOU1RleHRGaWVsZENlbGwgdG8g
YmUgaW4gY2hhcmdlCi0gICAgLy8gb2YgcGFpbnRpbmcgaXRzIG93biBiYWNrZ3JvdW5kLiBXZSBu
ZWVkIFdlYkNvcmUgdG8gcGFpbnQgc3R5bGVkIGJhY2tncm91bmRzLCBzbyB3ZSdsbCB1c2UKLSAg
ICAvLyB0aGlzIFdlYkNvcmVTeXN0ZW1JbnRlcmZhY2UgZnVuY3Rpb24gaW5zdGVhZC4KLSAgICBp
ZiAoIXVzZU5TVGV4dEZpZWxkQ2VsbCkgewotICAgICAgICB3a0RyYXdCZXplbGVkVGV4dEZpZWxk
Q2VsbChyLCBpc0VuYWJsZWQobykgJiYgIWlzUmVhZE9ubHlDb250cm9sKG8pKTsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gICAgTlNUZXh0RmllbGRDZWxsICp0ZXh0
RmllbGQgPSB0aGlzLT50ZXh0RmllbGQoKTsKLQotICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2
ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotCi0gICAgW3RleHRGaWVsZCBzZXRF
bmFibGVkOihpc0VuYWJsZWQobykgJiYgIWlzUmVhZE9ubHlDb250cm9sKG8pKV07Ci0gICAgW3Rl
eHRGaWVsZCBkcmF3V2l0aEZyYW1lOk5TUmVjdChyKSBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8p
XTsKLQotICAgIFt0ZXh0RmllbGQgc2V0Q29udHJvbFZpZXc6bmlsXTsKLQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0VGV4dEZpZWxkU3R5bGUoU3R5
bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0Ci17Ci19Ci0KLWJvb2wg
UmVuZGVyVGhlbWVNYWM6OnBhaW50Q2Fwc0xvY2tJbmRpY2F0b3IoUmVuZGVyT2JqZWN0KiwgY29u
c3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgaWYgKHBh
aW50SW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludElu
Zm8uY29udGV4dCk7Ci0gICAgd2tEcmF3Q2Fwc0xvY2tJbmRpY2F0b3IobG9jYWxDb250ZXh0LmNn
Q29udGV4dCgpLCByKTsKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVy
VGhlbWVNYWM6OnBhaW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBMb2NhbEN1cnJlbnRHcmFwaGlj
c0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICB3a0RyYXdCZXpl
bGVkVGV4dEFyZWEociwgaXNFbmFibGVkKG8pICYmICFpc1JlYWRPbmx5Q29udHJvbChvKSk7Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RUZXh0QXJl
YVN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdAotewot
fQotCi1jb25zdCBpbnQqIFJlbmRlclRoZW1lTWFjOjpwb3B1cEJ1dHRvbk1hcmdpbnMoKSBjb25z
dAotewotICAgIHN0YXRpYyBjb25zdCBpbnQgbWFyZ2luc1szXVs0XSA9Ci0gICAgewotICAgICAg
ICB7IDAsIDMsIDEsIDMgfSwKLSAgICAgICAgeyAwLCAzLCAyLCAzIH0sCi0gICAgICAgIHsgMCwg
MSwgMCwgMSB9Ci0gICAgfTsKLSAgICByZXR1cm4gbWFyZ2luc1tbcG9wdXBCdXR0b24oKSBjb250
cm9sU2l6ZV1dOwotfQotCi1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6cG9wdXBCdXR0
b25TaXplcygpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7
IEludFNpemUoMCwgMjEpLCBJbnRTaXplKDAsIDE4KSwgSW50U2l6ZSgwLCAxNSkgfTsKLSAgICBy
ZXR1cm4gc2l6ZXM7Ci19Ci0KLWNvbnN0IGludCogUmVuZGVyVGhlbWVNYWM6OnBvcHVwQnV0dG9u
UGFkZGluZyhOU0NvbnRyb2xTaXplIHNpemUpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IGlu
dCBwYWRkaW5nWzNdWzRdID0KLSAgICB7Ci0gICAgICAgIHsgMiwgMjYsIDMsIDggfSwKLSAgICAg
ICAgeyAyLCAyMywgMywgOCB9LAotICAgICAgICB7IDIsIDIyLCAzLCAxMCB9Ci0gICAgfTsKLSAg
ICByZXR1cm4gcGFkZGluZ1tzaXplXTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRN
ZW51TGlzdChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiByKQotewotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENv
bnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHNldFBvcHVwQnV0dG9uQ2VsbFN0YXRlKG8s
IHIpOwotCi0gICAgTlNQb3BVcEJ1dHRvbkNlbGwqIHBvcHVwQnV0dG9uID0gdGhpcy0+cG9wdXBC
dXR0b24oKTsKLQotICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpv
b20oKTsKLSAgICBJbnRTaXplIHNpemUgPSBwb3B1cEJ1dHRvblNpemVzKClbW3BvcHVwQnV0dG9u
IGNvbnRyb2xTaXplXV07Ci0gICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21M
ZXZlbCk7Ci0gICAgc2l6ZS5zZXRXaWR0aChyLndpZHRoKCkpOwotCi0gICAgLy8gTm93IGluZmxh
dGUgaXQgdG8gYWNjb3VudCBmb3IgdGhlIHNoYWRvdy4KLSAgICBJbnRSZWN0IGluZmxhdGVkUmVj
dCA9IHI7Ci0gICAgaWYgKHIud2lkdGgoKSA+PSBtaW5pbXVtTWVudUxpc3RTaXplKG8tPnN0eWxl
KCkpKQotICAgICAgICBpbmZsYXRlZFJlY3QgPSBpbmZsYXRlUmVjdChpbmZsYXRlZFJlY3QsIHNp
emUsIHBvcHVwQnV0dG9uTWFyZ2lucygpLCB6b29tTGV2ZWwpOwotCi0gICAgR3JhcGhpY3NDb250
ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0gICAgCi0gICAg
Ly8gT24gTGVvcGFyZCwgdGhlIGNlbGwgd2lsbCBkcmF3IG91dHNpZGUgb2YgdGhlIGdpdmVuIHJl
Y3QsIHNvIHdlIGhhdmUgdG8gY2xpcCB0byB0aGUgcmVjdAotICAgIHBhaW50SW5mby5jb250ZXh0
LT5jbGlwKGluZmxhdGVkUmVjdCk7Ci0KLSAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsKLSAg
ICAgICAgaW5mbGF0ZWRSZWN0LnNldFdpZHRoKGluZmxhdGVkUmVjdC53aWR0aCgpIC8gem9vbUxl
dmVsKTsKLSAgICAgICAgaW5mbGF0ZWRSZWN0LnNldEhlaWdodChpbmZsYXRlZFJlY3QuaGVpZ2h0
KCkgLyB6b29tTGV2ZWwpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKGlu
ZmxhdGVkUmVjdC54KCksIGluZmxhdGVkUmVjdC55KCkpOwotICAgICAgICBwYWludEluZm8uY29u
dGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9vbUxldmVsKSk7Ci0gICAgICAgIHBh
aW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLWluZmxhdGVkUmVjdC54KCksIC1pbmZsYXRlZFJl
Y3QueSgpKTsKLSAgICB9Ci0KLSAgICBOU1ZpZXcgKnZpZXcgPSBkb2N1bWVudFZpZXdGb3Iobyk7
Ci0gICAgW3BvcHVwQnV0dG9uIGRyYXdXaXRoRnJhbWU6aW5mbGF0ZWRSZWN0IGluVmlldzp2aWV3
XTsKLSNpZiAhQlVUVE9OX0NFTExfRFJBV19XSVRIX0ZSQU1FX0RSQVdTX0ZPQ1VTX1JJTkcKLSAg
ICBpZiAoaXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91dGxpbmVTdHlsZUlzQXV0bygpKQot
ICAgICAgICBbcG9wdXBCdXR0b24gX3dlYl9kcmF3Rm9jdXNSaW5nV2l0aEZyYW1lOmluZmxhdGVk
UmVjdCBpblZpZXc6dmlld107Ci0jZW5kaWYKLSAgICBbcG9wdXBCdXR0b24gc2V0Q29udHJvbFZp
ZXc6bmlsXTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmIEVOQUJMRShNRVRFUl9FTEVN
RU5UKQotCi1JbnRTaXplIFJlbmRlclRoZW1lTWFjOjptZXRlclNpemVGb3JCb3VuZHMoY29uc3Qg
UmVuZGVyTWV0ZXIqIHJlbmRlck1ldGVyLCBjb25zdCBJbnRSZWN0JiBib3VuZHMpIGNvbnN0Ci17
Ci0gICAgaWYgKE5vQ29udHJvbFBhcnQgPT0gcmVuZGVyTWV0ZXItPnN0eWxlKCktPmFwcGVhcmFu
Y2UoKSkKLSAgICAgICAgcmV0dXJuIGJvdW5kcy5zaXplKCk7Ci0KLSAgICBOU0xldmVsSW5kaWNh
dG9yQ2VsbCogY2VsbCA9IGxldmVsSW5kaWNhdG9yRm9yKHJlbmRlck1ldGVyKTsKLSAgICAvLyBN
YWtlcyBlbm91Z2ggcm9vbSBmb3IgY2VsbCdzIGludHJpbnNpYyBzaXplLgotICAgIE5TU2l6ZSBj
ZWxsU2l6ZSA9IFtjZWxsIGNlbGxTaXplRm9yQm91bmRzOkludFJlY3QoSW50UG9pbnQoKSwgYm91
bmRzLnNpemUoKSldOwotICAgIHJldHVybiBJbnRTaXplKGJvdW5kcy53aWR0aCgpIDwgY2VsbFNp
emUud2lkdGggPyBjZWxsU2l6ZS53aWR0aCA6IGJvdW5kcy53aWR0aCgpLAotICAgICAgICAgICAg
ICAgICAgIGJvdW5kcy5oZWlnaHQoKSA8IGNlbGxTaXplLmhlaWdodCA/IGNlbGxTaXplLmhlaWdo
dCA6IGJvdW5kcy5oZWlnaHQoKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWV0
ZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc01ldGVy
KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250
ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0KLSAgICBOU0xldmVsSW5kaWNh
dG9yQ2VsbCogY2VsbCA9IGxldmVsSW5kaWNhdG9yRm9yKHRvUmVuZGVyTWV0ZXIocmVuZGVyT2Jq
ZWN0KSk7Ci0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludElu
Zm8uY29udGV4dCk7Ci0KLSAgICBbY2VsbCBkcmF3V2l0aEZyYW1lOnJlY3QgaW5WaWV3OmRvY3Vt
ZW50Vmlld0ZvcihyZW5kZXJPYmplY3QpXTsKLSAgICBbY2VsbCBzZXRDb250cm9sVmlldzpuaWxd
OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6c3VwcG9ydHNN
ZXRlcihDb250cm9sUGFydCBwYXJ0KSBjb25zdAotewotICAgIHN3aXRjaCAocGFydCkgewotICAg
IGNhc2UgUmVsZXZhbmN5TGV2ZWxJbmRpY2F0b3JQYXJ0OgotICAgIGNhc2UgRGlzY3JldGVDYXBh
Y2l0eUxldmVsSW5kaWNhdG9yUGFydDoKLSAgICBjYXNlIFJhdGluZ0xldmVsSW5kaWNhdG9yUGFy
dDoKLSAgICBjYXNlIE1ldGVyUGFydDoKLSAgICBjYXNlIENvbnRpbnVvdXNDYXBhY2l0eUxldmVs
SW5kaWNhdG9yUGFydDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotTlNMZXZlbEluZGljYXRvclN0eWxlIFJlbmRl
clRoZW1lTWFjOjpsZXZlbEluZGljYXRvclN0eWxlRm9yKENvbnRyb2xQYXJ0IHBhcnQpIGNvbnN0
Ci17Ci0gICAgc3dpdGNoIChwYXJ0KSB7Ci0gICAgY2FzZSBSZWxldmFuY3lMZXZlbEluZGljYXRv
clBhcnQ6Ci0gICAgICAgIHJldHVybiBOU1JlbGV2YW5jeUxldmVsSW5kaWNhdG9yU3R5bGU7Ci0g
ICAgY2FzZSBEaXNjcmV0ZUNhcGFjaXR5TGV2ZWxJbmRpY2F0b3JQYXJ0OgotICAgICAgICByZXR1
cm4gTlNEaXNjcmV0ZUNhcGFjaXR5TGV2ZWxJbmRpY2F0b3JTdHlsZTsKLSAgICBjYXNlIFJhdGlu
Z0xldmVsSW5kaWNhdG9yUGFydDoKLSAgICAgICAgcmV0dXJuIE5TUmF0aW5nTGV2ZWxJbmRpY2F0
b3JTdHlsZTsKLSAgICBjYXNlIE1ldGVyUGFydDoKLSAgICBjYXNlIENvbnRpbnVvdXNDYXBhY2l0
eUxldmVsSW5kaWNhdG9yUGFydDoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTlNDb250
aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclN0eWxlOwotICAgIH0KLSAgICAKLX0KLQotTlNM
ZXZlbEluZGljYXRvckNlbGwqIFJlbmRlclRoZW1lTWFjOjpsZXZlbEluZGljYXRvckZvcihjb25z
dCBSZW5kZXJNZXRlciogcmVuZGVyTWV0ZXIpIGNvbnN0Ci17Ci0gICAgUmVuZGVyU3R5bGUqIHN0
eWxlID0gcmVuZGVyTWV0ZXItPnN0eWxlKCk7Ci0gICAgQVNTRVJUKHN0eWxlLT5hcHBlYXJhbmNl
KCkgIT0gTm9Db250cm9sUGFydCk7Ci0KLSAgICBpZiAoIW1fbGV2ZWxJbmRpY2F0b3IpCi0gICAg
ICAgIG1fbGV2ZWxJbmRpY2F0b3IuYWRvcHROUyhbW05TTGV2ZWxJbmRpY2F0b3JDZWxsIGFsbG9j
XSBpbml0V2l0aExldmVsSW5kaWNhdG9yU3R5bGU6TlNDb250aW51b3VzQ2FwYWNpdHlMZXZlbElu
ZGljYXRvclN0eWxlXSk7Ci0gICAgTlNMZXZlbEluZGljYXRvckNlbGwqIGNlbGwgPSBtX2xldmVs
SW5kaWNhdG9yLmdldCgpOwotCi0gICAgSFRNTE1ldGVyRWxlbWVudCogZWxlbWVudCA9IHJlbmRl
ck1ldGVyLT5tZXRlckVsZW1lbnQoKTsKLSAgICBkb3VibGUgdmFsdWUgPSBlbGVtZW50LT52YWx1
ZSgpOwotCi0gICAgLy8gQmVjYXVzZSBOU0xldmVsSW5kaWNhdG9yQ2VsbCBkb2VzIG5vdCBzdXBw
b3J0IG9wdGltdW0taW4tdGhlLW1pZGRsZSB0eXBlIGNvbG9yaW5nLAotICAgIC8vIHdlIGV4cGxp
Y2l0bHkgY29udHJvbCB0aGUgY29sb3IgaW5zdGVhZCBnaXZpbmcgbG93IGFuZCBoaWdoIHZhbHVl
IHRvIE5TTGV2ZWxJbmRpY2F0b3JDZWxsIGFzIGlzLgotICAgIHN3aXRjaCAoZWxlbWVudC0+Z2F1
Z2VSZWdpb24oKSkgewotICAgIGNhc2UgSFRNTE1ldGVyRWxlbWVudDo6R2F1Z2VSZWdpb25PcHRp
bXVtOgotICAgICAgICAvLyBNYWtlIG1ldGVyIHRoZSBncmVlbgotICAgICAgICBbY2VsbCBzZXRX
YXJuaW5nVmFsdWU6dmFsdWUgKyAxXTsKLSAgICAgICAgW2NlbGwgc2V0Q3JpdGljYWxWYWx1ZTp2
YWx1ZSArIDJdOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEhUTUxNZXRlckVsZW1lbnQ6Okdh
dWdlUmVnaW9uU3Vib3B0aW1hbDoKLSAgICAgICAgLy8gTWFrZSB0aGUgbWV0ZXIgeWVsbG93Ci0g
ICAgICAgIFtjZWxsIHNldFdhcm5pbmdWYWx1ZTp2YWx1ZSAtIDFdOwotICAgICAgICBbY2VsbCBz
ZXRDcml0aWNhbFZhbHVlOnZhbHVlICsgMV07Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSFRN
TE1ldGVyRWxlbWVudDo6R2F1Z2VSZWdpb25FdmVuTGVzc0dvb2Q6Ci0gICAgICAgIC8vIE1ha2Ug
dGhlIG1ldGVyIHJlZAotICAgICAgICBbY2VsbCBzZXRXYXJuaW5nVmFsdWU6dmFsdWUgLSAyXTsK
LSAgICAgICAgW2NlbGwgc2V0Q3JpdGljYWxWYWx1ZTp2YWx1ZSAtIDFdOwotICAgICAgICBicmVh
azsKLSAgICB9Ci0KLSAgICBbY2VsbCBzZXRMZXZlbEluZGljYXRvclN0eWxlOmxldmVsSW5kaWNh
dG9yU3R5bGVGb3Ioc3R5bGUtPmFwcGVhcmFuY2UoKSldOwotICAgIFtjZWxsIHNldEJhc2VXcml0
aW5nRGlyZWN0aW9uOnN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOU1dyaXRpbmdE
aXJlY3Rpb25MZWZ0VG9SaWdodCA6IE5TV3JpdGluZ0RpcmVjdGlvblJpZ2h0VG9MZWZ0XTsKLSAg
ICBbY2VsbCBzZXRNaW5WYWx1ZTplbGVtZW50LT5taW4oKV07Ci0gICAgW2NlbGwgc2V0TWF4VmFs
dWU6ZWxlbWVudC0+bWF4KCldOwotICAgIFJldGFpblB0cjxOU051bWJlcj4gdmFsdWVPYmplY3Qg
PSBbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTp2YWx1ZV07Ci0gICAgW2NlbGwgc2V0T2JqZWN0
VmFsdWU6dmFsdWVPYmplY3QuZ2V0KCldOwotCi0gICAgcmV0dXJuIGNlbGw7Ci19Ci0KLSNlbmRp
ZgotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCi1jb25zdCBJbnRTaXplKiBSZW5kZXJU
aGVtZU1hYzo6cHJvZ3Jlc3NCYXJTaXplcygpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IElu
dFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMCwgMjApLCBJbnRTaXplKDAsIDEyKSwgSW50U2l6
ZSgwLCAxMikgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0KLWNvbnN0IGludCogUmVuZGVyVGhl
bWVNYWM6OnByb2dyZXNzQmFyTWFyZ2lucyhOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKSBjb25z
dAotewotICAgIHN0YXRpYyBjb25zdCBpbnQgbWFyZ2luc1szXVs0XSA9Ci0gICAgewotICAgICAg
ICB7IDAsIDAsIDEsIDAgfSwKLSAgICAgICAgeyAwLCAwLCAxLCAwIH0sCi0gICAgICAgIHsgMCwg
MCwgMSwgMCB9LAotICAgIH07Ci0gICAgcmV0dXJuIG1hcmdpbnNbY29udHJvbFNpemVdOwotfQot
Ci1pbnQgUmVuZGVyVGhlbWVNYWM6Om1pbmltdW1Qcm9ncmVzc0JhckhlaWdodChSZW5kZXJTdHls
ZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCBw
cm9ncmVzc0JhclNpemVzKCkpLmhlaWdodCgpOwotfQotICAgIAotZG91YmxlIFJlbmRlclRoZW1l
TWFjOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNz
KikgY29uc3QKLXsKLSAgICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRpb25GcmFtZVJhdGU7Ci19Ci0K
LWRvdWJsZSBSZW5kZXJUaGVtZU1hYzo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihS
ZW5kZXJQcm9ncmVzcyopIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByb2dyZXNzQW5pbWF0aW9uTnVt
RnJhbWVzICogcHJvZ3Jlc3NBbmltYXRpb25GcmFtZVJhdGU7Ci19Ci0KLXZvaWQgUmVuZGVyVGhl
bWVNYWM6OmFkanVzdFByb2dyZXNzQmFyU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxl
KiwgRWxlbWVudCopIGNvbnN0Ci17Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50UHJv
Z3Jlc3NCYXIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmICghcmVuZGVyT2JqZWN0LT5p
c1Byb2dyZXNzKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZmxvYXQgem9vbUxldmVs
ID0gcmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgaW50IGNvbnRy
b2xTaXplID0gY29udHJvbFNpemVGb3JGb250KHJlbmRlck9iamVjdC0+c3R5bGUoKSk7Ci0gICAg
SW50U2l6ZSBzaXplID0gcHJvZ3Jlc3NCYXJTaXplcygpW2NvbnRyb2xTaXplXTsKLSAgICBzaXpl
LnNldEhlaWdodChzaXplLmhlaWdodCgpICogem9vbUxldmVsKTsKLSAgICBzaXplLnNldFdpZHRo
KHJlY3Qud2lkdGgoKSk7Ci0gICAgCi0gICAgLy8gTm93IGluZmxhdGUgaXQgdG8gYWNjb3VudCBm
b3IgdGhlIHNoYWRvdy4KLSAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IHJlY3Q7Ci0gICAgaWYg
KHJlY3QuaGVpZ2h0KCkgPD0gbWluaW11bVByb2dyZXNzQmFySGVpZ2h0KHJlbmRlck9iamVjdC0+
c3R5bGUoKSkpCi0gICAgICAgIGluZmxhdGVkUmVjdCA9IGluZmxhdGVSZWN0KGluZmxhdGVkUmVj
dCwgc2l6ZSwgcHJvZ3Jlc3NCYXJNYXJnaW5zKGNvbnRyb2xTaXplKSwgem9vbUxldmVsKTsKLSAg
ICAKLSAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0b1JlbmRlclByb2dyZXNz
KHJlbmRlck9iamVjdCk7Ci0gICAgSElUaGVtZVRyYWNrRHJhd0luZm8gdHJhY2tJbmZvOwotICAg
IHRyYWNrSW5mby52ZXJzaW9uID0gMDsKLSAgICBpZiAoY29udHJvbFNpemUgPT0gTlNSZWd1bGFy
Q29udHJvbFNpemUpCi0gICAgICAgIHRyYWNrSW5mby5raW5kID0gcmVuZGVyUHJvZ3Jlc3MtPnBv
c2l0aW9uKCkgPCAwID8ga1RoZW1lTGFyZ2VJbmRldGVybWluYXRlQmFyIDoga1RoZW1lTGFyZ2VQ
cm9ncmVzc0JhcjsKLSAgICBlbHNlCi0gICAgICAgIHRyYWNrSW5mby5raW5kID0gcmVuZGVyUHJv
Z3Jlc3MtPnBvc2l0aW9uKCkgPCAwID8ga1RoZW1lTWVkaXVtSW5kZXRlcm1pbmF0ZUJhciA6IGtU
aGVtZU1lZGl1bVByb2dyZXNzQmFyOwotICAgIAotICAgIHRyYWNrSW5mby5ib3VuZHMgPSBJbnRS
ZWN0KEludFBvaW50KCksIGluZmxhdGVkUmVjdC5zaXplKCkpOwotICAgIHRyYWNrSW5mby5taW4g
PSAwOwotICAgIHRyYWNrSW5mby5tYXggPSBudW1lcmljX2xpbWl0czxTSW50MzI+OjptYXgoKTsK
LSAgICB0cmFja0luZm8udmFsdWUgPSBscm91bmQocmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkg
KiBuZXh0YWZ0ZXIodHJhY2tJbmZvLm1heCwgMCkpOwotICAgIHRyYWNrSW5mby50cmFja0luZm8u
cHJvZ3Jlc3MucGhhc2UgPSBscm91bmQocmVuZGVyUHJvZ3Jlc3MtPmFuaW1hdGlvblByb2dyZXNz
KCkgKiBuZXh0YWZ0ZXIocHJvZ3Jlc3NBbmltYXRpb25OdW1GcmFtZXMsIDApKTsKLSAgICB0cmFj
a0luZm8uYXR0cmlidXRlcyA9IGtUaGVtZVRyYWNrSG9yaXpvbnRhbDsKLSAgICB0cmFja0luZm8u
ZW5hYmxlU3RhdGUgPSBpc0FjdGl2ZShyZW5kZXJPYmplY3QpID8ga1RoZW1lVHJhY2tBY3RpdmUg
OiBrVGhlbWVUcmFja0luYWN0aXZlOwotICAgIHRyYWNrSW5mby5yZXNlcnZlZCA9IDA7Ci0gICAg
dHJhY2tJbmZvLmZpbGxlcjEgPSAwOwotCi0gICAgT3duUHRyPEltYWdlQnVmZmVyPiBpbWFnZUJ1
ZmZlciA9IEltYWdlQnVmZmVyOjpjcmVhdGUoaW5mbGF0ZWRSZWN0LnNpemUoKSwgMSk7Ci0gICAg
aWYgKCFpbWFnZUJ1ZmZlcikKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBDb250ZXh0Q29u
dGFpbmVyIGNnQ29udGV4dENvbnRhaW5lcihpbWFnZUJ1ZmZlci0+Y29udGV4dCgpKTsKLSAgICBD
R0NvbnRleHRSZWYgY2dDb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLSAg
ICBISVRoZW1lRHJhd1RyYWNrKCZ0cmFja0luZm8sIDAsIGNnQ29udGV4dCwga0hJVGhlbWVPcmll
bnRhdGlvbk5vcm1hbCk7Ci0KLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2
ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKLQotICAgIGlmICghcmVuZGVyUHJvZ3Jlc3MtPnN0eWxl
KCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkgewotICAgICAgICBwYWludEluZm8uY29udGV4
dC0+dHJhbnNsYXRlKDIgKiBpbmZsYXRlZFJlY3QueCgpICsgaW5mbGF0ZWRSZWN0LndpZHRoKCks
IDApOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKC0xLCAxKSk7
Ci0gICAgfQotICAgIAotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3SW1hZ2VCdWZmZXIoaW1h
Z2VCdWZmZXIuZ2V0KCksIENvbG9yU3BhY2VEZXZpY2VSR0IsIGluZmxhdGVkUmVjdC5sb2NhdGlv
bigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19ICAgIAotI2VuZGlmCi0KLWNvbnN0IGZsb2F0IGJh
c2VGb250U2l6ZSA9IDExLjBmOwotY29uc3QgZmxvYXQgYmFzZUFycm93SGVpZ2h0ID0gNC4wZjsK
LWNvbnN0IGZsb2F0IGJhc2VBcnJvd1dpZHRoID0gNS4wZjsKLWNvbnN0IGZsb2F0IGJhc2VTcGFj
ZUJldHdlZW5BcnJvd3MgPSAyLjBmOwotY29uc3QgaW50IGFycm93UGFkZGluZ0xlZnQgPSA2Owot
Y29uc3QgaW50IGFycm93UGFkZGluZ1JpZ2h0ID0gNjsKLWNvbnN0IGludCBwYWRkaW5nQmVmb3Jl
U2VwYXJhdG9yID0gNDsKLWNvbnN0IGludCBiYXNlQm9yZGVyUmFkaXVzID0gNTsKLWNvbnN0IGlu
dCBzdHlsZWRQb3B1cFBhZGRpbmdMZWZ0ID0gODsKLWNvbnN0IGludCBzdHlsZWRQb3B1cFBhZGRp
bmdUb3AgPSAxOwotY29uc3QgaW50IHN0eWxlZFBvcHVwUGFkZGluZ0JvdHRvbSA9IDI7Ci0KLXN0
YXRpYyB2b2lkIFRvcEdyYWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQqIGlu
RGF0YSwgQ0dGbG9hdCogb3V0RGF0YSkKLXsKLSAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9IHsg
MS4wZiwgMS4wZiwgMS4wZiwgMC40ZiB9OwotICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsg
MS4wZiwgMS4wZiwgMS4wZiwgMC4xNWYgfTsKLSAgICBmbG9hdCBhID0gaW5EYXRhWzBdOwotICAg
IGludCBpID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICBvdXREYXRh
W2ldID0gKDEuMGYgLSBhKSAqIGRhcmtbaV0gKyBhICogbGlnaHRbaV07Ci19Ci0KLXN0YXRpYyB2
b2lkIEJvdHRvbUdyYWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQqIGluRGF0
YSwgQ0dGbG9hdCogb3V0RGF0YSkKLXsKLSAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9IHsgMS4w
ZiwgMS4wZiwgMS4wZiwgMC4wZiB9OwotICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMS4w
ZiwgMS4wZiwgMS4wZiwgMC4zZiB9OwotICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07Ci0gICAgaW50
IGkgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIG91dERhdGFbaV0g
PSAoMS4wZiAtIGEpICogZGFya1tpXSArIGEgKiBsaWdodFtpXTsKLX0KLQotc3RhdGljIHZvaWQg
TWFpbkdyYWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQqIGluRGF0YSwgQ0dG
bG9hdCogb3V0RGF0YSkKLXsKLSAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9IHsgMC4wZiwgMC4w
ZiwgMC4wZiwgMC4xNWYgfTsKLSAgICBzdGF0aWMgZmxvYXQgbGlnaHRbNF0gPSB7IDAuMGYsIDAu
MGYsIDAuMGYsIDAuMGYgfTsKLSAgICBmbG9hdCBhID0gaW5EYXRhWzBdOwotICAgIGludCBpID0g
MDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICBvdXREYXRhW2ldID0gKDEu
MGYgLSBhKSAqIGRhcmtbaV0gKyBhICogbGlnaHRbaV07Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYWNr
R3JhZGllbnRJbnRlcnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0
KiBvdXREYXRhKQotewotICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAwLjBmLCAwLjBmLCAw
LjBmLCAwLjY3OGYgfTsKLSAgICBzdGF0aWMgZmxvYXQgbGlnaHRbNF0gPSB7IDAuMGYsIDAuMGYs
IDAuMGYsIDAuMTNmIH07Ci0gICAgZmxvYXQgYSA9IGluRGF0YVswXTsKLSAgICBpbnQgaSA9IDA7
Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBm
IC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ldOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFj
OjpwYWludE1lbnVMaXN0QnV0dG9uR3JhZGllbnRzKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgaWYgKHIuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDb250ZXh0Q29udGFpbmVyIGNnQ29udGV4dENv
bnRhaW5lcihwYWludEluZm8uY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBj
Z0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVT
YXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0KLSAgICBSb3VuZGVkUmVjdCBi
b3JkZXIgPSBvLT5zdHlsZSgpLT5nZXRSb3VuZGVkQm9yZGVyRm9yKHIsIG8tPnZpZXcoKSk7Ci0g
ICAgaW50IHJhZGl1cyA9IGJvcmRlci5yYWRpaSgpLnRvcExlZnQoKS53aWR0aCgpOwotCi0gICAg
Q0dDb2xvclNwYWNlUmVmIGNzcGFjZSA9IGRldmljZVJHQkNvbG9yU3BhY2VSZWYoKTsKLQotICAg
IEZsb2F0UmVjdCB0b3BHcmFkaWVudChyLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQo
KSAvIDIuMGYpOwotICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIHRvcENhbGxiYWNrcyA9
IHsgMCwgVG9wR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9OwotICAgIFJldGFpblB0cjxDR0Z1
bmN0aW9uUmVmPiB0b3BGdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEs
IE5VTEwsIDQsIE5VTEwsICZ0b3BDYWxsYmFja3MpKTsKLSAgICBSZXRhaW5QdHI8Q0dTaGFkaW5n
UmVmPiB0b3BTaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQ
b2ludE1ha2UodG9wR3JhZGllbnQueCgpLCB0b3BHcmFkaWVudC55KCkpLCBDR1BvaW50TWFrZSh0
b3BHcmFkaWVudC54KCksIHRvcEdyYWRpZW50Lm1heFkoKSksIHRvcEZ1bmN0aW9uLmdldCgpLCBm
YWxzZSwgZmFsc2UpKTsKLQotICAgIEZsb2F0UmVjdCBib3R0b21HcmFkaWVudChyLngoKSArIHJh
ZGl1cywgci55KCkgKyByLmhlaWdodCgpIC8gMi4wZiwgci53aWR0aCgpIC0gMi4wZiAqIHJhZGl1
cywgci5oZWlnaHQoKSAvIDIuMGYpOwotICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIGJv
dHRvbUNhbGxiYWNrcyA9IHsgMCwgQm90dG9tR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9Owot
ICAgIFJldGFpblB0cjxDR0Z1bmN0aW9uUmVmPiBib3R0b21GdW5jdGlvbihBZG9wdENGLCBDR0Z1
bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZib3R0b21DYWxsYmFja3MpKTsK
LSAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiBib3R0b21TaGFkaW5nKEFkb3B0Q0YsIENHU2hh
ZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2UoYm90dG9tR3JhZGllbnQueCgpLCAg
Ym90dG9tR3JhZGllbnQueSgpKSwgQ0dQb2ludE1ha2UoYm90dG9tR3JhZGllbnQueCgpLCBib3R0
b21HcmFkaWVudC5tYXhZKCkpLCBib3R0b21GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7
Ci0KLSAgICBzdHJ1Y3QgQ0dGdW5jdGlvbkNhbGxiYWNrcyBtYWluQ2FsbGJhY2tzID0geyAwLCBN
YWluR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9OwotICAgIFJldGFpblB0cjxDR0Z1bmN0aW9u
UmVmPiBtYWluRnVuY3Rpb24oQWRvcHRDRiwgQ0dGdW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBOVUxM
LCA0LCBOVUxMLCAmbWFpbkNhbGxiYWNrcykpOwotICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+
IG1haW5TaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2lu
dE1ha2Uoci54KCksICByLnkoKSksIENHUG9pbnRNYWtlKHIueCgpLCByLm1heFkoKSksIG1haW5G
dW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICBSZXRhaW5QdHI8Q0dTaGFkaW5n
UmVmPiBsZWZ0U2hhZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENH
UG9pbnRNYWtlKHIueCgpLCAgci55KCkpLCBDR1BvaW50TWFrZShyLngoKSArIHJhZGl1cywgci55
KCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgUmV0YWluUHRy
PENHU2hhZGluZ1JlZj4gcmlnaHRTaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFs
KGNzcGFjZSwgQ0dQb2ludE1ha2Uoci5tYXhYKCksICByLnkoKSksIENHUG9pbnRNYWtlKHIubWF4
WCgpIC0gcmFkaXVzLCByLnkoKSksIG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7
Ci0KLSAgICB7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigq
cGFpbnRJbmZvLmNvbnRleHQpOwotICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQs
IHIpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKGJvcmRl
cik7Ci0gICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOwotICAg
ICAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBtYWluU2hhZGluZy5nZXQoKSk7Ci0g
ICAgfQotICAgIAotICAgIHsKLSAgICAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0
ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0gICAgICAgIENHQ29udGV4dENsaXBUb1JlY3Qo
Y29udGV4dCwgdG9wR3JhZGllbnQpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+YWRkUm91
bmRlZFJlY3RDbGlwKFJvdW5kZWRSZWN0KGVuY2xvc2luZ0ludFJlY3QodG9wR3JhZGllbnQpLCBi
b3JkZXIucmFkaWkoKS50b3BMZWZ0KCksIGJvcmRlci5yYWRpaSgpLnRvcFJpZ2h0KCksIEludFNp
emUoKSwgSW50U2l6ZSgpKSk7Ci0gICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIu
Y29udGV4dCgpOwotICAgICAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCB0b3BTaGFk
aW5nLmdldCgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFib3R0b21HcmFkaWVudC5pc0VtcHR5
KCkpIHsKLSAgICAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWlu
dEluZm8uY29udGV4dCk7Ci0gICAgICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgYm90
dG9tR3JhZGllbnQpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RD
bGlwKFJvdW5kZWRSZWN0KGVuY2xvc2luZ0ludFJlY3QoYm90dG9tR3JhZGllbnQpLCBJbnRTaXpl
KCksIEludFNpemUoKSwgYm9yZGVyLnJhZGlpKCkuYm90dG9tTGVmdCgpLCBib3JkZXIucmFkaWko
KS5ib3R0b21SaWdodCgpKSk7Ci0gICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIu
Y29udGV4dCgpOwotICAgICAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBib3R0b21T
aGFkaW5nLmdldCgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dFN0
YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotICAgICAgICBDR0NvbnRl
eHRDbGlwVG9SZWN0KGNvbnRleHQsIHIpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+YWRk
Um91bmRlZFJlY3RDbGlwKGJvcmRlcik7Ci0gICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250
YWluZXIuY29udGV4dCgpOwotICAgICAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBs
ZWZ0U2hhZGluZy5nZXQoKSk7Ci0gICAgICAgIENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQs
IHJpZ2h0U2hhZGluZy5nZXQoKSk7Ci0gICAgfQotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpw
YWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWlu
dEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgSW50UmVjdCBib3VuZHMgPSBJbnRSZWN0
KHIueCgpICsgby0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHIueSgpICsgby0+c3R5bGUoKS0+Ym9yZGVyVG9wV2lkdGgoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgci53aWR0aCgpIC0gby0+c3R5bGUoKS0+Ym9yZGVyTGVm
dFdpZHRoKCkgLSBvLT5zdHlsZSgpLT5ib3JkZXJSaWdodFdpZHRoKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHIuaGVpZ2h0KCkgLSBvLT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgp
IC0gby0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tV2lkdGgoKSk7Ci0gICAgLy8gRHJhdyB0aGUgZ3Jh
ZGllbnRzIHRvIGdpdmUgdGhlIHN0eWxlZCBwb3B1cCBtZW51IGEgYnV0dG9uIGFwcGVhcmFuY2UK
LSAgICBwYWludE1lbnVMaXN0QnV0dG9uR3JhZGllbnRzKG8sIHBhaW50SW5mbywgYm91bmRzKTsK
LQotICAgIC8vIFNpbmNlIHdlIGFjdHVhbGx5IGtub3cgdGhlIHNpemUgb2YgdGhlIGNvbnRyb2wg
aGVyZSwgd2UgcmVzdHJpY3QgdGhlIGZvbnQgc2NhbGUgdG8gbWFrZSBzdXJlIHRoZSBhcnJvd3Mg
d2lsbCBmaXQgdmVydGljYWxseSBpbiB0aGUgYm91bmRzCi0gICAgZmxvYXQgZm9udFNjYWxlID0g
bWluKG8tPnN0eWxlKCktPmZvbnRTaXplKCkgLyBiYXNlRm9udFNpemUsIGJvdW5kcy5oZWlnaHQo
KSAvIChiYXNlQXJyb3dIZWlnaHQgKiAyICsgYmFzZVNwYWNlQmV0d2VlbkFycm93cykpOwotICAg
IGZsb2F0IGNlbnRlclkgPSBib3VuZHMueSgpICsgYm91bmRzLmhlaWdodCgpIC8gMi4wZjsKLSAg
ICBmbG9hdCBhcnJvd0hlaWdodCA9IGJhc2VBcnJvd0hlaWdodCAqIGZvbnRTY2FsZTsKLSAgICBm
bG9hdCBhcnJvd1dpZHRoID0gYmFzZUFycm93V2lkdGggKiBmb250U2NhbGU7Ci0gICAgZmxvYXQg
bGVmdEVkZ2UgPSBib3VuZHMubWF4WCgpIC0gYXJyb3dQYWRkaW5nUmlnaHQgKiBvLT5zdHlsZSgp
LT5lZmZlY3RpdmVab29tKCkgLSBhcnJvd1dpZHRoOwotICAgIGZsb2F0IHNwYWNlQmV0d2VlbkFy
cm93cyA9IGJhc2VTcGFjZUJldHdlZW5BcnJvd3MgKiBmb250U2NhbGU7Ci0KLSAgICBpZiAoYm91
bmRzLndpZHRoKCkgPCBhcnJvd1dpZHRoICsgYXJyb3dQYWRkaW5nTGVmdCAqIG8tPnN0eWxlKCkt
PmVmZmVjdGl2ZVpvb20oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIEdyYXBo
aWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotCi0g
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxDb2xvcihvLT5zdHlsZSgpLT52aXNpdGVkRGVw
ZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvciksIG8tPnN0eWxlKCktPmNvbG9yU3BhY2UoKSk7
Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKLQotICAg
IEZsb2F0UG9pbnQgYXJyb3cxWzNdOwotICAgIGFycm93MVswXSA9IEZsb2F0UG9pbnQobGVmdEVk
Z2UsIGNlbnRlclkgLSBzcGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKLSAgICBhcnJvdzFbMV0g
PSBGbG9hdFBvaW50KGxlZnRFZGdlICsgYXJyb3dXaWR0aCwgY2VudGVyWSAtIHNwYWNlQmV0d2Vl
bkFycm93cyAvIDIuMGYpOwotICAgIGFycm93MVsyXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBh
cnJvd1dpZHRoIC8gMi4wZiwgY2VudGVyWSAtIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYgLSBh
cnJvd0hlaWdodCk7Ci0KLSAgICAvLyBEcmF3IHRoZSB0b3AgYXJyb3cKLSAgICBwYWludEluZm8u
Y29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywgYXJyb3cxLCB0cnVlKTsKLQotICAgIEZsb2F0
UG9pbnQgYXJyb3cyWzNdOwotICAgIGFycm93MlswXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UsIGNl
bnRlclkgKyBzcGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKLSAgICBhcnJvdzJbMV0gPSBGbG9h
dFBvaW50KGxlZnRFZGdlICsgYXJyb3dXaWR0aCwgY2VudGVyWSArIHNwYWNlQmV0d2VlbkFycm93
cyAvIDIuMGYpOwotICAgIGFycm93MlsyXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dp
ZHRoIC8gMi4wZiwgY2VudGVyWSArIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYgKyBhcnJvd0hl
aWdodCk7Ci0KLSAgICAvLyBEcmF3IHRoZSBib3R0b20gYXJyb3cKLSAgICBwYWludEluZm8uY29u
dGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywgYXJyb3cyLCB0cnVlKTsKLQotICAgIENvbG9yIGxl
ZnRTZXBhcmF0b3JDb2xvcigwLCAwLCAwLCA0MCk7Ci0gICAgQ29sb3IgcmlnaHRTZXBhcmF0b3JD
b2xvcigyNTUsIDI1NSwgMjU1LCA0MCk7Ci0KLSAgICAvLyBGSVhNRTogU2hvdWxkIHRoZSBzZXBh
cmF0b3IgdGhpY2tuZXNzIGFuZCBzcGFjZSBiZSBzY2FsZWQgdXAgYnkgZm9udFNjYWxlPwotICAg
IGludCBzZXBhcmF0b3JTcGFjZSA9IDI7IC8vIERlbGliZXJhdGVseSBpZ25vcmVzIHpvb20gc2lu
Y2UgaXQgbG9va3MgbmljZXIgaWYgaXQgc3RheXMgdGhpbi4KLSAgICBpbnQgbGVmdEVkZ2VPZlNl
cGFyYXRvciA9IHN0YXRpY19jYXN0PGludD4obGVmdEVkZ2UgLSBhcnJvd1BhZGRpbmdMZWZ0ICog
by0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsgLy8gRklYTUU6IFJvdW5kPwotCi0gICAgLy8g
RHJhdyB0aGUgc2VwYXJhdG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBhcnJvd3MKLSAgICBwYWludElu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKDEuMGYpOyAvLyBEZWxpYmVyYXRlbHkgaWdu
b3JlcyB6b29tIHNpbmNlIGl0IGxvb2tzIG5pY2VyIGlmIGl0IHN0YXlzIHRoaW4uCi0gICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKLSAgICBwYWludElu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IobGVmdFNlcGFyYXRvckNvbG9yLCBDb2xvclNwYWNl
RGV2aWNlUkdCKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQobGVm
dEVkZ2VPZlNlcGFyYXRvciwgYm91bmRzLnkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEludFBvaW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IsIGJvdW5kcy5tYXhZKCkpKTsKLQot
ICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihyaWdodFNlcGFyYXRvckNvbG9y
LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0xpbmUo
SW50UG9pbnQobGVmdEVkZ2VPZlNlcGFyYXRvciArIHNlcGFyYXRvclNwYWNlLCBib3VuZHMueSgp
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50UG9pbnQobGVmdEVkZ2VPZlNl
cGFyYXRvciArIHNlcGFyYXRvclNwYWNlLCBib3VuZHMubWF4WSgpKSk7Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1zdGF0aWMgY29uc3QgSW50U2l6ZSogbWVudUxpc3RCdXR0b25TaXplcygpCi17
Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMCwgMjEpLCBJ
bnRTaXplKDAsIDE4KSwgSW50U2l6ZSgwLCAxNSkgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0K
LXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdE1lbnVMaXN0U3R5bGUoU3R5bGVSZXNvbHZlciog
c3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAotewot
ICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemUgPSBjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUp
OwotCi0gICAgc3R5bGUtPnJlc2V0Qm9yZGVyKCk7Ci0gICAgc3R5bGUtPnJlc2V0UGFkZGluZygp
OwotICAgIAotICAgIC8vIEhlaWdodCBpcyBsb2NrZWQgdG8gYXV0by4KLSAgICBzdHlsZS0+c2V0
SGVpZ2h0KExlbmd0aChBdXRvKSk7Ci0KLSAgICAvLyBXaGl0ZS1zcGFjZSBpcyBsb2NrZWQgdG8g
cHJlCi0gICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoUFJFKTsKLQotICAgIC8vIFNldCB0aGUgZm9y
ZWdyb3VuZCBjb2xvciB0byBibGFjayBvciBncmF5IHdoZW4gd2UgaGF2ZSB0aGUgYXF1YSBsb29r
LgotICAgIC8vIENhc3QgdG8gUkdCMzIgaXMgdG8gd29yayBhcm91bmQgYSBjb21waWxlciBidWcu
Ci0gICAgc3R5bGUtPnNldENvbG9yKGUgJiYgZS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSA/IHN0
YXRpY19jYXN0PFJHQkEzMj4oQ29sb3I6OmJsYWNrKSA6IENvbG9yOjpkYXJrR3JheSk7Ci0KLSAg
ICAvLyBTZXQgdGhlIGJ1dHRvbidzIHZlcnRpY2FsIHNpemUuCi0gICAgc2V0U2l6ZUZyb21Gb250
KHN0eWxlLCBtZW51TGlzdEJ1dHRvblNpemVzKCkpOwotCi0gICAgLy8gT3VyIGZvbnQgaXMgbG9j
a2VkIHRvIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0gZm9udCBzaXplIGZvciB0aGUgY29udHJvbC4g
IFRvIGNsYXJpZnksIHdlIGZpcnN0IHVzZSB0aGUgQ1NTLXNwZWNpZmllZCBmb250IHRvIGZpZ3Vy
ZSBvdXQKLSAgICAvLyBhIHJlYXNvbmFibGUgY29udHJvbCBzaXplLCBidXQgb25jZSB0aGF0IGNv
bnRyb2wgc2l6ZSBpcyBkZXRlcm1pbmVkLCB3ZSB0aHJvdyB0aGF0IGZvbnQgYXdheSBhbmQgdXNl
IHRoZSBhcHByb3ByaWF0ZQotICAgIC8vIHN5c3RlbSBmb250IGZvciB0aGUgY29udHJvbCBzaXpl
IGluc3RlYWQuCi0gICAgc2V0Rm9udEZyb21Db250cm9sU2l6ZShzdHlsZVJlc29sdmVyLCBzdHls
ZSwgY29udHJvbFNpemUpOwotCi0gICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKLX0K
LQotaW50IFJlbmRlclRoZW1lTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAotewotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVs
aXN0UGFydCkKLSAgICAgICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhjb250cm9sU2l6ZUZv
ckZvbnQoc3R5bGUpKVtsZWZ0UGFkZGluZ10gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotICAg
IGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0QnV0dG9uUGFydCkKLSAgICAgICAg
cmV0dXJuIHN0eWxlZFBvcHVwUGFkZGluZ0xlZnQgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwot
ICAgIHJldHVybiAwOwotfQotCi1pbnQgUmVuZGVyVGhlbWVNYWM6OnBvcHVwSW50ZXJuYWxQYWRk
aW5nUmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIGlmIChzdHlsZS0+YXBw
ZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKLSAgICAgICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFk
ZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVtyaWdodFBhZGRpbmddICogc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKTsKLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1
dHRvblBhcnQpIHsKLSAgICAgICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUtPmZvbnRTaXplKCkg
LyBiYXNlRm9udFNpemU7Ci0gICAgICAgIGZsb2F0IGFycm93V2lkdGggPSBiYXNlQXJyb3dXaWR0
aCAqIGZvbnRTY2FsZTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbGYoYXJy
b3dXaWR0aCArIChhcnJvd1BhZGRpbmdMZWZ0ICsgYXJyb3dQYWRkaW5nUmlnaHQgKyBwYWRkaW5n
QmVmb3JlU2VwYXJhdG9yKSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpKTsKLSAgICB9Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLWludCBSZW5kZXJUaGVtZU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdU
b3AoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5j
ZSgpID09IE1lbnVsaXN0UGFydCkKLSAgICAgICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhj
b250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVt0b3BQYWRkaW5nXSAqIHN0eWxlLT5lZmZlY3RpdmVa
b29tKCk7Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RCdXR0b25QYXJ0
KQotICAgICAgICByZXR1cm4gc3R5bGVkUG9wdXBQYWRkaW5nVG9wICogc3R5bGUtPmVmZmVjdGl2
ZVpvb20oKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFJlbmRlclRoZW1lTWFjOjpwb3B1cElu
dGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaWYg
KHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KQotICAgICAgICByZXR1cm4gcG9w
dXBCdXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSkpW2JvdHRvbVBhZGRpbmdd
ICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9
PSBNZW51bGlzdEJ1dHRvblBhcnQpCi0gICAgICAgIHJldHVybiBzdHlsZWRQb3B1cFBhZGRpbmdC
b3R0b20gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgIHJldHVybiAwOwotfQotCi12b2lk
IFJlbmRlclRoZW1lTWFjOjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXIq
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAgIGZsb2F0IGZvbnRT
Y2FsZSA9IHN0eWxlLT5mb250U2l6ZSgpIC8gYmFzZUZvbnRTaXplOwotCi0gICAgc3R5bGUtPnJl
c2V0UGFkZGluZygpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJSYWRpdXMoSW50U2l6ZShpbnQoYmFz
ZUJvcmRlclJhZGl1cyArIGZvbnRTY2FsZSAtIDEpLCBpbnQoYmFzZUJvcmRlclJhZGl1cyArIGZv
bnRTY2FsZSAtIDEpKSk7IC8vIEZJWE1FOiBSb3VuZCB1cD8KLQotICAgIGNvbnN0IGludCBtaW5I
ZWlnaHQgPSAxNTsKLSAgICBzdHlsZS0+c2V0TWluSGVpZ2h0KExlbmd0aChtaW5IZWlnaHQsIEZp
eGVkKSk7Ci0gICAgCi0gICAgc3R5bGUtPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRp
YWxMaW5lSGVpZ2h0KCkpOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRQb3B1cEJ1dHRv
bkNlbGxTdGF0ZShjb25zdCBSZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0g
ICAgTlNQb3BVcEJ1dHRvbkNlbGwqIHBvcHVwQnV0dG9uID0gdGhpcy0+cG9wdXBCdXR0b24oKTsK
LQotICAgIC8vIFNldCB0aGUgY29udHJvbCBzaXplIGJhc2VkIG9mZiB0aGUgcmVjdGFuZ2xlIHdl
J3JlIHBhaW50aW5nIGludG8uCi0gICAgc2V0Q29udHJvbFNpemUocG9wdXBCdXR0b24sIHBvcHVw
QnV0dG9uU2l6ZXMoKSwgci5zaXplKCksIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7Ci0K
LSAgICAvLyBVcGRhdGUgdGhlIHZhcmlvdXMgc3RhdGVzIHdlIHJlc3BvbmQgdG8uCi0gICAgdXBk
YXRlQWN0aXZlU3RhdGUocG9wdXBCdXR0b24sIG8pOwotICAgIHVwZGF0ZUNoZWNrZWRTdGF0ZShw
b3B1cEJ1dHRvbiwgbyk7Ci0gICAgdXBkYXRlRW5hYmxlZFN0YXRlKHBvcHVwQnV0dG9uLCBvKTsK
LSAgICB1cGRhdGVQcmVzc2VkU3RhdGUocG9wdXBCdXR0b24sIG8pOwotI2lmIEJVVFRPTl9DRUxM
X0RSQVdfV0lUSF9GUkFNRV9EUkFXU19GT0NVU19SSU5HCi0gICAgdXBkYXRlRm9jdXNlZFN0YXRl
KHBvcHVwQnV0dG9uLCBvKTsKLSNlbmRpZgotfQotCi1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVt
ZU1hYzo6bWVudUxpc3RTaXplcygpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUg
c2l6ZXNbM10gPSB7IEludFNpemUoOSwgMCksIEludFNpemUoNSwgMCksIEludFNpemUoMCwgMCkg
fTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0KLWludCBSZW5kZXJUaGVtZU1hYzo6bWluaW11bU1l
bnVMaXN0U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNpemVG
b3JTeXN0ZW1Gb250KHN0eWxlLCBtZW51TGlzdFNpemVzKCkpLndpZHRoKCk7Ci19Ci0KLWNvbnN0
IGludCB0cmFja1dpZHRoID0gNTsKLWNvbnN0IGludCB0cmFja1JhZGl1cyA9IDI7Ci0KLXZvaWQg
UmVuZGVyVGhlbWVNYWM6OmFkanVzdFNsaWRlclRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciosIFJl
bmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Ci17Ci0gICAgc3R5bGUtPnNldEJveFNo
YWRvdyhudWxscHRyKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRTbGlkZXJUcmFj
ayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByKQotewotICAgIEludFJlY3QgYm91bmRzID0gcjsKLSAgICBmbG9hdCB6b29tTGV2ZWwg
PSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgZmxvYXQgem9vbWVkVHJhY2tXaWR0
aCA9IHRyYWNrV2lkdGggKiB6b29tTGV2ZWw7Ci0KLSAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFy
YW5jZSgpID09ICBTbGlkZXJIb3Jpem9udGFsUGFydCB8fCBvLT5zdHlsZSgpLT5hcHBlYXJhbmNl
KCkgPT0gIE1lZGlhU2xpZGVyUGFydCkgewotICAgICAgICBib3VuZHMuc2V0SGVpZ2h0KHpvb21l
ZFRyYWNrV2lkdGgpOwotICAgICAgICBib3VuZHMuc2V0WShyLnkoKSArIHIuaGVpZ2h0KCkgLyAy
IC0gem9vbWVkVHJhY2tXaWR0aCAvIDIpOwotICAgIH0gZWxzZSBpZiAoby0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpID09IFNsaWRlclZlcnRpY2FsUGFydCkgewotICAgICAgICBib3VuZHMuc2V0V2lk
dGgoem9vbWVkVHJhY2tXaWR0aCk7Ci0gICAgICAgIGJvdW5kcy5zZXRYKHIueCgpICsgci53aWR0
aCgpIC8gMiAtIHpvb21lZFRyYWNrV2lkdGggLyAyKTsKLSAgICB9Ci0KLSAgICBMb2NhbEN1cnJl
bnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICBD
R0NvbnRleHRSZWYgY29udGV4dCA9IGxvY2FsQ29udGV4dC5jZ0NvbnRleHQoKTsKLSAgICBDR0Nv
bG9yU3BhY2VSZWYgY3NwYWNlID0gZGV2aWNlUkdCQ29sb3JTcGFjZVJlZigpOwotCi0jaWYgRU5B
QkxFKERBVEFMSVNUX0VMRU1FTlQpCi0gICAgcGFpbnRTbGlkZXJUaWNrcyhvLCBwYWludEluZm8s
IHIpOwotI2VuZGlmCi0KLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
KnBhaW50SW5mby5jb250ZXh0KTsKLSAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIGJv
dW5kcyk7Ci0KLSAgICBzdHJ1Y3QgQ0dGdW5jdGlvbkNhbGxiYWNrcyBtYWluQ2FsbGJhY2tzID0g
eyAwLCBUcmFja0dyYWRpZW50SW50ZXJwb2xhdGUsIE5VTEwgfTsKLSAgICBSZXRhaW5QdHI8Q0dG
dW5jdGlvblJlZj4gbWFpbkZ1bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25DcmVhdGUoTlVMTCwg
MSwgTlVMTCwgNCwgTlVMTCwgJm1haW5DYWxsYmFja3MpKTsKLSAgICBSZXRhaW5QdHI8Q0dTaGFk
aW5nUmVmPiBtYWluU2hhZGluZzsKLSAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09
IFNsaWRlclZlcnRpY2FsUGFydCkKLSAgICAgICAgbWFpblNoYWRpbmcuYWRvcHRDRihDR1NoYWRp
bmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKGJvdW5kcy54KCksICBib3VuZHMubWF4
WSgpKSwgQ0dQb2ludE1ha2UoYm91bmRzLm1heFgoKSwgYm91bmRzLm1heFkoKSksIG1haW5GdW5j
dGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgZWxzZQotICAgICAgICBtYWluU2hhZGlu
Zy5hZG9wdENGKENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2UoYm91bmRz
LngoKSwgIGJvdW5kcy55KCkpLCBDR1BvaW50TWFrZShib3VuZHMueCgpLCBib3VuZHMubWF4WSgp
KSwgbWFpbkZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgIEludFNpemUgcmFk
aXVzKHRyYWNrUmFkaXVzLCB0cmFja1JhZGl1cyk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPmFk
ZFJvdW5kZWRSZWN0Q2xpcChSb3VuZGVkUmVjdChib3VuZHMsIHJhZGl1cywgcmFkaXVzLCByYWRp
dXMsIHJhZGl1cykpOwotICAgIGNvbnRleHQgPSBsb2NhbENvbnRleHQuY2dDb250ZXh0KCk7Ci0g
ICAgQ0dDb250ZXh0RHJhd1NoYWRpbmcoY29udGV4dCwgbWFpblNoYWRpbmcuZ2V0KCkpOwotICAg
IAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2xp
ZGVyVGh1bWJTdHlsZShTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSog
c3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgUmVuZGVyVGhlbWU6OmFkanVz
dFNsaWRlclRodW1iU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1lbnQpOwotICAgIHN0
eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Ci19Ci0KLWNvbnN0IGZsb2F0IHZlcnRpY2FsU2xp
ZGVySGVpZ2h0UGFkZGluZyA9IDAuMWY7Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50U2xp
ZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcikKLXsKLSAgICBOU1NsaWRlckNlbGwqIHNsaWRlclRodW1iQ2VsbCA9IG8t
PnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydAotICAgICAg
ICA/IHNsaWRlclRodW1iVmVydGljYWwoKQotICAgICAgICA6IHNsaWRlclRodW1iSG9yaXpvbnRh
bCgpOwotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWlu
dEluZm8uY29udGV4dCk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIHZhcmlvdXMgc3RhdGVzIHdlIHJl
c3BvbmQgdG8uCi0gICAgdXBkYXRlQWN0aXZlU3RhdGUoc2xpZGVyVGh1bWJDZWxsLCBvKTsKLSAg
ICB1cGRhdGVFbmFibGVkU3RhdGUoc2xpZGVyVGh1bWJDZWxsLCBvKTsKLSAgICB1cGRhdGVGb2N1
c2VkU3RhdGUoc2xpZGVyVGh1bWJDZWxsLCAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+Zm9jdXNE
ZWxlZ2F0ZSgpLT5yZW5kZXJlcigpKSA/IG8tPm5vZGUoKS0+Zm9jdXNEZWxlZ2F0ZSgpLT5yZW5k
ZXJlcigpIDogbyk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIHByZXNzZWQgc3RhdGUgdXNpbmcgdGhl
IE5TQ2VsbCB0cmFja2luZyBtZXRob2RzLCBzaW5jZSB0aGF0J3MgaG93IE5TU2xpZGVyQ2VsbCBr
ZWVwcyB0cmFjayBvZiBpdC4KLSAgICBib29sIG9sZFByZXNzZWQ7Ci0gICAgaWYgKG8tPnN0eWxl
KCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkKLSAgICAgICAgb2xk
UHJlc3NlZCA9IG1faXNTbGlkZXJUaHVtYlZlcnRpY2FsUHJlc3NlZDsKLSAgICBlbHNlCi0gICAg
ICAgIG9sZFByZXNzZWQgPSBtX2lzU2xpZGVyVGh1bWJIb3Jpem9udGFsUHJlc3NlZDsKLQotICAg
IGJvb2wgcHJlc3NlZCA9IGlzUHJlc3NlZChvKTsKLQotICAgIGlmIChvLT5zdHlsZSgpLT5hcHBl
YXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCi0gICAgICAgIG1faXNTbGlkZXJU
aHVtYlZlcnRpY2FsUHJlc3NlZCA9IHByZXNzZWQ7Ci0gICAgZWxzZQotICAgICAgICBtX2lzU2xp
ZGVyVGh1bWJIb3Jpem9udGFsUHJlc3NlZCA9IHByZXNzZWQ7Ci0KLSAgICBpZiAocHJlc3NlZCAh
PSBvbGRQcmVzc2VkKSB7Ci0gICAgICAgIGlmIChwcmVzc2VkKQotICAgICAgICAgICAgW3NsaWRl
clRodW1iQ2VsbCBzdGFydFRyYWNraW5nQXQ6TlNQb2ludCgpIGluVmlldzpuaWxdOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBbc2xpZGVyVGh1bWJDZWxsIHN0b3BUcmFja2luZzpOU1BvaW50
KCkgYXQ6TlNQb2ludCgpIGluVmlldzpuaWwgbW91c2VJc1VwOllFU107Ci0gICAgfQotCi0gICAg
RmxvYXRSZWN0IGJvdW5kcyA9IHI7Ci0gICAgLy8gTWFrZSB0aGUgaGVpZ2h0IG9mIHRoZSB2ZXJ0
aWNhbCBzbGlkZXIgc2xpZ2h0bHkgbGFyZ2VyIHNvIE5TU2xpZGVyQ2VsbCB3aWxsIGRyYXcgYSB2
ZXJ0aWNhbCBzbGlkZXIuCi0gICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlk
ZXJUaHVtYlZlcnRpY2FsUGFydCkKLSAgICAgICAgYm91bmRzLnNldEhlaWdodChib3VuZHMuaGVp
Z2h0KCkgKyB2ZXJ0aWNhbFNsaWRlckhlaWdodFBhZGRpbmcgKiBvLT5zdHlsZSgpLT5lZmZlY3Rp
dmVab29tKCkpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpw
YWludEluZm8uY29udGV4dCk7Ci0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZm
ZWN0aXZlWm9vbSgpOwotICAgIAotICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3QgPSBib3VuZHM7
Ci0gICAgaWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7Ci0gICAgICAgIHVuem9vbWVkUmVjdC5zZXRX
aWR0aCh1bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHVuem9vbWVk
UmVjdC5zZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKLSAgICAg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21l
ZFJlY3QueSgpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6
b29tTGV2ZWwsIHpvb21MZXZlbCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNs
YXRlKC11bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0LnkoKSk7Ci0gICAgfQotCi0jaWYg
UExBVEZPUk0oQ0hST01JVU0pCi0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgwLCB1
bnpvb21lZFJlY3QueSgpKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXpl
KDEsIC0xKSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgwLCAtKHVuem9vbWVk
UmVjdC55KCkgKyB1bnpvb21lZFJlY3QuaGVpZ2h0KCkpKTsKLSNlbmRpZgotCi0gICAgW3NsaWRl
clRodW1iQ2VsbCBkcmF3SW50ZXJpb3JXaXRoRnJhbWU6dW56b29tZWRSZWN0IGluVmlldzpkb2N1
bWVudFZpZXdGb3IobyldOwotICAgIFtzbGlkZXJUaHVtYkNlbGwgc2V0Q29udHJvbFZpZXc6bmls
XTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRT
ZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByKQotewotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFy
Y2ggPSB0aGlzLT5zZWFyY2goKTsKLQotICAgIHNldFNlYXJjaENlbGxTdGF0ZShvLCByKTsKLQot
ICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRl
eHQpOwotCi0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgp
OwotCi0gICAgSW50UmVjdCB1bnpvb21lZFJlY3QgPSByOwotICAgIAotICAgIGlmICh6b29tTGV2
ZWwgIT0gMS4wZikgewotICAgICAgICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0
LndpZHRoKCkgLyB6b29tTGV2ZWwpOwotICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVu
em9vbWVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHBhaW50SW5mby5jb250
ZXh0LT50cmFuc2xhdGUodW56b29tZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7Ci0gICAg
ICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2
ZWwpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0
LngoKSwgLXVuem9vbWVkUmVjdC55KCkpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgc2VhcmNo
IGJ1dHRvbiB0byBuaWwgYmVmb3JlIGRyYXdpbmcuICBUaGVuIHJlc2V0IGl0IHNvIHdlIGNhbiBk
cmF3IGl0IGxhdGVyLgotICAgIFtzZWFyY2ggc2V0U2VhcmNoQnV0dG9uQ2VsbDpuaWxdOwotCi0g
ICAgW3NlYXJjaCBkcmF3V2l0aEZyYW1lOk5TUmVjdCh1bnpvb21lZFJlY3QpIGluVmlldzpkb2N1
bWVudFZpZXdGb3IobyldOwotCi0gICAgW3NlYXJjaCBzZXRDb250cm9sVmlldzpuaWxdOwotICAg
IFtzZWFyY2ggcmVzZXRTZWFyY2hCdXR0b25DZWxsXTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6c2V0U2VhcmNoQ2VsbFN0YXRlKFJlbmRlck9iamVjdCog
bywgY29uc3QgSW50UmVjdCYpCi17Ci0gICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRo
aXMtPnNlYXJjaCgpOwotCi0gICAgW3NlYXJjaCBzZXRDb250cm9sU2l6ZTpjb250cm9sU2l6ZUZv
ckZvbnQoby0+c3R5bGUoKSldOwotCi0gICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3
ZSByZXNwb25kIHRvLgotICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKHNlYXJjaCwgbyk7Ci0gICAgdXBk
YXRlRW5hYmxlZFN0YXRlKHNlYXJjaCwgbyk7Ci0gICAgdXBkYXRlRm9jdXNlZFN0YXRlKHNlYXJj
aCwgbyk7Ci19Ci0KLWNvbnN0IEludFNpemUqIFJlbmRlclRoZW1lTWFjOjpzZWFyY2hGaWVsZFNp
emVzKCkgY29uc3QKLXsKLSAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50
U2l6ZSgwLCAyMiksIEludFNpemUoMCwgMTkpLCBJbnRTaXplKDAsIDE3KSB9OwotICAgIHJldHVy
biBzaXplczsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6c2V0U2VhcmNoRmllbGRTaXplKFJl
bmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUgd2lkdGggYW5kIGhlaWdo
dCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgotICAgIGlm
ICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgp
LmlzQXV0bygpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gVXNlIHRoZSBmb250IHNp
emUgdG8gZGV0ZXJtaW5lIHRoZSBpbnRyaW5zaWMgd2lkdGggb2YgdGhlIGNvbnRyb2wuCi0gICAg
c2V0U2l6ZUZyb21Gb250KHN0eWxlLCBzZWFyY2hGaWVsZFNpemVzKCkpOwotfQotCi12b2lkIFJl
bmRlclRoZW1lTWFjOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXIqIHN0eWxl
UmVzb2x2ZXIsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Ci17Ci0gICAgLy8g
T3ZlcnJpZGUgYm9yZGVyLgotICAgIHN0eWxlLT5yZXNldEJvcmRlcigpOwotICAgIGNvbnN0IHNo
b3J0IGJvcmRlcldpZHRoID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgc3R5bGUt
PnNldEJvcmRlckxlZnRXaWR0aChib3JkZXJXaWR0aCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckxl
ZnRTdHlsZShJTlNFVCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0V2lkdGgoYm9yZGVyV2lk
dGgpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFN0eWxlKElOU0VUKTsKLSAgICBzdHlsZS0+
c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm9yZGVyV2lkdGgpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJC
b3R0b21TdHlsZShJTlNFVCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclRvcFdpZHRoKGJvcmRlcldp
ZHRoKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyVG9wU3R5bGUoSU5TRVQpOyAgICAKLSAgICAKLSAg
ICAvLyBPdmVycmlkZSBoZWlnaHQuCi0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0bykp
OwotICAgIHNldFNlYXJjaEZpZWxkU2l6ZShzdHlsZSk7Ci0gICAgCi0gICAgLy8gT3ZlcnJpZGUg
cGFkZGluZyBzaXplIHRvIG1hdGNoIEFwcEtpdCB0ZXh0IHBvc2l0aW9uaW5nLgotICAgIGNvbnN0
IGludCBwYWRkaW5nID0gMSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgc3R5bGUtPnNl
dFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRQYWRk
aW5nUmlnaHQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdU
b3AoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20o
TGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgCi0gICAgTlNDb250cm9sU2l6ZSBjb250cm9s
U2l6ZSA9IGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSk7Ci0gICAgc2V0Rm9udEZyb21Db250cm9s
U2l6ZShzdHlsZVJlc29sdmVyLCBzdHlsZSwgY29udHJvbFNpemUpOwotCi0gICAgc3R5bGUtPnNl
dEJveFNoYWRvdyhudWxscHRyKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFy
Y2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIEVsZW1lbnQqIGlucHV0ID0gby0+bm9k
ZSgpLT5zaGFkb3dIb3N0KCk7Ci0gICAgaWYgKCFpbnB1dCkKLSAgICAgICAgaW5wdXQgPSB0b0Vs
ZW1lbnQoby0+bm9kZSgpKTsKLQotICAgIGlmICghaW5wdXQtPnJlbmRlcmVyKCktPmlzQm94KCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4
dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHNldFNlYXJjaENlbGxTdGF0
ZShpbnB1dC0+cmVuZGVyZXIoKSwgcik7Ci0KLSAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNo
ID0gdGhpcy0+c2VhcmNoKCk7Ci0KLSAgICBpZiAoaW5wdXQtPmlzRW5hYmxlZEZvcm1Db250cm9s
KCkgJiYgKGlucHV0LT5pc1RleHRGb3JtQ29udHJvbCgpICYmICFzdGF0aWNfY2FzdDxIVE1MVGV4
dEZvcm1Db250cm9sRWxlbWVudCo+KGlucHV0KS0+cmVhZE9ubHkoKSkpIHsKLSAgICAgICAgdXBk
YXRlQWN0aXZlU3RhdGUoW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSwgbyk7Ci0gICAgICAgIHVw
ZGF0ZVByZXNzZWRTdGF0ZShbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdLCBvKTsKLSAgICB9Ci0g
ICAgZWxzZSBpZiAoW1tzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0gaXNIaWdobGlnaHRlZF0pCi0g
ICAgICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdIHNldEhpZ2hsaWdodGVkOk5PXTsKLQot
ICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRl
eHQpOwotCi0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgp
OwotCi0gICAgRmxvYXRSZWN0IGxvY2FsQm91bmRzID0gW3NlYXJjaCBjYW5jZWxCdXR0b25SZWN0
Rm9yQm91bmRzOk5TUmVjdChpbnB1dC0+cmVuZGVyQm94KCktPnBpeGVsU25hcHBlZEJvcmRlckJv
eFJlY3QoKSldOwotCi0jaWYgRU5BQkxFKElOUFVUX1NQRUVDSCkKLSAgICAvLyBUYWtlIGNhcmUg
b2YgY2FzZXMgd2hlcmUgdGhlIGNhbmNlbCBidXR0b24gd2FzIG5vdCBhbGlnbmVkIHdpdGggdGhl
IHJpZ2h0IGJvcmRlciBvZiB0aGUgaW5wdXQgZWxlbWVudCAoZm9yIGUuZy4KLSAgICAvLyB3aGVu
IHNwZWVjaCBpbnB1dCBpcyBlbmFibGVkIGZvciB0aGUgaW5wdXQgZWxlbWVudC4KLSAgICBJbnRS
ZWN0IGFic0JvdW5kaW5nQm94ID0gaW5wdXQtPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdC
b3hSZWN0KCk7Ci0gICAgaW50IGFic1JpZ2h0ID0gYWJzQm91bmRpbmdCb3gueCgpICsgYWJzQm91
bmRpbmdCb3gud2lkdGgoKSAtIGlucHV0LT5yZW5kZXJCb3goKS0+cGFkZGluZ1JpZ2h0KCkgLSBp
bnB1dC0+cmVuZGVyQm94KCktPmJvcmRlclJpZ2h0KCk7Ci0gICAgaW50IHNwYWNlVG9SaWdodE9m
Q2FuY2VsQnV0dG9uID0gYWJzUmlnaHQgLSAoci54KCkgKyByLndpZHRoKCkpOwotICAgIGxvY2Fs
Qm91bmRzLnNldFgobG9jYWxCb3VuZHMueCgpIC0gc3BhY2VUb1JpZ2h0T2ZDYW5jZWxCdXR0b24p
OwotI2VuZGlmCi0KLSAgICBsb2NhbEJvdW5kcyA9IGNvbnZlcnRUb1BhaW50aW5nUmVjdChpbnB1
dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3VuZHMsIHIpOwotCi0gICAgRmxvYXRSZWN0IHVuem9v
bWVkUmVjdChsb2NhbEJvdW5kcyk7Ci0gICAgaWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7Ci0gICAg
ICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZl
bCk7Ci0gICAgICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgp
IC8gem9vbUxldmVsKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpv
b21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3QueSgpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOwotICAgICAgICBwYWlu
dEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0
LnkoKSk7Ci0gICAgfQotCi0gICAgW1tzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0gZHJhd1dpdGhG
cmFtZTp1bnpvb21lZFJlY3QgaW5WaWV3OmRvY3VtZW50Vmlld0ZvcihvKV07Ci0gICAgW1tzZWFy
Y2ggY2FuY2VsQnV0dG9uQ2VsbF0gc2V0Q29udHJvbFZpZXc6bmlsXTsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLWNvbnN0IEludFNpemUqIFJlbmRlclRoZW1lTWFjOjpjYW5jZWxCdXR0b25TaXpl
cygpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNp
emUoMTYsIDEzKSwgSW50U2l6ZSgxMywgMTEpLCBJbnRTaXplKDEzLCA5KSB9OwotICAgIHJldHVy
biBzaXplczsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2VhcmNoRmllbGRDYW5j
ZWxCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KikgY29uc3QKLXsKLSAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwg
Y2FuY2VsQnV0dG9uU2l6ZXMoKSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndp
ZHRoKCksIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQo
KSwgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotfQotCi1jb25z
dCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6cmVzdWx0c0J1dHRvblNpemVzKCkgY29uc3QKLXsK
LSAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6ZSgxOSwgMTMpLCBJ
bnRTaXplKDE3LCAxMSksIEludFNpemUoMTcsIDkpIH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQor
bmFtZXNwYWNlIFdlYkNvcmUgewogCi1jb25zdCBpbnQgZW1wdHlSZXN1bHRzT2Zmc2V0ID0gOTsK
LXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKFN0
eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAg
IEludFNpemUgc2l6ZSA9IHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCByZXN1bHRzQnV0dG9uU2l6
ZXMoKSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCkgLSBlbXB0eVJl
c3VsdHNPZmZzZXQsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5o
ZWlnaHQoKSwgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotfQor
dXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRT
ZWFyY2hGaWVsZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29u
c3QgSW50UmVjdCYpCitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVG
b3JQYWdlKFBhZ2UqKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGF0aWMgUmVuZGVyVGhl
bWUqIHJ0ID0gUmVuZGVyVGhlbWVNYWM6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICByZXR1cm4g
cnQ7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0Rl
Y29yYXRpb25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KikgY29uc3QKK1Bhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lTWFjOjpjcmVhdGUo
KQogewotICAgIEludFNpemUgc2l6ZSA9IHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCByZXN1bHRz
QnV0dG9uU2l6ZXMoKSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCks
IEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4
ZWQpKTsKLSAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworICAgIHJldHVybiBhZG9w
dFJlZihuZXcgUmVuZGVyVGhlbWVNYWMpOwogfQogCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWlu
dFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK1JlbmRlclRoZW1lTWFjOjpSZW5k
ZXJUaGVtZU1hYygpCiB7Ci0gICAgTm9kZSogaW5wdXQgPSBvLT5ub2RlKCktPnNoYWRvd0hvc3Qo
KTsKLSAgICBpZiAoIWlucHV0KQotICAgICAgICBpbnB1dCA9IG8tPm5vZGUoKTsKLSAgICBpZiAo
IWlucHV0LT5yZW5kZXJlcigpLT5pc0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250
ZXh0KTsKLSAgICBzZXRTZWFyY2hDZWxsU3RhdGUoaW5wdXQtPnJlbmRlcmVyKCksIHIpOwotCi0g
ICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOwotCi0gICAgaWYg
KFtzZWFyY2ggc2VhcmNoTWVudVRlbXBsYXRlXSAhPSBuaWwpCi0gICAgICAgIFtzZWFyY2ggc2V0
U2VhcmNoTWVudVRlbXBsYXRlOm5pbF07Ci0KLSAgICB1cGRhdGVBY3RpdmVTdGF0ZShbc2VhcmNo
IHNlYXJjaEJ1dHRvbkNlbGxdLCBvKTsKLQotICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5kcyA9IFtz
ZWFyY2ggc2VhcmNoQnV0dG9uUmVjdEZvckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRlckJveCgp
LT5waXhlbFNuYXBwZWRCb3JkZXJCb3hSZWN0KCkpXTsKLSAgICBsb2NhbEJvdW5kcyA9IGNvbnZl
cnRUb1BhaW50aW5nUmVjdChpbnB1dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3VuZHMsIHIpOwot
Ci0gICAgW1tzZWFyY2ggc2VhcmNoQnV0dG9uQ2VsbF0gZHJhd1dpdGhGcmFtZTpsb2NhbEJvdW5k
cyBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8pXTsKLSAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25D
ZWxsXSBzZXRDb250cm9sVmlldzpuaWxdOwotICAgIHJldHVybiBmYWxzZTsKIH0KIAotY29uc3Qg
aW50IHJlc3VsdHNBcnJvd1dpZHRoID0gNTsKLXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFNl
YXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSog
c3R5bGUsIEVsZW1lbnQqKSBjb25zdAorUmVuZGVyVGhlbWVNYWM6On5SZW5kZXJUaGVtZU1hYygp
CiB7Ci0gICAgSW50U2l6ZSBzaXplID0gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIHJlc3VsdHNC
dXR0b25TaXplcygpKTsKLSAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSAr
IHJlc3VsdHNBcnJvd1dpZHRoLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRy
KTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0
b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcikKK05TVmlldyogUmVuZGVyVGhlbWVNYWM6OmRvY3VtZW50Vmlld0ZvcihSZW5kZXJP
YmplY3QqIG8pIGNvbnN0CiB7Ci0gICAgTm9kZSogaW5wdXQgPSBvLT5ub2RlKCktPnNoYWRvd0hv
c3QoKTsKLSAgICBpZiAoIWlucHV0KQotICAgICAgICBpbnB1dCA9IG8tPm5vZGUoKTsKLSAgICBp
ZiAoIWlucHV0LT5yZW5kZXJlcigpLT5pc0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5j
b250ZXh0KTsKLSAgICBzZXRTZWFyY2hDZWxsU3RhdGUoaW5wdXQtPnJlbmRlcmVyKCksIHIpOwot
Ci0gICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOwotCi0gICAg
dXBkYXRlQWN0aXZlU3RhdGUoW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSwgbyk7Ci0KLSAgICBp
ZiAoIVtzZWFyY2ggc2VhcmNoTWVudVRlbXBsYXRlXSkKLSAgICAgICAgW3NlYXJjaCBzZXRTZWFy
Y2hNZW51VGVtcGxhdGU6c2VhcmNoTWVudVRlbXBsYXRlKCldOwotCi0gICAgR3JhcGhpY3NDb250
ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0gICAgZmxvYXQg
em9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgRmxvYXRSZWN0
IGxvY2FsQm91bmRzID0gW3NlYXJjaCBzZWFyY2hCdXR0b25SZWN0Rm9yQm91bmRzOk5TUmVjdChp
bnB1dC0+cmVuZGVyQm94KCktPnBpeGVsU25hcHBlZEJvcmRlckJveFJlY3QoKSldOwotICAgIGxv
Y2FsQm91bmRzID0gY29udmVydFRvUGFpbnRpbmdSZWN0KGlucHV0LT5yZW5kZXJlcigpLCBvLCBs
b2NhbEJvdW5kcywgcik7Ci0gICAgCi0gICAgSW50UmVjdCB1bnpvb21lZFJlY3QobG9jYWxCb3Vu
ZHMpOwotICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgewotICAgICAgICB1bnpvb21lZFJlY3Qu
c2V0V2lkdGgodW56b29tZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOwotICAgICAgICB1bnpv
b21lZFJlY3Quc2V0SGVpZ2h0KHVuem9vbWVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7Ci0g
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUodW56b29tZWRSZWN0LngoKSwgdW56
b29tZWRSZWN0LnkoKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNp
emUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRy
YW5zbGF0ZSgtdW56b29tZWRSZWN0LngoKSwgLXVuem9vbWVkUmVjdC55KCkpOwotICAgIH0KLQot
ICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdIGRyYXdXaXRoRnJhbWU6dW56b29tZWRSZWN0
IGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOwotICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRvbkNl
bGxdIHNldENvbnRyb2xWaWV3Om5pbF07Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJl
dHVybiBUaGVtZU1hYzo6ZW5zdXJlZFZpZXcoby0+dmlldygpLT5mcmFtZVZpZXcoKSk7CiB9CiAK
ICNpZiBFTkFCTEUoVklERU8pCisKIHR5cGVkZWYgZW51bSB7CiAgICAgTWVkaWFDb250cm9sbGVy
VGhlbWVDbGFzc2ljICAgPSAxLAogICAgIE1lZGlhQ29udHJvbGxlclRoZW1lUXVpY2tUaW1lID0g
MgpAQCAtMTczNSw3ICs3NSw3IEBAIHR5cGVkZWYgZW51bSB7CiBzdGF0aWMgaW50IG1lZGlhQ29u
dHJvbGxlclRoZW1lKCkKIHsKICAgICBzdGF0aWMgaW50IGNvbnRyb2xsZXJUaGVtZSA9IC0xOwot
ICAgIAorCiAgICAgaWYgKGNvbnRyb2xsZXJUaGVtZSAhPSAtMSkKICAgICAgICAgcmV0dXJuIGNv
bnRyb2xsZXJUaGVtZTsKIApAQCAtMTc1MCw0MCArOTAsMTAgQEAgc3RhdGljIGludCBtZWRpYUNv
bnRyb2xsZXJUaGVtZSgpCiAgICAgY29udHJvbGxlclRoZW1lID0gTWVkaWFDb250cm9sbGVyVGhl
bWVRdWlja1RpbWU7CiAgICAgcmV0dXJuIGNvbnRyb2xsZXJUaGVtZTsKIH0KLSNlbmRpZgotCi0j
aWYgRU5BQkxFKERBVEFMSVNUX0VMRU1FTlQpCi1JbnRTaXplIFJlbmRlclRoZW1lTWFjOjpzbGlk
ZXJUaWNrU2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEludFNpemUoMSwgMyk7Ci19Ci0KLWlu
dCBSZW5kZXJUaGVtZU1hYzo6c2xpZGVyVGlja09mZnNldEZyb21UcmFja0NlbnRlcigpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIC05OwotfQotI2VuZGlmCiAKLWNvbnN0IGludCBzbGlkZXJUaHVtYldp
ZHRoID0gMTU7Ci1jb25zdCBpbnQgc2xpZGVyVGh1bWJIZWlnaHQgPSAxNTsKIGNvbnN0IGludCBt
ZWRpYVNsaWRlclRodW1iV2lkdGggPSAxMzsKIGNvbnN0IGludCBtZWRpYVNsaWRlclRodW1iSGVp
Z2h0ID0gMTQ7CiAKLXZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFNsaWRlclRodW1iU2l6ZShS
ZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAgIGZsb2F0IHpvb21MZXZl
bCA9IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkg
PT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IFNs
aWRlclRodW1iVmVydGljYWxQYXJ0KSB7Ci0gICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgo
c3RhdGljX2Nhc3Q8aW50PihzbGlkZXJUaHVtYldpZHRoICogem9vbUxldmVsKSwgRml4ZWQpKTsK
LSAgICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc3RhdGljX2Nhc3Q8aW50PihzbGlkZXJU
aHVtYkhlaWdodCAqIHpvb21MZXZlbCksIEZpeGVkKSk7Ci0gICAgfSAKLQotI2lmIEVOQUJMRShW
SURFTykKLSAgICBhZGp1c3RNZWRpYVNsaWRlclRodW1iU2l6ZShzdHlsZSk7Ci0jZW5kaWYKLX0K
LQotI2lmIEVOQUJMRShWSURFTykKLQogdm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0TWVkaWFT
bGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAogewogICAgIGludCB3a1Bh
cnQ7CkBAIC0xODE2LDcgKzEyNiw3IEBAIHZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdE1lZGlh
U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKICAgICBzdHlsZS0+c2V0
SGVpZ2h0KExlbmd0aChzdGF0aWNfY2FzdDxpbnQ+KGhlaWdodCAqIHpvb21MZXZlbCksIEZpeGVk
KSk7CiB9CiAKLWVudW0gV0tNZWRpYUNvbnRyb2xsZXJUaGVtZVN0YXRlIHsgCitlbnVtIFdLTWVk
aWFDb250cm9sbGVyVGhlbWVTdGF0ZSB7CiAgICAgTWVkaWFVSVBhcnREaXNhYmxlZEZsYWcgPSAx
IDw8IDAsCiAgICAgTWVkaWFVSVBhcnRQcmVzc2VkRmxhZyA9IDEgPDwgMSwKICAgICBNZWRpYVVJ
UGFydERyYXdFbmRDYXBzRmxhZyA9IDEgPDwgMywKQEAgLTE4NDgsNyArMTU4LDYgQEAgc3RhdGlj
IEZsb2F0UmVjdCBnZXRVbnpvb21lZFJlY3RBbmRBZGp1c3RDdXJyZW50Q29udGV4dChSZW5kZXJP
YmplY3QqIG8sIGNvbnN0IFAKICAgICByZXR1cm4gdW56b29tZWRSZWN0OwogfQogCi0KIGJvb2wg
UmVuZGVyVGhlbWVNYWM6OnBhaW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCog
bywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CiAgICAg
Tm9kZSogbm9kZSA9IG8tPm5vZGUoKTsKQEAgLTE5MzAsMTIgKzIzOSwxMiBAQCBib29sIFJlbmRl
clRoZW1lTWFjOjpwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIHBhaQogICAgIGZsb2F0IGR1cmF0aW9uID0gbWVkaWFFbGVtZW50LT5kdXJhdGlv
bigpOwogICAgIGlmIChpc25hbihkdXJhdGlvbikpCiAgICAgICAgIGR1cmF0aW9uID0gMDsKLSAK
KwogICAgIENvbnRleHRDb250YWluZXIgY2dDb250ZXh0Q29udGFpbmVyKHBhaW50SW5mby5jb250
ZXh0KTsKICAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5lci5jb250
ZXh0KCk7CiAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludElu
Zm8uY29udGV4dCk7CiAgICAgRmxvYXRSZWN0IHVuem9vbWVkUmVjdCA9IGdldFVuem9vbWVkUmVj
dEFuZEFkanVzdEN1cnJlbnRDb250ZXh0KG8sIHBhaW50SW5mbywgcik7Ci0gICAgd2tEcmF3TWVk
aWFTbGlkZXJUcmFjayhtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBjb250ZXh0LCB1bnpvb21lZFJl
Y3QsIAorICAgIHdrRHJhd01lZGlhU2xpZGVyVHJhY2sobWVkaWFDb250cm9sbGVyVGhlbWUoKSwg
Y29udGV4dCwgdW56b29tZWRSZWN0LAogICAgICAgICB0aW1lTG9hZGVkLCBjdXJyZW50VGltZSwg
ZHVyYXRpb24sIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CiAgICAgcmV0dXJuIGZh
bHNlOwogfQpAQCAtMTk1MCwxMyArMjU5LDEzIEBAIGJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50
TWVkaWFTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpCiAg
ICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFTbGlkZXJUaHVtYiwgbWVkaWFDb250cm9sbGVyVGhl
bWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxh
Z3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKIH0KLSAgICAKKwogYm9vbCBSZW5kZXJUaGVt
ZU1hYzo6cGFpbnRNZWRpYVJld2luZEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIE5vZGUqIG5vZGUgPSBv
LT5ub2RlKCk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCisK
ICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5j
b250ZXh0KTsKICAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYVJld2luZEJ1dHRvbiwgbWVkaWFD
b250cm9sbGVyVGhlbWUoKSwgbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJ
UGFydFN0YXRlRmxhZ3Mobm9kZSkpOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTE5NjcsNyArMjc2
LDcgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVJldHVyblRvUmVhbHRpbWVCdXR0
b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWkKICAgICBOb2RlKiBub2RlID0gby0+bm9kZSgp
OwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAorCiAgICAgTG9j
YWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7
CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uLCBtZWRp
YUNvbnRyb2xsZXJUaGVtZSgpLCBsb2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlh
VUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTk4NSw3ICsy
OTQsNyBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhVG9nZ2xlQ2xvc2VkQ2FwdGlv
bnNCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdAogICAgIHdrRHJhd01lZGlhVUlQYXJ0KG1l
ZGlhQ29udHJvbEVsZW1lbnRUeXBlKG5vZGUpLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2Nh
bENvbnRleHQuY2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7
CiAgICAgcmV0dXJuIGZhbHNlOwogfQotIAorCiBib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1l
ZGlhQ29udHJvbHNCYWNrZ3JvdW5kKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CiAgICAgTm9kZSogbm9kZSA9IG8tPm5vZGUo
KTsKQEAgLTIwNDQsNyArMzUzLDcgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZWRpYVZv
bHVtZVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmYKICAgICB3a0Ry
YXdNZWRpYVVJUGFydChNZWRpYVZvbHVtZVNsaWRlciwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwg
bG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9k
ZSkpOwogICAgIHJldHVybiBmYWxzZTsKIH0KLSAgICAKKwogYm9vbCBSZW5kZXJUaGVtZU1hYzo6
cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CiAgICAgTm9kZSogbm9kZSA9IG8t
Pm5vZGUoKTsKQEAgLTIwNjEsNyArMzcwLDcgQEAgYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRN
ZWRpYUZ1bGxTY3JlZW5Wb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnMKICAg
ICBOb2RlKiBub2RlID0gby0+bm9kZSgpOwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIAorCiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29u
dGV4dChwYWludEluZm8uY29udGV4dCk7CiAgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFGdWxs
U2NyZWVuVm9sdW1lU2xpZGVyLCBtZWRpYUNvbnRyb2xsZXJUaGVtZSgpLCBsb2NhbENvbnRleHQu
Y2dDb250ZXh0KCksIHIsIGdldE1lZGlhVUlQYXJ0U3RhdGVGbGFncyhub2RlKSk7CiAgICAgcmV0
dXJuIGZhbHNlOwpAQCAtMjA3Miw3ICszODEsNyBAQCBib29sIFJlbmRlclRoZW1lTWFjOjpwYWlu
dE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29ucwog
ICAgIE5vZGUqIG5vZGUgPSBvLT5ub2RlKCk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgCisKICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxD
b250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKICAgICB3a0RyYXdNZWRpYVVJUGFydChNZWRpYUZ1
bGxTY3JlZW5Wb2x1bWVTbGlkZXJUaHVtYiwgbWVkaWFDb250cm9sbGVyVGhlbWUoKSwgbG9jYWxD
b250ZXh0LmNnQ29udGV4dCgpLCByLCBnZXRNZWRpYVVJUGFydFN0YXRlRmxhZ3Mobm9kZSkpOwog
ICAgIHJldHVybiBmYWxzZTsKQEAgLTIwODAsMjkgKzM4OSwxOSBAQCBib29sIFJlbmRlclRoZW1l
TWFjOjpwYWludE1lZGlhRnVsbFNjcmVlblZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9iamVjdCog
bywgY29ucwogCiBTdHJpbmcgUmVuZGVyVGhlbWVNYWM6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxl
U2hlZXQoKQogewotI2lmIFBMQVRGT1JNKE1BQykKICAgICBpZiAobWVkaWFDb250cm9sbGVyVGhl
bWUoKSA9PSBNZWRpYUNvbnRyb2xsZXJUaGVtZVF1aWNrVGltZSkKICAgICAgICAgcmV0dXJuIFN0
cmluZyhtZWRpYUNvbnRyb2xzUXVpY2tUaW1lVXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKG1l
ZGlhQ29udHJvbHNRdWlja1RpbWVVc2VyQWdlbnRTdHlsZVNoZWV0KSk7CiAKICAgICByZXR1cm4g
U3RyaW5nKCk7Ci0jZWxzZQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBT
dHJpbmcoKTsKLSNlbmRpZgogfQogCiAjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQogU3RyaW5n
IFJlbmRlclRoZW1lTWFjOjpleHRyYUZ1bGxTY3JlZW5TdHlsZVNoZWV0KCkKIHsKLSNpZiBQTEFU
Rk9STShNQUMpCiAgICAgaWYgKG1lZGlhQ29udHJvbGxlclRoZW1lKCkgPT0gTWVkaWFDb250cm9s
bGVyVGhlbWVRdWlja1RpbWUpCiAgICAgICAgIHJldHVybiBTdHJpbmcoZnVsbHNjcmVlblF1aWNr
VGltZVVzZXJBZ2VudFN0eWxlU2hlZXQsIHNpemVvZihmdWxsc2NyZWVuUXVpY2tUaW1lVXNlckFn
ZW50U3R5bGVTaGVldCkpOwotICAgIAotICAgIHJldHVybiBTdHJpbmcoKTsKLSNlbHNlCi0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisKICAgICByZXR1cm4gU3RyaW5nKCk7Ci0jZW5kaWYKIH0K
ICNlbmRpZgogCkBAIC0yMTMxLDE0NSArNDMwLDQgQEAgSW50UG9pbnQgUmVuZGVyVGhlbWVNYWM6
OnZvbHVtZVNsaWRlck9mZnNldEZyb21NdXRlQnV0dG9uKFJlbmRlckJveCogbXV0ZUJ1dHRvbkIK
IAogI2VuZGlmIC8vIEVOQUJMRShWSURFTykKIAotYm9vbCBSZW5kZXJUaGVtZU1hYzo6c2hvdWxk
U2hvd1BsYWNlaG9sZGVyV2hlbkZvY3VzZWQoKSBjb25zdAotewotI2lmIF9fTUFDX09TX1hfVkVS
U0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MAotICAgIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgICBy
ZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotTlNQb3BVcEJ1dHRvbkNlbGwqIFJlbmRlclRoZW1l
TWFjOjpwb3B1cEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BvcHVwQnV0dG9uKSB7Ci0g
ICAgICAgIG1fcG9wdXBCdXR0b24uYWRvcHROUyhbW05TUG9wVXBCdXR0b25DZWxsIGFsbG9jXSBp
bml0VGV4dENlbGw6QCIiIHB1bGxzRG93bjpOT10pOwotICAgICAgICBbbV9wb3B1cEJ1dHRvbi5n
ZXQoKSBzZXRVc2VzSXRlbUZyb21NZW51Ok5PXTsKLSAgICAgICAgW21fcG9wdXBCdXR0b24uZ2V0
KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07Ci0gICAgfQotICAg
IAotICAgIHJldHVybiBtX3BvcHVwQnV0dG9uLmdldCgpOwotfQotCi1OU1NlYXJjaEZpZWxkQ2Vs
bCogUmVuZGVyVGhlbWVNYWM6OnNlYXJjaCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3NlYXJjaCkg
ewotICAgICAgICBtX3NlYXJjaC5hZG9wdE5TKFtbTlNTZWFyY2hGaWVsZENlbGwgYWxsb2NdIGlu
aXRUZXh0Q2VsbDpAIiJdKTsKLSAgICAgICAgW21fc2VhcmNoLmdldCgpIHNldEJlemVsU3R5bGU6
TlNUZXh0RmllbGRSb3VuZGVkQmV6ZWxdOwotICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0QmV6
ZWxlZDpZRVNdOwotICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0RWRpdGFibGU6WUVTXTsKLSAg
ICAgICAgW21fc2VhcmNoLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0
ZXJpb3JdOwotICAgIH0KLQotICAgIHJldHVybiBtX3NlYXJjaC5nZXQoKTsKLX0KLQotTlNNZW51
KiBSZW5kZXJUaGVtZU1hYzo6c2VhcmNoTWVudVRlbXBsYXRlKCkgY29uc3QKLXsKLSAgICBpZiAo
IW1fc2VhcmNoTWVudVRlbXBsYXRlKQotICAgICAgICBtX3NlYXJjaE1lbnVUZW1wbGF0ZS5hZG9w
dE5TKFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIl0pOwotCi0gICAgcmV0dXJuIG1f
c2VhcmNoTWVudVRlbXBsYXRlLmdldCgpOwotfQotCi1OU1NsaWRlckNlbGwqIFJlbmRlclRoZW1l
TWFjOjpzbGlkZXJUaHVtYkhvcml6b250YWwoKSBjb25zdAotewotICAgIGlmICghbV9zbGlkZXJU
aHVtYkhvcml6b250YWwpIHsKLSAgICAgICAgbV9zbGlkZXJUaHVtYkhvcml6b250YWwuYWRvcHRO
UyhbW05TU2xpZGVyQ2VsbCBhbGxvY10gaW5pdF0pOwotICAgICAgICBbbV9zbGlkZXJUaHVtYkhv
cml6b250YWwuZ2V0KCkgc2V0U2xpZGVyVHlwZTpOU0xpbmVhclNsaWRlcl07Ci0gICAgICAgIFtt
X3NsaWRlclRodW1iSG9yaXpvbnRhbC5nZXQoKSBzZXRDb250cm9sU2l6ZTpOU1NtYWxsQ29udHJv
bFNpemVdOwotICAgICAgICBbbV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0KCkgc2V0Rm9jdXNS
aW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07Ci0gICAgfQotICAgIAotICAgIHJldHVy
biBtX3NsaWRlclRodW1iSG9yaXpvbnRhbC5nZXQoKTsKLX0KLQotTlNTbGlkZXJDZWxsKiBSZW5k
ZXJUaGVtZU1hYzo6c2xpZGVyVGh1bWJWZXJ0aWNhbCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3Ns
aWRlclRodW1iVmVydGljYWwpIHsKLSAgICAgICAgbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmFkb3B0
TlMoW1tOU1NsaWRlckNlbGwgYWxsb2NdIGluaXRdKTsKLSAgICAgICAgW21fc2xpZGVyVGh1bWJW
ZXJ0aWNhbC5nZXQoKSBzZXRTbGlkZXJUeXBlOk5TTGluZWFyU2xpZGVyXTsKLSAgICAgICAgW21f
c2xpZGVyVGh1bWJWZXJ0aWNhbC5nZXQoKSBzZXRDb250cm9sU2l6ZTpOU1NtYWxsQ29udHJvbFNp
emVdOwotICAgICAgICBbbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgpIHNldEZvY3VzUmluZ1R5
cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbV9z
bGlkZXJUaHVtYlZlcnRpY2FsLmdldCgpOwotfQotCi1OU1RleHRGaWVsZENlbGwqIFJlbmRlclRo
ZW1lTWFjOjp0ZXh0RmllbGQoKSBjb25zdAotewotICAgIGlmICghbV90ZXh0RmllbGQpIHsKLSAg
ICAgICAgbV90ZXh0RmllbGQuYWRvcHROUyhbW1dlYkNvcmVUZXh0RmllbGRDZWxsIGFsbG9jXSBp
bml0VGV4dENlbGw6QCIiXSk7Ci0gICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBzZXRCZXplbGVk
OllFU107Ci0gICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBzZXRFZGl0YWJsZTpZRVNdOwotICAg
ICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVF
eHRlcmlvcl07Ci0jaWYgX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSAxMDcwCi0g
ICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBzZXREcmF3c0JhY2tncm91bmQ6WUVTXTsKLSAgICAg
ICAgW21fdGV4dEZpZWxkLmdldCgpIHNldEJhY2tncm91bmRDb2xvcjpbTlNDb2xvciB3aGl0ZUNv
bG9yXV07Ci0jZWxzZQotICAgICAgICAvLyBQb3N0LUxpb24sIFdlYkNvcmUgY2FuIGJlIGluIGNo
YXJnZSBvZiBwYWludGlubmcgdGhlIGJhY2tncm91bmQgdGhhbmtzIHRvCi0gICAgICAgIC8vIHRo
ZSB3b3JrYXJvdW5kIGluIHBsYWNlIGZvciA8cmRhcjovL3Byb2JsZW0vMTEzODU0NjE+LCB3aGlj
aCBpcyBpbXBsZW1lbnRlZAotICAgICAgICAvLyBhYm92ZSBhcyBfY29yZVVJRHJhd09wdGlvbnNX
aXRoRnJhbWUuCi0gICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBzZXREcmF3c0JhY2tncm91bmQ6
Tk9dOwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLmdldCgpOwotfQot
Ci1TdHJpbmcgUmVuZGVyVGhlbWVNYWM6OmZpbGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVM
aXN0KiBmaWxlTGlzdCwgY29uc3QgRm9udCYgZm9udCwgaW50IHdpZHRoLCBib29sIG11bHRpcGxl
RmlsZXNBbGxvd2VkKSBjb25zdAotewotICAgIGlmICh3aWR0aCA8PSAwKQotICAgICAgICByZXR1
cm4gU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmcgc3RyVG9UcnVuY2F0ZTsKLSAgICBpZiAoZmlsZUxp
c3QtPmlzRW1wdHkoKSkKLSAgICAgICAgc3RyVG9UcnVuY2F0ZSA9IGZpbGVMaXN0RGVmYXVsdExh
YmVsKG11bHRpcGxlRmlsZXNBbGxvd2VkKTsKLSAgICBlbHNlIGlmIChmaWxlTGlzdC0+bGVuZ3Ro
KCkgPT0gMSkKLSAgICAgICAgc3RyVG9UcnVuY2F0ZSA9IFtbTlNGaWxlTWFuYWdlciBkZWZhdWx0
TWFuYWdlcl0gZGlzcGxheU5hbWVBdFBhdGg6KGZpbGVMaXN0LT5pdGVtKDApLT5wYXRoKCkpXTsK
LSAgICBlbHNlCi0gICAgICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUo
bXVsdGlwbGVGaWxlVXBsb2FkVGV4dChmaWxlTGlzdC0+bGVuZ3RoKCkpLCB3aWR0aCwgZm9udCwg
U3RyaW5nVHJ1bmNhdG9yOjpFbmFibGVSb3VuZGluZ0hhY2tzKTsKLQotICAgIHJldHVybiBTdHJp
bmdUcnVuY2F0b3I6OmNlbnRlclRydW5jYXRlKHN0clRvVHJ1bmNhdGUsIHdpZHRoLCBmb250LCBT
dHJpbmdUcnVuY2F0b3I6OkVuYWJsZVJvdW5kaW5nSGFja3MpOwotfQotCi12b2lkIFJlbmRlclRo
ZW1lTWFjOjpwYWludFBsdWdJblNuYXBzaG90T3ZlcmxheShSZW5kZXJTbmFwc2hvdHRlZFBsdWdJ
biogcmVuZGVyZXIsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2lu
dCYgcGFpbnRPZmZzZXQpIGNvbnN0Ci17Ci0gICAgTGF5b3V0VW5pdCBjV2lkdGggPSByZW5kZXJl
ci0+Y29udGVudFdpZHRoKCk7Ci0gICAgTGF5b3V0VW5pdCBjSGVpZ2h0ID0gcmVuZGVyZXItPmNv
bnRlbnRIZWlnaHQoKTsKLSAgICBpZiAoIWNXaWR0aCB8fCAhY0hlaWdodCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gcGFpbnRJbmZvLmNvbnRleHQ7
Ci0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzYXZlcigqY29udGV4dCk7Ci0KLSAgICBM
YXlvdXRTaXplIGJvcmRlckFuZFBhZGRpbmcocmVuZGVyZXItPmJvcmRlckxlZnQoKSArIHJlbmRl
cmVyLT5wYWRkaW5nTGVmdCgpLCByZW5kZXJlci0+Ym9yZGVyVG9wKCkgKyByZW5kZXJlci0+cGFk
ZGluZ1RvcCgpKTsKLQotICAgIExheW91dFNpemUgY29udGVudFNpemUoY1dpZHRoLCBjSGVpZ2h0
KTsKLSAgICBMYXlvdXRQb2ludCBjb250ZW50TG9jYXRpb24gPSBwYWludE9mZnNldDsKLSAgICBj
b250ZW50TG9jYXRpb24ubW92ZShib3JkZXJBbmRQYWRkaW5nKTsKLQotICAgIFJlZlB0cjxHcmFk
aWVudD4gZyA9IEdyYWRpZW50OjpjcmVhdGUoY29udGVudExvY2F0aW9uLCBGbG9hdFBvaW50KGNv
bnRlbnRMb2NhdGlvbi54KCksIGNvbnRlbnRMb2NhdGlvbi55KCkgKyBjSGVpZ2h0KSk7Ci0gICAg
Zy0+YWRkQ29sb3JTdG9wKDAsICBDb2xvciguNWYsIC41LCAuNSwgLjcpKTsKLSAgICBnLT5hZGRD
b2xvclN0b3AoLjIsIENvbG9yKC41NGYsIC41NCwgLjU0LCAuMykpOwotICAgIGctPmFkZENvbG9y
U3RvcCguNiwgQ29sb3IoLjYyZiwgLjYyLCAuNjIsIC4zKSk7Ci0gICAgZy0+YWRkQ29sb3JTdG9w
KDEsICBDb2xvciguN2YsIC43LCAuNywgLjk1KSk7Ci0gICAgY29udGV4dC0+c2V0RmlsbEdyYWRp
ZW50KGcucmVsZWFzZSgpKTsKLSAgICBjb250ZXh0LT5maWxsUmVjdChwaXhlbFNuYXBwZWRJbnRS
ZWN0KExheW91dFJlY3QoY29udGVudExvY2F0aW9uLCBjb250ZW50U2l6ZSkpKTsKLQotICAgIHN0
YXRpYyBjb25zdCBmbG9hdCBkaWFtZXRlciA9IDUwLCB0cmlhbmdsZVJhZGl1cyA9IDEyOwotICAg
IExheW91dFBvaW50IGNlbnRlciA9IGNvbnRlbnRMb2NhdGlvbjsKLSAgICBjZW50ZXIubW92ZShj
V2lkdGggLyAyLCBjSGVpZ2h0IC8gMik7Ci0gICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9y
KC40ZiwgLjQsIC40LCAuNyksIENvbG9yU3BhY2VTUkdCKTsKLSAgICBjb250ZXh0LT5maWxsRWxs
aXBzZShGbG9hdFJlY3QoY2VudGVyLngoKSAtIGRpYW1ldGVyIC8gMiwgY2VudGVyLnkoKSAtIGRp
YW1ldGVyIC8gMiwgZGlhbWV0ZXIsIGRpYW1ldGVyKSk7Ci0KLSAgICBQYXRoIHA7Ci0gICAgcC5t
b3ZlVG8oRmxvYXRQb2ludChjZW50ZXIueCgpIC0gdHJpYW5nbGVSYWRpdXMgKiAzIC8gNCwgY2Vu
dGVyLnkoKSAtIHRyaWFuZ2xlUmFkaXVzKSk7Ci0gICAgcC5hZGRMaW5lVG8oRmxvYXRQb2ludChj
ZW50ZXIueCgpICsgdHJpYW5nbGVSYWRpdXMgKiA1IC8gNCwgY2VudGVyLnkoKSkpOwotICAgIHAu
YWRkTGluZVRvKEZsb2F0UG9pbnQoY2VudGVyLngoKSAtIHRyaWFuZ2xlUmFkaXVzICogMyAvIDQs
IGNlbnRlci55KCkgKyB0cmlhbmdsZVJhZGl1cykpOwotICAgIHAuY2xvc2VTdWJwYXRoKCk7Ci0g
ICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yKDEuZiwgMS5mLCAxLmYsIC45ZiksIENvbG9y
U3BhY2VTUkdCKTsKLSAgICBjb250ZXh0LT5maWxsUGF0aChwKTsKLX0KLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRo
ZW1lTWFjU2hhcmVkLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNT
aGFyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4xMzM5MWRmZTdiZjY5MDUyMGQ4YjFhOGQ1ZTkwZDNjY2M4MWNk
MDkxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRo
ZW1lTWFjU2hhcmVkLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFy
dCBvZiB0aGUgdGhlbWUgaW1wbGVtZW50YXRpb24gZm9yIGZvcm0gY29udHJvbHMgaW4gV2ViQ29y
ZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIw
MTAsIDIwMTEsIDIwMTIgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgUmVuZGVyVGhl
bWVNYWNTaGFyZWRfaAorI2RlZmluZSBSZW5kZXJUaGVtZU1hY1NoYXJlZF9oCisKKyNpbXBvcnQg
IlJlbmRlclRoZW1lLmgiCisjaW1wb3J0IDx3dGYvSGFzaE1hcC5oPgorI2ltcG9ydCA8d3RmL1Jl
dGFpblB0ci5oPgorCitPQkpDX0NMQVNTIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9i
c2VydmVyOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclByb2dyZXNzOwor
Y2xhc3MgUmVuZGVyU3R5bGU7CisKK2NsYXNzIFJlbmRlclRoZW1lTWFjU2hhcmVkIDogcHVibGlj
IFJlbmRlclRoZW1lIHsKK3B1YmxpYzoKKyAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIGNv
bnRyb2wgY2hhbmdlcyBpdHMgdGludCB3aGVuIHRoZSB3aW5kb3cgaGFzIGZvY3VzIG9yIG5vdC4K
KyAgICB2aXJ0dWFsIGJvb2wgY29udHJvbFN1cHBvcnRzVGludHMoY29uc3QgUmVuZGVyT2JqZWN0
KikgY29uc3Q7CisKKyAgICAvLyBBIGdlbmVyYWwgbWV0aG9kIGFza2luZyBpZiBhbnkgY29udHJv
bCB0aW50aW5nIGlzIHN1cHBvcnRlZCBhdCBhbGwuCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRz
Q29udHJvbFRpbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB2b2lk
IGFkanVzdFJlcGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCosIEludFJlY3QmKSBPVkVSUklE
RTsKKworICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVyU3R5bGUq
LCBjb25zdCBCb3JkZXJEYXRhJiwgY29uc3QgRmlsbExheWVyJiwgY29uc3QgQ29sb3ImIGJhY2tn
cm91bmRDb2xvcikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9y
bUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBD
b2xvciBwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dDsKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZUxp
c3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIENvbG9y
IHBsYXRmb3JtSW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7
CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkgY29uc3Q7CisKKyAg
ICB2aXJ0dWFsIFNjcm9sbGJhckNvbnRyb2xTaXplIHNjcm9sbGJhckNvbnRyb2xTaXplRm9yUGFy
dChDb250cm9sUGFydCkgeyByZXR1cm4gU21hbGxTY3JvbGxiYXI7IH0KKworICAgIHZpcnR1YWwg
dm9pZCBwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOworCisgICAgLy8gU3lzdGVtIGZvbnRzLgor
ICAgIHZpcnR1YWwgdm9pZCBzeXN0ZW1Gb250KGludCBjc3NWYWx1ZUlkLCBGb250RGVzY3JpcHRp
b24mKSBjb25zdDsKKworICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVy
U3R5bGUqKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTbGlkZXJUaHVtYlNpemUo
UmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisKKyNpZiBFTkFCTEUoREFUQUxJU1RfRUxF
TUVOVCkKKyAgICB2aXJ0dWFsIEludFNpemUgc2xpZGVyVGlja1NpemUoKSBjb25zdCBPVkVSUklE
RTsKKyAgICB2aXJ0dWFsIGludCBzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29u
c3QgT1ZFUlJJREU7CisjZW5kaWYKKworICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRk
aW5nTGVmdChSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJu
YWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBwb3B1
cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgaW50
IHBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICB2
aXJ0dWFsIGJvb2wgcGFpbnRDYXBzTG9ja0luZGljYXRvcihSZW5kZXJPYmplY3QqLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0JikgT1ZFUlJJREU7CisKKyAgICB2aXJ0dWFsIGJvb2wg
cG9wc01lbnVCeUFycm93S2V5cygpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKwor
I2lmIEVOQUJMRShNRVRFUl9FTEVNRU5UKQorICAgIHZpcnR1YWwgSW50U2l6ZSBtZXRlclNpemVG
b3JCb3VuZHMoY29uc3QgUmVuZGVyTWV0ZXIqLCBjb25zdCBJbnRSZWN0JikgY29uc3QgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCBib29sIHBhaW50TWV0ZXIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c01ldGVy
KENvbnRyb2xQYXJ0KSBjb25zdDsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1F
TlQpCisgICAgLy8gUmV0dXJucyB0aGUgcmVwZWF0IGludGVydmFsIG9mIHRoZSBhbmltYXRpb24g
Zm9yIHRoZSBwcm9ncmVzcyBiYXIuCisgICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uUmVwZWF0
SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OworICAgIC8vIFJl
dHVybnMgdGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gZm9yIHRoZSBwcm9ncmVzcyBiYXIu
CisgICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5k
ZXJQcm9ncmVzcyopIGNvbnN0OworI2VuZGlmCisKKyAgICB2aXJ0dWFsIENvbG9yIHN5c3RlbUNv
bG9yKGludCBjc3NWYWx1ZUlkKSBjb25zdDsKKyAgICAvLyBDb250cm9scyBjb2xvciB2YWx1ZXMg
cmV0dXJuZWQgZnJvbSBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkuIHN5c3RlbUNvbG9yKCkgd2ls
bCBiZSB1c2VkIHdoZW4gZmFsc2UuCisgICAgdmlydHVhbCBib29sIHVzZXNUZXN0TW9kZUZvY3Vz
UmluZ0NvbG9yKCkgY29uc3Q7CisgICAgLy8gQSB2aWV3IGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRh
aW5lZCBkb2N1bWVudC4gU3ViY2xhc3NlcyBtYXkgbm90IGhhdmUgc3VjaCBhIHZpZXcgYW5kIHJl
dHVybiBhIGZha2UuCisgICAgdmlydHVhbCBOU1ZpZXcqIGRvY3VtZW50Vmlld0ZvcihSZW5kZXJP
YmplY3QqKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRQbHVnSW5TbmFwc2hv
dE92ZXJsYXkoUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4qLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBMYXlvdXRQb2ludCYpIGNvbnN0IE9WRVJSSURFOworCitwcm90ZWN0ZWQ6CisgICAgUmVuZGVy
VGhlbWVNYWNTaGFyZWQoKTsKKyAgICB2aXJ0dWFsIH5SZW5kZXJUaGVtZU1hY1NoYXJlZCgpOwor
CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9ycygpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQo
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZp
cnR1YWwgdm9pZCBhZGp1c3RUZXh0RmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCB2b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxl
KiwgRWxlbWVudCopIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVu
ZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1
YWwgdm9pZCBhZGp1c3RNZW51TGlzdFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9u
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVu
ZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVO
VCkKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZShTdHlsZVJlc29sdmVy
KiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50
UHJvZ3Jlc3NCYXIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOworI2VuZGlmCisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUcmFjayhSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2
b2lkIGFkanVzdFNsaWRlclRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVGh1bWIoUmVu
ZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1
YWwgdm9pZCBhZGp1c3RTbGlkZXJUaHVtYlN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHls
ZSosIEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxk
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVy
U3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNo
RmllbGRDYW5jZWxCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0
b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisg
ICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKFN0eWxlUmVz
b2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wg
cGFpbnRTZWFyY2hGaWVsZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZv
JiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxk
UmVzdWx0c0RlY29yYXRpb25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVj
b3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7
CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUo
U3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1
YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAg
dmlydHVhbCB2b2lkIGFkanVzdE1lZGlhU2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29u
c3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Nsb3NlZENhcHRpb25pbmcoKSBjb25z
dCB7IHJldHVybiB0cnVlOyB9CisjZW5kaWYKKworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRTaG93
UGxhY2Vob2xkZXJXaGVuRm9jdXNlZCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZpcnR1YWwg
U3RyaW5nIGZpbGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVMaXN0KiwgY29uc3QgRm9udCYs
IGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dlZCkgY29uc3QgT1ZFUlJJREU7CisK
KyAgICBJbnRSZWN0IGluZmxhdGVSZWN0KGNvbnN0IEludFJlY3QmLCBjb25zdCBJbnRTaXplJiwg
Y29uc3QgaW50KiBtYXJnaW5zLCBmbG9hdCB6b29tTGV2ZWwgPSAxLjBmKSBjb25zdDsKKworICAg
IEZsb2F0UmVjdCBjb252ZXJ0VG9QYWludGluZ1JlY3QoY29uc3QgUmVuZGVyT2JqZWN0KiBpbnB1
dFJlbmRlcmVyLCBjb25zdCBSZW5kZXJPYmplY3QqIHBhcnRSZW5kZXJlciwgY29uc3QgRmxvYXRS
ZWN0JiBpbnB1dFJlY3QsIGNvbnN0IEludFJlY3QmKSBjb25zdDsKKworICAgIC8vIEdldCB0aGUg
Y29udHJvbCBzaXplIGJhc2VkIG9mZiB0aGUgZm9udC4gVXNlZCBieSBzb21lIG9mIHRoZSBjb250
cm9scyAobGlrZSBidXR0b25zKS4KKyAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplRm9yRm9u
dChSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemVGb3JT
eXN0ZW1Gb250KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdm9pZCBzZXRDb250cm9sU2l6ZShO
U0NlbGwqLCBjb25zdCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50U2l6ZSYgbWluU2l6ZSwgZmxv
YXQgem9vbUxldmVsID0gMS4wZik7CisgICAgdm9pZCBzZXRTaXplRnJvbUZvbnQoUmVuZGVyU3R5
bGUqLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3Q7CisgICAgSW50U2l6ZSBzaXplRm9yRm9u
dChSZW5kZXJTdHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdDsKKyAgICBJbnRTaXpl
IHNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKiwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNv
bnN0OworICAgIHZvaWQgc2V0Rm9udEZyb21Db250cm9sU2l6ZShTdHlsZVJlc29sdmVyKiwgUmVu
ZGVyU3R5bGUqLCBOU0NvbnRyb2xTaXplKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlQ2hlY2tl
ZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIHZvaWQgdXBkYXRlRW5h
YmxlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIHZvaWQgdXBkYXRl
Rm9jdXNlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIHZvaWQgdXBk
YXRlUHJlc3NlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworICAgIC8vIEFu
IG9wdGlvbmFsIGhvb2sgZm9yIHN1YmNsYXNzZXMgdG8gdXBkYXRlIHRoZSBjb250cm9sIHRpbnQg
b2YgTlNDZWxsLgorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVBY3RpdmVTdGF0ZShOU0NlbGwqLCBj
b25zdCBSZW5kZXJPYmplY3QqKSB7IH0KKworICAgIC8vIEhlbHBlcnMgZm9yIGFkanVzdGluZyBh
cHBlYXJhbmNlIGFuZCBmb3IgcGFpbnRpbmcKKworICAgIHZvaWQgc2V0UG9wdXBCdXR0b25DZWxs
U3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVjdCYpOworICAgIGNvbnN0IElu
dFNpemUqIHBvcHVwQnV0dG9uU2l6ZXMoKSBjb25zdDsKKyAgICBjb25zdCBpbnQqIHBvcHVwQnV0
dG9uTWFyZ2lucygpIGNvbnN0OworICAgIGNvbnN0IGludCogcG9wdXBCdXR0b25QYWRkaW5nKE5T
Q29udHJvbFNpemUpIGNvbnN0OworICAgIHZvaWQgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50
cyhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAg
Y29uc3QgSW50U2l6ZSogbWVudUxpc3RTaXplcygpIGNvbnN0OworCisgICAgY29uc3QgSW50U2l6
ZSogc2VhcmNoRmllbGRTaXplcygpIGNvbnN0OworICAgIGNvbnN0IEludFNpemUqIGNhbmNlbEJ1
dHRvblNpemVzKCkgY29uc3Q7CisgICAgY29uc3QgSW50U2l6ZSogcmVzdWx0c0J1dHRvblNpemVz
KCkgY29uc3Q7CisgICAgdm9pZCBzZXRTZWFyY2hDZWxsU3RhdGUoUmVuZGVyT2JqZWN0KiwgY29u
c3QgSW50UmVjdCYpOworICAgIHZvaWQgc2V0U2VhcmNoRmllbGRTaXplKFJlbmRlclN0eWxlKikg
Y29uc3Q7CisKKyAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBCdXR0b24oKSBjb25zdDsKKyAg
ICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoKCkgY29uc3Q7CisgICAgTlNNZW51KiBzZWFyY2hN
ZW51VGVtcGxhdGUoKSBjb25zdDsKKyAgICBOU1NsaWRlckNlbGwqIHNsaWRlclRodW1iSG9yaXpv
bnRhbCgpIGNvbnN0OworICAgIE5TU2xpZGVyQ2VsbCogc2xpZGVyVGh1bWJWZXJ0aWNhbCgpIGNv
bnN0OworICAgIE5TVGV4dEZpZWxkQ2VsbCogdGV4dEZpZWxkKCkgY29uc3Q7CisKKyNpZiBFTkFC
TEUoTUVURVJfRUxFTUVOVCkKKyAgICBOU0xldmVsSW5kaWNhdG9yU3R5bGUgbGV2ZWxJbmRpY2F0
b3JTdHlsZUZvcihDb250cm9sUGFydCkgY29uc3Q7CisgICAgTlNMZXZlbEluZGljYXRvckNlbGwq
IGxldmVsSW5kaWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKikgY29uc3Q7CisjZW5kaWYKKwor
I2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQorICAgIGludCBtaW5pbXVtUHJvZ3Jlc3NCYXJI
ZWlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICBjb25zdCBJbnRTaXplKiBwcm9ncmVzc0Jh
clNpemVzKCkgY29uc3Q7CisgICAgY29uc3QgaW50KiBwcm9ncmVzc0Jhck1hcmdpbnMoTlNDb250
cm9sU2l6ZSkgY29uc3Q7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIFJldGFpblB0
cjxOU1BvcFVwQnV0dG9uQ2VsbD4gbV9wb3B1cEJ1dHRvbjsKKyAgICBtdXRhYmxlIFJldGFpblB0
cjxOU1NlYXJjaEZpZWxkQ2VsbD4gbV9zZWFyY2g7CisgICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNN
ZW51PiBtX3NlYXJjaE1lbnVUZW1wbGF0ZTsKKyAgICBtdXRhYmxlIFJldGFpblB0cjxOU1NsaWRl
ckNlbGw+IG1fc2xpZGVyVGh1bWJIb3Jpem9udGFsOworICAgIG11dGFibGUgUmV0YWluUHRyPE5T
U2xpZGVyQ2VsbD4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsOworICAgIG11dGFibGUgUmV0YWluUHRy
PE5TTGV2ZWxJbmRpY2F0b3JDZWxsPiBtX2xldmVsSW5kaWNhdG9yOworICAgIG11dGFibGUgUmV0
YWluUHRyPE5TVGV4dEZpZWxkQ2VsbD4gbV90ZXh0RmllbGQ7CisKKyAgICBib29sIG1faXNTbGlk
ZXJUaHVtYkhvcml6b250YWxQcmVzc2VkOworICAgIGJvb2wgbV9pc1NsaWRlclRodW1iVmVydGlj
YWxQcmVzc2VkOworCisgICAgbXV0YWJsZSBIYXNoTWFwPGludCwgUkdCQTMyPiBtX3N5c3RlbUNv
bG9yQ2FjaGU7CisKKyAgICBSZXRhaW5QdHI8V2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9u
T2JzZXJ2ZXI+IG1fbm90aWZpY2F0aW9uT2JzZXJ2ZXI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBSZW5kZXJUaGVtZU1hY1NoYXJlZF9oCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQubW0gYi9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQubW0KbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOGU5
MDJmY2M1Mzg4NGI1NmNkYTYwOGMxMjFlZTg0MTNiMmYxMTYxYgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5tbQpAQCAtMCww
ICsxLDE4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgs
IDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlJlbmRlclRoZW1lTWFjU2hhcmVkLmgiCisKKyNp
bXBvcnQgIkJpdG1hcEltYWdlLmgiCisjaW1wb3J0ICJDb2xvck1hYy5oIgorI2ltcG9ydCAiQ1NT
VmFsdWVMaXN0LmgiCisjaW1wb3J0ICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW1wb3J0ICJEb2N1
bWVudC5oIgorI2ltcG9ydCAiRWxlbWVudC5oIgorI2ltcG9ydCAiRmlsZUxpc3QuaCIKKyNpbXBv
cnQgIkZyYW1lVmlldy5oIgorI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0Q0cuaCIKKyNpbXBvcnQg
IkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbXBvcnQgIkhUTUxNZWRpYUVsZW1lbnQuaCIKKyNpbXBv
cnQgIkhUTUxOYW1lcy5oIgorI2ltcG9ydCAiSW1hZ2UuaCIKKyNpbXBvcnQgIkltYWdlQnVmZmVy
LmgiCisjaW1wb3J0ICJMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQuaCIKKyNpbXBvcnQgIkxv
Y2FsaXplZFN0cmluZ3MuaCIKKyNpbXBvcnQgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW1w
b3J0ICJQYWludEluZm8uaCIKKyNpbXBvcnQgIlJlbmRlck1lZGlhLmgiCisjaW1wb3J0ICJSZW5k
ZXJNZWRpYUNvbnRyb2xzLmgiCisjaW1wb3J0ICJSZW5kZXJTbGlkZXIuaCIKKyNpbXBvcnQgIlJl
bmRlclNuYXBzaG90dGVkUGx1Z0luLmgiCisjaW1wb3J0ICJSZW5kZXJWaWV3LmgiCisjaW1wb3J0
ICJTaGFyZWRCdWZmZXIuaCIKKyNpbXBvcnQgIlN0cmluZ1RydW5jYXRvci5oIgorI2ltcG9ydCAi
U3R5bGVSZXNvbHZlci5oIgorI2ltcG9ydCAiVGltZVJhbmdlcy5oIgorI2ltcG9ydCAiVGhlbWVN
YWMuaCIKKyNpbXBvcnQgIldlYkNvcmVOU0NlbGxFeHRyYXMuaCIKKyNpbXBvcnQgIldlYkNvcmVT
eXN0ZW1JbnRlcmZhY2UuaCIKKyNpbXBvcnQgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW1w
b3J0IDxDYXJib24vQ2FyYm9uLmg+CisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8
d3RmL1JldGFpblB0ci5oPgorI2ltcG9ydCA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2ltcG9ydCA8
bWF0aC5oPgorCisjaW1wb3J0ICJSZW5kZXJQcm9ncmVzcy5oIgorCisjaWYgRU5BQkxFKE1FVEVS
X0VMRU1FTlQpCisjaW5jbHVkZSAiUmVuZGVyTWV0ZXIuaCIKKyNpbmNsdWRlICJIVE1MTWV0ZXJF
bGVtZW50LmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8gVGhlIG1ldGhv
ZHMgaW4gdGhpcyBmaWxlIGFyZSBzcGVjaWZpYyB0byB0aGUgTWFjIE9TIFggcGxhdGZvcm0uCisK
Ky8vIEZJWE1FOiBUaGUgcGxhdGZvcm0taW5kZXBlbmRlbnQgY29kZSBpbiB0aGlzIGNsYXNzIHNo
b3VsZCBiZSBmYWN0b3JlZCBvdXQgYW5kIG1lcmdlZCB3aXRoIFJlbmRlclRoZW1lU2FmYXJpLgor
CisvLyBXZSBlc3RpbWF0ZSB0aGUgYW5pbWF0aW9uIHJhdGUgb2YgYSBNYWMgT1MgWCBwcm9ncmVz
cyBiYXIgaXMgMzMgZnBzLgorLy8gSGFyZCBjb2RlIHRoZSB2YWx1ZSBoZXJlIGJlY2F1c2Ugd2Ug
aGF2ZW4ndCBmb3VuZCBBUEkgZm9yIGl0LgorY29uc3QgZG91YmxlIHByb2dyZXNzQW5pbWF0aW9u
RnJhbWVSYXRlID0gMC4wMzM7CisKKy8vIE1hYyBPUyBYIHByb2dyZXNzIGJhciBhbmltYXRpb24g
c2VlbXMgdG8gaGF2ZSAyNTYgZnJhbWVzLgorY29uc3QgZG91YmxlIHByb2dyZXNzQW5pbWF0aW9u
TnVtRnJhbWVzID0gMjU2OworCitAaW50ZXJmYWNlIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNh
dGlvbk9ic2VydmVyIDogTlNPYmplY3QKK3sKKyAgICBXZWJDb3JlOjpSZW5kZXJUaGVtZSAqX3Ro
ZW1lOworfQorCistIChpZClpbml0V2l0aFRoZW1lOihXZWJDb3JlOjpSZW5kZXJUaGVtZSAqKXRo
ZW1lOworLSAodm9pZClzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KE5TTm90aWZpY2F0aW9uICopbm90
aWZpY2F0aW9uOworCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBXZWJDb3JlUmVuZGVyVGhlbWVO
b3RpZmljYXRpb25PYnNlcnZlcgorCistIChpZClpbml0V2l0aFRoZW1lOihXZWJDb3JlOjpSZW5k
ZXJUaGVtZSAqKXRoZW1lCit7CisgICAgaWYgKCEoc2VsZiA9IFtzdXBlciBpbml0XSkpCisgICAg
ICAgIHJldHVybiBuaWw7CisKKyAgICBfdGhlbWUgPSB0aGVtZTsKKyAgICByZXR1cm4gc2VsZjsK
K30KKworLSAodm9pZClzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KE5TTm90aWZpY2F0aW9uICopdW51
c2VkTm90aWZpY2F0aW9uCit7CisgICAgQVNTRVJUX1VOVVNFRCh1bnVzZWROb3RpZmljYXRpb24s
IFtbdW51c2VkTm90aWZpY2F0aW9uIG5hbWVdIGlzRXF1YWxUb1N0cmluZzpOU1N5c3RlbUNvbG9y
c0RpZENoYW5nZU5vdGlmaWNhdGlvbl0pOworICAgIF90aGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRD
aGFuZ2UoKTsKK30KKworQGVuZAorCitAaW50ZXJmYWNlIE5TVGV4dEZpZWxkQ2VsbCAoV0tEZXRh
aWxzKQorLSAoQ0ZEaWN0aW9uYXJ5UmVmKV9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTooTlNS
ZWN0KWNlbGxGcmFtZSBpblZpZXc6KE5TVmlldyAqKWNvbnRyb2xWaWV3IGluY2x1ZGVGb2N1czoo
Qk9PTClpbmNsdWRlRm9jdXM7CitAZW5kCisKKworQGludGVyZmFjZSBXZWJDb3JlVGV4dEZpZWxk
Q2VsbCA6IE5TVGV4dEZpZWxkQ2VsbAorLSAoQ0ZEaWN0aW9uYXJ5UmVmKV9jb3JlVUlEcmF3T3B0
aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNlbGxGcmFtZSBpblZpZXc6KE5TVmlldyAqKWNvbnRyb2xW
aWV3IGluY2x1ZGVGb2N1czooQk9PTClpbmNsdWRlRm9jdXM7CitAZW5kCisKK0BpbXBsZW1lbnRh
dGlvbiBXZWJDb3JlVGV4dEZpZWxkQ2VsbAorLSAoQ0ZEaWN0aW9uYXJ5UmVmKV9jb3JlVUlEcmF3
T3B0aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNlbGxGcmFtZSBpblZpZXc6KE5TVmlldyAqKWNvbnRy
b2xWaWV3IGluY2x1ZGVGb2N1czooQk9PTClpbmNsdWRlRm9jdXMKK3sKKyAgICAvLyBGSVhNRTog
VGhpcyBpcyBhIHBvc3QtTGlvbi1vbmx5IHdvcmthcm91bmQgZm9yIDxyZGFyOi8vcHJvYmxlbS8x
MTM4NTQ2MT4uIFdoZW4gdGhhdCBidWcgaXMgcmVzb2x2ZWQsIHdlIHNob3VsZCByZW1vdmUgdGhp
cyBjb2RlLgorICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgY29yZVVJRHJhd09wdGlvbnMgPSBD
RkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBbc3VwZXIgX2NvcmVVSURyYXdP
cHRpb25zV2l0aEZyYW1lOmNlbGxGcmFtZSBpblZpZXc6Y29udHJvbFZpZXcgaW5jbHVkZUZvY3Vz
OmluY2x1ZGVGb2N1c10pOworICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGNvcmVVSURyYXdPcHRp
b25zLCBAImJvcmRlcnMgb25seSIsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICByZXR1cm4gKENGRGlj
dGlvbmFyeVJlZilbTlNNYWtlQ29sbGVjdGFibGUoY29yZVVJRHJhd09wdGlvbnMpIGF1dG9yZWxl
YXNlXTsKK30KK0BlbmQKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2Ug
SFRNTE5hbWVzOworCitlbnVtIHsKKyAgICB0b3BNYXJnaW4sCisgICAgcmlnaHRNYXJnaW4sCisg
ICAgYm90dG9tTWFyZ2luLAorICAgIGxlZnRNYXJnaW4KK307CisKK2VudW0geworICAgIHRvcFBh
ZGRpbmcsCisgICAgcmlnaHRQYWRkaW5nLAorICAgIGJvdHRvbVBhZGRpbmcsCisgICAgbGVmdFBh
ZGRpbmcKK307CisKK1JlbmRlclRoZW1lTWFjU2hhcmVkOjpSZW5kZXJUaGVtZU1hY1NoYXJlZCgp
CisgICAgOiBtX2lzU2xpZGVyVGh1bWJIb3Jpem9udGFsUHJlc3NlZChmYWxzZSkKKyAgICAsIG1f
aXNTbGlkZXJUaHVtYlZlcnRpY2FsUHJlc3NlZChmYWxzZSkKKyAgICAsIG1fbm90aWZpY2F0aW9u
T2JzZXJ2ZXIoQWRvcHROUywgW1tXZWJDb3JlUmVuZGVyVGhlbWVOb3RpZmljYXRpb25PYnNlcnZl
ciBhbGxvY10gaW5pdFdpdGhUaGVtZTp0aGlzXSkKK3sKKyAgICBbW05TTm90aWZpY2F0aW9uQ2Vu
dGVyIGRlZmF1bHRDZW50ZXJdIGFkZE9ic2VydmVyOm1fbm90aWZpY2F0aW9uT2JzZXJ2ZXIuZ2V0
KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc2VsZWN0b3I6QHNlbGVjdG9yKHN5c3RlbUNvbG9yc0RpZENoYW5nZTopCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOk5T
U3lzdGVtQ29sb3JzRGlkQ2hhbmdlTm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Om5pbF07Cit9CisKK1Jl
bmRlclRoZW1lTWFjU2hhcmVkOjp+UmVuZGVyVGhlbWVNYWNTaGFyZWQoKQoreworICAgIFtbTlNO
b3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcmVtb3ZlT2JzZXJ2ZXI6bV9ub3RpZmlj
YXRpb25PYnNlcnZlci5nZXQoKV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpw
bGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgTlND
b2xvciogY29sb3IgPSBbW05TQ29sb3Igc2VsZWN0ZWRUZXh0QmFja2dyb3VuZENvbG9yXSBjb2xv
clVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXTsKKyAgICByZXR1cm4g
Q29sb3Ioc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciByZWRDb21wb25lbnRdKSwgc3Rh
dGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBncmVlbkNvbXBvbmVudF0pLCBzdGF0aWNfY2Fz
dDxpbnQ+KDI1NS4wICogW2NvbG9yIGJsdWVDb21wb25lbnRdKSk7Cit9CisKK0NvbG9yIFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
KCkgY29uc3QKK3sKKyAgICBOU0NvbG9yKiBjb2xvciA9IFtbTlNDb2xvciBzZWNvbmRhcnlTZWxl
Y3RlZENvbnRyb2xDb2xvcl0gY29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29s
b3JTcGFjZV07CisgICAgcmV0dXJuIENvbG9yKHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29s
b3IgcmVkQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgZ3JlZW5D
b21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBibHVlQ29tcG9uZW50
XSkpOworfQorCitDb2xvciBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZvcm1BY3RpdmVMaXN0
Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBOU0NvbG9yKiBjb2xv
ciA9IFtbTlNDb2xvciBhbHRlcm5hdGVTZWxlY3RlZENvbnRyb2xDb2xvcl0gY29sb3JVc2luZ0Nv
bG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFjZV07CisgICAgcmV0dXJuIENvbG9yKHN0
YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgcmVkQ29tcG9uZW50XSksIHN0YXRpY19jYXN0
PGludD4oMjU1LjAgKiBbY29sb3IgZ3JlZW5Db21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50Pigy
NTUuMCAqIFtjb2xvciBibHVlQ29tcG9uZW50XSkpOworfQorCitDb2xvciBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6cGxhdGZvcm1BY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3I6OndoaXRlOworfQorCitDb2xvciBSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcjo6YmxhY2s7Cit9CisKK0NvbG9yIFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkgY29uc3QKK3sKKyAgICBp
ZiAodXNlc1Rlc3RNb2RlRm9jdXNSaW5nQ29sb3IoKSkKKyAgICAgICAgcmV0dXJuIG9sZEFxdWFG
b2N1c1JpbmdDb2xvcigpOworCisgICAgcmV0dXJuIHN5c3RlbUNvbG9yKENTU1ZhbHVlV2Via2l0
Rm9jdXNSaW5nQ29sb3IpOworfQorCitDb2xvciBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGxhdGZv
cm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAg
IHJldHVybiBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCk7Cit9CisK
K3N0YXRpYyBGb250V2VpZ2h0IHRvRm9udFdlaWdodChOU0ludGVnZXIgYXBwS2l0Rm9udFdlaWdo
dCkKK3sKKyAgICBBU1NFUlQoYXBwS2l0Rm9udFdlaWdodCA+IDAgJiYgYXBwS2l0Rm9udFdlaWdo
dCA8IDE1KTsKKyAgICBpZiAoYXBwS2l0Rm9udFdlaWdodCA+IDE0KQorICAgICAgICBhcHBLaXRG
b250V2VpZ2h0ID0gMTQ7CisgICAgZWxzZSBpZiAoYXBwS2l0Rm9udFdlaWdodCA8IDEpCisgICAg
ICAgIGFwcEtpdEZvbnRXZWlnaHQgPSAxOworCisgICAgc3RhdGljIEZvbnRXZWlnaHQgZm9udFdl
aWdodHNbXSA9IHsKKyAgICAgICAgRm9udFdlaWdodDEwMCwKKyAgICAgICAgRm9udFdlaWdodDEw
MCwKKyAgICAgICAgRm9udFdlaWdodDIwMCwKKyAgICAgICAgRm9udFdlaWdodDMwMCwKKyAgICAg
ICAgRm9udFdlaWdodDQwMCwKKyAgICAgICAgRm9udFdlaWdodDUwMCwKKyAgICAgICAgRm9udFdl
aWdodDYwMCwKKyAgICAgICAgRm9udFdlaWdodDYwMCwKKyAgICAgICAgRm9udFdlaWdodDcwMCwK
KyAgICAgICAgRm9udFdlaWdodDgwMCwKKyAgICAgICAgRm9udFdlaWdodDgwMCwKKyAgICAgICAg
Rm9udFdlaWdodDkwMCwKKyAgICAgICAgRm9udFdlaWdodDkwMCwKKyAgICAgICAgRm9udFdlaWdo
dDkwMAorICAgIH07CisgICAgcmV0dXJuIGZvbnRXZWlnaHRzW2FwcEtpdEZvbnRXZWlnaHQgLSAx
XTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c3lzdGVtRm9udChpbnQgY3NzVmFs
dWVJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgREVG
SU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIHN5c3RlbUZvbnQsICgpKTsKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgc21hbGxTeXN0ZW1Gb250LCAoKSk7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIG1lbnVGb250LCAoKSk7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIGxhYmVsRm9udCwgKCkp
OworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBtaW5pQ29udHJvbEZv
bnQsICgpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgc21hbGxD
b250cm9sRm9udCwgKCkpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9u
LCBjb250cm9sRm9udCwgKCkpOworCisgICAgRm9udERlc2NyaXB0aW9uKiBjYWNoZWREZXNjOwor
ICAgIE5TRm9udCogZm9udCA9IG5pbDsKKyAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKKyAgICAg
ICAgY2FzZSBDU1NWYWx1ZVNtYWxsQ2FwdGlvbjoKKyAgICAgICAgICAgIGNhY2hlZERlc2MgPSAm
c21hbGxTeXN0ZW1Gb250OworICAgICAgICAgICAgaWYgKCFzbWFsbFN5c3RlbUZvbnQuaXNBYnNv
bHV0ZVNpemUoKSkKKyAgICAgICAgICAgICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZT
aXplOltOU0ZvbnQgc21hbGxTeXN0ZW1Gb250U2l6ZV1dOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgQ1NTVmFsdWVNZW51OgorICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZtZW51
Rm9udDsKKyAgICAgICAgICAgIGlmICghbWVudUZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAg
ICAgICAgICAgICBmb250ID0gW05TRm9udCBtZW51Rm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZv
bnRTaXplXV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVN0YXR1
c0JhcjoKKyAgICAgICAgICAgIGNhY2hlZERlc2MgPSAmbGFiZWxGb250OworICAgICAgICAgICAg
aWYgKCFsYWJlbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgICAgICBmb250ID0g
W05TRm9udCBsYWJlbEZvbnRPZlNpemU6W05TRm9udCBsYWJlbEZvbnRTaXplXV07CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdE1pbmlDb250cm9sOgorICAg
ICAgICAgICAgY2FjaGVkRGVzYyA9ICZtaW5pQ29udHJvbEZvbnQ7CisgICAgICAgICAgICBpZiAo
IW1pbmlDb250cm9sRm9udC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAgIGZvbnQg
PSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRy
b2xTaXplOk5TTWluaUNvbnRyb2xTaXplXV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBDU1NWYWx1ZVdlYmtpdFNtYWxsQ29udHJvbDoKKyAgICAgICAgICAgIGNhY2hlZERlc2Mg
PSAmc21hbGxDb250cm9sRm9udDsKKyAgICAgICAgICAgIGlmICghc21hbGxDb250cm9sRm9udC5p
c0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZv
bnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TU21hbGxDb250
cm9sU2l6ZV1dOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJr
aXRDb250cm9sOgorICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZjb250cm9sRm9udDsKKyAgICAg
ICAgICAgIGlmICghY29udHJvbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgICAg
ICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVG
b3JDb250cm9sU2l6ZTpOU1JlZ3VsYXJDb250cm9sU2l6ZV1dOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYWNoZWREZXNjID0gJnN5c3RlbUZvbnQ7
CisgICAgICAgICAgICBpZiAoIXN5c3RlbUZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAg
ICAgICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9u
dFNpemVdXTsKKyAgICB9CisKKyAgICBpZiAoZm9udCkgeworICAgICAgICBOU0ZvbnRNYW5hZ2Vy
ICpmb250TWFuYWdlciA9IFtOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2VyXTsKKyAgICAg
ICAgY2FjaGVkRGVzYy0+c2V0SXNBYnNvbHV0ZVNpemUodHJ1ZSk7CisgICAgICAgIGNhY2hlZERl
c2MtPnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7CisgICAgICAg
IGNhY2hlZERlc2MtPmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KFtmb250IGZhbWlseU5hbWVdKTsK
KyAgICAgICAgY2FjaGVkRGVzYy0+c2V0U3BlY2lmaWVkU2l6ZShbZm9udCBwb2ludFNpemVdKTsK
KyAgICAgICAgY2FjaGVkRGVzYy0+c2V0V2VpZ2h0KHRvRm9udFdlaWdodChbZm9udE1hbmFnZXIg
d2VpZ2h0T2ZGb250OmZvbnRdKSk7CisgICAgICAgIGNhY2hlZERlc2MtPnNldEl0YWxpYyhbZm9u
dE1hbmFnZXIgdHJhaXRzT2ZGb250OmZvbnRdICYgTlNJdGFsaWNGb250TWFzayk7CisgICAgfQor
ICAgIGZvbnREZXNjcmlwdGlvbiA9ICpjYWNoZWREZXNjOworfQorCitzdGF0aWMgUkdCQTMyIGNv
bnZlcnROU0NvbG9yVG9Db2xvcihOU0NvbG9yICpjb2xvcikKK3sKKyAgICBOU0NvbG9yICpjb2xv
ckluQ29sb3JTcGFjZSA9IFtjb2xvciBjb2xvclVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VS
R0JDb2xvclNwYWNlXTsKKyAgICBpZiAoY29sb3JJbkNvbG9yU3BhY2UpIHsKKyAgICAgICAgc3Rh
dGljIGNvbnN0IGRvdWJsZSBzY2FsZUZhY3RvciA9IG5leHRhZnRlcigyNTYuMCwgMC4wKTsKKyAg
ICAgICAgcmV0dXJuIG1ha2VSR0Ioc3RhdGljX2Nhc3Q8aW50PihzY2FsZUZhY3RvciAqIFtjb2xv
ckluQ29sb3JTcGFjZSByZWRDb21wb25lbnRdKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGlu
dD4oc2NhbGVGYWN0b3IgKiBbY29sb3JJbkNvbG9yU3BhY2UgZ3JlZW5Db21wb25lbnRdKSwKKyAg
ICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2NhbGVGYWN0b3IgKiBbY29sb3JJbkNvbG9yU3Bh
Y2UgYmx1ZUNvbXBvbmVudF0pKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGNvbnZlcnNpb24gYWJv
dmUgY2FuIGZhaWwgaWYgdGhlIE5TQ29sb3IgaW4gcXVlc3Rpb24gaXMgYW4gTlNQYXR0ZXJuQ29s
b3IKKyAgICAvLyAoYXMgbWFueSBzeXN0ZW0gY29sb3JzIGFyZSkuIFRoZXNlIGNvbG9ycyBhcmUg
YWN0dWFsbHkgYSByZXBlYXRpbmcgcGF0dGVybgorICAgIC8vIG5vdCBqdXN0IGEgc29saWQgY29s
b3IuIFRvIHdvcmsgYXJvdW5kIHRoaXMgd2Ugc2ltcGx5IGRyYXcgYSAxeDEgaW1hZ2Ugb2YKKyAg
ICAvLyB0aGUgY29sb3IgYW5kIHVzZSB0aGF0IHBpeGVsJ3MgY29sb3IuIEl0IG1pZ2h0IGJlIGJl
dHRlciB0byB1c2UgYW4gYXZlcmFnZSBvZgorICAgIC8vIHRoZSBjb2xvcnMgaW4gdGhlIHBhdHRl
cm4gaW5zdGVhZC4KKyAgICBOU0JpdG1hcEltYWdlUmVwICpvZmZzY3JlZW5SZXAgPSBbW05TQml0
bWFwSW1hZ2VSZXAgYWxsb2NdIGluaXRXaXRoQml0bWFwRGF0YVBsYW5lczpuaWwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGl4ZWxzV2lkZToxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc0hpZ2g6
MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlOjgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBs
ZXNQZXJQaXhlbDo0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxwaGE6WUVTCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaXNQbGFuYXI6Tk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlTmFt
ZTpOU0RldmljZVJHQkNvbG9yU3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclJvdzo0
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBiaXRzUGVyUGl4ZWw6MzJdOworCisgICAgW05TR3JhcGhpY3ND
b250ZXh0IHNhdmVHcmFwaGljc1N0YXRlXTsKKyAgICBbTlNHcmFwaGljc0NvbnRleHQgc2V0Q3Vy
cmVudENvbnRleHQ6W05TR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhCaXRtYXBJ
bWFnZVJlcDpvZmZzY3JlZW5SZXBdXTsKKyAgICBOU0VyYXNlUmVjdChOU01ha2VSZWN0KDAsIDAs
IDEsIDEpKTsKKyAgICBbY29sb3IgZHJhd1N3YXRjaEluUmVjdDpOU01ha2VSZWN0KDAsIDAsIDEs
IDEpXTsKKyAgICBbTlNHcmFwaGljc0NvbnRleHQgcmVzdG9yZUdyYXBoaWNzU3RhdGVdOworCisg
ICAgTlNVSW50ZWdlciBwaXhlbFs0XTsKKyAgICBbb2Zmc2NyZWVuUmVwIGdldFBpeGVsOnBpeGVs
IGF0WDowIHk6MF07CisKKyAgICBbb2Zmc2NyZWVuUmVwIHJlbGVhc2VdOworCisgICAgcmV0dXJu
IG1ha2VSR0IocGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSk7Cit9CisKK3N0YXRpYyBSR0JB
MzIgbWVudUJhY2tncm91bmRDb2xvcigpCit7CisgICAgTlNCaXRtYXBJbWFnZVJlcCAqb2Zmc2Ny
ZWVuUmVwID0gW1tOU0JpdG1hcEltYWdlUmVwIGFsbG9jXSBpbml0V2l0aEJpdG1hcERhdGFQbGFu
ZXM6bmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1dpZGU6MQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBwaXhlbHNIaWdoOjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZTo4CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzYW1wbGVzUGVyUGl4ZWw6NAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0Fs
cGhhOllFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGxhbmFyOk5PCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnl0ZXNQZXJSb3c6NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclBpeGVsOjMyXTsKKwor
ICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0dDb250ZXh0UmVmPihbW05T
R3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhCaXRtYXBJbWFnZVJlcDpvZmZzY3Jl
ZW5SZXBdIGdyYXBoaWNzUG9ydF0pOworICAgIENHUmVjdCByZWN0ID0gQ0dSZWN0TWFrZSgwLCAw
LCAxLCAxKTsKKyAgICBISVRoZW1lTWVudURyYXdJbmZvIGRyYXdJbmZvOworICAgIGRyYXdJbmZv
LnZlcnNpb24gPSAgMDsKKyAgICBkcmF3SW5mby5tZW51VHlwZSA9IGtUaGVtZU1lbnVUeXBlUG9w
VXA7CisgICAgSElUaGVtZURyYXdNZW51QmFja2dyb3VuZCgmcmVjdCwgJmRyYXdJbmZvLCBjb250
ZXh0LCBrSElUaGVtZU9yaWVudGF0aW9uSW52ZXJ0ZWQpOworCisgICAgTlNVSW50ZWdlciBwaXhl
bFs0XTsKKyAgICBbb2Zmc2NyZWVuUmVwIGdldFBpeGVsOnBpeGVsIGF0WDowIHk6MF07CisKKyAg
ICBbb2Zmc2NyZWVuUmVwIHJlbGVhc2VdOworCisgICAgcmV0dXJuIG1ha2VSR0IocGl4ZWxbMF0s
IHBpeGVsWzFdLCBwaXhlbFsyXSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBs
YXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCkKK3sKKyAgICBtX3N5c3RlbUNvbG9yQ2FjaGUuY2xlYXIo
KTsKKyAgICBSZW5kZXJUaGVtZTo6cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30KKworQ29s
b3IgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1ZUlkKSBjb25z
dAoreworICAgIHsKKyAgICAgICAgSGFzaE1hcDxpbnQsIFJHQkEzMj46Oml0ZXJhdG9yIGl0ID0g
bV9zeXN0ZW1Db2xvckNhY2hlLmZpbmQoY3NzVmFsdWVJZCk7CisgICAgICAgIGlmIChpdCAhPSBt
X3N5c3RlbUNvbG9yQ2FjaGUuZW5kKCkpCisgICAgICAgICAgICByZXR1cm4gaXQtPnZhbHVlOwor
ICAgIH0KKworICAgIENvbG9yIGNvbG9yOworICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgeworICAg
ICAgICBjYXNlIENTU1ZhbHVlQWN0aXZlYm9yZGVyOgorICAgICAgICAgICAgY29sb3IgPSBjb252
ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Iga2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUFjdGl2ZWNhcHRpb246
CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5k
b3dGcmFtZVRleHRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NT
VmFsdWVBcHB3b3Jrc3BhY2U6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9D
b2xvcihbTlNDb2xvciBoZWFkZXJDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgQ1NTVmFsdWVCYWNrZ3JvdW5kOgorICAgICAgICAgICAgLy8gVXNlIHRoZW1lIGluZGVw
ZW5kZW50IGRlZmF1bHQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVl
QnV0dG9uZmFjZToKKyAgICAgICAgICAgIC8vIFdlIHVzZSB0aGlzIHZhbHVlIGluc3RlYWQgb2Yg
TlNDb2xvcidzIGNvbnRyb2xDb2xvciB0byBhdm9pZCB3ZWJzaXRlIGluY29tcGF0aWJpbGl0aWVz
LgorICAgICAgICAgICAgLy8gV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgdG8gdXNlIHRoZSBO
U0NvbG9yIGluIGZ1dHVyZS4KKyAgICAgICAgICAgIGNvbG9yID0gMHhGRkMwQzBDMDsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlQnV0dG9uaGlnaGxpZ2h0OgorICAg
ICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEhp
Z2hsaWdodENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1
ZUJ1dHRvbnNoYWRvdzoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9y
KFtOU0NvbG9yIGNvbnRyb2xTaGFkb3dDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgQ1NTVmFsdWVCdXR0b250ZXh0OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0
TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbFRleHRDb2xvcl0pOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVDYXB0aW9udGV4dDoKKyAgICAgICAgICAgIGNv
bG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVHcmF5dGV4dDoKKyAgICAgICAgICAg
IGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGRpc2FibGVkQ29udHJvbFRl
eHRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVIaWdo
bGlnaHQ6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xv
ciBzZWxlY3RlZFRleHRCYWNrZ3JvdW5kQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIENTU1ZhbHVlSGlnaGxpZ2h0dGV4dDoKKyAgICAgICAgICAgIGNvbG9yID0gY29u
dmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNlbGVjdGVkVGV4dENvbG9yXSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlYm9yZGVyOgorICAgICAg
ICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEJhY2tn
cm91bmRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVJ
bmFjdGl2ZWNhcHRpb246CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xv
cihbTlNDb2xvciBjb250cm9sQmFja2dyb3VuZENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlY2FwdGlvbnRleHQ6CisgICAgICAgICAgICBj
b2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3JdKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlSW5mb2JhY2tncm91bmQ6CisgICAg
ICAgICAgICAvLyBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIE5TQ29sb3IgZm9yIHRoaXMgc28g
d2UgdXNlIGEgaGFyZCBjb2RlZCB2YWx1ZS4KKyAgICAgICAgICAgIGNvbG9yID0gMHhGRkZCRkND
NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlSW5mb3RleHQ6Cisg
ICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29s
b3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlTWVudToKKyAg
ICAgICAgICAgIGNvbG9yID0gbWVudUJhY2tncm91bmRDb2xvcigpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVNZW51dGV4dDoKKyAgICAgICAgICAgIGNvbG9yID0g
Y29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNlbGVjdGVkTWVudUl0ZW1UZXh0Q29sb3Jd
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlU2Nyb2xsYmFyOgor
ICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igc2Nyb2xs
QmFyQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlVGV4
dDoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRl
eHRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJl
ZWRkYXJrc2hhZG93OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3Io
W05TQ29sb3IgY29udHJvbERhcmtTaGFkb3dDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRzaGFkb3c6CisgICAgICAgICAgICBjb2xvciA9IGNv
bnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzaGFkb3dDb2xvcl0pOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRmYWNlOgorICAgICAgICAgICAgLy8g
V2UgdXNlIHRoaXMgdmFsdWUgaW5zdGVhZCBvZiBOU0NvbG9yJ3MgY29udHJvbENvbG9yIHRvIGF2
b2lkIHdlYnNpdGUgaW5jb21wYXRpYmlsaXRpZXMuCisgICAgICAgICAgICAvLyBXZSBtYXkgd2Fu
dCB0byBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIE5TQ29sb3IgaW4gZnV0dXJlLgorICAgICAgICAg
ICAgY29sb3IgPSAweEZGQzBDMEMwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
Q1NTVmFsdWVUaHJlZWRoaWdobGlnaHQ6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0Nv
bG9yVG9Db2xvcihbTlNDb2xvciBoaWdobGlnaHRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRsaWdodHNoYWRvdzoKKyAgICAgICAgICAgIGNv
bG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xMaWdodEhpZ2hsaWdo
dENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dEZvY3VzUmluZ0NvbG9yOgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29s
b3IoW05TQ29sb3Iga2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdpbmRvdzoKKyAgICAgICAgICAgIGNvbG9yID0g
Y29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0JhY2tncm91bmRDb2xvcl0pOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3dmcmFtZToKKyAg
ICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0Zy
YW1lQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlV2lu
ZG93dGV4dDoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0Nv
bG9yIHdpbmRvd0ZyYW1lVGV4dENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisK
KyAgICBpZiAoIWNvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgY29sb3IgPSBSZW5kZXJUaGVtZTo6
c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7CisKKyAgICBpZiAoY29sb3IuaXNWYWxpZCgpKQorICAg
ICAgICBtX3N5c3RlbUNvbG9yQ2FjaGUuc2V0KGNzc1ZhbHVlSWQsIGNvbG9yLnJnYigpKTsKKwor
ICAgIHJldHVybiBjb2xvcjsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dXNlc1Rl
c3RNb2RlRm9jdXNSaW5nQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBXZWJDb3JlOjp1c2Vz
VGVzdE1vZGVGb2N1c1JpbmdDb2xvcigpOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVk
Ojppc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBCb3JkZXJE
YXRhJiBib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
RmlsbExheWVyJiBiYWNrZ3JvdW5kLCBjb25zdCBDb2xvciYgYmFja2dyb3VuZENvbG9yKSBjb25z
dAoreworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IFRleHRGaWVsZFBhcnQgfHwgc3R5
bGUtPmFwcGVhcmFuY2UoKSA9PSBUZXh0QXJlYVBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2UoKSA9
PSBMaXN0Ym94UGFydCkKKyAgICAgICAgcmV0dXJuIHN0eWxlLT5ib3JkZXIoKSAhPSBib3JkZXI7
CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBob3JyaWJsZSwgYnV0IHRoZXJlIGlzIG5vdCBtdWNo
IGVsc2UgdGhhdCBjYW4gYmUgZG9uZS4gIE1lbnUgbGlzdHMgY2Fubm90IGRyYXcgcHJvcGVybHkg
d2hlbgorICAgIC8vIHNjYWxlZC4gIFRoZXkgY2FuJ3QgcmVhbGx5IGRyYXcgcHJvcGVybHkgd2hl
biB0cmFuc2Zvcm1lZCBlaXRoZXIuICBXZSBjYW4ndCBkZXRlY3QgdGhlIHRyYW5zZm9ybSBjYXNl
IGF0IHN0eWxlCisgICAgLy8gYWRqdXN0bWVudCB0aW1lIHNvIHRoYXQgd2lsbCBqdXN0IGhhdmUg
dG8gc3RheSBicm9rZW4uICBXZSBjYW4gaG93ZXZlciBkZXRlY3QgdGhhdCB3ZSdyZSB6b29taW5n
LiAgSWYgem9vbWluZworICAgIC8vIGlzIGluIGVmZmVjdCB3ZSB0cmVhdCBpdCBsaWtlIHRoZSBj
b250cm9sIGlzIHN0eWxlZC4KKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlz
dFBhcnQgJiYgc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSAxLjBmKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIHJldHVybiBSZW5kZXJUaGVtZTo6aXNDb250cm9sU3R5bGVkKHN0eWxlLCBi
b3JkZXIsIGJhY2tncm91bmQsIGJhY2tncm91bmRDb2xvcik7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OmFkanVzdFJlcGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCogbywgSW50
UmVjdCYgcikKK3sKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpOworCisjaWYgVVNFKE5FV19USEVNRSkKKyAgICBzd2l0Y2ggKHBhcnQpIHsKKyAgICAgICAg
Y2FzZSBDaGVja2JveFBhcnQ6CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0OgorICAgICAgICBjYXNl
IFB1c2hCdXR0b25QYXJ0OgorICAgICAgICBjYXNlIFNxdWFyZUJ1dHRvblBhcnQ6CisgICAgICAg
IGNhc2UgRGVmYXVsdEJ1dHRvblBhcnQ6CisgICAgICAgIGNhc2UgQnV0dG9uUGFydDoKKyAgICAg
ICAgY2FzZSBJbm5lclNwaW5CdXR0b25QYXJ0OgorICAgICAgICAgICAgcmV0dXJuIFJlbmRlclRo
ZW1lOjphZGp1c3RSZXBhaW50UmVjdChvLCByKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5
bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworCisgICAgaWYgKHBhcnQgPT0gTWVudWxpc3RQYXJ0KSB7
CisgICAgICAgIHNldFBvcHVwQnV0dG9uQ2VsbFN0YXRlKG8sIHIpOworICAgICAgICBJbnRTaXpl
IHNpemUgPSBwb3B1cEJ1dHRvblNpemVzKClbW3BvcHVwQnV0dG9uKCkgY29udHJvbFNpemVdXTsK
KyAgICAgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7CisgICAg
ICAgIHNpemUuc2V0V2lkdGgoci53aWR0aCgpKTsKKyAgICAgICAgciA9IGluZmxhdGVSZWN0KHIs
IHNpemUsIHBvcHVwQnV0dG9uTWFyZ2lucygpLCB6b29tTGV2ZWwpOworICAgIH0KK30KKworSW50
UmVjdCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6aW5mbGF0ZVJlY3QoY29uc3QgSW50UmVjdCYgciwg
Y29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgaW50KiBtYXJnaW5zLCBmbG9hdCB6b29tTGV2ZWwp
IGNvbnN0Cit7CisgICAgLy8gT25seSBkbyB0aGUgaW5mbGF0aW9uIGlmIHRoZSBhdmFpbGFibGUg
d2lkdGgvaGVpZ2h0IGFyZSB0b28gc21hbGwuICBPdGhlcndpc2UgdHJ5IHRvCisgICAgLy8gZml0
IHRoZSBnbG93L2NoZWNrIHNwYWNlIGludG8gdGhlIGF2YWlsYWJsZSBib3gncyB3aWR0aC9oZWln
aHQuCisgICAgaW50IHdpZHRoRGVsdGEgPSByLndpZHRoKCkgLSAoc2l6ZS53aWR0aCgpICsgbWFy
Z2luc1tsZWZ0TWFyZ2luXSAqIHpvb21MZXZlbCArIG1hcmdpbnNbcmlnaHRNYXJnaW5dICogem9v
bUxldmVsKTsKKyAgICBpbnQgaGVpZ2h0RGVsdGEgPSByLmhlaWdodCgpIC0gKHNpemUuaGVpZ2h0
KCkgKyBtYXJnaW5zW3RvcE1hcmdpbl0gKiB6b29tTGV2ZWwgKyBtYXJnaW5zW2JvdHRvbU1hcmdp
bl0gKiB6b29tTGV2ZWwpOworICAgIEludFJlY3QgcmVzdWx0KHIpOworICAgIGlmICh3aWR0aERl
bHRhIDwgMCkgeworICAgICAgICByZXN1bHQuc2V0WChyZXN1bHQueCgpIC0gbWFyZ2luc1tsZWZ0
TWFyZ2luXSAqIHpvb21MZXZlbCk7CisgICAgICAgIHJlc3VsdC5zZXRXaWR0aChyZXN1bHQud2lk
dGgoKSAtIHdpZHRoRGVsdGEpOworICAgIH0KKyAgICBpZiAoaGVpZ2h0RGVsdGEgPCAwKSB7Cisg
ICAgICAgIHJlc3VsdC5zZXRZKHJlc3VsdC55KCkgLSBtYXJnaW5zW3RvcE1hcmdpbl0gKiB6b29t
TGV2ZWwpOworICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KHJlc3VsdC5oZWlnaHQoKSAtIGhlaWdo
dERlbHRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRmxvYXRSZWN0IFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpjb252ZXJ0VG9QYWludGluZ1JlY3QoY29uc3QgUmVuZGVyT2JqZWN0
KiBpbnB1dFJlbmRlcmVyLCBjb25zdCBSZW5kZXJPYmplY3QqIHBhcnRSZW5kZXJlciwgY29uc3Qg
RmxvYXRSZWN0JiBpbnB1dFJlY3QsIGNvbnN0IEludFJlY3QmIHIpIGNvbnN0Cit7CisgICAgRmxv
YXRSZWN0IHBhcnRSZWN0KGlucHV0UmVjdCk7CisKKyAgICAvLyBDb21wdXRlIGFuIG9mZnNldCBi
ZXR3ZWVuIHRoZSBwYXJ0IHJlbmRlcmVyIGFuZCB0aGUgaW5wdXQgcmVuZGVyZXIKKyAgICBGbG9h
dFNpemUgb2Zmc2V0RnJvbUlucHV0UmVuZGVyZXI7CisgICAgY29uc3QgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciA9IHBhcnRSZW5kZXJlcjsKKyAgICB3aGlsZSAocmVuZGVyZXIgJiYgcmVuZGVyZXIg
IT0gaW5wdXRSZW5kZXJlcikgeworICAgICAgICBSZW5kZXJPYmplY3QqIGNvbnRhaW5pbmdSZW5k
ZXJlciA9IHJlbmRlcmVyLT5jb250YWluZXIoKTsKKyAgICAgICAgb2Zmc2V0RnJvbUlucHV0UmVu
ZGVyZXIgLT0gcm91bmRlZEludFNpemUocmVuZGVyZXItPm9mZnNldEZyb21Db250YWluZXIoY29u
dGFpbmluZ1JlbmRlcmVyLCBMYXlvdXRQb2ludCgpKSk7CisgICAgICAgIHJlbmRlcmVyID0gY29u
dGFpbmluZ1JlbmRlcmVyOworICAgIH0KKyAgICAvLyBJZiB0aGUgaW5wdXQgcmVuZGVyZXIgd2Fz
IG5vdCBhIGNvbnRhaW5lciwgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICBBU1NFUlQocmVuZGVy
ZXIgPT0gaW5wdXRSZW5kZXJlcik7CisgICAgLy8gTW92ZSB0aGUgcmVjdCBpbnRvIHBhcnRSZW5k
ZXJlcidzIGNvb3JkcworICAgIHBhcnRSZWN0Lm1vdmUob2Zmc2V0RnJvbUlucHV0UmVuZGVyZXIp
OworICAgIC8vIEFjY291bnQgZm9yIHRoZSBsb2NhbCBkcmF3aW5nIG9mZnNldCAodHgsIHR5KQor
ICAgIHBhcnRSZWN0Lm1vdmUoci54KCksIHIueSgpKTsKKworICAgIHJldHVybiBwYXJ0UmVjdDsK
K30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2Vs
bCogY2VsbCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvKQoreworICAgIGJvb2wgb2xkSW5kZXRlcm1p
bmF0ZSA9IFtjZWxsIHN0YXRlXSA9PSBOU01peGVkU3RhdGU7CisgICAgYm9vbCBpbmRldGVybWlu
YXRlID0gaXNJbmRldGVybWluYXRlKG8pOworICAgIGJvb2wgY2hlY2tlZCA9IGlzQ2hlY2tlZChv
KTsKKworICAgIGlmIChvbGRJbmRldGVybWluYXRlICE9IGluZGV0ZXJtaW5hdGUpIHsKKyAgICAg
ICAgW2NlbGwgc2V0U3RhdGU6aW5kZXRlcm1pbmF0ZSA/IE5TTWl4ZWRTdGF0ZSA6IChjaGVja2Vk
ID8gTlNPblN0YXRlIDogTlNPZmZTdGF0ZSldOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgYm9vbCBvbGRDaGVja2VkID0gW2NlbGwgc3RhdGVdID09IE5TT25TdGF0ZTsKKyAgICBpZiAo
Y2hlY2tlZCAhPSBvbGRDaGVja2VkKQorICAgICAgICBbY2VsbCBzZXRTdGF0ZTpjaGVja2VkID8g
TlNPblN0YXRlIDogTlNPZmZTdGF0ZV07Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OnVwZGF0ZUVuYWJsZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykK
K3sKKyAgICBib29sIG9sZEVuYWJsZWQgPSBbY2VsbCBpc0VuYWJsZWRdOworICAgIGJvb2wgZW5h
YmxlZCA9IGlzRW5hYmxlZChvKTsKKyAgICBpZiAoZW5hYmxlZCAhPSBvbGRFbmFibGVkKQorICAg
ICAgICBbY2VsbCBzZXRFbmFibGVkOmVuYWJsZWRdOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjp1cGRhdGVGb2N1c2VkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJPYmpl
Y3QqIG8pCit7CisgICAgYm9vbCBvbGRGb2N1c2VkID0gW2NlbGwgc2hvd3NGaXJzdFJlc3BvbmRl
cl07CisgICAgYm9vbCBmb2N1c2VkID0gaXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91dGxp
bmVTdHlsZUlzQXV0bygpOworICAgIGlmIChmb2N1c2VkICE9IG9sZEZvY3VzZWQpCisgICAgICAg
IFtjZWxsIHNldFNob3dzRmlyc3RSZXNwb25kZXI6Zm9jdXNlZF07Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVNYWNTaGFyZWQ6OnVwZGF0ZVByZXNzZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJl
bmRlck9iamVjdCogbykKK3sKKyAgICBib29sIG9sZFByZXNzZWQgPSBbY2VsbCBpc0hpZ2hsaWdo
dGVkXTsKKyAgICBib29sIHByZXNzZWQgPSAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+YWN0aXZl
KCkpOworICAgIGlmIChwcmVzc2VkICE9IG9sZFByZXNzZWQpCisgICAgICAgIFtjZWxsIHNldEhp
Z2hsaWdodGVkOnByZXNzZWRdOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpjb250
cm9sU3VwcG9ydHNUaW50cyhjb25zdCBSZW5kZXJPYmplY3QqIG8pIGNvbnN0Cit7CisgICAgLy8g
QW4gYWx0ZXJuYXRlIHdheSB0byBpbXBsZW1lbnQgdGhpcyB3b3VsZCBiZSB0byBnZXQgdGhlIGFw
cHJvcHJpYXRlIGNlbGwgb2JqZWN0CisgICAgLy8gYW5kIGNhbGwgdGhlIHByaXZhdGUgX25lZWRS
ZWRyYXdPbldpbmRvd0NoYW5nZWRLZXlTdGF0ZSBtZXRob2QuIEFuIGFkdmFudGFnZSBvZgorICAg
IC8vIHRoYXQgd291bGQgYmUgdGhhdCB3ZSB3b3VsZCBtYXRjaCBBcHBLaXQgYmVoYXZpb3IgbW9y
ZSBjbG9zZWx5LCBidXQgYSBkaXNhZHZhbnRhZ2UKKyAgICAvLyB3b3VsZCBiZSB0aGF0IHdlIHdv
dWxkIHJlbHkgb24gYW4gQXBwS2l0IFNQSSBtZXRob2QuCisKKyAgICBpZiAoIWlzRW5hYmxlZChv
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ2hlY2tib3hlcyBvbmx5IGhhdmUg
dGludCB3aGVuIGNoZWNrZWQuCisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBD
aGVja2JveFBhcnQpCisgICAgICAgIHJldHVybiBpc0NoZWNrZWQobyk7CisKKyAgICAvLyBGb3Ig
bm93IGFzc3VtZSBvdGhlciBjb250cm9scyBoYXZlIHRpbnQgaWYgZW5hYmxlZC4KKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworTlNDb250cm9sU2l6ZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udHJv
bFNpemVGb3JGb250KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgZm9udFNp
emUgPSBzdHlsZS0+Zm9udFNpemUoKTsKKyAgICBpZiAoZm9udFNpemUgPj0gMTYpCisgICAgICAg
IHJldHVybiBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKKyAgICBpZiAoZm9udFNpemUgPj0gMTEpCisg
ICAgICAgIHJldHVybiBOU1NtYWxsQ29udHJvbFNpemU7CisgICAgcmV0dXJuIE5TTWluaUNvbnRy
b2xTaXplOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzZXRDb250cm9sU2l6ZShO
U0NlbGwqIGNlbGwsIGNvbnN0IEludFNpemUqIHNpemVzLCBjb25zdCBJbnRTaXplJiBtaW5TaXpl
LCBmbG9hdCB6b29tTGV2ZWwpCit7CisgICAgTlNDb250cm9sU2l6ZSBzaXplOworICAgIGlmICht
aW5TaXplLndpZHRoKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1JlZ3VsYXJDb250cm9s
U2l6ZV0ud2lkdGgoKSAqIHpvb21MZXZlbCkgJiYKKyAgICAgICAgbWluU2l6ZS5oZWlnaHQoKSA+
PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TUmVndWxhckNvbnRyb2xTaXplXS5oZWlnaHQoKSAq
IHpvb21MZXZlbCkpCisgICAgICAgIHNpemUgPSBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKKyAgICBl
bHNlIGlmIChtaW5TaXplLndpZHRoKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1NtYWxs
Q29udHJvbFNpemVdLndpZHRoKCkgKiB6b29tTGV2ZWwpICYmCisgICAgICAgICAgICAgbWluU2l6
ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TU21hbGxDb250cm9sU2l6ZV0u
aGVpZ2h0KCkgKiB6b29tTGV2ZWwpKQorICAgICAgICBzaXplID0gTlNTbWFsbENvbnRyb2xTaXpl
OworICAgIGVsc2UKKyAgICAgICAgc2l6ZSA9IE5TTWluaUNvbnRyb2xTaXplOworICAgIGlmIChz
aXplICE9IFtjZWxsIGNvbnRyb2xTaXplXSkgLy8gT25seSB1cGRhdGUgaWYgd2UgaGF2ZSB0bywg
c2luY2UgQXBwS2l0IGRvZXMgd29yayBldmVuIGlmIHRoZSBzaXplIGlzIHRoZSBzYW1lLgorICAg
ICAgICBbY2VsbCBzZXRDb250cm9sU2l6ZTpzaXplXTsKK30KKworSW50U2l6ZSBSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2l6ZUZvckZvbnQoUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBJbnRTaXpl
KiBzaXplcykgY29uc3QKK3sKKyAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSAxLjBm
KSB7CisgICAgICAgIEludFNpemUgcmVzdWx0ID0gc2l6ZXNbY29udHJvbFNpemVGb3JGb250KHN0
eWxlKV07CisgICAgICAgIHJldHVybiBJbnRTaXplKHJlc3VsdC53aWR0aCgpICogc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKSwgcmVzdWx0LmhlaWdodCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7
CisgICAgfQorICAgIHJldHVybiBzaXplc1tjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpXTsKK30K
KworSW50U2l6ZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2l6ZUZvclN5c3RlbUZvbnQoUmVuZGVy
U3R5bGUqIHN0eWxlLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3QKK3sKKyAgICBpZiAoc3R5
bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSAxLjBmKSB7CisgICAgICAgIEludFNpemUgcmVzdWx0ID0g
c2l6ZXNbY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KHN0eWxlKV07CisgICAgICAgIHJldHVybiBJ
bnRTaXplKHJlc3VsdC53aWR0aCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSwgcmVzdWx0Lmhl
aWdodCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7CisgICAgfQorICAgIHJldHVybiBzaXpl
c1tjb250cm9sU2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUpXTsKK30KKwordm9pZCBSZW5kZXJUaGVt
ZU1hY1NoYXJlZDo6c2V0U2l6ZUZyb21Gb250KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50
U2l6ZSogc2l6ZXMpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IENoZWNrIGlzIGZsYXdlZCwgc2lu
Y2UgaXQgZG9lc24ndCB0YWtlIG1pbi13aWR0aC9tYXgtd2lkdGggaW50byBhY2NvdW50LgorICAg
IEludFNpemUgc2l6ZSA9IHNpemVGb3JGb250KHN0eWxlLCBzaXplcyk7CisgICAgaWYgKHN0eWxl
LT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgc2l6ZS53aWR0aCgpID4gMCkKKyAgICAg
ICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAgaWYg
KHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSAmJiBzaXplLmhlaWdodCgpID4gMCkKKyAgICAgICAg
c3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKK30KKwordm9p
ZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2V0Rm9udEZyb21Db250cm9sU2l6ZShTdHlsZVJlc29s
dmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKSBjb25z
dAoreworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgZm9udERlc2Ny
aXB0aW9uLnNldElzQWJzb2x1dGVTaXplKHRydWUpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRH
ZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHkpOworCisgICAgTlNGb250
KiBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVG
b3JDb250cm9sU2l6ZTpjb250cm9sU2l6ZV1dOworICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZh
bWlseSgpLnNldEZhbWlseShbZm9udCBmYW1pbHlOYW1lXSk7CisgICAgZm9udERlc2NyaXB0aW9u
LnNldENvbXB1dGVkU2l6ZShbZm9udCBwb2ludFNpemVdICogc3R5bGUtPmVmZmVjdGl2ZVpvb20o
KSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoW2ZvbnQgcG9pbnRTaXpl
XSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpOworCisgICAgLy8gUmVzZXQgbGluZSBoZWlnaHQK
KyAgICBzdHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQo
KSk7CisKKyAgICBpZiAoc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24p
KQorICAgICAgICBzdHlsZS0+Zm9udCgpLnVwZGF0ZSgwKTsKK30KKworTlNDb250cm9sU2l6ZSBS
ZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udHJvbFNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxl
KiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgZm9udFNpemUgPSBzdHlsZS0+Zm9udFNpemUoKTsK
KyAgICBpZiAoZm9udFNpemUgPj0gW05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXpl
Ok5TUmVndWxhckNvbnRyb2xTaXplXSkKKyAgICAgICAgcmV0dXJuIE5TUmVndWxhckNvbnRyb2xT
aXplOworICAgIGlmIChmb250U2l6ZSA+PSBbTlNGb250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJv
bFNpemU6TlNTbWFsbENvbnRyb2xTaXplXSkKKyAgICAgICAgcmV0dXJuIE5TU21hbGxDb250cm9s
U2l6ZTsKKyAgICByZXR1cm4gTlNNaW5pQ29udHJvbFNpemU7Cit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVNYWNTaGFyZWQ6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgTG9jYWxDdXJyZW50R3Jh
cGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisKKyNpZiBfX01B
Q19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDw9IDEwNzAKKyAgICBib29sIHVzZU5TVGV4dEZp
ZWxkQ2VsbCA9IG8tPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKQorICAgICAgICAmJiBvLT5zdHls
ZSgpLT52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpID09
IENvbG9yOjp3aGl0ZQorICAgICAgICAmJiAhby0+c3R5bGUoKS0+aGFzQmFja2dyb3VuZEltYWdl
KCk7CisKKyAgICAvLyBXZSBkbyBub3QgdXNlIE5TVGV4dEZpZWxkQ2VsbCB0byBkcmF3IHN0eWxl
ZCB0ZXh0IGZpZWxkcyBvbiBMaW9uIGFuZCBTbm93TGVvcGFyZCBiZWNhdXNlCisgICAgLy8gdGhl
cmUgYXJlIGEgbnVtYmVyIG9mIGJ1Z3Mgb24gdGhvc2UgcGxhdGZvcm1zIHRoYXQgcmVxdWlyZSBO
U1RleHRGaWVsZENlbGwgdG8gYmUgaW4gY2hhcmdlCisgICAgLy8gb2YgcGFpbnRpbmcgaXRzIG93
biBiYWNrZ3JvdW5kLiBXZSBuZWVkIFdlYkNvcmUgdG8gcGFpbnQgc3R5bGVkIGJhY2tncm91bmRz
LCBzbyB3ZSdsbCB1c2UKKyAgICAvLyB0aGlzIFdlYkNvcmVTeXN0ZW1JbnRlcmZhY2UgZnVuY3Rp
b24gaW5zdGVhZC4KKyAgICBpZiAoIXVzZU5TVGV4dEZpZWxkQ2VsbCkgeworICAgICAgICB3a0Ry
YXdCZXplbGVkVGV4dEZpZWxkQ2VsbChyLCBpc0VuYWJsZWQobykgJiYgIWlzUmVhZE9ubHlDb250
cm9sKG8pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgTlNU
ZXh0RmllbGRDZWxsICp0ZXh0RmllbGQgPSB0aGlzLT50ZXh0RmllbGQoKTsKKworICAgIEdyYXBo
aWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworCisg
ICAgW3RleHRGaWVsZCBzZXRFbmFibGVkOihpc0VuYWJsZWQobykgJiYgIWlzUmVhZE9ubHlDb250
cm9sKG8pKV07CisgICAgW3RleHRGaWVsZCBkcmF3V2l0aEZyYW1lOk5TUmVjdChyKSBpblZpZXc6
ZG9jdW1lbnRWaWV3Rm9yKG8pXTsKKworICAgIFt0ZXh0RmllbGQgc2V0Q29udHJvbFZpZXc6bmls
XTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
YWRqdXN0VGV4dEZpZWxkU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVu
dCopIGNvbnN0Cit7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50Q2Fwc0xv
Y2tJbmRpY2F0b3IoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmIHIpCit7CisgICAgaWYgKHBhaW50SW5mby5jb250ZXh0LT5wYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhp
Y3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgd2tEcmF3Q2Fw
c0xvY2tJbmRpY2F0b3IobG9jYWxDb250ZXh0LmNnQ29udGV4dCgpLCByKTsKKworICAgIHJldHVy
biBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRUZXh0QXJlYShS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQoreworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFp
bnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJhd0JlemVsZWRUZXh0QXJlYShyLCBpc0VuYWJsZWQo
bykgJiYgIWlzUmVhZE9ubHlDb250cm9sKG8pKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZl
ciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0Cit7Cit9CisKK2NvbnN0IGludCogUmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwQnV0dG9uTWFyZ2lucygpIGNvbnN0Cit7CisgICAgc3Rh
dGljIGNvbnN0IGludCBtYXJnaW5zWzNdWzRdID0KKyAgICB7CisgICAgICAgIHsgMCwgMywgMSwg
MyB9LAorICAgICAgICB7IDAsIDMsIDIsIDMgfSwKKyAgICAgICAgeyAwLCAxLCAwLCAxIH0KKyAg
ICB9OworICAgIHJldHVybiBtYXJnaW5zW1twb3B1cEJ1dHRvbigpIGNvbnRyb2xTaXplXV07Cit9
CisKK2NvbnN0IEludFNpemUqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwb3B1cEJ1dHRvblNpemVz
KCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6
ZSgwLCAyMSksIEludFNpemUoMCwgMTgpLCBJbnRTaXplKDAsIDE1KSB9OworICAgIHJldHVybiBz
aXplczsKK30KKworY29uc3QgaW50KiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBCdXR0b25Q
YWRkaW5nKE5TQ29udHJvbFNpemUgc2l6ZSkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50
IHBhZGRpbmdbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAyLCAyNiwgMywgOCB9LAorICAgICAg
ICB7IDIsIDIzLCAzLCA4IH0sCisgICAgICAgIHsgMiwgMjIsIDMsIDEwIH0KKyAgICB9OworICAg
IHJldHVybiBwYWRkaW5nW3NpemVdOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpw
YWludE1lbnVMaXN0KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8s
IGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxv
Y2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgc2V0UG9wdXBCdXR0b25DZWxsU3Rh
dGUobywgcik7CisKKyAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBCdXR0b24gPSB0aGlzLT5w
b3B1cEJ1dHRvbigpOworCisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0
aXZlWm9vbSgpOworICAgIEludFNpemUgc2l6ZSA9IHBvcHVwQnV0dG9uU2l6ZXMoKVtbcG9wdXBC
dXR0b24gY29udHJvbFNpemVdXTsKKyAgICBzaXplLnNldEhlaWdodChzaXplLmhlaWdodCgpICog
em9vbUxldmVsKTsKKyAgICBzaXplLnNldFdpZHRoKHIud2lkdGgoKSk7CisKKyAgICAvLyBOb3cg
aW5mbGF0ZSBpdCB0byBhY2NvdW50IGZvciB0aGUgc2hhZG93LgorICAgIEludFJlY3QgaW5mbGF0
ZWRSZWN0ID0gcjsKKyAgICBpZiAoci53aWR0aCgpID49IG1pbmltdW1NZW51TGlzdFNpemUoby0+
c3R5bGUoKSkpCisgICAgICAgIGluZmxhdGVkUmVjdCA9IGluZmxhdGVSZWN0KGluZmxhdGVkUmVj
dCwgc2l6ZSwgcG9wdXBCdXR0b25NYXJnaW5zKCksIHpvb21MZXZlbCk7CisKKyAgICBHcmFwaGlj
c0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKworICAg
IC8vIE9uIExlb3BhcmQsIHRoZSBjZWxsIHdpbGwgZHJhdyBvdXRzaWRlIG9mIHRoZSBnaXZlbiBy
ZWN0LCBzbyB3ZSBoYXZlIHRvIGNsaXAgdG8gdGhlIHJlY3QKKyAgICBwYWludEluZm8uY29udGV4
dC0+Y2xpcChpbmZsYXRlZFJlY3QpOworCisgICAgaWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7Cisg
ICAgICAgIGluZmxhdGVkUmVjdC5zZXRXaWR0aChpbmZsYXRlZFJlY3Qud2lkdGgoKSAvIHpvb21M
ZXZlbCk7CisgICAgICAgIGluZmxhdGVkUmVjdC5zZXRIZWlnaHQoaW5mbGF0ZWRSZWN0LmhlaWdo
dCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZShp
bmZsYXRlZFJlY3QueCgpLCBpbmZsYXRlZFJlY3QueSgpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOworICAgICAgICBw
YWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC1pbmZsYXRlZFJlY3QueCgpLCAtaW5mbGF0ZWRS
ZWN0LnkoKSk7CisgICAgfQorCisgICAgTlNWaWV3ICp2aWV3ID0gZG9jdW1lbnRWaWV3Rm9yKG8p
OworICAgIFtwb3B1cEJ1dHRvbiBkcmF3V2l0aEZyYW1lOmluZmxhdGVkUmVjdCBpblZpZXc6dmll
d107CisjaWYgIUJVVFRPTl9DRUxMX0RSQVdfV0lUSF9GUkFNRV9EUkFXU19GT0NVU19SSU5HCisg
ICAgaWYgKGlzRm9jdXNlZChvKSAmJiBvLT5zdHlsZSgpLT5vdXRsaW5lU3R5bGVJc0F1dG8oKSkK
KyAgICAgICAgW3BvcHVwQnV0dG9uIF93ZWJfZHJhd0ZvY3VzUmluZ1dpdGhGcmFtZTppbmZsYXRl
ZFJlY3QgaW5WaWV3OnZpZXddOworI2VuZGlmCisgICAgW3BvcHVwQnV0dG9uIHNldENvbnRyb2xW
aWV3Om5pbF07CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZiBFTkFCTEUoTUVURVJfRUxF
TUVOVCkKKworSW50U2l6ZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bWV0ZXJTaXplRm9yQm91bmRz
KGNvbnN0IFJlbmRlck1ldGVyKiByZW5kZXJNZXRlciwgY29uc3QgSW50UmVjdCYgYm91bmRzKSBj
b25zdAoreworICAgIGlmIChOb0NvbnRyb2xQYXJ0ID09IHJlbmRlck1ldGVyLT5zdHlsZSgpLT5h
cHBlYXJhbmNlKCkpCisgICAgICAgIHJldHVybiBib3VuZHMuc2l6ZSgpOworCisgICAgTlNMZXZl
bEluZGljYXRvckNlbGwqIGNlbGwgPSBsZXZlbEluZGljYXRvckZvcihyZW5kZXJNZXRlcik7Cisg
ICAgLy8gTWFrZXMgZW5vdWdoIHJvb20gZm9yIGNlbGwncyBpbnRyaW5zaWMgc2l6ZS4KKyAgICBO
U1NpemUgY2VsbFNpemUgPSBbY2VsbCBjZWxsU2l6ZUZvckJvdW5kczpJbnRSZWN0KEludFBvaW50
KCksIGJvdW5kcy5zaXplKCkpXTsKKyAgICByZXR1cm4gSW50U2l6ZShib3VuZHMud2lkdGgoKSA8
IGNlbGxTaXplLndpZHRoID8gY2VsbFNpemUud2lkdGggOiBib3VuZHMud2lkdGgoKSwKKyAgICAg
ICAgICAgICAgICAgICBib3VuZHMuaGVpZ2h0KCkgPCBjZWxsU2l6ZS5oZWlnaHQgPyBjZWxsU2l6
ZS5oZWlnaHQgOiBib3VuZHMuaGVpZ2h0KCkpOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpwYWludE1ldGVyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIXJlbmRlck9i
amVjdC0+aXNNZXRlcigpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIExvY2FsQ3VycmVu
dEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworCisgICAg
TlNMZXZlbEluZGljYXRvckNlbGwqIGNlbGwgPSBsZXZlbEluZGljYXRvckZvcih0b1JlbmRlck1l
dGVyKHJlbmRlck9iamVjdCkpOworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVT
YXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworCisgICAgW2NlbGwgZHJhd1dpdGhGcmFtZTpyZWN0
IGluVmlldzpkb2N1bWVudFZpZXdGb3IocmVuZGVyT2JqZWN0KV07CisgICAgW2NlbGwgc2V0Q29u
dHJvbFZpZXc6bmlsXTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OnN1cHBvcnRzTWV0ZXIoQ29udHJvbFBhcnQgcGFydCkgY29uc3QKK3sKKyAgICBz
d2l0Y2ggKHBhcnQpIHsKKyAgICBjYXNlIFJlbGV2YW5jeUxldmVsSW5kaWNhdG9yUGFydDoKKyAg
ICBjYXNlIERpc2NyZXRlQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6CisgICAgY2FzZSBSYXRp
bmdMZXZlbEluZGljYXRvclBhcnQ6CisgICAgY2FzZSBNZXRlclBhcnQ6CisgICAgY2FzZSBDb250
aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK05TTGV2ZWxJ
bmRpY2F0b3JTdHlsZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bGV2ZWxJbmRpY2F0b3JTdHlsZUZv
cihDb250cm9sUGFydCBwYXJ0KSBjb25zdAoreworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNh
c2UgUmVsZXZhbmN5TGV2ZWxJbmRpY2F0b3JQYXJ0OgorICAgICAgICByZXR1cm4gTlNSZWxldmFu
Y3lMZXZlbEluZGljYXRvclN0eWxlOworICAgIGNhc2UgRGlzY3JldGVDYXBhY2l0eUxldmVsSW5k
aWNhdG9yUGFydDoKKyAgICAgICAgcmV0dXJuIE5TRGlzY3JldGVDYXBhY2l0eUxldmVsSW5kaWNh
dG9yU3R5bGU7CisgICAgY2FzZSBSYXRpbmdMZXZlbEluZGljYXRvclBhcnQ6CisgICAgICAgIHJl
dHVybiBOU1JhdGluZ0xldmVsSW5kaWNhdG9yU3R5bGU7CisgICAgY2FzZSBNZXRlclBhcnQ6Cisg
ICAgY2FzZSBDb250aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6CisgICAgZGVmYXVs
dDoKKyAgICAgICAgcmV0dXJuIE5TQ29udGludW91c0NhcGFjaXR5TGV2ZWxJbmRpY2F0b3JTdHls
ZTsKKyAgICB9CisKK30KKworTlNMZXZlbEluZGljYXRvckNlbGwqIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpsZXZlbEluZGljYXRvckZvcihjb25zdCBSZW5kZXJNZXRlciogcmVuZGVyTWV0ZXIpIGNv
bnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcmVuZGVyTWV0ZXItPnN0eWxlKCk7Cisg
ICAgQVNTRVJUKHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gTm9Db250cm9sUGFydCk7CisKKyAgICBp
ZiAoIW1fbGV2ZWxJbmRpY2F0b3IpCisgICAgICAgIG1fbGV2ZWxJbmRpY2F0b3IuYWRvcHROUyhb
W05TTGV2ZWxJbmRpY2F0b3JDZWxsIGFsbG9jXSBpbml0V2l0aExldmVsSW5kaWNhdG9yU3R5bGU6
TlNDb250aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclN0eWxlXSk7CisgICAgTlNMZXZlbElu
ZGljYXRvckNlbGwqIGNlbGwgPSBtX2xldmVsSW5kaWNhdG9yLmdldCgpOworCisgICAgSFRNTE1l
dGVyRWxlbWVudCogZWxlbWVudCA9IHJlbmRlck1ldGVyLT5tZXRlckVsZW1lbnQoKTsKKyAgICBk
b3VibGUgdmFsdWUgPSBlbGVtZW50LT52YWx1ZSgpOworCisgICAgLy8gQmVjYXVzZSBOU0xldmVs
SW5kaWNhdG9yQ2VsbCBkb2VzIG5vdCBzdXBwb3J0IG9wdGltdW0taW4tdGhlLW1pZGRsZSB0eXBl
IGNvbG9yaW5nLAorICAgIC8vIHdlIGV4cGxpY2l0bHkgY29udHJvbCB0aGUgY29sb3IgaW5zdGVh
ZCBnaXZpbmcgbG93IGFuZCBoaWdoIHZhbHVlIHRvIE5TTGV2ZWxJbmRpY2F0b3JDZWxsIGFzIGlz
LgorICAgIHN3aXRjaCAoZWxlbWVudC0+Z2F1Z2VSZWdpb24oKSkgeworICAgIGNhc2UgSFRNTE1l
dGVyRWxlbWVudDo6R2F1Z2VSZWdpb25PcHRpbXVtOgorICAgICAgICAvLyBNYWtlIG1ldGVyIHRo
ZSBncmVlbgorICAgICAgICBbY2VsbCBzZXRXYXJuaW5nVmFsdWU6dmFsdWUgKyAxXTsKKyAgICAg
ICAgW2NlbGwgc2V0Q3JpdGljYWxWYWx1ZTp2YWx1ZSArIDJdOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIEhUTUxNZXRlckVsZW1lbnQ6OkdhdWdlUmVnaW9uU3Vib3B0aW1hbDoKKyAgICAgICAg
Ly8gTWFrZSB0aGUgbWV0ZXIgeWVsbG93CisgICAgICAgIFtjZWxsIHNldFdhcm5pbmdWYWx1ZTp2
YWx1ZSAtIDFdOworICAgICAgICBbY2VsbCBzZXRDcml0aWNhbFZhbHVlOnZhbHVlICsgMV07Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgSFRNTE1ldGVyRWxlbWVudDo6R2F1Z2VSZWdpb25FdmVu
TGVzc0dvb2Q6CisgICAgICAgIC8vIE1ha2UgdGhlIG1ldGVyIHJlZAorICAgICAgICBbY2VsbCBz
ZXRXYXJuaW5nVmFsdWU6dmFsdWUgLSAyXTsKKyAgICAgICAgW2NlbGwgc2V0Q3JpdGljYWxWYWx1
ZTp2YWx1ZSAtIDFdOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBbY2VsbCBzZXRMZXZl
bEluZGljYXRvclN0eWxlOmxldmVsSW5kaWNhdG9yU3R5bGVGb3Ioc3R5bGUtPmFwcGVhcmFuY2Uo
KSldOworICAgIFtjZWxsIHNldEJhc2VXcml0aW5nRGlyZWN0aW9uOnN0eWxlLT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkgPyBOU1dyaXRpbmdEaXJlY3Rpb25MZWZ0VG9SaWdodCA6IE5TV3JpdGlu
Z0RpcmVjdGlvblJpZ2h0VG9MZWZ0XTsKKyAgICBbY2VsbCBzZXRNaW5WYWx1ZTplbGVtZW50LT5t
aW4oKV07CisgICAgW2NlbGwgc2V0TWF4VmFsdWU6ZWxlbWVudC0+bWF4KCldOworICAgIFJldGFp
blB0cjxOU051bWJlcj4gdmFsdWVPYmplY3QgPSBbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTp2
YWx1ZV07CisgICAgW2NlbGwgc2V0T2JqZWN0VmFsdWU6dmFsdWVPYmplY3QuZ2V0KCldOworCisg
ICAgcmV0dXJuIGNlbGw7Cit9CisKKyNlbmRpZgorCisjaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1F
TlQpCitjb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cHJvZ3Jlc3NCYXJTaXpl
cygpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNp
emUoMCwgMjApLCBJbnRTaXplKDAsIDEyKSwgSW50U2l6ZSgwLCAxMikgfTsKKyAgICByZXR1cm4g
c2l6ZXM7Cit9CisKK2NvbnN0IGludCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnByb2dyZXNzQmFy
TWFyZ2lucyhOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKSBjb25zdAoreworICAgIHN0YXRpYyBj
b25zdCBpbnQgbWFyZ2luc1szXVs0XSA9CisgICAgeworICAgICAgICB7IDAsIDAsIDEsIDAgfSwK
KyAgICAgICAgeyAwLCAwLCAxLCAwIH0sCisgICAgICAgIHsgMCwgMCwgMSwgMCB9LAorICAgIH07
CisgICAgcmV0dXJuIG1hcmdpbnNbY29udHJvbFNpemVdOworfQorCitpbnQgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6Om1pbmltdW1Qcm9ncmVzc0JhckhlaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCBwcm9ncmVzc0JhclNp
emVzKCkpLmhlaWdodCgpOworfQorCitkb3VibGUgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFuaW1h
dGlvblJlcGVhdEludGVydmFsRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdAor
eworICAgIHJldHVybiBwcm9ncmVzc0FuaW1hdGlvbkZyYW1lUmF0ZTsKK30KKworZG91YmxlIFJl
bmRlclRoZW1lTWFjU2hhcmVkOjphbmltYXRpb25EdXJhdGlvbkZvclByb2dyZXNzQmFyKFJlbmRl
clByb2dyZXNzKikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRpb25OdW1GcmFt
ZXMgKiBwcm9ncmVzc0FuaW1hdGlvbkZyYW1lUmF0ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6YWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3QKK3sKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
cGFpbnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFyZW5kZXJP
YmplY3QtPmlzUHJvZ3Jlc3MoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmbG9hdCB6
b29tTGV2ZWwgPSByZW5kZXJPYmplY3QtPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBp
bnQgY29udHJvbFNpemUgPSBjb250cm9sU2l6ZUZvckZvbnQocmVuZGVyT2JqZWN0LT5zdHlsZSgp
KTsKKyAgICBJbnRTaXplIHNpemUgPSBwcm9ncmVzc0JhclNpemVzKClbY29udHJvbFNpemVdOwor
ICAgIHNpemUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tTGV2ZWwpOworICAgIHNpemUu
c2V0V2lkdGgocmVjdC53aWR0aCgpKTsKKworICAgIC8vIE5vdyBpbmZsYXRlIGl0IHRvIGFjY291
bnQgZm9yIHRoZSBzaGFkb3cuCisgICAgSW50UmVjdCBpbmZsYXRlZFJlY3QgPSByZWN0OworICAg
IGlmIChyZWN0LmhlaWdodCgpIDw9IG1pbmltdW1Qcm9ncmVzc0JhckhlaWdodChyZW5kZXJPYmpl
Y3QtPnN0eWxlKCkpKQorICAgICAgICBpbmZsYXRlZFJlY3QgPSBpbmZsYXRlUmVjdChpbmZsYXRl
ZFJlY3QsIHNpemUsIHByb2dyZXNzQmFyTWFyZ2lucyhjb250cm9sU2l6ZSksIHpvb21MZXZlbCk7
CisKKyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0b1JlbmRlclByb2dyZXNz
KHJlbmRlck9iamVjdCk7CisgICAgSElUaGVtZVRyYWNrRHJhd0luZm8gdHJhY2tJbmZvOworICAg
IHRyYWNrSW5mby52ZXJzaW9uID0gMDsKKyAgICBpZiAoY29udHJvbFNpemUgPT0gTlNSZWd1bGFy
Q29udHJvbFNpemUpCisgICAgICAgIHRyYWNrSW5mby5raW5kID0gcmVuZGVyUHJvZ3Jlc3MtPnBv
c2l0aW9uKCkgPCAwID8ga1RoZW1lTGFyZ2VJbmRldGVybWluYXRlQmFyIDoga1RoZW1lTGFyZ2VQ
cm9ncmVzc0JhcjsKKyAgICBlbHNlCisgICAgICAgIHRyYWNrSW5mby5raW5kID0gcmVuZGVyUHJv
Z3Jlc3MtPnBvc2l0aW9uKCkgPCAwID8ga1RoZW1lTWVkaXVtSW5kZXRlcm1pbmF0ZUJhciA6IGtU
aGVtZU1lZGl1bVByb2dyZXNzQmFyOworCisgICAgdHJhY2tJbmZvLmJvdW5kcyA9IEludFJlY3Qo
SW50UG9pbnQoKSwgaW5mbGF0ZWRSZWN0LnNpemUoKSk7CisgICAgdHJhY2tJbmZvLm1pbiA9IDA7
CisgICAgdHJhY2tJbmZvLm1heCA9IG51bWVyaWNfbGltaXRzPFNJbnQzMj46Om1heCgpOworICAg
IHRyYWNrSW5mby52YWx1ZSA9IGxyb3VuZChyZW5kZXJQcm9ncmVzcy0+cG9zaXRpb24oKSAqIG5l
eHRhZnRlcih0cmFja0luZm8ubWF4LCAwKSk7CisgICAgdHJhY2tJbmZvLnRyYWNrSW5mby5wcm9n
cmVzcy5waGFzZSA9IGxyb3VuZChyZW5kZXJQcm9ncmVzcy0+YW5pbWF0aW9uUHJvZ3Jlc3MoKSAq
IG5leHRhZnRlcihwcm9ncmVzc0FuaW1hdGlvbk51bUZyYW1lcywgMCkpOworICAgIHRyYWNrSW5m
by5hdHRyaWJ1dGVzID0ga1RoZW1lVHJhY2tIb3Jpem9udGFsOworICAgIHRyYWNrSW5mby5lbmFi
bGVTdGF0ZSA9IGlzQWN0aXZlKHJlbmRlck9iamVjdCkgPyBrVGhlbWVUcmFja0FjdGl2ZSA6IGtU
aGVtZVRyYWNrSW5hY3RpdmU7CisgICAgdHJhY2tJbmZvLnJlc2VydmVkID0gMDsKKyAgICB0cmFj
a0luZm8uZmlsbGVyMSA9IDA7CisKKyAgICBPd25QdHI8SW1hZ2VCdWZmZXI+IGltYWdlQnVmZmVy
ID0gSW1hZ2VCdWZmZXI6OmNyZWF0ZShpbmZsYXRlZFJlY3Quc2l6ZSgpLCAxKTsKKyAgICBpZiAo
IWltYWdlQnVmZmVyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIENvbnRleHRDb250YWlu
ZXIgY2dDb250ZXh0Q29udGFpbmVyKGltYWdlQnVmZmVyLT5jb250ZXh0KCkpOworICAgIENHQ29u
dGV4dFJlZiBjZ0NvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOworICAgIEhJ
VGhlbWVEcmF3VHJhY2soJnRyYWNrSW5mbywgMCwgY2dDb250ZXh0LCBrSElUaGVtZU9yaWVudGF0
aW9uTm9ybWFsKTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigq
cGFpbnRJbmZvLmNvbnRleHQpOworCisgICAgaWYgKCFyZW5kZXJQcm9ncmVzcy0+c3R5bGUoKS0+
aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50
cmFuc2xhdGUoMiAqIGluZmxhdGVkUmVjdC54KCkgKyBpbmZsYXRlZFJlY3Qud2lkdGgoKSwgMCk7
CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoLTEsIDEpKTsKKyAg
ICB9CisKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKGltYWdlQnVmZmVy
LmdldCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBpbmZsYXRlZFJlY3QubG9jYXRpb24oKSk7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK2NvbnN0IGZsb2F0IGJhc2VGb250U2l6ZSA9
IDExLjBmOworY29uc3QgZmxvYXQgYmFzZUFycm93SGVpZ2h0ID0gNC4wZjsKK2NvbnN0IGZsb2F0
IGJhc2VBcnJvd1dpZHRoID0gNS4wZjsKK2NvbnN0IGZsb2F0IGJhc2VTcGFjZUJldHdlZW5BcnJv
d3MgPSAyLjBmOworY29uc3QgaW50IGFycm93UGFkZGluZ0xlZnQgPSA2OworY29uc3QgaW50IGFy
cm93UGFkZGluZ1JpZ2h0ID0gNjsKK2NvbnN0IGludCBwYWRkaW5nQmVmb3JlU2VwYXJhdG9yID0g
NDsKK2NvbnN0IGludCBiYXNlQm9yZGVyUmFkaXVzID0gNTsKK2NvbnN0IGludCBzdHlsZWRQb3B1
cFBhZGRpbmdMZWZ0ID0gODsKK2NvbnN0IGludCBzdHlsZWRQb3B1cFBhZGRpbmdUb3AgPSAxOwor
Y29uc3QgaW50IHN0eWxlZFBvcHVwUGFkZGluZ0JvdHRvbSA9IDI7CisKK3N0YXRpYyB2b2lkIFRv
cEdyYWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQqIGluRGF0YSwgQ0dGbG9h
dCogb3V0RGF0YSkKK3sKKyAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9IHsgMS4wZiwgMS4wZiwg
MS4wZiwgMC40ZiB9OworICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMS4wZiwgMS4wZiwg
MS4wZiwgMC4xNWYgfTsKKyAgICBmbG9hdCBhID0gaW5EYXRhWzBdOworICAgIGludCBpID0gMDsK
KyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBvdXREYXRhW2ldID0gKDEuMGYg
LSBhKSAqIGRhcmtbaV0gKyBhICogbGlnaHRbaV07Cit9CisKK3N0YXRpYyB2b2lkIEJvdHRvbUdy
YWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQqIGluRGF0YSwgQ0dGbG9hdCog
b3V0RGF0YSkKK3sKKyAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9IHsgMS4wZiwgMS4wZiwgMS4w
ZiwgMC4wZiB9OworICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMS4wZiwgMS4wZiwgMS4w
ZiwgMC4zZiB9OworICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07CisgICAgaW50IGkgPSAwOworICAg
IGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIG91dERhdGFbaV0gPSAoMS4wZiAtIGEp
ICogZGFya1tpXSArIGEgKiBsaWdodFtpXTsKK30KKworc3RhdGljIHZvaWQgTWFpbkdyYWRpZW50
SW50ZXJwb2xhdGUodm9pZCosIGNvbnN0IENHRmxvYXQqIGluRGF0YSwgQ0dGbG9hdCogb3V0RGF0
YSkKK3sKKyAgICBzdGF0aWMgZmxvYXQgZGFya1s0XSA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4x
NWYgfTsKKyAgICBzdGF0aWMgZmxvYXQgbGlnaHRbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAu
MGYgfTsKKyAgICBmbG9hdCBhID0gaW5EYXRhWzBdOworICAgIGludCBpID0gMDsKKyAgICBmb3Ig
KGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBvdXREYXRhW2ldID0gKDEuMGYgLSBhKSAqIGRh
cmtbaV0gKyBhICogbGlnaHRbaV07Cit9CisKK3N0YXRpYyB2b2lkIFRyYWNrR3JhZGllbnRJbnRl
cnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBvdXREYXRhKQor
eworICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjY3OGYg
fTsKKyAgICBzdGF0aWMgZmxvYXQgbGlnaHRbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMTNm
IH07CisgICAgZmxvYXQgYSA9IGluRGF0YVswXTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChp
ID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJr
W2ldICsgYSAqIGxpZ2h0W2ldOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWlu
dE1lbnVMaXN0QnV0dG9uR3JhZGllbnRzKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgaWYgKHIuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBDb250ZXh0Q29udGFpbmVyIGNnQ29udGV4dENvbnRhaW5l
cihwYWludEluZm8uY29udGV4dCk7CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBjZ0NvbnRl
eHRDb250YWluZXIuY29udGV4dCgpOworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBz
dGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisKKyAgICBSb3VuZGVkUmVjdCBib3JkZXIg
PSBvLT5zdHlsZSgpLT5nZXRSb3VuZGVkQm9yZGVyRm9yKHIsIG8tPnZpZXcoKSk7CisgICAgaW50
IHJhZGl1cyA9IGJvcmRlci5yYWRpaSgpLnRvcExlZnQoKS53aWR0aCgpOworCisgICAgQ0dDb2xv
clNwYWNlUmVmIGNzcGFjZSA9IGRldmljZVJHQkNvbG9yU3BhY2VSZWYoKTsKKworICAgIEZsb2F0
UmVjdCB0b3BHcmFkaWVudChyLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSAvIDIu
MGYpOworICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIHRvcENhbGxiYWNrcyA9IHsgMCwg
VG9wR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9OworICAgIFJldGFpblB0cjxDR0Z1bmN0aW9u
UmVmPiB0b3BGdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEws
IDQsIE5VTEwsICZ0b3BDYWxsYmFja3MpKTsKKyAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiB0
b3BTaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1h
a2UodG9wR3JhZGllbnQueCgpLCB0b3BHcmFkaWVudC55KCkpLCBDR1BvaW50TWFrZSh0b3BHcmFk
aWVudC54KCksIHRvcEdyYWRpZW50Lm1heFkoKSksIHRvcEZ1bmN0aW9uLmdldCgpLCBmYWxzZSwg
ZmFsc2UpKTsKKworICAgIEZsb2F0UmVjdCBib3R0b21HcmFkaWVudChyLngoKSArIHJhZGl1cywg
ci55KCkgKyByLmhlaWdodCgpIC8gMi4wZiwgci53aWR0aCgpIC0gMi4wZiAqIHJhZGl1cywgci5o
ZWlnaHQoKSAvIDIuMGYpOworICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIGJvdHRvbUNh
bGxiYWNrcyA9IHsgMCwgQm90dG9tR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9OworICAgIFJl
dGFpblB0cjxDR0Z1bmN0aW9uUmVmPiBib3R0b21GdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0aW9u
Q3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZib3R0b21DYWxsYmFja3MpKTsKKyAgICBS
ZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiBib3R0b21TaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0Ny
ZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2UoYm90dG9tR3JhZGllbnQueCgpLCAgYm90dG9t
R3JhZGllbnQueSgpKSwgQ0dQb2ludE1ha2UoYm90dG9tR3JhZGllbnQueCgpLCBib3R0b21HcmFk
aWVudC5tYXhZKCkpLCBib3R0b21GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAg
ICBzdHJ1Y3QgQ0dGdW5jdGlvbkNhbGxiYWNrcyBtYWluQ2FsbGJhY2tzID0geyAwLCBNYWluR3Jh
ZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9OworICAgIFJldGFpblB0cjxDR0Z1bmN0aW9uUmVmPiBt
YWluRnVuY3Rpb24oQWRvcHRDRiwgQ0dGdW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBOVUxMLCA0LCBO
VUxMLCAmbWFpbkNhbGxiYWNrcykpOworICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IG1haW5T
aGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2Uo
ci54KCksICByLnkoKSksIENHUG9pbnRNYWtlKHIueCgpLCByLm1heFkoKSksIG1haW5GdW5jdGlv
bi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiBs
ZWZ0U2hhZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRN
YWtlKHIueCgpLCAgci55KCkpLCBDR1BvaW50TWFrZShyLngoKSArIHJhZGl1cywgci55KCkpLCBt
YWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOworCisgICAgUmV0YWluUHRyPENHU2hh
ZGluZ1JlZj4gcmlnaHRTaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFj
ZSwgQ0dQb2ludE1ha2Uoci5tYXhYKCksICByLnkoKSksIENHUG9pbnRNYWtlKHIubWF4WCgpIC0g
cmFkaXVzLCByLnkoKSksIG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAg
ICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJ
bmZvLmNvbnRleHQpOworICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIHIpOwor
ICAgICAgICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKGJvcmRlcik7Cisg
ICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOworICAgICAgICBD
R0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBtYWluU2hhZGluZy5nZXQoKSk7CisgICAgfQor
CisgICAgeworICAgICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBh
aW50SW5mby5jb250ZXh0KTsKKyAgICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjb250ZXh0LCB0
b3BHcmFkaWVudCk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5hZGRSb3VuZGVkUmVjdENs
aXAoUm91bmRlZFJlY3QoZW5jbG9zaW5nSW50UmVjdCh0b3BHcmFkaWVudCksIGJvcmRlci5yYWRp
aSgpLnRvcExlZnQoKSwgYm9yZGVyLnJhZGlpKCkudG9wUmlnaHQoKSwgSW50U2l6ZSgpLCBJbnRT
aXplKCkpKTsKKyAgICAgICAgY29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7
CisgICAgICAgIENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIHRvcFNoYWRpbmcuZ2V0KCkp
OworICAgIH0KKworICAgIGlmICghYm90dG9tR3JhZGllbnQuaXNFbXB0eSgpKSB7CisgICAgICAg
IEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQp
OworICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIGJvdHRvbUdyYWRpZW50KTsK
KyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xpcChSb3VuZGVkUmVj
dChlbmNsb3NpbmdJbnRSZWN0KGJvdHRvbUdyYWRpZW50KSwgSW50U2l6ZSgpLCBJbnRTaXplKCks
IGJvcmRlci5yYWRpaSgpLmJvdHRvbUxlZnQoKSwgYm9yZGVyLnJhZGlpKCkuYm90dG9tUmlnaHQo
KSkpOworICAgICAgICBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKKyAg
ICAgICAgQ0dDb250ZXh0RHJhd1NoYWRpbmcoY29udGV4dCwgYm90dG9tU2hhZGluZy5nZXQoKSk7
CisgICAgfQorCisgICAgeworICAgICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRl
U2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKyAgICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChj
b250ZXh0LCByKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xp
cChib3JkZXIpOworICAgICAgICBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQo
KTsKKyAgICAgICAgQ0dDb250ZXh0RHJhd1NoYWRpbmcoY29udGV4dCwgbGVmdFNoYWRpbmcuZ2V0
KCkpOworICAgICAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCByaWdodFNoYWRpbmcu
Z2V0KCkpOworICAgIH0KK30KKworYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRNZW51
TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByKQoreworICAgIEludFJlY3QgYm91bmRzID0gSW50UmVjdChyLngoKSAr
IG8tPnN0eWxlKCktPmJvcmRlckxlZnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByLnkoKSArIG8tPnN0eWxlKCktPmJvcmRlclRvcFdpZHRoKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHIud2lkdGgoKSAtIG8tPnN0eWxlKCktPmJvcmRlckxlZnRXaWR0aCgp
IC0gby0+c3R5bGUoKS0+Ym9yZGVyUmlnaHRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByLmhlaWdodCgpIC0gby0+c3R5bGUoKS0+Ym9yZGVyVG9wV2lkdGgoKSAtIG8tPnN0
eWxlKCktPmJvcmRlckJvdHRvbVdpZHRoKCkpOworICAgIC8vIERyYXcgdGhlIGdyYWRpZW50cyB0
byBnaXZlIHRoZSBzdHlsZWQgcG9wdXAgbWVudSBhIGJ1dHRvbiBhcHBlYXJhbmNlCisgICAgcGFp
bnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50cyhvLCBwYWludEluZm8sIGJvdW5kcyk7CisKKyAgICAv
LyBTaW5jZSB3ZSBhY3R1YWxseSBrbm93IHRoZSBzaXplIG9mIHRoZSBjb250cm9sIGhlcmUsIHdl
IHJlc3RyaWN0IHRoZSBmb250IHNjYWxlIHRvIG1ha2Ugc3VyZSB0aGUgYXJyb3dzIHdpbGwgZml0
IHZlcnRpY2FsbHkgaW4gdGhlIGJvdW5kcworICAgIGZsb2F0IGZvbnRTY2FsZSA9IG1pbihvLT5z
dHlsZSgpLT5mb250U2l6ZSgpIC8gYmFzZUZvbnRTaXplLCBib3VuZHMuaGVpZ2h0KCkgLyAoYmFz
ZUFycm93SGVpZ2h0ICogMiArIGJhc2VTcGFjZUJldHdlZW5BcnJvd3MpKTsKKyAgICBmbG9hdCBj
ZW50ZXJZID0gYm91bmRzLnkoKSArIGJvdW5kcy5oZWlnaHQoKSAvIDIuMGY7CisgICAgZmxvYXQg
YXJyb3dIZWlnaHQgPSBiYXNlQXJyb3dIZWlnaHQgKiBmb250U2NhbGU7CisgICAgZmxvYXQgYXJy
b3dXaWR0aCA9IGJhc2VBcnJvd1dpZHRoICogZm9udFNjYWxlOworICAgIGZsb2F0IGxlZnRFZGdl
ID0gYm91bmRzLm1heFgoKSAtIGFycm93UGFkZGluZ1JpZ2h0ICogby0+c3R5bGUoKS0+ZWZmZWN0
aXZlWm9vbSgpIC0gYXJyb3dXaWR0aDsKKyAgICBmbG9hdCBzcGFjZUJldHdlZW5BcnJvd3MgPSBi
YXNlU3BhY2VCZXR3ZWVuQXJyb3dzICogZm9udFNjYWxlOworCisgICAgaWYgKGJvdW5kcy53aWR0
aCgpIDwgYXJyb3dXaWR0aCArIGFycm93UGFkZGluZ0xlZnQgKiBvLT5zdHlsZSgpLT5lZmZlY3Rp
dmVab29tKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0
YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworCisgICAgcGFpbnRJbmZv
LmNvbnRleHQtPnNldEZpbGxDb2xvcihvLT5zdHlsZSgpLT52aXNpdGVkRGVwZW5kZW50Q29sb3Io
Q1NTUHJvcGVydHlDb2xvciksIG8tPnN0eWxlKCktPmNvbG9yU3BhY2UoKSk7CisgICAgcGFpbnRJ
bmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKworICAgIEZsb2F0UG9pbnQg
YXJyb3cxWzNdOworICAgIGFycm93MVswXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UsIGNlbnRlclkg
LSBzcGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKKyAgICBhcnJvdzFbMV0gPSBGbG9hdFBvaW50
KGxlZnRFZGdlICsgYXJyb3dXaWR0aCwgY2VudGVyWSAtIHNwYWNlQmV0d2VlbkFycm93cyAvIDIu
MGYpOworICAgIGFycm93MVsyXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dpZHRoIC8g
Mi4wZiwgY2VudGVyWSAtIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYgLSBhcnJvd0hlaWdodCk7
CisKKyAgICAvLyBEcmF3IHRoZSB0b3AgYXJyb3cKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJh
d0NvbnZleFBvbHlnb24oMywgYXJyb3cxLCB0cnVlKTsKKworICAgIEZsb2F0UG9pbnQgYXJyb3cy
WzNdOworICAgIGFycm93MlswXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UsIGNlbnRlclkgKyBzcGFj
ZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKKyAgICBhcnJvdzJbMV0gPSBGbG9hdFBvaW50KGxlZnRF
ZGdlICsgYXJyb3dXaWR0aCwgY2VudGVyWSArIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYpOwor
ICAgIGFycm93MlsyXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dpZHRoIC8gMi4wZiwg
Y2VudGVyWSArIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYgKyBhcnJvd0hlaWdodCk7CisKKyAg
ICAvLyBEcmF3IHRoZSBib3R0b20gYXJyb3cKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0Nv
bnZleFBvbHlnb24oMywgYXJyb3cyLCB0cnVlKTsKKworICAgIENvbG9yIGxlZnRTZXBhcmF0b3JD
b2xvcigwLCAwLCAwLCA0MCk7CisgICAgQ29sb3IgcmlnaHRTZXBhcmF0b3JDb2xvcigyNTUsIDI1
NSwgMjU1LCA0MCk7CisKKyAgICAvLyBGSVhNRTogU2hvdWxkIHRoZSBzZXBhcmF0b3IgdGhpY2tu
ZXNzIGFuZCBzcGFjZSBiZSBzY2FsZWQgdXAgYnkgZm9udFNjYWxlPworICAgIGludCBzZXBhcmF0
b3JTcGFjZSA9IDI7IC8vIERlbGliZXJhdGVseSBpZ25vcmVzIHpvb20gc2luY2UgaXQgbG9va3Mg
bmljZXIgaWYgaXQgc3RheXMgdGhpbi4KKyAgICBpbnQgbGVmdEVkZ2VPZlNlcGFyYXRvciA9IHN0
YXRpY19jYXN0PGludD4obGVmdEVkZ2UgLSBhcnJvd1BhZGRpbmdMZWZ0ICogby0+c3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpKTsgLy8gRklYTUU6IFJvdW5kPworCisgICAgLy8gRHJhdyB0aGUgc2Vw
YXJhdG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBhcnJvd3MKKyAgICBwYWludEluZm8uY29udGV4dC0+
c2V0U3Ryb2tlVGhpY2tuZXNzKDEuMGYpOyAvLyBEZWxpYmVyYXRlbHkgaWdub3JlcyB6b29tIHNp
bmNlIGl0IGxvb2tzIG5pY2VyIGlmIGl0IHN0YXlzIHRoaW4uCisgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+
c2V0U3Ryb2tlQ29sb3IobGVmdFNlcGFyYXRvckNvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsK
KyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQobGVmdEVkZ2VPZlNlcGFy
YXRvciwgYm91bmRzLnkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFBv
aW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IsIGJvdW5kcy5tYXhZKCkpKTsKKworICAgIHBhaW50SW5m
by5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihyaWdodFNlcGFyYXRvckNvbG9yLCBDb2xvclNwYWNl
RGV2aWNlUkdCKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQobGVm
dEVkZ2VPZlNlcGFyYXRvciArIHNlcGFyYXRvclNwYWNlLCBib3VuZHMueSgpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgSW50UG9pbnQobGVmdEVkZ2VPZlNlcGFyYXRvciArIHNl
cGFyYXRvclNwYWNlLCBib3VuZHMubWF4WSgpKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitz
dGF0aWMgY29uc3QgSW50U2l6ZSogbWVudUxpc3RCdXR0b25TaXplcygpCit7CisgICAgc3RhdGlj
IGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMCwgMjEpLCBJbnRTaXplKDAsIDE4
KSwgSW50U2l6ZSgwLCAxNSkgfTsKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVNYWNTaGFyZWQ6OmFkanVzdE1lbnVMaXN0U3R5bGUoU3R5bGVSZXNvbHZlciogc3R5bGVS
ZXNvbHZlciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAoreworICAgIE5T
Q29udHJvbFNpemUgY29udHJvbFNpemUgPSBjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpOworCisg
ICAgc3R5bGUtPnJlc2V0Qm9yZGVyKCk7CisgICAgc3R5bGUtPnJlc2V0UGFkZGluZygpOworCisg
ICAgLy8gSGVpZ2h0IGlzIGxvY2tlZCB0byBhdXRvLgorICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVu
Z3RoKEF1dG8pKTsKKworICAgIC8vIFdoaXRlLXNwYWNlIGlzIGxvY2tlZCB0byBwcmUKKyAgICBz
dHlsZS0+c2V0V2hpdGVTcGFjZShQUkUpOworCisgICAgLy8gU2V0IHRoZSBmb3JlZ3JvdW5kIGNv
bG9yIHRvIGJsYWNrIG9yIGdyYXkgd2hlbiB3ZSBoYXZlIHRoZSBhcXVhIGxvb2suCisgICAgLy8g
Q2FzdCB0byBSR0IzMiBpcyB0byB3b3JrIGFyb3VuZCBhIGNvbXBpbGVyIGJ1Zy4KKyAgICBzdHls
ZS0+c2V0Q29sb3IoZSAmJiBlLT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpID8gc3RhdGljX2Nhc3Q8
UkdCQTMyPihDb2xvcjo6YmxhY2spIDogQ29sb3I6OmRhcmtHcmF5KTsKKworICAgIC8vIFNldCB0
aGUgYnV0dG9uJ3MgdmVydGljYWwgc2l6ZS4KKyAgICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIG1l
bnVMaXN0QnV0dG9uU2l6ZXMoKSk7CisKKyAgICAvLyBPdXIgZm9udCBpcyBsb2NrZWQgdG8gdGhl
IGFwcHJvcHJpYXRlIHN5c3RlbSBmb250IHNpemUgZm9yIHRoZSBjb250cm9sLiAgVG8gY2xhcmlm
eSwgd2UgZmlyc3QgdXNlIHRoZSBDU1Mtc3BlY2lmaWVkIGZvbnQgdG8gZmlndXJlIG91dAorICAg
IC8vIGEgcmVhc29uYWJsZSBjb250cm9sIHNpemUsIGJ1dCBvbmNlIHRoYXQgY29udHJvbCBzaXpl
IGlzIGRldGVybWluZWQsIHdlIHRocm93IHRoYXQgZm9udCBhd2F5IGFuZCB1c2UgdGhlIGFwcHJv
cHJpYXRlCisgICAgLy8gc3lzdGVtIGZvbnQgZm9yIHRoZSBjb250cm9sIHNpemUgaW5zdGVhZC4K
KyAgICBzZXRGb250RnJvbUNvbnRyb2xTaXplKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBjb250cm9s
U2l6ZSk7CisKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworfQorCitpbnQgUmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChSZW5kZXJTdHlsZSog
c3R5bGUpIGNvbnN0Cit7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQ
YXJ0KQorICAgICAgICByZXR1cm4gcG9wdXBCdXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9u
dChzdHlsZSkpW2xlZnRQYWRkaW5nXSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgaWYg
KHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RCdXR0b25QYXJ0KQorICAgICAgICByZXR1
cm4gc3R5bGVkUG9wdXBQYWRkaW5nTGVmdCAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAg
cmV0dXJuIDA7Cit9CisKK2ludCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBh
ZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaWYgKHN0eWxlLT5h
cHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KQorICAgICAgICByZXR1cm4gcG9wdXBCdXR0b25Q
YWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSkpW3JpZ2h0UGFkZGluZ10gKiBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpOworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0
QnV0dG9uUGFydCkgeworICAgICAgICBmbG9hdCBmb250U2NhbGUgPSBzdHlsZS0+Zm9udFNpemUo
KSAvIGJhc2VGb250U2l6ZTsKKyAgICAgICAgZmxvYXQgYXJyb3dXaWR0aCA9IGJhc2VBcnJvd1dp
ZHRoICogZm9udFNjYWxlOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihh
cnJvd1dpZHRoICsgKGFycm93UGFkZGluZ0xlZnQgKyBhcnJvd1BhZGRpbmdSaWdodCArIHBhZGRp
bmdCZWZvcmVTZXBhcmF0b3IpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSkpOworICAgIH0KKyAg
ICByZXR1cm4gMDsKK30KKworaW50IFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwb3B1cEludGVybmFs
UGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaWYgKHN0eWxlLT5h
cHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KQorICAgICAgICByZXR1cm4gcG9wdXBCdXR0b25Q
YWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSkpW3RvcFBhZGRpbmddICogc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKTsKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1
dHRvblBhcnQpCisgICAgICAgIHJldHVybiBzdHlsZWRQb3B1cFBhZGRpbmdUb3AgKiBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpOworICAgIHJldHVybiAwOworfQorCitpbnQgUmVuZGVyVGhlbWVNYWNT
aGFyZWQ6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKK3sKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCisgICAg
ICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRpbmcoY29udHJvbFNpemVGb3JGb250KHN0eWxlKSlb
Ym90dG9tUGFkZGluZ10gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIGlmIChzdHlsZS0+
YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0QnV0dG9uUGFydCkKKyAgICAgICAgcmV0dXJuIHN0eWxl
ZFBvcHVwUGFkZGluZ0JvdHRvbSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdE1lbnVMaXN0QnV0dG9u
U3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0
Cit7CisgICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBiYXNlRm9udFNp
emU7CisKKyAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisgICAgc3R5bGUtPnNldEJvcmRlclJh
ZGl1cyhJbnRTaXplKGludChiYXNlQm9yZGVyUmFkaXVzICsgZm9udFNjYWxlIC0gMSksIGludChi
YXNlQm9yZGVyUmFkaXVzICsgZm9udFNjYWxlIC0gMSkpKTsgLy8gRklYTUU6IFJvdW5kIHVwPwor
CisgICAgY29uc3QgaW50IG1pbkhlaWdodCA9IDE1OworICAgIHN0eWxlLT5zZXRNaW5IZWlnaHQo
TGVuZ3RoKG1pbkhlaWdodCwgRml4ZWQpKTsKKworICAgIHN0eWxlLT5zZXRMaW5lSGVpZ2h0KFJl
bmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6c2V0UG9wdXBCdXR0b25DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBJbnRSZWN0JiByKQoreworICAgIE5TUG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRvbiA9
IHRoaXMtPnBvcHVwQnV0dG9uKCk7CisKKyAgICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNl
ZCBvZmYgdGhlIHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgorICAgIHNldENvbnRyb2xT
aXplKHBvcHVwQnV0dG9uLCBwb3B1cEJ1dHRvblNpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHlsZSgp
LT5lZmZlY3RpdmVab29tKCkpOworCisgICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3
ZSByZXNwb25kIHRvLgorICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKKyAg
ICB1cGRhdGVDaGVja2VkU3RhdGUocG9wdXBCdXR0b24sIG8pOworICAgIHVwZGF0ZUVuYWJsZWRT
dGF0ZShwb3B1cEJ1dHRvbiwgbyk7CisgICAgdXBkYXRlUHJlc3NlZFN0YXRlKHBvcHVwQnV0dG9u
LCBvKTsKKyNpZiBCVVRUT05fQ0VMTF9EUkFXX1dJVEhfRlJBTUVfRFJBV1NfRk9DVVNfUklORwor
ICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7CisjZW5kaWYKK30KKworY29u
c3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6Om1lbnVMaXN0U2l6ZXMoKSBjb25zdAor
eworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDksIDApLCBJ
bnRTaXplKDUsIDApLCBJbnRTaXplKDAsIDApIH07CisgICAgcmV0dXJuIHNpemVzOworfQorCitp
bnQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6Om1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5bGUq
IHN0eWxlKSBjb25zdAoreworICAgIHJldHVybiBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgbWVu
dUxpc3RTaXplcygpKS53aWR0aCgpOworfQorCitjb25zdCBpbnQgdHJhY2tXaWR0aCA9IDU7Citj
b25zdCBpbnQgdHJhY2tSYWRpdXMgPSAyOworCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjph
ZGp1c3RTbGlkZXJUcmFja1N0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSogc3R5bGUs
IEVsZW1lbnQqKSBjb25zdAoreworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Cit9
CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2Jq
ZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sK
KyAgICBJbnRSZWN0IGJvdW5kcyA9IHI7CisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUo
KS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIGZsb2F0IHpvb21lZFRyYWNrV2lkdGggPSB0cmFja1dp
ZHRoICogem9vbUxldmVsOworCisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSAg
U2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09ICBNZWRp
YVNsaWRlclBhcnQpIHsKKyAgICAgICAgYm91bmRzLnNldEhlaWdodCh6b29tZWRUcmFja1dpZHRo
KTsKKyAgICAgICAgYm91bmRzLnNldFkoci55KCkgKyByLmhlaWdodCgpIC8gMiAtIHpvb21lZFRy
YWNrV2lkdGggLyAyKTsKKyAgICB9IGVsc2UgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9
PSBTbGlkZXJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgYm91bmRzLnNldFdpZHRoKHpvb21lZFRy
YWNrV2lkdGgpOworICAgICAgICBib3VuZHMuc2V0WChyLngoKSArIHIud2lkdGgoKSAvIDIgLSB6
b29tZWRUcmFja1dpZHRoIC8gMik7CisgICAgfQorCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3ND
b250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgQ0dDb250ZXh0UmVm
IGNvbnRleHQgPSBsb2NhbENvbnRleHQuY2dDb250ZXh0KCk7CisgICAgQ0dDb2xvclNwYWNlUmVm
IGNzcGFjZSA9IGRldmljZVJHQkNvbG9yU3BhY2VSZWYoKTsKKworI2lmIEVOQUJMRShEQVRBTElT
VF9FTEVNRU5UKQorICAgIHBhaW50U2xpZGVyVGlja3MobywgcGFpbnRJbmZvLCByKTsKKyNlbmRp
ZgorCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8u
Y29udGV4dCk7CisgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjb250ZXh0LCBib3VuZHMpOworCisg
ICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3MgbWFpbkNhbGxiYWNrcyA9IHsgMCwgVHJhY2tH
cmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+
IG1haW5GdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQs
IE5VTEwsICZtYWluQ2FsbGJhY2tzKSk7CisgICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbWFp
blNoYWRpbmc7CisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJWZXJ0
aWNhbFBhcnQpCisgICAgICAgIG1haW5TaGFkaW5nLmFkb3B0Q0YoQ0dTaGFkaW5nQ3JlYXRlQXhp
YWwoY3NwYWNlLCBDR1BvaW50TWFrZShib3VuZHMueCgpLCAgYm91bmRzLm1heFkoKSksIENHUG9p
bnRNYWtlKGJvdW5kcy5tYXhYKCksIGJvdW5kcy5tYXhZKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCks
IGZhbHNlLCBmYWxzZSkpOworICAgIGVsc2UKKyAgICAgICAgbWFpblNoYWRpbmcuYWRvcHRDRihD
R1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKGJvdW5kcy54KCksICBib3Vu
ZHMueSgpKSwgQ0dQb2ludE1ha2UoYm91bmRzLngoKSwgYm91bmRzLm1heFkoKSksIG1haW5GdW5j
dGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICBJbnRTaXplIHJhZGl1cyh0cmFja1Jh
ZGl1cywgdHJhY2tSYWRpdXMpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5hZGRSb3VuZGVkUmVj
dENsaXAoUm91bmRlZFJlY3QoYm91bmRzLCByYWRpdXMsIHJhZGl1cywgcmFkaXVzLCByYWRpdXMp
KTsKKyAgICBjb250ZXh0ID0gbG9jYWxDb250ZXh0LmNnQ29udGV4dCgpOworICAgIENHQ29udGV4
dERyYXdTaGFkaW5nKGNvbnRleHQsIG1haW5TaGFkaW5nLmdldCgpKTsKKworICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2xpZGVyVGh1bWJT
dHlsZShTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVs
ZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgUmVuZGVyVGhlbWU6OmFkanVzdFNsaWRlclRo
dW1iU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1lbnQpOworICAgIHN0eWxlLT5zZXRC
b3hTaGFkb3cobnVsbHB0cik7Cit9CisKK2NvbnN0IGZsb2F0IHZlcnRpY2FsU2xpZGVySGVpZ2h0
UGFkZGluZyA9IDAuMWY7CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2xpZGVy
VGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcikKK3sKKyAgICBOU1NsaWRlckNlbGwqIHNsaWRlclRodW1iQ2VsbCA9IG8tPnN0
eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydAorICAgICAgICA/
IHNsaWRlclRodW1iVmVydGljYWwoKQorICAgICAgICA6IHNsaWRlclRodW1iSG9yaXpvbnRhbCgp
OworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludElu
Zm8uY29udGV4dCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIHZhcmlvdXMgc3RhdGVzIHdlIHJlc3Bv
bmQgdG8uCisgICAgdXBkYXRlQWN0aXZlU3RhdGUoc2xpZGVyVGh1bWJDZWxsLCBvKTsKKyAgICB1
cGRhdGVFbmFibGVkU3RhdGUoc2xpZGVyVGh1bWJDZWxsLCBvKTsKKyAgICB1cGRhdGVGb2N1c2Vk
U3RhdGUoc2xpZGVyVGh1bWJDZWxsLCAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+Zm9jdXNEZWxl
Z2F0ZSgpLT5yZW5kZXJlcigpKSA/IG8tPm5vZGUoKS0+Zm9jdXNEZWxlZ2F0ZSgpLT5yZW5kZXJl
cigpIDogbyk7CisKKyAgICAvLyBVcGRhdGUgdGhlIHByZXNzZWQgc3RhdGUgdXNpbmcgdGhlIE5T
Q2VsbCB0cmFja2luZyBtZXRob2RzLCBzaW5jZSB0aGF0J3MgaG93IE5TU2xpZGVyQ2VsbCBrZWVw
cyB0cmFjayBvZiBpdC4KKyAgICBib29sIG9sZFByZXNzZWQ7CisgICAgaWYgKG8tPnN0eWxlKCkt
PmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkKKyAgICAgICAgb2xkUHJl
c3NlZCA9IG1faXNTbGlkZXJUaHVtYlZlcnRpY2FsUHJlc3NlZDsKKyAgICBlbHNlCisgICAgICAg
IG9sZFByZXNzZWQgPSBtX2lzU2xpZGVyVGh1bWJIb3Jpem9udGFsUHJlc3NlZDsKKworICAgIGJv
b2wgcHJlc3NlZCA9IGlzUHJlc3NlZChvKTsKKworICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJh
bmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCisgICAgICAgIG1faXNTbGlkZXJUaHVt
YlZlcnRpY2FsUHJlc3NlZCA9IHByZXNzZWQ7CisgICAgZWxzZQorICAgICAgICBtX2lzU2xpZGVy
VGh1bWJIb3Jpem9udGFsUHJlc3NlZCA9IHByZXNzZWQ7CisKKyAgICBpZiAocHJlc3NlZCAhPSBv
bGRQcmVzc2VkKSB7CisgICAgICAgIGlmIChwcmVzc2VkKQorICAgICAgICAgICAgW3NsaWRlclRo
dW1iQ2VsbCBzdGFydFRyYWNraW5nQXQ6TlNQb2ludCgpIGluVmlldzpuaWxdOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBbc2xpZGVyVGh1bWJDZWxsIHN0b3BUcmFja2luZzpOU1BvaW50KCkg
YXQ6TlNQb2ludCgpIGluVmlldzpuaWwgbW91c2VJc1VwOllFU107CisgICAgfQorCisgICAgRmxv
YXRSZWN0IGJvdW5kcyA9IHI7CisgICAgLy8gTWFrZSB0aGUgaGVpZ2h0IG9mIHRoZSB2ZXJ0aWNh
bCBzbGlkZXIgc2xpZ2h0bHkgbGFyZ2VyIHNvIE5TU2xpZGVyQ2VsbCB3aWxsIGRyYXcgYSB2ZXJ0
aWNhbCBzbGlkZXIuCisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJU
aHVtYlZlcnRpY2FsUGFydCkKKyAgICAgICAgYm91bmRzLnNldEhlaWdodChib3VuZHMuaGVpZ2h0
KCkgKyB2ZXJ0aWNhbFNsaWRlckhlaWdodFBhZGRpbmcgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVa
b29tKCkpOworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWlu
dEluZm8uY29udGV4dCk7CisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0
aXZlWm9vbSgpOworCisgICAgRmxvYXRSZWN0IHVuem9vbWVkUmVjdCA9IGJvdW5kczsKKyAgICBp
ZiAoem9vbUxldmVsICE9IDEuMGYpIHsKKyAgICAgICAgdW56b29tZWRSZWN0LnNldFdpZHRoKHVu
em9vbWVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgdW56b29tZWRSZWN0LnNl
dEhlaWdodCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICBwYWlu
dEluZm8uY29udGV4dC0+dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54KCksIHVuem9vbWVkUmVjdC55
KCkpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZl
bCwgem9vbUxldmVsKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLXVu
em9vbWVkUmVjdC54KCksIC11bnpvb21lZFJlY3QueSgpKTsKKyAgICB9CisKKyNpZiBQTEFURk9S
TShDSFJPTUlVTSkKKyAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKDAsIHVuem9vbWVk
UmVjdC55KCkpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoMSwgLTEp
KTsKKyAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKDAsIC0odW56b29tZWRSZWN0Lnko
KSArIHVuem9vbWVkUmVjdC5oZWlnaHQoKSkpOworI2VuZGlmCisKKyAgICBbc2xpZGVyVGh1bWJD
ZWxsIGRyYXdJbnRlcmlvcldpdGhGcmFtZTp1bnpvb21lZFJlY3QgaW5WaWV3OmRvY3VtZW50Vmll
d0ZvcihvKV07CisgICAgW3NsaWRlclRodW1iQ2VsbCBzZXRDb250cm9sVmlldzpuaWxdOworCisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFNl
YXJjaEZpZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmIHIpCit7CisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2Fs
Q29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJj
aCA9IHRoaXMtPnNlYXJjaCgpOworCisgICAgc2V0U2VhcmNoQ2VsbFN0YXRlKG8sIHIpOworCisg
ICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4
dCk7CisKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7
CisKKyAgICBJbnRSZWN0IHVuem9vbWVkUmVjdCA9IHI7CisKKyAgICBpZiAoem9vbUxldmVsICE9
IDEuMGYpIHsKKyAgICAgICAgdW56b29tZWRSZWN0LnNldFdpZHRoKHVuem9vbWVkUmVjdC53aWR0
aCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgdW56b29tZWRSZWN0LnNldEhlaWdodCh1bnpvb21l
ZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+
dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54KCksIHVuem9vbWVkUmVjdC55KCkpOworICAgICAgICBw
YWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9vbUxldmVsKSk7
CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLXVuem9vbWVkUmVjdC54KCks
IC11bnpvb21lZFJlY3QueSgpKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIHNlYXJjaCBidXR0
b24gdG8gbmlsIGJlZm9yZSBkcmF3aW5nLiAgVGhlbiByZXNldCBpdCBzbyB3ZSBjYW4gZHJhdyBp
dCBsYXRlci4KKyAgICBbc2VhcmNoIHNldFNlYXJjaEJ1dHRvbkNlbGw6bmlsXTsKKworICAgIFtz
ZWFyY2ggZHJhd1dpdGhGcmFtZTpOU1JlY3QodW56b29tZWRSZWN0KSBpblZpZXc6ZG9jdW1lbnRW
aWV3Rm9yKG8pXTsKKworICAgIFtzZWFyY2ggc2V0Q29udHJvbFZpZXc6bmlsXTsKKyAgICBbc2Vh
cmNoIHJlc2V0U2VhcmNoQnV0dG9uQ2VsbF07CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNldFNlYXJjaENlbGxTdGF0ZShSZW5kZXJPYmplY3Qq
IG8sIGNvbnN0IEludFJlY3QmKQoreworICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2ggPSB0
aGlzLT5zZWFyY2goKTsKKworICAgIFtzZWFyY2ggc2V0Q29udHJvbFNpemU6Y29udHJvbFNpemVG
b3JGb250KG8tPnN0eWxlKCkpXTsKKworICAgIC8vIFVwZGF0ZSB0aGUgdmFyaW91cyBzdGF0ZXMg
d2UgcmVzcG9uZCB0by4KKyAgICB1cGRhdGVBY3RpdmVTdGF0ZShzZWFyY2gsIG8pOworICAgIHVw
ZGF0ZUVuYWJsZWRTdGF0ZShzZWFyY2gsIG8pOworICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShzZWFy
Y2gsIG8pOworfQorCitjb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2VhcmNo
RmllbGRTaXplcygpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10g
PSB7IEludFNpemUoMCwgMjIpLCBJbnRTaXplKDAsIDE5KSwgSW50U2l6ZSgwLCAxNykgfTsKKyAg
ICByZXR1cm4gc2l6ZXM7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNldFNlYXJj
aEZpZWxkU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlIHdp
ZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0
byBkby4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0
eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVXNlIHRo
ZSBmb250IHNpemUgdG8gZGV0ZXJtaW5lIHRoZSBpbnRyaW5zaWMgd2lkdGggb2YgdGhlIGNvbnRy
b2wuCisgICAgc2V0U2l6ZUZyb21Gb250KHN0eWxlLCBzZWFyY2hGaWVsZFNpemVzKCkpOworfQor
Cit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKFN0eWxl
UmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNv
bnN0Cit7CisgICAgLy8gT3ZlcnJpZGUgYm9yZGVyLgorICAgIHN0eWxlLT5yZXNldEJvcmRlcigp
OworICAgIGNvbnN0IHNob3J0IGJvcmRlcldpZHRoID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29t
KCk7CisgICAgc3R5bGUtPnNldEJvcmRlckxlZnRXaWR0aChib3JkZXJXaWR0aCk7CisgICAgc3R5
bGUtPnNldEJvcmRlckxlZnRTdHlsZShJTlNFVCk7CisgICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0
V2lkdGgoYm9yZGVyV2lkdGgpOworICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFN0eWxlKElOU0VU
KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm9yZGVyV2lkdGgpOworICAgIHN0
eWxlLT5zZXRCb3JkZXJCb3R0b21TdHlsZShJTlNFVCk7CisgICAgc3R5bGUtPnNldEJvcmRlclRv
cFdpZHRoKGJvcmRlcldpZHRoKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyVG9wU3R5bGUoSU5TRVQp
OworCisgICAgLy8gT3ZlcnJpZGUgaGVpZ2h0LgorICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KEF1dG8pKTsKKyAgICBzZXRTZWFyY2hGaWVsZFNpemUoc3R5bGUpOworCisgICAgLy8gT3ZlcnJp
ZGUgcGFkZGluZyBzaXplIHRvIG1hdGNoIEFwcEtpdCB0ZXh0IHBvc2l0aW9uaW5nLgorICAgIGNv
bnN0IGludCBwYWRkaW5nID0gMSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgc3R5bGUt
PnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQ
YWRkaW5nUmlnaHQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRp
bmdUb3AoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0
b20oTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisKKyAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xT
aXplID0gY29udHJvbFNpemVGb3JGb250KHN0eWxlKTsKKyAgICBzZXRGb250RnJvbUNvbnRyb2xT
aXplKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBjb250cm9sU2l6ZSk7CisKKyAgICBzdHlsZS0+c2V0
Qm94U2hhZG93KG51bGxwdHIpOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWlu
dFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgRWxlbWVudCogaW5wdXQgPSBv
LT5ub2RlKCktPnNoYWRvd0hvc3QoKTsKKyAgICBpZiAoIWlucHV0KQorICAgICAgICBpbnB1dCA9
IHRvRWxlbWVudChvLT5ub2RlKCkpOworCisgICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNC
b3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3ND
b250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgc2V0U2VhcmNoQ2Vs
bFN0YXRlKGlucHV0LT5yZW5kZXJlcigpLCByKTsKKworICAgIE5TU2VhcmNoRmllbGRDZWxsKiBz
ZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKKworICAgIGlmIChpbnB1dC0+aXNFbmFibGVkRm9ybUNv
bnRyb2woKSAmJiAoaW5wdXQtPmlzVGV4dEZvcm1Db250cm9sKCkgJiYgIXN0YXRpY19jYXN0PEhU
TUxUZXh0Rm9ybUNvbnRyb2xFbGVtZW50Kj4oaW5wdXQpLT5yZWFkT25seSgpKSkgeworICAgICAg
ICB1cGRhdGVBY3RpdmVTdGF0ZShbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdLCBvKTsKKyAgICAg
ICAgdXBkYXRlUHJlc3NlZFN0YXRlKFtzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0sIG8pOworICAg
IH0KKyAgICBlbHNlIGlmIChbW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSBpc0hpZ2hsaWdodGVk
XSkKKyAgICAgICAgW1tzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0gc2V0SGlnaGxpZ2h0ZWQ6Tk9d
OworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8u
Y29udGV4dCk7CisKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVa
b29tKCk7CisKKyAgICBGbG9hdFJlY3QgbG9jYWxCb3VuZHMgPSBbc2VhcmNoIGNhbmNlbEJ1dHRv
blJlY3RGb3JCb3VuZHM6TlNSZWN0KGlucHV0LT5yZW5kZXJCb3goKS0+cGl4ZWxTbmFwcGVkQm9y
ZGVyQm94UmVjdCgpKV07CisKKyNpZiBFTkFCTEUoSU5QVVRfU1BFRUNIKQorICAgIC8vIFRha2Ug
Y2FyZSBvZiBjYXNlcyB3aGVyZSB0aGUgY2FuY2VsIGJ1dHRvbiB3YXMgbm90IGFsaWduZWQgd2l0
aCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBpbnB1dCBlbGVtZW50IChmb3IgZS5nLgorICAgIC8v
IHdoZW4gc3BlZWNoIGlucHV0IGlzIGVuYWJsZWQgZm9yIHRoZSBpbnB1dCBlbGVtZW50LgorICAg
IEludFJlY3QgYWJzQm91bmRpbmdCb3ggPSBpbnB1dC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVCb3Vu
ZGluZ0JveFJlY3QoKTsKKyAgICBpbnQgYWJzUmlnaHQgPSBhYnNCb3VuZGluZ0JveC54KCkgKyBh
YnNCb3VuZGluZ0JveC53aWR0aCgpIC0gaW5wdXQtPnJlbmRlckJveCgpLT5wYWRkaW5nUmlnaHQo
KSAtIGlucHV0LT5yZW5kZXJCb3goKS0+Ym9yZGVyUmlnaHQoKTsKKyAgICBpbnQgc3BhY2VUb1Jp
Z2h0T2ZDYW5jZWxCdXR0b24gPSBhYnNSaWdodCAtIChyLngoKSArIHIud2lkdGgoKSk7CisgICAg
bG9jYWxCb3VuZHMuc2V0WChsb2NhbEJvdW5kcy54KCkgLSBzcGFjZVRvUmlnaHRPZkNhbmNlbEJ1
dHRvbik7CisjZW5kaWYKKworICAgIGxvY2FsQm91bmRzID0gY29udmVydFRvUGFpbnRpbmdSZWN0
KGlucHV0LT5yZW5kZXJlcigpLCBvLCBsb2NhbEJvdW5kcywgcik7CisKKyAgICBGbG9hdFJlY3Qg
dW56b29tZWRSZWN0KGxvY2FsQm91bmRzKTsKKyAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsK
KyAgICAgICAgdW56b29tZWRSZWN0LnNldFdpZHRoKHVuem9vbWVkUmVjdC53aWR0aCgpIC8gem9v
bUxldmVsKTsKKyAgICAgICAgdW56b29tZWRSZWN0LnNldEhlaWdodCh1bnpvb21lZFJlY3QuaGVp
Z2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRl
KHVuem9vbWVkUmVjdC54KCksIHVuem9vbWVkUmVjdC55KCkpOworICAgICAgICBwYWludEluZm8u
Y29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9vbUxldmVsKSk7CisgICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLXVuem9vbWVkUmVjdC54KCksIC11bnpvb21l
ZFJlY3QueSgpKTsKKyAgICB9CisKKyAgICBbW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSBkcmF3
V2l0aEZyYW1lOnVuem9vbWVkUmVjdCBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8pXTsKKyAgICBb
W3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSBzZXRDb250cm9sVmlldzpuaWxdOworICAgIHJldHVy
biBmYWxzZTsKK30KKworY29uc3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmNhbmNl
bEJ1dHRvblNpemVzKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1sz
XSA9IHsgSW50U2l6ZSgxNiwgMTMpLCBJbnRTaXplKDEzLCAxMSksIEludFNpemUoMTMsIDkpIH07
CisgICAgcmV0dXJuIHNpemVzOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1
c3RTZWFyY2hGaWVsZENhbmNlbEJ1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHls
ZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIEludFNpemUgc2l6ZSA9IHNpemVGb3JT
eXN0ZW1Gb250KHN0eWxlLCBjYW5jZWxCdXR0b25TaXplcygpKTsKKyAgICBzdHlsZS0+c2V0V2lk
dGgoTGVuZ3RoKHNpemUud2lkdGgoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExl
bmd0aChzaXplLmhlaWdodCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVs
bHB0cik7Cit9CisKK2NvbnN0IEludFNpemUqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpyZXN1bHRz
QnV0dG9uU2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNd
ID0geyBJbnRTaXplKDE5LCAxMyksIEludFNpemUoMTcsIDExKSwgSW50U2l6ZSgxNywgOSkgfTsK
KyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK2NvbnN0IGludCBlbXB0eVJlc3VsdHNPZmZzZXQgPSA5
Owordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2VhcmNoRmllbGREZWNvcmF0aW9u
U3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0
Cit7CisgICAgSW50U2l6ZSBzaXplID0gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIHJlc3VsdHNC
dXR0b25TaXplcygpKTsKKyAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSAt
IGVtcHR5UmVzdWx0c09mZnNldCwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0
aChzaXplLmhlaWdodCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0
cik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2VhcmNoRmllbGREZWNv
cmF0aW9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKQor
eworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRq
dXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5k
ZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIEludFNpemUgc2l6ZSA9IHNp
emVGb3JTeXN0ZW1Gb250KHN0eWxlLCByZXN1bHRzQnV0dG9uU2l6ZXMoKSk7CisgICAgc3R5bGUt
PnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEhl
aWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0Qm94U2hh
ZG93KG51bGxwdHIpOworfQorCitib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFNlYXJj
aEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBOb2RlKiBpbnB1dCA9IG8tPm5v
ZGUoKS0+c2hhZG93SG9zdCgpOworICAgIGlmICghaW5wdXQpCisgICAgICAgIGlucHV0ID0gby0+
bm9kZSgpOworICAgIGlmICghaW5wdXQtPnJlbmRlcmVyKCktPmlzQm94KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRl
eHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHNldFNlYXJjaENlbGxTdGF0ZShpbnB1dC0+cmVu
ZGVyZXIoKSwgcik7CisKKyAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoID0gdGhpcy0+c2Vh
cmNoKCk7CisKKyAgICBpZiAoW3NlYXJjaCBzZWFyY2hNZW51VGVtcGxhdGVdICE9IG5pbCkKKyAg
ICAgICAgW3NlYXJjaCBzZXRTZWFyY2hNZW51VGVtcGxhdGU6bmlsXTsKKworICAgIHVwZGF0ZUFj
dGl2ZVN0YXRlKFtzZWFyY2ggc2VhcmNoQnV0dG9uQ2VsbF0sIG8pOworCisgICAgRmxvYXRSZWN0
IGxvY2FsQm91bmRzID0gW3NlYXJjaCBzZWFyY2hCdXR0b25SZWN0Rm9yQm91bmRzOk5TUmVjdChp
bnB1dC0+cmVuZGVyQm94KCktPnBpeGVsU25hcHBlZEJvcmRlckJveFJlY3QoKSldOworICAgIGxv
Y2FsQm91bmRzID0gY29udmVydFRvUGFpbnRpbmdSZWN0KGlucHV0LT5yZW5kZXJlcigpLCBvLCBs
b2NhbEJvdW5kcywgcik7CisKKyAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSBkcmF3V2l0
aEZyYW1lOmxvY2FsQm91bmRzIGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOworICAgIFtbc2Vh
cmNoIHNlYXJjaEJ1dHRvbkNlbGxdIHNldENvbnRyb2xWaWV3Om5pbF07CisgICAgcmV0dXJuIGZh
bHNlOworfQorCitjb25zdCBpbnQgcmVzdWx0c0Fycm93V2lkdGggPSA1Owordm9pZCBSZW5kZXJU
aGVtZU1hY1NoYXJlZDo6YWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoU3R5bGVS
ZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgSW50
U2l6ZSBzaXplID0gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIHJlc3VsdHNCdXR0b25TaXplcygp
KTsKKyAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSArIHJlc3VsdHNBcnJv
d1dpZHRoLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKK30KKworYm9v
bCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24oUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYg
cikKK3sKKyAgICBOb2RlKiBpbnB1dCA9IG8tPm5vZGUoKS0+c2hhZG93SG9zdCgpOworICAgIGlm
ICghaW5wdXQpCisgICAgICAgIGlucHV0ID0gby0+bm9kZSgpOworICAgIGlmICghaW5wdXQtPnJl
bmRlcmVyKCktPmlzQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExvY2FsQ3Vy
cmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAg
IHNldFNlYXJjaENlbGxTdGF0ZShpbnB1dC0+cmVuZGVyZXIoKSwgcik7CisKKyAgICBOU1NlYXJj
aEZpZWxkQ2VsbCogc2VhcmNoID0gdGhpcy0+c2VhcmNoKCk7CisKKyAgICB1cGRhdGVBY3RpdmVT
dGF0ZShbc2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdLCBvKTsKKworICAgIGlmICghW3NlYXJjaCBz
ZWFyY2hNZW51VGVtcGxhdGVdKQorICAgICAgICBbc2VhcmNoIHNldFNlYXJjaE1lbnVUZW1wbGF0
ZTpzZWFyY2hNZW51VGVtcGxhdGUoKV07CisKKyAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVy
IHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBv
LT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisKKyAgICBGbG9hdFJlY3QgbG9jYWxCb3VuZHMg
PSBbc2VhcmNoIHNlYXJjaEJ1dHRvblJlY3RGb3JCb3VuZHM6TlNSZWN0KGlucHV0LT5yZW5kZXJC
b3goKS0+cGl4ZWxTbmFwcGVkQm9yZGVyQm94UmVjdCgpKV07CisgICAgbG9jYWxCb3VuZHMgPSBj
b252ZXJ0VG9QYWludGluZ1JlY3QoaW5wdXQtPnJlbmRlcmVyKCksIG8sIGxvY2FsQm91bmRzLCBy
KTsKKworICAgIEludFJlY3QgdW56b29tZWRSZWN0KGxvY2FsQm91bmRzKTsKKyAgICBpZiAoem9v
bUxldmVsICE9IDEuMGYpIHsKKyAgICAgICAgdW56b29tZWRSZWN0LnNldFdpZHRoKHVuem9vbWVk
UmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgdW56b29tZWRSZWN0LnNldEhlaWdo
dCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICBwYWludEluZm8u
Y29udGV4dC0+dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54KCksIHVuem9vbWVkUmVjdC55KCkpOwor
ICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9v
bUxldmVsKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLXVuem9vbWVk
UmVjdC54KCksIC11bnpvb21lZFJlY3QueSgpKTsKKyAgICB9CisKKyAgICBbW3NlYXJjaCBzZWFy
Y2hCdXR0b25DZWxsXSBkcmF3V2l0aEZyYW1lOnVuem9vbWVkUmVjdCBpblZpZXc6ZG9jdW1lbnRW
aWV3Rm9yKG8pXTsKKyAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSBzZXRDb250cm9sVmll
dzpuaWxdOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWYgRU5BQkxFKERBVEFMSVNUX0VM
RU1FTlQpCitJbnRTaXplIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzbGlkZXJUaWNrU2l6ZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIEludFNpemUoMSwgMyk7Cit9CisKK2ludCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6c2xpZGVyVGlja09mZnNldEZyb21UcmFja0NlbnRlcigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIC05OworfQorI2VuZGlmCisKK2NvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMTU7
Citjb25zdCBpbnQgc2xpZGVyVGh1bWJIZWlnaHQgPSAxNTsKKwordm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVu
dCopIGNvbnN0Cit7CisgICAgZmxvYXQgem9vbUxldmVsID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20o
KTsKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQ
YXJ0IHx8IHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsK
KyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzdGF0aWNfY2FzdDxpbnQ+KHNsaWRlclRo
dW1iV2lkdGggKiB6b29tTGV2ZWwpLCBGaXhlZCkpOworICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0
KExlbmd0aChzdGF0aWNfY2FzdDxpbnQ+KHNsaWRlclRodW1iSGVpZ2h0ICogem9vbUxldmVsKSwg
Rml4ZWQpKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAgYWRqdXN0TWVkaWFTbGlk
ZXJUaHVtYlNpemUoc3R5bGUpOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWNTaGFy
ZWQ6OnNob3VsZFNob3dQbGFjZWhvbGRlcldoZW5Gb2N1c2VkKCkgY29uc3QKK3sKKyNpZiBfX01B
Q19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID49IDEwNzAKKyAgICByZXR1cm4gdHJ1ZTsKKyNl
bHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK05TUG9wVXBCdXR0b25DZWxsKiBS
ZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBCdXR0b24oKSBjb25zdAoreworICAgIGlmICghbV9w
b3B1cEJ1dHRvbikgeworICAgICAgICBtX3BvcHVwQnV0dG9uLmFkb3B0TlMoW1tOU1BvcFVwQnV0
dG9uQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxsOkAiIiBwdWxsc0Rvd246Tk9dKTsKKyAgICAgICAg
W21fcG9wdXBCdXR0b24uZ2V0KCkgc2V0VXNlc0l0ZW1Gcm9tTWVudTpOT107CisgICAgICAgIFtt
X3BvcHVwQnV0dG9uLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJp
b3JdOworICAgIH0KKworICAgIHJldHVybiBtX3BvcHVwQnV0dG9uLmdldCgpOworfQorCitOU1Nl
YXJjaEZpZWxkQ2VsbCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNlYXJjaCgpIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX3NlYXJjaCkgeworICAgICAgICBtX3NlYXJjaC5hZG9wdE5TKFtbTlNTZWFyY2hG
aWVsZENlbGwgYWxsb2NdIGluaXRUZXh0Q2VsbDpAIiJdKTsKKyAgICAgICAgW21fc2VhcmNoLmdl
dCgpIHNldEJlemVsU3R5bGU6TlNUZXh0RmllbGRSb3VuZGVkQmV6ZWxdOworICAgICAgICBbbV9z
ZWFyY2guZ2V0KCkgc2V0QmV6ZWxlZDpZRVNdOworICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0
RWRpdGFibGU6WUVTXTsKKyAgICAgICAgW21fc2VhcmNoLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6
TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOworICAgIH0KKworICAgIHJldHVybiBtX3NlYXJjaC5n
ZXQoKTsKK30KKworTlNNZW51KiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2VhcmNoTWVudVRlbXBs
YXRlKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc2VhcmNoTWVudVRlbXBsYXRlKQorICAgICAgICBt
X3NlYXJjaE1lbnVUZW1wbGF0ZS5hZG9wdE5TKFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxl
OkAiIl0pOworCisgICAgcmV0dXJuIG1fc2VhcmNoTWVudVRlbXBsYXRlLmdldCgpOworfQorCitO
U1NsaWRlckNlbGwqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzbGlkZXJUaHVtYkhvcml6b250YWwo
KSBjb25zdAoreworICAgIGlmICghbV9zbGlkZXJUaHVtYkhvcml6b250YWwpIHsKKyAgICAgICAg
bV9zbGlkZXJUaHVtYkhvcml6b250YWwuYWRvcHROUyhbW05TU2xpZGVyQ2VsbCBhbGxvY10gaW5p
dF0pOworICAgICAgICBbbV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0KCkgc2V0U2xpZGVyVHlw
ZTpOU0xpbmVhclNsaWRlcl07CisgICAgICAgIFttX3NsaWRlclRodW1iSG9yaXpvbnRhbC5nZXQo
KSBzZXRDb250cm9sU2l6ZTpOU1NtYWxsQ29udHJvbFNpemVdOworICAgICAgICBbbV9zbGlkZXJU
aHVtYkhvcml6b250YWwuZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRl
cmlvcl07CisgICAgfQorCisgICAgcmV0dXJuIG1fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmdldCgp
OworfQorCitOU1NsaWRlckNlbGwqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzbGlkZXJUaHVtYlZl
cnRpY2FsKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc2xpZGVyVGh1bWJWZXJ0aWNhbCkgeworICAg
ICAgICBtX3NsaWRlclRodW1iVmVydGljYWwuYWRvcHROUyhbW05TU2xpZGVyQ2VsbCBhbGxvY10g
aW5pdF0pOworICAgICAgICBbbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgpIHNldFNsaWRlclR5
cGU6TlNMaW5lYXJTbGlkZXJdOworICAgICAgICBbbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgp
IHNldENvbnRyb2xTaXplOk5TU21hbGxDb250cm9sU2l6ZV07CisgICAgICAgIFttX3NsaWRlclRo
dW1iVmVydGljYWwuZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlv
cl07CisgICAgfQorCisgICAgcmV0dXJuIG1fc2xpZGVyVGh1bWJWZXJ0aWNhbC5nZXQoKTsKK30K
KworTlNUZXh0RmllbGRDZWxsKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dGV4dEZpZWxkKCkgY29u
c3QKK3sKKyAgICBpZiAoIW1fdGV4dEZpZWxkKSB7CisgICAgICAgIG1fdGV4dEZpZWxkLmFkb3B0
TlMoW1tXZWJDb3JlVGV4dEZpZWxkQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxsOkAiIl0pOworICAg
ICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0QmV6ZWxlZDpZRVNdOworICAgICAgICBbbV90ZXh0
RmllbGQuZ2V0KCkgc2V0RWRpdGFibGU6WUVTXTsKKyAgICAgICAgW21fdGV4dEZpZWxkLmdldCgp
IHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOworI2lmIF9fTUFDX09T
X1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gMTA3MAorICAgICAgICBbbV90ZXh0RmllbGQuZ2V0
KCkgc2V0RHJhd3NCYWNrZ3JvdW5kOllFU107CisgICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBz
ZXRCYWNrZ3JvdW5kQ29sb3I6W05TQ29sb3Igd2hpdGVDb2xvcl1dOworI2Vsc2UKKyAgICAgICAg
Ly8gUG9zdC1MaW9uLCBXZWJDb3JlIGNhbiBiZSBpbiBjaGFyZ2Ugb2YgcGFpbnRpbm5nIHRoZSBi
YWNrZ3JvdW5kIHRoYW5rcyB0bworICAgICAgICAvLyB0aGUgd29ya2Fyb3VuZCBpbiBwbGFjZSBm
b3IgPHJkYXI6Ly9wcm9ibGVtLzExMzg1NDYxPiwgd2hpY2ggaXMgaW1wbGVtZW50ZWQKKyAgICAg
ICAgLy8gYWJvdmUgYXMgX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lLgorICAgICAgICBbbV90
ZXh0RmllbGQuZ2V0KCkgc2V0RHJhd3NCYWNrZ3JvdW5kOk5PXTsKKyNlbmRpZgorICAgIH0KKwor
ICAgIHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsKK30KKworU3RyaW5nIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjpmaWxlTGlzdE5hbWVGb3JXaWR0aChjb25zdCBGaWxlTGlzdCogZmlsZUxpc3QsIGNv
bnN0IEZvbnQmIGZvbnQsIGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dlZCkgY29u
c3QKK3sKKyAgICBpZiAod2lkdGggPD0gMCkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisg
ICAgU3RyaW5nIHN0clRvVHJ1bmNhdGU7CisgICAgaWYgKGZpbGVMaXN0LT5pc0VtcHR5KCkpCisg
ICAgICAgIHN0clRvVHJ1bmNhdGUgPSBmaWxlTGlzdERlZmF1bHRMYWJlbChtdWx0aXBsZUZpbGVz
QWxsb3dlZCk7CisgICAgZWxzZSBpZiAoZmlsZUxpc3QtPmxlbmd0aCgpID09IDEpCisgICAgICAg
IHN0clRvVHJ1bmNhdGUgPSBbW05TRmlsZU1hbmFnZXIgZGVmYXVsdE1hbmFnZXJdIGRpc3BsYXlO
YW1lQXRQYXRoOihmaWxlTGlzdC0+aXRlbSgwKS0+cGF0aCgpKV07CisgICAgZWxzZQorICAgICAg
ICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKG11bHRpcGxlRmlsZVVwbG9h
ZFRleHQoZmlsZUxpc3QtPmxlbmd0aCgpKSwgd2lkdGgsIGZvbnQsIFN0cmluZ1RydW5jYXRvcjo6
RW5hYmxlUm91bmRpbmdIYWNrcyk7CisKKyAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50
ZXJUcnVuY2F0ZShzdHJUb1RydW5jYXRlLCB3aWR0aCwgZm9udCwgU3RyaW5nVHJ1bmNhdG9yOjpF
bmFibGVSb3VuZGluZ0hhY2tzKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFp
bnRQbHVnSW5TbmFwc2hvdE92ZXJsYXkoUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4qIHJlbmRlcmVy
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zm
c2V0KSBjb25zdAoreworICAgIExheW91dFVuaXQgY1dpZHRoID0gcmVuZGVyZXItPmNvbnRlbnRX
aWR0aCgpOworICAgIExheW91dFVuaXQgY0hlaWdodCA9IHJlbmRlcmVyLT5jb250ZW50SGVpZ2h0
KCk7CisgICAgaWYgKCFjV2lkdGggfHwgIWNIZWlnaHQpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzQ29udGV4dCogY29udGV4dCA9IHBhaW50SW5mby5jb250ZXh0OworICAgIEdyYXBo
aWNzQ29udGV4dFN0YXRlU2F2ZXIgc2F2ZXIoKmNvbnRleHQpOworCisgICAgTGF5b3V0U2l6ZSBi
b3JkZXJBbmRQYWRkaW5nKHJlbmRlcmVyLT5ib3JkZXJMZWZ0KCkgKyByZW5kZXJlci0+cGFkZGlu
Z0xlZnQoKSwgcmVuZGVyZXItPmJvcmRlclRvcCgpICsgcmVuZGVyZXItPnBhZGRpbmdUb3AoKSk7
CisKKyAgICBMYXlvdXRTaXplIGNvbnRlbnRTaXplKGNXaWR0aCwgY0hlaWdodCk7CisgICAgTGF5
b3V0UG9pbnQgY29udGVudExvY2F0aW9uID0gcGFpbnRPZmZzZXQ7CisgICAgY29udGVudExvY2F0
aW9uLm1vdmUoYm9yZGVyQW5kUGFkZGluZyk7CisKKyAgICBSZWZQdHI8R3JhZGllbnQ+IGcgPSBH
cmFkaWVudDo6Y3JlYXRlKGNvbnRlbnRMb2NhdGlvbiwgRmxvYXRQb2ludChjb250ZW50TG9jYXRp
b24ueCgpLCBjb250ZW50TG9jYXRpb24ueSgpICsgY0hlaWdodCkpOworICAgIGctPmFkZENvbG9y
U3RvcCgwLCAgQ29sb3IoLjVmLCAuNSwgLjUsIC43KSk7CisgICAgZy0+YWRkQ29sb3JTdG9wKC4y
LCBDb2xvciguNTRmLCAuNTQsIC41NCwgLjMpKTsKKyAgICBnLT5hZGRDb2xvclN0b3AoLjYsIENv
bG9yKC42MmYsIC42MiwgLjYyLCAuMykpOworICAgIGctPmFkZENvbG9yU3RvcCgxLCAgQ29sb3Io
LjdmLCAuNywgLjcsIC45NSkpOworICAgIGNvbnRleHQtPnNldEZpbGxHcmFkaWVudChnLnJlbGVh
c2UoKSk7CisgICAgY29udGV4dC0+ZmlsbFJlY3QocGl4ZWxTbmFwcGVkSW50UmVjdChMYXlvdXRS
ZWN0KGNvbnRlbnRMb2NhdGlvbiwgY29udGVudFNpemUpKSk7CisKKyAgICBzdGF0aWMgY29uc3Qg
ZmxvYXQgZGlhbWV0ZXIgPSA1MCwgdHJpYW5nbGVSYWRpdXMgPSAxMjsKKyAgICBMYXlvdXRQb2lu
dCBjZW50ZXIgPSBjb250ZW50TG9jYXRpb247CisgICAgY2VudGVyLm1vdmUoY1dpZHRoIC8gMiwg
Y0hlaWdodCAvIDIpOworICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvciguNGYsIC40LCAu
NCwgLjcpLCBDb2xvclNwYWNlU1JHQik7CisgICAgY29udGV4dC0+ZmlsbEVsbGlwc2UoRmxvYXRS
ZWN0KGNlbnRlci54KCkgLSBkaWFtZXRlciAvIDIsIGNlbnRlci55KCkgLSBkaWFtZXRlciAvIDIs
IGRpYW1ldGVyLCBkaWFtZXRlcikpOworCisgICAgUGF0aCBwOworICAgIHAubW92ZVRvKEZsb2F0
UG9pbnQoY2VudGVyLngoKSAtIHRyaWFuZ2xlUmFkaXVzICogMyAvIDQsIGNlbnRlci55KCkgLSB0
cmlhbmdsZVJhZGl1cykpOworICAgIHAuYWRkTGluZVRvKEZsb2F0UG9pbnQoY2VudGVyLngoKSAr
IHRyaWFuZ2xlUmFkaXVzICogNSAvIDQsIGNlbnRlci55KCkpKTsKKyAgICBwLmFkZExpbmVUbyhG
bG9hdFBvaW50KGNlbnRlci54KCkgLSB0cmlhbmdsZVJhZGl1cyAqIDMgLyA0LCBjZW50ZXIueSgp
ICsgdHJpYW5nbGVSYWRpdXMpKTsKKyAgICBwLmNsb3NlU3VicGF0aCgpOworICAgIGNvbnRleHQt
PnNldEZpbGxDb2xvcihDb2xvcigxLmYsIDEuZiwgMS5mLCAuOWYpLCBDb2xvclNwYWNlU1JHQik7
CisgICAgY29udGV4dC0+ZmlsbFBhdGgocCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
      

    </bug>

</bugzilla>