<?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>174942</bug_id>
          
          <creation_ts>2017-07-28 10:28:19 -0700</creation_ts>
          <short_desc>[Curl] Use SQLite database in cookie jar implementation for Curl port</short_desc>
          <delta_ts>2018-11-14 11:00:36 -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>WebCore Misc.</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>175084</dependson>
    
    <dependson>174943</dependson>
          <blocked>117300</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Basuke Suzuki">basuke</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>achristensen</cc>
    
    <cc>basuke</cc>
    
    <cc>beidson</cc>
    
    <cc>bfulgham</cc>
    
    <cc>chris.reid</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>don.olmstead</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zecke</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1332988</commentid>
    <comment_count>0</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2017-07-28 10:28:19 -0700</bug_when>
    <thetext>Current file based implementation is far from ideal. The goal is to replace its backend from file to database.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1390259</commentid>
    <comment_count>1</comment_count>
      <attachid>331552</attachid>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-01-17 16:04:31 -0800</bug_when>
    <thetext>Created attachment 331552
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1390311</commentid>
    <comment_count>2</comment_count>
      <attachid>331552</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-01-17 17:41:12 -0800</bug_when>
    <thetext>Comment on attachment 331552
Patch

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

I feel like this patch has a lot of parsers.  Are there not existing parsers for these things?

&gt; Source/WebCore/ChangeLog:3
&gt; +        [Curl] Use SQLite database in cookie jar implementation for Curl port

Cool!

&gt; Source/WebCore/platform/network/curl/CookieJarCurlDatabase.cpp:89
&gt; +    CookieJarDB* cookieJarDB = CookieJarDB::getInstance();

This should be implemented by NetworkStorageSession instead of having a global singleton.

&gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:76
&gt; +CookieJarDB* CookieJarDB::getInstance()

This could return a reference.

&gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:80
&gt; +        CookieJarDB::s_instance = new CookieJarDB();

This should use smart pointers or NeverDestroyed to avoid explicit new/delete calls.

&gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:84
&gt; +void CookieJarDB::releaseInstance()

This is never called.

&gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:191
&gt; +void CookieJarDB::detectDatabaseCorruption()

Does this really detect anything?

&gt; Source/WebCore/platform/network/curl/CookieUtil.cpp:82
&gt; +static bool parseExpires(const char* expires, time_t&amp; time)

This could return std::optional&lt;time_t&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1390634</commentid>
    <comment_count>3</comment_count>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-01-18 13:00:50 -0800</bug_when>
    <thetext>(In reply to Alex Christensen from comment #2)
&gt; Comment on attachment 331552 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=331552&amp;action=review
&gt; 
&gt; I feel like this patch has a lot of parsers.  Are there not existing parsers
&gt; for these things?

I wasn&apos;t able to find any parsers for cookie strings within WebCore for other network layers. They all seem to be using a library for parsing.
CookieJarSoup uses soup_cookie_parse
CookieJarCF uses CFHTTPCookieCreateWithResponseHeaderFields
CookieJarMac uses NSHTTPCookie&apos;s cookiesWithResponseHeaderFields

getNetscapeCookieFormat in CookieJarCurl does some similar parsing but it can&apos;t be used directly since it&apos;s just returning a string in a different format.
I can pull out that parsing code and share it with the cookie jar if that&apos;s preferred.

&gt; &gt; Source/WebCore/ChangeLog:3
&gt; &gt; +        [Curl] Use SQLite database in cookie jar implementation for Curl port
&gt; 
&gt; Cool!
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CookieJarCurlDatabase.cpp:89
&gt; &gt; +    CookieJarDB* cookieJarDB = CookieJarDB::getInstance();
&gt; 
&gt; This should be implemented by NetworkStorageSession instead of having a
&gt; global singleton.
&gt; 

I&apos;ll look into using that.

&gt; &gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:76
&gt; &gt; +CookieJarDB* CookieJarDB::getInstance()
&gt; 
&gt; This could return a reference.
&gt; 

Will do.

&gt; &gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:80
&gt; &gt; +        CookieJarDB::s_instance = new CookieJarDB();
&gt; 
&gt; This should use smart pointers or NeverDestroyed to avoid explicit
&gt; new/delete calls.
&gt; 

Will do.

&gt; &gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:84
&gt; &gt; +void CookieJarDB::releaseInstance()
&gt; 
&gt; This is never called.
&gt; 

I&apos;ll take that out.

&gt; &gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:191
&gt; &gt; +void CookieJarDB::detectDatabaseCorruption()
&gt; 
&gt; Does this really detect anything?
&gt; 

flagDatabaseCorruption seems like a more suitable name.

&gt; &gt; Source/WebCore/platform/network/curl/CookieUtil.cpp:82
&gt; &gt; +static bool parseExpires(const char* expires, time_t&amp; time)
&gt; 
&gt; This could return std::optional&lt;time_t&gt;

Will do.


Thanks for the feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395197</commentid>
    <comment_count>4</comment_count>
      <attachid>332812</attachid>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-01-31 15:38:20 -0800</bug_when>
    <thetext>Created attachment 332812
Patch

Updated patch based on Alex&apos;s feedback.

I also added a flag to use the old backend with ENABLE(CURL_COOKIE_STORAGE).
I think we&apos;d want to solely use the CookieJarDB backend in curl and remove handling cookies with libcurl, but I&apos;m not sure if the libcurl cookie backend should be removed yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395198</commentid>
    <comment_count>5</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2018-01-31 15:40:39 -0800</bug_when>
    <thetext>Attachment 332812 did not pass style-queue:


ERROR: Source/WebCore/ChangeLog:8:  Line contains tab character.  [whitespace/tab] [5]
ERROR: Source/WebCore/ChangeLog:9:  Line contains tab character.  [whitespace/tab] [5]
ERROR: Source/WebCore/ChangeLog:10:  Line contains tab character.  [whitespace/tab] [5]
ERROR: Source/WebCore/ChangeLog:11:  Line contains tab character.  [whitespace/tab] [5]
ERROR: Source/WebCore/ChangeLog:12:  Line contains tab character.  [whitespace/tab] [5]
Total errors found: 5 in 15 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395201</commentid>
    <comment_count>6</comment_count>
      <attachid>332814</attachid>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-01-31 15:45:38 -0800</bug_when>
    <thetext>Created attachment 332814
Patch

Fixing ChangeLog style issues</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395217</commentid>
    <comment_count>7</comment_count>
      <attachid>332814</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-01-31 16:04:53 -0800</bug_when>
    <thetext>Comment on attachment 332814
Patch

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

&gt; Source/WebCore/platform/network/NetworkStorageSession.h:165
&gt; +    std::unique_ptr&lt;CookieJarCurl&gt; m_cookieStorage;

These could be UniqueRef&lt;CookieJarCurl&gt; or just CookieJarCurl.

&gt; Source/WebCore/platform/network/NetworkStorageSession.h:166
&gt; +#if !ENABLE(CURL_COOKIE_STORAGE)

Is there a reason we want to leave the code from both cookie storage formats?  Isn&apos;t the database format better?

&gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:260
&gt; +    std::unique_ptr&lt;SQLiteStatement&gt; pstmt;
&gt; +    pstmt = std::make_unique&lt;SQLiteStatement&gt;(m_database, sql);

You can assign to it on the same line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395237</commentid>
    <comment_count>8</comment_count>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-01-31 16:42:31 -0800</bug_when>
    <thetext>(In reply to Alex Christensen from comment #7)
&gt; Comment on attachment 332814 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=332814&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/NetworkStorageSession.h:165
&gt; &gt; +    std::unique_ptr&lt;CookieJarCurl&gt; m_cookieStorage;
&gt; 
&gt; These could be UniqueRef&lt;CookieJarCurl&gt; or just CookieJarCurl.

Will do.

&gt; &gt; Source/WebCore/platform/network/NetworkStorageSession.h:166
&gt; &gt; +#if !ENABLE(CURL_COOKIE_STORAGE)
&gt; 
&gt; Is there a reason we want to leave the code from both cookie storage
&gt; formats?  Isn&apos;t the database format better?

We don&apos;t need the old format in, I&apos;ll take it out. I was just worried that other projects using curl might not want to use the new format just yet.

&gt; &gt; Source/WebCore/platform/network/curl/CookieJarDB.cpp:260
&gt; &gt; +    std::unique_ptr&lt;SQLiteStatement&gt; pstmt;
&gt; &gt; +    pstmt = std::make_unique&lt;SQLiteStatement&gt;(m_database, sql);
&gt; 
&gt; You can assign to it on the same line.

Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395277</commentid>
    <comment_count>9</comment_count>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-01-31 18:04:01 -0800</bug_when>
    <thetext>(In reply to Christopher Reid from comment #8)
&gt; (In reply to Alex Christensen from comment #7)
&gt; &gt; Comment on attachment 332814 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=332814&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/network/NetworkStorageSession.h:165
&gt; &gt; &gt; +    std::unique_ptr&lt;CookieJarCurl&gt; m_cookieStorage;
&gt; &gt; 
&gt; &gt; These could be UniqueRef&lt;CookieJarCurl&gt; or just CookieJarCurl.
&gt; 
&gt; Will do.

Actually, I&apos;m not sure if I can do this. PlatformCookieJar.h dispatcher functions use a const NetworkStorageSession&amp; and I would have to make all the calls to CookieJarDB const which doesn&apos;t seem ideal. I thought UniqueRef might allow modifying the underlying data in a const call but that doesn&apos;t seem to be the case. Is there any way around that or should I just stick with unique_ptr?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395403</commentid>
    <comment_count>10</comment_count>
      <attachid>332865</attachid>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-02-01 02:49:29 -0800</bug_when>
    <thetext>Created attachment 332865
Patch

I removed all the old curl cookie code and ended up using mutable to avoid using unique_ptr in NetworkStorageSession.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395409</commentid>
    <comment_count>11</comment_count>
      <attachid>332866</attachid>
    <who name="Christopher Reid">chris.reid</who>
    <bug_when>2018-02-01 03:10:00 -0800</bug_when>
    <thetext>Created attachment 332866
Patch

Had the wrong line endings in the last patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395683</commentid>
    <comment_count>12</comment_count>
      <attachid>332866</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-02-01 16:08:46 -0800</bug_when>
    <thetext>Comment on attachment 332866
Patch

Clearing flags on attachment: 332866

Committed r227987: &lt;https://trac.webkit.org/changeset/227987&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395684</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-02-01 16:08:47 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1395685</commentid>
    <comment_count>14</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2018-02-01 16:11:26 -0800</bug_when>
    <thetext>&lt;rdar://problem/37135651&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1478530</commentid>
    <comment_count>15</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2018-11-14 11:00:36 -0800</bug_when>
    <thetext>*** Bug 14730 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>331552</attachid>
            <date>2018-01-17 16:04:31 -0800</date>
            <delta_ts>2018-01-31 15:38:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>174942.diff</filename>
            <type>text/plain</type>
            <size>54047</size>
            <attacher name="Christopher Reid">chris.reid</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA0M2FkNzM1ODRkNS4uNzdiZDlmODhiYzYgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzMyBAQAorMjAxOC0wMS0xNyAgQ2hyaXN0b3BoZXIgUmVpZCAgPGNocmlzLnJlaWRAc29u
eS5jb20+CisKKyAgICAgICAgW0N1cmxdIFVzZSBTUUxpdGUgZGF0YWJhc2UgaW4gY29va2llIGph
ciBpbXBsZW1lbnRhdGlvbiBmb3IgQ3VybCBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIFNldC1Db29raWUgaXMgYWxyZWFk
eSB0ZXN0ZWQgaW4gTGF5b3V0IHRlc3RzLgorCisgICAgICAgIEFkZGluZyBhbiBpbml0aWFsIFNR
TGl0ZSBDb29raWVKYXIgaW1wbGVtZW50YXRpb24gdG8gdGhlIGN1cmwgbmV0d29yayBsYXllci4K
KyAgICAgICAgV2ViQ29yZSB3aWxsIG5vdyBwYXJzZSBhbmQgaGFuZGxlIGJvdGggSFRUUCBhbmQg
RE9NIGNvb2tpZXMgaW5zdGVhZCBvZiB1c2luZyBsaWJjdXJsLgorICAgICAgICBUaGlzIGN1cnJl
bnRseSBzdXBwb3J0cyBjb29raWUgc3RvcmFnZSBhbmQgcmV0cmlldmFsLgorICAgICAgICBDb29r
aWUgZGVsZXRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHBsYXRmb3Jt
L0N1cmwuY21ha2U6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1
cmwuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmg6
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5j
cHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJs
RGF0YWJhc2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tp
ZUphckRCLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tp
ZUphckRCLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVV
dGlsLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0
aWwuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0
LmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaDoKKyAg
ICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybERvd25sb2FkLmNwcDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwOgorICAgICAgICAqIHBsYXRm
b3JtL25ldHdvcmsvY3VybC9DdXJsUmVxdWVzdC5oOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHA6CisKIDIwMTgtMDEtMTIgIEpl
ciBOb2JsZSAgPGplci5ub2JsZUBhcHBsZS5jb20+CiAKICAgICAgICAgV3JhcCBDRE1GYWlyUGxh
eVN0cmVhbWluZyBhbmQgcmVsYXRlZCBjbGFzc2VzIGluIEVOQUJMRShFTkNSWVBURURfTUVESUEp
IGNoZWNrcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZSBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UKaW5kZXggY2RhZWY1YmY3NGEuLjcz
YzAxNGYxNWMxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtl
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UKQEAgLTUsNyArNSwxMCBA
QCBsaXN0KEFQUEVORCBXZWJDb3JlX0lOQ0xVREVfRElSRUNUT1JJRVMKIGxpc3QoQVBQRU5EIFdl
YkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9BdXRoZW50aWNhdGlvbkNo
YWxsZW5nZUN1cmwuY3BwCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwu
Y3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5jcHAK
KyAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyREIuY3BwCiAgICAgcGxhdGZvcm0v
bmV0d29yay9jdXJsL0Nvb2tpZVN0b3JhZ2VDdXJsLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVVdGlsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DcmVkZW50aWFs
U3RvcmFnZUN1cmwuY3BwCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDYWNoZUVudHJ5
LmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ2FjaGVNYW5hZ2VyLmNwcApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1
cmwuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1
cmwuY3BwCmluZGV4IGUzYjcyOGI4M2JmLi4yMzljMDVhNzY2ZSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcApAQCAt
MjEsNiArMjEsNyBAQAogCiAjaWYgVVNFKENVUkwpCiAjaW5jbHVkZSAiQ29va2llLmgiCisjaW5j
bHVkZSAiQ29va2llVXRpbC5oIgogI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCiAjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJVUkwuaCIKQEAgLTQ1LDI5ICs0Niw2IEBAIHN0
YXRpYyB2b2lkIHJlYWRDdXJsQ29va2llVG9rZW4oY29uc3QgY2hhciomIGNvb2tpZSwgU3RyaW5n
JiB0b2tlbikKICAgICAgICAgY29va2llKys7CiB9CiAKLXN0YXRpYyBib29sIGRvbWFpbk1hdGNo
KGNvbnN0IFN0cmluZyYgY29va2llRG9tYWluLCBjb25zdCBTdHJpbmcmIGhvc3QpCi17Ci0gICAg
c2l6ZV90IGluZGV4ID0gaG9zdC5maW5kKGNvb2tpZURvbWFpbik7Ci0KLSAgICBib29sIHRhaWxN
YXRjaCA9IChpbmRleCAhPSBXVEY6Om5vdEZvdW5kICYmIGluZGV4ICsgY29va2llRG9tYWluLmxl
bmd0aCgpID09IGhvc3QubGVuZ3RoKCkpOwotCi0gICAgLy8gQ2hlY2sgaWYgaG9zdCBlcXVhbHMg
Y29va2llIGRvbWFpbi4KLSAgICBpZiAodGFpbE1hdGNoICYmICFpbmRleCkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICAvLyBDaGVjayBpZiBob3N0IGlzIGEgc3ViZG9tYWluIG9mIHRoZSBk
b21haW4gaW4gdGhlIGNvb2tpZS4KLSAgICAvLyBDdXJsIHVzZXMgYSAnLicgaW4gZnJvbnQgb2Yg
ZG9tYWlucyB0byBpbmRpY2F0ZSBpdCdzIHZhbGlkIG9uIHN1YmRvbWFpbnMuCi0gICAgaWYgKHRh
aWxNYXRjaCAmJiBpbmRleCA+IDAgJiYgaG9zdFtpbmRleF0gPT0gJy4nKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLQotICAgIC8vIENoZWNrIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgaG9zdCBlcXVh
bHMgdGhlIGNvb2tpZSBkb21haW4sIGV4Y2VwdCBmb3IgYSBsZWFkaW5nICcuJyBpbiB0aGUgY29v
a2llIGRvbWFpbi4KLSAgICAvLyBFLmcuIGNvb2tpZSBkb21haW4gaXMgLmFwcGxlLmNvbSBhbmQg
aG9zdCBpcyBhcHBsZS5jb20uIAotICAgIGlmIChjb29raWVEb21haW5bMF0gPT0gJy4nICYmIGNv
b2tpZURvbWFpbi5maW5kKGhvc3QpID09IDEpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg
cmV0dXJuIGZhbHNlOwotfQotCiBzdGF0aWMgdm9pZCBhZGRNYXRjaGluZ0N1cmxDb29raWUoY29u
c3QgY2hhciogY29va2llLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwYXRo
LCBTdHJpbmdCdWlsZGVyJiBjb29raWVzLCBib29sIGh0dHBvbmx5KQogewogICAgIC8vIENoZWNr
IGlmIHRoZSBjb29raWUgbWF0Y2hlcyBkb21haW4gYW5kIHBhdGgsIGFuZCBpcyBub3QgZXhwaXJl
ZC4KQEAgLTEwMyw3ICs4MSw3IEBAIHN0YXRpYyB2b2lkIGFkZE1hdGNoaW5nQ3VybENvb2tpZShj
b25zdCBjaGFyKiBjb29raWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zCiAgICAgICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKCFkb21haW5NYXRjaChjb29raWVEb21haW4sIGRv
bWFpbikpCisgICAgaWYgKCFDb29raWVVdGlsOjpkb21haW5NYXRjaChjb29raWVEb21haW4sIGRv
bWFpbikpCiAgICAgICAgIHJldHVybjsKIAogICAgIFN0cmluZyBzdHJCb29sZWFuOwpAQCAtMjg5
LDYgKzI2NywyMCBAQCBzdGF0aWMgU3RyaW5nIGNvb2tpZXNGb3JTZXNzaW9uKGNvbnN0IE5ldHdv
cmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNvbnN0CiAgICAgcmV0dXJuIGNvb2tpZXM7
CiB9CiAKK3ZvaWQgQ29va2llSmFyQ3VybEZpbGVTeXN0ZW06OmluaXRpYWxpemUoY29uc3QgU3Ry
aW5nJiBmaWxlTmFtZSkKK3sKKyAgICBDVVJMKiBjdXJsID0gY3VybF9lYXN5X2luaXQoKTsKKwor
ICAgIGlmICghZmlsZU5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQo
Y3VybCwgQ1VSTE9QVF9DT09LSUVGSUxFLCBmaWxlTmFtZS51dGY4KCkuZGF0YSgpKTsKKyAgICAg
ICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUpBUiwgZmlsZU5hbWUudXRm
OCgpLmRhdGEoKSk7CisgICAgfQorCisgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BU
X0NPT0tJRVNFU1NJT04sIDEpOworCisgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7Cit9CisK
IHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpjb29raWVz
Rm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiBm
aXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJ
RCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykK
IHsKICAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwuaAppbmRleCBhNTJmZDc4NjE3MS4u
MTllYzk0NWU0MmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJDdXJsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZUphckN1cmwuaApAQCAtMjgsOCArMjgsMTAgQEAgY2xhc3MgVVJMOwogCiBj
bGFzcyBDb29raWVKYXJDdXJsIHsKIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6
ZShjb25zdCBTdHJpbmcmIGZpbGVOYW1lKSA9IDA7CiAgICAgdmlydHVhbCBzdGQ6OnBhaXI8U3Ry
aW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNv
bnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4g
ZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29v
a2llcykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3
b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBh
Z2VJRCwgY29uc3QgU3RyaW5nJikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb29raWVzRnJv
bUhUVFBSZXNwb25zZShjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSA9IDA7CiAgICAgdmlydHVh
bCBib29sIGNvb2tpZXNFbmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpID0gMDsK
ICAgICB2aXJ0dWFsIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RIZWFkZXJG
aWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQ
YXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpv
cHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgPSAwOwogICAg
IHZpcnR1YWwgYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYs
IGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2ll
PiYpID0gMDsKQEAgLTQxLDggKzQzLDEwIEBAIHB1YmxpYzoKIH07CiAKIGNsYXNzIENvb2tpZUph
ckN1cmxGaWxlU3lzdGVtIDogcHVibGljIENvb2tpZUphckN1cmwgeworICAgIHZvaWQgaW5pdGlh
bGl6ZShjb25zdCBTdHJpbmcmIGZpbGVOYW1lKSBvdmVycmlkZTsKICAgICBzdGQ6OnBhaXI8U3Ry
aW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNv
bnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4g
ZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29v
a2llcykgb3ZlcnJpZGU7CiAgICAgdm9pZCBzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3Jr
U3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6
b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJ
RCwgY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDb29raWVzRnJvbUhUVFBS
ZXNwb25zZShjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlkZSB7IH07CiAgICAgYm9v
bCBjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKSBvdmVycmlkZTsK
ICAgICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1
ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNv
bnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJyaWRlOwogICAgIGJv
b2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwm
IGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQs
IHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4mKSBvdmVycmlk
ZTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29r
aWVKYXJDdXJsRGF0YWJhc2UuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAuLjQ5ZDU5OWZmOThhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5jcHAKQEAgLTAs
MCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBF
bnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
CisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkNvb2tpZUphckN1cmxEYXRhYmFzZS5oIgorCisjaWYgVVNFKENVUkwpCisjaW5jbHVk
ZSAiQ29va2llLmgiCisjaW5jbHVkZSAiQ29va2llSmFyREIuaCIKKyNpbmNsdWRlICJDb29raWVV
dGlsLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJVUkwuaCIKKwor
I2luY2x1ZGUgPHd0Zi9EYXRlTWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5j
bHVkZSA8d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9X
VEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgU3RyaW5nIGNvb2tp
ZXNGb3JTZXNzaW9uKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNv
bnN0IFVSTCYgdXJsLCBib29sIGh0dHBvbmx5KQoreworICAgIFN0cmluZyBjb29raWVzOworCisg
ICAgQ29va2llSmFyREIqIGNvb2tpZUphckRCID0gQ29va2llSmFyREI6OmdldEluc3RhbmNlKCk7
CisgICAgaWYgKGNvb2tpZUphckRCICYmIGNvb2tpZUphckRCLT5pc0VuYWJsZWQoKSkgeworICAg
ICAgICBhdXRvIGlzSHR0cE9ubHkgPSAoaHR0cG9ubHkgPyBzdGQ6Om51bGxvcHQgOiBzdGQ6Om9w
dGlvbmFsPGJvb2w+IHtmYWxzZX0pOworICAgICAgICBhdXRvIHNlY3VyZSA9IHVybC5wcm90b2Nv
bElzKCJodHRwcyIpID8gc3RkOjpudWxsb3B0IDogc3RkOjpvcHRpb25hbDxib29sPiB7ZmFsc2V9
OworICAgICAgICBhdXRvIHNlc3Npb24gPSBzdGQ6Om51bGxvcHQ7CisgICAgICAgIFZlY3RvcjxD
b29raWU+IHJlc3VsdHM7CisgICAgICAgIGlmIChjb29raWVKYXJEQi0+c2VhcmNoQ29va2llcyh1
cmwuc3RyaW5nKCksIGlzSHR0cE9ubHksIHNlY3VyZSwgc2Vzc2lvbiwgcmVzdWx0cykpIHsKKyAg
ICAgICAgICAgIGZvciAoYXV0byByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgICAgICAgICAg
aWYgKCFjb29raWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29va2llcy5hcHBl
bmQoIjsgIik7CisgICAgICAgICAgICAgICAgY29va2llcy5hcHBlbmQocmVzdWx0Lm5hbWUpOwor
ICAgICAgICAgICAgICAgIGNvb2tpZXMuYXBwZW5kKCI9Iik7CisgICAgICAgICAgICAgICAgY29v
a2llcy5hcHBlbmQocmVzdWx0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KKyAgICByZXR1cm4gY29va2llczsKK30KKwordm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6
OmluaXRpYWxpemUoY29uc3QgU3RyaW5nJiBmaWxlTmFtZSkKK3sKKyAgICBDb29raWVKYXJEQiog
Y29va2llSmFyREIgPSBDb29raWVKYXJEQjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoY29va2ll
SmFyREIpCisgICAgICAgIGNvb2tpZUphckRCLT5pbml0aWFsaXplKGZpbGVOYW1lKTsKK30KKwor
dm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OnNldENvb2tpZXNGcm9tRE9NKGNvbnN0IE5ldHdv
cmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmws
IHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+
IHBhZ2VJRCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJ
RCk7CisgICAgVU5VU0VEX1BBUkFNKHBhZ2VJRCk7CisKKyAgICBDb29raWVKYXJEQiogY29va2ll
SmFyREIgPSBDb29raWVKYXJEQjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoY29va2llSmFyREIp
CisgICAgICAgIGNvb2tpZUphckRCLT5zZXRDb29raWUodXJsLnN0cmluZygpLCB2YWx1ZSwgdHJ1
ZSk7CisgICAgcmV0dXJuOworfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6c2V0Q29v
a2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdmFsdWUp
Cit7CisgICAgQ29va2llSmFyREIqIGNvb2tpZUphckRCID0gQ29va2llSmFyREI6OmdldEluc3Rh
bmNlKCk7CisgICAgaWYgKGNvb2tpZUphckRCKQorICAgICAgICBjb29raWVKYXJEQi0+c2V0Q29v
a2llKHVybC5zdHJpbmcoKSwgdmFsdWUsIGZhbHNlKTsKKyAgICByZXR1cm47Cit9CisKK3N0ZDo6
cGFpcjxTdHJpbmcsIGJvb2w+IENvb2tpZUphckN1cmxEYXRhYmFzZTo6Y29va2llc0ZvckRPTShj
b25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0
eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6
b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpCit7CisgICAg
VU5VU0VEX1BBUkFNKGZyYW1lSUQpOworICAgIFVOVVNFRF9QQVJBTShwYWdlSUQpOworCisgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIGZpbHRlciBzZWN1cmUgY29va2llcyBvdXQgaWYgdGhlIGNh
bGxlciByZXF1ZXN0cyBpdC4KKyAgICByZXR1cm4geyBjb29raWVzRm9yU2Vzc2lvbihzZXNzaW9u
LCBmaXJzdFBhcnR5LCB1cmwsIGZhbHNlKSwgZmFsc2UgfTsKK30KKworc3RkOjpwYWlyPFN0cmlu
ZywgYm9vbD4gQ29va2llSmFyQ3VybERhdGFiYXNlOjpjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRW
YWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmly
c3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQs
IHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpCit7
CisgICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOworICAgIFVOVVNFRF9QQVJBTShwYWdlSUQpOwor
CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGZpbHRlciBzZWN1cmUgY29va2llcyBvdXQgaWYg
dGhlIGNhbGxlciByZXF1ZXN0cyBpdC4KKyAgICByZXR1cm4geyBjb29raWVzRm9yU2Vzc2lvbihz
ZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIHRydWUpLCBmYWxzZSB9OworfQorCitib29sIENvb2tp
ZUphckN1cmxEYXRhYmFzZTo6Y29va2llc0VuYWJsZWQoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNz
aW9uJikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb29raWVKYXJDdXJsRGF0YWJh
c2U6OmdldFJhd0Nvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJM
JiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlE
LCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIFZlY3RvcjxDb29raWU+JiByYXdDb29r
aWVzKQoreworICAgIFVOVVNFRF9QQVJBTShmcmFtZUlEKTsKKyAgICBVTlVTRURfUEFSQU0ocGFn
ZUlEKTsKKworICAgIENvb2tpZUphckRCKiBjb29raWVKYXJEQiA9IENvb2tpZUphckRCOjpnZXRJ
bnN0YW5jZSgpOworICAgIGlmIChjb29raWVKYXJEQikKKyAgICAgICAgcmV0dXJuIChjb29raWVK
YXJEQi0+c2VhcmNoQ29va2llcyhmaXJzdFBhcnR5LnN0cmluZygpLCBzdGQ6Om51bGxvcHQsIHN0
ZDo6bnVsbG9wdCwgc3RkOjpudWxsb3B0LCByYXdDb29raWVzKSk7CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpkZWxldGVDb29raWUoY29uc3Qg
TmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29v
a2llTmFtZSkKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorfQorCit2b2lk
IENvb2tpZUphckN1cmxEYXRhYmFzZTo6Z2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0
d29ya1N0b3JhZ2VTZXNzaW9uJiwgSGFzaFNldDxTdHJpbmc+JiBob3N0bmFtZXMpCit7CisgICAg
Ly8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKK30KKwordm9pZCBDb29raWVKYXJDdXJsRGF0
YWJhc2U6OmRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNz
aW9uJiwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGNvb2tpZUhvc3ROYW1lcykKK3sKKyAgICAvLyBG
SVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFz
ZTo6ZGVsZXRlQWxsQ29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKQoreworICAg
IC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERh
dGFiYXNlOjpkZWxldGVBbGxDb29raWVzTW9kaWZpZWRTaW5jZShjb25zdCBOZXR3b3JrU3RvcmFn
ZVNlc3Npb24mLCBXYWxsVGltZSkKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRl
ZAorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRh
YmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5kZTg0ODc2YzQ3
MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Db29raWVKYXJDdXJsRGF0YWJhc2UuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE4IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpbmNsdWRlICJDb29raWVKYXJDdXJsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgQ29va2llSmFyQ3VybERhdGFiYXNlIDogcHVibGljIENvb2tpZUphckN1cmwgewor
ICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBTdHJpbmcmIGZpbGVOYW1lKSBvdmVycmlkZTsKKyAg
ICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRp
b25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJ
bmNsdWRlU2VjdXJlQ29va2llcykgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDb29raWVzRnJvbURP
TShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNv
bnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IHBhZ2VJRCwgY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRD
b29raWVzRnJvbUhUVFBSZXNwb25zZShjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlk
ZTsKKyAgICBib29sIGNvb2tpZXNFbmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYp
IG92ZXJyaWRlOworICAgIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RIZWFk
ZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmly
c3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3Rk
OjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgb3ZlcnJp
ZGU7CisgICAgYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYs
IGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2ll
PiYpIG92ZXJyaWRlOworICAgIHZvaWQgZGVsZXRlQ29va2llKGNvbnN0IE5ldHdvcmtTdG9yYWdl
U2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlOworICAgIHZvaWQg
Z2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgSGFz
aFNldDxTdHJpbmc+JiBob3N0bmFtZXMpIG92ZXJyaWRlOworICAgIHZvaWQgZGVsZXRlQ29va2ll
c0Zvckhvc3RuYW1lcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBWZWN0b3I8
U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZUFsbENv
b2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJikgb3ZlcnJpZGU7CisgICAgdm9pZCBk
ZWxldGVBbGxDb29raWVzTW9kaWZpZWRTaW5jZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
LCBXYWxsVGltZSkgb3ZlcnJpZGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyREIu
Y3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNDJhMTMxNmRkMjgKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29v
a2llSmFyREIuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4
IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkNvb2tpZUphckRCLmgiCisKKyNpZiBVU0UoQ1VSTCkKKyNpbmNsdWRlICJDb29r
aWVVdGlsLmgiCisjaW5jbHVkZSAiVVJMLmgiCisKKyNpbmNsdWRlIDxTUUxpdGVGaWxlU3lzdGVt
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2RlZmluZSBDT1JSVVBUX01BUktFUl9TVUZG
SVggIi1jb3JydXB0ZWQiCisKKy8vIEF0IGxlYXN0IDUwIGNvb2tpZXMgcGVyIGRvbWFpbiAoUkZD
NjI2NSA2LjEuIExpbWl0cykKKyNkZWZpbmUgTUFYX0NPT0tJRV9QRVJfRE9NQUlOIDgwCisKKyNk
ZWZpbmUgQ1JFQVRFX0NPT0tJRV9UQUJMRV9TUUwgXAorICAgICJDUkVBVEUgVEFCTEUgSUYgTk9U
IEVYSVNUUyBDb29raWUgKCJcCisgICAgIiAgbmFtZSBURVhUIE5PVCBOVUxMLCJcCisgICAgIiAg
dmFsdWUgVEVYVCwiXAorICAgICIgIGRvbWFpbiBURVhUIE5PVCBOVUxMLCJcCisgICAgIiAgcGF0
aCBURVhUIE5PVCBOVUxMLCJcCisgICAgIiAgZXhwaXJlcyBJTlRFR0VSIE5PVCBOVUxMLCJcCisg
ICAgIiAgc2l6ZSBJTlRFR0VSIE5PVCBOVUxMLCJcCisgICAgIiAgc2Vzc2lvbiBJTlRFR0VSIE5P
VCBOVUxMLCJcCisgICAgIiAgaHR0cG9ubHkgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsIlwK
KyAgICAiICBzZWN1cmUgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsIlwKKyAgICAiICB0YWls
bWF0Y2ggSU5URUdFUiBOT1QgTlVMTCwiXAorICAgICIgIGxhc3R1cGRhdGVkIElOVEVHRVIgTk9U
IE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwgIlwKKyAgICAiICBVTklRVUUobmFtZSwg
ZG9tYWluLCBwYXRoKSk7IgorI2RlZmluZSBDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCBcCisgICAg
IkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGRvbWFpbl9pbmRleCBPTiBDb29raWUoZG9tYWlu
KTsiCisjZGVmaW5lIENSRUFURV9QQVRIX0lOREVYX1NRTCBcCisgICAgIkNSRUFURSBJTkRFWCBJ
RiBOT1QgRVhJU1RTIHBhdGhfaW5kZXggT04gQ29va2llKHBhdGgpOyIKKyNkZWZpbmUgQ0hFQ0tf
RVhJU1RTX0hUVFBPTkxZX0NPT0tJRV9TUUwgXAorICAgICJTRUxFQ1QgbmFtZSBGUk9NIENvb2tp
ZSBXSEVSRSAobmFtZSA9ID8pIEFORCAoZG9tYWluID0gPykgQU5EIChwYXRoID0gPykgQU5EICho
dHRwb25seSA9IDEpOyIKKyNkZWZpbmUgU0VUX0NPT0tJRV9TUUwgXAorICAgICJJTlNFUlQgT1Ig
UkVQTEFDRSBJTlRPIENvb2tpZSAobmFtZSwgdmFsdWUsIGRvbWFpbiwgcGF0aCwgZXhwaXJlcywg
c2l6ZSwgc2Vzc2lvbiwgaHR0cG9ubHksIHNlY3VyZSwgdGFpbG1hdGNoKSAiXAorICAgICJWQUxV
RVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8pOyIKKyNkZWZpbmUgREVMRVRFX0NPT0tJ
RV9CWV9OQU1FX0RPTUFJTl9QQVRIX1NRTCBcCisgICAgIkRFTEVURSBGUk9NIENvb2tpZSBXSEVS
RSBuYW1lID0gPyBBTkQgZG9tYWluID0gPyBBTkQgcGF0aCA9ID87IgorI2RlZmluZSBERUxFVEVf
Q09PS0lFX0JZX05BTUVfRE9NQUlOX1NRTCBcCisgICAgIkRFTEVURSBGUk9NIENvb2tpZSBXSEVS
RSBuYW1lID0gPyBBTkQgZG9tYWluID0gPzsiCisjZGVmaW5lIERFTEVURV9BTExfU0VTU0lPTl9D
T09LSUVfU1FMIFwKKyAgICAiREVMRVRFIEZST00gQ29va2llIFdIRVJFIHNlc3Npb24gPSAxOyIK
KyNkZWZpbmUgREVMRVRFX0FMTF9DT09LSUVfU1FMIFwKKyAgICAiREVMRVRFIEZST00gQ29va2ll
OyIKKworU3RhdGljTG9jayBDb29raWVKYXJEQjo6c19pbnN0YW5jZUxvY2s7CitDb29raWVKYXJE
QiogQ29va2llSmFyREI6OnNfaW5zdGFuY2UgPSAwOworCitDb29raWVKYXJEQiogQ29va2llSmFy
REI6OmdldEluc3RhbmNlKCkKK3sKKyAgICBMb2NrSG9sZGVyIGxvY2tlcihzX2luc3RhbmNlTG9j
ayk7CisgICAgaWYgKCFDb29raWVKYXJEQjo6c19pbnN0YW5jZSkKKyAgICAgICAgQ29va2llSmFy
REI6OnNfaW5zdGFuY2UgPSBuZXcgQ29va2llSmFyREIoKTsKKyAgICByZXR1cm4gQ29va2llSmFy
REI6OnNfaW5zdGFuY2U7Cit9CisKK3ZvaWQgQ29va2llSmFyREI6OnJlbGVhc2VJbnN0YW5jZSgp
Cit7CisgICAgTG9ja0hvbGRlciBsb2NrZXIoc19pbnN0YW5jZUxvY2spOworICAgIGlmICghQ29v
a2llSmFyREI6OnNfaW5zdGFuY2UpCisgICAgICAgIHJldHVybjsKKyAgICBkZWxldGUgQ29va2ll
SmFyREI6OnNfaW5zdGFuY2U7CisgICAgQ29va2llSmFyREI6OnNfaW5zdGFuY2UgPSAwOworfQor
Cit2b2lkIENvb2tpZUphckRCOjppbml0aWFsaXplKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VQYXRo
KQoreworICAgIGlmIChkYXRhYmFzZVBhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX2RhdGFiYXNlUGF0aCA9IFN0cmluZyhkYXRhYmFzZVBhdGgpOworfQorCit2b2lkIENv
b2tpZUphckRCOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlKQoreworICAgIENvb2tpZUphckRCOjpt
X2Nvb2tpZUVuYWJsZSA9IGVuYWJsZTsKK30KKworQ29va2llSmFyREI6OkNvb2tpZUphckRCKCkK
K3sKKyAgICBjaGVja0RhdGFiYXNlQ29ycnVwdGlvbkFuZFJlbW92ZUlmTmVlZGVkKCk7CisKKyAg
ICBpZiAoIW9wZW5EYXRhYmFzZSgpKQorICAgICAgICByZXR1cm47Cit9CisKK0Nvb2tpZUphckRC
Ojp+Q29va2llSmFyREIoKQoreworICAgIGNsb3NlRGF0YWJhc2UoKTsKK30KKworYm9vbCBDb29r
aWVKYXJEQjo6b3BlbkRhdGFiYXNlKCkKK3sKKyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBib29sIGV4aXN0c0RhdGFiYXNlRmlsZSA9IGZh
bHNlOworICAgIGlmICghaXNPbk1lbW9yeSgpKQorICAgICAgICBleGlzdHNEYXRhYmFzZUZpbGUg
PSBTUUxpdGVGaWxlU3lzdGVtOjplbnN1cmVEYXRhYmFzZUZpbGVFeGlzdHMobV9kYXRhYmFzZVBh
dGgsIGZhbHNlKTsKKworICAgIGlmIChleGlzdHNEYXRhYmFzZUZpbGUpIHsKKyAgICAgICAgaWYg
KG1fZGF0YWJhc2Uub3BlbihtX2RhdGFiYXNlUGF0aCwgZmFsc2UpKSB7CisgICAgICAgICAgICBp
ZiAoY2hlY2tEYXRhYmFzZVZhbGlkaXR5KCkpCisgICAgICAgICAgICAgICAgZXhlY3V0ZVNpbXBs
ZVNxbChERUxFVEVfQUxMX1NFU1NJT05fQ09PS0lFX1NRTCk7CisgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICAvLyBkZWxldGUgZGF0YWJhc2UgYW5kIHRyeSB0byByZS1jcmVhdGUg
YWdhaW4KKyAgICAgICAgICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgICAgICAg
ICAgZGVsZXRlQWxsRGF0YWJhc2VGaWxlcygpOworICAgICAgICAgICAgICAgIGV4aXN0c0RhdGFi
YXNlRmlsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgZGVsZXRlQWxsRGF0YWJhc2VGaWxlcygpOworICAgICAgICAgICAgZXhpc3RzRGF0YWJh
c2VGaWxlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWV4aXN0c0RhdGFi
YXNlRmlsZSkgeworICAgICAgICBpZiAobV9kYXRhYmFzZS5vcGVuKG1fZGF0YWJhc2VQYXRoLCBm
YWxzZSkpIHsKKyAgICAgICAgICAgIGJvb2wgZGF0YWJhc2VWYWxpZGl0eSA9IHRydWU7CisgICAg
ICAgICAgICBkYXRhYmFzZVZhbGlkaXR5ICY9IChleGVjdXRlU2ltcGxlU3FsKENSRUFURV9DT09L
SUVfVEFCTEVfU1FMKSA9PSBTUUxJVEVfRE9ORSk7CisgICAgICAgICAgICBkYXRhYmFzZVZhbGlk
aXR5ICY9IChleGVjdXRlU2ltcGxlU3FsKENSRUFURV9ET01BSU5fSU5ERVhfU1FMKSA9PSBTUUxJ
VEVfRE9ORSk7CisgICAgICAgICAgICBkYXRhYmFzZVZhbGlkaXR5ICY9IChleGVjdXRlU2ltcGxl
U3FsKENSRUFURV9QQVRIX0lOREVYX1NRTCkgPT0gU1FMSVRFX0RPTkUpOworICAgICAgICAgICAg
aWYgKCFkYXRhYmFzZVZhbGlkaXR5KSB7CisgICAgICAgICAgICAgICAgLy8gZ2l2ZSB1cCBjcmVh
dGUgZGF0YWJhc2UgYXQgdGhpcyB0aW1lIChhbGwgY29va2llcyBvbiByZXF1ZXN0L3Jlc3BvbnNl
IGFyZSBpZ25vcmVkKQorICAgICAgICAgICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKKyAgICAg
ICAgICAgICAgICBkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGV4ZWN1dGVTaW1wbGVTcWwoIlBSQUdNQSB0ZW1wX3N0b3JlID0g
TUVNT1JZOyIpOworICAgIGV4ZWN1dGVTaW1wbGVTcWwoIlBSQUdNQSBzeW5jaHJvbm91cyA9IE5P
Uk1BTDsiKTsKKyAgICBleGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgam91cm5hbF9tb2RlID0gV0FM
OyIpOworCisgICAgLy8gY3JlYXRlIHByZXBhcmVkIHN0YXRlbWVudHMKKyAgICBjcmVhdGVQcmVw
YXJlU3RhdGVtZW50KFNFVF9DT09LSUVfU1FMKTsKKyAgICBjcmVhdGVQcmVwYXJlU3RhdGVtZW50
KENIRUNLX0VYSVNUU19IVFRQT05MWV9DT09LSUVfU1FMKTsKKyAgICBjcmVhdGVQcmVwYXJlU3Rh
dGVtZW50KERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fUEFUSF9TUUwpOworICAgIGNyZWF0
ZVByZXBhcmVTdGF0ZW1lbnQoREVMRVRFX0NPT0tJRV9CWV9OQU1FX0RPTUFJTl9TUUwpOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29va2llSmFyREI6OmNsb3NlRGF0YWJhc2UoKQor
eworICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0
byYgc3RhdGVtZW50IDogbV9zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZhbHVl
LmdldCgpLT5maW5hbGl6ZSgpOworICAgICAgICBtX3N0YXRlbWVudHMuY2xlYXIoKTsKKyAgICAg
ICAgbV9kYXRhYmFzZS5jbG9zZSgpOworICAgIH0KK30KKworU3RyaW5nIENvb2tpZUphckRCOjpn
ZXRDb3JydXB0aW9uTWFya2VyUGF0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFpc09uTWVtb3J5
KCkpOworCisgICAgcmV0dXJuIG1fZGF0YWJhc2VQYXRoICsgQ09SUlVQVF9NQVJLRVJfU1VGRklY
OworfQorCit2b2lkIENvb2tpZUphckRCOjpkZXRlY3REYXRhYmFzZUNvcnJ1cHRpb24oKQorewor
ICAgIGlmIChpc09uTWVtb3J5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEZJTEUqIGYgPSBm
b3BlbihnZXRDb3JydXB0aW9uTWFya2VyUGF0aCgpLnV0ZjgoKS5kYXRhKCksICJ3YiIpOworICAg
IGZjbG9zZShmKTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6Y2hlY2tEYXRhYmFzZUNvcnJ1cHRp
b25BbmRSZW1vdmVJZk5lZWRlZCgpCit7CisgICAgaWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgc3RydWN0IHN0YXQgc3QgPSB7IDAgfTsKKyAgICBpbnQgcmV0
ID0gc3RhdChnZXRDb3JydXB0aW9uTWFya2VyUGF0aCgpLnV0ZjgoKS5kYXRhKCksICZzdCk7Cisg
ICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRlbGV0ZUFsbERhdGFi
YXNlRmlsZXMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6Y2hl
Y2tTUUxpdGVSZXR1cm5Db2RlKGludCBhY3R1YWwsIGludCBleHBlY3RlZCkKK3sKKyAgICBpZiAo
IW1fZGV0ZWN0ZWREYXRhYmFzZUNvcnJ1cHRpb24pIHsKKyAgICAgICAgc3dpdGNoIChhY3R1YWwp
IHsKKyAgICAgICAgY2FzZSBTUUxJVEVfQ09SUlVQVDoKKyAgICAgICAgY2FzZSBTUUxJVEVfU0NI
RU1BOgorICAgICAgICBjYXNlIFNRTElURV9GT1JNQVQ6CisgICAgICAgIGNhc2UgU1FMSVRFX05P
VEFEQjoKKyAgICAgICAgICAgIGRldGVjdERhdGFiYXNlQ29ycnVwdGlvbigpOworICAgICAgICAg
ICAgbV9kZXRlY3RlZERhdGFiYXNlQ29ycnVwdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gKGFjdHVhbCA9PSBleHBlY3RlZCk7Cit9CisKK2Jvb2wgQ29va2llSmFy
REI6OmNoZWNrRGF0YWJhc2VWYWxpZGl0eSgpCit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2UuaXNP
cGVuKCkpOworCisgICAgcmV0dXJuIG1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkNvb2tpZSIpOwor
fQorCit2b2lkIENvb2tpZUphckRCOjpkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCkKK3sKKyAgICBj
bG9zZURhdGFiYXNlKCk7CisgICAgaWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaW50IHJldCA9IDA7CisgICAgU3RyaW5nIHJlbW92ZVBhdGg7CisKKyAgICAvLyByZW1v
dmUgbWFya2VyIGZpbGUgKGNvb2tpZS5qYXIuZGItY29ycnVwdGVkKQorICAgIHJldCA9IHJlbW92
ZShyZW1vdmVQYXRoLnV0ZjgoKS5kYXRhKCkpOworCisgICAgLy8gcmVtb3ZlIHNobSBmaWxlIChj
b29raWUuamFyLmRiLXNobSkKKyAgICByZW1vdmVQYXRoID0gU3RyaW5nKG1fZGF0YWJhc2VQYXRo
ICsgIi1zaG0iKTsKKyAgICByZXQgPSByZW1vdmUocmVtb3ZlUGF0aC51dGY4KCkuZGF0YSgpKTsK
KworICAgIC8vIHJlbW92ZSB3YWwgZmlsZSAoY29va2llLmphci5kYi13YWwpCisgICAgcmVtb3Zl
UGF0aCA9IFN0cmluZyhtX2RhdGFiYXNlUGF0aCArICItd2FsIik7CisgICAgcmV0ID0gcmVtb3Zl
KHJlbW92ZVBhdGgudXRmOCgpLmRhdGEoKSk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmlzRW5h
YmxlZCgpCit7CisgICAgaWYgKG1fZGF0YWJhc2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcmV0dXJuIG1fY29va2llRW5hYmxlOworfQorCitib29sIENvb2tp
ZUphckRCOjpzZWFyY2hDb29raWVzKGNvbnN0IFN0cmluZyYgcmVxdWVzdFVybCwgY29uc3Qgc3Rk
OjpvcHRpb25hbDxib29sPiYgaHR0cE9ubHksIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIHNl
Y3VyZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgc2Vzc2lvbiwgVmVjdG9yPENvb2tpZT4m
IHJlc3VsdHMpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09wZW4o
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVVJMIHJlcXVlc3RVcmxPYmooUGFyc2Vk
VVJMU3RyaW5nLCByZXF1ZXN0VXJsKTsKKyAgICBTdHJpbmcgcmVxdWVzdEhvc3QocmVxdWVzdFVy
bE9iai5ob3N0KCkuY29udmVydFRvQVNDSUlMb3dlcmNhc2UoKSk7CisgICAgU3RyaW5nIHJlcXVl
c3RQYXRoKHJlcXVlc3RVcmxPYmoucGF0aCgpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkpOwor
CisgICAgaWYgKHJlcXVlc3RIb3N0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKHJlcXVlc3RQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmVxdWVzdFBhdGggPSAi
LyI7CisKKyAgICBjb25zdCBTdHJpbmcgc3FsID0KKyAgICAgICAgIlNFTEVDVCBuYW1lLCB2YWx1
ZSwgZG9tYWluLCBwYXRoLCBleHBpcmVzLCBodHRwb25seSwgc2VjdXJlLCBzZXNzaW9uLCB0YWls
bWF0Y2ggRlJPTSBDb29raWUgV0hFUkUgIlwKKyAgICAgICAgIihOT1QgKChzZXNzaW9uID0gMCkg
QU5EIChkYXRldGltZShleHBpcmVzLCAndW5peGVwb2NoJykgPCBkYXRldGltZSgnbm93JykpKSkg
IlwKKyAgICAgICAgIkFORCAoaHR0cG9ubHkgPSBDT0FMRVNDRShOVUxMSUYoPywgLTEpLCBodHRw
b25seSkpICJcCisgICAgICAgICJBTkQgKHNlY3VyZSA9IENPQUxFU0NFKE5VTExJRig/LCAtMSks
IHNlY3VyZSkpICJcCisgICAgICAgICJBTkQgKHNlc3Npb24gPSBDT0FMRVNDRShOVUxMSUYoPywg
LTEpLCBzZXNzaW9uKSkgIlwKKyAgICAgICAgIkFORCAoKGRvbWFpbiA9ID8pIE9SIChkb21haW4g
R0xPQiA/KSkiOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFNRTGl0ZVN0YXRlbWVudD4gcHN0bXQ7
CisgICAgcHN0bXQgPSBzdGQ6Om1ha2VfdW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4obV9kYXRhYmFz
ZSwgc3FsKTsKKyAgICBwc3RtdC0+cHJlcGFyZSgpOworICAgIHBzdG10LT5iaW5kSW50KDEsIGh0
dHBPbmx5ID8gKmh0dHBPbmx5IDogLTEpOworICAgIHBzdG10LT5iaW5kSW50KDIsIHNlY3VyZSA/
ICpzZWN1cmUgOiAtMSk7CisgICAgcHN0bXQtPmJpbmRJbnQoMywgc2Vzc2lvbiA/ICpzZXNzaW9u
IDogLTEpOworICAgIHBzdG10LT5iaW5kVGV4dCg0LCByZXF1ZXN0SG9zdCk7CisKKyAgICBzaXpl
X3QgdG9wTGV2ZWxTZXBhcmF0b3IgPSByZXF1ZXN0SG9zdC5yZXZlcnNlRmluZCgnLicpOworICAg
IGlmIChDb29raWVVdGlsOjppc0lQQWRkcmVzcyhyZXF1ZXN0SG9zdCkgfHwgdG9wTGV2ZWxTZXBh
cmF0b3IgPT0gbm90Rm91bmQpCisgICAgICAgIHBzdG10LT5iaW5kTnVsbCg1KTsKKyAgICBlbHNl
IHsKKyAgICAgICAgLy8gRklYTUU6IGN1cnJlbnRseSB3ZSBjdXJyZW50bHkgZG8gbm90IGhhdmUg
YSBwdWJsaWMgc3VmZmljIGxpc3QgaW4gd2luY2Fpcm8KKyAgICAgICAgLy8gc28gcmlnaHQgbm93
IHdlIGdsb2IgdXNpbmcganVzdCB0aGUgc2Vjb25kIGxldmVsIGRvbWFpbiBlLmcuICouRE9NQUlO
LmNvbQorICAgICAgICAvLyBUaGlzIHdpbGwgcmV0dXJuIHRvbyBtYW55IGNvb2tpZXMgdW5kZXIg
bXVsdGlsZXZlbCB0bGRzIHN1Y2ggYXMgKi5jby51aworICAgICAgICAvLyBidXQgd2UgZmlsdGVy
IHRob3NlIG91dCBsYXRlcgorCisgICAgICAgIHNpemVfdCBzZWNvbmRMZXZlbFNlcGFyYXRvciA9
IHJlcXVlc3RIb3N0LnJldmVyc2VGaW5kKCcuJywgdG9wTGV2ZWxTZXBhcmF0b3ItMSk7CisgICAg
ICAgIFN0cmluZyBsb2NhbERvbWFpbiA9IHNlY29uZExldmVsU2VwYXJhdG9yID09IG5vdEZvdW5k
ID8gcmVxdWVzdEhvc3QgOiByZXF1ZXN0SG9zdC5zdWJzdHJpbmcoc2Vjb25kTGV2ZWxTZXBhcmF0
b3IrMSk7CisKKyAgICAgICAgQVNTRVJUKCFsb2NhbERvbWFpbi5pc0VtcHR5KCkpOworICAgICAg
ICBwc3RtdC0+YmluZFRleHQoNSwgU3RyaW5nKCIqLiIpICsgbG9jYWxEb21haW4pOworICAgIH0K
KworICAgIGlmICghcHN0bXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJlc3VsdHMu
Y2xlYXIoKTsKKworICAgIHdoaWxlIChwc3RtdC0+c3RlcCgpID09IFNRTElURV9ST1cpIHsKKwor
ICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPiBNQVhfQ09PS0lFX1BFUl9ET01BSU4pCisgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICBTdHJpbmcgY29va2llTmFtZSA9IHBzdG10LT5nZXRD
b2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgY29va2llVmFsdWUgPSBwc3RtdC0+Z2V0Q29s
dW1uVGV4dCgxKTsKKyAgICAgICAgU3RyaW5nIGNvb2tpZURvbWFpbiA9IHBzdG10LT5nZXRDb2x1
bW5UZXh0KDIpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCk7CisgICAgICAgIFN0cmluZyBjb29r
aWVQYXRoID0gcHN0bXQtPmdldENvbHVtblRleHQoMykuY29udmVydFRvQVNDSUlMb3dlcmNhc2Uo
KTsKKyAgICAgICAgZG91YmxlIGNvb2tpZUV4cGlyZXMgPSAoZG91YmxlKXBzdG10LT5nZXRDb2x1
bW5JbnQ2NCg0KSAqIDEwMDA7CisgICAgICAgIGJvb2wgY29va2llSHR0cE9ubHkgPSAocHN0bXQt
PmdldENvbHVtbkludCg1KSA9PSAxKTsKKyAgICAgICAgYm9vbCBjb29raWVTZWN1cmUgPSAocHN0
bXQtPmdldENvbHVtbkludCg2KSA9PSAxKTsKKyAgICAgICAgYm9vbCBjb29raWVTZXNzaW9uID0g
KHBzdG10LT5nZXRDb2x1bW5JbnQoNykgPT0gMSk7CisgICAgICAgIGludCB0YWlsTWF0Y2ggPSBw
c3RtdC0+Z2V0Q29sdW1uSW50KDgpOworCisgICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5v
cmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4xLjMgIkRvbWFpbiBNYXRjaGluZyIKKyAgICAgICAg
Ym9vbCBpc0RvbWFpbk1hdGNoZWQgPSAocmVxdWVzdEhvc3QgPT0gY29va2llRG9tYWluKSB8fCAo
dGFpbE1hdGNoID09IDEgJiYgQ29va2llVXRpbDo6ZG9tYWluTWF0Y2goY29va2llRG9tYWluLCBy
ZXF1ZXN0SG9zdCkpOworCisgICAgICAgIGlmICghaXNEb21haW5NYXRjaGVkKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3Jm
YzYyNjUjc2VjdGlvbi01LjEuNCAiUGF0aHMgYW5kIFBhdGgtTWF0Y2giCisgICAgICAgIGJvb2wg
aXNQYXRoTWF0Y2hlZCA9IGNvb2tpZVBhdGggPT0gcmVxdWVzdFBhdGgKKyAgICAgICAgICAgIHx8
IChyZXF1ZXN0UGF0aC5zdGFydHNXaXRoKGNvb2tpZVBhdGgpICYmIGNvb2tpZVBhdGguZW5kc1dp
dGgoJy8nKSkKKyAgICAgICAgICAgIHx8IChyZXF1ZXN0UGF0aC5zdGFydHNXaXRoKGNvb2tpZVBh
dGgpICYmIChyZXF1ZXN0UGF0aC5jaGFyYWN0ZXJBdChjb29raWVQYXRoLmxlbmd0aCgpKSA9PSAn
LycpKTsKKworICAgICAgICBpZiAoIWlzUGF0aE1hdGNoZWQpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBDb29raWUgcmVzdWx0KGNvb2tpZU5hbWUsCisgICAgICAgICAgICBjb29r
aWVWYWx1ZSwKKyAgICAgICAgICAgIGNvb2tpZURvbWFpbiwKKyAgICAgICAgICAgIGNvb2tpZVBh
dGgsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgY29va2llRXhwaXJlcywKKyAgICAgICAg
ICAgIGNvb2tpZUh0dHBPbmx5LAorICAgICAgICAgICAgY29va2llU2VjdXJlLAorICAgICAgICAg
ICAgY29va2llU2Vzc2lvbiwKKyAgICAgICAgICAgIFN0cmluZygpLAorICAgICAgICAgICAgVVJM
KCksCisgICAgICAgICAgICBWZWN0b3I8dWludDE2X3Q+KCkpOworCisgICAgICAgIHJlc3VsdHMu
YXBwZW5kKHJlc3VsdCk7CisgICAgfQorICAgIHBzdG10LT5maW5hbGl6ZSgpOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmlzRXhpc3RzSHR0cE9ubHlDb29raWUo
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBw
YXRoKQoreworICAgIFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRl
bWVudChDSEVDS19FWElTVFNfSFRUUE9OTFlfQ09PS0lFX1NRTCk7CisgICAgQVNTRVJUKHN0YXRl
bWVudCk7CisKKyAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIG5hbWUpOworICAgIHN0YXRlbWVu
dC0+YmluZFRleHQoMiwgZG9tYWluKTsKKyAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIHBhdGgp
OworCisgICAgcmV0dXJuIHN0YXRlbWVudC0+c3RlcCgpID09IFNRTElURV9ST1c7Cit9CisKK2lu
dCBDb29raWVKYXJEQjo6c2V0Q29va2llKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcm
IGNvb2tpZSwgYm9vbCBmcm9tSmF2YVNjcmlwdCkKK3sKKyAgICBpZiAoIWlzRW5hYmxlZCgpIHx8
ICFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIXVy
bCB8fCAhY29va2llKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBVUkwgdXJsT2JqKFBhcnNl
ZFVSTFN0cmluZywgdXJsKTsKKyAgICBTdHJpbmcgaG9zdFN0cih1cmxPYmouaG9zdCgpKTsKKyAg
ICBTdHJpbmcgcGF0aFN0cih1cmxPYmoucGF0aCgpKTsKKworICAgIENvb2tpZSBjb29raWVPYmo7
CisgICAgaWYgKCFDb29raWVVdGlsOjpwYXJzZUNvb2tpZUhlYWRlcihjb29raWUsIGhvc3RTdHIs
IGNvb2tpZU9iaikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGJvb2wgaGFzRG9tYWluSW5D
b29raWU7CisgICAgU3RyaW5nIGNvb2tpZURvbWFpbjsKKyAgICBpbnQgY29va2llVGFpbE1hdGNo
OworICAgIGlmICghY29va2llT2JqLmRvbWFpbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgaGFzRG9t
YWluSW5Db29raWUgPSB0cnVlOworICAgICAgICBjb29raWVEb21haW4gPSBjb29raWVPYmouZG9t
YWluOworICAgICAgICBjb29raWVUYWlsTWF0Y2ggPSAxOworICAgIH0gZWxzZSB7CisgICAgICAg
IGhhc0RvbWFpbkluQ29va2llID0gZmFsc2U7CisgICAgICAgIGNvb2tpZURvbWFpbiA9IFN0cmlu
Zyhob3N0U3RyKTsKKyAgICAgICAgY29va2llVGFpbE1hdGNoID0gMDsKKyAgICB9CisKKyAgICBi
b29sIGhhc1BhdGhJbkNvb2tpZTsKKyAgICBTdHJpbmcgY29va2llUGF0aDsKKyAgICBpZiAoIWNv
b2tpZU9iai5wYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBoYXNQYXRoSW5Db29raWUgPSB0cnVl
OworICAgICAgICBjb29raWVQYXRoID0gY29va2llT2JqLnBhdGg7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaGFzUGF0aEluQ29va2llID0gZmFsc2U7CisgICAgICAgIGNvb2tpZVBhdGggPSBTdHJp
bmcocGF0aFN0cik7CisgICAgfQorCisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKCFjb29raWVP
Ymouc2Vzc2lvbiAmJiAoY29va2llT2JqLmV4cGlyZXMgPCA6OnRpbWUoMCkpKSB7CisKKyAgICAg
ICAgcmV0ID0gZGVsZXRlQ29va2llSW50ZXJuYWwoY29va2llT2JqLm5hbWUsIGNvb2tpZURvbWFp
biwgY29va2llUGF0aCk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLQorICAgICAgICAvLyBjaGVjayB2YWxpZGF0aW9uIGJlZm9yZSBpbnNlcnQKKyAg
ICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgLy8gRklYTUU6IE5lZWQg
dG8gY2hlY2sgdGhhdCBhIGRvbWFpbiBkb2Vzbid0IGEgc2V0IGNvb2tpZSBmb3IgYSB0bGQgd2hl
biB3aW5jYWlybyBzdXBwb3J0cyBQU0wKKworICAgICAgICBpZiAoZnJvbUphdmFTY3JpcHQgJiYg
Y29va2llT2JqLmh0dHBPbmx5KQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlm
IChmcm9tSmF2YVNjcmlwdCAmJiBpc0V4aXN0c0h0dHBPbmx5Q29va2llKGNvb2tpZU9iai5uYW1l
LCBjb29raWVEb21haW4sIGNvb2tpZVBhdGgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisg
ICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBpbnNlcnQgb3IgdXBk
YXRlIG5ldyBjb29raWUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAg
IFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRlbWVudChTRVRfQ09P
S0lFX1NRTCk7CisgICAgICAgIEFTU0VSVChzdGF0ZW1lbnQpOworCisgICAgICAgIHN0YXRlbWVu
dC0+YmluZFRleHQoMSwgY29va2llT2JqLm5hbWUpOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRU
ZXh0KDIsIGNvb2tpZU9iai52YWx1ZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMywg
Y29va2llRG9tYWluKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCg0LCBjb29raWVQYXRo
KTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50NjQoNSwgY29va2llT2JqLnNlc3Npb24gPyAw
IDogKGludDY0X3QpY29va2llT2JqLmV4cGlyZXMpOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRJ
bnQoNiwgY29va2llT2JqLnZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5k
SW50KDcsIGNvb2tpZU9iai5zZXNzaW9uID8gMSA6IDApOworICAgICAgICBzdGF0ZW1lbnQtPmJp
bmRJbnQoOCwgY29va2llT2JqLmh0dHBPbmx5ID8gMSA6IDApOworICAgICAgICBzdGF0ZW1lbnQt
PmJpbmRJbnQoOSwgY29va2llT2JqLnNlY3VyZSA/IDEgOiAwKTsKKyAgICAgICAgc3RhdGVtZW50
LT5iaW5kSW50KDEwLCBjb29raWVUYWlsTWF0Y2gpOworCisgICAgICAgIHJldCA9IHN0YXRlbWVu
dC0+c3RlcCgpOworICAgIH0KKyAgICBBU1NFUlQoY2hlY2tTUUxpdGVSZXR1cm5Db2RlKHJldCwg
U1FMSVRFX0RPTkUpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBDb29raWVKYXJEQjo6
ZGVsZXRlQ29va2llKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7Cisg
ICAgaWYgKCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0
dXJuIC0xOworCisgICAgU3RyaW5nIHVybENvcGllZCA9IFN0cmluZyh1cmwpOworICAgIGlmICh1
cmxDb3BpZWQuc3RhcnRzV2l0aCgnLicpKQorICAgICAgICB1cmxDb3BpZWQucmVtb3ZlKDAsIDEp
OworCisgICAgVVJMIHVybE9iaihQYXJzZWRVUkxTdHJpbmcsIHVybENvcGllZCk7CisgICAgaWYg
KHVybE9iai5pc1ZhbGlkKCkpIHsKKyAgICAgICAgU3RyaW5nIGhvc3RTdHIodXJsT2JqLmhvc3Qo
KSk7CisgICAgICAgIFN0cmluZyBwYXRoU3RyKHVybE9iai5wYXRoKCkpOworICAgICAgICBpbnQg
cmV0ID0gZGVsZXRlQ29va2llSW50ZXJuYWwobmFtZSwgaG9zdFN0ciwgcGF0aFN0cik7CisgICAg
ICAgIEFTU0VSVChjaGVja1NRTGl0ZVJldHVybkNvZGUocmV0LCBTUUxJVEVfRE9ORSkpOworCisg
ICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgQ29v
a2llSmFyREI6OmRlbGV0ZUNvb2tpZUludGVybmFsKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBkb21haW4sIGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBTUUxpdGVTdGF0ZW1l
bnQqIHN0YXRlbWVudDsKKyAgICBpZiAoIXBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIHN0YXRl
bWVudCA9IGdldFByZXBhcmVTdGF0ZW1lbnQoREVMRVRFX0NPT0tJRV9CWV9OQU1FX0RPTUFJTl9Q
QVRIX1NRTCk7CisgICAgICAgIEFTU0VSVChzdGF0ZW1lbnQpOworICAgICAgICBzdGF0ZW1lbnQt
PmJpbmRUZXh0KDEsIG5hbWUpOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGRvbWFp
bik7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMywgcGF0aCk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRlbWVudChERUxFVEVfQ09PS0lFX0JZ
X05BTUVfRE9NQUlOX1NRTCk7CisgICAgICAgIEFTU0VSVChzdGF0ZW1lbnQpOworICAgICAgICBz
dGF0ZW1lbnQtPmJpbmRUZXh0KDEsIG5hbWUpOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0
KDIsIGRvbWFpbik7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlbWVudC0+c3RlcCgpOworfQor
CitpbnQgQ29va2llSmFyREI6OmRlbGV0ZUNvb2tpZXMoY29uc3QgU3RyaW5nJiB1cmwpCit7Cisg
ICAgLy8gTk9UIElNUExFTUVOVEVECisgICAgLy8gVE9ETzogdGhpcyBmdW5jdGlvbiB3aWxsIGJl
IGNhbGxlZCBpZiBhcHBsaWNhdGlvbiBjYWxscyBXS0Nvb2tpZU1hbmFnZXJEZWxldGVDb29raWVz
Rm9ySG9zdG5hbWUoKSBpbiBXS0Nvb2tpZU1hbmFnZXIuaC4KKyAgICByZXR1cm4gMDsKK30KKwor
aW50IENvb2tpZUphckRCOjpkZWxldGVBbGxDb29raWVzKCkKK3sKKyAgICBpZiAoIWlzRW5hYmxl
ZCgpIHx8ICFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBy
ZXR1cm4gZXhlY3V0ZVNpbXBsZVNxbChERUxFVEVfQUxMX0NPT0tJRV9TUUwpOworfQorCit2b2lk
IENvb2tpZUphckRCOjpjcmVhdGVQcmVwYXJlU3RhdGVtZW50KGNvbnN0IGNoYXIqIHNxbCkKK3sK
KyAgICBhdXRvIHN0YXRlbWVudCA9IHN0ZDo6bWFrZV91bmlxdWU8U1FMaXRlU3RhdGVtZW50Piht
X2RhdGFiYXNlLCBzcWwpOworICAgIGludCByZXQgPSBzdGF0ZW1lbnQtPnByZXBhcmUoKTsKKyAg
ICBBU1NFUlQocmV0ID09IFNRTElURV9PSyk7CisgICAgbV9zdGF0ZW1lbnRzLmFkZChTdHJpbmco
c3FsKSwgV1RGTW92ZShzdGF0ZW1lbnQpKTsKK30KKworU1FMaXRlU3RhdGVtZW50KiBDb29raWVK
YXJEQjo6Z2V0UHJlcGFyZVN0YXRlbWVudChjb25zdCBjaGFyKiBzcWwpCit7CisgICAgY29uc3Qg
YXV0byYgc3RhdGVtZW50ID0gbV9zdGF0ZW1lbnRzLmdldChTdHJpbmcoc3FsKSk7CisgICAgQVNT
RVJUKHN0YXRlbWVudCk7CisgICAgc3RhdGVtZW50LT5yZXNldCgpOworICAgIHJldHVybiBzdGF0
ZW1lbnQ7Cit9CisKK2ludCBDb29raWVKYXJEQjo6ZXhlY3V0ZVNpbXBsZVNxbChjb25zdCBjaGFy
KiBzcWwsIGJvb2wgaWdub3JlRXJyb3IpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVu
dChtX2RhdGFiYXNlLCBzcWwpOworICAgIGludCByZXQgPSBzdGF0ZW1lbnQucHJlcGFyZUFuZFN0
ZXAoKTsKKyAgICBzdGF0ZW1lbnQuZmluYWxpemUoKTsKKworICAgIEFTU0VSVChjaGVja1NRTGl0
ZVJldHVybkNvZGUocmV0LCBTUUxJVEVfT0spCisgICAgICAgIHx8IGNoZWNrU1FMaXRlUmV0dXJu
Q29kZShyZXQsIFNRTElURV9ET05FKQorICAgICAgICB8fCBjaGVja1NRTGl0ZVJldHVybkNvZGUo
cmV0LCBTUUxJVEVfUk9XKQorICAgICAgICB8fCBpZ25vcmVFcnJvcik7CisgICAgcmV0dXJuIHJl
dDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjJlNzk2OGQ4OWRiCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmgKQEAg
LTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZl
IEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ29va2llLmgiCisj
aW5jbHVkZSA8U1FMaXRlRGF0YWJhc2UuaD4KKyNpbmNsdWRlIDxTUUxpdGVTdGF0ZW1lbnQuaD4K
KyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+CisjaW5jbHVk
ZSA8d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0
Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBDb29raWVKYXJEQiB7CitwdWJsaWM6CisKKyAg
ICBzdGF0aWMgQ29va2llSmFyREIqIGdldEluc3RhbmNlKCk7CisgICAgc3RhdGljIHZvaWQgcmVs
ZWFzZUluc3RhbmNlKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFN0cmluZyYgZGF0YWJh
c2VQYXRoKTsKKworICAgIGJvb2wgaXNFbmFibGVkKCk7CisgICAgdm9pZCBzZXRFbmFibGVkKGJv
b2wpOworCisgICAgYm9vbCBzZWFyY2hDb29raWVzKGNvbnN0IFN0cmluZyYgcmVxdWVzdFVybCwg
Y29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgaHR0cE9ubHksIGNvbnN0IHN0ZDo6b3B0aW9uYWw8
Ym9vbD4mIHNlY3VyZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgc2Vzc2lvbiwgVmVjdG9y
PENvb2tpZT4mIHJlc3VsdHMpOworICAgIGludCBzZXRDb29raWUoY29uc3QgU3RyaW5nJiB1cmws
IGNvbnN0IFN0cmluZyYgY29va2llLCBib29sIGZyb21KYXZhU2NyaXB0KTsKKworICAgIGludCBk
ZWxldGVDb29raWUoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAg
aW50IGRlbGV0ZUNvb2tpZXMoY29uc3QgU3RyaW5nJiB1cmwpOworICAgIGludCBkZWxldGVBbGxD
b29raWVzKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIFN0YXRpY0xvY2sgc19pbnN0YW5jZUxv
Y2s7CisgICAgc3RhdGljIENvb2tpZUphckRCKiBzX2luc3RhbmNlOworCisgICAgYm9vbCBtX2Nv
b2tpZUVuYWJsZSB7dHJ1ZX07CisgICAgU3RyaW5nIG1fZGF0YWJhc2VQYXRoOworCisgICAgYm9v
bCBtX2RldGVjdGVkRGF0YWJhc2VDb3JydXB0aW9uIHtmYWxzZX07CisKKyAgICBib29sIGlzT25N
ZW1vcnkoKSBjb25zdCB7IHJldHVybiAobV9kYXRhYmFzZVBhdGggPT0gIjpvbm1lbW9yeToiKTsg
fTsKKworICAgIENvb2tpZUphckRCKCk7CisgICAgfkNvb2tpZUphckRCKCk7CisKKyAgICBib29s
IG9wZW5EYXRhYmFzZSgpOworICAgIHZvaWQgY2xvc2VEYXRhYmFzZSgpOworCisgICAgYm9vbCBj
aGVja1NRTGl0ZVJldHVybkNvZGUoaW50IGFjdHVhbCwgaW50IGV4cGVjdGVkKTsKKyAgICB2b2lk
IGRldGVjdERhdGFiYXNlQ29ycnVwdGlvbigpOworICAgIGJvb2wgY2hlY2tEYXRhYmFzZUNvcnJ1
cHRpb25BbmRSZW1vdmVJZk5lZWRlZCgpOworICAgIFN0cmluZyBnZXRDb3JydXB0aW9uTWFya2Vy
UGF0aCgpIGNvbnN0OworCisgICAgYm9vbCBjaGVja0RhdGFiYXNlVmFsaWRpdHkoKTsKKyAgICB2
b2lkIGRlbGV0ZUFsbERhdGFiYXNlRmlsZXMoKTsKKworICAgIHZvaWQgY3JlYXRlUHJlcGFyZVN0
YXRlbWVudChjb25zdCBjaGFyKiBzcWwpOworICAgIFNRTGl0ZVN0YXRlbWVudCogZ2V0UHJlcGFy
ZVN0YXRlbWVudChjb25zdCBjaGFyKiBzcWwpOworICAgIGludCBleGVjdXRlU2ltcGxlU3FsKGNv
bnN0IGNoYXIqIHNxbCwgYm9vbCBpZ25vcmVFcnJvciA9IGZhbHNlKTsKKworICAgIGludCBkZWxl
dGVDb29raWVJbnRlcm5hbChjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZG9tYWlu
LCBjb25zdCBTdHJpbmcmIHBhdGgpOworICAgIGJvb2wgaXNFeGlzdHNIdHRwT25seUNvb2tpZShj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBTdHJpbmcmIHBh
dGgpOworCisgICAgU1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKKyAgICBIYXNoTWFwPFN0cmlu
Zywgc3RkOjp1bmlxdWVfcHRyPFNRTGl0ZVN0YXRlbWVudD4+IG1fc3RhdGVtZW50czsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMC4uYWJkODdhOWRkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5jcHAKQEAgLTAsMCArMSwxODkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50
IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llVXRpbC5oIgorCisjaWYg
VVNFKENVUkwpCisKKyNpbmNsdWRlICJDb29raWUuaCIKKworI2luY2x1ZGUgPHd0Zi9EYXRlTWF0
aC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisvKiBUaGlzIGlzIHRoZSBt
YXhpbXVtIGxpbmUgbGVuZ3RoIHdlIGFjY2VwdCBmb3IgYSBjb29raWUgbGluZS4gUkZDIDIxMDkK
KyAgIHNlY3Rpb24gNi4zIHNheXM6CisKKyAgICJhdCBsZWFzdCA0MDk2IGJ5dGVzIHBlciBjb29r
aWUgKGFzIG1lYXN1cmVkIGJ5IHRoZSBzaXplIG9mIHRoZSBjaGFyYWN0ZXJzCisgICB0aGF0IGNv
bXByaXNlIHRoZSBjb29raWUgbm9uLXRlcm1pbmFsIGluIHRoZSBzeW50YXggZGVzY3JpcHRpb24g
b2YgdGhlCisgICBTZXQtQ29va2llIGhlYWRlcikiCisqLworCisjZGVmaW5lIE1BWF9DT09LSUVf
TElORSA1MDAwCisjZGVmaW5lIE1BWF9DT09LSUVfTElORV9UWFQgIjQ5OTkiCisKKyNkZWZpbmUg
TUFYX05BTUUgMTAyNAorI2RlZmluZSBNQVhfTkFNRV9UWFQgIjEwMjMiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworbmFtZXNwYWNlIENvb2tpZVV0aWwgeworCitib29sIGlzSVBBZGRyZXNzKGNv
bnN0IFN0cmluZyYgaG9zdG5hbWUpCit7CisgICAgLy8gQXNzdW1pbmcgdGhhdCBob3N0cyBlbmRp
bmcgaW4gYSBkaWdpdCBhcmUgSVAgQWRkcmVzc2VzCisgICAgcmV0dXJuICFob3N0bmFtZS5pc0Vt
cHR5KCkgJiYgaXNBU0NJSURpZ2l0KGhvc3RuYW1lW2hvc3RuYW1lLmxlbmd0aCgpIC0gMV0pOwor
fQorCitib29sIGRvbWFpbk1hdGNoKGNvbnN0IFN0cmluZyYgY29va2llRG9tYWluLCBjb25zdCBT
dHJpbmcmIGhvc3QpCit7CisgICAgc2l6ZV90IGluZGV4ID0gaG9zdC5maW5kKGNvb2tpZURvbWFp
bik7CisKKyAgICBib29sIHRhaWxNYXRjaCA9IChpbmRleCAhPSBXVEY6Om5vdEZvdW5kICYmIGlu
ZGV4ICsgY29va2llRG9tYWluLmxlbmd0aCgpID09IGhvc3QubGVuZ3RoKCkpOworCisgICAgLy8g
Q2hlY2sgaWYgaG9zdCBlcXVhbHMgY29va2llIGRvbWFpbi4KKyAgICBpZiAodGFpbE1hdGNoICYm
ICFpbmRleCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBDaGVjayBpZiBob3N0IGlz
IGEgc3ViZG9tYWluIG9mIHRoZSBkb21haW4gaW4gdGhlIGNvb2tpZS4KKyAgICAvLyBDdXJsIHVz
ZXMgYSAnLicgaW4gZnJvbnQgb2YgZG9tYWlucyB0byBpbmRpY2F0ZSBpdCdzIHZhbGlkIG9uIHN1
YmRvbWFpbnMuCisgICAgaWYgKHRhaWxNYXRjaCAmJiBpbmRleCA+IDAgJiYgaG9zdFtpbmRleF0g
PT0gJy4nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENoZWNrIHRoZSBzcGVjaWFs
IGNhc2Ugd2hlcmUgaG9zdCBlcXVhbHMgdGhlIGNvb2tpZSBkb21haW4sIGV4Y2VwdCBmb3IgYSBs
ZWFkaW5nICcuJyBpbiB0aGUgY29va2llIGRvbWFpbi4KKyAgICAvLyBFLmcuIGNvb2tpZSBkb21h
aW4gaXMgLmFwcGxlLmNvbSBhbmQgaG9zdCBpcyBhcHBsZS5jb20uCisgICAgaWYgKGNvb2tpZURv
bWFpblswXSA9PSAnLicgJiYgY29va2llRG9tYWluLmZpbmQoaG9zdCkgPT0gMSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBhcnNl
RXhwaXJlcyhjb25zdCBjaGFyKiBleHBpcmVzLCB0aW1lX3QmIHRpbWUpCit7CisgICAgZG91Ymxl
IHRtcCA9IFdURjo6cGFyc2VEYXRlRnJvbU51bGxUZXJtaW5hdGVkQ2hhcmFjdGVycyhleHBpcmVz
KTsKKyAgICBpZiAoaXNuYW4odG1wKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdGlt
ZSA9ICh0aW1lX3QpKHRtcCAvIFdURjo6bXNQZXJTZWNvbmQpOworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgdm9pZCBwYXJzZUNvb2tpZUF0dHJpYnV0ZXMoY29uc3QgU3RyaW5nJiBhdHRy
aWJ1dGUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBib29sJiBoYXNNYXhBZ2UsIENvb2tpZSYgcmVz
dWx0KQoreworICAgIHNpemVfdCBhc3NpZ25tZW50UG9zaXRpb24gPSBhdHRyaWJ1dGUuZmluZCgn
PScpOworCisgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7CisgICAgU3RyaW5nIGF0dHJpYnV0ZVZh
bHVlOworCisgICAgaWYgKGFzc2lnbm1lbnRQb3NpdGlvbiAhPSBub3RGb3VuZCkgeworICAgICAg
ICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLnN1YnN0cmluZygwLCBhc3NpZ25tZW50UG9zaXRp
b24pLnN0cmlwV2hpdGVTcGFjZSgpOworICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0
ZS5zdWJzdHJpbmcoYXNzaWdubWVudFBvc2l0aW9uICsgMSkuc3RyaXBXaGl0ZVNwYWNlKCk7Cisg
ICAgfSBlbHNlCisgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuc3RyaXBXaGl0ZVNw
YWNlKCk7CisKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAi
aHR0cG9ubHkiKSkKKyAgICAgICAgcmVzdWx0Lmh0dHBPbmx5ID0gdHJ1ZTsKKyAgICBlbHNlIGlm
IChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJzZWN1cmUiKSkKKyAgICAg
ICAgcmVzdWx0LnNlY3VyZSA9IHRydWU7CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJ
Q2FzZShhdHRyaWJ1dGVOYW1lLCAiZG9tYWluIikpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZVZh
bHVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBFbmZvcmNl
IGEgZG90IGNoYXJhY3RlciBwcmVmaXggdG8gaG9zdG5hbWVzIHdoaWNoIGFyZSBub3QgaXAgYWRk
cmVzc2VzIGFuZCBub3Qgc2luZ2xlIHZhbHVlIGhvc3RuYW1lcyBzdWNoIGFzIGxvY2FsaG9zdAor
ICAgICAgICBpZiAoIWlzSVBBZGRyZXNzKGF0dHJpYnV0ZVZhbHVlKSAmJiAhYXR0cmlidXRlVmFs
dWUuc3RhcnRzV2l0aCgnLicpICYmIGF0dHJpYnV0ZVZhbHVlLmZpbmQoJy4nKSAhPSBub3RGb3Vu
ZCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gIi4iICsgYXR0cmlidXRlVmFsdWU7CisK
KworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGhvc3QgY2FuIHNldCB0aGUgZG9tYWluCisgICAg
ICAgIC8vIEZJWE1FOiBmaXJlZm94IGFuZCBjaHJvbWUgYm90aCBpZ25vcmUgY29va2llcyB3aXRo
IG5vIHZhbGlkIGRvbWFpbgorICAgICAgICAvLyB3ZSBjdXJyZW50bHkgaWdub3JlIHRoZSBkb21h
aW5zIGFuZCBkZWZhdWx0IHRvIHRoZSBob3N0bmFtZSBhcyB0aGUgZG9tYWluCisgICAgICAgIGlm
IChkb21haW5NYXRjaChhdHRyaWJ1dGVWYWx1ZSwgZG9tYWluKSkKKyAgICAgICAgICAgIHJlc3Vs
dC5kb21haW4gPSBhdHRyaWJ1dGVWYWx1ZTsKKworICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAibWF4LWFnZSIpKSB7CisgICAgICAgIGJvb2wgb2s7
CisgICAgICAgIHRpbWVfdCBleHBpcnlUaW1lID0gdGltZSgwKSArIGF0dHJpYnV0ZVZhbHVlLnRv
SW50NjQoJm9rKTsKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICByZXN1bHQuZXhwaXJl
cyA9IChkb3VibGUpZXhwaXJ5VGltZTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXNzaW9uID0gZmFs
c2U7CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbWF4LWFnZSBhdHRyaWJ1dGUgYXMg
d2VsbCBhcyBhbiBleHBpcmVzIGF0dHJpYnV0ZQorICAgICAgICAgICAgLy8gdGhlIHJpZ2h0bW9z
dCBtYXgtYWdlIGF0dHJpYnV0ZSB0YWtlcyBwcmVjZWRlbmNlLgorICAgICAgICAgICAgaGFzTWF4
QWdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJ
Q2FzZShhdHRyaWJ1dGVOYW1lLCAiZXhwaXJlcyIpICYmICFoYXNNYXhBZ2UpIHsKKyAgICAgICAg
dGltZV90IGV4cGlyeVRpbWU7CisgICAgICAgIGlmIChwYXJzZUV4cGlyZXMoYXR0cmlidXRlVmFs
dWUudXRmOCgpLmRhdGEoKSwgZXhwaXJ5VGltZSkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5leHBp
cmVzID0gKGRvdWJsZSlleHBpcnlUaW1lOworICAgICAgICAgICAgcmVzdWx0LnNlc3Npb24gPSBm
YWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShh
dHRyaWJ1dGVOYW1lLCAicGF0aCIpKSB7CisgICAgICAgIGlmICghYXR0cmlidXRlVmFsdWUuaXNF
bXB0eSgpICYmIGF0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoJy8nKSkKKyAgICAgICAgICAgIHJl
c3VsdC5wYXRoID0gYXR0cmlidXRlVmFsdWU7CisgICAgfQorfQorCitib29sIHBhcnNlQ29va2ll
SGVhZGVyKGNvbnN0IFN0cmluZyYgY29va2llTGluZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIENv
b2tpZSYgcmVzdWx0KQoreworICAgIGlmIChjb29raWVMaW5lLmxlbmd0aCgpID49IE1BWF9DT09L
SUVfTElORSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhpcyBBbGdvcml0aG0g
aXMgYmFzZWQgb24gdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyA2MjY1IDUuMiBodHRwczov
L3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi8KKworICAgIHNpemVfdCBz
ZXBhcmF0b3JQb3NpdGlvbiA9IGNvb2tpZUxpbmUuZmluZCgnOycpOworCisgICAgU3RyaW5nIGNv
b2tpZVBhaXIgPSBzZXBhcmF0b3JQb3NpdGlvbiA9PSBub3RGb3VuZCA/IGNvb2tpZUxpbmUgOiBj
b29raWVMaW5lLnN1YnN0cmluZygwLCBzZXBhcmF0b3JQb3NpdGlvbik7CisKKyAgICBTdHJpbmcg
Y29va2llTmFtZTsKKyAgICBTdHJpbmcgY29va2llVmFsdWU7CisgICAgc2l6ZV90IGFzc2lnbm1l
bnRQb3NpdGlvbiA9IGNvb2tpZUxpbmUuZmluZCgnPScpOworCisgICAgLy8gUkZDNjI2NSBzYXlz
IHRvIGlnbm9yZSBjb29raWVzIHBhaXJzIHdpdGggZW1wdHkgbmFtZXMgb3Igbm8gYXNzaWdubWVu
dCBjaGFyYWN0ZXIKKyAgICAvLyBidXQgYnJvd3NlcnMgc2VlbSB0byB0cmVhdCB0aGlzIHR5cGUg
b2YgY29va2llIHN0cmluZyBhcyB0aGUgY29va2llIHZhbHVlCisgICAgaWYgKGFzc2lnbm1lbnRQ
b3NpdGlvbiA9PSBub3RGb3VuZCkKKyAgICAgICAgY29va2llVmFsdWUgPSBjb29raWVQYWlyOwor
ICAgIGVsc2UgeworICAgICAgICBjb29raWVOYW1lID0gY29va2llUGFpci5zdWJzdHJpbmcoMCwg
YXNzaWdubWVudFBvc2l0aW9uKTsKKyAgICAgICAgY29va2llVmFsdWUgPSBjb29raWVQYWlyLnN1
YnN0cmluZyhhc3NpZ25tZW50UG9zaXRpb24gKyAxKTsKKyAgICB9CisKKyAgICByZXN1bHQubmFt
ZSA9IGNvb2tpZU5hbWUuc3RyaXBXaGl0ZVNwYWNlKCk7CisgICAgcmVzdWx0LnZhbHVlID0gY29v
a2llVmFsdWUuc3RyaXBXaGl0ZVNwYWNlKCk7CisKKyAgICBib29sIGhhc01heEFnZSA9IGZhbHNl
OworICAgIHJlc3VsdC5zZXNzaW9uID0gdHJ1ZTsKKworICAgIFZlY3RvcjxTdHJpbmc+IGNvb2tp
ZUF0dHJpYnV0ZXM7CisgICAgY29va2llTGluZS5zcGxpdCgnOycsIHRydWUsIGNvb2tpZUF0dHJp
YnV0ZXMpOworICAgIGZvciAoYXV0byBhdHRyaWJ1dGUgOiBjb29raWVBdHRyaWJ1dGVzKQorICAg
ICAgICBwYXJzZUNvb2tpZUF0dHJpYnV0ZXMoYXR0cmlidXRlLCBkb21haW4sIGhhc01heEFnZSwg
cmVzdWx0KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBDb29raWVV
dGlsCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMjY3ZmRjMjlhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5oCkBAIC0wLDAg
KzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRl
cnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisg
KiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RydWN0IENvb2tpZTsKKworbmFtZXNwYWNlIENvb2tp
ZVV0aWwgeworCitib29sIHBhcnNlQ29va2llSGVhZGVyKGNvbnN0IFN0cmluZyYgY29va2llTGlu
ZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIENvb2tpZSYgcmVzdWx0KTsKKworYm9vbCBpc0lQQWRk
cmVzcyhjb25zdCBTdHJpbmcmIGhvc3RuYW1lKTsKKworYm9vbCBkb21haW5NYXRjaChjb25zdCBT
dHJpbmcmIGNvb2tpZURvbWFpbiwgY29uc3QgU3RyaW5nJiBob3N0KTsKKworfSAvLyBuYW1lc3Bh
Y2UgQ29va2llVXRpbAorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCAzNDBi
ZWNmMWM1MC4uM2NkZTIyZDY4MDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1
ZGUgIkN1cmxDb250ZXh0LmgiCiAKICNpZiBVU0UoQ1VSTCkKKyNpbmNsdWRlICJDb29raWVKYXJD
dXJsRGF0YWJhc2UuaCIKICNpbmNsdWRlICJIVFRQSGVhZGVyTWFwLmgiCiAjaW5jbHVkZSA8TmV0
d29ya0xvYWRNZXRyaWNzLmg+CiAjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KQEAgLTQyLDgg
KzQzLDkgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgQ1N0cmluZyBjb29raWVK
YXJQYXRoKCkKK3N0YXRpYyBTdHJpbmcgZGVmYXVsdENvb2tpZUphclBhdGgoKQogeworICAgIHN0
YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0RmlsZU5hbWUgPSAiY29va2llLmphci5kYiI7CiAgICAg
Y2hhciogY29va2llSmFyUGF0aCA9IGdldGVudigiQ1VSTF9DT09LSUVfSkFSX1BBVEgiKTsKICAg
ICBpZiAoY29va2llSmFyUGF0aCkKICAgICAgICAgcmV0dXJuIGNvb2tpZUphclBhdGg7CkBAIC01
NiwyMSArNTgsMjEgQEAgc3RhdGljIENTdHJpbmcgY29va2llSmFyUGF0aCgpCiAKICAgICBpZiAo
RkFJTEVEKDo6U0hHZXRGb2xkZXJQYXRoQSgwLCBDU0lETF9MT0NBTF9BUFBEQVRBIHwgQ1NJRExf
RkxBR19DUkVBVEUsIDAsIDAsIGFwcERhdGFEaXJlY3RvcnkpKQogICAgICAgICB8fCBGQUlMRUQo
OjpHZXRNb2R1bGVGaWxlTmFtZUEoMCwgZXhlY3V0YWJsZVBhdGgsIE1BWF9QQVRIKSkpCi0gICAg
ICAgIHJldHVybiAiY29va2llcy5kYXQiOworICAgICAgICByZXR1cm4gZGVmYXVsdEZpbGVOYW1l
OwogCiAgICAgOjpQYXRoUmVtb3ZlRXh0ZW5zaW9uQShleGVjdXRhYmxlUGF0aCk7CiAgICAgTFBT
VFIgZXhlY3V0YWJsZU5hbWUgPSA6OlBhdGhGaW5kRmlsZU5hbWVBKGV4ZWN1dGFibGVQYXRoKTsK
LSAgICBzcHJpbnRmX3MoY29va2llSmFyRGlyZWN0b3J5LCBNQVhfUEFUSCwgIiVzLyVzIiwgYXBw
RGF0YURpcmVjdG9yeSwgZXhlY3V0YWJsZU5hbWUpOwotICAgIHNwcmludGZfcyhjb29raWVKYXJG
dWxsUGF0aCwgTUFYX1BBVEgsICIlcy9jb29raWVzLmRhdCIsIGNvb2tpZUphckRpcmVjdG9yeSk7
CisgICAgOjpQYXRoQ29tYmluZUEoY29va2llSmFyRGlyZWN0b3J5LCBhcHBEYXRhRGlyZWN0b3J5
LCBleGVjdXRhYmxlTmFtZSk7CisgICAgOjpQYXRoQ29tYmluZUEoY29va2llSmFyRnVsbFBhdGgs
IGNvb2tpZUphckRpcmVjdG9yeSwgZGVmYXVsdEZpbGVOYW1lKTsKIAogICAgIGlmICg6OlNIQ3Jl
YXRlRGlyZWN0b3J5RXhBKDAsIGNvb2tpZUphckRpcmVjdG9yeSwgMCkgIT0gRVJST1JfU1VDQ0VT
UwogICAgICAgICAmJiA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0ZJTEVfRVhJU1RTCiAgICAg
ICAgICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpCi0gICAgICAg
IHJldHVybiAiY29va2llcy5kYXQiOworICAgICAgICByZXR1cm4gZGVmYXVsdEZpbGVOYW1lOwog
CiAgICAgcmV0dXJuIGNvb2tpZUphckZ1bGxQYXRoOwogI2Vsc2UKLSAgICByZXR1cm4gImNvb2tp
ZXMuZGF0IjsKKyAgICByZXR1cm4gZGVmYXVsdERhdGFiYXNlTmFtZTsKICNlbmRpZgogfQogCkBA
IC04Myw4ICs4NSw4IEBAIEN1cmxDb250ZXh0JiBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkKIH0K
IAogQ3VybENvbnRleHQ6OkN1cmxDb250ZXh0KCkKLTogbV9jb29raWVKYXJGaWxlTmFtZSB7IGNv
b2tpZUphclBhdGgoKSB9Ci0sIG1fY29va2llSmFyIHsgc3RkOjptYWtlX3VuaXF1ZTxDb29raWVK
YXJDdXJsRmlsZVN5c3RlbT4oKSB9Cis6IG1fY29va2llSmFyIHsgc3RkOjptYWtlX3VuaXF1ZTxD
b29raWVKYXJDdXJsRGF0YWJhc2U+KCkgfQorLCBtX2Nvb2tpZUphckZpbGVOYW1lIHsgZGVmYXVs
dENvb2tpZUphclBhdGgoKSB9CiB7CiAgICAgaW5pdENvb2tpZVNlc3Npb24oKTsKIApAQCAtMTE5
LDE0ICsxMjEsOSBAQCB2b2lkIEN1cmxDb250ZXh0Ojppbml0Q29va2llU2Vzc2lvbigpCiAKICAg
ICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfU0hBUkUsIG1fc2hhcmVIYW5kbGUuaGFu
ZGxlKCkpOwogCi0gICAgaWYgKCFtX2Nvb2tpZUphckZpbGVOYW1lLmlzTnVsbCgpKSB7Ci0gICAg
ICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9DT09LSUVGSUxFLCBtX2Nvb2tpZUph
ckZpbGVOYW1lLmRhdGEoKSk7Ci0gICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9Q
VF9DT09LSUVKQVIsIG1fY29va2llSmFyRmlsZU5hbWUuZGF0YSgpKTsKLSAgICB9Ci0KLSAgICBj
dXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFU0VTU0lPTiwgMSk7Ci0KICAgICBj
dXJsX2Vhc3lfY2xlYW51cChjdXJsKTsKKworICAgIG1fY29va2llSmFyLT5pbml0aWFsaXplKG1f
Y29va2llSmFyRmlsZU5hbWUpOwogfQogCiAvLyBQcm94eSA9PT09PT09PT09PT09PT09PT09PT09
PQpAQCAtNDY1LDcgKzQ2Miw3IEBAIHZvaWQgQ3VybEhhbmRsZTo6c2V0U3NsS2V5UGFzc3dvcmQo
Y29uc3QgY2hhciogcGFzc3dvcmQpCiAKIHZvaWQgQ3VybEhhbmRsZTo6ZW5hYmxlQ29va2llSmFy
SWZFeGlzdHMoKQogewotICAgIGNvbnN0IGNoYXIqIGNvb2tpZUphciA9IEN1cmxDb250ZXh0Ojpz
aW5nbGV0b24oKS5nZXRDb29raWVKYXJGaWxlTmFtZSgpOworICAgIGNvbnN0IGNoYXIqIGNvb2tp
ZUphciA9IEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5nZXRDb29raWVKYXJGaWxlTmFtZSgpLnV0
ZjgoKS5kYXRhKCk7CiAgICAgaWYgKGNvb2tpZUphcikKICAgICAgICAgY3VybF9lYXN5X3NldG9w
dChtX2hhbmRsZSwgQ1VSTE9QVF9DT09LSUVKQVIsIGNvb2tpZUphcik7CiB9CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCmluZGV4IDgz
MzdlM2VlMzIxLi40MjZkMzAxYWVlYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKQEAgLTExMSwxMCArMTExLDEyIEBAIHB1Ymxp
YzoKICAgICBjb25zdCBDdXJsU2hhcmVIYW5kbGUmIHNoYXJlSGFuZGxlKCkgeyByZXR1cm4gbV9z
aGFyZUhhbmRsZTsgfQogCiAgICAgLy8gQ29va2llCi0gICAgY29uc3QgY2hhciogZ2V0Q29va2ll
SmFyRmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX2Nvb2tpZUphckZpbGVOYW1lLmRhdGEoKTsg
fQotICAgIHZvaWQgc2V0Q29va2llSmFyRmlsZU5hbWUoY29uc3QgY2hhciogY29va2llSmFyRmls
ZU5hbWUpIHsgbV9jb29raWVKYXJGaWxlTmFtZSA9IENTdHJpbmcoY29va2llSmFyRmlsZU5hbWUp
OyB9CiAgICAgQ29va2llSmFyQ3VybCYgY29va2llSmFyKCkgeyByZXR1cm4gKm1fY29va2llSmFy
OyB9CiAKKyAgICBTdHJpbmcgZ2V0Q29va2llSmFyRmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBt
X2Nvb2tpZUphckZpbGVOYW1lOyB9CisgICAgLy8gRklYTUU6IENoYW5naW5nIHRoZSBDb29raWVK
YXIncyBmaWxlbmFtZSBvbiBydW50aW1lIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorICAg
IC8vIHZvaWQgc2V0Q29va2llSmFyUGF0aChjb25zdCBjaGFyKiBjb29raWVKYXJQYXRoKTsKKwog
ICAgIC8vIFByb3h5CiAgICAgY29uc3QgUHJveHlJbmZvJiBwcm94eUluZm8oKSBjb25zdCB7IHJl
dHVybiBtX3Byb3h5OyB9CiAgICAgdm9pZCBzZXRQcm94eUluZm8oY29uc3QgUHJveHlJbmZvJiBp
bmZvKSB7IG1fcHJveHkgPSBpbmZvOyAgfQpAQCAtMTMwLDcgKzEzMiw3IEBAIHB1YmxpYzoKIAog
cHJpdmF0ZToKICAgICBQcm94eUluZm8gbV9wcm94eTsKLSAgICBDU3RyaW5nIG1fY29va2llSmFy
RmlsZU5hbWU7CisgICAgU3RyaW5nIG1fY29va2llSmFyRmlsZU5hbWU7CiAgICAgQ3VybFNoYXJl
SGFuZGxlIG1fc2hhcmVIYW5kbGU7CiAgICAgc3RkOjp1bmlxdWVfcHRyPENvb2tpZUphckN1cmw+
IG1fY29va2llSmFyOwogICAgIEN1cmxTU0xIYW5kbGUgbV9zc2xIYW5kbGU7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybERvd25sb2FkLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsRG93bmxvYWQuY3BwCmlu
ZGV4IGQ4ZjliZjNhNWM4Li4wOTdiMjA4ZTU1MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxEb3dubG9hZC5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxEb3dubG9hZC5jcHAKQEAgLTMwLDYgKzMwLDcg
QEAKIAogI2lmIFVTRShDVVJMKQogCisjaW5jbHVkZSAiQ29va2llSmFyREIuaCIKICNpbmNsdWRl
ICJIVFRQUGFyc2Vycy5oIgogI2luY2x1ZGUgIlJlc291cmNlUmVxdWVzdC5oIgogI2luY2x1ZGUg
IlJlc291cmNlUmVzcG9uc2UuaCIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuY3Bw
CmluZGV4IDg0ZTFmZGEyOGQ5Li45NjE5MDQyMTI5YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVD
dXJsRGVsZWdhdGUuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaWYgVVNFKENVUkwpCiAKICNpbmNs
dWRlICJBdXRoZW50aWNhdGlvbkNoYWxsZW5nZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRCLmgi
CiAjaW5jbHVkZSAiQ3JlZGVudGlhbFN0b3JhZ2UuaCIKICNpbmNsdWRlICJDdXJsQ2FjaGVNYW5h
Z2VyLmgiCiAjaW5jbHVkZSAiQ3VybFJlcXVlc3QuaCIKQEAgLTE4MCw2ICsxODEsMTcgQEAgYm9v
bCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6Y2FuY2VsbGVkT3JDbGllbnRsZXNzKCkKICAg
ICByZXR1cm4gIW1faGFuZGxlLT5jbGllbnQoKTsKIH0KIAorc3RhdGljIHZvaWQgaGFuZGxlQ29v
a2llSGVhZGVycyhjb25zdCBDdXJsUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIHN0YXRpYyBj
b25zdCBhdXRvIHNldENvb2tpZUhlYWRlciA9ICJzZXQtY29va2llOiAiOworICAgIGZvciAoYXV0
byBoZWFkZXIgOiByZXNwb25zZS5oZWFkZXJzKSB7CisgICAgICAgIGlmIChoZWFkZXIuc3RhcnRz
V2l0aElnbm9yaW5nQVNDSUlDYXNlKHNldENvb2tpZUhlYWRlcikpIHsKKyAgICAgICAgICAgIFN0
cmluZyBzZXRDb29raWVTdHJpbmcgPSBoZWFkZXIucmlnaHQoaGVhZGVyLmxlbmd0aCgpIC0gc3Ry
bGVuKHNldENvb2tpZUhlYWRlcikpOworICAgICAgICAgICAgQ3VybENvbnRleHQ6OnNpbmdsZXRv
bigpLmNvb2tpZUphcigpLnNldENvb2tpZXNGcm9tSFRUUFJlc3BvbnNlKHJlc3BvbnNlLnVybCwg
c2V0Q29va2llU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBSZXNvdXJjZUhh
bmRsZUN1cmxEZWxlZ2F0ZTo6Y3VybERpZFJlY2VpdmVSZXNwb25zZShjb25zdCBDdXJsUmVzcG9u
c2UmIHJlY2VpdmVkUmVzcG9uc2UpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKQEAg
LTIwNSw2ICsyMTcsOCBAQCB2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjdXJsRGlk
UmVjZWl2ZVJlc3BvbnNlKGNvbnN0IEN1cmxSZXNwb25zZSYgcmVjZQogICAgICAgICByZXR1cm47
CiAgICAgfQogCisgICAgaGFuZGxlQ29va2llSGVhZGVycyhyZWNlaXZlZFJlc3BvbnNlKTsKKwog
ICAgIGlmIChtX2hhbmRsZS0+Y2xpZW50KCkpIHsKICAgICAgICAgaWYgKHJlc3BvbnNlKCkuaXNO
b3RNb2RpZmllZCgpKSB7CiAgICAgICAgICAgICBVUkwgY2FjaGVVcmwgPSBtX2N1cnJlbnRSZXF1
ZXN0LnVybCgpOwo=
</data>
<flag name="review"
          id="350536"
          type_id="1"
          status="-"
          setter="achristensen"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>332812</attachid>
            <date>2018-01-31 15:38:20 -0800</date>
            <delta_ts>2018-01-31 15:45:38 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>174942.diff</filename>
            <type>text/plain</type>
            <size>60528</size>
            <attacher name="Christopher Reid">chris.reid</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA5N2Q4N2IyNWNhYy4uOTc2NjRmMzUxNDMgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzNiBAQAorMjAxOC0wMS0zMSAgQ2hyaXN0b3BoZXIgUmVpZCAgPGNocmlzLnJlaWRAc29u
eS5jb20+CisKKyAgICAgICAgW0N1cmxdIFVzZSBTUUxpdGUgZGF0YWJhc2UgaW4gY29va2llIGph
ciBpbXBsZW1lbnRhdGlvbiBmb3IgQ3VybCBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMgU2V0LUNvb2tpZSBpcyBhbHJlYWR5
IHRlc3RlZCBpbiBMYXlvdXQgdGVzdHMuCQkKKwkJCisgICAgICAgIEFkZGluZyBhbiBpbml0aWFs
IFNRTGl0ZSBDb29raWVKYXIgaW1wbGVtZW50YXRpb24gdG8gdGhlIGN1cmwgbmV0d29yayBsYXll
ci4JCQorICAgICAgICBXZWJDb3JlIHdpbGwgbm93IHBhcnNlIGFuZCBoYW5kbGUgYm90aCBIVFRQ
IGFuZCBET00gY29va2llcyBpbnN0ZWFkIG9mIHVzaW5nIGxpYmN1cmwuCQkKKyAgICAgICAgVGhp
cyBjdXJyZW50bHkgc3VwcG9ydHMgY29va2llIHN0b3JhZ2UgYW5kIHJldHJpZXZhbC4JCQorICAg
ICAgICBDb29raWUgZGVsZXRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICBN
b3ZlZCBDb29raWVKYXIgYWxvbmcgd2l0aCB0aGUgQ29va2llSmFyREIgc3RvcmFnZSB0byBOZXR3
b3JrU3RvcmFnZVNlc3Npb24uCisgICAgICAgIEtlcHQgdGhlIG9sZCBsaWJjdXJsIGNvb2tpZSBi
YWNrZW5kIGJlaGluZCBFTkFCTEUoQ1VSTF9DT09LSUVfU1RPUkFHRSkuCisKKyAgICAgICAgKiBw
bGF0Zm9ybS9DdXJsLmNtYWtlOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvTmV0d29ya1N0
b3JhZ2VTZXNzaW9uLmg6IEFkZGVkIGN1cmwgY29va2llIHN0b3JhZ2UuCisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwuY3BwOgorICAgICAgICAqIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuaDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmg6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuaDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcDogTW92ZWQgY3VybCBjb29raWUgamFy
IHRvIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ3VybENvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJl
cXVlc3QuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFn
ZVNlc3Npb25DdXJsLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3Vy
Y2VIYW5kbGVDdXJsRGVsZWdhdGUuY3BwOgorCiAyMDE4LTAxLTI5ICBDaHJpcyBEdW1leiAgPGNk
dW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgRHJvcCB1bm5lY2Vzc2FyeSAiU2VydmljZVdvcmtl
ciBUYXNrIFRocmVhZCIgaW4gU1dTZXJ2ZXIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmlu
ZGV4IGNkYWVmNWJmNzRhLi43M2MwMTRmMTVjMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNt
YWtlCkBAIC01LDcgKzUsMTAgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9JTkNMVURFX0RJUkVDVE9S
SUVTCiBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQXV0aGVudGljYXRpb25DaGFsbGVuZ2VDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJDdXJsLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVK
YXJDdXJsRGF0YWJhc2UuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRC
LmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVTdG9yYWdlQ3VybC5jcHAKKyAg
ICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5jcHAKICAgICBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ3JlZGVudGlhbFN0b3JhZ2VDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9DdXJsQ2FjaGVFbnRyeS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENh
Y2hlTWFuYWdlci5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvTmV0d29ya1N0b3JhZ2VTZXNzaW9uLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL05ldHdvcmtTdG9yYWdlU2Vzc2lvbi5oCmluZGV4IGZkMGI2ZWJjNDE4Li4zOWY3M2U1ZGE0
OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9OZXR3b3JrU3Rv
cmFnZVNlc3Npb24uaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL05ldHdv
cmtTdG9yYWdlU2Vzc2lvbi5oCkBAIC00Myw2ICs0MywxMSBAQAogdHlwZWRlZiBzdHJ1Y3QgX1Nv
dXBDb29raWVKYXIgU291cENvb2tpZUphcjsKICNlbmRpZgogCisjaWYgVVNFKENVUkwpCisjaW5j
bHVkZSAiQ29va2llSmFyQ3VybC5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRCLmgiCisjZW5kaWYK
KwogI2lmZGVmIF9fT0JKQ19fCiAjaW5jbHVkZSA8b2JqYy9vYmpjLmg+CiAjZW5kaWYKQEAgLTEx
NSw2ICsxMjAsMTYgQEAgcHVibGljOgogICAgIHZvaWQgc2V0Q29va2llT2JzZXJ2ZXJIYW5kbGVy
KEZ1bmN0aW9uPHZvaWQgKCk+JiYpOwogICAgIHZvaWQgZ2V0Q3JlZGVudGlhbEZyb21QZXJzaXN0
ZW50U3RvcmFnZShjb25zdCBQcm90ZWN0aW9uU3BhY2UmLCBGdW5jdGlvbjx2b2lkIChDcmVkZW50
aWFsJiYpPiBjb21wbGV0aW9uSGFuZGxlcik7CiAgICAgdm9pZCBzYXZlQ3JlZGVudGlhbFRvUGVy
c2lzdGVudFN0b3JhZ2UoY29uc3QgUHJvdGVjdGlvblNwYWNlJiwgY29uc3QgQ3JlZGVudGlhbCYp
OworI2VsaWYgVVNFKENVUkwpCisgICAgTmV0d29ya1N0b3JhZ2VTZXNzaW9uKFBBTDo6U2Vzc2lv
bklELCBOZXR3b3JraW5nQ29udGV4dCopOworICAgIH5OZXR3b3JrU3RvcmFnZVNlc3Npb24oKTsK
KworICAgIENvb2tpZUphckN1cmwmIGNvb2tpZVN0b3JhZ2UoKSBjb25zdCB7IHJldHVybiAqbV9j
b29raWVTdG9yYWdlOyB9OworI2lmICFFTkFCTEUoQ1VSTF9DT09LSUVfU1RPUkFHRSkKKyAgICBD
b29raWVKYXJEQiYgY29va2llRGF0YWJhc2UoKSBjb25zdCB7IHJldHVybiAqbV9jb29raWVEYXRh
YmFzZTsgfTsKKyNlbmRpZgorCisgICAgTmV0d29ya2luZ0NvbnRleHQqIGNvbnRleHQoKSBjb25z
dDsKICNlbHNlCiAgICAgTmV0d29ya1N0b3JhZ2VTZXNzaW9uKFBBTDo6U2Vzc2lvbklELCBOZXR3
b3JraW5nQ29udGV4dCopOwogICAgIH5OZXR3b3JrU3RvcmFnZVNlc3Npb24oKTsKQEAgLTE0Niw2
ICsxNjEsMTMgQEAgcHJpdmF0ZToKICAgICBGdW5jdGlvbjx2b2lkIChDcmVkZW50aWFsJiYpPiBt
X3BlcnNpc2VudFN0b3JhZ2VDb21wbGV0aW9uSGFuZGxlcjsKICAgICBHUmVmUHRyPEdDYW5jZWxs
YWJsZT4gbV9wZXJzaXNlbnRTdG9yYWdlQ2FuY2VsbGFibGU7CiAjZW5kaWYKKyNlbGlmIFVTRShD
VVJMKQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDb29raWVKYXJDdXJsPiBtX2Nvb2tpZVN0b3JhZ2U7
CisjaWYgIUVOQUJMRShDVVJMX0NPT0tJRV9TVE9SQUdFKQorICAgIHN0ZDo6dW5pcXVlX3B0cjxD
b29raWVKYXJEQj4gbV9jb29raWVEYXRhYmFzZTsKKyNlbmRpZgorCisgICAgUmVmUHRyPE5ldHdv
cmtpbmdDb250ZXh0PiBtX2NvbnRleHQ7CiAjZWxzZQogICAgIFJlZlB0cjxOZXR3b3JraW5nQ29u
dGV4dD4gbV9jb250ZXh0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAKaW5kZXggZTNiNzI4YjgzYmYuLmEz
ZGFmNDNlNTliIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llSmFyQ3VybC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZUphckN1cmwuY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAKICNpZiBVU0UoQ1VS
TCkKICNpbmNsdWRlICJDb29raWUuaCIKKyNpbmNsdWRlICJDb29raWVVdGlsLmgiCiAjaW5jbHVk
ZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Npb24uaCIKICNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlVSTC5oIgogCkBAIC00NSwyOSAr
NDcsNiBAQCBzdGF0aWMgdm9pZCByZWFkQ3VybENvb2tpZVRva2VuKGNvbnN0IGNoYXIqJiBjb29r
aWUsIFN0cmluZyYgdG9rZW4pCiAgICAgICAgIGNvb2tpZSsrOwogfQogCi1zdGF0aWMgYm9vbCBk
b21haW5NYXRjaChjb25zdCBTdHJpbmcmIGNvb2tpZURvbWFpbiwgY29uc3QgU3RyaW5nJiBob3N0
KQotewotICAgIHNpemVfdCBpbmRleCA9IGhvc3QuZmluZChjb29raWVEb21haW4pOwotCi0gICAg
Ym9vbCB0YWlsTWF0Y2ggPSAoaW5kZXggIT0gV1RGOjpub3RGb3VuZCAmJiBpbmRleCArIGNvb2tp
ZURvbWFpbi5sZW5ndGgoKSA9PSBob3N0Lmxlbmd0aCgpKTsKLQotICAgIC8vIENoZWNrIGlmIGhv
c3QgZXF1YWxzIGNvb2tpZSBkb21haW4uCi0gICAgaWYgKHRhaWxNYXRjaCAmJiAhaW5kZXgpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gQ2hlY2sgaWYgaG9zdCBpcyBhIHN1YmRvbWFp
biBvZiB0aGUgZG9tYWluIGluIHRoZSBjb29raWUuCi0gICAgLy8gQ3VybCB1c2VzIGEgJy4nIGlu
IGZyb250IG9mIGRvbWFpbnMgdG8gaW5kaWNhdGUgaXQncyB2YWxpZCBvbiBzdWJkb21haW5zLgot
ICAgIGlmICh0YWlsTWF0Y2ggJiYgaW5kZXggPiAwICYmIGhvc3RbaW5kZXhdID09ICcuJykKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBDaGVjayB0aGUgc3BlY2lhbCBjYXNlIHdoZXJl
IGhvc3QgZXF1YWxzIHRoZSBjb29raWUgZG9tYWluLCBleGNlcHQgZm9yIGEgbGVhZGluZyAnLicg
aW4gdGhlIGNvb2tpZSBkb21haW4uCi0gICAgLy8gRS5nLiBjb29raWUgZG9tYWluIGlzIC5hcHBs
ZS5jb20gYW5kIGhvc3QgaXMgYXBwbGUuY29tLiAKLSAgICBpZiAoY29va2llRG9tYWluWzBdID09
ICcuJyAmJiBjb29raWVEb21haW4uZmluZChob3N0KSA9PSAxKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdDdXJs
Q29va2llKGNvbnN0IGNoYXIqIGNvb2tpZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0IFN0
cmluZyYgcGF0aCwgU3RyaW5nQnVpbGRlciYgY29va2llcywgYm9vbCBodHRwb25seSkKIHsKICAg
ICAvLyBDaGVjayBpZiB0aGUgY29va2llIG1hdGNoZXMgZG9tYWluIGFuZCBwYXRoLCBhbmQgaXMg
bm90IGV4cGlyZWQuCkBAIC0xMDMsNyArODIsNyBAQCBzdGF0aWMgdm9pZCBhZGRNYXRjaGluZ0N1
cmxDb29raWUoY29uc3QgY2hhciogY29va2llLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29ucwog
ICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICghZG9tYWluTWF0Y2goY29va2ll
RG9tYWluLCBkb21haW4pKQorICAgIGlmICghQ29va2llVXRpbDo6ZG9tYWluTWF0Y2goY29va2ll
RG9tYWluLCBkb21haW4pKQogICAgICAgICByZXR1cm47CiAKICAgICBTdHJpbmcgc3RyQm9vbGVh
bjsKQEAgLTI0Niw3ICsyMjUsNiBAQCB2b2lkIENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpzZXRD
b29raWVzRnJvbURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjbwogICAgIEN1cmxI
YW5kbGUgY3VybEhhbmRsZTsKIAogICAgIGN1cmxIYW5kbGUuZW5hYmxlU2hhcmVIYW5kbGUoKTsK
LSAgICBjdXJsSGFuZGxlLmVuYWJsZUNvb2tpZUphcklmRXhpc3RzKCk7CiAKICAgICAvLyBDVVJM
IGFjY2VwdHMgY29va2llcyBpbiBlaXRoZXIgU2V0LUNvb2tpZSBvciBOZXRzY2FwZSBmaWxlIGZv
cm1hdC4KICAgICAvLyBIb3dldmVyIHdpdGggU2V0LUNvb2tpZSBmb3JtYXQsIHRoZXJlIGlzIG5v
IHdheSB0byBzcGVjaWZ5IHRoYXQgd2UKQEAgLTM0OCw1MiArMzI2LDUyIEBAIHZvaWQgQ29va2ll
SmFyQ3VybEZpbGVTeXN0ZW06OmRlbGV0ZUFsbENvb2tpZXNNb2RpZmllZFNpbmNlKGNvbnN0IE5l
dHdvcmtTdG9yYWdlCiAKIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZXNGb3JET00oY29u
c3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHks
IGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9w
dGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzIGluY2x1ZGVTZWN1
cmVDb29raWVzKQogewotICAgIHJldHVybiBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2ll
SmFyKCkuY29va2llc0ZvckRPTShzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBh
Z2VJRCwgaW5jbHVkZVNlY3VyZUNvb2tpZXMpOworICAgIHJldHVybiBzZXNzaW9uLmNvb2tpZVN0
b3JhZ2UoKS5jb29raWVzRm9yRE9NKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwg
cGFnZUlELCBpbmNsdWRlU2VjdXJlQ29va2llcyk7CiB9CiAKIHZvaWQgc2V0Q29va2llc0Zyb21E
T00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0
UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBz
dGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7Ci0g
ICAgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmNvb2tpZUphcigpLnNldENvb2tpZXNGcm9tRE9N
KHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCB2YWx1ZSk7CisgICAg
c2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuc2V0Q29va2llc0Zyb21ET00oc2Vzc2lvbiwgZmlyc3RQ
YXJ0eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIHZhbHVlKTsKIH0KIAogc3RkOjpwYWlyPFN0cmlu
ZywgYm9vbD4gY29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJs
LCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90
PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzIGluY2x1ZGVTZWN1cmVDb29raWVzKQogewot
ICAgIHJldHVybiBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuY29va2llUmVx
dWVzdEhlYWRlckZpZWxkVmFsdWUoc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlELCBw
YWdlSUQsIGluY2x1ZGVTZWN1cmVDb29raWVzKTsKKyAgICByZXR1cm4gc2Vzc2lvbi5jb29raWVT
dG9yYWdlKCkuY29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoc2Vzc2lvbiwgZmlyc3RQYXJ0
eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIGluY2x1ZGVTZWN1cmVDb29raWVzKTsKIH0KIAogYm9v
bCBjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24pCiB7
Ci0gICAgcmV0dXJuIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5jb29raWVz
RW5hYmxlZChzZXNzaW9uKTsKKyAgICByZXR1cm4gc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuY29v
a2llc0VuYWJsZWQoc2Vzc2lvbik7CiB9CiAKIGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3
b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3Qg
VVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4mIHJhd0Nvb2tpZXMpCiB7Ci0gICAgcmV0
dXJuIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5nZXRSYXdDb29raWVzKHNl
c3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCByYXdDb29raWVzKTsKKyAg
ICByZXR1cm4gc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuZ2V0UmF3Q29va2llcyhzZXNzaW9uLCBm
aXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgcmF3Q29va2llcyk7CiB9CiAKIHZvaWQg
ZGVsZXRlQ29va2llKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3Qg
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2llKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5n
bGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVDb29raWUoc2Vzc2lvbiwgdXJsLCBjb29raWUpOwor
ICAgIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmRlbGV0ZUNvb2tpZShzZXNzaW9uLCB1cmwsIGNv
b2tpZSk7CiB9CiAKIHZvaWQgZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0
b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBIYXNoU2V0PFN0cmluZz4mIGhvc3RuYW1lcykKIHsKLSAg
ICBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuZ2V0SG9zdG5hbWVzV2l0aENv
b2tpZXMoc2Vzc2lvbiwgaG9zdG5hbWVzKTsKKyAgICBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5n
ZXRIb3N0bmFtZXNXaXRoQ29va2llcyhzZXNzaW9uLCBob3N0bmFtZXMpOwogfQogCiB2b2lkIGRl
bGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNz
aW9uLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKQogewotICAgIEN1cmxD
b250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVDb29raWVzRm9ySG9zdG5hbWVz
KHNlc3Npb24sIGNvb2tpZUhvc3ROYW1lcyk7CisgICAgc2Vzc2lvbi5jb29raWVTdG9yYWdlKCku
ZGVsZXRlQ29va2llc0Zvckhvc3RuYW1lcyhzZXNzaW9uLCBjb29raWVIb3N0TmFtZXMpOwogfQog
CiB2b2lkIGRlbGV0ZUFsbENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNz
aW9uKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVB
bGxDb29raWVzKHNlc3Npb24pOworICAgIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmRlbGV0ZUFs
bENvb2tpZXMoc2Vzc2lvbik7CiB9CiAKIHZvaWQgZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2lu
Y2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBXYWxsVGltZSBzaW5jZSkK
IHsKLSAgICBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuZGVsZXRlQWxsQ29v
a2llc01vZGlmaWVkU2luY2Uoc2Vzc2lvbiwgc2luY2UpOworICAgIHNlc3Npb24uY29va2llU3Rv
cmFnZSgpLmRlbGV0ZUFsbENvb2tpZXNNb2RpZmllZFNpbmNlKHNlc3Npb24sIHNpbmNlKTsKIH0K
IAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZUphckN1cmwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29r
aWVKYXJDdXJsLmgKaW5kZXggYTUyZmQ3ODYxNzEuLjY2OWYwNjRmZjJhIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmgKQEAg
LTMwLDYgKzMwLDcgQEAgY2xhc3MgQ29va2llSmFyQ3VybCB7CiBwdWJsaWM6CiAgICAgdmlydHVh
bCBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRp
b25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJ
bmNsdWRlU2VjdXJlQ29va2llcykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRDb29raWVzRnJv
bURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHks
IGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9u
YWw8dWludDY0X3Q+IHBhZ2VJRCwgY29uc3QgU3RyaW5nJikgPSAwOworICAgIHZpcnR1YWwgdm9p
ZCBzZXRDb29raWVzRnJvbUhUVFBSZXNwb25zZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
LCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGNvb2tp
ZXNFbmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpID0gMDsKICAgICB2aXJ0dWFs
IHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RIZWFkZXJGaWVsZFZhbHVlKGNv
bnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3Qg
VVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50
NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgPSAwOwogICAgIHZpcnR1YWwgYm9v
bCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYg
Zmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwg
c3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2llPiYpID0gMDsKQEAg
LTQzLDYgKzQ0LDcgQEAgcHVibGljOgogY2xhc3MgQ29va2llSmFyQ3VybEZpbGVTeXN0ZW0gOiBw
dWJsaWMgQ29va2llSmFyQ3VybCB7CiAgICAgc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29va2ll
c0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFy
dHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0
aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJyaWRlOwog
ICAgIHZvaWQgc2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwg
Y29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90
PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYp
IG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0
d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiwgY29uc3QgU3RyaW5nJikgb3ZlcnJpZGUg
eyB9OwogICAgIGJvb2wgY29va2llc0VuYWJsZWQoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
Jikgb3ZlcnJpZGU7CiAgICAgc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29va2llUmVxdWVzdEhl
YWRlckZpZWxkVmFsdWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBm
aXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBz
dGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzKSBvdmVy
cmlkZTsKICAgICBib29sIGdldFJhd0Nvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2
NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIFZlY3RvcjxDb29r
aWU+Jikgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ29va2llSmFyQ3VybERhdGFiYXNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40YzZiNTczY2FjZAotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJh
c2UuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNvbnkg
SW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJDb29raWVKYXJDdXJsRGF0YWJhc2UuaCIKKworI2lmIFVTRShD
VVJMKSAmJiAhRU5BQkxFKENVUkxfQ09PS0lFX1NUT1JBR0UpCisjaW5jbHVkZSAiQ29va2llLmgi
CisjaW5jbHVkZSAiQ29va2llSmFyREIuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Np
b24uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlVSTC5oIgorCisj
aW5jbHVkZSA8d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRl
ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK3N0YXRpYyBTdHJpbmcgY29va2llc0ZvclNlc3Npb24oY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmLCBjb25zdCBVUkwmIHVybCwgYm9vbCBodHRw
b25seSkKK3sKKyAgICBTdHJpbmdCdWlsZGVyIGNvb2tpZXM7CisKKyAgICBDb29raWVKYXJEQiYg
Y29va2llSmFyREIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7CisgICAgYXV0byBpc0h0dHBP
bmx5ID0gKGh0dHBvbmx5ID8gc3RkOjpudWxsb3B0IDogc3RkOjpvcHRpb25hbDxib29sPiB7ZmFs
c2V9KTsKKyAgICBhdXRvIHNlY3VyZSA9IHVybC5wcm90b2NvbElzKCJodHRwcyIpID8gc3RkOjpu
dWxsb3B0IDogc3RkOjpvcHRpb25hbDxib29sPiB7ZmFsc2V9OworCisgICAgVmVjdG9yPENvb2tp
ZT4gcmVzdWx0czsKKyAgICBpZiAoY29va2llSmFyREIuc2VhcmNoQ29va2llcyh1cmwuc3RyaW5n
KCksIGlzSHR0cE9ubHksIHNlY3VyZSwgc3RkOjpudWxsb3B0LCByZXN1bHRzKSkgeworICAgICAg
ICBmb3IgKGF1dG8gcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICAgICAgaWYgKCFjb29raWVz
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb29raWVzLmFwcGVuZCgiOyAiKTsKKyAgICAg
ICAgICAgIGNvb2tpZXMuYXBwZW5kKHJlc3VsdC5uYW1lKTsKKyAgICAgICAgICAgIGNvb2tpZXMu
YXBwZW5kKCI9Iik7CisgICAgICAgICAgICBjb29raWVzLmFwcGVuZChyZXN1bHQudmFsdWUpOwor
ICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb29raWVzLnRvU3RyaW5nKCk7Cit9CisKK3Zv
aWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3Jr
U3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJM
JiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWlu
dDY0X3Q+IHBhZ2VJRCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0o
ZnJhbWVJRCk7CisgICAgVU5VU0VEX1BBUkFNKHBhZ2VJRCk7CisKKyAgICBDb29raWVKYXJEQiYg
Y29va2llSmFyREIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7CisgICAgY29va2llSmFyREIu
c2V0Q29va2llKHVybC5zdHJpbmcoKSwgdmFsdWUsIHRydWUpOworfQorCit2b2lkIENvb2tpZUph
ckN1cmxEYXRhYmFzZTo6c2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0
b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB2YWx1
ZSkKK3sKKyAgICBDb29raWVKYXJEQiYgY29va2llSmFyREIgPSBzZXNzaW9uLmNvb2tpZURhdGFi
YXNlKCk7CisgICAgY29va2llSmFyREIuc2V0Q29va2llKHVybC5zdHJpbmcoKSwgdmFsdWUsIGZh
bHNlKTsKK30KKworc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gQ29va2llSmFyQ3VybERhdGFiYXNl
Ojpjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29u
c3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJl
Q29va2llcykKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7CisgICAgVU5VU0VEX1BBUkFN
KHBhZ2VJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgZmlsdGVyIHNlY3VyZSBjb29r
aWVzIG91dCBpZiB0aGUgY2FsbGVyIHJlcXVlc3RzIGl0LgorICAgIHJldHVybiB7IGNvb2tpZXNG
b3JTZXNzaW9uKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZmFsc2UpLCBmYWxzZSB9OworfQor
CitzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmNvb2tpZVJl
cXVlc3RIZWFkZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lv
biwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1
aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRl
U2VjdXJlQ29va2llcykKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7CisgICAgVU5VU0VE
X1BBUkFNKHBhZ2VJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgZmlsdGVyIHNlY3Vy
ZSBjb29raWVzIG91dCBpZiB0aGUgY2FsbGVyIHJlcXVlc3RzIGl0LgorICAgIHJldHVybiB7IGNv
b2tpZXNGb3JTZXNzaW9uKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgdHJ1ZSksIGZhbHNlIH07
Cit9CisKK2Jvb2wgQ29va2llSmFyQ3VybERhdGFiYXNlOjpjb29raWVzRW5hYmxlZChjb25zdCBO
ZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24pCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgQ29va2llSmFyQ3VybERhdGFiYXNlOjpnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtT
dG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwm
LCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90
PiBwYWdlSUQsIFZlY3RvcjxDb29raWU+JiByYXdDb29raWVzKQoreworICAgIFVOVVNFRF9QQVJB
TShmcmFtZUlEKTsKKyAgICBVTlVTRURfUEFSQU0ocGFnZUlEKTsKKworICAgIENvb2tpZUphckRC
JiBjb29raWVKYXJEQiA9IHNlc3Npb24uY29va2llRGF0YWJhc2UoKTsKKyAgICByZXR1cm4gY29v
a2llSmFyREIuc2VhcmNoQ29va2llcyhmaXJzdFBhcnR5LnN0cmluZygpLCBzdGQ6Om51bGxvcHQs
IHN0ZDo6bnVsbG9wdCwgc3RkOjpudWxsb3B0LCByYXdDb29raWVzKTsKK30KKwordm9pZCBDb29r
aWVKYXJDdXJsRGF0YWJhc2U6OmRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mLCBjb25zdCBVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBjb29raWVOYW1lKQoreworICAgIC8v
IEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFi
YXNlOjpnZXRIb3N0bmFtZXNXaXRoQ29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
LCBIYXNoU2V0PFN0cmluZz4mIGhvc3RuYW1lcykKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBp
bXBsZW1lbnRlZAorfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6ZGVsZXRlQ29va2ll
c0Zvckhvc3RuYW1lcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBWZWN0b3I8
U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKQoreworICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxl
bWVudGVkCit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpkZWxldGVBbGxDb29raWVz
KGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpCit7CisgICAgLy8gRklYTUU6IE5vdCB5ZXQg
aW1wbGVtZW50ZWQKK30KKwordm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmRlbGV0ZUFsbENv
b2tpZXNNb2RpZmllZFNpbmNlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIFdhbGxUaW1l
KQoreworICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShDVVJMKSAmJiAhRU5BQkxFKENVUkxfQ09PS0lF
X1NUT1JBR0UpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llSmFyQ3VybERhdGFiYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ29va2llSmFyQ3VybERhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAuLmM5MzBkMzY4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5oCkBAIC0w
LDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBF
bnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
CisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvb2tpZUphckN1cmwu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBDb29raWVKYXJDdXJsRGF0YWJhc2Ug
OiBwdWJsaWMgQ29va2llSmFyQ3VybCB7CisgICAgc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29v
a2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0
UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6
b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJyaWRl
OworICAgIHZvaWQgc2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2
NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmlu
ZyYpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3Qg
TmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiwgY29uc3QgU3RyaW5nJikgb3ZlcnJp
ZGU7CisgICAgYm9vbCBjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
KSBvdmVycmlkZTsKKyAgICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVh
ZGVyRmllbGRWYWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZp
cnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJy
aWRlOworICAgIGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
LCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0
X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tp
ZT4mKSBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3RvcmFn
ZVNlc3Npb24mLCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKKyAgICB2b2lk
IGdldEhvc3RuYW1lc1dpdGhDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIEhh
c2hTZXQ8U3RyaW5nPiYgaG9zdG5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZUNvb2tp
ZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVmVjdG9y
PFN0cmluZz4mIGNvb2tpZUhvc3ROYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWxldGVBbGxD
b29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpIG92ZXJyaWRlOworICAgIHZvaWQg
ZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiwgV2FsbFRpbWUpIG92ZXJyaWRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRC
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjY3OGRhZmYzMjc2Ci0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZUphckRCLmNwcApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
OCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJDb29raWVKYXJEQi5oIgorCisjaW5jbHVkZSAiQ29va2llVXRpbC5oIgorI2lu
Y2x1ZGUgIlNRTGl0ZUZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJVUkwuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCisjZGVmaW5lIENPUlJVUFRfTUFSS0VSX1NVRkZJWCAiLWNvcnJ1cHRlZCIK
KworLy8gQXQgbGVhc3QgNTAgY29va2llcyBwZXIgZG9tYWluIChSRkM2MjY1IDYuMS4gTGltaXRz
KQorI2RlZmluZSBNQVhfQ09PS0lFX1BFUl9ET01BSU4gODAKKworI2RlZmluZSBDUkVBVEVfQ09P
S0lFX1RBQkxFX1NRTCBcCisgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIENvb2tpZSAo
IlwKKyAgICAiICBuYW1lIFRFWFQgTk9UIE5VTEwsIlwKKyAgICAiICB2YWx1ZSBURVhULCJcCisg
ICAgIiAgZG9tYWluIFRFWFQgTk9UIE5VTEwsIlwKKyAgICAiICBwYXRoIFRFWFQgTk9UIE5VTEws
IlwKKyAgICAiICBleHBpcmVzIElOVEVHRVIgTk9UIE5VTEwsIlwKKyAgICAiICBzaXplIElOVEVH
RVIgTk9UIE5VTEwsIlwKKyAgICAiICBzZXNzaW9uIElOVEVHRVIgTk9UIE5VTEwsIlwKKyAgICAi
ICBodHRwb25seSBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwiXAorICAgICIgIHNlY3VyZSBJ
TlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwiXAorICAgICIgIGxhc3R1cGRhdGVkIElOVEVHRVIg
Tk9UIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwgIlwKKyAgICAiICBVTklRVUUobmFt
ZSwgZG9tYWluLCBwYXRoKSk7IgorI2RlZmluZSBDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCBcCisg
ICAgIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGRvbWFpbl9pbmRleCBPTiBDb29raWUoZG9t
YWluKTsiCisjZGVmaW5lIENSRUFURV9QQVRIX0lOREVYX1NRTCBcCisgICAgIkNSRUFURSBJTkRF
WCBJRiBOT1QgRVhJU1RTIHBhdGhfaW5kZXggT04gQ29va2llKHBhdGgpOyIKKyNkZWZpbmUgQ0hF
Q0tfRVhJU1RTX0hUVFBPTkxZX0NPT0tJRV9TUUwgXAorICAgICJTRUxFQ1QgbmFtZSBGUk9NIENv
b2tpZSBXSEVSRSAobmFtZSA9ID8pIEFORCAoZG9tYWluID0gPykgQU5EIChwYXRoID0gPykgQU5E
IChodHRwb25seSA9IDEpOyIKKyNkZWZpbmUgU0VUX0NPT0tJRV9TUUwgXAorICAgICJJTlNFUlQg
T1IgUkVQTEFDRSBJTlRPIENvb2tpZSAobmFtZSwgdmFsdWUsIGRvbWFpbiwgcGF0aCwgZXhwaXJl
cywgc2l6ZSwgc2Vzc2lvbiwgaHR0cG9ubHksIHNlY3VyZSkgIlwKKyAgICAiVkFMVUVTICg/LCA/
LCA/LCA/LCA/LCA/LCA/LCA/LCA/KTsiCisjZGVmaW5lIERFTEVURV9DT09LSUVfQllfTkFNRV9E
T01BSU5fUEFUSF9TUUwgXAorICAgICJERUxFVEUgRlJPTSBDb29raWUgV0hFUkUgbmFtZSA9ID8g
QU5EIGRvbWFpbiA9ID8gQU5EIHBhdGggPSA/OyIKKyNkZWZpbmUgREVMRVRFX0NPT0tJRV9CWV9O
QU1FX0RPTUFJTl9TUUwgXAorICAgICJERUxFVEUgRlJPTSBDb29raWUgV0hFUkUgbmFtZSA9ID8g
QU5EIGRvbWFpbiA9ID87IgorI2RlZmluZSBERUxFVEVfQUxMX1NFU1NJT05fQ09PS0lFX1NRTCBc
CisgICAgIkRFTEVURSBGUk9NIENvb2tpZSBXSEVSRSBzZXNzaW9uID0gMTsiCisjZGVmaW5lIERF
TEVURV9BTExfQ09PS0lFX1NRTCBcCisgICAgIkRFTEVURSBGUk9NIENvb2tpZTsiCisKK3ZvaWQg
Q29va2llSmFyREI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGUpCit7CisgICAgQ29va2llSmFyREI6
Om1fY29va2llRW5hYmxlID0gZW5hYmxlOworfQorCitDb29raWVKYXJEQjo6Q29va2llSmFyREIo
Y29uc3QgU3RyaW5nJiBkYXRhYmFzZVBhdGgpCisgICAgOiBtX2RhdGFiYXNlUGF0aChkYXRhYmFz
ZVBhdGgpCit7CisgICAgY2hlY2tEYXRhYmFzZUNvcnJ1cHRpb25BbmRSZW1vdmVJZk5lZWRlZCgp
OworCisgICAgaWYgKCFvcGVuRGF0YWJhc2UoKSkKKyAgICAgICAgcmV0dXJuOworfQorCitDb29r
aWVKYXJEQjo6fkNvb2tpZUphckRCKCkKK3sKKyAgICBjbG9zZURhdGFiYXNlKCk7Cit9CisKK2Jv
b2wgQ29va2llSmFyREI6Om9wZW5EYXRhYmFzZSgpCit7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNP
cGVuKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCBleGlzdHNEYXRhYmFzZUZp
bGUgPSBmYWxzZTsKKyAgICBpZiAoIWlzT25NZW1vcnkoKSkKKyAgICAgICAgZXhpc3RzRGF0YWJh
c2VGaWxlID0gU1FMaXRlRmlsZVN5c3RlbTo6ZW5zdXJlRGF0YWJhc2VGaWxlRXhpc3RzKG1fZGF0
YWJhc2VQYXRoLCBmYWxzZSk7CisKKyAgICBpZiAoZXhpc3RzRGF0YWJhc2VGaWxlKSB7CisgICAg
ICAgIGlmIChtX2RhdGFiYXNlLm9wZW4obV9kYXRhYmFzZVBhdGgsIGZhbHNlKSkgeworICAgICAg
ICAgICAgaWYgKGNoZWNrRGF0YWJhc2VWYWxpZGl0eSgpKQorICAgICAgICAgICAgICAgIGV4ZWN1
dGVTaW1wbGVTcWwoREVMRVRFX0FMTF9TRVNTSU9OX0NPT0tJRV9TUUwpOworICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGRhdGFiYXNlIGFuZCB0cnkgdG8gcmUt
Y3JlYXRlIGFnYWluCisgICAgICAgICAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOworICAgICAg
ICAgICAgICAgIGRlbGV0ZUFsbERhdGFiYXNlRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBleGlz
dHNEYXRhYmFzZUZpbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGRlbGV0ZUFsbERhdGFiYXNlRmlsZXMoKTsKKyAgICAgICAgICAgIGV4aXN0
c0RhdGFiYXNlRmlsZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFleGlz
dHNEYXRhYmFzZUZpbGUpIHsKKyAgICAgICAgaWYgKG1fZGF0YWJhc2Uub3BlbihtX2RhdGFiYXNl
UGF0aCwgZmFsc2UpKSB7CisgICAgICAgICAgICBib29sIGRhdGFiYXNlVmFsaWRpdHkgPSB0cnVl
OworICAgICAgICAgICAgZGF0YWJhc2VWYWxpZGl0eSAmPSAoZXhlY3V0ZVNpbXBsZVNxbChDUkVB
VEVfQ09PS0lFX1RBQkxFX1NRTCkgPT0gU1FMSVRFX0RPTkUpOworICAgICAgICAgICAgZGF0YWJh
c2VWYWxpZGl0eSAmPSAoZXhlY3V0ZVNpbXBsZVNxbChDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCkg
PT0gU1FMSVRFX0RPTkUpOworICAgICAgICAgICAgZGF0YWJhc2VWYWxpZGl0eSAmPSAoZXhlY3V0
ZVNpbXBsZVNxbChDUkVBVEVfUEFUSF9JTkRFWF9TUUwpID09IFNRTElURV9ET05FKTsKKyAgICAg
ICAgICAgIGlmICghZGF0YWJhc2VWYWxpZGl0eSkgeworICAgICAgICAgICAgICAgIC8vIGdpdmUg
dXAgY3JlYXRlIGRhdGFiYXNlIGF0IHRoaXMgdGltZSAoYWxsIGNvb2tpZXMgb24gcmVxdWVzdC9y
ZXNwb25zZSBhcmUgaWdub3JlZCkKKyAgICAgICAgICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7
CisgICAgICAgICAgICAgICAgZGVsZXRlQWxsRGF0YWJhc2VGaWxlcygpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBleGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgdGVtcF9z
dG9yZSA9IE1FTU9SWTsiKTsKKyAgICBleGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgc3luY2hyb25v
dXMgPSBOT1JNQUw7Iik7CisgICAgZXhlY3V0ZVNpbXBsZVNxbCgiUFJBR01BIGpvdXJuYWxfbW9k
ZSA9IFdBTDsiKTsKKworICAgIC8vIGNyZWF0ZSBwcmVwYXJlZCBzdGF0ZW1lbnRzCisgICAgY3Jl
YXRlUHJlcGFyZVN0YXRlbWVudChTRVRfQ09PS0lFX1NRTCk7CisgICAgY3JlYXRlUHJlcGFyZVN0
YXRlbWVudChDSEVDS19FWElTVFNfSFRUUE9OTFlfQ09PS0lFX1NRTCk7CisgICAgY3JlYXRlUHJl
cGFyZVN0YXRlbWVudChERUxFVEVfQ09PS0lFX0JZX05BTUVfRE9NQUlOX1BBVEhfU1FMKTsKKyAg
ICBjcmVhdGVQcmVwYXJlU3RhdGVtZW50KERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fU1FM
KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvb2tpZUphckRCOjpjbG9zZURhdGFi
YXNlKCkKK3sKKyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICBmb3IgKGNv
bnN0IGF1dG8mIHN0YXRlbWVudCA6IG1fc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVu
dC52YWx1ZS5nZXQoKS0+ZmluYWxpemUoKTsKKyAgICAgICAgbV9zdGF0ZW1lbnRzLmNsZWFyKCk7
CisgICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKKyAgICB9Cit9CisKK1N0cmluZyBDb29raWVK
YXJEQjo6Z2V0Q29ycnVwdGlvbk1hcmtlclBhdGgoKSBjb25zdAoreworICAgIEFTU0VSVCghaXNP
bk1lbW9yeSgpKTsKKworICAgIHJldHVybiBtX2RhdGFiYXNlUGF0aCArIENPUlJVUFRfTUFSS0VS
X1NVRkZJWDsKK30KKwordm9pZCBDb29raWVKYXJEQjo6ZmxhZ0RhdGFiYXNlQ29ycnVwdGlvbigp
Cit7CisgICAgaWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRklMRSog
ZiA9IGZvcGVuKGdldENvcnJ1cHRpb25NYXJrZXJQYXRoKCkudXRmOCgpLmRhdGEoKSwgIndiIik7
CisgICAgZmNsb3NlKGYpOworfQorCitib29sIENvb2tpZUphckRCOjpjaGVja0RhdGFiYXNlQ29y
cnVwdGlvbkFuZFJlbW92ZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAoaXNPbk1lbW9yeSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzdCA9IHsgMCB9OworICAgIGlu
dCByZXQgPSBzdGF0KGdldENvcnJ1cHRpb25NYXJrZXJQYXRoKCkudXRmOCgpLmRhdGEoKSwgJnN0
KTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGVsZXRlQWxs
RGF0YWJhc2VGaWxlcygpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvb2tpZUphckRC
OjpjaGVja1NRTGl0ZVJldHVybkNvZGUoaW50IGFjdHVhbCwgaW50IGV4cGVjdGVkKQoreworICAg
IGlmICghbV9kZXRlY3RlZERhdGFiYXNlQ29ycnVwdGlvbikgeworICAgICAgICBzd2l0Y2ggKGFj
dHVhbCkgeworICAgICAgICBjYXNlIFNRTElURV9DT1JSVVBUOgorICAgICAgICBjYXNlIFNRTElU
RV9TQ0hFTUE6CisgICAgICAgIGNhc2UgU1FMSVRFX0ZPUk1BVDoKKyAgICAgICAgY2FzZSBTUUxJ
VEVfTk9UQURCOgorICAgICAgICAgICAgZmxhZ0RhdGFiYXNlQ29ycnVwdGlvbigpOworICAgICAg
ICAgICAgbV9kZXRlY3RlZERhdGFiYXNlQ29ycnVwdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICByZXR1cm4gKGFjdHVhbCA9PSBleHBlY3RlZCk7Cit9CisKK2Jvb2wgQ29va2ll
SmFyREI6OmNoZWNrRGF0YWJhc2VWYWxpZGl0eSgpCit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2Uu
aXNPcGVuKCkpOworCisgICAgcmV0dXJuIG1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkNvb2tpZSIp
OworfQorCit2b2lkIENvb2tpZUphckRCOjpkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCkKK3sKKyAg
ICBjbG9zZURhdGFiYXNlKCk7CisgICAgaWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaW50IHJldCA9IDA7CisgICAgU3RyaW5nIHJlbW92ZVBhdGg7CisKKyAgICAvLyBy
ZW1vdmUgbWFya2VyIGZpbGUgKGNvb2tpZS5qYXIuZGItY29ycnVwdGVkKQorICAgIHJldCA9IHJl
bW92ZShyZW1vdmVQYXRoLnV0ZjgoKS5kYXRhKCkpOworCisgICAgLy8gcmVtb3ZlIHNobSBmaWxl
IChjb29raWUuamFyLmRiLXNobSkKKyAgICByZW1vdmVQYXRoID0gU3RyaW5nKG1fZGF0YWJhc2VQ
YXRoICsgIi1zaG0iKTsKKyAgICByZXQgPSByZW1vdmUocmVtb3ZlUGF0aC51dGY4KCkuZGF0YSgp
KTsKKworICAgIC8vIHJlbW92ZSB3YWwgZmlsZSAoY29va2llLmphci5kYi13YWwpCisgICAgcmVt
b3ZlUGF0aCA9IFN0cmluZyhtX2RhdGFiYXNlUGF0aCArICItd2FsIik7CisgICAgcmV0ID0gcmVt
b3ZlKHJlbW92ZVBhdGgudXRmOCgpLmRhdGEoKSk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6Omlz
RW5hYmxlZCgpCit7CisgICAgaWYgKG1fZGF0YWJhc2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIG1fY29va2llRW5hYmxlOworfQorCitib29sIENv
b2tpZUphckRCOjpzZWFyY2hDb29raWVzKGNvbnN0IFN0cmluZyYgcmVxdWVzdFVybCwgY29uc3Qg
c3RkOjpvcHRpb25hbDxib29sPiYgaHR0cE9ubHksIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4m
IHNlY3VyZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgc2Vzc2lvbiwgVmVjdG9yPENvb2tp
ZT4mIHJlc3VsdHMpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09w
ZW4oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVVJMIHJlcXVlc3RVcmxPYmooUGFy
c2VkVVJMU3RyaW5nLCByZXF1ZXN0VXJsKTsKKyAgICBTdHJpbmcgcmVxdWVzdEhvc3QocmVxdWVz
dFVybE9iai5ob3N0KCkuY29udmVydFRvQVNDSUlMb3dlcmNhc2UoKSk7CisgICAgU3RyaW5nIHJl
cXVlc3RQYXRoKHJlcXVlc3RVcmxPYmoucGF0aCgpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkp
OworCisgICAgaWYgKHJlcXVlc3RIb3N0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKHJlcXVlc3RQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmVxdWVzdFBhdGgg
PSAiLyI7CisKKyAgICBjb25zdCBTdHJpbmcgc3FsID0KKyAgICAgICAgIlNFTEVDVCBuYW1lLCB2
YWx1ZSwgZG9tYWluLCBwYXRoLCBleHBpcmVzLCBodHRwb25seSwgc2VjdXJlLCBzZXNzaW9uIEZS
T00gQ29va2llIFdIRVJFICJcCisgICAgICAgICIoTk9UICgoc2Vzc2lvbiA9IDApIEFORCAoZGF0
ZXRpbWUoZXhwaXJlcywgJ3VuaXhlcG9jaCcpIDwgZGF0ZXRpbWUoJ25vdycpKSkpICJcCisgICAg
ICAgICJBTkQgKGh0dHBvbmx5ID0gQ09BTEVTQ0UoTlVMTElGKD8sIC0xKSwgaHR0cG9ubHkpKSAi
XAorICAgICAgICAiQU5EIChzZWN1cmUgPSBDT0FMRVNDRShOVUxMSUYoPywgLTEpLCBzZWN1cmUp
KSAiXAorICAgICAgICAiQU5EIChzZXNzaW9uID0gQ09BTEVTQ0UoTlVMTElGKD8sIC0xKSwgc2Vz
c2lvbikpICJcCisgICAgICAgICJBTkQgKChkb21haW4gPSA/KSBPUiAoZG9tYWluIEdMT0IgPykp
IjsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxTUUxpdGVTdGF0ZW1lbnQ+IHBzdG10OworICAgIHBz
dG10ID0gc3RkOjptYWtlX3VuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGF0YWJhc2UsIHNxbCk7
CisgICAgcHN0bXQtPnByZXBhcmUoKTsKKyAgICBwc3RtdC0+YmluZEludCgxLCBodHRwT25seSA/
ICpodHRwT25seSA6IC0xKTsKKyAgICBwc3RtdC0+YmluZEludCgyLCBzZWN1cmUgPyAqc2VjdXJl
IDogLTEpOworICAgIHBzdG10LT5iaW5kSW50KDMsIHNlc3Npb24gPyAqc2Vzc2lvbiA6IC0xKTsK
KyAgICBwc3RtdC0+YmluZFRleHQoNCwgcmVxdWVzdEhvc3QpOworCisgICAgc2l6ZV90IHRvcExl
dmVsU2VwYXJhdG9yID0gcmVxdWVzdEhvc3QucmV2ZXJzZUZpbmQoJy4nKTsKKyAgICBpZiAoQ29v
a2llVXRpbDo6aXNJUEFkZHJlc3MocmVxdWVzdEhvc3QpIHx8IHRvcExldmVsU2VwYXJhdG9yID09
IG5vdEZvdW5kKQorICAgICAgICBwc3RtdC0+YmluZE51bGwoNSk7CisgICAgZWxzZSB7CisgICAg
ICAgIC8qIEZJWE1FOiBjdXJyZW50bHkgd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIGEgcHVibGlj
IHN1ZmZpYyBsaXN0IGluIHdpbmNhaXJvCisgICAgICAgICAgIHNvIHJpZ2h0IG5vdyB3ZSBnbG9i
IHVzaW5nIGp1c3QgdGhlIHNlY29uZCBsZXZlbCBkb21haW4gZS5nLiAqLkRPTUFJTi5jb20KKyAg
ICAgICAgICAgVGhpcyB3aWxsIHJldHVybiB0b28gbWFueSBjb29raWVzIHVuZGVyIG11bHRpbGV2
ZWwgdGxkcyBzdWNoIGFzICouY28udWsKKyAgICAgICAgICAgYnV0IHdlIGZpbHRlciB0aG9zZSBv
dXQgbGF0ZXIKKyAgICAgICAgKi8KKworICAgICAgICBzaXplX3Qgc2Vjb25kTGV2ZWxTZXBhcmF0
b3IgPSByZXF1ZXN0SG9zdC5yZXZlcnNlRmluZCgnLicsIHRvcExldmVsU2VwYXJhdG9yLTEpOwor
ICAgICAgICBTdHJpbmcgbG9jYWxEb21haW4gPSBzZWNvbmRMZXZlbFNlcGFyYXRvciA9PSBub3RG
b3VuZCA/IHJlcXVlc3RIb3N0IDogcmVxdWVzdEhvc3Quc3Vic3RyaW5nKHNlY29uZExldmVsU2Vw
YXJhdG9yKzEpOworCisgICAgICAgIEFTU0VSVCghbG9jYWxEb21haW4uaXNFbXB0eSgpKTsKKyAg
ICAgICAgcHN0bXQtPmJpbmRUZXh0KDUsIFN0cmluZygiKi4iKSArIGxvY2FsRG9tYWluKTsKKyAg
ICB9CisKKyAgICBpZiAoIXBzdG10KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXN1
bHRzLmNsZWFyKCk7CisKKyAgICB3aGlsZSAocHN0bXQtPnN0ZXAoKSA9PSBTUUxJVEVfUk9XKSB7
CisKKyAgICAgICAgaWYgKHJlc3VsdHMuc2l6ZSgpID4gTUFYX0NPT0tJRV9QRVJfRE9NQUlOKQor
ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgU3RyaW5nIGNvb2tpZU5hbWUgPSBwc3RtdC0+
Z2V0Q29sdW1uVGV4dCgwKTsKKyAgICAgICAgU3RyaW5nIGNvb2tpZVZhbHVlID0gcHN0bXQtPmdl
dENvbHVtblRleHQoMSk7CisgICAgICAgIFN0cmluZyBjb29raWVEb21haW4gPSBwc3RtdC0+Z2V0
Q29sdW1uVGV4dCgyKS5jb252ZXJ0VG9BU0NJSUxvd2VyY2FzZSgpOworICAgICAgICBTdHJpbmcg
Y29va2llUGF0aCA9IHBzdG10LT5nZXRDb2x1bW5UZXh0KDMpLmNvbnZlcnRUb0FTQ0lJTG93ZXJj
YXNlKCk7CisgICAgICAgIGRvdWJsZSBjb29raWVFeHBpcmVzID0gKGRvdWJsZSlwc3RtdC0+Z2V0
Q29sdW1uSW50NjQoNCkgKiAxMDAwOworICAgICAgICBib29sIGNvb2tpZUh0dHBPbmx5ID0gKHBz
dG10LT5nZXRDb2x1bW5JbnQoNSkgPT0gMSk7CisgICAgICAgIGJvb2wgY29va2llU2VjdXJlID0g
KHBzdG10LT5nZXRDb2x1bW5JbnQoNikgPT0gMSk7CisgICAgICAgIGJvb2wgY29va2llU2Vzc2lv
biA9IChwc3RtdC0+Z2V0Q29sdW1uSW50KDcpID09IDEpOworCisgICAgICAgIGlmICghQ29va2ll
VXRpbDo6ZG9tYWluTWF0Y2goY29va2llRG9tYWluLCByZXF1ZXN0SG9zdCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZj
NjI2NSNzZWN0aW9uLTUuMS40ICJQYXRocyBhbmQgUGF0aC1NYXRjaCIKKyAgICAgICAgYm9vbCBp
c1BhdGhNYXRjaGVkID0gY29va2llUGF0aCA9PSByZXF1ZXN0UGF0aAorICAgICAgICAgICAgfHwg
KHJlcXVlc3RQYXRoLnN0YXJ0c1dpdGgoY29va2llUGF0aCkgJiYgY29va2llUGF0aC5lbmRzV2l0
aCgnLycpKQorICAgICAgICAgICAgfHwgKHJlcXVlc3RQYXRoLnN0YXJ0c1dpdGgoY29va2llUGF0
aCkgJiYgKHJlcXVlc3RQYXRoLmNoYXJhY3RlckF0KGNvb2tpZVBhdGgubGVuZ3RoKCkpID09ICcv
JykpOworCisgICAgICAgIGlmICghaXNQYXRoTWF0Y2hlZCkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIENvb2tpZSByZXN1bHQoY29va2llTmFtZSwKKyAgICAgICAgICAgIGNvb2tp
ZVZhbHVlLAorICAgICAgICAgICAgY29va2llRG9tYWluLAorICAgICAgICAgICAgY29va2llUGF0
aCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBjb29raWVFeHBpcmVzLAorICAgICAgICAg
ICAgY29va2llSHR0cE9ubHksCisgICAgICAgICAgICBjb29raWVTZWN1cmUsCisgICAgICAgICAg
ICBjb29raWVTZXNzaW9uLAorICAgICAgICAgICAgU3RyaW5nKCksCisgICAgICAgICAgICBVUkwo
KSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50MTZfdD4oKSk7CisKKyAgICAgICAgcmVzdWx0cy5h
cHBlbmQocmVzdWx0KTsKKyAgICB9CisgICAgcHN0bXQtPmZpbmFsaXplKCk7CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6aGFzSHR0cE9ubHlDb29raWUoY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwYXRoKQor
eworICAgIFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRlbWVudChD
SEVDS19FWElTVFNfSFRUUE9OTFlfQ09PS0lFX1NRTCk7CisgICAgQVNTRVJUKHN0YXRlbWVudCk7
CisKKyAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIG5hbWUpOworICAgIHN0YXRlbWVudC0+Ymlu
ZFRleHQoMiwgZG9tYWluKTsKKyAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIHBhdGgpOworCisg
ICAgcmV0dXJuIHN0YXRlbWVudC0+c3RlcCgpID09IFNRTElURV9ST1c7Cit9CisKKworaW50IENv
b2tpZUphckRCOjpzZXRDb29raWUoY29uc3QgQ29va2llJiBjb29raWUpCit7CisgICAgaW50IHJl
dCA9IDA7CisgICAgaWYgKCFjb29raWUuc2Vzc2lvbiAmJiAoY29va2llLmV4cGlyZXMgPCA6OnRp
bWUoMCkpKQorICAgICAgICByZXQgPSBkZWxldGVDb29raWVJbnRlcm5hbChjb29raWUubmFtZSwg
Y29va2llLmRvbWFpbiwgY29va2llLnBhdGgpOworICAgIGVsc2UgeworICAgICAgICBTUUxpdGVT
dGF0ZW1lbnQqIHN0YXRlbWVudCA9IGdldFByZXBhcmVTdGF0ZW1lbnQoU0VUX0NPT0tJRV9TUUwp
OworICAgICAgICBBU1NFUlQoc3RhdGVtZW50KTsKKworICAgICAgICAvLyBGSVhNRTogV2Ugc2hv
dWxkIGhhdmUgc29tZSBldmljdGlvbiBwb2xpY3kgd2hlbiBhIGRvbWFpbiBnb2VzIG92ZXIgTUFY
X0NPT0tJRV9QRVJfRE9NQUlOCisKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29r
aWUubmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLnZhbHVlKTsK
KyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29raWUuZG9tYWluKTsKKyAgICAgICAg
c3RhdGVtZW50LT5iaW5kVGV4dCg0LCBjb29raWUucGF0aCk7CisgICAgICAgIHN0YXRlbWVudC0+
YmluZEludDY0KDUsIGNvb2tpZS5zZXNzaW9uID8gMCA6IChpbnQ2NF90KWNvb2tpZS5leHBpcmVz
KTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDYsIGNvb2tpZS52YWx1ZS5sZW5ndGgoKSk7
CisgICAgICAgIHN0YXRlbWVudC0+YmluZEludCg3LCBjb29raWUuc2Vzc2lvbiA/IDEgOiAwKTsK
KyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDgsIGNvb2tpZS5odHRwT25seSA/IDEgOiAwKTsK
KyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDksIGNvb2tpZS5zZWN1cmUgPyAxIDogMCk7CisK
KyAgICAgICAgcmV0ID0gc3RhdGVtZW50LT5zdGVwKCk7CisgICAgfQorICAgIEFTU0VSVChjaGVj
a1NRTGl0ZVJldHVybkNvZGUocmV0LCBTUUxJVEVfRE9ORSkpOworCisgICAgcmV0dXJuIHJldDsK
K30KKworaW50IENvb2tpZUphckRCOjpzZXRDb29raWUoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0
IFN0cmluZyYgY29va2llLCBib29sIGZyb21KYXZhU2NyaXB0KQoreworICAgIGlmICghaXNFbmFi
bGVkKCkgfHwgIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAg
IGlmICh1cmwuaXNFbXB0eSgpIHx8IGNvb2tpZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAt
MTsKKworICAgIFVSTCB1cmxPYmooUGFyc2VkVVJMU3RyaW5nLCB1cmwpOworICAgIFN0cmluZyBo
b3N0KHVybE9iai5ob3N0KCkpOworICAgIFN0cmluZyBwYXRoKHVybE9iai5wYXRoKCkpOworCisg
ICAgQ29va2llIGNvb2tpZU9iajsKKyAgICBpZiAoIUNvb2tpZVV0aWw6OnBhcnNlQ29va2llSGVh
ZGVyKGNvb2tpZSwgaG9zdCwgY29va2llT2JqKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAg
aWYgKGNvb2tpZU9iai5kb21haW4uaXNFbXB0eSgpKQorICAgICAgICBjb29raWVPYmouZG9tYWlu
ID0gU3RyaW5nKGhvc3QpOworCisgICAgaWYgKGNvb2tpZU9iai5wYXRoLmlzRW1wdHkoKSkKKyAg
ICAgICAgY29va2llT2JqLnBhdGggPSBTdHJpbmcocGF0aCk7CisKKyAgICAvLyBGSVhNRTogTmVl
ZCB0byBjaGVjayB0aGF0IGEgZG9tYWluIGRvZXNuJ3QgYSBzZXQgY29va2llIGZvciBhIHRsZCB3
aGVuIHdpbmNhaXJvIHN1cHBvcnRzIFBTTAorCisgICAgaWYgKGZyb21KYXZhU2NyaXB0ICYmIGNv
b2tpZU9iai5odHRwT25seSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGZyb21KYXZh
U2NyaXB0ICYmIGhhc0h0dHBPbmx5Q29va2llKGNvb2tpZU9iai5uYW1lLCBjb29raWVPYmouZG9t
YWluLCBjb29raWVPYmoucGF0aCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBz
ZXRDb29raWUoY29va2llT2JqKTsKK30KKworaW50IENvb2tpZUphckRCOjpkZWxldGVDb29raWUo
Y29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBpZiAoIWlzRW5h
YmxlZCgpIHx8ICFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAg
ICBTdHJpbmcgdXJsQ29waWVkID0gU3RyaW5nKHVybCk7CisgICAgaWYgKHVybENvcGllZC5zdGFy
dHNXaXRoKCcuJykpCisgICAgICAgIHVybENvcGllZC5yZW1vdmUoMCwgMSk7CisKKyAgICBVUkwg
dXJsT2JqKFBhcnNlZFVSTFN0cmluZywgdXJsQ29waWVkKTsKKyAgICBpZiAodXJsT2JqLmlzVmFs
aWQoKSkgeworICAgICAgICBTdHJpbmcgaG9zdFN0cih1cmxPYmouaG9zdCgpKTsKKyAgICAgICAg
U3RyaW5nIHBhdGhTdHIodXJsT2JqLnBhdGgoKSk7CisgICAgICAgIGludCByZXQgPSBkZWxldGVD
b29raWVJbnRlcm5hbChuYW1lLCBob3N0U3RyLCBwYXRoU3RyKTsKKyAgICAgICAgQVNTRVJUKGNo
ZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElURV9ET05FKSk7CisKKyAgICAgICAgcmV0dXJu
IHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBDb29raWVKYXJEQjo6ZGVs
ZXRlQ29va2llSW50ZXJuYWwoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRvbWFp
biwgY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50
OworICAgIGlmICghcGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3RhdGVtZW50ID0gZ2V0UHJl
cGFyZVN0YXRlbWVudChERUxFVEVfQ09PS0lFX0JZX05BTUVfRE9NQUlOX1BBVEhfU1FMKTsKKyAg
ICAgICAgQVNTRVJUKHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMSwg
bmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgZG9tYWluKTsKKyAgICAgICAg
c3RhdGVtZW50LT5iaW5kVGV4dCgzLCBwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0
ZW1lbnQgPSBnZXRQcmVwYXJlU3RhdGVtZW50KERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5f
U1FMKTsKKyAgICAgICAgQVNTRVJUKHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudC0+Ymlu
ZFRleHQoMSwgbmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgZG9tYWluKTsK
KyAgICB9CisKKyAgICByZXR1cm4gc3RhdGVtZW50LT5zdGVwKCk7Cit9CisKK2ludCBDb29raWVK
YXJEQjo6ZGVsZXRlQ29va2llcyhjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICAvLyBOT1QgSU1Q
TEVNRU5URUQKKyAgICAvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGFw
cGxpY2F0aW9uIGNhbGxzIFdLQ29va2llTWFuYWdlckRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZSgp
IGluIFdLQ29va2llTWFuYWdlci5oLgorICAgIHJldHVybiAwOworfQorCitpbnQgQ29va2llSmFy
REI6OmRlbGV0ZUFsbENvb2tpZXMoKQoreworICAgIGlmICghaXNFbmFibGVkKCkgfHwgIW1fZGF0
YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBleGVjdXRl
U2ltcGxlU3FsKERFTEVURV9BTExfQ09PS0lFX1NRTCk7Cit9CisKK3ZvaWQgQ29va2llSmFyREI6
OmNyZWF0ZVByZXBhcmVTdGF0ZW1lbnQoY29uc3QgY2hhciogc3FsKQoreworICAgIGF1dG8gc3Rh
dGVtZW50ID0gc3RkOjptYWtlX3VuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGF0YWJhc2UsIHNx
bCk7CisgICAgaW50IHJldCA9IHN0YXRlbWVudC0+cHJlcGFyZSgpOworICAgIEFTU0VSVChyZXQg
PT0gU1FMSVRFX09LKTsKKyAgICBtX3N0YXRlbWVudHMuYWRkKFN0cmluZyhzcWwpLCBXVEZNb3Zl
KHN0YXRlbWVudCkpOworfQorCitTUUxpdGVTdGF0ZW1lbnQqIENvb2tpZUphckRCOjpnZXRQcmVw
YXJlU3RhdGVtZW50KGNvbnN0IGNoYXIqIHNxbCkKK3sKKyAgICBjb25zdCBhdXRvJiBzdGF0ZW1l
bnQgPSBtX3N0YXRlbWVudHMuZ2V0KFN0cmluZyhzcWwpKTsKKyAgICBBU1NFUlQoc3RhdGVtZW50
KTsKKyAgICBzdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0dXJuIHN0YXRlbWVudDsKK30KKwor
aW50IENvb2tpZUphckRCOjpleGVjdXRlU2ltcGxlU3FsKGNvbnN0IGNoYXIqIHNxbCwgYm9vbCBp
Z25vcmVFcnJvcikKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2Us
IHNxbCk7CisgICAgaW50IHJldCA9IHN0YXRlbWVudC5wcmVwYXJlQW5kU3RlcCgpOworICAgIHN0
YXRlbWVudC5maW5hbGl6ZSgpOworCisgICAgQVNTRVJUKGNoZWNrU1FMaXRlUmV0dXJuQ29kZShy
ZXQsIFNRTElURV9PSykKKyAgICAgICAgfHwgY2hlY2tTUUxpdGVSZXR1cm5Db2RlKHJldCwgU1FM
SVRFX0RPTkUpCisgICAgICAgIHx8IGNoZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElURV9S
T1cpCisgICAgICAgIHx8IGlnbm9yZUVycm9yKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ29va2llSmFyREIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9Db29raWVKYXJEQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwLi41ZWMzMDliZjU2YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJh
Z21hIG9uY2UKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNl
LmgiCisjaW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAu
aD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvT3B0aW9uYWwu
aD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFz
aC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIENvb2tpZUphckRCIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDb29r
aWVKYXJEQik7CisKK3B1YmxpYzoKKyAgICBib29sIGlzRW5hYmxlZCgpOworICAgIHZvaWQgc2V0
RW5hYmxlZChib29sKTsKKworICAgIGJvb2wgc2VhcmNoQ29va2llcyhjb25zdCBTdHJpbmcmIHJl
cXVlc3RVcmwsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIGh0dHBPbmx5LCBjb25zdCBzdGQ6
Om9wdGlvbmFsPGJvb2w+JiBzZWN1cmUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIHNlc3Np
b24sIFZlY3RvcjxDb29raWU+JiByZXN1bHRzKTsKKyAgICBpbnQgc2V0Q29va2llKGNvbnN0IFN0
cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIGNvb2tpZSwgYm9vbCBmcm9tSmF2YVNjcmlwdCk7Cisg
ICAgaW50IHNldENvb2tpZShjb25zdCBDb29raWUmKTsKKworICAgIGludCBkZWxldGVDb29raWUo
Y29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgaW50IGRlbGV0ZUNv
b2tpZXMoY29uc3QgU3RyaW5nJiB1cmwpOworICAgIGludCBkZWxldGVBbGxDb29raWVzKCk7CisK
KyAgICBDb29raWVKYXJEQihjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCk7CisgICAgfkNvb2tp
ZUphckRCKCk7CisKK3ByaXZhdGU6CisKKyAgICBib29sIG1fY29va2llRW5hYmxlIHt0cnVlfTsK
KyAgICBTdHJpbmcgbV9kYXRhYmFzZVBhdGg7CisKKyAgICBib29sIG1fZGV0ZWN0ZWREYXRhYmFz
ZUNvcnJ1cHRpb24ge2ZhbHNlfTsKKworICAgIGJvb2wgaXNPbk1lbW9yeSgpIGNvbnN0IHsgcmV0
dXJuIChtX2RhdGFiYXNlUGF0aCA9PSAiOm9ubWVtb3J5OiIpOyB9OworCisgICAgYm9vbCBvcGVu
RGF0YWJhc2UoKTsKKyAgICB2b2lkIGNsb3NlRGF0YWJhc2UoKTsKKworICAgIGJvb2wgY2hlY2tT
UUxpdGVSZXR1cm5Db2RlKGludCBhY3R1YWwsIGludCBleHBlY3RlZCk7CisgICAgdm9pZCBmbGFn
RGF0YWJhc2VDb3JydXB0aW9uKCk7CisgICAgYm9vbCBjaGVja0RhdGFiYXNlQ29ycnVwdGlvbkFu
ZFJlbW92ZUlmTmVlZGVkKCk7CisgICAgU3RyaW5nIGdldENvcnJ1cHRpb25NYXJrZXJQYXRoKCkg
Y29uc3Q7CisKKyAgICBib29sIGNoZWNrRGF0YWJhc2VWYWxpZGl0eSgpOworICAgIHZvaWQgZGVs
ZXRlQWxsRGF0YWJhc2VGaWxlcygpOworCisgICAgdm9pZCBjcmVhdGVQcmVwYXJlU3RhdGVtZW50
KGNvbnN0IGNoYXIqIHNxbCk7CisgICAgU1FMaXRlU3RhdGVtZW50KiBnZXRQcmVwYXJlU3RhdGVt
ZW50KGNvbnN0IGNoYXIqIHNxbCk7CisgICAgaW50IGV4ZWN1dGVTaW1wbGVTcWwoY29uc3QgY2hh
ciogc3FsLCBib29sIGlnbm9yZUVycm9yID0gZmFsc2UpOworCisgICAgaW50IGRlbGV0ZUNvb2tp
ZUludGVybmFsKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0
IFN0cmluZyYgcGF0aCk7CisgICAgYm9vbCBoYXNIdHRwT25seUNvb2tpZShjb25zdCBTdHJpbmcm
IG5hbWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAg
U1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKKyAgICBIYXNoTWFwPFN0cmluZywgc3RkOjp1bmlx
dWVfcHRyPFNRTGl0ZVN0YXRlbWVudD4+IG1fc3RhdGVtZW50czsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Db29raWVVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u
OTU1ZTVkMTUwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ29va2llVXRpbC5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llVXRpbC5oIgorCisjaWYgVVNFKENVUkwpCisK
KyNpbmNsdWRlICJDb29raWUuaCIKKworI2luY2x1ZGUgPHd0Zi9EYXRlTWF0aC5oPgorI2luY2x1
ZGUgPHd0Zi9PcHRpb25hbC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisv
KiBUaGlzIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHdlIGFjY2VwdCBmb3IgYSBjb29raWUg
bGluZS4gUkZDIDIxMDkKKyAgIHNlY3Rpb24gNi4zIHNheXM6CisKKyAgICJhdCBsZWFzdCA0MDk2
IGJ5dGVzIHBlciBjb29raWUgKGFzIG1lYXN1cmVkIGJ5IHRoZSBzaXplIG9mIHRoZSBjaGFyYWN0
ZXJzCisgICB0aGF0IGNvbXByaXNlIHRoZSBjb29raWUgbm9uLXRlcm1pbmFsIGluIHRoZSBzeW50
YXggZGVzY3JpcHRpb24gb2YgdGhlCisgICBTZXQtQ29va2llIGhlYWRlcikiCisqLworCisjZGVm
aW5lIE1BWF9DT09LSUVfTElORSA1MDAwCisjZGVmaW5lIE1BWF9DT09LSUVfTElORV9UWFQgIjQ5
OTkiCisKKyNkZWZpbmUgTUFYX05BTUUgMTAyNAorI2RlZmluZSBNQVhfTkFNRV9UWFQgIjEwMjMi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIENvb2tpZVV0aWwgeworCitib29s
IGlzSVBBZGRyZXNzKGNvbnN0IFN0cmluZyYgaG9zdG5hbWUpCit7CisgICAgLy8gQXNzdW1pbmcg
dGhhdCBob3N0cyBlbmRpbmcgaW4gYSBkaWdpdCBhcmUgSVAgQWRkcmVzc2VzCisgICAgcmV0dXJu
ICFob3N0bmFtZS5pc0VtcHR5KCkgJiYgaXNBU0NJSURpZ2l0KGhvc3RuYW1lW2hvc3RuYW1lLmxl
bmd0aCgpIC0gMV0pOworfQorCitib29sIGRvbWFpbk1hdGNoKGNvbnN0IFN0cmluZyYgY29va2ll
RG9tYWluLCBjb25zdCBTdHJpbmcmIGhvc3QpCit7CisgICAgc2l6ZV90IGluZGV4ID0gaG9zdC5m
aW5kKGNvb2tpZURvbWFpbik7CisKKyAgICBib29sIHRhaWxNYXRjaCA9IChpbmRleCAhPSBXVEY6
Om5vdEZvdW5kICYmIGluZGV4ICsgY29va2llRG9tYWluLmxlbmd0aCgpID09IGhvc3QubGVuZ3Ro
KCkpOworCisgICAgLy8gQ2hlY2sgaWYgaG9zdCBlcXVhbHMgY29va2llIGRvbWFpbi4KKyAgICBp
ZiAodGFpbE1hdGNoICYmICFpbmRleCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBD
aGVjayBpZiBob3N0IGlzIGEgc3ViZG9tYWluIG9mIHRoZSBkb21haW4gaW4gdGhlIGNvb2tpZS4K
KyAgICAvLyBDdXJsIHVzZXMgYSAnLicgaW4gZnJvbnQgb2YgZG9tYWlucyB0byBpbmRpY2F0ZSBp
dCdzIHZhbGlkIG9uIHN1YmRvbWFpbnMuCisgICAgaWYgKHRhaWxNYXRjaCAmJiBpbmRleCA+IDAg
JiYgaG9zdFtpbmRleF0gPT0gJy4nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENo
ZWNrIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgaG9zdCBlcXVhbHMgdGhlIGNvb2tpZSBkb21haW4s
IGV4Y2VwdCBmb3IgYSBsZWFkaW5nICcuJyBpbiB0aGUgY29va2llIGRvbWFpbi4KKyAgICAvLyBF
LmcuIGNvb2tpZSBkb21haW4gaXMgLmFwcGxlLmNvbSBhbmQgaG9zdCBpcyBhcHBsZS5jb20uCisg
ICAgaWYgKGNvb2tpZURvbWFpblswXSA9PSAnLicgJiYgY29va2llRG9tYWluLmZpbmQoaG9zdCkg
PT0gMSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0
YXRpYyBzdGQ6Om9wdGlvbmFsPGRvdWJsZT4gcGFyc2VFeHBpcmVzKGNvbnN0IGNoYXIqIGV4cGly
ZXMpCit7CisgICAgZG91YmxlIHRtcCA9IFdURjo6cGFyc2VEYXRlRnJvbU51bGxUZXJtaW5hdGVk
Q2hhcmFjdGVycyhleHBpcmVzKTsKKyAgICBpZiAoaXNuYW4odG1wKSkKKyAgICAgICAgcmV0dXJu
IHsgfTsKKworICAgIHJldHVybiBzdGQ6Om9wdGlvbmFsPGRvdWJsZT4ge3RtcCAvIFdURjo6bXNQ
ZXJTZWNvbmR9OworfQorCitzdGF0aWMgdm9pZCBwYXJzZUNvb2tpZUF0dHJpYnV0ZXMoY29uc3Qg
U3RyaW5nJiBhdHRyaWJ1dGUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBib29sJiBoYXNNYXhBZ2Us
IENvb2tpZSYgcmVzdWx0KQoreworICAgIHNpemVfdCBhc3NpZ25tZW50UG9zaXRpb24gPSBhdHRy
aWJ1dGUuZmluZCgnPScpOworCisgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7CisgICAgU3RyaW5n
IGF0dHJpYnV0ZVZhbHVlOworCisgICAgaWYgKGFzc2lnbm1lbnRQb3NpdGlvbiAhPSBub3RGb3Vu
ZCkgeworICAgICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLnN1YnN0cmluZygwLCBhc3Np
Z25tZW50UG9zaXRpb24pLnN0cmlwV2hpdGVTcGFjZSgpOworICAgICAgICBhdHRyaWJ1dGVWYWx1
ZSA9IGF0dHJpYnV0ZS5zdWJzdHJpbmcoYXNzaWdubWVudFBvc2l0aW9uICsgMSkuc3RyaXBXaGl0
ZVNwYWNlKCk7CisgICAgfSBlbHNlCisgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUu
c3RyaXBXaGl0ZVNwYWNlKCk7CisKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShhdHRy
aWJ1dGVOYW1lLCAiaHR0cG9ubHkiKSkKKyAgICAgICAgcmVzdWx0Lmh0dHBPbmx5ID0gdHJ1ZTsK
KyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJzZWN1
cmUiKSkKKyAgICAgICAgcmVzdWx0LnNlY3VyZSA9IHRydWU7CisgICAgZWxzZSBpZiAoZXF1YWxJ
Z25vcmluZ0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAiZG9tYWluIikpIHsKKyAgICAgICAgaWYg
KGF0dHJpYnV0ZVZhbHVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICAvLyBFbmZvcmNlIGEgZG90IGNoYXJhY3RlciBwcmVmaXggdG8gaG9zdG5hbWVzIHdoaWNoIGFy
ZSBub3QgaXAgYWRkcmVzc2VzIGFuZCBub3Qgc2luZ2xlIHZhbHVlIGhvc3RuYW1lcyBzdWNoIGFz
IGxvY2FsaG9zdAorICAgICAgICBpZiAoIWlzSVBBZGRyZXNzKGF0dHJpYnV0ZVZhbHVlKSAmJiAh
YXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aCgnLicpICYmIGF0dHJpYnV0ZVZhbHVlLmZpbmQoJy4n
KSAhPSBub3RGb3VuZCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gIi4iICsgYXR0cmli
dXRlVmFsdWU7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBob3N0IGNhbiBzZXQgYSBjb29r
aWUgZm9yIHRoZSBkb21haW4KKyAgICAgICAgLy8gRklYTUU6IGZpcmVmb3ggYW5kIGNocm9tZSBi
b3RoIGlnbm9yZSBjb29raWVzIHdpdGggbm8gdmFsaWQgZG9tYWluIHNldAorICAgICAgICAvLyB3
ZSBjdXJyZW50bHkgaWdub3JlIHRoZSBpbnZhbGlkIGRvbWFpbnMgYW5kIGRlZmF1bHQgdG8gdGhl
IGhvc3RuYW1lIGFzIHRoZSBkb21haW4KKyAgICAgICAgaWYgKGRvbWFpbk1hdGNoKGF0dHJpYnV0
ZVZhbHVlLCBkb21haW4pKQorICAgICAgICAgICAgcmVzdWx0LmRvbWFpbiA9IGF0dHJpYnV0ZVZh
bHVlOworCisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5h
bWUsICJtYXgtYWdlIikpIHsKKyAgICAgICAgYm9vbCBvazsKKyAgICAgICAgdGltZV90IGV4cGly
eVRpbWUgPSB0aW1lKDApICsgYXR0cmlidXRlVmFsdWUudG9JbnQ2NCgmb2spOworICAgICAgICBp
ZiAob2spIHsKKyAgICAgICAgICAgIHJlc3VsdC5leHBpcmVzID0gKGRvdWJsZSlleHBpcnlUaW1l
OworICAgICAgICAgICAgcmVzdWx0LnNlc3Npb24gPSBmYWxzZTsKKworICAgICAgICAgICAgLy8g
SWYgdGhlcmUgaXMgYSBtYXgtYWdlIGF0dHJpYnV0ZSBhcyB3ZWxsIGFzIGFuIGV4cGlyZXMgYXR0
cmlidXRlCisgICAgICAgICAgICAvLyB0aGUgcmlnaHRtb3N0IG1heC1hZ2UgYXR0cmlidXRlIHRh
a2VzIHByZWNlZGVuY2UuCisgICAgICAgICAgICBoYXNNYXhBZ2UgPSB0cnVlOworICAgICAgICB9
CisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJl
eHBpcmVzIikgJiYgIWhhc01heEFnZSkgeworICAgICAgICBpZiAoYXV0byBleHBpcnlUaW1lID0g
cGFyc2VFeHBpcmVzKGF0dHJpYnV0ZVZhbHVlLnV0ZjgoKS5kYXRhKCkpKSB7CisgICAgICAgICAg
ICByZXN1bHQuZXhwaXJlcyA9IGV4cGlyeVRpbWUudmFsdWUoKTsKKyAgICAgICAgICAgIHJlc3Vs
dC5zZXNzaW9uID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdBU0NJSUNhc2UoYXR0cmlidXRlTmFtZSwgInBhdGgiKSkgeworICAgICAgICBpZiAoIWF0dHJp
YnV0ZVZhbHVlLmlzRW1wdHkoKSAmJiBhdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKCcvJykpCisg
ICAgICAgICAgICByZXN1bHQucGF0aCA9IGF0dHJpYnV0ZVZhbHVlOworICAgIH0KK30KKworYm9v
bCBwYXJzZUNvb2tpZUhlYWRlcihjb25zdCBTdHJpbmcmIGNvb2tpZUxpbmUsIGNvbnN0IFN0cmlu
ZyYgZG9tYWluLCBDb29raWUmIHJlc3VsdCkKK3sKKyAgICBpZiAoY29va2llTGluZS5sZW5ndGgo
KSA+PSBNQVhfQ09PS0lFX0xJTkUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRo
aXMgQWxnb3JpdGhtIGlzIGJhc2VkIG9uIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgNjI2
NSA1LjIgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIvCisK
KyAgICBzaXplX3Qgc2VwYXJhdG9yUG9zaXRpb24gPSBjb29raWVMaW5lLmZpbmQoJzsnKTsKKwor
ICAgIFN0cmluZyBjb29raWVQYWlyID0gc2VwYXJhdG9yUG9zaXRpb24gPT0gbm90Rm91bmQgPyBj
b29raWVMaW5lIDogY29va2llTGluZS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yUG9zaXRpb24pOwor
CisgICAgU3RyaW5nIGNvb2tpZU5hbWU7CisgICAgU3RyaW5nIGNvb2tpZVZhbHVlOworICAgIHNp
emVfdCBhc3NpZ25tZW50UG9zaXRpb24gPSBjb29raWVMaW5lLmZpbmQoJz0nKTsKKworICAgIC8v
IFJGQzYyNjUgc2F5cyB0byBpZ25vcmUgY29va2llcyBwYWlycyB3aXRoIGVtcHR5IG5hbWVzIG9y
IG5vIGFzc2lnbm1lbnQgY2hhcmFjdGVyCisgICAgLy8gYnV0IGJyb3dzZXJzIHNlZW0gdG8gdHJl
YXQgdGhpcyB0eXBlIG9mIGNvb2tpZSBzdHJpbmcgYXMgdGhlIGNvb2tpZSB2YWx1ZQorICAgIGlm
IChhc3NpZ25tZW50UG9zaXRpb24gPT0gbm90Rm91bmQpCisgICAgICAgIGNvb2tpZVZhbHVlID0g
Y29va2llUGFpcjsKKyAgICBlbHNlIHsKKyAgICAgICAgY29va2llTmFtZSA9IGNvb2tpZVBhaXIu
c3Vic3RyaW5nKDAsIGFzc2lnbm1lbnRQb3NpdGlvbik7CisgICAgICAgIGNvb2tpZVZhbHVlID0g
Y29va2llUGFpci5zdWJzdHJpbmcoYXNzaWdubWVudFBvc2l0aW9uICsgMSk7CisgICAgfQorCisg
ICAgcmVzdWx0Lm5hbWUgPSBjb29raWVOYW1lLnN0cmlwV2hpdGVTcGFjZSgpOworICAgIHJlc3Vs
dC52YWx1ZSA9IGNvb2tpZVZhbHVlLnN0cmlwV2hpdGVTcGFjZSgpOworCisgICAgYm9vbCBoYXNN
YXhBZ2UgPSBmYWxzZTsKKyAgICByZXN1bHQuc2Vzc2lvbiA9IHRydWU7CisKKyAgICBWZWN0b3I8
U3RyaW5nPiBjb29raWVBdHRyaWJ1dGVzOworICAgIGNvb2tpZUxpbmUuc3BsaXQoJzsnLCB0cnVl
LCBjb29raWVBdHRyaWJ1dGVzKTsKKyAgICBmb3IgKGF1dG8gYXR0cmlidXRlIDogY29va2llQXR0
cmlidXRlcykKKyAgICAgICAgcGFyc2VDb29raWVBdHRyaWJ1dGVzKGF0dHJpYnV0ZSwgZG9tYWlu
LCBoYXNNYXhBZ2UsIHJlc3VsdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1l
c3BhY2UgQ29va2llVXRpbAorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwu
aCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjI2N2ZkYzI5YTJkCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0
aWwuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNvbnkgSW50
ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx3dGYv
Rm9yd2FyZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBDb29raWU7CisKK25h
bWVzcGFjZSBDb29raWVVdGlsIHsKKworYm9vbCBwYXJzZUNvb2tpZUhlYWRlcihjb25zdCBTdHJp
bmcmIGNvb2tpZUxpbmUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBDb29raWUmIHJlc3VsdCk7CisK
K2Jvb2wgaXNJUEFkZHJlc3MoY29uc3QgU3RyaW5nJiBob3N0bmFtZSk7CisKK2Jvb2wgZG9tYWlu
TWF0Y2goY29uc3QgU3RyaW5nJiBjb29raWVEb21haW4sIGNvbnN0IFN0cmluZyYgaG9zdCk7CisK
K30gLy8gbmFtZXNwYWNlIENvb2tpZVV0aWwKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5j
cHAKaW5kZXggZDU0YjEyYzkyYzguLmE5ZDY1ZTc3ODg5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKQEAgLTQyLDM4ICs0
Miw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RhdGljIENTdHJpbmcgY29va2llSmFy
UGF0aCgpCi17Ci0gICAgY2hhciogY29va2llSmFyUGF0aCA9IGdldGVudigiQ1VSTF9DT09LSUVf
SkFSX1BBVEgiKTsKLSAgICBpZiAoY29va2llSmFyUGF0aCkKLSAgICAgICAgcmV0dXJuIGNvb2tp
ZUphclBhdGg7Ci0KLSNpZiBPUyhXSU5ET1dTKQotICAgIGNoYXIgZXhlY3V0YWJsZVBhdGhbTUFY
X1BBVEhdOwotICAgIGNoYXIgYXBwRGF0YURpcmVjdG9yeVtNQVhfUEFUSF07Ci0gICAgY2hhciBj
b29raWVKYXJGdWxsUGF0aFtNQVhfUEFUSF07Ci0gICAgY2hhciBjb29raWVKYXJEaXJlY3Rvcnlb
TUFYX1BBVEhdOwotCi0gICAgaWYgKEZBSUxFRCg6OlNIR2V0Rm9sZGVyUGF0aEEoMCwgQ1NJRExf
TE9DQUxfQVBQREFUQSB8IENTSURMX0ZMQUdfQ1JFQVRFLCAwLCAwLCBhcHBEYXRhRGlyZWN0b3J5
KSkKLSAgICAgICAgfHwgRkFJTEVEKDo6R2V0TW9kdWxlRmlsZU5hbWVBKDAsIGV4ZWN1dGFibGVQ
YXRoLCBNQVhfUEFUSCkpKQotICAgICAgICByZXR1cm4gImNvb2tpZXMuZGF0IjsKLQotICAgIDo6
UGF0aFJlbW92ZUV4dGVuc2lvbkEoZXhlY3V0YWJsZVBhdGgpOwotICAgIExQU1RSIGV4ZWN1dGFi
bGVOYW1lID0gOjpQYXRoRmluZEZpbGVOYW1lQShleGVjdXRhYmxlUGF0aCk7Ci0gICAgc3ByaW50
Zl9zKGNvb2tpZUphckRpcmVjdG9yeSwgTUFYX1BBVEgsICIlcy8lcyIsIGFwcERhdGFEaXJlY3Rv
cnksIGV4ZWN1dGFibGVOYW1lKTsKLSAgICBzcHJpbnRmX3MoY29va2llSmFyRnVsbFBhdGgsIE1B
WF9QQVRILCAiJXMvY29va2llcy5kYXQiLCBjb29raWVKYXJEaXJlY3RvcnkpOwotCi0gICAgaWYg
KDo6U0hDcmVhdGVEaXJlY3RvcnlFeEEoMCwgY29va2llSmFyRGlyZWN0b3J5LCAwKSAhPSBFUlJP
Ul9TVUNDRVNTCi0gICAgICAgICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfRklMRV9FWElT
VFMKLSAgICAgICAgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9BTFJFQURZX0VYSVNUUykK
LSAgICAgICAgcmV0dXJuICJjb29raWVzLmRhdCI7Ci0KLSAgICByZXR1cm4gY29va2llSmFyRnVs
bFBhdGg7Ci0jZWxzZQotICAgIHJldHVybiAiY29va2llcy5kYXQiOwotI2VuZGlmCi19Ci0KIC8v
IEN1cmxDb250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ3VybENvbnRleHQmIEN1cmxDb250ZXh0OjpzaW5n
bGV0b24oKQpAQCAtODMsMTAgKzUxLDggQEAgQ3VybENvbnRleHQmIEN1cmxDb250ZXh0OjpzaW5n
bGV0b24oKQogfQogCiBDdXJsQ29udGV4dDo6Q3VybENvbnRleHQoKQotOiBtX2Nvb2tpZUphckZp
bGVOYW1lIHsgY29va2llSmFyUGF0aCgpIH0KLSwgbV9jb29raWVKYXIgeyBzdGQ6Om1ha2VfdW5p
cXVlPENvb2tpZUphckN1cmxGaWxlU3lzdGVtPigpIH0KIHsKLSAgICBpbml0Q29va2llU2Vzc2lv
bigpOworICAgIGluaXRTaGFyZUhhbmRsZSgpOwogCiAjaWZuZGVmIE5ERUJVRwogICAgIG1fdmVy
Ym9zZSA9IGdldGVudigiREVCVUdfQ1VSTCIpOwpAQCAtMTA1LDkgKzcxLDIxIEBAIEN1cmxDb250
ZXh0Ojp+Q3VybENvbnRleHQoKQogI2VuZGlmCiB9CiAKK3ZvaWQgQ3VybENvbnRleHQ6OmluaXRT
aGFyZUhhbmRsZSgpCit7CisgICAgQ1VSTCogY3VybCA9IGN1cmxfZWFzeV9pbml0KCk7CisKKyAg
ICBpZiAoIWN1cmwpCisgICAgICAgIHJldHVybjsKKworICAgIGN1cmxfZWFzeV9zZXRvcHQoY3Vy
bCwgQ1VSTE9QVF9TSEFSRSwgbV9zaGFyZUhhbmRsZS5oYW5kbGUoKSk7CisKKyAgICBjdXJsX2Vh
c3lfY2xlYW51cChjdXJsKTsKK30KKwogLy8gQ29va2llID09PT09PT09PT09PT09PT09PT09PT09
CiAKLXZvaWQgQ3VybENvbnRleHQ6OmluaXRDb29raWVTZXNzaW9uKCkKK3ZvaWQgQ3VybENvbnRl
eHQ6OmluaXRDb29raWVTZXNzaW9uKGNvbnN0IFN0cmluZyYgY29va2llSmFyUGF0aCkKIHsKICAg
ICAvLyBDdXJsIHNhdmVzIGJvdGggcGVyc2lzdGVudCBjb29raWVzLCBhbmQgc2Vzc2lvbiBjb29r
aWVzIHRvIHRoZSBjb29raWUgZmlsZS4KICAgICAvLyBUaGUgc2Vzc2lvbiBjb29raWVzIHNob3Vs
ZCBiZSBkZWxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ldyBzZXNzaW9uLgpAQCAtMTE3LDExICs5
NSw5IEBAIHZvaWQgQ3VybENvbnRleHQ6OmluaXRDb29raWVTZXNzaW9uKCkKICAgICBpZiAoIWN1
cmwpCiAgICAgICAgIHJldHVybjsKIAotICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9Q
VF9TSEFSRSwgbV9zaGFyZUhhbmRsZS5oYW5kbGUoKSk7Ci0KLSAgICBpZiAoIW1fY29va2llSmFy
RmlsZU5hbWUuaXNOdWxsKCkpIHsKLSAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJM
T1BUX0NPT0tJRUZJTEUsIG1fY29va2llSmFyRmlsZU5hbWUuZGF0YSgpKTsKLSAgICAgICAgY3Vy
bF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUpBUiwgbV9jb29raWVKYXJGaWxlTmFt
ZS5kYXRhKCkpOworICAgIGlmICghY29va2llSmFyUGF0aC5pc051bGwoKSkgeworICAgICAgICBj
dXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFRklMRSwgY29va2llSmFyUGF0aC51
dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NP
T0tJRUpBUiwgY29va2llSmFyUGF0aC51dGY4KCkuZGF0YSgpKTsKICAgICB9CiAKICAgICBjdXJs
X2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFU0VTU0lPTiwgMSk7CkBAIC00ODMsMTMg
KzQ1OSw2IEBAIHZvaWQgQ3VybEhhbmRsZTo6c2V0U3NsS2V5UGFzc3dvcmQoY29uc3QgY2hhciog
cGFzc3dvcmQpCiAgICAgY3VybF9lYXN5X3NldG9wdChtX2hhbmRsZSwgQ1VSTE9QVF9LRVlQQVNT
V0QsIHBhc3N3b3JkKTsKIH0KIAotdm9pZCBDdXJsSGFuZGxlOjplbmFibGVDb29raWVKYXJJZkV4
aXN0cygpCi17Ci0gICAgY29uc3QgY2hhciogY29va2llSmFyID0gQ3VybENvbnRleHQ6OnNpbmds
ZXRvbigpLmdldENvb2tpZUphckZpbGVOYW1lKCk7Ci0gICAgaWYgKGNvb2tpZUphcikKLSAgICAg
ICAgY3VybF9lYXN5X3NldG9wdChtX2hhbmRsZSwgQ1VSTE9QVF9DT09LSUVKQVIsIGNvb2tpZUph
cik7Ci19Ci0KIHZvaWQgQ3VybEhhbmRsZTo6c2V0Q29va2llTGlzdChjb25zdCBjaGFyKiBjb29r
aWVMaXN0KQogewogICAgIGlmICghY29va2llTGlzdCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKaW5kZXggNDg4MDg1ZWIyZDcuLjJl
YTY4M2EzNmUwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ3VybENvbnRleHQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ3VybENvbnRleHQuaApAQCAtMjYsNyArMjYsNiBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2lu
Y2x1ZGUgIkNvb2tpZUphckN1cmwuaCIKICNpbmNsdWRlICJDdXJsU1NMSGFuZGxlLmgiCiAjaW5j
bHVkZSAiVVJMLmgiCiAKQEAgLTExMCwxMCArMTA5LDcgQEAgcHVibGljOgogCiAgICAgY29uc3Qg
Q3VybFNoYXJlSGFuZGxlJiBzaGFyZUhhbmRsZSgpIHsgcmV0dXJuIG1fc2hhcmVIYW5kbGU7IH0K
IAotICAgIC8vIENvb2tpZQotICAgIGNvbnN0IGNoYXIqIGdldENvb2tpZUphckZpbGVOYW1lKCkg
Y29uc3QgeyByZXR1cm4gbV9jb29raWVKYXJGaWxlTmFtZS5kYXRhKCk7IH0KLSAgICB2b2lkIHNl
dENvb2tpZUphckZpbGVOYW1lKGNvbnN0IGNoYXIqIGNvb2tpZUphckZpbGVOYW1lKSB7IG1fY29v
a2llSmFyRmlsZU5hbWUgPSBDU3RyaW5nKGNvb2tpZUphckZpbGVOYW1lKTsgfQotICAgIENvb2tp
ZUphckN1cmwmIGNvb2tpZUphcigpIHsgcmV0dXJuICptX2Nvb2tpZUphcjsgfQorICAgIHN0YXRp
YyB2b2lkIGluaXRDb29raWVTZXNzaW9uKGNvbnN0IFN0cmluZyYgY29va2llSmFyUGF0aCk7CiAK
ICAgICAvLyBQcm94eQogICAgIGNvbnN0IFByb3h5SW5mbyYgcHJveHlJbmZvKCkgY29uc3QgeyBy
ZXR1cm4gbV9wcm94eTsgfQpAQCAtMTMzLDEzICsxMjksMTEgQEAgcHVibGljOgogCiBwcml2YXRl
OgogICAgIFByb3h5SW5mbyBtX3Byb3h5OwotICAgIENTdHJpbmcgbV9jb29raWVKYXJGaWxlTmFt
ZTsKICAgICBDdXJsU2hhcmVIYW5kbGUgbV9zaGFyZUhhbmRsZTsKLSAgICBzdGQ6OnVuaXF1ZV9w
dHI8Q29va2llSmFyQ3VybD4gbV9jb29raWVKYXI7CiAgICAgQ3VybFNTTEhhbmRsZSBtX3NzbEhh
bmRsZTsKIAogICAgIEN1cmxDb250ZXh0KCk7Ci0gICAgdm9pZCBpbml0Q29va2llU2Vzc2lvbigp
OworICAgIHZvaWQgaW5pdFNoYXJlSGFuZGxlKCk7CiAKICNpZm5kZWYgTkRFQlVHCiAgICAgRklM
RSogbV9sb2dGaWxlIHsgbnVsbHB0ciB9OwpAQCAtMjU2LDcgKzI1MCw2IEBAIHB1YmxpYzoKICAg
ICB2b2lkIHNldFNzbENlcnRUeXBlKGNvbnN0IGNoYXIqKTsKICAgICB2b2lkIHNldFNzbEtleVBh
c3N3b3JkKGNvbnN0IGNoYXIqKTsKIAotICAgIHZvaWQgZW5hYmxlQ29va2llSmFySWZFeGlzdHMo
KTsKICAgICB2b2lkIHNldENvb2tpZUxpc3QoY29uc3QgY2hhciopOwogICAgIHZvaWQgZmV0Y2hD
b29raWVMaXN0KEN1cmxTTGlzdCAmY29va2llcykgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVxdWVzdC5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwCmluZGV4IGUwYTgw
ZjQ1NWIwLi5mM2ViZDY4ZjcxZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxSZXF1ZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwCkBAIC0yMDAsNyArMjAwLDYgQEAgQ1VSTCog
Q3VybFJlcXVlc3Q6OnNldHVwVHJhbnNmZXIoKQogICAgIG1fY3VybEhhbmRsZS0+c2V0VGltZW91
dCh0aW1lb3V0TWlsbGlzZWNvbmRzKTsKIAogICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlUHJveHlJ
ZkV4aXN0cygpOwotICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlQ29va2llSmFySWZFeGlzdHMoKTsK
IAogICAgIG1fY3VybEhhbmRsZS0+c2V0U3NsVmVyaWZ5UGVlcihDdXJsSGFuZGxlOjpWZXJpZnlQ
ZWVyOjpFbmFibGUpOwogICAgIG1fY3VybEhhbmRsZS0+c2V0U3NsVmVyaWZ5SG9zdChDdXJsSGFu
ZGxlOjpWZXJpZnlIb3N0OjpTdHJpY3ROYW1lQ2hlY2spOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lvbkN1cmwuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vz
c2lvbkN1cmwuY3BwCmluZGV4IDE3NmFlOWYyNzZmLi42YzlmNTJjOWE2NiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lv
bkN1cmwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3
b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcApAQCAtMjksNiArMjksMTAgQEAKICNpZiBVU0UoQ1VS
TCkKIAogI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckN1cmxEYXRhYmFz
ZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRCLmgiCisjaW5jbHVkZSAiQ3VybENvbnRleHQuaCIK
KyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiTmV0d29ya2luZ0NvbnRleHQuaCIK
ICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgogCkBAIC0zNywxMCArNDEsMzggQEAKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCitzdGF0aWMgU3RyaW5nIGRlZmF1bHRDb29raWVKYXJQYXRoKCkK
K3sKKyNpZiBFTkFCTEUoQ1VSTF9DT09LSUVfU1RPUkFHRSkKKyAgICBzdGF0aWMgY29uc3QgY2hh
ciogZGVmYXVsdEZpbGVOYW1lID0gImNvb2tpZXMuZGF0IjsKKyNlbHNlCisgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGRlZmF1bHRGaWxlTmFtZSA9ICJjb29raWUuamFyLmRiIjsKKyNlbmRpZgorICAg
IGNoYXIqIGNvb2tpZUphclBhdGggPSBnZXRlbnYoIkNVUkxfQ09PS0lFX0pBUl9QQVRIIik7Cisg
ICAgaWYgKGNvb2tpZUphclBhdGgpCisgICAgICAgIHJldHVybiBjb29raWVKYXJQYXRoOworCisg
ICAgU3RyaW5nIGNvb2tpZUphckRpcmVjdG9yeSA9IEZpbGVTeXN0ZW06OmxvY2FsVXNlclNwZWNp
ZmljU3RvcmFnZURpcmVjdG9yeSgpOworCisgICAgaWYgKCFGaWxlU3lzdGVtOjptYWtlQWxsRGly
ZWN0b3JpZXMoY29va2llSmFyRGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWxl
TmFtZTsKKworICAgIHJldHVybiBGaWxlU3lzdGVtOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQo
Y29va2llSmFyRGlyZWN0b3J5LCBkZWZhdWx0RmlsZU5hbWUpOworfQorCiBOZXR3b3JrU3RvcmFn
ZVNlc3Npb246Ok5ldHdvcmtTdG9yYWdlU2Vzc2lvbihQQUw6OlNlc3Npb25JRCBzZXNzaW9uSUQs
IE5ldHdvcmtpbmdDb250ZXh0KiBjb250ZXh0KQogICAgIDogbV9zZXNzaW9uSUQoc2Vzc2lvbklE
KQogICAgICwgbV9jb250ZXh0KGNvbnRleHQpCisjaWYgRU5BQkxFKENVUkxfQ09PS0lFX1NUT1JB
R0UpCisgICAgLCBtX2Nvb2tpZVN0b3JhZ2Uoc3RkOjptYWtlX3VuaXF1ZTxDb29raWVKYXJDdXJs
RmlsZVN5c3RlbT4oKSkKKyNlbHNlCisgICAgLCBtX2Nvb2tpZURhdGFiYXNlKHN0ZDo6bWFrZV91
bmlxdWU8Q29va2llSmFyREI+KGRlZmF1bHRDb29raWVKYXJQYXRoKCkpKQorICAgICwgbV9jb29r
aWVTdG9yYWdlKHN0ZDo6bWFrZV91bmlxdWU8Q29va2llSmFyQ3VybERhdGFiYXNlPigpKQorI2Vu
ZGlmCiB7CisjaWYgRU5BQkxFKENVUkxfQ09PS0lFX1NUT1JBR0UpCisgICAgQ3VybENvbnRleHQ6
OmluaXRDb29raWVTZXNzaW9uKGRlZmF1bHRDb29raWVKYXJQYXRoKCkpOworI2VuZGlmCiB9CiAK
IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6fk5ldHdvcmtTdG9yYWdlU2Vzc2lvbigpCkBAIC03Niwx
MiArMTA4LDEyIEBAIHZvaWQgTmV0d29ya1N0b3JhZ2VTZXNzaW9uOjpzd2l0Y2hUb05ld1Rlc3Rp
bmdTZXNzaW9uKCkKICAgICAvLyBGSVhNRTogSW1wbGVtZW50IGZvciBXZWJLaXQgdG8gdXNlLgog
fQogCi12b2lkIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0Q29va2llcyhjb25zdCBWZWN0b3I8
Q29va2llPiYsIGNvbnN0IFVSTCYsIGNvbnN0IFVSTCYpCit2b2lkIE5ldHdvcmtTdG9yYWdlU2Vz
c2lvbjo6c2V0Q29va2llcyhjb25zdCBWZWN0b3I8Q29va2llPiYgY29va2llcywgY29uc3QgVVJM
JiwgY29uc3QgVVJMJikKIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50IGZvciBXZWJLaXQgdG8g
dXNlLgogfQogCi12b2lkIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0Q29va2llKGNvbnN0IENv
b2tpZSYpCit2b2lkIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0Q29va2llKGNvbnN0IENvb2tp
ZSYgY29va2llKQogewogICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgZm9yIFdlYktpdCB0byB1c2Uu
CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVz
b3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcAppbmRleCA1MTQ5MzE2MTRj
ZC4uYjM4YzkwMGM1ZGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcApA
QCAtMzMsMTAgKzMzLDEyIEBACiAjaWYgVVNFKENVUkwpCiAKICNpbmNsdWRlICJBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckN1cmwuaCIKICNpbmNsdWRlICJD
cmVkZW50aWFsU3RvcmFnZS5oIgogI2luY2x1ZGUgIkN1cmxDYWNoZU1hbmFnZXIuaCIKICNpbmNs
dWRlICJDdXJsUmVxdWVzdC5oIgogI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCisjaW5jbHVkZSAi
TmV0d29ya1N0b3JhZ2VTZXNzaW9uLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5h
bC5oIgogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogI2luY2x1ZGUgIlRleHRFbmNvZGluZy5o
IgpAQCAtMTkwLDYgKzE5MiwyMCBAQCB2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpj
dXJsRGlkU2VuZERhdGEodW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzU2VudCwgdQogICAgIG1faGFu
ZGxlLT5jbGllbnQoKS0+ZGlkU2VuZERhdGEobV9oYW5kbGUsIGJ5dGVzU2VudCwgdG90YWxCeXRl
c1RvQmVTZW50KTsKIH0KIAorc3RhdGljIHZvaWQgaGFuZGxlQ29va2llSGVhZGVycyhjb25zdCBD
dXJsUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIHN0YXRpYyBjb25zdCBhdXRvIHNldENvb2tp
ZUhlYWRlciA9ICJzZXQtY29va2llOiAiOworCisgICAgYXV0byYgZGVmYXVsdFN0b3JhZ2VTZXNz
aW9uID0gTmV0d29ya1N0b3JhZ2VTZXNzaW9uOjpkZWZhdWx0U3RvcmFnZVNlc3Npb24oKTsKKyAg
ICBDb29raWVKYXJDdXJsJiBjb29raWVKYXIgPSBkZWZhdWx0U3RvcmFnZVNlc3Npb24uY29va2ll
U3RvcmFnZSgpOworICAgIGZvciAoYXV0byBoZWFkZXIgOiByZXNwb25zZS5oZWFkZXJzKSB7Cisg
ICAgICAgIGlmIChoZWFkZXIuc3RhcnRzV2l0aElnbm9yaW5nQVNDSUlDYXNlKHNldENvb2tpZUhl
YWRlcikpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXRDb29raWVTdHJpbmcgPSBoZWFkZXIucmln
aHQoaGVhZGVyLmxlbmd0aCgpIC0gc3RybGVuKHNldENvb2tpZUhlYWRlcikpOworICAgICAgICAg
ICAgY29va2llSmFyLnNldENvb2tpZXNGcm9tSFRUUFJlc3BvbnNlKGRlZmF1bHRTdG9yYWdlU2Vz
c2lvbiwgcmVzcG9uc2UudXJsLCBzZXRDb29raWVTdHJpbmcpOworICAgICAgICB9CisgICAgfQor
fQorCiB2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjdXJsRGlkUmVjZWl2ZVJlc3Bv
bnNlKGNvbnN0IEN1cmxSZXNwb25zZSYgcmVjZWl2ZWRSZXNwb25zZSkKIHsKICAgICBBU1NFUlQo
aXNNYWluVGhyZWFkKCkpOwpAQCAtMjAzLDYgKzIxOSw4IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGVD
dXJsRGVsZWdhdGU6OmN1cmxEaWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgQ3VybFJlc3BvbnNlJiBy
ZWNlCiAgICAgaWYgKG1fY3VybFJlcXVlc3QpCiAgICAgICAgIG1faGFuZGxlLT5nZXRJbnRlcm5h
bCgpLT5tX3Jlc3BvbnNlLnNldERlcHJlY2F0ZWROZXR3b3JrTG9hZE1ldHJpY3MobV9jdXJsUmVx
dWVzdC0+Z2V0TmV0d29ya0xvYWRNZXRyaWNzKCkpOwogCisgICAgaGFuZGxlQ29va2llSGVhZGVy
cyhyZWNlaXZlZFJlc3BvbnNlKTsKKwogICAgIGlmIChyZXNwb25zZSgpLnNob3VsZFJlZGlyZWN0
KCkpIHsKICAgICAgICAgd2lsbFNlbmRSZXF1ZXN0KCk7CiAgICAgICAgIHJldHVybjsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>332814</attachid>
            <date>2018-01-31 15:45:38 -0800</date>
            <delta_ts>2018-02-01 02:49:29 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>174942.diff</filename>
            <type>text/plain</type>
            <size>60519</size>
            <attacher name="Christopher Reid">chris.reid</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA5N2Q4N2IyNWNhYy4uMzdiYThjYmI0OGQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzNiBAQAorMjAxOC0wMS0zMSAgQ2hyaXN0b3BoZXIgUmVpZCAgPGNocmlzLnJlaWRAc29u
eS5jb20+CisKKyAgICAgICAgW0N1cmxdIFVzZSBTUUxpdGUgZGF0YWJhc2UgaW4gY29va2llIGph
ciBpbXBsZW1lbnRhdGlvbiBmb3IgQ3VybCBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIFNldC1Db29raWUgaXMgYWxyZWFk
eSB0ZXN0ZWQgaW4gTGF5b3V0IHRlc3RzLgorCisgICAgICAgIEFkZGluZyBhbiBpbml0aWFsIFNR
TGl0ZSBDb29raWVKYXIgaW1wbGVtZW50YXRpb24gdG8gdGhlIGN1cmwgbmV0d29yayBsYXllci4K
KyAgICAgICAgV2ViQ29yZSB3aWxsIG5vdyBwYXJzZSBhbmQgaGFuZGxlIGJvdGggSFRUUCBhbmQg
RE9NIGNvb2tpZXMgaW5zdGVhZCBvZiB1c2luZyBsaWJjdXJsLgorICAgICAgICBUaGlzIGN1cnJl
bnRseSBzdXBwb3J0cyBjb29raWUgc3RvcmFnZSBhbmQgcmV0cmlldmFsLgorICAgICAgICBDb29r
aWUgZGVsZXRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICBNb3ZlZCBDb29r
aWVKYXIgYWxvbmcgd2l0aCB0aGUgQ29va2llSmFyREIgc3RvcmFnZSB0byBOZXR3b3JrU3RvcmFn
ZVNlc3Npb24uCisgICAgICAgIEtlcHQgdGhlIG9sZCBsaWJjdXJsIGNvb2tpZSBiYWNrZW5kIGJl
aGluZCBFTkFCTEUoQ1VSTF9DT09LSUVfU1RPUkFHRSkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9D
dXJsLmNtYWtlOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvTmV0d29ya1N0b3JhZ2VTZXNz
aW9uLmg6IEFkZGVkIGN1cmwgY29va2llIHN0b3JhZ2UuCisgICAgICAgICogcGxhdGZvcm0vbmV0
d29yay9jdXJsL0Nvb2tpZUphckN1cmwuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJDdXJsLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZUphckN1cmxEYXRhYmFzZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0v
bmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0
d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcDogTW92ZWQgY3VybCBjb29raWUgamFyIHRvIE5ldHdv
cmtTdG9yYWdlU2Vzc2lvbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENv
bnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3Bw
OgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNlc3Npb25D
dXJsLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVD
dXJsRGVsZWdhdGUuY3BwOgorCiAyMDE4LTAxLTI5ICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBs
ZS5jb20+CiAKICAgICAgICAgRHJvcCB1bm5lY2Vzc2FyeSAiU2VydmljZVdvcmtlciBUYXNrIFRo
cmVhZCIgaW4gU1dTZXJ2ZXIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1
cmwuY21ha2UgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmluZGV4IGNkYWVm
NWJmNzRhLi43M2MwMTRmMTVjMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Q3VybC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCkBAIC01
LDcgKzUsMTAgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9JTkNMVURFX0RJUkVDVE9SSUVTCiBsaXN0
KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2VDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29r
aWVKYXJDdXJsLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0
YWJhc2UuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcAogICAg
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVTdG9yYWdlQ3VybC5jcHAKKyAgICBwbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q3JlZGVudGlhbFN0b3JhZ2VDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
Q2FjaGVFbnRyeS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENhY2hlTWFuYWdl
ci5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvTmV0d29y
a1N0b3JhZ2VTZXNzaW9uLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL05ldHdv
cmtTdG9yYWdlU2Vzc2lvbi5oCmluZGV4IGZkMGI2ZWJjNDE4Li4zOWY3M2U1ZGE0OSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9OZXR3b3JrU3RvcmFnZVNlc3Np
b24uaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL05ldHdvcmtTdG9yYWdl
U2Vzc2lvbi5oCkBAIC00Myw2ICs0MywxMSBAQAogdHlwZWRlZiBzdHJ1Y3QgX1NvdXBDb29raWVK
YXIgU291cENvb2tpZUphcjsKICNlbmRpZgogCisjaWYgVVNFKENVUkwpCisjaW5jbHVkZSAiQ29v
a2llSmFyQ3VybC5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRCLmgiCisjZW5kaWYKKwogI2lmZGVm
IF9fT0JKQ19fCiAjaW5jbHVkZSA8b2JqYy9vYmpjLmg+CiAjZW5kaWYKQEAgLTExNSw2ICsxMjAs
MTYgQEAgcHVibGljOgogICAgIHZvaWQgc2V0Q29va2llT2JzZXJ2ZXJIYW5kbGVyKEZ1bmN0aW9u
PHZvaWQgKCk+JiYpOwogICAgIHZvaWQgZ2V0Q3JlZGVudGlhbEZyb21QZXJzaXN0ZW50U3RvcmFn
ZShjb25zdCBQcm90ZWN0aW9uU3BhY2UmLCBGdW5jdGlvbjx2b2lkIChDcmVkZW50aWFsJiYpPiBj
b21wbGV0aW9uSGFuZGxlcik7CiAgICAgdm9pZCBzYXZlQ3JlZGVudGlhbFRvUGVyc2lzdGVudFN0
b3JhZ2UoY29uc3QgUHJvdGVjdGlvblNwYWNlJiwgY29uc3QgQ3JlZGVudGlhbCYpOworI2VsaWYg
VVNFKENVUkwpCisgICAgTmV0d29ya1N0b3JhZ2VTZXNzaW9uKFBBTDo6U2Vzc2lvbklELCBOZXR3
b3JraW5nQ29udGV4dCopOworICAgIH5OZXR3b3JrU3RvcmFnZVNlc3Npb24oKTsKKworICAgIENv
b2tpZUphckN1cmwmIGNvb2tpZVN0b3JhZ2UoKSBjb25zdCB7IHJldHVybiAqbV9jb29raWVTdG9y
YWdlOyB9OworI2lmICFFTkFCTEUoQ1VSTF9DT09LSUVfU1RPUkFHRSkKKyAgICBDb29raWVKYXJE
QiYgY29va2llRGF0YWJhc2UoKSBjb25zdCB7IHJldHVybiAqbV9jb29raWVEYXRhYmFzZTsgfTsK
KyNlbmRpZgorCisgICAgTmV0d29ya2luZ0NvbnRleHQqIGNvbnRleHQoKSBjb25zdDsKICNlbHNl
CiAgICAgTmV0d29ya1N0b3JhZ2VTZXNzaW9uKFBBTDo6U2Vzc2lvbklELCBOZXR3b3JraW5nQ29u
dGV4dCopOwogICAgIH5OZXR3b3JrU3RvcmFnZVNlc3Npb24oKTsKQEAgLTE0Niw2ICsxNjEsMTMg
QEAgcHJpdmF0ZToKICAgICBGdW5jdGlvbjx2b2lkIChDcmVkZW50aWFsJiYpPiBtX3BlcnNpc2Vu
dFN0b3JhZ2VDb21wbGV0aW9uSGFuZGxlcjsKICAgICBHUmVmUHRyPEdDYW5jZWxsYWJsZT4gbV9w
ZXJzaXNlbnRTdG9yYWdlQ2FuY2VsbGFibGU7CiAjZW5kaWYKKyNlbGlmIFVTRShDVVJMKQorICAg
IHN0ZDo6dW5pcXVlX3B0cjxDb29raWVKYXJDdXJsPiBtX2Nvb2tpZVN0b3JhZ2U7CisjaWYgIUVO
QUJMRShDVVJMX0NPT0tJRV9TVE9SQUdFKQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDb29raWVKYXJE
Qj4gbV9jb29raWVEYXRhYmFzZTsKKyNlbmRpZgorCisgICAgUmVmUHRyPE5ldHdvcmtpbmdDb250
ZXh0PiBtX2NvbnRleHQ7CiAjZWxzZQogICAgIFJlZlB0cjxOZXR3b3JraW5nQ29udGV4dD4gbV9j
b250ZXh0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAKaW5kZXggZTNiNzI4YjgzYmYuLmEzZGFmNDNlNTli
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2ll
SmFyQ3VybC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZUphckN1cmwuY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAKICNpZiBVU0UoQ1VSTCkKICNpbmNs
dWRlICJDb29raWUuaCIKKyNpbmNsdWRlICJDb29raWVVdGlsLmgiCiAjaW5jbHVkZSAiQ3VybENv
bnRleHQuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Npb24uaCIKICNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlVSTC5oIgogCkBAIC00NSwyOSArNDcsNiBAQCBz
dGF0aWMgdm9pZCByZWFkQ3VybENvb2tpZVRva2VuKGNvbnN0IGNoYXIqJiBjb29raWUsIFN0cmlu
ZyYgdG9rZW4pCiAgICAgICAgIGNvb2tpZSsrOwogfQogCi1zdGF0aWMgYm9vbCBkb21haW5NYXRj
aChjb25zdCBTdHJpbmcmIGNvb2tpZURvbWFpbiwgY29uc3QgU3RyaW5nJiBob3N0KQotewotICAg
IHNpemVfdCBpbmRleCA9IGhvc3QuZmluZChjb29raWVEb21haW4pOwotCi0gICAgYm9vbCB0YWls
TWF0Y2ggPSAoaW5kZXggIT0gV1RGOjpub3RGb3VuZCAmJiBpbmRleCArIGNvb2tpZURvbWFpbi5s
ZW5ndGgoKSA9PSBob3N0Lmxlbmd0aCgpKTsKLQotICAgIC8vIENoZWNrIGlmIGhvc3QgZXF1YWxz
IGNvb2tpZSBkb21haW4uCi0gICAgaWYgKHRhaWxNYXRjaCAmJiAhaW5kZXgpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgLy8gQ2hlY2sgaWYgaG9zdCBpcyBhIHN1YmRvbWFpbiBvZiB0aGUg
ZG9tYWluIGluIHRoZSBjb29raWUuCi0gICAgLy8gQ3VybCB1c2VzIGEgJy4nIGluIGZyb250IG9m
IGRvbWFpbnMgdG8gaW5kaWNhdGUgaXQncyB2YWxpZCBvbiBzdWJkb21haW5zLgotICAgIGlmICh0
YWlsTWF0Y2ggJiYgaW5kZXggPiAwICYmIGhvc3RbaW5kZXhdID09ICcuJykKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICAvLyBDaGVjayB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIGhvc3QgZXF1
YWxzIHRoZSBjb29raWUgZG9tYWluLCBleGNlcHQgZm9yIGEgbGVhZGluZyAnLicgaW4gdGhlIGNv
b2tpZSBkb21haW4uCi0gICAgLy8gRS5nLiBjb29raWUgZG9tYWluIGlzIC5hcHBsZS5jb20gYW5k
IGhvc3QgaXMgYXBwbGUuY29tLiAKLSAgICBpZiAoY29va2llRG9tYWluWzBdID09ICcuJyAmJiBj
b29raWVEb21haW4uZmluZChob3N0KSA9PSAxKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdDdXJsQ29va2llKGNv
bnN0IGNoYXIqIGNvb2tpZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0IFN0cmluZyYgcGF0
aCwgU3RyaW5nQnVpbGRlciYgY29va2llcywgYm9vbCBodHRwb25seSkKIHsKICAgICAvLyBDaGVj
ayBpZiB0aGUgY29va2llIG1hdGNoZXMgZG9tYWluIGFuZCBwYXRoLCBhbmQgaXMgbm90IGV4cGly
ZWQuCkBAIC0xMDMsNyArODIsNyBAQCBzdGF0aWMgdm9pZCBhZGRNYXRjaGluZ0N1cmxDb29raWUo
Y29uc3QgY2hhciogY29va2llLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29ucwogICAgICAgICAg
ICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICghZG9tYWluTWF0Y2goY29va2llRG9tYWluLCBk
b21haW4pKQorICAgIGlmICghQ29va2llVXRpbDo6ZG9tYWluTWF0Y2goY29va2llRG9tYWluLCBk
b21haW4pKQogICAgICAgICByZXR1cm47CiAKICAgICBTdHJpbmcgc3RyQm9vbGVhbjsKQEAgLTI0
Niw3ICsyMjUsNiBAQCB2b2lkIENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpzZXRDb29raWVzRnJv
bURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjbwogICAgIEN1cmxIYW5kbGUgY3Vy
bEhhbmRsZTsKIAogICAgIGN1cmxIYW5kbGUuZW5hYmxlU2hhcmVIYW5kbGUoKTsKLSAgICBjdXJs
SGFuZGxlLmVuYWJsZUNvb2tpZUphcklmRXhpc3RzKCk7CiAKICAgICAvLyBDVVJMIGFjY2VwdHMg
Y29va2llcyBpbiBlaXRoZXIgU2V0LUNvb2tpZSBvciBOZXRzY2FwZSBmaWxlIGZvcm1hdC4KICAg
ICAvLyBIb3dldmVyIHdpdGggU2V0LUNvb2tpZSBmb3JtYXQsIHRoZXJlIGlzIG5vIHdheSB0byBz
cGVjaWZ5IHRoYXQgd2UKQEAgLTM0OCw1MiArMzI2LDUyIEBAIHZvaWQgQ29va2llSmFyQ3VybEZp
bGVTeXN0ZW06OmRlbGV0ZUFsbENvb2tpZXNNb2RpZmllZFNpbmNlKGNvbnN0IE5ldHdvcmtTdG9y
YWdlCiAKIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZXNGb3JET00oY29uc3QgTmV0d29y
a1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVS
TCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVp
bnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzIGluY2x1ZGVTZWN1cmVDb29raWVz
KQogewotICAgIHJldHVybiBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuY29v
a2llc0ZvckRPTShzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgaW5j
bHVkZVNlY3VyZUNvb2tpZXMpOworICAgIHJldHVybiBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5j
b29raWVzRm9yRE9NKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCBp
bmNsdWRlU2VjdXJlQ29va2llcyk7CiB9CiAKIHZvaWQgc2V0Q29va2llc0Zyb21ET00oY29uc3Qg
TmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNv
bnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlv
bmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7Ci0gICAgQ3VybENv
bnRleHQ6OnNpbmdsZXRvbigpLmNvb2tpZUphcigpLnNldENvb2tpZXNGcm9tRE9NKHNlc3Npb24s
IGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCB2YWx1ZSk7CisgICAgc2Vzc2lvbi5j
b29raWVTdG9yYWdlKCkuc2V0Q29va2llc0Zyb21ET00oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJs
LCBmcmFtZUlELCBwYWdlSUQsIHZhbHVlKTsKIH0KIAogc3RkOjpwYWlyPFN0cmluZywgYm9vbD4g
Y29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9w
dGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQs
IEluY2x1ZGVTZWN1cmVDb29raWVzIGluY2x1ZGVTZWN1cmVDb29raWVzKQogewotICAgIHJldHVy
biBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuY29va2llUmVxdWVzdEhlYWRl
ckZpZWxkVmFsdWUoc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIGlu
Y2x1ZGVTZWN1cmVDb29raWVzKTsKKyAgICByZXR1cm4gc2Vzc2lvbi5jb29raWVTdG9yYWdlKCku
Y29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBm
cmFtZUlELCBwYWdlSUQsIGluY2x1ZGVTZWN1cmVDb29raWVzKTsKIH0KIAogYm9vbCBjb29raWVz
RW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24pCiB7Ci0gICAgcmV0
dXJuIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5jb29raWVzRW5hYmxlZChz
ZXNzaW9uKTsKKyAgICByZXR1cm4gc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuY29va2llc0VuYWJs
ZWQoc2Vzc2lvbik7CiB9CiAKIGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFn
ZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmws
IHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+
IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4mIHJhd0Nvb2tpZXMpCiB7Ci0gICAgcmV0dXJuIEN1cmxD
b250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5nZXRSYXdDb29raWVzKHNlc3Npb24sIGZp
cnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCByYXdDb29raWVzKTsKKyAgICByZXR1cm4g
c2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuZ2V0UmF3Q29va2llcyhzZXNzaW9uLCBmaXJzdFBhcnR5
LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgcmF3Q29va2llcyk7CiB9CiAKIHZvaWQgZGVsZXRlQ29v
a2llKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiB1cmws
IGNvbnN0IFN0cmluZyYgY29va2llKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5j
b29raWVKYXIoKS5kZWxldGVDb29raWUoc2Vzc2lvbiwgdXJsLCBjb29raWUpOworICAgIHNlc3Np
b24uY29va2llU3RvcmFnZSgpLmRlbGV0ZUNvb2tpZShzZXNzaW9uLCB1cmwsIGNvb2tpZSk7CiB9
CiAKIHZvaWQgZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNz
aW9uJiBzZXNzaW9uLCBIYXNoU2V0PFN0cmluZz4mIGhvc3RuYW1lcykKIHsKLSAgICBDdXJsQ29u
dGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoc2Vz
c2lvbiwgaG9zdG5hbWVzKTsKKyAgICBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5nZXRIb3N0bmFt
ZXNXaXRoQ29va2llcyhzZXNzaW9uLCBob3N0bmFtZXMpOwogfQogCiB2b2lkIGRlbGV0ZUNvb2tp
ZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25z
dCBWZWN0b3I8U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKQogewotICAgIEN1cmxDb250ZXh0Ojpz
aW5nbGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVDb29raWVzRm9ySG9zdG5hbWVzKHNlc3Npb24s
IGNvb2tpZUhvc3ROYW1lcyk7CisgICAgc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuZGVsZXRlQ29v
a2llc0Zvckhvc3RuYW1lcyhzZXNzaW9uLCBjb29raWVIb3N0TmFtZXMpOwogfQogCiB2b2lkIGRl
bGV0ZUFsbENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uKQogewot
ICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVBbGxDb29raWVz
KHNlc3Npb24pOworICAgIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmRlbGV0ZUFsbENvb2tpZXMo
c2Vzc2lvbik7CiB9CiAKIHZvaWQgZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2UoY29uc3Qg
TmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBXYWxsVGltZSBzaW5jZSkKIHsKLSAgICBD
dXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuZGVsZXRlQWxsQ29va2llc01vZGlm
aWVkU2luY2Uoc2Vzc2lvbiwgc2luY2UpOworICAgIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmRl
bGV0ZUFsbENvb2tpZXNNb2RpZmllZFNpbmNlKHNlc3Npb24sIHNpbmNlKTsKIH0KIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1
cmwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJs
LmgKaW5kZXggYTUyZmQ3ODYxNzEuLjY2OWYwNjRmZjJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmgKQEAgLTMwLDYgKzMw
LDcgQEAgY2xhc3MgQ29va2llSmFyQ3VybCB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCBzdGQ6OnBh
aXI8U3RyaW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lv
biYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50
NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2Vj
dXJlQ29va2llcykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRDb29raWVzRnJvbURPTShjb25z
dCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVS
TCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0
X3Q+IHBhZ2VJRCwgY29uc3QgU3RyaW5nJikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb29r
aWVzRnJvbUhUVFBSZXNwb25zZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBV
UkwmLCBjb25zdCBTdHJpbmcmKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGNvb2tpZXNFbmFibGVk
KGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpID0gMDsKICAgICB2aXJ0dWFsIHN0ZDo6cGFp
cjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RIZWFkZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdv
cmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3Rk
OjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFn
ZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBnZXRSYXdD
b29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0
eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRp
b25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2llPiYpID0gMDsKQEAgLTQzLDYgKzQ0
LDcgQEAgcHVibGljOgogY2xhc3MgQ29va2llSmFyQ3VybEZpbGVTeXN0ZW0gOiBwdWJsaWMgQ29v
a2llSmFyQ3VybCB7CiAgICAgc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29va2llc0ZvckRPTShj
b25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0
IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWlu
dDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJyaWRlOwogICAgIHZvaWQg
c2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJM
JiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlE
LCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRl
OworICAgIHZvaWQgc2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiwgY29uc3QgVVJMJiwgY29uc3QgU3RyaW5nJikgb3ZlcnJpZGUgeyB9OwogICAg
IGJvb2wgY29va2llc0VuYWJsZWQoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJikgb3ZlcnJp
ZGU7CiAgICAgc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29va2llUmVxdWVzdEhlYWRlckZpZWxk
VmFsdWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5
LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlv
bmFsPHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzKSBvdmVycmlkZTsKICAg
ICBib29sIGdldFJhd0Nvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3Qg
VVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFt
ZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIFZlY3RvcjxDb29raWU+Jikgb3Zl
cnJpZGU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q29va2llSmFyQ3VybERhdGFiYXNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwLi40YzZiNTczY2FjZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuY3BwCkBA
IC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNvbnkgSW50ZXJhY3Rp
dmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJDb29raWVKYXJDdXJsRGF0YWJhc2UuaCIKKworI2lmIFVTRShDVVJMKSAmJiAh
RU5BQkxFKENVUkxfQ09PS0lFX1NUT1JBR0UpCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVk
ZSAiQ29va2llSmFyREIuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Npb24uaCIKKyNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlVSTC5oIgorCisjaW5jbHVkZSA8
d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
YXRpYyBTdHJpbmcgY29va2llc0ZvclNlc3Npb24oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiBzZXNzaW9uLCBjb25zdCBVUkwmLCBjb25zdCBVUkwmIHVybCwgYm9vbCBodHRwb25seSkKK3sK
KyAgICBTdHJpbmdCdWlsZGVyIGNvb2tpZXM7CisKKyAgICBDb29raWVKYXJEQiYgY29va2llSmFy
REIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7CisgICAgYXV0byBpc0h0dHBPbmx5ID0gKGh0
dHBvbmx5ID8gc3RkOjpudWxsb3B0IDogc3RkOjpvcHRpb25hbDxib29sPiB7ZmFsc2V9KTsKKyAg
ICBhdXRvIHNlY3VyZSA9IHVybC5wcm90b2NvbElzKCJodHRwcyIpID8gc3RkOjpudWxsb3B0IDog
c3RkOjpvcHRpb25hbDxib29sPiB7ZmFsc2V9OworCisgICAgVmVjdG9yPENvb2tpZT4gcmVzdWx0
czsKKyAgICBpZiAoY29va2llSmFyREIuc2VhcmNoQ29va2llcyh1cmwuc3RyaW5nKCksIGlzSHR0
cE9ubHksIHNlY3VyZSwgc3RkOjpudWxsb3B0LCByZXN1bHRzKSkgeworICAgICAgICBmb3IgKGF1
dG8gcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICAgICAgaWYgKCFjb29raWVzLmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICBjb29raWVzLmFwcGVuZCgiOyAiKTsKKyAgICAgICAgICAgIGNv
b2tpZXMuYXBwZW5kKHJlc3VsdC5uYW1lKTsKKyAgICAgICAgICAgIGNvb2tpZXMuYXBwZW5kKCI9
Iik7CisgICAgICAgICAgICBjb29raWVzLmFwcGVuZChyZXN1bHQudmFsdWUpOworICAgICAgICB9
CisgICAgfQorICAgIHJldHVybiBjb29raWVzLnRvU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ29va2ll
SmFyQ3VybERhdGFiYXNlOjpzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNl
c3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBh
Z2VJRCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7
CisgICAgVU5VU0VEX1BBUkFNKHBhZ2VJRCk7CisKKyAgICBDb29raWVKYXJEQiYgY29va2llSmFy
REIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7CisgICAgY29va2llSmFyREIuc2V0Q29va2ll
KHVybC5zdHJpbmcoKSwgdmFsdWUsIHRydWUpOworfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRh
YmFzZTo6c2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNz
aW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAg
ICBDb29raWVKYXJEQiYgY29va2llSmFyREIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7Cisg
ICAgY29va2llSmFyREIuc2V0Q29va2llKHVybC5zdHJpbmcoKSwgdmFsdWUsIGZhbHNlKTsKK30K
Kworc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gQ29va2llSmFyQ3VybERhdGFiYXNlOjpjb29raWVz
Rm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiBm
aXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJ
RCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykK
K3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7CisgICAgVU5VU0VEX1BBUkFNKHBhZ2VJRCk7
CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgZmlsdGVyIHNlY3VyZSBjb29raWVzIG91dCBp
ZiB0aGUgY2FsbGVyIHJlcXVlc3RzIGl0LgorICAgIHJldHVybiB7IGNvb2tpZXNGb3JTZXNzaW9u
KHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZmFsc2UpLCBmYWxzZSB9OworfQorCitzdGQ6OnBh
aXI8U3RyaW5nLCBib29sPiBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmNvb2tpZVJlcXVlc3RIZWFk
ZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3Qg
VVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4g
ZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29v
a2llcykKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7CisgICAgVU5VU0VEX1BBUkFNKHBh
Z2VJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgZmlsdGVyIHNlY3VyZSBjb29raWVz
IG91dCBpZiB0aGUgY2FsbGVyIHJlcXVlc3RzIGl0LgorICAgIHJldHVybiB7IGNvb2tpZXNGb3JT
ZXNzaW9uKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgdHJ1ZSksIGZhbHNlIH07Cit9CisKK2Jv
b2wgQ29va2llSmFyQ3VybERhdGFiYXNlOjpjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3Rv
cmFnZVNlc3Npb24mIHNlc3Npb24pCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29v
a2llSmFyQ3VybERhdGFiYXNlOjpnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vz
c2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9w
dGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQs
IFZlY3RvcjxDb29raWU+JiByYXdDb29raWVzKQoreworICAgIFVOVVNFRF9QQVJBTShmcmFtZUlE
KTsKKyAgICBVTlVTRURfUEFSQU0ocGFnZUlEKTsKKworICAgIENvb2tpZUphckRCJiBjb29raWVK
YXJEQiA9IHNlc3Npb24uY29va2llRGF0YWJhc2UoKTsKKyAgICByZXR1cm4gY29va2llSmFyREIu
c2VhcmNoQ29va2llcyhmaXJzdFBhcnR5LnN0cmluZygpLCBzdGQ6Om51bGxvcHQsIHN0ZDo6bnVs
bG9wdCwgc3RkOjpudWxsb3B0LCByYXdDb29raWVzKTsKK30KKwordm9pZCBDb29raWVKYXJDdXJs
RGF0YWJhc2U6OmRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25z
dCBVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBjb29raWVOYW1lKQoreworICAgIC8vIEZJWE1FOiBO
b3QgeWV0IGltcGxlbWVudGVkCit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpnZXRI
b3N0bmFtZXNXaXRoQ29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBIYXNoU2V0
PFN0cmluZz4mIGhvc3RuYW1lcykKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRl
ZAorfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6ZGVsZXRlQ29va2llc0Zvckhvc3Ru
YW1lcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYg
Y29va2llSG9zdE5hbWVzKQoreworICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCit9
CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpkZWxldGVBbGxDb29raWVzKGNvbnN0IE5l
dHdvcmtTdG9yYWdlU2Vzc2lvbiYpCit7CisgICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50
ZWQKK30KKwordm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmRlbGV0ZUFsbENvb2tpZXNNb2Rp
ZmllZFNpbmNlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIFdhbGxUaW1lKQoreworICAg
IC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIFVTRShDVVJMKSAmJiAhRU5BQkxFKENVUkxfQ09PS0lFX1NUT1JBR0Up
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2ll
SmFyQ3VybERhdGFiYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q29va2llSmFyQ3VybERhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAuLmM5MzBkMzY4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5oCkBAIC0wLDAgKzEsNDUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5t
ZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvb2tpZUphckN1cmwuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBDb29raWVKYXJDdXJsRGF0YWJhc2UgOiBwdWJsaWMg
Q29va2llSmFyQ3VybCB7CisgICAgc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29va2llc0ZvckRP
TShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNv
bnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJyaWRlOworICAgIHZv
aWQgc2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3Qg
VVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFt
ZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYpIG92ZXJy
aWRlOworICAgIHZvaWQgc2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0
b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiwgY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisgICAg
Ym9vbCBjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKSBvdmVycmlk
ZTsKKyAgICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRW
YWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHks
IGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9u
YWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92ZXJyaWRlOworICAg
IGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBV
UkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1l
SUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4mKSBvdmVy
cmlkZTsKKyAgICB2b2lkIGRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
LCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKKyAgICB2b2lkIGdldEhvc3Ru
YW1lc1dpdGhDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIEhhc2hTZXQ8U3Ry
aW5nPiYgaG9zdG5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZUNvb2tpZXNGb3JIb3N0
bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVmVjdG9yPFN0cmluZz4m
IGNvb2tpZUhvc3ROYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWxldGVBbGxDb29raWVzKGNv
bnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpIG92ZXJyaWRlOworICAgIHZvaWQgZGVsZXRlQWxs
Q29va2llc01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgV2FsbFRp
bWUpIG92ZXJyaWRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjY3OGRhZmYzMjc2Ci0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRC
LmNwcApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IElu
dGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJDb29raWVKYXJEQi5oIgorCisjaW5jbHVkZSAiQ29va2llVXRpbC5oIgorI2luY2x1ZGUgIlNR
TGl0ZUZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJVUkwuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCisjZGVmaW5lIENPUlJVUFRfTUFSS0VSX1NVRkZJWCAiLWNvcnJ1cHRlZCIKKworLy8gQXQg
bGVhc3QgNTAgY29va2llcyBwZXIgZG9tYWluIChSRkM2MjY1IDYuMS4gTGltaXRzKQorI2RlZmlu
ZSBNQVhfQ09PS0lFX1BFUl9ET01BSU4gODAKKworI2RlZmluZSBDUkVBVEVfQ09PS0lFX1RBQkxF
X1NRTCBcCisgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIENvb2tpZSAoIlwKKyAgICAi
ICBuYW1lIFRFWFQgTk9UIE5VTEwsIlwKKyAgICAiICB2YWx1ZSBURVhULCJcCisgICAgIiAgZG9t
YWluIFRFWFQgTk9UIE5VTEwsIlwKKyAgICAiICBwYXRoIFRFWFQgTk9UIE5VTEwsIlwKKyAgICAi
ICBleHBpcmVzIElOVEVHRVIgTk9UIE5VTEwsIlwKKyAgICAiICBzaXplIElOVEVHRVIgTk9UIE5V
TEwsIlwKKyAgICAiICBzZXNzaW9uIElOVEVHRVIgTk9UIE5VTEwsIlwKKyAgICAiICBodHRwb25s
eSBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwiXAorICAgICIgIHNlY3VyZSBJTlRFR0VSIE5P
VCBOVUxMIERFRkFVTFQgMCwiXAorICAgICIgIGxhc3R1cGRhdGVkIElOVEVHRVIgTk9UIE5VTEwg
REVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwgIlwKKyAgICAiICBVTklRVUUobmFtZSwgZG9tYWlu
LCBwYXRoKSk7IgorI2RlZmluZSBDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCBcCisgICAgIkNSRUFU
RSBJTkRFWCBJRiBOT1QgRVhJU1RTIGRvbWFpbl9pbmRleCBPTiBDb29raWUoZG9tYWluKTsiCisj
ZGVmaW5lIENSRUFURV9QQVRIX0lOREVYX1NRTCBcCisgICAgIkNSRUFURSBJTkRFWCBJRiBOT1Qg
RVhJU1RTIHBhdGhfaW5kZXggT04gQ29va2llKHBhdGgpOyIKKyNkZWZpbmUgQ0hFQ0tfRVhJU1RT
X0hUVFBPTkxZX0NPT0tJRV9TUUwgXAorICAgICJTRUxFQ1QgbmFtZSBGUk9NIENvb2tpZSBXSEVS
RSAobmFtZSA9ID8pIEFORCAoZG9tYWluID0gPykgQU5EIChwYXRoID0gPykgQU5EIChodHRwb25s
eSA9IDEpOyIKKyNkZWZpbmUgU0VUX0NPT0tJRV9TUUwgXAorICAgICJJTlNFUlQgT1IgUkVQTEFD
RSBJTlRPIENvb2tpZSAobmFtZSwgdmFsdWUsIGRvbWFpbiwgcGF0aCwgZXhwaXJlcywgc2l6ZSwg
c2Vzc2lvbiwgaHR0cG9ubHksIHNlY3VyZSkgIlwKKyAgICAiVkFMVUVTICg/LCA/LCA/LCA/LCA/
LCA/LCA/LCA/LCA/KTsiCisjZGVmaW5lIERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fUEFU
SF9TUUwgXAorICAgICJERUxFVEUgRlJPTSBDb29raWUgV0hFUkUgbmFtZSA9ID8gQU5EIGRvbWFp
biA9ID8gQU5EIHBhdGggPSA/OyIKKyNkZWZpbmUgREVMRVRFX0NPT0tJRV9CWV9OQU1FX0RPTUFJ
Tl9TUUwgXAorICAgICJERUxFVEUgRlJPTSBDb29raWUgV0hFUkUgbmFtZSA9ID8gQU5EIGRvbWFp
biA9ID87IgorI2RlZmluZSBERUxFVEVfQUxMX1NFU1NJT05fQ09PS0lFX1NRTCBcCisgICAgIkRF
TEVURSBGUk9NIENvb2tpZSBXSEVSRSBzZXNzaW9uID0gMTsiCisjZGVmaW5lIERFTEVURV9BTExf
Q09PS0lFX1NRTCBcCisgICAgIkRFTEVURSBGUk9NIENvb2tpZTsiCisKK3ZvaWQgQ29va2llSmFy
REI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGUpCit7CisgICAgQ29va2llSmFyREI6Om1fY29va2ll
RW5hYmxlID0gZW5hYmxlOworfQorCitDb29raWVKYXJEQjo6Q29va2llSmFyREIoY29uc3QgU3Ry
aW5nJiBkYXRhYmFzZVBhdGgpCisgICAgOiBtX2RhdGFiYXNlUGF0aChkYXRhYmFzZVBhdGgpCit7
CisgICAgY2hlY2tEYXRhYmFzZUNvcnJ1cHRpb25BbmRSZW1vdmVJZk5lZWRlZCgpOworCisgICAg
aWYgKCFvcGVuRGF0YWJhc2UoKSkKKyAgICAgICAgcmV0dXJuOworfQorCitDb29raWVKYXJEQjo6
fkNvb2tpZUphckRCKCkKK3sKKyAgICBjbG9zZURhdGFiYXNlKCk7Cit9CisKK2Jvb2wgQ29va2ll
SmFyREI6Om9wZW5EYXRhYmFzZSgpCit7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCBleGlzdHNEYXRhYmFzZUZpbGUgPSBmYWxz
ZTsKKyAgICBpZiAoIWlzT25NZW1vcnkoKSkKKyAgICAgICAgZXhpc3RzRGF0YWJhc2VGaWxlID0g
U1FMaXRlRmlsZVN5c3RlbTo6ZW5zdXJlRGF0YWJhc2VGaWxlRXhpc3RzKG1fZGF0YWJhc2VQYXRo
LCBmYWxzZSk7CisKKyAgICBpZiAoZXhpc3RzRGF0YWJhc2VGaWxlKSB7CisgICAgICAgIGlmICht
X2RhdGFiYXNlLm9wZW4obV9kYXRhYmFzZVBhdGgsIGZhbHNlKSkgeworICAgICAgICAgICAgaWYg
KGNoZWNrRGF0YWJhc2VWYWxpZGl0eSgpKQorICAgICAgICAgICAgICAgIGV4ZWN1dGVTaW1wbGVT
cWwoREVMRVRFX0FMTF9TRVNTSU9OX0NPT0tJRV9TUUwpOworICAgICAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICAgICAgLy8gZGVsZXRlIGRhdGFiYXNlIGFuZCB0cnkgdG8gcmUtY3JlYXRlIGFn
YWluCisgICAgICAgICAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOworICAgICAgICAgICAgICAg
IGRlbGV0ZUFsbERhdGFiYXNlRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBleGlzdHNEYXRhYmFz
ZUZpbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIGRlbGV0ZUFsbERhdGFiYXNlRmlsZXMoKTsKKyAgICAgICAgICAgIGV4aXN0c0RhdGFiYXNl
RmlsZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFleGlzdHNEYXRhYmFz
ZUZpbGUpIHsKKyAgICAgICAgaWYgKG1fZGF0YWJhc2Uub3BlbihtX2RhdGFiYXNlUGF0aCwgZmFs
c2UpKSB7CisgICAgICAgICAgICBib29sIGRhdGFiYXNlVmFsaWRpdHkgPSB0cnVlOworICAgICAg
ICAgICAgZGF0YWJhc2VWYWxpZGl0eSAmPSAoZXhlY3V0ZVNpbXBsZVNxbChDUkVBVEVfQ09PS0lF
X1RBQkxFX1NRTCkgPT0gU1FMSVRFX0RPTkUpOworICAgICAgICAgICAgZGF0YWJhc2VWYWxpZGl0
eSAmPSAoZXhlY3V0ZVNpbXBsZVNxbChDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCkgPT0gU1FMSVRF
X0RPTkUpOworICAgICAgICAgICAgZGF0YWJhc2VWYWxpZGl0eSAmPSAoZXhlY3V0ZVNpbXBsZVNx
bChDUkVBVEVfUEFUSF9JTkRFWF9TUUwpID09IFNRTElURV9ET05FKTsKKyAgICAgICAgICAgIGlm
ICghZGF0YWJhc2VWYWxpZGl0eSkgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgdXAgY3JlYXRl
IGRhdGFiYXNlIGF0IHRoaXMgdGltZSAoYWxsIGNvb2tpZXMgb24gcmVxdWVzdC9yZXNwb25zZSBh
cmUgaWdub3JlZCkKKyAgICAgICAgICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7CisgICAgICAg
ICAgICAgICAgZGVsZXRlQWxsRGF0YWJhc2VGaWxlcygpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBleGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgdGVtcF9zdG9yZSA9IE1F
TU9SWTsiKTsKKyAgICBleGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgc3luY2hyb25vdXMgPSBOT1JN
QUw7Iik7CisgICAgZXhlY3V0ZVNpbXBsZVNxbCgiUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDsi
KTsKKworICAgIC8vIGNyZWF0ZSBwcmVwYXJlZCBzdGF0ZW1lbnRzCisgICAgY3JlYXRlUHJlcGFy
ZVN0YXRlbWVudChTRVRfQ09PS0lFX1NRTCk7CisgICAgY3JlYXRlUHJlcGFyZVN0YXRlbWVudChD
SEVDS19FWElTVFNfSFRUUE9OTFlfQ09PS0lFX1NRTCk7CisgICAgY3JlYXRlUHJlcGFyZVN0YXRl
bWVudChERUxFVEVfQ09PS0lFX0JZX05BTUVfRE9NQUlOX1BBVEhfU1FMKTsKKyAgICBjcmVhdGVQ
cmVwYXJlU3RhdGVtZW50KERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fU1FMKTsKKworICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIENvb2tpZUphckRCOjpjbG9zZURhdGFiYXNlKCkKK3sK
KyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8m
IHN0YXRlbWVudCA6IG1fc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52YWx1ZS5n
ZXQoKS0+ZmluYWxpemUoKTsKKyAgICAgICAgbV9zdGF0ZW1lbnRzLmNsZWFyKCk7CisgICAgICAg
IG1fZGF0YWJhc2UuY2xvc2UoKTsKKyAgICB9Cit9CisKK1N0cmluZyBDb29raWVKYXJEQjo6Z2V0
Q29ycnVwdGlvbk1hcmtlclBhdGgoKSBjb25zdAoreworICAgIEFTU0VSVCghaXNPbk1lbW9yeSgp
KTsKKworICAgIHJldHVybiBtX2RhdGFiYXNlUGF0aCArIENPUlJVUFRfTUFSS0VSX1NVRkZJWDsK
K30KKwordm9pZCBDb29raWVKYXJEQjo6ZmxhZ0RhdGFiYXNlQ29ycnVwdGlvbigpCit7CisgICAg
aWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRklMRSogZiA9IGZvcGVu
KGdldENvcnJ1cHRpb25NYXJrZXJQYXRoKCkudXRmOCgpLmRhdGEoKSwgIndiIik7CisgICAgZmNs
b3NlKGYpOworfQorCitib29sIENvb2tpZUphckRCOjpjaGVja0RhdGFiYXNlQ29ycnVwdGlvbkFu
ZFJlbW92ZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAoaXNPbk1lbW9yeSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzdCA9IHsgMCB9OworICAgIGludCByZXQgPSBz
dGF0KGdldENvcnJ1cHRpb25NYXJrZXJQYXRoKCkudXRmOCgpLmRhdGEoKSwgJnN0KTsKKyAgICBp
ZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGVsZXRlQWxsRGF0YWJhc2VG
aWxlcygpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvb2tpZUphckRCOjpjaGVja1NR
TGl0ZVJldHVybkNvZGUoaW50IGFjdHVhbCwgaW50IGV4cGVjdGVkKQoreworICAgIGlmICghbV9k
ZXRlY3RlZERhdGFiYXNlQ29ycnVwdGlvbikgeworICAgICAgICBzd2l0Y2ggKGFjdHVhbCkgewor
ICAgICAgICBjYXNlIFNRTElURV9DT1JSVVBUOgorICAgICAgICBjYXNlIFNRTElURV9TQ0hFTUE6
CisgICAgICAgIGNhc2UgU1FMSVRFX0ZPUk1BVDoKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9UQURC
OgorICAgICAgICAgICAgZmxhZ0RhdGFiYXNlQ29ycnVwdGlvbigpOworICAgICAgICAgICAgbV9k
ZXRlY3RlZERhdGFiYXNlQ29ycnVwdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gKGFjdHVhbCA9PSBleHBlY3RlZCk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmNo
ZWNrRGF0YWJhc2VWYWxpZGl0eSgpCit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2UuaXNPcGVuKCkp
OworCisgICAgcmV0dXJuIG1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkNvb2tpZSIpOworfQorCit2
b2lkIENvb2tpZUphckRCOjpkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCkKK3sKKyAgICBjbG9zZURh
dGFiYXNlKCk7CisgICAgaWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aW50IHJldCA9IDA7CisgICAgU3RyaW5nIHJlbW92ZVBhdGg7CisKKyAgICAvLyByZW1vdmUgbWFy
a2VyIGZpbGUgKGNvb2tpZS5qYXIuZGItY29ycnVwdGVkKQorICAgIHJldCA9IHJlbW92ZShyZW1v
dmVQYXRoLnV0ZjgoKS5kYXRhKCkpOworCisgICAgLy8gcmVtb3ZlIHNobSBmaWxlIChjb29raWUu
amFyLmRiLXNobSkKKyAgICByZW1vdmVQYXRoID0gU3RyaW5nKG1fZGF0YWJhc2VQYXRoICsgIi1z
aG0iKTsKKyAgICByZXQgPSByZW1vdmUocmVtb3ZlUGF0aC51dGY4KCkuZGF0YSgpKTsKKworICAg
IC8vIHJlbW92ZSB3YWwgZmlsZSAoY29va2llLmphci5kYi13YWwpCisgICAgcmVtb3ZlUGF0aCA9
IFN0cmluZyhtX2RhdGFiYXNlUGF0aCArICItd2FsIik7CisgICAgcmV0ID0gcmVtb3ZlKHJlbW92
ZVBhdGgudXRmOCgpLmRhdGEoKSk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmlzRW5hYmxlZCgp
Cit7CisgICAgaWYgKG1fZGF0YWJhc2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcmV0dXJuIG1fY29va2llRW5hYmxlOworfQorCitib29sIENvb2tpZUphckRC
OjpzZWFyY2hDb29raWVzKGNvbnN0IFN0cmluZyYgcmVxdWVzdFVybCwgY29uc3Qgc3RkOjpvcHRp
b25hbDxib29sPiYgaHR0cE9ubHksIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIHNlY3VyZSwg
Y29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgc2Vzc2lvbiwgVmVjdG9yPENvb2tpZT4mIHJlc3Vs
dHMpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVVJMIHJlcXVlc3RVcmxPYmooUGFyc2VkVVJMU3Ry
aW5nLCByZXF1ZXN0VXJsKTsKKyAgICBTdHJpbmcgcmVxdWVzdEhvc3QocmVxdWVzdFVybE9iai5o
b3N0KCkuY29udmVydFRvQVNDSUlMb3dlcmNhc2UoKSk7CisgICAgU3RyaW5nIHJlcXVlc3RQYXRo
KHJlcXVlc3RVcmxPYmoucGF0aCgpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkpOworCisgICAg
aWYgKHJlcXVlc3RIb3N0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKHJlcXVlc3RQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmVxdWVzdFBhdGggPSAiLyI7CisK
KyAgICBjb25zdCBTdHJpbmcgc3FsID0KKyAgICAgICAgIlNFTEVDVCBuYW1lLCB2YWx1ZSwgZG9t
YWluLCBwYXRoLCBleHBpcmVzLCBodHRwb25seSwgc2VjdXJlLCBzZXNzaW9uIEZST00gQ29va2ll
IFdIRVJFICJcCisgICAgICAgICIoTk9UICgoc2Vzc2lvbiA9IDApIEFORCAoZGF0ZXRpbWUoZXhw
aXJlcywgJ3VuaXhlcG9jaCcpIDwgZGF0ZXRpbWUoJ25vdycpKSkpICJcCisgICAgICAgICJBTkQg
KGh0dHBvbmx5ID0gQ09BTEVTQ0UoTlVMTElGKD8sIC0xKSwgaHR0cG9ubHkpKSAiXAorICAgICAg
ICAiQU5EIChzZWN1cmUgPSBDT0FMRVNDRShOVUxMSUYoPywgLTEpLCBzZWN1cmUpKSAiXAorICAg
ICAgICAiQU5EIChzZXNzaW9uID0gQ09BTEVTQ0UoTlVMTElGKD8sIC0xKSwgc2Vzc2lvbikpICJc
CisgICAgICAgICJBTkQgKChkb21haW4gPSA/KSBPUiAoZG9tYWluIEdMT0IgPykpIjsKKworICAg
IHN0ZDo6dW5pcXVlX3B0cjxTUUxpdGVTdGF0ZW1lbnQ+IHBzdG10OworICAgIHBzdG10ID0gc3Rk
OjptYWtlX3VuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGF0YWJhc2UsIHNxbCk7CisgICAgcHN0
bXQtPnByZXBhcmUoKTsKKyAgICBwc3RtdC0+YmluZEludCgxLCBodHRwT25seSA/ICpodHRwT25s
eSA6IC0xKTsKKyAgICBwc3RtdC0+YmluZEludCgyLCBzZWN1cmUgPyAqc2VjdXJlIDogLTEpOwor
ICAgIHBzdG10LT5iaW5kSW50KDMsIHNlc3Npb24gPyAqc2Vzc2lvbiA6IC0xKTsKKyAgICBwc3Rt
dC0+YmluZFRleHQoNCwgcmVxdWVzdEhvc3QpOworCisgICAgc2l6ZV90IHRvcExldmVsU2VwYXJh
dG9yID0gcmVxdWVzdEhvc3QucmV2ZXJzZUZpbmQoJy4nKTsKKyAgICBpZiAoQ29va2llVXRpbDo6
aXNJUEFkZHJlc3MocmVxdWVzdEhvc3QpIHx8IHRvcExldmVsU2VwYXJhdG9yID09IG5vdEZvdW5k
KQorICAgICAgICBwc3RtdC0+YmluZE51bGwoNSk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIEZJ
WE1FOiBjdXJyZW50bHkgd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIGEgcHVibGljIHN1ZmZpYyBs
aXN0IGluIHdpbmNhaXJvCisgICAgICAgICAgIHNvIHJpZ2h0IG5vdyB3ZSBnbG9iIHVzaW5nIGp1
c3QgdGhlIHNlY29uZCBsZXZlbCBkb21haW4gZS5nLiAqLkRPTUFJTi5jb20KKyAgICAgICAgICAg
VGhpcyB3aWxsIHJldHVybiB0b28gbWFueSBjb29raWVzIHVuZGVyIG11bHRpbGV2ZWwgdGxkcyBz
dWNoIGFzICouY28udWsKKyAgICAgICAgICAgYnV0IHdlIGZpbHRlciB0aG9zZSBvdXQgbGF0ZXIK
KyAgICAgICAgKi8KKworICAgICAgICBzaXplX3Qgc2Vjb25kTGV2ZWxTZXBhcmF0b3IgPSByZXF1
ZXN0SG9zdC5yZXZlcnNlRmluZCgnLicsIHRvcExldmVsU2VwYXJhdG9yLTEpOworICAgICAgICBT
dHJpbmcgbG9jYWxEb21haW4gPSBzZWNvbmRMZXZlbFNlcGFyYXRvciA9PSBub3RGb3VuZCA/IHJl
cXVlc3RIb3N0IDogcmVxdWVzdEhvc3Quc3Vic3RyaW5nKHNlY29uZExldmVsU2VwYXJhdG9yKzEp
OworCisgICAgICAgIEFTU0VSVCghbG9jYWxEb21haW4uaXNFbXB0eSgpKTsKKyAgICAgICAgcHN0
bXQtPmJpbmRUZXh0KDUsIFN0cmluZygiKi4iKSArIGxvY2FsRG9tYWluKTsKKyAgICB9CisKKyAg
ICBpZiAoIXBzdG10KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXN1bHRzLmNsZWFy
KCk7CisKKyAgICB3aGlsZSAocHN0bXQtPnN0ZXAoKSA9PSBTUUxJVEVfUk9XKSB7CisKKyAgICAg
ICAgaWYgKHJlc3VsdHMuc2l6ZSgpID4gTUFYX0NPT0tJRV9QRVJfRE9NQUlOKQorICAgICAgICAg
ICAgYnJlYWs7CisKKyAgICAgICAgU3RyaW5nIGNvb2tpZU5hbWUgPSBwc3RtdC0+Z2V0Q29sdW1u
VGV4dCgwKTsKKyAgICAgICAgU3RyaW5nIGNvb2tpZVZhbHVlID0gcHN0bXQtPmdldENvbHVtblRl
eHQoMSk7CisgICAgICAgIFN0cmluZyBjb29raWVEb21haW4gPSBwc3RtdC0+Z2V0Q29sdW1uVGV4
dCgyKS5jb252ZXJ0VG9BU0NJSUxvd2VyY2FzZSgpOworICAgICAgICBTdHJpbmcgY29va2llUGF0
aCA9IHBzdG10LT5nZXRDb2x1bW5UZXh0KDMpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCk7Cisg
ICAgICAgIGRvdWJsZSBjb29raWVFeHBpcmVzID0gKGRvdWJsZSlwc3RtdC0+Z2V0Q29sdW1uSW50
NjQoNCkgKiAxMDAwOworICAgICAgICBib29sIGNvb2tpZUh0dHBPbmx5ID0gKHBzdG10LT5nZXRD
b2x1bW5JbnQoNSkgPT0gMSk7CisgICAgICAgIGJvb2wgY29va2llU2VjdXJlID0gKHBzdG10LT5n
ZXRDb2x1bW5JbnQoNikgPT0gMSk7CisgICAgICAgIGJvb2wgY29va2llU2Vzc2lvbiA9IChwc3Rt
dC0+Z2V0Q29sdW1uSW50KDcpID09IDEpOworCisgICAgICAgIGlmICghQ29va2llVXRpbDo6ZG9t
YWluTWF0Y2goY29va2llRG9tYWluLCByZXF1ZXN0SG9zdCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0
aW9uLTUuMS40ICJQYXRocyBhbmQgUGF0aC1NYXRjaCIKKyAgICAgICAgYm9vbCBpc1BhdGhNYXRj
aGVkID0gY29va2llUGF0aCA9PSByZXF1ZXN0UGF0aAorICAgICAgICAgICAgfHwgKHJlcXVlc3RQ
YXRoLnN0YXJ0c1dpdGgoY29va2llUGF0aCkgJiYgY29va2llUGF0aC5lbmRzV2l0aCgnLycpKQor
ICAgICAgICAgICAgfHwgKHJlcXVlc3RQYXRoLnN0YXJ0c1dpdGgoY29va2llUGF0aCkgJiYgKHJl
cXVlc3RQYXRoLmNoYXJhY3RlckF0KGNvb2tpZVBhdGgubGVuZ3RoKCkpID09ICcvJykpOworCisg
ICAgICAgIGlmICghaXNQYXRoTWF0Y2hlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIENvb2tpZSByZXN1bHQoY29va2llTmFtZSwKKyAgICAgICAgICAgIGNvb2tpZVZhbHVlLAor
ICAgICAgICAgICAgY29va2llRG9tYWluLAorICAgICAgICAgICAgY29va2llUGF0aCwKKyAgICAg
ICAgICAgIDAsCisgICAgICAgICAgICBjb29raWVFeHBpcmVzLAorICAgICAgICAgICAgY29va2ll
SHR0cE9ubHksCisgICAgICAgICAgICBjb29raWVTZWN1cmUsCisgICAgICAgICAgICBjb29raWVT
ZXNzaW9uLAorICAgICAgICAgICAgU3RyaW5nKCksCisgICAgICAgICAgICBVUkwoKSwKKyAgICAg
ICAgICAgIFZlY3Rvcjx1aW50MTZfdD4oKSk7CisKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVz
dWx0KTsKKyAgICB9CisgICAgcHN0bXQtPmZpbmFsaXplKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworYm9vbCBDb29raWVKYXJEQjo6aGFzSHR0cE9ubHlDb29raWUoY29uc3QgU3RyaW5nJiBu
YW1lLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFNR
TGl0ZVN0YXRlbWVudCogc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRlbWVudChDSEVDS19FWElT
VFNfSFRUUE9OTFlfQ09PS0lFX1NRTCk7CisgICAgQVNTRVJUKHN0YXRlbWVudCk7CisKKyAgICBz
dGF0ZW1lbnQtPmJpbmRUZXh0KDEsIG5hbWUpOworICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwg
ZG9tYWluKTsKKyAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIHBhdGgpOworCisgICAgcmV0dXJu
IHN0YXRlbWVudC0+c3RlcCgpID09IFNRTElURV9ST1c7Cit9CisKKworaW50IENvb2tpZUphckRC
OjpzZXRDb29raWUoY29uc3QgQ29va2llJiBjb29raWUpCit7CisgICAgaW50IHJldCA9IDA7Cisg
ICAgaWYgKCFjb29raWUuc2Vzc2lvbiAmJiAoY29va2llLmV4cGlyZXMgPCA6OnRpbWUoMCkpKQor
ICAgICAgICByZXQgPSBkZWxldGVDb29raWVJbnRlcm5hbChjb29raWUubmFtZSwgY29va2llLmRv
bWFpbiwgY29va2llLnBhdGgpOworICAgIGVsc2UgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQq
IHN0YXRlbWVudCA9IGdldFByZXBhcmVTdGF0ZW1lbnQoU0VUX0NPT0tJRV9TUUwpOworICAgICAg
ICBBU1NFUlQoc3RhdGVtZW50KTsKKworICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGhhdmUg
c29tZSBldmljdGlvbiBwb2xpY3kgd2hlbiBhIGRvbWFpbiBnb2VzIG92ZXIgTUFYX0NPT0tJRV9Q
RVJfRE9NQUlOCisKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29raWUubmFtZSk7
CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLnZhbHVlKTsKKyAgICAgICAg
c3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29raWUuZG9tYWluKTsKKyAgICAgICAgc3RhdGVtZW50
LT5iaW5kVGV4dCg0LCBjb29raWUucGF0aCk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZEludDY0
KDUsIGNvb2tpZS5zZXNzaW9uID8gMCA6IChpbnQ2NF90KWNvb2tpZS5leHBpcmVzKTsKKyAgICAg
ICAgc3RhdGVtZW50LT5iaW5kSW50KDYsIGNvb2tpZS52YWx1ZS5sZW5ndGgoKSk7CisgICAgICAg
IHN0YXRlbWVudC0+YmluZEludCg3LCBjb29raWUuc2Vzc2lvbiA/IDEgOiAwKTsKKyAgICAgICAg
c3RhdGVtZW50LT5iaW5kSW50KDgsIGNvb2tpZS5odHRwT25seSA/IDEgOiAwKTsKKyAgICAgICAg
c3RhdGVtZW50LT5iaW5kSW50KDksIGNvb2tpZS5zZWN1cmUgPyAxIDogMCk7CisKKyAgICAgICAg
cmV0ID0gc3RhdGVtZW50LT5zdGVwKCk7CisgICAgfQorICAgIEFTU0VSVChjaGVja1NRTGl0ZVJl
dHVybkNvZGUocmV0LCBTUUxJVEVfRE9ORSkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50
IENvb2tpZUphckRCOjpzZXRDb29raWUoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYg
Y29va2llLCBib29sIGZyb21KYXZhU2NyaXB0KQoreworICAgIGlmICghaXNFbmFibGVkKCkgfHwg
IW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICh1cmwu
aXNFbXB0eSgpIHx8IGNvb2tpZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAg
IFVSTCB1cmxPYmooUGFyc2VkVVJMU3RyaW5nLCB1cmwpOworICAgIFN0cmluZyBob3N0KHVybE9i
ai5ob3N0KCkpOworICAgIFN0cmluZyBwYXRoKHVybE9iai5wYXRoKCkpOworCisgICAgQ29va2ll
IGNvb2tpZU9iajsKKyAgICBpZiAoIUNvb2tpZVV0aWw6OnBhcnNlQ29va2llSGVhZGVyKGNvb2tp
ZSwgaG9zdCwgY29va2llT2JqKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGNvb2tp
ZU9iai5kb21haW4uaXNFbXB0eSgpKQorICAgICAgICBjb29raWVPYmouZG9tYWluID0gU3RyaW5n
KGhvc3QpOworCisgICAgaWYgKGNvb2tpZU9iai5wYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgY29v
a2llT2JqLnBhdGggPSBTdHJpbmcocGF0aCk7CisKKyAgICAvLyBGSVhNRTogTmVlZCB0byBjaGVj
ayB0aGF0IGEgZG9tYWluIGRvZXNuJ3QgYSBzZXQgY29va2llIGZvciBhIHRsZCB3aGVuIHdpbmNh
aXJvIHN1cHBvcnRzIFBTTAorCisgICAgaWYgKGZyb21KYXZhU2NyaXB0ICYmIGNvb2tpZU9iai5o
dHRwT25seSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGZyb21KYXZhU2NyaXB0ICYm
IGhhc0h0dHBPbmx5Q29va2llKGNvb2tpZU9iai5uYW1lLCBjb29raWVPYmouZG9tYWluLCBjb29r
aWVPYmoucGF0aCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBzZXRDb29raWUo
Y29va2llT2JqKTsKK30KKworaW50IENvb2tpZUphckRCOjpkZWxldGVDb29raWUoY29uc3QgU3Ry
aW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBpZiAoIWlzRW5hYmxlZCgpIHx8
ICFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTdHJpbmcg
dXJsQ29waWVkID0gU3RyaW5nKHVybCk7CisgICAgaWYgKHVybENvcGllZC5zdGFydHNXaXRoKCcu
JykpCisgICAgICAgIHVybENvcGllZC5yZW1vdmUoMCwgMSk7CisKKyAgICBVUkwgdXJsT2JqKFBh
cnNlZFVSTFN0cmluZywgdXJsQ29waWVkKTsKKyAgICBpZiAodXJsT2JqLmlzVmFsaWQoKSkgewor
ICAgICAgICBTdHJpbmcgaG9zdFN0cih1cmxPYmouaG9zdCgpKTsKKyAgICAgICAgU3RyaW5nIHBh
dGhTdHIodXJsT2JqLnBhdGgoKSk7CisgICAgICAgIGludCByZXQgPSBkZWxldGVDb29raWVJbnRl
cm5hbChuYW1lLCBob3N0U3RyLCBwYXRoU3RyKTsKKyAgICAgICAgQVNTRVJUKGNoZWNrU1FMaXRl
UmV0dXJuQ29kZShyZXQsIFNRTElURV9ET05FKSk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAg
ICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBDb29raWVKYXJEQjo6ZGVsZXRlQ29va2ll
SW50ZXJuYWwoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3Qg
U3RyaW5nJiBwYXRoKQoreworICAgIFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50OworICAgIGlm
ICghcGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRl
bWVudChERUxFVEVfQ09PS0lFX0JZX05BTUVfRE9NQUlOX1BBVEhfU1FMKTsKKyAgICAgICAgQVNT
RVJUKHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMSwgbmFtZSk7Cisg
ICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgZG9tYWluKTsKKyAgICAgICAgc3RhdGVtZW50
LT5iaW5kVGV4dCgzLCBwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZW1lbnQgPSBn
ZXRQcmVwYXJlU3RhdGVtZW50KERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fU1FMKTsKKyAg
ICAgICAgQVNTRVJUKHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMSwg
bmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgZG9tYWluKTsKKyAgICB9CisK
KyAgICByZXR1cm4gc3RhdGVtZW50LT5zdGVwKCk7Cit9CisKK2ludCBDb29raWVKYXJEQjo6ZGVs
ZXRlQ29va2llcyhjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICAvLyBOT1QgSU1QTEVNRU5URUQK
KyAgICAvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGFwcGxpY2F0aW9u
IGNhbGxzIFdLQ29va2llTWFuYWdlckRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZSgpIGluIFdLQ29v
a2llTWFuYWdlci5oLgorICAgIHJldHVybiAwOworfQorCitpbnQgQ29va2llSmFyREI6OmRlbGV0
ZUFsbENvb2tpZXMoKQoreworICAgIGlmICghaXNFbmFibGVkKCkgfHwgIW1fZGF0YWJhc2UuaXNP
cGVuKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBleGVjdXRlU2ltcGxlU3Fs
KERFTEVURV9BTExfQ09PS0lFX1NRTCk7Cit9CisKK3ZvaWQgQ29va2llSmFyREI6OmNyZWF0ZVBy
ZXBhcmVTdGF0ZW1lbnQoY29uc3QgY2hhciogc3FsKQoreworICAgIGF1dG8gc3RhdGVtZW50ID0g
c3RkOjptYWtlX3VuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGF0YWJhc2UsIHNxbCk7CisgICAg
aW50IHJldCA9IHN0YXRlbWVudC0+cHJlcGFyZSgpOworICAgIEFTU0VSVChyZXQgPT0gU1FMSVRF
X09LKTsKKyAgICBtX3N0YXRlbWVudHMuYWRkKFN0cmluZyhzcWwpLCBXVEZNb3ZlKHN0YXRlbWVu
dCkpOworfQorCitTUUxpdGVTdGF0ZW1lbnQqIENvb2tpZUphckRCOjpnZXRQcmVwYXJlU3RhdGVt
ZW50KGNvbnN0IGNoYXIqIHNxbCkKK3sKKyAgICBjb25zdCBhdXRvJiBzdGF0ZW1lbnQgPSBtX3N0
YXRlbWVudHMuZ2V0KFN0cmluZyhzcWwpKTsKKyAgICBBU1NFUlQoc3RhdGVtZW50KTsKKyAgICBz
dGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0dXJuIHN0YXRlbWVudDsKK30KKworaW50IENvb2tp
ZUphckRCOjpleGVjdXRlU2ltcGxlU3FsKGNvbnN0IGNoYXIqIHNxbCwgYm9vbCBpZ25vcmVFcnJv
cikKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsIHNxbCk7Cisg
ICAgaW50IHJldCA9IHN0YXRlbWVudC5wcmVwYXJlQW5kU3RlcCgpOworICAgIHN0YXRlbWVudC5m
aW5hbGl6ZSgpOworCisgICAgQVNTRVJUKGNoZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElU
RV9PSykKKyAgICAgICAgfHwgY2hlY2tTUUxpdGVSZXR1cm5Db2RlKHJldCwgU1FMSVRFX0RPTkUp
CisgICAgICAgIHx8IGNoZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElURV9ST1cpCisgICAg
ICAgIHx8IGlnbm9yZUVycm9yKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llSmFyREIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
b29raWVKYXJEQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZWMz
MDliZjU2YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9Db29raWVKYXJEQi5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UK
KworI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNlLmgiCisjaW5j
bHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNs
dWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvT3B0aW9uYWwuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIENvb2tpZUphckRCIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDb29raWVKYXJEQik7
CisKK3B1YmxpYzoKKyAgICBib29sIGlzRW5hYmxlZCgpOworICAgIHZvaWQgc2V0RW5hYmxlZChi
b29sKTsKKworICAgIGJvb2wgc2VhcmNoQ29va2llcyhjb25zdCBTdHJpbmcmIHJlcXVlc3RVcmws
IGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIGh0dHBPbmx5LCBjb25zdCBzdGQ6Om9wdGlvbmFs
PGJvb2w+JiBzZWN1cmUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIHNlc3Npb24sIFZlY3Rv
cjxDb29raWU+JiByZXN1bHRzKTsKKyAgICBpbnQgc2V0Q29va2llKGNvbnN0IFN0cmluZyYgdXJs
LCBjb25zdCBTdHJpbmcmIGNvb2tpZSwgYm9vbCBmcm9tSmF2YVNjcmlwdCk7CisgICAgaW50IHNl
dENvb2tpZShjb25zdCBDb29raWUmKTsKKworICAgIGludCBkZWxldGVDb29raWUoY29uc3QgU3Ry
aW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgaW50IGRlbGV0ZUNvb2tpZXMoY29u
c3QgU3RyaW5nJiB1cmwpOworICAgIGludCBkZWxldGVBbGxDb29raWVzKCk7CisKKyAgICBDb29r
aWVKYXJEQihjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCk7CisgICAgfkNvb2tpZUphckRCKCk7
CisKK3ByaXZhdGU6CisKKyAgICBib29sIG1fY29va2llRW5hYmxlIHt0cnVlfTsKKyAgICBTdHJp
bmcgbV9kYXRhYmFzZVBhdGg7CisKKyAgICBib29sIG1fZGV0ZWN0ZWREYXRhYmFzZUNvcnJ1cHRp
b24ge2ZhbHNlfTsKKworICAgIGJvb2wgaXNPbk1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIChtX2Rh
dGFiYXNlUGF0aCA9PSAiOm9ubWVtb3J5OiIpOyB9OworCisgICAgYm9vbCBvcGVuRGF0YWJhc2Uo
KTsKKyAgICB2b2lkIGNsb3NlRGF0YWJhc2UoKTsKKworICAgIGJvb2wgY2hlY2tTUUxpdGVSZXR1
cm5Db2RlKGludCBhY3R1YWwsIGludCBleHBlY3RlZCk7CisgICAgdm9pZCBmbGFnRGF0YWJhc2VD
b3JydXB0aW9uKCk7CisgICAgYm9vbCBjaGVja0RhdGFiYXNlQ29ycnVwdGlvbkFuZFJlbW92ZUlm
TmVlZGVkKCk7CisgICAgU3RyaW5nIGdldENvcnJ1cHRpb25NYXJrZXJQYXRoKCkgY29uc3Q7CisK
KyAgICBib29sIGNoZWNrRGF0YWJhc2VWYWxpZGl0eSgpOworICAgIHZvaWQgZGVsZXRlQWxsRGF0
YWJhc2VGaWxlcygpOworCisgICAgdm9pZCBjcmVhdGVQcmVwYXJlU3RhdGVtZW50KGNvbnN0IGNo
YXIqIHNxbCk7CisgICAgU1FMaXRlU3RhdGVtZW50KiBnZXRQcmVwYXJlU3RhdGVtZW50KGNvbnN0
IGNoYXIqIHNxbCk7CisgICAgaW50IGV4ZWN1dGVTaW1wbGVTcWwoY29uc3QgY2hhciogc3FsLCBi
b29sIGlnbm9yZUVycm9yID0gZmFsc2UpOworCisgICAgaW50IGRlbGV0ZUNvb2tpZUludGVybmFs
KGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0IFN0cmluZyYg
cGF0aCk7CisgICAgYm9vbCBoYXNIdHRwT25seUNvb2tpZShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAgU1FMaXRlRGF0
YWJhc2UgbV9kYXRhYmFzZTsKKyAgICBIYXNoTWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRyPFNR
TGl0ZVN0YXRlbWVudD4+IG1fc3RhdGVtZW50czsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29r
aWVVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVV
dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTU1ZTVkMTUw
ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llVXRpbC5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQ29va2llVXRpbC5oIgorCisjaWYgVVNFKENVUkwpCisKKyNpbmNsdWRl
ICJDb29raWUuaCIKKworI2luY2x1ZGUgPHd0Zi9EYXRlTWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9P
cHRpb25hbC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisvKiBUaGlzIGlz
IHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHdlIGFjY2VwdCBmb3IgYSBjb29raWUgbGluZS4gUkZD
IDIxMDkKKyAgIHNlY3Rpb24gNi4zIHNheXM6CisKKyAgICJhdCBsZWFzdCA0MDk2IGJ5dGVzIHBl
ciBjb29raWUgKGFzIG1lYXN1cmVkIGJ5IHRoZSBzaXplIG9mIHRoZSBjaGFyYWN0ZXJzCisgICB0
aGF0IGNvbXByaXNlIHRoZSBjb29raWUgbm9uLXRlcm1pbmFsIGluIHRoZSBzeW50YXggZGVzY3Jp
cHRpb24gb2YgdGhlCisgICBTZXQtQ29va2llIGhlYWRlcikiCisqLworCisjZGVmaW5lIE1BWF9D
T09LSUVfTElORSA1MDAwCisjZGVmaW5lIE1BWF9DT09LSUVfTElORV9UWFQgIjQ5OTkiCisKKyNk
ZWZpbmUgTUFYX05BTUUgMTAyNAorI2RlZmluZSBNQVhfTkFNRV9UWFQgIjEwMjMiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIENvb2tpZVV0aWwgeworCitib29sIGlzSVBBZGRy
ZXNzKGNvbnN0IFN0cmluZyYgaG9zdG5hbWUpCit7CisgICAgLy8gQXNzdW1pbmcgdGhhdCBob3N0
cyBlbmRpbmcgaW4gYSBkaWdpdCBhcmUgSVAgQWRkcmVzc2VzCisgICAgcmV0dXJuICFob3N0bmFt
ZS5pc0VtcHR5KCkgJiYgaXNBU0NJSURpZ2l0KGhvc3RuYW1lW2hvc3RuYW1lLmxlbmd0aCgpIC0g
MV0pOworfQorCitib29sIGRvbWFpbk1hdGNoKGNvbnN0IFN0cmluZyYgY29va2llRG9tYWluLCBj
b25zdCBTdHJpbmcmIGhvc3QpCit7CisgICAgc2l6ZV90IGluZGV4ID0gaG9zdC5maW5kKGNvb2tp
ZURvbWFpbik7CisKKyAgICBib29sIHRhaWxNYXRjaCA9IChpbmRleCAhPSBXVEY6Om5vdEZvdW5k
ICYmIGluZGV4ICsgY29va2llRG9tYWluLmxlbmd0aCgpID09IGhvc3QubGVuZ3RoKCkpOworCisg
ICAgLy8gQ2hlY2sgaWYgaG9zdCBlcXVhbHMgY29va2llIGRvbWFpbi4KKyAgICBpZiAodGFpbE1h
dGNoICYmICFpbmRleCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBDaGVjayBpZiBo
b3N0IGlzIGEgc3ViZG9tYWluIG9mIHRoZSBkb21haW4gaW4gdGhlIGNvb2tpZS4KKyAgICAvLyBD
dXJsIHVzZXMgYSAnLicgaW4gZnJvbnQgb2YgZG9tYWlucyB0byBpbmRpY2F0ZSBpdCdzIHZhbGlk
IG9uIHN1YmRvbWFpbnMuCisgICAgaWYgKHRhaWxNYXRjaCAmJiBpbmRleCA+IDAgJiYgaG9zdFtp
bmRleF0gPT0gJy4nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENoZWNrIHRoZSBz
cGVjaWFsIGNhc2Ugd2hlcmUgaG9zdCBlcXVhbHMgdGhlIGNvb2tpZSBkb21haW4sIGV4Y2VwdCBm
b3IgYSBsZWFkaW5nICcuJyBpbiB0aGUgY29va2llIGRvbWFpbi4KKyAgICAvLyBFLmcuIGNvb2tp
ZSBkb21haW4gaXMgLmFwcGxlLmNvbSBhbmQgaG9zdCBpcyBhcHBsZS5jb20uCisgICAgaWYgKGNv
b2tpZURvbWFpblswXSA9PSAnLicgJiYgY29va2llRG9tYWluLmZpbmQoaG9zdCkgPT0gMSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBzdGQ6
Om9wdGlvbmFsPGRvdWJsZT4gcGFyc2VFeHBpcmVzKGNvbnN0IGNoYXIqIGV4cGlyZXMpCit7Cisg
ICAgZG91YmxlIHRtcCA9IFdURjo6cGFyc2VEYXRlRnJvbU51bGxUZXJtaW5hdGVkQ2hhcmFjdGVy
cyhleHBpcmVzKTsKKyAgICBpZiAoaXNuYW4odG1wKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKwor
ICAgIHJldHVybiBzdGQ6Om9wdGlvbmFsPGRvdWJsZT4ge3RtcCAvIFdURjo6bXNQZXJTZWNvbmR9
OworfQorCitzdGF0aWMgdm9pZCBwYXJzZUNvb2tpZUF0dHJpYnV0ZXMoY29uc3QgU3RyaW5nJiBh
dHRyaWJ1dGUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBib29sJiBoYXNNYXhBZ2UsIENvb2tpZSYg
cmVzdWx0KQoreworICAgIHNpemVfdCBhc3NpZ25tZW50UG9zaXRpb24gPSBhdHRyaWJ1dGUuZmlu
ZCgnPScpOworCisgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7CisgICAgU3RyaW5nIGF0dHJpYnV0
ZVZhbHVlOworCisgICAgaWYgKGFzc2lnbm1lbnRQb3NpdGlvbiAhPSBub3RGb3VuZCkgeworICAg
ICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLnN1YnN0cmluZygwLCBhc3NpZ25tZW50UG9z
aXRpb24pLnN0cmlwV2hpdGVTcGFjZSgpOworICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJp
YnV0ZS5zdWJzdHJpbmcoYXNzaWdubWVudFBvc2l0aW9uICsgMSkuc3RyaXBXaGl0ZVNwYWNlKCk7
CisgICAgfSBlbHNlCisgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuc3RyaXBXaGl0
ZVNwYWNlKCk7CisKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1l
LCAiaHR0cG9ubHkiKSkKKyAgICAgICAgcmVzdWx0Lmh0dHBPbmx5ID0gdHJ1ZTsKKyAgICBlbHNl
IGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJzZWN1cmUiKSkKKyAg
ICAgICAgcmVzdWx0LnNlY3VyZSA9IHRydWU7CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0FT
Q0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAiZG9tYWluIikpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0
ZVZhbHVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBFbmZv
cmNlIGEgZG90IGNoYXJhY3RlciBwcmVmaXggdG8gaG9zdG5hbWVzIHdoaWNoIGFyZSBub3QgaXAg
YWRkcmVzc2VzIGFuZCBub3Qgc2luZ2xlIHZhbHVlIGhvc3RuYW1lcyBzdWNoIGFzIGxvY2FsaG9z
dAorICAgICAgICBpZiAoIWlzSVBBZGRyZXNzKGF0dHJpYnV0ZVZhbHVlKSAmJiAhYXR0cmlidXRl
VmFsdWUuc3RhcnRzV2l0aCgnLicpICYmIGF0dHJpYnV0ZVZhbHVlLmZpbmQoJy4nKSAhPSBub3RG
b3VuZCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gIi4iICsgYXR0cmlidXRlVmFsdWU7
CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBob3N0IGNhbiBzZXQgYSBjb29raWUgZm9yIHRo
ZSBkb21haW4KKyAgICAgICAgLy8gRklYTUU6IGZpcmVmb3ggYW5kIGNocm9tZSBib3RoIGlnbm9y
ZSBjb29raWVzIHdpdGggbm8gdmFsaWQgZG9tYWluIHNldAorICAgICAgICAvLyB3ZSBjdXJyZW50
bHkgaWdub3JlIHRoZSBpbnZhbGlkIGRvbWFpbnMgYW5kIGRlZmF1bHQgdG8gdGhlIGhvc3RuYW1l
IGFzIHRoZSBkb21haW4KKyAgICAgICAgaWYgKGRvbWFpbk1hdGNoKGF0dHJpYnV0ZVZhbHVlLCBk
b21haW4pKQorICAgICAgICAgICAgcmVzdWx0LmRvbWFpbiA9IGF0dHJpYnV0ZVZhbHVlOworCisg
ICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJtYXgt
YWdlIikpIHsKKyAgICAgICAgYm9vbCBvazsKKyAgICAgICAgdGltZV90IGV4cGlyeVRpbWUgPSB0
aW1lKDApICsgYXR0cmlidXRlVmFsdWUudG9JbnQ2NCgmb2spOworICAgICAgICBpZiAob2spIHsK
KyAgICAgICAgICAgIHJlc3VsdC5leHBpcmVzID0gKGRvdWJsZSlleHBpcnlUaW1lOworICAgICAg
ICAgICAgcmVzdWx0LnNlc3Npb24gPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUg
aXMgYSBtYXgtYWdlIGF0dHJpYnV0ZSBhcyB3ZWxsIGFzIGFuIGV4cGlyZXMgYXR0cmlidXRlCisg
ICAgICAgICAgICAvLyB0aGUgcmlnaHRtb3N0IG1heC1hZ2UgYXR0cmlidXRlIHRha2VzIHByZWNl
ZGVuY2UuCisgICAgICAgICAgICBoYXNNYXhBZ2UgPSB0cnVlOworICAgICAgICB9CisgICAgfSBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJleHBpcmVzIikg
JiYgIWhhc01heEFnZSkgeworICAgICAgICBpZiAoYXV0byBleHBpcnlUaW1lID0gcGFyc2VFeHBp
cmVzKGF0dHJpYnV0ZVZhbHVlLnV0ZjgoKS5kYXRhKCkpKSB7CisgICAgICAgICAgICByZXN1bHQu
ZXhwaXJlcyA9IGV4cGlyeVRpbWUudmFsdWUoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXNzaW9u
ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdBU0NJSUNh
c2UoYXR0cmlidXRlTmFtZSwgInBhdGgiKSkgeworICAgICAgICBpZiAoIWF0dHJpYnV0ZVZhbHVl
LmlzRW1wdHkoKSAmJiBhdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKCcvJykpCisgICAgICAgICAg
ICByZXN1bHQucGF0aCA9IGF0dHJpYnV0ZVZhbHVlOworICAgIH0KK30KKworYm9vbCBwYXJzZUNv
b2tpZUhlYWRlcihjb25zdCBTdHJpbmcmIGNvb2tpZUxpbmUsIGNvbnN0IFN0cmluZyYgZG9tYWlu
LCBDb29raWUmIHJlc3VsdCkKK3sKKyAgICBpZiAoY29va2llTGluZS5sZW5ndGgoKSA+PSBNQVhf
Q09PS0lFX0xJTkUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRoaXMgQWxnb3Jp
dGhtIGlzIGJhc2VkIG9uIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgNjI2NSA1LjIgaHR0
cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIvCisKKyAgICBzaXpl
X3Qgc2VwYXJhdG9yUG9zaXRpb24gPSBjb29raWVMaW5lLmZpbmQoJzsnKTsKKworICAgIFN0cmlu
ZyBjb29raWVQYWlyID0gc2VwYXJhdG9yUG9zaXRpb24gPT0gbm90Rm91bmQgPyBjb29raWVMaW5l
IDogY29va2llTGluZS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yUG9zaXRpb24pOworCisgICAgU3Ry
aW5nIGNvb2tpZU5hbWU7CisgICAgU3RyaW5nIGNvb2tpZVZhbHVlOworICAgIHNpemVfdCBhc3Np
Z25tZW50UG9zaXRpb24gPSBjb29raWVMaW5lLmZpbmQoJz0nKTsKKworICAgIC8vIFJGQzYyNjUg
c2F5cyB0byBpZ25vcmUgY29va2llcyBwYWlycyB3aXRoIGVtcHR5IG5hbWVzIG9yIG5vIGFzc2ln
bm1lbnQgY2hhcmFjdGVyCisgICAgLy8gYnV0IGJyb3dzZXJzIHNlZW0gdG8gdHJlYXQgdGhpcyB0
eXBlIG9mIGNvb2tpZSBzdHJpbmcgYXMgdGhlIGNvb2tpZSB2YWx1ZQorICAgIGlmIChhc3NpZ25t
ZW50UG9zaXRpb24gPT0gbm90Rm91bmQpCisgICAgICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFp
cjsKKyAgICBlbHNlIHsKKyAgICAgICAgY29va2llTmFtZSA9IGNvb2tpZVBhaXIuc3Vic3RyaW5n
KDAsIGFzc2lnbm1lbnRQb3NpdGlvbik7CisgICAgICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFp
ci5zdWJzdHJpbmcoYXNzaWdubWVudFBvc2l0aW9uICsgMSk7CisgICAgfQorCisgICAgcmVzdWx0
Lm5hbWUgPSBjb29raWVOYW1lLnN0cmlwV2hpdGVTcGFjZSgpOworICAgIHJlc3VsdC52YWx1ZSA9
IGNvb2tpZVZhbHVlLnN0cmlwV2hpdGVTcGFjZSgpOworCisgICAgYm9vbCBoYXNNYXhBZ2UgPSBm
YWxzZTsKKyAgICByZXN1bHQuc2Vzc2lvbiA9IHRydWU7CisKKyAgICBWZWN0b3I8U3RyaW5nPiBj
b29raWVBdHRyaWJ1dGVzOworICAgIGNvb2tpZUxpbmUuc3BsaXQoJzsnLCB0cnVlLCBjb29raWVB
dHRyaWJ1dGVzKTsKKyAgICBmb3IgKGF1dG8gYXR0cmlidXRlIDogY29va2llQXR0cmlidXRlcykK
KyAgICAgICAgcGFyc2VDb29raWVBdHRyaWJ1dGVzKGF0dHJpYnV0ZSwgZG9tYWluLCBoYXNNYXhB
Z2UsIHJlc3VsdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ29v
a2llVXRpbAorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjI2N2ZkYzI5YTJkCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuaApAQCAt
MCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNvbnkgSW50ZXJhY3RpdmUg
RW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBDb29raWU7CisKK25hbWVzcGFjZSBD
b29raWVVdGlsIHsKKworYm9vbCBwYXJzZUNvb2tpZUhlYWRlcihjb25zdCBTdHJpbmcmIGNvb2tp
ZUxpbmUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBDb29raWUmIHJlc3VsdCk7CisKK2Jvb2wgaXNJ
UEFkZHJlc3MoY29uc3QgU3RyaW5nJiBob3N0bmFtZSk7CisKK2Jvb2wgZG9tYWluTWF0Y2goY29u
c3QgU3RyaW5nJiBjb29raWVEb21haW4sIGNvbnN0IFN0cmluZyYgaG9zdCk7CisKK30gLy8gbmFt
ZXNwYWNlIENvb2tpZVV0aWwKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKaW5kZXgg
ZDU0YjEyYzkyYzguLmE5ZDY1ZTc3ODg5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKQEAgLTQyLDM4ICs0Miw2IEBACiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RhdGljIENTdHJpbmcgY29va2llSmFyUGF0aCgpCi17
Ci0gICAgY2hhciogY29va2llSmFyUGF0aCA9IGdldGVudigiQ1VSTF9DT09LSUVfSkFSX1BBVEgi
KTsKLSAgICBpZiAoY29va2llSmFyUGF0aCkKLSAgICAgICAgcmV0dXJuIGNvb2tpZUphclBhdGg7
Ci0KLSNpZiBPUyhXSU5ET1dTKQotICAgIGNoYXIgZXhlY3V0YWJsZVBhdGhbTUFYX1BBVEhdOwot
ICAgIGNoYXIgYXBwRGF0YURpcmVjdG9yeVtNQVhfUEFUSF07Ci0gICAgY2hhciBjb29raWVKYXJG
dWxsUGF0aFtNQVhfUEFUSF07Ci0gICAgY2hhciBjb29raWVKYXJEaXJlY3RvcnlbTUFYX1BBVEhd
OwotCi0gICAgaWYgKEZBSUxFRCg6OlNIR2V0Rm9sZGVyUGF0aEEoMCwgQ1NJRExfTE9DQUxfQVBQ
REFUQSB8IENTSURMX0ZMQUdfQ1JFQVRFLCAwLCAwLCBhcHBEYXRhRGlyZWN0b3J5KSkKLSAgICAg
ICAgfHwgRkFJTEVEKDo6R2V0TW9kdWxlRmlsZU5hbWVBKDAsIGV4ZWN1dGFibGVQYXRoLCBNQVhf
UEFUSCkpKQotICAgICAgICByZXR1cm4gImNvb2tpZXMuZGF0IjsKLQotICAgIDo6UGF0aFJlbW92
ZUV4dGVuc2lvbkEoZXhlY3V0YWJsZVBhdGgpOwotICAgIExQU1RSIGV4ZWN1dGFibGVOYW1lID0g
OjpQYXRoRmluZEZpbGVOYW1lQShleGVjdXRhYmxlUGF0aCk7Ci0gICAgc3ByaW50Zl9zKGNvb2tp
ZUphckRpcmVjdG9yeSwgTUFYX1BBVEgsICIlcy8lcyIsIGFwcERhdGFEaXJlY3RvcnksIGV4ZWN1
dGFibGVOYW1lKTsKLSAgICBzcHJpbnRmX3MoY29va2llSmFyRnVsbFBhdGgsIE1BWF9QQVRILCAi
JXMvY29va2llcy5kYXQiLCBjb29raWVKYXJEaXJlY3RvcnkpOwotCi0gICAgaWYgKDo6U0hDcmVh
dGVEaXJlY3RvcnlFeEEoMCwgY29va2llSmFyRGlyZWN0b3J5LCAwKSAhPSBFUlJPUl9TVUNDRVNT
Ci0gICAgICAgICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfRklMRV9FWElTVFMKLSAgICAg
ICAgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9BTFJFQURZX0VYSVNUUykKLSAgICAgICAg
cmV0dXJuICJjb29raWVzLmRhdCI7Ci0KLSAgICByZXR1cm4gY29va2llSmFyRnVsbFBhdGg7Ci0j
ZWxzZQotICAgIHJldHVybiAiY29va2llcy5kYXQiOwotI2VuZGlmCi19Ci0KIC8vIEN1cmxDb250
ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KIAogQ3VybENvbnRleHQmIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKQpA
QCAtODMsMTAgKzUxLDggQEAgQ3VybENvbnRleHQmIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKQog
fQogCiBDdXJsQ29udGV4dDo6Q3VybENvbnRleHQoKQotOiBtX2Nvb2tpZUphckZpbGVOYW1lIHsg
Y29va2llSmFyUGF0aCgpIH0KLSwgbV9jb29raWVKYXIgeyBzdGQ6Om1ha2VfdW5pcXVlPENvb2tp
ZUphckN1cmxGaWxlU3lzdGVtPigpIH0KIHsKLSAgICBpbml0Q29va2llU2Vzc2lvbigpOworICAg
IGluaXRTaGFyZUhhbmRsZSgpOwogCiAjaWZuZGVmIE5ERUJVRwogICAgIG1fdmVyYm9zZSA9IGdl
dGVudigiREVCVUdfQ1VSTCIpOwpAQCAtMTA1LDkgKzcxLDIxIEBAIEN1cmxDb250ZXh0Ojp+Q3Vy
bENvbnRleHQoKQogI2VuZGlmCiB9CiAKK3ZvaWQgQ3VybENvbnRleHQ6OmluaXRTaGFyZUhhbmRs
ZSgpCit7CisgICAgQ1VSTCogY3VybCA9IGN1cmxfZWFzeV9pbml0KCk7CisKKyAgICBpZiAoIWN1
cmwpCisgICAgICAgIHJldHVybjsKKworICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9Q
VF9TSEFSRSwgbV9zaGFyZUhhbmRsZS5oYW5kbGUoKSk7CisKKyAgICBjdXJsX2Vhc3lfY2xlYW51
cChjdXJsKTsKK30KKwogLy8gQ29va2llID09PT09PT09PT09PT09PT09PT09PT09CiAKLXZvaWQg
Q3VybENvbnRleHQ6OmluaXRDb29raWVTZXNzaW9uKCkKK3ZvaWQgQ3VybENvbnRleHQ6OmluaXRD
b29raWVTZXNzaW9uKGNvbnN0IFN0cmluZyYgY29va2llSmFyUGF0aCkKIHsKICAgICAvLyBDdXJs
IHNhdmVzIGJvdGggcGVyc2lzdGVudCBjb29raWVzLCBhbmQgc2Vzc2lvbiBjb29raWVzIHRvIHRo
ZSBjb29raWUgZmlsZS4KICAgICAvLyBUaGUgc2Vzc2lvbiBjb29raWVzIHNob3VsZCBiZSBkZWxl
dGVkIGJlZm9yZSBzdGFydGluZyBhIG5ldyBzZXNzaW9uLgpAQCAtMTE3LDExICs5NSw5IEBAIHZv
aWQgQ3VybENvbnRleHQ6OmluaXRDb29raWVTZXNzaW9uKCkKICAgICBpZiAoIWN1cmwpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9TSEFSRSwg
bV9zaGFyZUhhbmRsZS5oYW5kbGUoKSk7Ci0KLSAgICBpZiAoIW1fY29va2llSmFyRmlsZU5hbWUu
aXNOdWxsKCkpIHsKLSAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJ
RUZJTEUsIG1fY29va2llSmFyRmlsZU5hbWUuZGF0YSgpKTsKLSAgICAgICAgY3VybF9lYXN5X3Nl
dG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUpBUiwgbV9jb29raWVKYXJGaWxlTmFtZS5kYXRhKCkp
OworICAgIGlmICghY29va2llSmFyUGF0aC5pc051bGwoKSkgeworICAgICAgICBjdXJsX2Vhc3lf
c2V0b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFRklMRSwgY29va2llSmFyUGF0aC51dGY4KCkuZGF0
YSgpKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUpBUiwg
Y29va2llSmFyUGF0aC51dGY4KCkuZGF0YSgpKTsKICAgICB9CiAKICAgICBjdXJsX2Vhc3lfc2V0
b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFU0VTU0lPTiwgMSk7CkBAIC00ODMsMTMgKzQ1OSw2IEBA
IHZvaWQgQ3VybEhhbmRsZTo6c2V0U3NsS2V5UGFzc3dvcmQoY29uc3QgY2hhciogcGFzc3dvcmQp
CiAgICAgY3VybF9lYXN5X3NldG9wdChtX2hhbmRsZSwgQ1VSTE9QVF9LRVlQQVNTV0QsIHBhc3N3
b3JkKTsKIH0KIAotdm9pZCBDdXJsSGFuZGxlOjplbmFibGVDb29raWVKYXJJZkV4aXN0cygpCi17
Ci0gICAgY29uc3QgY2hhciogY29va2llSmFyID0gQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmdl
dENvb2tpZUphckZpbGVOYW1lKCk7Ci0gICAgaWYgKGNvb2tpZUphcikKLSAgICAgICAgY3VybF9l
YXN5X3NldG9wdChtX2hhbmRsZSwgQ1VSTE9QVF9DT09LSUVKQVIsIGNvb2tpZUphcik7Ci19Ci0K
IHZvaWQgQ3VybEhhbmRsZTo6c2V0Q29va2llTGlzdChjb25zdCBjaGFyKiBjb29raWVMaXN0KQog
ewogICAgIGlmICghY29va2llTGlzdCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKaW5kZXggNDg4MDg1ZWIyZDcuLjJlYTY4M2EzNmUw
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENv
bnRleHQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENv
bnRleHQuaApAQCAtMjYsNyArMjYsNiBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkNv
b2tpZUphckN1cmwuaCIKICNpbmNsdWRlICJDdXJsU1NMSGFuZGxlLmgiCiAjaW5jbHVkZSAiVVJM
LmgiCiAKQEAgLTExMCwxMCArMTA5LDcgQEAgcHVibGljOgogCiAgICAgY29uc3QgQ3VybFNoYXJl
SGFuZGxlJiBzaGFyZUhhbmRsZSgpIHsgcmV0dXJuIG1fc2hhcmVIYW5kbGU7IH0KIAotICAgIC8v
IENvb2tpZQotICAgIGNvbnN0IGNoYXIqIGdldENvb2tpZUphckZpbGVOYW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9jb29raWVKYXJGaWxlTmFtZS5kYXRhKCk7IH0KLSAgICB2b2lkIHNldENvb2tpZUph
ckZpbGVOYW1lKGNvbnN0IGNoYXIqIGNvb2tpZUphckZpbGVOYW1lKSB7IG1fY29va2llSmFyRmls
ZU5hbWUgPSBDU3RyaW5nKGNvb2tpZUphckZpbGVOYW1lKTsgfQotICAgIENvb2tpZUphckN1cmwm
IGNvb2tpZUphcigpIHsgcmV0dXJuICptX2Nvb2tpZUphcjsgfQorICAgIHN0YXRpYyB2b2lkIGlu
aXRDb29raWVTZXNzaW9uKGNvbnN0IFN0cmluZyYgY29va2llSmFyUGF0aCk7CiAKICAgICAvLyBQ
cm94eQogICAgIGNvbnN0IFByb3h5SW5mbyYgcHJveHlJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9w
cm94eTsgfQpAQCAtMTMzLDEzICsxMjksMTEgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIFBy
b3h5SW5mbyBtX3Byb3h5OwotICAgIENTdHJpbmcgbV9jb29raWVKYXJGaWxlTmFtZTsKICAgICBD
dXJsU2hhcmVIYW5kbGUgbV9zaGFyZUhhbmRsZTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29va2ll
SmFyQ3VybD4gbV9jb29raWVKYXI7CiAgICAgQ3VybFNTTEhhbmRsZSBtX3NzbEhhbmRsZTsKIAog
ICAgIEN1cmxDb250ZXh0KCk7Ci0gICAgdm9pZCBpbml0Q29va2llU2Vzc2lvbigpOworICAgIHZv
aWQgaW5pdFNoYXJlSGFuZGxlKCk7CiAKICNpZm5kZWYgTkRFQlVHCiAgICAgRklMRSogbV9sb2dG
aWxlIHsgbnVsbHB0ciB9OwpAQCAtMjU2LDcgKzI1MCw2IEBAIHB1YmxpYzoKICAgICB2b2lkIHNl
dFNzbENlcnRUeXBlKGNvbnN0IGNoYXIqKTsKICAgICB2b2lkIHNldFNzbEtleVBhc3N3b3JkKGNv
bnN0IGNoYXIqKTsKIAotICAgIHZvaWQgZW5hYmxlQ29va2llSmFySWZFeGlzdHMoKTsKICAgICB2
b2lkIHNldENvb2tpZUxpc3QoY29uc3QgY2hhciopOwogICAgIHZvaWQgZmV0Y2hDb29raWVMaXN0
KEN1cmxTTGlzdCAmY29va2llcykgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVxdWVzdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwCmluZGV4IGUwYTgwZjQ1NWIwLi5m
M2ViZDY4ZjcxZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0N1cmxSZXF1ZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvQ3VybFJlcXVlc3QuY3BwCkBAIC0yMDAsNyArMjAwLDYgQEAgQ1VSTCogQ3VybFJlcXVl
c3Q6OnNldHVwVHJhbnNmZXIoKQogICAgIG1fY3VybEhhbmRsZS0+c2V0VGltZW91dCh0aW1lb3V0
TWlsbGlzZWNvbmRzKTsKIAogICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlUHJveHlJZkV4aXN0cygp
OwotICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlQ29va2llSmFySWZFeGlzdHMoKTsKIAogICAgIG1f
Y3VybEhhbmRsZS0+c2V0U3NsVmVyaWZ5UGVlcihDdXJsSGFuZGxlOjpWZXJpZnlQZWVyOjpFbmFi
bGUpOwogICAgIG1fY3VybEhhbmRsZS0+c2V0U3NsVmVyaWZ5SG9zdChDdXJsSGFuZGxlOjpWZXJp
ZnlIb3N0OjpTdHJpY3ROYW1lQ2hlY2spOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lvbkN1cmwuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lvbkN1cmwu
Y3BwCmluZGV4IDE3NmFlOWYyNzZmLi42YzlmNTJjOWE2NiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lvbkN1cmwuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFn
ZVNlc3Npb25DdXJsLmNwcApAQCAtMjksNiArMjksMTAgQEAKICNpZiBVU0UoQ1VSTCkKIAogI2lu
Y2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckN1cmxEYXRhYmFzZS5oIgorI2lu
Y2x1ZGUgIkNvb2tpZUphckRCLmgiCisjaW5jbHVkZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRl
ICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiTmV0d29ya2luZ0NvbnRleHQuaCIKICNpbmNsdWRl
ICJSZXNvdXJjZUhhbmRsZS5oIgogCkBAIC0zNywxMCArNDEsMzggQEAKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCitzdGF0aWMgU3RyaW5nIGRlZmF1bHRDb29raWVKYXJQYXRoKCkKK3sKKyNpZiBF
TkFCTEUoQ1VSTF9DT09LSUVfU1RPUkFHRSkKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVmYXVs
dEZpbGVOYW1lID0gImNvb2tpZXMuZGF0IjsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGNoYXIq
IGRlZmF1bHRGaWxlTmFtZSA9ICJjb29raWUuamFyLmRiIjsKKyNlbmRpZgorICAgIGNoYXIqIGNv
b2tpZUphclBhdGggPSBnZXRlbnYoIkNVUkxfQ09PS0lFX0pBUl9QQVRIIik7CisgICAgaWYgKGNv
b2tpZUphclBhdGgpCisgICAgICAgIHJldHVybiBjb29raWVKYXJQYXRoOworCisgICAgU3RyaW5n
IGNvb2tpZUphckRpcmVjdG9yeSA9IEZpbGVTeXN0ZW06OmxvY2FsVXNlclNwZWNpZmljU3RvcmFn
ZURpcmVjdG9yeSgpOworCisgICAgaWYgKCFGaWxlU3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMo
Y29va2llSmFyRGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWxlTmFtZTsKKwor
ICAgIHJldHVybiBGaWxlU3lzdGVtOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoY29va2llSmFy
RGlyZWN0b3J5LCBkZWZhdWx0RmlsZU5hbWUpOworfQorCiBOZXR3b3JrU3RvcmFnZVNlc3Npb246
Ok5ldHdvcmtTdG9yYWdlU2Vzc2lvbihQQUw6OlNlc3Npb25JRCBzZXNzaW9uSUQsIE5ldHdvcmtp
bmdDb250ZXh0KiBjb250ZXh0KQogICAgIDogbV9zZXNzaW9uSUQoc2Vzc2lvbklEKQogICAgICwg
bV9jb250ZXh0KGNvbnRleHQpCisjaWYgRU5BQkxFKENVUkxfQ09PS0lFX1NUT1JBR0UpCisgICAg
LCBtX2Nvb2tpZVN0b3JhZ2Uoc3RkOjptYWtlX3VuaXF1ZTxDb29raWVKYXJDdXJsRmlsZVN5c3Rl
bT4oKSkKKyNlbHNlCisgICAgLCBtX2Nvb2tpZURhdGFiYXNlKHN0ZDo6bWFrZV91bmlxdWU8Q29v
a2llSmFyREI+KGRlZmF1bHRDb29raWVKYXJQYXRoKCkpKQorICAgICwgbV9jb29raWVTdG9yYWdl
KHN0ZDo6bWFrZV91bmlxdWU8Q29va2llSmFyQ3VybERhdGFiYXNlPigpKQorI2VuZGlmCiB7Cisj
aWYgRU5BQkxFKENVUkxfQ09PS0lFX1NUT1JBR0UpCisgICAgQ3VybENvbnRleHQ6OmluaXRDb29r
aWVTZXNzaW9uKGRlZmF1bHRDb29raWVKYXJQYXRoKCkpOworI2VuZGlmCiB9CiAKIE5ldHdvcmtT
dG9yYWdlU2Vzc2lvbjo6fk5ldHdvcmtTdG9yYWdlU2Vzc2lvbigpCkBAIC03NiwxMiArMTA4LDEy
IEBAIHZvaWQgTmV0d29ya1N0b3JhZ2VTZXNzaW9uOjpzd2l0Y2hUb05ld1Rlc3RpbmdTZXNzaW9u
KCkKICAgICAvLyBGSVhNRTogSW1wbGVtZW50IGZvciBXZWJLaXQgdG8gdXNlLgogfQogCi12b2lk
IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0Q29va2llcyhjb25zdCBWZWN0b3I8Q29va2llPiYs
IGNvbnN0IFVSTCYsIGNvbnN0IFVSTCYpCit2b2lkIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0
Q29va2llcyhjb25zdCBWZWN0b3I8Q29va2llPiYgY29va2llcywgY29uc3QgVVJMJiwgY29uc3Qg
VVJMJikKIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50IGZvciBXZWJLaXQgdG8gdXNlLgogfQog
Ci12b2lkIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0Q29va2llKGNvbnN0IENvb2tpZSYpCit2
b2lkIE5ldHdvcmtTdG9yYWdlU2Vzc2lvbjo6c2V0Q29va2llKGNvbnN0IENvb2tpZSYgY29va2ll
KQogewogICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgZm9yIFdlYktpdCB0byB1c2UuCiB9CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVDdXJsRGVsZWdhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcAppbmRleCA1MTQ5MzE2MTRjZC4uYjM4Yzkw
MGM1ZGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9S
ZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcApAQCAtMzMsMTAg
KzMzLDEyIEBACiAjaWYgVVNFKENVUkwpCiAKICNpbmNsdWRlICJBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckN1cmwuaCIKICNpbmNsdWRlICJDcmVkZW50aWFs
U3RvcmFnZS5oIgogI2luY2x1ZGUgIkN1cmxDYWNoZU1hbmFnZXIuaCIKICNpbmNsdWRlICJDdXJs
UmVxdWVzdC5oIgogI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCisjaW5jbHVkZSAiTmV0d29ya1N0
b3JhZ2VTZXNzaW9uLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgogI2lu
Y2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgpAQCAtMTkw
LDYgKzE5MiwyMCBAQCB2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjdXJsRGlkU2Vu
ZERhdGEodW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzU2VudCwgdQogICAgIG1faGFuZGxlLT5jbGll
bnQoKS0+ZGlkU2VuZERhdGEobV9oYW5kbGUsIGJ5dGVzU2VudCwgdG90YWxCeXRlc1RvQmVTZW50
KTsKIH0KIAorc3RhdGljIHZvaWQgaGFuZGxlQ29va2llSGVhZGVycyhjb25zdCBDdXJsUmVzcG9u
c2UmIHJlc3BvbnNlKQoreworICAgIHN0YXRpYyBjb25zdCBhdXRvIHNldENvb2tpZUhlYWRlciA9
ICJzZXQtY29va2llOiAiOworCisgICAgYXV0byYgZGVmYXVsdFN0b3JhZ2VTZXNzaW9uID0gTmV0
d29ya1N0b3JhZ2VTZXNzaW9uOjpkZWZhdWx0U3RvcmFnZVNlc3Npb24oKTsKKyAgICBDb29raWVK
YXJDdXJsJiBjb29raWVKYXIgPSBkZWZhdWx0U3RvcmFnZVNlc3Npb24uY29va2llU3RvcmFnZSgp
OworICAgIGZvciAoYXV0byBoZWFkZXIgOiByZXNwb25zZS5oZWFkZXJzKSB7CisgICAgICAgIGlm
IChoZWFkZXIuc3RhcnRzV2l0aElnbm9yaW5nQVNDSUlDYXNlKHNldENvb2tpZUhlYWRlcikpIHsK
KyAgICAgICAgICAgIFN0cmluZyBzZXRDb29raWVTdHJpbmcgPSBoZWFkZXIucmlnaHQoaGVhZGVy
Lmxlbmd0aCgpIC0gc3RybGVuKHNldENvb2tpZUhlYWRlcikpOworICAgICAgICAgICAgY29va2ll
SmFyLnNldENvb2tpZXNGcm9tSFRUUFJlc3BvbnNlKGRlZmF1bHRTdG9yYWdlU2Vzc2lvbiwgcmVz
cG9uc2UudXJsLCBzZXRDb29raWVTdHJpbmcpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lk
IFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjdXJsRGlkUmVjZWl2ZVJlc3BvbnNlKGNvbnN0
IEN1cmxSZXNwb25zZSYgcmVjZWl2ZWRSZXNwb25zZSkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOwpAQCAtMjAzLDYgKzIxOSw4IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdh
dGU6OmN1cmxEaWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgQ3VybFJlc3BvbnNlJiByZWNlCiAgICAg
aWYgKG1fY3VybFJlcXVlc3QpCiAgICAgICAgIG1faGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX3Jl
c3BvbnNlLnNldERlcHJlY2F0ZWROZXR3b3JrTG9hZE1ldHJpY3MobV9jdXJsUmVxdWVzdC0+Z2V0
TmV0d29ya0xvYWRNZXRyaWNzKCkpOwogCisgICAgaGFuZGxlQ29va2llSGVhZGVycyhyZWNlaXZl
ZFJlc3BvbnNlKTsKKwogICAgIGlmIChyZXNwb25zZSgpLnNob3VsZFJlZGlyZWN0KCkpIHsKICAg
ICAgICAgd2lsbFNlbmRSZXF1ZXN0KCk7CiAgICAgICAgIHJldHVybjsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>332865</attachid>
            <date>2018-02-01 02:49:29 -0800</date>
            <delta_ts>2018-02-01 03:10:00 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>174942.diff</filename>
            <type>text/plain</type>
            <size>71572</size>
            <attacher name="Christopher Reid">chris.reid</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBkNTliNWFmZTYyZS4uNjU1YWI3ZjE2ZmEgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzMyBAQAorMjAxOC0wMi0wMSAgQ2hyaXN0b3BoZXIgUmVpZCAgPGNocmlzLnJlaWRAc29u
eS5jb20+CisKKyAgICAgICAgW0N1cmxdIFVzZSBTUUxpdGUgZGF0YWJhc2UgaW4gY29va2llIGph
ciBpbXBsZW1lbnRhdGlvbiBmb3IgQ3VybCBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIFNldC1Db29raWUgaXMgYWxyZWFk
eSB0ZXN0ZWQgaW4gTGF5b3V0IHRlc3RzLgorCisgICAgICAgIEFkZGluZyBhbiBpbml0aWFsIFNR
TGl0ZSBDb29raWVKYXIgaW1wbGVtZW50YXRpb24gdG8gdGhlIGN1cmwgbmV0d29yayBsYXllci4K
KyAgICAgICAgV2ViQ29yZSB3aWxsIG5vdyBwYXJzZSBhbmQgaGFuZGxlIGJvdGggSFRUUCBhbmQg
RE9NIGNvb2tpZXMgaW5zdGVhZCBvZiB1c2luZyBsaWJjdXJsLgorICAgICAgICBUaGlzIGN1cnJl
bnRseSBzdXBwb3J0cyBjb29raWUgc3RvcmFnZSBhbmQgcmV0cmlldmFsLgorICAgICAgICBDb29r
aWUgZGVsZXRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4gCisKKyAgICAgICAgKiBwbGF0Zm9y
bS9DdXJsLmNtYWtlOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvTmV0d29ya1N0b3JhZ2VT
ZXNzaW9uLmg6IEFkZGVkIGNvb2tpZURCIHN0b3JhZ2UgaW4gY3VybC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHA6IFJlbW92ZWQgdGhlIG9sZCBjdXJs
IGNvb2tpZSBoYW5kbGluZy4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2ll
SmFyQ3VybC5oOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJs
RGF0YWJhc2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29v
a2llSmFyQ3VybERhdGFiYXNlLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJEQi5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJEQi5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llVXRpbC5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Db29raWVVdGlsLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9D
dXJsQ29udGV4dC5jcHA6IFJlbW92ZWQgdGhlIG9sZCBjdXJsIGNvb2tpZSBoYW5kbGluZy4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwOiBBZGRlZCBoYW5kbGVycyBmb3Ig
SFRUUCByZXNwb25zZSBjb29raWVzLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9O
ZXR3b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuY3BwOgorCiAyMDE4LTAxLTI2ICBBbnRv
aW5lIFF1aW50ICA8Z3Jhb3V0c0BhcHBsZS5jb20+CiAKICAgICAgICAgW1dlYiBBbmltYXRpb25z
XSBEaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIG9taXR0ZWQgYW5kIGEgbnVsbCB0aW1lbGluZSBhcmd1
bWVudCB0byB0aGUgQW5pbWF0aW9uIGNvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5j
bWFrZQppbmRleCBjZGFlZjViZjc0YS4uNzNjMDE0ZjE1YzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Q3VybC5jbWFrZQpAQCAtNSw3ICs1LDEwIEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfSU5DTFVERV9E
SVJFQ1RPUklFUwogbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAgICAgcGxhdGZvcm0vbmV0
d29yay9jdXJsL0F1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ3VybC5jcHAKICAgICBwbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q29va2llSmFyQ3VybERhdGFiYXNlLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29r
aWVKYXJEQi5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llU3RvcmFnZUN1cmwu
Y3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuY3BwCiAgICAgcGxhdGZv
cm0vbmV0d29yay9jdXJsL0NyZWRlbnRpYWxTdG9yYWdlQ3VybC5jcHAKICAgICBwbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybENhY2hlRW50cnkuY3BwCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxDYWNoZU1hbmFnZXIuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL05ldHdvcmtTdG9yYWdlU2Vzc2lvbi5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9OZXR3b3JrU3RvcmFnZVNlc3Npb24uaAppbmRleCBmZDBiNmViYzQxOC4uN2Zi
OWM3NGIyYTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvTmV0
d29ya1N0b3JhZ2VTZXNzaW9uLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9OZXR3b3JrU3RvcmFnZVNlc3Npb24uaApAQCAtNDMsNiArNDMsMTIgQEAKIHR5cGVkZWYgc3Ry
dWN0IF9Tb3VwQ29va2llSmFyIFNvdXBDb29raWVKYXI7CiAjZW5kaWYKIAorI2lmIFVTRShDVVJM
KQorI2luY2x1ZGUgIkNvb2tpZUphckN1cmwuaCIKKyNpbmNsdWRlICJDb29raWVKYXJEQi5oIgor
I2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KKyNlbmRpZgorCiAjaWZkZWYgX19PQkpDX18KICNp
bmNsdWRlIDxvYmpjL29iamMuaD4KICNlbmRpZgpAQCAtMTE1LDYgKzEyMSwxNCBAQCBwdWJsaWM6
CiAgICAgdm9pZCBzZXRDb29raWVPYnNlcnZlckhhbmRsZXIoRnVuY3Rpb248dm9pZCAoKT4mJik7
CiAgICAgdm9pZCBnZXRDcmVkZW50aWFsRnJvbVBlcnNpc3RlbnRTdG9yYWdlKGNvbnN0IFByb3Rl
Y3Rpb25TcGFjZSYsIEZ1bmN0aW9uPHZvaWQgKENyZWRlbnRpYWwmJik+IGNvbXBsZXRpb25IYW5k
bGVyKTsKICAgICB2b2lkIHNhdmVDcmVkZW50aWFsVG9QZXJzaXN0ZW50U3RvcmFnZShjb25zdCBQ
cm90ZWN0aW9uU3BhY2UmLCBjb25zdCBDcmVkZW50aWFsJik7CisjZWxpZiBVU0UoQ1VSTCkKKyAg
ICBOZXR3b3JrU3RvcmFnZVNlc3Npb24oUEFMOjpTZXNzaW9uSUQsIE5ldHdvcmtpbmdDb250ZXh0
Kik7CisgICAgfk5ldHdvcmtTdG9yYWdlU2Vzc2lvbigpOworCisgICAgY29uc3QgQ29va2llSmFy
Q3VybCYgY29va2llU3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29va2llU3RvcmFnZTsgfTsK
KyAgICBDb29raWVKYXJEQiYgY29va2llRGF0YWJhc2UoKSBjb25zdCB7IHJldHVybiBtX2Nvb2tp
ZURhdGFiYXNlOyB9OworCisgICAgTmV0d29ya2luZ0NvbnRleHQqIGNvbnRleHQoKSBjb25zdDsK
ICNlbHNlCiAgICAgTmV0d29ya1N0b3JhZ2VTZXNzaW9uKFBBTDo6U2Vzc2lvbklELCBOZXR3b3Jr
aW5nQ29udGV4dCopOwogICAgIH5OZXR3b3JrU3RvcmFnZVNlc3Npb24oKTsKQEAgLTE0Niw2ICsx
NjAsMTEgQEAgcHJpdmF0ZToKICAgICBGdW5jdGlvbjx2b2lkIChDcmVkZW50aWFsJiYpPiBtX3Bl
cnNpc2VudFN0b3JhZ2VDb21wbGV0aW9uSGFuZGxlcjsKICAgICBHUmVmUHRyPEdDYW5jZWxsYWJs
ZT4gbV9wZXJzaXNlbnRTdG9yYWdlQ2FuY2VsbGFibGU7CiAjZW5kaWYKKyNlbGlmIFVTRShDVVJM
KQorICAgIFVuaXF1ZVJlZjxDb29raWVKYXJDdXJsPiBtX2Nvb2tpZVN0b3JhZ2U7CisgICAgbXV0
YWJsZSBDb29raWVKYXJEQiBtX2Nvb2tpZURhdGFiYXNlOworCisgICAgUmVmUHRyPE5ldHdvcmtp
bmdDb250ZXh0PiBtX2NvbnRleHQ7CiAjZWxzZQogICAgIFJlZlB0cjxOZXR3b3JraW5nQ29udGV4
dD4gbV9jb250ZXh0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAKaW5kZXggZTNiNzI4YjgzYmYuLjMyOWYz
YTU3NjE2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q29va2llSmFyQ3VybC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0Nvb2tpZUphckN1cmwuY3BwCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAo
QykgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KICAqCiAgKiAgVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog
ICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMKQEAgLTIxLDM3OSArMjIsNjEgQEAKIAogI2lmIFVTRShDVVJMKQogI2luY2x1ZGUgIkNv
b2tpZS5oIgotI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Npb24uaCIKICNpbmNsdWRlICJVUkwu
aCIKIAotI2luY2x1ZGUgPHd0Zi9EYXRlTWF0aC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+
Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0
L1N0cmluZ0hhc2guaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCi1zdGF0aWMgdm9pZCByZWFkQ3VybENvb2tpZVRva2VuKGNvbnN0IGNo
YXIqJiBjb29raWUsIFN0cmluZyYgdG9rZW4pCi17Ci0gICAgLy8gUmVhZCB0aGUgbmV4dCB0b2tl
biBmcm9tIGEgY29va2llIHdpdGggdGhlIE5ldHNjYXBlIGNvb2tpZSBmb3JtYXQuCi0gICAgLy8g
Q3VybCBzZXBhcmF0ZXMgZWFjaCB0b2tlbiBpbiBsaW5lIHdpdGggdGFiIGNoYXJhY3Rlci4KLSAg
ICBjb25zdCBjaGFyKiBjb29raWVTdGFydCA9IGNvb2tpZTsKLSAgICB3aGlsZSAoY29va2llICYm
IGNvb2tpZVswXSAmJiBjb29raWVbMF0gIT0gJ1x0JykKLSAgICAgICAgY29va2llKys7Ci0gICAg
dG9rZW4gPSBTdHJpbmcoY29va2llU3RhcnQsIGNvb2tpZSAtIGNvb2tpZVN0YXJ0KTsKLSAgICBp
ZiAoY29va2llWzBdID09ICdcdCcpCi0gICAgICAgIGNvb2tpZSsrOwotfQotCi1zdGF0aWMgYm9v
bCBkb21haW5NYXRjaChjb25zdCBTdHJpbmcmIGNvb2tpZURvbWFpbiwgY29uc3QgU3RyaW5nJiBo
b3N0KQotewotICAgIHNpemVfdCBpbmRleCA9IGhvc3QuZmluZChjb29raWVEb21haW4pOwotCi0g
ICAgYm9vbCB0YWlsTWF0Y2ggPSAoaW5kZXggIT0gV1RGOjpub3RGb3VuZCAmJiBpbmRleCArIGNv
b2tpZURvbWFpbi5sZW5ndGgoKSA9PSBob3N0Lmxlbmd0aCgpKTsKLQotICAgIC8vIENoZWNrIGlm
IGhvc3QgZXF1YWxzIGNvb2tpZSBkb21haW4uCi0gICAgaWYgKHRhaWxNYXRjaCAmJiAhaW5kZXgp
Ci0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gQ2hlY2sgaWYgaG9zdCBpcyBhIHN1YmRv
bWFpbiBvZiB0aGUgZG9tYWluIGluIHRoZSBjb29raWUuCi0gICAgLy8gQ3VybCB1c2VzIGEgJy4n
IGluIGZyb250IG9mIGRvbWFpbnMgdG8gaW5kaWNhdGUgaXQncyB2YWxpZCBvbiBzdWJkb21haW5z
LgotICAgIGlmICh0YWlsTWF0Y2ggJiYgaW5kZXggPiAwICYmIGhvc3RbaW5kZXhdID09ICcuJykK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBDaGVjayB0aGUgc3BlY2lhbCBjYXNlIHdo
ZXJlIGhvc3QgZXF1YWxzIHRoZSBjb29raWUgZG9tYWluLCBleGNlcHQgZm9yIGEgbGVhZGluZyAn
LicgaW4gdGhlIGNvb2tpZSBkb21haW4uCi0gICAgLy8gRS5nLiBjb29raWUgZG9tYWluIGlzIC5h
cHBsZS5jb20gYW5kIGhvc3QgaXMgYXBwbGUuY29tLiAKLSAgICBpZiAoY29va2llRG9tYWluWzBd
ID09ICcuJyAmJiBjb29raWVEb21haW4uZmluZChob3N0KSA9PSAxKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdD
dXJsQ29va2llKGNvbnN0IGNoYXIqIGNvb2tpZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0
IFN0cmluZyYgcGF0aCwgU3RyaW5nQnVpbGRlciYgY29va2llcywgYm9vbCBodHRwb25seSkKLXsK
LSAgICAvLyBDaGVjayBpZiB0aGUgY29va2llIG1hdGNoZXMgZG9tYWluIGFuZCBwYXRoLCBhbmQg
aXMgbm90IGV4cGlyZWQuCi0gICAgLy8gSWYgc28sIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBjb29r
aWVzLgotICAgIC8vCi0gICAgLy8gRGVzY3JpcHRpb24gb2YgdGhlIE5ldHNjYXBlIGNvb2tpZSBm
aWxlIGZvcm1hdCB3aGljaCBDdXJsIHVzZXM6Ci0gICAgLy8KLSAgICAvLyAubmV0c2NhcGUuY29t
ICAgICBUUlVFICAgLyAgRkFMU0UgIDk0NjY4NDc5OSAgIE5FVFNDQVBFX0lEICAxMDAxMDMKLSAg
ICAvLwotICAgIC8vIEVhY2ggbGluZSByZXByZXNlbnRzIGEgc2luZ2xlIHBpZWNlIG9mIHN0b3Jl
ZCBpbmZvcm1hdGlvbi4gQSB0YWIgaXMgaW5zZXJ0ZWQgYmV0d2VlbiBlYWNoIG9mIHRoZSBmaWVs
ZHMuCi0gICAgLy8KLSAgICAvLyBGcm9tIGxlZnQtdG8tcmlnaHQsIGhlcmUgaXMgd2hhdCBlYWNo
IGZpZWxkIHJlcHJlc2VudHM6Ci0gICAgLy8KLSAgICAvLyBkb21haW4gLSBUaGUgZG9tYWluIHRo
YXQgY3JlYXRlZCBBTkQgdGhhdCBjYW4gcmVhZCB0aGUgdmFyaWFibGUuCi0gICAgLy8gZmxhZyAt
IEEgVFJVRS9GQUxTRSB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFsbCBtYWNoaW5lcyB3aXRoaW4gYSBn
aXZlbiBkb21haW4gY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUuIFRoaXMgdmFsdWUgaXMgc2V0IGF1
dG9tYXRpY2FsbHkgYnkgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNl
dCBmb3IgZG9tYWluLgotICAgIC8vIHBhdGggLSBUaGUgcGF0aCB3aXRoaW4gdGhlIGRvbWFpbiB0
aGF0IHRoZSB2YXJpYWJsZSBpcyB2YWxpZCBmb3IuCi0gICAgLy8gc2VjdXJlIC0gQSBUUlVFL0ZB
TFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiB3aXRoIHRoZSBkb21h
aW4gaXMgbmVlZGVkIHRvIGFjY2VzcyB0aGUgdmFyaWFibGUuCi0gICAgLy8gZXhwaXJhdGlvbiAt
IFRoZSBVTklYIHRpbWUgdGhhdCB0aGUgdmFyaWFibGUgd2lsbCBleHBpcmUgb24uIFVOSVggdGlt
ZSBpcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCAw
MDowMDowMCBHTVQuCi0gICAgLy8gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4KLSAg
ICAvLyB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuCi0KLSAgICBpZiAoIWNvb2tp
ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RyaW5nIGNvb2tpZURvbWFpbjsKLSAgICByZWFk
Q3VybENvb2tpZVRva2VuKGNvb2tpZSwgY29va2llRG9tYWluKTsKLQotICAgIC8vIEh0dHBPbmx5
IGNvb2tpZSBlbnRyaWVzIGJlZ2luIHdpdGggIiNIdHRwT25seV8iLgotICAgIGlmIChjb29raWVE
b21haW4uc3RhcnRzV2l0aCgiI0h0dHBPbmx5XyIpKSB7Ci0gICAgICAgIGlmIChodHRwb25seSkK
LSAgICAgICAgICAgIGNvb2tpZURvbWFpbi5yZW1vdmUoMCwgMTApOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFkb21haW5NYXRjaChjb29raWVE
b21haW4sIGRvbWFpbikpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cmluZyBzdHJCb29sZWFu
OwotICAgIHJlYWRDdXJsQ29va2llVG9rZW4oY29va2llLCBzdHJCb29sZWFuKTsKLQotICAgIFN0
cmluZyBzdHJQYXRoOwotICAgIHJlYWRDdXJsQ29va2llVG9rZW4oY29va2llLCBzdHJQYXRoKTsK
LQotICAgIC8vIENoZWNrIGlmIHBhdGggbWF0Y2hlcwotICAgIGludCBpbmRleCA9IHBhdGguZmlu
ZChzdHJQYXRoKTsKLSAgICBpZiAoaW5kZXgpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cmlu
ZyBzdHJTZWN1cmU7Ci0gICAgcmVhZEN1cmxDb29raWVUb2tlbihjb29raWUsIHN0clNlY3VyZSk7
Ci0KLSAgICBTdHJpbmcgc3RyRXhwaXJlczsKLSAgICByZWFkQ3VybENvb2tpZVRva2VuKGNvb2tp
ZSwgc3RyRXhwaXJlcyk7Ci0KLSAgICBpbnQgZXhwaXJlcyA9IHN0ckV4cGlyZXMudG9JbnQoKTsK
LQotICAgIHRpbWVfdCBub3cgPSAwOwotICAgIHRpbWUoJm5vdyk7Ci0KLSAgICAvLyBDaGVjayBp
ZiBjb29raWUgaGFzIGV4cGlyZWQKLSAgICBpZiAoZXhwaXJlcyAmJiBub3cgPiBleHBpcmVzKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgc3RyTmFtZTsKLSAgICByZWFkQ3VybENvb2tp
ZVRva2VuKGNvb2tpZSwgc3RyTmFtZSk7Ci0KLSAgICBTdHJpbmcgc3RyVmFsdWU7Ci0gICAgcmVh
ZEN1cmxDb29raWVUb2tlbihjb29raWUsIHN0clZhbHVlKTsKLQotICAgIC8vIFRoZSBjb29raWUg
bWF0Y2hlcywgYWRkIGl0IHRvIHRoZSBjb29raWUgbGlzdC4KLQotICAgIGlmIChjb29raWVzLmxl
bmd0aCgpID4gMCkKLSAgICAgICAgY29va2llcy5hcHBlbmQoIjsgIik7Ci0KLSAgICBjb29raWVz
LmFwcGVuZChzdHJOYW1lKTsKLSAgICBjb29raWVzLmFwcGVuZCgiPSIpOwotICAgIGNvb2tpZXMu
YXBwZW5kKHN0clZhbHVlKTsKLQotfQotCi1zdGF0aWMgU3RyaW5nIGdldE5ldHNjYXBlQ29va2ll
Rm9ybWF0KGNvbnN0IFVSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHZhbHVlKQotewotICAgIC8vIENv
bnN0cnVjdHMgYSBjb29raWUgc3RyaW5nIGluIE5ldHNjYXBlIENvb2tpZSBmaWxlIGZvcm1hdC4K
LQotICAgIGlmICh2YWx1ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAiIjsKLQotICAgIFN0
cmluZyB2YWx1ZVN0cjsKLSAgICBpZiAodmFsdWUuaXM4Qml0KCkpCi0gICAgICAgIHZhbHVlU3Ry
ID0gdmFsdWU7Ci0gICAgZWxzZQotICAgICAgICB2YWx1ZVN0ciA9IFN0cmluZzo6bWFrZThCaXRG
cm9tMTZCaXRTb3VyY2UodmFsdWUuY2hhcmFjdGVyczE2KCksIHZhbHVlLmxlbmd0aCgpKTsKLQot
ICAgIFZlY3RvcjxTdHJpbmc+IGF0dHJpYnV0ZXM7Ci0gICAgdmFsdWVTdHIuc3BsaXQoJzsnLCBm
YWxzZSwgYXR0cmlidXRlcyk7Ci0KLSAgICBpZiAoIWF0dHJpYnV0ZXMuc2l6ZSgpKQotICAgICAg
ICByZXR1cm4gIiI7Ci0KLSAgICAvLyBGaXJzdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIDxjb29raWVu
YW1lPj08Y29va2lldmFsdWU+Ci0gICAgU3RyaW5nIGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlOwot
ICAgIFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmJlZ2lu
KCk7Ci0gICAgaWYgKGF0dHJpYnV0ZS0+Y29udGFpbnMoJz0nKSkgewotICAgICAgICBWZWN0b3I8
U3RyaW5nPiBuYW1lVmFsdWVQYWlyOwotICAgICAgICBhdHRyaWJ1dGUtPnNwbGl0KCc9JywgdHJ1
ZSwgbmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIGNvb2tpZU5hbWUgPSBuYW1lVmFsdWVQYWlyWzBd
OwotICAgICAgICBjb29raWVWYWx1ZSA9IG5hbWVWYWx1ZVBhaXJbMV07Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFJGQzYyNjUgd2Ugc2hvdWxkIGlnbm9yZSB0aGUgZW50
aXJlCi0gICAgICAgIC8vIHNldC1jb29raWUgc3RyaW5nIG5vdywgYnV0IG90aGVyIGJyb3dzZXJz
IGFwcGVhcgotICAgICAgICAvLyB0byB0cmVhdCB0aGlzIGFzIDxjb29raWVuYW1lPj08ZW1wdHk+
Ci0gICAgICAgIGNvb2tpZU5hbWUgPSAqYXR0cmlidXRlOwotICAgIH0KLSAgICAKLSAgICBpbnQg
ZXhwaXJlcyA9IDA7Ci0gICAgU3RyaW5nIHNlY3VyZSA9ICJGQUxTRSI7Ci0gICAgU3RyaW5nIHBh
dGggPSB1cmwuYmFzZUFzU3RyaW5nKCkuc3Vic3RyaW5nKHVybC5wYXRoU3RhcnQoKSk7Ci0gICAg
aWYgKHBhdGgubGVuZ3RoKCkgPiAxICYmIHBhdGguZW5kc1dpdGgoJy8nKSkKLSAgICAgICAgcGF0
aC5yZW1vdmUocGF0aC5sZW5ndGgoKSAtIDEpOwotICAgIFN0cmluZyBkb21haW4gPSB1cmwuaG9z
dCgpOwotCi0gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHJlbWFpbmluZyBhdHRyaWJ1dGVzCi0gICAg
Zm9yICgrK2F0dHJpYnV0ZTsgYXR0cmlidXRlICE9IGF0dHJpYnV0ZXMuZW5kKCk7ICsrYXR0cmli
dXRlKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUtPmNvbnRhaW5zKCc9JykpIHsKLSAgICAgICAg
ICAgIFZlY3RvcjxTdHJpbmc+IGtleVZhbHVlUGFpcjsKLSAgICAgICAgICAgIGF0dHJpYnV0ZS0+
c3BsaXQoJz0nLCB0cnVlLCBrZXlWYWx1ZVBhaXIpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9
IGtleVZhbHVlUGFpclswXS5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyB2
YWwgPSBrZXlWYWx1ZVBhaXJbMV0uc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAo
ZXF1YWxMZXR0ZXJzSWdub3JpbmdBU0NJSUNhc2Uoa2V5LCAiZXhwaXJlcyIpKSB7Ci0gICAgICAg
ICAgICAgICAgQ1N0cmluZyBkYXRlU3RyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZh
bC5jaGFyYWN0ZXJzOCgpKSwgdmFsLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBleHBpcmVz
ID0gV1RGOjpwYXJzZURhdGVGcm9tTnVsbFRlcm1pbmF0ZWRDaGFyYWN0ZXJzKGRhdGVTdHIuZGF0
YSgpKSAvIFdURjo6bXNQZXJTZWNvbmQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVxdWFsTGV0
dGVyc0lnbm9yaW5nQVNDSUlDYXNlKGtleSwgIm1heC1hZ2UiKSkKLSAgICAgICAgICAgICAgICBl
eHBpcmVzID0gdGltZSgwKSArIHZhbC50b0ludCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoZXF1
YWxMZXR0ZXJzSWdub3JpbmdBU0NJSUNhc2Uoa2V5LCAiZG9tYWluIikpCi0gICAgICAgICAgICAg
ICAgZG9tYWluID0gdmFsOwotICAgICAgICAgICAgZWxzZSBpZiAoZXF1YWxMZXR0ZXJzSWdub3Jp
bmdBU0NJSUNhc2Uoa2V5LCAicGF0aCIpKQotICAgICAgICAgICAgICAgIHBhdGggPSB2YWw7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gYXR0cmlidXRlLT5zdHJp
cFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJ
Q2FzZShrZXksICJzZWN1cmUiKSkKLSAgICAgICAgICAgICAgICBzZWN1cmUgPSAiVFJVRSI7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGFsbG93U3ViZG9tYWlucyA9IGRvbWFp
bi5zdGFydHNXaXRoKCcuJykgPyAiVFJVRSIgOiAiRkFMU0UiOwotICAgIFN0cmluZyBleHBpcmVz
U3RyID0gU3RyaW5nOjpudW1iZXIoZXhwaXJlcyk7Ci0KLSAgICBpbnQgZmluYWxTdHJpbmdMZW5n
dGggPSBkb21haW4ubGVuZ3RoKCkgKyBwYXRoLmxlbmd0aCgpICsgZXhwaXJlc1N0ci5sZW5ndGgo
KSArIGNvb2tpZU5hbWUubGVuZ3RoKCk7Ci0gICAgZmluYWxTdHJpbmdMZW5ndGggKz0gY29va2ll
VmFsdWUubGVuZ3RoKCkgKyBzZWN1cmUubGVuZ3RoKCkgKyBhbGxvd1N1YmRvbWFpbnMubGVuZ3Ro
KCk7Ci0gICAgZmluYWxTdHJpbmdMZW5ndGggKz0gNjsgLy8gQWNjb3VudCBmb3IgXHQgc2VwYXJh
dG9ycy4KLSAgICAKLSAgICBTdHJpbmdCdWlsZGVyIGNvb2tpZVN0cjsKLSAgICBjb29raWVTdHIu
cmVzZXJ2ZUNhcGFjaXR5KGZpbmFsU3RyaW5nTGVuZ3RoKTsKLSAgICBjb29raWVTdHIuYXBwZW5k
KGRvbWFpbik7Ci0gICAgY29va2llU3RyLmFwcGVuZCgiXHQiKTsKLSAgICBjb29raWVTdHIuYXBw
ZW5kKGFsbG93U3ViZG9tYWlucyk7Ci0gICAgY29va2llU3RyLmFwcGVuZCgiXHQiKTsKLSAgICBj
b29raWVTdHIuYXBwZW5kKHBhdGgpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQoIlx0Iik7Ci0gICAg
Y29va2llU3RyLmFwcGVuZChzZWN1cmUpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQoIlx0Iik7Ci0g
ICAgY29va2llU3RyLmFwcGVuZChleHBpcmVzU3RyKTsKLSAgICBjb29raWVTdHIuYXBwZW5kKCJc
dCIpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQoY29va2llTmFtZSk7Ci0gICAgY29va2llU3RyLmFw
cGVuZCgiXHQiKTsKLSAgICBjb29raWVTdHIuYXBwZW5kKGNvb2tpZVZhbHVlKTsKLQotICAgIHJl
dHVybiBjb29raWVTdHIudG9TdHJpbmcoKTsKLX0KLQotdm9pZCBDb29raWVKYXJDdXJsRmlsZVN5
c3RlbTo6c2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29u
c3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBjb25zdCBTdHJpbmcm
IHZhbHVlKQotewotICAgIFVOVVNFRF9QQVJBTShmcmFtZUlEKTsKLSAgICBVTlVTRURfUEFSQU0o
cGFnZUlEKTsKLSAgICBDdXJsSGFuZGxlIGN1cmxIYW5kbGU7Ci0KLSAgICBjdXJsSGFuZGxlLmVu
YWJsZVNoYXJlSGFuZGxlKCk7Ci0gICAgY3VybEhhbmRsZS5lbmFibGVDb29raWVKYXJJZkV4aXN0
cygpOwotCi0gICAgLy8gQ1VSTCBhY2NlcHRzIGNvb2tpZXMgaW4gZWl0aGVyIFNldC1Db29raWUg
b3IgTmV0c2NhcGUgZmlsZSBmb3JtYXQuCi0gICAgLy8gSG93ZXZlciB3aXRoIFNldC1Db29raWUg
Zm9ybWF0LCB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSB0aGF0IHdlCi0gICAgLy8gc2hvdWxk
IG5vdCBhbGxvdyBjb29raWVzIHRvIGJlIHJlYWQgZnJvbSBzdWJkb21haW5zLCB3aGljaCBpcyB0
aGUKLSAgICAvLyByZXF1aXJlZCBiZWhhdmlvciBpZiB0aGUgZG9tYWluIGZpZWxkIGlzIG5vdCBl
eHBsaWNpdHkgc3BlY2lmaWVkLgotICAgIFN0cmluZyBjb29raWUgPSBnZXROZXRzY2FwZUNvb2tp
ZUZvcm1hdCh1cmwsIHZhbHVlKTsKLQotICAgIGlmICghY29va2llLmlzOEJpdCgpKQotICAgICAg
ICBjb29raWUgPSBTdHJpbmc6Om1ha2U4Qml0RnJvbTE2Qml0U291cmNlKGNvb2tpZS5jaGFyYWN0
ZXJzMTYoKSwgY29va2llLmxlbmd0aCgpKTsKLQotICAgIENTdHJpbmcgc3RyQ29va2llKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNvb2tpZS5jaGFyYWN0ZXJzOCgpKSwgY29va2llLmxl
bmd0aCgpKTsKLQotICAgIGN1cmxIYW5kbGUuc2V0Q29va2llTGlzdChzdHJDb29raWUuZGF0YSgp
KTsKLX0KLQotc3RhdGljIFN0cmluZyBjb29raWVzRm9yU2Vzc2lvbihjb25zdCBOZXR3b3JrU3Rv
cmFnZVNlc3Npb24mLCBjb25zdCBVUkwmLCBjb25zdCBVUkwmIHVybCwgYm9vbCBodHRwb25seSkK
LXsKLSAgICBTdHJpbmcgY29va2llczsKLQotICAgIEN1cmxIYW5kbGUgY3VybEhhbmRsZTsKLSAg
ICBjdXJsSGFuZGxlLmVuYWJsZVNoYXJlSGFuZGxlKCk7Ci0KLSAgICBDdXJsU0xpc3QgY29va2ll
TGlzdDsKLSAgICBjdXJsSGFuZGxlLmZldGNoQ29va2llTGlzdChjb29raWVMaXN0KTsKLSAgICBj
b25zdCBzdHJ1Y3QgY3VybF9zbGlzdCogbGlzdCA9IGNvb2tpZUxpc3QuaGVhZCgpOwotICAgIGlm
IChsaXN0KSB7Ci0gICAgICAgIFN0cmluZyBkb21haW4gPSB1cmwuaG9zdCgpOwotICAgICAgICBT
dHJpbmcgcGF0aCA9IHVybC5wYXRoKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY29va2llc0J1
aWxkZXI7Ci0KLSAgICAgICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIq
IGNvb2tpZSA9IGxpc3QtPmRhdGE7Ci0gICAgICAgICAgICBhZGRNYXRjaGluZ0N1cmxDb29raWUo
Y29va2llLCBkb21haW4sIHBhdGgsIGNvb2tpZXNCdWlsZGVyLCBodHRwb25seSk7Ci0gICAgICAg
ICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvb2tpZXMgPSBj
b29raWVzQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHJldHVybiBjb29raWVzOwot
fQotCi1zdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBDb29raWVKYXJDdXJsRmlsZVN5c3RlbTo6Y29v
a2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVS
TCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZy
YW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tp
ZXMpCi17Ci0gICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOwotICAgIFVOVVNFRF9QQVJBTShwYWdl
SUQpOwotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBmaWx0ZXIgc2VjdXJlIGNvb2tpZXMgb3V0
IGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgaXQuCi0gICAgcmV0dXJuIHsgY29va2llc0ZvclNlc3Np
b24oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmYWxzZSksIGZhbHNlIH07Ci19Ci0KLXN0ZDo6
cGFpcjxTdHJpbmcsIGJvb2w+IENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpjb29raWVSZXF1ZXN0
SGVhZGVyRmllbGRWYWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNv
bnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0
X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3Vy
ZUNvb2tpZXMpCi17Ci0gICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOwotICAgIFVOVVNFRF9QQVJB
TShwYWdlSUQpOwotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBmaWx0ZXIgc2VjdXJlIGNvb2tp
ZXMgb3V0IGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgaXQuCi0gICAgcmV0dXJuIHsgY29va2llc0Zv
clNlc3Npb24oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCB0cnVlKSwgZmFsc2UgfTsKLX0KLQot
Ym9vbCBDb29raWVKYXJDdXJsRmlsZVN5c3RlbTo6Y29va2llc0VuYWJsZWQoY29uc3QgTmV0d29y
a1N0b3JhZ2VTZXNzaW9uJikKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb29raWVK
YXJDdXJsRmlsZVN5c3RlbTo6Z2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWlu
dDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENv
b2tpZT4mIHJhd0Nvb2tpZXMpCi17Ci0gICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOwotICAgIFVO
VVNFRF9QQVJBTShwYWdlSUQpOwotICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCi0g
ICAgcmF3Q29va2llcy5jbGVhcigpOwotICAgIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIHRydWUg
d2hlbiBpbXBsZW1lbnRlZAotfQotCi12b2lkIENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpkZWxl
dGVDb29raWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiwgY29uc3Qg
U3RyaW5nJikKLXsKLSAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAotfQotCi12b2lk
IENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpnZXRIb3N0bmFtZXNXaXRoQ29va2llcyhjb25zdCBO
ZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBIYXNoU2V0PFN0cmluZz4mIGhvc3RuYW1lcykKLXsKLSAg
ICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAotfQotCi12b2lkIENvb2tpZUphckN1cmxG
aWxlU3lzdGVtOjpkZWxldGVDb29raWVzRm9ySG9zdG5hbWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdl
U2Vzc2lvbiYsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBjb29raWVIb3N0TmFtZXMpCi17Ci0gICAg
Ly8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKLX0KLQotdm9pZCBDb29raWVKYXJDdXJsRmls
ZVN5c3RlbTo6ZGVsZXRlQWxsQ29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKQot
ewotICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCi19Ci0KLXZvaWQgQ29va2llSmFy
Q3VybEZpbGVTeXN0ZW06OmRlbGV0ZUFsbENvb2tpZXNNb2RpZmllZFNpbmNlKGNvbnN0IE5ldHdv
cmtTdG9yYWdlU2Vzc2lvbiYsIFdhbGxUaW1lKQotewotICAgIC8vIEZJWE1FOiBOb3QgeWV0IGlt
cGxlbWVudGVkCi19Ci0KLS8vIGRpc3BhdGNoZXIgZnVuY3Rpb25zCi0KIHN0ZDo6cGFpcjxTdHJp
bmcsIGJvb2w+IGNvb2tpZXNGb3JET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNz
aW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFs
PHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1
ZGVTZWN1cmVDb29raWVzIGluY2x1ZGVTZWN1cmVDb29raWVzKQogewotICAgIHJldHVybiBDdXJs
Q29udGV4dDo6c2luZ2xldG9uKCkuY29va2llSmFyKCkuY29va2llc0ZvckRPTShzZXNzaW9uLCBm
aXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgaW5jbHVkZVNlY3VyZUNvb2tpZXMpOwor
ICAgIHJldHVybiBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5jb29raWVzRm9yRE9NKHNlc3Npb24s
IGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCBpbmNsdWRlU2VjdXJlQ29va2llcyk7
CiB9CiAKIHZvaWQgc2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9w
dGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQs
IGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7Ci0gICAgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmNv
b2tpZUphcigpLnNldENvb2tpZXNGcm9tRE9NKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJh
bWVJRCwgcGFnZUlELCB2YWx1ZSk7CisgICAgc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuc2V0Q29v
a2llc0Zyb21ET00oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIHZh
bHVlKTsKIH0KIAogc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gY29va2llUmVxdWVzdEhlYWRlckZp
ZWxkVmFsdWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwm
IGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFt
ZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVz
IGluY2x1ZGVTZWN1cmVDb29raWVzKQogewotICAgIHJldHVybiBDdXJsQ29udGV4dDo6c2luZ2xl
dG9uKCkuY29va2llSmFyKCkuY29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoc2Vzc2lvbiwg
Zmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIGluY2x1ZGVTZWN1cmVDb29raWVzKTsK
KyAgICByZXR1cm4gc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuY29va2llUmVxdWVzdEhlYWRlckZp
ZWxkVmFsdWUoc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIGluY2x1
ZGVTZWN1cmVDb29raWVzKTsKIH0KIAogYm9vbCBjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3Jr
U3RvcmFnZVNlc3Npb24mIHNlc3Npb24pCiB7Ci0gICAgcmV0dXJuIEN1cmxDb250ZXh0OjpzaW5n
bGV0b24oKS5jb29raWVKYXIoKS5jb29raWVzRW5hYmxlZChzZXNzaW9uKTsKKyAgICByZXR1cm4g
c2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuY29va2llc0VuYWJsZWQoc2Vzc2lvbik7CiB9CiAKIGJv
b2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNv
bnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0
X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tp
ZT4mIHJhd0Nvb2tpZXMpCiB7Ci0gICAgcmV0dXJuIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5j
b29raWVKYXIoKS5nZXRSYXdDb29raWVzKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJhbWVJ
RCwgcGFnZUlELCByYXdDb29raWVzKTsKKyAgICByZXR1cm4gc2Vzc2lvbi5jb29raWVTdG9yYWdl
KCkuZ2V0UmF3Q29va2llcyhzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJ
RCwgcmF3Q29va2llcyk7CiB9CiAKIHZvaWQgZGVsZXRlQ29va2llKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2ll
KQogewotICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVDb29r
aWUoc2Vzc2lvbiwgdXJsLCBjb29raWUpOworICAgIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmRl
bGV0ZUNvb2tpZShzZXNzaW9uLCB1cmwsIGNvb2tpZSk7CiB9CiAKIHZvaWQgZ2V0SG9zdG5hbWVz
V2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBIYXNoU2V0
PFN0cmluZz4mIGhvc3RuYW1lcykKIHsKLSAgICBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29v
a2llSmFyKCkuZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoc2Vzc2lvbiwgaG9zdG5hbWVzKTsKKyAg
ICBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5nZXRIb3N0bmFtZXNXaXRoQ29va2llcyhzZXNzaW9u
LCBob3N0bmFtZXMpOwogfQogCiB2b2lkIGRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29uc3Qg
TmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgY29v
a2llSG9zdE5hbWVzKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIo
KS5kZWxldGVDb29raWVzRm9ySG9zdG5hbWVzKHNlc3Npb24sIGNvb2tpZUhvc3ROYW1lcyk7Cisg
ICAgc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuZGVsZXRlQ29va2llc0Zvckhvc3RuYW1lcyhzZXNz
aW9uLCBjb29raWVIb3N0TmFtZXMpOwogfQogCiB2b2lkIGRlbGV0ZUFsbENvb2tpZXMoY29uc3Qg
TmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5n
bGV0b24oKS5jb29raWVKYXIoKS5kZWxldGVBbGxDb29raWVzKHNlc3Npb24pOworICAgIHNlc3Np
b24uY29va2llU3RvcmFnZSgpLmRlbGV0ZUFsbENvb2tpZXMoc2Vzc2lvbik7CiB9CiAKIHZvaWQg
ZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiBzZXNzaW9uLCBXYWxsVGltZSBzaW5jZSkKIHsKLSAgICBDdXJsQ29udGV4dDo6c2luZ2xldG9u
KCkuY29va2llSmFyKCkuZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2Uoc2Vzc2lvbiwgc2lu
Y2UpOworICAgIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmRlbGV0ZUFsbENvb2tpZXNNb2RpZmll
ZFNpbmNlKHNlc3Npb24sIHNpbmNlKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwuaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmgKaW5kZXggYTUyZmQ3ODYxNzEu
LmI4YzU0NjkwOWIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvQ29va2llSmFyQ3VybC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9Db29raWVKYXJDdXJsLmgKQEAgLTI4LDI5ICsyOCwxNyBAQCBjbGFzcyBVUkw7CiAK
IGNsYXNzIENvb2tpZUphckN1cmwgewogcHVibGljOgotICAgIHZpcnR1YWwgc3RkOjpwYWlyPFN0
cmluZywgYm9vbD4gY29va2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBj
b25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+
IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNv
b2tpZXMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0
d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBz
dGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBw
YWdlSUQsIGNvbnN0IFN0cmluZyYpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY29va2llc0VuYWJs
ZWQoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJikgPSAwOwotICAgIHZpcnR1YWwgc3RkOjpw
YWlyPFN0cmluZywgYm9vbD4gY29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoY29uc3QgTmV0
d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBz
dGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBw
YWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGdldFJh
d0Nvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBh
cnR5LCBjb25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9w
dGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIFZlY3RvcjxDb29raWU+JikgPSAwOwotICAgIHZpcnR1
YWwgdm9pZCBkZWxldGVDb29raWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3Qg
VVJMJiwgY29uc3QgU3RyaW5nJikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBnZXRIb3N0bmFtZXNX
aXRoQ29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBIYXNoU2V0PFN0cmluZz4m
IGhvc3RuYW1lcykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBkZWxldGVDb29raWVzRm9ySG9zdG5h
bWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBj
b29raWVIb3N0TmFtZXMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlQWxsQ29va2llcyhj
b25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0
ZUFsbENvb2tpZXNNb2RpZmllZFNpbmNlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIFdh
bGxUaW1lKSA9IDA7Ci19OwotCi1jbGFzcyBDb29raWVKYXJDdXJsRmlsZVN5c3RlbSA6IHB1Ymxp
YyBDb29raWVKYXJDdXJsIHsKLSAgICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVzRm9y
RE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwg
Y29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25h
bDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgb3ZlcnJpZGU7Ci0gICAg
dm9pZCBzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25z
dCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZy
YW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgY29uc3QgU3RyaW5nJikgb3Zl
cnJpZGU7Ci0gICAgYm9vbCBjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mKSBvdmVycmlkZTsKLSAgICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0
SGVhZGVyRmllbGRWYWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwm
IGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQs
IHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIG92
ZXJyaWRlOwotICAgIGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWlu
dDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENv
b2tpZT4mKSBvdmVycmlkZTsKLSAgICB2b2lkIGRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3Rv
cmFnZVNlc3Npb24mLCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKLSAgICB2
b2lkIGdldEhvc3RuYW1lc1dpdGhDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYs
IEhhc2hTZXQ8U3RyaW5nPiYgaG9zdG5hbWVzKSBvdmVycmlkZTsKLSAgICB2b2lkIGRlbGV0ZUNv
b2tpZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVmVj
dG9yPFN0cmluZz4mIGNvb2tpZUhvc3ROYW1lcykgb3ZlcnJpZGU7Ci0gICAgdm9pZCBkZWxldGVB
bGxDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpIG92ZXJyaWRlOwotICAgIHZv
aWQgZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNz
aW9uJiwgV2FsbFRpbWUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpwYWlyPFN0cmluZywg
Ym9vbD4gY29va2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBV
UkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1l
SUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMp
IGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29va2llc0Zyb21ET00oY29uc3QgTmV0
d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmLCBz
dGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBw
YWdlSUQsIGNvbnN0IFN0cmluZyYpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29v
a2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3Qg
VVJMJiwgY29uc3QgU3RyaW5nJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjb29raWVz
RW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKSBjb25zdCA9IDA7CisgICAgdmly
dHVhbCBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1
ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNv
bnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIGNvbnN0ID0gMDsKKyAgICB2
aXJ0dWFsIGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBj
b25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+
IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4m
KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3Jr
U3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBjb25zdCA9IDA7Cisg
ICAgdmlydHVhbCB2b2lkIGdldEhvc3RuYW1lc1dpdGhDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYsIEhhc2hTZXQ8U3RyaW5nPiYgaG9zdG5hbWVzKSBjb25zdCA9IDA7CisgICAg
dmlydHVhbCB2b2lkIGRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGNvb2tpZUhvc3ROYW1lcykgY29uc3Qg
PSAwOworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVBbGxDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlQWxsQ29va2ll
c01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgV2FsbFRpbWUpIGNv
bnN0ID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRh
YmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjU2YTFiYzg0
ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJh
Z21hIG9uY2UKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvb2tpZUphckN1cmxE
YXRhYmFzZS5oIgorCisjaWYgVVNFKENVUkwpCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVk
ZSAiQ29va2llSmFyREIuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Npb24uaCIKKyNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlVSTC5oIgorCisjaW5jbHVkZSA8
d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
YXRpYyBTdHJpbmcgY29va2llc0ZvclNlc3Npb24oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiBzZXNzaW9uLCBjb25zdCBVUkwmLCBjb25zdCBVUkwmIHVybCwgYm9vbCBodHRwb25seSkKK3sK
KyAgICBTdHJpbmdCdWlsZGVyIGNvb2tpZXM7CisKKyAgICBDb29raWVKYXJEQiYgY29va2llSmFy
REIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7CisgICAgYXV0byBpc0h0dHBPbmx5ID0gKGh0
dHBvbmx5ID8gc3RkOjpudWxsb3B0IDogc3RkOjpvcHRpb25hbDxib29sPiB7ZmFsc2V9KTsKKyAg
ICBhdXRvIHNlY3VyZSA9IHVybC5wcm90b2NvbElzKCJodHRwcyIpID8gc3RkOjpudWxsb3B0IDog
c3RkOjpvcHRpb25hbDxib29sPiB7ZmFsc2V9OworCisgICAgVmVjdG9yPENvb2tpZT4gcmVzdWx0
czsKKyAgICBpZiAoY29va2llSmFyREIuc2VhcmNoQ29va2llcyh1cmwuc3RyaW5nKCksIGlzSHR0
cE9ubHksIHNlY3VyZSwgc3RkOjpudWxsb3B0LCByZXN1bHRzKSkgeworICAgICAgICBmb3IgKGF1
dG8gcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICAgICAgaWYgKCFjb29raWVzLmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICBjb29raWVzLmFwcGVuZCgiOyAiKTsKKyAgICAgICAgICAgIGNv
b2tpZXMuYXBwZW5kKHJlc3VsdC5uYW1lKTsKKyAgICAgICAgICAgIGNvb2tpZXMuYXBwZW5kKCI9
Iik7CisgICAgICAgICAgICBjb29raWVzLmFwcGVuZChyZXN1bHQudmFsdWUpOworICAgICAgICB9
CisgICAgfQorICAgIHJldHVybiBjb29raWVzLnRvU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ29va2ll
SmFyQ3VybERhdGFiYXNlOjpzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNl
c3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBh
Z2VJRCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkgY29uc3QKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJh
bWVJRCk7CisgICAgVU5VU0VEX1BBUkFNKHBhZ2VJRCk7CisKKyAgICBDb29raWVKYXJEQiYgY29v
a2llSmFyREIgPSBzZXNzaW9uLmNvb2tpZURhdGFiYXNlKCk7CisgICAgY29va2llSmFyREIuc2V0
Q29va2llKHVybC5zdHJpbmcoKSwgdmFsdWUsIHRydWUpOworfQorCit2b2lkIENvb2tpZUphckN1
cmxEYXRhYmFzZTo6c2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkg
Y29uc3QgCit7CisgICAgQ29va2llSmFyREImIGNvb2tpZUphckRCID0gc2Vzc2lvbi5jb29raWVE
YXRhYmFzZSgpOworICAgIGNvb2tpZUphckRCLnNldENvb2tpZSh1cmwuc3RyaW5nKCksIHZhbHVl
LCBmYWxzZSk7Cit9CisKK3N0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IENvb2tpZUphckN1cmxEYXRh
YmFzZTo6Y29va2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24s
IGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWlu
dDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNl
Y3VyZUNvb2tpZXMpIGNvbnN0Cit7CisgICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOworICAgIFVO
VVNFRF9QQVJBTShwYWdlSUQpOworCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGZpbHRlciBz
ZWN1cmUgY29va2llcyBvdXQgaWYgdGhlIGNhbGxlciByZXF1ZXN0cyBpdC4KKyAgICByZXR1cm4g
eyBjb29raWVzRm9yU2Vzc2lvbihzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZhbHNlKSwgZmFs
c2UgfTsKK30KKworc3RkOjpwYWlyPFN0cmluZywgYm9vbD4gQ29va2llSmFyQ3VybERhdGFiYXNl
Ojpjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mIHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6
b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJ
RCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIGNvbnN0Cit7CisgICAgVU5VU0VEX1BBUkFNKGZyYW1l
SUQpOworICAgIFVOVVNFRF9QQVJBTShwYWdlSUQpOworCisgICAgLy8gRklYTUU6IFRoaXMgc2hv
dWxkIGZpbHRlciBzZWN1cmUgY29va2llcyBvdXQgaWYgdGhlIGNhbGxlciByZXF1ZXN0cyBpdC4K
KyAgICByZXR1cm4geyBjb29raWVzRm9yU2Vzc2lvbihzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmws
IHRydWUpLCBmYWxzZSB9OworfQorCitib29sIENvb2tpZUphckN1cmxEYXRhYmFzZTo6Y29va2ll
c0VuYWJsZWQoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uKSBjb25zdAorewor
ICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvb2tpZUphckN1cmxEYXRhYmFzZTo6Z2V0UmF3
Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYg
Zmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwg
c3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2llPiYgcmF3Q29va2ll
cykgY29uc3QKK3sKKyAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7CisgICAgVU5VU0VEX1BBUkFN
KHBhZ2VJRCk7CisKKyAgICBDb29raWVKYXJEQiYgY29va2llSmFyREIgPSBzZXNzaW9uLmNvb2tp
ZURhdGFiYXNlKCk7CisgICAgcmV0dXJuIGNvb2tpZUphckRCLnNlYXJjaENvb2tpZXMoZmlyc3RQ
YXJ0eS5zdHJpbmcoKSwgc3RkOjpudWxsb3B0LCBzdGQ6Om51bGxvcHQsIHN0ZDo6bnVsbG9wdCwg
cmF3Q29va2llcyk7Cit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpkZWxldGVDb29r
aWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiB1cmwsIGNvbnN0IFN0
cmluZyYgY29va2llTmFtZSkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1l
bnRlZAorfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6Z2V0SG9zdG5hbWVzV2l0aENv
b2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgSGFzaFNldDxTdHJpbmc+JiBob3N0
bmFtZXMpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKK30KKwor
dm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29u
c3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGNvb2tpZUhv
c3ROYW1lcykgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorfQor
Cit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6ZGVsZXRlQWxsQ29va2llcyhjb25zdCBOZXR3
b3JrU3RvcmFnZVNlc3Npb24mKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxl
bWVudGVkCit9CisKK3ZvaWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpkZWxldGVBbGxDb29raWVz
TW9kaWZpZWRTaW5jZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBXYWxsVGltZSkgY29u
c3QKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ1VSTCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2UuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsRGF0YWJhc2Uu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZDFkNjY1MWM2OWYKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29v
a2llSmFyQ3VybERhdGFiYXNlLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxOCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
ICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQor
CisjaW5jbHVkZSAiQ29va2llSmFyQ3VybC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIENvb2tpZUphckN1cmxEYXRhYmFzZSA6IHB1YmxpYyBDb29raWVKYXJDdXJsIHsKKyAgICBz
dGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdl
U2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25h
bDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNs
dWRlU2VjdXJlQ29va2llcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDb29raWVzRnJv
bURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHks
IGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9u
YWw8dWludDY0X3Q+IHBhZ2VJRCwgY29uc3QgU3RyaW5nJikgY29uc3Qgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRDb29raWVzRnJvbUhUVFBSZXNwb25zZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mLCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29s
IGNvb2tpZXNFbmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpIGNvbnN0IG92ZXJy
aWRlOworICAgIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RIZWFkZXJGaWVs
ZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0
eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRp
b25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgY29uc3Qgb3ZlcnJp
ZGU7CisgICAgYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYs
IGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2ll
PiYpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZGVsZXRlQ29va2llKGNvbnN0IE5ldHdvcmtT
dG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNvbnN0IFN0cmluZyYpIGNvbnN0IG92ZXJyaWRl
OworICAgIHZvaWQgZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VT
ZXNzaW9uJiwgSGFzaFNldDxTdHJpbmc+JiBob3N0bmFtZXMpIGNvbnN0IG92ZXJyaWRlOworICAg
IHZvaWQgZGVsZXRlQ29va2llc0Zvckhvc3RuYW1lcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKSBjb25zdCBvdmVycmlk
ZTsKKyAgICB2b2lkIGRlbGV0ZUFsbENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWxldGVBbGxDb29raWVzTW9kaWZpZWRTaW5j
ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBXYWxsVGltZSkgY29uc3Qgb3ZlcnJpZGU7
Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyREIuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMC4uMTY2MjNjMWI2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyREIuY3BwCkBAIC0wLDAg
KzEsNDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNvbnkgSW50ZXJhY3RpdmUgRW50
ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwor
ICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRC
LmgiCisKKyNpbmNsdWRlICJDb29raWVVdGlsLmgiCisjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3Rl
bS5oIgorI2luY2x1ZGUgIlVSTC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNkZWZpbmUg
Q09SUlVQVF9NQVJLRVJfU1VGRklYICItY29ycnVwdGVkIgorCisvLyBBdCBsZWFzdCA1MCBjb29r
aWVzIHBlciBkb21haW4gKFJGQzYyNjUgNi4xLiBMaW1pdHMpCisjZGVmaW5lIE1BWF9DT09LSUVf
UEVSX0RPTUFJTiA4MAorCisjZGVmaW5lIENSRUFURV9DT09LSUVfVEFCTEVfU1FMIFwKKyAgICAi
Q1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQ29va2llICgiXAorICAgICIgIG5hbWUgVEVYVCBO
T1QgTlVMTCwiXAorICAgICIgIHZhbHVlIFRFWFQsIlwKKyAgICAiICBkb21haW4gVEVYVCBOT1Qg
TlVMTCwiXAorICAgICIgIHBhdGggVEVYVCBOT1QgTlVMTCwiXAorICAgICIgIGV4cGlyZXMgSU5U
RUdFUiBOT1QgTlVMTCwiXAorICAgICIgIHNpemUgSU5URUdFUiBOT1QgTlVMTCwiXAorICAgICIg
IHNlc3Npb24gSU5URUdFUiBOT1QgTlVMTCwiXAorICAgICIgIGh0dHBvbmx5IElOVEVHRVIgTk9U
IE5VTEwgREVGQVVMVCAwLCJcCisgICAgIiAgc2VjdXJlIElOVEVHRVIgTk9UIE5VTEwgREVGQVVM
VCAwLCJcCisgICAgIiAgbGFzdHVwZGF0ZWQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIENVUlJF
TlRfVElNRVNUQU1QLCAiXAorICAgICIgIFVOSVFVRShuYW1lLCBkb21haW4sIHBhdGgpKTsiCisj
ZGVmaW5lIENSRUFURV9ET01BSU5fSU5ERVhfU1FMIFwKKyAgICAiQ1JFQVRFIElOREVYIElGIE5P
VCBFWElTVFMgZG9tYWluX2luZGV4IE9OIENvb2tpZShkb21haW4pOyIKKyNkZWZpbmUgQ1JFQVRF
X1BBVEhfSU5ERVhfU1FMIFwKKyAgICAiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgcGF0aF9p
bmRleCBPTiBDb29raWUocGF0aCk7IgorI2RlZmluZSBDSEVDS19FWElTVFNfSFRUUE9OTFlfQ09P
S0lFX1NRTCBcCisgICAgIlNFTEVDVCBuYW1lIEZST00gQ29va2llIFdIRVJFIChuYW1lID0gPykg
QU5EIChkb21haW4gPSA/KSBBTkQgKHBhdGggPSA/KSBBTkQgKGh0dHBvbmx5ID0gMSk7IgorI2Rl
ZmluZSBTRVRfQ09PS0lFX1NRTCBcCisgICAgIklOU0VSVCBPUiBSRVBMQUNFIElOVE8gQ29va2ll
IChuYW1lLCB2YWx1ZSwgZG9tYWluLCBwYXRoLCBleHBpcmVzLCBzaXplLCBzZXNzaW9uLCBodHRw
b25seSwgc2VjdXJlKSAiXAorICAgICJWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8p
OyIKKyNkZWZpbmUgREVMRVRFX0NPT0tJRV9CWV9OQU1FX0RPTUFJTl9QQVRIX1NRTCBcCisgICAg
IkRFTEVURSBGUk9NIENvb2tpZSBXSEVSRSBuYW1lID0gPyBBTkQgZG9tYWluID0gPyBBTkQgcGF0
aCA9ID87IgorI2RlZmluZSBERUxFVEVfQ09PS0lFX0JZX05BTUVfRE9NQUlOX1NRTCBcCisgICAg
IkRFTEVURSBGUk9NIENvb2tpZSBXSEVSRSBuYW1lID0gPyBBTkQgZG9tYWluID0gPzsiCisjZGVm
aW5lIERFTEVURV9BTExfU0VTU0lPTl9DT09LSUVfU1FMIFwKKyAgICAiREVMRVRFIEZST00gQ29v
a2llIFdIRVJFIHNlc3Npb24gPSAxOyIKKyNkZWZpbmUgREVMRVRFX0FMTF9DT09LSUVfU1FMIFwK
KyAgICAiREVMRVRFIEZST00gQ29va2llOyIKKwordm9pZCBDb29raWVKYXJEQjo6c2V0RW5hYmxl
ZChib29sIGVuYWJsZSkKK3sKKyAgICBDb29raWVKYXJEQjo6bV9jb29raWVFbmFibGUgPSBlbmFi
bGU7Cit9CisKK0Nvb2tpZUphckRCOjpDb29raWVKYXJEQihjb25zdCBTdHJpbmcmIGRhdGFiYXNl
UGF0aCkKKyAgICA6IG1fZGF0YWJhc2VQYXRoKGRhdGFiYXNlUGF0aCkKK3sKKyAgICBjaGVja0Rh
dGFiYXNlQ29ycnVwdGlvbkFuZFJlbW92ZUlmTmVlZGVkKCk7CisKKyAgICBpZiAoIW9wZW5EYXRh
YmFzZSgpKQorICAgICAgICByZXR1cm47Cit9CisKK0Nvb2tpZUphckRCOjp+Q29va2llSmFyREIo
KQoreworICAgIGNsb3NlRGF0YWJhc2UoKTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6b3BlbkRh
dGFiYXNlKCkKK3sKKyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBib29sIGV4aXN0c0RhdGFiYXNlRmlsZSA9IGZhbHNlOworICAgIGlmICgh
aXNPbk1lbW9yeSgpKQorICAgICAgICBleGlzdHNEYXRhYmFzZUZpbGUgPSBTUUxpdGVGaWxlU3lz
dGVtOjplbnN1cmVEYXRhYmFzZUZpbGVFeGlzdHMobV9kYXRhYmFzZVBhdGgsIGZhbHNlKTsKKwor
ICAgIGlmIChleGlzdHNEYXRhYmFzZUZpbGUpIHsKKyAgICAgICAgaWYgKG1fZGF0YWJhc2Uub3Bl
bihtX2RhdGFiYXNlUGF0aCwgZmFsc2UpKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tEYXRhYmFz
ZVZhbGlkaXR5KCkpCisgICAgICAgICAgICAgICAgZXhlY3V0ZVNpbXBsZVNxbChERUxFVEVfQUxM
X1NFU1NJT05fQ09PS0lFX1NRTCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAvLyBkZWxldGUgZGF0YWJhc2UgYW5kIHRyeSB0byByZS1jcmVhdGUgYWdhaW4KKyAgICAgICAg
ICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgZGVsZXRlQWxsRGF0
YWJhc2VGaWxlcygpOworICAgICAgICAgICAgICAgIGV4aXN0c0RhdGFiYXNlRmlsZSA9IGZhbHNl
OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsZXRlQWxs
RGF0YWJhc2VGaWxlcygpOworICAgICAgICAgICAgZXhpc3RzRGF0YWJhc2VGaWxlID0gZmFsc2U7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWV4aXN0c0RhdGFiYXNlRmlsZSkgeworICAg
ICAgICBpZiAobV9kYXRhYmFzZS5vcGVuKG1fZGF0YWJhc2VQYXRoLCBmYWxzZSkpIHsKKyAgICAg
ICAgICAgIGJvb2wgZGF0YWJhc2VWYWxpZGl0eSA9IHRydWU7CisgICAgICAgICAgICBkYXRhYmFz
ZVZhbGlkaXR5ICY9IChleGVjdXRlU2ltcGxlU3FsKENSRUFURV9DT09LSUVfVEFCTEVfU1FMKSA9
PSBTUUxJVEVfRE9ORSk7CisgICAgICAgICAgICBkYXRhYmFzZVZhbGlkaXR5ICY9IChleGVjdXRl
U2ltcGxlU3FsKENSRUFURV9ET01BSU5fSU5ERVhfU1FMKSA9PSBTUUxJVEVfRE9ORSk7CisgICAg
ICAgICAgICBkYXRhYmFzZVZhbGlkaXR5ICY9IChleGVjdXRlU2ltcGxlU3FsKENSRUFURV9QQVRI
X0lOREVYX1NRTCkgPT0gU1FMSVRFX0RPTkUpOworICAgICAgICAgICAgaWYgKCFkYXRhYmFzZVZh
bGlkaXR5KSB7CisgICAgICAgICAgICAgICAgLy8gZ2l2ZSB1cCBjcmVhdGUgZGF0YWJhc2UgYXQg
dGhpcyB0aW1lIChhbGwgY29va2llcyBvbiByZXF1ZXN0L3Jlc3BvbnNlIGFyZSBpZ25vcmVkKQor
ICAgICAgICAgICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBkZWxl
dGVBbGxEYXRhYmFzZUZpbGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGV4ZWN1dGVTaW1wbGVTcWwoIlBSQUdNQSB0ZW1wX3N0b3JlID0gTUVNT1JZOyIpOworICAg
IGV4ZWN1dGVTaW1wbGVTcWwoIlBSQUdNQSBzeW5jaHJvbm91cyA9IE5PUk1BTDsiKTsKKyAgICBl
eGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMOyIpOworCisgICAgLy8g
Y3JlYXRlIHByZXBhcmVkIHN0YXRlbWVudHMKKyAgICBjcmVhdGVQcmVwYXJlU3RhdGVtZW50KFNF
VF9DT09LSUVfU1FMKTsKKyAgICBjcmVhdGVQcmVwYXJlU3RhdGVtZW50KENIRUNLX0VYSVNUU19I
VFRQT05MWV9DT09LSUVfU1FMKTsKKyAgICBjcmVhdGVQcmVwYXJlU3RhdGVtZW50KERFTEVURV9D
T09LSUVfQllfTkFNRV9ET01BSU5fUEFUSF9TUUwpOworICAgIGNyZWF0ZVByZXBhcmVTdGF0ZW1l
bnQoREVMRVRFX0NPT0tJRV9CWV9OQU1FX0RPTUFJTl9TUUwpOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgQ29va2llSmFyREI6OmNsb3NlRGF0YWJhc2UoKQoreworICAgIGlmIChtX2Rh
dGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RhdGVtZW50IDog
bV9zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZhbHVlLmdldCgpLT5maW5hbGl6
ZSgpOworICAgICAgICBtX3N0YXRlbWVudHMuY2xlYXIoKTsKKyAgICAgICAgbV9kYXRhYmFzZS5j
bG9zZSgpOworICAgIH0KK30KKworU3RyaW5nIENvb2tpZUphckRCOjpnZXRDb3JydXB0aW9uTWFy
a2VyUGF0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFpc09uTWVtb3J5KCkpOworCisgICAgcmV0
dXJuIG1fZGF0YWJhc2VQYXRoICsgQ09SUlVQVF9NQVJLRVJfU1VGRklYOworfQorCit2b2lkIENv
b2tpZUphckRCOjpmbGFnRGF0YWJhc2VDb3JydXB0aW9uKCkKK3sKKyAgICBpZiAoaXNPbk1lbW9y
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBGSUxFKiBmID0gZm9wZW4oZ2V0Q29ycnVwdGlv
bk1hcmtlclBhdGgoKS51dGY4KCkuZGF0YSgpLCAid2IiKTsKKyAgICBmY2xvc2UoZik7Cit9CisK
K2Jvb2wgQ29va2llSmFyREI6OmNoZWNrRGF0YWJhc2VDb3JydXB0aW9uQW5kUmVtb3ZlSWZOZWVk
ZWQoKQoreworICAgIGlmIChpc09uTWVtb3J5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIHN0cnVjdCBzdGF0IHN0ID0geyAwIH07CisgICAgaW50IHJldCA9IHN0YXQoZ2V0Q29ycnVw
dGlvbk1hcmtlclBhdGgoKS51dGY4KCkuZGF0YSgpLCAmc3QpOworICAgIGlmICghcmV0KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmNoZWNrU1FMaXRlUmV0dXJuQ29k
ZShpbnQgYWN0dWFsLCBpbnQgZXhwZWN0ZWQpCit7CisgICAgaWYgKCFtX2RldGVjdGVkRGF0YWJh
c2VDb3JydXB0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoYWN0dWFsKSB7CisgICAgICAgIGNhc2Ug
U1FMSVRFX0NPUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX1NDSEVNQToKKyAgICAgICAgY2Fz
ZSBTUUxJVEVfRk9STUFUOgorICAgICAgICBjYXNlIFNRTElURV9OT1RBREI6CisgICAgICAgICAg
ICBmbGFnRGF0YWJhc2VDb3JydXB0aW9uKCk7CisgICAgICAgICAgICBtX2RldGVjdGVkRGF0YWJh
c2VDb3JydXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoYWN0
dWFsID09IGV4cGVjdGVkKTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6Y2hlY2tEYXRhYmFzZVZh
bGlkaXR5KCkKK3sKKyAgICBBU1NFUlQobV9kYXRhYmFzZS5pc09wZW4oKSk7CisKKyAgICByZXR1
cm4gbV9kYXRhYmFzZS50YWJsZUV4aXN0cygiQ29va2llIik7Cit9CisKK3ZvaWQgQ29va2llSmFy
REI6OmRlbGV0ZUFsbERhdGFiYXNlRmlsZXMoKQoreworICAgIGNsb3NlRGF0YWJhc2UoKTsKKyAg
ICBpZiAoaXNPbk1lbW9yeSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgcmV0ID0gMDsK
KyAgICBTdHJpbmcgcmVtb3ZlUGF0aDsKKworICAgIC8vIHJlbW92ZSBtYXJrZXIgZmlsZSAoY29v
a2llLmphci5kYi1jb3JydXB0ZWQpCisgICAgcmV0ID0gcmVtb3ZlKHJlbW92ZVBhdGgudXRmOCgp
LmRhdGEoKSk7CisKKyAgICAvLyByZW1vdmUgc2htIGZpbGUgKGNvb2tpZS5qYXIuZGItc2htKQor
ICAgIHJlbW92ZVBhdGggPSBTdHJpbmcobV9kYXRhYmFzZVBhdGggKyAiLXNobSIpOworICAgIHJl
dCA9IHJlbW92ZShyZW1vdmVQYXRoLnV0ZjgoKS5kYXRhKCkpOworCisgICAgLy8gcmVtb3ZlIHdh
bCBmaWxlIChjb29raWUuamFyLmRiLXdhbCkKKyAgICByZW1vdmVQYXRoID0gU3RyaW5nKG1fZGF0
YWJhc2VQYXRoICsgIi13YWwiKTsKKyAgICByZXQgPSByZW1vdmUocmVtb3ZlUGF0aC51dGY4KCku
ZGF0YSgpKTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6aXNFbmFibGVkKCkKK3sKKyAgICBpZiAo
bV9kYXRhYmFzZVBhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gbV9jb29raWVFbmFibGU7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OnNlYXJjaENvb2tp
ZXMoY29uc3QgU3RyaW5nJiByZXF1ZXN0VXJsLCBjb25zdCBzdGQ6Om9wdGlvbmFsPGJvb2w+JiBo
dHRwT25seSwgY29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgc2VjdXJlLCBjb25zdCBzdGQ6Om9w
dGlvbmFsPGJvb2w+JiBzZXNzaW9uLCBWZWN0b3I8Q29va2llPiYgcmVzdWx0cykKK3sKKyAgICBp
ZiAoIWlzRW5hYmxlZCgpIHx8ICFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBVUkwgcmVxdWVzdFVybE9iaihQYXJzZWRVUkxTdHJpbmcsIHJlcXVlc3RV
cmwpOworICAgIFN0cmluZyByZXF1ZXN0SG9zdChyZXF1ZXN0VXJsT2JqLmhvc3QoKS5jb252ZXJ0
VG9BU0NJSUxvd2VyY2FzZSgpKTsKKyAgICBTdHJpbmcgcmVxdWVzdFBhdGgocmVxdWVzdFVybE9i
ai5wYXRoKCkuY29udmVydFRvQVNDSUlMb3dlcmNhc2UoKSk7CisKKyAgICBpZiAocmVxdWVzdEhv
c3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocmVxdWVzdFBh
dGguaXNFbXB0eSgpKQorICAgICAgICByZXF1ZXN0UGF0aCA9ICIvIjsKKworICAgIGNvbnN0IFN0
cmluZyBzcWwgPQorICAgICAgICAiU0VMRUNUIG5hbWUsIHZhbHVlLCBkb21haW4sIHBhdGgsIGV4
cGlyZXMsIGh0dHBvbmx5LCBzZWN1cmUsIHNlc3Npb24gRlJPTSBDb29raWUgV0hFUkUgIlwKKyAg
ICAgICAgIihOT1QgKChzZXNzaW9uID0gMCkgQU5EIChkYXRldGltZShleHBpcmVzLCAndW5peGVw
b2NoJykgPCBkYXRldGltZSgnbm93JykpKSkgIlwKKyAgICAgICAgIkFORCAoaHR0cG9ubHkgPSBD
T0FMRVNDRShOVUxMSUYoPywgLTEpLCBodHRwb25seSkpICJcCisgICAgICAgICJBTkQgKHNlY3Vy
ZSA9IENPQUxFU0NFKE5VTExJRig/LCAtMSksIHNlY3VyZSkpICJcCisgICAgICAgICJBTkQgKHNl
c3Npb24gPSBDT0FMRVNDRShOVUxMSUYoPywgLTEpLCBzZXNzaW9uKSkgIlwKKyAgICAgICAgIkFO
RCAoKGRvbWFpbiA9ID8pIE9SIChkb21haW4gR0xPQiA/KSkiOworCisgICAgc3RkOjp1bmlxdWVf
cHRyPFNRTGl0ZVN0YXRlbWVudD4gcHN0bXQgPSBzdGQ6Om1ha2VfdW5pcXVlPFNRTGl0ZVN0YXRl
bWVudD4obV9kYXRhYmFzZSwgc3FsKTsKKyAgICBwc3RtdC0+cHJlcGFyZSgpOworICAgIHBzdG10
LT5iaW5kSW50KDEsIGh0dHBPbmx5ID8gKmh0dHBPbmx5IDogLTEpOworICAgIHBzdG10LT5iaW5k
SW50KDIsIHNlY3VyZSA/ICpzZWN1cmUgOiAtMSk7CisgICAgcHN0bXQtPmJpbmRJbnQoMywgc2Vz
c2lvbiA/ICpzZXNzaW9uIDogLTEpOworICAgIHBzdG10LT5iaW5kVGV4dCg0LCByZXF1ZXN0SG9z
dCk7CisKKyAgICBzaXplX3QgdG9wTGV2ZWxTZXBhcmF0b3IgPSByZXF1ZXN0SG9zdC5yZXZlcnNl
RmluZCgnLicpOworICAgIGlmIChDb29raWVVdGlsOjppc0lQQWRkcmVzcyhyZXF1ZXN0SG9zdCkg
fHwgdG9wTGV2ZWxTZXBhcmF0b3IgPT0gbm90Rm91bmQpCisgICAgICAgIHBzdG10LT5iaW5kTnVs
bCg1KTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogRklYTUU6IGN1cnJlbnRseSB3ZSBjdXJyZW50
bHkgZG8gbm90IGhhdmUgYSBwdWJsaWMgc3VmZmljIGxpc3QgaW4gd2luY2Fpcm8KKyAgICAgICAg
ICAgc28gcmlnaHQgbm93IHdlIGdsb2IgdXNpbmcganVzdCB0aGUgc2Vjb25kIGxldmVsIGRvbWFp
biBlLmcuICouRE9NQUlOLmNvbQorICAgICAgICAgICBUaGlzIHdpbGwgcmV0dXJuIHRvbyBtYW55
IGNvb2tpZXMgdW5kZXIgbXVsdGlsZXZlbCB0bGRzIHN1Y2ggYXMgKi5jby51aworICAgICAgICAg
ICBidXQgd2UgZmlsdGVyIHRob3NlIG91dCBsYXRlcgorICAgICAgICAqLworCisgICAgICAgIHNp
emVfdCBzZWNvbmRMZXZlbFNlcGFyYXRvciA9IHJlcXVlc3RIb3N0LnJldmVyc2VGaW5kKCcuJywg
dG9wTGV2ZWxTZXBhcmF0b3ItMSk7CisgICAgICAgIFN0cmluZyBsb2NhbERvbWFpbiA9IHNlY29u
ZExldmVsU2VwYXJhdG9yID09IG5vdEZvdW5kID8gcmVxdWVzdEhvc3QgOiByZXF1ZXN0SG9zdC5z
dWJzdHJpbmcoc2Vjb25kTGV2ZWxTZXBhcmF0b3IrMSk7CisKKyAgICAgICAgQVNTRVJUKCFsb2Nh
bERvbWFpbi5pc0VtcHR5KCkpOworICAgICAgICBwc3RtdC0+YmluZFRleHQoNSwgU3RyaW5nKCIq
LiIpICsgbG9jYWxEb21haW4pOworICAgIH0KKworICAgIGlmICghcHN0bXQpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIHJlc3VsdHMuY2xlYXIoKTsKKworICAgIHdoaWxlIChwc3RtdC0+
c3RlcCgpID09IFNRTElURV9ST1cpIHsKKworICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPiBN
QVhfQ09PS0lFX1BFUl9ET01BSU4pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBTdHJp
bmcgY29va2llTmFtZSA9IHBzdG10LT5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcg
Y29va2llVmFsdWUgPSBwc3RtdC0+Z2V0Q29sdW1uVGV4dCgxKTsKKyAgICAgICAgU3RyaW5nIGNv
b2tpZURvbWFpbiA9IHBzdG10LT5nZXRDb2x1bW5UZXh0KDIpLmNvbnZlcnRUb0FTQ0lJTG93ZXJj
YXNlKCk7CisgICAgICAgIFN0cmluZyBjb29raWVQYXRoID0gcHN0bXQtPmdldENvbHVtblRleHQo
MykuY29udmVydFRvQVNDSUlMb3dlcmNhc2UoKTsKKyAgICAgICAgZG91YmxlIGNvb2tpZUV4cGly
ZXMgPSAoZG91YmxlKXBzdG10LT5nZXRDb2x1bW5JbnQ2NCg0KSAqIDEwMDA7CisgICAgICAgIGJv
b2wgY29va2llSHR0cE9ubHkgPSAocHN0bXQtPmdldENvbHVtbkludCg1KSA9PSAxKTsKKyAgICAg
ICAgYm9vbCBjb29raWVTZWN1cmUgPSAocHN0bXQtPmdldENvbHVtbkludCg2KSA9PSAxKTsKKyAg
ICAgICAgYm9vbCBjb29raWVTZXNzaW9uID0gKHBzdG10LT5nZXRDb2x1bW5JbnQoNykgPT0gMSk7
CisKKyAgICAgICAgaWYgKCFDb29raWVVdGlsOjpkb21haW5NYXRjaChjb29raWVEb21haW4sIHJl
cXVlc3RIb3N0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIGh0dHBzOi8v
dG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4xLjQgIlBhdGhzIGFuZCBQYXRo
LU1hdGNoIgorICAgICAgICBib29sIGlzUGF0aE1hdGNoZWQgPSBjb29raWVQYXRoID09IHJlcXVl
c3RQYXRoCisgICAgICAgICAgICB8fCAocmVxdWVzdFBhdGguc3RhcnRzV2l0aChjb29raWVQYXRo
KSAmJiBjb29raWVQYXRoLmVuZHNXaXRoKCcvJykpCisgICAgICAgICAgICB8fCAocmVxdWVzdFBh
dGguc3RhcnRzV2l0aChjb29raWVQYXRoKSAmJiAocmVxdWVzdFBhdGguY2hhcmFjdGVyQXQoY29v
a2llUGF0aC5sZW5ndGgoKSkgPT0gJy8nKSk7CisKKyAgICAgICAgaWYgKCFpc1BhdGhNYXRjaGVk
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgQ29va2llIHJlc3VsdChjb29raWVO
YW1lLAorICAgICAgICAgICAgY29va2llVmFsdWUsCisgICAgICAgICAgICBjb29raWVEb21haW4s
CisgICAgICAgICAgICBjb29raWVQYXRoLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIGNv
b2tpZUV4cGlyZXMsCisgICAgICAgICAgICBjb29raWVIdHRwT25seSwKKyAgICAgICAgICAgIGNv
b2tpZVNlY3VyZSwKKyAgICAgICAgICAgIGNvb2tpZVNlc3Npb24sCisgICAgICAgICAgICBTdHJp
bmcoKSwKKyAgICAgICAgICAgIFVSTCgpLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQxNl90Pigp
KTsKKworICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQpOworICAgIH0KKyAgICBwc3RtdC0+
ZmluYWxpemUoKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvb2tpZUphckRCOjpo
YXNIdHRwT25seUNvb2tpZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZG9tYWlu
LCBjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgU1FMaXRlU3RhdGVtZW50KiBzdGF0ZW1lbnQg
PSBnZXRQcmVwYXJlU3RhdGVtZW50KENIRUNLX0VYSVNUU19IVFRQT05MWV9DT09LSUVfU1FMKTsK
KyAgICBBU1NFUlQoc3RhdGVtZW50KTsKKworICAgIHN0YXRlbWVudC0+YmluZFRleHQoMSwgbmFt
ZSk7CisgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgyLCBkb21haW4pOworICAgIHN0YXRlbWVudC0+
YmluZFRleHQoMywgcGF0aCk7CisKKyAgICByZXR1cm4gc3RhdGVtZW50LT5zdGVwKCkgPT0gU1FM
SVRFX1JPVzsKK30KKworCitpbnQgQ29va2llSmFyREI6OnNldENvb2tpZShjb25zdCBDb29raWUm
IGNvb2tpZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoIWNvb2tpZS5zZXNzaW9uICYm
IChjb29raWUuZXhwaXJlcyA8IDo6dGltZSgwKSkpCisgICAgICAgIHJldCA9IGRlbGV0ZUNvb2tp
ZUludGVybmFsKGNvb2tpZS5uYW1lLCBjb29raWUuZG9tYWluLCBjb29raWUucGF0aCk7CisgICAg
ZWxzZSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0
YXRlbWVudChTRVRfQ09PS0lFX1NRTCk7CisgICAgICAgIEFTU0VSVChzdGF0ZW1lbnQpOworCisg
ICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgaGF2ZSBzb21lIGV2aWN0aW9uIHBvbGljeSB3aGVu
IGEgZG9tYWluIGdvZXMgb3ZlciBNQVhfQ09PS0lFX1BFUl9ET01BSU4KKworICAgICAgICBzdGF0
ZW1lbnQtPmJpbmRUZXh0KDEsIGNvb2tpZS5uYW1lKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5k
VGV4dCgyLCBjb29raWUudmFsdWUpOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIGNv
b2tpZS5kb21haW4pOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDQsIGNvb2tpZS5wYXRo
KTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50NjQoNSwgY29va2llLnNlc3Npb24gPyAwIDog
KGludDY0X3QpY29va2llLmV4cGlyZXMpOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRJbnQoNiwg
Y29va2llLnZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDcsIGNv
b2tpZS5zZXNzaW9uID8gMSA6IDApOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRJbnQoOCwgY29v
a2llLmh0dHBPbmx5ID8gMSA6IDApOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRJbnQoOSwgY29v
a2llLnNlY3VyZSA/IDEgOiAwKTsKKworICAgICAgICByZXQgPSBzdGF0ZW1lbnQtPnN0ZXAoKTsK
KyAgICB9CisgICAgQVNTRVJUKGNoZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElURV9ET05F
KSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgQ29va2llSmFyREI6OnNldENvb2tpZShj
b25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBjb29raWUsIGJvb2wgZnJvbUphdmFTY3Jp
cHQpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAg
ICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHVybC5pc0VtcHR5KCkgfHwgY29va2llLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgVVJMIHVybE9iaihQYXJzZWRVUkxTdHJp
bmcsIHVybCk7CisgICAgU3RyaW5nIGhvc3QodXJsT2JqLmhvc3QoKSk7CisgICAgU3RyaW5nIHBh
dGgodXJsT2JqLnBhdGgoKSk7CisKKyAgICBDb29raWUgY29va2llT2JqOworICAgIGlmICghQ29v
a2llVXRpbDo6cGFyc2VDb29raWVIZWFkZXIoY29va2llLCBob3N0LCBjb29raWVPYmopKQorICAg
ICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoY29va2llT2JqLmRvbWFpbi5pc0VtcHR5KCkpCisg
ICAgICAgIGNvb2tpZU9iai5kb21haW4gPSBTdHJpbmcoaG9zdCk7CisKKyAgICBpZiAoY29va2ll
T2JqLnBhdGguaXNFbXB0eSgpKQorICAgICAgICBjb29raWVPYmoucGF0aCA9IFN0cmluZyhwYXRo
KTsKKworICAgIC8vIEZJWE1FOiBOZWVkIHRvIGNoZWNrIHRoYXQgYSBkb21haW4gZG9lc24ndCBh
IHNldCBjb29raWUgZm9yIGEgdGxkIHdoZW4gd2luY2Fpcm8gc3VwcG9ydHMgUFNMCisKKyAgICBp
ZiAoZnJvbUphdmFTY3JpcHQgJiYgY29va2llT2JqLmh0dHBPbmx5KQorICAgICAgICByZXR1cm4g
LTE7CisKKyAgICBpZiAoZnJvbUphdmFTY3JpcHQgJiYgaGFzSHR0cE9ubHlDb29raWUoY29va2ll
T2JqLm5hbWUsIGNvb2tpZU9iai5kb21haW4sIGNvb2tpZU9iai5wYXRoKSkKKyAgICAgICAgcmV0
dXJuIC0xOworCisgICAgcmV0dXJuIHNldENvb2tpZShjb29raWVPYmopOworfQorCitpbnQgQ29v
a2llSmFyREI6OmRlbGV0ZUNvb2tpZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBu
YW1lKQoreworICAgIGlmICghaXNFbmFibGVkKCkgfHwgIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisg
ICAgICAgIHJldHVybiAtMTsKKworICAgIFN0cmluZyB1cmxDb3BpZWQgPSBTdHJpbmcodXJsKTsK
KyAgICBpZiAodXJsQ29waWVkLnN0YXJ0c1dpdGgoJy4nKSkKKyAgICAgICAgdXJsQ29waWVkLnJl
bW92ZSgwLCAxKTsKKworICAgIFVSTCB1cmxPYmooUGFyc2VkVVJMU3RyaW5nLCB1cmxDb3BpZWQp
OworICAgIGlmICh1cmxPYmouaXNWYWxpZCgpKSB7CisgICAgICAgIFN0cmluZyBob3N0U3RyKHVy
bE9iai5ob3N0KCkpOworICAgICAgICBTdHJpbmcgcGF0aFN0cih1cmxPYmoucGF0aCgpKTsKKyAg
ICAgICAgaW50IHJldCA9IGRlbGV0ZUNvb2tpZUludGVybmFsKG5hbWUsIGhvc3RTdHIsIHBhdGhT
dHIpOworICAgICAgICBBU1NFUlQoY2hlY2tTUUxpdGVSZXR1cm5Db2RlKHJldCwgU1FMSVRFX0RP
TkUpKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAtMTsKK30K
KworaW50IENvb2tpZUphckRCOjpkZWxldGVDb29raWVJbnRlcm5hbChjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgU1FM
aXRlU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CisgICAgaWYgKCFwYXRoLmlzRW1wdHkoKSkgeworICAg
ICAgICBzdGF0ZW1lbnQgPSBnZXRQcmVwYXJlU3RhdGVtZW50KERFTEVURV9DT09LSUVfQllfTkFN
RV9ET01BSU5fUEFUSF9TUUwpOworICAgICAgICBBU1NFUlQoc3RhdGVtZW50KTsKKyAgICAgICAg
c3RhdGVtZW50LT5iaW5kVGV4dCgxLCBuYW1lKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4
dCgyLCBkb21haW4pOworICAgICAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIHBhdGgpOworICAg
IH0gZWxzZSB7CisgICAgICAgIHN0YXRlbWVudCA9IGdldFByZXBhcmVTdGF0ZW1lbnQoREVMRVRF
X0NPT0tJRV9CWV9OQU1FX0RPTUFJTl9TUUwpOworICAgICAgICBBU1NFUlQoc3RhdGVtZW50KTsK
KyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBuYW1lKTsKKyAgICAgICAgc3RhdGVtZW50
LT5iaW5kVGV4dCgyLCBkb21haW4pOworICAgIH0KKworICAgIHJldHVybiBzdGF0ZW1lbnQtPnN0
ZXAoKTsKK30KKworaW50IENvb2tpZUphckRCOjpkZWxldGVDb29raWVzKGNvbnN0IFN0cmluZyYg
dXJsKQoreworICAgIC8vIE5PVCBJTVBMRU1FTlRFRAorICAgIC8vIFRPRE86IHRoaXMgZnVuY3Rp
b24gd2lsbCBiZSBjYWxsZWQgaWYgYXBwbGljYXRpb24gY2FsbHMgV0tDb29raWVNYW5hZ2VyRGVs
ZXRlQ29va2llc0Zvckhvc3RuYW1lKCkgaW4gV0tDb29raWVNYW5hZ2VyLmguCisgICAgcmV0dXJu
IDA7Cit9CisKK2ludCBDb29raWVKYXJEQjo6ZGVsZXRlQWxsQ29va2llcygpCit7CisgICAgaWYg
KCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuIC0x
OworCisgICAgcmV0dXJuIGV4ZWN1dGVTaW1wbGVTcWwoREVMRVRFX0FMTF9DT09LSUVfU1FMKTsK
K30KKwordm9pZCBDb29raWVKYXJEQjo6Y3JlYXRlUHJlcGFyZVN0YXRlbWVudChjb25zdCBjaGFy
KiBzcWwpCit7CisgICAgYXV0byBzdGF0ZW1lbnQgPSBzdGQ6Om1ha2VfdW5pcXVlPFNRTGl0ZVN0
YXRlbWVudD4obV9kYXRhYmFzZSwgc3FsKTsKKyAgICBpbnQgcmV0ID0gc3RhdGVtZW50LT5wcmVw
YXJlKCk7CisgICAgQVNTRVJUKHJldCA9PSBTUUxJVEVfT0spOworICAgIG1fc3RhdGVtZW50cy5h
ZGQoU3RyaW5nKHNxbCksIFdURk1vdmUoc3RhdGVtZW50KSk7Cit9CisKK1NRTGl0ZVN0YXRlbWVu
dCogQ29va2llSmFyREI6OmdldFByZXBhcmVTdGF0ZW1lbnQoY29uc3QgY2hhciogc3FsKQorewor
ICAgIGNvbnN0IGF1dG8mIHN0YXRlbWVudCA9IG1fc3RhdGVtZW50cy5nZXQoU3RyaW5nKHNxbCkp
OworICAgIEFTU0VSVChzdGF0ZW1lbnQpOworICAgIHN0YXRlbWVudC0+cmVzZXQoKTsKKyAgICBy
ZXR1cm4gc3RhdGVtZW50OworfQorCitpbnQgQ29va2llSmFyREI6OmV4ZWN1dGVTaW1wbGVTcWwo
Y29uc3QgY2hhciogc3FsLCBib29sIGlnbm9yZUVycm9yKQoreworICAgIFNRTGl0ZVN0YXRlbWVu
dCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgc3FsKTsKKyAgICBpbnQgcmV0ID0gc3RhdGVtZW50LnBy
ZXBhcmVBbmRTdGVwKCk7CisgICAgc3RhdGVtZW50LmZpbmFsaXplKCk7CisKKyAgICBBU1NFUlQo
Y2hlY2tTUUxpdGVSZXR1cm5Db2RlKHJldCwgU1FMSVRFX09LKQorICAgICAgICB8fCBjaGVja1NR
TGl0ZVJldHVybkNvZGUocmV0LCBTUUxJVEVfRE9ORSkKKyAgICAgICAgfHwgY2hlY2tTUUxpdGVS
ZXR1cm5Db2RlKHJldCwgU1FMSVRFX1JPVykKKyAgICAgICAgfHwgaWdub3JlRXJyb3IpOworICAg
IHJldHVybiByZXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjVlYzMwOWJmNTZjCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmgKQEAg
LTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZl
IEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ29va2llLmgiCisj
aW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJTUUxpdGVTdGF0ZW1lbnQuaCIK
KyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgor
I2luY2x1ZGUgPHd0Zi9PcHRpb25hbC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5n
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ29va2llSmFyREIgeworICAgIFdU
Rl9NQUtFX05PTkNPUFlBQkxFKENvb2tpZUphckRCKTsKKworcHVibGljOgorICAgIGJvb2wgaXNF
bmFibGVkKCk7CisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wpOworCisgICAgYm9vbCBzZWFyY2hD
b29raWVzKGNvbnN0IFN0cmluZyYgcmVxdWVzdFVybCwgY29uc3Qgc3RkOjpvcHRpb25hbDxib29s
PiYgaHR0cE9ubHksIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIHNlY3VyZSwgY29uc3Qgc3Rk
OjpvcHRpb25hbDxib29sPiYgc2Vzc2lvbiwgVmVjdG9yPENvb2tpZT4mIHJlc3VsdHMpOworICAg
IGludCBzZXRDb29raWUoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2llLCBi
b29sIGZyb21KYXZhU2NyaXB0KTsKKyAgICBpbnQgc2V0Q29va2llKGNvbnN0IENvb2tpZSYpOwor
CisgICAgaW50IGRlbGV0ZUNvb2tpZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBu
YW1lKTsKKyAgICBpbnQgZGVsZXRlQ29va2llcyhjb25zdCBTdHJpbmcmIHVybCk7CisgICAgaW50
IGRlbGV0ZUFsbENvb2tpZXMoKTsKKworICAgIENvb2tpZUphckRCKGNvbnN0IFN0cmluZyYgZGF0
YWJhc2VQYXRoKTsKKyAgICB+Q29va2llSmFyREIoKTsKKworcHJpdmF0ZToKKworICAgIGJvb2wg
bV9jb29raWVFbmFibGUge3RydWV9OworICAgIFN0cmluZyBtX2RhdGFiYXNlUGF0aDsKKworICAg
IGJvb2wgbV9kZXRlY3RlZERhdGFiYXNlQ29ycnVwdGlvbiB7ZmFsc2V9OworCisgICAgYm9vbCBp
c09uTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gKG1fZGF0YWJhc2VQYXRoID09ICI6b25tZW1vcnk6
Iik7IH07CisKKyAgICBib29sIG9wZW5EYXRhYmFzZSgpOworICAgIHZvaWQgY2xvc2VEYXRhYmFz
ZSgpOworCisgICAgYm9vbCBjaGVja1NRTGl0ZVJldHVybkNvZGUoaW50IGFjdHVhbCwgaW50IGV4
cGVjdGVkKTsKKyAgICB2b2lkIGZsYWdEYXRhYmFzZUNvcnJ1cHRpb24oKTsKKyAgICBib29sIGNo
ZWNrRGF0YWJhc2VDb3JydXB0aW9uQW5kUmVtb3ZlSWZOZWVkZWQoKTsKKyAgICBTdHJpbmcgZ2V0
Q29ycnVwdGlvbk1hcmtlclBhdGgoKSBjb25zdDsKKworICAgIGJvb2wgY2hlY2tEYXRhYmFzZVZh
bGlkaXR5KCk7CisgICAgdm9pZCBkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCk7CisKKyAgICB2b2lk
IGNyZWF0ZVByZXBhcmVTdGF0ZW1lbnQoY29uc3QgY2hhciogc3FsKTsKKyAgICBTUUxpdGVTdGF0
ZW1lbnQqIGdldFByZXBhcmVTdGF0ZW1lbnQoY29uc3QgY2hhciogc3FsKTsKKyAgICBpbnQgZXhl
Y3V0ZVNpbXBsZVNxbChjb25zdCBjaGFyKiBzcWwsIGJvb2wgaWdub3JlRXJyb3IgPSBmYWxzZSk7
CisKKyAgICBpbnQgZGVsZXRlQ29va2llSW50ZXJuYWwoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwYXRoKTsKKyAgICBib29sIGhhc0h0dHBP
bmx5Q29va2llKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0
IFN0cmluZyYgcGF0aCk7CisKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RhdGFiYXNlOworICAgIEhh
c2hNYXA8U3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8U1FMaXRlU3RhdGVtZW50Pj4gbV9zdGF0ZW1l
bnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuY3BwIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi45NTVlNWQxNTBlYQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcApAQCAtMCww
ICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZlIEVu
dGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisg
KiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMK
KyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29raWVVdGls
LmgiCisKKyNpZiBVU0UoQ1VSTCkKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorCisjaW5jbHVkZSA8
d3RmL0RhdGVNYXRoLmg+CisjaW5jbHVkZSA8d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvV1RGU3RyaW5nLmg+CisKKy8qIFRoaXMgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGgg
d2UgYWNjZXB0IGZvciBhIGNvb2tpZSBsaW5lLiBSRkMgMjEwOQorICAgc2VjdGlvbiA2LjMgc2F5
czoKKworICAgImF0IGxlYXN0IDQwOTYgYnl0ZXMgcGVyIGNvb2tpZSAoYXMgbWVhc3VyZWQgYnkg
dGhlIHNpemUgb2YgdGhlIGNoYXJhY3RlcnMKKyAgIHRoYXQgY29tcHJpc2UgdGhlIGNvb2tpZSBu
b24tdGVybWluYWwgaW4gdGhlIHN5bnRheCBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgIFNldC1Db29r
aWUgaGVhZGVyKSIKKyovCisKKyNkZWZpbmUgTUFYX0NPT0tJRV9MSU5FIDUwMDAKKyNkZWZpbmUg
TUFYX0NPT0tJRV9MSU5FX1RYVCAiNDk5OSIKKworI2RlZmluZSBNQVhfTkFNRSAxMDI0CisjZGVm
aW5lIE1BWF9OQU1FX1RYVCAiMTAyMyIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCituYW1lc3Bh
Y2UgQ29va2llVXRpbCB7CisKK2Jvb2wgaXNJUEFkZHJlc3MoY29uc3QgU3RyaW5nJiBob3N0bmFt
ZSkKK3sKKyAgICAvLyBBc3N1bWluZyB0aGF0IGhvc3RzIGVuZGluZyBpbiBhIGRpZ2l0IGFyZSBJ
UCBBZGRyZXNzZXMKKyAgICByZXR1cm4gIWhvc3RuYW1lLmlzRW1wdHkoKSAmJiBpc0FTQ0lJRGln
aXQoaG9zdG5hbWVbaG9zdG5hbWUubGVuZ3RoKCkgLSAxXSk7Cit9CisKK2Jvb2wgZG9tYWluTWF0
Y2goY29uc3QgU3RyaW5nJiBjb29raWVEb21haW4sIGNvbnN0IFN0cmluZyYgaG9zdCkKK3sKKyAg
ICBzaXplX3QgaW5kZXggPSBob3N0LmZpbmQoY29va2llRG9tYWluKTsKKworICAgIGJvb2wgdGFp
bE1hdGNoID0gKGluZGV4ICE9IFdURjo6bm90Rm91bmQgJiYgaW5kZXggKyBjb29raWVEb21haW4u
bGVuZ3RoKCkgPT0gaG9zdC5sZW5ndGgoKSk7CisKKyAgICAvLyBDaGVjayBpZiBob3N0IGVxdWFs
cyBjb29raWUgZG9tYWluLgorICAgIGlmICh0YWlsTWF0Y2ggJiYgIWluZGV4KQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIC8vIENoZWNrIGlmIGhvc3QgaXMgYSBzdWJkb21haW4gb2YgdGhl
IGRvbWFpbiBpbiB0aGUgY29va2llLgorICAgIC8vIEN1cmwgdXNlcyBhICcuJyBpbiBmcm9udCBv
ZiBkb21haW5zIHRvIGluZGljYXRlIGl0J3MgdmFsaWQgb24gc3ViZG9tYWlucy4KKyAgICBpZiAo
dGFpbE1hdGNoICYmIGluZGV4ID4gMCAmJiBob3N0W2luZGV4XSA9PSAnLicpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgLy8gQ2hlY2sgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBob3N0IGVx
dWFscyB0aGUgY29va2llIGRvbWFpbiwgZXhjZXB0IGZvciBhIGxlYWRpbmcgJy4nIGluIHRoZSBj
b29raWUgZG9tYWluLgorICAgIC8vIEUuZy4gY29va2llIGRvbWFpbiBpcyAuYXBwbGUuY29tIGFu
ZCBob3N0IGlzIGFwcGxlLmNvbS4KKyAgICBpZiAoY29va2llRG9tYWluWzBdID09ICcuJyAmJiBj
b29raWVEb21haW4uZmluZChob3N0KSA9PSAxKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHN0ZDo6b3B0aW9uYWw8ZG91YmxlPiBwYXJzZUV4
cGlyZXMoY29uc3QgY2hhciogZXhwaXJlcykKK3sKKyAgICBkb3VibGUgdG1wID0gV1RGOjpwYXJz
ZURhdGVGcm9tTnVsbFRlcm1pbmF0ZWRDaGFyYWN0ZXJzKGV4cGlyZXMpOworICAgIGlmIChpc25h
bih0bXApKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgcmV0dXJuIHN0ZDo6b3B0aW9uYWw8
ZG91YmxlPiB7dG1wIC8gV1RGOjptc1BlclNlY29uZH07Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNl
Q29va2llQXR0cmlidXRlcyhjb25zdCBTdHJpbmcmIGF0dHJpYnV0ZSwgY29uc3QgU3RyaW5nJiBk
b21haW4sIGJvb2wmIGhhc01heEFnZSwgQ29va2llJiByZXN1bHQpCit7CisgICAgc2l6ZV90IGFz
c2lnbm1lbnRQb3NpdGlvbiA9IGF0dHJpYnV0ZS5maW5kKCc9Jyk7CisKKyAgICBTdHJpbmcgYXR0
cmlidXRlTmFtZTsKKyAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWU7CisKKyAgICBpZiAoYXNzaWdu
bWVudFBvc2l0aW9uICE9IG5vdEZvdW5kKSB7CisgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRy
aWJ1dGUuc3Vic3RyaW5nKDAsIGFzc2lnbm1lbnRQb3NpdGlvbikuc3RyaXBXaGl0ZVNwYWNlKCk7
CisgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlLnN1YnN0cmluZyhhc3NpZ25tZW50
UG9zaXRpb24gKyAxKS5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYXR0
cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5zdHJpcFdoaXRlU3BhY2UoKTsKKworICAgIGlmIChlcXVh
bElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJodHRwb25seSIpKQorICAgICAgICBy
ZXN1bHQuaHR0cE9ubHkgPSB0cnVlOworICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdBU0NJSUNh
c2UoYXR0cmlidXRlTmFtZSwgInNlY3VyZSIpKQorICAgICAgICByZXN1bHQuc2VjdXJlID0gdHJ1
ZTsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJk
b21haW4iKSkgeworICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEVuZm9yY2UgYSBkb3QgY2hhcmFjdGVyIHByZWZp
eCB0byBob3N0bmFtZXMgd2hpY2ggYXJlIG5vdCBpcCBhZGRyZXNzZXMgYW5kIG5vdCBzaW5nbGUg
dmFsdWUgaG9zdG5hbWVzIHN1Y2ggYXMgbG9jYWxob3N0CisgICAgICAgIGlmICghaXNJUEFkZHJl
c3MoYXR0cmlidXRlVmFsdWUpICYmICFhdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKCcuJykgJiYg
YXR0cmlidXRlVmFsdWUuZmluZCgnLicpICE9IG5vdEZvdW5kKQorICAgICAgICAgICAgYXR0cmli
dXRlVmFsdWUgPSAiLiIgKyBhdHRyaWJ1dGVWYWx1ZTsKKworICAgICAgICAvLyBNYWtlIHN1cmUg
dGhlIGhvc3QgY2FuIHNldCBhIGNvb2tpZSBmb3IgdGhlIGRvbWFpbgorICAgICAgICAvLyBGSVhN
RTogZmlyZWZveCBhbmQgY2hyb21lIGJvdGggaWdub3JlIGNvb2tpZXMgd2l0aCBubyB2YWxpZCBk
b21haW4gc2V0CisgICAgICAgIC8vIHdlIGN1cnJlbnRseSBpZ25vcmUgdGhlIGludmFsaWQgZG9t
YWlucyBhbmQgZGVmYXVsdCB0byB0aGUgaG9zdG5hbWUgYXMgdGhlIGRvbWFpbgorICAgICAgICBp
ZiAoZG9tYWluTWF0Y2goYXR0cmlidXRlVmFsdWUsIGRvbWFpbikpCisgICAgICAgICAgICByZXN1
bHQuZG9tYWluID0gYXR0cmlidXRlVmFsdWU7CisKKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdBU0NJSUNhc2UoYXR0cmlidXRlTmFtZSwgIm1heC1hZ2UiKSkgeworICAgICAgICBib29sIG9r
OworICAgICAgICB0aW1lX3QgZXhwaXJ5VGltZSA9IHRpbWUoMCkgKyBhdHRyaWJ1dGVWYWx1ZS50
b0ludDY0KCZvayk7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgcmVzdWx0LmV4cGly
ZXMgPSAoZG91YmxlKWV4cGlyeVRpbWU7CisgICAgICAgICAgICByZXN1bHQuc2Vzc2lvbiA9IGZh
bHNlOworCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1heC1hZ2UgYXR0cmlidXRlIGFz
IHdlbGwgYXMgYW4gZXhwaXJlcyBhdHRyaWJ1dGUKKyAgICAgICAgICAgIC8vIHRoZSByaWdodG1v
c3QgbWF4LWFnZSBhdHRyaWJ1dGUgdGFrZXMgcHJlY2VkZW5jZS4KKyAgICAgICAgICAgIGhhc01h
eEFnZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdBU0NJ
SUNhc2UoYXR0cmlidXRlTmFtZSwgImV4cGlyZXMiKSAmJiAhaGFzTWF4QWdlKSB7CisgICAgICAg
IGlmIChhdXRvIGV4cGlyeVRpbWUgPSBwYXJzZUV4cGlyZXMoYXR0cmlidXRlVmFsdWUudXRmOCgp
LmRhdGEoKSkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5leHBpcmVzID0gZXhwaXJ5VGltZS52YWx1
ZSgpOworICAgICAgICAgICAgcmVzdWx0LnNlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAicGF0aCIp
KSB7CisgICAgICAgIGlmICghYXR0cmlidXRlVmFsdWUuaXNFbXB0eSgpICYmIGF0dHJpYnV0ZVZh
bHVlLnN0YXJ0c1dpdGgoJy8nKSkKKyAgICAgICAgICAgIHJlc3VsdC5wYXRoID0gYXR0cmlidXRl
VmFsdWU7CisgICAgfQorfQorCitib29sIHBhcnNlQ29va2llSGVhZGVyKGNvbnN0IFN0cmluZyYg
Y29va2llTGluZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIENvb2tpZSYgcmVzdWx0KQoreworICAg
IGlmIChjb29raWVMaW5lLmxlbmd0aCgpID49IE1BWF9DT09LSUVfTElORSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gVGhpcyBBbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIGFsZ29y
aXRobSBkZWZpbmVkIGluIFJGQyA2MjY1IDUuMiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwv
cmZjNjI2NSNzZWN0aW9uLTUuMi8KKworICAgIHNpemVfdCBzZXBhcmF0b3JQb3NpdGlvbiA9IGNv
b2tpZUxpbmUuZmluZCgnOycpOworCisgICAgU3RyaW5nIGNvb2tpZVBhaXIgPSBzZXBhcmF0b3JQ
b3NpdGlvbiA9PSBub3RGb3VuZCA/IGNvb2tpZUxpbmUgOiBjb29raWVMaW5lLnN1YnN0cmluZygw
LCBzZXBhcmF0b3JQb3NpdGlvbik7CisKKyAgICBTdHJpbmcgY29va2llTmFtZTsKKyAgICBTdHJp
bmcgY29va2llVmFsdWU7CisgICAgc2l6ZV90IGFzc2lnbm1lbnRQb3NpdGlvbiA9IGNvb2tpZUxp
bmUuZmluZCgnPScpOworCisgICAgLy8gUkZDNjI2NSBzYXlzIHRvIGlnbm9yZSBjb29raWVzIHBh
aXJzIHdpdGggZW1wdHkgbmFtZXMgb3Igbm8gYXNzaWdubWVudCBjaGFyYWN0ZXIKKyAgICAvLyBi
dXQgYnJvd3NlcnMgc2VlbSB0byB0cmVhdCB0aGlzIHR5cGUgb2YgY29va2llIHN0cmluZyBhcyB0
aGUgY29va2llIHZhbHVlCisgICAgaWYgKGFzc2lnbm1lbnRQb3NpdGlvbiA9PSBub3RGb3VuZCkK
KyAgICAgICAgY29va2llVmFsdWUgPSBjb29raWVQYWlyOworICAgIGVsc2UgeworICAgICAgICBj
b29raWVOYW1lID0gY29va2llUGFpci5zdWJzdHJpbmcoMCwgYXNzaWdubWVudFBvc2l0aW9uKTsK
KyAgICAgICAgY29va2llVmFsdWUgPSBjb29raWVQYWlyLnN1YnN0cmluZyhhc3NpZ25tZW50UG9z
aXRpb24gKyAxKTsKKyAgICB9CisKKyAgICByZXN1bHQubmFtZSA9IGNvb2tpZU5hbWUuc3RyaXBX
aGl0ZVNwYWNlKCk7CisgICAgcmVzdWx0LnZhbHVlID0gY29va2llVmFsdWUuc3RyaXBXaGl0ZVNw
YWNlKCk7CisKKyAgICBib29sIGhhc01heEFnZSA9IGZhbHNlOworICAgIHJlc3VsdC5zZXNzaW9u
ID0gdHJ1ZTsKKworICAgIFZlY3RvcjxTdHJpbmc+IGNvb2tpZUF0dHJpYnV0ZXM7CisgICAgY29v
a2llTGluZS5zcGxpdCgnOycsIHRydWUsIGNvb2tpZUF0dHJpYnV0ZXMpOworICAgIGZvciAoYXV0
byBhdHRyaWJ1dGUgOiBjb29raWVBdHRyaWJ1dGVzKQorICAgICAgICBwYXJzZUNvb2tpZUF0dHJp
YnV0ZXMoYXR0cmlidXRlLCBkb21haW4sIGhhc01heEFnZSwgcmVzdWx0KTsKKworICAgIHJldHVy
biB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBDb29raWVVdGlsCisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ29va2llVXRpbC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZVV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MC4uMjY3ZmRjMjlhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21h
IG9uY2UKKworI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
Kworc3RydWN0IENvb2tpZTsKKworbmFtZXNwYWNlIENvb2tpZVV0aWwgeworCitib29sIHBhcnNl
Q29va2llSGVhZGVyKGNvbnN0IFN0cmluZyYgY29va2llTGluZSwgY29uc3QgU3RyaW5nJiBkb21h
aW4sIENvb2tpZSYgcmVzdWx0KTsKKworYm9vbCBpc0lQQWRkcmVzcyhjb25zdCBTdHJpbmcmIGhv
c3RuYW1lKTsKKworYm9vbCBkb21haW5NYXRjaChjb25zdCBTdHJpbmcmIGNvb2tpZURvbWFpbiwg
Y29uc3QgU3RyaW5nJiBob3N0KTsKKworfSAvLyBuYW1lc3BhY2UgQ29va2llVXRpbAorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCBkNTRiMTJjOTJjOC4uNWE0MjlhOWY4MTQg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29u
dGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxD
b250ZXh0LmNwcApAQCAtNDIsMzggKzQyLDYgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1z
dGF0aWMgQ1N0cmluZyBjb29raWVKYXJQYXRoKCkKLXsKLSAgICBjaGFyKiBjb29raWVKYXJQYXRo
ID0gZ2V0ZW52KCJDVVJMX0NPT0tJRV9KQVJfUEFUSCIpOwotICAgIGlmIChjb29raWVKYXJQYXRo
KQotICAgICAgICByZXR1cm4gY29va2llSmFyUGF0aDsKLQotI2lmIE9TKFdJTkRPV1MpCi0gICAg
Y2hhciBleGVjdXRhYmxlUGF0aFtNQVhfUEFUSF07Ci0gICAgY2hhciBhcHBEYXRhRGlyZWN0b3J5
W01BWF9QQVRIXTsKLSAgICBjaGFyIGNvb2tpZUphckZ1bGxQYXRoW01BWF9QQVRIXTsKLSAgICBj
aGFyIGNvb2tpZUphckRpcmVjdG9yeVtNQVhfUEFUSF07Ci0KLSAgICBpZiAoRkFJTEVEKDo6U0hH
ZXRGb2xkZXJQYXRoQSgwLCBDU0lETF9MT0NBTF9BUFBEQVRBIHwgQ1NJRExfRkxBR19DUkVBVEUs
IDAsIDAsIGFwcERhdGFEaXJlY3RvcnkpKQotICAgICAgICB8fCBGQUlMRUQoOjpHZXRNb2R1bGVG
aWxlTmFtZUEoMCwgZXhlY3V0YWJsZVBhdGgsIE1BWF9QQVRIKSkpCi0gICAgICAgIHJldHVybiAi
Y29va2llcy5kYXQiOwotCi0gICAgOjpQYXRoUmVtb3ZlRXh0ZW5zaW9uQShleGVjdXRhYmxlUGF0
aCk7Ci0gICAgTFBTVFIgZXhlY3V0YWJsZU5hbWUgPSA6OlBhdGhGaW5kRmlsZU5hbWVBKGV4ZWN1
dGFibGVQYXRoKTsKLSAgICBzcHJpbnRmX3MoY29va2llSmFyRGlyZWN0b3J5LCBNQVhfUEFUSCwg
IiVzLyVzIiwgYXBwRGF0YURpcmVjdG9yeSwgZXhlY3V0YWJsZU5hbWUpOwotICAgIHNwcmludGZf
cyhjb29raWVKYXJGdWxsUGF0aCwgTUFYX1BBVEgsICIlcy9jb29raWVzLmRhdCIsIGNvb2tpZUph
ckRpcmVjdG9yeSk7Ci0KLSAgICBpZiAoOjpTSENyZWF0ZURpcmVjdG9yeUV4QSgwLCBjb29raWVK
YXJEaXJlY3RvcnksIDApICE9IEVSUk9SX1NVQ0NFU1MKLSAgICAgICAgJiYgOjpHZXRMYXN0RXJy
b3IoKSAhPSBFUlJPUl9GSUxFX0VYSVNUUwotICAgICAgICAmJiA6OkdldExhc3RFcnJvcigpICE9
IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQotICAgICAgICByZXR1cm4gImNvb2tpZXMuZGF0IjsKLQot
ICAgIHJldHVybiBjb29raWVKYXJGdWxsUGF0aDsKLSNlbHNlCi0gICAgcmV0dXJuICJjb29raWVz
LmRhdCI7Ci0jZW5kaWYKLX0KLQogLy8gQ3VybENvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDdXJsQ29u
dGV4dCYgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpCkBAIC04MywxMCArNTEsOCBAQCBDdXJsQ29u
dGV4dCYgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpCiB9CiAKIEN1cmxDb250ZXh0OjpDdXJsQ29u
dGV4dCgpCi06IG1fY29va2llSmFyRmlsZU5hbWUgeyBjb29raWVKYXJQYXRoKCkgfQotLCBtX2Nv
b2tpZUphciB7IHN0ZDo6bWFrZV91bmlxdWU8Q29va2llSmFyQ3VybEZpbGVTeXN0ZW0+KCkgfQog
ewotICAgIGluaXRDb29raWVTZXNzaW9uKCk7CisgICAgaW5pdFNoYXJlSGFuZGxlKCk7CiAKICNp
Zm5kZWYgTkRFQlVHCiAgICAgbV92ZXJib3NlID0gZ2V0ZW52KCJERUJVR19DVVJMIik7CkBAIC0x
MDUsMTMgKzcxLDggQEAgQ3VybENvbnRleHQ6On5DdXJsQ29udGV4dCgpCiAjZW5kaWYKIH0KIAot
Ly8gQ29va2llID09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgQ3VybENvbnRleHQ6Omlu
aXRDb29raWVTZXNzaW9uKCkKK3ZvaWQgQ3VybENvbnRleHQ6OmluaXRTaGFyZUhhbmRsZSgpCiB7
Ci0gICAgLy8gQ3VybCBzYXZlcyBib3RoIHBlcnNpc3RlbnQgY29va2llcywgYW5kIHNlc3Npb24g
Y29va2llcyB0byB0aGUgY29va2llIGZpbGUuCi0gICAgLy8gVGhlIHNlc3Npb24gY29va2llcyBz
aG91bGQgYmUgZGVsZXRlZCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgc2Vzc2lvbi4KLQogICAgIENV
UkwqIGN1cmwgPSBjdXJsX2Vhc3lfaW5pdCgpOwogCiAgICAgaWYgKCFjdXJsKQpAQCAtMTE5LDEz
ICs4MCw2IEBAIHZvaWQgQ3VybENvbnRleHQ6OmluaXRDb29raWVTZXNzaW9uKCkKIAogICAgIGN1
cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9TSEFSRSwgbV9zaGFyZUhhbmRsZS5oYW5kbGUo
KSk7CiAKLSAgICBpZiAoIW1fY29va2llSmFyRmlsZU5hbWUuaXNOdWxsKCkpIHsKLSAgICAgICAg
Y3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUZJTEUsIG1fY29va2llSmFyRmls
ZU5hbWUuZGF0YSgpKTsKLSAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NP
T0tJRUpBUiwgbV9jb29raWVKYXJGaWxlTmFtZS5kYXRhKCkpOwotICAgIH0KLQotICAgIGN1cmxf
ZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9DT09LSUVTRVNTSU9OLCAxKTsKLQogICAgIGN1cmxf
ZWFzeV9jbGVhbnVwKGN1cmwpOwogfQogCkBAIC00ODMsMjYgKzQzNyw2IEBAIHZvaWQgQ3VybEhh
bmRsZTo6c2V0U3NsS2V5UGFzc3dvcmQoY29uc3QgY2hhciogcGFzc3dvcmQpCiAgICAgY3VybF9l
YXN5X3NldG9wdChtX2hhbmRsZSwgQ1VSTE9QVF9LRVlQQVNTV0QsIHBhc3N3b3JkKTsKIH0KIAot
dm9pZCBDdXJsSGFuZGxlOjplbmFibGVDb29raWVKYXJJZkV4aXN0cygpCi17Ci0gICAgY29uc3Qg
Y2hhciogY29va2llSmFyID0gQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmdldENvb2tpZUphckZp
bGVOYW1lKCk7Ci0gICAgaWYgKGNvb2tpZUphcikKLSAgICAgICAgY3VybF9lYXN5X3NldG9wdCht
X2hhbmRsZSwgQ1VSTE9QVF9DT09LSUVKQVIsIGNvb2tpZUphcik7Ci19Ci0KLXZvaWQgQ3VybEhh
bmRsZTo6c2V0Q29va2llTGlzdChjb25zdCBjaGFyKiBjb29raWVMaXN0KQotewotICAgIGlmICgh
Y29va2llTGlzdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY3VybF9lYXN5X3NldG9wdChtX2hh
bmRsZSwgQ1VSTE9QVF9DT09LSUVMSVNULCBjb29raWVMaXN0KTsKLX0KLQotdm9pZCBDdXJsSGFu
ZGxlOjpmZXRjaENvb2tpZUxpc3QoQ3VybFNMaXN0ICZjb29raWVzKSBjb25zdAotewotICAgIGN1
cmxfZWFzeV9nZXRpbmZvKG1faGFuZGxlLCBDVVJMSU5GT19DT09LSUVMSVNULCBzdGF0aWNfY2Fz
dDxzdHJ1Y3QgY3VybF9zbGlzdCoqPihjb29raWVzKSk7Ci19Ci0KIHZvaWQgQ3VybEhhbmRsZTo6
ZW5hYmxlUHJveHlJZkV4aXN0cygpCiB7CiAgICAgYXV0byYgcHJveHkgPSBDdXJsQ29udGV4dDo6
c2luZ2xldG9uKCkucHJveHlJbmZvKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCmluZGV4IDQ4ODA4NWViMmQ3Li5mNTJiZDU1YjU2
OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxD
b250ZXh0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxD
b250ZXh0LmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJD
b29raWVKYXJDdXJsLmgiCiAjaW5jbHVkZSAiQ3VybFNTTEhhbmRsZS5oIgogI2luY2x1ZGUgIlVS
TC5oIgogCkBAIC0xMTAsMTEgKzEwOSw2IEBAIHB1YmxpYzoKIAogICAgIGNvbnN0IEN1cmxTaGFy
ZUhhbmRsZSYgc2hhcmVIYW5kbGUoKSB7IHJldHVybiBtX3NoYXJlSGFuZGxlOyB9CiAKLSAgICAv
LyBDb29raWUKLSAgICBjb25zdCBjaGFyKiBnZXRDb29raWVKYXJGaWxlTmFtZSgpIGNvbnN0IHsg
cmV0dXJuIG1fY29va2llSmFyRmlsZU5hbWUuZGF0YSgpOyB9Ci0gICAgdm9pZCBzZXRDb29raWVK
YXJGaWxlTmFtZShjb25zdCBjaGFyKiBjb29raWVKYXJGaWxlTmFtZSkgeyBtX2Nvb2tpZUphckZp
bGVOYW1lID0gQ1N0cmluZyhjb29raWVKYXJGaWxlTmFtZSk7IH0KLSAgICBDb29raWVKYXJDdXJs
JiBjb29raWVKYXIoKSB7IHJldHVybiAqbV9jb29raWVKYXI7IH0KLQogICAgIC8vIFByb3h5CiAg
ICAgY29uc3QgUHJveHlJbmZvJiBwcm94eUluZm8oKSBjb25zdCB7IHJldHVybiBtX3Byb3h5OyB9
CiAgICAgdm9pZCBzZXRQcm94eUluZm8oY29uc3QgUHJveHlJbmZvJiBpbmZvKSB7IG1fcHJveHkg
PSBpbmZvOyAgfQpAQCAtMTMzLDEzICsxMjcsMTEgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAg
IFByb3h5SW5mbyBtX3Byb3h5OwotICAgIENTdHJpbmcgbV9jb29raWVKYXJGaWxlTmFtZTsKICAg
ICBDdXJsU2hhcmVIYW5kbGUgbV9zaGFyZUhhbmRsZTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29v
a2llSmFyQ3VybD4gbV9jb29raWVKYXI7CiAgICAgQ3VybFNTTEhhbmRsZSBtX3NzbEhhbmRsZTsK
IAogICAgIEN1cmxDb250ZXh0KCk7Ci0gICAgdm9pZCBpbml0Q29va2llU2Vzc2lvbigpOworICAg
IHZvaWQgaW5pdFNoYXJlSGFuZGxlKCk7CiAKICNpZm5kZWYgTkRFQlVHCiAgICAgRklMRSogbV9s
b2dGaWxlIHsgbnVsbHB0ciB9OwpAQCAtMjU2LDEwICsyNDgsNiBAQCBwdWJsaWM6CiAgICAgdm9p
ZCBzZXRTc2xDZXJ0VHlwZShjb25zdCBjaGFyKik7CiAgICAgdm9pZCBzZXRTc2xLZXlQYXNzd29y
ZChjb25zdCBjaGFyKik7CiAKLSAgICB2b2lkIGVuYWJsZUNvb2tpZUphcklmRXhpc3RzKCk7Ci0g
ICAgdm9pZCBzZXRDb29raWVMaXN0KGNvbnN0IGNoYXIqKTsKLSAgICB2b2lkIGZldGNoQ29va2ll
TGlzdChDdXJsU0xpc3QgJmNvb2tpZXMpIGNvbnN0OwotCiAgICAgdm9pZCBlbmFibGVQcm94eUlm
RXhpc3RzKCk7CiAKICAgICB2b2lkIGVuYWJsZVRpbWVvdXQoKTsKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVxdWVzdC5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwCmluZGV4IGUwYTgw
ZjQ1NWIwLi5mM2ViZDY4ZjcxZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxSZXF1ZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwCkBAIC0yMDAsNyArMjAwLDYgQEAgQ1VSTCog
Q3VybFJlcXVlc3Q6OnNldHVwVHJhbnNmZXIoKQogICAgIG1fY3VybEhhbmRsZS0+c2V0VGltZW91
dCh0aW1lb3V0TWlsbGlzZWNvbmRzKTsKIAogICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlUHJveHlJ
ZkV4aXN0cygpOwotICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlQ29va2llSmFySWZFeGlzdHMoKTsK
IAogICAgIG1fY3VybEhhbmRsZS0+c2V0U3NsVmVyaWZ5UGVlcihDdXJsSGFuZGxlOjpWZXJpZnlQ
ZWVyOjpFbmFibGUpOwogICAgIG1fY3VybEhhbmRsZS0+c2V0U3NsVmVyaWZ5SG9zdChDdXJsSGFu
ZGxlOjpWZXJpZnlIb3N0OjpTdHJpY3ROYW1lQ2hlY2spOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lvbkN1cmwuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vz
c2lvbkN1cmwuY3BwCmluZGV4IDE3NmFlOWYyNzZmLi5iODgwMzZhNGNiNiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL05ldHdvcmtTdG9yYWdlU2Vzc2lv
bkN1cmwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3
b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcApAQCAtMjksNiArMjksMTAgQEAKICNpZiBVU0UoQ1VS
TCkKIAogI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckN1cmxEYXRhYmFz
ZS5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRCLmgiCisjaW5jbHVkZSAiQ3VybENvbnRleHQuaCIK
KyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiTmV0d29ya2luZ0NvbnRleHQuaCIK
ICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgogCkBAIC0zNyw5ICs0MSwyNiBAQAogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKK3N0YXRpYyBTdHJpbmcgZGVmYXVsdENvb2tpZUphclBhdGgoKQor
eworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0RmlsZU5hbWUgPSAiY29va2llLmphci5k
YiI7CisgICAgY2hhciogY29va2llSmFyUGF0aCA9IGdldGVudigiQ1VSTF9DT09LSUVfSkFSX1BB
VEgiKTsKKyAgICBpZiAoY29va2llSmFyUGF0aCkKKyAgICAgICAgcmV0dXJuIGNvb2tpZUphclBh
dGg7CisKKyAgICBTdHJpbmcgY29va2llSmFyRGlyZWN0b3J5ID0gRmlsZVN5c3RlbTo6bG9jYWxV
c2VyU3BlY2lmaWNTdG9yYWdlRGlyZWN0b3J5KCk7CisKKyAgICBpZiAoIUZpbGVTeXN0ZW06Om1h
a2VBbGxEaXJlY3Rvcmllcyhjb29raWVKYXJEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gZGVm
YXVsdEZpbGVOYW1lOworCisgICAgcmV0dXJuIEZpbGVTeXN0ZW06OnBhdGhCeUFwcGVuZGluZ0Nv
bXBvbmVudChjb29raWVKYXJEaXJlY3RvcnksIGRlZmF1bHRGaWxlTmFtZSk7Cit9CisKIE5ldHdv
cmtTdG9yYWdlU2Vzc2lvbjo6TmV0d29ya1N0b3JhZ2VTZXNzaW9uKFBBTDo6U2Vzc2lvbklEIHNl
c3Npb25JRCwgTmV0d29ya2luZ0NvbnRleHQqIGNvbnRleHQpCiAgICAgOiBtX3Nlc3Npb25JRChz
ZXNzaW9uSUQpCiAgICAgLCBtX2NvbnRleHQoY29udGV4dCkKKyAgICAsIG1fY29va2llRGF0YWJh
c2UoZGVmYXVsdENvb2tpZUphclBhdGgoKSkKKyAgICAsIG1fY29va2llU3RvcmFnZShtYWtlVW5p
cXVlUmVmPENvb2tpZUphckN1cmxEYXRhYmFzZT4oKSkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVn
YXRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhh
bmRsZUN1cmxEZWxlZ2F0ZS5jcHAKaW5kZXggNTE0OTMxNjE0Y2QuLjAwYzQ0NjU1NmZlIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVDdXJsRGVsZWdhdGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHAKQEAgLTMzLDEwICszMywxMiBAQAog
I2lmIFVTRShDVVJMKQogCiAjaW5jbHVkZSAiQXV0aGVudGljYXRpb25DaGFsbGVuZ2UuaCIKKyNp
bmNsdWRlICJDb29raWVKYXJDdXJsLmgiCiAjaW5jbHVkZSAiQ3JlZGVudGlhbFN0b3JhZ2UuaCIK
ICNpbmNsdWRlICJDdXJsQ2FjaGVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiQ3VybFJlcXVlc3QuaCIK
ICNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIk5ldHdvcmtTdG9yYWdlU2Vzc2lv
bi5oIgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlSW50ZXJuYWwuaCIKICNpbmNsdWRlICJTaGFy
ZWRCdWZmZXIuaCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKQEAgLTE5MCw2ICsxOTIsMjAg
QEAgdm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6Y3VybERpZFNlbmREYXRhKHVuc2ln
bmVkIGxvbmcgbG9uZyBieXRlc1NlbnQsIHUKICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZFNl
bmREYXRhKG1faGFuZGxlLCBieXRlc1NlbnQsIHRvdGFsQnl0ZXNUb0JlU2VudCk7CiB9CiAKK3N0
YXRpYyB2b2lkIGhhbmRsZUNvb2tpZUhlYWRlcnMoY29uc3QgQ3VybFJlc3BvbnNlJiByZXNwb25z
ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgYXV0byBzZXRDb29raWVIZWFkZXIgPSAic2V0LWNvb2tp
ZTogIjsKKworICAgIGF1dG8mIGRlZmF1bHRTdG9yYWdlU2Vzc2lvbiA9IE5ldHdvcmtTdG9yYWdl
U2Vzc2lvbjo6ZGVmYXVsdFN0b3JhZ2VTZXNzaW9uKCk7CisgICAgY29uc3QgQ29va2llSmFyQ3Vy
bCYgY29va2llSmFyID0gZGVmYXVsdFN0b3JhZ2VTZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKTsKKyAg
ICBmb3IgKGF1dG8gaGVhZGVyIDogcmVzcG9uc2UuaGVhZGVycykgeworICAgICAgICBpZiAoaGVh
ZGVyLnN0YXJ0c1dpdGhJZ25vcmluZ0FTQ0lJQ2FzZShzZXRDb29raWVIZWFkZXIpKSB7CisgICAg
ICAgICAgICBTdHJpbmcgc2V0Q29va2llU3RyaW5nID0gaGVhZGVyLnJpZ2h0KGhlYWRlci5sZW5n
dGgoKSAtIHN0cmxlbihzZXRDb29raWVIZWFkZXIpKTsKKyAgICAgICAgICAgIGNvb2tpZUphci5z
ZXRDb29raWVzRnJvbUhUVFBSZXNwb25zZShkZWZhdWx0U3RvcmFnZVNlc3Npb24sIHJlc3BvbnNl
LnVybCwgc2V0Q29va2llU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBSZXNv
dXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6Y3VybERpZFJlY2VpdmVSZXNwb25zZShjb25zdCBDdXJs
UmVzcG9uc2UmIHJlY2VpdmVkUmVzcG9uc2UpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKQEAgLTIwMyw2ICsyMTksOCBAQCB2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpj
dXJsRGlkUmVjZWl2ZVJlc3BvbnNlKGNvbnN0IEN1cmxSZXNwb25zZSYgcmVjZQogICAgIGlmICht
X2N1cmxSZXF1ZXN0KQogICAgICAgICBtX2hhbmRsZS0+Z2V0SW50ZXJuYWwoKS0+bV9yZXNwb25z
ZS5zZXREZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKG1fY3VybFJlcXVlc3QtPmdldE5ldHdv
cmtMb2FkTWV0cmljcygpKTsKIAorICAgIGhhbmRsZUNvb2tpZUhlYWRlcnMocmVjZWl2ZWRSZXNw
b25zZSk7CisKICAgICBpZiAocmVzcG9uc2UoKS5zaG91bGRSZWRpcmVjdCgpKSB7CiAgICAgICAg
IHdpbGxTZW5kUmVxdWVzdCgpOwogICAgICAgICByZXR1cm47Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>332866</attachid>
            <date>2018-02-01 03:10:00 -0800</date>
            <delta_ts>2018-02-01 16:08:46 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>174942.diff</filename>
            <type>text/plain</type>
            <size>71570</size>
            <attacher name="Christopher Reid">chris.reid</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBkNTliNWFmZTYyZS4uNjU1YWI3ZjE2ZmEgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzMyBAQAorMjAxOC0wMi0wMSAgQ2hyaXN0b3BoZXIgUmVpZCAgPGNocmlzLnJlaWRAc29u
eS5jb20+CisKKyAgICAgICAgW0N1cmxdIFVzZSBTUUxpdGUgZGF0YWJhc2UgaW4gY29va2llIGph
ciBpbXBsZW1lbnRhdGlvbiBmb3IgQ3VybCBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIFNldC1Db29raWUgaXMgYWxyZWFk
eSB0ZXN0ZWQgaW4gTGF5b3V0IHRlc3RzLgorCisgICAgICAgIEFkZGluZyBhbiBpbml0aWFsIFNR
TGl0ZSBDb29raWVKYXIgaW1wbGVtZW50YXRpb24gdG8gdGhlIGN1cmwgbmV0d29yayBsYXllci4K
KyAgICAgICAgV2ViQ29yZSB3aWxsIG5vdyBwYXJzZSBhbmQgaGFuZGxlIGJvdGggSFRUUCBhbmQg
RE9NIGNvb2tpZXMgaW5zdGVhZCBvZiB1c2luZyBsaWJjdXJsLgorICAgICAgICBUaGlzIGN1cnJl
bnRseSBzdXBwb3J0cyBjb29raWUgc3RvcmFnZSBhbmQgcmV0cmlldmFsLgorICAgICAgICBDb29r
aWUgZGVsZXRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHBsYXRmb3Jt
L0N1cmwuY21ha2U6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9OZXR3b3JrU3RvcmFnZVNl
c3Npb24uaDogQWRkZWQgY29va2llREIgc3RvcmFnZSBpbiBjdXJsLgorICAgICAgICAqIHBsYXRm
b3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcDogUmVtb3ZlZCB0aGUgb2xkIGN1cmwg
Y29va2llIGhhbmRsaW5nLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVK
YXJDdXJsLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxE
YXRhYmFzZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29r
aWVKYXJDdXJsRGF0YWJhc2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9j
dXJsL0Nvb2tpZUphckRCLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9j
dXJsL0Nvb2tpZUphckRCLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Db29raWVVdGlsLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJs
L0Nvb2tpZVV0aWwuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1
cmxDb250ZXh0LmNwcDogUmVtb3ZlZCB0aGUgb2xkIGN1cmwgY29va2llIGhhbmRsaW5nLgorICAg
ICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oOgorICAgICAgICAqIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVxdWVzdC5jcHA6IEFkZGVkIGhhbmRsZXJzIGZvciBI
VFRQIHJlc3BvbnNlIGNvb2tpZXMuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL05l
dHdvcmtTdG9yYWdlU2Vzc2lvbkN1cmwuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHA6CisKIDIwMTgtMDEtMjYgIEFudG9p
bmUgUXVpbnQgIDxncmFvdXRzQGFwcGxlLmNvbT4KIAogICAgICAgICBbV2ViIEFuaW1hdGlvbnNd
IERpc3Rpbmd1aXNoIGJldHdlZW4gYW4gb21pdHRlZCBhbmQgYSBudWxsIHRpbWVsaW5lIGFyZ3Vt
ZW50IHRvIHRoZSBBbmltYXRpb24gY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNt
YWtlCmluZGV4IGNkYWVmNWJmNzRhLi43M2MwMTRmMTVjMSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9D
dXJsLmNtYWtlCkBAIC01LDcgKzUsMTAgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9JTkNMVURFX0RJ
UkVDVE9SSUVTCiBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQXV0aGVudGljYXRpb25DaGFsbGVuZ2VDdXJsLmNwcAogICAgIHBsYXRmb3JtL25l
dHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9D
b29raWVKYXJDdXJsRGF0YWJhc2UuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tp
ZUphckRCLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVTdG9yYWdlQ3VybC5j
cHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5jcHAKICAgICBwbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3JlZGVudGlhbFN0b3JhZ2VDdXJsLmNwcAogICAgIHBsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsQ2FjaGVFbnRyeS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q3VybENhY2hlTWFuYWdlci5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvTmV0d29ya1N0b3JhZ2VTZXNzaW9uLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL05ldHdvcmtTdG9yYWdlU2Vzc2lvbi5oCmluZGV4IGZkMGI2ZWJjNDE4Li43ZmI5
Yzc0YjJhOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9OZXR3
b3JrU3RvcmFnZVNlc3Npb24uaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L05ldHdvcmtTdG9yYWdlU2Vzc2lvbi5oCkBAIC00Myw2ICs0MywxMiBAQAogdHlwZWRlZiBzdHJ1
Y3QgX1NvdXBDb29raWVKYXIgU291cENvb2tpZUphcjsKICNlbmRpZgogCisjaWYgVVNFKENVUkwp
CisjaW5jbHVkZSAiQ29va2llSmFyQ3VybC5oIgorI2luY2x1ZGUgIkNvb2tpZUphckRCLmgiCisj
aW5jbHVkZSA8d3RmL1VuaXF1ZVJlZi5oPgorI2VuZGlmCisKICNpZmRlZiBfX09CSkNfXwogI2lu
Y2x1ZGUgPG9iamMvb2JqYy5oPgogI2VuZGlmCkBAIC0xMTUsNiArMTIxLDE0IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNldENvb2tpZU9ic2VydmVySGFuZGxlcihGdW5jdGlvbjx2b2lkICgpPiYmKTsK
ICAgICB2b2lkIGdldENyZWRlbnRpYWxGcm9tUGVyc2lzdGVudFN0b3JhZ2UoY29uc3QgUHJvdGVj
dGlvblNwYWNlJiwgRnVuY3Rpb248dm9pZCAoQ3JlZGVudGlhbCYmKT4gY29tcGxldGlvbkhhbmRs
ZXIpOwogICAgIHZvaWQgc2F2ZUNyZWRlbnRpYWxUb1BlcnNpc3RlbnRTdG9yYWdlKGNvbnN0IFBy
b3RlY3Rpb25TcGFjZSYsIGNvbnN0IENyZWRlbnRpYWwmKTsKKyNlbGlmIFVTRShDVVJMKQorICAg
IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbihQQUw6OlNlc3Npb25JRCwgTmV0d29ya2luZ0NvbnRleHQq
KTsKKyAgICB+TmV0d29ya1N0b3JhZ2VTZXNzaW9uKCk7CisKKyAgICBjb25zdCBDb29raWVKYXJD
dXJsJiBjb29raWVTdG9yYWdlKCkgY29uc3QgeyByZXR1cm4gbV9jb29raWVTdG9yYWdlOyB9Owor
ICAgIENvb2tpZUphckRCJiBjb29raWVEYXRhYmFzZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29va2ll
RGF0YWJhc2U7IH07CisKKyAgICBOZXR3b3JraW5nQ29udGV4dCogY29udGV4dCgpIGNvbnN0Owog
I2Vsc2UKICAgICBOZXR3b3JrU3RvcmFnZVNlc3Npb24oUEFMOjpTZXNzaW9uSUQsIE5ldHdvcmtp
bmdDb250ZXh0Kik7CiAgICAgfk5ldHdvcmtTdG9yYWdlU2Vzc2lvbigpOwpAQCAtMTQ2LDYgKzE2
MCwxMSBAQCBwcml2YXRlOgogICAgIEZ1bmN0aW9uPHZvaWQgKENyZWRlbnRpYWwmJik+IG1fcGVy
c2lzZW50U3RvcmFnZUNvbXBsZXRpb25IYW5kbGVyOwogICAgIEdSZWZQdHI8R0NhbmNlbGxhYmxl
PiBtX3BlcnNpc2VudFN0b3JhZ2VDYW5jZWxsYWJsZTsKICNlbmRpZgorI2VsaWYgVVNFKENVUkwp
CisgICAgVW5pcXVlUmVmPENvb2tpZUphckN1cmw+IG1fY29va2llU3RvcmFnZTsKKyAgICBtdXRh
YmxlIENvb2tpZUphckRCIG1fY29va2llRGF0YWJhc2U7CisKKyAgICBSZWZQdHI8TmV0d29ya2lu
Z0NvbnRleHQ+IG1fY29udGV4dDsKICNlbHNlCiAgICAgUmVmUHRyPE5ldHdvcmtpbmdDb250ZXh0
PiBtX2NvbnRleHQ7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcAppbmRleCBlM2I3MjhiODNiZi4uMzI5ZjNh
NTc2MTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
b29raWVKYXJDdXJsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llSmFyQ3VybC5jcHAKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChD
KSAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAxOCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgogICoKICAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAg
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYwpAQCAtMjEsMzc5ICsyMiw2MSBAQAogCiAjaWYgVVNFKENVUkwpCiAjaW5jbHVkZSAiQ29v
a2llLmgiCi0jaW5jbHVkZSAiQ3VybENvbnRleHQuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRl
ZC5oIgorI2luY2x1ZGUgIk5ldHdvcmtTdG9yYWdlU2Vzc2lvbi5oIgogI2luY2x1ZGUgIlVSTC5o
IgogCi0jaW5jbHVkZSA8d3RmL0RhdGVNYXRoLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4K
LSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQv
U3RyaW5nSGFzaC5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKLXN0YXRpYyB2b2lkIHJlYWRDdXJsQ29va2llVG9rZW4oY29uc3QgY2hh
ciomIGNvb2tpZSwgU3RyaW5nJiB0b2tlbikKLXsKLSAgICAvLyBSZWFkIHRoZSBuZXh0IHRva2Vu
IGZyb20gYSBjb29raWUgd2l0aCB0aGUgTmV0c2NhcGUgY29va2llIGZvcm1hdC4KLSAgICAvLyBD
dXJsIHNlcGFyYXRlcyBlYWNoIHRva2VuIGluIGxpbmUgd2l0aCB0YWIgY2hhcmFjdGVyLgotICAg
IGNvbnN0IGNoYXIqIGNvb2tpZVN0YXJ0ID0gY29va2llOwotICAgIHdoaWxlIChjb29raWUgJiYg
Y29va2llWzBdICYmIGNvb2tpZVswXSAhPSAnXHQnKQotICAgICAgICBjb29raWUrKzsKLSAgICB0
b2tlbiA9IFN0cmluZyhjb29raWVTdGFydCwgY29va2llIC0gY29va2llU3RhcnQpOwotICAgIGlm
IChjb29raWVbMF0gPT0gJ1x0JykKLSAgICAgICAgY29va2llKys7Ci19Ci0KLXN0YXRpYyBib29s
IGRvbWFpbk1hdGNoKGNvbnN0IFN0cmluZyYgY29va2llRG9tYWluLCBjb25zdCBTdHJpbmcmIGhv
c3QpCi17Ci0gICAgc2l6ZV90IGluZGV4ID0gaG9zdC5maW5kKGNvb2tpZURvbWFpbik7Ci0KLSAg
ICBib29sIHRhaWxNYXRjaCA9IChpbmRleCAhPSBXVEY6Om5vdEZvdW5kICYmIGluZGV4ICsgY29v
a2llRG9tYWluLmxlbmd0aCgpID09IGhvc3QubGVuZ3RoKCkpOwotCi0gICAgLy8gQ2hlY2sgaWYg
aG9zdCBlcXVhbHMgY29va2llIGRvbWFpbi4KLSAgICBpZiAodGFpbE1hdGNoICYmICFpbmRleCkK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBDaGVjayBpZiBob3N0IGlzIGEgc3ViZG9t
YWluIG9mIHRoZSBkb21haW4gaW4gdGhlIGNvb2tpZS4KLSAgICAvLyBDdXJsIHVzZXMgYSAnLicg
aW4gZnJvbnQgb2YgZG9tYWlucyB0byBpbmRpY2F0ZSBpdCdzIHZhbGlkIG9uIHN1YmRvbWFpbnMu
Ci0gICAgaWYgKHRhaWxNYXRjaCAmJiBpbmRleCA+IDAgJiYgaG9zdFtpbmRleF0gPT0gJy4nKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIENoZWNrIHRoZSBzcGVjaWFsIGNhc2Ugd2hl
cmUgaG9zdCBlcXVhbHMgdGhlIGNvb2tpZSBkb21haW4sIGV4Y2VwdCBmb3IgYSBsZWFkaW5nICcu
JyBpbiB0aGUgY29va2llIGRvbWFpbi4KLSAgICAvLyBFLmcuIGNvb2tpZSBkb21haW4gaXMgLmFw
cGxlLmNvbSBhbmQgaG9zdCBpcyBhcHBsZS5jb20uIAotICAgIGlmIChjb29raWVEb21haW5bMF0g
PT0gJy4nICYmIGNvb2tpZURvbWFpbi5maW5kKGhvc3QpID09IDEpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBhZGRNYXRjaGluZ0N1
cmxDb29raWUoY29uc3QgY2hhciogY29va2llLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3Qg
U3RyaW5nJiBwYXRoLCBTdHJpbmdCdWlsZGVyJiBjb29raWVzLCBib29sIGh0dHBvbmx5KQotewot
ICAgIC8vIENoZWNrIGlmIHRoZSBjb29raWUgbWF0Y2hlcyBkb21haW4gYW5kIHBhdGgsIGFuZCBp
cyBub3QgZXhwaXJlZC4KLSAgICAvLyBJZiBzbywgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGNvb2tp
ZXMuCi0gICAgLy8KLSAgICAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgTmV0c2NhcGUgY29va2llIGZp
bGUgZm9ybWF0IHdoaWNoIEN1cmwgdXNlczoKLSAgICAvLwotICAgIC8vIC5uZXRzY2FwZS5jb20g
ICAgIFRSVUUgICAvICBGQUxTRSAgOTQ2Njg0Nzk5ICAgTkVUU0NBUEVfSUQgIDEwMDEwMwotICAg
IC8vCi0gICAgLy8gRWFjaCBsaW5lIHJlcHJlc2VudHMgYSBzaW5nbGUgcGllY2Ugb2Ygc3RvcmVk
IGluZm9ybWF0aW9uLiBBIHRhYiBpcyBpbnNlcnRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIGZpZWxk
cy4KLSAgICAvLwotICAgIC8vIEZyb20gbGVmdC10by1yaWdodCwgaGVyZSBpcyB3aGF0IGVhY2gg
ZmllbGQgcmVwcmVzZW50czoKLSAgICAvLwotICAgIC8vIGRvbWFpbiAtIFRoZSBkb21haW4gdGhh
dCBjcmVhdGVkIEFORCB0aGF0IGNhbiByZWFkIHRoZSB2YXJpYWJsZS4KLSAgICAvLyBmbGFnIC0g
QSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdp
dmVuIGRvbWFpbiBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYXV0
b21hdGljYWxseSBieSB0aGUgYnJvd3NlciwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSB5b3Ugc2V0
IGZvciBkb21haW4uCi0gICAgLy8gcGF0aCAtIFRoZSBwYXRoIHdpdGhpbiB0aGUgZG9tYWluIHRo
YXQgdGhlIHZhcmlhYmxlIGlzIHZhbGlkIGZvci4KLSAgICAvLyBzZWN1cmUgLSBBIFRSVUUvRkFM
U0UgdmFsdWUgaW5kaWNhdGluZyBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIHdpdGggdGhlIGRvbWFp
biBpcyBuZWVkZWQgdG8gYWNjZXNzIHRoZSB2YXJpYWJsZS4KLSAgICAvLyBleHBpcmF0aW9uIC0g
VGhlIFVOSVggdGltZSB0aGF0IHRoZSB2YXJpYWJsZSB3aWxsIGV4cGlyZSBvbi4gVU5JWCB0aW1l
IGlzIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwIDAw
OjAwOjAwIEdNVC4KLSAgICAvLyBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgotICAg
IC8vIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KLQotICAgIGlmICghY29va2ll
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgY29va2llRG9tYWluOwotICAgIHJlYWRD
dXJsQ29va2llVG9rZW4oY29va2llLCBjb29raWVEb21haW4pOwotCi0gICAgLy8gSHR0cE9ubHkg
Y29va2llIGVudHJpZXMgYmVnaW4gd2l0aCAiI0h0dHBPbmx5XyIuCi0gICAgaWYgKGNvb2tpZURv
bWFpbi5zdGFydHNXaXRoKCIjSHR0cE9ubHlfIikpIHsKLSAgICAgICAgaWYgKGh0dHBvbmx5KQot
ICAgICAgICAgICAgY29va2llRG9tYWluLnJlbW92ZSgwLCAxMCk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWRvbWFpbk1hdGNoKGNvb2tpZURv
bWFpbiwgZG9tYWluKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RyaW5nIHN0ckJvb2xlYW47
Ci0gICAgcmVhZEN1cmxDb29raWVUb2tlbihjb29raWUsIHN0ckJvb2xlYW4pOwotCi0gICAgU3Ry
aW5nIHN0clBhdGg7Ci0gICAgcmVhZEN1cmxDb29raWVUb2tlbihjb29raWUsIHN0clBhdGgpOwot
Ci0gICAgLy8gQ2hlY2sgaWYgcGF0aCBtYXRjaGVzCi0gICAgaW50IGluZGV4ID0gcGF0aC5maW5k
KHN0clBhdGgpOwotICAgIGlmIChpbmRleCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RyaW5n
IHN0clNlY3VyZTsKLSAgICByZWFkQ3VybENvb2tpZVRva2VuKGNvb2tpZSwgc3RyU2VjdXJlKTsK
LQotICAgIFN0cmluZyBzdHJFeHBpcmVzOwotICAgIHJlYWRDdXJsQ29va2llVG9rZW4oY29va2ll
LCBzdHJFeHBpcmVzKTsKLQotICAgIGludCBleHBpcmVzID0gc3RyRXhwaXJlcy50b0ludCgpOwot
Ci0gICAgdGltZV90IG5vdyA9IDA7Ci0gICAgdGltZSgmbm93KTsKLQotICAgIC8vIENoZWNrIGlm
IGNvb2tpZSBoYXMgZXhwaXJlZAotICAgIGlmIChleHBpcmVzICYmIG5vdyA+IGV4cGlyZXMpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIFN0cmluZyBzdHJOYW1lOwotICAgIHJlYWRDdXJsQ29va2ll
VG9rZW4oY29va2llLCBzdHJOYW1lKTsKLQotICAgIFN0cmluZyBzdHJWYWx1ZTsKLSAgICByZWFk
Q3VybENvb2tpZVRva2VuKGNvb2tpZSwgc3RyVmFsdWUpOwotCi0gICAgLy8gVGhlIGNvb2tpZSBt
YXRjaGVzLCBhZGQgaXQgdG8gdGhlIGNvb2tpZSBsaXN0LgotCi0gICAgaWYgKGNvb2tpZXMubGVu
Z3RoKCkgPiAwKQotICAgICAgICBjb29raWVzLmFwcGVuZCgiOyAiKTsKLQotICAgIGNvb2tpZXMu
YXBwZW5kKHN0ck5hbWUpOwotICAgIGNvb2tpZXMuYXBwZW5kKCI9Iik7Ci0gICAgY29va2llcy5h
cHBlbmQoc3RyVmFsdWUpOwotCi19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0TmV0c2NhcGVDb29raWVG
b3JtYXQoY29uc3QgVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCi17Ci0gICAgLy8gQ29u
c3RydWN0cyBhIGNvb2tpZSBzdHJpbmcgaW4gTmV0c2NhcGUgQ29va2llIGZpbGUgZm9ybWF0Lgot
Ci0gICAgaWYgKHZhbHVlLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgU3Ry
aW5nIHZhbHVlU3RyOwotICAgIGlmICh2YWx1ZS5pczhCaXQoKSkKLSAgICAgICAgdmFsdWVTdHIg
PSB2YWx1ZTsKLSAgICBlbHNlCi0gICAgICAgIHZhbHVlU3RyID0gU3RyaW5nOjptYWtlOEJpdEZy
b20xNkJpdFNvdXJjZSh2YWx1ZS5jaGFyYWN0ZXJzMTYoKSwgdmFsdWUubGVuZ3RoKCkpOwotCi0g
ICAgVmVjdG9yPFN0cmluZz4gYXR0cmlidXRlczsKLSAgICB2YWx1ZVN0ci5zcGxpdCgnOycsIGZh
bHNlLCBhdHRyaWJ1dGVzKTsKLQotICAgIGlmICghYXR0cmlidXRlcy5zaXplKCkpCi0gICAgICAg
IHJldHVybiAiIjsKLQotICAgIC8vIEZpcnN0IGF0dHJpYnV0ZSBzaG91bGQgYmUgPGNvb2tpZW5h
bWU+PTxjb29raWV2YWx1ZT4KLSAgICBTdHJpbmcgY29va2llTmFtZSwgY29va2llVmFsdWU7Ci0g
ICAgVmVjdG9yPFN0cmluZz46Oml0ZXJhdG9yIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuYmVnaW4o
KTsKLSAgICBpZiAoYXR0cmlidXRlLT5jb250YWlucygnPScpKSB7Ci0gICAgICAgIFZlY3RvcjxT
dHJpbmc+IG5hbWVWYWx1ZVBhaXI7Ci0gICAgICAgIGF0dHJpYnV0ZS0+c3BsaXQoJz0nLCB0cnVl
LCBuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgY29va2llTmFtZSA9IG5hbWVWYWx1ZVBhaXJbMF07
Ci0gICAgICAgIGNvb2tpZVZhbHVlID0gbmFtZVZhbHVlUGFpclsxXTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICAvLyBBY2NvcmRpbmcgdG8gUkZDNjI2NSB3ZSBzaG91bGQgaWdub3JlIHRoZSBlbnRp
cmUKLSAgICAgICAgLy8gc2V0LWNvb2tpZSBzdHJpbmcgbm93LCBidXQgb3RoZXIgYnJvd3NlcnMg
YXBwZWFyCi0gICAgICAgIC8vIHRvIHRyZWF0IHRoaXMgYXMgPGNvb2tpZW5hbWU+PTxlbXB0eT4K
LSAgICAgICAgY29va2llTmFtZSA9ICphdHRyaWJ1dGU7Ci0gICAgfQotICAgIAotICAgIGludCBl
eHBpcmVzID0gMDsKLSAgICBTdHJpbmcgc2VjdXJlID0gIkZBTFNFIjsKLSAgICBTdHJpbmcgcGF0
aCA9IHVybC5iYXNlQXNTdHJpbmcoKS5zdWJzdHJpbmcodXJsLnBhdGhTdGFydCgpKTsKLSAgICBp
ZiAocGF0aC5sZW5ndGgoKSA+IDEgJiYgcGF0aC5lbmRzV2l0aCgnLycpKQotICAgICAgICBwYXRo
LnJlbW92ZShwYXRoLmxlbmd0aCgpIC0gMSk7Ci0gICAgU3RyaW5nIGRvbWFpbiA9IHVybC5ob3N0
KCk7Ci0KLSAgICAvLyBJdGVyYXRlIHRocm91Z2ggcmVtYWluaW5nIGF0dHJpYnV0ZXMKLSAgICBm
b3IgKCsrYXR0cmlidXRlOyBhdHRyaWJ1dGUgIT0gYXR0cmlidXRlcy5lbmQoKTsgKythdHRyaWJ1
dGUpIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZS0+Y29udGFpbnMoJz0nKSkgewotICAgICAgICAg
ICAgVmVjdG9yPFN0cmluZz4ga2V5VmFsdWVQYWlyOwotICAgICAgICAgICAgYXR0cmlidXRlLT5z
cGxpdCgnPScsIHRydWUsIGtleVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0g
a2V5VmFsdWVQYWlyWzBdLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgU3RyaW5nIHZh
bCA9IGtleVZhbHVlUGFpclsxXS5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChl
cXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2FzZShrZXksICJleHBpcmVzIikpIHsKLSAgICAgICAg
ICAgICAgICBDU3RyaW5nIGRhdGVTdHIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFs
LmNoYXJhY3RlcnM4KCkpLCB2YWwubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGV4cGlyZXMg
PSBXVEY6OnBhcnNlRGF0ZUZyb21OdWxsVGVybWluYXRlZENoYXJhY3RlcnMoZGF0ZVN0ci5kYXRh
KCkpIC8gV1RGOjptc1BlclNlY29uZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXF1YWxMZXR0
ZXJzSWdub3JpbmdBU0NJSUNhc2Uoa2V5LCAibWF4LWFnZSIpKQotICAgICAgICAgICAgICAgIGV4
cGlyZXMgPSB0aW1lKDApICsgdmFsLnRvSW50KCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChlcXVh
bExldHRlcnNJZ25vcmluZ0FTQ0lJQ2FzZShrZXksICJkb21haW4iKSkKLSAgICAgICAgICAgICAg
ICBkb21haW4gPSB2YWw7Ci0gICAgICAgICAgICBlbHNlIGlmIChlcXVhbExldHRlcnNJZ25vcmlu
Z0FTQ0lJQ2FzZShrZXksICJwYXRoIikpCi0gICAgICAgICAgICAgICAgcGF0aCA9IHZhbDsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRyaWJ1dGUtPnN0cmlw
V2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgaWYgKGVxdWFsTGV0dGVyc0lnbm9yaW5nQVNDSUlD
YXNlKGtleSwgInNlY3VyZSIpKQotICAgICAgICAgICAgICAgIHNlY3VyZSA9ICJUUlVFIjsKLSAg
ICAgICAgfQotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgYWxsb3dTdWJkb21haW5zID0gZG9tYWlu
LnN0YXJ0c1dpdGgoJy4nKSA/ICJUUlVFIiA6ICJGQUxTRSI7Ci0gICAgU3RyaW5nIGV4cGlyZXNT
dHIgPSBTdHJpbmc6Om51bWJlcihleHBpcmVzKTsKLQotICAgIGludCBmaW5hbFN0cmluZ0xlbmd0
aCA9IGRvbWFpbi5sZW5ndGgoKSArIHBhdGgubGVuZ3RoKCkgKyBleHBpcmVzU3RyLmxlbmd0aCgp
ICsgY29va2llTmFtZS5sZW5ndGgoKTsKLSAgICBmaW5hbFN0cmluZ0xlbmd0aCArPSBjb29raWVW
YWx1ZS5sZW5ndGgoKSArIHNlY3VyZS5sZW5ndGgoKSArIGFsbG93U3ViZG9tYWlucy5sZW5ndGgo
KTsKLSAgICBmaW5hbFN0cmluZ0xlbmd0aCArPSA2OyAvLyBBY2NvdW50IGZvciBcdCBzZXBhcmF0
b3JzLgotICAgIAotICAgIFN0cmluZ0J1aWxkZXIgY29va2llU3RyOwotICAgIGNvb2tpZVN0ci5y
ZXNlcnZlQ2FwYWNpdHkoZmluYWxTdHJpbmdMZW5ndGgpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQo
ZG9tYWluKTsKLSAgICBjb29raWVTdHIuYXBwZW5kKCJcdCIpOwotICAgIGNvb2tpZVN0ci5hcHBl
bmQoYWxsb3dTdWJkb21haW5zKTsKLSAgICBjb29raWVTdHIuYXBwZW5kKCJcdCIpOwotICAgIGNv
b2tpZVN0ci5hcHBlbmQocGF0aCk7Ci0gICAgY29va2llU3RyLmFwcGVuZCgiXHQiKTsKLSAgICBj
b29raWVTdHIuYXBwZW5kKHNlY3VyZSk7Ci0gICAgY29va2llU3RyLmFwcGVuZCgiXHQiKTsKLSAg
ICBjb29raWVTdHIuYXBwZW5kKGV4cGlyZXNTdHIpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQoIlx0
Iik7Ci0gICAgY29va2llU3RyLmFwcGVuZChjb29raWVOYW1lKTsKLSAgICBjb29raWVTdHIuYXBw
ZW5kKCJcdCIpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQoY29va2llVmFsdWUpOwotCi0gICAgcmV0
dXJuIGNvb2tpZVN0ci50b1N0cmluZygpOwotfQotCi12b2lkIENvb2tpZUphckN1cmxGaWxlU3lz
dGVtOjpzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25z
dCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90
PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYg
dmFsdWUpCi17Ci0gICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOwotICAgIFVOVVNFRF9QQVJBTShw
YWdlSUQpOwotICAgIEN1cmxIYW5kbGUgY3VybEhhbmRsZTsKLQotICAgIGN1cmxIYW5kbGUuZW5h
YmxlU2hhcmVIYW5kbGUoKTsKLSAgICBjdXJsSGFuZGxlLmVuYWJsZUNvb2tpZUphcklmRXhpc3Rz
KCk7Ci0KLSAgICAvLyBDVVJMIGFjY2VwdHMgY29va2llcyBpbiBlaXRoZXIgU2V0LUNvb2tpZSBv
ciBOZXRzY2FwZSBmaWxlIGZvcm1hdC4KLSAgICAvLyBIb3dldmVyIHdpdGggU2V0LUNvb2tpZSBm
b3JtYXQsIHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IHRoYXQgd2UKLSAgICAvLyBzaG91bGQg
bm90IGFsbG93IGNvb2tpZXMgdG8gYmUgcmVhZCBmcm9tIHN1YmRvbWFpbnMsIHdoaWNoIGlzIHRo
ZQotICAgIC8vIHJlcXVpcmVkIGJlaGF2aW9yIGlmIHRoZSBkb21haW4gZmllbGQgaXMgbm90IGV4
cGxpY2l0eSBzcGVjaWZpZWQuCi0gICAgU3RyaW5nIGNvb2tpZSA9IGdldE5ldHNjYXBlQ29va2ll
Rm9ybWF0KHVybCwgdmFsdWUpOwotCi0gICAgaWYgKCFjb29raWUuaXM4Qml0KCkpCi0gICAgICAg
IGNvb2tpZSA9IFN0cmluZzo6bWFrZThCaXRGcm9tMTZCaXRTb3VyY2UoY29va2llLmNoYXJhY3Rl
cnMxNigpLCBjb29raWUubGVuZ3RoKCkpOwotCi0gICAgQ1N0cmluZyBzdHJDb29raWUocmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oY29va2llLmNoYXJhY3RlcnM4KCkpLCBjb29raWUubGVu
Z3RoKCkpOwotCi0gICAgY3VybEhhbmRsZS5zZXRDb29raWVMaXN0KHN0ckNvb2tpZS5kYXRhKCkp
OwotfQotCi1zdGF0aWMgU3RyaW5nIGNvb2tpZXNGb3JTZXNzaW9uKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNvbnN0IFVSTCYgdXJsLCBib29sIGh0dHBvbmx5KQot
ewotICAgIFN0cmluZyBjb29raWVzOwotCi0gICAgQ3VybEhhbmRsZSBjdXJsSGFuZGxlOwotICAg
IGN1cmxIYW5kbGUuZW5hYmxlU2hhcmVIYW5kbGUoKTsKLQotICAgIEN1cmxTTGlzdCBjb29raWVM
aXN0OwotICAgIGN1cmxIYW5kbGUuZmV0Y2hDb29raWVMaXN0KGNvb2tpZUxpc3QpOwotICAgIGNv
bnN0IHN0cnVjdCBjdXJsX3NsaXN0KiBsaXN0ID0gY29va2llTGlzdC5oZWFkKCk7Ci0gICAgaWYg
KGxpc3QpIHsKLSAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHVybC5ob3N0KCk7Ci0gICAgICAgIFN0
cmluZyBwYXRoID0gdXJsLnBhdGgoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjb29raWVzQnVp
bGRlcjsKLQotICAgICAgICB3aGlsZSAobGlzdCkgewotICAgICAgICAgICAgY29uc3QgY2hhciog
Y29va2llID0gbGlzdC0+ZGF0YTsKLSAgICAgICAgICAgIGFkZE1hdGNoaW5nQ3VybENvb2tpZShj
b29raWUsIGRvbWFpbiwgcGF0aCwgY29va2llc0J1aWxkZXIsIGh0dHBvbmx5KTsKLSAgICAgICAg
ICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgY29va2llcyA9IGNv
b2tpZXNCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvb2tpZXM7Ci19
Ci0KLXN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpjb29r
aWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJM
JiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJh
bWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2ll
cykKLXsKLSAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7Ci0gICAgVU5VU0VEX1BBUkFNKHBhZ2VJ
RCk7Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGZpbHRlciBzZWN1cmUgY29va2llcyBvdXQg
aWYgdGhlIGNhbGxlciByZXF1ZXN0cyBpdC4KLSAgICByZXR1cm4geyBjb29raWVzRm9yU2Vzc2lv
bihzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZhbHNlKSwgZmFsc2UgfTsKLX0KLQotc3RkOjpw
YWlyPFN0cmluZywgYm9vbD4gQ29va2llSmFyQ3VybEZpbGVTeXN0ZW06OmNvb2tpZVJlcXVlc3RI
ZWFkZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29u
c3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJl
Q29va2llcykKLXsKLSAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7Ci0gICAgVU5VU0VEX1BBUkFN
KHBhZ2VJRCk7Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGZpbHRlciBzZWN1cmUgY29va2ll
cyBvdXQgaWYgdGhlIGNhbGxlciByZXF1ZXN0cyBpdC4KLSAgICByZXR1cm4geyBjb29raWVzRm9y
U2Vzc2lvbihzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIHRydWUpLCBmYWxzZSB9OwotfQotCi1i
b29sIENvb2tpZUphckN1cmxGaWxlU3lzdGVtOjpjb29raWVzRW5hYmxlZChjb25zdCBOZXR3b3Jr
U3RvcmFnZVNlc3Npb24mKQotewotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvb2tpZUph
ckN1cmxGaWxlU3lzdGVtOjpnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lv
biYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50
NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29v
a2llPiYgcmF3Q29va2llcykKLXsKLSAgICBVTlVTRURfUEFSQU0oZnJhbWVJRCk7Ci0gICAgVU5V
U0VEX1BBUkFNKHBhZ2VJRCk7Ci0gICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKLSAg
ICByYXdDb29raWVzLmNsZWFyKCk7Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyByZXR1cm4gdHJ1ZSB3
aGVuIGltcGxlbWVudGVkCi19Ci0KLXZvaWQgQ29va2llSmFyQ3VybEZpbGVTeXN0ZW06OmRlbGV0
ZUNvb2tpZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmLCBjb25zdCBT
dHJpbmcmKQotewotICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCi19Ci0KLXZvaWQg
Q29va2llSmFyQ3VybEZpbGVTeXN0ZW06OmdldEhvc3RuYW1lc1dpdGhDb29raWVzKGNvbnN0IE5l
dHdvcmtTdG9yYWdlU2Vzc2lvbiYsIEhhc2hTZXQ8U3RyaW5nPiYgaG9zdG5hbWVzKQotewotICAg
IC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCi19Ci0KLXZvaWQgQ29va2llSmFyQ3VybEZp
bGVTeXN0ZW06OmRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VT
ZXNzaW9uJiwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGNvb2tpZUhvc3ROYW1lcykKLXsKLSAgICAv
LyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAotfQotCi12b2lkIENvb2tpZUphckN1cmxGaWxl
U3lzdGVtOjpkZWxldGVBbGxDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpCi17
Ci0gICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKLX0KLQotdm9pZCBDb29raWVKYXJD
dXJsRmlsZVN5c3RlbTo6ZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29y
a1N0b3JhZ2VTZXNzaW9uJiwgV2FsbFRpbWUpCi17Ci0gICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1w
bGVtZW50ZWQKLX0KLQotLy8gZGlzcGF0Y2hlciBmdW5jdGlvbnMKLQogc3RkOjpwYWlyPFN0cmlu
ZywgYm9vbD4gY29va2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Np
b24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVk
ZVNlY3VyZUNvb2tpZXMgaW5jbHVkZVNlY3VyZUNvb2tpZXMpCiB7Ci0gICAgcmV0dXJuIEN1cmxD
b250ZXh0OjpzaW5nbGV0b24oKS5jb29raWVKYXIoKS5jb29raWVzRm9yRE9NKHNlc3Npb24sIGZp
cnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlELCBpbmNsdWRlU2VjdXJlQ29va2llcyk7Cisg
ICAgcmV0dXJuIHNlc3Npb24uY29va2llU3RvcmFnZSgpLmNvb2tpZXNGb3JET00oc2Vzc2lvbiwg
Zmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlELCBwYWdlSUQsIGluY2x1ZGVTZWN1cmVDb29raWVzKTsK
IH0KIAogdm9pZCBzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
IHNlc3Npb24sIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0
aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKIHsKLSAgICBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuY29v
a2llSmFyKCkuc2V0Q29va2llc0Zyb21ET00oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmcmFt
ZUlELCBwYWdlSUQsIHZhbHVlKTsKKyAgICBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5zZXRDb29r
aWVzRnJvbURPTShzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgdmFs
dWUpOwogfQogCiBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVhZGVyRmll
bGRWYWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYg
Zmlyc3RQYXJ0eSwgY29uc3QgVVJMJiB1cmwsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1l
SUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMg
aW5jbHVkZVNlY3VyZUNvb2tpZXMpCiB7Ci0gICAgcmV0dXJuIEN1cmxDb250ZXh0OjpzaW5nbGV0
b24oKS5jb29raWVKYXIoKS5jb29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1ZShzZXNzaW9uLCBm
aXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgaW5jbHVkZVNlY3VyZUNvb2tpZXMpOwor
ICAgIHJldHVybiBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5jb29raWVSZXF1ZXN0SGVhZGVyRmll
bGRWYWx1ZShzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZyYW1lSUQsIHBhZ2VJRCwgaW5jbHVk
ZVNlY3VyZUNvb2tpZXMpOwogfQogCiBib29sIGNvb2tpZXNFbmFibGVkKGNvbnN0IE5ldHdvcmtT
dG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbikKIHsKLSAgICByZXR1cm4gQ3VybENvbnRleHQ6OnNpbmds
ZXRvbigpLmNvb2tpZUphcigpLmNvb2tpZXNFbmFibGVkKHNlc3Npb24pOworICAgIHJldHVybiBz
ZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5jb29raWVzRW5hYmxlZChzZXNzaW9uKTsKIH0KIAogYm9v
bCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29u
c3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3RkOjpvcHRpb25hbDx1aW50NjRf
dD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2ll
PiYgcmF3Q29va2llcykKIHsKLSAgICByZXR1cm4gQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmNv
b2tpZUphcigpLmdldFJhd0Nvb2tpZXMoc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmcmFtZUlE
LCBwYWdlSUQsIHJhd0Nvb2tpZXMpOworICAgIHJldHVybiBzZXNzaW9uLmNvb2tpZVN0b3JhZ2Uo
KS5nZXRSYXdDb29raWVzKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgZnJhbWVJRCwgcGFnZUlE
LCByYXdDb29raWVzKTsKIH0KIAogdm9pZCBkZWxldGVDb29raWUoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBjb29raWUp
CiB7Ci0gICAgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmNvb2tpZUphcigpLmRlbGV0ZUNvb2tp
ZShzZXNzaW9uLCB1cmwsIGNvb2tpZSk7CisgICAgc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuZGVs
ZXRlQ29va2llKHNlc3Npb24sIHVybCwgY29va2llKTsKIH0KIAogdm9pZCBnZXRIb3N0bmFtZXNX
aXRoQ29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIEhhc2hTZXQ8
U3RyaW5nPiYgaG9zdG5hbWVzKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5jb29r
aWVKYXIoKS5nZXRIb3N0bmFtZXNXaXRoQ29va2llcyhzZXNzaW9uLCBob3N0bmFtZXMpOworICAg
IHNlc3Npb24uY29va2llU3RvcmFnZSgpLmdldEhvc3RuYW1lc1dpdGhDb29raWVzKHNlc3Npb24s
IGhvc3RuYW1lcyk7CiB9CiAKIHZvaWQgZGVsZXRlQ29va2llc0Zvckhvc3RuYW1lcyhjb25zdCBO
ZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBjb29r
aWVIb3N0TmFtZXMpCiB7Ci0gICAgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLmNvb2tpZUphcigp
LmRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoc2Vzc2lvbiwgY29va2llSG9zdE5hbWVzKTsKKyAg
ICBzZXNzaW9uLmNvb2tpZVN0b3JhZ2UoKS5kZWxldGVDb29raWVzRm9ySG9zdG5hbWVzKHNlc3Np
b24sIGNvb2tpZUhvc3ROYW1lcyk7CiB9CiAKIHZvaWQgZGVsZXRlQWxsQ29va2llcyhjb25zdCBO
ZXR3b3JrU3RvcmFnZVNlc3Npb24mIHNlc3Npb24pCiB7Ci0gICAgQ3VybENvbnRleHQ6OnNpbmds
ZXRvbigpLmNvb2tpZUphcigpLmRlbGV0ZUFsbENvb2tpZXMoc2Vzc2lvbik7CisgICAgc2Vzc2lv
bi5jb29raWVTdG9yYWdlKCkuZGVsZXRlQWxsQ29va2llcyhzZXNzaW9uKTsKIH0KIAogdm9pZCBk
ZWxldGVBbGxDb29raWVzTW9kaWZpZWRTaW5jZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
IHNlc3Npb24sIFdhbGxUaW1lIHNpbmNlKQogewotICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24o
KS5jb29raWVKYXIoKS5kZWxldGVBbGxDb29raWVzTW9kaWZpZWRTaW5jZShzZXNzaW9uLCBzaW5j
ZSk7CisgICAgc2Vzc2lvbi5jb29raWVTdG9yYWdlKCkuZGVsZXRlQWxsQ29va2llc01vZGlmaWVk
U2luY2Uoc2Vzc2lvbiwgc2luY2UpOwogfQogCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwuaAppbmRleCBhNTJmZDc4NjE3MS4u
YjhjNTQ2OTA5YjAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJDdXJsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZUphckN1cmwuaApAQCAtMjgsMjkgKzI4LDE3IEBAIGNsYXNzIFVSTDsKIAog
Y2xhc3MgQ29va2llSmFyQ3VybCB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBzdGQ6OnBhaXI8U3Ry
aW5nLCBib29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNv
bnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4g
ZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29v
a2llcykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3
b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBh
Z2VJRCwgY29uc3QgU3RyaW5nJikgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjb29raWVzRW5hYmxl
ZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKSA9IDA7Ci0gICAgdmlydHVhbCBzdGQ6OnBh
aXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1ZShjb25zdCBOZXR3
b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBh
Z2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgZ2V0UmF3
Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFy
dHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0
aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4mKSA9IDA7Ci0gICAgdmlydHVh
bCB2b2lkIGRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBV
UkwmLCBjb25zdCBTdHJpbmcmKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGdldEhvc3RuYW1lc1dp
dGhDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIEhhc2hTZXQ8U3RyaW5nPiYg
aG9zdG5hbWVzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFt
ZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGNv
b2tpZUhvc3ROYW1lcykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBkZWxldGVBbGxDb29raWVzKGNv
bnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRl
QWxsQ29va2llc01vZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgV2Fs
bFRpbWUpID0gMDsKLX07Ci0KLWNsYXNzIENvb2tpZUphckN1cmxGaWxlU3lzdGVtIDogcHVibGlj
IENvb2tpZUphckN1cmwgewotICAgIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZXNGb3JE
T00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBj
b25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFs
PHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1cmVDb29raWVzKSBvdmVycmlkZTsKLSAgICB2
b2lkIHNldENvb2tpZXNGcm9tRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0
IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJh
bWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBjb25zdCBTdHJpbmcmKSBvdmVy
cmlkZTsKLSAgICBib29sIGNvb2tpZXNFbmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lv
biYpIG92ZXJyaWRlOwotICAgIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RI
ZWFkZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYg
Zmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwg
c3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgb3Zl
cnJpZGU7Ci0gICAgYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lv
biYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50
NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29v
a2llPiYpIG92ZXJyaWRlOwotICAgIHZvaWQgZGVsZXRlQ29va2llKGNvbnN0IE5ldHdvcmtTdG9y
YWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlOwotICAgIHZv
aWQgZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwg
SGFzaFNldDxTdHJpbmc+JiBob3N0bmFtZXMpIG92ZXJyaWRlOwotICAgIHZvaWQgZGVsZXRlQ29v
a2llc0Zvckhvc3RuYW1lcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBWZWN0
b3I8U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKSBvdmVycmlkZTsKLSAgICB2b2lkIGRlbGV0ZUFs
bENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJikgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCBkZWxldGVBbGxDb29raWVzTW9kaWZpZWRTaW5jZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Np
b24mLCBXYWxsVGltZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnBhaXI8U3RyaW5nLCBi
b29sPiBjb29raWVzRm9yRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVS
TCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJ
RCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykg
Y29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb29raWVzRnJvbURPTShjb25zdCBOZXR3
b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBh
Z2VJRCwgY29uc3QgU3RyaW5nJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb29r
aWVzRnJvbUhUVFBSZXNwb25zZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBV
UkwmLCBjb25zdCBTdHJpbmcmKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGNvb2tpZXNF
bmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYpIGNvbnN0ID0gMDsKKyAgICB2aXJ0
dWFsIHN0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IGNvb2tpZVJlcXVlc3RIZWFkZXJGaWVsZFZhbHVl
KGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29u
c3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1
aW50NjRfdD4gcGFnZUlELCBJbmNsdWRlU2VjdXJlQ29va2llcykgY29uc3QgPSAwOworICAgIHZp
cnR1YWwgYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNv
bnN0IFVSTCYgZmlyc3RQYXJ0eSwgY29uc3QgVVJMJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4g
ZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFnZUlELCBWZWN0b3I8Q29va2llPiYp
IGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29va2llKGNvbnN0IE5ldHdvcmtT
dG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYsIGNvbnN0IFN0cmluZyYpIGNvbnN0ID0gMDsKKyAg
ICB2aXJ0dWFsIHZvaWQgZ2V0SG9zdG5hbWVzV2l0aENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJiwgSGFzaFNldDxTdHJpbmc+JiBob3N0bmFtZXMpIGNvbnN0ID0gMDsKKyAgICB2
aXJ0dWFsIHZvaWQgZGVsZXRlQ29va2llc0Zvckhvc3RuYW1lcyhjb25zdCBOZXR3b3JrU3RvcmFn
ZVNlc3Npb24mLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgY29va2llSG9zdE5hbWVzKSBjb25zdCA9
IDA7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZUFsbENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3Jh
Z2VTZXNzaW9uJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVBbGxDb29raWVz
TW9kaWZpZWRTaW5jZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBXYWxsVGltZSkgY29u
c3QgPSAwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmxEYXRhYmFzZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybERhdGFi
YXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNTZhMWJjODRm
NjkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ29va2llSmFyQ3VybERhdGFiYXNlLmNwcApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFn
bWEgb25jZQorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llSmFyQ3VybERh
dGFiYXNlLmgiCisKKyNpZiBVU0UoQ1VSTCkKKyNpbmNsdWRlICJDb29raWUuaCIKKyNpbmNsdWRl
ICJDb29raWVKYXJEQi5oIgorI2luY2x1ZGUgIk5ldHdvcmtTdG9yYWdlU2Vzc2lvbi5oIgorI2lu
Y2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiVVJMLmgiCisKKyNpbmNsdWRlIDx3
dGYvT3B0aW9uYWwuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3Rh
dGljIFN0cmluZyBjb29raWVzRm9yU2Vzc2lvbihjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24m
IHNlc3Npb24sIGNvbnN0IFVSTCYsIGNvbnN0IFVSTCYgdXJsLCBib29sIGh0dHBvbmx5KQorewor
ICAgIFN0cmluZ0J1aWxkZXIgY29va2llczsKKworICAgIENvb2tpZUphckRCJiBjb29raWVKYXJE
QiA9IHNlc3Npb24uY29va2llRGF0YWJhc2UoKTsKKyAgICBhdXRvIGlzSHR0cE9ubHkgPSAoaHR0
cG9ubHkgPyBzdGQ6Om51bGxvcHQgOiBzdGQ6Om9wdGlvbmFsPGJvb2w+IHtmYWxzZX0pOworICAg
IGF1dG8gc2VjdXJlID0gdXJsLnByb3RvY29sSXMoImh0dHBzIikgPyBzdGQ6Om51bGxvcHQgOiBz
dGQ6Om9wdGlvbmFsPGJvb2w+IHtmYWxzZX07CisKKyAgICBWZWN0b3I8Q29va2llPiByZXN1bHRz
OworICAgIGlmIChjb29raWVKYXJEQi5zZWFyY2hDb29raWVzKHVybC5zdHJpbmcoKSwgaXNIdHRw
T25seSwgc2VjdXJlLCBzdGQ6Om51bGxvcHQsIHJlc3VsdHMpKSB7CisgICAgICAgIGZvciAoYXV0
byByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgICAgICBpZiAoIWNvb2tpZXMuaXNFbXB0eSgp
KQorICAgICAgICAgICAgICAgIGNvb2tpZXMuYXBwZW5kKCI7ICIpOworICAgICAgICAgICAgY29v
a2llcy5hcHBlbmQocmVzdWx0Lm5hbWUpOworICAgICAgICAgICAgY29va2llcy5hcHBlbmQoIj0i
KTsKKyAgICAgICAgICAgIGNvb2tpZXMuYXBwZW5kKHJlc3VsdC52YWx1ZSk7CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIGNvb2tpZXMudG9TdHJpbmcoKTsKK30KKwordm9pZCBDb29raWVK
YXJDdXJsRGF0YWJhc2U6OnNldENvb2tpZXNGcm9tRE9NKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vz
c2lvbiYgc2Vzc2lvbiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBVUkwmIHVybCwgc3Rk
OjpvcHRpb25hbDx1aW50NjRfdD4gZnJhbWVJRCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gcGFn
ZUlELCBjb25zdCBTdHJpbmcmIHZhbHVlKSBjb25zdAoreworICAgIFVOVVNFRF9QQVJBTShmcmFt
ZUlEKTsKKyAgICBVTlVTRURfUEFSQU0ocGFnZUlEKTsKKworICAgIENvb2tpZUphckRCJiBjb29r
aWVKYXJEQiA9IHNlc3Npb24uY29va2llRGF0YWJhc2UoKTsKKyAgICBjb29raWVKYXJEQi5zZXRD
b29raWUodXJsLnN0cmluZygpLCB2YWx1ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgQ29va2llSmFyQ3Vy
bERhdGFiYXNlOjpzZXRDb29raWVzRnJvbUhUVFBSZXNwb25zZShjb25zdCBOZXR3b3JrU3RvcmFn
ZVNlc3Npb24mIHNlc3Npb24sIGNvbnN0IFVSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHZhbHVlKSBj
b25zdAoreworICAgIENvb2tpZUphckRCJiBjb29raWVKYXJEQiA9IHNlc3Npb24uY29va2llRGF0
YWJhc2UoKTsKKyAgICBjb29raWVKYXJEQi5zZXRDb29raWUodXJsLnN0cmluZygpLCB2YWx1ZSwg
ZmFsc2UpOworfQorCitzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBDb29raWVKYXJDdXJsRGF0YWJh
c2U6OmNvb2tpZXNGb3JET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBj
b25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2
NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQsIEluY2x1ZGVTZWN1
cmVDb29raWVzKSBjb25zdAoreworICAgIFVOVVNFRF9QQVJBTShmcmFtZUlEKTsKKyAgICBVTlVT
RURfUEFSQU0ocGFnZUlEKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBmaWx0ZXIgc2Vj
dXJlIGNvb2tpZXMgb3V0IGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgaXQuCisgICAgcmV0dXJuIHsg
Y29va2llc0ZvclNlc3Npb24oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCBmYWxzZSksIGZhbHNl
IH07Cit9CisKK3N0ZDo6cGFpcjxTdHJpbmcsIGJvb2w+IENvb2tpZUphckN1cmxEYXRhYmFzZTo6
Y29va2llUmVxdWVzdEhlYWRlckZpZWxkVmFsdWUoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiBzZXNzaW9uLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYgdXJsLCBzdGQ6Om9w
dGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBwYWdlSUQs
IEluY2x1ZGVTZWN1cmVDb29raWVzKSBjb25zdAoreworICAgIFVOVVNFRF9QQVJBTShmcmFtZUlE
KTsKKyAgICBVTlVTRURfUEFSQU0ocGFnZUlEKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3Vs
ZCBmaWx0ZXIgc2VjdXJlIGNvb2tpZXMgb3V0IGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgaXQuCisg
ICAgcmV0dXJuIHsgY29va2llc0ZvclNlc3Npb24oc2Vzc2lvbiwgZmlyc3RQYXJ0eSwgdXJsLCB0
cnVlKSwgZmFsc2UgfTsKK30KKworYm9vbCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmNvb2tpZXNF
bmFibGVkKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbikgY29uc3QKK3sKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmdldFJhd0Nv
b2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiBzZXNzaW9uLCBjb25zdCBVUkwmIGZp
cnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0
ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4mIHJhd0Nvb2tpZXMp
IGNvbnN0Cit7CisgICAgVU5VU0VEX1BBUkFNKGZyYW1lSUQpOworICAgIFVOVVNFRF9QQVJBTShw
YWdlSUQpOworCisgICAgQ29va2llSmFyREImIGNvb2tpZUphckRCID0gc2Vzc2lvbi5jb29raWVE
YXRhYmFzZSgpOworICAgIHJldHVybiBjb29raWVKYXJEQi5zZWFyY2hDb29raWVzKGZpcnN0UGFy
dHkuc3RyaW5nKCksIHN0ZDo6bnVsbG9wdCwgc3RkOjpudWxsb3B0LCBzdGQ6Om51bGxvcHQsIHJh
d0Nvb2tpZXMpOworfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6ZGVsZXRlQ29va2ll
KGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFVSTCYgdXJsLCBjb25zdCBTdHJp
bmcmIGNvb2tpZU5hbWUpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50
ZWQKK30KKwordm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmdldEhvc3RuYW1lc1dpdGhDb29r
aWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIEhhc2hTZXQ8U3RyaW5nPiYgaG9zdG5h
bWVzKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCit9CisKK3Zv
aWQgQ29va2llSmFyQ3VybERhdGFiYXNlOjpkZWxldGVDb29raWVzRm9ySG9zdG5hbWVzKGNvbnN0
IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBjb29raWVIb3N0
TmFtZXMpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKK30KKwor
dm9pZCBDb29raWVKYXJDdXJsRGF0YWJhc2U6OmRlbGV0ZUFsbENvb2tpZXMoY29uc3QgTmV0d29y
a1N0b3JhZ2VTZXNzaW9uJikgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1l
bnRlZAorfQorCit2b2lkIENvb2tpZUphckN1cmxEYXRhYmFzZTo6ZGVsZXRlQWxsQ29va2llc01v
ZGlmaWVkU2luY2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgV2FsbFRpbWUpIGNvbnN0
Cit7CisgICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKENVUkwpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybERhdGFiYXNlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybERhdGFiYXNlLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmQxZDY2NTFjNjlmCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tp
ZUphckN1cmxEYXRhYmFzZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKwor
I2luY2x1ZGUgIkNvb2tpZUphckN1cmwuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFz
cyBDb29raWVKYXJDdXJsRGF0YWJhc2UgOiBwdWJsaWMgQ29va2llSmFyQ3VybCB7CisgICAgc3Rk
OjpwYWlyPFN0cmluZywgYm9vbD4gY29va2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNl
c3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8
dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVk
ZVNlY3VyZUNvb2tpZXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q29va2llc0Zyb21E
T00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgVVJMJiBmaXJzdFBhcnR5LCBj
b25zdCBVUkwmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBmcmFtZUlELCBzdGQ6Om9wdGlvbmFs
PHVpbnQ2NF90PiBwYWdlSUQsIGNvbnN0IFN0cmluZyYpIGNvbnN0IG92ZXJyaWRlOworICAgIHZv
aWQgc2V0Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiwgY29uc3QgVVJMJiwgY29uc3QgU3RyaW5nJikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBj
b29raWVzRW5hYmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mKSBjb25zdCBvdmVycmlk
ZTsKKyAgICBzdGQ6OnBhaXI8U3RyaW5nLCBib29sPiBjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRW
YWx1ZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBVUkwmIGZpcnN0UGFydHks
IGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGZyYW1lSUQsIHN0ZDo6b3B0aW9u
YWw8dWludDY0X3Q+IHBhZ2VJRCwgSW5jbHVkZVNlY3VyZUNvb2tpZXMpIGNvbnN0IG92ZXJyaWRl
OworICAgIGJvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBj
b25zdCBVUkwmIGZpcnN0UGFydHksIGNvbnN0IFVSTCYsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+
IGZyYW1lSUQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IHBhZ2VJRCwgVmVjdG9yPENvb2tpZT4m
KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZUNvb2tpZShjb25zdCBOZXR3b3JrU3Rv
cmFnZVNlc3Npb24mLCBjb25zdCBVUkwmLCBjb25zdCBTdHJpbmcmKSBjb25zdCBvdmVycmlkZTsK
KyAgICB2b2lkIGdldEhvc3RuYW1lc1dpdGhDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vz
c2lvbiYsIEhhc2hTZXQ8U3RyaW5nPiYgaG9zdG5hbWVzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2
b2lkIGRlbGV0ZUNvb2tpZXNGb3JIb3N0bmFtZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9u
JiwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGNvb2tpZUhvc3ROYW1lcykgY29uc3Qgb3ZlcnJpZGU7
CisgICAgdm9pZCBkZWxldGVBbGxDb29raWVzKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYp
IGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZGVsZXRlQWxsQ29va2llc01vZGlmaWVkU2luY2Uo
Y29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgV2FsbFRpbWUpIGNvbnN0IG92ZXJyaWRlOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAuLjE2NjIzYzFiNmJjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckRCLmNwcApAQCAtMCwwICsx
LDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZlIEVudGVy
dGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAq
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29raWVKYXJEQi5o
IgorCisjaW5jbHVkZSAiQ29va2llVXRpbC5oIgorI2luY2x1ZGUgIlNRTGl0ZUZpbGVTeXN0ZW0u
aCIKKyNpbmNsdWRlICJVUkwuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjZGVmaW5lIENP
UlJVUFRfTUFSS0VSX1NVRkZJWCAiLWNvcnJ1cHRlZCIKKworLy8gQXQgbGVhc3QgNTAgY29va2ll
cyBwZXIgZG9tYWluIChSRkM2MjY1IDYuMS4gTGltaXRzKQorI2RlZmluZSBNQVhfQ09PS0lFX1BF
Ul9ET01BSU4gODAKKworI2RlZmluZSBDUkVBVEVfQ09PS0lFX1RBQkxFX1NRTCBcCisgICAgIkNS
RUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIENvb2tpZSAoIlwKKyAgICAiICBuYW1lIFRFWFQgTk9U
IE5VTEwsIlwKKyAgICAiICB2YWx1ZSBURVhULCJcCisgICAgIiAgZG9tYWluIFRFWFQgTk9UIE5V
TEwsIlwKKyAgICAiICBwYXRoIFRFWFQgTk9UIE5VTEwsIlwKKyAgICAiICBleHBpcmVzIElOVEVH
RVIgTk9UIE5VTEwsIlwKKyAgICAiICBzaXplIElOVEVHRVIgTk9UIE5VTEwsIlwKKyAgICAiICBz
ZXNzaW9uIElOVEVHRVIgTk9UIE5VTEwsIlwKKyAgICAiICBodHRwb25seSBJTlRFR0VSIE5PVCBO
VUxMIERFRkFVTFQgMCwiXAorICAgICIgIHNlY3VyZSBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQg
MCwiXAorICAgICIgIGxhc3R1cGRhdGVkIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCBDVVJSRU5U
X1RJTUVTVEFNUCwgIlwKKyAgICAiICBVTklRVUUobmFtZSwgZG9tYWluLCBwYXRoKSk7IgorI2Rl
ZmluZSBDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCBcCisgICAgIkNSRUFURSBJTkRFWCBJRiBOT1Qg
RVhJU1RTIGRvbWFpbl9pbmRleCBPTiBDb29raWUoZG9tYWluKTsiCisjZGVmaW5lIENSRUFURV9Q
QVRIX0lOREVYX1NRTCBcCisgICAgIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIHBhdGhfaW5k
ZXggT04gQ29va2llKHBhdGgpOyIKKyNkZWZpbmUgQ0hFQ0tfRVhJU1RTX0hUVFBPTkxZX0NPT0tJ
RV9TUUwgXAorICAgICJTRUxFQ1QgbmFtZSBGUk9NIENvb2tpZSBXSEVSRSAobmFtZSA9ID8pIEFO
RCAoZG9tYWluID0gPykgQU5EIChwYXRoID0gPykgQU5EIChodHRwb25seSA9IDEpOyIKKyNkZWZp
bmUgU0VUX0NPT0tJRV9TUUwgXAorICAgICJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIENvb2tpZSAo
bmFtZSwgdmFsdWUsIGRvbWFpbiwgcGF0aCwgZXhwaXJlcywgc2l6ZSwgc2Vzc2lvbiwgaHR0cG9u
bHksIHNlY3VyZSkgIlwKKyAgICAiVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KTsi
CisjZGVmaW5lIERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fUEFUSF9TUUwgXAorICAgICJE
RUxFVEUgRlJPTSBDb29raWUgV0hFUkUgbmFtZSA9ID8gQU5EIGRvbWFpbiA9ID8gQU5EIHBhdGgg
PSA/OyIKKyNkZWZpbmUgREVMRVRFX0NPT0tJRV9CWV9OQU1FX0RPTUFJTl9TUUwgXAorICAgICJE
RUxFVEUgRlJPTSBDb29raWUgV0hFUkUgbmFtZSA9ID8gQU5EIGRvbWFpbiA9ID87IgorI2RlZmlu
ZSBERUxFVEVfQUxMX1NFU1NJT05fQ09PS0lFX1NRTCBcCisgICAgIkRFTEVURSBGUk9NIENvb2tp
ZSBXSEVSRSBzZXNzaW9uID0gMTsiCisjZGVmaW5lIERFTEVURV9BTExfQ09PS0lFX1NRTCBcCisg
ICAgIkRFTEVURSBGUk9NIENvb2tpZTsiCisKK3ZvaWQgQ29va2llSmFyREI6OnNldEVuYWJsZWQo
Ym9vbCBlbmFibGUpCit7CisgICAgQ29va2llSmFyREI6Om1fY29va2llRW5hYmxlID0gZW5hYmxl
OworfQorCitDb29raWVKYXJEQjo6Q29va2llSmFyREIoY29uc3QgU3RyaW5nJiBkYXRhYmFzZVBh
dGgpCisgICAgOiBtX2RhdGFiYXNlUGF0aChkYXRhYmFzZVBhdGgpCit7CisgICAgY2hlY2tEYXRh
YmFzZUNvcnJ1cHRpb25BbmRSZW1vdmVJZk5lZWRlZCgpOworCisgICAgaWYgKCFvcGVuRGF0YWJh
c2UoKSkKKyAgICAgICAgcmV0dXJuOworfQorCitDb29raWVKYXJEQjo6fkNvb2tpZUphckRCKCkK
K3sKKyAgICBjbG9zZURhdGFiYXNlKCk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6Om9wZW5EYXRh
YmFzZSgpCit7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgYm9vbCBleGlzdHNEYXRhYmFzZUZpbGUgPSBmYWxzZTsKKyAgICBpZiAoIWlz
T25NZW1vcnkoKSkKKyAgICAgICAgZXhpc3RzRGF0YWJhc2VGaWxlID0gU1FMaXRlRmlsZVN5c3Rl
bTo6ZW5zdXJlRGF0YWJhc2VGaWxlRXhpc3RzKG1fZGF0YWJhc2VQYXRoLCBmYWxzZSk7CisKKyAg
ICBpZiAoZXhpc3RzRGF0YWJhc2VGaWxlKSB7CisgICAgICAgIGlmIChtX2RhdGFiYXNlLm9wZW4o
bV9kYXRhYmFzZVBhdGgsIGZhbHNlKSkgeworICAgICAgICAgICAgaWYgKGNoZWNrRGF0YWJhc2VW
YWxpZGl0eSgpKQorICAgICAgICAgICAgICAgIGV4ZWN1dGVTaW1wbGVTcWwoREVMRVRFX0FMTF9T
RVNTSU9OX0NPT0tJRV9TUUwpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAg
Ly8gZGVsZXRlIGRhdGFiYXNlIGFuZCB0cnkgdG8gcmUtY3JlYXRlIGFnYWluCisgICAgICAgICAg
ICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGRlbGV0ZUFsbERhdGFi
YXNlRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBleGlzdHNEYXRhYmFzZUZpbGUgPSBmYWxzZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbERh
dGFiYXNlRmlsZXMoKTsKKyAgICAgICAgICAgIGV4aXN0c0RhdGFiYXNlRmlsZSA9IGZhbHNlOwor
ICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFleGlzdHNEYXRhYmFzZUZpbGUpIHsKKyAgICAg
ICAgaWYgKG1fZGF0YWJhc2Uub3BlbihtX2RhdGFiYXNlUGF0aCwgZmFsc2UpKSB7CisgICAgICAg
ICAgICBib29sIGRhdGFiYXNlVmFsaWRpdHkgPSB0cnVlOworICAgICAgICAgICAgZGF0YWJhc2VW
YWxpZGl0eSAmPSAoZXhlY3V0ZVNpbXBsZVNxbChDUkVBVEVfQ09PS0lFX1RBQkxFX1NRTCkgPT0g
U1FMSVRFX0RPTkUpOworICAgICAgICAgICAgZGF0YWJhc2VWYWxpZGl0eSAmPSAoZXhlY3V0ZVNp
bXBsZVNxbChDUkVBVEVfRE9NQUlOX0lOREVYX1NRTCkgPT0gU1FMSVRFX0RPTkUpOworICAgICAg
ICAgICAgZGF0YWJhc2VWYWxpZGl0eSAmPSAoZXhlY3V0ZVNpbXBsZVNxbChDUkVBVEVfUEFUSF9J
TkRFWF9TUUwpID09IFNRTElURV9ET05FKTsKKyAgICAgICAgICAgIGlmICghZGF0YWJhc2VWYWxp
ZGl0eSkgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgdXAgY3JlYXRlIGRhdGFiYXNlIGF0IHRo
aXMgdGltZSAoYWxsIGNvb2tpZXMgb24gcmVxdWVzdC9yZXNwb25zZSBhcmUgaWdub3JlZCkKKyAg
ICAgICAgICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgZGVsZXRl
QWxsRGF0YWJhc2VGaWxlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBleGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgdGVtcF9zdG9yZSA9IE1FTU9SWTsiKTsKKyAgICBl
eGVjdXRlU2ltcGxlU3FsKCJQUkFHTUEgc3luY2hyb25vdXMgPSBOT1JNQUw7Iik7CisgICAgZXhl
Y3V0ZVNpbXBsZVNxbCgiUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDsiKTsKKworICAgIC8vIGNy
ZWF0ZSBwcmVwYXJlZCBzdGF0ZW1lbnRzCisgICAgY3JlYXRlUHJlcGFyZVN0YXRlbWVudChTRVRf
Q09PS0lFX1NRTCk7CisgICAgY3JlYXRlUHJlcGFyZVN0YXRlbWVudChDSEVDS19FWElTVFNfSFRU
UE9OTFlfQ09PS0lFX1NRTCk7CisgICAgY3JlYXRlUHJlcGFyZVN0YXRlbWVudChERUxFVEVfQ09P
S0lFX0JZX05BTUVfRE9NQUlOX1BBVEhfU1FMKTsKKyAgICBjcmVhdGVQcmVwYXJlU3RhdGVtZW50
KERFTEVURV9DT09LSUVfQllfTkFNRV9ET01BSU5fU1FMKTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCit2b2lkIENvb2tpZUphckRCOjpjbG9zZURhdGFiYXNlKCkKK3sKKyAgICBpZiAobV9kYXRh
YmFzZS5pc09wZW4oKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0YXRlbWVudCA6IG1f
c3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52YWx1ZS5nZXQoKS0+ZmluYWxpemUo
KTsKKyAgICAgICAgbV9zdGF0ZW1lbnRzLmNsZWFyKCk7CisgICAgICAgIG1fZGF0YWJhc2UuY2xv
c2UoKTsKKyAgICB9Cit9CisKK1N0cmluZyBDb29raWVKYXJEQjo6Z2V0Q29ycnVwdGlvbk1hcmtl
clBhdGgoKSBjb25zdAoreworICAgIEFTU0VSVCghaXNPbk1lbW9yeSgpKTsKKworICAgIHJldHVy
biBtX2RhdGFiYXNlUGF0aCArIENPUlJVUFRfTUFSS0VSX1NVRkZJWDsKK30KKwordm9pZCBDb29r
aWVKYXJEQjo6ZmxhZ0RhdGFiYXNlQ29ycnVwdGlvbigpCit7CisgICAgaWYgKGlzT25NZW1vcnko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRklMRSogZiA9IGZvcGVuKGdldENvcnJ1cHRpb25N
YXJrZXJQYXRoKCkudXRmOCgpLmRhdGEoKSwgIndiIik7CisgICAgZmNsb3NlKGYpOworfQorCiti
b29sIENvb2tpZUphckRCOjpjaGVja0RhdGFiYXNlQ29ycnVwdGlvbkFuZFJlbW92ZUlmTmVlZGVk
KCkKK3sKKyAgICBpZiAoaXNPbk1lbW9yeSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBzdHJ1Y3Qgc3RhdCBzdCA9IHsgMCB9OworICAgIGludCByZXQgPSBzdGF0KGdldENvcnJ1cHRp
b25NYXJrZXJQYXRoKCkudXRmOCgpLmRhdGEoKSwgJnN0KTsKKyAgICBpZiAoIXJldCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgZGVsZXRlQWxsRGF0YWJhc2VGaWxlcygpOworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIENvb2tpZUphckRCOjpjaGVja1NRTGl0ZVJldHVybkNvZGUo
aW50IGFjdHVhbCwgaW50IGV4cGVjdGVkKQoreworICAgIGlmICghbV9kZXRlY3RlZERhdGFiYXNl
Q29ycnVwdGlvbikgeworICAgICAgICBzd2l0Y2ggKGFjdHVhbCkgeworICAgICAgICBjYXNlIFNR
TElURV9DT1JSVVBUOgorICAgICAgICBjYXNlIFNRTElURV9TQ0hFTUE6CisgICAgICAgIGNhc2Ug
U1FMSVRFX0ZPUk1BVDoKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9UQURCOgorICAgICAgICAgICAg
ZmxhZ0RhdGFiYXNlQ29ycnVwdGlvbigpOworICAgICAgICAgICAgbV9kZXRlY3RlZERhdGFiYXNl
Q29ycnVwdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKGFjdHVh
bCA9PSBleHBlY3RlZCk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmNoZWNrRGF0YWJhc2VWYWxp
ZGl0eSgpCit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2UuaXNPcGVuKCkpOworCisgICAgcmV0dXJu
IG1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkNvb2tpZSIpOworfQorCit2b2lkIENvb2tpZUphckRC
OjpkZWxldGVBbGxEYXRhYmFzZUZpbGVzKCkKK3sKKyAgICBjbG9zZURhdGFiYXNlKCk7CisgICAg
aWYgKGlzT25NZW1vcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHJldCA9IDA7Cisg
ICAgU3RyaW5nIHJlbW92ZVBhdGg7CisKKyAgICAvLyByZW1vdmUgbWFya2VyIGZpbGUgKGNvb2tp
ZS5qYXIuZGItY29ycnVwdGVkKQorICAgIHJldCA9IHJlbW92ZShyZW1vdmVQYXRoLnV0ZjgoKS5k
YXRhKCkpOworCisgICAgLy8gcmVtb3ZlIHNobSBmaWxlIChjb29raWUuamFyLmRiLXNobSkKKyAg
ICByZW1vdmVQYXRoID0gU3RyaW5nKG1fZGF0YWJhc2VQYXRoICsgIi1zaG0iKTsKKyAgICByZXQg
PSByZW1vdmUocmVtb3ZlUGF0aC51dGY4KCkuZGF0YSgpKTsKKworICAgIC8vIHJlbW92ZSB3YWwg
ZmlsZSAoY29va2llLmphci5kYi13YWwpCisgICAgcmVtb3ZlUGF0aCA9IFN0cmluZyhtX2RhdGFi
YXNlUGF0aCArICItd2FsIik7CisgICAgcmV0ID0gcmVtb3ZlKHJlbW92ZVBhdGgudXRmOCgpLmRh
dGEoKSk7Cit9CisKK2Jvb2wgQ29va2llSmFyREI6OmlzRW5hYmxlZCgpCit7CisgICAgaWYgKG1f
ZGF0YWJhc2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0
dXJuIG1fY29va2llRW5hYmxlOworfQorCitib29sIENvb2tpZUphckRCOjpzZWFyY2hDb29raWVz
KGNvbnN0IFN0cmluZyYgcmVxdWVzdFVybCwgY29uc3Qgc3RkOjpvcHRpb25hbDxib29sPiYgaHR0
cE9ubHksIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4mIHNlY3VyZSwgY29uc3Qgc3RkOjpvcHRp
b25hbDxib29sPiYgc2Vzc2lvbiwgVmVjdG9yPENvb2tpZT4mIHJlc3VsdHMpCit7CisgICAgaWYg
KCFpc0VuYWJsZWQoKSB8fCAhbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgVVJMIHJlcXVlc3RVcmxPYmooUGFyc2VkVVJMU3RyaW5nLCByZXF1ZXN0VXJs
KTsKKyAgICBTdHJpbmcgcmVxdWVzdEhvc3QocmVxdWVzdFVybE9iai5ob3N0KCkuY29udmVydFRv
QVNDSUlMb3dlcmNhc2UoKSk7CisgICAgU3RyaW5nIHJlcXVlc3RQYXRoKHJlcXVlc3RVcmxPYmou
cGF0aCgpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkpOworCisgICAgaWYgKHJlcXVlc3RIb3N0
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHJlcXVlc3RQYXRo
LmlzRW1wdHkoKSkKKyAgICAgICAgcmVxdWVzdFBhdGggPSAiLyI7CisKKyAgICBjb25zdCBTdHJp
bmcgc3FsID0KKyAgICAgICAgIlNFTEVDVCBuYW1lLCB2YWx1ZSwgZG9tYWluLCBwYXRoLCBleHBp
cmVzLCBodHRwb25seSwgc2VjdXJlLCBzZXNzaW9uIEZST00gQ29va2llIFdIRVJFICJcCisgICAg
ICAgICIoTk9UICgoc2Vzc2lvbiA9IDApIEFORCAoZGF0ZXRpbWUoZXhwaXJlcywgJ3VuaXhlcG9j
aCcpIDwgZGF0ZXRpbWUoJ25vdycpKSkpICJcCisgICAgICAgICJBTkQgKGh0dHBvbmx5ID0gQ09B
TEVTQ0UoTlVMTElGKD8sIC0xKSwgaHR0cG9ubHkpKSAiXAorICAgICAgICAiQU5EIChzZWN1cmUg
PSBDT0FMRVNDRShOVUxMSUYoPywgLTEpLCBzZWN1cmUpKSAiXAorICAgICAgICAiQU5EIChzZXNz
aW9uID0gQ09BTEVTQ0UoTlVMTElGKD8sIC0xKSwgc2Vzc2lvbikpICJcCisgICAgICAgICJBTkQg
KChkb21haW4gPSA/KSBPUiAoZG9tYWluIEdMT0IgPykpIjsKKworICAgIHN0ZDo6dW5pcXVlX3B0
cjxTUUxpdGVTdGF0ZW1lbnQ+IHBzdG10ID0gc3RkOjptYWtlX3VuaXF1ZTxTUUxpdGVTdGF0ZW1l
bnQ+KG1fZGF0YWJhc2UsIHNxbCk7CisgICAgcHN0bXQtPnByZXBhcmUoKTsKKyAgICBwc3RtdC0+
YmluZEludCgxLCBodHRwT25seSA/ICpodHRwT25seSA6IC0xKTsKKyAgICBwc3RtdC0+YmluZElu
dCgyLCBzZWN1cmUgPyAqc2VjdXJlIDogLTEpOworICAgIHBzdG10LT5iaW5kSW50KDMsIHNlc3Np
b24gPyAqc2Vzc2lvbiA6IC0xKTsKKyAgICBwc3RtdC0+YmluZFRleHQoNCwgcmVxdWVzdEhvc3Qp
OworCisgICAgc2l6ZV90IHRvcExldmVsU2VwYXJhdG9yID0gcmVxdWVzdEhvc3QucmV2ZXJzZUZp
bmQoJy4nKTsKKyAgICBpZiAoQ29va2llVXRpbDo6aXNJUEFkZHJlc3MocmVxdWVzdEhvc3QpIHx8
IHRvcExldmVsU2VwYXJhdG9yID09IG5vdEZvdW5kKQorICAgICAgICBwc3RtdC0+YmluZE51bGwo
NSk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIEZJWE1FOiBjdXJyZW50bHkgd2UgY3VycmVudGx5
IGRvIG5vdCBoYXZlIGEgcHVibGljIHN1ZmZpYyBsaXN0IGluIHdpbmNhaXJvCisgICAgICAgICAg
IHNvIHJpZ2h0IG5vdyB3ZSBnbG9iIHVzaW5nIGp1c3QgdGhlIHNlY29uZCBsZXZlbCBkb21haW4g
ZS5nLiAqLkRPTUFJTi5jb20KKyAgICAgICAgICAgVGhpcyB3aWxsIHJldHVybiB0b28gbWFueSBj
b29raWVzIHVuZGVyIG11bHRpbGV2ZWwgdGxkcyBzdWNoIGFzICouY28udWsKKyAgICAgICAgICAg
YnV0IHdlIGZpbHRlciB0aG9zZSBvdXQgbGF0ZXIKKyAgICAgICAgKi8KKworICAgICAgICBzaXpl
X3Qgc2Vjb25kTGV2ZWxTZXBhcmF0b3IgPSByZXF1ZXN0SG9zdC5yZXZlcnNlRmluZCgnLicsIHRv
cExldmVsU2VwYXJhdG9yLTEpOworICAgICAgICBTdHJpbmcgbG9jYWxEb21haW4gPSBzZWNvbmRM
ZXZlbFNlcGFyYXRvciA9PSBub3RGb3VuZCA/IHJlcXVlc3RIb3N0IDogcmVxdWVzdEhvc3Quc3Vi
c3RyaW5nKHNlY29uZExldmVsU2VwYXJhdG9yKzEpOworCisgICAgICAgIEFTU0VSVCghbG9jYWxE
b21haW4uaXNFbXB0eSgpKTsKKyAgICAgICAgcHN0bXQtPmJpbmRUZXh0KDUsIFN0cmluZygiKi4i
KSArIGxvY2FsRG9tYWluKTsKKyAgICB9CisKKyAgICBpZiAoIXBzdG10KQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICByZXN1bHRzLmNsZWFyKCk7CisKKyAgICB3aGlsZSAocHN0bXQtPnN0
ZXAoKSA9PSBTUUxJVEVfUk9XKSB7CisKKyAgICAgICAgaWYgKHJlc3VsdHMuc2l6ZSgpID4gTUFY
X0NPT0tJRV9QRVJfRE9NQUlOKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgU3RyaW5n
IGNvb2tpZU5hbWUgPSBwc3RtdC0+Z2V0Q29sdW1uVGV4dCgwKTsKKyAgICAgICAgU3RyaW5nIGNv
b2tpZVZhbHVlID0gcHN0bXQtPmdldENvbHVtblRleHQoMSk7CisgICAgICAgIFN0cmluZyBjb29r
aWVEb21haW4gPSBwc3RtdC0+Z2V0Q29sdW1uVGV4dCgyKS5jb252ZXJ0VG9BU0NJSUxvd2VyY2Fz
ZSgpOworICAgICAgICBTdHJpbmcgY29va2llUGF0aCA9IHBzdG10LT5nZXRDb2x1bW5UZXh0KDMp
LmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCk7CisgICAgICAgIGRvdWJsZSBjb29raWVFeHBpcmVz
ID0gKGRvdWJsZSlwc3RtdC0+Z2V0Q29sdW1uSW50NjQoNCkgKiAxMDAwOworICAgICAgICBib29s
IGNvb2tpZUh0dHBPbmx5ID0gKHBzdG10LT5nZXRDb2x1bW5JbnQoNSkgPT0gMSk7CisgICAgICAg
IGJvb2wgY29va2llU2VjdXJlID0gKHBzdG10LT5nZXRDb2x1bW5JbnQoNikgPT0gMSk7CisgICAg
ICAgIGJvb2wgY29va2llU2Vzc2lvbiA9IChwc3RtdC0+Z2V0Q29sdW1uSW50KDcpID09IDEpOwor
CisgICAgICAgIGlmICghQ29va2llVXRpbDo6ZG9tYWluTWF0Y2goY29va2llRG9tYWluLCByZXF1
ZXN0SG9zdCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBodHRwczovL3Rv
b2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMS40ICJQYXRocyBhbmQgUGF0aC1N
YXRjaCIKKyAgICAgICAgYm9vbCBpc1BhdGhNYXRjaGVkID0gY29va2llUGF0aCA9PSByZXF1ZXN0
UGF0aAorICAgICAgICAgICAgfHwgKHJlcXVlc3RQYXRoLnN0YXJ0c1dpdGgoY29va2llUGF0aCkg
JiYgY29va2llUGF0aC5lbmRzV2l0aCgnLycpKQorICAgICAgICAgICAgfHwgKHJlcXVlc3RQYXRo
LnN0YXJ0c1dpdGgoY29va2llUGF0aCkgJiYgKHJlcXVlc3RQYXRoLmNoYXJhY3RlckF0KGNvb2tp
ZVBhdGgubGVuZ3RoKCkpID09ICcvJykpOworCisgICAgICAgIGlmICghaXNQYXRoTWF0Y2hlZCkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIENvb2tpZSByZXN1bHQoY29va2llTmFt
ZSwKKyAgICAgICAgICAgIGNvb2tpZVZhbHVlLAorICAgICAgICAgICAgY29va2llRG9tYWluLAor
ICAgICAgICAgICAgY29va2llUGF0aCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBjb29r
aWVFeHBpcmVzLAorICAgICAgICAgICAgY29va2llSHR0cE9ubHksCisgICAgICAgICAgICBjb29r
aWVTZWN1cmUsCisgICAgICAgICAgICBjb29raWVTZXNzaW9uLAorICAgICAgICAgICAgU3RyaW5n
KCksCisgICAgICAgICAgICBVUkwoKSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50MTZfdD4oKSk7
CisKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVzdWx0KTsKKyAgICB9CisgICAgcHN0bXQtPmZp
bmFsaXplKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb29raWVKYXJEQjo6aGFz
SHR0cE9ubHlDb29raWUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwg
Y29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFNRTGl0ZVN0YXRlbWVudCogc3RhdGVtZW50ID0g
Z2V0UHJlcGFyZVN0YXRlbWVudChDSEVDS19FWElTVFNfSFRUUE9OTFlfQ09PS0lFX1NRTCk7Cisg
ICAgQVNTRVJUKHN0YXRlbWVudCk7CisKKyAgICBzdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIG5hbWUp
OworICAgIHN0YXRlbWVudC0+YmluZFRleHQoMiwgZG9tYWluKTsKKyAgICBzdGF0ZW1lbnQtPmJp
bmRUZXh0KDMsIHBhdGgpOworCisgICAgcmV0dXJuIHN0YXRlbWVudC0+c3RlcCgpID09IFNRTElU
RV9ST1c7Cit9CisKKworaW50IENvb2tpZUphckRCOjpzZXRDb29raWUoY29uc3QgQ29va2llJiBj
b29raWUpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKCFjb29raWUuc2Vzc2lvbiAmJiAo
Y29va2llLmV4cGlyZXMgPCA6OnRpbWUoMCkpKQorICAgICAgICByZXQgPSBkZWxldGVDb29raWVJ
bnRlcm5hbChjb29raWUubmFtZSwgY29va2llLmRvbWFpbiwgY29va2llLnBhdGgpOworICAgIGVs
c2UgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQqIHN0YXRlbWVudCA9IGdldFByZXBhcmVTdGF0
ZW1lbnQoU0VUX0NPT0tJRV9TUUwpOworICAgICAgICBBU1NFUlQoc3RhdGVtZW50KTsKKworICAg
ICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgc29tZSBldmljdGlvbiBwb2xpY3kgd2hlbiBh
IGRvbWFpbiBnb2VzIG92ZXIgTUFYX0NPT0tJRV9QRVJfRE9NQUlOCisKKyAgICAgICAgc3RhdGVt
ZW50LT5iaW5kVGV4dCgxLCBjb29raWUubmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRl
eHQoMiwgY29va2llLnZhbHVlKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29r
aWUuZG9tYWluKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCg0LCBjb29raWUucGF0aCk7
CisgICAgICAgIHN0YXRlbWVudC0+YmluZEludDY0KDUsIGNvb2tpZS5zZXNzaW9uID8gMCA6IChp
bnQ2NF90KWNvb2tpZS5leHBpcmVzKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDYsIGNv
b2tpZS52YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZEludCg3LCBjb29r
aWUuc2Vzc2lvbiA/IDEgOiAwKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDgsIGNvb2tp
ZS5odHRwT25seSA/IDEgOiAwKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kSW50KDksIGNvb2tp
ZS5zZWN1cmUgPyAxIDogMCk7CisKKyAgICAgICAgcmV0ID0gc3RhdGVtZW50LT5zdGVwKCk7Cisg
ICAgfQorICAgIEFTU0VSVChjaGVja1NRTGl0ZVJldHVybkNvZGUocmV0LCBTUUxJVEVfRE9ORSkp
OworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IENvb2tpZUphckRCOjpzZXRDb29raWUoY29u
c3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2llLCBib29sIGZyb21KYXZhU2NyaXB0
KQoreworICAgIGlmICghaXNFbmFibGVkKCkgfHwgIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAg
ICAgIHJldHVybiAtMTsKKworICAgIGlmICh1cmwuaXNFbXB0eSgpIHx8IGNvb2tpZS5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFVSTCB1cmxPYmooUGFyc2VkVVJMU3RyaW5n
LCB1cmwpOworICAgIFN0cmluZyBob3N0KHVybE9iai5ob3N0KCkpOworICAgIFN0cmluZyBwYXRo
KHVybE9iai5wYXRoKCkpOworCisgICAgQ29va2llIGNvb2tpZU9iajsKKyAgICBpZiAoIUNvb2tp
ZVV0aWw6OnBhcnNlQ29va2llSGVhZGVyKGNvb2tpZSwgaG9zdCwgY29va2llT2JqKSkKKyAgICAg
ICAgcmV0dXJuIC0xOworCisgICAgaWYgKGNvb2tpZU9iai5kb21haW4uaXNFbXB0eSgpKQorICAg
ICAgICBjb29raWVPYmouZG9tYWluID0gU3RyaW5nKGhvc3QpOworCisgICAgaWYgKGNvb2tpZU9i
ai5wYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgY29va2llT2JqLnBhdGggPSBTdHJpbmcocGF0aCk7
CisKKyAgICAvLyBGSVhNRTogTmVlZCB0byBjaGVjayB0aGF0IGEgZG9tYWluIGRvZXNuJ3QgYSBz
ZXQgY29va2llIGZvciBhIHRsZCB3aGVuIHdpbmNhaXJvIHN1cHBvcnRzIFBTTAorCisgICAgaWYg
KGZyb21KYXZhU2NyaXB0ICYmIGNvb2tpZU9iai5odHRwT25seSkKKyAgICAgICAgcmV0dXJuIC0x
OworCisgICAgaWYgKGZyb21KYXZhU2NyaXB0ICYmIGhhc0h0dHBPbmx5Q29va2llKGNvb2tpZU9i
ai5uYW1lLCBjb29raWVPYmouZG9tYWluLCBjb29raWVPYmoucGF0aCkpCisgICAgICAgIHJldHVy
biAtMTsKKworICAgIHJldHVybiBzZXRDb29raWUoY29va2llT2JqKTsKK30KKworaW50IENvb2tp
ZUphckRCOjpkZWxldGVDb29raWUoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFt
ZSkKK3sKKyAgICBpZiAoIWlzRW5hYmxlZCgpIHx8ICFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAg
ICAgICByZXR1cm4gLTE7CisKKyAgICBTdHJpbmcgdXJsQ29waWVkID0gU3RyaW5nKHVybCk7Cisg
ICAgaWYgKHVybENvcGllZC5zdGFydHNXaXRoKCcuJykpCisgICAgICAgIHVybENvcGllZC5yZW1v
dmUoMCwgMSk7CisKKyAgICBVUkwgdXJsT2JqKFBhcnNlZFVSTFN0cmluZywgdXJsQ29waWVkKTsK
KyAgICBpZiAodXJsT2JqLmlzVmFsaWQoKSkgeworICAgICAgICBTdHJpbmcgaG9zdFN0cih1cmxP
YmouaG9zdCgpKTsKKyAgICAgICAgU3RyaW5nIHBhdGhTdHIodXJsT2JqLnBhdGgoKSk7CisgICAg
ICAgIGludCByZXQgPSBkZWxldGVDb29raWVJbnRlcm5hbChuYW1lLCBob3N0U3RyLCBwYXRoU3Ry
KTsKKyAgICAgICAgQVNTRVJUKGNoZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElURV9ET05F
KSk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisK
K2ludCBDb29raWVKYXJEQjo6ZGVsZXRlQ29va2llSW50ZXJuYWwoY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFNRTGl0
ZVN0YXRlbWVudCogc3RhdGVtZW50OworICAgIGlmICghcGF0aC5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgc3RhdGVtZW50ID0gZ2V0UHJlcGFyZVN0YXRlbWVudChERUxFVEVfQ09PS0lFX0JZX05BTUVf
RE9NQUlOX1BBVEhfU1FMKTsKKyAgICAgICAgQVNTRVJUKHN0YXRlbWVudCk7CisgICAgICAgIHN0
YXRlbWVudC0+YmluZFRleHQoMSwgbmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQo
MiwgZG9tYWluKTsKKyAgICAgICAgc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBwYXRoKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBzdGF0ZW1lbnQgPSBnZXRQcmVwYXJlU3RhdGVtZW50KERFTEVURV9D
T09LSUVfQllfTkFNRV9ET01BSU5fU1FMKTsKKyAgICAgICAgQVNTRVJUKHN0YXRlbWVudCk7Cisg
ICAgICAgIHN0YXRlbWVudC0+YmluZFRleHQoMSwgbmFtZSk7CisgICAgICAgIHN0YXRlbWVudC0+
YmluZFRleHQoMiwgZG9tYWluKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGVtZW50LT5zdGVw
KCk7Cit9CisKK2ludCBDb29raWVKYXJEQjo6ZGVsZXRlQ29va2llcyhjb25zdCBTdHJpbmcmIHVy
bCkKK3sKKyAgICAvLyBOT1QgSU1QTEVNRU5URUQKKyAgICAvLyBUT0RPOiB0aGlzIGZ1bmN0aW9u
IHdpbGwgYmUgY2FsbGVkIGlmIGFwcGxpY2F0aW9uIGNhbGxzIFdLQ29va2llTWFuYWdlckRlbGV0
ZUNvb2tpZXNGb3JIb3N0bmFtZSgpIGluIFdLQ29va2llTWFuYWdlci5oLgorICAgIHJldHVybiAw
OworfQorCitpbnQgQ29va2llSmFyREI6OmRlbGV0ZUFsbENvb2tpZXMoKQoreworICAgIGlmICgh
aXNFbmFibGVkKCkgfHwgIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiAtMTsK
KworICAgIHJldHVybiBleGVjdXRlU2ltcGxlU3FsKERFTEVURV9BTExfQ09PS0lFX1NRTCk7Cit9
CisKK3ZvaWQgQ29va2llSmFyREI6OmNyZWF0ZVByZXBhcmVTdGF0ZW1lbnQoY29uc3QgY2hhciog
c3FsKQoreworICAgIGF1dG8gc3RhdGVtZW50ID0gc3RkOjptYWtlX3VuaXF1ZTxTUUxpdGVTdGF0
ZW1lbnQ+KG1fZGF0YWJhc2UsIHNxbCk7CisgICAgaW50IHJldCA9IHN0YXRlbWVudC0+cHJlcGFy
ZSgpOworICAgIEFTU0VSVChyZXQgPT0gU1FMSVRFX09LKTsKKyAgICBtX3N0YXRlbWVudHMuYWRk
KFN0cmluZyhzcWwpLCBXVEZNb3ZlKHN0YXRlbWVudCkpOworfQorCitTUUxpdGVTdGF0ZW1lbnQq
IENvb2tpZUphckRCOjpnZXRQcmVwYXJlU3RhdGVtZW50KGNvbnN0IGNoYXIqIHNxbCkKK3sKKyAg
ICBjb25zdCBhdXRvJiBzdGF0ZW1lbnQgPSBtX3N0YXRlbWVudHMuZ2V0KFN0cmluZyhzcWwpKTsK
KyAgICBBU1NFUlQoc3RhdGVtZW50KTsKKyAgICBzdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0
dXJuIHN0YXRlbWVudDsKK30KKworaW50IENvb2tpZUphckRCOjpleGVjdXRlU2ltcGxlU3FsKGNv
bnN0IGNoYXIqIHNxbCwgYm9vbCBpZ25vcmVFcnJvcikKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQg
c3RhdGVtZW50KG1fZGF0YWJhc2UsIHNxbCk7CisgICAgaW50IHJldCA9IHN0YXRlbWVudC5wcmVw
YXJlQW5kU3RlcCgpOworICAgIHN0YXRlbWVudC5maW5hbGl6ZSgpOworCisgICAgQVNTRVJUKGNo
ZWNrU1FMaXRlUmV0dXJuQ29kZShyZXQsIFNRTElURV9PSykKKyAgICAgICAgfHwgY2hlY2tTUUxp
dGVSZXR1cm5Db2RlKHJldCwgU1FMSVRFX0RPTkUpCisgICAgICAgIHx8IGNoZWNrU1FMaXRlUmV0
dXJuQ29kZShyZXQsIFNRTElURV9ST1cpCisgICAgICAgIHx8IGlnbm9yZUVycm9yKTsKKyAgICBy
ZXR1cm4gcmV0OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyREIuaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZWMzMDliZjU2YwotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJEQi5oCkBAIC0w
LDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBF
bnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
CisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorI2lu
Y2x1ZGUgIlNRTGl0ZURhdGFiYXNlLmgiCisjaW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCisj
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNp
bmNsdWRlIDx3dGYvT3B0aW9uYWwuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvb2tpZUphckRCIHsKKyAgICBXVEZf
TUFLRV9OT05DT1BZQUJMRShDb29raWVKYXJEQik7CisKK3B1YmxpYzoKKyAgICBib29sIGlzRW5h
YmxlZCgpOworICAgIHZvaWQgc2V0RW5hYmxlZChib29sKTsKKworICAgIGJvb2wgc2VhcmNoQ29v
a2llcyhjb25zdCBTdHJpbmcmIHJlcXVlc3RVcmwsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8Ym9vbD4m
IGh0dHBPbmx5LCBjb25zdCBzdGQ6Om9wdGlvbmFsPGJvb2w+JiBzZWN1cmUsIGNvbnN0IHN0ZDo6
b3B0aW9uYWw8Ym9vbD4mIHNlc3Npb24sIFZlY3RvcjxDb29raWU+JiByZXN1bHRzKTsKKyAgICBp
bnQgc2V0Q29va2llKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIGNvb2tpZSwgYm9v
bCBmcm9tSmF2YVNjcmlwdCk7CisgICAgaW50IHNldENvb2tpZShjb25zdCBDb29raWUmKTsKKwor
ICAgIGludCBkZWxldGVDb29raWUoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFt
ZSk7CisgICAgaW50IGRlbGV0ZUNvb2tpZXMoY29uc3QgU3RyaW5nJiB1cmwpOworICAgIGludCBk
ZWxldGVBbGxDb29raWVzKCk7CisKKyAgICBDb29raWVKYXJEQihjb25zdCBTdHJpbmcmIGRhdGFi
YXNlUGF0aCk7CisgICAgfkNvb2tpZUphckRCKCk7CisKK3ByaXZhdGU6CisKKyAgICBib29sIG1f
Y29va2llRW5hYmxlIHt0cnVlfTsKKyAgICBTdHJpbmcgbV9kYXRhYmFzZVBhdGg7CisKKyAgICBi
b29sIG1fZGV0ZWN0ZWREYXRhYmFzZUNvcnJ1cHRpb24ge2ZhbHNlfTsKKworICAgIGJvb2wgaXNP
bk1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIChtX2RhdGFiYXNlUGF0aCA9PSAiOm9ubWVtb3J5OiIp
OyB9OworCisgICAgYm9vbCBvcGVuRGF0YWJhc2UoKTsKKyAgICB2b2lkIGNsb3NlRGF0YWJhc2Uo
KTsKKworICAgIGJvb2wgY2hlY2tTUUxpdGVSZXR1cm5Db2RlKGludCBhY3R1YWwsIGludCBleHBl
Y3RlZCk7CisgICAgdm9pZCBmbGFnRGF0YWJhc2VDb3JydXB0aW9uKCk7CisgICAgYm9vbCBjaGVj
a0RhdGFiYXNlQ29ycnVwdGlvbkFuZFJlbW92ZUlmTmVlZGVkKCk7CisgICAgU3RyaW5nIGdldENv
cnJ1cHRpb25NYXJrZXJQYXRoKCkgY29uc3Q7CisKKyAgICBib29sIGNoZWNrRGF0YWJhc2VWYWxp
ZGl0eSgpOworICAgIHZvaWQgZGVsZXRlQWxsRGF0YWJhc2VGaWxlcygpOworCisgICAgdm9pZCBj
cmVhdGVQcmVwYXJlU3RhdGVtZW50KGNvbnN0IGNoYXIqIHNxbCk7CisgICAgU1FMaXRlU3RhdGVt
ZW50KiBnZXRQcmVwYXJlU3RhdGVtZW50KGNvbnN0IGNoYXIqIHNxbCk7CisgICAgaW50IGV4ZWN1
dGVTaW1wbGVTcWwoY29uc3QgY2hhciogc3FsLCBib29sIGlnbm9yZUVycm9yID0gZmFsc2UpOwor
CisgICAgaW50IGRlbGV0ZUNvb2tpZUludGVybmFsKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBkb21haW4sIGNvbnN0IFN0cmluZyYgcGF0aCk7CisgICAgYm9vbCBoYXNIdHRwT25s
eUNvb2tpZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBT
dHJpbmcmIHBhdGgpOworCisgICAgU1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKKyAgICBIYXNo
TWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRyPFNRTGl0ZVN0YXRlbWVudD4+IG1fc3RhdGVtZW50
czsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMC4uOTU1ZTVkMTUwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llVXRpbC5jcHAKQEAgLTAsMCAr
MSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggU29ueSBJbnRlcmFjdGl2ZSBFbnRl
cnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisg
KiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llVXRpbC5o
IgorCisjaWYgVVNFKENVUkwpCisKKyNpbmNsdWRlICJDb29raWUuaCIKKworI2luY2x1ZGUgPHd0
Zi9EYXRlTWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9PcHRpb25hbC5oPgorI2luY2x1ZGUgPHd0Zi90
ZXh0L1dURlN0cmluZy5oPgorCisvKiBUaGlzIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHdl
IGFjY2VwdCBmb3IgYSBjb29raWUgbGluZS4gUkZDIDIxMDkKKyAgIHNlY3Rpb24gNi4zIHNheXM6
CisKKyAgICJhdCBsZWFzdCA0MDk2IGJ5dGVzIHBlciBjb29raWUgKGFzIG1lYXN1cmVkIGJ5IHRo
ZSBzaXplIG9mIHRoZSBjaGFyYWN0ZXJzCisgICB0aGF0IGNvbXByaXNlIHRoZSBjb29raWUgbm9u
LXRlcm1pbmFsIGluIHRoZSBzeW50YXggZGVzY3JpcHRpb24gb2YgdGhlCisgICBTZXQtQ29va2ll
IGhlYWRlcikiCisqLworCisjZGVmaW5lIE1BWF9DT09LSUVfTElORSA1MDAwCisjZGVmaW5lIE1B
WF9DT09LSUVfTElORV9UWFQgIjQ5OTkiCisKKyNkZWZpbmUgTUFYX05BTUUgMTAyNAorI2RlZmlu
ZSBNQVhfTkFNRV9UWFQgIjEwMjMiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNl
IENvb2tpZVV0aWwgeworCitib29sIGlzSVBBZGRyZXNzKGNvbnN0IFN0cmluZyYgaG9zdG5hbWUp
Cit7CisgICAgLy8gQXNzdW1pbmcgdGhhdCBob3N0cyBlbmRpbmcgaW4gYSBkaWdpdCBhcmUgSVAg
QWRkcmVzc2VzCisgICAgcmV0dXJuICFob3N0bmFtZS5pc0VtcHR5KCkgJiYgaXNBU0NJSURpZ2l0
KGhvc3RuYW1lW2hvc3RuYW1lLmxlbmd0aCgpIC0gMV0pOworfQorCitib29sIGRvbWFpbk1hdGNo
KGNvbnN0IFN0cmluZyYgY29va2llRG9tYWluLCBjb25zdCBTdHJpbmcmIGhvc3QpCit7CisgICAg
c2l6ZV90IGluZGV4ID0gaG9zdC5maW5kKGNvb2tpZURvbWFpbik7CisKKyAgICBib29sIHRhaWxN
YXRjaCA9IChpbmRleCAhPSBXVEY6Om5vdEZvdW5kICYmIGluZGV4ICsgY29va2llRG9tYWluLmxl
bmd0aCgpID09IGhvc3QubGVuZ3RoKCkpOworCisgICAgLy8gQ2hlY2sgaWYgaG9zdCBlcXVhbHMg
Y29va2llIGRvbWFpbi4KKyAgICBpZiAodGFpbE1hdGNoICYmICFpbmRleCkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICAvLyBDaGVjayBpZiBob3N0IGlzIGEgc3ViZG9tYWluIG9mIHRoZSBk
b21haW4gaW4gdGhlIGNvb2tpZS4KKyAgICAvLyBDdXJsIHVzZXMgYSAnLicgaW4gZnJvbnQgb2Yg
ZG9tYWlucyB0byBpbmRpY2F0ZSBpdCdzIHZhbGlkIG9uIHN1YmRvbWFpbnMuCisgICAgaWYgKHRh
aWxNYXRjaCAmJiBpbmRleCA+IDAgJiYgaG9zdFtpbmRleF0gPT0gJy4nKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIC8vIENoZWNrIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgaG9zdCBlcXVh
bHMgdGhlIGNvb2tpZSBkb21haW4sIGV4Y2VwdCBmb3IgYSBsZWFkaW5nICcuJyBpbiB0aGUgY29v
a2llIGRvbWFpbi4KKyAgICAvLyBFLmcuIGNvb2tpZSBkb21haW4gaXMgLmFwcGxlLmNvbSBhbmQg
aG9zdCBpcyBhcHBsZS5jb20uCisgICAgaWYgKGNvb2tpZURvbWFpblswXSA9PSAnLicgJiYgY29v
a2llRG9tYWluLmZpbmQoaG9zdCkgPT0gMSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBzdGQ6Om9wdGlvbmFsPGRvdWJsZT4gcGFyc2VFeHBp
cmVzKGNvbnN0IGNoYXIqIGV4cGlyZXMpCit7CisgICAgZG91YmxlIHRtcCA9IFdURjo6cGFyc2VE
YXRlRnJvbU51bGxUZXJtaW5hdGVkQ2hhcmFjdGVycyhleHBpcmVzKTsKKyAgICBpZiAoaXNuYW4o
dG1wKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIHJldHVybiBzdGQ6Om9wdGlvbmFsPGRv
dWJsZT4ge3RtcCAvIFdURjo6bXNQZXJTZWNvbmR9OworfQorCitzdGF0aWMgdm9pZCBwYXJzZUNv
b2tpZUF0dHJpYnV0ZXMoY29uc3QgU3RyaW5nJiBhdHRyaWJ1dGUsIGNvbnN0IFN0cmluZyYgZG9t
YWluLCBib29sJiBoYXNNYXhBZ2UsIENvb2tpZSYgcmVzdWx0KQoreworICAgIHNpemVfdCBhc3Np
Z25tZW50UG9zaXRpb24gPSBhdHRyaWJ1dGUuZmluZCgnPScpOworCisgICAgU3RyaW5nIGF0dHJp
YnV0ZU5hbWU7CisgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOworCisgICAgaWYgKGFzc2lnbm1l
bnRQb3NpdGlvbiAhPSBub3RGb3VuZCkgeworICAgICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmli
dXRlLnN1YnN0cmluZygwLCBhc3NpZ25tZW50UG9zaXRpb24pLnN0cmlwV2hpdGVTcGFjZSgpOwor
ICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZS5zdWJzdHJpbmcoYXNzaWdubWVudFBv
c2l0aW9uICsgMSkuc3RyaXBXaGl0ZVNwYWNlKCk7CisgICAgfSBlbHNlCisgICAgICAgIGF0dHJp
YnV0ZU5hbWUgPSBhdHRyaWJ1dGUuc3RyaXBXaGl0ZVNwYWNlKCk7CisKKyAgICBpZiAoZXF1YWxJ
Z25vcmluZ0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAiaHR0cG9ubHkiKSkKKyAgICAgICAgcmVz
dWx0Lmh0dHBPbmx5ID0gdHJ1ZTsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNl
KGF0dHJpYnV0ZU5hbWUsICJzZWN1cmUiKSkKKyAgICAgICAgcmVzdWx0LnNlY3VyZSA9IHRydWU7
CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShhdHRyaWJ1dGVOYW1lLCAiZG9t
YWluIikpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAvLyBFbmZvcmNlIGEgZG90IGNoYXJhY3RlciBwcmVmaXgg
dG8gaG9zdG5hbWVzIHdoaWNoIGFyZSBub3QgaXAgYWRkcmVzc2VzIGFuZCBub3Qgc2luZ2xlIHZh
bHVlIGhvc3RuYW1lcyBzdWNoIGFzIGxvY2FsaG9zdAorICAgICAgICBpZiAoIWlzSVBBZGRyZXNz
KGF0dHJpYnV0ZVZhbHVlKSAmJiAhYXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aCgnLicpICYmIGF0
dHJpYnV0ZVZhbHVlLmZpbmQoJy4nKSAhPSBub3RGb3VuZCkKKyAgICAgICAgICAgIGF0dHJpYnV0
ZVZhbHVlID0gIi4iICsgYXR0cmlidXRlVmFsdWU7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRo
ZSBob3N0IGNhbiBzZXQgYSBjb29raWUgZm9yIHRoZSBkb21haW4KKyAgICAgICAgLy8gRklYTUU6
IGZpcmVmb3ggYW5kIGNocm9tZSBib3RoIGlnbm9yZSBjb29raWVzIHdpdGggbm8gdmFsaWQgZG9t
YWluIHNldAorICAgICAgICAvLyB3ZSBjdXJyZW50bHkgaWdub3JlIHRoZSBpbnZhbGlkIGRvbWFp
bnMgYW5kIGRlZmF1bHQgdG8gdGhlIGhvc3RuYW1lIGFzIHRoZSBkb21haW4KKyAgICAgICAgaWYg
KGRvbWFpbk1hdGNoKGF0dHJpYnV0ZVZhbHVlLCBkb21haW4pKQorICAgICAgICAgICAgcmVzdWx0
LmRvbWFpbiA9IGF0dHJpYnV0ZVZhbHVlOworCisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5n
QVNDSUlDYXNlKGF0dHJpYnV0ZU5hbWUsICJtYXgtYWdlIikpIHsKKyAgICAgICAgYm9vbCBvazsK
KyAgICAgICAgdGltZV90IGV4cGlyeVRpbWUgPSB0aW1lKDApICsgYXR0cmlidXRlVmFsdWUudG9J
bnQ2NCgmb2spOworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIHJlc3VsdC5leHBpcmVz
ID0gKGRvdWJsZSlleHBpcnlUaW1lOworICAgICAgICAgICAgcmVzdWx0LnNlc3Npb24gPSBmYWxz
ZTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBtYXgtYWdlIGF0dHJpYnV0ZSBhcyB3
ZWxsIGFzIGFuIGV4cGlyZXMgYXR0cmlidXRlCisgICAgICAgICAgICAvLyB0aGUgcmlnaHRtb3N0
IG1heC1hZ2UgYXR0cmlidXRlIHRha2VzIHByZWNlZGVuY2UuCisgICAgICAgICAgICBoYXNNYXhB
Z2UgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQVNDSUlD
YXNlKGF0dHJpYnV0ZU5hbWUsICJleHBpcmVzIikgJiYgIWhhc01heEFnZSkgeworICAgICAgICBp
ZiAoYXV0byBleHBpcnlUaW1lID0gcGFyc2VFeHBpcmVzKGF0dHJpYnV0ZVZhbHVlLnV0ZjgoKS5k
YXRhKCkpKSB7CisgICAgICAgICAgICByZXN1bHQuZXhwaXJlcyA9IGV4cGlyeVRpbWUudmFsdWUo
KTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXNzaW9uID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdBU0NJSUNhc2UoYXR0cmlidXRlTmFtZSwgInBhdGgiKSkg
eworICAgICAgICBpZiAoIWF0dHJpYnV0ZVZhbHVlLmlzRW1wdHkoKSAmJiBhdHRyaWJ1dGVWYWx1
ZS5zdGFydHNXaXRoKCcvJykpCisgICAgICAgICAgICByZXN1bHQucGF0aCA9IGF0dHJpYnV0ZVZh
bHVlOworICAgIH0KK30KKworYm9vbCBwYXJzZUNvb2tpZUhlYWRlcihjb25zdCBTdHJpbmcmIGNv
b2tpZUxpbmUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBDb29raWUmIHJlc3VsdCkKK3sKKyAgICBp
ZiAoY29va2llTGluZS5sZW5ndGgoKSA+PSBNQVhfQ09PS0lFX0xJTkUpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIFRoaXMgQWxnb3JpdGhtIGlzIGJhc2VkIG9uIHRoZSBhbGdvcml0
aG0gZGVmaW5lZCBpbiBSRkMgNjI2NSA1LjIgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3Jm
YzYyNjUjc2VjdGlvbi01LjIvCisKKyAgICBzaXplX3Qgc2VwYXJhdG9yUG9zaXRpb24gPSBjb29r
aWVMaW5lLmZpbmQoJzsnKTsKKworICAgIFN0cmluZyBjb29raWVQYWlyID0gc2VwYXJhdG9yUG9z
aXRpb24gPT0gbm90Rm91bmQgPyBjb29raWVMaW5lIDogY29va2llTGluZS5zdWJzdHJpbmcoMCwg
c2VwYXJhdG9yUG9zaXRpb24pOworCisgICAgU3RyaW5nIGNvb2tpZU5hbWU7CisgICAgU3RyaW5n
IGNvb2tpZVZhbHVlOworICAgIHNpemVfdCBhc3NpZ25tZW50UG9zaXRpb24gPSBjb29raWVMaW5l
LmZpbmQoJz0nKTsKKworICAgIC8vIFJGQzYyNjUgc2F5cyB0byBpZ25vcmUgY29va2llcyBwYWly
cyB3aXRoIGVtcHR5IG5hbWVzIG9yIG5vIGFzc2lnbm1lbnQgY2hhcmFjdGVyCisgICAgLy8gYnV0
IGJyb3dzZXJzIHNlZW0gdG8gdHJlYXQgdGhpcyB0eXBlIG9mIGNvb2tpZSBzdHJpbmcgYXMgdGhl
IGNvb2tpZSB2YWx1ZQorICAgIGlmIChhc3NpZ25tZW50UG9zaXRpb24gPT0gbm90Rm91bmQpCisg
ICAgICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFpcjsKKyAgICBlbHNlIHsKKyAgICAgICAgY29v
a2llTmFtZSA9IGNvb2tpZVBhaXIuc3Vic3RyaW5nKDAsIGFzc2lnbm1lbnRQb3NpdGlvbik7Cisg
ICAgICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFpci5zdWJzdHJpbmcoYXNzaWdubWVudFBvc2l0
aW9uICsgMSk7CisgICAgfQorCisgICAgcmVzdWx0Lm5hbWUgPSBjb29raWVOYW1lLnN0cmlwV2hp
dGVTcGFjZSgpOworICAgIHJlc3VsdC52YWx1ZSA9IGNvb2tpZVZhbHVlLnN0cmlwV2hpdGVTcGFj
ZSgpOworCisgICAgYm9vbCBoYXNNYXhBZ2UgPSBmYWxzZTsKKyAgICByZXN1bHQuc2Vzc2lvbiA9
IHRydWU7CisKKyAgICBWZWN0b3I8U3RyaW5nPiBjb29raWVBdHRyaWJ1dGVzOworICAgIGNvb2tp
ZUxpbmUuc3BsaXQoJzsnLCB0cnVlLCBjb29raWVBdHRyaWJ1dGVzKTsKKyAgICBmb3IgKGF1dG8g
YXR0cmlidXRlIDogY29va2llQXR0cmlidXRlcykKKyAgICAgICAgcGFyc2VDb29raWVBdHRyaWJ1
dGVzKGF0dHJpYnV0ZSwgZG9tYWluLCBoYXNNYXhBZ2UsIHJlc3VsdCk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ29va2llVXRpbAorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL0Nvb2tpZVV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu
LjI2N2ZkYzI5YTJkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0Nvb2tpZVV0aWwuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE4IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3N0cnVjdCBDb29raWU7CisKK25hbWVzcGFjZSBDb29raWVVdGlsIHsKKworYm9vbCBwYXJzZUNv
b2tpZUhlYWRlcihjb25zdCBTdHJpbmcmIGNvb2tpZUxpbmUsIGNvbnN0IFN0cmluZyYgZG9tYWlu
LCBDb29raWUmIHJlc3VsdCk7CisKK2Jvb2wgaXNJUEFkZHJlc3MoY29uc3QgU3RyaW5nJiBob3N0
bmFtZSk7CisKK2Jvb2wgZG9tYWluTWF0Y2goY29uc3QgU3RyaW5nJiBjb29raWVEb21haW4sIGNv
bnN0IFN0cmluZyYgaG9zdCk7CisKK30gLy8gbmFtZXNwYWNlIENvb2tpZVV0aWwKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9DdXJsQ29udGV4dC5jcHAKaW5kZXggZDU0YjEyYzkyYzguLjVhNDI5YTlmODE0IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRl
eHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29u
dGV4dC5jcHAKQEAgLTQyLDM4ICs0Miw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3Rh
dGljIENTdHJpbmcgY29va2llSmFyUGF0aCgpCi17Ci0gICAgY2hhciogY29va2llSmFyUGF0aCA9
IGdldGVudigiQ1VSTF9DT09LSUVfSkFSX1BBVEgiKTsKLSAgICBpZiAoY29va2llSmFyUGF0aCkK
LSAgICAgICAgcmV0dXJuIGNvb2tpZUphclBhdGg7Ci0KLSNpZiBPUyhXSU5ET1dTKQotICAgIGNo
YXIgZXhlY3V0YWJsZVBhdGhbTUFYX1BBVEhdOwotICAgIGNoYXIgYXBwRGF0YURpcmVjdG9yeVtN
QVhfUEFUSF07Ci0gICAgY2hhciBjb29raWVKYXJGdWxsUGF0aFtNQVhfUEFUSF07Ci0gICAgY2hh
ciBjb29raWVKYXJEaXJlY3RvcnlbTUFYX1BBVEhdOwotCi0gICAgaWYgKEZBSUxFRCg6OlNIR2V0
Rm9sZGVyUGF0aEEoMCwgQ1NJRExfTE9DQUxfQVBQREFUQSB8IENTSURMX0ZMQUdfQ1JFQVRFLCAw
LCAwLCBhcHBEYXRhRGlyZWN0b3J5KSkKLSAgICAgICAgfHwgRkFJTEVEKDo6R2V0TW9kdWxlRmls
ZU5hbWVBKDAsIGV4ZWN1dGFibGVQYXRoLCBNQVhfUEFUSCkpKQotICAgICAgICByZXR1cm4gImNv
b2tpZXMuZGF0IjsKLQotICAgIDo6UGF0aFJlbW92ZUV4dGVuc2lvbkEoZXhlY3V0YWJsZVBhdGgp
OwotICAgIExQU1RSIGV4ZWN1dGFibGVOYW1lID0gOjpQYXRoRmluZEZpbGVOYW1lQShleGVjdXRh
YmxlUGF0aCk7Ci0gICAgc3ByaW50Zl9zKGNvb2tpZUphckRpcmVjdG9yeSwgTUFYX1BBVEgsICIl
cy8lcyIsIGFwcERhdGFEaXJlY3RvcnksIGV4ZWN1dGFibGVOYW1lKTsKLSAgICBzcHJpbnRmX3Mo
Y29va2llSmFyRnVsbFBhdGgsIE1BWF9QQVRILCAiJXMvY29va2llcy5kYXQiLCBjb29raWVKYXJE
aXJlY3RvcnkpOwotCi0gICAgaWYgKDo6U0hDcmVhdGVEaXJlY3RvcnlFeEEoMCwgY29va2llSmFy
RGlyZWN0b3J5LCAwKSAhPSBFUlJPUl9TVUNDRVNTCi0gICAgICAgICYmIDo6R2V0TGFzdEVycm9y
KCkgIT0gRVJST1JfRklMRV9FWElTVFMKLSAgICAgICAgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBF
UlJPUl9BTFJFQURZX0VYSVNUUykKLSAgICAgICAgcmV0dXJuICJjb29raWVzLmRhdCI7Ci0KLSAg
ICByZXR1cm4gY29va2llSmFyRnVsbFBhdGg7Ci0jZWxzZQotICAgIHJldHVybiAiY29va2llcy5k
YXQiOwotI2VuZGlmCi19Ci0KIC8vIEN1cmxDb250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ3VybENvbnRl
eHQmIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKQpAQCAtODMsMTAgKzUxLDggQEAgQ3VybENvbnRl
eHQmIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKQogfQogCiBDdXJsQ29udGV4dDo6Q3VybENvbnRl
eHQoKQotOiBtX2Nvb2tpZUphckZpbGVOYW1lIHsgY29va2llSmFyUGF0aCgpIH0KLSwgbV9jb29r
aWVKYXIgeyBzdGQ6Om1ha2VfdW5pcXVlPENvb2tpZUphckN1cmxGaWxlU3lzdGVtPigpIH0KIHsK
LSAgICBpbml0Q29va2llU2Vzc2lvbigpOworICAgIGluaXRTaGFyZUhhbmRsZSgpOwogCiAjaWZu
ZGVmIE5ERUJVRwogICAgIG1fdmVyYm9zZSA9IGdldGVudigiREVCVUdfQ1VSTCIpOwpAQCAtMTA1
LDEzICs3MSw4IEBAIEN1cmxDb250ZXh0Ojp+Q3VybENvbnRleHQoKQogI2VuZGlmCiB9CiAKLS8v
IENvb2tpZSA9PT09PT09PT09PT09PT09PT09PT09PQotCi12b2lkIEN1cmxDb250ZXh0Ojppbml0
Q29va2llU2Vzc2lvbigpCit2b2lkIEN1cmxDb250ZXh0Ojppbml0U2hhcmVIYW5kbGUoKQogewot
ICAgIC8vIEN1cmwgc2F2ZXMgYm90aCBwZXJzaXN0ZW50IGNvb2tpZXMsIGFuZCBzZXNzaW9uIGNv
b2tpZXMgdG8gdGhlIGNvb2tpZSBmaWxlLgotICAgIC8vIFRoZSBzZXNzaW9uIGNvb2tpZXMgc2hv
dWxkIGJlIGRlbGV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHNlc3Npb24uCi0KICAgICBDVVJM
KiBjdXJsID0gY3VybF9lYXN5X2luaXQoKTsKIAogICAgIGlmICghY3VybCkKQEAgLTExOSwxMyAr
ODAsNiBAQCB2b2lkIEN1cmxDb250ZXh0Ojppbml0Q29va2llU2Vzc2lvbigpCiAKICAgICBjdXJs
X2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfU0hBUkUsIG1fc2hhcmVIYW5kbGUuaGFuZGxlKCkp
OwogCi0gICAgaWYgKCFtX2Nvb2tpZUphckZpbGVOYW1lLmlzTnVsbCgpKSB7Ci0gICAgICAgIGN1
cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9DT09LSUVGSUxFLCBtX2Nvb2tpZUphckZpbGVO
YW1lLmRhdGEoKSk7Ci0gICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9DT09L
SUVKQVIsIG1fY29va2llSmFyRmlsZU5hbWUuZGF0YSgpKTsKLSAgICB9Ci0KLSAgICBjdXJsX2Vh
c3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFU0VTU0lPTiwgMSk7Ci0KICAgICBjdXJsX2Vh
c3lfY2xlYW51cChjdXJsKTsKIH0KIApAQCAtNDgzLDI2ICs0MzcsNiBAQCB2b2lkIEN1cmxIYW5k
bGU6OnNldFNzbEtleVBhc3N3b3JkKGNvbnN0IGNoYXIqIHBhc3N3b3JkKQogICAgIGN1cmxfZWFz
eV9zZXRvcHQobV9oYW5kbGUsIENVUkxPUFRfS0VZUEFTU1dELCBwYXNzd29yZCk7CiB9CiAKLXZv
aWQgQ3VybEhhbmRsZTo6ZW5hYmxlQ29va2llSmFySWZFeGlzdHMoKQotewotICAgIGNvbnN0IGNo
YXIqIGNvb2tpZUphciA9IEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5nZXRDb29raWVKYXJGaWxl
TmFtZSgpOwotICAgIGlmIChjb29raWVKYXIpCi0gICAgICAgIGN1cmxfZWFzeV9zZXRvcHQobV9o
YW5kbGUsIENVUkxPUFRfQ09PS0lFSkFSLCBjb29raWVKYXIpOwotfQotCi12b2lkIEN1cmxIYW5k
bGU6OnNldENvb2tpZUxpc3QoY29uc3QgY2hhciogY29va2llTGlzdCkKLXsKLSAgICBpZiAoIWNv
b2tpZUxpc3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIGN1cmxfZWFzeV9zZXRvcHQobV9oYW5k
bGUsIENVUkxPUFRfQ09PS0lFTElTVCwgY29va2llTGlzdCk7Ci19Ci0KLXZvaWQgQ3VybEhhbmRs
ZTo6ZmV0Y2hDb29raWVMaXN0KEN1cmxTTGlzdCAmY29va2llcykgY29uc3QKLXsKLSAgICBjdXJs
X2Vhc3lfZ2V0aW5mbyhtX2hhbmRsZSwgQ1VSTElORk9fQ09PS0lFTElTVCwgc3RhdGljX2Nhc3Q8
c3RydWN0IGN1cmxfc2xpc3QqKj4oY29va2llcykpOwotfQotCiB2b2lkIEN1cmxIYW5kbGU6OmVu
YWJsZVByb3h5SWZFeGlzdHMoKQogewogICAgIGF1dG8mIHByb3h5ID0gQ3VybENvbnRleHQ6OnNp
bmdsZXRvbigpLnByb3h5SW5mbygpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaAppbmRleCA0ODgwODVlYjJkNy4uZjUyYmQ1NWI1Njkg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29u
dGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29u
dGV4dC5oCkBAIC0yNiw3ICsyNiw2IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiQ29v
a2llSmFyQ3VybC5oIgogI2luY2x1ZGUgIkN1cmxTU0xIYW5kbGUuaCIKICNpbmNsdWRlICJVUkwu
aCIKIApAQCAtMTEwLDExICsxMDksNiBAQCBwdWJsaWM6CiAKICAgICBjb25zdCBDdXJsU2hhcmVI
YW5kbGUmIHNoYXJlSGFuZGxlKCkgeyByZXR1cm4gbV9zaGFyZUhhbmRsZTsgfQogCi0gICAgLy8g
Q29va2llCi0gICAgY29uc3QgY2hhciogZ2V0Q29va2llSmFyRmlsZU5hbWUoKSBjb25zdCB7IHJl
dHVybiBtX2Nvb2tpZUphckZpbGVOYW1lLmRhdGEoKTsgfQotICAgIHZvaWQgc2V0Q29va2llSmFy
RmlsZU5hbWUoY29uc3QgY2hhciogY29va2llSmFyRmlsZU5hbWUpIHsgbV9jb29raWVKYXJGaWxl
TmFtZSA9IENTdHJpbmcoY29va2llSmFyRmlsZU5hbWUpOyB9Ci0gICAgQ29va2llSmFyQ3VybCYg
Y29va2llSmFyKCkgeyByZXR1cm4gKm1fY29va2llSmFyOyB9Ci0KICAgICAvLyBQcm94eQogICAg
IGNvbnN0IFByb3h5SW5mbyYgcHJveHlJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9wcm94eTsgfQog
ICAgIHZvaWQgc2V0UHJveHlJbmZvKGNvbnN0IFByb3h5SW5mbyYgaW5mbykgeyBtX3Byb3h5ID0g
aW5mbzsgIH0KQEAgLTEzMywxMyArMTI3LDExIEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICBQ
cm94eUluZm8gbV9wcm94eTsKLSAgICBDU3RyaW5nIG1fY29va2llSmFyRmlsZU5hbWU7CiAgICAg
Q3VybFNoYXJlSGFuZGxlIG1fc2hhcmVIYW5kbGU7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvb2tp
ZUphckN1cmw+IG1fY29va2llSmFyOwogICAgIEN1cmxTU0xIYW5kbGUgbV9zc2xIYW5kbGU7CiAK
ICAgICBDdXJsQ29udGV4dCgpOwotICAgIHZvaWQgaW5pdENvb2tpZVNlc3Npb24oKTsKKyAgICB2
b2lkIGluaXRTaGFyZUhhbmRsZSgpOwogCiAjaWZuZGVmIE5ERUJVRwogICAgIEZJTEUqIG1fbG9n
RmlsZSB7IG51bGxwdHIgfTsKQEAgLTI1NiwxMCArMjQ4LDYgQEAgcHVibGljOgogICAgIHZvaWQg
c2V0U3NsQ2VydFR5cGUoY29uc3QgY2hhciopOwogICAgIHZvaWQgc2V0U3NsS2V5UGFzc3dvcmQo
Y29uc3QgY2hhciopOwogCi0gICAgdm9pZCBlbmFibGVDb29raWVKYXJJZkV4aXN0cygpOwotICAg
IHZvaWQgc2V0Q29va2llTGlzdChjb25zdCBjaGFyKik7Ci0gICAgdm9pZCBmZXRjaENvb2tpZUxp
c3QoQ3VybFNMaXN0ICZjb29raWVzKSBjb25zdDsKLQogICAgIHZvaWQgZW5hYmxlUHJveHlJZkV4
aXN0cygpOwogCiAgICAgdm9pZCBlbmFibGVUaW1lb3V0KCk7CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3QuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxSZXF1ZXN0LmNwcAppbmRleCBlMGE4MGY0
NTViMC4uZjNlYmQ2OGY3MWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsUmVxdWVzdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxSZXF1ZXN0LmNwcApAQCAtMjAwLDcgKzIwMCw2IEBAIENVUkwqIEN1
cmxSZXF1ZXN0OjpzZXR1cFRyYW5zZmVyKCkKICAgICBtX2N1cmxIYW5kbGUtPnNldFRpbWVvdXQo
dGltZW91dE1pbGxpc2Vjb25kcyk7CiAKICAgICBtX2N1cmxIYW5kbGUtPmVuYWJsZVByb3h5SWZF
eGlzdHMoKTsKLSAgICBtX2N1cmxIYW5kbGUtPmVuYWJsZUNvb2tpZUphcklmRXhpc3RzKCk7CiAK
ICAgICBtX2N1cmxIYW5kbGUtPnNldFNzbFZlcmlmeVBlZXIoQ3VybEhhbmRsZTo6VmVyaWZ5UGVl
cjo6RW5hYmxlKTsKICAgICBtX2N1cmxIYW5kbGUtPnNldFNzbFZlcmlmeUhvc3QoQ3VybEhhbmRs
ZTo6VmVyaWZ5SG9zdDo6U3RyaWN0TmFtZUNoZWNrKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNlc3Np
b25DdXJsLmNwcAppbmRleCAxNzZhZTlmMjc2Zi4uYjg4MDM2YTRjYjYgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNlc3Npb25D
dXJsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTmV0d29y
a1N0b3JhZ2VTZXNzaW9uQ3VybC5jcHAKQEAgLTI5LDYgKzI5LDEwIEBACiAjaWYgVVNFKENVUkwp
CiAKICNpbmNsdWRlICJDb29raWUuaCIKKyNpbmNsdWRlICJDb29raWVKYXJDdXJsRGF0YWJhc2Uu
aCIKKyNpbmNsdWRlICJDb29raWVKYXJEQi5oIgorI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisj
aW5jbHVkZSAiRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgIk5ldHdvcmtpbmdDb250ZXh0LmgiCiAj
aW5jbHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIKIApAQCAtMzcsOSArNDEsMjYgQEAKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCitzdGF0aWMgU3RyaW5nIGRlZmF1bHRDb29raWVKYXJQYXRoKCkKK3sK
KyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdEZpbGVOYW1lID0gImNvb2tpZS5qYXIuZGIi
OworICAgIGNoYXIqIGNvb2tpZUphclBhdGggPSBnZXRlbnYoIkNVUkxfQ09PS0lFX0pBUl9QQVRI
Iik7CisgICAgaWYgKGNvb2tpZUphclBhdGgpCisgICAgICAgIHJldHVybiBjb29raWVKYXJQYXRo
OworCisgICAgU3RyaW5nIGNvb2tpZUphckRpcmVjdG9yeSA9IEZpbGVTeXN0ZW06OmxvY2FsVXNl
clNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgpOworCisgICAgaWYgKCFGaWxlU3lzdGVtOjptYWtl
QWxsRGlyZWN0b3JpZXMoY29va2llSmFyRGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIGRlZmF1
bHRGaWxlTmFtZTsKKworICAgIHJldHVybiBGaWxlU3lzdGVtOjpwYXRoQnlBcHBlbmRpbmdDb21w
b25lbnQoY29va2llSmFyRGlyZWN0b3J5LCBkZWZhdWx0RmlsZU5hbWUpOworfQorCiBOZXR3b3Jr
U3RvcmFnZVNlc3Npb246Ok5ldHdvcmtTdG9yYWdlU2Vzc2lvbihQQUw6OlNlc3Npb25JRCBzZXNz
aW9uSUQsIE5ldHdvcmtpbmdDb250ZXh0KiBjb250ZXh0KQogICAgIDogbV9zZXNzaW9uSUQoc2Vz
c2lvbklEKQogICAgICwgbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBtX2Nvb2tpZURhdGFiYXNl
KGRlZmF1bHRDb29raWVKYXJQYXRoKCkpCisgICAgLCBtX2Nvb2tpZVN0b3JhZ2UobWFrZVVuaXF1
ZVJlZjxDb29raWVKYXJDdXJsRGF0YWJhc2U+KCkpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0
ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVDdXJsRGVsZWdhdGUuY3BwCmluZGV4IDUxNDkzMTYxNGNkLi4wMGM0NDY1NTZmZSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxl
Q3VybERlbGVnYXRlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuY3BwCkBAIC0zMywxMCArMzMsMTIgQEAKICNp
ZiBVU0UoQ1VSTCkKIAogI2luY2x1ZGUgIkF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlLmgiCisjaW5j
bHVkZSAiQ29va2llSmFyQ3VybC5oIgogI2luY2x1ZGUgIkNyZWRlbnRpYWxTdG9yYWdlLmgiCiAj
aW5jbHVkZSAiQ3VybENhY2hlTWFuYWdlci5oIgogI2luY2x1ZGUgIkN1cmxSZXF1ZXN0LmgiCiAj
aW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKKyNpbmNsdWRlICJOZXR3b3JrU3RvcmFnZVNlc3Npb24u
aCIKICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUludGVybmFsLmgiCiAjaW5jbHVkZSAiU2hhcmVk
QnVmZmVyLmgiCiAjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCkBAIC0xOTAsNiArMTkyLDIwIEBA
IHZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmN1cmxEaWRTZW5kRGF0YSh1bnNpZ25l
ZCBsb25nIGxvbmcgYnl0ZXNTZW50LCB1CiAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRTZW5k
RGF0YShtX2hhbmRsZSwgYnl0ZXNTZW50LCB0b3RhbEJ5dGVzVG9CZVNlbnQpOwogfQogCitzdGF0
aWMgdm9pZCBoYW5kbGVDb29raWVIZWFkZXJzKGNvbnN0IEN1cmxSZXNwb25zZSYgcmVzcG9uc2Up
Cit7CisgICAgc3RhdGljIGNvbnN0IGF1dG8gc2V0Q29va2llSGVhZGVyID0gInNldC1jb29raWU6
ICI7CisKKyAgICBhdXRvJiBkZWZhdWx0U3RvcmFnZVNlc3Npb24gPSBOZXR3b3JrU3RvcmFnZVNl
c3Npb246OmRlZmF1bHRTdG9yYWdlU2Vzc2lvbigpOworICAgIGNvbnN0IENvb2tpZUphckN1cmwm
IGNvb2tpZUphciA9IGRlZmF1bHRTdG9yYWdlU2Vzc2lvbi5jb29raWVTdG9yYWdlKCk7CisgICAg
Zm9yIChhdXRvIGhlYWRlciA6IHJlc3BvbnNlLmhlYWRlcnMpIHsKKyAgICAgICAgaWYgKGhlYWRl
ci5zdGFydHNXaXRoSWdub3JpbmdBU0NJSUNhc2Uoc2V0Q29va2llSGVhZGVyKSkgeworICAgICAg
ICAgICAgU3RyaW5nIHNldENvb2tpZVN0cmluZyA9IGhlYWRlci5yaWdodChoZWFkZXIubGVuZ3Ro
KCkgLSBzdHJsZW4oc2V0Q29va2llSGVhZGVyKSk7CisgICAgICAgICAgICBjb29raWVKYXIuc2V0
Q29va2llc0Zyb21IVFRQUmVzcG9uc2UoZGVmYXVsdFN0b3JhZ2VTZXNzaW9uLCByZXNwb25zZS51
cmwsIHNldENvb2tpZVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgUmVzb3Vy
Y2VIYW5kbGVDdXJsRGVsZWdhdGU6OmN1cmxEaWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgQ3VybFJl
c3BvbnNlJiByZWNlaXZlZFJlc3BvbnNlKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CkBAIC0yMDMsNiArMjE5LDggQEAgdm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6Y3Vy
bERpZFJlY2VpdmVSZXNwb25zZShjb25zdCBDdXJsUmVzcG9uc2UmIHJlY2UKICAgICBpZiAobV9j
dXJsUmVxdWVzdCkKICAgICAgICAgbV9oYW5kbGUtPmdldEludGVybmFsKCktPm1fcmVzcG9uc2Uu
c2V0RGVwcmVjYXRlZE5ldHdvcmtMb2FkTWV0cmljcyhtX2N1cmxSZXF1ZXN0LT5nZXROZXR3b3Jr
TG9hZE1ldHJpY3MoKSk7CiAKKyAgICBoYW5kbGVDb29raWVIZWFkZXJzKHJlY2VpdmVkUmVzcG9u
c2UpOworCiAgICAgaWYgKHJlc3BvbnNlKCkuc2hvdWxkUmVkaXJlY3QoKSkgewogICAgICAgICB3
aWxsU2VuZFJlcXVlc3QoKTsKICAgICAgICAgcmV0dXJuOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>