<?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>73654</bug_id>
          
          <creation_ts>2011-12-02 07:22:59 -0800</creation_ts>
          <short_desc>Upstream BlackBerry Cookie Management Classes</short_desc>
          <delta_ts>2012-02-23 20:34:44 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
    
    <blocked>73614</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter>ocheung</reporter>
          <assigned_to>ocheung</assigned_to>
          <cc>dbates</cc>
    
    <cc>hausmann</cc>
    
    <cc>kpiascik</cc>
    
    <cc>levin+threading</cc>
    
    <cc>menard</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>513743</commentid>
    <comment_count>0</comment_count>
    <who name="">ocheung</who>
    <bug_when>2011-12-02 07:22:59 -0800</bug_when>
    <thetext>Upstreaming the following files from the BlackBerry cookie management classes in WebCore/platform/blackberry
CookieManager.h &amp; cpp
CookieMap.h &amp; cpp
CookieDatabaseBackingStore/CookieDatabaseBackingStore.h &amp; cpp
CookieParser.h &amp; cpp
ParsedCookie.h &amp; cpp
CookieJarBlackBerry.cpp
BlackBerryCookieCache.h &amp; cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522884</commentid>
    <comment_count>1</comment_count>
      <attachid>119643</attachid>
    <who name="">ocheung</who>
    <bug_when>2011-12-16 11:52:17 -0800</bug_when>
    <thetext>Created attachment 119643
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522908</commentid>
    <comment_count>2</comment_count>
      <attachid>119643</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-16 12:11:24 -0800</bug_when>
    <thetext>Comment on attachment 119643
Patch

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

Still some work to do

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:39
&gt; +

Why extra line?

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:178
&gt; +    String dropBackupQuery(&quot;DROP TABLE IF EXISTS Backup_&quot;+m_tableName+&quot;;&quot;);

String dropBackupQuery(&quot;DROP TABLE IF EXISTS Backup_&quot;+m_tableName+&quot;;&quot;);
should be
String dropBackupQuery(&quot;DROP TABLE IF EXISTS Backup_&quot; + m_tableName + &quot;;&quot;);
to be consistent with other code. You are doing this in other places as well.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:231
&gt; +    // Create table if not exsist in case that the alterTableIfNeeded() failed accidentially.

Typo -&gt; accidentially

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:353
&gt; +}

Looks like you can consolidate these three methods into one, by adding one param for Insert/Update/Delete.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:510
&gt; +        } else {

Why extra line?

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:520
&gt; +

Why extra line?

&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:47
&gt; +WTF::String cookies(Document const* document, KURL const&amp; url)

Is WTF prefix needed?

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:184
&gt; +

Why extra line?

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:195
&gt; +

Why extra line?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523030</commentid>
    <comment_count>3</comment_count>
      <attachid>119670</attachid>
    <who name="">ocheung</who>
    <bug_when>2011-12-16 14:30:03 -0800</bug_when>
    <thetext>Created attachment 119670
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523204</commentid>
    <comment_count>4</comment_count>
      <attachid>119670</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-16 19:17:44 -0800</bug_when>
    <thetext>Comment on attachment 119670
Patch

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

&gt; Source/WebCore/platform/blackberry/ParsedCookie.cpp:164
&gt; +    cookie += protocol();

I didn&apos;t catch this earlier, but everywhere we append heavily like here we should use StringBuilder, will give far less mallocs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524770</commentid>
    <comment_count>5</comment_count>
      <attachid>119670</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-20 13:01:38 -0800</bug_when>
    <thetext>Comment on attachment 119670
Patch

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

&gt; Source/WebCore/ChangeLog:4
&gt; +        Upstream BlackBerry Cookie Management Classes
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=73654

This change log message is very long due to the number of functions/methods we have in these added files. I suggest either truncating the list of functions/methods or removing them from the changelog entry such that we only list the added files.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:36
&gt; +#include &lt;wtf/text/CString.h&gt;

This include is unnecessary as its included by SQLiteDatabase.h, which is included by SQLiteStatement.h (above).

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:45
&gt; +#endif // ENABLE_COOKIE_DEBUG

Nit: The inline comment is unnecessary here since this #if/#else block is short enough to fit inside a reasonably-sized editor window.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:53
&gt; +static double const s_databaseTimerInterval = 2;

Nit: We tend to put the const specifier before the static type of the variable.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:115
&gt; +        String query(&quot;PRAGMA table_info(&quot; + m_tableName + &quot;);&quot;);

It&apos;s unnecessary to invoke the copy constructor for WTF::String here. I would write this as:

String query = &quot;PRAGMA table_info(&quot; + m_tableName + &quot;);&quot;

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:126
&gt; +            if (name == &quot;creationTime&quot;)

We should use DEFINE_STATIC_LOCAL to define a WTF::String object for &quot;creationTime&quot; with static storage duration so that we don&apos;t have to construct a new WTF::String on each iteration.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:128
&gt; +            if (name == &quot;protocol&quot;)

Ditto.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:136
&gt; +    // Drop and Recreate the cookie table to update to the newest database fields

Nit:
Recreate =&gt; recreate
newest =&gt; latest

Missing a period at the end of this sentence.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:137
&gt; +    // We do not use alter table - add column because that method cannot add primary keys

Missing a period at the end of this sentence.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:141
&gt; +    String renameQuery(&quot;ALTER TABLE &quot; + m_tableName + &quot; RENAME TO Backup_&quot; + m_tableName + &quot;;&quot;);

It&apos;s unnecessary to invoke the copy constructor for WTF::String here. I would write this as:

String renameQuery = &quot;ALTER TABLE &quot; + m_tableName + &quot; RENAME TO Backup_&quot; + m_tableName + &quot;;&quot;;

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:160
&gt; +    String migrationQuery(&quot;INSERT OR REPLACE INTO &quot;);
&gt; +    migrationQuery += m_tableName;
&gt; +    migrationQuery += &quot; SELECT *&quot;;
&gt; +    if (!creationTimeExists)
&gt; +        migrationQuery += &quot;,&apos;&apos;&quot;;
&gt; +    if (!protocolExists)
&gt; +        migrationQuery += &quot;,&apos;&apos;&quot;;
&gt; +    migrationQuery += &quot; FROM Backup_&quot; + m_tableName;

We should use StringBuilder to build up this query since it calls malloc() less than WTF::String&apos;s operator +=.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:165
&gt; +        String setCreationTimeQuery(&quot;UPDATE &quot; + m_tableName + &quot; SET creationTime = lastAccessed;&quot;);

It&apos;s unnecessary to invoke the copy constructor for WTF::String here. I would write this as:

String setCreationTimeQuery = &quot;UPDATE &quot; + m_tableName + &quot; SET creationTime = lastAccessed;&quot;;

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:171
&gt; +        String setProtocolQuery(&quot;UPDATE &quot; + m_tableName + &quot; SET protocol = &apos;http&apos; WHERE isSecure = &apos;0&apos;;&quot;);
&gt; +        String setProtocolQuery2(&quot;UPDATE &quot; + m_tableName + &quot; SET protocol = &apos;https&apos; WHERE isSecure = &apos;1&apos;;&quot;);

It&apos;s unnecessary to invoke the copy constructor for WTF::String here with the string concatenation result.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:177
&gt; +    String dropBackupQuery(&quot;DROP TABLE IF EXISTS Backup_&quot; + m_tableName + &quot;;&quot;);

Ditto.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:182
&gt; +    for (size_t i = 0; i &lt; commands.size(); ++i) {

Although the compiler will inline the result of commands.size(), for your consideration I suggest conforming to the WebKit Code Style Guidelines and explicitly defining a local variable for commands.size(). See (2) of section Other Punctuation on &lt;http://www.webkit.org/coding/coding-style.html&gt;.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:191
&gt; +            // finally it will try to keep a backup of the current cookie table for the future restoration.
&gt; +            // NOTICE: this will essentially DELETE the current table, but that&apos;s better
&gt; +            // than continually hitting this case and never being able to use the cookie table.
&gt; +            // if this is ever hit, it&apos;s definitely a bug.

This comment is disingenuous. The word &quot;backup&quot; suggests that we are making a copy of the cookie table, but this disagrees with both the remark in the NOTICE as well as the actual code. Instead, we are renaming the cookie table so as to preserve it for some future restoration. This has the side effect of clearing the current cookie table. How does this error handling work should we get to here twice? I mean, it looks like we overwrite the backup table.

For your consideration, I suggest making this comment concise. Maybe something like:

// We should never get here, but if we do, rename the current cookie table for future restoration. This has the side effect of
// clearing the current cookie table, but that&apos;s better than continually hitting this case and hence never being able to use the
// cookie table.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:193
&gt; +            String renameQuery(&quot;ALTER TABLE &quot; + m_tableName + &quot; RENAME TO Backup2_&quot; + m_tableName + &quot;;&quot;);

It&apos;s unnecessary to invoke the copy constructor for WTF::String here with the string concatenation result.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:226
&gt; +    const String primaryKeyFields(&quot;PRIMARY KEY (protocol, host, path, name)&quot;);
&gt; +    const String databaseFields(&quot;name TEXT, value TEXT, host TEXT, path TEXT, expiry DOUBLE, lastAccessed DOUBLE, isSecure INTEGER, isHttpOnly INTEGER, creationTime DOUBLE, protocol TEXT&quot;);

We should use DEFINE_STATIC_LOCAL to make these static so that we don&apos;t repeatedly construct these String objects.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:227
&gt; +    // Upgrade table to add the new column creationTime and protocol for backward compliance.

This sentence doesn&apos;t read well. Maybe &quot;backward compliance&quot; should be &quot;backwards compatibility&quot;?

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:230
&gt; +    // Create table if not exsist in case that the alterTableIfNeeded() failed accidentally.

I can&apos;t find the function alterTableIfNeeded(). I take it you mean method CookieDatabaseBackingStore::upgradeTableIfNeeded()?

Suppose CookieDatabaseBackingStore::upgradeTableIfNeeded() fails to create the table m_tableName. I&apos;m a bit unclear why we make a second attempt here to create the table m_tableName without changing any additional state after the first failure. I take it that there may be some kind of environment change between attempts such that the second attempt may succeed? Assuming it makes sense to make a second attempt to create the table, I suggest extracting the SQL conditional of whether the table exists (i.e. &quot;IF NOT EXIST&quot;) out of the SQL expression and into a C++ if-condition so that we only take time and memory to build up an SQL query and execute it when the table actually doesn&apos;t exist. Currently, we take time and memory to build an SQL query and execute it regardless of whether the table already exists. Towards implement this, I suggest having CookieDatabaseBackingStore::upgradeTableIfNeeded() some how signal its success or failure, say by returning a boolean result. Assuming a boolean result of false means it failed to create the table then we can make a second attempt to create the table by building the SQL query and executing it. A side benefit of having CookieDatabaseBackingStore::upgradeTableIfNeeded() return whether it succeeded or failed is that this comment can be replaced with an if-statement that checks for the failure condition.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:234
&gt; +    String createTableQuery(&quot;CREATE TABLE IF NOT EXISTS &quot;);
&gt; +    createTableQuery += m_tableName;
&gt; +    // This table schema is compliant with Mozilla&apos;s.
&gt; +    createTableQuery += &quot; (&quot; + databaseFields + &quot;, &quot; + primaryKeyFields+&quot;);&quot;;

This code is almost identical to code in CookieDatabaseBackingStore::upgradeTableIfNeeded(). We should extract out this common code into a shared function.

&gt; Source/WebCore/platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp:245
&gt; +    String insertQuery(&quot;INSERT OR REPLACE INTO &quot;);
&gt; +    insertQuery += m_tableName;
&gt; +    insertQuery += &quot; (name, value, host, path, expiry, lastAccessed, isSecure, isHttpOnly, creationTime, protocol) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10);&quot;;

The string &quot;&quot;INSERT OR REPLACE INTO &quot; appears in both this function and CookieDatabaseBackingStore::upgradeTableIfNeeded() we should make this a file static variable so that we can share this string between these functions. Depending on how hot this code path is, we may want to consider making the string &quot; (name, value, host, path, expiry, lastAccessed, isSecure, isHttpOnly, creationTime, protocol) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10);&quot; static as well.

Moreover, we should use StringBuilder here.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:74
&gt; +    static CookieManager *cookieManager = 0;
&gt; +    if (!cookieManager) {
&gt; +        // Open the cookieJar now and get the backing store cookies to fill the manager.
&gt; +        cookieManager = new CookieManager;
&gt; +        cookieManager-&gt;m_cookieBackingStore-&gt;open(cookieManager-&gt;cookieJar());
&gt; +        cookieManager-&gt;getBackingStoreCookies();
&gt; +        CookieLog(&quot;CookieManager - Backingstore load complete.\n&quot;);
&gt; +    }
&gt; +    return *cookieManager;

We should use DEFINE_STATIC_LOCAL to declare the static instance of CookieManager and to simplify the code in this function.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:46
&gt; +enum BackingStoreRemoval {

Maybe a more descriptive name for this enum is BackingStoreRemovalPolicy.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:52
&gt; +enum HttpOnlyCookieFiltering {

Http =&gt; HTTP

Can we come up with a more descriptive name for this enum?

&gt; Source/WebCore/platform/blackberry/CookieManager.h:75
&gt; +/*
&gt; +  * The CookieManager class is a singleton class that handles and selectively persists
&gt; +  * incoming cookies. This class contains a tree of domains for quicker
&gt; +  * cookie domain lookup. The top of the tree represents a null value for a null domain.
&gt; +  * The null domain contains references to top level domains and each node below
&gt; +  * represents a sub-section of a domain, delimited by &quot;.&quot;
&gt; +  *
&gt; +  * If a cookie has a domain &quot;a.b.com&quot;, it will be stored in the node named &quot;a&quot; in this tree.
&gt; +  * in the branch &quot;&quot;-&gt;&quot;com&quot;-&gt;&quot;b&quot;-&gt;&quot;a&quot;
&gt; +  *
&gt; +  * Cookie specs follow the RFC6265 spec sheet.
&gt; +  * http://tools.ietf.org/html/rfc6265
&gt; +  */

RFC6265 =&gt; RFC 6265

Please use C++-style comments.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:102
&gt; +    static unsigned int maxCookieLength() { return s_maxCookieLength; }

Nit: unsigned int =&gt; unsigned

&gt; Source/WebCore/platform/blackberry/CookieManager.h:119
&gt; +    void checkAndTreatCookie(ParsedCookie* candidateCookie, BackingStoreRemoval postToBackingStore);

Neither the parameter names candidateCookie nor BackingStoreRemoval add much value. Please remove them.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:123
&gt; +    void addCookieToMap(CookieMap* targetMap, ParsedCookie* candidateCookie, BackingStoreRemoval postToBackingStore);

None of the parameter names in this declaration are very descriptive. Please remove all of them.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:124
&gt; +    void update(CookieMap* targetMap, ParsedCookie* newCookie, BackingStoreRemoval postToBackingStore);

Ditto.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:133
&gt; +    // Count all cookies, cookies are limited by max_count

Where is max_count defined? Do you mean s_maxCookieCountPerHost?

Moreover, this comment seems unnecessary. I suggest making the name of this variable more descriptive instead of having this comment. Maybe rename m_count to m_numberOfCookies?

&gt; Source/WebCore/platform/blackberry/CookieManager.h:148
&gt; +    static const unsigned int s_globalMaxCookieCount = 6000;
&gt; +    static const unsigned int s_maxCookieCountPerHost = 60;
&gt; +    static const unsigned int s_cookiesToDeleteWhenLimitReached = 60;
&gt; +    static const unsigned int s_delayToStartCookieCleanup = 10;

Nit: unsigned int =&gt; unsigned

&gt; Source/WebCore/platform/blackberry/CookieManager.h:149
&gt; +    // Cookie size limit of 4kB as advised per RFC2109

Nit: I suggest adding an empty line above this comment to make it stand out more from the list of static const declarations above it.

This comment is missing a period. As per the WebKit Code Style guidelines, we prefer comments that are full sentences.

I also suggest referencing the section of this RFC that mentions this limit. From briefly looking, it seems that this limit is covered in section 6.3 Implementation Limits. You may also want to consider referencing a hyperlink to the RFC in your comment: &lt;http://www.ietf.org/rfc/rfc2109.txt&gt;.

RFC2109 =&gt; RFC 2109

&gt; Source/WebCore/platform/blackberry/CookieManager.h:150
&gt; +    static const unsigned int s_maxCookieLength = 4096;

Nit: unsigned int =&gt; unsigned

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:56
&gt; +Vector&lt;ParsedCookie*&gt; CookieParser::parse(const String&amp; cookies)

This function should be returning a Vector of OwnPtr&lt;ParsedCookie&gt; objects so that we don&apos;t have to explicitly handle the deletion the Cookie objects when removing entries from the Vector.

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:93
&gt; +    ParsedCookie* res = new ParsedCookie(curTime);

We should make this an OwnPtr and have this function return a PassOwnPtr. Then we can remove the &quot;delete res&quot; calls in all the early return code paths. At the end of function, we should call OwnPtr::release() to transfer ownership of the ParsedCookie object to the caller.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526221</commentid>
    <comment_count>6</comment_count>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2011-12-22 06:25:47 -0800</bug_when>
    <thetext>I&apos;ll update Otto&apos;s patches and take over the upstreaming of this set of files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562184</commentid>
    <comment_count>7</comment_count>
      <attachid>128254</attachid>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-22 11:33:27 -0800</bug_when>
    <thetext>Created attachment 128254
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562197</commentid>
    <comment_count>8</comment_count>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-22 11:43:29 -0800</bug_when>
    <thetext>Dan in response to your comments on Otto&apos;s patch I&apos;ve posted a follow up.  It addresses most of your concerns, with a few exceptions.

1) I didn&apos;t refactor the code to have upgradeTableIfNeeded to return a bool.  After examining the code there is a need to have this method behave the way it is implemented. (I&apos;m trying to recall my exact reasoning but forget since I did this while ago, I&apos;ll post a new comment about why when I remember).

2) StringBuilder is not needed in CookieDatabaseBackingStore.cpp because that code is ran once when a database is loaded into memory.  There are too few lines of code that use += that would benefit from this in any significant way.

3) To maintain functionality and as initial upstream of this code I&apos;m not implementing OwnPtr at this time.  I&apos;ll make a separate bug for this and address it in a follow up patch.  It is logically separate and I&apos;d prefer to have a separate patch that can be easily reverted if necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562215</commentid>
    <comment_count>9</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-02-22 12:01:51 -0800</bug_when>
    <thetext>Alexis, didn&apos;t you also write an sqlite based cookie storage and land that somewhere in WebCore? Should these be combined somehow?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562224</commentid>
    <comment_count>10</comment_count>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-22 12:11:39 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; Alexis, didn&apos;t you also write an sqlite based cookie storage and land that somewhere in WebCore? Should these be combined somehow?

Where does this code live, I&apos;d be interested in taking a look at it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562236</commentid>
    <comment_count>11</comment_count>
      <attachid>128254</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-22 12:17:58 -0800</bug_when>
    <thetext>Comment on attachment 128254
Patch

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

Looks good, but still some stuff to fix.

&gt; Source/WebCore/ChangeLog:9
&gt; +        Passes all non Cookie 2 tests since Cookie 2 is not implemented supported at this time.

not implemented supported?

&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:49
&gt; +    if (!static_cast&lt;WebCore::FrameLoaderClientBlackBerry*&gt;(frame-&gt;loader()-&gt;client())-&gt;cookiesEnabled())

No need for WebCore::

&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:70
&gt; +    if (!static_cast&lt;WebCore::FrameLoaderClientBlackBerry*&gt;(frame-&gt;loader()-&gt;client())-&gt;cookiesEnabled())

No need for WebCore::

&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:106
&gt; +    if (!static_cast&lt;WebCore::FrameLoaderClientBlackBerry*&gt;(document-&gt;frame()-&gt;loader()-&gt;client())-&gt;cookiesEnabled())

No need for WebCore::

&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:107
&gt; +        return WTF::String();

You can remove all WTF:: prefixes in this file.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:59
&gt; +    CookieStorageAcceptPolicyAlways = 0,

No need to assign to zero.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:152
&gt; +    static const unsigned s_maxCookieLength = 4096;

No need to be in the header, what about a static in the .cpp?

&gt; Source/WebCore/platform/blackberry/CookieMap.h:59
&gt; +    // Returning the original cookie object so manager can keep a reference to the updates in the database queue

Lacks some periods.

&gt; Source/WebCore/platform/blackberry/CookieMap.h:62
&gt; +    // Need to return the reference to the removed cookie so manager can deal with it (garbage collect)

Ditto.

&gt; Source/WebCore/platform/blackberry/CookieMap.h:66
&gt; +    // Returns a map with that given subdomain

Ditto.

&gt; Source/WebCore/platform/blackberry/CookieMap.h:84
&gt; +    // The &quot;google&quot; cookiemap will contain &quot;accounts&quot; in its subdomain map

Ditto.

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:58
&gt; +    unsigned cookieStart, cookieEnd = 0;

cookieEnd may be the wrong name, what about cookieCount?

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:66
&gt; +    while (cookieEnd &lt;= cookies.length()) {

It is probably worth it to assign cookies.length() to a temp var, since it is used a lot below.

&gt; Source/WebCore/platform/blackberry/ParsedCookie.cpp:122
&gt; +    int value = maxAge.toIntStrict(&amp;ok, 10);

The default is 10, don&apos;t need to specify it.

&gt; Source/WebCore/platform/blackberry/ParsedCookie.cpp:147
&gt; +    // Session cookies do not expires, they will just not be saved to the backing store.

expires -&gt; expire

&gt; Source/WebCore/platform/blackberry/ParsedCookie.h:42
&gt; +class ParsedCookie {

Would this be more efficient if we use WTF_MAKE_FAST_ALLOCATED? Would be interesting to test.

&gt; Source/WebCore/platform/blackberry/ParsedCookie.h:48
&gt; +    ParsedCookie(const String&amp; /*name*/, const String&amp; /*value*/, const String&amp; /*domain*/,const String&amp; /*protocol*/, const String&amp; /*path*/, double /*expiry*/, double /*lastAccessed*/, double /*creationTime*/, bool /*isSecure*/, bool /*isHttpOnly*/);

Why the use of the comments? I see no need.

&gt; Source/WebCore/platform/blackberry/ParsedCookie.h:107
&gt; +    bool m_isMaxAgeSet;

Moving this to the other bools will make ParsedCookie objects smaller.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562247</commentid>
    <comment_count>12</comment_count>
      <attachid>128254</attachid>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-22 12:25:21 -0800</bug_when>
    <thetext>Comment on attachment 128254
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:9
&gt;&gt; +        Passes all non Cookie 2 tests since Cookie 2 is not implemented supported at this time.
&gt; 
&gt; not implemented supported?

will change to not implemented/supported

&gt;&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:49
&gt;&gt; +    if (!static_cast&lt;WebCore::FrameLoaderClientBlackBerry*&gt;(frame-&gt;loader()-&gt;client())-&gt;cookiesEnabled())
&gt; 
&gt; No need for WebCore::

will remove all references to WebCore:: and WTF::

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.h:59
&gt;&gt; +    CookieStorageAcceptPolicyAlways = 0,
&gt; 
&gt; No need to assign to zero.

ok

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.h:152
&gt;&gt; +    static const unsigned s_maxCookieLength = 4096;
&gt; 
&gt; No need to be in the header, what about a static in the .cpp?

If this can be moved maybe all the static constants can be moved?

&gt;&gt; Source/WebCore/platform/blackberry/CookieMap.h:59
&gt;&gt; +    // Returning the original cookie object so manager can keep a reference to the updates in the database queue
&gt; 
&gt; Lacks some periods.

ok

&gt;&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:58
&gt;&gt; +    unsigned cookieStart, cookieEnd = 0;
&gt; 
&gt; cookieEnd may be the wrong name, what about cookieCount?

this isn&apos;t a count but a pointer to the end of the cookie substring.

&gt;&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:66
&gt;&gt; +    while (cookieEnd &lt;= cookies.length()) {
&gt; 
&gt; It is probably worth it to assign cookies.length() to a temp var, since it is used a lot below.

ok

&gt;&gt; Source/WebCore/platform/blackberry/ParsedCookie.h:48
&gt;&gt; +    ParsedCookie(const String&amp; /*name*/, const String&amp; /*value*/, const String&amp; /*domain*/,const String&amp; /*protocol*/, const String&amp; /*path*/, double /*expiry*/, double /*lastAccessed*/, double /*creationTime*/, bool /*isSecure*/, bool /*isHttpOnly*/);
&gt; 
&gt; Why the use of the comments? I see no need.

I&apos;ll add the full signature with variable names instead of comments.

&gt;&gt; Source/WebCore/platform/blackberry/ParsedCookie.h:107
&gt;&gt; +    bool m_isMaxAgeSet;
&gt; 
&gt; Moving this to the other bools will make ParsedCookie objects smaller.

will do</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562263</commentid>
    <comment_count>13</comment_count>
    <who name="Alexis Menard (darktears)">menard</who>
    <bug_when>2012-02-22 12:38:57 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; Alexis, didn&apos;t you also write an sqlite based cookie storage and land that somewhere in WebCore? Should these be combined somehow?
&gt; 
&gt; Where does this code live, I&apos;d be interested in taking a look at it.

http://trac.webkit.org/browser/trunk/Source/WebCore/platform/qt/CookieJarQt.cpp

It seems much simplier than what you guys did.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562457</commentid>
    <comment_count>14</comment_count>
      <attachid>128303</attachid>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-22 15:31:25 -0800</bug_when>
    <thetext>Created attachment 128303
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562469</commentid>
    <comment_count>15</comment_count>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-22 15:40:03 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #10)
&gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; Alexis, didn&apos;t you also write an sqlite based cookie storage and land that somewhere in WebCore? Should these be combined somehow?
&gt; &gt; 
&gt; &gt; Where does this code live, I&apos;d be interested in taking a look at it.
&gt; 
&gt; http://trac.webkit.org/browser/trunk/Source/WebCore/platform/qt/CookieJarQt.cpp
&gt; 
&gt; It seems much simplier than what you guys did.

This makes use of a lot of Qt classes for its backend impl which we can&apos;t make use of.  Our implementation is a little more complicated because of platform specific issues.  It would be nice to have a common SQLite implementation though and if you&apos;re willing to abstract away some of your Qt dependencies then we can give it a shot.  If you&apos;re up for the challenge then please file a bug and cc me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562710</commentid>
    <comment_count>16</comment_count>
      <attachid>128303</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-22 19:29:22 -0800</bug_when>
    <thetext>Comment on attachment 128303
Patch

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

Looks good, can be cleaned up a bit more though.

&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:54
&gt; +    String result = cookieManager().getCookie(url, NoHttpOnlyCookie);

Seems no need for temp var.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:39
&gt; +#include &quot;ParsedCookie.h&quot;

Already included in header, please do checks for similar cases.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:108
&gt; +    // TODO: m_managerMap and the top layer protocolMaps are not properly deleted.

TODO should be FIXME.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:134
&gt; +    return false;

Could do just return (protocol == &quot;file&quot; || protocol == &quot;local&quot; );

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:420
&gt; +            initiateCookieLimitCleanUp();

Indenting.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:453
&gt; +    bool oldIsSession = oldCookie-&gt;isSession();

These can go into the if.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:44
&gt; +class ParsedCookie;

Unneeded, see include above.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:101
&gt; +    // Constants getter.

Seems useless comment.

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:93
&gt; +{

All comments in here need review, most are not proper sentences lacking period etc.

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:332
&gt; +                return 0;

This pattern of five lines gets repeated a lot, you could make a macro for it.

&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:345
&gt; +    // Check if the cookie is valid with respect to the size limit/

Needs period.

&gt; ChangeLog:9
&gt; +        This test is ran twice and the averate read and write for each of the 2 runs is shown.

average</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563111</commentid>
    <comment_count>17</comment_count>
      <attachid>128303</attachid>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-23 07:51:14 -0800</bug_when>
    <thetext>Comment on attachment 128303
Patch

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

&gt;&gt; Source/WebCore/platform/blackberry/CookieJarBlackBerry.cpp:54
&gt;&gt; +    String result = cookieManager().getCookie(url, NoHttpOnlyCookie);
&gt; 
&gt; Seems no need for temp var.

ok

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:39
&gt;&gt; +#include &quot;ParsedCookie.h&quot;
&gt; 
&gt; Already included in header, please do checks for similar cases.

sure

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:108
&gt;&gt; +    // TODO: m_managerMap and the top layer protocolMaps are not properly deleted.
&gt; 
&gt; TODO should be FIXME.

changed

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:134
&gt;&gt; +    return false;
&gt; 
&gt; Could do just return (protocol == &quot;file&quot; || protocol == &quot;local&quot; );

will do

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:420
&gt;&gt; +            initiateCookieLimitCleanUp();
&gt; 
&gt; Indenting.

I&apos;m surprised style checker didn&apos;t catch this...

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:453
&gt;&gt; +    bool oldIsSession = oldCookie-&gt;isSession();
&gt; 
&gt; These can go into the if.

updating

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.h:44
&gt;&gt; +class ParsedCookie;
&gt; 
&gt; Unneeded, see include above.

fixing

&gt;&gt; Source/WebCore/platform/blackberry/CookieManager.h:101
&gt;&gt; +    // Constants getter.
&gt; 
&gt; Seems useless comment.

ok

&gt;&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:93
&gt;&gt; +{
&gt; 
&gt; All comments in here need review, most are not proper sentences lacking period etc.

updated the comment to reflect what is going on

&gt;&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:332
&gt;&gt; +                return 0;
&gt; 
&gt; This pattern of five lines gets repeated a lot, you could make a macro for it.

good idea

&gt;&gt; Source/WebCore/platform/blackberry/CookieParser.cpp:345
&gt;&gt; +    // Check if the cookie is valid with respect to the size limit/
&gt; 
&gt; Needs period.

probably a typo

&gt;&gt; ChangeLog:9
&gt;&gt; +        This test is ran twice and the averate read and write for each of the 2 runs is shown.
&gt; 
&gt; average

oops</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563223</commentid>
    <comment_count>18</comment_count>
      <attachid>128496</attachid>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-23 10:30:33 -0800</bug_when>
    <thetext>Created attachment 128496
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563332</commentid>
    <comment_count>19</comment_count>
      <attachid>128496</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-23 11:57:39 -0800</bug_when>
    <thetext>Comment on attachment 128496
Patch

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

Looks good, with some cleanups before landing. Note that these files will receive further cleanups after this has landed.

&gt; Source/WebCore/ChangeLog:1
&gt; +2012-02-22  Konrad Piascik  &lt;kpiascik@rim.com&gt;

It is 23rd.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:75
&gt; +    cookieManager().flushCookiesToBackingStore();

Could you do more cleanup here in future? Like deleting leaking &quot;cookie&quot; singletons?

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:219
&gt; +

No empty line please.

&gt; Source/WebCore/platform/blackberry/CookieManager.cpp:267
&gt; +            int i = delimitedHost.size()-1;

int i = delimitedHost.size() - 1;

&gt; Source/WebCore/platform/blackberry/CookieManager.h:100
&gt; +    static unsigned int maxCookieLength() { return s_maxCookieLength; } 

Just unsigned should be the same, note that s_maxCookieLength is an unsigned itself.

&gt; Source/WebCore/platform/blackberry/CookieManager.h:144
&gt; +    static const unsigned s_maxCookieLength = 4096;

This is uncommon, but according to some Google searches it should still work.

&gt; Source/WebCore/platform/blackberry/CookieMap.cpp:145
&gt; +

Better remove the empty line.

&gt; ManualTests/cookieSpeedTest.html:6
&gt; +    for(var i=0; i &lt; 100; i++){

Better make the 100 into a constant, maybe we will run so quick in the future that we need bigger values :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563359</commentid>
    <comment_count>20</comment_count>
      <attachid>128534</attachid>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-23 12:20:47 -0800</bug_when>
    <thetext>Created attachment 128534
Patch

fixes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563361</commentid>
    <comment_count>21</comment_count>
    <who name="Konrad Piascik">kpiascik</who>
    <bug_when>2012-02-23 12:22:47 -0800</bug_when>
    <thetext>(In reply to comment #19) 
&gt; &gt; Source/WebCore/platform/blackberry/CookieManager.cpp:75
&gt; &gt; +    cookieManager().flushCookiesToBackingStore();
&gt; 
&gt; Could you do more cleanup here in future? Like deleting leaking &quot;cookie&quot; singletons?
&gt; 
Yes we can add cleanup more cleanup code here if needed in the future.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563368</commentid>
    <comment_count>22</comment_count>
      <attachid>128534</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-23 12:27:18 -0800</bug_when>
    <thetext>Comment on attachment 128534
Patch

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563879</commentid>
    <comment_count>23</comment_count>
      <attachid>128534</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-23 20:34:37 -0800</bug_when>
    <thetext>Comment on attachment 128534
Patch

Clearing flags on attachment: 128534

Committed r108722: &lt;http://trac.webkit.org/changeset/108722&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563880</commentid>
    <comment_count>24</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-23 20:34:44 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119643</attachid>
            <date>2011-12-16 11:52:17 -0800</date>
            <delta_ts>2011-12-16 14:29:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73654-20111216145120.patch</filename>
            <type>text/plain</type>
            <size>109740</size>
            <attacher>ocheung</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMDgxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2QwODc1MWIxM2EyZGM0
MzUwMDU4N2Y2OTlmY2ZhMmQ3ZTgwN2M4NC4uZjNhNDQ2ZjFjOGFiZGUzYTM0NmZjZGRmNDdlMTEz
NzA1YjAwN2MyNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzMiBAQAorMjAxMS0xMi0xNiAgT3R0
byBDaGV1bmcgIDxvY2hldW5nQHJpbS5jb20+CisKKyAgICAgICAgVXBzdHJlYW0gQmxhY2tCZXJy
eSBDb29raWUgTWFuYWdlbWVudCBDbGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD03MzY1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OkNvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3Jl
Ojp+Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6OmRlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZURlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnVwZ3JhZGVUYWJsZUlmTmVlZGVkKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpjbG9zZSk6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlQ2xvc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omluc2VydCk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6dXBkYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpyZW1vdmUpOgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnJlbW92ZUFsbCk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3ZlQWxs
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpnZXRDb29r
aWVzRnJvbURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0KToKKyAgICAgICAgKFdlYkNvcmU6OkNv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRh
YmFzZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5n
U3RvcmU6Omludm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSk6CisgICAgICAgICogcGxhdGZvcm0v
YmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tp
bmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjpjcmVhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llSmFy
QmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Z2V0UGxheWVySWQpOgor
ICAgICAgICAoV2ViQ29yZTo6Y29va2llcyk6CisgICAgICAgIChXZWJDb3JlOjpzZXRDb29raWVz
KToKKyAgICAgICAgKFdlYkNvcmU6OmNvb2tpZXNFbmFibGVkKToKKyAgICAgICAgKFdlYkNvcmU6
OmdldFJhd0Nvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6ZGVsZXRlQ29va2llKToKKyAgICAg
ICAgKFdlYkNvcmU6OmNvb2tpZVJlcXVlc3RIZWFkZXJGaWVsZFZhbHVlKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OmNvb2tpZU1hbmFnZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6
Q29va2llTWFuYWdlcik6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp+Q29va2ll
TWFuYWdlcik6CisgICAgICAgIChXZWJDb3JlOjpjb29raWVTb3J0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6c2hvdWxkSWdub3JlRG9tYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFn
ZXI6OnNldENvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2hvdWxk
UmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24pOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdl
cjo6Z2V0Q29va2llKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OmdldFJhd0Nv
b2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6cmVtb3ZlQWxsQ29va2ll
cyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpzZXRDb29raWVKYXIpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Y2hlY2tBbmRUcmVhdENvb2tpZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjphZGRDb29raWVUb01hcCk6CisgICAgICAgIChX
ZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp1cGRhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
TWFuYWdlcjo6Z2V0QmFja2luZ1N0b3JlQ29va2llcyk6CisgICAgICAgIChXZWJDb3JlOjpDb29r
aWVNYW5hZ2VyOjpzZXRQcml2YXRlTW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5h
Z2VyOjpmaW5kT3JDcmVhdGVDb29raWVNYXApOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFu
YWdlcjo6cmVtb3ZlQ29va2llV2l0aE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFu
YWdlcjo6aW5pdGlhdGVDb29raWVMaW1pdENsZWFuVXApOgorICAgICAgICAoV2ViQ29yZTo6Q29v
a2llTWFuYWdlcjo6Y29va2llTGltaXRDbGVhblVwKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFj
a2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb29raWVN
YW5hZ2VyOjpjYW5Mb2NhbEFjY2Vzc0FsbENvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29v
a2llTWFuYWdlcjo6c2V0Q2FuTG9jYWxBY2Nlc3NBbGxDb29raWVzKToKKyAgICAgICAgKFdlYkNv
cmU6OkNvb2tpZU1hbmFnZXI6OmNvb2tpZXNDb3VudCk6CisgICAgICAgIChXZWJDb3JlOjpDb29r
aWVNYW5hZ2VyOjpjb29raWVKYXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6
cmVtb3ZlZENvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjphZGRlZENv
b2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjptYXhDb29raWVMZW5ndGgp
OgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2V0Q29va2llUG9saWN5KToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OmNvb2tpZVBvbGljeSk6CisgICAgICAgICog
cGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYXAuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkNvb2tpZU1hcDo6Q29va2llTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6
fkNvb2tpZU1hcCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmV4aXN0c0Nvb2tpZSk6
CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmFkZENvb2tpZSk6CisgICAgICAgIChXZWJD
b3JlOjpDb29raWVNYXA6OnVwZGF0ZUNvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVN
YXA6OnJlbW92ZUNvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmdldFN1YmRv
bWFpbk1hcCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmFkZFN1YmRvbWFpbk1hcCk6
CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmdldEFsbENvb2tpZXMpOgorICAgICAgICAo
V2ViQ29yZTo6Q29va2llTWFwOjpyZW1vdmVPbGRlc3RDb29raWUpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29va2llTWFwOjp1cGRhdGVPbGRlc3RDb29raWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29v
a2llTWFwOjpkZWxldGVBbGxDb29raWVzQW5kRG9tYWlucyk6CisgICAgICAgIChXZWJDb3JlOjpD
b29raWVNYXA6OmdldEFsbENoaWxkQ29va2llcyk6CisgICAgICAgICogcGxhdGZvcm0vYmxhY2ti
ZXJyeS9Db29raWVNYXAuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmNv
dW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6Z2V0TmFtZSk6CisgICAgICAgICog
cGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OmlzQ29va2llSGVhZGVyU2VwYXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OmlzTGln
aHR3ZWlnaHRTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVQYXJzZXI6OkNvb2tpZVBh
cnNlcik6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVQYXJzZXI6On5Db29raWVQYXJzZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6Q29va2llUGFyc2VyOjpwYXJzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpDb29raWVQYXJzZXI6OnBhcnNlT25lQ29va2llKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFj
a2JlcnJ5L0Nvb2tpZVBhcnNlci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2Jl
cnJ5L1BhcnNlZENvb2tpZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29v
a2llOjpQYXJzZWRDb29raWUpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjp+UGFy
c2VkQ29va2llKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0RXhwaXJ5KToK
KyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0TWF4QWdlKToKKyAgICAgICAgKFdl
YkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0RGVmYXVsdERvbWFpbik6CisgICAgICAgIChXZWJDb3Jl
OjpQYXJzZWRDb29raWU6Omhhc0V4cGlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29v
a2llOjppc1VuZGVyU2l6ZUxpbWl0KToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6
dG9TdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjp0b05hbWVWYWx1ZVBh
aXIpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjphcHBlbmRXZWJDb3JlQ29va2ll
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6bmFtZSk6CisgICAgICAgIChXZWJDb3Jl
OjpQYXJzZWRDb29raWU6OnNldE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2ll
Ojp2YWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OnNldFZhbHVlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6cGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpQ
YXJzZWRDb29raWU6OnNldFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjpk
b21haW4pOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjpzZXREb21haW4pOgorICAg
ICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjpwcm90b2NvbCk6CisgICAgICAgIChXZWJDb3Jl
OjpQYXJzZWRDb29raWU6OnNldFByb3RvY29sKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENv
b2tpZTo6aGFzRGVmYXVsdERvbWFpbik6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6
OmV4cGlyeSk6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OmZvcmNlRXhwaXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6bGFzdEFjY2Vzc2VkKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0TGFzdEFjY2Vzc2VkKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhcnNlZENvb2tpZTo6Y3JlYXRpb25UaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNl
ZENvb2tpZTo6c2V0Q3JlYXRpb25UaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tp
ZTo6aXNTZWN1cmUpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjpzZXRTZWN1cmVG
bGFnKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6aXNIdHRwT25seSk6CisgICAg
ICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OnNldElzSHR0cE9ubHkpOgorICAgICAgICAoV2Vi
Q29yZTo6UGFyc2VkQ29va2llOjppc1Nlc3Npb24pOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2Vk
Q29va2llOjppc0ZvcmNlRXhwaXJlZCk6CisKIDIwMTEtMTItMTUgIEFudHRpIEtvaXZpc3RvICA8
YW50dGlAYXBwbGUuY29tPgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03NDY3NwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxh
Y2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4zODBhOWM0ZGE0YWU2NGUzZGJmYTc3NWVhZjM1ODNkZDM0MjBjNTAxCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCArMSw1NDYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFp
eEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfREVCVUcg
MAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llRGF0YWJhc2VCYWNraW5n
U3RvcmUuaCIKKworI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5n
LmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50
LmgiCisjaW5jbHVkZSAiU1FMaXRlVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9D
U3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisKKyNpZiBFTkFCTEVfQ09PS0lFX0RFQlVHCisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQs
IC4uLikgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TG9nTGV2ZWxJbmZvLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUg
Q29va2llTG9nKGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVOQUJMRV9DT09LSUVfREVCVUcKKwor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUV4ZWN1dGFibGVNZXNzYWdlLmg+CisKK3VzaW5n
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpNZXNzYWdlQ2xpZW50OwordXNpbmcgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OlR5cGVkUmVwbHlCdWZmZXI7Cit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U7CisKK3N0YXRpYyBkb3VibGUgY29uc3Qgc19kYXRhYmFz
ZVRpbWVySW50ZXJ2YWwgPSAyOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0Nvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpCisgICAgOiBNZXNz
YWdlQ2xpZW50KE1lc3NhZ2VDbGllbnQ6OlJlcGx5RmVhdHVyZSkKKyAgICAsIG1fdGFibGVOYW1l
KCJjb29raWVzIikgLy8gVGhpcyBpcyBjaG9zZW4gdG8gbWF0Y2ggTW96aWxsYSdzIHRhYmxlIG5h
bWUuCisgICAgLCBtX2RiVGltZXIodGhpcywgJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpz
ZW5kQ2hhbmdlc1RvRGF0YWJhc2VUaW1lckZpcmVkKQorICAgICwgbV9pbnNlcnRTdGF0ZW1lbnQo
MCkKKyAgICAsIG1fdXBkYXRlU3RhdGVtZW50KDApCisgICAgLCBtX2RlbGV0ZVN0YXRlbWVudCgw
KQoreworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZEF0dHJzOworICAgIHB0aHJlYWRfYXR0cl9p
bml0KCZ0aHJlYWRBdHRycyk7CisgICAgY3JlYXRlVGhyZWFkKCJjb29raWVfZGF0YWJhc2UiLCB0
aHJlYWRBdHRycyk7Cit9CisKK0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp+Q29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmUoKQoreworICAgIC8vIEZJWE1FOiBUaGlzIG9iamVjdCB3aWxsIG5l
dmVyIGJlIGRlbGV0ZWQgZHVlIHRvIHRoZSBzZXQgdXAgb2YgQ29va2llTWFuYWdlciAoaXQncyBh
IHNpbmdsZXRvbikKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIERlc3RydWN0
aW5nIik7CisjaWZuZGVmIE5ERUJVRworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayht
X211dGV4KTsKKyAgICAgICAgQVNTRVJUKG1fY2hhbmdlZENvb2tpZXMuaXNFbXB0eSgpKTsKKyAg
ICB9CisjZW5kaWYKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6ZGVzdHJv
eSgpCit7CisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBDYWxsaW5nIGRlc3Ry
b3kgbWV0aG9kIik7CisjaWYgRU5BQkxFX0NPT0tJRV9ERUJVRworICAgIHsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5n
U3RvcmUgLSBtX2NoYW5nZWRjb29raWVzIGhhcyAlZC4iLCBtX2NoYW5nZWRDb29raWVzLnNpemUo
KSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBtYWtlIHN1cmUgYWxsIGJ1ZmZlcmVkIG9wZXJh
dGlvbnMgZmluaXNoLCB0aGVuIGhhdmUgdGhlIHRocmVhZCBkZWxldGUgaXRzZWxmCisgICAgZGlz
cGF0Y2hNZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29raWVEYXRhYmFzZUJhY2tp
bmdTdG9yZTo6aW52b2tlRGVzdHJveSwgdGhpcykpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlOjppbnZva2VEZXN0cm95KCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhy
ZWFkKCkpOworICAgIGludm9rZUNsb3NlKCk7CisgICAgZGVsZXRlIHRoaXM7Cit9CisKK3ZvaWQg
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnVwZ3JhZGVUYWJsZUlmTmVlZGVkKGNvbnN0IFN0
cmluZyYgZGF0YWJhc2VGaWVsZHMsIGNvbnN0IFN0cmluZyYgcHJpbWFyeUtleUZpZWxkcykKK3sK
KyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgYm9vbCBjcmVhdGlvblRpbWVF
eGlzdHMgPSBmYWxzZTsKKyAgICBib29sIHByb3RvY29sRXhpc3RzID0gZmFsc2U7CisKKyAgICBp
ZiAoIW1fZGIudGFibGVFeGlzdHMobV90YWJsZU5hbWUpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgdGFibGUgaGFzIHRoZSByZXF1aXJlZCBkYXRhYmFz
ZSBmaWVsZHMKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSgiUFJBR01BIHRhYmxlX2luZm8o
IiArIG1fdGFibGVOYW1lICsgIik7Iik7CisKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRl
bWVudChtX2RiLCBxdWVyeSk7CisgICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpKSB7Cisg
ICAgICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBwcmVwYXJlIHN0YXRlbWVudCB0byBxdWVyeSBj
b29raWUgdGFibGUgaW5mby4gc3FsOiVzIiwgcXVlcnkudXRmOCgpLmRhdGEoKSk7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9y
TXNnKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUg
KHN0YXRlbWVudC5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7CisgICAgICAgICAgICBTdHJpbmcg
bmFtZSA9IHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDEpOworICAgICAgICAgICAgaWYgKG5hbWUg
PT0gImNyZWF0aW9uVGltZSIpCisgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lRXhpc3RzID0g
dHJ1ZTsKKyAgICAgICAgICAgIGlmIChuYW1lID09ICJwcm90b2NvbCIpCisgICAgICAgICAgICAg
ICAgcHJvdG9jb2xFeGlzdHMgPSB0cnVlOworICAgICAgICAgICAgaWYgKGNyZWF0aW9uVGltZUV4
aXN0cyAmJiBwcm90b2NvbEV4aXN0cykKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICAgICAgTE9HKE5ldHdvcmssICJOZWVkIHRvIHVwZGF0ZSBjb29raWUgdGFibGUgc2No
ZW1hLiIpOworICAgIH0KKworICAgIC8vIERyb3AgYW5kIFJlY3JlYXRlIHRoZSBjb29raWUgdGFi
bGUgdG8gdXBkYXRlIHRvIHRoZSBuZXdlc3QgZGF0YWJhc2UgZmllbGRzCisgICAgLy8gV2UgZG8g
bm90IHVzZSBhbHRlciB0YWJsZSAtIGFkZCBjb2x1bW4gYmVjYXVzZSB0aGF0IG1ldGhvZCBjYW5u
b3QgYWRkIHByaW1hcnkga2V5cworICAgIFZlY3RvcjxTdHJpbmc+IGNvbW1hbmRzOworCisgICAg
Ly8gQmFja3VwIGV4aXN0aW5nIHRhYmxlCisgICAgU3RyaW5nIHJlbmFtZVF1ZXJ5KCJBTFRFUiBU
QUJMRSAiICsgbV90YWJsZU5hbWUgKyAiIFJFTkFNRSBUTyBCYWNrdXBfIiArIG1fdGFibGVOYW1l
ICsgIjsiKTsKKyAgICBjb21tYW5kcy5hcHBlbmQocmVuYW1lUXVlcnkpOworCisgICAgLy8gUmVj
cmVhdGUgdGhlIGNvb2tpZSB0YWJsZSB1c2luZyB0aGUgbmV3IGRhdGFiYXNlIGFuZCBwcmltYXJ5
IGtleSBmaWVsZHMKKyAgICBTdHJpbmcgY3JlYXRlVGFibGVRdWVyeSgiQ1JFQVRFIFRBQkxFICIp
OworICAgIGNyZWF0ZVRhYmxlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgY3JlYXRlVGFibGVR
dWVyeSArPSAiICgiK2RhdGFiYXNlRmllbGRzKyIsICIrcHJpbWFyeUtleUZpZWxkcysiKTsiOwor
ICAgIGNvbW1hbmRzLmFwcGVuZChjcmVhdGVUYWJsZVF1ZXJ5KTsKKworICAgIC8vIENvcHkgdGhl
IG9sZCBkYXRhIGludG8gdGhlIG5ldyB0YWJsZS4gSWYgYSBjb2x1bW4gZG9lcyBub3QgZXhpc3Rz
LAorICAgIC8vIHdlIGhhdmUgdG8gcHV0IGEgJycgaW4gdGhlIHNlbGVjdCBzdGF0ZW1lbnQgdG8g
bWFrZSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKKyAgICAvLyBlcXVhbCBpbiB0aGUgaW5zZXJ0IHN0
YXRlbWVudC4KKyAgICBTdHJpbmcgbWlncmF0aW9uUXVlcnkoIklOU0VSVCBPUiBSRVBMQUNFIElO
VE8gIik7CisgICAgbWlncmF0aW9uUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgbWlncmF0aW9u
UXVlcnkgKz0gIiBTRUxFQ1QgKiI7CisgICAgaWYgKCFjcmVhdGlvblRpbWVFeGlzdHMpCisgICAg
ICAgIG1pZ3JhdGlvblF1ZXJ5ICs9ICIsJyciOworICAgIGlmICghcHJvdG9jb2xFeGlzdHMpCisg
ICAgICAgIG1pZ3JhdGlvblF1ZXJ5ICs9ICIsJyciOworICAgIG1pZ3JhdGlvblF1ZXJ5ICs9IiBG
Uk9NIEJhY2t1cF8iK21fdGFibGVOYW1lOworICAgIGNvbW1hbmRzLmFwcGVuZChtaWdyYXRpb25R
dWVyeSk7CisKKyAgICAvLyBUaGUgbmV3IGNvbHVtbnMgd2lsbCBiZSBibGFuaywgc2V0IHRoZSBu
ZXcgdmFsdWVzLgorICAgIGlmICghY3JlYXRpb25UaW1lRXhpc3RzKSB7CisgICAgICAgIFN0cmlu
ZyBzZXRDcmVhdGlvblRpbWVRdWVyeSgiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIGNy
ZWF0aW9uVGltZSA9IGxhc3RBY2Nlc3NlZDsiKTsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5kKHNl
dENyZWF0aW9uVGltZVF1ZXJ5KTsKKyAgICB9CisKKyAgICBpZiAoIXByb3RvY29sRXhpc3RzKSB7
CisgICAgICAgIFN0cmluZyBzZXRQcm90b2NvbFF1ZXJ5KCJVUERBVEUgIiArIG1fdGFibGVOYW1l
ICsgIiBTRVQgcHJvdG9jb2wgPSAnaHR0cCcgV0hFUkUgaXNTZWN1cmUgPSAnMCc7Iik7CisgICAg
ICAgIFN0cmluZyBzZXRQcm90b2NvbFF1ZXJ5MigiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIg
U0VUIHByb3RvY29sID0gJ2h0dHBzJyBXSEVSRSBpc1NlY3VyZSA9ICcxJzsiKTsKKyAgICAgICAg
Y29tbWFuZHMuYXBwZW5kKHNldFByb3RvY29sUXVlcnkpOworICAgICAgICBjb21tYW5kcy5hcHBl
bmQoc2V0UHJvdG9jb2xRdWVyeTIpOworICAgIH0KKworICAgIC8vIERyb3AgdGhlIGJhY2t1cCB0
YWJsZQorICAgIFN0cmluZyBkcm9wQmFja3VwUXVlcnkoIkRST1AgVEFCTEUgSUYgRVhJU1RTIEJh
Y2t1cF8iK21fdGFibGVOYW1lKyI7Iik7CisgICAgY29tbWFuZHMuYXBwZW5kKGRyb3BCYWNrdXBR
dWVyeSk7CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RiLCBmYWxzZSk7
CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNv
bW1hbmRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZChj
b21tYW5kc1tpXSkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFsdGVyIGNv
b2tpZSB0YWJsZSB3aGVuIGV4ZWN1dGluZyBzcWw6JXMiLCBjb21tYW5kc1tpXS51dGY4KCkuZGF0
YSgpKTsKKyAgICAgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwg
bV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjaygp
OworCisgICAgICAgICAgICAvLyBmaW5hbGx5IGl0IHdpbGwgdHJ5IHRvIGtlZXAgYSBiYWNrdXAg
b2YgdGhlIGN1cnJlbnQgY29va2llIHRhYmxlIGZvciB0aGUgZnV0dXJlIHJlc3RvcmF0aW9uLgor
ICAgICAgICAgICAgLy8gTk9USUNFOiB0aGlzIHdpbGwgZXNzZW50aWFsbHkgREVMRVRFIHRoZSBj
dXJyZW50IHRhYmxlLCBidXQgdGhhdCdzIGJldHRlcgorICAgICAgICAgICAgLy8gdGhhbiBjb250
aW51YWxseSBoaXR0aW5nIHRoaXMgY2FzZSBhbmQgbmV2ZXIgYmVpbmcgYWJsZSB0byB1c2UgdGhl
IGNvb2tpZSB0YWJsZS4KKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgZXZlciBoaXQsIGl0J3Mg
ZGVmaW5pdGVseSBhIGJ1Zy4KKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICAgICAgU3RyaW5nIHJlbmFtZVF1ZXJ5KCJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5hbWUg
KyAiIFJFTkFNRSBUTyBCYWNrdXAyXyIgKyBtX3RhYmxlTmFtZSArICI7Iik7CisgICAgICAgICAg
ICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQocmVuYW1lUXVlcnkpKSB7CisgICAgICAgICAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gYmFja3VwIGV4aXN0aW5nIGNvb2tpZSB0YWJsZS4iKTsK
KyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1f
ZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgfQorICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgIExPRyhOZXR3
b3JrLCAiU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgY29va2llIHRhYmxlIHNjaGVtYS4iKTsKK30KKwor
dm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6b3Blbihjb25zdCBTdHJpbmcmIGNvb2tp
ZUphcikKK3sKKyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJkNv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuLCB0aGlzLCBjb29raWVKYXIpKTsK
K30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlT3Blbihjb25zdCBT
dHJpbmcmIGNvb2tpZUphcikKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAg
IGlmIChtX2RiLmlzT3BlbigpKQorICAgICAgICBpbnZva2VDbG9zZSgpOworCisgICAgaWYgKCFt
X2RiLm9wZW4oY29va2llSmFyKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBvcGVu
IHRoZSBjb29raWUgZGF0YWJhc2UuIE5vIGNvb2tpZSB3aWxsIGJlIHN0b3JlZCEiKTsKKyAgICAg
ICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1z
ZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZGIuZXhlY3V0ZUNvbW1hbmQo
IlBSQUdNQSBsb2NraW5nX21vZGU9RVhDTFVTSVZFOyIpOworICAgIG1fZGIuZXhlY3V0ZUNvbW1h
bmQoIlBSQUdNQSBqb3VybmFsX21vZGU9VFJVTkNBVEU7Iik7CisKKyAgICBjb25zdCBTdHJpbmcg
cHJpbWFyeUtleUZpZWxkcygiUFJJTUFSWSBLRVkgKHByb3RvY29sLCBob3N0LCBwYXRoLCBuYW1l
KSIpOworICAgIGNvbnN0IFN0cmluZyBkYXRhYmFzZUZpZWxkcygibmFtZSBURVhULCB2YWx1ZSBU
RVhULCBob3N0IFRFWFQsIHBhdGggVEVYVCwgZXhwaXJ5IERPVUJMRSwgbGFzdEFjY2Vzc2VkIERP
VUJMRSwgaXNTZWN1cmUgSU5URUdFUiwgaXNIdHRwT25seSBJTlRFR0VSLCBjcmVhdGlvblRpbWUg
RE9VQkxFLCBwcm90b2NvbCBURVhUIik7CisgICAgLy8gVXBncmFkZSB0YWJsZSB0byBhZGQgdGhl
IG5ldyBjb2x1bW4gY3JlYXRpb25UaW1lIGFuZCBwcm90b2NvbGZvciBiYWNrd2FyZCBjb21wbGlh
bmNlLgorICAgIHVwZ3JhZGVUYWJsZUlmTmVlZGVkKGRhdGFiYXNlRmllbGRzLCBwcmltYXJ5S2V5
RmllbGRzKTsKKworICAgIC8vIENyZWF0ZSB0YWJsZSBpZiBub3QgZXhzaXN0IGluIGNhc2UgdGhh
dCB0aGUgYWx0ZXJUYWJsZUlmTmVlZGVkKCkgZmFpbGVkIGFjY2lkZW50aWFsbHkuCisgICAgU3Ry
aW5nIGNyZWF0ZVRhYmxlUXVlcnkoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICIpOworICAg
IGNyZWF0ZVRhYmxlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgLy8gVGhpcyB0YWJsZSBzY2hl
bWEgaXMgY29tcGxpYW50IHdpdGggTW96aWxsYSdzLgorICAgIGNyZWF0ZVRhYmxlUXVlcnkgKz0g
IiAoIiArIGRhdGFiYXNlRmllbGRzICsgIiwgIiArIHByaW1hcnlLZXlGaWVsZHMrIik7IjsKKwor
ICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZChjcmVhdGVUYWJsZVF1ZXJ5KSkgeworICAgICAg
ICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgdGhlIHRhYmxlIHRvIHN0b3JlIHRoZSBjb29r
aWVzIGludG8uIE5vIGNvb2tpZSB3aWxsIGJlIHN0b3JlZCEiKTsKKyAgICAgICAgTE9HX0VSUk9S
KCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAg
ICAgaW52b2tlQ2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZyBp
bnNlcnRRdWVyeSgiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyAiKTsKKyAgICBpbnNlcnRRdWVyeSAr
PSBtX3RhYmxlTmFtZTsKKyAgICBpbnNlcnRRdWVyeSArPSAiIChuYW1lLCB2YWx1ZSwgaG9zdCwg
cGF0aCwgZXhwaXJ5LCBsYXN0QWNjZXNzZWQsIGlzU2VjdXJlLCBpc0h0dHBPbmx5LCBjcmVhdGlv
blRpbWUsIHByb3RvY29sKSBWQUxVRVMgKD8xLCA/MiwgPzMsID80LCA/NSwgPzYsID83LCA/OCwg
PzksID8xMCk7IjsKKworICAgIG1faW5zZXJ0U3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVu
dChtX2RiLCBpbnNlcnRRdWVyeSk7CisgICAgaWYgKG1faW5zZXJ0U3RhdGVtZW50LT5wcmVwYXJl
KCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3Qgc2F2ZSBjb29raWVzIik7CisgICAgICAg
IExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgfQorCisgICAgU3RyaW5nIHVwZGF0ZVF1ZXJ5KCJVUERBVEUgIik7CisgICAgdXBk
YXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgLy8gVGhlIHdoZXJlIHN0YXRlbWVudCBpcyBj
aG9zZW4gdG8gbWF0Y2ggQ29va2llTWFwIGtleS4KKyAgICB1cGRhdGVRdWVyeSArPSAiIFNFVCBu
YW1lID0gPzEsIHZhbHVlID0gPzIsIGhvc3QgPSA/MywgcGF0aCA9ID80LCBleHBpcnkgPSA/NSwg
bGFzdEFjY2Vzc2VkID0gPzYsIGlzU2VjdXJlID0gPzcsIGlzSHR0cE9ubHkgPSA/OCwgY3JlYXRp
b25UaW1lID0gPzksIHByb3RvY29sID0gPzEwIHdoZXJlIHByb3RvY29sID0gPzEwIGFuZCBuYW1l
ID0gPzEgYW5kIGhvc3QgPSA/MyBhbmQgcGF0aCA9ID80OyI7CisgICAgbV91cGRhdGVTdGF0ZW1l
bnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KG1fZGIsIHVwZGF0ZVF1ZXJ5KTsKKworICAgIGlmICht
X3VwZGF0ZVN0YXRlbWVudC0+cHJlcGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90
IHVwZGF0ZSBjb29raWVzIik7CisgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3Nh
Z2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgfQorCisgICAgU3RyaW5nIGRlbGV0
ZVF1ZXJ5KCJERUxFVEUgRlJPTSAiKTsKKyAgICBkZWxldGVRdWVyeSArPSBtX3RhYmxlTmFtZTsK
KyAgICAvLyBUaGUgd2hlcmUgc3RhdGVtZW50IGlzIGNob3NlbiB0byBtYXRjaCBDb29raWVNYXAg
a2V5LgorICAgIGRlbGV0ZVF1ZXJ5ICs9ICIgV0hFUkUgbmFtZT0/MSBhbmQgaG9zdD0/MiBhbmQg
cGF0aD0/MyBhbmQgcHJvdG9jb2w9PzQ7IjsKKyAgICBtX2RlbGV0ZVN0YXRlbWVudCA9IG5ldyBT
UUxpdGVTdGF0ZW1lbnQobV9kYiwgZGVsZXRlUXVlcnkpOworCisgICAgaWYgKG1fZGVsZXRlU3Rh
dGVtZW50LT5wcmVwYXJlKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNv
b2tpZXMiKTsKKyAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICB9CisKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZTo6Y2xvc2UoKQoreworICAgIGRpc3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RD
YWxsTWVzc2FnZSgmQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZUNsb3NlLCB0aGlz
KSk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZUNsb3NlKCkK
K3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIENvb2tpZUxvZygiQ29va2ll
QmFja2luZ1N0b3JlIC0gQ2xvc2luZyIpOworCisgICAgc2l6ZV90IGNoYW5nZWRDb29raWVzU2l6
ZTsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIGlm
IChtX2RiVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgICAgIG1fZGJUaW1lci5zdG9wKCk7Cisg
ICAgICAgIGNoYW5nZWRDb29raWVzU2l6ZSA9IG1fY2hhbmdlZENvb2tpZXMuc2l6ZSgpOworICAg
IH0KKworICAgIGlmIChjaGFuZ2VkQ29va2llc1NpemUgPiAwKQorICAgICAgICBpbnZva2VTZW5k
Q2hhbmdlc1RvRGF0YWJhc2UoKTsKKworICAgIGRlbGV0ZSBtX2luc2VydFN0YXRlbWVudDsKKyAg
ICBtX2luc2VydFN0YXRlbWVudCA9IDA7CisgICAgZGVsZXRlIG1fdXBkYXRlU3RhdGVtZW50Owor
ICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gMDsKKyAgICBkZWxldGUgbV9kZWxldGVTdGF0ZW1lbnQ7
CisgICAgbV9kZWxldGVTdGF0ZW1lbnQgPSAwOworCisgICAgaWYgKG1fZGIuaXNPcGVuKCkpCisg
ICAgICAgIG1fZGIuY2xvc2UoKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9y
ZTo6aW5zZXJ0KGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llKQoreworICAgIENvb2tpZUxvZygi
Q29va2llQmFja2luZ1N0b3JlIC0gYWRkaW5nIGluc2VydGluZyBjb29raWUgJXMgdG8gcXVldWUu
IiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgQVNTRVJUKCFjb29r
aWUtPmlzU2Vzc2lvbigpKTsKKyAgICBQYXJzZWRDb29raWUgY29va2llQ29weShjb29raWUpOwor
ICAgIENvb2tpZUFjdGlvbiBhY3Rpb24oY29va2llQ29weSwgSW5zZXJ0KTsKKyAgICB7CisgICAg
ICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIG1fY2hhbmdlZENvb2tpZXMu
YXBwZW5kKGFjdGlvbik7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0g
bV9jaGFuZ2VkY29va2llcyBoYXMgJWQuIiwgbV9jaGFuZ2VkQ29va2llcy5zaXplKCkpOworICAg
IH0KKyAgICBzZW5kQ2hhbmdlc1RvRGF0YWJhc2Uoc19kYXRhYmFzZVRpbWVySW50ZXJ2YWwpOwor
fQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp1cGRhdGUoY29uc3QgUGFyc2Vk
Q29va2llKiBjb29raWUpCit7CisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBh
ZGRpbmcgdXBkYXRpbmcgY29va2llICVzIHRvIHF1ZXVlLiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51
dGY4KCkuZGF0YSgpKTsKKworICAgIEFTU0VSVCghY29va2llLT5pc1Nlc3Npb24oKSk7CisgICAg
UGFyc2VkQ29va2llIGNvb2tpZUNvcHkoY29va2llKTsKKyAgICBDb29raWVBY3Rpb24gYWN0aW9u
KGNvb2tpZUNvcHksIFVwZGF0ZSk7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrKG1f
bXV0ZXgpOworICAgICAgICBtX2NoYW5nZWRDb29raWVzLmFwcGVuZChhY3Rpb24pOworICAgICAg
ICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIG1fY2hhbmdlZGNvb2tpZXMgaGFzICVk
LiIsIG1fY2hhbmdlZENvb2tpZXMuc2l6ZSgpKTsKKyAgICB9CisgICAgc2VuZENoYW5nZXNUb0Rh
dGFiYXNlKHNfZGF0YWJhc2VUaW1lckludGVydmFsKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZTo6cmVtb3ZlKGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llKQoreworICAg
IENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gYWRkaW5nIGRlbGV0aW5nIGNvb2tpZSAl
cyB0byBxdWV1ZS4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBB
U1NFUlQoIWNvb2tpZS0+aXNTZXNzaW9uKCkpOworICAgIFBhcnNlZENvb2tpZSBjb29raWVDb3B5
KGNvb2tpZSk7CisgICAgQ29va2llQWN0aW9uIGFjdGlvbihjb29raWVDb3B5LCBEZWxldGUpOwor
ICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgbV9jaGFu
Z2VkQ29va2llcy5hcHBlbmQoYWN0aW9uKTsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVCYWNr
aW5nU3RvcmUgLSBtX2NoYW5nZWRjb29raWVzIGhhcyAlZC4iLCBtX2NoYW5nZWRDb29raWVzLnNp
emUoKSk7CisgICAgfQorICAgIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZShzX2RhdGFiYXNlVGltZXJJ
bnRlcnZhbCk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnJlbW92ZUFs
bCgpCit7CisgICAgZGlzcGF0Y2hNZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3ZlQWxsLCB0aGlzKSk7Cit9CisKK3Zv
aWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZVJlbW92ZUFsbCgpCit7CisgICAg
QVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpZiAoIW1fZGIuaXNPcGVuKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gcmVtb3Zl
IEFsbCBjb29raWVzIGZyb20gYmFja2luZ3N0b3JlIik7CisKKyAgICB7CisgICAgICAgIE11dGV4
TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIG1fY2hhbmdlZENvb2tpZXMuY2xlYXIoKTsK
KyAgICB9CisKKyAgICBTdHJpbmcgZGVsZXRlUXVlcnkoIkRFTEVURSBGUk9NICIpOworICAgIGRl
bGV0ZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIGRlbGV0ZVF1ZXJ5ICs9ICI7IjsKKworICAg
IFNRTGl0ZVN0YXRlbWVudCBkZWxldGVTdGF0ZW1lbnQobV9kYiwgZGVsZXRlUXVlcnkpOworICAg
IGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291
bGQgbm90IHByZXBhcmUgREVMRVRFICogc3RhdGVtZW50Iik7CisgICAgICAgIExPR19FUlJPUigi
U1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5leGVjdXRlQ29tbWFu
ZCgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29raWUgZnJvbSBkYXRh
YmFzZSIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1f
ZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIENv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpnZXRDb29raWVzRnJvbURhdGFiYXNlKFZlY3RvcjxQ
YXJzZWRDb29raWUqPiYgc3RhY2tPZkNvb2tpZXMsIHVuc2lnbmVkIGludCBsaW1pdCkKK3sKKyAg
ICAvLyBJdCBpcyBub3QgYSBodWdlIHBlcmZvcm1hbmNlIGhpdCB0byB3YWl0IG9uIHRoZSByZXBs
eSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBvbmx5IGRvbmUgb25jZSBkdXJpbmcgc2V0dXAgYW5kIHdo
ZW4gdHVybmluZyBvZmYgcHJpdmF0ZSBtb2RlLgorICAgIFR5cGVkUmVwbHlCdWZmZXI8IFZlY3Rv
cjxQYXJzZWRDb29raWUqPiogPiByZXBseUJ1ZmZlcigwKTsKKyAgICBkaXNwYXRjaE1lc3NhZ2Uo
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2VXaXRoUmV0dXJuKCZDb29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZTo6aW52b2tlR2V0Q29va2llc1dpdGhMaW1pdCwgJnJlcGx5QnVmZmVyLCB0aGlzLCBsaW1p
dCkpOworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiogY29va2llcyA9IHJlcGx5QnVmZmVyLnBv
aW50ZXIoKTsKKyAgICBzdGFja09mQ29va2llcy5zd2FwKCpjb29raWVzKTsKKyAgICBkZWxldGUg
Y29va2llczsKK30KKworVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBDb29raWVEYXRhYmFzZUJhY2tp
bmdTdG9yZTo6aW52b2tlR2V0Q29va2llc1dpdGhMaW1pdCh1bnNpZ25lZCBpbnQgbGltaXQpCit7
CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhl
IHRhYmxlIGV4aXN0cyB0byBhdm9pZCBkb2luZyBhbiB1bm5lY2Vzc2FyeSByZXF1ZXN0LgorICAg
IGlmICghbV9kYi5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBTdHJpbmdCdWls
ZGVyIHNlbGVjdFF1ZXJ5OworICAgIHNlbGVjdFF1ZXJ5LmFwcGVuZCgiU0VMRUNUIG5hbWUsIHZh
bHVlLCBob3N0LCBwYXRoLCBleHBpcnksIGxhc3RBY2Nlc3NlZCwgaXNTZWN1cmUsIGlzSHR0cE9u
bHksIGNyZWF0aW9uVGltZSwgcHJvdG9jb2wgRlJPTSAiKTsKKyAgICBzZWxlY3RRdWVyeS5hcHBl
bmQobV90YWJsZU5hbWUpOworICAgIGlmIChsaW1pdCA+IDApIHsKKyAgICAgICAgc2VsZWN0UXVl
cnkuYXBwZW5kKCIgT1JERVIgQlkgbGFzdEFjY2Vzc2VkIEFTQyIpOworICAgICAgICBzZWxlY3RR
dWVyeS5hcHBlbmQoIiBMSU1JVCAiICsgU3RyaW5nOjpudW1iZXIobGltaXQpKTsKKyAgICB9Cisg
ICAgc2VsZWN0UXVlcnkuYXBwZW5kKCI7Iik7CisKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tp
bmdTdG9yZSAtIGludm9rZUdldEFsbENvb2tpZXMgd2l0aCBzZWxlY3QgcXVlcnkgJXMiLCBzZWxl
Y3RRdWVyeS50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgU1FMaXRlU3RhdGVtZW50
IHNlbGVjdFN0YXRlbWVudChtX2RiLCBzZWxlY3RRdWVyeS50b1N0cmluZygpKTsKKworICAgIGlm
IChzZWxlY3RTdGF0ZW1lbnQucHJlcGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90
IHJldHJpZXZlZCBjb29raWVzIGZyb20gdGhlIGRhdGFiYXNlIik7CisgICAgICAgIExPR19FUlJP
UigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KKworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiogY29va2ll
cyA9IG5ldyBWZWN0b3I8UGFyc2VkQ29va2llKj47CisgICAgd2hpbGUgKHNlbGVjdFN0YXRlbWVu
dC5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7CisgICAgICAgIC8vIFRoZXJlIGlzIGEgcm93IHRv
IGZldGNoCisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1u
VGV4dCgwKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVt
blRleHQoMSk7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29s
dW1uVGV4dCgyKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29s
dW1uVGV4dCgzKTsKKyAgICAgICAgZG91YmxlIGV4cGlyeSA9IHNlbGVjdFN0YXRlbWVudC5nZXRD
b2x1bW5Eb3VibGUoNCk7CisgICAgICAgIGRvdWJsZSBsYXN0QWNjZXNzZWQgPSBzZWxlY3RTdGF0
ZW1lbnQuZ2V0Q29sdW1uRG91YmxlKDUpOworICAgICAgICBib29sIGlzU2VjdXJlID0gc2VsZWN0
U3RhdGVtZW50LmdldENvbHVtbkludCg2KTsKKyAgICAgICAgYm9vbCBpc0h0dHBPbmx5ID0gc2Vs
ZWN0U3RhdGVtZW50LmdldENvbHVtbkludCg3KTsKKyAgICAgICAgZG91YmxlIGNyZWF0aW9uVGlt
ZSA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoOCk7CisgICAgICAgIFN0cmluZyBw
cm90b2NvbCA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDkpOworCisgICAgICAgIGNv
b2tpZXMtPmFwcGVuZChuZXcgUGFyc2VkQ29va2llKG5hbWUsIHZhbHVlLCBkb21haW4sIHByb3Rv
Y29sLCBwYXRoLCBleHBpcnksIGxhc3RBY2Nlc3NlZCwgY3JlYXRpb25UaW1lLCBpc1NlY3VyZSwg
aXNIdHRwT25seSkpOworICAgIH0KKworICAgIHJldHVybiBjb29raWVzOworfQorCit2b2lkIENv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2UoaW50IG5leHRJ
bnRlcnZhbCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrKG1fbXV0ZXgpOworICAgIGlmICghbV9k
YlRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3Rv
cmUgLSBTdGFydGluZyBvbmUgc2hvdCBzZW5kIHRvIGRhdGFiYXNlIik7CisgICAgICAgIG1fZGJU
aW1lci5zdGFydE9uZVNob3QobmV4dEludGVydmFsKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQ29v
a2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBUaW1lciBhbHJlYWR5IHJ1bm5pbmcsIHNraXBw
aW5nIHRoaXMgcmVxdWVzdCIpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3Jl
OjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2VUaW1lckZpcmVkKFRpbWVyPENvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlPiogdGltZXIpCit7CisgICAgQVNTRVJUX1VOVVNFRCh0aW1lciwgdGltZXIgPT0g
Jm1fZGJUaW1lcik7CisgICAgZGlzcGF0Y2hNZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdl
KCZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlU2VuZENoYW5nZXNUb0RhdGFiYXNl
LCB0aGlzKSk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZVNl
bmRDaGFuZ2VzVG9EYXRhYmFzZSgpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsK
KworICAgIGlmICghbV9kYi5pc09wZW4oKSkgeworICAgICAgICBMT0dfRVJST1IoIlRpbWVyIEZp
cmVkLCBidXQgZGF0YWJhc2UgaXMgY2xvc2VkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgVmVjdG9yPENvb2tpZUFjdGlvbj4gY2hhbmdlZENvb2tpZXM7CisgICAgeworICAgICAg
ICBNdXRleExvY2tlciBsb2NrKG1fbXV0ZXgpOworICAgICAgICBjaGFuZ2VkQ29va2llcy5zd2Fw
KG1fY2hhbmdlZENvb2tpZXMpOworICAgICAgICBBU1NFUlQobV9jaGFuZ2VkQ29va2llcy5pc0Vt
cHR5KCkpOworICAgIH0KKworICAgIGlmIChjaGFuZ2VkQ29va2llcy5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBUaW1lciBmaXJlZCwgYnV0IG5v
IGNvb2tpZXMgaW4gY2hhbmdlbGlzdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIENv
b2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gVGltZXIgZmlyZWQsIHNlbmRpbmcgY2hhbmdl
cyB0byBkYXRhYmFzZS4gV2UgaGF2ZSAlZCBjaGFuZ2VzIiwgY2hhbmdlZENvb2tpZXMuc2l6ZSgp
KTsKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RiLCBmYWxzZSk7CisgICAg
dHJhbnNhY3Rpb24uYmVnaW4oKTsKKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBldmVyeSBlbGVt
ZW50IGluIHRoZSBjaGFuZ2UgbGlzdCB0byBtYWtlIGNhbGxzCisgICAgLy8gSWYgZXJyb3Igb2Nj
dXJzLCBpZ25vcmUgaXQgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHN0YXRlbWVudAorICAgIHNp
emVfdCBzaXplT2ZDaGFuZ2UgPSBjaGFuZ2VkQ29va2llcy5zaXplKCk7CisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBzaXplT2ZDaGFuZ2U7IGkrKykgeworICAgICAgICBTUUxpdGVTdGF0ZW1l
bnQqIG1fc3RhdGVtZW50OworICAgICAgICBjb25zdCBQYXJzZWRDb29raWUgY29va2llID0gY2hh
bmdlZENvb2tpZXNbaV0uZmlyc3Q7CisgICAgICAgIFVwZGF0ZVBhcmFtZXRlciBhY3Rpb24gPSBj
aGFuZ2VkQ29va2llc1tpXS5zZWNvbmQ7CisKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBEZWxldGUp
IHsKKyAgICAgICAgICAgIG1fc3RhdGVtZW50ID0gbV9kZWxldGVTdGF0ZW1lbnQ7CisgICAgICAg
ICAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGRlbGV0aW5nIGNvb2tpZSAlcy4i
LCBjb29raWUudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgICAgICAgICAgLy8gQmlu
ZHMgYWxsIHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIGlmIChtX3N0YXRlbWVudC0+YmluZFRleHQo
MSwgY29va2llLm5hbWUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGNvb2tpZS5kb21h
aW4oKSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMywgY29va2ll
LnBhdGgoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDQsIGNvb2tpZS5wcm90b2NvbCgpKSkg
eworICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGJpbmQgY29va2llIGRhdGEgdG8g
ZGVsZXRlIik7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2Fn
ZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IFVwZGF0ZSkgewor
ICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gdXBkYXRpbmcg
Y29va2llICVzLiIsIGNvb2tpZS50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAg
ICAgICAgIG1fc3RhdGVtZW50ID0gbV91cGRhdGVTdGF0ZW1lbnQ7CisgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gaW5z
ZXJ0aW5nIGNvb2tpZSAlcy4iLCBjb29raWUudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAg
ICAgICAgICAgICAgICBtX3N0YXRlbWVudCA9IG1faW5zZXJ0U3RhdGVtZW50OworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgLy8gQmluZHMgYWxsIHRoZSB2YWx1ZXMKKworICAgICAgICAgICAg
aWYgKG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29raWUubmFtZSgpKSB8fCBtX3N0YXRlbWVu
dC0+YmluZFRleHQoMiwgY29va2llLnZhbHVlKCkpCisgICAgICAgICAgICAgICAgfHwgbV9zdGF0
ZW1lbnQtPmJpbmRUZXh0KDMsIGNvb2tpZS5kb21haW4oKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRU
ZXh0KDQsIGNvb2tpZS5wYXRoKCkpCisgICAgICAgICAgICAgICAgfHwgbV9zdGF0ZW1lbnQtPmJp
bmREb3VibGUoNSwgY29va2llLmV4cGlyeSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZERvdWJsZSg2
LCBjb29raWUubGFzdEFjY2Vzc2VkKCkpCisgICAgICAgICAgICAgICAgfHwgbV9zdGF0ZW1lbnQt
PmJpbmRJbnQ2NCg3LCBjb29raWUuaXNTZWN1cmUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRJbnQ2
NCg4LCBjb29raWUuaXNIdHRwT25seSgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50
LT5iaW5kRG91YmxlKDksIGNvb2tpZS5jcmVhdGlvblRpbWUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJp
bmRUZXh0KDEwLCBjb29raWUucHJvdG9jb2woKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJS
T1IoIkNhbm5vdCBiaW5kIGNvb2tpZSBkYXRhIHRvIHNhdmUiKTsKKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkp
OworICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHJjID0g
bV9zdGF0ZW1lbnQtPnN0ZXAoKTsKKyAgICAgICAgbV9zdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAg
ICAgIGlmIChyYyAhPSBTUUxSZXN1bHRPayAmJiByYyAhPSBTUUxSZXN1bHREb25lKSB7CisgICAg
ICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBtYWtlIGNhbGwgdG8gdGhlIGRhdGFiYXNlIik7Cisg
ICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFz
dEVycm9yTXNnKCkpOworICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFuc2FjdGlvbi5jb21taXQo
KTsKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIHRyYW5zYWN0aW9uIGNvbXBs
ZXRlIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNr
YmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi4xMjQyNmZjOWI1N2IxNzc1ZWUxZGZkODFiMTQ0OWM0NjdlZWM4ZWY5
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9D
b29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oCkBA
IC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFp
eCA8amNoYWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmVfaAor
CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTUUxpdGVEYXRhYmFzZS5o
IgorI2luY2x1ZGUgIlRpbWVyLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNz
YWdlQ2xpZW50Lmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZ1ByaW1pdGl2ZXMuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBhcnNlZENvb2tpZTsKKworY2xhc3MgQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmUgOiBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok1lc3Nh
Z2VDbGllbnQgeworcHVibGljOgorICAgIHN0YXRpYyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9y
ZSogY3JlYXRlKCkgeyByZXR1cm4gbmV3IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOyB9Cisg
ICAgdm9pZCBkZXN0cm95KCk7CisKKyAgICB2b2lkIG9wZW4oY29uc3QgU3RyaW5nJiBjb29raWVK
YXIpOworICAgIHZvaWQgY2xvc2UoKTsKKworICAgIHZvaWQgaW5zZXJ0KGNvbnN0IFBhcnNlZENv
b2tpZSopOworICAgIHZvaWQgdXBkYXRlKGNvbnN0IFBhcnNlZENvb2tpZSopOworICAgIHZvaWQg
cmVtb3ZlKGNvbnN0IFBhcnNlZENvb2tpZSopOworCisgICAgdm9pZCByZW1vdmVBbGwoKTsKKwor
ICAgIC8vIElmIGEgbGltaXQgaXMgbm90IHNldCwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbGwg
Y29va2llcyBpbiB0aGUgZGF0YWJhc2UKKyAgICB2b2lkIGdldENvb2tpZXNGcm9tRGF0YWJhc2Uo
VmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQgaW50IGxpbWl0
ID0gMCk7CisKKyAgICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCitwcml2YXRlOgor
ICAgIGVudW0gVXBkYXRlUGFyYW1ldGVyIHsKKyAgICAgICAgSW5zZXJ0LAorICAgICAgICBVcGRh
dGUsCisgICAgICAgIERlbGV0ZSwKKyAgICB9OworCisgICAgQ29va2llRGF0YWJhc2VCYWNraW5n
U3RvcmUoKTsKKyAgICB+Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUoKTsKKworICAgIHZvaWQg
c2VuZENoYW5nZXNUb0RhdGFiYXNlKGludCBpbnRlcnZhbCk7CisgICAgdm9pZCBzZW5kQ2hhbmdl
c1RvRGF0YWJhc2VUaW1lckZpcmVkKFRpbWVyPENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlPiop
OworICAgIHZvaWQgdXBncmFkZVRhYmxlSWZOZWVkZWQoY29uc3QgU3RyaW5nJiBkYXRhYmFzZVNj
aGVtYSwgY29uc3QgU3RyaW5nJiBwcmltYXJ5a2V5RmllbGRzKTsKKworICAgIHZvaWQgaW52b2tl
T3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUphcik7CisgICAgdm9pZCBpbnZva2VDbG9zZSgpOwor
ICAgIHZvaWQgaW52b2tlUmVtb3ZlQWxsKCk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBp
bnZva2VHZXRDb29raWVzV2l0aExpbWl0KHVuc2lnbmVkIGludCBsaW1pdCk7CisgICAgdm9pZCBp
bnZva2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UoKTsKKyAgICB2b2lkIGludm9rZURlc3Ryb3koKTsK
KworICAgIHR5cGVkZWYgcGFpcjxjb25zdCBQYXJzZWRDb29raWUsIFVwZGF0ZVBhcmFtZXRlcj4g
Q29va2llQWN0aW9uOworICAgIFZlY3RvcjxDb29raWVBY3Rpb24+IG1fY2hhbmdlZENvb2tpZXM7
CisgICAgTXV0ZXggbV9tdXRleDsKKworICAgIFN0cmluZyBtX3RhYmxlTmFtZTsKKyAgICBUaW1l
cjxDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZT4gbV9kYlRpbWVyOworICAgIFNRTGl0ZURhdGFi
YXNlIG1fZGI7CisgICAgU1FMaXRlU3RhdGVtZW50ICptX2luc2VydFN0YXRlbWVudDsKKyAgICBT
UUxpdGVTdGF0ZW1lbnQgKm1fdXBkYXRlU3RhdGVtZW50OworICAgIFNRTGl0ZVN0YXRlbWVudCAq
bV9kZWxldGVTdGF0ZW1lbnQ7Cit9OworCitDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSYgY29v
a2llQmFja2luZ1N0b3JlKCk7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llSmFyQmxhY2tCZXJyeS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZUphckJsYWNrQmVycnkuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmQ5YzQwODYxYmUwYjZmMzYwZDYxMjMxYzVhZWY3MmRlMTNkMjE0YTMKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZUphckJsYWNr
QmVycnkuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4g
aHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIElu
IE1vdGlvbiBMaW1pdGVkIDIwMTAtMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llSmFyLmgiCisKKyNpZiBPUyhRTlgp
CisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorI2VuZGlm
CisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWdlR3Jv
dXBMb2FkRGVmZXJyZXIuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgPHd0Zi90
ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWYgIU9TKFFOWCkKK3N0
YXRpYyBpbnQgZ2V0UGxheWVySWQoRnJhbWUqIGZyYW1lKQoreworICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihmcmFtZS0+bG9hZGVyKCktPmNsaWVu
dCgpKS0+cGxheWVySWQoKTsKK30KKyNlbmRpZgorCitXVEY6OlN0cmluZyBjb29raWVzKERvY3Vt
ZW50IGNvbnN0KiBkb2N1bWVudCwgS1VSTCBjb25zdCYgdXJsKQoreworICAgIEZyYW1lKiBmcmFt
ZSA9IGRvY3VtZW50LT5mcmFtZSgpOworICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZSA/IGZyYW1lLT5w
YWdlKCkgOiAwOworCisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1cm4gV1RGOjpTdHJpbmco
KTsKKworICAgIGlmICghKGZyYW1lICYmIGZyYW1lLT5sb2FkZXIoKSAmJiBmcmFtZS0+bG9hZGVy
KCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0dXJuIFdURjo6U3RyaW5nKCk7CisKKyAgICBpZiAo
IXN0YXRpY19jYXN0PFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSo+KGZyYW1l
LT5sb2FkZXIoKS0+Y2xpZW50KCkpLT5jb29raWVzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4g
V1RGOjpTdHJpbmcoKTsKKworI2lmIE9TKFFOWCkKKyAgICBBU1NFUlQoZG9jdW1lbnQgJiYgdXJs
ID09IGRvY3VtZW50LT5jb29raWVVUkwoKSk7CisgICAgLy8gJ0h0dHBPbmx5JyBjb29raWVzIHNo
b3VsZCBubyBiZSBhY2Nlc3NpYmxlIGZyb20gc2NyaXB0cywgc28gd2UgZmlsdGVyIHRoZW0gb3V0
IGhlcmUKKyAgICBXVEY6OlN0cmluZyByZXN1bHQgPSBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2ll
KHVybCwgTm9IdHRwT25seUNvb2tpZSk7CisjZWxzZQorCisgICAgUGFnZUdyb3VwTG9hZERlZmVy
cmVyIGRlZmVycmVyKHBhZ2UsIHRydWUpOworCisgICAgVW5zaGFyZWRBcnJheTxjaGFyPiBjb29r
aWVzOworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06OmdldENvb2tpZVN0cmluZyhnZXRQ
bGF5ZXJJZChmcmFtZSksIHVybC5zdHJpbmcoKS5sYXRpbjEoKS5kYXRhKCksIGNvb2tpZXMpKQor
ICAgICAgICByZXR1cm4gV1RGOjpTdHJpbmcoKTsKKworICAgIFdURjo6U3RyaW5nIHJlc3VsdCA9
IFdURjo6U3RyaW5nKGNvb2tpZXMuZ2V0KCkpOworI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKwordm9pZCBzZXRDb29raWVzKERvY3VtZW50KiBkb2N1bWVudCwgS1VSTCBjb25zdCYgdXJs
LCBTdHJpbmcgY29uc3QmIHZhbHVlKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5m
cmFtZSgpOworICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZSA/IGZyYW1lLT5wYWdlKCkgOiAwOworCisg
ICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIShmcmFtZSAmJiBmcmFt
ZS0+bG9hZGVyKCkgJiYgZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5Kj4oZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworI2lmIE9TKFFOWCkKKyAgICBBU1NFUlQoZG9jdW1lbnQgJiYgdXJs
ID09IGRvY3VtZW50LT5jb29raWVVUkwoKSk7CisgICAgY29va2llTWFuYWdlcigpLnNldENvb2tp
ZXModXJsLCB2YWx1ZSk7CisjZWxzZQorCisgICAgaWYgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpz
ZXRDb29raWVTdHJpbmcoZ2V0UGxheWVySWQoZnJhbWUpLCB1cmwuc3RyaW5nKCkubGF0aW4xKCku
ZGF0YSgpLCB2YWx1ZS5sYXRpbjEoKS5kYXRhKCkpKSB7CisKKyAgICAgICAgVW5zaGFyZWRBcnJh
eTxjaGFyPiBjb29raWVzOworICAgICAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjpnZXRD
b29raWVTdHJpbmcoZ2V0UGxheWVySWQoZnJhbWUpLCB1cmwuc3RyaW5nKCkubGF0aW4xKCkuZGF0
YSgpLCBjb29raWVzKSkgeworICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBXVEY6OlN0cmluZyByZXN1bHQg
PSBXVEY6OlN0cmluZyhjb29raWVzLmdldCgpKTsKKyAgICB9CisjZW5kaWYKK30KKworYm9vbCBj
b29raWVzRW5hYmxlZChEb2N1bWVudCBjb25zdCopCit7CisgICAgLy8gRklYTUUuIEN1cnJlbnRs
eSBjb29raWUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBubyBzZXR0aW5nIG9uIHByb3BlcnR5IHBh
Z2UuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBEb2N1
bWVudCogZG9jdW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgVmVjdG9yPENvb2tpZT4mIHJhd0Nvb2tp
ZXMpCit7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHJlc3VsdDsKKyAgICBjb29raWVNYW5h
Z2VyKCkuZ2V0UmF3Q29va2llcyhyZXN1bHQsIHVybCwgV2l0aEh0dHBPbmx5Q29va2llcyk7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspCisgICAgICAgIHJl
c3VsdFtpXS0+YXBwZW5kV2ViQ29yZUNvb2tpZShyYXdDb29raWVzKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBkZWxldGVDb29raWUoY29uc3QgRG9jdW1lbnQqIGRvY3VtZW50LCBjb25z
dCBLVVJMJiB1cmwsIGNvbnN0IFdURjo6U3RyaW5nJiBjb29raWVOYW1lKQoreworICAgIC8vIENv
b2tpZXMgYXJlIG5vdCBib3VuZCB0byB0aGUgZG9jdW1lbnQuIFRoZXJlZm9yZSwgd2UgZG9uJ3Qg
bmVlZCB0byBwYXNzCisgICAgLy8gaW4gdGhlIGRvY3VtZW50IG9iamVjdCB0byBmaW5kIHRoZSB0
YXJnZXRlZCBjb29raWVzIGluIGNvb2tpZSBtYW5hZ2VyLgorICAgIGNvb2tpZU1hbmFnZXIoKS5y
ZW1vdmVDb29raWVXaXRoTmFtZSh1cmwsIGNvb2tpZU5hbWUpOworfQorCitXVEY6OlN0cmluZyBj
b29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1ZShjb25zdCBEb2N1bWVudCogZG9jdW1lbnQsIGNv
bnN0IEtVUkwgJnVybCkKK3sKKyNpZiBPUyhRTlgpCisgICAgQVNTRVJUKGRvY3VtZW50KTsKKwor
ICAgIGlmICghKGRvY3VtZW50LT5mcmFtZSgpICYmIGRvY3VtZW50LT5mcmFtZSgpLT5sb2FkZXIo
KSAmJiBkb2N1bWVudC0+ZnJhbWUoKS0+bG9hZGVyKCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0
dXJuIFdURjo6U3RyaW5nKCk7CisKKyAgICBpZiAoIXN0YXRpY19jYXN0PFdlYkNvcmU6OkZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeSo+KGRvY3VtZW50LT5mcmFtZSgpLT5sb2FkZXIoKS0+Y2xp
ZW50KCkpLT5jb29raWVzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gV1RGOjpTdHJpbmcoKTsK
KworICAgIHJldHVybiBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2llKHVybCwgV2l0aEh0dHBPbmx5
Q29va2llcyk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIFdURjo6
U3RyaW5nKCk7CisjZW5kaWYKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uZTQ2OTI1NGQ1NzhlNDhjNjg5Y2NhN2VhNDhmZDA3NTYyYjlmM2JjZQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFu
YWdlci5jcHAKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIw
MDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfREVCVUcgMAorI2RlZmluZSBFTkFCTEVf
Q09PS0lFX1NVUEVSX1ZFUkJPU0VfREVCVUcgMAorI2RlZmluZSBFTkFCTEVfQ09PS0lFX0xJTUlU
X0RFQlVHIDAKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIu
aCIKKworI2luY2x1ZGUgIkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmgiCisjaW5jbHVkZSAi
Q29va2llUGFyc2VyLmgiCisjaW5jbHVkZSAiQ3VycmVudFRpbWUuaCIKKyNpbmNsdWRlICJGaWxl
U3lzdGVtLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5o
IgorI2luY2x1ZGUgIldlYlNldHRpbmdzLmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3Jt
Q2xpZW50Lmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90
ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwor
I2lmIEVOQUJMRV9DT09LSUVfREVCVUcKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cu
aD4KKyNlbmRpZgorCisjaWYgRU5BQkxFX0NPT0tJRV9TVVBFUl9WRVJCT1NFX0RFQlVHCisjZGVm
aW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5
cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBmb3JtYXQsICMjIF9fVkFfQVJH
U19fKQorI2Vsc2UKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVO
QUJMRV9DT09LSUVfU1VQRVJfVkVSQk9TRV9ERUJVRworCisjaWYgRU5BQkxFX0NPT0tJRV9MSU1J
VF9ERUJVRworI2RlZmluZSBDb29raWVMaW1pdExvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBm
b3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQ29va2llTGltaXRMb2coZm9y
bWF0LCAuLi4pCisjZW5kaWYgLy8gRU5BQkxFX0NPT0tJRV9MSU1JVF9ERUJVRworCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK0Nvb2tpZU1hbmFnZXImIGNvb2tpZU1hbmFnZXIoKQoreworICAgIHN0
YXRpYyBDb29raWVNYW5hZ2VyICpjb29raWVNYW5hZ2VyID0gMDsKKyAgICBpZiAoIWNvb2tpZU1h
bmFnZXIpIHsKKyAgICAgICAgLy8gT3BlbiB0aGUgY29va2llSmFyIG5vdyBhbmQgZ2V0IHRoZSBi
YWNraW5nIHN0b3JlIGNvb2tpZXMgdG8gZmlsbCB0aGUgbWFuYWdlci4KKyAgICAgICAgY29va2ll
TWFuYWdlciA9IG5ldyBDb29raWVNYW5hZ2VyOworICAgICAgICBjb29raWVNYW5hZ2VyLT5tX2Nv
b2tpZUJhY2tpbmdTdG9yZS0+b3Blbihjb29raWVNYW5hZ2VyLT5jb29raWVKYXIoKSk7CisgICAg
ICAgIGNvb2tpZU1hbmFnZXItPmdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKTsKKyAgICAgICAgQ29v
a2llTG9nKCJDb29raWVNYW5hZ2VyIC0gQmFja2luZ3N0b3JlIGxvYWQgY29tcGxldGUuXG4iKTsK
KyAgICB9CisgICAgcmV0dXJuICpjb29raWVNYW5hZ2VyOworfQorCitDb29raWVNYW5hZ2VyOjpD
b29raWVNYW5hZ2VyKCkKKyAgICA6IG1fY291bnQoMCkKKyAgICAsIG1fcHJpdmF0ZU1vZGUoZmFs
c2UpCisgICAgLCBtX3Nob3VsZER1bXBBbGxDb29raWVzKGZhbHNlKQorICAgICwgbV9jb29raWVK
YXJGaWxlTmFtZShwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkNsaWVudDo6Z2V0KCktPmdldEFwcGxpY2F0aW9uRGF0YURpcmVjdG9yeSgpLmNfc3RyKCksICIv
Y29va2llQ29sbGVjdGlvbi5kYiIpKQorICAgICwgbV9wb2xpY3koQ29va2llU3RvcmFnZUFjY2Vw
dFBvbGljeUFsd2F5cykKKyAgICAsIG1fY29va2llQmFja2luZ1N0b3JlKENvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlOjpjcmVhdGUoKSkKKyAgICAsIG1fbGltaXRUaW1lcih0aGlzLCAmQ29va2ll
TWFuYWdlcjo6Y29va2llTGltaXRDbGVhblVwKQoreworfQorCitDb29raWVNYW5hZ2VyOjp+Q29v
a2llTWFuYWdlcigpCit7CisgICAgcmVtb3ZlQWxsQ29va2llcyhEb05vdFJlbW92ZUZyb21CYWNr
aW5nU3RvcmUpOworICAgIC8vIFRPRE86IG1fbWFuYWdlck1hcCBhbmQgdGhlIHRvcCBsYXllciBw
cm90b2NvbE1hcHMgYXJlIG5vdCBwcm9wZXJseSBkZWxldGVkLgorICAgIC8vIERvIG5vdCBkZWxl
dGUgYW55IHByb3RvY29sIG1hcHMgdG8gYXZvaWQgZG91YmxlLWRlbGV0aW9uIG9mIHRoZSBtYXBz
IHRoYXQgYXJlCisgICAgLy8gYmVpbmcgdXNlZCBmb3IgYm90aCBzZWN1cmUgYW5kIG5vbi1zZWN1
cmUgcHJvdG9jb2xzOyB0aGlzIGxlYWsgaXMgT0sgc2luY2UKKyAgICAvLyB0aGVyZSdzIG5vdGhp
bmcgaW1wb3J0YW50IGluIHRoZSBoYXNodGFibGUgZGVzdHJ1Y3RvcnMsIGFuZCB0aGUgbWVtb3J5
IHdpbGwgYmUgcmVjbGFpbWVkIG9uIGV4aXQKKworICAgIC8vIENvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlIHdpbGwgZGVsZXRlIGl0c2VsZiBhZnRlciBmbHVzaGluZworICAgIG1fY29va2llQmFj
a2luZ1N0b3JlLT5kZXN0cm95KCk7CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUgPSAwOworfQor
CisvLyBTb3J0aW5nIGxvZ2ljIGlzIGJhc2VkIG9uIENvb2tpZSBTcGVjIFJGQzYyNjUsIHNlY3Rp
b24gNS40LjIKK3N0YXRpYyBib29sIGNvb2tpZVNvcnRlcihQYXJzZWRDb29raWUqIGEsIFBhcnNl
ZENvb2tpZSogYikKK3sKKyAgICBpZiAoYS0+cGF0aCgpLmxlbmd0aCgpID09IGItPnBhdGgoKS5s
ZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIGEtPmNyZWF0aW9uVGltZSgpIDwgYi0+Y3JlYXRpb25U
aW1lKCk7CisgICAgcmV0dXJuIGEtPnBhdGgoKS5sZW5ndGgoKSA+IGItPnBhdGgoKS5sZW5ndGgo
KTsKK30KKworLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwcm90b2NvbCBzdXBwb3J0cyBkb21haW5z
CitzdGF0aWMgYm9vbCBzaG91bGRJZ25vcmVEb21haW4oY29uc3QgU3RyaW5nIHByb3RvY29sKQor
eworICAgIC8vIGlnbm9yZSBkb21haW4gc2VjdXJpdHkgZm9yIGZpbGUgYW5kIGxvY2FsCisgICAg
aWYgKChwcm90b2NvbCA9PSAiZmlsZSIgfHwgcHJvdG9jb2wgPT0gImxvY2FsIiApKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdl
cjo6c2V0Q29va2llcyhjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7Cisg
ICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gU2V0dGluZyBjb29raWVzIik7CisgICAgQ29v
a2llUGFyc2VyIHBhcnNlcih1cmwpOworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVz
ID0gcGFyc2VyLnBhcnNlKHZhbHVlKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29v
a2llcy5zaXplKCk7ICsraSkgeworICAgICAgICBQYXJzZWRDb29raWUqIGNvb2tpZSA9IGNvb2tp
ZXNbaV07CisgICAgICAgIGlmICghc2hvdWxkUmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24oY29va2ll
LCB1cmwpKSB7CisgICAgICAgICAgICBCYWNraW5nU3RvcmVSZW1vdmFsIHRyZWF0bWVudCA9IG1f
cHJpdmF0ZU1vZGUgPyBEb05vdFJlbW92ZUZyb21CYWNraW5nU3RvcmUgOiBSZW1vdmVGcm9tQmFj
a2luZ1N0b3JlOworICAgICAgICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShjb29raWUsIHRyZWF0
bWVudCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZGVsZXRlIGNvb2tpZTsKKyAgICB9
Cit9CisKK2Jvb2wgQ29va2llTWFuYWdlcjo6c2hvdWxkUmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24o
Y29uc3QgUGFyc2VkQ29va2llKiBjb29raWUsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBX
ZSBoYXZlIHRvIGRpc2FibGUgdGhlIGZvbGxvd2luZyBjaGVjayBiZWNhdXNlIHNpdGVzIGxpa2Ug
RmFjZWJvb2sgYW5kCisgICAgLy8gR21haWwgY3VycmVudGx5IGRvIG5vdCBmb2xsb3cgdGhlIHNw
ZWMuCisjaWYgMAorICAgIC8vIENoZWNrIGlmIHBhdGggYXR0cmlidXRlIGlzIGEgcHJlZml4IG9m
IHRoZSByZXF1ZXN0IFVSSS4KKyAgICBpZiAoIXVybC5wYXRoKCkuc3RhcnRzV2l0aChjb29raWUt
PnBhdGgoKSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb29raWUgJXMgaXMgcmVqZWN0ZWQgYmVj
YXVzZSBpdHMgcGF0aCBkb2VzIG5vdCBtYXRoIHRoZSBVUkwgJXNcbiIsIGNvb2tpZS0+dG9TdHJp
bmcoKS51dGY4KCkuZGF0YSgpLCB1cmwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gaWdub3JlIGRvbWFpbiBzZWN1
cml0eSBpZiBwcm90b2NvbCBkb2Vzbid0IGhhdmUgZG9tYWlucworICAgIGlmIChzaG91bGRJZ25v
cmVEb21haW4oY29va2llLT5wcm90b2NvbCgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gUmVqZWN0IENvb2tpZSBpZiBkb21haW4gaXMgZW1wdHkKKyAgICBpZiAoIWNvb2tpZS0+
ZG9tYWluKCkubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFjb29r
aWUtPmhhc0RlZmF1bHREb21haW4oKSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgZG9tYWlu
IGNvbnRhaW5zIGFuIGVtYmVkZGVkIGRvdC4KKyAgICAgICAgaW50IGRvdFBvc2l0aW9uID0gY29v
a2llLT5kb21haW4oKS5maW5kKCIuIiwgMSk7CisgICAgICAgIGlmIChkb3RQb3NpdGlvbiA9PSAt
MSB8fCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGRvdFBvc2l0aW9uKSA9PSBjb29raWUtPmRv
bWFpbigpLmxlbmd0aCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkNvb2tpZSAlcyBpcyBy
ZWplY3RlZCBiZWNhdXNlIGl0cyBkb21haW4gZG9lcyBub3QgY29udGFpbiBhbiBlbWJlZGRlZCBk
b3QuXG4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSByZXF1ZXN0IGhvc3Qg
c2hvdWxkIGRvbWFpbiBtYXRjaCB0aGUgRG9tYWluIGF0dHJpYnV0ZS4KKyAgICBpZiAoIXVybC5o
b3N0KCkuZW5kc1dpdGgoY29va2llLT5kb21haW4oKSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJD
b29raWUgJXMgaXMgcmVqZWN0ZWQgYmVjYXVzZSBpdHMgZG9tYWluIGRvZXMgbm90IGRvbWFpbiBt
YXRjaCB0aGUgVVJMICVzXG4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgdXJs
LnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cisg
ICAgLy8gV2Ugc2hvdWxkIGNoZWNrIGZvciBhbiBlbWJlZGRlZCBkb3QgaW4gdGhlIHBvcnRpb24g
b2Ygc3RyaW5nIGluIHRoZSBob3N0IG5vdCBpbiB0aGUgZG9tYWluCisgICAgLy8gYnV0IHRvIG1h
dGNoIGZpcmVmb3ggYmVoYXZpb3VyIHdlIGRvIG5vdC4KKworICAgIHJldHVybiBmYWxzZTsKK30K
KworU3RyaW5nIENvb2tpZU1hbmFnZXI6OmdldENvb2tpZShjb25zdCBLVVJMJiB1cmwsIEh0dHBP
bmx5Q29va2llRmlsdGVyaW5nIGZpbHRlcikgY29uc3QKK3sKKyAgICBWZWN0b3I8UGFyc2VkQ29v
a2llKj4gcmF3Q29va2llczsKKyAgICByYXdDb29raWVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHko
c19tYXhDb29raWVDb3VudFBlckhvc3QpOworCisgICAgLy8gUmV0cmlldmUgY29va2llcyByZWxh
dGVkIHRvIHRoaXMgdXJsCisgICAgZ2V0UmF3Q29va2llcyhyYXdDb29raWVzLCB1cmwsIGZpbHRl
cik7CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSB0aGVyZSBhcmUgJWQgY29va2ll
cyBpbiByYXcgY29va2llc1xuIiwgcmF3Q29va2llcy5zaXplKCkpOworCisKKyAgICAvLyBHZW5l
cmF0ZSB0aGUgY29va2llIGhlYWRlciBzdHJpbmcgdXNpbmcgdGhlIHJldHJpZXZlZCBjb29raWVz
CisgICAgU3RyaW5nQnVpbGRlciBjb29raWVTdHJpbmdCdWlsZGVyOworICAgIGNvb2tpZVN0cmlu
Z0J1aWxkZXIucmVzZXJ2ZUNhcGFjaXR5KHNfbWF4Q29va2llSGVhZGVyU3RyaW5nTGVuZ3RoKTsK
KyAgICBzaXplX3QgY29va2llU2l6ZSA9IHJhd0Nvb2tpZXMuc2l6ZSgpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgY29va2llU2l6ZTsgaSsrKSB7CisgICAgICAgIGNvb2tpZVN0cmluZ0J1
aWxkZXIuYXBwZW5kKHJhd0Nvb2tpZXNbaV0tPnRvTmFtZVZhbHVlUGFpcigpKTsKKyAgICAgICAg
aWYgKGkgIT0gY29va2llU2l6ZS0xKQorICAgICAgICAgICAgY29va2llU3RyaW5nQnVpbGRlci5h
cHBlbmQoIjsgIik7CisgICAgfQorCisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBj
b29raWVTdHJpbmcgaXMgLSAlc1xuIiwgY29va2llU3RyaW5nQnVpbGRlci50b1N0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworCisgICAgcmV0dXJuIGNvb2tpZVN0cmluZ0J1aWxkZXIudG9TdHJpbmco
KTsKKworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmdldFJhd0Nvb2tpZXMoVmVjdG9yPFBhcnNl
ZENvb2tpZSo+ICZzdGFja09mQ29va2llcywgY29uc3QgS1VSTCYgcmVxdWVzdFVSTCwgSHR0cE9u
bHlDb29raWVGaWx0ZXJpbmcgZmlsdGVyKSBjb25zdAoreworICAgIENvb2tpZUxvZygiQ29va2ll
TWFuYWdlciAtIGdldFJhd0Nvb2tpZXMgLSBwcm9jZXNzaW5nIHVybCB3aXRoIGRvbWFpbiAtICVz
ICYgcHJvdG9jb2w6ICVzICYgcGF0aDogJXNcbiIsIHJlcXVlc3RVUkwuaG9zdCgpLnV0ZjgoKS5k
YXRhKCksIHJlcXVlc3RVUkwucHJvdG9jb2woKS51dGY4KCkuZGF0YSgpLCByZXF1ZXN0VVJMLnBh
dGgoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGJvb2wgc3BlY2lhbENhc2VGb3JMb2NhbCA9IChy
ZXF1ZXN0VVJMLnByb3RvY29sSXMoImxvY2FsIikgfHwgcmVxdWVzdFVSTC5wcm90b2NvbElzKCJm
aWxlIikpICYmIG1fc2hvdWxkRHVtcEFsbENvb2tpZXM7CisgICAgYm9vbCBpc0Nvbm5lY3Rpb25T
ZWN1cmUgPSByZXF1ZXN0VVJMLnByb3RvY29sSXMoImh0dHBzIikgfHwgcmVxdWVzdFVSTC5wcm90
b2NvbElzKCJ3c3MiKSB8fCBzcGVjaWFsQ2FzZUZvckxvY2FsOworCisgICAgVmVjdG9yPFBhcnNl
ZENvb2tpZSo+IGNvb2tpZUNhbmRpZGF0ZXM7CisgICAgVmVjdG9yPENvb2tpZU1hcCo+IHByb3Rv
Y29sc1RvU2VhcmNoOworCisgICAgaWYgKHNwZWNpYWxDYXNlRm9yTG9jYWwpCisgICAgICAgIGNv
cHlWYWx1ZXNUb1ZlY3RvcihtX21hbmFnZXJNYXAsIHByb3RvY29sc1RvU2VhcmNoKTsKKyAgICBl
bHNlCisgICAgICAgIHByb3RvY29sc1RvU2VhcmNoLmFwcGVuZChtX21hbmFnZXJNYXAuZ2V0KHJl
cXVlc3RVUkwucHJvdG9jb2woKSkpOworCisgICAgVmVjdG9yPFN0cmluZz4gZGVsaW1pdGVkSG9z
dDsKKyAgICByZXF1ZXN0VVJMLmhvc3QoKS5zcGxpdCgiLiIsIHRydWUsIGRlbGltaXRlZEhvc3Qp
OworCisgICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIHByb3RvY29sIHRyZWVzIHRoYXQgd2UgbmVl
ZCB0byBzZWFyY2ggZm9yCisgICAgLy8gYW5kIGdldCBhbGwgY29va2llcyB0aGF0IGFyZSB2YWxp
ZCBmb3IgdGhpcyBkb21haW4KKyAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHByb3RvY29sc1Rv
U2VhcmNoLnNpemUoKTsgaysrKSB7CisgICAgICAgIENvb2tpZU1hcCogY3VycmVudE1hcCA9IHBy
b3RvY29sc1RvU2VhcmNoW2tdOworCisgICAgICAgIC8vIGlmIG5vIGNvb2tpZXMgZXhpc3QgZm9y
IHRoaXMgcHJvdG9jb2wsIGJyZWFrIHJpZ2h0IGF3YXkKKyAgICAgICAgaWYgKCFjdXJyZW50TWFw
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5h
Z2VyIC0gbG9va2luZyBhdCBwcm90b2NvbCBtYXAgJXMgXG4iLCBjdXJyZW50TWFwLT5nZXROYW1l
KCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBsb2NhbCBh
bmQgZmlsZXMgLSBiZWNhdXNlIFdlYkFwcHMgZXhwZWN0IHRvIGdldCBBTEwgY29va2llcyBmcm9t
IHRoZSBiYWNraW5nLXN0b3JlIG9uIGxvY2FsIHByb3RvY29sCisgICAgICAgIGlmIChzcGVjaWFs
Q2FzZUZvckxvY2FsKSB7CisgICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBz
cGVjaWFsIGNhc2UgZmluZCBpbiBwcm90b2NvbCBtYXAgLSAlc1xuIiwgY3VycmVudE1hcC0+Z2V0
TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgY3VycmVudE1hcC0+Z2V0QWxsQ2hp
bGRDb29raWVzKCZjb29raWVDYW5kaWRhdGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIC8vIEdldCBjb29raWVzIGZyb20gdGhlIG51bGwgZG9tYWluIG1hcAorICAgICAgICAgICAg
Y3VycmVudE1hcC0+Z2V0QWxsQ29va2llcygmY29va2llQ2FuZGlkYXRlcyk7CisKKyAgICAgICAg
ICAgIC8vIEdldCBjb29raWVzIGZyb20gdGhlIHZhbGlkIGRvbWFpbiBtYXBzCisgICAgICAgICAg
ICBpbnQgaSA9IGRlbGltaXRlZEhvc3Quc2l6ZSgpLTE7CisgICAgICAgICAgICB3aGlsZSAoaSA+
PSAwKSB7CisgICAgICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZmluZGlu
ZyAlcyBpbiBjdXJyZW50bWFwXG4iLCBkZWxpbWl0ZWRIb3N0W2ldLnV0ZjgoKS5kYXRhKCkpOwor
ICAgICAgICAgICAgICAgIGN1cnJlbnRNYXAgPSBjdXJyZW50TWFwLT5nZXRTdWJkb21haW5NYXAo
ZGVsaW1pdGVkSG9zdFtpXSk7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBzdWJkb21haW4v
ZG9tYWluIGRvZXMgbm90IGV4aXN0IGluIG91ciBtYXBwaW5nIHRoZW4gd2Ugc2ltcGx5IGV4aXQK
KyAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRNYXApIHsKKyAgICAgICAgICAgICAgICAgICAg
Q29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gY2Fubm90IGZpbmQgbmV4dCBtYXAgZXhpdGluZyB0
aGUgd2hpbGUgbG9vcC5cbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZm91
bmQgdGhlIG1hcCwgZ3JhYmJpbmcgY29va2llcyBmcm9tIHRoaXMgbWFwXG4iKTsKKyAgICAgICAg
ICAgICAgICBjdXJyZW50TWFwLT5nZXRBbGxDb29raWVzKCZjb29raWVDYW5kaWRhdGVzKTsKKyAg
ICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSB0aGVyZSBhcmUgJWQgY29va2llcyBpbiBjYW5k
aWRhdGVcbiIsIGNvb2tpZUNhbmRpZGF0ZXMuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgY29va2llQ2FuZGlkYXRlcy5zaXplKCk7ICsraSkgeworICAgICAgICBQYXJzZWRD
b29raWUqIGNvb2tpZSA9IGNvb2tpZUNhbmRpZGF0ZXNbaV07CisKKyAgICAgICAgLy8gQWNjb3Jk
aW5nIHRvIHRoZSBwYXRoLW1hdGNoZXMgcnVsZXMgaW4gUkZDNjI2NSwgc2VjdGlvbiA1LjEuNCwK
KyAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCBhICcvJyBhdCB0aGUgZW5kIG9mIGNvb2tpZS1wYXRo
IGZvciBjb21wYXJpc29uIGlmIHRoZSBjb29raWUtcGF0aCBpcyBub3QgZW5kIHdpdGggJy8nLgor
ICAgICAgICBTdHJpbmcgcGF0aCA9IGNvb2tpZS0+cGF0aCgpOworICAgICAgICBpZiAoIWVxdWFs
SWdub3JpbmdDYXNlKHBhdGgsIHJlcXVlc3RVUkwucGF0aCgpKSAmJiAhcGF0aC5lbmRzV2l0aCgi
LyIsIGZhbHNlKSkKKyAgICAgICAgICAgIHBhdGggKz0gIi8iOworCisgICAgICAgIC8vIE9ubHkg
c2VjdXJlIGNvbm5lY3Rpb25zIGhhdmUgYWNjZXNzIHRvIHNlY3VyZSBjb29raWVzLiBVbmxlc3Mg
c3BlY2lhbENhc2VGb3JMb2NhbCBpcyB0cnVlCisgICAgICAgIC8vIEdldCB0aGUgY29va2llcyBm
aWx0ZXJpbmcgb3V0IEh0dHBPbmx5IGNvb2tpZXMgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiAo
cmVxdWVzdFVSTC5wYXRoKCkuc3RhcnRzV2l0aChwYXRoLCBmYWxzZSkgJiYgKGlzQ29ubmVjdGlv
blNlY3VyZSB8fCAhY29va2llLT5pc1NlY3VyZSgpKSAmJiAoZmlsdGVyID09IFdpdGhIdHRwT25s
eUNvb2tpZXMgfHwgIWNvb2tpZS0+aXNIdHRwT25seSgpKSkgeworICAgICAgICAgICAgQ29va2ll
TG9nKCJDb29raWVNYW5hZ2VyIC0gY29va2llIGNob3NlbiAtICVzXG4iLCBjb29raWUtPnRvU3Ry
aW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICBjb29raWUtPnNldExhc3RBY2Nlc3Nl
ZChjdXJyZW50VGltZSgpKTsKKyAgICAgICAgICAgIHN0YWNrT2ZDb29raWVzLmFwcGVuZChjb29r
aWUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzb3J0KHN0YWNrT2ZDb29raWVzLmJl
Z2luKCksIHN0YWNrT2ZDb29raWVzLmVuZCgpLCBjb29raWVTb3J0ZXIpOworfQorCit2b2lkIENv
b2tpZU1hbmFnZXI6OnJlbW92ZUFsbENvb2tpZXMoQmFja2luZ1N0b3JlUmVtb3ZhbCBiYWNraW5n
U3RvcmVSZW1vdmFsKQoreworICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0
b3IgZmlyc3QgPSBtX21hbmFnZXJNYXAuYmVnaW4oKTsKKyAgICBIYXNoTWFwPFN0cmluZywgQ29v
a2llTWFwKj46Oml0ZXJhdG9yIGVuZCA9IG1fbWFuYWdlck1hcC5lbmQoKTsKKyAgICBmb3IgKEhh
c2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQgPSBmaXJzdDsgaXQgIT0gZW5k
OyArK2l0KQorICAgICAgICBpdC0+c2Vjb25kLT5kZWxldGVBbGxDb29raWVzQW5kRG9tYWlucygp
OworCisgICAgaWYgKGJhY2tpbmdTdG9yZVJlbW92YWwgPT0gUmVtb3ZlRnJvbUJhY2tpbmdTdG9y
ZSkKKyAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJlbW92ZUFsbCgpOworICAgIG1fY291
bnQgPSAwOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnNldENvb2tpZUphcihjb25zdCBjaGFy
KiBmaWxlTmFtZSkKK3sKKyAgICBtX2Nvb2tpZUphckZpbGVOYW1lID0gU3RyaW5nKGZpbGVOYW1l
KTsKKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+b3BlbihtX2Nvb2tpZUphckZpbGVOYW1lKTsK
K30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpjaGVja0FuZFRyZWF0Q29va2llKFBhcnNlZENvb2tp
ZSogY2FuZGlkYXRlQ29va2llLCBCYWNraW5nU3RvcmVSZW1vdmFsIHBvc3RUb0JhY2tpbmdTdG9y
ZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBjaGVja0FuZFRyZWF0Q29va2ll
IC0gcHJvY2Vzc2luZyB1cmwgd2l0aCBkb21haW4gLSAlcyAmIHByb3RvY29sICVzXG4iLCBjYW5k
aWRhdGVDb29raWUtPmRvbWFpbigpLnV0ZjgoKS5kYXRhKCksIGNhbmRpZGF0ZUNvb2tpZS0+cHJv
dG9jb2woKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGNvbnN0IGJvb2wgaWdub3JlRG9tYWluID0g
c2hvdWxkSWdub3JlRG9tYWluKGNhbmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSk7CisKKyAgICAv
LyBEZXRlcm1pbmUgd2hpY2ggcHJvdG9jb2wgdHJlZSB0byBhZGQgdGhlIGNvb2tpZSB0by4gQ3Jl
YXRlIG9uZSBpZiBuZWNlc3NhcnkuCisgICAgQ29va2llTWFwKiBjdXJNYXAgPSAwOworICAgIGlm
IChtX21hbmFnZXJNYXAuY29udGFpbnMoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpKSkKKyAg
ICAgICAgY3VyTWFwID0gbV9tYW5hZ2VyTWFwLmdldChjYW5kaWRhdGVDb29raWUtPnByb3RvY29s
KCkpOworICAgIGVsc2UgeworICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHNlY3VyZSB2ZXJz
aW9uLCBpZiBpdCBpcywgbGluayBpdCB0byB0aGUgbm9uLXNlY3VyZSB2ZXJzaW9uCisgICAgICAg
IC8vIExpbmsgY3VyTWFwIHRvIHRoZSBuZXcgcHJvdG9jb2wgYXMgd2VsbCBhcyB0aGUgb2xkIG9u
ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICAgIGlmIChjYW5kaWRhdGVDb29raWUtPnByb3Rv
Y29sKCkgPT0gImh0dHBzIikgeworICAgICAgICAgICAgY3VyTWFwID0gbV9tYW5hZ2VyTWFwLmdl
dCgiaHR0cCIpOworICAgICAgICAgICAgaWYgKCFjdXJNYXApIHsKKyAgICAgICAgICAgICAgICBj
dXJNYXAgPSBuZXcgQ29va2llTWFwKCJodHRwIik7CisgICAgICAgICAgICAgICAgbV9tYW5hZ2Vy
TWFwLmFkZCgiaHR0cCIsIGN1ck1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBp
ZiAoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpID09ICJ3c3MiKSB7CisgICAgICAgICAgICBj
dXJNYXAgPSBtX21hbmFnZXJNYXAuZ2V0KCJ3cyIpOworICAgICAgICAgICAgaWYgKCFjdXJNYXAp
IHsKKyAgICAgICAgICAgICAgICBjdXJNYXAgPSBuZXcgQ29va2llTWFwKCJ3cyIpOworICAgICAg
ICAgICAgICAgIG1fbWFuYWdlck1hcC5hZGQoIndzIiwgY3VyTWFwKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjdXJNYXAgPSBuZXcgQ29va2llTWFwKGNhbmRp
ZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSk7CisKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5h
Z2VyIC0gYWRkaW5nIHByb3RvY29sIGNvb2tpZW1hcCAtICVzXG4iLCBjdXJNYXAtPmdldE5hbWUo
KS51dGY4KCkuZGF0YSgpKTsKKworICAgICAgICBtX21hbmFnZXJNYXAuYWRkKGNhbmRpZGF0ZUNv
b2tpZS0+cHJvdG9jb2woKSwgY3VyTWFwKTsKKyAgICB9CisKKyAgICAvLyBJZiBwcm90b2NvbCBz
dXBwb3J0IGRvbWFpbiwgd2UgaGF2ZSB0byB0cmF2ZXJzZSB0aGUgZG9tYWluIHRyZWUgdG8gZmlu
ZCB0aGUgcmlnaHQKKyAgICAvLyBjb29raWVNYXAgdG8gaGFuZGxlIHdpdGgKKyAgICBpZiAoIWln
bm9yZURvbWFpbikKKyAgICAgICAgY3VyTWFwID0gZmluZE9yQ3JlYXRlQ29va2llTWFwKGN1ck1h
cCwgY2FuZGlkYXRlQ29va2llLT5kb21haW4oKSwgY2FuZGlkYXRlQ29va2llLT5oYXNFeHBpcmVk
KCkpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgcHJvcGVyIG1hcCBmb3IgdGhpcyBj
b29raWUsIHdlIGNhbiBtb2RpZnkgaXQKKyAgICAvLyBJZiBjb29raWUgZG9lcyBub3QgZXhpc3Qg
YW5kIGhhcyBleHBpcmVkLCBkZWxldGUgaXQKKyAgICAvLyBJZiBjb29raWUgZXhpc3RzIGFuZCBp
dCBoYXMgZXhwaXJlZCwgc28gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwLCBpZiBub3Qg
dXBkYXRlIGl0CisgICAgLy8gSWYgY29va2llIGV4cGlyZWQgYW5kIGNhbWUgZnJvbSB0aGUgQmFj
a2luZ1N0b3JlICh0aGVyZWZvcmUgZG9lcyBub3QgZXhpc3QpLCB3ZSBoYXZlIHRvIHJlbW92ZSBm
cm9tIGRhdGFiYXNlCisgICAgLy8gSWYgY29va2llIGRvZXMgbm90IGV4aXN0ICYgaXQncyB2YWxp
ZCwgYWRkIGl0IHRvIHRoZSBjdXJyZW50IG1hcAorCisgICAgaWYgKGNhbmRpZGF0ZUNvb2tpZS0+
aGFzRXhwaXJlZCgpIHx8IGNhbmRpZGF0ZUNvb2tpZS0+aXNGb3JjZUV4cGlyZWQoKSkgeworICAg
ICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKSB0byBjYXRj
aCBleHBpcmVkIGNvb2tpZXMKKyAgICAgICAgaWYgKHBvc3RUb0JhY2tpbmdTdG9yZSA9PSBCYWNr
aW5nU3RvcmVDb29raWVFbnRyeSkKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5y
ZW1vdmUoY2FuZGlkYXRlQ29va2llKTsKKyAgICAgICAgZWxzZSBpZiAoY3VyTWFwKSB7CisgICAg
ICAgICAgICBib29sIGNvb2tpZUFscmVhZHlFeGlzdHMgPSBjdXJNYXAtPmV4aXN0c0Nvb2tpZShj
YW5kaWRhdGVDb29raWUpOworICAgICAgICAgICAgaWYgKGNvb2tpZUFscmVhZHlFeGlzdHMpIHsK
KyAgICAgICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBleHBpcmVkIGNvb2tp
ZSBleGlzdHMgaW4gbWVtb3J5Iik7CisgICAgICAgICAgICAgICAgYm9vbCBpc0ZvcmNlRXhwaXJl
ZCA9IGNhbmRpZGF0ZUNvb2tpZS0+aXNGb3JjZUV4cGlyZWQoKTsKKyAgICAgICAgICAgICAgICBQ
YXJzZWRDb29raWUqIGV4cGlyZWQgPSBjdXJNYXAtPnJlbW92ZUNvb2tpZShjYW5kaWRhdGVDb29r
aWUpOworICAgICAgICAgICAgICAgIC8vIENvb2tpZSBpcyB1c2VsZXNzLCBSZW1vdmUgdGhlIGNv
b2tpZSBmcm9tIHRoZSBiYWNraW5nc3RvcmUgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAg
Ly8gQmFja3VwIGNoZWNrIGZvciBCYWNraW5nU3RvcmVDb29raWVFbnRyeSBpbmNhc2Ugc29tZW9u
ZSBpbmNvcnJlY3RseSB1c2VzIHRoaXMgZW51bQorICAgICAgICAgICAgICAgIGlmIChwb3N0VG9C
YWNraW5nU3RvcmUgIT0gQmFja2luZ1N0b3JlQ29va2llRW50cnkgJiYgIWV4cGlyZWQtPmlzU2Vz
c2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAt
IGV4cGlyZWQgY29va2llIGlzIG5vbnNlc3Npb24sIGRlbGV0aW5nIGZyb20gZGIiKTsKKyAgICAg
ICAgICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJlbW92ZShleHBpcmVkKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIGV4cGlyZWQ7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZGVsZXRlIGNhbmRpZGF0ZUNvb2tp
ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoY3VyTWFwKTsKKyAgICAgICAgYm9vbCBj
b29raWVBbHJlYWR5RXhpc3RzID0gY3VyTWFwLT5leGlzdHNDb29raWUoY2FuZGlkYXRlQ29va2ll
KTsKKyAgICAgICAgaWYgKGNvb2tpZUFscmVhZHlFeGlzdHMpCisgICAgICAgICAgICB1cGRhdGUo
Y3VyTWFwLCBjYW5kaWRhdGVDb29raWUsIHBvc3RUb0JhY2tpbmdTdG9yZSk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGFkZENvb2tpZVRvTWFwKGN1ck1hcCwgY2FuZGlkYXRlQ29va2llLCBw
b3N0VG9CYWNraW5nU3RvcmUpOworICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjphZGRD
b29raWVUb01hcChDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBjYW5kaWRhdGVD
b29raWUsIEJhY2tpbmdTdG9yZVJlbW92YWwgcG9zdFRvQmFja2luZ1N0b3JlKQoreworICAgIFBh
cnNlZENvb2tpZSogb2xkZXN0Q29va2llID0gMDsKKyAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5v
dCByZWFjaGVkIHRoZSBwZXIgY29va2llIGRvbWFpbiBsaW1pdC4KKyAgICAvLyBJZiB0aGF0IGlz
IG5vdCB0cnVlLCB3ZSBjaGVjayBpZiB0aGUgZ2xvYmFsIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQg
aWYgYmFja2luZ3N0b3JlIG1vZGUgaXMgb24KKyAgICAvLyBUd28gcG9pbnRzOgorICAgIC8vIDEp
IFdlIG9ubHkgZG8gYSBnbG9iYWwgY2hlY2sgaWYgYmFja2luZ3N0b3JlIG1vZGUgaXMgb24gYmVj
YXVzZSB0aGUgZ2xvYmFsIGNvb2tpZSBsaW1pdCBvbmx5CisgICAgLy8gICAgY291bnRzIHNlc3Np
b24gY29va2llcyB0aGF0IGFyZSBzYXZlZCBpbiB0aGUgZGF0YWJhc2UuIElmIHRoZSB1c2VyIGdv
ZXMgb3ZlciB0aGUgbGltaXQKKyAgICAvLyAgICB3aGVuIHRoZXkgYXJlIGluIHByaXZhdGUgbW9k
ZSwgd2Uga25vdyB0aGF0IHRoZSB0b3RhbCBjb29raWUgbGltaXQgd2lsbCBiZSB1bmRlciB0aGUg
bGltaXQKKyAgICAvLyAgICBvbmNlIHRoZSB1c2VyIGdvZXMgYmFjayB0byBub3JtYWwgbW9kZSAo
bWVtb3J5IGRlbGV0ZWQgYW5kIHJlbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlKQorICAgIC8vIDIp
IFdlIHVzZSBlbHNlIGlmIGZvciB0aGlzIHN0YXRlbWVudCBiZWNhdXNlIGlmIHdlIHJlbW92ZSBh
IGNvb2tpZSBpbiB0aGUgMXN0IHN0YXRlbWVudAorICAgIC8vICAgIHRoZW4gaXQgbWVhbnMgdGhl
IGdsb2JhbCBjb3VudCB3aWxsIG5ldmVyIGV4Y2VlZCB0aGUgbGltaXQKKworICAgIENvb2tpZUxp
bWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gbG9jYWwgY291bnQ6ICVkICBnbG9iYWwgY291bnQ6ICVk
IiwgdGFyZ2V0TWFwLT5jb3VudCgpLCBtX2NvdW50KTsKKyAgICBpZiAodGFyZ2V0TWFwLT5jb3Vu
dCgpID49IHNfbWF4Q29va2llQ291bnRQZXJIb3N0KSB7CisgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGRlbGV0aW5nIG9sZGVzdCBjb29raWUgZnJvbSB0aGlzIG1hcCBkdWUgdG8g
ZG9tYWluIGNvdW50LlxuIik7CisgICAgICAgIG9sZGVzdENvb2tpZSA9IHRhcmdldE1hcC0+cmVt
b3ZlT2xkZXN0Q29va2llKCk7CisgICAgfSBlbHNlIGlmIChtX2NvdW50ID49IHNfZ2xvYmFsTWF4
Q29va2llQ291bnQgJiYgKHBvc3RUb0JhY2tpbmdTdG9yZSAhPSBEb05vdFJlbW92ZUZyb21CYWNr
aW5nU3RvcmUpKSB7CisgICAgICAgICAgICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAt
IEdsb2JhbCBsaW1pdCByZWFjaGVkLCBpbml0aWF0ZSBjb29raWUgbGltaXQgY2xlYW4gdXAuIik7
CisgICAgICAgICAgICBpbml0aWF0ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpOworICAgIH0KKworICAg
IENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGFkZGluZyBuZXcgY29va2llIC0gJXMuXG4iLCBj
YW5kaWRhdGVDb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICB0YXJnZXRN
YXAtPmFkZENvb2tpZShjYW5kaWRhdGVDb29raWUpOworCisgICAgLy8gT25seSBhZGQgbm9uIHNl
c3Npb24gY29va2llIHRvIHRoZSBiYWNraW5nIHN0b3JlLgorICAgIGlmIChwb3N0VG9CYWNraW5n
U3RvcmUgPT0gUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSkgeworICAgICAgICBpZiAob2xkZXN0Q29v
a2llICYmICFvbGRlc3RDb29raWUtPmlzU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBDb29raWVM
b2coIkNvb2tpZU1hbmFnZXIgLSBvbGRlc3RDb29raWUgZXhpc3RzLCBkZWxldGluZyBpdCBmcm9t
IGJhY2tpbmdzdG9yZSBhbmQgZGVzdHJ1Y3RpbmcuXG4iKTsKKyAgICAgICAgICAgIG1fY29va2ll
QmFja2luZ1N0b3JlLT5yZW1vdmUob2xkZXN0Q29va2llKTsKKyAgICAgICAgfQorICAgICAgICBp
ZiAoIWNhbmRpZGF0ZUNvb2tpZS0+aXNTZXNzaW9uKCkpCisgICAgICAgICAgICBtX2Nvb2tpZUJh
Y2tpbmdTdG9yZS0+aW5zZXJ0KGNhbmRpZGF0ZUNvb2tpZSk7CisgICAgfQorICAgIGlmIChvbGRl
c3RDb29raWUpCisgICAgICAgIGRlbGV0ZSBvbGRlc3RDb29raWU7Cit9CisKK3ZvaWQgQ29va2ll
TWFuYWdlcjo6dXBkYXRlKENvb2tpZU1hcCogdGFyZ2V0TWFwLCBQYXJzZWRDb29raWUqIG5ld0Nv
b2tpZSwgQmFja2luZ1N0b3JlUmVtb3ZhbCBwb3N0VG9CYWNraW5nU3RvcmUpCit7CisgICAgLy8g
SWYgb2xkIGNvb2tpZSBpcyBub24tc2Vzc2lvbiBhbmQgbmV3IG9uZSBpcywgd2UgaGF2ZSB0byBk
ZWxldGUgaXQgZnJvbSBiYWNraW5nc3RvcmUKKyAgICAvLyBJZiBuZXcgY29va2llIGlzIG5vbi1z
ZXNzaW9uIGFuZCBvbGQgb25lIGlzLCB3ZSBoYXZlIHRvIGFkZCBpdCB0byBiYWNraW5nc3RvcmUK
KyAgICAvLyBJZiBib3RoIHNlc3Npb25zIGFyZSBub24tc2Vzc2lvbiwgdGhlbiB3ZSB1cGRhdGUg
aXQgaW4gdGhlIGJhY2tpbmdzdG9yZQorCisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0g
dXBkYXRpbmcgbmV3IGNvb2tpZSAtICVzLlxuIiwgbmV3Q29va2llLT50b1N0cmluZygpLnV0Zjgo
KS5kYXRhKCkpOworCisgICAgUGFyc2VkQ29va2llKiBvbGRDb29raWUgPSB0YXJnZXRNYXAtPnVw
ZGF0ZUNvb2tpZShuZXdDb29raWUpOworCisgICAgQVNTRVJUKG9sZENvb2tpZSk7CisKKyAgICBi
b29sIG5ld0lzU2Vzc2lvbiA9IG5ld0Nvb2tpZS0+aXNTZXNzaW9uKCk7CisgICAgYm9vbCBvbGRJ
c1Nlc3Npb24gPSBvbGRDb29raWUtPmlzU2Vzc2lvbigpOworCisgICAgaWYgKHBvc3RUb0JhY2tp
bmdTdG9yZSA9PSBSZW1vdmVGcm9tQmFja2luZ1N0b3JlKSB7CisgICAgICAgIGlmICghbmV3SXNT
ZXNzaW9uICYmICFvbGRJc1Nlc3Npb24pCisgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9y
ZS0+dXBkYXRlKG5ld0Nvb2tpZSk7CisgICAgICAgIGVsc2UgaWYgKG5ld0lzU2Vzc2lvbiAmJiAh
b2xkSXNTZXNzaW9uKSB7CisgICAgICAgICAgICAvLyBNdXN0IG1hbnVhbGx5IGRlY3JlYXNlIHRo
ZSBjb3VudGVyIGJlY2F1c2UgaXQgd2FzIG5vdCBjb3VudGVkIHdoZW4KKyAgICAgICAgICAgIC8v
IHRoZSBjb29raWUgd2FzIHJlbW92ZWQgaW4gY29va2llTWFwLgorICAgICAgICAgICAgcmVtb3Zl
ZENvb2tpZSgpOworICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJlbW92ZShvbGRD
b29raWUpOworICAgICAgICB9IGVsc2UgaWYgKCFuZXdJc1Nlc3Npb24gJiYgb2xkSXNTZXNzaW9u
KSB7CisgICAgICAgICAgICAvLyBNdXN0IG1hbnVhbGx5IGluY3JlYXNlIHRoZSBjb3VudGVyIGJl
Y2F1c2UgaXQgd2FzIG5vdCBjb3VudGVkIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSBjb29raWUg
d2FzIGFkZGVkIGluIGNvb2tpZU1hcC4KKyAgICAgICAgICAgIGFkZGVkQ29va2llKCk7CisgICAg
ICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+aW5zZXJ0KG5ld0Nvb2tpZSk7CisgICAgICAg
IH0KKyAgICB9CisgICAgZGVsZXRlIG9sZENvb2tpZTsKK30KKwordm9pZCBDb29raWVNYW5hZ2Vy
OjpnZXRCYWNraW5nU3RvcmVDb29raWVzKCkKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQg
YmUgY2FsbGVkIGp1c3QgYWZ0ZXIgaGF2aW5nIGNyZWF0ZWQgdGhlIGNvb2tpZU1hbmFnZXIKKyAg
ICAvLyBORVZFUiBhZnRlcndhcmRzIQorICAgIEFTU0VSVCghbV9jb3VudCk7CisKKyAgICBWZWN0
b3I8UGFyc2VkQ29va2llKj4gY29va2llczsKKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+Z2V0
Q29va2llc0Zyb21EYXRhYmFzZShjb29raWVzKTsKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFn
ZXIgLSBCYWNraW5nc3RvcmUgaGFzICVkIGNvb2tpZXMsIGxvYWRpbmcgdGhlbSBpbiBtZW1vcnkg
bm93IiwgY29va2llcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29va2ll
cy5zaXplKCk7ICsraSkgeworICAgICAgICBQYXJzZWRDb29raWUqIG5ld0Nvb2tpZSA9IGNvb2tp
ZXNbaV07CisgICAgICAgIGNoZWNrQW5kVHJlYXRDb29raWUobmV3Q29va2llLCBCYWNraW5nU3Rv
cmVDb29raWVFbnRyeSk7CisgICAgfQorfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnNldFByaXZh
dGVNb2RlKGNvbnN0IGJvb2wgbW9kZSkKK3sKKyAgICBpZiAobV9wcml2YXRlTW9kZSA9PSBtb2Rl
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ByaXZhdGVNb2RlID0gbW9kZTsKKyAgICBpZiAo
IW1vZGUpIHsKKyAgICAgICAgcmVtb3ZlQWxsQ29va2llcyhEb05vdFJlbW92ZUZyb21CYWNraW5n
U3RvcmUpOworICAgICAgICBnZXRCYWNraW5nU3RvcmVDb29raWVzKCk7CisgICAgfQorfQorCitD
b29raWVNYXAqIENvb2tpZU1hbmFnZXI6OmZpbmRPckNyZWF0ZUNvb2tpZU1hcChDb29raWVNYXAq
IHByb3RvY29sTWFwLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgYm9vbCBmaW5kT25seSkKK3sKKyAg
ICAvLyBFeHBsb2RlIHRoZSBkb21haW4gd2l0aCB0aGUgJy4nIGRlbGltaXRlcgorICAgIFZlY3Rv
cjxTdHJpbmc+IGRlbGltaXRlZEhvc3Q7CisgICAgZG9tYWluLnNwbGl0KCIuIiwgZGVsaW1pdGVk
SG9zdCk7CisKKyAgICBDb29raWVNYXAqIGN1ck1hcCA9IHByb3RvY29sTWFwOworICAgIHNpemVf
dCBob3N0U2l6ZSA9IGRlbGltaXRlZEhvc3Quc2l6ZSgpOworCisgICAgQ29va2llTG9nKCJDb29r
aWVNYW5hZ2VyIC0gbG9va2luZyBhdCBwcm90b2NvbCBtYXAgJXMgXG4iLCBwcm90b2NvbE1hcC0+
Z2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgLy8gRmluZCAmIGNyZWF0ZSBuZWNlc3Nh
cnkgQ29va2llTWFwcyBieSB0cmF2ZXJzaW5nIGRvd24gdGhlIGRvbWFpbiB0cmVlCisgICAgLy8g
RWFjaCBDb29raWVNYXAgcmVwcmVzZW50IGEgc3Vic2VjdGlvbiBvZiB0aGUgZG9tYWluLCBkZWxp
bWl0ZWQgYnkgIi4iCisgICAgaW50IGkgPSBob3N0U2l6ZSAtIDE7CisgICAgd2hpbGUgKGkgPj0g
MCkgeworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBmaW5kaW5nICVzIGluIGN1
cnJlbnRtYXBcbiIsIGRlbGltaXRlZEhvc3RbaV0udXRmOCgpLmRhdGEoKSk7CisgICAgICAgIENv
b2tpZU1hcCogbmV4dE1hcCA9IGN1ck1hcC0+Z2V0U3ViZG9tYWluTWFwKGRlbGltaXRlZEhvc3Rb
aV0pOworICAgICAgICBpZiAoIW5leHRNYXApIHsKKyAgICAgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGNhbm5vdCBmaW5kIG1hcFxuIik7CisgICAgICAgICAgICBpZiAoZmluZE9u
bHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBDb29raWVMb2coIkNv
b2tpZU1hbmFnZXIgLSBjcmVhdGluZyAlcyBpbiBjdXJyZW50bWFwICVzXG4iLCBkZWxpbWl0ZWRI
b3N0W2ldLnV0ZjgoKS5kYXRhKCksIGN1ck1hcC0+Z2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOwor
ICAgICAgICAgICAgbmV4dE1hcCA9IG5ldyBDb29raWVNYXAoZGVsaW1pdGVkSG9zdFtpXSk7Cisg
ICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBhZGRpbmcgc3ViZG9tYWluIHRv
IG1hcFxuIik7CisgICAgICAgICAgICBjdXJNYXAtPmFkZFN1YmRvbWFpbk1hcChkZWxpbWl0ZWRI
b3N0W2ldLCBuZXh0TWFwKTsKKyAgICAgICAgfQorICAgICAgICBjdXJNYXAgPSBuZXh0TWFwOwor
ICAgICAgICBpLS07CisgICAgfQorICAgIHJldHVybiBjdXJNYXA7Cit9CisKKwordm9pZCBDb29r
aWVNYW5hZ2VyOjpyZW1vdmVDb29raWVXaXRoTmFtZShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0
cmluZyYgY29va2llTmFtZSkKK3sKKyAgICAvLyBXZSBnZXQgYWxsIGNvb2tpZXMgZnJvbSBhbGwg
ZG9tYWlucyB0aGF0IGRvbWFpbiBtYXRjaGVzIHRoZSByZXF1ZXN0IGRvbWFpbgorICAgIC8vIGFu
ZCBkZWxldGUgYW55IGNvb2tpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdGhhdCBwYXRoIG1h
dGNoZXMgdGhlIHJlcXVlc3QgcGF0aAorICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiByZXN1bHRz
OworICAgIGdldFJhd0Nvb2tpZXMocmVzdWx0cywgdXJsLCBXaXRoSHR0cE9ubHlDb29raWVzKTsK
KyAgICAvLyBEZWxldGUgdGhlIGNvb2tpZXMgdGhhdCBwYXRoIG1hdGNoZXMgdGhlIHJlcXVlc3Qg
cGF0aAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgewor
ICAgICAgICBQYXJzZWRDb29raWUqIGNvb2tpZSA9IHJlc3VsdHNbaV07CisgICAgICAgIGlmICgh
ZXF1YWxJZ25vcmluZ0Nhc2UoY29va2llLT5uYW1lKCksIGNvb2tpZU5hbWUpKQorICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIGlmICh1cmwucGF0aCgpLnN0YXJ0c1dpdGgoY29va2llLT5w
YXRoKCksIGZhbHNlKSkgeworICAgICAgICAgICAgY29va2llLT5mb3JjZUV4cGlyZSgpOworICAg
ICAgICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShjb29raWUsIFJlbW92ZUZyb21CYWNraW5nU3Rv
cmUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmluaXRpYXRl
Q29va2llTGltaXRDbGVhblVwKCkKK3sKKyAgICBpZiAoIW1fbGltaXRUaW1lci5pc0FjdGl2ZSgp
KSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIFN0YXJ0aW5nIGEgdGltZXIg
Zm9yIGNvb2tpZSBjbGVhbnVwIik7CisgICAgICAgIG1fbGltaXRUaW1lci5zdGFydE9uZVNob3Qo
c19kZWxheVRvU3RhcnRDb29raWVDbGVhbnVwKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQ29va2ll
TG9nKCJDb29raWVNYW5hZ2VyIC0gQ29va2llIGNsZWFudXAgdGltZXIgYWxyZWFkeSBydW5uaW5n
Iik7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6Y29va2llTGltaXRDbGVhblVwKFRpbWVyPENv
b2tpZU1hbmFnZXI+KiB0aW1lcikKK3sKKyAgICBBU1NFUlRfVU5VU0VEKHRpbWVyLCB0aW1lciA9
PSAmbV9saW1pdFRpbWVyKTsKKworICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0g
U3RhcnRpbmcgY29va2llIGNsZWFuIHVwIik7CisKKyAgICBzaXplX3QgbnVtYmVyT2ZDb29raWVz
T3ZlckxpbWl0ID0gKG1fY291bnQgPiBzX2dsb2JhbE1heENvb2tpZUNvdW50KSA/IG1fY291bnQg
LSBzX2dsb2JhbE1heENvb2tpZUNvdW50IDogMDsKKyAgICBzaXplX3QgYW1vdW50VG9EZWxldGUg
PSBzX2Nvb2tpZXNUb0RlbGV0ZVdoZW5MaW1pdFJlYWNoZWQgKyBudW1iZXJPZkNvb2tpZXNPdmVy
TGltaXQ7CisKKyAgICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIEV4Y2VzczogJWQg
IEFtb3VudCB0byBEZWxldGU6ICVkIiwgbnVtYmVyT2ZDb29raWVzT3ZlckxpbWl0LCBhbW91bnRU
b0RlbGV0ZSk7CisKKyAgICAvLyBDYWxsIHRoZSBkYXRhYmFzZSB0byBkZWxldGUgJ2Ftb3VudFRv
RGVsZXRlJyBvZiBjb29raWVzCisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IGNvb2tpZXNUb0Rl
bGV0ZTsKKyAgICBjb29raWVzVG9EZWxldGUucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShhbW91bnRU
b0RlbGV0ZSk7CisKKyAgICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIENhbGxpbmcg
ZGF0YWJhc2UgdG8gY2xlYW4gdXAiKTsKKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+Z2V0Q29v
a2llc0Zyb21EYXRhYmFzZShjb29raWVzVG9EZWxldGUsIGFtb3VudFRvRGVsZXRlKTsKKworICAg
IC8vIENvb2tpZXMgYXJlIG9yZGVyZWQgaW4gQVNDIG9yZGVyIGJ5IGxhc3RBY2Nlc3NlZAorICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYW1vdW50VG9EZWxldGU7ICsraSkgeworICAgICAgICAv
LyBFeHBpcmUgdGhlbSBhbmQgY2FsbCBjaGVja2FuZHRyZWF0IHRvIGRlbGV0ZSB0aGVtIGZyb20g
bWVtb3J5IGFuZCBkYXRhYmFzZQorICAgICAgICBQYXJzZWRDb29raWUqIG5ld0Nvb2tpZSA9IGNv
b2tpZXNUb0RlbGV0ZVtpXTsKKyAgICAgICAgQ29va2llTGltaXRMb2coIkNvb2tpZU1hbmFnZXIg
LSBFeHBpcmUgY29va2llOiAlcyBhbmQgZGVsZXRlIiwgbmV3Q29va2llLT50b1N0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworICAgICAgICBuZXdDb29raWUtPmZvcmNlRXhwaXJlKCk7CisgICAgICAg
IGNoZWNrQW5kVHJlYXRDb29raWUobmV3Q29va2llLCBSZW1vdmVGcm9tQmFja2luZ1N0b3JlKTsK
KyAgICB9CisKKyAgICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIENvb2tpZSBjbGVh
biB1cCBjb21wbGV0ZS4iKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmggYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi43NDJmOTE3ZGFiNTAyOGQxMmVlZWI2MGY1NjFmODI1YmYyMGViY2VhCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2Vy
LmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVs
aWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIENvb2tpZU1hbmFnZXJfaAorI2RlZmluZSBDb29raWVNYW5hZ2VyX2gKKworI2luY2x1
ZGUgIkNvb2tpZU1hcC5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsKK2NsYXNzIFBhcnNl
ZENvb2tpZTsKK2NsYXNzIEtVUkw7CisKK2VudW0gQmFja2luZ1N0b3JlUmVtb3ZhbCB7CisgICAg
UmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSwKKyAgICBCYWNraW5nU3RvcmVDb29raWVFbnRyeSwKKyAg
ICBEb05vdFJlbW92ZUZyb21CYWNraW5nU3RvcmUKK307CisKK2VudW0gSHR0cE9ubHlDb29raWVG
aWx0ZXJpbmcgeworICAgIE5vSHR0cE9ubHlDb29raWUsCisgICAgV2l0aEh0dHBPbmx5Q29va2ll
cywKK307CisKK2VudW0gQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeSB7CisgICAgQ29va2llU3Rv
cmFnZUFjY2VwdFBvbGljeUFsd2F5cyA9IDAsCisgICAgQ29va2llU3RvcmFnZUFjY2VwdFBvbGlj
eU5ldmVyLAorICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lPbmx5RnJvbU1haW5Eb2N1bWVu
dERvbWFpbgorfTsKKworLyoKKyAgKiBUaGUgQ29va2llTWFuYWdlciBjbGFzcyBpcyBhIHNpbmds
ZXRvbiBjbGFzcyB0aGF0IGhhbmRsZXMgYW5kIHNlbGVjdGl2ZWx5IHBlcnNpc3RzCisgICogaW5j
b21pbmcgY29va2llcy4gVGhpcyBjbGFzcyBjb250YWlucyBhIHRyZWUgb2YgZG9tYWlucyBmb3Ig
cXVpY2tlcgorICAqIGNvb2tpZSBkb21haW4gbG9va3VwLiBUaGUgdG9wIG9mIHRoZSB0cmVlIHJl
cHJlc2VudHMgYSBudWxsIHZhbHVlIGZvciBhIG51bGwgZG9tYWluLgorICAqIFRoZSBudWxsIGRv
bWFpbiBjb250YWlucyByZWZlcmVuY2VzIHRvIHRvcCBsZXZlbCBkb21haW5zIGFuZCBlYWNoIG5v
ZGUgYmVsb3cKKyAgKiByZXByZXNlbnRzIGEgc3ViLXNlY3Rpb24gb2YgYSBkb21haW4sIGRlbGlt
aXRlZCBieSAiLiIKKyAgKgorICAqIElmIGEgY29va2llIGhhcyBhIGRvbWFpbiAiYS5iLmNvbSIs
IGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBub2RlIG5hbWVkICJhIiBpbiB0aGlzIHRyZWUuCisg
ICogaW4gdGhlIGJyYW5jaCAiIi0+ImNvbSItPiJiIi0+ImEiCisgICoKKyAgKiBDb29raWUgc3Bl
Y3MgZm9sbG93IHRoZSBSRkM2MjY1IHNwZWMgc2hlZXQuCisgICogaHR0cDovL3Rvb2xzLmlldGYu
b3JnL2h0bWwvcmZjNjI2NQorICAqLworCitjbGFzcyBDb29raWVNYW5hZ2VyIHsKK3B1YmxpYzoK
KworICAgIGJvb2wgY2FuTG9jYWxBY2Nlc3NBbGxDb29raWVzKCkgY29uc3QgeyByZXR1cm4gbV9z
aG91bGREdW1wQWxsQ29va2llczsgfQorICAgIHZvaWQgc2V0Q2FuTG9jYWxBY2Nlc3NBbGxDb29r
aWVzKGJvb2wgZW5hYmxlZCkgeyBtX3Nob3VsZER1bXBBbGxDb29raWVzID0gZW5hYmxlZDsgfQor
CisgICAgdm9pZCBzZXRDb29raWVzKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHZhbHVlKTsK
KworICAgIHZvaWQgcmVtb3ZlQWxsQ29va2llcyhCYWNraW5nU3RvcmVSZW1vdmFsKTsKKyAgICB2
b2lkIHJlbW92ZUNvb2tpZVdpdGhOYW1lKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIGNvb2tp
ZU5hbWUpOworCisgICAgdW5zaWduZWQgc2hvcnQgY29va2llc0NvdW50KCkgY29uc3QgeyByZXR1
cm4gbV9jb3VudDsgfQorCisgICAgdm9pZCBzZXRDb29raWVKYXIoY29uc3QgY2hhciopOworICAg
IGNvbnN0IFN0cmluZyYgY29va2llSmFyKCkgY29uc3QgeyByZXR1cm4gbV9jb29raWVKYXJGaWxl
TmFtZTsgfQorCisgICAgLy8gQ291bnQgdXBkYXRlIG1ldGhvZAorICAgIHZvaWQgcmVtb3ZlZENv
b2tpZSgpCisgICAgeworICAgICAgICBBU1NFUlQobV9jb3VudCA+IDApOworICAgICAgICAtLW1f
Y291bnQ7CisgICAgfQorICAgIHZvaWQgYWRkZWRDb29raWUoKSB7ICsrbV9jb3VudDsgfQorCisg
ICAgLy8gQ29uc3RhbnRzIGdldHRlci4KKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IG1heENvb2tp
ZUxlbmd0aCgpIHsgcmV0dXJuIHNfbWF4Q29va2llTGVuZ3RoOyB9CisKKyAgICB2b2lkIHNldENv
b2tpZVBvbGljeShDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5IHBvbGljeSkgeyBtX3BvbGljeSA9
IHBvbGljeTsgfQorICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kgY29va2llUG9saWN5KCkg
Y29uc3QgeyByZXR1cm4gbV9wb2xpY3k7IH0KKyAgICB2b2lkIHNldFByaXZhdGVNb2RlKGNvbnN0
IGJvb2wpOworCisgICAgU3RyaW5nIGdldENvb2tpZShjb25zdCBLVVJMJiByZXF1ZXN0VVJMLCBI
dHRwT25seUNvb2tpZUZpbHRlcmluZykgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIGFsbCBjb29r
aWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFVSTCBhcyByYXcgY29v
a2llcy4KKyAgICB2b2lkIGdldFJhd0Nvb2tpZXMoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFj
a09mQ29va2llcywgY29uc3QgS1VSTCYgcmVxdWVzdFVSTCwgSHR0cE9ubHlDb29raWVGaWx0ZXJp
bmcgPSBXaXRoSHR0cE9ubHlDb29raWVzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQg
Q29va2llTWFuYWdlciYgY29va2llTWFuYWdlcigpOworCisgICAgQ29va2llTWFuYWdlcigpOwor
ICAgIH5Db29raWVNYW5hZ2VyKCk7CisKKyAgICB2b2lkIGNoZWNrQW5kVHJlYXRDb29raWUoUGFy
c2VkQ29va2llKiBjYW5kaWRhdGVDb29raWUsIEJhY2tpbmdTdG9yZVJlbW92YWwgcG9zdFRvQmFj
a2luZ1N0b3JlKTsKKworICAgIGJvb2wgc2hvdWxkUmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24oY29u
c3QgUGFyc2VkQ29va2llKiwgY29uc3QgS1VSTCYpOworCisgICAgdm9pZCBhZGRDb29raWVUb01h
cChDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBjYW5kaWRhdGVDb29raWUsIEJh
Y2tpbmdTdG9yZVJlbW92YWwgcG9zdFRvQmFja2luZ1N0b3JlKTsKKyAgICB2b2lkIHVwZGF0ZShD
b29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBuZXdDb29raWUsIEJhY2tpbmdTdG9y
ZVJlbW92YWwgcG9zdFRvQmFja2luZ1N0b3JlKTsKKworICAgIENvb2tpZU1hcCogZmluZE9yQ3Jl
YXRlQ29va2llTWFwKENvb2tpZU1hcCogcHJvdG9jb2xNYXAsIGNvbnN0IFN0cmluZyYgZG9tYWlu
LCBib29sIGZpbmRPbmx5KTsKKworICAgIHZvaWQgaW5pdGlhdGVDb29raWVMaW1pdENsZWFuVXAo
KTsKKyAgICB2b2lkIGNvb2tpZUxpbWl0Q2xlYW5VcChUaW1lcjxDb29raWVNYW5hZ2VyPiopOwor
CisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+IG1fbWFuYWdlck1hcDsKKworICAgIC8v
IENvdW50IGFsbCBjb29raWVzLCBjb29raWVzIGFyZSBsaW1pdGVkIGJ5IG1heF9jb3VudAorICAg
IHVuc2lnbmVkIHNob3J0IG1fY291bnQ7CisKKyAgICBib29sIG1fcHJpdmF0ZU1vZGU7CisgICAg
Ym9vbCBtX3Nob3VsZER1bXBBbGxDb29raWVzOworCisgICAgU3RyaW5nIG1fY29va2llSmFyRmls
ZU5hbWU7CisKKyAgICAvLyBGSVhNRTogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlbW92ZWQuCisg
ICAgdm9pZCBnZXRCYWNraW5nU3RvcmVDb29raWVzKCk7CisKKyAgICAvLyBNYXggY291bnQgY29u
c3RhbnRzLgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc19nbG9iYWxNYXhDb29raWVD
b3VudCA9IDYwMDA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzX21heENvb2tpZUNv
dW50UGVySG9zdCA9IDYwOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc19jb29raWVz
VG9EZWxldGVXaGVuTGltaXRSZWFjaGVkID0gNjA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGludCBzX2RlbGF5VG9TdGFydENvb2tpZUNsZWFudXAgPSAxMDsKKyAgICAvLyBDb29raWUgc2l6
ZSBsaW1pdCBvZiA0a0IgYXMgYWR2aXNlZCBwZXIgUkZDMjEwOQorICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBpbnQgc19tYXhDb29raWVMZW5ndGggPSA0MDk2OworCisgICAgLy8gTWF4aW11bSBj
b29raWUgaGVhZGVyIHN0cmluZyBzaXplIHRoYXQgd2UgY2FuIHNlbmQKKyAgICBzdGF0aWMgY29u
c3Qgc2l6ZV90IHNfbWF4Q29va2llSGVhZGVyU3RyaW5nTGVuZ3RoID0gMiAqICgzICsgc19tYXhD
b29raWVMZW5ndGgpICogc19tYXhDb29raWVDb3VudFBlckhvc3Q7CisKKyAgICBDb29raWVTdG9y
YWdlQWNjZXB0UG9saWN5IG1fcG9saWN5OworCisgICAgQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmUqIG1fY29va2llQmFja2luZ1N0b3JlOworICAgIFRpbWVyPENvb2tpZU1hbmFnZXI+IG1fbGlt
aXRUaW1lcjsKK307CisKKy8vIEdldCB0aGUgZ2xvYmFsIGluc3RhbmNlLgorQ29va2llTWFuYWdl
ciYgY29va2llTWFuYWdlcigpOworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBDb29raWVNYW5hZ2VyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Js
YWNrYmVycnkvQ29va2llTWFwLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVy
cnkvQ29va2llTWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lODQ1MTEzNjRmYzY1MGI5MGU1MGY3ODBhNGJk
MjdjYWFhMzk3NmMxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
YmxhY2tiZXJyeS9Db29raWVNYXAuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4LCAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21h
aWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBFTkFCTEVfQ09PS0lFX0RFQlVHIDAKKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvb2tpZU1hcC5oIgorCisjaW5jbHVkZSAiQ29v
a2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29r
aWUuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKKyNpZiBFTkFCTEVfQ09PS0lF
X0RFQlVHCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjZGVmaW5lIENvb2tp
ZUxvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vs
c2UKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVOQUJMRV9DT09L
SUVfREVCVUcKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb29raWVNYXA6OkNvb2tpZU1hcChj
b25zdCBTdHJpbmcmIG5hbWUpCisgICAgOiBtX29sZGVzdENvb2tpZSgwKQorICAgICwgbV9uYW1l
KG5hbWUpCit7Cit9CisKK0Nvb2tpZU1hcDo6fkNvb2tpZU1hcCgpCit7CisgICAgLy8gVGhlcmUg
aXMgbm8gbmVlZCB0byBkZWxldGUgbV9vbGRlc3RDb29raWUgYXMgaXQgaXMgaGFuZGxlZCBpbiBk
ZWxldGluZyBtX2Nvb2tpZU1hcAorICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2Nvb2tpZU1hcCk7Cisg
ICAgbV9jb29raWVNYXAuY2xlYXIoKTsKKyAgICBkZWxldGVBbGxWYWx1ZXMobV9zdWJkb21haW5z
KTsKKyAgICBtX3N1YmRvbWFpbnMuY2xlYXIoKTsKK30KKworYm9vbCBDb29raWVNYXA6OmV4aXN0
c0Nvb2tpZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkgY29uc3QKK3sKKyAgICBTdHJpbmcg
a2V5ID0gY29va2llLT5uYW1lKCkgKyBjb29raWUtPnBhdGgoKTsKKyAgICByZXR1cm4gbV9jb29r
aWVNYXAuY29udGFpbnMoa2V5KTsKK30KKwordm9pZCBDb29raWVNYXA6OmFkZENvb2tpZShQYXJz
ZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICBTdHJpbmcga2V5ID0gY29va2llLT5uYW1lKCkgKyBj
b29raWUtPnBhdGgoKTsKKworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gQXR0ZW1wdGluZyB0
byBhZGQgY29va2llIC0gJXMiLCBjb29raWUtPm5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKworICAg
IEFTU0VSVCghbV9jb29raWVNYXAuY29udGFpbnMoa2V5KSk7CisgICAgbV9jb29raWVNYXAuYWRk
KGtleSwgY29va2llKTsKKyAgICBpZiAoIWNvb2tpZS0+aXNTZXNzaW9uKCkpCisgICAgICAgIGNv
b2tpZU1hbmFnZXIoKS5hZGRlZENvb2tpZSgpOworICAgIGlmICghbV9vbGRlc3RDb29raWUgfHwg
bV9vbGRlc3RDb29raWUtPmxhc3RBY2Nlc3NlZCgpID4gY29va2llLT5sYXN0QWNjZXNzZWQoKSkK
KyAgICAgICAgbV9vbGRlc3RDb29raWUgPSBjb29raWU7Cit9CisKK1BhcnNlZENvb2tpZSogQ29v
a2llTWFwOjp1cGRhdGVDb29raWUoUGFyc2VkQ29va2llKiBuZXdDb29raWUpCit7CisgICAgU3Ry
aW5nIGtleSA9IG5ld0Nvb2tpZS0+bmFtZSgpICsgbmV3Q29va2llLT5wYXRoKCk7CisgICAgUGFy
c2VkQ29va2llKiBvbGRDb29raWUgPSBtX2Nvb2tpZU1hcC50YWtlKGtleSk7CisgICAgQVNTRVJU
KG9sZENvb2tpZSk7CisgICAgbV9jb29raWVNYXAuYWRkKGtleSwgbmV3Q29va2llKTsKKyAgICBp
ZiAob2xkQ29va2llID09IG1fb2xkZXN0Q29va2llKQorICAgICAgICB1cGRhdGVPbGRlc3RDb29r
aWUoKTsKKyAgICByZXR1cm4gb2xkQ29va2llOworfQorCitQYXJzZWRDb29raWUqIENvb2tpZU1h
cDo6cmVtb3ZlQ29va2llKGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llKQoreworICAgIC8vIEZp
bmQgYSBwcmV2aW91cyBlbnRyeSBmb3IgZGVsZXRpb24KKyAgICBTdHJpbmcga2V5ID0gY29va2ll
LT5uYW1lKCkgKyBjb29raWUtPnBhdGgoKTsKKyAgICBQYXJzZWRDb29raWUqIHByZXZDb29raWUg
PSBtX2Nvb2tpZU1hcC50YWtlKGtleSk7CisKKyAgICBpZiAoIXByZXZDb29raWUpCisgICAgICAg
IHJldHVybiAwOworCisgICAgaWYgKHByZXZDb29raWUgPT0gbV9vbGRlc3RDb29raWUpCisgICAg
ICAgIHVwZGF0ZU9sZGVzdENvb2tpZSgpOworICAgIGVsc2UgaWYgKHByZXZDb29raWUgIT0gY29v
a2llKSB7CisgICAgICAgIC8vIFRoZSBjb29raWUgd2UgdXNlZCB0byBzZWFyY2ggaXMgZm9yY2Ug
ZXhwaXJlZCwgd2UgbXVzdCBkbyB0aGUgc2FtZQorICAgICAgICAvLyB0byB0aGUgY29va2llIGlu
IG1lbW9yeSB0b28uCisgICAgICAgIGlmIChjb29raWUtPmlzRm9yY2VFeHBpcmVkKCkpCisgICAg
ICAgICAgICBwcmV2Q29va2llLT5mb3JjZUV4cGlyZSgpOworICAgICAgICBkZWxldGUgY29va2ll
OworICAgIH0KKworICAgIGlmICghcHJldkNvb2tpZS0+aXNTZXNzaW9uKCkpCisgICAgICAgIGNv
b2tpZU1hbmFnZXIoKS5yZW1vdmVkQ29va2llKCk7CisgICAgcmV0dXJuIHByZXZDb29raWU7Cit9
CisKK0Nvb2tpZU1hcCogQ29va2llTWFwOjpnZXRTdWJkb21haW5NYXAoY29uc3QgU3RyaW5nJiBz
dWJkb21haW4pCit7CisjaWYgRU5BQkxFX0NPT0tJRV9ERUJVRworICAgIGlmICghbV9zdWJkb21h
aW5zLmNvbnRhaW5zKHN1YmRvbWFpbikpCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0g
JXMgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBtYXAiLCBzdWJkb21haW4udXRmOCgpLmRhdGEoKSk7
CisjZW5kaWYKKyAgICByZXR1cm4gbV9zdWJkb21haW5zLmdldChzdWJkb21haW4pOworfQorCit2
b2lkIENvb2tpZU1hcDo6YWRkU3ViZG9tYWluTWFwKGNvbnN0IFN0cmluZyYgc3ViZG9tYWluLCBD
b29raWVNYXAqIG5ld0RvbWFpbikKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVt
cHRpbmcgdG8gYWRkIHN1YmRvbWFpbiAtICVzIiwgc3ViZG9tYWluLnV0ZjgoKS5kYXRhKCkpOwor
ICAgIG1fc3ViZG9tYWlucy5hZGQoc3ViZG9tYWluLCBuZXdEb21haW4pOworfQorCit2b2lkIENv
b2tpZU1hcDo6Z2V0QWxsQ29va2llcyhWZWN0b3I8UGFyc2VkQ29va2llKj4qIHN0YWNrT2ZDb29r
aWVzKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gQXR0ZW1wdGluZyB0byBjb3B5IE1h
cDolcyBjb29raWVzIHdpdGggJWQgY29va2llcyBpbnRvIHZlY3RvcnMiLCBtX25hbWUudXRmOCgp
LmRhdGEoKSwgbV9jb29raWVNYXAuc2l6ZSgpKTsKKworICAgIFZlY3RvcjxQYXJzZWRDb29raWUq
PiBuZXdDb29raWVzOworICAgIGNvcHlWYWx1ZXNUb1ZlY3RvcihtX2Nvb2tpZU1hcCwgbmV3Q29v
a2llcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdDb29raWVzLnNpemUoKTsgaSsr
KSB7CisgICAgICAgIFBhcnNlZENvb2tpZSogbmV3Q29va2llID0gbmV3Q29va2llc1tpXTsKKyAg
ICAgICAgaWYgKG5ld0Nvb2tpZS0+aGFzRXhwaXJlZCgpKSB7CisgICAgICAgICAgICAvLyBOb3Rp
Y2UgdGhhdCB3ZSBkb24ndCBkZWxldGUgZnJvbSBiYWNraW5nc3RvcmUuIFRoZXNlIGV4cGlyZWQg
Y29va2llcyB3aWxsIGJlCisgICAgICAgICAgICAvLyBkZWxldGVkIHdoZW4gbWFuYWdlciBsb2Fk
cyB0aGUgYmFja2luZ3N0b3JlIGFnYWluLgorICAgICAgICAgICAgUGFyc2VkQ29va2llKiBleHBp
cmVkID0gcmVtb3ZlQ29va2llKG5ld0Nvb2tpZSk7CisgICAgICAgICAgICBkZWxldGUgZXhwaXJl
ZDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzdGFja09mQ29va2llcy0+YXBwZW5kKG5l
d0Nvb2tpZSk7CisgICAgfQorCisgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSBzdGFjayBvZiBj
b29raWVzIG5vdyBoYXZlICVkIGNvb2tpZXMgaW4gaXQiLCAoKnN0YWNrT2ZDb29raWVzKS5zaXpl
KCkpOworCit9CisKK1BhcnNlZENvb2tpZSogQ29va2llTWFwOjpyZW1vdmVPbGRlc3RDb29raWUo
KQoreworICAgIC8vIEZJWE1FOiBNYWtlIHN1cmUgaXQgZmluZHMgdGhlIEdMT0JBTCBvbGRlc3Qg
Y29va2llLCBub3QgdGhlIGZpcnN0IG9sZGVzdGNvb2tpZSBpdCBmaW5kcy4KKyAgICBQYXJzZWRD
b29raWUqIG9sZGVzdENvb2tpZSA9IG1fb2xkZXN0Q29va2llOworCisgICAgLy8gSWYgdGhpcyBt
YXAgaGFzIGFuIG9sZGVzdENvb2tpZSwgcmVtb3ZlIGl0LiBJZiBub3QsIGRvIGEgREZTIHRvIHNl
YXJjaCBmb3IgYSBjaGlsZCB0aGF0IGRvZXMKKyAgICBpZiAoIW9sZGVzdENvb2tpZSkgeworCisg
ICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gbm8gb2xkZXN0Q29va2llIGV4aXN0Iik7CisK
KyAgICAgICAgLy8gQmFzZSBjYXNlIGlzIGlmIHRoZSBtYXAgaGFzIG5vIGNoaWxkIGFuZCBubyBj
b29raWVzLCB3ZSByZXR1cm4gYSBudWxsLgorICAgICAgICBpZiAoIW1fc3ViZG9tYWlucy5zaXpl
KCkpIHsKKyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gbm8gc3ViZG9tYWlucywg
YmFzZSBjYXNlIHJlYWNoZWQsIHJldHVybiAwIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgfQorCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gbG9va2luZyBpbnRvIHN1
YmRvbWFpbnMiKTsKKworICAgICAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6
aXRlcmF0b3IgaXQgPSBtX3N1YmRvbWFpbnMuYmVnaW4oKTsgaXQgIT0gbV9zdWJkb21haW5zLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgICAgICBvbGRlc3RDb29raWUgPSBpdC0+c2Vjb25kLT5yZW1v
dmVPbGRlc3RDb29raWUoKTsKKyAgICAgICAgICAgIGlmIChvbGRlc3RDb29raWUpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDb29raWVM
b2coIkNvb2tpZU1hcCAtIG9sZGVzdENvb2tpZSBleGlzdC4iKTsKKyAgICAgICAgb2xkZXN0Q29v
a2llID0gcmVtb3ZlQ29va2llKG1fb2xkZXN0Q29va2llKTsKKyAgICB9CisKKyAgICByZXR1cm4g
b2xkZXN0Q29va2llOworfQorCit2b2lkIENvb2tpZU1hcDo6dXBkYXRlT2xkZXN0Q29va2llKCkK
K3sKKyAgICBpZiAoIW1fY29va2llTWFwLnNpemUoKSkKKyAgICAgICAgbV9vbGRlc3RDb29raWUg
PSAwOworICAgIGVsc2UgeworICAgICAgICBIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj46
Oml0ZXJhdG9yIGl0ID0gbV9jb29raWVNYXAuYmVnaW4oKTsKKyAgICAgICAgbV9vbGRlc3RDb29r
aWUgPSBpdC0+c2Vjb25kOworICAgICAgICArK2l0OworICAgICAgICBmb3IgKDsgaXQgIT0gbV9j
b29raWVNYXAuZW5kKCk7ICsraXQpCisgICAgICAgICAgICBpZiAobV9vbGRlc3RDb29raWUtPmxh
c3RBY2Nlc3NlZCgpID4gaXQtPnNlY29uZC0+bGFzdEFjY2Vzc2VkKCkpCisgICAgICAgICAgICAg
ICAgbV9vbGRlc3RDb29raWUgPSBpdC0+c2Vjb25kOworICAgIH0KK30KKwordm9pZCBDb29raWVN
YXA6OmRlbGV0ZUFsbENvb2tpZXNBbmREb21haW5zKCkKK3sKKyAgICBIYXNoTWFwPFN0cmluZywg
Q29va2llTWFwKj46Oml0ZXJhdG9yIGZpcnN0ID0gbV9zdWJkb21haW5zLmJlZ2luKCk7CisgICAg
SGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBlbmQgPSBtX3N1YmRvbWFpbnMu
ZW5kKCk7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46Oml0ZXJhdG9yIGl0
ID0gZmlyc3Q7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisK
KyAgICBIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj46Oml0ZXJhdG9yIGZpcnN0Q29va2ll
SXRlcmF0b3IgPSBtX2Nvb2tpZU1hcC5iZWdpbigpOworICAgIEhhc2hNYXA8U3RyaW5nLCBQYXJz
ZWRDb29raWUqPjo6aXRlcmF0b3IgZW5kQ29va2llSXRlcmF0b3IgPSBtX2Nvb2tpZU1hcC5lbmQo
KTsKKyAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBQYXJzZWRDb29raWUqPjo6aXRlcmF0b3IgaXQg
PSBmaXJzdENvb2tpZUl0ZXJhdG9yOyBpdCAhPSBlbmRDb29raWVJdGVyYXRvcjsgKytpdCkKKyAg
ICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisKKyAgICBtX3N1YmRvbWFpbnMuY2xlYXIoKTsKKyAg
ICBtX2Nvb2tpZU1hcC5jbGVhcigpOworCisgICAgbV9vbGRlc3RDb29raWUgPSAwOworfQorCit2
b2lkIENvb2tpZU1hcDo6Z2V0QWxsQ2hpbGRDb29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiog
c3RhY2tPZkNvb2tpZXMpCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSBnZXRBbGxDaGls
ZENvb2tpZXMgaW4gTWFwIC0gJXMiLCBnZXROYW1lKCkudXRmOCgpLmRhdGEoKSk7CisgICAgZ2V0
QWxsQ29va2llcyhzdGFja09mQ29va2llcyk7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29v
a2llTWFwKj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJkb21haW5zLmJlZ2luKCk7IGl0ICE9IG1fc3Vi
ZG9tYWlucy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWxsQ2hpbGRDb29r
aWVzKHN0YWNrT2ZDb29raWVzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYXAuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YmM4ZDM0NGU1ZmViOGE1YjA5ZTFkZTY3NjRiMmFkYmYzMjdjYjdhMgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmgKQEAgLTAs
MCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVu
LmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENvb2tpZU1hcF9oCisj
ZGVmaW5lIENvb2tpZU1hcF9oCisKKyNpbmNsdWRlICJIYXNoTWFwLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJWZWN0b3IuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9T
dHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2VkQ29va2ll
OworCisvKiBBIGNvb2tpZSBtYXAgaXMgYSBub2RlIGluIHRoZSB0cmVlIGhlbGQgYnkgQ29va2ll
TWFuYWdlciB0aGF0IHJlcHJlc2VudHMKKyAqIGNvb2tpZXMgdGhhdCBtYXRjaGVzIGEgY29tbW9u
IGRvbWFpbi4KKyAqCisgKiBBIENvb2tpZU1hcCBob2xkcyByZWZlcmVuY2UgdG8gdGhlIGNvb2tp
ZXMgdGhhdCBpdCBjb250YWlucyBhbmQgdGhlIGNoaWxkCisgKiBkb21haW5zIHRoYXQgZXhpc3Qg
d2l0aGluIHRoZSB0cmVlLgorICoKKyAqIFRoZSBudW1iZXIgb2YgY29va2llIHBlciBob3N0IGlz
IGxpbWl0ZWQgYnkgQ29va2llTWFuYWdlcjo6c19tYXhDb29raWVDb3VudFBlckhvc3QKKyAqLwor
CitjbGFzcyBDb29raWVNYXAgeworCitwdWJsaWM6CisgICAgQ29va2llTWFwKGNvbnN0IFN0cmlu
ZyYgbmFtZSA9ICIiKTsKKyAgICB+Q29va2llTWFwKCk7CisKKyAgICB1bnNpZ25lZCBpbnQgY291
bnQoKSBjb25zdCB7IHJldHVybiBtX2Nvb2tpZU1hcC5zaXplKCk7IH0KKyAgICBjb25zdCBTdHJp
bmcmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKworICAgIHZvaWQgYWRkQ29v
a2llKFBhcnNlZENvb2tpZSopOworCisgICAgLy8gUmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBjb29r
aWUgb2JqZWN0IHNvIG1hbmFnZXIgY2FuIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHVwZGF0ZXMg
aW4gdGhlIGRhdGFiYXNlIHF1ZXVlCisgICAgUGFyc2VkQ29va2llKiB1cGRhdGVDb29raWUoUGFy
c2VkQ29va2llKik7CisKKyAgICAvLyBOZWVkIHRvIHJldHVybiB0aGUgcmVmZXJlbmNlIHRvIHRo
ZSByZW1vdmVkIGNvb2tpZSBzbyBtYW5hZ2VyIGNhbiBkZWFsIHdpdGggaXQgKGdhcmJhZ2UgY29s
bGVjdCkKKyAgICBQYXJzZWRDb29raWUqIHJlbW92ZUNvb2tpZShjb25zdCBQYXJzZWRDb29raWUq
KTsKKyAgICBib29sIGV4aXN0c0Nvb2tpZShjb25zdCBQYXJzZWRDb29raWUqKSBjb25zdDsKKwor
ICAgIC8vIFJldHVybnMgYSBtYXAgd2l0aCB0aGF0IGdpdmVuIHN1YmRvbWFpbgorICAgIENvb2tp
ZU1hcCogZ2V0U3ViZG9tYWluTWFwKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgYWRkU3ViZG9t
YWluTWFwKGNvbnN0IFN0cmluZyYsIENvb2tpZU1hcCopOworICAgIHZvaWQgZGVsZXRlQWxsQ29v
a2llc0FuZERvbWFpbnMoKTsKKworICAgIHZvaWQgZ2V0QWxsQ29va2llcyhWZWN0b3I8UGFyc2Vk
Q29va2llKj4qKTsKKyAgICB2b2lkIGdldEFsbENoaWxkQ29va2llcyhWZWN0b3I8UGFyc2VkQ29v
a2llKj4qIHN0YWNrT2ZDb29raWVzKTsKKyAgICBQYXJzZWRDb29raWUqIHJlbW92ZU9sZGVzdENv
b2tpZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgdXBkYXRlT2xkZXN0Q29va2llKCk7CisKKyAg
ICAvLyBUaGUga2V5IGlzIHRoZSB0dXBsZSAobmFtZSwgcGF0aCkKKyAgICAvLyBUaGUgc3BlYyBh
c2tzIHRvIGhhdmUgYWxzbyBkb21haW4sIHdoaWNoIGlzIGltcGxpZWQgYnkgY2hvb3NpbmcgdGhl
IENvb2tpZU1hcCByZWxldmFudCB0byB0aGUgZG9tYWluCisgICAgSGFzaE1hcDxTdHJpbmcsIFBh
cnNlZENvb2tpZSo+IG1fY29va2llTWFwOworCisgICAgLy8gVGhlIGtleSBpcyBhIHN1YnNlY3Rp
b24gb2YgdGhlIGRvbWFpbi4KKyAgICAvLyBleDogaWYgaW5zZXJ0aW5nIGFjY291bnRzLmdvb2ds
ZS5jb20gJiB0aGlzIGNvb2tpZW1hcCBpcyAiY29tIiwgdGhpcyBzdWJkb21haW4gbWFwIHdpbGwg
Y29udGFpbiAiZ29vZ2xlIgorICAgIC8vIFRoZSAiZ29vZ2xlIiBjb29raWVtYXAgd2lsbCBjb250
YWluICJhY2NvdW50cyIgaW4gaXRzIHN1YmRvbWFpbiBtYXAKKyAgICBIYXNoTWFwPFN0cmluZywg
Q29va2llTWFwKj4gbV9zdWJkb21haW5zOworCisgICAgLy8gU3RvcmUgdGhlIG9sZGVzdCBjb29r
aWUgdG8gc3BlZWQgdXAgTFJVIGNoZWNrcworICAgIFBhcnNlZENvb2tpZSogbV9vbGRlc3RDb29r
aWU7CisgICAgY29uc3QgU3RyaW5nIG1fbmFtZTsKKworICAgIC8vIEZJWE1FIDogc2hvdWxkIGhh
dmUgYSBtX3Nob3VsZFVwZGF0ZSBmbGFnIHRvIHVwZGF0ZSB0aGUgbmV0d29yayBsYXllciBvbmx5
IHdoZW4gdGhlIG1hcCBoYXMgY2hhbmdlZAorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gQ29va2llTWFwX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43N2E3Y2E2M2Y4YzYyNDM3
NDE5YjkwMGFiMDcyYTgzY2QxYzI0OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMzkwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhA
cGxleW8uY29tPgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAy
MDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8gCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJD
b29raWVQYXJzZXIuaCIKKworI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiTG9n
Z2luZy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NT
dHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgaW5saW5lIGJvb2wgaXND
b29raWVIZWFkZXJTZXBhcmF0b3IoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gKGMgPT0gJ1xyJyB8
fCBjID09J1xuJyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0xpZ2h0d2VpZ2h0U3BhY2Uo
VUNoYXIgYykKK3sKKyAgICByZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Cit9CisKK0Nv
b2tpZVBhcnNlcjo6Q29va2llUGFyc2VyKGNvbnN0IEtVUkwmIGRlZmF1bHRDb29raWVVUkwpCisg
ICAgOiBtX2RlZmF1bHRDb29raWVVUkwoZGVmYXVsdENvb2tpZVVSTCkKK3sKK30KKworQ29va2ll
UGFyc2VyOjp+Q29va2llUGFyc2VyKCkKK3sKK30KKworVmVjdG9yPFBhcnNlZENvb2tpZSo+IENv
b2tpZVBhcnNlcjo6cGFyc2UoY29uc3QgU3RyaW5nJiBjb29raWVzKQoreworICAgIHVuc2lnbmVk
IGNvb2tpZVN0YXJ0LCBjb29raWVFbmQgPSAwOworICAgIGRvdWJsZSBjdXJUaW1lID0gY3VycmVu
dFRpbWUoKTsKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKiwgND4gcGFyc2VkQ29va2llczsKKyAK
KyAgICBpZiAoIWNvb2tpZXMubGVuZ3RoKCkpIC8vIENvZGUgYmVsb3cgZG9lc24ndCBoYW5kbGUg
dGhpcyBjYXNlCisgICAgICAgIHJldHVybiBwYXJzZWRDb29raWVzOworCisgICAgLy8gSXRlcmF0
ZSBvdmVyIHRoZSBoZWFkZXIgdG8gcGFyc2UgYWxsIHRoZSBjb29raWVzLgorICAgIHdoaWxlIChj
b29raWVFbmQgPD0gY29va2llcy5sZW5ndGgoKSkgeworICAgICAgICBjb29raWVTdGFydCA9IGNv
b2tpZUVuZDsKKyAgICAgICAgCisgICAgICAgIC8vIEZpbmQgYSBjb29raWUgc2VwYXJhdG9yLgor
ICAgICAgICB3aGlsZSAoY29va2llRW5kIDw9IGNvb2tpZXMubGVuZ3RoKCkgJiYgIWlzQ29va2ll
SGVhZGVyU2VwYXJhdG9yKGNvb2tpZXNbY29va2llRW5kXSkpCisgICAgICAgICAgICBjb29raWVF
bmQrKzsKKworICAgICAgICAvLyBEZXRlY3QgYW4gZW1wdHkgY29va2llIGFuZCBnbyB0byB0aGUg
bmV4dCBvbmUuCisgICAgICAgIGlmIChjb29raWVTdGFydCA9PSBjb29raWVFbmQpIHsKKyAgICAg
ICAgICAgICsrY29va2llRW5kOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoY29va2llRW5kIDwgY29va2llcy5sZW5ndGgoKSAmJiBpc0Nvb2tpZUhlYWRl
clNlcGFyYXRvcihjb29raWVzW2Nvb2tpZUVuZF0pKQorICAgICAgICAgICAgKytjb29raWVFbmQ7
CisKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUgPSBwYXJzZU9uZUNvb2tpZShjb29raWVz
LCBjb29raWVTdGFydCwgY29va2llRW5kIC0gMSwgY3VyVGltZSk7CisgICAgICAgIGlmIChjb29r
aWUpCisgICAgICAgICAgICBwYXJzZWRDb29raWVzLmFwcGVuZChjb29raWUpOworICAgIH0KKyAg
ICByZXR1cm4gcGFyc2VkQ29va2llczsKK30KKworLy8gUGFyc2UgdGhlIHN0cmluZyB3aXRob3V0
ICJTZXQtQ29va2llIiBhY2NvcmRpbmcgdG8gRmlyZWZveCBncmFtbWFyIChsb29zZWx5IFJGQyAy
MTA5IGNvbXBsaWFudCkKKy8vIHNlZSBuZXR3ZXJrL2Nvb2tpZS9zcmMvbnNDb29raWVTZXJ2aWNl
LmNwcCBjb21tZW50IGZvciBpdAorUGFyc2VkQ29va2llKiBDb29raWVQYXJzZXI6OnBhcnNlT25l
Q29va2llKGNvbnN0IFN0cmluZyYgY29va2llLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5k
LCBkb3VibGUgY3VyVGltZSkKK3sKKyAgICBQYXJzZWRDb29raWUqIHJlcyA9IG5ldyBQYXJzZWRD
b29raWUoY3VyVGltZSk7CisKKyAgICBpZiAoIXJlcykgeworICAgICAgICBMT0dfRVJST1IoIk91
dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gRXh0cmFj
dCBwcm90b2NvbAorICAgIHJlcy0+c2V0UHJvdG9jb2wobV9kZWZhdWx0Q29va2llVVJMLnByb3Rv
Y29sKCkpOworCisgICAgLy8gUGFyc2UgW05BTUUgIj0iXSBWQUxVRQorCisgICAgdW5zaWduZWQg
dG9rZW5FbmQgPSBzdGFydDsgLy8gVG9rZW4gZW5kIGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBvZiB0
aGUgJz0nIG9yIHRoZSBlbmQgb2YgYSB0b2tlbgorICAgIHVuc2lnbmVkIHBhaXJFbmQgPSBzdGFy
dDsgLy8gUGFpciBlbmQgY29udGFpbnMgYWx3YXlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgJzsnCisK
KyAgICAvLyBmaW5kIHRoZSAqZmlyc3QqICc7JyBhbmQgdGhlICc9JyAoaWYgdGhleSBleGlzdCkK
KyAgICBib29sIHF1b3RlRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGZvdW5kRXF1YWwgPSBmYWxz
ZTsKKyAgICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiAoY29va2llW3BhaXJFbmRdICE9ICc7JyB8
fCBxdW90ZUZvdW5kKSkgeworICAgICAgICBpZiAodG9rZW5FbmQgPT0gc3RhcnQgJiYgY29va2ll
W3BhaXJFbmRdID09ICc9JykgeworICAgICAgICAgICAgdG9rZW5FbmQgPSBwYWlyRW5kOworICAg
ICAgICAgICAgZm91bmRFcXVhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvb2tp
ZVtwYWlyRW5kXSA9PSAnIicpCisgICAgICAgICAgICBxdW90ZUZvdW5kID0gIXF1b3RlRm91bmQ7
CisgICAgICAgIHBhaXJFbmQrKzsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0b2tlblN0YXJ0ID0g
c3RhcnQ7CisKKyAgICBib29sIGhhc05hbWUgPSBmYWxzZTsgLy8gVGhpcyBpcyBhIGhhY2sgdG8g
YXZvaWQgY2hhbmdpbmcgdG9vIG11Y2ggaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBicnV0YWxseSBicml0dGxlIGNvZGUuCisgICAgaWYgKHRva2VuRW5kICE9IHN0YXJ0KSB7
CisgICAgICAgIC8vIFRoZXJlIGlzIGEgJz0nIHNvIHBhcnNlIHRoZSBOQU1FCisgICAgICAgIHVu
c2lnbmVkIG5hbWVFbmQgPSB0b2tlbkVuZDsKKworICAgICAgICAvLyBUaGUgdG9rZW5FbmQgaXMg
dGhlIHBvc2l0aW9uIG9mIHRoZSAnPScgc28gdGhlIG5hbWVFbmQgaXMgb25lIGxlc3MKKyAgICAg
ICAgbmFtZUVuZC0tOworCisgICAgICAgIC8vIFJlbW92ZSBsaWdodHdlaWdodCBzcGFjZXMuCisg
ICAgICAgIHdoaWxlIChuYW1lRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbbmFtZUVu
ZF0pKQorICAgICAgICAgICAgbmFtZUVuZC0tOworCisgICAgICAgIHdoaWxlICh0b2tlblN0YXJ0
IDwgbmFtZUVuZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuU3RhcnRdKSkKKyAg
ICAgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgICAgICBpZiAobmFtZUVuZCArIDEgPD0gdG9r
ZW5TdGFydCkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJFbXB0eSBuYW1lLiBSZWplY3Rpbmcg
dGhlIGNvb2tpZSIpOworICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjb29raWUuc3Vic3RyaW5n
KHRva2VuU3RhcnQsIG5hbWVFbmQgKyAxIC0gc3RhcnQpOworICAgICAgICByZXMtPnNldE5hbWUo
bmFtZSk7CisgICAgICAgIGhhc05hbWUgPSB0cnVlOworICAgIH0KKworICAgIC8vIE5vdyBwYXJz
ZSB0aGUgVkFMVUUKKyAgICB0b2tlblN0YXJ0ID0gdG9rZW5FbmQgKyAxOworICAgIGlmICghaGFz
TmFtZSkKKyAgICAgICAgLS10b2tlblN0YXJ0OworCisgICAgLy8gU2tpcCBsaWdodHdlaWdodCBz
cGFjZXMgaW4gb3VyIHRva2VuCisgICAgd2hpbGUgKHRva2VuU3RhcnQgPCBwYWlyRW5kICYmIGlz
TGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAgICAgICB0b2tlblN0YXJ0
Kys7CisKKyAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgd2hpbGUgKHRva2VuRW5kID4gdG9r
ZW5TdGFydCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuRW5kIC0gMV0pKQorICAg
ICAgICB0b2tlbkVuZC0tOworCisgICAgU3RyaW5nIHZhbHVlOworICAgIGlmICh0b2tlbkVuZCA9
PSB0b2tlblN0YXJ0KSB7CisgICAgICAgIC8vIEZpcmVmb3ggYWNjZXB0cyBlbXB0eSB2YWx1ZSBz
byB3ZSB3aWxsIGRvIHRoZSBzYW1lCisgICAgICAgIHZhbHVlID0gU3RyaW5nKCk7CisgICAgfSBl
bHNlCisgICAgICAgIHZhbHVlID0gY29va2llLnN1YnN0cmluZyh0b2tlblN0YXJ0LCB0b2tlbkVu
ZCAtIHRva2VuU3RhcnQpOworCisgICAgaWYgKGhhc05hbWUpCisgICAgICAgIHJlcy0+c2V0VmFs
dWUodmFsdWUpOworICAgIGVsc2UgaWYgKGZvdW5kRXF1YWwpIHsKKyAgICAgICAgZGVsZXRlIHJl
czsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlCisgICAgICAgIHJlcy0+c2V0TmFtZSh2
YWx1ZSk7IC8vIE5vIE5BTUU9VkFMVUUsIG9ubHkgTkFNRQorCisgICAgd2hpbGUgKHBhaXJFbmQg
PCBlbmQpIHsKKyAgICAgICAgLy8gU3dpdGNoIHRvIHRoZSBuZXh0IHBhaXIgYXMgcGFpckVuZCBp
cyBvbiB0aGUgJzsnIGFuZCBmYXN0LWZvcndhcmQgYW55IGxpZ2h0d2VpZ2h0IHNwYWNlcy4KKyAg
ICAgICAgcGFpckVuZCsrOworICAgICAgICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiBpc0xpZ2h0
d2VpZ2h0U3BhY2UoY29va2llW3BhaXJFbmRdKSkKKyAgICAgICAgICAgIHBhaXJFbmQrKzsKKwor
ICAgICAgICB0b2tlblN0YXJ0ID0gcGFpckVuZDsKKyAgICAgICAgdG9rZW5FbmQgPSB0b2tlblN0
YXJ0OyAvLyBpbml0aWFsaXplIHRva2VuIGVuZCB0byBjYXRjaCBmaXJzdCAnPScKKworICAgICAg
ICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiBjb29raWVbcGFpckVuZF0gIT0gJzsnKSB7CisgICAg
ICAgICAgICBpZiAodG9rZW5FbmQgPT0gdG9rZW5TdGFydCAmJiBjb29raWVbcGFpckVuZF0gPT0g
Jz0nKQorICAgICAgICAgICAgICAgIHRva2VuRW5kID0gcGFpckVuZDsKKyAgICAgICAgICAgIHBh
aXJFbmQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FIDogc2hvdWxkIHdlIHNraXAg
bGlnaHR3ZWlnaHQgc3BhY2VzIGhlcmUgPworCisgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRv
a2VuRW5kIC0gdG9rZW5TdGFydDsKKyAgICAgICAgdW5zaWduZWQgdG9rZW5TdGFydFN2ZyA9IHRv
a2VuU3RhcnQ7CisKKyAgICAgICAgU3RyaW5nIHBhcnNlZFZhbHVlOworICAgICAgICBpZiAodG9r
ZW5TdGFydCAhPSB0b2tlbkVuZCkgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXF1YWwg
c2lnbiBzbyByZW1vdmUgbGlnaHR3ZWlnaHQgc3BhY2VzIGluIFZBTFVFCisgICAgICAgICAgICB0
b2tlblN0YXJ0ID0gdG9rZW5FbmQgKyAxOworICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RhcnQg
PCBwYWlyRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAg
ICAgICAgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgICAgICAgICAgdG9rZW5FbmQgPSBwYWly
RW5kOworICAgICAgICAgICAgd2hpbGUgKHRva2VuRW5kID4gdG9rZW5TdGFydCAmJiBpc0xpZ2h0
d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuRW5kIC0gMV0pKQorICAgICAgICAgICAgICAgIHRva2Vu
RW5kLS07CisKKyAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gY29va2llLnN1YnN0cmluZyh0b2tl
blN0YXJ0LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgLy8gSWYgdGhlIHBhcnNlZFZhbHVlIGlzIGVtcHR5LCBpbml0aWFsaXNlIGl0IGluIGNh
c2Ugd2UgbmVlZCBpdAorICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBTdHJpbmcoKTsKKyAgICAg
ICAgICAgIC8vIEhhbmRsZSBhIHRva2VuIHdpdGhvdXQgdmFsdWUuCisgICAgICAgICAgICBsZW5n
dGggPSBwYWlyRW5kIC0gdG9rZW5TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgLy8gRGV0ZWN0
IHdoaWNoICJjb29raWUtYXYiIGlzIHBhcnNlZAorICAgICAgIC8vIExvb2sgYXQgdGhlIGZpcnN0
IGNoYXIgdGhlbiBwYXJzZSB0aGUgd2hvbGUgZm9yIHBlcmZvcm1hbmNlIGlzc3VlCisgICAgICAg
IHN3aXRjaCAoY29va2llW3Rva2VuU3RhcnRTdmddKSB7CisgICAgICAgIGNhc2UgJ1AnOgorICAg
ICAgICBjYXNlICdwJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNCAmJiBjb29raWUu
ZmluZCgiYXRoIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBy
ZXMtPnNldFBhdGgocGFyc2VkVmFsdWUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAocGF0aCkiLCBjb29raWUuYXNjaWko
KS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
CisgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICBjYXNlICdkJyA6IHsKKyAgICAgICAgICAgIGlm
IChsZW5ndGggPj0gNiAmJiBjb29raWUuZmluZCgib21haW4iLCB0b2tlblN0YXJ0U3ZnICsgMSwg
ZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFZhbHVlLmxlbmd0aCgpID4gMSAm
JiBwYXJzZWRWYWx1ZVswXSA9PSAnIicgJiYgcGFyc2VkVmFsdWVbcGFyc2VkVmFsdWUubGVuZ3Ro
KCkgLSAxXSA9PSAnIicpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gcGFyc2Vk
VmFsdWUuc3Vic3RyaW5nKDEsIHBhcnNlZFZhbHVlLmxlbmd0aCgpIC0gMik7CisKKyAgICAgICAg
ICAgICAgICByZXMtPnNldERvbWFpbihwYXJzZWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUgJXMgKGRvbWFpbiki
LCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ0UnIDoKKyAgICAgICAgY2FzZSAnZScgOiB7
CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoInhwaXJlcyIsIHRv
a2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgcmVzLT5zZXRFeHBpcnko
cGFyc2VkVmFsdWUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0VS
Uk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAoZXhwaXJlcykiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkp
OworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAg
IGNhc2UgJ00nIDoKKyAgICAgICAgY2FzZSAnbScgOiB7CisgICAgICAgICAgICBpZiAobGVuZ3Ro
ID49IDcgJiYgY29va2llLmZpbmQoImF4LWFnZSIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkp
CisgICAgICAgICAgICAgICAgcmVzLT5zZXRNYXhBZ2UocGFyc2VkVmFsdWUpOworICAgICAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAo
bWF4LWFnZSkiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0
ZSByZXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ0MnIDoKKyAgICAgICAgY2Fz
ZSAnYycgOiB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoIm9t
bWVudCIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgLy8gV2Ug
ZG8gbm90IGhhdmUgcm9vbSBmb3IgdGhlIGNvbW1lbnQgcGFydCAoYW5kIHNvIGRvIE1vemlsbGEp
IHNvIGp1c3QgbG9nIHRoZSBjb21tZW50LgorICAgICAgICAgICAgICAgIExPRyhOZXR3b3JrLCAi
Q29tbWVudCAlcyBmb3IgUGFyc2VkQ29va2llIDogJXNcbiIsIHBhcnNlZFZhbHVlLmFzY2lpKCku
ZGF0YSgpLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAoY29tbWVudCkiLCBjb29r
aWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorCisgICAgICAgIGNhc2UgJ1YnIDoKKyAgICAgICAgY2FzZSAndicgOiB7CisgICAg
ICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoImVyc2lvbiIsIHRva2VuU3Rh
cnRTdmcgKyAxLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCB0aGUgb3V0
LW9mLWRhdGVkIENvb2tpZSBTcGVjKFJGQzI5NjUsIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1s
L3JmYzI5NjUpIGRlZmluZWQKKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgb2YgdmVyc2lv
biBjYW4gb25seSBjb250YWluIERJR0lULCBzb21lIHJhbmRvbSBzaXRlcywgZS5nLiBodHRwczov
L2RldmZvcnVtcy5hcHBsZS5jb20KKyAgICAgICAgICAgICAgICAvLyB3b3VsZCB1c2UgZG91Ymxl
IHF1b3RhdGlvbiBtYXJrcyB0byBxdW90ZSB0aGUgZGlnaXQuIFNvIHdlIG5lZWQgdG8gZ2V0IHJp
ZCBvZiB0aGVtIGZvciBjb21wbGlhbmNlLgorICAgICAgICAgICAgICAgIGlmIChwYXJzZWRWYWx1
ZS5sZW5ndGgoKSA+IDEgJiYgcGFyc2VkVmFsdWVbMF0gPT0gJyInICYmIHBhcnNlZFZhbHVlW3Bh
cnNlZFZhbHVlLmxlbmd0aCgpIC0gMV0gPT0gJyInKQorICAgICAgICAgICAgICAgICAgICBwYXJz
ZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnN1YnN0cmluZygxLCBwYXJzZWRWYWx1ZS5sZW5ndGgoKSAt
IDIpOworCisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFZhbHVlLnRvSW50KCkgIT0gMSkgewor
ICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlBhcnNlZENvb2tpZSB2ZXJzaW9uICVkIG5v
dCBzdXBwb3J0ZWQgKG9ubHkgc3VwcG9ydCB2ZXJzaW9uPTEpIiwgcGFyc2VkVmFsdWUudG9JbnQo
KSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAodmVyc2lvbikiLCBjb29r
aWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorCisgICAgICAgIGNhc2UgJ1MnIDoKKyAgICAgICAgY2FzZSAncycgOiB7CisgICAg
ICAgICAgICAvLyBTZWN1cmUgaXMgYSBzdGFuZGFsb25lIHRva2VuICgiU2VjdXJlOyIpCisgICAg
ICAgICAgICBpZiAobGVuZ3RoID49IDYgJiYgY29va2llLmZpbmQoImVjdXJlIiwgdG9rZW5TdGFy
dFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICByZXMtPnNldFNlY3VyZUZsYWcodHJ1
ZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFs
aWQgY29va2llICVzIChzZWN1cmUpIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
ICAgICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAnSCc6Cisg
ICAgICAgIGNhc2UgJ2gnOiB7CisgICAgICAgICAgICAvLyBIdHRwT25seSBpcyBhIHN0YW5kYWxv
bmUgdG9rZW4gKCJIdHRwT25seTsiKQorICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA4ICYmIGNv
b2tpZS5maW5kKCJ0dHBPbmx5IiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAg
ICAgICAgICByZXMtPnNldElzSHR0cE9ubHkodHJ1ZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzIChIdHRwT25seSkiLCBj
b29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAvLyBJZiBsZW5n
dGggPT0gMCwgd2Ugc2hvdWxkIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvb2tpZSAoY2FzZSA6ICI7
XHIiKSBzbyBpZ25vcmUgaXQKKyAgICAgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICAg
ICAgTE9HX0VSUk9SKCJJbnZhbGlkIHRva2VuIGZvciBjb29raWUgJXMiLCBjb29raWUuYXNjaWko
KS5kYXRhKCkpOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBp
ZiB0aGUgY29va2llIGlzIHZhbGlkIHdpdGggcmVzcGVjdCB0byB0aGUgc2l6ZSBsaW1pdC8KKyAg
ICBpZiAoIXJlcy0+aXNVbmRlclNpemVMaW1pdCgpKSB7CisgICAgICAgIExPR19FUlJPUigiUGFy
c2VkQ29va2llICVzIGlzIGFib3ZlIHRoZSA0a2IgaW4gbGVuZ3RoIDogUkVKRUNURUQiLCBjb29r
aWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBkZWxldGUgcmVzOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9CisKKyAgICAvLyBJZiBzb21lIHBhaXIgd2FzIG5vdCBwcm92aWRlZCwgZHVyaW5n
IHBhcnNpbmcgdGhlbiBhcHBseSBzb21lIGRlZmF1bHQgdmFsdWUKKyAgICAvLyB0aGUgcmVzdCBo
YXMgYmVlbiBkb25lIGluIHRoZSBjb25zdHJ1Y3Rvci4KKworICAgIC8vIElmIG5vIGRvbWFpbiB3
YXMgcHJvdmlkZWQsIHNldCBpdCB0byB0aGUgaG9zdAorICAgIGlmICghcmVzLT5kb21haW4oKSkK
KyAgICAgICAgcmVzLT5zZXREZWZhdWx0RG9tYWluKG1fZGVmYXVsdENvb2tpZVVSTCk7CisKKyAg
ICAvLyBBY2NvcmRpbmcgdG8gdGhlIENvb2tpZSBTcGVjaWZpY2FpdG9uIChSRkM2MjY1LCBzZWN0
aW9uIDQuMS4yLjQgYW5kIDUuMi40LCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1
KSwKKyAgICAvLyBJZiBubyBwYXRoIHdhcyBwcm92aWRlZCBvciB0aGUgZmlyc3QgY2hhcmFjdGVy
IG9mIHRoZSBwYXRoIHZhbHVlIGlzIG5vdCAnLycsIHNldCBpdCB0byB0aGUgaG9zdCdzIHBhdGgK
KyAgICAvLworICAgIC8vIFJFRkVSRU5DRQorICAgIC8vIDQuMS4yLjQuIFRoZSBQYXRoIEF0dHJp
YnV0ZQorICAgIC8vCisgICAgLy8gVGhlIHNjb3BlIG9mIGVhY2ggY29va2llIGlzIGxpbWl0ZWQg
dG8gYSBzZXQgb2YgcGF0aHMsIGNvbnRyb2xsZWQgYnkKKyAgICAvLyB0aGUgUGF0aCBhdHRyaWJ1
dGUuIElmIHRoZSBzZXJ2ZXIgb21pdHMgdGhlIFBhdGggYXR0cmlidXRlLCB0aGUgdXNlcgorICAg
IC8vIGFnZW50IHdpbGwgdXNlIHRoZSAiZGlyZWN0b3J5IiBvZiB0aGUgcmVxdWVzdC11cmkncyBw
YXRoIGNvbXBvbmVudCBhcworICAgIC8vIHRoZSBkZWZhdWx0IHZhbHVlLiAoU2VlIFNlY3Rpb24g
NS4xLjQgZm9yIG1vcmUgZGV0YWlscy4pCisgICAgLy8gLi4uLi4uLi4uLi4KKyAgICAvLyA1LjIu
NC4gVGhlIFBhdGggQXR0cmlidXRlCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5h
bWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyAiUGF0aCIsCisgICAgLy8g
dGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy4KKyAg
ICAvLworICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgZW1wdHkgb3IgaWYgdGhlIGZp
cnN0IGNoYXJhY3RlciBvZiB0aGUKKyAgICAvLyBhdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYg
KCIvIik6CisgICAgLy8KKyAgICAvLyBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0
aC4KKyAgICAvLworICAgIC8vIE90aGVyd2lzZToKKyAgICAvLworICAgIC8vIExldCBjb29raWUt
cGF0aCBiZSB0aGUgYXR0cmlidXRlLXZhbHVlLgorICAgIC8vCisgICAgLy8gQXBwZW5kIGFuIGF0
dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0IHdpdGggYW4gYXR0cmlidXRlLQor
ICAgIC8vIG5hbWUgb2YgUGF0aCBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mIGNvb2tpZS1wYXRo
LgorICAgIGlmICghcmVzLT5wYXRoKCkgfHwgIXJlcy0+cGF0aCgpLmxlbmd0aCgpIHx8ICFyZXMt
PnBhdGgoKS5zdGFydHNXaXRoKCIvIiwgZmFsc2UpKSB7CisgICAgICAgIFN0cmluZyBwYXRoID0g
bV9kZWZhdWx0Q29va2llVVJMLnN0cmluZygpLnN1YnN0cmluZyhtX2RlZmF1bHRDb29raWVVUkwu
cGF0aFN0YXJ0KCksIG1fZGVmYXVsdENvb2tpZVVSTC5wYXRoQWZ0ZXJMYXN0U2xhc2goKSAtIG1f
ZGVmYXVsdENvb2tpZVVSTC5wYXRoU3RhcnQoKSAtIDEpOworICAgICAgICBpZiAocGF0aC5pc0Vt
cHR5KCkpCisgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICByZXMtPnNldFBhdGgocGF0
aCk7CisgICAgfQorIAorICAgIHJldHVybiByZXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2ll
UGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNl
ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjA1N2E2ZmQyZjEzODJiYjhiZTQ2Njc5MmU5YzQzMTAzZDRlMDkwMjIK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nv
b2tpZVBhcnNlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkg
SnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQgKEMp
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZu
ZGVmIENvb2tpZVBhcnNlcl9oCisjZGVmaW5lIENvb2tpZVBhcnNlcl9oCisKKyNpbmNsdWRlICJL
VVJMLmgiCisjaW5jbHVkZSAiVmVjdG9yLmgiCisKK25hbWVzcGFjZSBXVEYgeworY2xhc3MgU3Ry
aW5nOworfQorbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBQYXJzZWRDb29raWU7CisKK2Ns
YXNzIENvb2tpZVBhcnNlciB7CitwdWJsaWM6CisgICAgQ29va2llUGFyc2VyKGNvbnN0IEtVUkwm
IGRlZmF1bHRDb29raWVVUkwpOworICAgIH5Db29raWVQYXJzZXIoKTsKKworICAgIC8vIFBhcnNl
cyBhIHNlcXVlbmNlIG9mICJDb29raWU6IiBoZWFkZXIgYW5kIHJldHVybiB0aGUgcGFyc2VkIGNv
b2tpZXMuCisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHBhcnNlKGNvbnN0IFN0cmluZyYgY29v
a2llcyk7CisKK3ByaXZhdGU6CisgICAgLy8gRklYTUU6IGN1clRpbWUsIHN0YXJ0LCBlbmQgcGFy
YW1ldGVycyBzaG91bGQgYmUgcmVtb3ZlZC4gQW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBwdWJsaWMu
CisgICAgUGFyc2VkQ29va2llKiBwYXJzZU9uZUNvb2tpZShjb25zdCBTdHJpbmcmIGNvb2tpZSwg
dW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCwgZG91YmxlIGN1clRpbWUpOworCisgICAgS1VS
TCBtX2RlZmF1bHRDb29raWVVUkw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBDb29raWVQYXJzZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
YmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmNlOTllYTA3ZTYyMGUwOWM0
YjA1ZTFhOWRjMDdiYTA2NzIwNDE0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5jcHAKQEAgLTAsMCArMSwxODcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVu
LmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFyc2Vk
Q29va2llLmgiCisKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQ3VycmVu
dFRpbWUuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1
ZGUgPGN1cmwvY3VybC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitQYXJzZWRDb29raWU6OlBhcnNlZENvb2tpZShkb3VibGUgY3VycmVu
dFRpbWUpCisgICAgOiBtX2V4cGlyeSgwKQorICAgICwgbV9pc01heEFnZVNldChmYWxzZSkKKyAg
ICAsIG1fY3JlYXRpb25UaW1lKGN1cnJlbnRUaW1lKQorICAgICwgbV9sYXN0QWNjZXNzZWQoY3Vy
cmVudFRpbWUpCisgICAgLCBtX2hhc0RlZmF1bHREb21haW4oZmFsc2UpCisgICAgLCBtX2lzU2Vj
dXJlKGZhbHNlKQorICAgICwgbV9pc0h0dHBPbmx5KGZhbHNlKQorICAgICwgbV9pc1Nlc3Npb24o
dHJ1ZSkKKyAgICAsIG1faXNGb3JjZUV4cGlyZWQoZmFsc2UpCit7Cit9CisKK1BhcnNlZENvb2tp
ZTo6UGFyc2VkQ29va2llKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwg
Y29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0IFN0cmluZyYgcHJvdG9jb2wsIGNvbnN0IFN0cmlu
ZyYgcGF0aCwgZG91YmxlIGV4cGlyeSwgZG91YmxlIGxhc3RBY2Nlc3NlZCwgZG91YmxlIGNyZWF0
aW9uVGltZSwgYm9vbCBpc1NlY3VyZSwgYm9vbCBpc0h0dHBPbmx5KQorICAgIDogbV9uYW1lKG5h
bWUpCisgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgICwgbV9kb21haW4oZG9tYWluKQorICAgICwg
bV9wcm90b2NvbChwcm90b2NvbCkKKyAgICAsIG1fcGF0aChwYXRoKQorICAgICwgbV9leHBpcnko
ZXhwaXJ5KQorICAgICwgbV9pc01heEFnZVNldChmYWxzZSkKKyAgICAsIG1fY3JlYXRpb25UaW1l
KGNyZWF0aW9uVGltZSkKKyAgICAsIG1fbGFzdEFjY2Vzc2VkKGxhc3RBY2Nlc3NlZCkKKyAgICAs
IG1faGFzRGVmYXVsdERvbWFpbihmYWxzZSkKKyAgICAsIG1faXNTZWN1cmUoaXNTZWN1cmUpCisg
ICAgLCBtX2lzSHR0cE9ubHkoaXNIdHRwT25seSkKKyAgICAsIG1faXNTZXNzaW9uKGZhbHNlKQor
ICAgICwgbV9pc0ZvcmNlRXhwaXJlZChmYWxzZSkKK3sKK30KKworUGFyc2VkQ29va2llOjpQYXJz
ZWRDb29raWUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCisgICAgOiBtX25hbWUoU3RyaW5n
KGNvb2tpZS0+bV9uYW1lKSkKKyAgICAsIG1fdmFsdWUoU3RyaW5nKGNvb2tpZS0+bV92YWx1ZSkp
CisgICAgLCBtX2RvbWFpbihTdHJpbmcoY29va2llLT5tX2RvbWFpbikpCisgICAgLCBtX3Byb3Rv
Y29sKFN0cmluZyhjb29raWUtPm1fcHJvdG9jb2wpKQorICAgICwgbV9wYXRoKFN0cmluZyhjb29r
aWUtPm1fcGF0aCkpCisgICAgLCBtX2V4cGlyeShjb29raWUtPm1fZXhwaXJ5KQorICAgICwgbV9p
c01heEFnZVNldChjb29raWUtPm1faXNNYXhBZ2VTZXQpCisgICAgLCBtX2NyZWF0aW9uVGltZShj
b29raWUtPm1fY3JlYXRpb25UaW1lKQorICAgICwgbV9sYXN0QWNjZXNzZWQoY29va2llLT5tX2xh
c3RBY2Nlc3NlZCkKKyAgICAsIG1faGFzRGVmYXVsdERvbWFpbihjb29raWUtPm1faGFzRGVmYXVs
dERvbWFpbikKKyAgICAsIG1faXNTZWN1cmUoY29va2llLT5tX2lzU2VjdXJlKQorICAgICwgbV9p
c0h0dHBPbmx5KGNvb2tpZS0+bV9pc0h0dHBPbmx5KQorICAgICwgbV9pc1Nlc3Npb24oY29va2ll
LT5tX2lzU2Vzc2lvbikKKyAgICAsIG1faXNGb3JjZUV4cGlyZWQoY29va2llLT5tX2lzRm9yY2VF
eHBpcmVkKQoreworfQorCitQYXJzZWRDb29raWU6On5QYXJzZWRDb29raWUoKQoreworfQorCit2
b2lkIFBhcnNlZENvb2tpZTo6c2V0RXhwaXJ5KGNvbnN0IFN0cmluZyYgZXhwaXJ5KQoreworICAg
IC8vIElmIGEgY29va2llIGhhcyBib3RoIHRoZSBNYXgtQWdlIGFuZCB0aGUgRXhwaXJlcyBhdHRy
aWJ1dGUsCisgICAgLy8gdGhlIE1heC1BZ2UgYXR0cmlidXRlIGhhcyBwcmVjZWRlbmNlIGFuZCBj
b250cm9scyB0aGUgZXhwaXJhdGlvbiBkYXRlIG9mIHRoZSBjb29raWUuCisgICAgaWYgKG1faXNN
YXhBZ2VTZXQgfHwgZXhwaXJ5LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9p
c1Nlc3Npb24gPSBmYWxzZTsKKworICAgIG1fZXhwaXJ5ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihj
dXJsX2dldGRhdGUoZXhwaXJ5LnV0ZjgoKS5kYXRhKCksIDApKTsKKworICAgIGlmIChtX2V4cGly
eSA9PSAtMSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSBkYXRlIik7Cisg
ICAgICAgIC8vIEluIHRoaXMgY2FzZSwgY29uc2lkZXIgdGhhdCB0aGUgY29va2llIGlzIHNlc3Np
b24gb25seQorICAgICAgICBtX2lzU2Vzc2lvbiA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFBh
cnNlZENvb2tpZTo6c2V0TWF4QWdlKGNvbnN0IFN0cmluZyYgbWF4QWdlKQoreworICAgIC8vIEFj
Y29yZGluZyB0byB0aGUgSFRUUCBDb29raWUgc3BlY2lmaWNhdGlvbiAoUkZDNjI2NSwgaHR0cDov
L3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSksCisgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3Rl
ciBjYW4gYmUgYSBESUdJVCBvciBhICItIiwgYW5kIHRoZSByZW1pbmRlcgorICAgIC8vIG9mIHRo
ZSB2YWx1ZSBjYW4gb25seSBjb250YWluIERJR0lUIGNoYXJhY3RlcnMuCisgICAgaWYgKG1heEFn
ZS5pc0VtcHR5KCkgfHwgKG1heEFnZVswXSAhPSAnLScgJiYgIWlzQVNDSUlEaWdpdChtYXhBZ2Vb
MF0pKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSBNYXgtQWdlIDogJXMs
IGZpcnN0IGNoYXJhY3RlciBjYW4gb25seSBiZSAnLScgb3IgYXNjaWkgZGlnaXQuIiwgbWF4QWdl
LmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgb2s7
CisgICAgaW50IHZhbHVlID0gbWF4QWdlLnRvSW50U3RyaWN0KCZvaywgMTApOworCisgICAgaWYg
KCFvaykgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSBNYXgtQWdlIDogJXMi
LCBtYXhBZ2UuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1f
ZXhwaXJ5ID0gdmFsdWU7CisgICAgbV9pc01heEFnZVNldCA9IHRydWU7CisgICAgbV9pc1Nlc3Np
b24gPSBmYWxzZTsKKworICAgIC8vIElmIG1heEFnZSB2YWx1ZSBpcyBub3QgcG9zaXRpdmUsIGxl
dCBleHBpcnktdGltZSBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSB0aW1lLgorICAgIGlm
IChtX2V4cGlyeSA+IDApCisgICAgICAgIG1fZXhwaXJ5ICs9IGN1cnJlbnRUaW1lKCk7CisgICAg
ZWxzZQorICAgICAgICBtX2V4cGlyeSA9IDA7Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjpzZXRE
ZWZhdWx0RG9tYWluKGNvbnN0IEtVUkwmIHJlcXVlc3RVUkwpCit7CisgICAgc2V0RG9tYWluKHJl
cXVlc3RVUkwuaG9zdCgpKTsKKyAgICBtX2hhc0RlZmF1bHREb21haW4gPSB0cnVlOworfQorCiti
b29sIFBhcnNlZENvb2tpZTo6aGFzRXhwaXJlZCgpIGNvbnN0Cit7CisgICAgLy8gU2Vzc2lvbiBj
b29raWVzIGRvIG5vdCBleHBpcmVzLCB0aGV5IHdpbGwganVzdCBub3QgYmUgc2F2ZWQgdG8gdGhl
IGJhY2tpbmcgc3RvcmUuCisgICAgcmV0dXJuICFtX2lzU2Vzc2lvbiAmJiAobV9pc0ZvcmNlRXhw
aXJlZCB8fCBtX2V4cGlyeSA8IGN1cnJlbnRUaW1lKCkpOworfQorCitib29sIFBhcnNlZENvb2tp
ZTo6aXNVbmRlclNpemVMaW1pdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmFsdWUubGVuZ3Ro
KCkgPD0gQ29va2llTWFuYWdlcjo6bWF4Q29va2llTGVuZ3RoKCkgJiYgbV9uYW1lLmxlbmd0aCgp
IDw9IENvb2tpZU1hbmFnZXI6Om1heENvb2tpZUxlbmd0aCgpOworfQorCitTdHJpbmcgUGFyc2Vk
Q29va2llOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgU3RyaW5nIGNvb2tpZSA9IG5hbWUoKTsK
KyAgICBjb29raWUgKz0gIiA9ICI7CisgICAgY29va2llICs9IHZhbHVlKCk7CisgICAgY29va2ll
ICs9ICI7IERvbWFpbiA9ICI7CisgICAgY29va2llICs9IGRvbWFpbigpOworICAgIGNvb2tpZSAr
PSAiOyBQYXRoID0gIjsKKyAgICBjb29raWUgKz0gcGF0aCgpOworICAgIGNvb2tpZSArPSAiOyBQ
cm90b2NvbCA9ICI7CisgICAgY29va2llICs9IHByb3RvY29sKCk7CisgICAgcmV0dXJuIGNvb2tp
ZTsKK30KKworU3RyaW5nIFBhcnNlZENvb2tpZTo6dG9OYW1lVmFsdWVQYWlyKCkgY29uc3QKK3sK
KyAgICBzdGF0aWMgY29uc3QgU3RyaW5nIGVxdWFsKCI9Iik7CisKKyAgICBzaXplX3QgY29va2ll
TGVuZ3RoID0gbV9uYW1lLmxlbmd0aCgpICsgbV92YWx1ZS5sZW5ndGgoKSArIDI7CisgICAgVmVj
dG9yPFVDaGFyPiByZXN1bHQ7CisgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoY29v
a2llTGVuZ3RoKTsKKyAgICBhcHBlbmQocmVzdWx0LCBtX25hbWUpOworICAgIGFwcGVuZChyZXN1
bHQsIGVxdWFsKTsKKyAgICBhcHBlbmQocmVzdWx0LCBtX3ZhbHVlKTsKKworICAgIHJldHVybiBT
dHJpbmc6OmFkb3B0KHJlc3VsdCk7Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjphcHBlbmRXZWJD
b3JlQ29va2llKFZlY3RvcjxDb29raWU+JiBjb29raWVWZWN0b3IpIGNvbnN0Cit7CisgICAgY29v
a2llVmVjdG9yLmFwcGVuZChDb29raWUoU3RyaW5nKG1fbmFtZSksIFN0cmluZyhtX3ZhbHVlKSwg
U3RyaW5nKG1fZG9tYWluKSwKKyAgICAgICAgICAgIFN0cmluZyhtX3BhdGgpLCBtX2V4cGlyeSwg
bV9pc0h0dHBPbmx5LCBtX2lzU2VjdXJlLCBtX2lzU2Vzc2lvbikpOworfQorfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJy
eS9QYXJzZWRDb29raWUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFy
c2VkQ29va2llLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTMwOWFmZTVkMDM0MzM2Yjg5NjYwYzYyZmYyMWFjYWI4
NDZlZDZhOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNr
YmVycnkvUGFyc2VkQ29va2llLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDgsIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5j
b20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIFBhcnNlZENvb2tpZV9oCisjZGVmaW5lIFBhcnNlZENvb2tpZV9oCisKKyNpbmNs
dWRlICJDb29raWUuaCIKKworbmFtZXNwYWNlIFdURiB7CitjbGFzcyBTdHJpbmc7Cit9CituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEtVUkw7CisKKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50
cyBhIGNvb2tpZSBpbnRlcm5hbGx5CisvLyBJdCBjYW4gZWl0aGVyIGJlIGNyZWF0ZWQgYnkgdGhl
IENvb2tpZVBhcnNlciB3aGljaCB3aWxsIHRoZW4gZmlsbCBpdAorLy8gb3IgaXQgY2FuIGJlIGNy
ZWF0ZWQgYnkgdGhlIGJhY2tpbmcgc3RvcmUgZmlsbGluZyBpdCBpbiB0aGUgY29uc3RydWN0b3Iu
CitjbGFzcyBQYXJzZWRDb29raWUgeworcHVibGljOgorICAgIC8vIERlZmF1bHQgY29va2llIDog
ZW1wdHkgZG9tYWluLCBub24gc2VjdXJlIGFuZCBzZXNzaW9uCisgICAgUGFyc2VkQ29va2llKGRv
dWJsZSBjdXJyZW50VGltZSk7CisKKyAgICAvLyBGb3IgYmFja2luZyBzdG9yZSBjb29raWVzICh0
aG9zZSBjb29raWVzIGFyZSBuZXZlciBzZXNzaW9uIGNvb2tpZXMpLgorICAgIFBhcnNlZENvb2tp
ZShjb25zdCBTdHJpbmcmIC8qbmFtZSovLCBjb25zdCBTdHJpbmcmIC8qdmFsdWUqLywgY29uc3Qg
U3RyaW5nJiAvKmRvbWFpbiovLGNvbnN0IFN0cmluZyYgLypwcm90b2NvbCovLCBjb25zdCBTdHJp
bmcmIC8qcGF0aCovLCBkb3VibGUgLypleHBpcnkqLywgZG91YmxlIC8qbGFzdEFjY2Vzc2VkKi8s
IGRvdWJsZSAvKmNyZWF0aW9uVGltZSovLCBib29sIC8qaXNTZWN1cmUqLywgYm9vbCAvKmlzSHR0
cE9ubHkqLyk7CisKKyAgICBQYXJzZWRDb29raWUoY29uc3QgUGFyc2VkQ29va2llKik7CisKKyAg
ICB+UGFyc2VkQ29va2llKCk7CisKKyAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJl
dHVybiBtX25hbWU7IH0KKyAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKSB7IG1f
bmFtZSA9IG5hbWU7IH0KKworICAgIGNvbnN0IFN0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVy
biBtX3ZhbHVlOyB9CisgICAgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKSB7IG1f
dmFsdWUgPSB2YWx1ZTsgfQorCisgICAgY29uc3QgU3RyaW5nJiBwYXRoKCkgY29uc3QgeyByZXR1
cm4gbV9wYXRoOyB9CisgICAgdm9pZCBzZXRQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCkgeyBtX3Bh
dGggPSBwYXRoOyB9CisKKyAgICBjb25zdCBTdHJpbmcmIGRvbWFpbigpIGNvbnN0IHsgcmV0dXJu
IG1fZG9tYWluOyB9CisgICAgdm9pZCBzZXREb21haW4oY29uc3QgU3RyaW5nJiBkb21haW4pIHsg
bV9kb21haW4gPSBkb21haW4ubG93ZXIoKTsgfQorCisgICAgY29uc3QgU3RyaW5nJiBwcm90b2Nv
bCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvdG9jb2w7IH0KKyAgICB2b2lkIHNldFByb3RvY29sKGNv
bnN0IFN0cmluZyYgcHJvdG9jb2wpIHsgbV9wcm90b2NvbCA9IHByb3RvY29sOyB9CisKKyAgICAv
LyBUaGlzIGlzIGEgc3BlY2lhbCBtZXRob2QgdXNlZCB0byBzZXQgdGhlIGRvbWFpbiB0byB0aGUg
cmVxdWVzdCdzIHVybC4KKyAgICB2b2lkIHNldERlZmF1bHREb21haW4oY29uc3QgS1VSTCYpOwor
ICAgIGJvb2wgaGFzRGVmYXVsdERvbWFpbigpIGNvbnN0IHsgcmV0dXJuIG1faGFzRGVmYXVsdERv
bWFpbjsgfQorCisgICAgZG91YmxlIGV4cGlyeSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwaXJ5OyB9
CisgICAgdm9pZCBzZXRFeHBpcnkoY29uc3QgU3RyaW5nJik7CisgICAgdm9pZCBmb3JjZUV4cGly
ZSgpIHsgbV9pc0ZvcmNlRXhwaXJlZCAgPSB0cnVlOyB9CisgICAgdm9pZCBzZXRNYXhBZ2UoY29u
c3QgU3RyaW5nJik7CisKKyAgICBkb3VibGUgbGFzdEFjY2Vzc2VkKCkgY29uc3QgeyByZXR1cm4g
bV9sYXN0QWNjZXNzZWQ7IH0KKyAgICB2b2lkIHNldExhc3RBY2Nlc3NlZChkb3VibGUgbGFzdEFj
Y2Vzc2VkKSB7IG1fbGFzdEFjY2Vzc2VkID0gbGFzdEFjY2Vzc2VkO30KKworICAgIGRvdWJsZSBj
cmVhdGlvblRpbWUoKSBjb25zdCB7IHJldHVybiBtX2NyZWF0aW9uVGltZTsgfQorICAgIHZvaWQg
c2V0Q3JlYXRpb25UaW1lKGRvdWJsZSBjcmVhdGlvblRpbWUpIHsgbV9jcmVhdGlvblRpbWUgPSBj
cmVhdGlvblRpbWU7IH0KKworICAgIGJvb2wgaXNTZWN1cmUoKSBjb25zdCB7IHJldHVybiBtX2lz
U2VjdXJlOyB9CisgICAgdm9pZCBzZXRTZWN1cmVGbGFnKGJvb2wgc2VjdXJlKSB7IG1faXNTZWN1
cmUgPSBzZWN1cmU7IH0KKworICAgIGJvb2wgaXNIdHRwT25seSgpIGNvbnN0IHsgcmV0dXJuIG1f
aXNIdHRwT25seTsgfQorICAgIHZvaWQgc2V0SXNIdHRwT25seShib29sIGlzSHR0cE9ubHkpIHsg
bV9pc0h0dHBPbmx5ID0gaXNIdHRwT25seTsgfQorCisgICAgYm9vbCBpc1Nlc3Npb24oKSBjb25z
dCB7IHJldHVybiBtX2lzU2Vzc2lvbjsgfQorCisgICAgYm9vbCBoYXNFeHBpcmVkKCkgY29uc3Q7
CisgICAgYm9vbCBpc0ZvcmNlRXhwaXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNGb3JjZUV4cGly
ZWQ7IH0KKyAgICBib29sIGlzVW5kZXJTaXplTGltaXQoKSBjb25zdDsKKworICAgIFN0cmluZyB0
b1N0cmluZygpIGNvbnN0OworICAgIFN0cmluZyB0b05hbWVWYWx1ZVBhaXIoKSBjb25zdDsKKyAg
ICB2b2lkIGFwcGVuZFdlYkNvcmVDb29raWUoVmVjdG9yPENvb2tpZT4mIGNvb2tpZVZlY3Rvcikg
Y29uc3Q7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fbmFtZTsKKyAgICBTdHJpbmcgbV92YWx1
ZTsKKyAgICBTdHJpbmcgbV9kb21haW47CisgICAgU3RyaW5nIG1fcHJvdG9jb2w7CisgICAgU3Ry
aW5nIG1fcGF0aDsKKyAgICBkb3VibGUgbV9leHBpcnk7CisgICAgYm9vbCBtX2lzTWF4QWdlU2V0
OworICAgIGJvb2wgbV9pc0ZvcmNlRXhwaXJlZDsKKworICAgIGRvdWJsZSBtX2NyZWF0aW9uVGlt
ZTsKKyAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBMUlUgcmVwbGFjZW1lbnQgcG9saWN5Lgor
ICAgIGRvdWJsZSBtX2xhc3RBY2Nlc3NlZDsKKworICAgIGJvb2wgbV9oYXNEZWZhdWx0RG9tYWlu
OworICAgIGJvb2wgbV9pc1NlY3VyZTsKKyAgICBib29sIG1faXNIdHRwT25seTsKKyAgICBib29s
IG1faXNTZXNzaW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
UGFyc2VkQ29va2llX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119670</attachid>
            <date>2011-12-16 14:30:03 -0800</date>
            <delta_ts>2012-02-22 15:41:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73654-20111216172906.patch</filename>
            <type>text/plain</type>
            <size>108347</size>
            <attacher>ocheung</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMDgxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2QwODc1MWIxM2EyZGM0
MzUwMDU4N2Y2OTlmY2ZhMmQ3ZTgwN2M4NC4uN2NhMTIxMTBlYjRkODExZDU2Y2I5MDk2ZmVlZTJl
YTQwNDI0OTM5MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzMiBAQAorMjAxMS0xMi0xNiAgT3R0
byBDaGV1bmcgIDxvY2hldW5nQHJpbS5jb20+CisKKyAgICAgICAgVXBzdHJlYW0gQmxhY2tCZXJy
eSBDb29raWUgTWFuYWdlbWVudCBDbGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD03MzY1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OkNvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3Jl
Ojp+Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6OmRlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZURlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnVwZ3JhZGVUYWJsZUlmTmVlZGVkKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpjbG9zZSk6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlQ2xvc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omluc2VydCk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6dXBkYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpyZW1vdmUpOgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnJlbW92ZUFsbCk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3ZlQWxs
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpnZXRDb29r
aWVzRnJvbURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0KToKKyAgICAgICAgKFdlYkNvcmU6OkNv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRh
YmFzZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llRGF0YWJhc2VCYWNraW5n
U3RvcmU6Omludm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpD
b29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6YWRkVG9DaGFuZ2VRdWV1ZSk6CisgICAgICAgICog
cGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlOjpjcmVhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkv
Q29va2llSmFyQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Y29va2ll
cyk6CisgICAgICAgIChXZWJDb3JlOjpzZXRDb29raWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmNv
b2tpZXNFbmFibGVkKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFJhd0Nvb2tpZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6ZGVsZXRlQ29va2llKToKKyAgICAgICAgKFdlYkNvcmU6OmNvb2tpZVJlcXVl
c3RIZWFkZXJGaWVsZFZhbHVlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZU1hbmFnZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmNvb2tpZU1hbmFnZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Q29va2llTWFuYWdlcik6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcik6CisgICAgICAgIChXZWJD
b3JlOjpjb29raWVTb3J0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkSWdub3JlRG9tYWlu
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OnNldENvb2tpZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2hvdWxkUmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24p
OgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Z2V0Q29va2llKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OmdldFJhd0Nvb2tpZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29va2llTWFuYWdlcjo6cmVtb3ZlQWxsQ29va2llcyk6CisgICAgICAgIChXZWJDb3JlOjpD
b29raWVNYW5hZ2VyOjpzZXRDb29raWVKYXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFu
YWdlcjo6Y2hlY2tBbmRUcmVhdENvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5h
Z2VyOjphZGRDb29raWVUb01hcCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp1
cGRhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Z2V0QmFja2luZ1N0b3Jl
Q29va2llcyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpzZXRQcml2YXRlTW9k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpmaW5kT3JDcmVhdGVDb29raWVN
YXApOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6cmVtb3ZlQ29va2llV2l0aE5h
bWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6aW5pdGlhdGVDb29raWVMaW1p
dENsZWFuVXApOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Y29va2llTGltaXRD
bGVhblVwKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpjYW5Mb2NhbEFjY2Vzc0Fs
bENvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2V0Q2FuTG9jYWxB
Y2Nlc3NBbGxDb29raWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OmNvb2tp
ZXNDb3VudCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpjb29raWVKYXIpOgor
ICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6cmVtb3ZlZENvb2tpZSk6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjphZGRlZENvb2tpZSk6CisgICAgICAgIChXZWJDb3Jl
OjpDb29raWVNYW5hZ2VyOjptYXhDb29raWVMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6Q29v
a2llTWFuYWdlcjo6c2V0Q29va2llUG9saWN5KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1h
bmFnZXI6OmNvb2tpZVBvbGljeSk6CisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29r
aWVNYXAuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6Q29va2llTWFw
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6fkNvb2tpZU1hcCk6CisgICAgICAgIChX
ZWJDb3JlOjpDb29raWVNYXA6OmV4aXN0c0Nvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29r
aWVNYXA6OmFkZENvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OnVwZGF0ZUNv
b2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OnJlbW92ZUNvb2tpZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmdldFN1YmRvbWFpbk1hcCk6CisgICAgICAgIChXZWJD
b3JlOjpDb29raWVNYXA6OmFkZFN1YmRvbWFpbk1hcCk6CisgICAgICAgIChXZWJDb3JlOjpDb29r
aWVNYXA6OmdldEFsbENvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjpyZW1v
dmVPbGRlc3RDb29raWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjp1cGRhdGVPbGRl
c3RDb29raWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjpkZWxldGVBbGxDb29raWVz
QW5kRG9tYWlucyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmdldEFsbENoaWxkQ29v
a2llcyk6CisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYXAuaDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkNvb2tpZU1hcDo6Z2V0TmFtZSk6CisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29r
aWVQYXJzZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmlzQ29va2llSGVhZGVyU2Vw
YXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OmlzTGlnaHR3ZWlnaHRTcGFjZSk6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWVQYXJzZXI6OkNvb2tpZVBhcnNlcik6CisgICAgICAgIChXZWJDb3Jl
OjpDb29raWVQYXJzZXI6On5Db29raWVQYXJzZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
UGFyc2VyOjpwYXJzZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVQYXJzZXI6OnBhcnNlT25l
Q29va2llKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5jcHA6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjpQYXJzZWRDb29raWUpOgorICAg
ICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjp+UGFyc2VkQ29va2llKToKKyAgICAgICAgKFdl
YkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0RXhwaXJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNl
ZENvb2tpZTo6c2V0TWF4QWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0
RGVmYXVsdERvbWFpbik6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6Omhhc0V4cGly
ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjppc1VuZGVyU2l6ZUxpbWl0KToK
KyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6dG9TdHJpbmcpOgorICAgICAgICAoV2Vi
Q29yZTo6UGFyc2VkQ29va2llOjp0b05hbWVWYWx1ZVBhaXIpOgorICAgICAgICAoV2ViQ29yZTo6
UGFyc2VkQ29va2llOjphcHBlbmRXZWJDb3JlQ29va2llKToKKyAgICAgICAgKiBwbGF0Zm9ybS9i
bGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhcnNl
ZENvb2tpZTo6bmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OnNldE5hbWUp
OgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjp2YWx1ZSk6CisgICAgICAgIChXZWJD
b3JlOjpQYXJzZWRDb29raWU6OnNldFZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENv
b2tpZTo6cGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OnNldFBhdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjpkb21haW4pOgorICAgICAgICAoV2ViQ29y
ZTo6UGFyc2VkQ29va2llOjpzZXREb21haW4pOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29v
a2llOjpwcm90b2NvbCk6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OnNldFByb3Rv
Y29sKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6aGFzRGVmYXVsdERvbWFpbik6
CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29raWU6OmV4cGlyeSk6CisgICAgICAgIChXZWJD
b3JlOjpQYXJzZWRDb29raWU6OmZvcmNlRXhwaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNl
ZENvb2tpZTo6bGFzdEFjY2Vzc2VkKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6
c2V0TGFzdEFjY2Vzc2VkKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6Y3JlYXRp
b25UaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6c2V0Q3JlYXRpb25UaW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhcnNlZENvb2tpZTo6aXNTZWN1cmUpOgorICAgICAgICAo
V2ViQ29yZTo6UGFyc2VkQ29va2llOjpzZXRTZWN1cmVGbGFnKToKKyAgICAgICAgKFdlYkNvcmU6
OlBhcnNlZENvb2tpZTo6aXNIdHRwT25seSk6CisgICAgICAgIChXZWJDb3JlOjpQYXJzZWRDb29r
aWU6OnNldElzSHR0cE9ubHkpOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjppc1Nl
c3Npb24pOgorICAgICAgICAoV2ViQ29yZTo6UGFyc2VkQ29va2llOjppc0ZvcmNlRXhwaXJlZCk6
CisKIDIwMTEtMTItMTUgIEFudHRpIEtvaXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY3NwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43NGJlMmU4ZjQ1MjMxN2FjZTY4N2Yz
ZDM0MmM3YTNlMzMzZjE3NWVmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmln
aHQgKEMpIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyovCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfREVCVUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaCIKKworI2luY2x1ZGUgIkNv
b2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29v
a2llLmgiCisjaW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSAiU1FMaXRlVHJh
bnNhY3Rpb24uaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgor
CisjaWYgRU5BQkxFX0NPT0tJRV9ERUJVRworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxv
Zy5oPgorI2RlZmluZSBDb29raWVMb2coZm9ybWF0LCAuLi4pIEJsYWNrQmVycnk6OlBsYXRmb3Jt
Ojpsb2dBbHdheXMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgZm9ybWF0LCAj
IyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikKKyNl
bmRpZiAvLyBFTkFCTEVfQ09PS0lFX0RFQlVHCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZv
cm1FeGVjdXRhYmxlTWVzc2FnZS5oPgorCit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TWVz
c2FnZUNsaWVudDsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUeXBlZFJlcGx5QnVmZmVy
OwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlOwor
CitzdGF0aWMgZG91YmxlIGNvbnN0IHNfZGF0YWJhc2VUaW1lckludGVydmFsID0gMjsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6Q29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmUoKQorICAgIDogTWVzc2FnZUNsaWVudChNZXNzYWdlQ2xpZW50OjpS
ZXBseUZlYXR1cmUpCisgICAgLCBtX3RhYmxlTmFtZSgiY29va2llcyIpIC8vIFRoaXMgaXMgY2hv
c2VuIHRvIG1hdGNoIE1vemlsbGEncyB0YWJsZSBuYW1lLgorICAgICwgbV9kYlRpbWVyKHRoaXMs
ICZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6c2VuZENoYW5nZXNUb0RhdGFiYXNlVGltZXJG
aXJlZCkKKyAgICAsIG1faW5zZXJ0U3RhdGVtZW50KDApCisgICAgLCBtX3VwZGF0ZVN0YXRlbWVu
dCgwKQorICAgICwgbV9kZWxldGVTdGF0ZW1lbnQoMCkKK3sKKyAgICBwdGhyZWFkX2F0dHJfdCB0
aHJlYWRBdHRyczsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkQXR0cnMpOworICAgIGNy
ZWF0ZVRocmVhZCgiY29va2llX2RhdGFiYXNlIiwgdGhyZWFkQXR0cnMpOworfQorCitDb29raWVE
YXRhYmFzZUJhY2tpbmdTdG9yZTo6fkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlKCkKK3sKKyAg
ICAvLyBGSVhNRTogVGhpcyBvYmplY3Qgd2lsbCBuZXZlciBiZSBkZWxldGVkIGR1ZSB0byB0aGUg
c2V0IHVwIG9mIENvb2tpZU1hbmFnZXIgKGl0J3MgYSBzaW5nbGV0b24pCisgICAgQ29va2llTG9n
KCJDb29raWVCYWNraW5nU3RvcmUgLSBEZXN0cnVjdGluZyIpOworI2lmbmRlZiBOREVCVUcKKyAg
ICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIEFTU0VSVCht
X2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OmRlc3Ryb3koKQoreworICAgIENvb2tpZUxvZygiQ29v
a2llQmFja2luZ1N0b3JlIC0gQ2FsbGluZyBkZXN0cm95IG1ldGhvZCIpOworI2lmIEVOQUJMRV9D
T09LSUVfREVCVUcKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gbV9jaGFuZ2VkY29va2llcyBo
YXMgJWQuIiwgbV9jaGFuZ2VkQ29va2llcy5zaXplKCkpOworICAgIH0KKyNlbmRpZgorCisgICAg
Ly8gbWFrZSBzdXJlIGFsbCBidWZmZXJlZCBvcGVyYXRpb25zIGZpbmlzaCwgdGhlbiBoYXZlIHRo
ZSB0aHJlYWQgZGVsZXRlIGl0c2VsZgorICAgIGRpc3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RD
YWxsTWVzc2FnZSgmQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZURlc3Ryb3ksIHRo
aXMpKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlRGVzdHJv
eSgpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpbnZva2VDbG9zZSgp
OworICAgIGRlbGV0ZSB0aGlzOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3Jl
Ojp1cGdyYWRlVGFibGVJZk5lZWRlZChjb25zdCBTdHJpbmcmIGRhdGFiYXNlRmllbGRzLCBjb25z
dCBTdHJpbmcmIHByaW1hcnlLZXlGaWVsZHMpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVh
ZCgpKTsKKworICAgIGJvb2wgY3JlYXRpb25UaW1lRXhpc3RzID0gZmFsc2U7CisgICAgYm9vbCBw
cm90b2NvbEV4aXN0cyA9IGZhbHNlOworCisgICAgaWYgKCFtX2RiLnRhYmxlRXhpc3RzKG1fdGFi
bGVOYW1lKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGV4aXN0aW5n
IHRhYmxlIGhhcyB0aGUgcmVxdWlyZWQgZGF0YWJhc2UgZmllbGRzCisgICAgeworICAgICAgICBT
dHJpbmcgcXVlcnkoIlBSQUdNQSB0YWJsZV9pbmZvKCIgKyBtX3RhYmxlTmFtZSArICIpOyIpOwor
CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYiwgcXVlcnkpOworICAgICAg
ICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5u
b3QgcHJlcGFyZSBzdGF0ZW1lbnQgdG8gcXVlcnkgY29va2llIHRhYmxlIGluZm8uIHNxbDolcyIs
IHF1ZXJ5LnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJy
b3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpID09IFNRTFJl
c3VsdFJvdykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1u
VGV4dCgxKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09ICJjcmVhdGlvblRpbWUiKQorICAgICAg
ICAgICAgICAgIGNyZWF0aW9uVGltZUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICBpZiAobmFt
ZSA9PSAicHJvdG9jb2wiKQorICAgICAgICAgICAgICAgIHByb3RvY29sRXhpc3RzID0gdHJ1ZTsK
KyAgICAgICAgICAgIGlmIChjcmVhdGlvblRpbWVFeGlzdHMgJiYgcHJvdG9jb2xFeGlzdHMpCisg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExPRyhOZXR3b3JrLCAi
TmVlZCB0byB1cGRhdGUgY29va2llIHRhYmxlIHNjaGVtYS4iKTsKKyAgICB9CisKKyAgICAvLyBE
cm9wIGFuZCBSZWNyZWF0ZSB0aGUgY29va2llIHRhYmxlIHRvIHVwZGF0ZSB0byB0aGUgbmV3ZXN0
IGRhdGFiYXNlIGZpZWxkcworICAgIC8vIFdlIGRvIG5vdCB1c2UgYWx0ZXIgdGFibGUgLSBhZGQg
Y29sdW1uIGJlY2F1c2UgdGhhdCBtZXRob2QgY2Fubm90IGFkZCBwcmltYXJ5IGtleXMKKyAgICBW
ZWN0b3I8U3RyaW5nPiBjb21tYW5kczsKKworICAgIC8vIEJhY2t1cCBleGlzdGluZyB0YWJsZQor
ICAgIFN0cmluZyByZW5hbWVRdWVyeSgiQUxURVIgVEFCTEUgIiArIG1fdGFibGVOYW1lICsgIiBS
RU5BTUUgVE8gQmFja3VwXyIgKyBtX3RhYmxlTmFtZSArICI7Iik7CisgICAgY29tbWFuZHMuYXBw
ZW5kKHJlbmFtZVF1ZXJ5KTsKKworICAgIC8vIFJlY3JlYXRlIHRoZSBjb29raWUgdGFibGUgdXNp
bmcgdGhlIG5ldyBkYXRhYmFzZSBhbmQgcHJpbWFyeSBrZXkgZmllbGRzCisgICAgU3RyaW5nIGNy
ZWF0ZVRhYmxlUXVlcnkoIkNSRUFURSBUQUJMRSAiKTsKKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9
IG1fdGFibGVOYW1lOworICAgIGNyZWF0ZVRhYmxlUXVlcnkgKz0gIiAoIiArIGRhdGFiYXNlRmll
bGRzICsgIiwgIiArIHByaW1hcnlLZXlGaWVsZHMgKyAiKTsiOworICAgIGNvbW1hbmRzLmFwcGVu
ZChjcmVhdGVUYWJsZVF1ZXJ5KTsKKworICAgIC8vIENvcHkgdGhlIG9sZCBkYXRhIGludG8gdGhl
IG5ldyB0YWJsZS4gSWYgYSBjb2x1bW4gZG9lcyBub3QgZXhpc3RzLAorICAgIC8vIHdlIGhhdmUg
dG8gcHV0IGEgJycgaW4gdGhlIHNlbGVjdCBzdGF0ZW1lbnQgdG8gbWFrZSB0aGUgbnVtYmVyIG9m
IGNvbHVtbnMKKyAgICAvLyBlcXVhbCBpbiB0aGUgaW5zZXJ0IHN0YXRlbWVudC4KKyAgICBTdHJp
bmcgbWlncmF0aW9uUXVlcnkoIklOU0VSVCBPUiBSRVBMQUNFIElOVE8gIik7CisgICAgbWlncmF0
aW9uUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgbWlncmF0aW9uUXVlcnkgKz0gIiBTRUxFQ1Qg
KiI7CisgICAgaWYgKCFjcmVhdGlvblRpbWVFeGlzdHMpCisgICAgICAgIG1pZ3JhdGlvblF1ZXJ5
ICs9ICIsJyciOworICAgIGlmICghcHJvdG9jb2xFeGlzdHMpCisgICAgICAgIG1pZ3JhdGlvblF1
ZXJ5ICs9ICIsJyciOworICAgIG1pZ3JhdGlvblF1ZXJ5ICs9ICIgRlJPTSBCYWNrdXBfIiArIG1f
dGFibGVOYW1lOworICAgIGNvbW1hbmRzLmFwcGVuZChtaWdyYXRpb25RdWVyeSk7CisKKyAgICAv
LyBUaGUgbmV3IGNvbHVtbnMgd2lsbCBiZSBibGFuaywgc2V0IHRoZSBuZXcgdmFsdWVzLgorICAg
IGlmICghY3JlYXRpb25UaW1lRXhpc3RzKSB7CisgICAgICAgIFN0cmluZyBzZXRDcmVhdGlvblRp
bWVRdWVyeSgiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIGNyZWF0aW9uVGltZSA9IGxh
c3RBY2Nlc3NlZDsiKTsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5kKHNldENyZWF0aW9uVGltZVF1
ZXJ5KTsKKyAgICB9CisKKyAgICBpZiAoIXByb3RvY29sRXhpc3RzKSB7CisgICAgICAgIFN0cmlu
ZyBzZXRQcm90b2NvbFF1ZXJ5KCJVUERBVEUgIiArIG1fdGFibGVOYW1lICsgIiBTRVQgcHJvdG9j
b2wgPSAnaHR0cCcgV0hFUkUgaXNTZWN1cmUgPSAnMCc7Iik7CisgICAgICAgIFN0cmluZyBzZXRQ
cm90b2NvbFF1ZXJ5MigiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIHByb3RvY29sID0g
J2h0dHBzJyBXSEVSRSBpc1NlY3VyZSA9ICcxJzsiKTsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5k
KHNldFByb3RvY29sUXVlcnkpOworICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2V0UHJvdG9jb2xR
dWVyeTIpOworICAgIH0KKworICAgIC8vIERyb3AgdGhlIGJhY2t1cCB0YWJsZQorICAgIFN0cmlu
ZyBkcm9wQmFja3VwUXVlcnkoIkRST1AgVEFCTEUgSUYgRVhJU1RTIEJhY2t1cF8iICsgbV90YWJs
ZU5hbWUgKyAiOyIpOworICAgIGNvbW1hbmRzLmFwcGVuZChkcm9wQmFja3VwUXVlcnkpOworCisg
ICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYiwgZmFsc2UpOworICAgIHRyYW5z
YWN0aW9uLmJlZ2luKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21tYW5kcy5zaXpl
KCk7ICsraSkgeworICAgICAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZHNbaV0p
KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBhbHRlciBjb29raWUgdGFibGUg
d2hlbiBleGVjdXRpbmcgc3FsOiVzIiwgY29tbWFuZHNbaV0udXRmOCgpLmRhdGEoKSk7CisgICAg
ICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVy
cm9yTXNnKCkpOworICAgICAgICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soKTsKKworICAgICAg
ICAgICAgLy8gZmluYWxseSBpdCB3aWxsIHRyeSB0byBrZWVwIGEgYmFja3VwIG9mIHRoZSBjdXJy
ZW50IGNvb2tpZSB0YWJsZSBmb3IgdGhlIGZ1dHVyZSByZXN0b3JhdGlvbi4KKyAgICAgICAgICAg
IC8vIE5PVElDRTogdGhpcyB3aWxsIGVzc2VudGlhbGx5IERFTEVURSB0aGUgY3VycmVudCB0YWJs
ZSwgYnV0IHRoYXQncyBiZXR0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gY29udGludWFsbHkgaGl0
dGluZyB0aGlzIGNhc2UgYW5kIG5ldmVyIGJlaW5nIGFibGUgdG8gdXNlIHRoZSBjb29raWUgdGFi
bGUuCisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGV2ZXIgaGl0LCBpdCdzIGRlZmluaXRlbHkg
YSBidWcuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIFN0
cmluZyByZW5hbWVRdWVyeSgiQUxURVIgVEFCTEUgIiArIG1fdGFibGVOYW1lICsgIiBSRU5BTUUg
VE8gQmFja3VwMl8iICsgbV90YWJsZU5hbWUgKyAiOyIpOworICAgICAgICAgICAgaWYgKCFtX2Ri
LmV4ZWN1dGVDb21tYW5kKHJlbmFtZVF1ZXJ5KSkgeworICAgICAgICAgICAgICAgIExPR19FUlJP
UigiRmFpbGVkIHRvIGJhY2t1cCBleGlzdGluZyBjb29raWUgdGFibGUuIik7CisgICAgICAgICAg
ICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJv
ck1zZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgIH0KKyAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICBMT0coTmV0d29yaywgIlN1Y2Nl
c3NmdWxseSB1cGRhdGVkIGNvb2tpZSB0YWJsZSBzY2hlbWEuIik7Cit9CisKK3ZvaWQgQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6Om9wZW4oY29uc3QgU3RyaW5nJiBjb29raWVKYXIpCit7Cisg
ICAgZGlzcGF0Y2hNZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZTo6aW52b2tlT3BlbiwgdGhpcywgY29va2llSmFyKSk7Cit9CisKK3ZvaWQg
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZU9wZW4oY29uc3QgU3RyaW5nJiBjb29r
aWVKYXIpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpZiAobV9kYi5p
c09wZW4oKSkKKyAgICAgICAgaW52b2tlQ2xvc2UoKTsKKworICAgIGlmICghbV9kYi5vcGVuKGNv
b2tpZUphcikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3Qgb3BlbiB0aGUgY29va2ll
IGRhdGFiYXNlLiBObyBjb29raWUgd2lsbCBiZSBzdG9yZWQhIik7CisgICAgICAgIExPR19FUlJP
UigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2RiLmV4ZWN1dGVDb21tYW5kKCJQUkFHTUEgbG9j
a2luZ19tb2RlPUVYQ0xVU0lWRTsiKTsKKyAgICBtX2RiLmV4ZWN1dGVDb21tYW5kKCJQUkFHTUEg
am91cm5hbF9tb2RlPVRSVU5DQVRFOyIpOworCisgICAgY29uc3QgU3RyaW5nIHByaW1hcnlLZXlG
aWVsZHMoIlBSSU1BUlkgS0VZIChwcm90b2NvbCwgaG9zdCwgcGF0aCwgbmFtZSkiKTsKKyAgICBj
b25zdCBTdHJpbmcgZGF0YWJhc2VGaWVsZHMoIm5hbWUgVEVYVCwgdmFsdWUgVEVYVCwgaG9zdCBU
RVhULCBwYXRoIFRFWFQsIGV4cGlyeSBET1VCTEUsIGxhc3RBY2Nlc3NlZCBET1VCTEUsIGlzU2Vj
dXJlIElOVEVHRVIsIGlzSHR0cE9ubHkgSU5URUdFUiwgY3JlYXRpb25UaW1lIERPVUJMRSwgcHJv
dG9jb2wgVEVYVCIpOworICAgIC8vIFVwZ3JhZGUgdGFibGUgdG8gYWRkIHRoZSBuZXcgY29sdW1u
IGNyZWF0aW9uVGltZSBhbmQgcHJvdG9jb2wgZm9yIGJhY2t3YXJkIGNvbXBsaWFuY2UuCisgICAg
dXBncmFkZVRhYmxlSWZOZWVkZWQoZGF0YWJhc2VGaWVsZHMsIHByaW1hcnlLZXlGaWVsZHMpOwor
CisgICAgLy8gQ3JlYXRlIHRhYmxlIGlmIG5vdCBleHNpc3QgaW4gY2FzZSB0aGF0IHRoZSBhbHRl
clRhYmxlSWZOZWVkZWQoKSBmYWlsZWQgYWNjaWRlbnRhbGx5LgorICAgIFN0cmluZyBjcmVhdGVU
YWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiKTsKKyAgICBjcmVhdGVUYWJs
ZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIC8vIFRoaXMgdGFibGUgc2NoZW1hIGlzIGNvbXBs
aWFudCB3aXRoIE1vemlsbGEncy4KKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIgKyBkYXRh
YmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzKyIpOyI7CisKKyAgICBpZiAoIW1f
ZGIuZXhlY3V0ZUNvbW1hbmQoY3JlYXRlVGFibGVRdWVyeSkpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJDb3VsZCBub3QgY3JlYXRlIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgY29va2llcyBpbnRvLiBO
byBjb29raWUgd2lsbCBiZSBzdG9yZWQhIik7CisgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVy
cm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGludm9rZUNs
b3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcgaW5zZXJ0UXVlcnko
IklOU0VSVCBPUiBSRVBMQUNFIElOVE8gIik7CisgICAgaW5zZXJ0UXVlcnkgKz0gbV90YWJsZU5h
bWU7CisgICAgaW5zZXJ0UXVlcnkgKz0gIiAobmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGly
eSwgbGFzdEFjY2Vzc2VkLCBpc1NlY3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90
b2NvbCkgVkFMVUVTICg/MSwgPzIsID8zLCA/NCwgPzUsID82LCA/NywgPzgsID85LCA/MTApOyI7
CisKKyAgICBtX2luc2VydFN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgaW5z
ZXJ0UXVlcnkpOworICAgIGlmIChtX2luc2VydFN0YXRlbWVudC0+cHJlcGFyZSgpKSB7CisgICAg
ICAgIExPR19FUlJPUigiQ2Fubm90IHNhdmUgY29va2llcyIpOworICAgICAgICBMT0dfRVJST1Io
IlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0K
KworICAgIFN0cmluZyB1cGRhdGVRdWVyeSgiVVBEQVRFICIpOworICAgIHVwZGF0ZVF1ZXJ5ICs9
IG1fdGFibGVOYW1lOworICAgIC8vIFRoZSB3aGVyZSBzdGF0ZW1lbnQgaXMgY2hvc2VuIHRvIG1h
dGNoIENvb2tpZU1hcCBrZXkuCisgICAgdXBkYXRlUXVlcnkgKz0gIiBTRVQgbmFtZSA9ID8xLCB2
YWx1ZSA9ID8yLCBob3N0ID0gPzMsIHBhdGggPSA/NCwgZXhwaXJ5ID0gPzUsIGxhc3RBY2Nlc3Nl
ZCA9ID82LCBpc1NlY3VyZSA9ID83LCBpc0h0dHBPbmx5ID0gPzgsIGNyZWF0aW9uVGltZSA9ID85
LCBwcm90b2NvbCA9ID8xMCB3aGVyZSBwcm90b2NvbCA9ID8xMCBhbmQgbmFtZSA9ID8xIGFuZCBo
b3N0ID0gPzMgYW5kIHBhdGggPSA/NDsiOworICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gbmV3IFNR
TGl0ZVN0YXRlbWVudChtX2RiLCB1cGRhdGVRdWVyeSk7CisKKyAgICBpZiAobV91cGRhdGVTdGF0
ZW1lbnQtPnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCB1cGRhdGUgY29v
a2llcyIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1f
ZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVM
RVRFIEZST00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgLy8gVGhl
IHdoZXJlIHN0YXRlbWVudCBpcyBjaG9zZW4gdG8gbWF0Y2ggQ29va2llTWFwIGtleS4KKyAgICBk
ZWxldGVRdWVyeSArPSAiIFdIRVJFIG5hbWU9PzEgYW5kIGhvc3Q9PzIgYW5kIHBhdGg9PzMgYW5k
IHByb3RvY29sPT80OyI7CisgICAgbV9kZWxldGVTdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVt
ZW50KG1fZGIsIGRlbGV0ZVF1ZXJ5KTsKKworICAgIGlmIChtX2RlbGV0ZVN0YXRlbWVudC0+cHJl
cGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29raWVzIik7Cisg
ICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJy
b3JNc2coKSk7CisgICAgfQorCit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6
OmNsb3NlKCkKK3sKKyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2Uo
JkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VDbG9zZSwgdGhpcykpOworfQorCit2
b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VDbG9zZSgpCit7CisgICAgQVNT
RVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9y
ZSAtIENsb3NpbmciKTsKKworICAgIHNpemVfdCBjaGFuZ2VkQ29va2llc1NpemU7CisgICAgewor
ICAgICAgICBNdXRleExvY2tlciBsb2NrKG1fbXV0ZXgpOworICAgICAgICBpZiAobV9kYlRpbWVy
LmlzQWN0aXZlKCkpCisgICAgICAgICAgICBtX2RiVGltZXIuc3RvcCgpOworICAgICAgICBjaGFu
Z2VkQ29va2llc1NpemUgPSBtX2NoYW5nZWRDb29raWVzLnNpemUoKTsKKyAgICB9CisKKyAgICBp
ZiAoY2hhbmdlZENvb2tpZXNTaXplID4gMCkKKyAgICAgICAgaW52b2tlU2VuZENoYW5nZXNUb0Rh
dGFiYXNlKCk7CisKKyAgICBkZWxldGUgbV9pbnNlcnRTdGF0ZW1lbnQ7CisgICAgbV9pbnNlcnRT
dGF0ZW1lbnQgPSAwOworICAgIGRlbGV0ZSBtX3VwZGF0ZVN0YXRlbWVudDsKKyAgICBtX3VwZGF0
ZVN0YXRlbWVudCA9IDA7CisgICAgZGVsZXRlIG1fZGVsZXRlU3RhdGVtZW50OworICAgIG1fZGVs
ZXRlU3RhdGVtZW50ID0gMDsKKworICAgIGlmIChtX2RiLmlzT3BlbigpKQorICAgICAgICBtX2Ri
LmNsb3NlKCk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omluc2VydChj
b25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tp
bmdTdG9yZSAtIGFkZGluZyBpbnNlcnRpbmcgY29va2llICVzIHRvIHF1ZXVlLiIsIGNvb2tpZS0+
dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBhZGRUb0NoYW5nZVF1ZXVlKGNvb2tpZSwg
SW5zZXJ0KTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6dXBkYXRlKGNv
bnN0IFBhcnNlZENvb2tpZSogY29va2llKQoreworICAgIENvb2tpZUxvZygiQ29va2llQmFja2lu
Z1N0b3JlIC0gYWRkaW5nIHVwZGF0aW5nIGNvb2tpZSAlcyB0byBxdWV1ZS4iLCBjb29raWUtPnRv
U3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgYWRkVG9DaGFuZ2VRdWV1ZShjb29raWUsIFVw
ZGF0ZSk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnJlbW92ZShjb25z
dCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdT
dG9yZSAtIGFkZGluZyBkZWxldGluZyBjb29raWUgJXMgdG8gcXVldWUuIiwgY29va2llLT50b1N0
cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFkZFRvQ2hhbmdlUXVldWUoY29va2llLCBEZWxl
dGUpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpyZW1vdmVBbGwoKQor
eworICAgIGRpc3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmQ29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZVJlbW92ZUFsbCwgdGhpcykpOworfQorCit2b2lkIENv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VSZW1vdmVBbGwoKQoreworICAgIEFTU0VS
VChpc0N1cnJlbnRUaHJlYWQoKSk7CisgICAgaWYgKCFtX2RiLmlzT3BlbigpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIHJlbW92ZSBBbGwg
Y29va2llcyBmcm9tIGJhY2tpbmdzdG9yZSIpOworCisgICAgeworICAgICAgICBNdXRleExvY2tl
ciBsb2NrKG1fbXV0ZXgpOworICAgICAgICBtX2NoYW5nZWRDb29raWVzLmNsZWFyKCk7CisgICAg
fQorCisgICAgU3RyaW5nIGRlbGV0ZVF1ZXJ5KCJERUxFVEUgRlJPTSAiKTsKKyAgICBkZWxldGVR
dWVyeSArPSBtX3RhYmxlTmFtZTsKKyAgICBkZWxldGVRdWVyeSArPSAiOyI7CisKKyAgICBTUUxp
dGVTdGF0ZW1lbnQgZGVsZXRlU3RhdGVtZW50KG1fZGIsIGRlbGV0ZVF1ZXJ5KTsKKyAgICBpZiAo
ZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5v
dCBwcmVwYXJlIERFTEVURSAqIHN0YXRlbWVudCIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0
ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgaWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkg
eworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBkZWxldGUgY29va2llIGZyb20gZGF0YWJhc2Ui
KTsKKyAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxh
c3RFcnJvck1zZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwordm9pZCBDb29raWVE
YXRhYmFzZUJhY2tpbmdTdG9yZTo6Z2V0Q29va2llc0Zyb21EYXRhYmFzZShWZWN0b3I8UGFyc2Vk
Q29va2llKj4mIHN0YWNrT2ZDb29raWVzLCB1bnNpZ25lZCBpbnQgbGltaXQpCit7CisgICAgLy8g
SXQgaXMgbm90IGEgaHVnZSBwZXJmb3JtYW5jZSBoaXQgdG8gd2FpdCBvbiB0aGUgcmVwbHkgaGVy
ZSBiZWNhdXNlIHRoaXMgaXMgb25seSBkb25lIG9uY2UgZHVyaW5nIHNldHVwIGFuZCB3aGVuIHR1
cm5pbmcgb2ZmIHByaXZhdGUgbW9kZS4KKyAgICBUeXBlZFJlcGx5QnVmZmVyPCBWZWN0b3I8UGFy
c2VkQ29va2llKj4qID4gcmVwbHlCdWZmZXIoMCk7CisgICAgZGlzcGF0Y2hNZXNzYWdlKGNyZWF0
ZU1ldGhvZENhbGxNZXNzYWdlV2l0aFJldHVybigmQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6
Omludm9rZUdldENvb2tpZXNXaXRoTGltaXQsICZyZXBseUJ1ZmZlciwgdGhpcywgbGltaXQpKTsK
KyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4qIGNvb2tpZXMgPSByZXBseUJ1ZmZlci5wb2ludGVy
KCk7CisgICAgc3RhY2tPZkNvb2tpZXMuc3dhcCgqY29va2llcyk7CisgICAgZGVsZXRlIGNvb2tp
ZXM7Cit9CisKK1ZlY3RvcjxQYXJzZWRDb29raWUqPiogQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmU6Omludm9rZUdldENvb2tpZXNXaXRoTGltaXQodW5zaWduZWQgaW50IGxpbWl0KQoreworICAg
IEFTU0VSVChpc0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB0YWJs
ZSBleGlzdHMgdG8gYXZvaWQgZG9pbmcgYW4gdW5uZWNlc3NhcnkgcmVxdWVzdC4KKyAgICBpZiAo
IW1fZGIuaXNPcGVuKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgU3RyaW5nQnVpbGRlciBz
ZWxlY3RRdWVyeTsKKyAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIlNFTEVDVCBuYW1lLCB2YWx1ZSwg
aG9zdCwgcGF0aCwgZXhwaXJ5LCBsYXN0QWNjZXNzZWQsIGlzU2VjdXJlLCBpc0h0dHBPbmx5LCBj
cmVhdGlvblRpbWUsIHByb3RvY29sIEZST00gIik7CisgICAgc2VsZWN0UXVlcnkuYXBwZW5kKG1f
dGFibGVOYW1lKTsKKyAgICBpZiAobGltaXQgPiAwKSB7CisgICAgICAgIHNlbGVjdFF1ZXJ5LmFw
cGVuZCgiIE9SREVSIEJZIGxhc3RBY2Nlc3NlZCBBU0MiKTsKKyAgICAgICAgc2VsZWN0UXVlcnku
YXBwZW5kKCIgTElNSVQgIiArIFN0cmluZzo6bnVtYmVyKGxpbWl0KSk7CisgICAgfQorICAgIHNl
bGVjdFF1ZXJ5LmFwcGVuZCgiOyIpOworCisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3Rv
cmUgLSBpbnZva2VHZXRBbGxDb29raWVzIHdpdGggc2VsZWN0IHF1ZXJ5ICVzIiwgc2VsZWN0UXVl
cnkudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIFNRTGl0ZVN0YXRlbWVudCBzZWxl
Y3RTdGF0ZW1lbnQobV9kYiwgc2VsZWN0UXVlcnkudG9TdHJpbmcoKSk7CisKKyAgICBpZiAoc2Vs
ZWN0U3RhdGVtZW50LnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCByZXRy
aWV2ZWQgY29va2llcyBmcm9tIHRoZSBkYXRhYmFzZSIpOworICAgICAgICBMT0dfRVJST1IoIlNR
TGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9CisKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4qIGNvb2tpZXMgPSBu
ZXcgVmVjdG9yPFBhcnNlZENvb2tpZSo+OworICAgIHdoaWxlIChzZWxlY3RTdGF0ZW1lbnQuc3Rl
cCgpID09IFNRTFJlc3VsdFJvdykgeworICAgICAgICAvLyBUaGVyZSBpcyBhIHJvdyB0byBmZXRj
aAorCisgICAgICAgIFN0cmluZyBuYW1lID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRleHQo
MCk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0
KDEpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRl
eHQoMik7CisgICAgICAgIFN0cmluZyBwYXRoID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRl
eHQoMyk7CisgICAgICAgIGRvdWJsZSBleHBpcnkgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1u
RG91YmxlKDQpOworICAgICAgICBkb3VibGUgbGFzdEFjY2Vzc2VkID0gc2VsZWN0U3RhdGVtZW50
LmdldENvbHVtbkRvdWJsZSg1KTsKKyAgICAgICAgYm9vbCBpc1NlY3VyZSA9IHNlbGVjdFN0YXRl
bWVudC5nZXRDb2x1bW5JbnQoNik7CisgICAgICAgIGJvb2wgaXNIdHRwT25seSA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5JbnQoNyk7CisgICAgICAgIGRvdWJsZSBjcmVhdGlvblRpbWUgPSBz
ZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uRG91YmxlKDgpOworICAgICAgICBTdHJpbmcgcHJvdG9j
b2wgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCg5KTsKKworICAgICAgICBjb29raWVz
LT5hcHBlbmQobmV3IFBhcnNlZENvb2tpZShuYW1lLCB2YWx1ZSwgZG9tYWluLCBwcm90b2NvbCwg
cGF0aCwgZXhwaXJ5LCBsYXN0QWNjZXNzZWQsIGNyZWF0aW9uVGltZSwgaXNTZWN1cmUsIGlzSHR0
cE9ubHkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29va2llczsKK30KKwordm9pZCBDb29raWVE
YXRhYmFzZUJhY2tpbmdTdG9yZTo6c2VuZENoYW5nZXNUb0RhdGFiYXNlKGludCBuZXh0SW50ZXJ2
YWwpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICBpZiAoIW1fZGJUaW1l
ci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0g
U3RhcnRpbmcgb25lIHNob3Qgc2VuZCB0byBkYXRhYmFzZSIpOworICAgICAgICBtX2RiVGltZXIu
c3RhcnRPbmVTaG90KG5leHRJbnRlcnZhbCk7CisgICAgfSBlbHNlIHsKKyNpZiAhTkRFQlVHCisg
ICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gVGltZXIgYWxyZWFkeSBydW5u
aW5nLCBza2lwcGluZyB0aGlzIHJlcXVlc3QiKTsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBD
b29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6c2VuZENoYW5nZXNUb0RhdGFiYXNlVGltZXJGaXJl
ZChUaW1lcjxDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZT4qIHRpbWVyKQoreworICAgIEFTU0VS
VF9VTlVTRUQodGltZXIsIHRpbWVyID09ICZtX2RiVGltZXIpOworICAgIGRpc3BhdGNoTWVzc2Fn
ZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omlu
dm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSwgdGhpcykpOworfQorCit2b2lkIENvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlOjppbnZva2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UoKQoreworICAgIEFT
U0VSVChpc0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgICBpZiAoIW1fZGIuaXNPcGVuKCkpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJUaW1lciBGaXJlZCwgYnV0IGRhdGFiYXNlIGlzIGNsb3NlZC4iKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZlY3RvcjxDb29raWVBY3Rpb24+IGNoYW5n
ZWRDb29raWVzOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAg
ICAgICAgY2hhbmdlZENvb2tpZXMuc3dhcChtX2NoYW5nZWRDb29raWVzKTsKKyAgICAgICAgQVNT
RVJUKG1fY2hhbmdlZENvb2tpZXMuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBpZiAoY2hhbmdl
ZENvb2tpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0
b3JlIC0gVGltZXIgZmlyZWQsIGJ1dCBubyBjb29raWVzIGluIGNoYW5nZWxpc3QiKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIFRp
bWVyIGZpcmVkLCBzZW5kaW5nIGNoYW5nZXMgdG8gZGF0YWJhc2UuIFdlIGhhdmUgJWQgY2hhbmdl
cyIsIGNoYW5nZWRDb29raWVzLnNpemUoKSk7CisgICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNh
Y3Rpb24obV9kYiwgZmFsc2UpOworICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7CisKKyAgICAvLyBJ
dGVyYXRlIHRocm91Z2ggZXZlcnkgZWxlbWVudCBpbiB0aGUgY2hhbmdlIGxpc3QgdG8gbWFrZSBj
YWxscworICAgIC8vIElmIGVycm9yIG9jY3VycywgaWdub3JlIGl0IGFuZCBjb250aW51ZSB0byB0
aGUgbmV4dCBzdGF0ZW1lbnQKKyAgICBzaXplX3Qgc2l6ZU9mQ2hhbmdlID0gY2hhbmdlZENvb2tp
ZXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZU9mQ2hhbmdlOyBpKysp
IHsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50KiBtX3N0YXRlbWVudDsKKyAgICAgICAgY29uc3Qg
UGFyc2VkQ29va2llIGNvb2tpZSA9IGNoYW5nZWRDb29raWVzW2ldLmZpcnN0OworICAgICAgICBV
cGRhdGVQYXJhbWV0ZXIgYWN0aW9uID0gY2hhbmdlZENvb2tpZXNbaV0uc2Vjb25kOworCisgICAg
ICAgIGlmIChhY3Rpb24gPT0gRGVsZXRlKSB7CisgICAgICAgICAgICBtX3N0YXRlbWVudCA9IG1f
ZGVsZXRlU3RhdGVtZW50OworICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3Rv
cmUgLSBkZWxldGluZyBjb29raWUgJXMuIiwgY29va2llLnRvU3RyaW5nKCkudXRmOCgpLmRhdGEo
KSk7CisKKyAgICAgICAgICAgIC8vIEJpbmRzIGFsbCB0aGUgdmFsdWVzCisgICAgICAgICAgICBp
ZiAobV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIGNvb2tpZS5uYW1lKCkpIHx8IG1fc3RhdGVtZW50
LT5iaW5kVGV4dCgyLCBjb29raWUuZG9tYWluKCkpCisgICAgICAgICAgICAgICAgfHwgbV9zdGF0
ZW1lbnQtPmJpbmRUZXh0KDMsIGNvb2tpZS5wYXRoKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4
dCg0LCBjb29raWUucHJvdG9jb2woKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkNh
bm5vdCBiaW5kIGNvb2tpZSBkYXRhIHRvIGRlbGV0ZSIpOworICAgICAgICAgICAgICAgIExPR19F
UlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7Cisg
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAo
YWN0aW9uID09IFVwZGF0ZSkgeworICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFj
a2luZ1N0b3JlIC0gdXBkYXRpbmcgY29va2llICVzLiIsIGNvb2tpZS50b1N0cmluZygpLnV0Zjgo
KS5kYXRhKCkpOworICAgICAgICAgICAgICAgIG1fc3RhdGVtZW50ID0gbV91cGRhdGVTdGF0ZW1l
bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29v
a2llQmFja2luZ1N0b3JlIC0gaW5zZXJ0aW5nIGNvb2tpZSAlcy4iLCBjb29raWUudG9TdHJpbmco
KS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBtX3N0YXRlbWVudCA9IG1faW5zZXJ0
U3RhdGVtZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kcyBhbGwgdGhl
IHZhbHVlcworICAgICAgICAgICAgaWYgKG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29raWUu
bmFtZSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLnZhbHVlKCkpCisgICAg
ICAgICAgICAgICAgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIGNvb2tpZS5kb21haW4oKSkg
fHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDQsIGNvb2tpZS5wYXRoKCkpCisgICAgICAgICAgICAg
ICAgfHwgbV9zdGF0ZW1lbnQtPmJpbmREb3VibGUoNSwgY29va2llLmV4cGlyeSgpKSB8fCBtX3N0
YXRlbWVudC0+YmluZERvdWJsZSg2LCBjb29raWUubGFzdEFjY2Vzc2VkKCkpCisgICAgICAgICAg
ICAgICAgfHwgbV9zdGF0ZW1lbnQtPmJpbmRJbnQ2NCg3LCBjb29raWUuaXNTZWN1cmUoKSkgfHwg
bV9zdGF0ZW1lbnQtPmJpbmRJbnQ2NCg4LCBjb29raWUuaXNIdHRwT25seSgpKQorICAgICAgICAg
ICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kRG91YmxlKDksIGNvb2tpZS5jcmVhdGlvblRpbWUo
KSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDEwLCBjb29raWUucHJvdG9jb2woKSkpIHsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBiaW5kIGNvb2tpZSBkYXRhIHRvIHNhdmUi
KTsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIs
IG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgaW50IHJjID0gbV9zdGF0ZW1lbnQtPnN0ZXAoKTsKKyAgICAgICAgbV9zdGF0
ZW1lbnQtPnJlc2V0KCk7CisgICAgICAgIGlmIChyYyAhPSBTUUxSZXN1bHRPayAmJiByYyAhPSBT
UUxSZXN1bHREb25lKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBtYWtlIGNhbGwg
dG8gdGhlIGRhdGFiYXNlIik7CisgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBN
ZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9y
ZSAtIHRyYW5zYWN0aW9uIGNvbXBsZXRlIik7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmU6OmFkZFRvQ2hhbmdlUXVldWUoY29uc3QgUGFyc2VkQ29va2llKiBjaGFuZ2VkQ29v
a2llLCBVcGRhdGVQYXJhbWV0ZXIgYWN0aW9uUGFyYW0pCit7CisgICAgQVNTRVJUKCFjb29raWUt
PmlzU2Vzc2lvbigpKTsKKyAgICBQYXJzZWRDb29raWUgY29va2llQ29weShjaGFuZ2VkQ29va2ll
KTsKKyAgICBDb29raWVBY3Rpb24gYWN0aW9uKGNvb2tpZUNvcHksIGFjdGlvblBhcmFtKTsKKyAg
ICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIG1fY2hhbmdl
ZENvb2tpZXMuYXBwZW5kKGFjdGlvbik7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2lu
Z1N0b3JlIC0gbV9jaGFuZ2VkY29va2llcyBoYXMgJWQuIiwgbV9jaGFuZ2VkQ29va2llcy5zaXpl
KCkpOworICAgIH0KKyAgICBzZW5kQ2hhbmdlc1RvRGF0YWJhc2Uoc19kYXRhYmFzZVRpbWVySW50
ZXJ2YWwpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFj
a2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0
b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uY2JhNDA3YjM4MTJkYjE0ZTBhOTg5M2ZjMGVmMjUyMDlmYzk3ZmFk
ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkv
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaApA
QCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKdWxpZW4gQ2hhZmZy
YWl4IDxqY2hhZmZyYWl4QHBsZXlvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJj
aCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmVfaAorI2RlZmluZSBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9o
CisKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNl
LmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1l
c3NhZ2VDbGllbnQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nUHJpbWl0aXZlcy5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2VkQ29va2llOworCitjbGFzcyBDb29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZSA6IHB1YmxpYyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TWVz
c2FnZUNsaWVudCB7CitwdWJsaWM6CisgICAgc3RhdGljIENvb2tpZURhdGFiYXNlQmFja2luZ1N0
b3JlKiBjcmVhdGUoKSB7IHJldHVybiBuZXcgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU7IH0K
KyAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgIHZvaWQgb3Blbihjb25zdCBTdHJpbmcmIGNvb2tp
ZUphcik7CisgICAgdm9pZCBjbG9zZSgpOworCisgICAgdm9pZCBpbnNlcnQoY29uc3QgUGFyc2Vk
Q29va2llKik7CisgICAgdm9pZCB1cGRhdGUoY29uc3QgUGFyc2VkQ29va2llKik7CisgICAgdm9p
ZCByZW1vdmUoY29uc3QgUGFyc2VkQ29va2llKik7CisKKyAgICB2b2lkIHJlbW92ZUFsbCgpOwor
CisgICAgLy8gSWYgYSBsaW1pdCBpcyBub3Qgc2V0LCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGFs
bCBjb29raWVzIGluIHRoZSBkYXRhYmFzZQorICAgIHZvaWQgZ2V0Q29va2llc0Zyb21EYXRhYmFz
ZShWZWN0b3I8UGFyc2VkQ29va2llKj4mIHN0YWNrT2ZDb29raWVzLCB1bnNpZ25lZCBpbnQgbGlt
aXQgPSAwKTsKKworICAgIHZvaWQgc2VuZENoYW5nZXNUb0RhdGFiYXNlKCk7CisKK3ByaXZhdGU6
CisgICAgZW51bSBVcGRhdGVQYXJhbWV0ZXIgeworICAgICAgICBJbnNlcnQsCisgICAgICAgIFVw
ZGF0ZSwKKyAgICAgICAgRGVsZXRlLAorICAgIH07CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tp
bmdTdG9yZSgpOworICAgIH5Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9p
ZCBhZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNlZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBk
YXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKTsKKyAgICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFz
ZShpbnQgaW50ZXJ2YWwpOworICAgIHZvaWQgc2VuZENoYW5nZXNUb0RhdGFiYXNlVGltZXJGaXJl
ZChUaW1lcjxDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZT4qKTsKKyAgICB2b2lkIHVwZ3JhZGVU
YWJsZUlmTmVlZGVkKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VTY2hlbWEsIGNvbnN0IFN0cmluZyYg
cHJpbWFyeWtleUZpZWxkcyk7CisKKyAgICB2b2lkIGludm9rZU9wZW4oY29uc3QgU3RyaW5nJiBj
b29raWVKYXIpOworICAgIHZvaWQgaW52b2tlQ2xvc2UoKTsKKyAgICB2b2lkIGludm9rZVJlbW92
ZUFsbCgpOworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiogaW52b2tlR2V0Q29va2llc1dpdGhM
aW1pdCh1bnNpZ25lZCBpbnQgbGltaXQpOworICAgIHZvaWQgaW52b2tlU2VuZENoYW5nZXNUb0Rh
dGFiYXNlKCk7CisgICAgdm9pZCBpbnZva2VEZXN0cm95KCk7CisKKyAgICB0eXBlZGVmIHBhaXI8
Y29uc3QgUGFyc2VkQ29va2llLCBVcGRhdGVQYXJhbWV0ZXI+IENvb2tpZUFjdGlvbjsKKyAgICBW
ZWN0b3I8Q29va2llQWN0aW9uPiBtX2NoYW5nZWRDb29raWVzOworICAgIE11dGV4IG1fbXV0ZXg7
CisKKyAgICBTdHJpbmcgbV90YWJsZU5hbWU7CisgICAgVGltZXI8Q29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmU+IG1fZGJUaW1lcjsKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RiOworICAgIFNRTGl0
ZVN0YXRlbWVudCAqbV9pbnNlcnRTdGF0ZW1lbnQ7CisgICAgU1FMaXRlU3RhdGVtZW50ICptX3Vw
ZGF0ZVN0YXRlbWVudDsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgKm1fZGVsZXRlU3RhdGVtZW50Owor
fTsKKworQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUmIGNvb2tpZUJhY2tpbmdTdG9yZSgpOwor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVEYXRhYmFzZUJhY2tp
bmdTdG9yZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5
L0Nvb2tpZUphckJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9Db29raWVKYXJCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lMDk2ODZmZWNmODFiMWYz
MzFkOGZiMmU3YTdlNTRlMmFhOThjYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVKYXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsx
LDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
ICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3
cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICog
Q29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIGh0dHA6Ly93d3cudG9yY2htb2Jp
bGUuY29tLworICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEw
LTIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkNvb2tpZUphci5oIgorCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAi
Q29va2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUu
aCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJL
VVJMLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisj
aW5jbHVkZSAiUGFnZUdyb3VwTG9hZERlZmVycmVyLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIK
KyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
U3RyaW5nIGNvb2tpZXMoRG9jdW1lbnQgY29uc3QqIGRvY3VtZW50LCBLVVJMIGNvbnN0JiB1cmwp
Cit7CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisgICAgUGFnZSogcGFn
ZSA9IGZyYW1lID8gZnJhbWUtPnBhZ2UoKSA6IDA7CisKKyAgICBpZiAoIXBhZ2UpCisgICAgICAg
IHJldHVybiBTdHJpbmcoKTsKKworICAgIGlmICghKGZyYW1lICYmIGZyYW1lLT5sb2FkZXIoKSAm
JiBmcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOwor
CisgICAgaWYgKCFzdGF0aWNfY2FzdDxXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnkqPihmcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKS0+Y29va2llc0VuYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuIFN0cmluZygpOworCisgICAgQVNTRVJUKGRvY3VtZW50ICYmIHVybCA9PSBkb2N1
bWVudC0+Y29va2llVVJMKCkpOworICAgIC8vICdIdHRwT25seScgY29va2llcyBzaG91bGQgbm8g
YmUgYWNjZXNzaWJsZSBmcm9tIHNjcmlwdHMsIHNvIHdlIGZpbHRlciB0aGVtIG91dCBoZXJlCisg
ICAgU3RyaW5nIHJlc3VsdCA9IGNvb2tpZU1hbmFnZXIoKS5nZXRDb29raWUodXJsLCBOb0h0dHBP
bmx5Q29va2llKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgc2V0Q29va2llcyhE
b2N1bWVudCogZG9jdW1lbnQsIEtVUkwgY29uc3QmIHVybCwgU3RyaW5nIGNvbnN0JiB2YWx1ZSkK
K3sKKyAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKKyAgICBQYWdlKiBwYWdl
ID0gZnJhbWUgPyBmcmFtZS0+cGFnZSgpIDogMDsKKworICAgIGlmICghcGFnZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKCEoZnJhbWUgJiYgZnJhbWUtPmxvYWRlcigpICYmIGZyYW1lLT5s
b2FkZXIoKS0+Y2xpZW50KCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXN0YXRpY19j
YXN0PFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSo+KGZyYW1lLT5sb2FkZXIo
KS0+Y2xpZW50KCkpLT5jb29raWVzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBB
U1NFUlQoZG9jdW1lbnQgJiYgdXJsID09IGRvY3VtZW50LT5jb29raWVVUkwoKSk7CisgICAgY29v
a2llTWFuYWdlcigpLnNldENvb2tpZXModXJsLCB2YWx1ZSk7Cit9CisKK2Jvb2wgY29va2llc0Vu
YWJsZWQoRG9jdW1lbnQgY29uc3QqKQoreworICAgIC8vIEZJWE1FLiBDdXJyZW50bHkgY29va2ll
IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgbm8gc2V0dGluZyBvbiBwcm9wZXJ0eSBwYWdlLgorICAg
IHJldHVybiB0cnVlOworfQorCitib29sIGdldFJhd0Nvb2tpZXMoY29uc3QgRG9jdW1lbnQqIGRv
Y3VtZW50LCBjb25zdCBLVVJMJiB1cmwsIFZlY3RvcjxDb29raWU+JiByYXdDb29raWVzKQorewor
ICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiByZXN1bHQ7CisgICAgY29va2llTWFuYWdlcigpLmdl
dFJhd0Nvb2tpZXMocmVzdWx0LCB1cmwsIFdpdGhIdHRwT25seUNvb2tpZXMpOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0LnNpemUoKTsgaSsrKQorICAgICAgICByZXN1bHRbaV0t
PmFwcGVuZFdlYkNvcmVDb29raWUocmF3Q29va2llcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3ZvaWQgZGVsZXRlQ29va2llKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgS1VSTCYg
dXJsLCBjb25zdCBXVEY6OlN0cmluZyYgY29va2llTmFtZSkKK3sKKyAgICAvLyBDb29raWVzIGFy
ZSBub3QgYm91bmQgdG8gdGhlIGRvY3VtZW50LiBUaGVyZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8g
cGFzcworICAgIC8vIGluIHRoZSBkb2N1bWVudCBvYmplY3QgdG8gZmluZCB0aGUgdGFyZ2V0ZWQg
Y29va2llcyBpbiBjb29raWUgbWFuYWdlci4KKyAgICBjb29raWVNYW5hZ2VyKCkucmVtb3ZlQ29v
a2llV2l0aE5hbWUodXJsLCBjb29raWVOYW1lKTsKK30KKworU3RyaW5nIGNvb2tpZVJlcXVlc3RI
ZWFkZXJGaWVsZFZhbHVlKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgS1VSTCAmdXJs
KQoreworICAgIEFTU0VSVChkb2N1bWVudCk7CisKKyAgICBpZiAoIShkb2N1bWVudC0+ZnJhbWUo
KSAmJiBkb2N1bWVudC0+ZnJhbWUoKS0+bG9hZGVyKCkgJiYgZG9jdW1lbnQtPmZyYW1lKCktPmxv
YWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVybiBXVEY6OlN0cmluZygpOworCisgICAg
aWYgKCFzdGF0aWNfY2FzdDxXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihk
b2N1bWVudC0+ZnJhbWUoKS0+bG9hZGVyKCktPmNsaWVudCgpKS0+Y29va2llc0VuYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuIFdURjo6U3RyaW5nKCk7CisKKyAgICByZXR1cm4gY29va2llTWFuYWdl
cigpLmdldENvb2tpZSh1cmwsIFdpdGhIdHRwT25seUNvb2tpZXMpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2Jl
cnJ5L0Nvb2tpZU1hbmFnZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJy
eS9Db29raWVNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MzY1YzAxYjNiNzQ1ZGJiZmQxOGViZTdj
NDg0MzRmOWVjYjUwMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDU2MCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZy
YWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBN
b3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgRU5BQkxFX0NPT0tJRV9E
RUJVRyAwCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfU1VQRVJfVkVSQk9TRV9ERUJVRyAwCisjZGVm
aW5lIEVOQUJMRV9DT09LSUVfTElNSVRfREVCVUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorCisjaW5jbHVkZSAiQ29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmUuaCIKKyNpbmNsdWRlICJDb29raWVQYXJzZXIuaCIKKyNpbmNsdWRlICJDdXJyZW50
VGltZS5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisj
aW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiV2ViU2V0dGluZ3MuaCIKKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1DbGllbnQuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2luY2x1ZGUgPHd0
Zi90ZXh0L1dURlN0cmluZy5oPgorCisjaWYgRU5BQkxFX0NPT0tJRV9ERUJVRworI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybUxvZy5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfQ09PS0lFX1NV
UEVSX1ZFUkJPU0VfREVCVUcKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4uKSBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbElu
Zm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBDb29raWVMb2coZm9y
bWF0LCAuLi4pCisjZW5kaWYgLy8gRU5BQkxFX0NPT0tJRV9TVVBFUl9WRVJCT1NFX0RFQlVHCisK
KyNpZiBFTkFCTEVfQ09PS0lFX0xJTUlUX0RFQlVHCisjZGVmaW5lIENvb2tpZUxpbWl0TG9nKGZv
cm1hdCwgLi4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpMb2dMZXZlbEluZm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2Rl
ZmluZSBDb29raWVMaW1pdExvZyhmb3JtYXQsIC4uLikKKyNlbmRpZiAvLyBFTkFCTEVfQ09PS0lF
X0xJTUlUX0RFQlVHCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29va2llTWFuYWdlciYgY29v
a2llTWFuYWdlcigpCit7CisgICAgc3RhdGljIENvb2tpZU1hbmFnZXIgKmNvb2tpZU1hbmFnZXIg
PSAwOworICAgIGlmICghY29va2llTWFuYWdlcikgeworICAgICAgICAvLyBPcGVuIHRoZSBjb29r
aWVKYXIgbm93IGFuZCBnZXQgdGhlIGJhY2tpbmcgc3RvcmUgY29va2llcyB0byBmaWxsIHRoZSBt
YW5hZ2VyLgorICAgICAgICBjb29raWVNYW5hZ2VyID0gbmV3IENvb2tpZU1hbmFnZXI7CisgICAg
ICAgIGNvb2tpZU1hbmFnZXItPm1fY29va2llQmFja2luZ1N0b3JlLT5vcGVuKGNvb2tpZU1hbmFn
ZXItPmNvb2tpZUphcigpKTsKKyAgICAgICAgY29va2llTWFuYWdlci0+Z2V0QmFja2luZ1N0b3Jl
Q29va2llcygpOworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBCYWNraW5nc3Rv
cmUgbG9hZCBjb21wbGV0ZS5cbiIpOworICAgIH0KKyAgICByZXR1cm4gKmNvb2tpZU1hbmFnZXI7
Cit9CisKK0Nvb2tpZU1hbmFnZXI6OkNvb2tpZU1hbmFnZXIoKQorICAgIDogbV9jb3VudCgwKQor
ICAgICwgbV9wcml2YXRlTW9kZShmYWxzZSkKKyAgICAsIG1fc2hvdWxkRHVtcEFsbENvb2tpZXMo
ZmFsc2UpCisgICAgLCBtX2Nvb2tpZUphckZpbGVOYW1lKHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVu
dChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50OjpnZXQoKS0+Z2V0QXBwbGljYXRpb25EYXRh
RGlyZWN0b3J5KCkuY19zdHIoKSwgIi9jb29raWVDb2xsZWN0aW9uLmRiIikpCisgICAgLCBtX3Bv
bGljeShDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5QWx3YXlzKQorICAgICwgbV9jb29raWVCYWNr
aW5nU3RvcmUoQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OmNyZWF0ZSgpKQorICAgICwgbV9s
aW1pdFRpbWVyKHRoaXMsICZDb29raWVNYW5hZ2VyOjpjb29raWVMaW1pdENsZWFuVXApCit7Cit9
CisKK0Nvb2tpZU1hbmFnZXI6On5Db29raWVNYW5hZ2VyKCkKK3sKKyAgICByZW1vdmVBbGxDb29r
aWVzKERvTm90UmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSk7CisgICAgLy8gVE9ETzogbV9tYW5hZ2Vy
TWFwIGFuZCB0aGUgdG9wIGxheWVyIHByb3RvY29sTWFwcyBhcmUgbm90IHByb3Blcmx5IGRlbGV0
ZWQuCisgICAgLy8gRG8gbm90IGRlbGV0ZSBhbnkgcHJvdG9jb2wgbWFwcyB0byBhdm9pZCBkb3Vi
bGUtZGVsZXRpb24gb2YgdGhlIG1hcHMgdGhhdCBhcmUKKyAgICAvLyBiZWluZyB1c2VkIGZvciBi
b3RoIHNlY3VyZSBhbmQgbm9uLXNlY3VyZSBwcm90b2NvbHM7IHRoaXMgbGVhayBpcyBPSyBzaW5j
ZQorICAgIC8vIHRoZXJlJ3Mgbm90aGluZyBpbXBvcnRhbnQgaW4gdGhlIGhhc2h0YWJsZSBkZXN0
cnVjdG9ycywgYW5kIHRoZSBtZW1vcnkgd2lsbCBiZSByZWNsYWltZWQgb24gZXhpdAorCisgICAg
Ly8gQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUgd2lsbCBkZWxldGUgaXRzZWxmIGFmdGVyIGZs
dXNoaW5nCisgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmRlc3Ryb3koKTsKKyAgICBtX2Nvb2tp
ZUJhY2tpbmdTdG9yZSA9IDA7Cit9CisKKy8vIFNvcnRpbmcgbG9naWMgaXMgYmFzZWQgb24gQ29v
a2llIFNwZWMgUkZDNjI2NSwgc2VjdGlvbiA1LjQuMgorc3RhdGljIGJvb2wgY29va2llU29ydGVy
KFBhcnNlZENvb2tpZSogYSwgUGFyc2VkQ29va2llKiBiKQoreworICAgIGlmIChhLT5wYXRoKCku
bGVuZ3RoKCkgPT0gYi0+cGF0aCgpLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gYS0+Y3JlYXRp
b25UaW1lKCkgPCBiLT5jcmVhdGlvblRpbWUoKTsKKyAgICByZXR1cm4gYS0+cGF0aCgpLmxlbmd0
aCgpID4gYi0+cGF0aCgpLmxlbmd0aCgpOworfQorCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBy
b3RvY29sIHN1cHBvcnRzIGRvbWFpbnMKK3N0YXRpYyBib29sIHNob3VsZElnbm9yZURvbWFpbihj
b25zdCBTdHJpbmcgcHJvdG9jb2wpCit7CisgICAgLy8gaWdub3JlIGRvbWFpbiBzZWN1cml0eSBm
b3IgZmlsZSBhbmQgbG9jYWwKKyAgICBpZiAoKHByb3RvY29sID09ICJmaWxlIiB8fCBwcm90b2Nv
bCA9PSAibG9jYWwiICkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsK
K30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVzKGNvbnN0IEtVUkwmIHVybCwgY29u
c3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBTZXR0
aW5nIGNvb2tpZXMiKTsKKyAgICBDb29raWVQYXJzZXIgcGFyc2VyKHVybCk7CisgICAgVmVjdG9y
PFBhcnNlZENvb2tpZSo+IGNvb2tpZXMgPSBwYXJzZXIucGFyc2UodmFsdWUpOworCisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBjb29raWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBhcnNl
ZENvb2tpZSogY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgaWYgKCFzaG91bGRSZWplY3RG
b3JTZWN1cml0eVJlYXNvbihjb29raWUsIHVybCkpIHsKKyAgICAgICAgICAgIEJhY2tpbmdTdG9y
ZVJlbW92YWwgdHJlYXRtZW50ID0gbV9wcml2YXRlTW9kZSA/IERvTm90UmVtb3ZlRnJvbUJhY2tp
bmdTdG9yZSA6IFJlbW92ZUZyb21CYWNraW5nU3RvcmU7CisgICAgICAgICAgICBjaGVja0FuZFRy
ZWF0Q29va2llKGNvb2tpZSwgdHJlYXRtZW50KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBkZWxldGUgY29va2llOworICAgIH0KK30KKworYm9vbCBDb29raWVNYW5hZ2VyOjpzaG91bGRS
ZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSwgY29uc3Qg
S1VSTCYgdXJsKQoreworICAgIC8vIFdlIGhhdmUgdG8gZGlzYWJsZSB0aGUgZm9sbG93aW5nIGNo
ZWNrIGJlY2F1c2Ugc2l0ZXMgbGlrZSBGYWNlYm9vayBhbmQKKyAgICAvLyBHbWFpbCBjdXJyZW50
bHkgZG8gbm90IGZvbGxvdyB0aGUgc3BlYy4KKyNpZiAwCisgICAgLy8gQ2hlY2sgaWYgcGF0aCBh
dHRyaWJ1dGUgaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QgVVJJLgorICAgIGlmICghdXJsLnBh
dGgoKS5zdGFydHNXaXRoKGNvb2tpZS0+cGF0aCgpKSkgeworICAgICAgICBMT0dfRVJST1IoIkNv
b2tpZSAlcyBpcyByZWplY3RlZCBiZWNhdXNlIGl0cyBwYXRoIGRvZXMgbm90IG1hdGggdGhlIFVS
TCAlc1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCksIHVybC5zdHJpbmcoKS51
dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmCisKKyAg
ICAvLyBpZ25vcmUgZG9tYWluIHNlY3VyaXR5IGlmIHByb3RvY29sIGRvZXNuJ3QgaGF2ZSBkb21h
aW5zCisgICAgaWYgKHNob3VsZElnbm9yZURvbWFpbihjb29raWUtPnByb3RvY29sKCkpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZWplY3QgQ29va2llIGlmIGRvbWFpbiBpcyBl
bXB0eQorICAgIGlmICghY29va2llLT5kb21haW4oKS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBpZiAoIWNvb2tpZS0+aGFzRGVmYXVsdERvbWFpbigpKSB7CisgICAgICAg
IC8vIENoZWNrIGlmIHRoZSBkb21haW4gY29udGFpbnMgYW4gZW1iZWRkZWQgZG90LgorICAgICAg
ICBpbnQgZG90UG9zaXRpb24gPSBjb29raWUtPmRvbWFpbigpLmZpbmQoIi4iLCAxKTsKKyAgICAg
ICAgaWYgKGRvdFBvc2l0aW9uID09IC0xIHx8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZG90
UG9zaXRpb24pID09IGNvb2tpZS0+ZG9tYWluKCkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIExP
R19FUlJPUigiQ29va2llICVzIGlzIHJlamVjdGVkIGJlY2F1c2UgaXRzIGRvbWFpbiBkb2VzIG5v
dCBjb250YWluIGFuIGVtYmVkZGVkIGRvdC5cbiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCku
ZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gVGhlIHJlcXVlc3QgaG9zdCBzaG91bGQgZG9tYWluIG1hdGNoIHRoZSBEb21haW4gYXR0
cmlidXRlLgorICAgIGlmICghdXJsLmhvc3QoKS5lbmRzV2l0aChjb29raWUtPmRvbWFpbigpKSkg
eworICAgICAgICBMT0dfRVJST1IoIkNvb2tpZSAlcyBpcyByZWplY3RlZCBiZWNhdXNlIGl0cyBk
b21haW4gZG9lcyBub3QgZG9tYWluIG1hdGNoIHRoZSBVUkwgJXNcbiIsIGNvb2tpZS0+dG9TdHJp
bmcoKS51dGY4KCkuZGF0YSgpLCB1cmwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBXZSBzaG91bGQgY2hlY2sgZm9yIGFuIGVtYmVk
ZGVkIGRvdCBpbiB0aGUgcG9ydGlvbiBvZiBzdHJpbmcgaW4gdGhlIGhvc3Qgbm90IGluIHRoZSBk
b21haW4KKyAgICAvLyBidXQgdG8gbWF0Y2ggZmlyZWZveCBiZWhhdmlvdXIgd2UgZG8gbm90Lgor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgQ29va2llTWFuYWdlcjo6Z2V0Q29va2ll
KGNvbnN0IEtVUkwmIHVybCwgSHR0cE9ubHlDb29raWVGaWx0ZXJpbmcgZmlsdGVyKSBjb25zdAor
eworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiByYXdDb29raWVzOworICAgIHJhd0Nvb2tpZXMu
cmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzX21heENvb2tpZUNvdW50UGVySG9zdCk7CisKKyAgICAv
LyBSZXRyaWV2ZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1cmwKKyAgICBnZXRSYXdDb29raWVz
KHJhd0Nvb2tpZXMsIHVybCwgZmlsdGVyKTsKKworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdl
ciAtIHRoZXJlIGFyZSAlZCBjb29raWVzIGluIHJhdyBjb29raWVzXG4iLCByYXdDb29raWVzLnNp
emUoKSk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgY29va2llIGhlYWRlciBzdHJpbmcgdXNpbmcg
dGhlIHJldHJpZXZlZCBjb29raWVzCisgICAgU3RyaW5nQnVpbGRlciBjb29raWVTdHJpbmdCdWls
ZGVyOworICAgIGNvb2tpZVN0cmluZ0J1aWxkZXIucmVzZXJ2ZUNhcGFjaXR5KHNfbWF4Q29va2ll
SGVhZGVyU3RyaW5nTGVuZ3RoKTsKKyAgICBzaXplX3QgY29va2llU2l6ZSA9IHJhd0Nvb2tpZXMu
c2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29va2llU2l6ZTsgaSsrKSB7Cisg
ICAgICAgIGNvb2tpZVN0cmluZ0J1aWxkZXIuYXBwZW5kKHJhd0Nvb2tpZXNbaV0tPnRvTmFtZVZh
bHVlUGFpcigpKTsKKyAgICAgICAgaWYgKGkgIT0gY29va2llU2l6ZS0xKQorICAgICAgICAgICAg
Y29va2llU3RyaW5nQnVpbGRlci5hcHBlbmQoIjsgIik7CisgICAgfQorCisgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gY29va2llU3RyaW5nIGlzIC0gJXNcbiIsIGNvb2tpZVN0cmluZ0J1
aWxkZXIudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHJldHVybiBjb29raWVTdHJp
bmdCdWlsZGVyLnRvU3RyaW5nKCk7CisKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpnZXRSYXdD
b29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiAmc3RhY2tPZkNvb2tpZXMsIGNvbnN0IEtVUkwm
IHJlcXVlc3RVUkwsIEh0dHBPbmx5Q29va2llRmlsdGVyaW5nIGZpbHRlcikgY29uc3QKK3sKKyAg
ICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBnZXRSYXdDb29raWVzIC0gcHJvY2Vzc2luZyB1
cmwgd2l0aCBkb21haW4gLSAlcyAmIHByb3RvY29sOiAlcyAmIHBhdGg6ICVzXG4iLCByZXF1ZXN0
VVJMLmhvc3QoKS51dGY4KCkuZGF0YSgpLCByZXF1ZXN0VVJMLnByb3RvY29sKCkudXRmOCgpLmRh
dGEoKSwgcmVxdWVzdFVSTC5wYXRoKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBib29sIHNwZWNp
YWxDYXNlRm9yTG9jYWwgPSAocmVxdWVzdFVSTC5wcm90b2NvbElzKCJsb2NhbCIpIHx8IHJlcXVl
c3RVUkwucHJvdG9jb2xJcygiZmlsZSIpKSAmJiBtX3Nob3VsZER1bXBBbGxDb29raWVzOworICAg
IGJvb2wgaXNDb25uZWN0aW9uU2VjdXJlID0gcmVxdWVzdFVSTC5wcm90b2NvbElzKCJodHRwcyIp
IHx8IHJlcXVlc3RVUkwucHJvdG9jb2xJcygid3NzIikgfHwgc3BlY2lhbENhc2VGb3JMb2NhbDsK
KworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVDYW5kaWRhdGVzOworICAgIFZlY3Rv
cjxDb29raWVNYXAqPiBwcm90b2NvbHNUb1NlYXJjaDsKKworICAgIGlmIChzcGVjaWFsQ2FzZUZv
ckxvY2FsKQorICAgICAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9tYW5hZ2VyTWFwLCBwcm90b2Nv
bHNUb1NlYXJjaCk7CisgICAgZWxzZQorICAgICAgICBwcm90b2NvbHNUb1NlYXJjaC5hcHBlbmQo
bV9tYW5hZ2VyTWFwLmdldChyZXF1ZXN0VVJMLnByb3RvY29sKCkpKTsKKworICAgIFZlY3RvcjxT
dHJpbmc+IGRlbGltaXRlZEhvc3Q7CisgICAgcmVxdWVzdFVSTC5ob3N0KCkuc3BsaXQoIi4iLCB0
cnVlLCBkZWxpbWl0ZWRIb3N0KTsKKworICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBwcm90b2Nv
bCB0cmVlcyB0aGF0IHdlIG5lZWQgdG8gc2VhcmNoIGZvcgorICAgIC8vIGFuZCBnZXQgYWxsIGNv
b2tpZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMgZG9tYWluCisgICAgZm9yIChzaXplX3QgayA9
IDA7IGsgPCBwcm90b2NvbHNUb1NlYXJjaC5zaXplKCk7IGsrKykgeworICAgICAgICBDb29raWVN
YXAqIGN1cnJlbnRNYXAgPSBwcm90b2NvbHNUb1NlYXJjaFtrXTsKKworICAgICAgICAvLyBpZiBu
byBjb29raWVzIGV4aXN0IGZvciB0aGlzIHByb3RvY29sLCBicmVhayByaWdodCBhd2F5CisgICAg
ICAgIGlmICghY3VycmVudE1hcCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIGxvb2tpbmcgYXQgcHJvdG9jb2wgbWFwICVzIFxuIiwg
Y3VycmVudE1hcC0+Z2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgIC8vIFNwZWNp
YWwgY2FzZSBmb3IgbG9jYWwgYW5kIGZpbGVzIC0gYmVjYXVzZSBXZWJBcHBzIGV4cGVjdCB0byBn
ZXQgQUxMIGNvb2tpZXMgZnJvbSB0aGUgYmFja2luZy1zdG9yZSBvbiBsb2NhbCBwcm90b2NvbAor
ICAgICAgICBpZiAoc3BlY2lhbENhc2VGb3JMb2NhbCkgeworICAgICAgICAgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gc3BlY2lhbCBjYXNlIGZpbmQgaW4gcHJvdG9jb2wgbWFwIC0gJXNc
biIsIGN1cnJlbnRNYXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGN1
cnJlbnRNYXAtPmdldEFsbENoaWxkQ29va2llcygmY29va2llQ2FuZGlkYXRlcyk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHZXQgY29va2llcyBmcm9tIHRoZSBudWxsIGRvbWFp
biBtYXAKKyAgICAgICAgICAgIGN1cnJlbnRNYXAtPmdldEFsbENvb2tpZXMoJmNvb2tpZUNhbmRp
ZGF0ZXMpOworCisgICAgICAgICAgICAvLyBHZXQgY29va2llcyBmcm9tIHRoZSB2YWxpZCBkb21h
aW4gbWFwcworICAgICAgICAgICAgaW50IGkgPSBkZWxpbWl0ZWRIb3N0LnNpemUoKS0xOworICAg
ICAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGZpbmRpbmcgJXMgaW4gY3VycmVudG1hcFxuIiwgZGVsaW1pdGVkSG9zdFtp
XS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50TWFwID0gY3VycmVudE1h
cC0+Z2V0U3ViZG9tYWluTWFwKGRlbGltaXRlZEhvc3RbaV0pOworICAgICAgICAgICAgICAgIC8v
IGlmIHRoaXMgc3ViZG9tYWluL2RvbWFpbiBkb2VzIG5vdCBleGlzdCBpbiBvdXIgbWFwcGluZyB0
aGVuIHdlIHNpbXBseSBleGl0CisgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50TWFwKSB7Cisg
ICAgICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGNhbm5vdCBmaW5k
IG5leHQgbWFwIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3AuXG4iKTsKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvb2tpZUxvZygi
Q29va2llTWFuYWdlciAtIGZvdW5kIHRoZSBtYXAsIGdyYWJiaW5nIGNvb2tpZXMgZnJvbSB0aGlz
IG1hcFxuIik7CisgICAgICAgICAgICAgICAgY3VycmVudE1hcC0+Z2V0QWxsQ29va2llcygmY29v
a2llQ2FuZGlkYXRlcyk7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gdGhlcmUgYXJl
ICVkIGNvb2tpZXMgaW4gY2FuZGlkYXRlXG4iLCBjb29raWVDYW5kaWRhdGVzLnNpemUoKSk7CisK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb2tpZUNhbmRpZGF0ZXMuc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUgPSBjb29raWVDYW5kaWRhdGVzW2ldOwor
CisgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgcGF0aC1tYXRjaGVzIHJ1bGVzIGluIFJGQzYy
NjUsIHNlY3Rpb24gNS4xLjQsCisgICAgICAgIC8vIHdlIHNob3VsZCBhZGQgYSAnLycgYXQgdGhl
IGVuZCBvZiBjb29raWUtcGF0aCBmb3IgY29tcGFyaXNvbiBpZiB0aGUgY29va2llLXBhdGggaXMg
bm90IGVuZCB3aXRoICcvJy4KKyAgICAgICAgU3RyaW5nIHBhdGggPSBjb29raWUtPnBhdGgoKTsK
KyAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShwYXRoLCByZXF1ZXN0VVJMLnBhdGgoKSkg
JiYgIXBhdGguZW5kc1dpdGgoIi8iLCBmYWxzZSkpCisgICAgICAgICAgICBwYXRoICs9ICIvIjsK
KworICAgICAgICAvLyBPbmx5IHNlY3VyZSBjb25uZWN0aW9ucyBoYXZlIGFjY2VzcyB0byBzZWN1
cmUgY29va2llcy4gVW5sZXNzIHNwZWNpYWxDYXNlRm9yTG9jYWwgaXMgdHJ1ZQorICAgICAgICAv
LyBHZXQgdGhlIGNvb2tpZXMgZmlsdGVyaW5nIG91dCBIdHRwT25seSBjb29raWVzIGlmIHJlcXVl
c3RlZC4KKyAgICAgICAgaWYgKHJlcXVlc3RVUkwucGF0aCgpLnN0YXJ0c1dpdGgocGF0aCwgZmFs
c2UpICYmIChpc0Nvbm5lY3Rpb25TZWN1cmUgfHwgIWNvb2tpZS0+aXNTZWN1cmUoKSkgJiYgKGZp
bHRlciA9PSBXaXRoSHR0cE9ubHlDb29raWVzIHx8ICFjb29raWUtPmlzSHR0cE9ubHkoKSkpIHsK
KyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGNvb2tpZSBjaG9zZW4gLSAl
c1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgY29v
a2llLT5zZXRMYXN0QWNjZXNzZWQoY3VycmVudFRpbWUoKSk7CisgICAgICAgICAgICBzdGFja09m
Q29va2llcy5hcHBlbmQoY29va2llKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c29y
dChzdGFja09mQ29va2llcy5iZWdpbigpLCBzdGFja09mQ29va2llcy5lbmQoKSwgY29va2llU29y
dGVyKTsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpyZW1vdmVBbGxDb29raWVzKEJhY2tpbmdT
dG9yZVJlbW92YWwgYmFja2luZ1N0b3JlUmVtb3ZhbCkKK3sKKyAgICBIYXNoTWFwPFN0cmluZywg
Q29va2llTWFwKj46Oml0ZXJhdG9yIGZpcnN0ID0gbV9tYW5hZ2VyTWFwLmJlZ2luKCk7CisgICAg
SGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBlbmQgPSBtX21hbmFnZXJNYXAu
ZW5kKCk7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46Oml0ZXJhdG9yIGl0
ID0gZmlyc3Q7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgaXQtPnNlY29uZC0+ZGVsZXRlQWxs
Q29va2llc0FuZERvbWFpbnMoKTsKKworICAgIGlmIChiYWNraW5nU3RvcmVSZW1vdmFsID09IFJl
bW92ZUZyb21CYWNraW5nU3RvcmUpCisgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5yZW1v
dmVBbGwoKTsKKyAgICBtX2NvdW50ID0gMDsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRD
b29raWVKYXIoY29uc3QgY2hhciogZmlsZU5hbWUpCit7CisgICAgbV9jb29raWVKYXJGaWxlTmFt
ZSA9IFN0cmluZyhmaWxlTmFtZSk7CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPm9wZW4obV9j
b29raWVKYXJGaWxlTmFtZSk7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6Y2hlY2tBbmRUcmVh
dENvb2tpZShQYXJzZWRDb29raWUqIGNhbmRpZGF0ZUNvb2tpZSwgQmFja2luZ1N0b3JlUmVtb3Zh
bCBwb3N0VG9CYWNraW5nU3RvcmUpCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0g
Y2hlY2tBbmRUcmVhdENvb2tpZSAtIHByb2Nlc3NpbmcgdXJsIHdpdGggZG9tYWluIC0gJXMgJiBw
cm90b2NvbCAlc1xuIiwgY2FuZGlkYXRlQ29va2llLT5kb21haW4oKS51dGY4KCkuZGF0YSgpLCBj
YW5kaWRhdGVDb29raWUtPnByb3RvY29sKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBjb25zdCBi
b29sIGlnbm9yZURvbWFpbiA9IHNob3VsZElnbm9yZURvbWFpbihjYW5kaWRhdGVDb29raWUtPnBy
b3RvY29sKCkpOworCisgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHByb3RvY29sIHRyZWUgdG8gYWRk
IHRoZSBjb29raWUgdG8uIENyZWF0ZSBvbmUgaWYgbmVjZXNzYXJ5LgorICAgIENvb2tpZU1hcCog
Y3VyTWFwID0gMDsKKyAgICBpZiAobV9tYW5hZ2VyTWFwLmNvbnRhaW5zKGNhbmRpZGF0ZUNvb2tp
ZS0+cHJvdG9jb2woKSkpCisgICAgICAgIGN1ck1hcCA9IG1fbWFuYWdlck1hcC5nZXQoY2FuZGlk
YXRlQ29va2llLT5wcm90b2NvbCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYg
aXQgaXMgYSBzZWN1cmUgdmVyc2lvbiwgaWYgaXQgaXMsIGxpbmsgaXQgdG8gdGhlIG5vbi1zZWN1
cmUgdmVyc2lvbgorICAgICAgICAvLyBMaW5rIGN1ck1hcCB0byB0aGUgbmV3IHByb3RvY29sIGFz
IHdlbGwgYXMgdGhlIG9sZCBvbmUgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAgICBpZiAoY2Fu
ZGlkYXRlQ29va2llLT5wcm90b2NvbCgpID09ICJodHRwcyIpIHsKKyAgICAgICAgICAgIGN1ck1h
cCA9IG1fbWFuYWdlck1hcC5nZXQoImh0dHAiKTsKKyAgICAgICAgICAgIGlmICghY3VyTWFwKSB7
CisgICAgICAgICAgICAgICAgY3VyTWFwID0gbmV3IENvb2tpZU1hcCgiaHR0cCIpOworICAgICAg
ICAgICAgICAgIG1fbWFuYWdlck1hcC5hZGQoImh0dHAiLCBjdXJNYXApOworICAgICAgICAgICAg
fQorICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSA9PSAid3Nz
IikgeworICAgICAgICAgICAgY3VyTWFwID0gbV9tYW5hZ2VyTWFwLmdldCgid3MiKTsKKyAgICAg
ICAgICAgIGlmICghY3VyTWFwKSB7CisgICAgICAgICAgICAgICAgY3VyTWFwID0gbmV3IENvb2tp
ZU1hcCgid3MiKTsKKyAgICAgICAgICAgICAgICBtX21hbmFnZXJNYXAuYWRkKCJ3cyIsIGN1ck1h
cCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY3VyTWFwID0g
bmV3IENvb2tpZU1hcChjYW5kaWRhdGVDb29raWUtPnByb3RvY29sKCkpOworCisgICAgICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIGFkZGluZyBwcm90b2NvbCBjb29raWVtYXAgLSAlc1xu
IiwgY3VyTWFwLT5nZXROYW1lKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAgICAgbV9tYW5hZ2Vy
TWFwLmFkZChjYW5kaWRhdGVDb29raWUtPnByb3RvY29sKCksIGN1ck1hcCk7CisgICAgfQorCisg
ICAgLy8gSWYgcHJvdG9jb2wgc3VwcG9ydCBkb21haW4sIHdlIGhhdmUgdG8gdHJhdmVyc2UgdGhl
IGRvbWFpbiB0cmVlIHRvIGZpbmQgdGhlIHJpZ2h0CisgICAgLy8gY29va2llTWFwIHRvIGhhbmRs
ZSB3aXRoCisgICAgaWYgKCFpZ25vcmVEb21haW4pCisgICAgICAgIGN1ck1hcCA9IGZpbmRPckNy
ZWF0ZUNvb2tpZU1hcChjdXJNYXAsIGNhbmRpZGF0ZUNvb2tpZS0+ZG9tYWluKCksIGNhbmRpZGF0
ZUNvb2tpZS0+aGFzRXhwaXJlZCgpKTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHBy
b3BlciBtYXAgZm9yIHRoaXMgY29va2llLCB3ZSBjYW4gbW9kaWZ5IGl0CisgICAgLy8gSWYgY29v
a2llIGRvZXMgbm90IGV4aXN0IGFuZCBoYXMgZXhwaXJlZCwgZGVsZXRlIGl0CisgICAgLy8gSWYg
Y29va2llIGV4aXN0cyBhbmQgaXQgaGFzIGV4cGlyZWQsIHNvIHdlIG11c3QgcmVtb3ZlIGl0IGZy
b20gdGhlIG1hcCwgaWYgbm90IHVwZGF0ZSBpdAorICAgIC8vIElmIGNvb2tpZSBleHBpcmVkIGFu
ZCBjYW1lIGZyb20gdGhlIEJhY2tpbmdTdG9yZSAodGhlcmVmb3JlIGRvZXMgbm90IGV4aXN0KSwg
d2UgaGF2ZSB0byByZW1vdmUgZnJvbSBkYXRhYmFzZQorICAgIC8vIElmIGNvb2tpZSBkb2VzIG5v
dCBleGlzdCAmIGl0J3MgdmFsaWQsIGFkZCBpdCB0byB0aGUgY3VycmVudCBtYXAKKworICAgIGlm
IChjYW5kaWRhdGVDb29raWUtPmhhc0V4cGlyZWQoKSB8fCBjYW5kaWRhdGVDb29raWUtPmlzRm9y
Y2VFeHBpcmVkKCkpIHsKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBnZXRCYWNraW5nU3Rv
cmVDb29raWVzKCkgdG8gY2F0Y2ggZXhwaXJlZCBjb29raWVzCisgICAgICAgIGlmIChwb3N0VG9C
YWNraW5nU3RvcmUgPT0gQmFja2luZ1N0b3JlQ29va2llRW50cnkpCisgICAgICAgICAgICBtX2Nv
b2tpZUJhY2tpbmdTdG9yZS0+cmVtb3ZlKGNhbmRpZGF0ZUNvb2tpZSk7CisgICAgICAgIGVsc2Ug
aWYgKGN1ck1hcCkgeworICAgICAgICAgICAgYm9vbCBjb29raWVBbHJlYWR5RXhpc3RzID0gY3Vy
TWFwLT5leGlzdHNDb29raWUoY2FuZGlkYXRlQ29va2llKTsKKyAgICAgICAgICAgIGlmIChjb29r
aWVBbHJlYWR5RXhpc3RzKSB7CisgICAgICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5h
Z2VyIC0gZXhwaXJlZCBjb29raWUgZXhpc3RzIGluIG1lbW9yeSIpOworICAgICAgICAgICAgICAg
IFBhcnNlZENvb2tpZSogZXhwaXJlZCA9IGN1ck1hcC0+cmVtb3ZlQ29va2llKGNhbmRpZGF0ZUNv
b2tpZSk7CisgICAgICAgICAgICAgICAgLy8gQ29va2llIGlzIHVzZWxlc3MsIFJlbW92ZSB0aGUg
Y29va2llIGZyb20gdGhlIGJhY2tpbmdzdG9yZSBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgICAg
ICAvLyBCYWNrdXAgY2hlY2sgZm9yIEJhY2tpbmdTdG9yZUNvb2tpZUVudHJ5IGluY2FzZSBzb21l
b25lIGluY29ycmVjdGx5IHVzZXMgdGhpcyBlbnVtCisgICAgICAgICAgICAgICAgaWYgKHBvc3RU
b0JhY2tpbmdTdG9yZSAhPSBCYWNraW5nU3RvcmVDb29raWVFbnRyeSAmJiAhZXhwaXJlZC0+aXNT
ZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2Vy
IC0gZXhwaXJlZCBjb29raWUgaXMgbm9uc2Vzc2lvbiwgZGVsZXRpbmcgZnJvbSBkYiIpOworICAg
ICAgICAgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+cmVtb3ZlKGV4cGlyZWQpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxldGUgZXhwaXJlZDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkZWxldGUgY2FuZGlkYXRlQ29v
a2llOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChjdXJNYXApOworICAgICAgICBib29s
IGNvb2tpZUFscmVhZHlFeGlzdHMgPSBjdXJNYXAtPmV4aXN0c0Nvb2tpZShjYW5kaWRhdGVDb29r
aWUpOworICAgICAgICBpZiAoY29va2llQWxyZWFkeUV4aXN0cykKKyAgICAgICAgICAgIHVwZGF0
ZShjdXJNYXAsIGNhbmRpZGF0ZUNvb2tpZSwgcG9zdFRvQmFja2luZ1N0b3JlKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgYWRkQ29va2llVG9NYXAoY3VyTWFwLCBjYW5kaWRhdGVDb29raWUs
IHBvc3RUb0JhY2tpbmdTdG9yZSk7CisgICAgfQorfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmFk
ZENvb2tpZVRvTWFwKENvb2tpZU1hcCogdGFyZ2V0TWFwLCBQYXJzZWRDb29raWUqIGNhbmRpZGF0
ZUNvb2tpZSwgQmFja2luZ1N0b3JlUmVtb3ZhbCBwb3N0VG9CYWNraW5nU3RvcmUpCit7CisgICAg
UGFyc2VkQ29va2llKiBvbGRlc3RDb29raWUgPSAwOworICAgIC8vIENoZWNrIGlmIHdlIGhhdmUg
bm90IHJlYWNoZWQgdGhlIHBlciBjb29raWUgZG9tYWluIGxpbWl0LgorICAgIC8vIElmIHRoYXQg
aXMgbm90IHRydWUsIHdlIGNoZWNrIGlmIHRoZSBnbG9iYWwgbGltaXQgaGFzIGJlZW4gcmVhY2hl
ZCBpZiBiYWNraW5nc3RvcmUgbW9kZSBpcyBvbgorICAgIC8vIFR3byBwb2ludHM6CisgICAgLy8g
MSkgV2Ugb25seSBkbyBhIGdsb2JhbCBjaGVjayBpZiBiYWNraW5nc3RvcmUgbW9kZSBpcyBvbiBi
ZWNhdXNlIHRoZSBnbG9iYWwgY29va2llIGxpbWl0IG9ubHkKKyAgICAvLyAgICBjb3VudHMgc2Vz
c2lvbiBjb29raWVzIHRoYXQgYXJlIHNhdmVkIGluIHRoZSBkYXRhYmFzZS4gSWYgdGhlIHVzZXIg
Z29lcyBvdmVyIHRoZSBsaW1pdAorICAgIC8vICAgIHdoZW4gdGhleSBhcmUgaW4gcHJpdmF0ZSBt
b2RlLCB3ZSBrbm93IHRoYXQgdGhlIHRvdGFsIGNvb2tpZSBsaW1pdCB3aWxsIGJlIHVuZGVyIHRo
ZSBsaW1pdAorICAgIC8vICAgIG9uY2UgdGhlIHVzZXIgZ29lcyBiYWNrIHRvIG5vcm1hbCBtb2Rl
IChtZW1vcnkgZGVsZXRlZCBhbmQgcmVsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UpCisgICAgLy8g
MikgV2UgdXNlIGVsc2UgaWYgZm9yIHRoaXMgc3RhdGVtZW50IGJlY2F1c2UgaWYgd2UgcmVtb3Zl
IGEgY29va2llIGluIHRoZSAxc3Qgc3RhdGVtZW50CisgICAgLy8gICAgdGhlbiBpdCBtZWFucyB0
aGUgZ2xvYmFsIGNvdW50IHdpbGwgbmV2ZXIgZXhjZWVkIHRoZSBsaW1pdAorCisgICAgQ29va2ll
TGltaXRMb2coIkNvb2tpZU1hbmFnZXIgLSBsb2NhbCBjb3VudDogJWQgIGdsb2JhbCBjb3VudDog
JWQiLCB0YXJnZXRNYXAtPmNvdW50KCksIG1fY291bnQpOworICAgIGlmICh0YXJnZXRNYXAtPmNv
dW50KCkgPj0gc19tYXhDb29raWVDb3VudFBlckhvc3QpIHsKKyAgICAgICAgQ29va2llTG9nKCJD
b29raWVNYW5hZ2VyIC0gZGVsZXRpbmcgb2xkZXN0IGNvb2tpZSBmcm9tIHRoaXMgbWFwIGR1ZSB0
byBkb21haW4gY291bnQuXG4iKTsKKyAgICAgICAgb2xkZXN0Q29va2llID0gdGFyZ2V0TWFwLT5y
ZW1vdmVPbGRlc3RDb29raWUoKTsKKyAgICB9IGVsc2UgaWYgKG1fY291bnQgPj0gc19nbG9iYWxN
YXhDb29raWVDb3VudCAmJiAocG9zdFRvQmFja2luZ1N0b3JlICE9IERvTm90UmVtb3ZlRnJvbUJh
Y2tpbmdTdG9yZSkpIHsKKyAgICAgICAgICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2Vy
IC0gR2xvYmFsIGxpbWl0IHJlYWNoZWQsIGluaXRpYXRlIGNvb2tpZSBsaW1pdCBjbGVhbiB1cC4i
KTsKKyAgICAgICAgICAgIGluaXRpYXRlQ29va2llTGltaXRDbGVhblVwKCk7CisgICAgfQorCisg
ICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gYWRkaW5nIG5ldyBjb29raWUgLSAlcy5cbiIs
IGNhbmRpZGF0ZUNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHRhcmdl
dE1hcC0+YWRkQ29va2llKGNhbmRpZGF0ZUNvb2tpZSk7CisKKyAgICAvLyBPbmx5IGFkZCBub24g
c2Vzc2lvbiBjb29raWUgdG8gdGhlIGJhY2tpbmcgc3RvcmUuCisgICAgaWYgKHBvc3RUb0JhY2tp
bmdTdG9yZSA9PSBSZW1vdmVGcm9tQmFja2luZ1N0b3JlKSB7CisgICAgICAgIGlmIChvbGRlc3RD
b29raWUgJiYgIW9sZGVzdENvb2tpZS0+aXNTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIENvb2tp
ZUxvZygiQ29va2llTWFuYWdlciAtIG9sZGVzdENvb2tpZSBleGlzdHMsIGRlbGV0aW5nIGl0IGZy
b20gYmFja2luZ3N0b3JlIGFuZCBkZXN0cnVjdGluZy5cbiIpOworICAgICAgICAgICAgbV9jb29r
aWVCYWNraW5nU3RvcmUtPnJlbW92ZShvbGRlc3RDb29raWUpOworICAgICAgICB9CisgICAgICAg
IGlmICghY2FuZGlkYXRlQ29va2llLT5pc1Nlc3Npb24oKSkKKyAgICAgICAgICAgIG1fY29va2ll
QmFja2luZ1N0b3JlLT5pbnNlcnQoY2FuZGlkYXRlQ29va2llKTsKKyAgICB9CisgICAgaWYgKG9s
ZGVzdENvb2tpZSkKKyAgICAgICAgZGVsZXRlIG9sZGVzdENvb2tpZTsKK30KKwordm9pZCBDb29r
aWVNYW5hZ2VyOjp1cGRhdGUoQ29va2llTWFwKiB0YXJnZXRNYXAsIFBhcnNlZENvb2tpZSogbmV3
Q29va2llLCBCYWNraW5nU3RvcmVSZW1vdmFsIHBvc3RUb0JhY2tpbmdTdG9yZSkKK3sKKyAgICAv
LyBJZiBvbGQgY29va2llIGlzIG5vbi1zZXNzaW9uIGFuZCBuZXcgb25lIGlzLCB3ZSBoYXZlIHRv
IGRlbGV0ZSBpdCBmcm9tIGJhY2tpbmdzdG9yZQorICAgIC8vIElmIG5ldyBjb29raWUgaXMgbm9u
LXNlc3Npb24gYW5kIG9sZCBvbmUgaXMsIHdlIGhhdmUgdG8gYWRkIGl0IHRvIGJhY2tpbmdzdG9y
ZQorICAgIC8vIElmIGJvdGggc2Vzc2lvbnMgYXJlIG5vbi1zZXNzaW9uLCB0aGVuIHdlIHVwZGF0
ZSBpdCBpbiB0aGUgYmFja2luZ3N0b3JlCisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIg
LSB1cGRhdGluZyBuZXcgY29va2llIC0gJXMuXG4iLCBuZXdDb29raWUtPnRvU3RyaW5nKCkudXRm
OCgpLmRhdGEoKSk7CisKKyAgICBQYXJzZWRDb29raWUqIG9sZENvb2tpZSA9IHRhcmdldE1hcC0+
dXBkYXRlQ29va2llKG5ld0Nvb2tpZSk7CisKKyAgICBBU1NFUlQob2xkQ29va2llKTsKKworICAg
IGJvb2wgbmV3SXNTZXNzaW9uID0gbmV3Q29va2llLT5pc1Nlc3Npb24oKTsKKyAgICBib29sIG9s
ZElzU2Vzc2lvbiA9IG9sZENvb2tpZS0+aXNTZXNzaW9uKCk7CisKKyAgICBpZiAocG9zdFRvQmFj
a2luZ1N0b3JlID09IFJlbW92ZUZyb21CYWNraW5nU3RvcmUpIHsKKyAgICAgICAgaWYgKCFuZXdJ
c1Nlc3Npb24gJiYgIW9sZElzU2Vzc2lvbikKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0
b3JlLT51cGRhdGUobmV3Q29va2llKTsKKyAgICAgICAgZWxzZSBpZiAobmV3SXNTZXNzaW9uICYm
ICFvbGRJc1Nlc3Npb24pIHsKKyAgICAgICAgICAgIC8vIE11c3QgbWFudWFsbHkgZGVjcmVhc2Ug
dGhlIGNvdW50ZXIgYmVjYXVzZSBpdCB3YXMgbm90IGNvdW50ZWQgd2hlbgorICAgICAgICAgICAg
Ly8gdGhlIGNvb2tpZSB3YXMgcmVtb3ZlZCBpbiBjb29raWVNYXAuCisgICAgICAgICAgICByZW1v
dmVkQ29va2llKCk7CisgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+cmVtb3ZlKG9s
ZENvb2tpZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW5ld0lzU2Vzc2lvbiAmJiBvbGRJc1Nlc3Np
b24pIHsKKyAgICAgICAgICAgIC8vIE11c3QgbWFudWFsbHkgaW5jcmVhc2UgdGhlIGNvdW50ZXIg
YmVjYXVzZSBpdCB3YXMgbm90IGNvdW50ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIGNvb2tp
ZSB3YXMgYWRkZWQgaW4gY29va2llTWFwLgorICAgICAgICAgICAgYWRkZWRDb29raWUoKTsKKyAg
ICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5pbnNlcnQobmV3Q29va2llKTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICBkZWxldGUgb2xkQ29va2llOworfQorCit2b2lkIENvb2tpZU1hbmFn
ZXI6OmdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKQoreworICAgIC8vIFRoaXMgbWV0aG9kIHNob3Vs
ZCBiZSBjYWxsZWQganVzdCBhZnRlciBoYXZpbmcgY3JlYXRlZCB0aGUgY29va2llTWFuYWdlcgor
ICAgIC8vIE5FVkVSIGFmdGVyd2FyZHMhCisgICAgQVNTRVJUKCFtX2NvdW50KTsKKworICAgIFZl
Y3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVzOworICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5n
ZXRDb29raWVzRnJvbURhdGFiYXNlKGNvb2tpZXMpOworICAgIENvb2tpZUxvZygiQ29va2llTWFu
YWdlciAtIEJhY2tpbmdzdG9yZSBoYXMgJWQgY29va2llcywgbG9hZGluZyB0aGVtIGluIG1lbW9y
eSBub3ciLCBjb29raWVzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29r
aWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBhcnNlZENvb2tpZSogbmV3Q29va2llID0gY29v
a2llc1tpXTsKKyAgICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShuZXdDb29raWUsIEJhY2tpbmdT
dG9yZUNvb2tpZUVudHJ5KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0UHJp
dmF0ZU1vZGUoY29uc3QgYm9vbCBtb2RlKQoreworICAgIGlmIChtX3ByaXZhdGVNb2RlID09IG1v
ZGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJpdmF0ZU1vZGUgPSBtb2RlOworICAgIGlm
ICghbW9kZSkgeworICAgICAgICByZW1vdmVBbGxDb29raWVzKERvTm90UmVtb3ZlRnJvbUJhY2tp
bmdTdG9yZSk7CisgICAgICAgIGdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKTsKKyAgICB9Cit9CisK
K0Nvb2tpZU1hcCogQ29va2llTWFuYWdlcjo6ZmluZE9yQ3JlYXRlQ29va2llTWFwKENvb2tpZU1h
cCogcHJvdG9jb2xNYXAsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBib29sIGZpbmRPbmx5KQorewor
ICAgIC8vIEV4cGxvZGUgdGhlIGRvbWFpbiB3aXRoIHRoZSAnLicgZGVsaW1pdGVyCisgICAgVmVj
dG9yPFN0cmluZz4gZGVsaW1pdGVkSG9zdDsKKyAgICBkb21haW4uc3BsaXQoIi4iLCBkZWxpbWl0
ZWRIb3N0KTsKKworICAgIENvb2tpZU1hcCogY3VyTWFwID0gcHJvdG9jb2xNYXA7CisgICAgc2l6
ZV90IGhvc3RTaXplID0gZGVsaW1pdGVkSG9zdC5zaXplKCk7CisKKyAgICBDb29raWVMb2coIkNv
b2tpZU1hbmFnZXIgLSBsb29raW5nIGF0IHByb3RvY29sIG1hcCAlcyBcbiIsIHByb3RvY29sTWFw
LT5nZXROYW1lKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAvLyBGaW5kICYgY3JlYXRlIG5lY2Vz
c2FyeSBDb29raWVNYXBzIGJ5IHRyYXZlcnNpbmcgZG93biB0aGUgZG9tYWluIHRyZWUKKyAgICAv
LyBFYWNoIENvb2tpZU1hcCByZXByZXNlbnQgYSBzdWJzZWN0aW9uIG9mIHRoZSBkb21haW4sIGRl
bGltaXRlZCBieSAiLiIKKyAgICBpbnQgaSA9IGhvc3RTaXplIC0gMTsKKyAgICB3aGlsZSAoaSA+
PSAwKSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZpbmRpbmcgJXMgaW4g
Y3VycmVudG1hcFxuIiwgZGVsaW1pdGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAg
Q29va2llTWFwKiBuZXh0TWFwID0gY3VyTWFwLT5nZXRTdWJkb21haW5NYXAoZGVsaW1pdGVkSG9z
dFtpXSk7CisgICAgICAgIGlmICghbmV4dE1hcCkgeworICAgICAgICAgICAgQ29va2llTG9nKCJD
b29raWVNYW5hZ2VyIC0gY2Fubm90IGZpbmQgbWFwXG4iKTsKKyAgICAgICAgICAgIGlmIChmaW5k
T25seSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIENvb2tpZUxvZygi
Q29va2llTWFuYWdlciAtIGNyZWF0aW5nICVzIGluIGN1cnJlbnRtYXAgJXNcbiIsIGRlbGltaXRl
ZEhvc3RbaV0udXRmOCgpLmRhdGEoKSwgY3VyTWFwLT5nZXROYW1lKCkudXRmOCgpLmRhdGEoKSk7
CisgICAgICAgICAgICBuZXh0TWFwID0gbmV3IENvb2tpZU1hcChkZWxpbWl0ZWRIb3N0W2ldKTsK
KyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGFkZGluZyBzdWJkb21haW4g
dG8gbWFwXG4iKTsKKyAgICAgICAgICAgIGN1ck1hcC0+YWRkU3ViZG9tYWluTWFwKGRlbGltaXRl
ZEhvc3RbaV0sIG5leHRNYXApOworICAgICAgICB9CisgICAgICAgIGN1ck1hcCA9IG5leHRNYXA7
CisgICAgICAgIGktLTsKKyAgICB9CisgICAgcmV0dXJuIGN1ck1hcDsKK30KKworCit2b2lkIENv
b2tpZU1hbmFnZXI6OnJlbW92ZUNvb2tpZVdpdGhOYW1lKGNvbnN0IEtVUkwmIHVybCwgY29uc3Qg
U3RyaW5nJiBjb29raWVOYW1lKQoreworICAgIC8vIFdlIGdldCBhbGwgY29va2llcyBmcm9tIGFs
bCBkb21haW5zIHRoYXQgZG9tYWluIG1hdGNoZXMgdGhlIHJlcXVlc3QgZG9tYWluCisgICAgLy8g
YW5kIGRlbGV0ZSBhbnkgY29va2llcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB0aGF0IHBhdGgg
bWF0Y2hlcyB0aGUgcmVxdWVzdCBwYXRoCisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHJlc3Vs
dHM7CisgICAgZ2V0UmF3Q29va2llcyhyZXN1bHRzLCB1cmwsIFdpdGhIdHRwT25seUNvb2tpZXMp
OworICAgIC8vIERlbGV0ZSB0aGUgY29va2llcyB0aGF0IHBhdGggbWF0Y2hlcyB0aGUgcmVxdWVz
dCBwYXRoCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHRzLnNpemUoKTsgaSsrKSB7
CisgICAgICAgIFBhcnNlZENvb2tpZSogY29va2llID0gcmVzdWx0c1tpXTsKKyAgICAgICAgaWYg
KCFlcXVhbElnbm9yaW5nQ2FzZShjb29raWUtPm5hbWUoKSwgY29va2llTmFtZSkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHVybC5wYXRoKCkuc3RhcnRzV2l0aChjb29raWUt
PnBhdGgoKSwgZmFsc2UpKSB7CisgICAgICAgICAgICBjb29raWUtPmZvcmNlRXhwaXJlKCk7Cisg
ICAgICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKGNvb2tpZSwgUmVtb3ZlRnJvbUJhY2tpbmdT
dG9yZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6aW5pdGlh
dGVDb29raWVMaW1pdENsZWFuVXAoKQoreworICAgIGlmICghbV9saW1pdFRpbWVyLmlzQWN0aXZl
KCkpIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gU3RhcnRpbmcgYSB0aW1l
ciBmb3IgY29va2llIGNsZWFudXAiKTsKKyAgICAgICAgbV9saW1pdFRpbWVyLnN0YXJ0T25lU2hv
dChzX2RlbGF5VG9TdGFydENvb2tpZUNsZWFudXApOworICAgIH0gZWxzZSB7CisjaWYgIU5ERUJV
RworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBDb29raWUgY2xlYW51cCB0aW1l
ciBhbHJlYWR5IHJ1bm5pbmciKTsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBDb29raWVNYW5h
Z2VyOjpjb29raWVMaW1pdENsZWFuVXAoVGltZXI8Q29va2llTWFuYWdlcj4qIHRpbWVyKQorewor
ICAgIEFTU0VSVF9VTlVTRUQodGltZXIsIHRpbWVyID09ICZtX2xpbWl0VGltZXIpOworCisgICAg
Q29va2llTGltaXRMb2coIkNvb2tpZU1hbmFnZXIgLSBTdGFydGluZyBjb29raWUgY2xlYW4gdXAi
KTsKKworICAgIHNpemVfdCBudW1iZXJPZkNvb2tpZXNPdmVyTGltaXQgPSAobV9jb3VudCA+IHNf
Z2xvYmFsTWF4Q29va2llQ291bnQpID8gbV9jb3VudCAtIHNfZ2xvYmFsTWF4Q29va2llQ291bnQg
OiAwOworICAgIHNpemVfdCBhbW91bnRUb0RlbGV0ZSA9IHNfY29va2llc1RvRGVsZXRlV2hlbkxp
bWl0UmVhY2hlZCArIG51bWJlck9mQ29va2llc092ZXJMaW1pdDsKKworICAgIENvb2tpZUxpbWl0
TG9nKCJDb29raWVNYW5hZ2VyIC0gRXhjZXNzOiAlZCAgQW1vdW50IHRvIERlbGV0ZTogJWQiLCBu
dW1iZXJPZkNvb2tpZXNPdmVyTGltaXQsIGFtb3VudFRvRGVsZXRlKTsKKworICAgIC8vIENhbGwg
dGhlIGRhdGFiYXNlIHRvIGRlbGV0ZSAnYW1vdW50VG9EZWxldGUnIG9mIGNvb2tpZXMKKyAgICBW
ZWN0b3I8UGFyc2VkQ29va2llKj4gY29va2llc1RvRGVsZXRlOworICAgIGNvb2tpZXNUb0RlbGV0
ZS5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGFtb3VudFRvRGVsZXRlKTsKKworICAgIENvb2tpZUxp
bWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gQ2FsbGluZyBkYXRhYmFzZSB0byBjbGVhbiB1cCIpOwor
ICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5nZXRDb29raWVzRnJvbURhdGFiYXNlKGNvb2tpZXNU
b0RlbGV0ZSwgYW1vdW50VG9EZWxldGUpOworCisgICAgLy8gQ29va2llcyBhcmUgb3JkZXJlZCBp
biBBU0Mgb3JkZXIgYnkgbGFzdEFjY2Vzc2VkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBh
bW91bnRUb0RlbGV0ZTsgKytpKSB7CisgICAgICAgIC8vIEV4cGlyZSB0aGVtIGFuZCBjYWxsIGNo
ZWNrYW5kdHJlYXQgdG8gZGVsZXRlIHRoZW0gZnJvbSBtZW1vcnkgYW5kIGRhdGFiYXNlCisgICAg
ICAgIFBhcnNlZENvb2tpZSogbmV3Q29va2llID0gY29va2llc1RvRGVsZXRlW2ldOworICAgICAg
ICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIEV4cGlyZSBjb29raWU6ICVzIGFuZCBk
ZWxldGUiLCBuZXdDb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIG5l
d0Nvb2tpZS0+Zm9yY2VFeHBpcmUoKTsKKyAgICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShuZXdD
b29raWUsIFJlbW92ZUZyb21CYWNraW5nU3RvcmUpOworICAgIH0KKworICAgIENvb2tpZUxpbWl0
TG9nKCJDb29raWVNYW5hZ2VyIC0gQ29va2llIGNsZWFuIHVwIGNvbXBsZXRlLiIpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Js
YWNrYmVycnkvQ29va2llTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjc0MmY5MTdkYWI1MDI4ZDEyZWVl
YjYwZjU2MWY4MjViZjIwZWJjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaApAQCAtMCwwICsxLDE2NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hh
ZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ29va2llTWFuYWdlcl9oCisj
ZGVmaW5lIENvb2tpZU1hbmFnZXJfaAorCisjaW5jbHVkZSAiQ29va2llTWFwLmgiCisjaW5jbHVk
ZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRl
ICJUaW1lci5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXVEYgewor
Y2xhc3MgU3RyaW5nOworfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOworY2xhc3MgUGFyc2VkQ29va2llOworY2xhc3MgS1VSTDsKKwor
ZW51bSBCYWNraW5nU3RvcmVSZW1vdmFsIHsKKyAgICBSZW1vdmVGcm9tQmFja2luZ1N0b3JlLAor
ICAgIEJhY2tpbmdTdG9yZUNvb2tpZUVudHJ5LAorICAgIERvTm90UmVtb3ZlRnJvbUJhY2tpbmdT
dG9yZQorfTsKKworZW51bSBIdHRwT25seUNvb2tpZUZpbHRlcmluZyB7CisgICAgTm9IdHRwT25s
eUNvb2tpZSwKKyAgICBXaXRoSHR0cE9ubHlDb29raWVzLAorfTsKKworZW51bSBDb29raWVTdG9y
YWdlQWNjZXB0UG9saWN5IHsKKyAgICBDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5QWx3YXlzID0g
MCwKKyAgICBDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5TmV2ZXIsCisgICAgQ29va2llU3RvcmFn
ZUFjY2VwdFBvbGljeU9ubHlGcm9tTWFpbkRvY3VtZW50RG9tYWluCit9OworCisvKgorICAqIFRo
ZSBDb29raWVNYW5hZ2VyIGNsYXNzIGlzIGEgc2luZ2xldG9uIGNsYXNzIHRoYXQgaGFuZGxlcyBh
bmQgc2VsZWN0aXZlbHkgcGVyc2lzdHMKKyAgKiBpbmNvbWluZyBjb29raWVzLiBUaGlzIGNsYXNz
IGNvbnRhaW5zIGEgdHJlZSBvZiBkb21haW5zIGZvciBxdWlja2VyCisgICogY29va2llIGRvbWFp
biBsb29rdXAuIFRoZSB0b3Agb2YgdGhlIHRyZWUgcmVwcmVzZW50cyBhIG51bGwgdmFsdWUgZm9y
IGEgbnVsbCBkb21haW4uCisgICogVGhlIG51bGwgZG9tYWluIGNvbnRhaW5zIHJlZmVyZW5jZXMg
dG8gdG9wIGxldmVsIGRvbWFpbnMgYW5kIGVhY2ggbm9kZSBiZWxvdworICAqIHJlcHJlc2VudHMg
YSBzdWItc2VjdGlvbiBvZiBhIGRvbWFpbiwgZGVsaW1pdGVkIGJ5ICIuIgorICAqCisgICogSWYg
YSBjb29raWUgaGFzIGEgZG9tYWluICJhLmIuY29tIiwgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhl
IG5vZGUgbmFtZWQgImEiIGluIHRoaXMgdHJlZS4KKyAgKiBpbiB0aGUgYnJhbmNoICIiLT4iY29t
Ii0+ImIiLT4iYSIKKyAgKgorICAqIENvb2tpZSBzcGVjcyBmb2xsb3cgdGhlIFJGQzYyNjUgc3Bl
YyBzaGVldC4KKyAgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1CisgICovCisK
K2NsYXNzIENvb2tpZU1hbmFnZXIgeworcHVibGljOgorCisgICAgYm9vbCBjYW5Mb2NhbEFjY2Vz
c0FsbENvb2tpZXMoKSBjb25zdCB7IHJldHVybiBtX3Nob3VsZER1bXBBbGxDb29raWVzOyB9Cisg
ICAgdm9pZCBzZXRDYW5Mb2NhbEFjY2Vzc0FsbENvb2tpZXMoYm9vbCBlbmFibGVkKSB7IG1fc2hv
dWxkRHVtcEFsbENvb2tpZXMgPSBlbmFibGVkOyB9CisKKyAgICB2b2lkIHNldENvb2tpZXMoY29u
c3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgdmFsdWUpOworCisgICAgdm9pZCByZW1vdmVBbGxDb29r
aWVzKEJhY2tpbmdTdG9yZVJlbW92YWwpOworICAgIHZvaWQgcmVtb3ZlQ29va2llV2l0aE5hbWUo
Y29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgY29va2llTmFtZSk7CisKKyAgICB1bnNpZ25lZCBz
aG9ydCBjb29raWVzQ291bnQoKSBjb25zdCB7IHJldHVybiBtX2NvdW50OyB9CisKKyAgICB2b2lk
IHNldENvb2tpZUphcihjb25zdCBjaGFyKik7CisgICAgY29uc3QgU3RyaW5nJiBjb29raWVKYXIo
KSBjb25zdCB7IHJldHVybiBtX2Nvb2tpZUphckZpbGVOYW1lOyB9CisKKyAgICAvLyBDb3VudCB1
cGRhdGUgbWV0aG9kCisgICAgdm9pZCByZW1vdmVkQ29va2llKCkKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX2NvdW50ID4gMCk7CisgICAgICAgIC0tbV9jb3VudDsKKyAgICB9CisgICAgdm9pZCBh
ZGRlZENvb2tpZSgpIHsgKyttX2NvdW50OyB9CisKKyAgICAvLyBDb25zdGFudHMgZ2V0dGVyLgor
ICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4Q29va2llTGVuZ3RoKCkgeyByZXR1cm4gc19tYXhD
b29raWVMZW5ndGg7IH0KKworICAgIHZvaWQgc2V0Q29va2llUG9saWN5KENvb2tpZVN0b3JhZ2VB
Y2NlcHRQb2xpY3kgcG9saWN5KSB7IG1fcG9saWN5ID0gcG9saWN5OyB9CisgICAgQ29va2llU3Rv
cmFnZUFjY2VwdFBvbGljeSBjb29raWVQb2xpY3koKSBjb25zdCB7IHJldHVybiBtX3BvbGljeTsg
fQorICAgIHZvaWQgc2V0UHJpdmF0ZU1vZGUoY29uc3QgYm9vbCk7CisKKyAgICBTdHJpbmcgZ2V0
Q29va2llKGNvbnN0IEtVUkwmIHJlcXVlc3RVUkwsIEh0dHBPbmx5Q29va2llRmlsdGVyaW5nKSBj
b25zdDsKKworICAgIC8vIFJldHVybnMgYWxsIGNvb2tpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3
aXRoIHRoZSBzcGVjaWZpZWQgVVJMIGFzIHJhdyBjb29raWVzLgorICAgIHZvaWQgZ2V0UmF3Q29v
a2llcyhWZWN0b3I8UGFyc2VkQ29va2llKj4mIHN0YWNrT2ZDb29raWVzLCBjb25zdCBLVVJMJiBy
ZXF1ZXN0VVJMLCBIdHRwT25seUNvb2tpZUZpbHRlcmluZyA9IFdpdGhIdHRwT25seUNvb2tpZXMp
IGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBDb29raWVNYW5hZ2VyJiBjb29raWVNYW5h
Z2VyKCk7CisKKyAgICBDb29raWVNYW5hZ2VyKCk7CisgICAgfkNvb2tpZU1hbmFnZXIoKTsKKwor
ICAgIHZvaWQgY2hlY2tBbmRUcmVhdENvb2tpZShQYXJzZWRDb29raWUqIGNhbmRpZGF0ZUNvb2tp
ZSwgQmFja2luZ1N0b3JlUmVtb3ZhbCBwb3N0VG9CYWNraW5nU3RvcmUpOworCisgICAgYm9vbCBz
aG91bGRSZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb25zdCBQYXJzZWRDb29raWUqLCBjb25zdCBL
VVJMJik7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvTWFwKENvb2tpZU1hcCogdGFyZ2V0TWFwLCBQ
YXJzZWRDb29raWUqIGNhbmRpZGF0ZUNvb2tpZSwgQmFja2luZ1N0b3JlUmVtb3ZhbCBwb3N0VG9C
YWNraW5nU3RvcmUpOworICAgIHZvaWQgdXBkYXRlKENvb2tpZU1hcCogdGFyZ2V0TWFwLCBQYXJz
ZWRDb29raWUqIG5ld0Nvb2tpZSwgQmFja2luZ1N0b3JlUmVtb3ZhbCBwb3N0VG9CYWNraW5nU3Rv
cmUpOworCisgICAgQ29va2llTWFwKiBmaW5kT3JDcmVhdGVDb29raWVNYXAoQ29va2llTWFwKiBw
cm90b2NvbE1hcCwgY29uc3QgU3RyaW5nJiBkb21haW4sIGJvb2wgZmluZE9ubHkpOworCisgICAg
dm9pZCBpbml0aWF0ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpOworICAgIHZvaWQgY29va2llTGltaXRD
bGVhblVwKFRpbWVyPENvb2tpZU1hbmFnZXI+Kik7CisKKyAgICBIYXNoTWFwPFN0cmluZywgQ29v
a2llTWFwKj4gbV9tYW5hZ2VyTWFwOworCisgICAgLy8gQ291bnQgYWxsIGNvb2tpZXMsIGNvb2tp
ZXMgYXJlIGxpbWl0ZWQgYnkgbWF4X2NvdW50CisgICAgdW5zaWduZWQgc2hvcnQgbV9jb3VudDsK
KworICAgIGJvb2wgbV9wcml2YXRlTW9kZTsKKyAgICBib29sIG1fc2hvdWxkRHVtcEFsbENvb2tp
ZXM7CisKKyAgICBTdHJpbmcgbV9jb29raWVKYXJGaWxlTmFtZTsKKworICAgIC8vIEZJWE1FOiBU
aGlzIG1ldGhvZCBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgICB2b2lkIGdldEJhY2tpbmdTdG9yZUNv
b2tpZXMoKTsKKworICAgIC8vIE1heCBjb3VudCBjb25zdGFudHMuCisgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIGludCBzX2dsb2JhbE1heENvb2tpZUNvdW50ID0gNjAwMDsKKyAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgaW50IHNfbWF4Q29va2llQ291bnRQZXJIb3N0ID0gNjA7CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGludCBzX2Nvb2tpZXNUb0RlbGV0ZVdoZW5MaW1pdFJlYWNoZWQg
PSA2MDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNfZGVsYXlUb1N0YXJ0Q29va2ll
Q2xlYW51cCA9IDEwOworICAgIC8vIENvb2tpZSBzaXplIGxpbWl0IG9mIDRrQiBhcyBhZHZpc2Vk
IHBlciBSRkMyMTA5CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzX21heENvb2tpZUxl
bmd0aCA9IDQwOTY7CisKKyAgICAvLyBNYXhpbXVtIGNvb2tpZSBoZWFkZXIgc3RyaW5nIHNpemUg
dGhhdCB3ZSBjYW4gc2VuZAorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qgc19tYXhDb29raWVIZWFk
ZXJTdHJpbmdMZW5ndGggPSAyICogKDMgKyBzX21heENvb2tpZUxlbmd0aCkgKiBzX21heENvb2tp
ZUNvdW50UGVySG9zdDsKKworICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kgbV9wb2xpY3k7
CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSogbV9jb29raWVCYWNraW5nU3RvcmU7
CisgICAgVGltZXI8Q29va2llTWFuYWdlcj4gbV9saW1pdFRpbWVyOworfTsKKworLy8gR2V0IHRo
ZSBnbG9iYWwgaW5zdGFuY2UuCitDb29raWVNYW5hZ2VyJiBjb29raWVNYW5hZ2VyKCk7CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIENvb2tpZU1hbmFnZXJfaApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYXAuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYXAuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmU4NDUxMTM2NGZjNjUwYjkwZTUwZjc4MGE0YmQyN2NhYWEzOTc2YzEKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHAK
QEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVsaWVu
IENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjZGVm
aW5lIEVOQUJMRV9DT09LSUVfREVCVUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQ29va2llTWFwLmgiCisKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAi
TG9nZ2luZy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KKworI2lmIEVOQUJMRV9DT09LSUVfREVCVUcKKyNpbmNsdWRlIDxCbGFja0Jl
cnJ5UGxhdGZvcm1Mb2cuaD4KKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4uKSBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbElu
Zm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBDb29raWVMb2coZm9y
bWF0LCAuLi4pCisjZW5kaWYgLy8gRU5BQkxFX0NPT0tJRV9ERUJVRworCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK0Nvb2tpZU1hcDo6Q29va2llTWFwKGNvbnN0IFN0cmluZyYgbmFtZSkKKyAgICA6
IG1fb2xkZXN0Q29va2llKDApCisgICAgLCBtX25hbWUobmFtZSkKK3sKK30KKworQ29va2llTWFw
Ojp+Q29va2llTWFwKCkKK3sKKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGRlbGV0ZSBtX29s
ZGVzdENvb2tpZSBhcyBpdCBpcyBoYW5kbGVkIGluIGRlbGV0aW5nIG1fY29va2llTWFwCisgICAg
ZGVsZXRlQWxsVmFsdWVzKG1fY29va2llTWFwKTsKKyAgICBtX2Nvb2tpZU1hcC5jbGVhcigpOwor
ICAgIGRlbGV0ZUFsbFZhbHVlcyhtX3N1YmRvbWFpbnMpOworICAgIG1fc3ViZG9tYWlucy5jbGVh
cigpOworfQorCitib29sIENvb2tpZU1hcDo6ZXhpc3RzQ29va2llKGNvbnN0IFBhcnNlZENvb2tp
ZSogY29va2llKSBjb25zdAoreworICAgIFN0cmluZyBrZXkgPSBjb29raWUtPm5hbWUoKSArIGNv
b2tpZS0+cGF0aCgpOworICAgIHJldHVybiBtX2Nvb2tpZU1hcC5jb250YWlucyhrZXkpOworfQor
Cit2b2lkIENvb2tpZU1hcDo6YWRkQ29va2llKFBhcnNlZENvb2tpZSogY29va2llKQoreworICAg
IFN0cmluZyBrZXkgPSBjb29raWUtPm5hbWUoKSArIGNvb2tpZS0+cGF0aCgpOworCisgICAgQ29v
a2llTG9nKCJDb29raWVNYXAgLSBBdHRlbXB0aW5nIHRvIGFkZCBjb29raWUgLSAlcyIsIGNvb2tp
ZS0+bmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgQVNTRVJUKCFtX2Nvb2tpZU1hcC5jb250
YWlucyhrZXkpKTsKKyAgICBtX2Nvb2tpZU1hcC5hZGQoa2V5LCBjb29raWUpOworICAgIGlmICgh
Y29va2llLT5pc1Nlc3Npb24oKSkKKyAgICAgICAgY29va2llTWFuYWdlcigpLmFkZGVkQ29va2ll
KCk7CisgICAgaWYgKCFtX29sZGVzdENvb2tpZSB8fCBtX29sZGVzdENvb2tpZS0+bGFzdEFjY2Vz
c2VkKCkgPiBjb29raWUtPmxhc3RBY2Nlc3NlZCgpKQorICAgICAgICBtX29sZGVzdENvb2tpZSA9
IGNvb2tpZTsKK30KKworUGFyc2VkQ29va2llKiBDb29raWVNYXA6OnVwZGF0ZUNvb2tpZShQYXJz
ZWRDb29raWUqIG5ld0Nvb2tpZSkKK3sKKyAgICBTdHJpbmcga2V5ID0gbmV3Q29va2llLT5uYW1l
KCkgKyBuZXdDb29raWUtPnBhdGgoKTsKKyAgICBQYXJzZWRDb29raWUqIG9sZENvb2tpZSA9IG1f
Y29va2llTWFwLnRha2Uoa2V5KTsKKyAgICBBU1NFUlQob2xkQ29va2llKTsKKyAgICBtX2Nvb2tp
ZU1hcC5hZGQoa2V5LCBuZXdDb29raWUpOworICAgIGlmIChvbGRDb29raWUgPT0gbV9vbGRlc3RD
b29raWUpCisgICAgICAgIHVwZGF0ZU9sZGVzdENvb2tpZSgpOworICAgIHJldHVybiBvbGRDb29r
aWU7Cit9CisKK1BhcnNlZENvb2tpZSogQ29va2llTWFwOjpyZW1vdmVDb29raWUoY29uc3QgUGFy
c2VkQ29va2llKiBjb29raWUpCit7CisgICAgLy8gRmluZCBhIHByZXZpb3VzIGVudHJ5IGZvciBk
ZWxldGlvbgorICAgIFN0cmluZyBrZXkgPSBjb29raWUtPm5hbWUoKSArIGNvb2tpZS0+cGF0aCgp
OworICAgIFBhcnNlZENvb2tpZSogcHJldkNvb2tpZSA9IG1fY29va2llTWFwLnRha2Uoa2V5KTsK
KworICAgIGlmICghcHJldkNvb2tpZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocHJl
dkNvb2tpZSA9PSBtX29sZGVzdENvb2tpZSkKKyAgICAgICAgdXBkYXRlT2xkZXN0Q29va2llKCk7
CisgICAgZWxzZSBpZiAocHJldkNvb2tpZSAhPSBjb29raWUpIHsKKyAgICAgICAgLy8gVGhlIGNv
b2tpZSB3ZSB1c2VkIHRvIHNlYXJjaCBpcyBmb3JjZSBleHBpcmVkLCB3ZSBtdXN0IGRvIHRoZSBz
YW1lCisgICAgICAgIC8vIHRvIHRoZSBjb29raWUgaW4gbWVtb3J5IHRvby4KKyAgICAgICAgaWYg
KGNvb2tpZS0+aXNGb3JjZUV4cGlyZWQoKSkKKyAgICAgICAgICAgIHByZXZDb29raWUtPmZvcmNl
RXhwaXJlKCk7CisgICAgICAgIGRlbGV0ZSBjb29raWU7CisgICAgfQorCisgICAgaWYgKCFwcmV2
Q29va2llLT5pc1Nlc3Npb24oKSkKKyAgICAgICAgY29va2llTWFuYWdlcigpLnJlbW92ZWRDb29r
aWUoKTsKKyAgICByZXR1cm4gcHJldkNvb2tpZTsKK30KKworQ29va2llTWFwKiBDb29raWVNYXA6
OmdldFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmIHN1YmRvbWFpbikKK3sKKyNpZiBFTkFCTEVf
Q09PS0lFX0RFQlVHCisgICAgaWYgKCFtX3N1YmRvbWFpbnMuY29udGFpbnMoc3ViZG9tYWluKSkK
KyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSAlcyBkb2VzIG5vdCBleGlzdCBpbiB0aGlz
IG1hcCIsIHN1YmRvbWFpbi51dGY4KCkuZGF0YSgpKTsKKyNlbmRpZgorICAgIHJldHVybiBtX3N1
YmRvbWFpbnMuZ2V0KHN1YmRvbWFpbik7Cit9CisKK3ZvaWQgQ29va2llTWFwOjphZGRTdWJkb21h
aW5NYXAoY29uc3QgU3RyaW5nJiBzdWJkb21haW4sIENvb2tpZU1hcCogbmV3RG9tYWluKQorewor
ICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gQXR0ZW1wdGluZyB0byBhZGQgc3ViZG9tYWluIC0g
JXMiLCBzdWJkb21haW4udXRmOCgpLmRhdGEoKSk7CisgICAgbV9zdWJkb21haW5zLmFkZChzdWJk
b21haW4sIG5ld0RvbWFpbik7Cit9CisKK3ZvaWQgQ29va2llTWFwOjpnZXRBbGxDb29raWVzKFZl
Y3RvcjxQYXJzZWRDb29raWUqPiogc3RhY2tPZkNvb2tpZXMpCit7CisgICAgQ29va2llTG9nKCJD
b29raWVNYXAgLSBBdHRlbXB0aW5nIHRvIGNvcHkgTWFwOiVzIGNvb2tpZXMgd2l0aCAlZCBjb29r
aWVzIGludG8gdmVjdG9ycyIsIG1fbmFtZS51dGY4KCkuZGF0YSgpLCBtX2Nvb2tpZU1hcC5zaXpl
KCkpOworCisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IG5ld0Nvb2tpZXM7CisgICAgY29weVZh
bHVlc1RvVmVjdG9yKG1fY29va2llTWFwLCBuZXdDb29raWVzKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG5ld0Nvb2tpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgUGFyc2VkQ29va2ll
KiBuZXdDb29raWUgPSBuZXdDb29raWVzW2ldOworICAgICAgICBpZiAobmV3Q29va2llLT5oYXNF
eHBpcmVkKCkpIHsKKyAgICAgICAgICAgIC8vIE5vdGljZSB0aGF0IHdlIGRvbid0IGRlbGV0ZSBm
cm9tIGJhY2tpbmdzdG9yZS4gVGhlc2UgZXhwaXJlZCBjb29raWVzIHdpbGwgYmUKKyAgICAgICAg
ICAgIC8vIGRlbGV0ZWQgd2hlbiBtYW5hZ2VyIGxvYWRzIHRoZSBiYWNraW5nc3RvcmUgYWdhaW4u
CisgICAgICAgICAgICBQYXJzZWRDb29raWUqIGV4cGlyZWQgPSByZW1vdmVDb29raWUobmV3Q29v
a2llKTsKKyAgICAgICAgICAgIGRlbGV0ZSBleHBpcmVkOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIHN0YWNrT2ZDb29raWVzLT5hcHBlbmQobmV3Q29va2llKTsKKyAgICB9CisKKyAgICBD
b29raWVMb2coIkNvb2tpZU1hcCAtIHN0YWNrIG9mIGNvb2tpZXMgbm93IGhhdmUgJWQgY29va2ll
cyBpbiBpdCIsICgqc3RhY2tPZkNvb2tpZXMpLnNpemUoKSk7CisKK30KKworUGFyc2VkQ29va2ll
KiBDb29raWVNYXA6OnJlbW92ZU9sZGVzdENvb2tpZSgpCit7CisgICAgLy8gRklYTUU6IE1ha2Ug
c3VyZSBpdCBmaW5kcyB0aGUgR0xPQkFMIG9sZGVzdCBjb29raWUsIG5vdCB0aGUgZmlyc3Qgb2xk
ZXN0Y29va2llIGl0IGZpbmRzLgorICAgIFBhcnNlZENvb2tpZSogb2xkZXN0Q29va2llID0gbV9v
bGRlc3RDb29raWU7CisKKyAgICAvLyBJZiB0aGlzIG1hcCBoYXMgYW4gb2xkZXN0Q29va2llLCBy
ZW1vdmUgaXQuIElmIG5vdCwgZG8gYSBERlMgdG8gc2VhcmNoIGZvciBhIGNoaWxkIHRoYXQgZG9l
cworICAgIGlmICghb2xkZXN0Q29va2llKSB7CisKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVN
YXAgLSBubyBvbGRlc3RDb29raWUgZXhpc3QiKTsKKworICAgICAgICAvLyBCYXNlIGNhc2UgaXMg
aWYgdGhlIG1hcCBoYXMgbm8gY2hpbGQgYW5kIG5vIGNvb2tpZXMsIHdlIHJldHVybiBhIG51bGwu
CisgICAgICAgIGlmICghbV9zdWJkb21haW5zLnNpemUoKSkgeworICAgICAgICAgICAgQ29va2ll
TG9nKCJDb29raWVNYXAgLSBubyBzdWJkb21haW5zLCBiYXNlIGNhc2UgcmVhY2hlZCwgcmV0dXJu
IDAiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQ29va2ll
TG9nKCJDb29raWVNYXAgLSBsb29raW5nIGludG8gc3ViZG9tYWlucyIpOworCisgICAgICAgIGZv
ciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IG1fc3ViZG9tYWlu
cy5iZWdpbigpOyBpdCAhPSBtX3N1YmRvbWFpbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAg
IG9sZGVzdENvb2tpZSA9IGl0LT5zZWNvbmQtPnJlbW92ZU9sZGVzdENvb2tpZSgpOworICAgICAg
ICAgICAgaWYgKG9sZGVzdENvb2tpZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIH0gZWxzZSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gb2xkZXN0Q29v
a2llIGV4aXN0LiIpOworICAgICAgICBvbGRlc3RDb29raWUgPSByZW1vdmVDb29raWUobV9vbGRl
c3RDb29raWUpOworICAgIH0KKworICAgIHJldHVybiBvbGRlc3RDb29raWU7Cit9CisKK3ZvaWQg
Q29va2llTWFwOjp1cGRhdGVPbGRlc3RDb29raWUoKQoreworICAgIGlmICghbV9jb29raWVNYXAu
c2l6ZSgpKQorICAgICAgICBtX29sZGVzdENvb2tpZSA9IDA7CisgICAgZWxzZSB7CisgICAgICAg
IEhhc2hNYXA8U3RyaW5nLCBQYXJzZWRDb29raWUqPjo6aXRlcmF0b3IgaXQgPSBtX2Nvb2tpZU1h
cC5iZWdpbigpOworICAgICAgICBtX29sZGVzdENvb2tpZSA9IGl0LT5zZWNvbmQ7CisgICAgICAg
ICsraXQ7CisgICAgICAgIGZvciAoOyBpdCAhPSBtX2Nvb2tpZU1hcC5lbmQoKTsgKytpdCkKKyAg
ICAgICAgICAgIGlmIChtX29sZGVzdENvb2tpZS0+bGFzdEFjY2Vzc2VkKCkgPiBpdC0+c2Vjb25k
LT5sYXN0QWNjZXNzZWQoKSkKKyAgICAgICAgICAgICAgICBtX29sZGVzdENvb2tpZSA9IGl0LT5z
ZWNvbmQ7CisgICAgfQorfQorCit2b2lkIENvb2tpZU1hcDo6ZGVsZXRlQWxsQ29va2llc0FuZERv
bWFpbnMoKQoreworICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgZmly
c3QgPSBtX3N1YmRvbWFpbnMuYmVnaW4oKTsKKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFw
Kj46Oml0ZXJhdG9yIGVuZCA9IG1fc3ViZG9tYWlucy5lbmQoKTsKKyAgICBmb3IgKEhhc2hNYXA8
U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQgPSBmaXJzdDsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKworICAgIEhhc2hNYXA8U3RyaW5nLCBQYXJz
ZWRDb29raWUqPjo6aXRlcmF0b3IgZmlyc3RDb29raWVJdGVyYXRvciA9IG1fY29va2llTWFwLmJl
Z2luKCk7CisgICAgSGFzaE1hcDxTdHJpbmcsIFBhcnNlZENvb2tpZSo+OjppdGVyYXRvciBlbmRD
b29raWVJdGVyYXRvciA9IG1fY29va2llTWFwLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDxTdHJp
bmcsIFBhcnNlZENvb2tpZSo+OjppdGVyYXRvciBpdCA9IGZpcnN0Q29va2llSXRlcmF0b3I7IGl0
ICE9IGVuZENvb2tpZUl0ZXJhdG9yOyArK2l0KQorICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsK
KworICAgIG1fc3ViZG9tYWlucy5jbGVhcigpOworICAgIG1fY29va2llTWFwLmNsZWFyKCk7CisK
KyAgICBtX29sZGVzdENvb2tpZSA9IDA7Cit9CisKK3ZvaWQgQ29va2llTWFwOjpnZXRBbGxDaGls
ZENvb2tpZXMoVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBzdGFja09mQ29va2llcykKK3sKKyAgICBD
b29raWVMb2coIkNvb2tpZU1hcCAtIGdldEFsbENoaWxkQ29va2llcyBpbiBNYXAgLSAlcyIsIGdl
dE5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBnZXRBbGxDb29raWVzKHN0YWNrT2ZDb29raWVz
KTsKKyAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQgPSBt
X3N1YmRvbWFpbnMuYmVnaW4oKTsgaXQgIT0gbV9zdWJkb21haW5zLmVuZCgpOyArK2l0KQorICAg
ICAgICBpdC0+c2Vjb25kLT5nZXRBbGxDaGlsZENvb2tpZXMoc3RhY2tPZkNvb2tpZXMpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxh
Y2tiZXJyeS9Db29raWVNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iYzhkMzQ0ZTVmZWI4YTViMDllMWRlNjc2
NGIyYWRiZjMyN2NiN2EyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVNYXAuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAq
IENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpZm5kZWYgQ29va2llTWFwX2gKKyNkZWZpbmUgQ29va2llTWFwX2gKKworI2lu
Y2x1ZGUgIkhhc2hNYXAuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUg
IlZlY3Rvci5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBQYXJzZWRDb29raWU7CisKKy8qIEEgY29va2llIG1hcCBpcyBh
IG5vZGUgaW4gdGhlIHRyZWUgaGVsZCBieSBDb29raWVNYW5hZ2VyIHRoYXQgcmVwcmVzZW50cwor
ICogY29va2llcyB0aGF0IG1hdGNoZXMgYSBjb21tb24gZG9tYWluLgorICoKKyAqIEEgQ29va2ll
TWFwIGhvbGRzIHJlZmVyZW5jZSB0byB0aGUgY29va2llcyB0aGF0IGl0IGNvbnRhaW5zIGFuZCB0
aGUgY2hpbGQKKyAqIGRvbWFpbnMgdGhhdCBleGlzdCB3aXRoaW4gdGhlIHRyZWUuCisgKgorICog
VGhlIG51bWJlciBvZiBjb29raWUgcGVyIGhvc3QgaXMgbGltaXRlZCBieSBDb29raWVNYW5hZ2Vy
OjpzX21heENvb2tpZUNvdW50UGVySG9zdAorICovCisKK2NsYXNzIENvb2tpZU1hcCB7CisKK3B1
YmxpYzoKKyAgICBDb29raWVNYXAoY29uc3QgU3RyaW5nJiBuYW1lID0gIiIpOworICAgIH5Db29r
aWVNYXAoKTsKKworICAgIHVuc2lnbmVkIGludCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29v
a2llTWFwLnNpemUoKTsgfQorICAgIGNvbnN0IFN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0
dXJuIG1fbmFtZTsgfQorCisgICAgdm9pZCBhZGRDb29raWUoUGFyc2VkQ29va2llKik7CisKKyAg
ICAvLyBSZXR1cm5pbmcgdGhlIG9yaWdpbmFsIGNvb2tpZSBvYmplY3Qgc28gbWFuYWdlciBjYW4g
a2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgdXBkYXRlcyBpbiB0aGUgZGF0YWJhc2UgcXVldWUKKyAg
ICBQYXJzZWRDb29raWUqIHVwZGF0ZUNvb2tpZShQYXJzZWRDb29raWUqKTsKKworICAgIC8vIE5l
ZWQgdG8gcmV0dXJuIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgY29va2llIHNvIG1hbmFn
ZXIgY2FuIGRlYWwgd2l0aCBpdCAoZ2FyYmFnZSBjb2xsZWN0KQorICAgIFBhcnNlZENvb2tpZSog
cmVtb3ZlQ29va2llKGNvbnN0IFBhcnNlZENvb2tpZSopOworICAgIGJvb2wgZXhpc3RzQ29va2ll
KGNvbnN0IFBhcnNlZENvb2tpZSopIGNvbnN0OworCisgICAgLy8gUmV0dXJucyBhIG1hcCB3aXRo
IHRoYXQgZ2l2ZW4gc3ViZG9tYWluCisgICAgQ29va2llTWFwKiBnZXRTdWJkb21haW5NYXAoY29u
c3QgU3RyaW5nJik7CisgICAgdm9pZCBhZGRTdWJkb21haW5NYXAoY29uc3QgU3RyaW5nJiwgQ29v
a2llTWFwKik7CisgICAgdm9pZCBkZWxldGVBbGxDb29raWVzQW5kRG9tYWlucygpOworCisgICAg
dm9pZCBnZXRBbGxDb29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiopOworICAgIHZvaWQgZ2V0
QWxsQ2hpbGRDb29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiogc3RhY2tPZkNvb2tpZXMpOwor
ICAgIFBhcnNlZENvb2tpZSogcmVtb3ZlT2xkZXN0Q29va2llKCk7CisKK3ByaXZhdGU6CisgICAg
dm9pZCB1cGRhdGVPbGRlc3RDb29raWUoKTsKKworICAgIC8vIFRoZSBrZXkgaXMgdGhlIHR1cGxl
IChuYW1lLCBwYXRoKQorICAgIC8vIFRoZSBzcGVjIGFza3MgdG8gaGF2ZSBhbHNvIGRvbWFpbiwg
d2hpY2ggaXMgaW1wbGllZCBieSBjaG9vc2luZyB0aGUgQ29va2llTWFwIHJlbGV2YW50IHRvIHRo
ZSBkb21haW4KKyAgICBIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj4gbV9jb29raWVNYXA7
CisKKyAgICAvLyBUaGUga2V5IGlzIGEgc3Vic2VjdGlvbiBvZiB0aGUgZG9tYWluLgorICAgIC8v
IGV4OiBpZiBpbnNlcnRpbmcgYWNjb3VudHMuZ29vZ2xlLmNvbSAmIHRoaXMgY29va2llbWFwIGlz
ICJjb20iLCB0aGlzIHN1YmRvbWFpbiBtYXAgd2lsbCBjb250YWluICJnb29nbGUiCisgICAgLy8g
VGhlICJnb29nbGUiIGNvb2tpZW1hcCB3aWxsIGNvbnRhaW4gImFjY291bnRzIiBpbiBpdHMgc3Vi
ZG9tYWluIG1hcAorICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPiBtX3N1YmRvbWFpbnM7
CisKKyAgICAvLyBTdG9yZSB0aGUgb2xkZXN0IGNvb2tpZSB0byBzcGVlZCB1cCBMUlUgY2hlY2tz
CisgICAgUGFyc2VkQ29va2llKiBtX29sZGVzdENvb2tpZTsKKyAgICBjb25zdCBTdHJpbmcgbV9u
YW1lOworCisgICAgLy8gRklYTUUgOiBzaG91bGQgaGF2ZSBhIG1fc2hvdWxkVXBkYXRlIGZsYWcg
dG8gdXBkYXRlIHRoZSBuZXR3b3JrIGxheWVyIG9ubHkgd2hlbiB0aGUgbWFwIGhhcyBjaGFuZ2Vk
Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVNYXBfaApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJz
ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjc3YTdjYTYzZjhjNjI0Mzc0MTliOTAwYWIwNzJhODNjZDFjMjQ5MTkK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nv
b2tpZVBhcnNlci5jcHAKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQg
KEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLyAKKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvb2tpZVBhcnNlci5oIgorCisjaW5jbHVk
ZSAiQ3VycmVudFRpbWUuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2Vk
Q29va2llLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0Nvb2tpZUhlYWRlclNlcGFyYXRvcihVQ2hh
ciBjKQoreworICAgIHJldHVybiAoYyA9PSAnXHInIHx8IGMgPT0nXG4nKTsKK30KKworc3RhdGlj
IGlubGluZSBib29sIGlzTGlnaHR3ZWlnaHRTcGFjZShVQ2hhciBjKQoreworICAgIHJldHVybiAo
YyA9PSAnICcgfHwgYyA9PSAnXHQnKTsKK30KKworQ29va2llUGFyc2VyOjpDb29raWVQYXJzZXIo
Y29uc3QgS1VSTCYgZGVmYXVsdENvb2tpZVVSTCkKKyAgICA6IG1fZGVmYXVsdENvb2tpZVVSTChk
ZWZhdWx0Q29va2llVVJMKQoreworfQorCitDb29raWVQYXJzZXI6On5Db29raWVQYXJzZXIoKQor
eworfQorCitWZWN0b3I8UGFyc2VkQ29va2llKj4gQ29va2llUGFyc2VyOjpwYXJzZShjb25zdCBT
dHJpbmcmIGNvb2tpZXMpCit7CisgICAgdW5zaWduZWQgY29va2llU3RhcnQsIGNvb2tpZUVuZCA9
IDA7CisgICAgZG91YmxlIGN1clRpbWUgPSBjdXJyZW50VGltZSgpOworICAgIFZlY3RvcjxQYXJz
ZWRDb29raWUqLCA0PiBwYXJzZWRDb29raWVzOworIAorICAgIGlmICghY29va2llcy5sZW5ndGgo
KSkgLy8gQ29kZSBiZWxvdyBkb2Vzbid0IGhhbmRsZSB0aGlzIGNhc2UKKyAgICAgICAgcmV0dXJu
IHBhcnNlZENvb2tpZXM7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGhlYWRlciB0byBwYXJz
ZSBhbGwgdGhlIGNvb2tpZXMuCisgICAgd2hpbGUgKGNvb2tpZUVuZCA8PSBjb29raWVzLmxlbmd0
aCgpKSB7CisgICAgICAgIGNvb2tpZVN0YXJ0ID0gY29va2llRW5kOworICAgICAgICAKKyAgICAg
ICAgLy8gRmluZCBhIGNvb2tpZSBzZXBhcmF0b3IuCisgICAgICAgIHdoaWxlIChjb29raWVFbmQg
PD0gY29va2llcy5sZW5ndGgoKSAmJiAhaXNDb29raWVIZWFkZXJTZXBhcmF0b3IoY29va2llc1tj
b29raWVFbmRdKSkKKyAgICAgICAgICAgIGNvb2tpZUVuZCsrOworCisgICAgICAgIC8vIERldGVj
dCBhbiBlbXB0eSBjb29raWUgYW5kIGdvIHRvIHRoZSBuZXh0IG9uZS4KKyAgICAgICAgaWYgKGNv
b2tpZVN0YXJ0ID09IGNvb2tpZUVuZCkgeworICAgICAgICAgICAgKytjb29raWVFbmQ7CisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb29raWVFbmQgPCBj
b29raWVzLmxlbmd0aCgpICYmIGlzQ29va2llSGVhZGVyU2VwYXJhdG9yKGNvb2tpZXNbY29va2ll
RW5kXSkpCisgICAgICAgICAgICArK2Nvb2tpZUVuZDsKKworICAgICAgICBQYXJzZWRDb29raWUq
IGNvb2tpZSA9IHBhcnNlT25lQ29va2llKGNvb2tpZXMsIGNvb2tpZVN0YXJ0LCBjb29raWVFbmQg
LSAxLCBjdXJUaW1lKTsKKyAgICAgICAgaWYgKGNvb2tpZSkKKyAgICAgICAgICAgIHBhcnNlZENv
b2tpZXMuYXBwZW5kKGNvb2tpZSk7CisgICAgfQorICAgIHJldHVybiBwYXJzZWRDb29raWVzOwor
fQorCisvLyBQYXJzZSB0aGUgc3RyaW5nIHdpdGhvdXQgIlNldC1Db29raWUiIGFjY29yZGluZyB0
byBGaXJlZm94IGdyYW1tYXIgKGxvb3NlbHkgUkZDIDIxMDkgY29tcGxpYW50KQorLy8gc2VlIG5l
dHdlcmsvY29va2llL3NyYy9uc0Nvb2tpZVNlcnZpY2UuY3BwIGNvbW1lbnQgZm9yIGl0CitQYXJz
ZWRDb29raWUqIENvb2tpZVBhcnNlcjo6cGFyc2VPbmVDb29raWUoY29uc3QgU3RyaW5nJiBjb29r
aWUsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQsIGRvdWJsZSBjdXJUaW1lKQoreworICAg
IFBhcnNlZENvb2tpZSogcmVzID0gbmV3IFBhcnNlZENvb2tpZShjdXJUaW1lKTsKKworICAgIGlm
ICghcmVzKSB7CisgICAgICAgIExPR19FUlJPUigiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IHByb3RvY29sCisgICAgcmVzLT5zZXRQ
cm90b2NvbChtX2RlZmF1bHRDb29raWVVUkwucHJvdG9jb2woKSk7CisKKyAgICAvLyBQYXJzZSBb
TkFNRSAiPSJdIFZBTFVFCisKKyAgICB1bnNpZ25lZCB0b2tlbkVuZCA9IHN0YXJ0OyAvLyBUb2tl
biBlbmQgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnPScgb3IgdGhlIGVuZCBvZiBhIHRv
a2VuCisgICAgdW5zaWduZWQgcGFpckVuZCA9IHN0YXJ0OyAvLyBQYWlyIGVuZCBjb250YWlucyBh
bHdheXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnOycKKworICAgIC8vIGZpbmQgdGhlICpmaXJzdCog
JzsnIGFuZCB0aGUgJz0nIChpZiB0aGV5IGV4aXN0KQorICAgIGJvb2wgcXVvdGVGb3VuZCA9IGZh
bHNlOworICAgIGJvb2wgZm91bmRFcXVhbCA9IGZhbHNlOworICAgIHdoaWxlIChwYWlyRW5kIDwg
ZW5kICYmIChjb29raWVbcGFpckVuZF0gIT0gJzsnIHx8IHF1b3RlRm91bmQpKSB7CisgICAgICAg
IGlmICh0b2tlbkVuZCA9PSBzdGFydCAmJiBjb29raWVbcGFpckVuZF0gPT0gJz0nKSB7CisgICAg
ICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgICAgICAgICBmb3VuZEVxdWFsID0gdHJ1
ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llW3BhaXJFbmRdID09ICciJykKKyAgICAg
ICAgICAgIHF1b3RlRm91bmQgPSAhcXVvdGVGb3VuZDsKKyAgICAgICAgcGFpckVuZCsrOworICAg
IH0KKworICAgIHVuc2lnbmVkIHRva2VuU3RhcnQgPSBzdGFydDsKKworICAgIGJvb2wgaGFzTmFt
ZSA9IGZhbHNlOyAvLyBUaGlzIGlzIGEgaGFjayB0byBhdm9pZCBjaGFuZ2luZyB0b28gbXVjaCBp
biB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJydXRhbGx5IGJyaXR0bGUgY29k
ZS4KKyAgICBpZiAodG9rZW5FbmQgIT0gc3RhcnQpIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgYSAn
PScgc28gcGFyc2UgdGhlIE5BTUUKKyAgICAgICAgdW5zaWduZWQgbmFtZUVuZCA9IHRva2VuRW5k
OworCisgICAgICAgIC8vIFRoZSB0b2tlbkVuZCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlICc9JyBz
byB0aGUgbmFtZUVuZCBpcyBvbmUgbGVzcworICAgICAgICBuYW1lRW5kLS07CisKKyAgICAgICAg
Ly8gUmVtb3ZlIGxpZ2h0d2VpZ2h0IHNwYWNlcy4KKyAgICAgICAgd2hpbGUgKG5hbWVFbmQgJiYg
aXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVtuYW1lRW5kXSkpCisgICAgICAgICAgICBuYW1lRW5k
LS07CisKKyAgICAgICAgd2hpbGUgKHRva2VuU3RhcnQgPCBuYW1lRW5kICYmIGlzTGlnaHR3ZWln
aHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAgICAgICAgICAgdG9rZW5TdGFydCsrOwor
CisgICAgICAgIGlmIChuYW1lRW5kICsgMSA8PSB0b2tlblN0YXJ0KSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIkVtcHR5IG5hbWUuIFJlamVjdGluZyB0aGUgY29va2llIik7CisgICAgICAgICAg
ICBkZWxldGUgcmVzOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAg
ICBTdHJpbmcgbmFtZSA9IGNvb2tpZS5zdWJzdHJpbmcodG9rZW5TdGFydCwgbmFtZUVuZCArIDEg
LSBzdGFydCk7CisgICAgICAgIHJlcy0+c2V0TmFtZShuYW1lKTsKKyAgICAgICAgaGFzTmFtZSA9
IHRydWU7CisgICAgfQorCisgICAgLy8gTm93IHBhcnNlIHRoZSBWQUxVRQorICAgIHRva2VuU3Rh
cnQgPSB0b2tlbkVuZCArIDE7CisgICAgaWYgKCFoYXNOYW1lKQorICAgICAgICAtLXRva2VuU3Rh
cnQ7CisKKyAgICAvLyBTa2lwIGxpZ2h0d2VpZ2h0IHNwYWNlcyBpbiBvdXIgdG9rZW4KKyAgICB3
aGlsZSAodG9rZW5TdGFydCA8IHBhaXJFbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVt0
b2tlblN0YXJ0XSkpCisgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgIHRva2VuRW5kID0gcGFp
ckVuZDsKKyAgICB3aGlsZSAodG9rZW5FbmQgPiB0b2tlblN0YXJ0ICYmIGlzTGlnaHR3ZWlnaHRT
cGFjZShjb29raWVbdG9rZW5FbmQgLSAxXSkpCisgICAgICAgIHRva2VuRW5kLS07CisKKyAgICBT
dHJpbmcgdmFsdWU7CisgICAgaWYgKHRva2VuRW5kID09IHRva2VuU3RhcnQpIHsKKyAgICAgICAg
Ly8gRmlyZWZveCBhY2NlcHRzIGVtcHR5IHZhbHVlIHNvIHdlIHdpbGwgZG8gdGhlIHNhbWUKKyAg
ICAgICAgdmFsdWUgPSBTdHJpbmcoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgdmFsdWUgPSBjb29r
aWUuc3Vic3RyaW5nKHRva2VuU3RhcnQsIHRva2VuRW5kIC0gdG9rZW5TdGFydCk7CisKKyAgICBp
ZiAoaGFzTmFtZSkKKyAgICAgICAgcmVzLT5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgZWxzZSBpZiAo
Zm91bmRFcXVhbCkgeworICAgICAgICBkZWxldGUgcmVzOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9IGVsc2UKKyAgICAgICAgcmVzLT5zZXROYW1lKHZhbHVlKTsgLy8gTm8gTkFNRT1WQUxVRSwg
b25seSBOQU1FCisKKyAgICB3aGlsZSAocGFpckVuZCA8IGVuZCkgeworICAgICAgICAvLyBTd2l0
Y2ggdG8gdGhlIG5leHQgcGFpciBhcyBwYWlyRW5kIGlzIG9uIHRoZSAnOycgYW5kIGZhc3QtZm9y
d2FyZCBhbnkgbGlnaHR3ZWlnaHQgc3BhY2VzLgorICAgICAgICBwYWlyRW5kKys7CisgICAgICAg
IHdoaWxlIChwYWlyRW5kIDwgZW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbcGFpckVu
ZF0pKQorICAgICAgICAgICAgcGFpckVuZCsrOworCisgICAgICAgIHRva2VuU3RhcnQgPSBwYWly
RW5kOworICAgICAgICB0b2tlbkVuZCA9IHRva2VuU3RhcnQ7IC8vIGluaXRpYWxpemUgdG9rZW4g
ZW5kIHRvIGNhdGNoIGZpcnN0ICc9JworCisgICAgICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kICYm
IGNvb2tpZVtwYWlyRW5kXSAhPSAnOycpIHsKKyAgICAgICAgICAgIGlmICh0b2tlbkVuZCA9PSB0
b2tlblN0YXJ0ICYmIGNvb2tpZVtwYWlyRW5kXSA9PSAnPScpCisgICAgICAgICAgICAgICAgdG9r
ZW5FbmQgPSBwYWlyRW5kOworICAgICAgICAgICAgcGFpckVuZCsrOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gRklYTUUgOiBzaG91bGQgd2Ugc2tpcCBsaWdodHdlaWdodCBzcGFjZXMgaGVyZSA/
CisKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdG9rZW5FbmQgLSB0b2tlblN0YXJ0OworICAg
ICAgICB1bnNpZ25lZCB0b2tlblN0YXJ0U3ZnID0gdG9rZW5TdGFydDsKKworICAgICAgICBTdHJp
bmcgcGFyc2VkVmFsdWU7CisgICAgICAgIGlmICh0b2tlblN0YXJ0ICE9IHRva2VuRW5kKSB7Cisg
ICAgICAgICAgICAvLyBUaGVyZSBpcyBhbiBlcXVhbCBzaWduIHNvIHJlbW92ZSBsaWdodHdlaWdo
dCBzcGFjZXMgaW4gVkFMVUUKKyAgICAgICAgICAgIHRva2VuU3RhcnQgPSB0b2tlbkVuZCArIDE7
CisgICAgICAgICAgICB3aGlsZSAodG9rZW5TdGFydCA8IHBhaXJFbmQgJiYgaXNMaWdodHdlaWdo
dFNwYWNlKGNvb2tpZVt0b2tlblN0YXJ0XSkpCisgICAgICAgICAgICAgICAgdG9rZW5TdGFydCsr
OworCisgICAgICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgICAgICAgICB3aGlsZSAo
dG9rZW5FbmQgPiB0b2tlblN0YXJ0ICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5F
bmQgLSAxXSkpCisgICAgICAgICAgICAgICAgdG9rZW5FbmQtLTsKKworICAgICAgICAgICAgcGFy
c2VkVmFsdWUgPSBjb29raWUuc3Vic3RyaW5nKHRva2VuU3RhcnQsIHRva2VuRW5kIC0gdG9rZW5T
dGFydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcGFyc2VkVmFs
dWUgaXMgZW1wdHksIGluaXRpYWxpc2UgaXQgaW4gY2FzZSB3ZSBuZWVkIGl0CisgICAgICAgICAg
ICBwYXJzZWRWYWx1ZSA9IFN0cmluZygpOworICAgICAgICAgICAgLy8gSGFuZGxlIGEgdG9rZW4g
d2l0aG91dCB2YWx1ZS4KKyAgICAgICAgICAgIGxlbmd0aCA9IHBhaXJFbmQgLSB0b2tlblN0YXJ0
OworICAgICAgICB9CisKKyAgICAgICAvLyBEZXRlY3Qgd2hpY2ggImNvb2tpZS1hdiIgaXMgcGFy
c2VkCisgICAgICAgLy8gTG9vayBhdCB0aGUgZmlyc3QgY2hhciB0aGVuIHBhcnNlIHRoZSB3aG9s
ZSBmb3IgcGVyZm9ybWFuY2UgaXNzdWUKKyAgICAgICAgc3dpdGNoIChjb29raWVbdG9rZW5TdGFy
dFN2Z10pIHsKKyAgICAgICAgY2FzZSAnUCc6CisgICAgICAgIGNhc2UgJ3AnIDogeworICAgICAg
ICAgICAgaWYgKGxlbmd0aCA+PSA0ICYmIGNvb2tpZS5maW5kKCJhdGgiLCB0b2tlblN0YXJ0U3Zn
ICsgMSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0UGF0aChwYXJzZWRWYWx1ZSk7
CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQg
Y29va2llICVzIChwYXRoKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAg
ICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnRCc6CisgICAg
ICAgIGNhc2UgJ2QnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA2ICYmIGNvb2tpZS5m
aW5kKCJvbWFpbiIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAg
ICBpZiAocGFyc2VkVmFsdWUubGVuZ3RoKCkgPiAxICYmIHBhcnNlZFZhbHVlWzBdID09ICciJyAm
JiBwYXJzZWRWYWx1ZVtwYXJzZWRWYWx1ZS5sZW5ndGgoKSAtIDFdID09ICciJykKKyAgICAgICAg
ICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZWRWYWx1ZS5zdWJzdHJpbmcoMSwgcGFyc2Vk
VmFsdWUubGVuZ3RoKCkgLSAyKTsKKworICAgICAgICAgICAgICAgIHJlcy0+c2V0RG9tYWluKHBh
cnNlZFZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0VS
Uk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAoZG9tYWluKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7
CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
Y2FzZSAnRScgOgorICAgICAgICBjYXNlICdlJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGgg
Pj0gNyAmJiBjb29raWUuZmluZCgieHBpcmVzIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkK
KyAgICAgICAgICAgICAgICByZXMtPnNldEV4cGlyeShwYXJzZWRWYWx1ZSk7CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzIChl
eHBpcmVzKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRl
IHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnTScgOgorICAgICAgICBjYXNl
ICdtJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgiYXgt
YWdlIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICByZXMtPnNl
dE1heEFnZShwYXJzZWRWYWx1ZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzIChtYXgtYWdlKSIsIGNvb2tpZS5hc2NpaSgp
LmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisK
KyAgICAgICAgY2FzZSAnQycgOgorICAgICAgICBjYXNlICdjJyA6IHsKKyAgICAgICAgICAgIGlm
IChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgib21tZW50IiwgdG9rZW5TdGFydFN2ZyArIDEs
IGZhbHNlKSkKKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSByb29tIGZvciB0aGUg
Y29tbWVudCBwYXJ0IChhbmQgc28gZG8gTW96aWxsYSkgc28ganVzdCBsb2cgdGhlIGNvbW1lbnQu
CisgICAgICAgICAgICAgICAgTE9HKE5ldHdvcmssICJDb21tZW50ICVzIGZvciBQYXJzZWRDb29r
aWUgOiAlc1xuIiwgcGFyc2VkVmFsdWUuYXNjaWkoKS5kYXRhKCksIGNvb2tpZS5hc2NpaSgpLmRh
dGEoKSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIklu
dmFsaWQgY29va2llICVzIChjb21tZW50KSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAg
ICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAn
VicgOgorICAgICAgICBjYXNlICd2JyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNyAm
JiBjb29raWUuZmluZCgiZXJzaW9uIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkgeworICAg
ICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHRoZSBvdXQtb2YtZGF0ZWQgQ29va2llIFNwZWMoUkZD
Mjk2NSwgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjk2NSkgZGVmaW5lZAorICAgICAg
ICAgICAgICAgIC8vIHRoZSB2YWx1ZSBvZiB2ZXJzaW9uIGNhbiBvbmx5IGNvbnRhaW4gRElHSVQs
IHNvbWUgcmFuZG9tIHNpdGVzLCBlLmcuIGh0dHBzOi8vZGV2Zm9ydW1zLmFwcGxlLmNvbQorICAg
ICAgICAgICAgICAgIC8vIHdvdWxkIHVzZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIHRvIHF1b3Rl
IHRoZSBkaWdpdC4gU28gd2UgbmVlZCB0byBnZXQgcmlkIG9mIHRoZW0gZm9yIGNvbXBsaWFuY2Uu
CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFZhbHVlLmxlbmd0aCgpID4gMSAmJiBwYXJzZWRW
YWx1ZVswXSA9PSAnIicgJiYgcGFyc2VkVmFsdWVbcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAxXSA9
PSAnIicpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gcGFyc2VkVmFsdWUuc3Vi
c3RyaW5nKDEsIHBhcnNlZFZhbHVlLmxlbmd0aCgpIC0gMik7CisKKyAgICAgICAgICAgICAgICBp
ZiAocGFyc2VkVmFsdWUudG9JbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIExPR19F
UlJPUigiUGFyc2VkQ29va2llIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZCAob25seSBzdXBwb3J0
IHZlcnNpb249MSkiLCBwYXJzZWRWYWx1ZS50b0ludCgpKTsKKyAgICAgICAgICAgICAgICAgICAg
ZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIklu
dmFsaWQgY29va2llICVzICh2ZXJzaW9uKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAg
ICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAn
UycgOgorICAgICAgICBjYXNlICdzJyA6IHsKKyAgICAgICAgICAgIC8vIFNlY3VyZSBpcyBhIHN0
YW5kYWxvbmUgdG9rZW4gKCJTZWN1cmU7IikKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNiAm
JiBjb29raWUuZmluZCgiZWN1cmUiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAg
ICAgICAgICAgIHJlcy0+c2V0U2VjdXJlRmxhZyh0cnVlKTsKKyAgICAgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUgJXMgKHNlY3VyZSkiLCBj
b29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgY2FzZSAnaCc6IHsKKyAgICAg
ICAgICAgIC8vIEh0dHBPbmx5IGlzIGEgc3RhbmRhbG9uZSB0b2tlbiAoIkh0dHBPbmx5OyIpCisg
ICAgICAgICAgICBpZiAobGVuZ3RoID49IDggJiYgY29va2llLmZpbmQoInR0cE9ubHkiLCB0b2tl
blN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0SXNIdHRwT25s
eSh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigi
SW52YWxpZCBjb29raWUgJXMgKEh0dHBPbmx5KSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7Cisg
ICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVm
YXVsdCA6IHsKKyAgICAgICAgICAgIC8vIElmIGxlbmd0aCA9PSAwLCB3ZSBzaG91bGQgYmUgYXQg
dGhlIGVuZCBvZiB0aGUgY29va2llIChjYXNlIDogIjtcciIpIHNvIGlnbm9yZSBpdAorICAgICAg
ICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgdG9r
ZW4gZm9yIGNvb2tpZSAlcyIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRoZSBjb29raWUgaXMgdmFsaWQgd2l0
aCByZXNwZWN0IHRvIHRoZSBzaXplIGxpbWl0LworICAgIGlmICghcmVzLT5pc1VuZGVyU2l6ZUxp
bWl0KCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJQYXJzZWRDb29raWUgJXMgaXMgYWJvdmUgdGhl
IDRrYiBpbiBsZW5ndGggOiBSRUpFQ1RFRCIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAg
ICAgIGRlbGV0ZSByZXM7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIElmIHNv
bWUgcGFpciB3YXMgbm90IHByb3ZpZGVkLCBkdXJpbmcgcGFyc2luZyB0aGVuIGFwcGx5IHNvbWUg
ZGVmYXVsdCB2YWx1ZQorICAgIC8vIHRoZSByZXN0IGhhcyBiZWVuIGRvbmUgaW4gdGhlIGNvbnN0
cnVjdG9yLgorCisgICAgLy8gSWYgbm8gZG9tYWluIHdhcyBwcm92aWRlZCwgc2V0IGl0IHRvIHRo
ZSBob3N0CisgICAgaWYgKCFyZXMtPmRvbWFpbigpKQorICAgICAgICByZXMtPnNldERlZmF1bHRE
b21haW4obV9kZWZhdWx0Q29va2llVVJMKTsKKworICAgIC8vIEFjY29yZGluZyB0byB0aGUgQ29v
a2llIFNwZWNpZmljYWl0b24gKFJGQzYyNjUsIHNlY3Rpb24gNC4xLjIuNCBhbmQgNS4yLjQsIGh0
dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUpLAorICAgIC8vIElmIG5vIHBhdGggd2Fz
IHByb3ZpZGVkIG9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhdGggdmFsdWUgaXMgbm90
ICcvJywgc2V0IGl0IHRvIHRoZSBob3N0J3MgcGF0aAorICAgIC8vCisgICAgLy8gUkVGRVJFTkNF
CisgICAgLy8gNC4xLjIuNC4gVGhlIFBhdGggQXR0cmlidXRlCisgICAgLy8KKyAgICAvLyBUaGUg
c2NvcGUgb2YgZWFjaCBjb29raWUgaXMgbGltaXRlZCB0byBhIHNldCBvZiBwYXRocywgY29udHJv
bGxlZCBieQorICAgIC8vIHRoZSBQYXRoIGF0dHJpYnV0ZS4gSWYgdGhlIHNlcnZlciBvbWl0cyB0
aGUgUGF0aCBhdHRyaWJ1dGUsIHRoZSB1c2VyCisgICAgLy8gYWdlbnQgd2lsbCB1c2UgdGhlICJk
aXJlY3RvcnkiIG9mIHRoZSByZXF1ZXN0LXVyaSdzIHBhdGggY29tcG9uZW50IGFzCisgICAgLy8g
dGhlIGRlZmF1bHQgdmFsdWUuIChTZWUgU2VjdGlvbiA1LjEuNCBmb3IgbW9yZSBkZXRhaWxzLikK
KyAgICAvLyAuLi4uLi4uLi4uLgorICAgIC8vIDUuMi40LiBUaGUgUGF0aCBBdHRyaWJ1dGUKKyAg
ICAvLworICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0
Y2hlcyB0aGUgc3RyaW5nICJQYXRoIiwKKyAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nl
c3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGF0dHJp
YnV0ZS12YWx1ZSBpcyBlbXB0eSBvciBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQorICAg
IC8vIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgJXgyRiAoIi8iKToKKyAgICAvLworICAgIC8vIExl
dCBjb29raWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRoLgorICAgIC8vCisgICAgLy8gT3RoZXJ3
aXNlOgorICAgIC8vCisgICAgLy8gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFs
dWUuCisgICAgLy8KKyAgICAvLyBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0
cmlidXRlLWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtCisgICAgLy8gbmFtZSBvZiBQYXRoIGFuZCBh
biBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLXBhdGguCisgICAgaWYgKCFyZXMtPnBhdGgoKSB8
fCAhcmVzLT5wYXRoKCkubGVuZ3RoKCkgfHwgIXJlcy0+cGF0aCgpLnN0YXJ0c1dpdGgoIi8iLCBm
YWxzZSkpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBtX2RlZmF1bHRDb29raWVVUkwuc3RyaW5n
KCkuc3Vic3RyaW5nKG1fZGVmYXVsdENvb2tpZVVSTC5wYXRoU3RhcnQoKSwgbV9kZWZhdWx0Q29v
a2llVVJMLnBhdGhBZnRlckxhc3RTbGFzaCgpIC0gbV9kZWZhdWx0Q29va2llVVJMLnBhdGhTdGFy
dCgpIC0gMSk7CisgICAgICAgIGlmIChwYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHBhdGgg
PSAiLyI7CisgICAgICAgIHJlcy0+c2V0UGF0aChwYXRoKTsKKyAgICB9CisgCisgICAgcmV0dXJu
IHJlczsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDU3YTZmZDJm
MTM4MmJiOGJlNDY2NzkyZTljNDMxMDNkNGUwOTAyMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmgKQEAgLTAsMCArMSw1
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqY2hhZmZy
YWl4QHBsZXlvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQgMjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ29va2llUGFyc2VyX2gKKyNkZWZp
bmUgQ29va2llUGFyc2VyX2gKKworI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJWZWN0b3Iu
aCIKKworbmFtZXNwYWNlIFdURiB7CitjbGFzcyBTdHJpbmc7Cit9CituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIFBhcnNlZENvb2tpZTsKKworY2xhc3MgQ29va2llUGFyc2VyIHsKK3B1Ymxp
YzoKKyAgICBDb29raWVQYXJzZXIoY29uc3QgS1VSTCYgZGVmYXVsdENvb2tpZVVSTCk7CisgICAg
fkNvb2tpZVBhcnNlcigpOworCisgICAgLy8gUGFyc2VzIGEgc2VxdWVuY2Ugb2YgIkNvb2tpZToi
IGhlYWRlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgY29va2llcy4KKyAgICBWZWN0b3I8UGFyc2Vk
Q29va2llKj4gcGFyc2UoY29uc3QgU3RyaW5nJiBjb29raWVzKTsKKworcHJpdmF0ZToKKyAgICAv
LyBGSVhNRTogY3VyVGltZSwgc3RhcnQsIGVuZCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZW1vdmVk
LiBBbmQgdGhpcyBtZXRob2QgY2FuIGJlIHB1YmxpYy4KKyAgICBQYXJzZWRDb29raWUqIHBhcnNl
T25lQ29va2llKGNvbnN0IFN0cmluZyYgY29va2llLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQg
ZW5kLCBkb3VibGUgY3VyVGltZSk7CisKKyAgICBLVVJMIG1fZGVmYXVsdENvb2tpZVVSTDsKK307
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIENvb2tpZVBhcnNlcl9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tp
ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uY2U5OWVhMDdlNjIwZTA5YzRiMDVlMWE5ZGMwN2JhMDY3MjA0MTQzMQot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFy
c2VkQ29va2llLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIKKworI2luY2x1ZGUgIkNv
b2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJDdXJyZW50VGltZS5oIgorI2luY2x1ZGUgIktVUkwu
aCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSA8Y3VybC9jdXJsLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhcnNlZENv
b2tpZTo6UGFyc2VkQ29va2llKGRvdWJsZSBjdXJyZW50VGltZSkKKyAgICA6IG1fZXhwaXJ5KDAp
CisgICAgLCBtX2lzTWF4QWdlU2V0KGZhbHNlKQorICAgICwgbV9jcmVhdGlvblRpbWUoY3VycmVu
dFRpbWUpCisgICAgLCBtX2xhc3RBY2Nlc3NlZChjdXJyZW50VGltZSkKKyAgICAsIG1faGFzRGVm
YXVsdERvbWFpbihmYWxzZSkKKyAgICAsIG1faXNTZWN1cmUoZmFsc2UpCisgICAgLCBtX2lzSHR0
cE9ubHkoZmFsc2UpCisgICAgLCBtX2lzU2Vzc2lvbih0cnVlKQorICAgICwgbV9pc0ZvcmNlRXhw
aXJlZChmYWxzZSkKK3sKK30KKworUGFyc2VkQ29va2llOjpQYXJzZWRDb29raWUoY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29u
c3QgU3RyaW5nJiBwcm90b2NvbCwgY29uc3QgU3RyaW5nJiBwYXRoLCBkb3VibGUgZXhwaXJ5LCBk
b3VibGUgbGFzdEFjY2Vzc2VkLCBkb3VibGUgY3JlYXRpb25UaW1lLCBib29sIGlzU2VjdXJlLCBi
b29sIGlzSHR0cE9ubHkpCisgICAgOiBtX25hbWUobmFtZSkKKyAgICAsIG1fdmFsdWUodmFsdWUp
CisgICAgLCBtX2RvbWFpbihkb21haW4pCisgICAgLCBtX3Byb3RvY29sKHByb3RvY29sKQorICAg
ICwgbV9wYXRoKHBhdGgpCisgICAgLCBtX2V4cGlyeShleHBpcnkpCisgICAgLCBtX2lzTWF4QWdl
U2V0KGZhbHNlKQorICAgICwgbV9jcmVhdGlvblRpbWUoY3JlYXRpb25UaW1lKQorICAgICwgbV9s
YXN0QWNjZXNzZWQobGFzdEFjY2Vzc2VkKQorICAgICwgbV9oYXNEZWZhdWx0RG9tYWluKGZhbHNl
KQorICAgICwgbV9pc1NlY3VyZShpc1NlY3VyZSkKKyAgICAsIG1faXNIdHRwT25seShpc0h0dHBP
bmx5KQorICAgICwgbV9pc1Nlc3Npb24oZmFsc2UpCisgICAgLCBtX2lzRm9yY2VFeHBpcmVkKGZh
bHNlKQoreworfQorCitQYXJzZWRDb29raWU6OlBhcnNlZENvb2tpZShjb25zdCBQYXJzZWRDb29r
aWUqIGNvb2tpZSkKKyAgICA6IG1fbmFtZShTdHJpbmcoY29va2llLT5tX25hbWUpKQorICAgICwg
bV92YWx1ZShTdHJpbmcoY29va2llLT5tX3ZhbHVlKSkKKyAgICAsIG1fZG9tYWluKFN0cmluZyhj
b29raWUtPm1fZG9tYWluKSkKKyAgICAsIG1fcHJvdG9jb2woU3RyaW5nKGNvb2tpZS0+bV9wcm90
b2NvbCkpCisgICAgLCBtX3BhdGgoU3RyaW5nKGNvb2tpZS0+bV9wYXRoKSkKKyAgICAsIG1fZXhw
aXJ5KGNvb2tpZS0+bV9leHBpcnkpCisgICAgLCBtX2lzTWF4QWdlU2V0KGNvb2tpZS0+bV9pc01h
eEFnZVNldCkKKyAgICAsIG1fY3JlYXRpb25UaW1lKGNvb2tpZS0+bV9jcmVhdGlvblRpbWUpCisg
ICAgLCBtX2xhc3RBY2Nlc3NlZChjb29raWUtPm1fbGFzdEFjY2Vzc2VkKQorICAgICwgbV9oYXNE
ZWZhdWx0RG9tYWluKGNvb2tpZS0+bV9oYXNEZWZhdWx0RG9tYWluKQorICAgICwgbV9pc1NlY3Vy
ZShjb29raWUtPm1faXNTZWN1cmUpCisgICAgLCBtX2lzSHR0cE9ubHkoY29va2llLT5tX2lzSHR0
cE9ubHkpCisgICAgLCBtX2lzU2Vzc2lvbihjb29raWUtPm1faXNTZXNzaW9uKQorICAgICwgbV9p
c0ZvcmNlRXhwaXJlZChjb29raWUtPm1faXNGb3JjZUV4cGlyZWQpCit7Cit9CisKK1BhcnNlZENv
b2tpZTo6flBhcnNlZENvb2tpZSgpCit7Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjpzZXRFeHBp
cnkoY29uc3QgU3RyaW5nJiBleHBpcnkpCit7CisgICAgLy8gSWYgYSBjb29raWUgaGFzIGJvdGgg
dGhlIE1heC1BZ2UgYW5kIHRoZSBFeHBpcmVzIGF0dHJpYnV0ZSwKKyAgICAvLyB0aGUgTWF4LUFn
ZSBhdHRyaWJ1dGUgaGFzIHByZWNlZGVuY2UgYW5kIGNvbnRyb2xzIHRoZSBleHBpcmF0aW9uIGRh
dGUgb2YgdGhlIGNvb2tpZS4KKyAgICBpZiAobV9pc01heEFnZVNldCB8fCBleHBpcnkuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2lzU2Vzc2lvbiA9IGZhbHNlOworCisgICAg
bV9leHBpcnkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGN1cmxfZ2V0ZGF0ZShleHBpcnkudXRmOCgp
LmRhdGEoKSwgMCkpOworCisgICAgaWYgKG1fZXhwaXJ5ID09IC0xKSB7CisgICAgICAgIExPR19F
UlJPUigiQ291bGQgbm90IHBhcnNlIGRhdGUiKTsKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBj
b25zaWRlciB0aGF0IHRoZSBjb29raWUgaXMgc2Vzc2lvbiBvbmx5CisgICAgICAgIG1faXNTZXNz
aW9uID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjpzZXRNYXhBZ2UoY29u
c3QgU3RyaW5nJiBtYXhBZ2UpCit7CisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBIVFRQIENvb2tp
ZSBzcGVjaWZpY2F0aW9uIChSRkM2MjY1LCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2
MjY1KSwKKyAgICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNhbiBiZSBhIERJR0lUIG9yIGEgIi0i
LCBhbmQgdGhlIHJlbWluZGVyCisgICAgLy8gb2YgdGhlIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4g
RElHSVQgY2hhcmFjdGVycy4KKyAgICBpZiAobWF4QWdlLmlzRW1wdHkoKSB8fCAobWF4QWdlWzBd
ICE9ICctJyAmJiAhaXNBU0NJSURpZ2l0KG1heEFnZVswXSkpKSB7CisgICAgICAgIExPR19FUlJP
UigiQ291bGQgbm90IHBhcnNlIE1heC1BZ2UgOiAlcywgZmlyc3QgY2hhcmFjdGVyIGNhbiBvbmx5
IGJlICctJyBvciBhc2NpaSBkaWdpdC4iLCBtYXhBZ2UuYXNjaWkoKS5kYXRhKCkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBvazsKKyAgICBpbnQgdmFsdWUgPSBtYXhBZ2Uu
dG9JbnRTdHJpY3QoJm9rLCAxMCk7CisKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJP
UigiQ291bGQgbm90IHBhcnNlIE1heC1BZ2UgOiAlcyIsIG1heEFnZS5hc2NpaSgpLmRhdGEoKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9leHBpcnkgPSB2YWx1ZTsKKyAgICBtX2lz
TWF4QWdlU2V0ID0gdHJ1ZTsKKyAgICBtX2lzU2Vzc2lvbiA9IGZhbHNlOworCisgICAgLy8gSWYg
bWF4QWdlIHZhbHVlIGlzIG5vdCBwb3NpdGl2ZSwgbGV0IGV4cGlyeS10aW1lIGJlIHRoZSBlYXJs
aWVzdCByZXByZXNlbnRhYmxlIHRpbWUuCisgICAgaWYgKG1fZXhwaXJ5ID4gMCkKKyAgICAgICAg
bV9leHBpcnkgKz0gY3VycmVudFRpbWUoKTsKKyAgICBlbHNlCisgICAgICAgIG1fZXhwaXJ5ID0g
MDsKK30KKwordm9pZCBQYXJzZWRDb29raWU6OnNldERlZmF1bHREb21haW4oY29uc3QgS1VSTCYg
cmVxdWVzdFVSTCkKK3sKKyAgICBzZXREb21haW4ocmVxdWVzdFVSTC5ob3N0KCkpOworICAgIG1f
aGFzRGVmYXVsdERvbWFpbiA9IHRydWU7Cit9CisKK2Jvb2wgUGFyc2VkQ29va2llOjpoYXNFeHBp
cmVkKCkgY29uc3QKK3sKKyAgICAvLyBTZXNzaW9uIGNvb2tpZXMgZG8gbm90IGV4cGlyZXMsIHRo
ZXkgd2lsbCBqdXN0IG5vdCBiZSBzYXZlZCB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgICByZXR1
cm4gIW1faXNTZXNzaW9uICYmIChtX2lzRm9yY2VFeHBpcmVkIHx8IG1fZXhwaXJ5IDwgY3VycmVu
dFRpbWUoKSk7Cit9CisKK2Jvb2wgUGFyc2VkQ29va2llOjppc1VuZGVyU2l6ZUxpbWl0KCkgY29u
c3QKK3sKKyAgICByZXR1cm4gbV92YWx1ZS5sZW5ndGgoKSA8PSBDb29raWVNYW5hZ2VyOjptYXhD
b29raWVMZW5ndGgoKSAmJiBtX25hbWUubGVuZ3RoKCkgPD0gQ29va2llTWFuYWdlcjo6bWF4Q29v
a2llTGVuZ3RoKCk7Cit9CisKK1N0cmluZyBQYXJzZWRDb29raWU6OnRvU3RyaW5nKCkgY29uc3QK
K3sKKyAgICBTdHJpbmcgY29va2llID0gbmFtZSgpOworICAgIGNvb2tpZSArPSAiID0gIjsKKyAg
ICBjb29raWUgKz0gdmFsdWUoKTsKKyAgICBjb29raWUgKz0gIjsgRG9tYWluID0gIjsKKyAgICBj
b29raWUgKz0gZG9tYWluKCk7CisgICAgY29va2llICs9ICI7IFBhdGggPSAiOworICAgIGNvb2tp
ZSArPSBwYXRoKCk7CisgICAgY29va2llICs9ICI7IFByb3RvY29sID0gIjsKKyAgICBjb29raWUg
Kz0gcHJvdG9jb2woKTsKKyAgICByZXR1cm4gY29va2llOworfQorCitTdHJpbmcgUGFyc2VkQ29v
a2llOjp0b05hbWVWYWx1ZVBhaXIoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcg
ZXF1YWwoIj0iKTsKKworICAgIHNpemVfdCBjb29raWVMZW5ndGggPSBtX25hbWUubGVuZ3RoKCkg
KyBtX3ZhbHVlLmxlbmd0aCgpICsgMjsKKyAgICBWZWN0b3I8VUNoYXI+IHJlc3VsdDsKKyAgICBy
ZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShjb29raWVMZW5ndGgpOworICAgIGFwcGVuZChy
ZXN1bHQsIG1fbmFtZSk7CisgICAgYXBwZW5kKHJlc3VsdCwgZXF1YWwpOworICAgIGFwcGVuZChy
ZXN1bHQsIG1fdmFsdWUpOworCisgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQocmVzdWx0KTsKK30K
Kwordm9pZCBQYXJzZWRDb29raWU6OmFwcGVuZFdlYkNvcmVDb29raWUoVmVjdG9yPENvb2tpZT4m
IGNvb2tpZVZlY3RvcikgY29uc3QKK3sKKyAgICBjb29raWVWZWN0b3IuYXBwZW5kKENvb2tpZShT
dHJpbmcobV9uYW1lKSwgU3RyaW5nKG1fdmFsdWUpLCBTdHJpbmcobV9kb21haW4pLAorICAgICAg
ICAgICAgU3RyaW5nKG1fcGF0aCksIG1fZXhwaXJ5LCBtX2lzSHR0cE9ubHksIG1faXNTZWN1cmUs
IG1faXNTZXNzaW9uKSk7Cit9Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4w
M2QzNDMyMGJkMzJjNWE0MDlkYTEwNGM1N2E0NmI5YzU2OWVkNmZkCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuaApAQCAt
MCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hh
ZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGFyc2VkQ29va2llX2gK
KyNkZWZpbmUgUGFyc2VkQ29va2llX2gKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorCituYW1lc3Bh
Y2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
S1VSTDsKKworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29va2llIGludGVybmFsbHkKKy8v
IEl0IGNhbiBlaXRoZXIgYmUgY3JlYXRlZCBieSB0aGUgQ29va2llUGFyc2VyIHdoaWNoIHdpbGwg
dGhlbiBmaWxsIGl0CisvLyBvciBpdCBjYW4gYmUgY3JlYXRlZCBieSB0aGUgYmFja2luZyBzdG9y
ZSBmaWxsaW5nIGl0IGluIHRoZSBjb25zdHJ1Y3Rvci4KK2NsYXNzIFBhcnNlZENvb2tpZSB7Citw
dWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb29raWUgOiBlbXB0eSBkb21haW4sIG5vbiBzZWN1cmUg
YW5kIHNlc3Npb24KKyAgICBQYXJzZWRDb29raWUoZG91YmxlIGN1cnJlbnRUaW1lKTsKKworICAg
IC8vIEZvciBiYWNraW5nIHN0b3JlIGNvb2tpZXMgKHRob3NlIGNvb2tpZXMgYXJlIG5ldmVyIHNl
c3Npb24gY29va2llcykuCisgICAgUGFyc2VkQ29va2llKGNvbnN0IFN0cmluZyYgLypuYW1lKi8s
IGNvbnN0IFN0cmluZyYgLyp2YWx1ZSovLCBjb25zdCBTdHJpbmcmIC8qZG9tYWluKi8sY29uc3Qg
U3RyaW5nJiAvKnByb3RvY29sKi8sIGNvbnN0IFN0cmluZyYgLypwYXRoKi8sIGRvdWJsZSAvKmV4
cGlyeSovLCBkb3VibGUgLypsYXN0QWNjZXNzZWQqLywgZG91YmxlIC8qY3JlYXRpb25UaW1lKi8s
IGJvb2wgLyppc1NlY3VyZSovLCBib29sIC8qaXNIdHRwT25seSovKTsKKworICAgIFBhcnNlZENv
b2tpZShjb25zdCBQYXJzZWRDb29raWUqKTsKKworICAgIH5QYXJzZWRDb29raWUoKTsKKworICAg
IGNvbnN0IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIHZvaWQg
c2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorCisgICAgY29u
c3QgU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2b2lkIHNl
dFZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9CisKKyAgICBj
b25zdCBTdHJpbmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBtX3BhdGg7IH0KKyAgICB2b2lkIHNl
dFBhdGgoY29uc3QgU3RyaW5nJiBwYXRoKSB7IG1fcGF0aCA9IHBhdGg7IH0KKworICAgIGNvbnN0
IFN0cmluZyYgZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbV9kb21haW47IH0KKyAgICB2b2lkIHNl
dERvbWFpbihjb25zdCBTdHJpbmcmIGRvbWFpbikgeyBtX2RvbWFpbiA9IGRvbWFpbi5sb3dlcigp
OyB9CisKKyAgICBjb25zdCBTdHJpbmcmIHByb3RvY29sKCkgY29uc3QgeyByZXR1cm4gbV9wcm90
b2NvbDsgfQorICAgIHZvaWQgc2V0UHJvdG9jb2woY29uc3QgU3RyaW5nJiBwcm90b2NvbCkgeyBt
X3Byb3RvY29sID0gcHJvdG9jb2w7IH0KKworICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhv
ZCB1c2VkIHRvIHNldCB0aGUgZG9tYWluIHRvIHRoZSByZXF1ZXN0J3MgdXJsLgorICAgIHZvaWQg
c2V0RGVmYXVsdERvbWFpbihjb25zdCBLVVJMJik7CisgICAgYm9vbCBoYXNEZWZhdWx0RG9tYWlu
KCkgY29uc3QgeyByZXR1cm4gbV9oYXNEZWZhdWx0RG9tYWluOyB9CisKKyAgICBkb3VibGUgZXhw
aXJ5KCkgY29uc3QgeyByZXR1cm4gbV9leHBpcnk7IH0KKyAgICB2b2lkIHNldEV4cGlyeShjb25z
dCBTdHJpbmcmKTsKKyAgICB2b2lkIGZvcmNlRXhwaXJlKCkgeyBtX2lzRm9yY2VFeHBpcmVkICA9
IHRydWU7IH0KKyAgICB2b2lkIHNldE1heEFnZShjb25zdCBTdHJpbmcmKTsKKworICAgIGRvdWJs
ZSBsYXN0QWNjZXNzZWQoKSBjb25zdCB7IHJldHVybiBtX2xhc3RBY2Nlc3NlZDsgfQorICAgIHZv
aWQgc2V0TGFzdEFjY2Vzc2VkKGRvdWJsZSBsYXN0QWNjZXNzZWQpIHsgbV9sYXN0QWNjZXNzZWQg
PSBsYXN0QWNjZXNzZWQ7fQorCisgICAgZG91YmxlIGNyZWF0aW9uVGltZSgpIGNvbnN0IHsgcmV0
dXJuIG1fY3JlYXRpb25UaW1lOyB9CisgICAgdm9pZCBzZXRDcmVhdGlvblRpbWUoZG91YmxlIGNy
ZWF0aW9uVGltZSkgeyBtX2NyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsgfQorCisgICAgYm9v
bCBpc1NlY3VyZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNTZWN1cmU7IH0KKyAgICB2b2lkIHNldFNl
Y3VyZUZsYWcoYm9vbCBzZWN1cmUpIHsgbV9pc1NlY3VyZSA9IHNlY3VyZTsgfQorCisgICAgYm9v
bCBpc0h0dHBPbmx5KCkgY29uc3QgeyByZXR1cm4gbV9pc0h0dHBPbmx5OyB9CisgICAgdm9pZCBz
ZXRJc0h0dHBPbmx5KGJvb2wgaXNIdHRwT25seSkgeyBtX2lzSHR0cE9ubHkgPSBpc0h0dHBPbmx5
OyB9CisKKyAgICBib29sIGlzU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1faXNTZXNzaW9uOyB9
CisKKyAgICBib29sIGhhc0V4cGlyZWQoKSBjb25zdDsKKyAgICBib29sIGlzRm9yY2VFeHBpcmVk
KCkgY29uc3QgeyByZXR1cm4gbV9pc0ZvcmNlRXhwaXJlZDsgfQorICAgIGJvb2wgaXNVbmRlclNp
emVMaW1pdCgpIGNvbnN0OworCisgICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgU3Ry
aW5nIHRvTmFtZVZhbHVlUGFpcigpIGNvbnN0OworICAgIHZvaWQgYXBwZW5kV2ViQ29yZUNvb2tp
ZShWZWN0b3I8Q29va2llPiYgY29va2llVmVjdG9yKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBT
dHJpbmcgbV9uYW1lOworICAgIFN0cmluZyBtX3ZhbHVlOworICAgIFN0cmluZyBtX2RvbWFpbjsK
KyAgICBTdHJpbmcgbV9wcm90b2NvbDsKKyAgICBTdHJpbmcgbV9wYXRoOworICAgIGRvdWJsZSBt
X2V4cGlyeTsKKyAgICBib29sIG1faXNNYXhBZ2VTZXQ7CisKKyAgICBkb3VibGUgbV9jcmVhdGlv
blRpbWU7CisgICAgLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgTFJVIHJlcGxhY2VtZW50IHBvbGlj
eS4KKyAgICBkb3VibGUgbV9sYXN0QWNjZXNzZWQ7CisKKyAgICBib29sIG1faGFzRGVmYXVsdERv
bWFpbjsKKyAgICBib29sIG1faXNTZWN1cmU7CisgICAgYm9vbCBtX2lzSHR0cE9ubHk7CisgICAg
Ym9vbCBtX2lzU2Vzc2lvbjsKKyAgICBib29sIG1faXNGb3JjZUV4cGlyZWQ7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBQYXJzZWRDb29raWVfaAo=
</data>
<flag name="review"
          id="119760"
          type_id="1"
          status="-"
          setter="dbates"
    />
    <flag name="commit-queue"
          id="119761"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128254</attachid>
            <date>2012-02-22 11:33:27 -0800</date>
            <delta_ts>2012-02-22 15:31:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73654-20120222143402.patch</filename>
            <type>text/plain</type>
            <size>106400</size>
            <attacher name="Konrad Piascik">kpiascik</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTkwNGZmYTlmZThhMjRm
Y2Y4NDg2MmJjYmZjYmY0YTAwNWFiODE1OS4uMTE2ZGE1NWQwZThiMjUyNTcxOGQwOTkyMjgyYTYy
OTU5NDMwNTdjMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI2IEBACisyMDEyLTAyLTIyICBLb25y
YWQgUGlhc2NpayAgPGtwaWFzY2lrQHJpbS5jb20+CisKKyAgICAgICAgVXBzdHJlYW0gQmxhY2tC
ZXJyeSBDb29raWUgTWFuYWdlbWVudCBDbGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3RlZCBmdW5jdGlvbmFsaXR5IG9uIHRoZSBCbGFja0Jl
cnJ5IHBvcnQgd2l0aCBodHRwOi8vdGVzdHN1aXRlcy5vcGVyYS5jb20vY29va2llcy8KKyAgICAg
ICAgUGFzc2VzIGFsbCBub24gQ29va2llIDIgdGVzdHMgc2luY2UgQ29va2llIDIgaXMgbm90IGlt
cGxlbWVudGVkIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuCisgICAgICAgIEVycm9yIGhhbmRsaW5n
IGFuZCBleHRlbmRlZCB0ZXN0cyBkbyBub3QgYWxsIHBhc3MgYW5kIHdpbGwgYmUgdXBkYXRlZCB3
aXRoIGZ1dHVyZSBidWdzL3BhdGNoZXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5
L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZUphckJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaDogQWRkZWQuCisgICAg
ICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYXAuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L2JsYWNrYmVycnkvUGFyc2VkQ29va2llLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0v
YmxhY2tiZXJyeS9QYXJzZWRDb29raWUuaDogQWRkZWQuCisKIDIwMTItMDItMjIgIEFuZHJleSBL
b3N5YWtvdiAgPGNhc2VxQGNocm9taXVtLm9yZz4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBb
ZXhwZXJpbWVudGFsXSBhZGQgYSBtb2RlIHRvIGRpc3BsYXkgdGltZWxpbmUgZXZlbnRzIGFsaWdu
ZWQgYnkgdGhlIHN0YXJ0IHRpbWUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVE
YXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uNzMxOWNiMDQ1ZTg1MDJjZmQ5ZWRmYjI1MWU4ZTJlMDdiNmEwZWQwYwotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llRGF0YWJh
c2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEs
NTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFm
ZnJhaXhAcGxleW8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2Vh
cmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworI2RlZmluZSBFTkFCTEVfQ09P
S0lFX0RFQlVHIDAKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlLmgiCisKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVk
ZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorI2luY2x1ZGUgIlNRTGl0
ZVN0YXRlbWVudC5oIgorI2luY2x1ZGUgIlNRTGl0ZVRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSA8
d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5o
PgorCisjaWYgRU5BQkxFX0NPT0tJRV9ERUJVRworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9y
bUxvZy5oPgorI2RlZmluZSBDb29raWVMb2coZm9ybWF0LCAuLi4pIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpsb2dBbHdheXMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgZm9ybWF0
LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikK
KyNlbmRpZgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2Uu
aD4KKwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok1lc3NhZ2VDbGllbnQ7Cit1c2luZyBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6VHlwZWRSZXBseUJ1ZmZlcjsKK3VzaW5nIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTsKKworc3RhdGljIGNvbnN0IGRvdWJs
ZSBzX2RhdGFiYXNlVGltZXJJbnRlcnZhbCA9IDI7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlKCkK
KyAgICA6IE1lc3NhZ2VDbGllbnQoTWVzc2FnZUNsaWVudDo6UmVwbHlGZWF0dXJlIHwgTWVzc2Fn
ZUNsaWVudDo6U3luY0ZlYXR1cmUpCisgICAgLCBtX3RhYmxlTmFtZSgiY29va2llcyIpIC8vIFRo
aXMgaXMgY2hvc2VuIHRvIG1hdGNoIE1vemlsbGEncyB0YWJsZSBuYW1lLgorICAgICwgbV9kYlRp
bWVyKHRoaXMsICZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6c2VuZENoYW5nZXNUb0RhdGFi
YXNlVGltZXJGaXJlZCkKKyAgICAsIG1faW5zZXJ0U3RhdGVtZW50KDApCisgICAgLCBtX3VwZGF0
ZVN0YXRlbWVudCgwKQorICAgICwgbV9kZWxldGVTdGF0ZW1lbnQoMCkKK3sKKyAgICBtX2RiVGlt
ZXJDbGllbnQgPSBuZXcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdlbmVyaWNUaW1lckNsaWVudCh0
aGlzKTsKKyAgICBtX2RiVGltZXIuc2V0Q2xpZW50KG1fZGJUaW1lckNsaWVudCk7CisKKyAgICBw
dGhyZWFkX2F0dHJfdCB0aHJlYWRBdHRyczsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFk
QXR0cnMpOworICAgIGNyZWF0ZVRocmVhZCgiY29va2llX2RhdGFiYXNlIiwgdGhyZWFkQXR0cnMp
OworfQorCitDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6fkNvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlKCkKK3sKKyAgICBkZWxldGUgbV9kYlRpbWVyQ2xpZW50OworICAgIG1fZGJUaW1lckNs
aWVudCA9IDA7CisgICAgLy8gRklYTUU6IFRoaXMgb2JqZWN0IHdpbGwgbmV2ZXIgYmUgZGVsZXRl
ZCBkdWUgdG8gdGhlIHNldCB1cCBvZiBDb29raWVNYW5hZ2VyIChpdCdzIGEgc2luZ2xldG9uKQor
ICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gRGVzdHJ1Y3RpbmciKTsKKyNpZm5k
ZWYgTkRFQlVHCisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrKG1fbXV0ZXgpOworICAg
ICAgICBBU1NFUlQobV9jaGFuZ2VkQ29va2llcy5pc0VtcHR5KCkpOworICAgIH0KKyNlbmRpZgor
fQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp1cGdyYWRlVGFibGVJZk5lZWRl
ZChjb25zdCBTdHJpbmcmIGRhdGFiYXNlRmllbGRzLCBjb25zdCBTdHJpbmcmIHByaW1hcnlLZXlG
aWVsZHMpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKworICAgIGJvb2wgY3Jl
YXRpb25UaW1lRXhpc3RzID0gZmFsc2U7CisgICAgYm9vbCBwcm90b2NvbEV4aXN0cyA9IGZhbHNl
OworCisgICAgaWYgKCFtX2RiLnRhYmxlRXhpc3RzKG1fdGFibGVOYW1lKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGV4aXN0aW5nIHRhYmxlIGhhcyB0aGUgcmVxdWly
ZWQgZGF0YWJhc2UgZmllbGRzCisgICAgeworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiUFJBR01B
IHRhYmxlX2luZm8oIiArIG1fdGFibGVOYW1lICsgIik7IjsKKworICAgICAgICBTUUxpdGVTdGF0
ZW1lbnQgc3RhdGVtZW50KG1fZGIsIHF1ZXJ5KTsKKyAgICAgICAgaWYgKHN0YXRlbWVudC5wcmVw
YXJlKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiQ2Fubm90IHByZXBhcmUgc3RhdGVtZW50
IHRvIHF1ZXJ5IGNvb2tpZSB0YWJsZSBpbmZvLiBzcWw6JXMiLCBxdWVyeS51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9k
Yi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAg
ICAgICB3aGlsZSAoc3RhdGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAg
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoU3RyaW5nLCBjcmVhdGlvblRpbWUsICgiY3JlYXRpb25U
aW1lIikpOworICAgICAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIHByb3RvY29s
LCAoInByb3RvY29sIikpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzdGF0ZW1lbnQuZ2V0
Q29sdW1uVGV4dCgxKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IGNyZWF0aW9uVGltZSkKKyAg
ICAgICAgICAgICAgICBjcmVhdGlvblRpbWVFeGlzdHMgPSB0cnVlOworICAgICAgICAgICAgaWYg
KG5hbWUgPT0gcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgcHJvdG9jb2xFeGlzdHMgPSB0cnVl
OworICAgICAgICAgICAgaWYgKGNyZWF0aW9uVGltZUV4aXN0cyAmJiBwcm90b2NvbEV4aXN0cykK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTE9HKE5ldHdvcmss
ICJOZWVkIHRvIHVwZGF0ZSBjb29raWUgdGFibGUgc2NoZW1hLiIpOworICAgIH0KKworICAgIC8v
IERyb3AgYW5kIHJlY3JlYXRlIHRoZSBjb29raWUgdGFibGUgdG8gdXBkYXRlIHRvIHRoZSBsYXRl
c3QgZGF0YWJhc2UgZmllbGRzLgorICAgIC8vIFdlIGRvIG5vdCB1c2UgYWx0ZXIgdGFibGUgLSBh
ZGQgY29sdW1uIGJlY2F1c2UgdGhhdCBtZXRob2QgY2Fubm90IGFkZCBwcmltYXJ5IGtleXMuCisg
ICAgVmVjdG9yPFN0cmluZz4gY29tbWFuZHM7CisKKyAgICAvLyBCYWNrdXAgZXhpc3RpbmcgdGFi
bGUKKyAgICBTdHJpbmcgcmVuYW1lUXVlcnkgPSAiQUxURVIgVEFCTEUgIiArIG1fdGFibGVOYW1l
ICsgIiBSRU5BTUUgVE8gQmFja3VwXyIgKyBtX3RhYmxlTmFtZSArICI7IjsKKyAgICBjb21tYW5k
cy5hcHBlbmQocmVuYW1lUXVlcnkpOworCisgICAgLy8gUmVjcmVhdGUgdGhlIGNvb2tpZSB0YWJs
ZSB1c2luZyB0aGUgbmV3IGRhdGFiYXNlIGFuZCBwcmltYXJ5IGtleSBmaWVsZHMKKyAgICBTdHJp
bmcgY3JlYXRlVGFibGVRdWVyeSgiQ1JFQVRFIFRBQkxFICIpOworICAgIGNyZWF0ZVRhYmxlUXVl
cnkgKz0gbV90YWJsZU5hbWU7CisgICAgY3JlYXRlVGFibGVRdWVyeSArPSAiICgiICsgZGF0YWJh
c2VGaWVsZHMgKyAiLCAiICsgcHJpbWFyeUtleUZpZWxkcyArICIpOyI7CisgICAgY29tbWFuZHMu
YXBwZW5kKGNyZWF0ZVRhYmxlUXVlcnkpOworCisgICAgLy8gQ29weSB0aGUgb2xkIGRhdGEgaW50
byB0aGUgbmV3IHRhYmxlLiBJZiBhIGNvbHVtbiBkb2VzIG5vdCBleGlzdHMsCisgICAgLy8gd2Ug
aGF2ZSB0byBwdXQgYSAnJyBpbiB0aGUgc2VsZWN0IHN0YXRlbWVudCB0byBtYWtlIHRoZSBudW1i
ZXIgb2YgY29sdW1ucworICAgIC8vIGVxdWFsIGluIHRoZSBpbnNlcnQgc3RhdGVtZW50LgorICAg
IFN0cmluZyBtaWdyYXRpb25RdWVyeSgiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyAiKTsKKyAgICBt
aWdyYXRpb25RdWVyeSArPSBtX3RhYmxlTmFtZTsKKyAgICBtaWdyYXRpb25RdWVyeSArPSAiIFNF
TEVDVCAqIjsKKyAgICBpZiAoIWNyZWF0aW9uVGltZUV4aXN0cykKKyAgICAgICAgbWlncmF0aW9u
UXVlcnkgKz0gIiwnJyI7CisgICAgaWYgKCFwcm90b2NvbEV4aXN0cykKKyAgICAgICAgbWlncmF0
aW9uUXVlcnkgKz0gIiwnJyI7CisgICAgbWlncmF0aW9uUXVlcnkgKz0gIiBGUk9NIEJhY2t1cF8i
ICsgbV90YWJsZU5hbWU7CisgICAgY29tbWFuZHMuYXBwZW5kKG1pZ3JhdGlvblF1ZXJ5KTsKKwor
ICAgIC8vIFRoZSBuZXcgY29sdW1ucyB3aWxsIGJlIGJsYW5rLCBzZXQgdGhlIG5ldyB2YWx1ZXMu
CisgICAgaWYgKCFjcmVhdGlvblRpbWVFeGlzdHMpIHsKKyAgICAgICAgU3RyaW5nIHNldENyZWF0
aW9uVGltZVF1ZXJ5ID0gIlVQREFURSAiICsgbV90YWJsZU5hbWUgKyAiIFNFVCBjcmVhdGlvblRp
bWUgPSBsYXN0QWNjZXNzZWQ7IjsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5kKHNldENyZWF0aW9u
VGltZVF1ZXJ5KTsKKyAgICB9CisKKyAgICBpZiAoIXByb3RvY29sRXhpc3RzKSB7CisgICAgICAg
IFN0cmluZyBzZXRQcm90b2NvbFF1ZXJ5ID0gIlVQREFURSAiICsgbV90YWJsZU5hbWUgKyAiIFNF
VCBwcm90b2NvbCA9ICdodHRwJyBXSEVSRSBpc1NlY3VyZSA9ICcwJzsiOworICAgICAgICBTdHJp
bmcgc2V0UHJvdG9jb2xRdWVyeTIgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIHBy
b3RvY29sID0gJ2h0dHBzJyBXSEVSRSBpc1NlY3VyZSA9ICcxJzsiOworICAgICAgICBjb21tYW5k
cy5hcHBlbmQoc2V0UHJvdG9jb2xRdWVyeSk7CisgICAgICAgIGNvbW1hbmRzLmFwcGVuZChzZXRQ
cm90b2NvbFF1ZXJ5Mik7CisgICAgfQorCisgICAgLy8gRHJvcCB0aGUgYmFja3VwIHRhYmxlCisg
ICAgU3RyaW5nIGRyb3BCYWNrdXBRdWVyeSA9ICJEUk9QIFRBQkxFIElGIEVYSVNUUyBCYWNrdXBf
IiArIG1fdGFibGVOYW1lICsgIjsiOworICAgIGNvbW1hbmRzLmFwcGVuZChkcm9wQmFja3VwUXVl
cnkpOworCisgICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYiwgZmFsc2UpOwor
ICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7CisgICAgc2l6ZV90IGNvbW1hbmRTaXplID0gY29tbWFu
ZHMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tbWFuZFNpemU7ICsraSkg
eworICAgICAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZHNbaV0pKSB7CisgICAg
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBhbHRlciBjb29raWUgdGFibGUgd2hlbiBleGVj
dXRpbmcgc3FsOiVzIiwgY29tbWFuZHNbaV0udXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICBM
T0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkp
OworICAgICAgICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soKTsKKworICAgICAgICAgICAgLy8g
V2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQgaWYgd2UgZG8sIHJlbmFtZSB0aGUgY3VycmVu
dCBjb29raWUgdGFibGUgZm9yIGZ1dHVyZSByZXN0b3JhdGlvbi4gVGhpcyBoYXMgdGhlIHNpZGUg
ZWZmZWN0IG9mCisgICAgICAgICAgICAvLyBjbGVhcmluZyB0aGUgY3VycmVudCBjb29raWUgdGFi
bGUsIGJ1dCB0aGF0J3MgYmV0dGVyIHRoYW4gY29udGludWFsbHkgaGl0dGluZyB0aGlzIGNhc2Ug
YW5kIGhlbmNlIG5ldmVyIGJlaW5nIGFibGUgdG8gdXNlIHRoZQorICAgICAgICAgICAgLy8gY29v
a2llIHRhYmxlLgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAg
ICBTdHJpbmcgcmVuYW1lUXVlcnkgPSAiQUxURVIgVEFCTEUgIiArIG1fdGFibGVOYW1lICsgIiBS
RU5BTUUgVE8gQmFja3VwMl8iICsgbV90YWJsZU5hbWUgKyAiOyI7CisgICAgICAgICAgICBpZiAo
IW1fZGIuZXhlY3V0ZUNvbW1hbmQocmVuYW1lUXVlcnkpKSB7CisgICAgICAgICAgICAgICAgTE9H
X0VSUk9SKCJGYWlsZWQgdG8gYmFja3VwIGV4aXN0aW5nIGNvb2tpZSB0YWJsZS4iKTsKKyAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFz
dEVycm9yTXNnKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgIExPRyhOZXR3b3JrLCAi
U3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgY29va2llIHRhYmxlIHNjaGVtYS4iKTsKK30KKwordm9pZCBD
b29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6b3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUphcikK
K3sKKyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJkNvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuLCB0aGlzLCBjb29raWVKYXIpKTsKK30KKwor
dm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlT3Blbihjb25zdCBTdHJpbmcm
IGNvb2tpZUphcikKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICht
X2RiLmlzT3BlbigpKQorICAgICAgICBjbG9zZSgpOworCisgICAgaWYgKCFtX2RiLm9wZW4oY29v
a2llSmFyKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBvcGVuIHRoZSBjb29raWUg
ZGF0YWJhc2UuIE5vIGNvb2tpZSB3aWxsIGJlIHN0b3JlZCEiKTsKKyAgICAgICAgTE9HX0VSUk9S
KCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZGIuZXhlY3V0ZUNvbW1hbmQoIlBSQUdNQSBsb2Nr
aW5nX21vZGU9RVhDTFVTSVZFOyIpOworICAgIG1fZGIuZXhlY3V0ZUNvbW1hbmQoIlBSQUdNQSBq
b3VybmFsX21vZGU9VFJVTkNBVEU7Iik7CisKKyAgICBjb25zdCBTdHJpbmcgcHJpbWFyeUtleUZp
ZWxkcygiUFJJTUFSWSBLRVkgKHByb3RvY29sLCBob3N0LCBwYXRoLCBuYW1lKSIpOworICAgIGNv
bnN0IFN0cmluZyBkYXRhYmFzZUZpZWxkcygibmFtZSBURVhULCB2YWx1ZSBURVhULCBob3N0IFRF
WFQsIHBhdGggVEVYVCwgZXhwaXJ5IERPVUJMRSwgbGFzdEFjY2Vzc2VkIERPVUJMRSwgaXNTZWN1
cmUgSU5URUdFUiwgaXNIdHRwT25seSBJTlRFR0VSLCBjcmVhdGlvblRpbWUgRE9VQkxFLCBwcm90
b2NvbCBURVhUIik7CisgICAgLy8gVXBkYXRlIHRhYmxlIHRvIGFkZCB0aGUgbmV3IGNvbHVtbiBj
cmVhdGlvblRpbWUgYW5kIHByb3RvY29sIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KKyAg
ICB1cGdyYWRlVGFibGVJZk5lZWRlZChkYXRhYmFzZUZpZWxkcywgcHJpbWFyeUtleUZpZWxkcyk7
CisKKyAgICAvLyBDcmVhdGUgdGFibGUgaWYgbm90IGV4c2lzdCBpbiBjYXNlIHRoYXQgdGhlIHVw
Z3JhZGVUYWJsZUlmTmVlZGVkKCkgZmFpbGVkIGFjY2lkZW50YWxseS4KKyAgICBTdHJpbmcgY3Jl
YXRlVGFibGVRdWVyeSgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgIik7CisgICAgY3JlYXRl
VGFibGVRdWVyeSArPSBtX3RhYmxlTmFtZTsKKyAgICAvLyBUaGlzIHRhYmxlIHNjaGVtYSBpcyBj
b21wbGlhbnQgd2l0aCBNb3ppbGxhJ3MuCisgICAgY3JlYXRlVGFibGVRdWVyeSArPSAiICgiICsg
ZGF0YWJhc2VGaWVsZHMgKyAiLCAiICsgcHJpbWFyeUtleUZpZWxkcysiKTsiOworCisgICAgaWYg
KCFtX2RiLmV4ZWN1dGVDb21tYW5kKGNyZWF0ZVRhYmxlUXVlcnkpKSB7CisgICAgICAgIExPR19F
UlJPUigiQ291bGQgbm90IGNyZWF0ZSB0aGUgdGFibGUgdG8gc3RvcmUgdGhlIGNvb2tpZXMgaW50
by4gTm8gY29va2llIHdpbGwgYmUgc3RvcmVkISIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0
ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBjbG9z
ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIGluc2VydFF1ZXJ5KCJJ
TlNFUlQgT1IgUkVQTEFDRSBJTlRPICIpOworICAgIGluc2VydFF1ZXJ5ICs9IG1fdGFibGVOYW1l
OworICAgIGluc2VydFF1ZXJ5ICs9ICIgKG5hbWUsIHZhbHVlLCBob3N0LCBwYXRoLCBleHBpcnks
IGxhc3RBY2Nlc3NlZCwgaXNTZWN1cmUsIGlzSHR0cE9ubHksIGNyZWF0aW9uVGltZSwgcHJvdG9j
b2wpIFZBTFVFUyAoPzEsID8yLCA/MywgPzQsID81LCA/NiwgPzcsID84LCA/OSwgPzEwKTsiOwor
CisgICAgbV9pbnNlcnRTdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KG1fZGIsIGluc2Vy
dFF1ZXJ5KTsKKyAgICBpZiAobV9pbnNlcnRTdGF0ZW1lbnQtPnByZXBhcmUoKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkNhbm5vdCBzYXZlIGNvb2tpZXMiKTsKKyAgICAgICAgTE9HX0VSUk9SKCJT
UUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICB9CisK
KyAgICBTdHJpbmcgdXBkYXRlUXVlcnkoIlVQREFURSAiKTsKKyAgICB1cGRhdGVRdWVyeSArPSBt
X3RhYmxlTmFtZTsKKyAgICAvLyBUaGUgd2hlcmUgc3RhdGVtZW50IGlzIGNob3NlbiB0byBtYXRj
aCBDb29raWVNYXAga2V5LgorICAgIHVwZGF0ZVF1ZXJ5ICs9ICIgU0VUIG5hbWUgPSA/MSwgdmFs
dWUgPSA/MiwgaG9zdCA9ID8zLCBwYXRoID0gPzQsIGV4cGlyeSA9ID81LCBsYXN0QWNjZXNzZWQg
PSA/NiwgaXNTZWN1cmUgPSA/NywgaXNIdHRwT25seSA9ID84LCBjcmVhdGlvblRpbWUgPSA/OSwg
cHJvdG9jb2wgPSA/MTAgd2hlcmUgcHJvdG9jb2wgPSA/MTAgYW5kIG5hbWUgPSA/MSBhbmQgaG9z
dCA9ID8zIGFuZCBwYXRoID0gPzQ7IjsKKyAgICBtX3VwZGF0ZVN0YXRlbWVudCA9IG5ldyBTUUxp
dGVTdGF0ZW1lbnQobV9kYiwgdXBkYXRlUXVlcnkpOworCisgICAgaWYgKG1fdXBkYXRlU3RhdGVt
ZW50LT5wcmVwYXJlKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgdXBkYXRlIGNvb2tp
ZXMiKTsKKyAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2Ri
Lmxhc3RFcnJvck1zZygpKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZGVsZXRlUXVlcnkoIkRFTEVU
RSBGUk9NICIpOworICAgIGRlbGV0ZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIC8vIFRoZSB3
aGVyZSBzdGF0ZW1lbnQgaXMgY2hvc2VuIHRvIG1hdGNoIENvb2tpZU1hcCBrZXkuCisgICAgZGVs
ZXRlUXVlcnkgKz0gIiBXSEVSRSBuYW1lPT8xIGFuZCBob3N0PT8yIGFuZCBwYXRoPT8zIGFuZCBw
cm90b2NvbD0/NDsiOworICAgIG1fZGVsZXRlU3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVu
dChtX2RiLCBkZWxldGVRdWVyeSk7CisKKyAgICBpZiAobV9kZWxldGVTdGF0ZW1lbnQtPnByZXBh
cmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBkZWxldGUgY29va2llcyIpOworICAg
ICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9y
TXNnKCkpOworICAgIH0KKworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpj
bG9zZSgpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBDb29raWVMb2co
IkNvb2tpZUJhY2tpbmdTdG9yZSAtIENsb3NpbmciKTsKKworICAgIHNpemVfdCBjaGFuZ2VkQ29v
a2llc1NpemU7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrKG1fbXV0ZXgpOworICAg
ICAgICBpZiAobV9kYlRpbWVyLnN0YXJ0ZWQoKSkKKyAgICAgICAgICAgIG1fZGJUaW1lci5zdG9w
KCk7CisgICAgICAgIGNoYW5nZWRDb29raWVzU2l6ZSA9IG1fY2hhbmdlZENvb2tpZXMuc2l6ZSgp
OworICAgIH0KKworICAgIGlmIChjaGFuZ2VkQ29va2llc1NpemUgPiAwKQorICAgICAgICBpbnZv
a2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UoKTsKKworICAgIGRlbGV0ZSBtX2luc2VydFN0YXRlbWVu
dDsKKyAgICBtX2luc2VydFN0YXRlbWVudCA9IDA7CisgICAgZGVsZXRlIG1fdXBkYXRlU3RhdGVt
ZW50OworICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gMDsKKyAgICBkZWxldGUgbV9kZWxldGVTdGF0
ZW1lbnQ7CisgICAgbV9kZWxldGVTdGF0ZW1lbnQgPSAwOworCisgICAgaWYgKG1fZGIuaXNPcGVu
KCkpCisgICAgICAgIG1fZGIuY2xvc2UoKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tp
bmdTdG9yZTo6aW5zZXJ0KGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llKQoreworICAgIENvb2tp
ZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gYWRkaW5nIGluc2VydGluZyBjb29raWUgJXMgdG8g
cXVldWUuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFkZFRvQ2hh
bmdlUXVldWUoY29va2llLCBJbnNlcnQpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjp1cGRhdGUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29va2ll
TG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgdXBkYXRpbmcgY29va2llICVzIHRvIHF1
ZXVlLiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBhZGRUb0NoYW5n
ZVF1ZXVlKGNvb2tpZSwgVXBkYXRlKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZTo6cmVtb3ZlKGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llKQoreworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gYWRkaW5nIGRlbGV0aW5nIGNvb2tpZSAlcyB0byBxdWV1
ZS4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgYWRkVG9DaGFuZ2VR
dWV1ZShjb29raWUsIERlbGV0ZSk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmU6OnJlbW92ZUFsbCgpCit7CisgICAgZGlzcGF0Y2hNZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxN
ZXNzYWdlKCZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3ZlQWxsLCB0aGlz
KSk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZVJlbW92ZUFs
bCgpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpZiAoIW1fZGIuaXNP
cGVuKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0
b3JlIC0gcmVtb3ZlIEFsbCBjb29raWVzIGZyb20gYmFja2luZ3N0b3JlIik7CisKKyAgICB7Cisg
ICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIG1fY2hhbmdlZENvb2tp
ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZGVsZXRlUXVlcnkoIkRFTEVURSBGUk9N
ICIpOworICAgIGRlbGV0ZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIGRlbGV0ZVF1ZXJ5ICs9
ICI7IjsKKworICAgIFNRTGl0ZVN0YXRlbWVudCBkZWxldGVTdGF0ZW1lbnQobV9kYiwgZGVsZXRl
UXVlcnkpOworICAgIGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpKSB7CisgICAgICAgIExP
R19FUlJPUigiQ291bGQgbm90IHByZXBhcmUgREVMRVRFICogc3RhdGVtZW50Iik7CisgICAgICAg
IExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5l
eGVjdXRlQ29tbWFuZCgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29r
aWUgZnJvbSBkYXRhYmFzZSIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNz
YWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICByZXR1cm47CisgICAgfQor
fQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpnZXRDb29raWVzRnJvbURhdGFi
YXNlKFZlY3RvcjxQYXJzZWRDb29raWUqPiYgc3RhY2tPZkNvb2tpZXMsIHVuc2lnbmVkIGludCBs
aW1pdCkKK3sKKyAgICAvLyBJdCBpcyBub3QgYSBodWdlIHBlcmZvcm1hbmNlIGhpdCB0byB3YWl0
IG9uIHRoZSByZXBseSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBvbmx5IGRvbmUgb25jZSBkdXJpbmcg
c2V0dXAgYW5kIHdoZW4gdHVybmluZyBvZmYgcHJpdmF0ZSBtb2RlLgorICAgIFR5cGVkUmVwbHlC
dWZmZXI8IFZlY3RvcjxQYXJzZWRDb29raWUqPiogPiByZXBseUJ1ZmZlcigwKTsKKyAgICBkaXNw
YXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2VXaXRoUmV0dXJuKCZDb29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlR2V0Q29va2llc1dpdGhMaW1pdCwgJnJlcGx5QnVmZmVy
LCB0aGlzLCBsaW1pdCkpOworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiogY29va2llcyA9IHJl
cGx5QnVmZmVyLnBvaW50ZXIoKTsKKyAgICBzdGFja09mQ29va2llcy5zd2FwKCpjb29raWVzKTsK
KyAgICBkZWxldGUgY29va2llczsKK30KKworVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBDb29raWVE
YXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlR2V0Q29va2llc1dpdGhMaW1pdCh1bnNpZ25lZCBp
bnQgbGltaXQpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKworICAgIC8vIENo
ZWNrIHRoYXQgdGhlIHRhYmxlIGV4aXN0cyB0byBhdm9pZCBkb2luZyBhbiB1bm5lY2Vzc2FyeSBy
ZXF1ZXN0LgorICAgIGlmICghbV9kYi5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBTdHJpbmdCdWlsZGVyIHNlbGVjdFF1ZXJ5OworICAgIHNlbGVjdFF1ZXJ5LmFwcGVuZCgiU0VM
RUNUIG5hbWUsIHZhbHVlLCBob3N0LCBwYXRoLCBleHBpcnksIGxhc3RBY2Nlc3NlZCwgaXNTZWN1
cmUsIGlzSHR0cE9ubHksIGNyZWF0aW9uVGltZSwgcHJvdG9jb2wgRlJPTSAiKTsKKyAgICBzZWxl
Y3RRdWVyeS5hcHBlbmQobV90YWJsZU5hbWUpOworICAgIGlmIChsaW1pdCA+IDApIHsKKyAgICAg
ICAgc2VsZWN0UXVlcnkuYXBwZW5kKCIgT1JERVIgQlkgbGFzdEFjY2Vzc2VkIEFTQyIpOworICAg
ICAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIiBMSU1JVCAiICsgU3RyaW5nOjpudW1iZXIobGltaXQp
KTsKKyAgICB9CisgICAgc2VsZWN0UXVlcnkuYXBwZW5kKCI7Iik7CisKKyAgICBDb29raWVMb2co
IkNvb2tpZUJhY2tpbmdTdG9yZSAtIGludm9rZUdldEFsbENvb2tpZXMgd2l0aCBzZWxlY3QgcXVl
cnkgJXMiLCBzZWxlY3RRdWVyeS50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgU1FM
aXRlU3RhdGVtZW50IHNlbGVjdFN0YXRlbWVudChtX2RiLCBzZWxlY3RRdWVyeS50b1N0cmluZygp
KTsKKworICAgIGlmIChzZWxlY3RTdGF0ZW1lbnQucHJlcGFyZSgpKSB7CisgICAgICAgIExPR19F
UlJPUigiQ2Fubm90IHJldHJpZXZlZCBjb29raWVzIGZyb20gdGhlIGRhdGFiYXNlIik7CisgICAg
ICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JN
c2coKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFZlY3RvcjxQYXJzZWRDb29r
aWUqPiogY29va2llcyA9IG5ldyBWZWN0b3I8UGFyc2VkQ29va2llKj47CisgICAgd2hpbGUgKHNl
bGVjdFN0YXRlbWVudC5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7CisgICAgICAgIC8vIFRoZXJl
IGlzIGEgcm93IHRvIGZldGNoCisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzZWxlY3RTdGF0ZW1l
bnQuZ2V0Q29sdW1uVGV4dCgwKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gc2VsZWN0U3RhdGVt
ZW50LmdldENvbHVtblRleHQoMSk7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBzZWxlY3RTdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgyKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBzZWxlY3RTdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgzKTsKKyAgICAgICAgZG91YmxlIGV4cGlyeSA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoNCk7CisgICAgICAgIGRvdWJsZSBsYXN0QWNjZXNzZWQg
PSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uRG91YmxlKDUpOworICAgICAgICBib29sIGlzU2Vj
dXJlID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkludCg2KTsKKyAgICAgICAgYm9vbCBpc0h0
dHBPbmx5ID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkludCg3KTsKKyAgICAgICAgZG91Ymxl
IGNyZWF0aW9uVGltZSA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoOCk7CisgICAg
ICAgIFN0cmluZyBwcm90b2NvbCA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDkpOwor
CisgICAgICAgIGNvb2tpZXMtPmFwcGVuZChuZXcgUGFyc2VkQ29va2llKG5hbWUsIHZhbHVlLCBk
b21haW4sIHByb3RvY29sLCBwYXRoLCBleHBpcnksIGxhc3RBY2Nlc3NlZCwgY3JlYXRpb25UaW1l
LCBpc1NlY3VyZSwgaXNIdHRwT25seSkpOworICAgIH0KKworICAgIHJldHVybiBjb29raWVzOwor
fQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJh
c2VTeW5jaHJvbm91c2x5KCkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAt
IHNlbmRpbmcgdG8gZGF0YWJhc2UgaW1tZWRpYXRlbHkiKTsKKyAgICB7CisgICAgICAgIE11dGV4
TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgICAgIGlmIChtX2RiVGltZXIuc3RhcnRlZCgpKQor
ICAgICAgICAgICAgbV9kYlRpbWVyLnN0b3AoKTsKKyAgICB9CisgICAgZGlzcGF0Y2hTeW5jTWVz
c2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6
Omludm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSwgdGhpcykpOworfQorCit2b2lkIENvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2UoaW50IG5leHRJbnRlcnZh
bCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrKG1fbXV0ZXgpOworICAgIGlmICghbV9kYlRpbWVy
LnN0YXJ0ZWQoKSkgeworICAgICAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIFN0
YXJ0aW5nIG9uZSBzaG90IHNlbmQgdG8gZGF0YWJhc2UiKTsKKyAgICAgICAgbV9kYlRpbWVyLnN0
YXJ0KG5leHRJbnRlcnZhbCk7CisgICAgfSBlbHNlIHsKKyNpZiAhTkRFQlVHCisgICAgICAgIENv
b2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gVGltZXIgYWxyZWFkeSBydW5uaW5nLCBza2lw
cGluZyB0aGlzIHJlcXVlc3QiKTsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBDb29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZTo6c2VuZENoYW5nZXNUb0RhdGFiYXNlVGltZXJGaXJlZCgpCit7Cisg
ICAgZGlzcGF0Y2hNZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZTo6aW52b2tlU2VuZENoYW5nZXNUb0RhdGFiYXNlLCB0aGlzKSk7Cit9CisK
K3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZVNlbmRDaGFuZ2VzVG9EYXRh
YmFzZSgpCit7CisgICAgQVNTRVJUKGlzQ3VycmVudFRocmVhZCgpKTsKKworICAgIGlmICghbV9k
Yi5pc09wZW4oKSkgeworICAgICAgICBMT0dfRVJST1IoIlRpbWVyIEZpcmVkLCBidXQgZGF0YWJh
c2UgaXMgY2xvc2VkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmVjdG9yPENv
b2tpZUFjdGlvbj4gY2hhbmdlZENvb2tpZXM7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBs
b2NrKG1fbXV0ZXgpOworICAgICAgICBjaGFuZ2VkQ29va2llcy5zd2FwKG1fY2hhbmdlZENvb2tp
ZXMpOworICAgICAgICBBU1NFUlQobV9jaGFuZ2VkQ29va2llcy5pc0VtcHR5KCkpOworICAgIH0K
KworICAgIGlmIChjaGFuZ2VkQ29va2llcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQ29va2llTG9n
KCJDb29raWVCYWNraW5nU3RvcmUgLSBUaW1lciBmaXJlZCwgYnV0IG5vIGNvb2tpZXMgaW4gY2hh
bmdlbGlzdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIENvb2tpZUxvZygiQ29va2ll
QmFja2luZ1N0b3JlIC0gVGltZXIgZmlyZWQsIHNlbmRpbmcgY2hhbmdlcyB0byBkYXRhYmFzZS4g
V2UgaGF2ZSAlZCBjaGFuZ2VzIiwgY2hhbmdlZENvb2tpZXMuc2l6ZSgpKTsKKyAgICBTUUxpdGVU
cmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RiLCBmYWxzZSk7CisgICAgdHJhbnNhY3Rpb24uYmVn
aW4oKTsKKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBldmVyeSBlbGVtZW50IGluIHRoZSBjaGFu
Z2UgbGlzdCB0byBtYWtlIGNhbGxzCisgICAgLy8gSWYgZXJyb3Igb2NjdXJzLCBpZ25vcmUgaXQg
YW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHN0YXRlbWVudAorICAgIHNpemVfdCBzaXplT2ZDaGFu
Z2UgPSBjaGFuZ2VkQ29va2llcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
aXplT2ZDaGFuZ2U7IGkrKykgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQqIG1fc3RhdGVtZW50
OworICAgICAgICBjb25zdCBQYXJzZWRDb29raWUgY29va2llID0gY2hhbmdlZENvb2tpZXNbaV0u
Zmlyc3Q7CisgICAgICAgIFVwZGF0ZVBhcmFtZXRlciBhY3Rpb24gPSBjaGFuZ2VkQ29va2llc1tp
XS5zZWNvbmQ7CisKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBEZWxldGUpIHsKKyAgICAgICAgICAg
IG1fc3RhdGVtZW50ID0gbV9kZWxldGVTdGF0ZW1lbnQ7CisgICAgICAgICAgICBDb29raWVMb2co
IkNvb2tpZUJhY2tpbmdTdG9yZSAtIGRlbGV0aW5nIGNvb2tpZSAlcy4iLCBjb29raWUudG9TdHJp
bmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgICAgICAgICAgLy8gQmluZHMgYWxsIHRoZSB2YWx1
ZXMKKyAgICAgICAgICAgIGlmIChtX3N0YXRlbWVudC0+YmluZFRleHQoMSwgY29va2llLm5hbWUo
KSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGNvb2tpZS5kb21haW4oKSkKKyAgICAgICAg
ICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMywgY29va2llLnBhdGgoKSkgfHwgbV9z
dGF0ZW1lbnQtPmJpbmRUZXh0KDQsIGNvb2tpZS5wcm90b2NvbCgpKSkgeworICAgICAgICAgICAg
ICAgIExPR19FUlJPUigiQ2Fubm90IGJpbmQgY29va2llIGRhdGEgdG8gZGVsZXRlIik7CisgICAg
ICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxh
c3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgQ29v
a2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSB1cGRhdGluZyBjb29raWUgJXMuIiwgY29va2ll
LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgbV9zdGF0ZW1lbnQg
PSBtX3VwZGF0ZVN0YXRlbWVudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBpbnNlcnRpbmcgY29va2llICVzLiIs
IGNvb2tpZS50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIG1fc3Rh
dGVtZW50ID0gbV9pbnNlcnRTdGF0ZW1lbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IC8vIEJpbmRzIGFsbCB0aGUgdmFsdWVzCisgICAgICAgICAgICBpZiAobV9zdGF0ZW1lbnQtPmJp
bmRUZXh0KDEsIGNvb2tpZS5uYW1lKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgyLCBjb29r
aWUudmFsdWUoKSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMywg
Y29va2llLmRvbWFpbigpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoNCwgY29va2llLnBhdGgo
KSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZERvdWJsZSg1LCBjb29raWUu
ZXhwaXJ5KCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kRG91YmxlKDYsIGNvb2tpZS5sYXN0QWNjZXNz
ZWQoKSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZEludDY0KDcsIGNvb2tp
ZS5pc1NlY3VyZSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZEludDY0KDgsIGNvb2tpZS5pc0h0dHBP
bmx5KCkpCisgICAgICAgICAgICAgICAgfHwgbV9zdGF0ZW1lbnQtPmJpbmREb3VibGUoOSwgY29v
a2llLmNyZWF0aW9uVGltZSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMTAsIGNvb2tpZS5w
cm90b2NvbCgpKSkgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGJpbmQgY29v
a2llIGRhdGEgdG8gc2F2ZSIpOworICAgICAgICAgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVy
cm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmMgPSBtX3N0YXRlbWVudC0+c3RlcCgp
OworICAgICAgICBtX3N0YXRlbWVudC0+cmVzZXQoKTsKKyAgICAgICAgaWYgKHJjICE9IFNRTFJl
c3VsdE9rICYmIHJjICE9IFNRTFJlc3VsdERvbmUpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigi
Q2Fubm90IG1ha2UgY2FsbCB0byB0aGUgZGF0YWJhc2UiKTsKKyAgICAgICAgICAgIExPR19FUlJP
UigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB9CisgICAgfQorICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgIENvb2tpZUxvZygi
Q29va2llQmFja2luZ1N0b3JlIC0gdHJhbnNhY3Rpb24gY29tcGxldGUiKTsKK30KKwordm9pZCBD
b29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6YWRkVG9DaGFuZ2VRdWV1ZShjb25zdCBQYXJzZWRD
b29raWUqIGNoYW5nZWRDb29raWUsIFVwZGF0ZVBhcmFtZXRlciBhY3Rpb25QYXJhbSkKK3sKKyAg
ICBBU1NFUlQoIWNoYW5nZWRDb29raWUtPmlzU2Vzc2lvbigpKTsKKyAgICBQYXJzZWRDb29raWUg
Y29va2llQ29weShjaGFuZ2VkQ29va2llKTsKKyAgICBDb29raWVBY3Rpb24gYWN0aW9uKGNvb2tp
ZUNvcHksIGFjdGlvblBhcmFtKTsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9t
dXRleCk7CisgICAgICAgIG1fY2hhbmdlZENvb2tpZXMuYXBwZW5kKGFjdGlvbik7CisgICAgICAg
IENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0gbV9jaGFuZ2VkY29va2llcyBoYXMgJWQu
IiwgbV9jaGFuZ2VkQ29va2llcy5zaXplKCkpOworICAgIH0KKyAgICBzZW5kQ2hhbmdlc1RvRGF0
YWJhc2Uoc19kYXRhYmFzZVRpbWVySW50ZXJ2YWwpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3Jl
L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjliN2RlY2RkMWQ2Nzk5
ODY3ZjBjOTMxOGVhNjQzOTg0NTllMTEyMwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqY2hhZmZyYWl4QHBsZXlvLmNvbT4KKyAqIENv
cHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmVfaAorI2RlZmlu
ZSBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9oCisKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmlu
Zy5oIgorI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKwor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2VDbGllbnQuaD4KKyNpbmNsdWRlIDxC
bGFja0JlcnJ5UGxhdGZvcm1UaW1lci5oPgorI2luY2x1ZGUgPEdlbmVyaWNUaW1lckNsaWVudC5o
PgorI2luY2x1ZGUgPFRocmVhZFRpbWVyQ2xpZW50Lmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGlu
Z1ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBhcnNlZENv
b2tpZTsKKworY2xhc3MgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUgOiBwdWJsaWMgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06Ok1lc3NhZ2VDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICwgcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUaHJlYWRUaW1lckNsaWVudCB7
CitwdWJsaWM6CisgICAgc3RhdGljIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlKiBjcmVhdGUo
KSB7IHJldHVybiBuZXcgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU7IH0KKworICAgIHZvaWQg
b3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUphcik7CisKKyAgICB2b2lkIGluc2VydChjb25zdCBQ
YXJzZWRDb29raWUqKTsKKyAgICB2b2lkIHVwZGF0ZShjb25zdCBQYXJzZWRDb29raWUqKTsKKyAg
ICB2b2lkIHJlbW92ZShjb25zdCBQYXJzZWRDb29raWUqKTsKKworICAgIHZvaWQgcmVtb3ZlQWxs
KCk7CisKKyAgICAvLyBJZiBhIGxpbWl0IGlzIG5vdCBzZXQsIHRoZSBtZXRob2Qgd2lsbCByZXR1
cm4gYWxsIGNvb2tpZXMgaW4gdGhlIGRhdGFiYXNlCisgICAgdm9pZCBnZXRDb29raWVzRnJvbURh
dGFiYXNlKFZlY3RvcjxQYXJzZWRDb29raWUqPiYgc3RhY2tPZkNvb2tpZXMsIHVuc2lnbmVkIGlu
dCBsaW1pdCA9IDApOworCisgICAgdm9pZCBzZW5kQ2hhbmdlc1RvRGF0YWJhc2VTeW5jaHJvbm91
c2x5KCk7CisKKyAgICAvLyBUaHJlYWRUaW1lckNsaWVudCBtZXRob2RzCisgICAgdmlydHVhbCBi
b29sIHdpbGxGaXJlVGltZXIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBpbnQgZ2V0
UHVsc2VDb2RlKCkgY29uc3QgeyByZXR1cm4gcHVsc2VDb2RlKCk7IH0KKyAgICB2aXJ0dWFsIGlu
dCBnZXRDb25uZWN0aW9uSWQoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uSWQoKTsgfQorICAg
IHZpcnR1YWwgaW50IGRlZmF1bHRUaW1lclByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gdGhyZWFk
UHJpb3JpdHkoKTsgfQorCitwcml2YXRlOgorICAgIGVudW0gVXBkYXRlUGFyYW1ldGVyIHsKKyAg
ICAgICAgSW5zZXJ0LAorICAgICAgICBVcGRhdGUsCisgICAgICAgIERlbGV0ZSwKKyAgICB9Owor
CisgICAgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUoKTsKKyAgICB+Q29va2llRGF0YWJhc2VC
YWNraW5nU3RvcmUoKTsKKworICAgIHZvaWQgYWRkVG9DaGFuZ2VRdWV1ZShjb25zdCBQYXJzZWRD
b29raWUqIGNoYW5nZWRDb29raWUsIFVwZGF0ZVBhcmFtZXRlciBhY3Rpb25QYXJhbSk7CisgICAg
dm9pZCBzZW5kQ2hhbmdlc1RvRGF0YWJhc2UoaW50IGludGVydmFsKTsKKyAgICB2b2lkIHNlbmRD
aGFuZ2VzVG9EYXRhYmFzZVRpbWVyRmlyZWQoKTsKKyAgICB2b2lkIHVwZ3JhZGVUYWJsZUlmTmVl
ZGVkKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VTY2hlbWEsIGNvbnN0IFN0cmluZyYgcHJpbWFyeWtl
eUZpZWxkcyk7CisKKyAgICB2b2lkIGludm9rZU9wZW4oY29uc3QgU3RyaW5nJiBjb29raWVKYXIp
OworICAgIHZvaWQgaW52b2tlUmVtb3ZlQWxsKCk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+
KiBpbnZva2VHZXRDb29raWVzV2l0aExpbWl0KHVuc2lnbmVkIGludCBsaW1pdCk7CisgICAgdm9p
ZCBpbnZva2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UoKTsKKworICAgIHZvaWQgY2xvc2UoKTsKKwor
ICAgIHR5cGVkZWYgcGFpcjxjb25zdCBQYXJzZWRDb29raWUsIFVwZGF0ZVBhcmFtZXRlcj4gQ29v
a2llQWN0aW9uOworICAgIFZlY3RvcjxDb29raWVBY3Rpb24+IG1fY2hhbmdlZENvb2tpZXM7Cisg
ICAgTXV0ZXggbV9tdXRleDsKKworICAgIFN0cmluZyBtX3RhYmxlTmFtZTsKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6VGltZXI8Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU+IG1fZGJUaW1l
cjsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R2VuZXJpY1RpbWVyQ2xpZW50KiBtX2RiVGlt
ZXJDbGllbnQ7CisgICAgU1FMaXRlRGF0YWJhc2UgbV9kYjsKKyAgICBTUUxpdGVTdGF0ZW1lbnQg
Km1faW5zZXJ0U3RhdGVtZW50OworICAgIFNRTGl0ZVN0YXRlbWVudCAqbV91cGRhdGVTdGF0ZW1l
bnQ7CisgICAgU1FMaXRlU3RhdGVtZW50ICptX2RlbGV0ZVN0YXRlbWVudDsKK307CisKK0Nvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlJiBjb29raWVCYWNraW5nU3RvcmUoKTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmVfaApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVKYXJC
bGFja0JlcnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2ll
SmFyQmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmE0OTFkNzVlODA4OWY3ZTA0M2Q0ZTcwMjdk
OTRhZmZmMjRlYWNjMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvQ29va2llSmFyQmxhY2tCZXJyeS5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVz
c2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUg
dG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIENvcHly
aWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNv
bS8KKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC0yMDEx
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJDb29raWVKYXIuaCIKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIkNvb2tp
ZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisj
aW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiS1VSTC5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1
ZGUgIlBhZ2VHcm91cExvYWREZWZlcnJlci5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5j
bHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1N0cmlu
ZyBjb29raWVzKERvY3VtZW50IGNvbnN0KiBkb2N1bWVudCwgS1VSTCBjb25zdCYgdXJsKQorewor
ICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOworICAgIFBhZ2UqIHBhZ2UgPSBm
cmFtZSA/IGZyYW1lLT5wYWdlKCkgOiAwOworCisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1
cm4gU3RyaW5nKCk7CisKKyAgICBpZiAoIShmcmFtZSAmJiBmcmFtZS0+bG9hZGVyKCkgJiYgZnJh
bWUtPmxvYWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAg
IGlmICghc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4o
ZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKworICAgIEFTU0VSVChkb2N1bWVudCAmJiB1cmwgPT0gZG9jdW1lbnQt
PmNvb2tpZVVSTCgpKTsKKyAgICAvLyAnSHR0cE9ubHknIGNvb2tpZXMgc2hvdWxkIG5vIGJlIGFj
Y2Vzc2libGUgZnJvbSBzY3JpcHRzLCBzbyB3ZSBmaWx0ZXIgdGhlbSBvdXQgaGVyZQorICAgIFN0
cmluZyByZXN1bHQgPSBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2llKHVybCwgTm9IdHRwT25seUNv
b2tpZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHNldENvb2tpZXMoRG9jdW1l
bnQqIGRvY3VtZW50LCBLVVJMIGNvbnN0JiB1cmwsIFN0cmluZyBjb25zdCYgdmFsdWUpCit7Cisg
ICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisgICAgUGFnZSogcGFnZSA9IGZy
YW1lID8gZnJhbWUtPnBhZ2UoKSA6IDA7CisKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghKGZyYW1lICYmIGZyYW1lLT5sb2FkZXIoKSAmJiBmcmFtZS0+bG9hZGVy
KCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFzdGF0aWNfY2FzdDxX
ZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihmcmFtZS0+bG9hZGVyKCktPmNs
aWVudCgpKS0+Y29va2llc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJU
KGRvY3VtZW50ICYmIHVybCA9PSBkb2N1bWVudC0+Y29va2llVVJMKCkpOworICAgIGNvb2tpZU1h
bmFnZXIoKS5zZXRDb29raWVzKHVybCwgdmFsdWUpOworfQorCitib29sIGNvb2tpZXNFbmFibGVk
KERvY3VtZW50IGNvbnN0KikKK3sKKyAgICAvLyBGSVhNRS4gQ3VycmVudGx5IGNvb2tpZSBpcyBl
bmFibGVkIGJ5IGRlZmF1bHQsIG5vIHNldHRpbmcgb24gcHJvcGVydHkgcGFnZS4KKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0IERvY3VtZW50KiBkb2N1bWVu
dCwgY29uc3QgS1VSTCYgdXJsLCBWZWN0b3I8Q29va2llPiYgcmF3Q29va2llcykKK3sKKyAgICBW
ZWN0b3I8UGFyc2VkQ29va2llKj4gcmVzdWx0OworICAgIGNvb2tpZU1hbmFnZXIoKS5nZXRSYXdD
b29raWVzKHJlc3VsdCwgdXJsLCBXaXRoSHR0cE9ubHlDb29raWVzKTsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykKKyAgICAgICAgcmVzdWx0W2ldLT5hcHBl
bmRXZWJDb3JlQ29va2llKHJhd0Nvb2tpZXMpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IGRlbGV0ZUNvb2tpZShjb25zdCBEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IEtVUkwmIHVybCwg
Y29uc3QgV1RGOjpTdHJpbmcmIGNvb2tpZU5hbWUpCit7CisgICAgLy8gQ29va2llcyBhcmUgbm90
IGJvdW5kIHRvIHRoZSBkb2N1bWVudC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHBhc3MK
KyAgICAvLyBpbiB0aGUgZG9jdW1lbnQgb2JqZWN0IHRvIGZpbmQgdGhlIHRhcmdldGVkIGNvb2tp
ZXMgaW4gY29va2llIG1hbmFnZXIuCisgICAgY29va2llTWFuYWdlcigpLnJlbW92ZUNvb2tpZVdp
dGhOYW1lKHVybCwgY29va2llTmFtZSk7Cit9CisKK1N0cmluZyBjb29raWVSZXF1ZXN0SGVhZGVy
RmllbGRWYWx1ZShjb25zdCBEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IEtVUkwgJnVybCkKK3sK
KyAgICBBU1NFUlQoZG9jdW1lbnQpOworCisgICAgaWYgKCEoZG9jdW1lbnQtPmZyYW1lKCkgJiYg
ZG9jdW1lbnQtPmZyYW1lKCktPmxvYWRlcigpICYmIGRvY3VtZW50LT5mcmFtZSgpLT5sb2FkZXIo
KS0+Y2xpZW50KCkpKQorICAgICAgICByZXR1cm4gV1RGOjpTdHJpbmcoKTsKKworICAgIGlmICgh
c3RhdGljX2Nhc3Q8V2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4oZG9jdW1l
bnQtPmZyYW1lKCktPmxvYWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisgICAg
ICAgIHJldHVybiBXVEY6OlN0cmluZygpOworCisgICAgcmV0dXJuIGNvb2tpZU1hbmFnZXIoKS5n
ZXRDb29raWUodXJsLCBXaXRoSHR0cE9ubHlDb29raWVzKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9D
b29raWVNYW5hZ2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29v
a2llTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzlmOGU0YzkxYTNjNzU5YWEzM2NmNDU4OWM1ZGMw
NzBlZjUyZjkzOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Js
YWNrYmVycnkvQ29va2llTWFuYWdlci5jcHAKQEAgLTAsMCArMSw1OTcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBn
bWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjZGVmaW5lIEVOQUJMRV9DT09LSUVf
REVCVUcgMAorI2RlZmluZSBFTkFCTEVfQ09PS0lFX1NVUEVSX1ZFUkJPU0VfREVCVUcgMAorI2Rl
ZmluZSBFTkFCTEVfQ09PS0lFX0xJTUlUX0RFQlVHIDAKKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkNvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlLmgiCisjaW5jbHVkZSAiQ29va2llUGFyc2VyLmgiCisjaW5jbHVkZSAiQ3VycmVu
dFRpbWUuaCIKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgor
I2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorI2luY2x1ZGUgIldlYlNldHRpbmdzLmgiCisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtQ2xpZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1N
ZXNzYWdlQ2xpZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTmF2aWdhdG9ySGFu
ZGxlci5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcu
aD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvV1RGU3RyaW5nLmg+CisKKyNpZiBFTkFCTEVfQ09PS0lFX0RFQlVHCisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9DT09LSUVfU1VQRVJf
VkVSQk9TRV9ERUJVRworI2RlZmluZSBDb29raWVMb2coZm9ybWF0LCAuLi4pIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpsb2dBbHdheXMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywg
Zm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQs
IC4uLikKKyNlbmRpZiAvLyBFTkFCTEVfQ09PS0lFX1NVUEVSX1ZFUkJPU0VfREVCVUcKKworI2lm
IEVOQUJMRV9DT09LSUVfTElNSVRfREVCVUcKKyNkZWZpbmUgQ29va2llTGltaXRMb2coZm9ybWF0
LCAuLi4pIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2dBbHdheXMoQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkxvZ0xldmVsSW5mbywgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5l
IENvb2tpZUxpbWl0TG9nKGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVOQUJMRV9DT09LSUVfTElN
SVRfREVCVUcKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgdm9pZCBmbHVzaENvb2tp
ZXNPbkV4aXQodm9pZCkKK3sKKyAgICBjb29raWVNYW5hZ2VyKCkuZmx1c2hDb29raWVzVG9CYWNr
aW5nU3RvcmUoKTsKK30KKworQ29va2llTWFuYWdlciYgY29va2llTWFuYWdlcigpCit7CisgICAg
c3RhdGljIENvb2tpZU1hbmFnZXIgKmNvb2tpZU1hbmFnZXIgPSAwOworICAgIGlmICghY29va2ll
TWFuYWdlcikgeworICAgICAgICAvLyBPcGVuIHRoZSBjb29raWVKYXIgbm93IGFuZCBnZXQgdGhl
IGJhY2tpbmcgc3RvcmUgY29va2llcyB0byBmaWxsIHRoZSBtYW5hZ2VyLgorICAgICAgICBjb29r
aWVNYW5hZ2VyID0gbmV3IENvb2tpZU1hbmFnZXI7CisgICAgICAgIGNvb2tpZU1hbmFnZXItPm1f
Y29va2llQmFja2luZ1N0b3JlLT5vcGVuKGNvb2tpZU1hbmFnZXItPmNvb2tpZUphcigpKTsKKyAg
ICAgICAgY29va2llTWFuYWdlci0+Z2V0QmFja2luZ1N0b3JlQ29va2llcygpOworICAgICAgICBD
b29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBCYWNraW5nc3RvcmUgbG9hZCBjb21wbGV0ZS5cbiIp
OworCisgICAgICAgIGF0ZXhpdCgmZmx1c2hDb29raWVzT25FeGl0KTsKKyAgICB9CisgICAgcmV0
dXJuICpjb29raWVNYW5hZ2VyOworfQorCitDb29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKCkK
KyAgICA6IG1fY291bnQoMCkKKyAgICAsIG1fcHJpdmF0ZU1vZGUoZmFsc2UpCisgICAgLCBtX3No
b3VsZER1bXBBbGxDb29raWVzKGZhbHNlKQorICAgICwgbV9jb29raWVKYXJGaWxlTmFtZShwYXRo
QnlBcHBlbmRpbmdDb21wb25lbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkNsaWVudDo6Z2V0KCkt
PmdldEFwcGxpY2F0aW9uRGF0YURpcmVjdG9yeSgpLmNfc3RyKCksICIvY29va2llQ29sbGVjdGlv
bi5kYiIpKQorICAgICwgbV9wb2xpY3koQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeUFsd2F5cykK
KyAgICAsIG1fY29va2llQmFja2luZ1N0b3JlKENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpj
cmVhdGUoKSkKKyAgICAsIG1fbGltaXRUaW1lcih0aGlzLCAmQ29va2llTWFuYWdlcjo6Y29va2ll
TGltaXRDbGVhblVwKQoreworfQorCitDb29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7
CisgICAgcmVtb3ZlQWxsQ29va2llcyhEb05vdFJlbW92ZUZyb21CYWNraW5nU3RvcmUpOworICAg
IC8vIFRPRE86IG1fbWFuYWdlck1hcCBhbmQgdGhlIHRvcCBsYXllciBwcm90b2NvbE1hcHMgYXJl
IG5vdCBwcm9wZXJseSBkZWxldGVkLgorICAgIC8vIERvIG5vdCBkZWxldGUgYW55IHByb3RvY29s
IG1hcHMgdG8gYXZvaWQgZG91YmxlLWRlbGV0aW9uIG9mIHRoZSBtYXBzIHRoYXQgYXJlCisgICAg
Ly8gYmVpbmcgdXNlZCBmb3IgYm90aCBzZWN1cmUgYW5kIG5vbi1zZWN1cmUgcHJvdG9jb2xzOyB0
aGlzIGxlYWsgaXMgT0sgc2luY2UKKyAgICAvLyB0aGVyZSdzIG5vdGhpbmcgaW1wb3J0YW50IGlu
IHRoZSBoYXNodGFibGUgZGVzdHJ1Y3RvcnMsIGFuZCB0aGUgbWVtb3J5IHdpbGwgYmUgcmVjbGFp
bWVkIG9uIGV4aXQKKworICAgIC8vIEZJWE1FOiBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSBp
cyBub3QgZGVsZXRlZCwgb25seSBmbHVzaGVkCisgICAgLy8gKGN1cnJlbnRseSB0aGUgZGVzdHJ1
Y3RvciBpcyBuZXZlciBjYWxsZWQgc2luY2UgdGhpcyBjbGFzcyBpcyBhCisgICAgLy8gc2luZ2xl
dG9uOyBvbiBleGl0LCB0aGUgZGIgaXMgZmx1c2hlZCBtYW51YWxseS4gVGhpcyBjYWxsIGlzIG9u
bHkgaGVyZQorICAgIC8vIGFzIGEgZmFsbGJhY2sgaW4gY2FzZSB0aGlzIGNsYXNzIGlzIG1hZGUg
YSBub24tc2luZ2xldG9uLgorICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5zZW5kQ2hhbmdlc1Rv
RGF0YWJhc2VTeW5jaHJvbm91c2x5KCk7Cit9CisKKy8vIFNvcnRpbmcgbG9naWMgaXMgYmFzZWQg
b24gQ29va2llIFNwZWMgUkZDNjI2NSwgc2VjdGlvbiA1LjQuMgorc3RhdGljIGJvb2wgY29va2ll
U29ydGVyKFBhcnNlZENvb2tpZSogYSwgUGFyc2VkQ29va2llKiBiKQoreworICAgIGlmIChhLT5w
YXRoKCkubGVuZ3RoKCkgPT0gYi0+cGF0aCgpLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gYS0+
Y3JlYXRpb25UaW1lKCkgPD0gYi0+Y3JlYXRpb25UaW1lKCk7CisgICAgcmV0dXJuIGEtPnBhdGgo
KS5sZW5ndGgoKSA+IGItPnBhdGgoKS5sZW5ndGgoKTsKK30KKworLy8gUmV0dXJucyB3aGV0aGVy
IHRoZSBwcm90b2NvbCBzdXBwb3J0cyBkb21haW5zCitzdGF0aWMgYm9vbCBzaG91bGRJZ25vcmVE
b21haW4oY29uc3QgU3RyaW5nIHByb3RvY29sKQoreworICAgIC8vIGlnbm9yZSBkb21haW4gc2Vj
dXJpdHkgZm9yIGZpbGUgYW5kIGxvY2FsCisgICAgaWYgKChwcm90b2NvbCA9PSAiZmlsZSIgfHwg
cHJvdG9jb2wgPT0gImxvY2FsIiApKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0Q29va2llcyhjb25zdCBLVVJMJiB1
cmwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2Vy
IC0gU2V0dGluZyBjb29raWVzIik7CisgICAgQ29va2llUGFyc2VyIHBhcnNlcih1cmwpOworICAg
IFZlY3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVzID0gcGFyc2VyLnBhcnNlKHZhbHVlKTsKKwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29va2llcy5zaXplKCk7ICsraSkgeworICAgICAg
ICBQYXJzZWRDb29raWUqIGNvb2tpZSA9IGNvb2tpZXNbaV07CisgICAgICAgIGlmICghc2hvdWxk
UmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24oY29va2llLCB1cmwpKSB7CisgICAgICAgICAgICBCYWNr
aW5nU3RvcmVSZW1vdmFsUG9saWN5IHRyZWF0bWVudCA9IG1fcHJpdmF0ZU1vZGUgPyBEb05vdFJl
bW92ZUZyb21CYWNraW5nU3RvcmUgOiBSZW1vdmVGcm9tQmFja2luZ1N0b3JlOworICAgICAgICAg
ICAgY2hlY2tBbmRUcmVhdENvb2tpZShjb29raWUsIHRyZWF0bWVudCk7CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgZGVsZXRlIGNvb2tpZTsKKyAgICB9Cit9CisKK2Jvb2wgQ29va2llTWFu
YWdlcjo6c2hvdWxkUmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24oY29uc3QgUGFyc2VkQ29va2llKiBj
b29raWUsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBXZSBoYXZlIHRvIGRpc2FibGUgdGhl
IGZvbGxvd2luZyBjaGVjayBiZWNhdXNlIHNpdGVzIGxpa2UgRmFjZWJvb2sgYW5kCisgICAgLy8g
R21haWwgY3VycmVudGx5IGRvIG5vdCBmb2xsb3cgdGhlIHNwZWMuCisjaWYgMAorICAgIC8vIENo
ZWNrIGlmIHBhdGggYXR0cmlidXRlIGlzIGEgcHJlZml4IG9mIHRoZSByZXF1ZXN0IFVSSS4KKyAg
ICBpZiAoIXVybC5wYXRoKCkuc3RhcnRzV2l0aChjb29raWUtPnBhdGgoKSkpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJDb29raWUgJXMgaXMgcmVqZWN0ZWQgYmVjYXVzZSBpdHMgcGF0aCBkb2VzIG5v
dCBtYXRoIHRoZSBVUkwgJXNcbiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpLCB1
cmwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyNlbmRpZgorCisgICAgLy8gaWdub3JlIGRvbWFpbiBzZWN1cml0eSBpZiBwcm90b2NvbCBkb2Vz
bid0IGhhdmUgZG9tYWlucworICAgIGlmIChzaG91bGRJZ25vcmVEb21haW4oY29va2llLT5wcm90
b2NvbCgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUmVqZWN0IENvb2tpZSBp
ZiBkb21haW4gaXMgZW1wdHkKKyAgICBpZiAoIWNvb2tpZS0+ZG9tYWluKCkubGVuZ3RoKCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFjb29raWUtPmhhc0RlZmF1bHREb21haW4o
KSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgZG9tYWluIGNvbnRhaW5zIGFuIGVtYmVkZGVk
IGRvdC4KKyAgICAgICAgaW50IGRvdFBvc2l0aW9uID0gY29va2llLT5kb21haW4oKS5maW5kKCIu
IiwgMSk7CisgICAgICAgIGlmIChkb3RQb3NpdGlvbiA9PSAtMSB8fCBzdGF0aWNfY2FzdDx1bnNp
Z25lZCBpbnQ+KGRvdFBvc2l0aW9uKSA9PSBjb29raWUtPmRvbWFpbigpLmxlbmd0aCgpKSB7Cisg
ICAgICAgICAgICBMT0dfRVJST1IoIkNvb2tpZSAlcyBpcyByZWplY3RlZCBiZWNhdXNlIGl0cyBk
b21haW4gZG9lcyBub3QgY29udGFpbiBhbiBlbWJlZGRlZCBkb3QuXG4iLCBjb29raWUtPnRvU3Ry
aW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIC8vIFRoZSByZXF1ZXN0IGhvc3Qgc2hvdWxkIGRvbWFpbiBtYXRjaCB0
aGUgRG9tYWluIGF0dHJpYnV0ZS4KKyAgICAvLyBEb21haW4gc3RyaW5nIHN0YXJ0cyB3aXRoIGEg
ZG90LCBzbyBhLmIuY29tIHNob3VsZCBkb21haW4gbWF0Y2ggLmEuYi5jb20uCisgICAgLy8gYWRk
IGEgIi4iIGF0IGJlZ2lubmluZyBvZiBob3N0IG5hbWUsIGJlY2F1c2UgaXQgY2FuIGhhbmRsZSBt
YW55IGNhc2VzIHN1Y2ggYXMKKyAgICAvLyBhLmIuY29tIG1hdGNoZXMgYi5jb20sIGEuYi5jb20g
bWF0Y2hlcyAuQi5jb20gYW5kIGEuYi5jb20gbWF0Y2hlcyAuQS5iLkNvbQorICAgIC8vIGFuZCBz
byBvbi4KKyAgICBTdHJpbmcgaG9zdERvbWFpbk5hbWUgPSB1cmwuaG9zdCgpOworICAgIGhvc3RE
b21haW5OYW1lID0gaG9zdERvbWFpbk5hbWUuc3RhcnRzV2l0aCgiLiIpID8gaG9zdERvbWFpbk5h
bWUgOiAiLiIgKyBob3N0RG9tYWluTmFtZTsKKyAgICBpZiAoIWhvc3REb21haW5OYW1lLmVuZHNX
aXRoKGNvb2tpZS0+ZG9tYWluKCksIGZhbHNlKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvb2tp
ZSAlcyBpcyByZWplY3RlZCBiZWNhdXNlIGl0cyBkb21haW4gZG9lcyBub3QgZG9tYWluIG1hdGNo
IHRoZSBVUkwgJXNcbiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpLCB1cmwuc3Ry
aW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAv
LyBXZSBzaG91bGQgY2hlY2sgZm9yIGFuIGVtYmVkZGVkIGRvdCBpbiB0aGUgcG9ydGlvbiBvZiBz
dHJpbmcgaW4gdGhlIGhvc3Qgbm90IGluIHRoZSBkb21haW4KKyAgICAvLyBidXQgdG8gbWF0Y2gg
ZmlyZWZveCBiZWhhdmlvdXIgd2UgZG8gbm90LgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitT
dHJpbmcgQ29va2llTWFuYWdlcjo6Z2V0Q29va2llKGNvbnN0IEtVUkwmIHVybCwgQ29va2llRmls
dGVyIGZpbHRlcikgY29uc3QKK3sKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4gcmF3Q29va2ll
czsKKyAgICByYXdDb29raWVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoc19tYXhDb29raWVDb3Vu
dFBlckhvc3QpOworCisgICAgLy8gUmV0cmlldmUgY29va2llcyByZWxhdGVkIHRvIHRoaXMgdXJs
CisgICAgZ2V0UmF3Q29va2llcyhyYXdDb29raWVzLCB1cmwsIGZpbHRlcik7CisKKyAgICBDb29r
aWVMb2coIkNvb2tpZU1hbmFnZXIgLSB0aGVyZSBhcmUgJWQgY29va2llcyBpbiByYXcgY29va2ll
c1xuIiwgcmF3Q29va2llcy5zaXplKCkpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGNvb2tpZSBo
ZWFkZXIgc3RyaW5nIHVzaW5nIHRoZSByZXRyaWV2ZWQgY29va2llcworICAgIFN0cmluZ0J1aWxk
ZXIgY29va2llU3RyaW5nQnVpbGRlcjsKKyAgICBjb29raWVTdHJpbmdCdWlsZGVyLnJlc2VydmVD
YXBhY2l0eSg1MTIpOworICAgIHNpemVfdCBjb29raWVTaXplID0gcmF3Q29va2llcy5zaXplKCk7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29raWVTaXplOyBpKyspIHsKKyAgICAgICAg
Y29va2llU3RyaW5nQnVpbGRlci5hcHBlbmQocmF3Q29va2llc1tpXS0+dG9OYW1lVmFsdWVQYWly
KCkpOworICAgICAgICBpZiAoaSAhPSBjb29raWVTaXplLTEpCisgICAgICAgICAgICBjb29raWVT
dHJpbmdCdWlsZGVyLmFwcGVuZCgiOyAiKTsKKyAgICB9CisKKyAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBjb29raWVTdHJpbmcgaXMgLSAlc1xuIiwgY29va2llU3RyaW5nQnVpbGRlci50
b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcmV0dXJuIGNvb2tpZVN0cmluZ0J1aWxk
ZXIudG9TdHJpbmcoKTsKKworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmdldFJhd0Nvb2tpZXMo
VmVjdG9yPFBhcnNlZENvb2tpZSo+ICZzdGFja09mQ29va2llcywgY29uc3QgS1VSTCYgcmVxdWVz
dFVSTCwgQ29va2llRmlsdGVyIGZpbHRlcikgY29uc3QKK3sKKyAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBnZXRSYXdDb29raWVzIC0gcHJvY2Vzc2luZyB1cmwgd2l0aCBkb21haW4gLSAl
cyAmIHByb3RvY29sOiAlcyAmIHBhdGg6ICVzXG4iLCByZXF1ZXN0VVJMLmhvc3QoKS51dGY4KCku
ZGF0YSgpLCByZXF1ZXN0VVJMLnByb3RvY29sKCkudXRmOCgpLmRhdGEoKSwgcmVxdWVzdFVSTC5w
YXRoKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBib29sIHNwZWNpYWxDYXNlRm9yTG9jYWwgPSAo
cmVxdWVzdFVSTC5wcm90b2NvbElzKCJsb2NhbCIpIHx8IHJlcXVlc3RVUkwucHJvdG9jb2xJcygi
ZmlsZSIpKSAmJiBtX3Nob3VsZER1bXBBbGxDb29raWVzOworICAgIGJvb2wgaXNDb25uZWN0aW9u
U2VjdXJlID0gcmVxdWVzdFVSTC5wcm90b2NvbElzKCJodHRwcyIpIHx8IHJlcXVlc3RVUkwucHJv
dG9jb2xJcygid3NzIikgfHwgc3BlY2lhbENhc2VGb3JMb2NhbDsKKworICAgIFZlY3RvcjxQYXJz
ZWRDb29raWUqPiBjb29raWVDYW5kaWRhdGVzOworICAgIFZlY3RvcjxDb29raWVNYXAqPiBwcm90
b2NvbHNUb1NlYXJjaDsKKworICAgIGlmIChzcGVjaWFsQ2FzZUZvckxvY2FsKQorICAgICAgICBj
b3B5VmFsdWVzVG9WZWN0b3IobV9tYW5hZ2VyTWFwLCBwcm90b2NvbHNUb1NlYXJjaCk7CisgICAg
ZWxzZSB7CisgICAgICAgIHByb3RvY29sc1RvU2VhcmNoLmFwcGVuZChtX21hbmFnZXJNYXAuZ2V0
KHJlcXVlc3RVUkwucHJvdG9jb2woKSkpOworICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBhIGhh
Y2sgZm9yIHdlYndvcmtzIGFwcHM7IFJGQyA2MjY1IHNheXMgIkNvb2tpZXMgZG8gbm90IHByb3Zp
ZGUgaXNvbGF0aW9uIGJ5IHNjaGVtZSIKKyAgICAgICAgLy8gc28gd2Ugc2hvdWxkIG5vdCBiZSBj
aGVja2luZyBwcm90b2NvbHMgYXQgYWxsLiBTZWUgUFIgMTM1NTk1CisgICAgICAgIGlmIChtX3No
b3VsZER1bXBBbGxDb29raWVzKSB7CisgICAgICAgICAgICBwcm90b2NvbHNUb1NlYXJjaC5hcHBl
bmQobV9tYW5hZ2VyTWFwLmdldCgiZmlsZSIpKTsKKyAgICAgICAgICAgIHByb3RvY29sc1RvU2Vh
cmNoLmFwcGVuZChtX21hbmFnZXJNYXAuZ2V0KCJsb2NhbCIpKTsKKyAgICAgICB9CisgICAgfQor
CisgICAgVmVjdG9yPFN0cmluZz4gZGVsaW1pdGVkSG9zdDsKKyAgICByZXF1ZXN0VVJMLmhvc3Qo
KS5sb3dlcigpLnNwbGl0KCIuIiwgdHJ1ZSwgZGVsaW1pdGVkSG9zdCk7CisKKyAgICAvLyBHbyB0
aHJvdWdoIGFsbCB0aGUgcHJvdG9jb2wgdHJlZXMgdGhhdCB3ZSBuZWVkIHRvIHNlYXJjaCBmb3IK
KyAgICAvLyBhbmQgZ2V0IGFsbCBjb29raWVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGlzIGRvbWFp
bgorICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcHJvdG9jb2xzVG9TZWFyY2guc2l6ZSgpOyBr
KyspIHsKKyAgICAgICAgQ29va2llTWFwKiBjdXJyZW50TWFwID0gcHJvdG9jb2xzVG9TZWFyY2hb
a107CisKKyAgICAgICAgLy8gaWYgbm8gY29va2llcyBleGlzdCBmb3IgdGhpcyBwcm90b2NvbCwg
YnJlYWsgcmlnaHQgYXdheQorICAgICAgICBpZiAoIWN1cnJlbnRNYXApCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBsb29raW5nIGF0
IHByb3RvY29sIG1hcCAlcyBcbiIsIGN1cnJlbnRNYXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgp
KTsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGxvY2FsIGFuZCBmaWxlcyAtIGJlY2F1
c2UgV2ViQXBwcyBleHBlY3QgdG8gZ2V0IEFMTCBjb29raWVzIGZyb20gdGhlIGJhY2tpbmctc3Rv
cmUgb24gbG9jYWwgcHJvdG9jb2wKKyAgICAgICAgaWYgKHNwZWNpYWxDYXNlRm9yTG9jYWwpIHsK
KyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIHNwZWNpYWwgY2FzZSBmaW5k
IGluIHByb3RvY29sIG1hcCAtICVzXG4iLCBjdXJyZW50TWFwLT5nZXROYW1lKCkudXRmOCgpLmRh
dGEoKSk7CisgICAgICAgICAgICBjdXJyZW50TWFwLT5nZXRBbGxDaGlsZENvb2tpZXMoJmNvb2tp
ZUNhbmRpZGF0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0IGNvb2tp
ZXMgZnJvbSB0aGUgbnVsbCBkb21haW4gbWFwCisgICAgICAgICAgICBjdXJyZW50TWFwLT5nZXRB
bGxDb29raWVzKCZjb29raWVDYW5kaWRhdGVzKTsKKworICAgICAgICAgICAgLy8gR2V0IGNvb2tp
ZXMgZnJvbSB0aGUgdmFsaWQgZG9tYWluIG1hcHMKKyAgICAgICAgICAgIGludCBpID0gZGVsaW1p
dGVkSG9zdC5zaXplKCktMTsKKyAgICAgICAgICAgIHdoaWxlIChpID49IDApIHsKKyAgICAgICAg
ICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBmaW5kaW5nICVzIGluIGN1cnJlbnRt
YXBcbiIsIGRlbGltaXRlZEhvc3RbaV0udXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAg
Y3VycmVudE1hcCA9IGN1cnJlbnRNYXAtPmdldFN1YmRvbWFpbk1hcChkZWxpbWl0ZWRIb3N0W2ld
KTsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHN1YmRvbWFpbi9kb21haW4gZG9lcyBub3Qg
ZXhpc3QgaW4gb3VyIG1hcHBpbmcgdGhlbiB3ZSBzaW1wbHkgZXhpdAorICAgICAgICAgICAgICAg
IGlmICghY3VycmVudE1hcCkgeworICAgICAgICAgICAgICAgICAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBjYW5ub3QgZmluZCBuZXh0IG1hcCBleGl0aW5nIHRoZSB3aGlsZSBsb29wLlxu
Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBmb3VuZCB0aGUgbWFwLCBncmFi
YmluZyBjb29raWVzIGZyb20gdGhpcyBtYXBcbiIpOworICAgICAgICAgICAgICAgIGN1cnJlbnRN
YXAtPmdldEFsbENvb2tpZXMoJmNvb2tpZUNhbmRpZGF0ZXMpOworICAgICAgICAgICAgICAgIGkt
LTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIHRoZXJlIGFyZSAlZCBjb29raWVzIGluIGNhbmRpZGF0ZVxuIiwgY29va2ll
Q2FuZGlkYXRlcy5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29raWVD
YW5kaWRhdGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBhcnNlZENvb2tpZSogY29va2llID0g
Y29va2llQ2FuZGlkYXRlc1tpXTsKKworICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHBhdGgt
bWF0Y2hlcyBydWxlcyBpbiBSRkM2MjY1LCBzZWN0aW9uIDUuMS40LAorICAgICAgICAvLyB3ZSBz
aG91bGQgYWRkIGEgJy8nIGF0IHRoZSBlbmQgb2YgY29va2llLXBhdGggZm9yIGNvbXBhcmlzb24g
aWYgdGhlIGNvb2tpZS1wYXRoIGlzIG5vdCBlbmQgd2l0aCAnLycuCisgICAgICAgIFN0cmluZyBw
YXRoID0gY29va2llLT5wYXRoKCk7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAt
IGNvbXBhcmluZyBjb29raWUgcGF0aCAlcyAobGVuICVkKSB0byByZXF1ZXN0IHBhdGggJXMgKGxl
biAlZCkiLCBwYXRoLnV0ZjgoKS5kYXRhKCksIHBhdGgubGVuZ3RoKCksIHJlcXVlc3RVUkwucGF0
aCgpLnV0ZjgoKS5kYXRhKCksIHBhdGgubGVuZ3RoKCkpOworICAgICAgICBpZiAoIWVxdWFsSWdu
b3JpbmdDYXNlKHBhdGgsIHJlcXVlc3RVUkwucGF0aCgpKSAmJiAhcGF0aC5lbmRzV2l0aCgiLyIs
IGZhbHNlKSkKKyAgICAgICAgICAgIHBhdGggKz0gIi8iOworCisgICAgICAgIC8vIE9ubHkgc2Vj
dXJlIGNvbm5lY3Rpb25zIGhhdmUgYWNjZXNzIHRvIHNlY3VyZSBjb29raWVzLiBVbmxlc3Mgc3Bl
Y2lhbENhc2VGb3JMb2NhbCBpcyB0cnVlCisgICAgICAgIC8vIEdldCB0aGUgY29va2llcyBmaWx0
ZXJpbmcgb3V0IEh0dHBPbmx5IGNvb2tpZXMgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiAocmVx
dWVzdFVSTC5wYXRoKCkuc3RhcnRzV2l0aChwYXRoLCBmYWxzZSkgJiYgKGlzQ29ubmVjdGlvblNl
Y3VyZSB8fCAhY29va2llLT5pc1NlY3VyZSgpKSAmJiAoZmlsdGVyID09IFdpdGhIdHRwT25seUNv
b2tpZXMgfHwgIWNvb2tpZS0+aXNIdHRwT25seSgpKSkgeworICAgICAgICAgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gY29va2llIGNob3NlbiAtICVzXG4iLCBjb29raWUtPnRvU3RyaW5n
KCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICBjb29raWUtPnNldExhc3RBY2Nlc3NlZChj
dXJyZW50VGltZSgpKTsKKyAgICAgICAgICAgIHN0YWNrT2ZDb29raWVzLmFwcGVuZChjb29raWUp
OworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzb3J0KHN0YWNrT2ZDb29raWVzLmJlZ2lu
KCksIHN0YWNrT2ZDb29raWVzLmVuZCgpLCBjb29raWVTb3J0ZXIpOworfQorCit2b2lkIENvb2tp
ZU1hbmFnZXI6OnJlbW92ZUFsbENvb2tpZXMoQmFja2luZ1N0b3JlUmVtb3ZhbFBvbGljeSBiYWNr
aW5nU3RvcmVSZW1vdmFsKQoreworICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRl
cmF0b3IgZmlyc3QgPSBtX21hbmFnZXJNYXAuYmVnaW4oKTsKKyAgICBIYXNoTWFwPFN0cmluZywg
Q29va2llTWFwKj46Oml0ZXJhdG9yIGVuZCA9IG1fbWFuYWdlck1hcC5lbmQoKTsKKyAgICBmb3Ig
KEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQgPSBmaXJzdDsgaXQgIT0g
ZW5kOyArK2l0KQorICAgICAgICBpdC0+c2Vjb25kLT5kZWxldGVBbGxDb29raWVzQW5kRG9tYWlu
cygpOworCisgICAgaWYgKGJhY2tpbmdTdG9yZVJlbW92YWwgPT0gUmVtb3ZlRnJvbUJhY2tpbmdT
dG9yZSkKKyAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJlbW92ZUFsbCgpOworICAgIG1f
Y291bnQgPSAwOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnNldENvb2tpZUphcihjb25zdCBj
aGFyKiBmaWxlTmFtZSkKK3sKKyAgICBtX2Nvb2tpZUphckZpbGVOYW1lID0gU3RyaW5nKGZpbGVO
YW1lKTsKKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+b3BlbihtX2Nvb2tpZUphckZpbGVOYW1l
KTsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpjaGVja0FuZFRyZWF0Q29va2llKFBhcnNlZENv
b2tpZSogY2FuZGlkYXRlQ29va2llLCBCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5IHBvc3RUb0Jh
Y2tpbmdTdG9yZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBjaGVja0FuZFRy
ZWF0Q29va2llIC0gcHJvY2Vzc2luZyB1cmwgd2l0aCBkb21haW4gLSAlcyAmIHByb3RvY29sICVz
XG4iLCBjYW5kaWRhdGVDb29raWUtPmRvbWFpbigpLnV0ZjgoKS5kYXRhKCksIGNhbmRpZGF0ZUNv
b2tpZS0+cHJvdG9jb2woKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGNvbnN0IGJvb2wgaWdub3Jl
RG9tYWluID0gc2hvdWxkSWdub3JlRG9tYWluKGNhbmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSk7
CisKKyAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvdG9jb2wgdHJlZSB0byBhZGQgdGhlIGNvb2tp
ZSB0by4gQ3JlYXRlIG9uZSBpZiBuZWNlc3NhcnkuCisgICAgQ29va2llTWFwKiBjdXJNYXAgPSAw
OworICAgIGlmIChtX21hbmFnZXJNYXAuY29udGFpbnMoY2FuZGlkYXRlQ29va2llLT5wcm90b2Nv
bCgpKSkKKyAgICAgICAgY3VyTWFwID0gbV9tYW5hZ2VyTWFwLmdldChjYW5kaWRhdGVDb29raWUt
PnByb3RvY29sKCkpOworICAgIGVsc2UgeworICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHNl
Y3VyZSB2ZXJzaW9uLCBpZiBpdCBpcywgbGluayBpdCB0byB0aGUgbm9uLXNlY3VyZSB2ZXJzaW9u
CisgICAgICAgIC8vIExpbmsgY3VyTWFwIHRvIHRoZSBuZXcgcHJvdG9jb2wgYXMgd2VsbCBhcyB0
aGUgb2xkIG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICAgIGlmIChjYW5kaWRhdGVDb29r
aWUtPnByb3RvY29sKCkgPT0gImh0dHBzIikgeworICAgICAgICAgICAgY3VyTWFwID0gbV9tYW5h
Z2VyTWFwLmdldCgiaHR0cCIpOworICAgICAgICAgICAgaWYgKCFjdXJNYXApIHsKKyAgICAgICAg
ICAgICAgICBjdXJNYXAgPSBuZXcgQ29va2llTWFwKCJodHRwIik7CisgICAgICAgICAgICAgICAg
bV9tYW5hZ2VyTWFwLmFkZCgiaHR0cCIsIGN1ck1hcCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSBpZiAoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpID09ICJ3c3MiKSB7CisgICAg
ICAgICAgICBjdXJNYXAgPSBtX21hbmFnZXJNYXAuZ2V0KCJ3cyIpOworICAgICAgICAgICAgaWYg
KCFjdXJNYXApIHsKKyAgICAgICAgICAgICAgICBjdXJNYXAgPSBuZXcgQ29va2llTWFwKCJ3cyIp
OworICAgICAgICAgICAgICAgIG1fbWFuYWdlck1hcC5hZGQoIndzIiwgY3VyTWFwKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjdXJNYXAgPSBuZXcgQ29va2ll
TWFwKGNhbmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSk7CisKKyAgICAgICAgQ29va2llTG9nKCJD
b29raWVNYW5hZ2VyIC0gYWRkaW5nIHByb3RvY29sIGNvb2tpZW1hcCAtICVzXG4iLCBjdXJNYXAt
PmdldE5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKworICAgICAgICBtX21hbmFnZXJNYXAuYWRkKGNh
bmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSwgY3VyTWFwKTsKKyAgICB9CisKKyAgICAvLyBJZiBw
cm90b2NvbCBzdXBwb3J0IGRvbWFpbiwgd2UgaGF2ZSB0byB0cmF2ZXJzZSB0aGUgZG9tYWluIHRy
ZWUgdG8gZmluZCB0aGUgcmlnaHQKKyAgICAvLyBjb29raWVNYXAgdG8gaGFuZGxlIHdpdGgKKyAg
ICBpZiAoIWlnbm9yZURvbWFpbikKKyAgICAgICAgY3VyTWFwID0gZmluZE9yQ3JlYXRlQ29va2ll
TWFwKGN1ck1hcCwgY2FuZGlkYXRlQ29va2llLT5kb21haW4oKSwgY2FuZGlkYXRlQ29va2llLT5o
YXNFeHBpcmVkKCkpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgcHJvcGVyIG1hcCBm
b3IgdGhpcyBjb29raWUsIHdlIGNhbiBtb2RpZnkgaXQKKyAgICAvLyBJZiBjb29raWUgZG9lcyBu
b3QgZXhpc3QgYW5kIGhhcyBleHBpcmVkLCBkZWxldGUgaXQKKyAgICAvLyBJZiBjb29raWUgZXhp
c3RzIGFuZCBpdCBoYXMgZXhwaXJlZCwgc28gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSB0aGUgbWFw
LCBpZiBub3QgdXBkYXRlIGl0CisgICAgLy8gSWYgY29va2llIGV4cGlyZWQgYW5kIGNhbWUgZnJv
bSB0aGUgQmFja2luZ1N0b3JlICh0aGVyZWZvcmUgZG9lcyBub3QgZXhpc3QpLCB3ZSBoYXZlIHRv
IHJlbW92ZSBmcm9tIGRhdGFiYXNlCisgICAgLy8gSWYgY29va2llIGRvZXMgbm90IGV4aXN0ICYg
aXQncyB2YWxpZCwgYWRkIGl0IHRvIHRoZSBjdXJyZW50IG1hcAorCisgICAgaWYgKGNhbmRpZGF0
ZUNvb2tpZS0+aGFzRXhwaXJlZCgpIHx8IGNhbmRpZGF0ZUNvb2tpZS0+aXNGb3JjZUV4cGlyZWQo
KSkgeworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGdldEJhY2tpbmdTdG9yZUNvb2tpZXMo
KSB0byBjYXRjaCBleHBpcmVkIGNvb2tpZXMKKyAgICAgICAgaWYgKHBvc3RUb0JhY2tpbmdTdG9y
ZSA9PSBCYWNraW5nU3RvcmVDb29raWVFbnRyeSkKKyAgICAgICAgICAgIG1fY29va2llQmFja2lu
Z1N0b3JlLT5yZW1vdmUoY2FuZGlkYXRlQ29va2llKTsKKyAgICAgICAgZWxzZSBpZiAoY3VyTWFw
KSB7CisgICAgICAgICAgICBib29sIGNvb2tpZUFscmVhZHlFeGlzdHMgPSBjdXJNYXAtPmV4aXN0
c0Nvb2tpZShjYW5kaWRhdGVDb29raWUpOworICAgICAgICAgICAgaWYgKGNvb2tpZUFscmVhZHlF
eGlzdHMpIHsKKyAgICAgICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBleHBp
cmVkIGNvb2tpZSBleGlzdHMgaW4gbWVtb3J5Iik7CisgICAgICAgICAgICAgICAgUGFyc2VkQ29v
a2llKiBleHBpcmVkID0gY3VyTWFwLT5yZW1vdmVDb29raWUoY2FuZGlkYXRlQ29va2llKTsKKyAg
ICAgICAgICAgICAgICAvLyBDb29raWUgaXMgdXNlbGVzcywgUmVtb3ZlIHRoZSBjb29raWUgZnJv
bSB0aGUgYmFja2luZ3N0b3JlIGlmIGl0IGV4aXN0cworICAgICAgICAgICAgICAgIC8vIEJhY2t1
cCBjaGVjayBmb3IgQmFja2luZ1N0b3JlQ29va2llRW50cnkgaW5jYXNlIHNvbWVvbmUgaW5jb3Jy
ZWN0bHkgdXNlcyB0aGlzIGVudW0KKyAgICAgICAgICAgICAgICBpZiAocG9zdFRvQmFja2luZ1N0
b3JlICE9IEJhY2tpbmdTdG9yZUNvb2tpZUVudHJ5ICYmICFleHBpcmVkLT5pc1Nlc3Npb24oKSkg
eworICAgICAgICAgICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBleHBpcmVk
IGNvb2tpZSBpcyBub25zZXNzaW9uLCBkZWxldGluZyBmcm9tIGRiIik7CisgICAgICAgICAgICAg
ICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5yZW1vdmUoZXhwaXJlZCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBleHBpcmVkOworICAgICAgICAgICAgfQor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRlbGV0ZSBjYW5kaWRhdGVDb29raWU7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKGN1ck1hcCk7CisgICAgICAgIGJvb2wgY29va2llQWxy
ZWFkeUV4aXN0cyA9IGN1ck1hcC0+ZXhpc3RzQ29va2llKGNhbmRpZGF0ZUNvb2tpZSk7CisgICAg
ICAgIGlmIChjb29raWVBbHJlYWR5RXhpc3RzKQorICAgICAgICAgICAgdXBkYXRlKGN1ck1hcCwg
Y2FuZGlkYXRlQ29va2llLCBwb3N0VG9CYWNraW5nU3RvcmUpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBhZGRDb29raWVUb01hcChjdXJNYXAsIGNhbmRpZGF0ZUNvb2tpZSwgcG9zdFRvQmFj
a2luZ1N0b3JlKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6YWRkQ29va2llVG9N
YXAoQ29va2llTWFwKiB0YXJnZXRNYXAsIFBhcnNlZENvb2tpZSogY2FuZGlkYXRlQ29va2llLCBC
YWNraW5nU3RvcmVSZW1vdmFsUG9saWN5IHBvc3RUb0JhY2tpbmdTdG9yZSkKK3sKKyAgICBQYXJz
ZWRDb29raWUqIG9sZGVzdENvb2tpZSA9IDA7CisgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBub3Qg
cmVhY2hlZCB0aGUgcGVyIGNvb2tpZSBkb21haW4gbGltaXQuCisgICAgLy8gSWYgdGhhdCBpcyBu
b3QgdHJ1ZSwgd2UgY2hlY2sgaWYgdGhlIGdsb2JhbCBsaW1pdCBoYXMgYmVlbiByZWFjaGVkIGlm
IGJhY2tpbmdzdG9yZSBtb2RlIGlzIG9uCisgICAgLy8gVHdvIHBvaW50czoKKyAgICAvLyAxKSBX
ZSBvbmx5IGRvIGEgZ2xvYmFsIGNoZWNrIGlmIGJhY2tpbmdzdG9yZSBtb2RlIGlzIG9uIGJlY2F1
c2UgdGhlIGdsb2JhbCBjb29raWUgbGltaXQgb25seQorICAgIC8vICAgIGNvdW50cyBzZXNzaW9u
IGNvb2tpZXMgdGhhdCBhcmUgc2F2ZWQgaW4gdGhlIGRhdGFiYXNlLiBJZiB0aGUgdXNlciBnb2Vz
IG92ZXIgdGhlIGxpbWl0CisgICAgLy8gICAgd2hlbiB0aGV5IGFyZSBpbiBwcml2YXRlIG1vZGUs
IHdlIGtub3cgdGhhdCB0aGUgdG90YWwgY29va2llIGxpbWl0IHdpbGwgYmUgdW5kZXIgdGhlIGxp
bWl0CisgICAgLy8gICAgb25jZSB0aGUgdXNlciBnb2VzIGJhY2sgdG8gbm9ybWFsIG1vZGUgKG1l
bW9yeSBkZWxldGVkIGFuZCByZWxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZSkKKyAgICAvLyAyKSBX
ZSB1c2UgZWxzZSBpZiBmb3IgdGhpcyBzdGF0ZW1lbnQgYmVjYXVzZSBpZiB3ZSByZW1vdmUgYSBj
b29raWUgaW4gdGhlIDFzdCBzdGF0ZW1lbnQKKyAgICAvLyAgICB0aGVuIGl0IG1lYW5zIHRoZSBn
bG9iYWwgY291bnQgd2lsbCBuZXZlciBleGNlZWQgdGhlIGxpbWl0CisKKyAgICBDb29raWVMaW1p
dExvZygiQ29va2llTWFuYWdlciAtIGxvY2FsIGNvdW50OiAlZCAgZ2xvYmFsIGNvdW50OiAlZCIs
IHRhcmdldE1hcC0+Y291bnQoKSwgbV9jb3VudCk7CisgICAgaWYgKHRhcmdldE1hcC0+Y291bnQo
KSA+PSBzX21heENvb2tpZUNvdW50UGVySG9zdCkgeworICAgICAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBkZWxldGluZyBvbGRlc3QgY29va2llIGZyb20gdGhpcyBtYXAgZHVlIHRvIGRv
bWFpbiBjb3VudC5cbiIpOworICAgICAgICBvbGRlc3RDb29raWUgPSB0YXJnZXRNYXAtPnJlbW92
ZU9sZGVzdENvb2tpZSgpOworICAgIH0gZWxzZSBpZiAobV9jb3VudCA+PSBzX2dsb2JhbE1heENv
b2tpZUNvdW50ICYmIChwb3N0VG9CYWNraW5nU3RvcmUgIT0gRG9Ob3RSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlKSkgeworICAgICAgICAgICAgQ29va2llTGltaXRMb2coIkNvb2tpZU1hbmFnZXIgLSBH
bG9iYWwgbGltaXQgcmVhY2hlZCwgaW5pdGlhdGUgY29va2llIGxpbWl0IGNsZWFuIHVwLiIpOwor
ICAgICAgICAgICAgaW5pdGlhdGVDb29raWVMaW1pdENsZWFuVXAoKTsKKyAgICB9CisKKyAgICBD
b29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBhZGRpbmcgbmV3IGNvb2tpZSAtICVzLlxuIiwgY2Fu
ZGlkYXRlQ29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgdGFyZ2V0TWFw
LT5hZGRDb29raWUoY2FuZGlkYXRlQ29va2llKTsKKworICAgIC8vIE9ubHkgYWRkIG5vbiBzZXNz
aW9uIGNvb2tpZSB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgICBpZiAocG9zdFRvQmFja2luZ1N0
b3JlID09IFJlbW92ZUZyb21CYWNraW5nU3RvcmUpIHsKKyAgICAgICAgaWYgKG9sZGVzdENvb2tp
ZSAmJiAhb2xkZXN0Q29va2llLT5pc1Nlc3Npb24oKSkgeworICAgICAgICAgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gb2xkZXN0Q29va2llIGV4aXN0cywgZGVsZXRpbmcgaXQgZnJvbSBi
YWNraW5nc3RvcmUgYW5kIGRlc3RydWN0aW5nLlxuIik7CisgICAgICAgICAgICBtX2Nvb2tpZUJh
Y2tpbmdTdG9yZS0+cmVtb3ZlKG9sZGVzdENvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KCFjYW5kaWRhdGVDb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAgICAgICAgbV9jb29raWVCYWNr
aW5nU3RvcmUtPmluc2VydChjYW5kaWRhdGVDb29raWUpOworICAgIH0KKyAgICBpZiAob2xkZXN0
Q29va2llKQorICAgICAgICBkZWxldGUgb2xkZXN0Q29va2llOworfQorCit2b2lkIENvb2tpZU1h
bmFnZXI6OnVwZGF0ZShDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBuZXdDb29r
aWUsIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRvQmFja2luZ1N0b3JlKQoreworICAg
IC8vIElmIG9sZCBjb29raWUgaXMgbm9uLXNlc3Npb24gYW5kIG5ldyBvbmUgaXMsIHdlIGhhdmUg
dG8gZGVsZXRlIGl0IGZyb20gYmFja2luZ3N0b3JlCisgICAgLy8gSWYgbmV3IGNvb2tpZSBpcyBu
b24tc2Vzc2lvbiBhbmQgb2xkIG9uZSBpcywgd2UgaGF2ZSB0byBhZGQgaXQgdG8gYmFja2luZ3N0
b3JlCisgICAgLy8gSWYgYm90aCBzZXNzaW9ucyBhcmUgbm9uLXNlc3Npb24sIHRoZW4gd2UgdXBk
YXRlIGl0IGluIHRoZSBiYWNraW5nc3RvcmUKKworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdl
ciAtIHVwZGF0aW5nIG5ldyBjb29raWUgLSAlcy5cbiIsIG5ld0Nvb2tpZS0+dG9TdHJpbmcoKS51
dGY4KCkuZGF0YSgpKTsKKworICAgIFBhcnNlZENvb2tpZSogb2xkQ29va2llID0gdGFyZ2V0TWFw
LT51cGRhdGVDb29raWUobmV3Q29va2llKTsKKworICAgIEFTU0VSVChvbGRDb29raWUpOworCisg
ICAgYm9vbCBuZXdJc1Nlc3Npb24gPSBuZXdDb29raWUtPmlzU2Vzc2lvbigpOworICAgIGJvb2wg
b2xkSXNTZXNzaW9uID0gb2xkQ29va2llLT5pc1Nlc3Npb24oKTsKKworICAgIGlmIChwb3N0VG9C
YWNraW5nU3RvcmUgPT0gUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSkgeworICAgICAgICBpZiAoIW5l
d0lzU2Vzc2lvbiAmJiAhb2xkSXNTZXNzaW9uKQorICAgICAgICAgICAgbV9jb29raWVCYWNraW5n
U3RvcmUtPnVwZGF0ZShuZXdDb29raWUpOworICAgICAgICBlbHNlIGlmIChuZXdJc1Nlc3Npb24g
JiYgIW9sZElzU2Vzc2lvbikgeworICAgICAgICAgICAgLy8gTXVzdCBtYW51YWxseSBkZWNyZWFz
ZSB0aGUgY291bnRlciBiZWNhdXNlIGl0IHdhcyBub3QgY291bnRlZCB3aGVuCisgICAgICAgICAg
ICAvLyB0aGUgY29va2llIHdhcyByZW1vdmVkIGluIGNvb2tpZU1hcC4KKyAgICAgICAgICAgIHJl
bW92ZWRDb29raWUoKTsKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5yZW1vdmUo
b2xkQ29va2llKTsKKyAgICAgICAgfSBlbHNlIGlmICghbmV3SXNTZXNzaW9uICYmIG9sZElzU2Vz
c2lvbikgeworICAgICAgICAgICAgLy8gTXVzdCBtYW51YWxseSBpbmNyZWFzZSB0aGUgY291bnRl
ciBiZWNhdXNlIGl0IHdhcyBub3QgY291bnRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgY29v
a2llIHdhcyBhZGRlZCBpbiBjb29raWVNYXAuCisgICAgICAgICAgICBhZGRlZENvb2tpZSgpOwor
ICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmluc2VydChuZXdDb29raWUpOworICAg
ICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBvbGRDb29raWU7Cit9CisKK3ZvaWQgQ29va2llTWFu
YWdlcjo6Z2V0QmFja2luZ1N0b3JlQ29va2llcygpCit7CisgICAgLy8gVGhpcyBtZXRob2Qgc2hv
dWxkIGJlIGNhbGxlZCBqdXN0IGFmdGVyIGhhdmluZyBjcmVhdGVkIHRoZSBjb29raWVNYW5hZ2Vy
CisgICAgLy8gTkVWRVIgYWZ0ZXJ3YXJkcyEKKyAgICBBU1NFUlQoIW1fY291bnQpOworCisgICAg
VmVjdG9yPFBhcnNlZENvb2tpZSo+IGNvb2tpZXM7CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUt
PmdldENvb2tpZXNGcm9tRGF0YWJhc2UoY29va2llcyk7CisgICAgQ29va2llTG9nKCJDb29raWVN
YW5hZ2VyIC0gQmFja2luZ3N0b3JlIGhhcyAlZCBjb29raWVzLCBsb2FkaW5nIHRoZW0gaW4gbWVt
b3J5IG5vdyIsIGNvb2tpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNv
b2tpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBj
b29raWVzW2ldOworICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKG5ld0Nvb2tpZSwgQmFja2lu
Z1N0b3JlQ29va2llRW50cnkpOworICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRQ
cml2YXRlTW9kZShjb25zdCBib29sIG1vZGUpCit7CisgICAgaWYgKG1fcHJpdmF0ZU1vZGUgPT0g
bW9kZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlTW9kZSA9IG1vZGU7CisgICAg
aWYgKCFtb2RlKSB7CisgICAgICAgIHJlbW92ZUFsbENvb2tpZXMoRG9Ob3RSZW1vdmVGcm9tQmFj
a2luZ1N0b3JlKTsKKyAgICAgICAgZ2V0QmFja2luZ1N0b3JlQ29va2llcygpOworICAgIH0KK30K
KworQ29va2llTWFwKiBDb29raWVNYW5hZ2VyOjpmaW5kT3JDcmVhdGVDb29raWVNYXAoQ29va2ll
TWFwKiBwcm90b2NvbE1hcCwgY29uc3QgU3RyaW5nJiBkb21haW4sIGJvb2wgZmluZE9ubHkpCit7
CisgICAgLy8gRXhwbG9kZSB0aGUgZG9tYWluIHdpdGggdGhlICcuJyBkZWxpbWl0ZXIKKyAgICBW
ZWN0b3I8U3RyaW5nPiBkZWxpbWl0ZWRIb3N0OworICAgIGRvbWFpbi5zcGxpdCgiLiIsIGRlbGlt
aXRlZEhvc3QpOworCisgICAgQ29va2llTWFwKiBjdXJNYXAgPSBwcm90b2NvbE1hcDsKKyAgICBz
aXplX3QgaG9zdFNpemUgPSBkZWxpbWl0ZWRIb3N0LnNpemUoKTsKKworICAgIENvb2tpZUxvZygi
Q29va2llTWFuYWdlciAtIGxvb2tpbmcgYXQgcHJvdG9jb2wgbWFwICVzIFxuIiwgcHJvdG9jb2xN
YXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIC8vIEZpbmQgJiBjcmVhdGUgbmVj
ZXNzYXJ5IENvb2tpZU1hcHMgYnkgdHJhdmVyc2luZyBkb3duIHRoZSBkb21haW4gdHJlZQorICAg
IC8vIEVhY2ggQ29va2llTWFwIHJlcHJlc2VudCBhIHN1YnNlY3Rpb24gb2YgdGhlIGRvbWFpbiwg
ZGVsaW1pdGVkIGJ5ICIuIgorICAgIGludCBpID0gaG9zdFNpemUgLSAxOworICAgIHdoaWxlIChp
ID49IDApIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZmluZGluZyAlcyBp
biBjdXJyZW50bWFwXG4iLCBkZWxpbWl0ZWRIb3N0W2ldLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICBDb29raWVNYXAqIG5leHRNYXAgPSBjdXJNYXAtPmdldFN1YmRvbWFpbk1hcChkZWxpbWl0ZWRI
b3N0W2ldKTsKKyAgICAgICAgaWYgKCFuZXh0TWFwKSB7CisgICAgICAgICAgICBDb29raWVMb2co
IkNvb2tpZU1hbmFnZXIgLSBjYW5ub3QgZmluZCBtYXBcbiIpOworICAgICAgICAgICAgaWYgKGZp
bmRPbmx5KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gY3JlYXRpbmcgJXMgaW4gY3VycmVudG1hcCAlc1xuIiwgZGVsaW1p
dGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpLCBjdXJNYXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIG5leHRNYXAgPSBuZXcgQ29va2llTWFwKGRlbGltaXRlZEhvc3RbaV0p
OworICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gYWRkaW5nIHN1YmRvbWFp
biB0byBtYXBcbiIpOworICAgICAgICAgICAgY3VyTWFwLT5hZGRTdWJkb21haW5NYXAoZGVsaW1p
dGVkSG9zdFtpXSwgbmV4dE1hcCk7CisgICAgICAgIH0KKyAgICAgICAgY3VyTWFwID0gbmV4dE1h
cDsKKyAgICAgICAgaS0tOworICAgIH0KKyAgICByZXR1cm4gY3VyTWFwOworfQorCisKK3ZvaWQg
Q29va2llTWFuYWdlcjo6cmVtb3ZlQ29va2llV2l0aE5hbWUoY29uc3QgS1VSTCYgdXJsLCBjb25z
dCBTdHJpbmcmIGNvb2tpZU5hbWUpCit7CisgICAgLy8gV2UgZ2V0IGFsbCBjb29raWVzIGZyb20g
YWxsIGRvbWFpbnMgdGhhdCBkb21haW4gbWF0Y2hlcyB0aGUgcmVxdWVzdCBkb21haW4KKyAgICAv
LyBhbmQgZGVsZXRlIGFueSBjb29raWVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRoYXQgcGF0
aCBtYXRjaGVzIHRoZSByZXF1ZXN0IHBhdGgKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4gcmVz
dWx0czsKKyAgICBnZXRSYXdDb29raWVzKHJlc3VsdHMsIHVybCwgV2l0aEh0dHBPbmx5Q29va2ll
cyk7CisgICAgLy8gRGVsZXRlIHRoZSBjb29raWVzIHRoYXQgcGF0aCBtYXRjaGVzIHRoZSByZXF1
ZXN0IHBhdGgKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKysp
IHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUgPSByZXN1bHRzW2ldOworICAgICAgICBp
ZiAoIWVxdWFsSWdub3JpbmdDYXNlKGNvb2tpZS0+bmFtZSgpLCBjb29raWVOYW1lKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodXJsLnBhdGgoKS5zdGFydHNXaXRoKGNvb2tp
ZS0+cGF0aCgpLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGNvb2tpZS0+Zm9yY2VFeHBpcmUoKTsK
KyAgICAgICAgICAgIGNoZWNrQW5kVHJlYXRDb29raWUoY29va2llLCBSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjppbml0
aWF0ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpCit7CisgICAgaWYgKCFtX2xpbWl0VGltZXIuaXNBY3Rp
dmUoKSkgeworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBTdGFydGluZyBhIHRp
bWVyIGZvciBjb29raWUgY2xlYW51cCIpOworICAgICAgICBtX2xpbWl0VGltZXIuc3RhcnRPbmVT
aG90KHNfZGVsYXlUb1N0YXJ0Q29va2llQ2xlYW51cCk7CisgICAgfSBlbHNlIHsKKyNpZiAhTkRF
QlVHCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIENvb2tpZSBjbGVhbnVwIHRp
bWVyIGFscmVhZHkgcnVubmluZyIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIENvb2tpZU1h
bmFnZXI6OmNvb2tpZUxpbWl0Q2xlYW5VcChUaW1lcjxDb29raWVNYW5hZ2VyPiogdGltZXIpCit7
CisgICAgQVNTRVJUX1VOVVNFRCh0aW1lciwgdGltZXIgPT0gJm1fbGltaXRUaW1lcik7CisKKyAg
ICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIFN0YXJ0aW5nIGNvb2tpZSBjbGVhbiB1
cCIpOworCisgICAgc2l6ZV90IG51bWJlck9mQ29va2llc092ZXJMaW1pdCA9IChtX2NvdW50ID4g
c19nbG9iYWxNYXhDb29raWVDb3VudCkgPyBtX2NvdW50IC0gc19nbG9iYWxNYXhDb29raWVDb3Vu
dCA6IDA7CisgICAgc2l6ZV90IGFtb3VudFRvRGVsZXRlID0gc19jb29raWVzVG9EZWxldGVXaGVu
TGltaXRSZWFjaGVkICsgbnVtYmVyT2ZDb29raWVzT3ZlckxpbWl0OworCisgICAgQ29va2llTGlt
aXRMb2coIkNvb2tpZU1hbmFnZXIgLSBFeGNlc3M6ICVkICBBbW91bnQgdG8gRGVsZXRlOiAlZCIs
IG51bWJlck9mQ29va2llc092ZXJMaW1pdCwgYW1vdW50VG9EZWxldGUpOworCisgICAgLy8gQ2Fs
bCB0aGUgZGF0YWJhc2UgdG8gZGVsZXRlICdhbW91bnRUb0RlbGV0ZScgb2YgY29va2llcworICAg
IFZlY3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVzVG9EZWxldGU7CisgICAgY29va2llc1RvRGVs
ZXRlLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoYW1vdW50VG9EZWxldGUpOworCisgICAgQ29va2ll
TGltaXRMb2coIkNvb2tpZU1hbmFnZXIgLSBDYWxsaW5nIGRhdGFiYXNlIHRvIGNsZWFuIHVwIik7
CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmdldENvb2tpZXNGcm9tRGF0YWJhc2UoY29va2ll
c1RvRGVsZXRlLCBhbW91bnRUb0RlbGV0ZSk7CisKKyAgICAvLyBDb29raWVzIGFyZSBvcmRlcmVk
IGluIEFTQyBvcmRlciBieSBsYXN0QWNjZXNzZWQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGFtb3VudFRvRGVsZXRlOyArK2kpIHsKKyAgICAgICAgLy8gRXhwaXJlIHRoZW0gYW5kIGNhbGwg
Y2hlY2thbmR0cmVhdCB0byBkZWxldGUgdGhlbSBmcm9tIG1lbW9yeSBhbmQgZGF0YWJhc2UKKyAg
ICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBjb29raWVzVG9EZWxldGVbaV07CisgICAg
ICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gRXhwaXJlIGNvb2tpZTogJXMgYW5k
IGRlbGV0ZSIsIG5ld0Nvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAg
bmV3Q29va2llLT5mb3JjZUV4cGlyZSgpOworICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKG5l
d0Nvb2tpZSwgUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSk7CisgICAgfQorCisgICAgQ29va2llTGlt
aXRMb2coIkNvb2tpZU1hbmFnZXIgLSBDb29raWUgY2xlYW4gdXAgY29tcGxldGUuIik7Cit9CisK
K3ZvaWQgQ29va2llTWFuYWdlcjo6Zmx1c2hDb29raWVzVG9CYWNraW5nU3RvcmUoKQoreworICAg
IENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlIHN0
YXJ0aW5nLlxuIik7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBzaHV0ZG93biwgc28gd2Ug
bmVlZCB0byBiZSBzdXJlIHRoZSBPUyBkb2Vzbid0IGtpbGwgdXMgYmVmb3JlIHRoZSBkYiB3cml0
ZSBmaW5pc2hlcy4KKyAgICAvLyBPbmNlIHNob3VsZCBiZSBlbm91Z2ggc2luY2UgdGhpcyBleHRl
bmRzIHRlcmltaW5hdGlvbiBieSAyIHNlY29uZHMuCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
Ok5hdmlnYXRvckhhbmRsZXI6OnNlbmRFeHRlbmRUZXJtaW5hdGUoKTsKKyAgICBtX2Nvb2tpZUJh
Y2tpbmdTdG9yZS0+c2VuZENoYW5nZXNUb0RhdGFiYXNlU3luY2hyb25vdXNseSgpOworICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlIGZpbmlz
aGVkLlxuIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTJk
NTkzNjg5MWZlMmNiY2VkZTk5ZjhhMzJkMTViYTdmNDNlNGYzMwotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oCkBAIC0w
LDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEp1bGllbiBDaGFm
ZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEw
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZpbmUgQ29va2llTWFuYWdlcl9oCisKKyNpbmNsdWRl
ICJDb29raWVNYXAuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1l
c3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsKK2NsYXNzIFBhcnNlZENvb2tpZTsKK2Ns
YXNzIEtVUkw7CisKK2VudW0gQmFja2luZ1N0b3JlUmVtb3ZhbFBvbGljeSB7CisgICAgUmVtb3Zl
RnJvbUJhY2tpbmdTdG9yZSwKKyAgICBCYWNraW5nU3RvcmVDb29raWVFbnRyeSwKKyAgICBEb05v
dFJlbW92ZUZyb21CYWNraW5nU3RvcmUKK307CisKK2VudW0gQ29va2llRmlsdGVyIHsKKyAgICBO
b0h0dHBPbmx5Q29va2llLAorICAgIFdpdGhIdHRwT25seUNvb2tpZXMsCit9OworCitlbnVtIENv
b2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kgeworICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lB
bHdheXMgPSAwLAorICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lOZXZlciwKKyAgICBDb29r
aWVTdG9yYWdlQWNjZXB0UG9saWN5T25seUZyb21NYWluRG9jdW1lbnREb21haW4KK307CisKKy8q
CisgICogVGhlIENvb2tpZU1hbmFnZXIgY2xhc3MgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBo
YW5kbGVzIGFuZCBzZWxlY3RpdmVseSBwZXJzaXN0cworICAqIGluY29taW5nIGNvb2tpZXMuIFRo
aXMgY2xhc3MgY29udGFpbnMgYSB0cmVlIG9mIGRvbWFpbnMgZm9yIHF1aWNrZXIKKyAgKiBjb29r
aWUgZG9tYWluIGxvb2t1cC4gVGhlIHRvcCBvZiB0aGUgdHJlZSByZXByZXNlbnRzIGEgbnVsbCB2
YWx1ZSBmb3IgYSBudWxsIGRvbWFpbi4KKyAgKiBUaGUgbnVsbCBkb21haW4gY29udGFpbnMgcmVm
ZXJlbmNlcyB0byB0b3AgbGV2ZWwgZG9tYWlucyBhbmQgZWFjaCBub2RlIGJlbG93CisgICogcmVw
cmVzZW50cyBhIHN1Yi1zZWN0aW9uIG9mIGEgZG9tYWluLCBkZWxpbWl0ZWQgYnkgIi4iCisgICoK
KyAgKiBJZiBhIGNvb2tpZSBoYXMgYSBkb21haW4gImEuYi5jb20iLCBpdCB3aWxsIGJlIHN0b3Jl
ZCBpbiB0aGUgbm9kZSBuYW1lZCAiYSIgaW4gdGhpcyB0cmVlLgorICAqIGluIHRoZSBicmFuY2gg
IiItPiJjb20iLT4iYiItPiJhIgorICAqCisgICogQ29va2llIHNwZWNzIGZvbGxvdyB0aGUgUkZD
IDYyNjUgc3BlYyBzaGVldC4KKyAgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1
CisgICovCisKK2NsYXNzIENvb2tpZU1hbmFnZXI6IHB1YmxpYyBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3VhcmRlZFBvaW50ZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBib29sIGNhbkxvY2FsQWNjZXNz
QWxsQ29va2llcygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRHVtcEFsbENvb2tpZXM7IH0KKyAg
ICB2b2lkIHNldENhbkxvY2FsQWNjZXNzQWxsQ29va2llcyhib29sIGVuYWJsZWQpIHsgbV9zaG91
bGREdW1wQWxsQ29va2llcyA9IGVuYWJsZWQ7IH0KKworICAgIHZvaWQgc2V0Q29va2llcyhjb25z
dCBLVVJMJiwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisKKyAgICB2b2lkIHJlbW92ZUFsbENvb2tp
ZXMoQmFja2luZ1N0b3JlUmVtb3ZhbFBvbGljeSk7CisgICAgdm9pZCByZW1vdmVDb29raWVXaXRo
TmFtZShjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiBjb29raWVOYW1lKTsKKworICAgIHVuc2ln
bmVkIHNob3J0IGNvb2tpZXNDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY291bnQ7IH0KKworICAg
IHZvaWQgc2V0Q29va2llSmFyKGNvbnN0IGNoYXIqKTsKKyAgICBjb25zdCBTdHJpbmcmIGNvb2tp
ZUphcigpIGNvbnN0IHsgcmV0dXJuIG1fY29va2llSmFyRmlsZU5hbWU7IH0KKworICAgIC8vIENv
dW50IHVwZGF0ZSBtZXRob2QKKyAgICB2b2lkIHJlbW92ZWRDb29raWUoKQorICAgIHsKKyAgICAg
ICAgQVNTRVJUKG1fY291bnQgPiAwKTsKKyAgICAgICAgLS1tX2NvdW50OworICAgIH0KKyAgICB2
b2lkIGFkZGVkQ29va2llKCkgeyArK21fY291bnQ7IH0KKworICAgIC8vIENvbnN0YW50cyBnZXR0
ZXIuCisgICAgc3RhdGljIHVuc2lnbmVkIG1heENvb2tpZUxlbmd0aCgpIHsgcmV0dXJuIHNfbWF4
Q29va2llTGVuZ3RoOyB9CisKKyAgICB2b2lkIHNldENvb2tpZVBvbGljeShDb29raWVTdG9yYWdl
QWNjZXB0UG9saWN5IHBvbGljeSkgeyBtX3BvbGljeSA9IHBvbGljeTsgfQorICAgIENvb2tpZVN0
b3JhZ2VBY2NlcHRQb2xpY3kgY29va2llUG9saWN5KCkgY29uc3QgeyByZXR1cm4gbV9wb2xpY3k7
IH0KKyAgICB2b2lkIHNldFByaXZhdGVNb2RlKGNvbnN0IGJvb2wpOworCisgICAgU3RyaW5nIGdl
dENvb2tpZShjb25zdCBLVVJMJiByZXF1ZXN0VVJMLCBDb29raWVGaWx0ZXIpIGNvbnN0OworCisg
ICAgLy8gUmV0dXJucyBhbGwgY29va2llcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNw
ZWNpZmllZCBVUkwgYXMgcmF3IGNvb2tpZXMuCisgICAgdm9pZCBnZXRSYXdDb29raWVzKFZlY3Rv
cjxQYXJzZWRDb29raWUqPiYgc3RhY2tPZkNvb2tpZXMsIGNvbnN0IEtVUkwmIHJlcXVlc3RVUkws
IENvb2tpZUZpbHRlciA9IFdpdGhIdHRwT25seUNvb2tpZXMpIGNvbnN0OworCisgICAgdm9pZCBm
bHVzaENvb2tpZXNUb0JhY2tpbmdTdG9yZSgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBDb29r
aWVNYW5hZ2VyJiBjb29raWVNYW5hZ2VyKCk7CisKKyAgICBDb29raWVNYW5hZ2VyKCk7CisgICAg
fkNvb2tpZU1hbmFnZXIoKTsKKworICAgIHZvaWQgY2hlY2tBbmRUcmVhdENvb2tpZShQYXJzZWRD
b29raWUqLCBCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5KTsKKworICAgIGJvb2wgc2hvdWxkUmVq
ZWN0Rm9yU2VjdXJpdHlSZWFzb24oY29uc3QgUGFyc2VkQ29va2llKiwgY29uc3QgS1VSTCYpOwor
CisgICAgdm9pZCBhZGRDb29raWVUb01hcChDb29raWVNYXAqLCBQYXJzZWRDb29raWUqLCBCYWNr
aW5nU3RvcmVSZW1vdmFsUG9saWN5KTsKKyAgICB2b2lkIHVwZGF0ZShDb29raWVNYXAqLCBQYXJz
ZWRDb29raWUqLCBCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5KTsKKworICAgIENvb2tpZU1hcCog
ZmluZE9yQ3JlYXRlQ29va2llTWFwKENvb2tpZU1hcCogcHJvdG9jb2xNYXAsIGNvbnN0IFN0cmlu
ZyYgZG9tYWluLCBib29sIGZpbmRPbmx5KTsKKworICAgIHZvaWQgaW5pdGlhdGVDb29raWVMaW1p
dENsZWFuVXAoKTsKKyAgICB2b2lkIGNvb2tpZUxpbWl0Q2xlYW5VcChUaW1lcjxDb29raWVNYW5h
Z2VyPiopOworCisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+IG1fbWFuYWdlck1hcDsK
KworICAgIHVuc2lnbmVkIHNob3J0IG1fY291bnQ7CisKKyAgICBib29sIG1fcHJpdmF0ZU1vZGU7
CisgICAgYm9vbCBtX3Nob3VsZER1bXBBbGxDb29raWVzOworCisgICAgU3RyaW5nIG1fY29va2ll
SmFyRmlsZU5hbWU7CisKKyAgICAvLyBGSVhNRTogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlbW92
ZWQuCisgICAgdm9pZCBnZXRCYWNraW5nU3RvcmVDb29raWVzKCk7CisKKyAgICAvLyBNYXggY291
bnQgY29uc3RhbnRzLgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX2dsb2JhbE1heENvb2tp
ZUNvdW50ID0gNjAwMDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc19tYXhDb29raWVDb3Vu
dFBlckhvc3QgPSA2MDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc19jb29raWVzVG9EZWxl
dGVXaGVuTGltaXRSZWFjaGVkID0gNjA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfZGVs
YXlUb1N0YXJ0Q29va2llQ2xlYW51cCA9IDEwOworCisgICAgLy8gQ29va2llcyBoYXZlIGEgc2l6
ZSBsaW1pdCBvZiA0a0IgYXMgYWR2aXNlZCBwZXIgUkZDIDIxMDkuCisgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIHNfbWF4Q29va2llTGVuZ3RoID0gNDA5NjsKKworICAgIENvb2tpZVN0b3JhZ2VB
Y2NlcHRQb2xpY3kgbV9wb2xpY3k7CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSog
bV9jb29raWVCYWNraW5nU3RvcmU7CisgICAgVGltZXI8Q29va2llTWFuYWdlcj4gbV9saW1pdFRp
bWVyOworCit9OworCisvLyBHZXQgdGhlIGdsb2JhbCBpbnN0YW5jZS4KK0Nvb2tpZU1hbmFnZXIm
IGNvb2tpZU1hbmFnZXIoKTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
Q29va2llTWFuYWdlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFj
a2JlcnJ5L0Nvb2tpZU1hcC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5
L0Nvb2tpZU1hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjE0MWI3ODgxMzMxNTkzZDk1YjkzM2M3MGY5ZDY2
MTFiMmE1MmZjZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Js
YWNrYmVycnkvQ29va2llTWFwLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWls
LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgRU5BQkxFX0NPT0tJRV9ERUJVRyAwCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29raWVNYXAuaCIKKworI2luY2x1ZGUg
IkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2Vk
Q29va2llLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCisjaWYgRU5BQkxFX0NP
T0tJRV9ERUJVRworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxvZy5oPgorI2RlZmluZSBD
b29raWVMb2coZm9ybWF0LCAuLi4pIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2dBbHdheXMoQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykK
KyNlbHNlCisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikKKyNlbmRpZiAvLyBFTkFCTEVf
Q09PS0lFX0RFQlVHCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29va2llTWFwOjpDb29raWVN
YXAoY29uc3QgU3RyaW5nJiBuYW1lKQorICAgIDogbV9vbGRlc3RDb29raWUoMCkKKyAgICAsIG1f
bmFtZShuYW1lKQoreworfQorCitDb29raWVNYXA6On5Db29raWVNYXAoKQoreworICAgIC8vIFRo
ZXJlIGlzIG5vIG5lZWQgdG8gZGVsZXRlIG1fb2xkZXN0Q29va2llIGFzIGl0IGlzIGhhbmRsZWQg
aW4gZGVsZXRpbmcgbV9jb29raWVNYXAKKyAgICBkZWxldGVBbGxWYWx1ZXMobV9jb29raWVNYXAp
OworICAgIG1fY29va2llTWFwLmNsZWFyKCk7CisgICAgZGVsZXRlQWxsVmFsdWVzKG1fc3ViZG9t
YWlucyk7CisgICAgbV9zdWJkb21haW5zLmNsZWFyKCk7Cit9CisKK2Jvb2wgQ29va2llTWFwOjpl
eGlzdHNDb29raWUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpIGNvbnN0Cit7CisgICAgU3Ry
aW5nIGtleSA9IGNvb2tpZS0+bmFtZSgpICsgY29va2llLT5wYXRoKCk7CisgICAgcmV0dXJuIG1f
Y29va2llTWFwLmNvbnRhaW5zKGtleSk7Cit9CisKK3ZvaWQgQ29va2llTWFwOjphZGRDb29raWUo
UGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgU3RyaW5nIGtleSA9IGNvb2tpZS0+bmFtZSgp
ICsgY29va2llLT5wYXRoKCk7CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVtcHRp
bmcgdG8gYWRkIGNvb2tpZSAtICVzIiwgY29va2llLT5uYW1lKCkudXRmOCgpLmRhdGEoKSk7CisK
KyAgICBBU1NFUlQoIW1fY29va2llTWFwLmNvbnRhaW5zKGtleSkpOworICAgIG1fY29va2llTWFw
LmFkZChrZXksIGNvb2tpZSk7CisgICAgaWYgKCFjb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAg
ICBjb29raWVNYW5hZ2VyKCkuYWRkZWRDb29raWUoKTsKKyAgICBpZiAoIW1fb2xkZXN0Q29va2ll
IHx8IG1fb2xkZXN0Q29va2llLT5sYXN0QWNjZXNzZWQoKSA+IGNvb2tpZS0+bGFzdEFjY2Vzc2Vk
KCkpCisgICAgICAgIG1fb2xkZXN0Q29va2llID0gY29va2llOworfQorCitQYXJzZWRDb29raWUq
IENvb2tpZU1hcDo6dXBkYXRlQ29va2llKFBhcnNlZENvb2tpZSogbmV3Q29va2llKQoreworICAg
IFN0cmluZyBrZXkgPSBuZXdDb29raWUtPm5hbWUoKSArIG5ld0Nvb2tpZS0+cGF0aCgpOworICAg
IFBhcnNlZENvb2tpZSogb2xkQ29va2llID0gbV9jb29raWVNYXAudGFrZShrZXkpOworICAgIEFT
U0VSVChvbGRDb29raWUpOworICAgIG1fY29va2llTWFwLmFkZChrZXksIG5ld0Nvb2tpZSk7Cisg
ICAgaWYgKG9sZENvb2tpZSA9PSBtX29sZGVzdENvb2tpZSkKKyAgICAgICAgdXBkYXRlT2xkZXN0
Q29va2llKCk7CisgICAgcmV0dXJuIG9sZENvb2tpZTsKK30KKworUGFyc2VkQ29va2llKiBDb29r
aWVNYXA6OnJlbW92ZUNvb2tpZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICAv
LyBGaW5kIGEgcHJldmlvdXMgZW50cnkgZm9yIGRlbGV0aW9uCisgICAgU3RyaW5nIGtleSA9IGNv
b2tpZS0+bmFtZSgpICsgY29va2llLT5wYXRoKCk7CisgICAgUGFyc2VkQ29va2llKiBwcmV2Q29v
a2llID0gbV9jb29raWVNYXAudGFrZShrZXkpOworCisgICAgaWYgKCFwcmV2Q29va2llKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGlmIChwcmV2Q29va2llID09IG1fb2xkZXN0Q29va2llKQor
ICAgICAgICB1cGRhdGVPbGRlc3RDb29raWUoKTsKKyAgICBlbHNlIGlmIChwcmV2Q29va2llICE9
IGNvb2tpZSkgeworICAgICAgICAvLyBUaGUgY29va2llIHdlIHVzZWQgdG8gc2VhcmNoIGlzIGZv
cmNlIGV4cGlyZWQsIHdlIG11c3QgZG8gdGhlIHNhbWUKKyAgICAgICAgLy8gdG8gdGhlIGNvb2tp
ZSBpbiBtZW1vcnkgdG9vLgorICAgICAgICBpZiAoY29va2llLT5pc0ZvcmNlRXhwaXJlZCgpKQor
ICAgICAgICAgICAgcHJldkNvb2tpZS0+Zm9yY2VFeHBpcmUoKTsKKyAgICAgICAgZGVsZXRlIGNv
b2tpZTsKKyAgICB9CisKKyAgICBpZiAoIXByZXZDb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAg
ICBjb29raWVNYW5hZ2VyKCkucmVtb3ZlZENvb2tpZSgpOworICAgIHJldHVybiBwcmV2Q29va2ll
OworfQorCitDb29raWVNYXAqIENvb2tpZU1hcDo6Z2V0U3ViZG9tYWluTWFwKGNvbnN0IFN0cmlu
ZyYgc3ViZG9tYWluKQoreworI2lmIEVOQUJMRV9DT09LSUVfREVCVUcKKyAgICBpZiAoIW1fc3Vi
ZG9tYWlucy5jb250YWlucyhzdWJkb21haW4pKQorICAgICAgICBDb29raWVMb2coIkNvb2tpZU1h
cCAtICVzIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgbWFwIiwgc3ViZG9tYWluLnV0ZjgoKS5kYXRh
KCkpOworI2VuZGlmCisgICAgcmV0dXJuIG1fc3ViZG9tYWlucy5nZXQoc3ViZG9tYWluKTsKK30K
Kwordm9pZCBDb29raWVNYXA6OmFkZFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmIHN1YmRvbWFp
biwgQ29va2llTWFwKiBuZXdEb21haW4pCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSBB
dHRlbXB0aW5nIHRvIGFkZCBzdWJkb21haW4gLSAlcyIsIHN1YmRvbWFpbi51dGY4KCkuZGF0YSgp
KTsKKyAgICBtX3N1YmRvbWFpbnMuYWRkKHN1YmRvbWFpbiwgbmV3RG9tYWluKTsKK30KKwordm9p
ZCBDb29raWVNYXA6OmdldEFsbENvb2tpZXMoVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBzdGFja09m
Q29va2llcykKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVtcHRpbmcgdG8gY29w
eSBNYXA6JXMgY29va2llcyB3aXRoICVkIGNvb2tpZXMgaW50byB2ZWN0b3JzIiwgbV9uYW1lLnV0
ZjgoKS5kYXRhKCksIG1fY29va2llTWFwLnNpemUoKSk7CisKKyAgICBWZWN0b3I8UGFyc2VkQ29v
a2llKj4gbmV3Q29va2llczsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9jb29raWVNYXAsIG5l
d0Nvb2tpZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q29va2llcy5zaXplKCk7
IGkrKykgeworICAgICAgICBQYXJzZWRDb29raWUqIG5ld0Nvb2tpZSA9IG5ld0Nvb2tpZXNbaV07
CisgICAgICAgIGlmIChuZXdDb29raWUtPmhhc0V4cGlyZWQoKSkgeworICAgICAgICAgICAgLy8g
Tm90aWNlIHRoYXQgd2UgZG9uJ3QgZGVsZXRlIGZyb20gYmFja2luZ3N0b3JlLiBUaGVzZSBleHBp
cmVkIGNvb2tpZXMgd2lsbCBiZQorICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIG1hbmFnZXIg
bG9hZHMgdGhlIGJhY2tpbmdzdG9yZSBhZ2Fpbi4KKyAgICAgICAgICAgIFBhcnNlZENvb2tpZSog
ZXhwaXJlZCA9IHJlbW92ZUNvb2tpZShuZXdDb29raWUpOworICAgICAgICAgICAgZGVsZXRlIGV4
cGlyZWQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc3RhY2tPZkNvb2tpZXMtPmFwcGVu
ZChuZXdDb29raWUpOworICAgIH0KKworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gc3RhY2sg
b2YgY29va2llcyBub3cgaGF2ZSAlZCBjb29raWVzIGluIGl0IiwgKCpzdGFja09mQ29va2llcyku
c2l6ZSgpKTsKKworfQorCitQYXJzZWRDb29raWUqIENvb2tpZU1hcDo6cmVtb3ZlT2xkZXN0Q29v
a2llKCkKK3sKKyAgICAvLyBGSVhNRTogTWFrZSBzdXJlIGl0IGZpbmRzIHRoZSBHTE9CQUwgb2xk
ZXN0IGNvb2tpZSwgbm90IHRoZSBmaXJzdCBvbGRlc3Rjb29raWUgaXQgZmluZHMuCisgICAgUGFy
c2VkQ29va2llKiBvbGRlc3RDb29raWUgPSBtX29sZGVzdENvb2tpZTsKKworICAgIC8vIElmIHRo
aXMgbWFwIGhhcyBhbiBvbGRlc3RDb29raWUsIHJlbW92ZSBpdC4gSWYgbm90LCBkbyBhIERGUyB0
byBzZWFyY2ggZm9yIGEgY2hpbGQgdGhhdCBkb2VzCisgICAgaWYgKCFvbGRlc3RDb29raWUpIHsK
KworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIG5vIG9sZGVzdENvb2tpZSBleGlzdCIp
OworCisgICAgICAgIC8vIEJhc2UgY2FzZSBpcyBpZiB0aGUgbWFwIGhhcyBubyBjaGlsZCBhbmQg
bm8gY29va2llcywgd2UgcmV0dXJuIGEgbnVsbC4KKyAgICAgICAgaWYgKCFtX3N1YmRvbWFpbnMu
c2l6ZSgpKSB7CisgICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIG5vIHN1YmRvbWFp
bnMsIGJhc2UgY2FzZSByZWFjaGVkLCByZXR1cm4gMCIpOworICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIH0KKworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIGxvb2tpbmcgaW50
byBzdWJkb21haW5zIik7CisKKyAgICAgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFw
Kj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJkb21haW5zLmJlZ2luKCk7IGl0ICE9IG1fc3ViZG9tYWlu
cy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgb2xkZXN0Q29va2llID0gaXQtPnNlY29uZC0+
cmVtb3ZlT2xkZXN0Q29va2llKCk7CisgICAgICAgICAgICBpZiAob2xkZXN0Q29va2llKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ29v
a2llTG9nKCJDb29raWVNYXAgLSBvbGRlc3RDb29raWUgZXhpc3QuIik7CisgICAgICAgIG9sZGVz
dENvb2tpZSA9IHJlbW92ZUNvb2tpZShtX29sZGVzdENvb2tpZSk7CisgICAgfQorCisgICAgcmV0
dXJuIG9sZGVzdENvb2tpZTsKK30KKwordm9pZCBDb29raWVNYXA6OnVwZGF0ZU9sZGVzdENvb2tp
ZSgpCit7CisgICAgaWYgKCFtX2Nvb2tpZU1hcC5zaXplKCkpCisgICAgICAgIG1fb2xkZXN0Q29v
a2llID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFBhcnNlZENvb2tp
ZSo+OjppdGVyYXRvciBpdCA9IG1fY29va2llTWFwLmJlZ2luKCk7CisgICAgICAgIG1fb2xkZXN0
Q29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgKytpdDsKKyAgICAgICAgZm9yICg7IGl0ICE9
IG1fY29va2llTWFwLmVuZCgpOyArK2l0KQorICAgICAgICAgICAgaWYgKG1fb2xkZXN0Q29va2ll
LT5sYXN0QWNjZXNzZWQoKSA+IGl0LT5zZWNvbmQtPmxhc3RBY2Nlc3NlZCgpKQorICAgICAgICAg
ICAgICAgIG1fb2xkZXN0Q29va2llID0gaXQtPnNlY29uZDsKKyAgICB9Cit9CisKK3ZvaWQgQ29v
a2llTWFwOjpkZWxldGVBbGxDb29raWVzQW5kRG9tYWlucygpCit7CisgICAgSGFzaE1hcDxTdHJp
bmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBmaXJzdCA9IG1fc3ViZG9tYWlucy5iZWdpbigpOwor
ICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgZW5kID0gbV9zdWJkb21h
aW5zLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRv
ciBpdCA9IGZpcnN0OyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25k
OworCisgICAgSGFzaE1hcDxTdHJpbmcsIFBhcnNlZENvb2tpZSo+OjppdGVyYXRvciBmaXJzdENv
b2tpZUl0ZXJhdG9yID0gbV9jb29raWVNYXAuYmVnaW4oKTsKKyAgICBIYXNoTWFwPFN0cmluZywg
UGFyc2VkQ29va2llKj46Oml0ZXJhdG9yIGVuZENvb2tpZUl0ZXJhdG9yID0gbV9jb29raWVNYXAu
ZW5kKCk7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj46Oml0ZXJhdG9y
IGl0ID0gZmlyc3RDb29raWVJdGVyYXRvcjsgaXQgIT0gZW5kQ29va2llSXRlcmF0b3I7ICsraXQp
CisgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworCisgICAgbV9zdWJkb21haW5zLmNsZWFyKCk7
CisgICAgbV9jb29raWVNYXAuY2xlYXIoKTsKKworICAgIG1fb2xkZXN0Q29va2llID0gMDsKK30K
Kwordm9pZCBDb29raWVNYXA6OmdldEFsbENoaWxkQ29va2llcyhWZWN0b3I8UGFyc2VkQ29va2ll
Kj4qIHN0YWNrT2ZDb29raWVzKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gZ2V0QWxs
Q2hpbGRDb29raWVzIGluIE1hcCAtICVzIiwgZ2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAg
IGdldEFsbENvb2tpZXMoc3RhY2tPZkNvb2tpZXMpOworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcs
IENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IG1fc3ViZG9tYWlucy5iZWdpbigpOyBpdCAhPSBt
X3N1YmRvbWFpbnMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFsbENoaWxk
Q29va2llcyhzdGFja09mQ29va2llcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjNmODMzYzE1MTY2YWM3MzQ1ZGI3ZmIzOTY2NmRkMThkN2ZmOWU3MTEKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5oCkBA
IC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEp1bGllbiBDaGFmZnJhaXggPGp1
bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29r
aWVNYXBfaAorI2RlZmluZSBDb29raWVNYXBfaAorCisjaW5jbHVkZSAiSGFzaE1hcC5oIgorI2lu
Y2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVmVjdG9yLmgiCisjaW5jbHVkZSA8
d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBh
cnNlZENvb2tpZTsKKworLyogQSBjb29raWUgbWFwIGlzIGEgbm9kZSBpbiB0aGUgdHJlZSBoZWxk
IGJ5IENvb2tpZU1hbmFnZXIgdGhhdCByZXByZXNlbnRzCisgKiBjb29raWVzIHRoYXQgbWF0Y2hl
cyBhIGNvbW1vbiBkb21haW4uCisgKgorICogQSBDb29raWVNYXAgaG9sZHMgcmVmZXJlbmNlIHRv
IHRoZSBjb29raWVzIHRoYXQgaXQgY29udGFpbnMgYW5kIHRoZSBjaGlsZAorICogZG9tYWlucyB0
aGF0IGV4aXN0IHdpdGhpbiB0aGUgdHJlZS4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGNvb2tpZSBw
ZXIgaG9zdCBpcyBsaW1pdGVkIGJ5IENvb2tpZU1hbmFnZXI6OnNfbWF4Q29va2llQ291bnRQZXJI
b3N0CisgKi8KKworY2xhc3MgQ29va2llTWFwIHsKKworcHVibGljOgorICAgIENvb2tpZU1hcChj
b25zdCBTdHJpbmcmIG5hbWUgPSAiIik7CisgICAgfkNvb2tpZU1hcCgpOworCisgICAgdW5zaWdu
ZWQgaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jb29raWVNYXAuc2l6ZSgpOyB9CisgICAg
Y29uc3QgU3RyaW5nJiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisKKyAgICB2
b2lkIGFkZENvb2tpZShQYXJzZWRDb29raWUqKTsKKworICAgIC8vIFJldHVybmluZyB0aGUgb3Jp
Z2luYWwgY29va2llIG9iamVjdCBzbyBtYW5hZ2VyIGNhbiBrZWVwIGEgcmVmZXJlbmNlIHRvIHRo
ZSB1cGRhdGVzIGluIHRoZSBkYXRhYmFzZSBxdWV1ZQorICAgIFBhcnNlZENvb2tpZSogdXBkYXRl
Q29va2llKFBhcnNlZENvb2tpZSopOworCisgICAgLy8gTmVlZCB0byByZXR1cm4gdGhlIHJlZmVy
ZW5jZSB0byB0aGUgcmVtb3ZlZCBjb29raWUgc28gbWFuYWdlciBjYW4gZGVhbCB3aXRoIGl0IChn
YXJiYWdlIGNvbGxlY3QpCisgICAgUGFyc2VkQ29va2llKiByZW1vdmVDb29raWUoY29uc3QgUGFy
c2VkQ29va2llKik7CisgICAgYm9vbCBleGlzdHNDb29raWUoY29uc3QgUGFyc2VkQ29va2llKikg
Y29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIGEgbWFwIHdpdGggdGhhdCBnaXZlbiBzdWJkb21haW4K
KyAgICBDb29raWVNYXAqIGdldFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lk
IGFkZFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmLCBDb29raWVNYXAqKTsKKyAgICB2b2lkIGRl
bGV0ZUFsbENvb2tpZXNBbmREb21haW5zKCk7CisKKyAgICB2b2lkIGdldEFsbENvb2tpZXMoVmVj
dG9yPFBhcnNlZENvb2tpZSo+Kik7CisgICAgdm9pZCBnZXRBbGxDaGlsZENvb2tpZXMoVmVjdG9y
PFBhcnNlZENvb2tpZSo+KiBzdGFja09mQ29va2llcyk7CisgICAgUGFyc2VkQ29va2llKiByZW1v
dmVPbGRlc3RDb29raWUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZU9sZGVzdENvb2tp
ZSgpOworCisgICAgLy8gVGhlIGtleSBpcyB0aGUgdHVwbGUgKG5hbWUsIHBhdGgpCisgICAgLy8g
VGhlIHNwZWMgYXNrcyB0byBoYXZlIGFsc28gZG9tYWluLCB3aGljaCBpcyBpbXBsaWVkIGJ5IGNo
b29zaW5nIHRoZSBDb29raWVNYXAgcmVsZXZhbnQgdG8gdGhlIGRvbWFpbgorICAgIEhhc2hNYXA8
U3RyaW5nLCBQYXJzZWRDb29raWUqPiBtX2Nvb2tpZU1hcDsKKworICAgIC8vIFRoZSBrZXkgaXMg
YSBzdWJzZWN0aW9uIG9mIHRoZSBkb21haW4uCisgICAgLy8gZXg6IGlmIGluc2VydGluZyBhY2Nv
dW50cy5nb29nbGUuY29tICYgdGhpcyBjb29raWVtYXAgaXMgImNvbSIsIHRoaXMgc3ViZG9tYWlu
IG1hcCB3aWxsIGNvbnRhaW4gImdvb2dsZSIKKyAgICAvLyBUaGUgImdvb2dsZSIgY29va2llbWFw
IHdpbGwgY29udGFpbiAiYWNjb3VudHMiIGluIGl0cyBzdWJkb21haW4gbWFwCisgICAgSGFzaE1h
cDxTdHJpbmcsIENvb2tpZU1hcCo+IG1fc3ViZG9tYWluczsKKworICAgIC8vIFN0b3JlIHRoZSBv
bGRlc3QgY29va2llIHRvIHNwZWVkIHVwIExSVSBjaGVja3MKKyAgICBQYXJzZWRDb29raWUqIG1f
b2xkZXN0Q29va2llOworICAgIGNvbnN0IFN0cmluZyBtX25hbWU7CisKKyAgICAvLyBGSVhNRSA6
IHNob3VsZCBoYXZlIGEgbV9zaG91bGRVcGRhdGUgZmxhZyB0byB1cGRhdGUgdGhlIG5ldHdvcmsg
bGF5ZXIgb25seSB3aGVuIHRoZSBtYXAgaGFzIGNoYW5nZWQKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIENvb2tpZU1hcF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzIyZTU5
M2RiMTNiMmVmOTBjOTIyM2M5MmRmOTUxZjA3NGRjYTBhZAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcApAQCAtMCww
ICsxLDM5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxq
Y2hhZmZyYWl4QHBsZXlvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBS
ZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovIAorCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llUGFyc2VyLmgiCisKKyNpbmNsdWRlICJDdXJyZW50
VGltZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIK
KyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
c3RhdGljIGlubGluZSBib29sIGlzQ29va2llSGVhZGVyU2VwYXJhdG9yKFVDaGFyIGMpCit7Cisg
ICAgcmV0dXJuIChjID09ICdccicgfHwgYyA9PSdcbicpOworfQorCitzdGF0aWMgaW5saW5lIGJv
b2wgaXNMaWdodHdlaWdodFNwYWNlKFVDaGFyIGMpCit7CisgICAgcmV0dXJuIChjID09ICcgJyB8
fCBjID09ICdcdCcpOworfQorCitDb29raWVQYXJzZXI6OkNvb2tpZVBhcnNlcihjb25zdCBLVVJM
JiBkZWZhdWx0Q29va2llVVJMKQorICAgIDogbV9kZWZhdWx0Q29va2llVVJMKGRlZmF1bHRDb29r
aWVVUkwpCit7Cit9CisKK0Nvb2tpZVBhcnNlcjo6fkNvb2tpZVBhcnNlcigpCit7Cit9CisKK1Zl
Y3RvcjxQYXJzZWRDb29raWUqPiBDb29raWVQYXJzZXI6OnBhcnNlKGNvbnN0IFN0cmluZyYgY29v
a2llcykKK3sKKyAgICB1bnNpZ25lZCBjb29raWVTdGFydCwgY29va2llRW5kID0gMDsKKyAgICBk
b3VibGUgY3VyVGltZSA9IGN1cnJlbnRUaW1lKCk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSos
IDQ+IHBhcnNlZENvb2tpZXM7CisgCisgICAgaWYgKCFjb29raWVzLmxlbmd0aCgpKSAvLyBDb2Rl
IGJlbG93IGRvZXNuJ3QgaGFuZGxlIHRoaXMgY2FzZQorICAgICAgICByZXR1cm4gcGFyc2VkQ29v
a2llczsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaGVhZGVyIHRvIHBhcnNlIGFsbCB0aGUg
Y29va2llcy4KKyAgICB3aGlsZSAoY29va2llRW5kIDw9IGNvb2tpZXMubGVuZ3RoKCkpIHsKKyAg
ICAgICAgY29va2llU3RhcnQgPSBjb29raWVFbmQ7CisgICAgICAgIAorICAgICAgICAvLyBGaW5k
IGEgY29va2llIHNlcGFyYXRvci4KKyAgICAgICAgd2hpbGUgKGNvb2tpZUVuZCA8PSBjb29raWVz
Lmxlbmd0aCgpICYmICFpc0Nvb2tpZUhlYWRlclNlcGFyYXRvcihjb29raWVzW2Nvb2tpZUVuZF0p
KQorICAgICAgICAgICAgY29va2llRW5kKys7CisKKyAgICAgICAgLy8gRGV0ZWN0IGFuIGVtcHR5
IGNvb2tpZSBhbmQgZ28gdG8gdGhlIG5leHQgb25lLgorICAgICAgICBpZiAoY29va2llU3RhcnQg
PT0gY29va2llRW5kKSB7CisgICAgICAgICAgICArK2Nvb2tpZUVuZDsKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvb2tpZUVuZCA8IGNvb2tpZXMubGVu
Z3RoKCkgJiYgaXNDb29raWVIZWFkZXJTZXBhcmF0b3IoY29va2llc1tjb29raWVFbmRdKSkKKyAg
ICAgICAgICAgICsrY29va2llRW5kOworCisgICAgICAgIFBhcnNlZENvb2tpZSogY29va2llID0g
cGFyc2VPbmVDb29raWUoY29va2llcywgY29va2llU3RhcnQsIGNvb2tpZUVuZCAtIDEsIGN1clRp
bWUpOworICAgICAgICBpZiAoY29va2llKQorICAgICAgICAgICAgcGFyc2VkQ29va2llcy5hcHBl
bmQoY29va2llKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcnNlZENvb2tpZXM7Cit9CisKKy8vIFBh
cnNlIHRoZSBzdHJpbmcgd2l0aG91dCAiU2V0LUNvb2tpZSIgYWNjb3JkaW5nIHRvIEZpcmVmb3gg
Z3JhbW1hciAobG9vc2VseSBSRkMgMjEwOSBjb21wbGlhbnQpCisvLyBzZWUgbmV0d2Vyay9jb29r
aWUvc3JjL25zQ29va2llU2VydmljZS5jcHAgY29tbWVudCBmb3IgaXQKK1BhcnNlZENvb2tpZSog
Q29va2llUGFyc2VyOjpwYXJzZU9uZUNvb2tpZShjb25zdCBTdHJpbmcmIGNvb2tpZSwgdW5zaWdu
ZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCwgZG91YmxlIGN1clRpbWUpCit7CisgICAgUGFyc2VkQ29v
a2llKiByZXMgPSBuZXcgUGFyc2VkQ29va2llKGN1clRpbWUpOworCisgICAgaWYgKCFyZXMpIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKworICAgIC8vIEV4dHJhY3QgcHJvdG9jb2wKKyAgICByZXMtPnNldFByb3RvY29sKG1f
ZGVmYXVsdENvb2tpZVVSTC5wcm90b2NvbCgpKTsKKworICAgIC8vIFBhcnNlIFtOQU1FICI9Il0g
VkFMVUUKKworICAgIHVuc2lnbmVkIHRva2VuRW5kID0gc3RhcnQ7IC8vIFRva2VuIGVuZCBjb250
YWlucyB0aGUgcG9zaXRpb24gb2YgdGhlICc9JyBvciB0aGUgZW5kIG9mIGEgdG9rZW4KKyAgICB1
bnNpZ25lZCBwYWlyRW5kID0gc3RhcnQ7IC8vIFBhaXIgZW5kIGNvbnRhaW5zIGFsd2F5cyB0aGUg
cG9zaXRpb24gb2YgdGhlICc7JworCisgICAgLy8gZmluZCB0aGUgKmZpcnN0KiAnOycgYW5kIHRo
ZSAnPScgKGlmIHRoZXkgZXhpc3QpCisgICAgYm9vbCBxdW90ZUZvdW5kID0gZmFsc2U7CisgICAg
Ym9vbCBmb3VuZEVxdWFsID0gZmFsc2U7CisgICAgd2hpbGUgKHBhaXJFbmQgPCBlbmQgJiYgKGNv
b2tpZVtwYWlyRW5kXSAhPSAnOycgfHwgcXVvdGVGb3VuZCkpIHsKKyAgICAgICAgaWYgKHRva2Vu
RW5kID09IHN0YXJ0ICYmIGNvb2tpZVtwYWlyRW5kXSA9PSAnPScpIHsKKyAgICAgICAgICAgIHRv
a2VuRW5kID0gcGFpckVuZDsKKyAgICAgICAgICAgIGZvdW5kRXF1YWwgPSB0cnVlOworICAgICAg
ICB9CisgICAgICAgIGlmIChjb29raWVbcGFpckVuZF0gPT0gJyInKQorICAgICAgICAgICAgcXVv
dGVGb3VuZCA9ICFxdW90ZUZvdW5kOworICAgICAgICBwYWlyRW5kKys7CisgICAgfQorCisgICAg
dW5zaWduZWQgdG9rZW5TdGFydCA9IHN0YXJ0OworCisgICAgYm9vbCBoYXNOYW1lID0gZmFsc2U7
IC8vIFRoaXMgaXMgYSBoYWNrIHRvIGF2b2lkIGNoYW5naW5nIHRvbyBtdWNoIGluIHRoaXMKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJ1dGFsbHkgYnJpdHRsZSBjb2RlLgorICAgIGlm
ICh0b2tlbkVuZCAhPSBzdGFydCkgeworICAgICAgICAvLyBUaGVyZSBpcyBhICc9JyBzbyBwYXJz
ZSB0aGUgTkFNRQorICAgICAgICB1bnNpZ25lZCBuYW1lRW5kID0gdG9rZW5FbmQ7CisKKyAgICAg
ICAgLy8gVGhlIHRva2VuRW5kIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgJz0nIHNvIHRoZSBuYW1l
RW5kIGlzIG9uZSBsZXNzCisgICAgICAgIG5hbWVFbmQtLTsKKworICAgICAgICAvLyBSZW1vdmUg
bGlnaHR3ZWlnaHQgc3BhY2VzLgorICAgICAgICB3aGlsZSAobmFtZUVuZCAmJiBpc0xpZ2h0d2Vp
Z2h0U3BhY2UoY29va2llW25hbWVFbmRdKSkKKyAgICAgICAgICAgIG5hbWVFbmQtLTsKKworICAg
ICAgICB3aGlsZSAodG9rZW5TdGFydCA8IG5hbWVFbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNv
b2tpZVt0b2tlblN0YXJ0XSkpCisgICAgICAgICAgICB0b2tlblN0YXJ0Kys7CisKKyAgICAgICAg
aWYgKG5hbWVFbmQgKyAxIDw9IHRva2VuU3RhcnQpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigi
RW1wdHkgbmFtZS4gUmVqZWN0aW5nIHRoZSBjb29raWUiKTsKKyAgICAgICAgICAgIGRlbGV0ZSBy
ZXM7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBu
YW1lID0gY29va2llLnN1YnN0cmluZyh0b2tlblN0YXJ0LCBuYW1lRW5kICsgMSAtIHN0YXJ0KTsK
KyAgICAgICAgcmVzLT5zZXROYW1lKG5hbWUpOworICAgICAgICBoYXNOYW1lID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICAvLyBOb3cgcGFyc2UgdGhlIFZBTFVFCisgICAgdG9rZW5TdGFydCA9IHRva2Vu
RW5kICsgMTsKKyAgICBpZiAoIWhhc05hbWUpCisgICAgICAgIC0tdG9rZW5TdGFydDsKKworICAg
IC8vIFNraXAgbGlnaHR3ZWlnaHQgc3BhY2VzIGluIG91ciB0b2tlbgorICAgIHdoaWxlICh0b2tl
blN0YXJ0IDwgcGFpckVuZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuU3RhcnRd
KSkKKyAgICAgICAgdG9rZW5TdGFydCsrOworCisgICAgdG9rZW5FbmQgPSBwYWlyRW5kOworICAg
IHdoaWxlICh0b2tlbkVuZCA+IHRva2VuU3RhcnQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tp
ZVt0b2tlbkVuZCAtIDFdKSkKKyAgICAgICAgdG9rZW5FbmQtLTsKKworICAgIFN0cmluZyB2YWx1
ZTsKKyAgICBpZiAodG9rZW5FbmQgPT0gdG9rZW5TdGFydCkgeworICAgICAgICAvLyBGaXJlZm94
IGFjY2VwdHMgZW1wdHkgdmFsdWUgc28gd2Ugd2lsbCBkbyB0aGUgc2FtZQorICAgICAgICB2YWx1
ZSA9IFN0cmluZygpOworICAgIH0gZWxzZQorICAgICAgICB2YWx1ZSA9IGNvb2tpZS5zdWJzdHJp
bmcodG9rZW5TdGFydCwgdG9rZW5FbmQgLSB0b2tlblN0YXJ0KTsKKworICAgIGlmIChoYXNOYW1l
KQorICAgICAgICByZXMtPnNldFZhbHVlKHZhbHVlKTsKKyAgICBlbHNlIGlmIChmb3VuZEVxdWFs
KSB7CisgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZQor
ICAgICAgICByZXMtPnNldE5hbWUodmFsdWUpOyAvLyBObyBOQU1FPVZBTFVFLCBvbmx5IE5BTUUK
KworICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kKSB7CisgICAgICAgIC8vIFN3aXRjaCB0byB0aGUg
bmV4dCBwYWlyIGFzIHBhaXJFbmQgaXMgb24gdGhlICc7JyBhbmQgZmFzdC1mb3J3YXJkIGFueSBs
aWdodHdlaWdodCBzcGFjZXMuCisgICAgICAgIHBhaXJFbmQrKzsKKyAgICAgICAgd2hpbGUgKHBh
aXJFbmQgPCBlbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVtwYWlyRW5kXSkpCisgICAg
ICAgICAgICBwYWlyRW5kKys7CisKKyAgICAgICAgdG9rZW5TdGFydCA9IHBhaXJFbmQ7CisgICAg
ICAgIHRva2VuRW5kID0gdG9rZW5TdGFydDsgLy8gaW5pdGlhbGl6ZSB0b2tlbiBlbmQgdG8gY2F0
Y2ggZmlyc3QgJz0nCisKKyAgICAgICAgd2hpbGUgKHBhaXJFbmQgPCBlbmQgJiYgY29va2llW3Bh
aXJFbmRdICE9ICc7JykgeworICAgICAgICAgICAgaWYgKHRva2VuRW5kID09IHRva2VuU3RhcnQg
JiYgY29va2llW3BhaXJFbmRdID09ICc9JykKKyAgICAgICAgICAgICAgICB0b2tlbkVuZCA9IHBh
aXJFbmQ7CisgICAgICAgICAgICBwYWlyRW5kKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBG
SVhNRSA6IHNob3VsZCB3ZSBza2lwIGxpZ2h0d2VpZ2h0IHNwYWNlcyBoZXJlID8KKworICAgICAg
ICB1bnNpZ25lZCBsZW5ndGggPSB0b2tlbkVuZCAtIHRva2VuU3RhcnQ7CisgICAgICAgIHVuc2ln
bmVkIHRva2VuU3RhcnRTdmcgPSB0b2tlblN0YXJ0OworCisgICAgICAgIFN0cmluZyBwYXJzZWRW
YWx1ZTsKKyAgICAgICAgaWYgKHRva2VuU3RhcnQgIT0gdG9rZW5FbmQpIHsKKyAgICAgICAgICAg
IC8vIFRoZXJlIGlzIGFuIGVxdWFsIHNpZ24gc28gcmVtb3ZlIGxpZ2h0d2VpZ2h0IHNwYWNlcyBp
biBWQUxVRQorICAgICAgICAgICAgdG9rZW5TdGFydCA9IHRva2VuRW5kICsgMTsKKyAgICAgICAg
ICAgIHdoaWxlICh0b2tlblN0YXJ0IDwgcGFpckVuZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29v
a2llW3Rva2VuU3RhcnRdKSkKKyAgICAgICAgICAgICAgICB0b2tlblN0YXJ0Kys7CisKKyAgICAg
ICAgICAgIHRva2VuRW5kID0gcGFpckVuZDsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbkVuZCA+
IHRva2VuU3RhcnQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVt0b2tlbkVuZCAtIDFdKSkK
KyAgICAgICAgICAgICAgICB0b2tlbkVuZC0tOworCisgICAgICAgICAgICBwYXJzZWRWYWx1ZSA9
IGNvb2tpZS5zdWJzdHJpbmcodG9rZW5TdGFydCwgdG9rZW5FbmQgLSB0b2tlblN0YXJ0KTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwYXJzZWRWYWx1ZSBpcyBlbXB0
eSwgaW5pdGlhbGlzZSBpdCBpbiBjYXNlIHdlIG5lZWQgaXQKKyAgICAgICAgICAgIHBhcnNlZFZh
bHVlID0gU3RyaW5nKCk7CisgICAgICAgICAgICAvLyBIYW5kbGUgYSB0b2tlbiB3aXRob3V0IHZh
bHVlLgorICAgICAgICAgICAgbGVuZ3RoID0gcGFpckVuZCAtIHRva2VuU3RhcnQ7CisgICAgICAg
IH0KKworICAgICAgIC8vIERldGVjdCB3aGljaCAiY29va2llLWF2IiBpcyBwYXJzZWQKKyAgICAg
ICAvLyBMb29rIGF0IHRoZSBmaXJzdCBjaGFyIHRoZW4gcGFyc2UgdGhlIHdob2xlIGZvciBwZXJm
b3JtYW5jZSBpc3N1ZQorICAgICAgICBzd2l0Y2ggKGNvb2tpZVt0b2tlblN0YXJ0U3ZnXSkgewor
ICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgY2FzZSAncCcgOiB7CisgICAgICAgICAgICBpZiAo
bGVuZ3RoID49IDQgJiYgY29va2llLmZpbmQoImF0aCIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxz
ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBwYXRoIHRvIGJlIGRlY29kZWQg
dG8gbWF0Y2ggdGhvc2UgcmV0dXJuZWQgZnJvbSBLVVJMOjpwYXRoKCkuCisgICAgICAgICAgICAg
ICAgLy8gVGhlIHBhdGggYXR0cmlidXRlIG1heSBvciBtYXkgbm90IGluY2x1ZGUgcGVyY2VudC1l
bmNvZGVkIGNoYXJhY3RlcnMuIEZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgLy8gaWYgdGhl
cmUgYXJlIG5vIHBlcmNlbnQtZW5jb2RlZCBjaGFyYWN0ZXJzLCBkZWNvZGluZyB0aGUgdXJsIGlz
IGEgbm8tb3AuCisgICAgICAgICAgICAgICAgcmVzLT5zZXRQYXRoKGRlY29kZVVSTEVzY2FwZVNl
cXVlbmNlcyhwYXJzZWRWYWx1ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzIChwYXRoKSIsIGNvb2tpZS5hc2NpaSgp
LmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisK
KyAgICAgICAgY2FzZSAnRCc6CisgICAgICAgIGNhc2UgJ2QnIDogeworICAgICAgICAgICAgaWYg
KGxlbmd0aCA+PSA2ICYmIGNvb2tpZS5maW5kKCJvbWFpbiIsIHRva2VuU3RhcnRTdmcgKyAxLCBm
YWxzZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkVmFsdWUubGVuZ3RoKCkgPiAxICYm
IHBhcnNlZFZhbHVlWzBdID09ICciJyAmJiBwYXJzZWRWYWx1ZVtwYXJzZWRWYWx1ZS5sZW5ndGgo
KSAtIDFdID09ICciJykKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZWRW
YWx1ZS5zdWJzdHJpbmcoMSwgcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAyKTsKKyAgICAgICAgICAg
ICAgICAvLyBJZiB0aGUgZG9tYWluIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBkb3QsIGFkZCBvbmUg
Zm9yIHNlY3VyaXR5IGNoZWNrcywKKyAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogYWIu
Yy5jb20gZG9zZSBub3QgZG9tYWluIG1hdGNoIGIuYy5jb207CisgICAgICAgICAgICAgICAgU3Ry
aW5nIHJlYWxEb21haW4gPSBwYXJzZWRWYWx1ZVswXSA9PSAnLicgPyBwYXJzZWRWYWx1ZSA6ICIu
IiArIHBhcnNlZFZhbHVlOworICAgICAgICAgICAgICAgIHJlcy0+c2V0RG9tYWluKHJlYWxEb21h
aW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIklu
dmFsaWQgY29va2llICVzIChkb21haW4pIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdF
JyA6CisgICAgICAgIGNhc2UgJ2UnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA3ICYm
IGNvb2tpZS5maW5kKCJ4cGlyZXMiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAg
ICAgICAgICAgIHJlcy0+c2V0RXhwaXJ5KHBhcnNlZFZhbHVlKTsKKyAgICAgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUgJXMgKGV4cGlyZXMp
IiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgcmVzOwor
ICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdNJyA6CisgICAgICAgIGNhc2UgJ20nIDog
eworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA3ICYmIGNvb2tpZS5maW5kKCJheC1hZ2UiLCB0
b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0TWF4QWdl
KHBhcnNlZFZhbHVlKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExPR19F
UlJPUigiSW52YWxpZCBjb29raWUgJXMgKG1heC1hZ2UpIiwgY29va2llLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgICAgICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAg
ICBjYXNlICdDJyA6CisgICAgICAgIGNhc2UgJ2MnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0
aCA+PSA3ICYmIGNvb2tpZS5maW5kKCJvbW1lbnQiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2Up
KQorICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIHJvb20gZm9yIHRoZSBjb21tZW50
IHBhcnQgKGFuZCBzbyBkbyBNb3ppbGxhKSBzbyBqdXN0IGxvZyB0aGUgY29tbWVudC4KKyAgICAg
ICAgICAgICAgICBMT0coTmV0d29yaywgIkNvbW1lbnQgJXMgZm9yIFBhcnNlZENvb2tpZSA6ICVz
XG4iLCBwYXJzZWRWYWx1ZS5hc2NpaSgpLmRhdGEoKSwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsK
KyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBj
b29raWUgJXMgKGNvbW1lbnQpIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAg
ICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdWJyA6Cisg
ICAgICAgIGNhc2UgJ3YnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA3ICYmIGNvb2tp
ZS5maW5kKCJlcnNpb24iLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKSB7CisgICAgICAgICAg
ICAgICAgLy8gQWx0aG91Z2ggdGhlIG91dC1vZi1kYXRlZCBDb29raWUgU3BlYyhSRkMyOTY1LCBo
dHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyOTY1KSBkZWZpbmVkCisgICAgICAgICAgICAg
ICAgLy8gdGhlIHZhbHVlIG9mIHZlcnNpb24gY2FuIG9ubHkgY29udGFpbiBESUdJVCwgc29tZSBy
YW5kb20gc2l0ZXMsIGUuZy4gaHR0cHM6Ly9kZXZmb3J1bXMuYXBwbGUuY29tCisgICAgICAgICAg
ICAgICAgLy8gd291bGQgdXNlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgdG8gcXVvdGUgdGhlIGRp
Z2l0LiBTbyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGhlbSBmb3IgY29tcGxpYW5jZS4KKyAgICAg
ICAgICAgICAgICBpZiAocGFyc2VkVmFsdWUubGVuZ3RoKCkgPiAxICYmIHBhcnNlZFZhbHVlWzBd
ID09ICciJyAmJiBwYXJzZWRWYWx1ZVtwYXJzZWRWYWx1ZS5sZW5ndGgoKSAtIDFdID09ICciJykK
KyAgICAgICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZWRWYWx1ZS5zdWJzdHJpbmco
MSwgcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAyKTsKKworICAgICAgICAgICAgICAgIGlmIChwYXJz
ZWRWYWx1ZS50b0ludCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJQ
YXJzZWRDb29raWUgdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkIChvbmx5IHN1cHBvcnQgdmVyc2lv
bj0xKSIsIHBhcnNlZFZhbHVlLnRvSW50KCkpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUg
cmVzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBj
b29raWUgJXMgKHZlcnNpb24pIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAg
ICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdTJyA6Cisg
ICAgICAgIGNhc2UgJ3MnIDogeworICAgICAgICAgICAgLy8gU2VjdXJlIGlzIGEgc3RhbmRhbG9u
ZSB0b2tlbiAoIlNlY3VyZTsiKQorICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA2ICYmIGNvb2tp
ZS5maW5kKCJlY3VyZSIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAgICAg
ICAgcmVzLT5zZXRTZWN1cmVGbGFnKHRydWUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAoc2VjdXJlKSIsIGNvb2tpZS5h
c2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICBjYXNlICdoJzogeworICAgICAgICAgICAg
Ly8gSHR0cE9ubHkgaXMgYSBzdGFuZGFsb25lIHRva2VuICgiSHR0cE9ubHk7IikKKyAgICAgICAg
ICAgIGlmIChsZW5ndGggPj0gOCAmJiBjb29raWUuZmluZCgidHRwT25seSIsIHRva2VuU3RhcnRT
dmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgcmVzLT5zZXRJc0h0dHBPbmx5KHRydWUp
OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlk
IGNvb2tpZSAlcyAoSHR0cE9ubHkpIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
ICAgICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0IDog
eworICAgICAgICAgICAgLy8gSWYgbGVuZ3RoID09IDAsIHdlIHNob3VsZCBiZSBhdCB0aGUgZW5k
IG9mIHRoZSBjb29raWUgKGNhc2UgOiAiO1xyIikgc28gaWdub3JlIGl0CisgICAgICAgICAgICBp
ZiAobGVuZ3RoKQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCB0b2tlbiBmb3Ig
Y29va2llICVzIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIGNvb2tpZSBpcyB2YWxpZCB3aXRoIHJlc3Bl
Y3QgdG8gdGhlIHNpemUgbGltaXQvCisgICAgaWYgKCFyZXMtPmlzVW5kZXJTaXplTGltaXQoKSkg
eworICAgICAgICBMT0dfRVJST1IoIlBhcnNlZENvb2tpZSAlcyBpcyBhYm92ZSB0aGUgNGtiIGlu
IGxlbmd0aCA6IFJFSkVDVEVEIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgZGVs
ZXRlIHJlczsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gSWYgc29tZSBwYWly
IHdhcyBub3QgcHJvdmlkZWQsIGR1cmluZyBwYXJzaW5nIHRoZW4gYXBwbHkgc29tZSBkZWZhdWx0
IHZhbHVlCisgICAgLy8gdGhlIHJlc3QgaGFzIGJlZW4gZG9uZSBpbiB0aGUgY29uc3RydWN0b3Iu
CisKKyAgICAvLyBJZiBubyBkb21haW4gd2FzIHByb3ZpZGVkLCBzZXQgaXQgdG8gdGhlIGhvc3QK
KyAgICBpZiAoIXJlcy0+ZG9tYWluKCkpCisgICAgICAgIHJlcy0+c2V0RGVmYXVsdERvbWFpbiht
X2RlZmF1bHRDb29raWVVUkwpOworCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBDb29raWUgU3Bl
Y2lmaWNhaXRvbiAoUkZDNjI2NSwgc2VjdGlvbiA0LjEuMi40IGFuZCA1LjIuNCwgaHR0cDovL3Rv
b2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSksCisgICAgLy8gSWYgbm8gcGF0aCB3YXMgcHJvdmlk
ZWQgb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcGF0aCB2YWx1ZSBpcyBub3QgJy8nLCBz
ZXQgaXQgdG8gdGhlIGhvc3QncyBwYXRoCisgICAgLy8KKyAgICAvLyBSRUZFUkVOQ0UKKyAgICAv
LyA0LjEuMi40LiBUaGUgUGF0aCBBdHRyaWJ1dGUKKyAgICAvLworICAgIC8vIFRoZSBzY29wZSBv
ZiBlYWNoIGNvb2tpZSBpcyBsaW1pdGVkIHRvIGEgc2V0IG9mIHBhdGhzLCBjb250cm9sbGVkIGJ5
CisgICAgLy8gdGhlIFBhdGggYXR0cmlidXRlLiBJZiB0aGUgc2VydmVyIG9taXRzIHRoZSBQYXRo
IGF0dHJpYnV0ZSwgdGhlIHVzZXIKKyAgICAvLyBhZ2VudCB3aWxsIHVzZSB0aGUgImRpcmVjdG9y
eSIgb2YgdGhlIHJlcXVlc3QtdXJpJ3MgcGF0aCBjb21wb25lbnQgYXMKKyAgICAvLyB0aGUgZGVm
YXVsdCB2YWx1ZS4gKFNlZSBTZWN0aW9uIDUuMS40IGZvciBtb3JlIGRldGFpbHMuKQorICAgIC8v
IC4uLi4uLi4uLi4uCisgICAgLy8gNS4yLjQuIFRoZSBQYXRoIEF0dHJpYnV0ZQorICAgIC8vCisg
ICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRo
ZSBzdHJpbmcgIlBhdGgiLAorICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUg
Y29va2llLWF2IGFzIGZvbGxvd3MuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYXR0cmlidXRlLXZh
bHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCisgICAgLy8gYXR0
cmlidXRlLXZhbHVlIGlzIG5vdCAleDJGICgiLyIpOgorICAgIC8vCisgICAgLy8gTGV0IGNvb2tp
ZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2U6Cisg
ICAgLy8KKyAgICAvLyBMZXQgY29va2llLXBhdGggYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS4KKyAg
ICAvLworICAgIC8vIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUt
bGlzdCB3aXRoIGFuIGF0dHJpYnV0ZS0KKyAgICAvLyBuYW1lIG9mIFBhdGggYW5kIGFuIGF0dHJp
YnV0ZS12YWx1ZSBvZiBjb29raWUtcGF0aC4KKyAgICBpZiAoIXJlcy0+cGF0aCgpIHx8ICFyZXMt
PnBhdGgoKS5sZW5ndGgoKSB8fCAhcmVzLT5wYXRoKCkuc3RhcnRzV2l0aCgiLyIsIGZhbHNlKSkg
eworICAgICAgICBTdHJpbmcgcGF0aCA9IG1fZGVmYXVsdENvb2tpZVVSTC5zdHJpbmcoKS5zdWJz
dHJpbmcobV9kZWZhdWx0Q29va2llVVJMLnBhdGhTdGFydCgpLCBtX2RlZmF1bHRDb29raWVVUkwu
cGF0aEFmdGVyTGFzdFNsYXNoKCkgLSBtX2RlZmF1bHRDb29raWVVUkwucGF0aFN0YXJ0KCkgLSAx
KTsKKyAgICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKQorICAgICAgICAgICAgcGF0aCA9ICIvIjsK
KyAgICAgICAgLy8gU2luY2UgdGhpcyBpcyByZWFkaW5nIHRoZSByYXcgdXJsIHN0cmluZywgaXQg
Y291bGQgY29udGFpbiBwZXJjZW50LWVuY29kZWQgc2VxdWVuY2VzLiBXZQorICAgICAgICAvLyB3
YW50IGl0IHRvIGJlIGNvbXBhcmFibGUgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiB1cmwucGF0aCgp
LCB3aGljaCBpcyBub3QgcGVyY2VudC1lbmNvZGVkLAorICAgICAgICAvLyBzbyB3ZSBtdXN0IHJl
bW92ZSB0aGUgZXNjYXBlIHNlcXVlbmNlcy4KKyAgICAgICAgcmVzLT5zZXRQYXRoKGRlY29kZVVS
TEVzY2FwZVNlcXVlbmNlcyhwYXRoKSk7CisgICAgfQorIAorICAgIHJldHVybiByZXM7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9i
bGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkyZTQ4ZDM2ZWIyNjU2MDZjN2Qy
MWY4NDRiMjRkYWJlMWNmOTY4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5by5j
b20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENvb2tpZVBhcnNlcl9oCisjZGVmaW5lIENv
b2tpZVBhcnNlcl9oCisKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiVmVjdG9yLmgiCisK
K25hbWVzcGFjZSBXVEYgeworY2xhc3MgU3RyaW5nOworfQorbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBQYXJzZWRDb29raWU7CisKK2NsYXNzIENvb2tpZVBhcnNlciB7CitwdWJsaWM6Cisg
ICAgQ29va2llUGFyc2VyKGNvbnN0IEtVUkwmIGRlZmF1bHRDb29raWVVUkwpOworICAgIH5Db29r
aWVQYXJzZXIoKTsKKworICAgIC8vIFBhcnNlcyBhIHNlcXVlbmNlIG9mICJDb29raWU6IiBoZWFk
ZXIgYW5kIHJldHVybiB0aGUgcGFyc2VkIGNvb2tpZXMuCisgICAgVmVjdG9yPFBhcnNlZENvb2tp
ZSo+IHBhcnNlKGNvbnN0IFN0cmluZyYgY29va2llcyk7CisKK3ByaXZhdGU6CisgICAgLy8gRklY
TUU6IGN1clRpbWUsIHN0YXJ0LCBlbmQgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVtb3ZlZC4gQW5k
IHRoaXMgbWV0aG9kIGNhbiBiZSBwdWJsaWMuCisgICAgUGFyc2VkQ29va2llKiBwYXJzZU9uZUNv
b2tpZShjb25zdCBTdHJpbmcmIGNvb2tpZSwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCwg
ZG91YmxlIGN1clRpbWUpOworCisgICAgS1VSTCBtX2RlZmF1bHRDb29raWVVUkw7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVQYXJzZXJfaApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjMyN2E4ODUyN2MxZWM0NTc0MzFhYTk4NDM2OTllZjRiMDM3NmYyNDcKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENv
b2tpZS5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIw
MDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgi
CisKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQ3VycmVudFRpbWUuaCIK
KyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPGN1cmwv
Y3VybC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9TdHJpbmdCdWlsZGVyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFyc2VkQ29va2ll
OjpQYXJzZWRDb29raWUoZG91YmxlIGN1cnJlbnRUaW1lKQorICAgIDogbV9leHBpcnkoMCkKKyAg
ICAsIG1faXNNYXhBZ2VTZXQoZmFsc2UpCisgICAgLCBtX2NyZWF0aW9uVGltZShjdXJyZW50VGlt
ZSkKKyAgICAsIG1fbGFzdEFjY2Vzc2VkKGN1cnJlbnRUaW1lKQorICAgICwgbV9oYXNEZWZhdWx0
RG9tYWluKGZhbHNlKQorICAgICwgbV9pc1NlY3VyZShmYWxzZSkKKyAgICAsIG1faXNIdHRwT25s
eShmYWxzZSkKKyAgICAsIG1faXNTZXNzaW9uKHRydWUpCisgICAgLCBtX2lzRm9yY2VFeHBpcmVk
KGZhbHNlKQoreworfQorCitQYXJzZWRDb29raWU6OlBhcnNlZENvb2tpZShjb25zdCBTdHJpbmcm
IG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBT
dHJpbmcmIHByb3RvY29sLCBjb25zdCBTdHJpbmcmIHBhdGgsIGRvdWJsZSBleHBpcnksIGRvdWJs
ZSBsYXN0QWNjZXNzZWQsIGRvdWJsZSBjcmVhdGlvblRpbWUsIGJvb2wgaXNTZWN1cmUsIGJvb2wg
aXNIdHRwT25seSkKKyAgICA6IG1fbmFtZShuYW1lKQorICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAg
ICAsIG1fZG9tYWluKGRvbWFpbikKKyAgICAsIG1fcHJvdG9jb2wocHJvdG9jb2wpCisgICAgLCBt
X3BhdGgocGF0aCkKKyAgICAsIG1fZXhwaXJ5KGV4cGlyeSkKKyAgICAsIG1faXNNYXhBZ2VTZXQo
ZmFsc2UpCisgICAgLCBtX2NyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpCisgICAgLCBtX2xhc3RB
Y2Nlc3NlZChsYXN0QWNjZXNzZWQpCisgICAgLCBtX2hhc0RlZmF1bHREb21haW4oZmFsc2UpCisg
ICAgLCBtX2lzU2VjdXJlKGlzU2VjdXJlKQorICAgICwgbV9pc0h0dHBPbmx5KGlzSHR0cE9ubHkp
CisgICAgLCBtX2lzU2Vzc2lvbihmYWxzZSkKKyAgICAsIG1faXNGb3JjZUV4cGlyZWQoZmFsc2Up
Cit7Cit9CisKK1BhcnNlZENvb2tpZTo6UGFyc2VkQ29va2llKGNvbnN0IFBhcnNlZENvb2tpZSog
Y29va2llKQorICAgIDogbV9uYW1lKFN0cmluZyhjb29raWUtPm1fbmFtZSkpCisgICAgLCBtX3Zh
bHVlKFN0cmluZyhjb29raWUtPm1fdmFsdWUpKQorICAgICwgbV9kb21haW4oU3RyaW5nKGNvb2tp
ZS0+bV9kb21haW4pKQorICAgICwgbV9wcm90b2NvbChTdHJpbmcoY29va2llLT5tX3Byb3RvY29s
KSkKKyAgICAsIG1fcGF0aChTdHJpbmcoY29va2llLT5tX3BhdGgpKQorICAgICwgbV9leHBpcnko
Y29va2llLT5tX2V4cGlyeSkKKyAgICAsIG1faXNNYXhBZ2VTZXQoY29va2llLT5tX2lzTWF4QWdl
U2V0KQorICAgICwgbV9jcmVhdGlvblRpbWUoY29va2llLT5tX2NyZWF0aW9uVGltZSkKKyAgICAs
IG1fbGFzdEFjY2Vzc2VkKGNvb2tpZS0+bV9sYXN0QWNjZXNzZWQpCisgICAgLCBtX2hhc0RlZmF1
bHREb21haW4oY29va2llLT5tX2hhc0RlZmF1bHREb21haW4pCisgICAgLCBtX2lzU2VjdXJlKGNv
b2tpZS0+bV9pc1NlY3VyZSkKKyAgICAsIG1faXNIdHRwT25seShjb29raWUtPm1faXNIdHRwT25s
eSkKKyAgICAsIG1faXNTZXNzaW9uKGNvb2tpZS0+bV9pc1Nlc3Npb24pCisgICAgLCBtX2lzRm9y
Y2VFeHBpcmVkKGNvb2tpZS0+bV9pc0ZvcmNlRXhwaXJlZCkKK3sKK30KKworUGFyc2VkQ29va2ll
Ojp+UGFyc2VkQ29va2llKCkKK3sKK30KKwordm9pZCBQYXJzZWRDb29raWU6OnNldEV4cGlyeShj
b25zdCBTdHJpbmcmIGV4cGlyeSkKK3sKKyAgICAvLyBJZiBhIGNvb2tpZSBoYXMgYm90aCB0aGUg
TWF4LUFnZSBhbmQgdGhlIEV4cGlyZXMgYXR0cmlidXRlLAorICAgIC8vIHRoZSBNYXgtQWdlIGF0
dHJpYnV0ZSBoYXMgcHJlY2VkZW5jZSBhbmQgY29udHJvbHMgdGhlIGV4cGlyYXRpb24gZGF0ZSBv
ZiB0aGUgY29va2llLgorICAgIGlmIChtX2lzTWF4QWdlU2V0IHx8IGV4cGlyeS5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIG1faXNTZXNzaW9uID0gZmFsc2U7CisKKyAgICBtX2V4
cGlyeSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oY3VybF9nZXRkYXRlKGV4cGlyeS51dGY4KCkuZGF0
YSgpLCAwKSk7CisKKyAgICBpZiAobV9leHBpcnkgPT0gLTEpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJDb3VsZCBub3QgcGFyc2UgZGF0ZSIpOworICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGNvbnNp
ZGVyIHRoYXQgdGhlIGNvb2tpZSBpcyBzZXNzaW9uIG9ubHkKKyAgICAgICAgbV9pc1Nlc3Npb24g
PSB0cnVlOworICAgIH0KK30KKwordm9pZCBQYXJzZWRDb29raWU6OnNldE1heEFnZShjb25zdCBT
dHJpbmcmIG1heEFnZSkKK3sKKyAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIEhUVFAgQ29va2llIHNw
ZWNpZmljYXRpb24gKFJGQzYyNjUsIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUp
LAorICAgIC8vIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2FuIGJlIGEgRElHSVQgb3IgYSAiLSIsIGFu
ZCB0aGUgcmVtaW5kZXIKKyAgICAvLyBvZiB0aGUgdmFsdWUgY2FuIG9ubHkgY29udGFpbiBESUdJ
VCBjaGFyYWN0ZXJzLgorICAgIGlmIChtYXhBZ2UuaXNFbXB0eSgpIHx8IChtYXhBZ2VbMF0gIT0g
Jy0nICYmICFpc0FTQ0lJRGlnaXQobWF4QWdlWzBdKSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJD
b3VsZCBub3QgcGFyc2UgTWF4LUFnZSA6ICVzLCBmaXJzdCBjaGFyYWN0ZXIgY2FuIG9ubHkgYmUg
Jy0nIG9yIGFzY2lpIGRpZ2l0LiIsIG1heEFnZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBib29sIG9rOworICAgIGludCB2YWx1ZSA9IG1heEFnZS50b0lu
dFN0cmljdCgmb2ssIDEwKTsKKworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJD
b3VsZCBub3QgcGFyc2UgTWF4LUFnZSA6ICVzIiwgbWF4QWdlLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2V4cGlyeSA9IHZhbHVlOworICAgIG1faXNNYXhB
Z2VTZXQgPSB0cnVlOworICAgIG1faXNTZXNzaW9uID0gZmFsc2U7CisKKyAgICAvLyBJZiBtYXhB
Z2UgdmFsdWUgaXMgbm90IHBvc2l0aXZlLCBsZXQgZXhwaXJ5LXRpbWUgYmUgdGhlIGVhcmxpZXN0
IHJlcHJlc2VudGFibGUgdGltZS4KKyAgICBpZiAobV9leHBpcnkgPiAwKQorICAgICAgICBtX2V4
cGlyeSArPSBjdXJyZW50VGltZSgpOworICAgIGVsc2UKKyAgICAgICAgbV9leHBpcnkgPSAwOwor
fQorCit2b2lkIFBhcnNlZENvb2tpZTo6c2V0RGVmYXVsdERvbWFpbihjb25zdCBLVVJMJiByZXF1
ZXN0VVJMKQoreworICAgIHNldERvbWFpbihyZXF1ZXN0VVJMLmhvc3QoKSk7CisgICAgbV9oYXNE
ZWZhdWx0RG9tYWluID0gdHJ1ZTsKK30KKworYm9vbCBQYXJzZWRDb29raWU6Omhhc0V4cGlyZWQo
KSBjb25zdAoreworICAgIC8vIFNlc3Npb24gY29va2llcyBkbyBub3QgZXhwaXJlcywgdGhleSB3
aWxsIGp1c3Qgbm90IGJlIHNhdmVkIHRvIHRoZSBiYWNraW5nIHN0b3JlLgorICAgIHJldHVybiAh
bV9pc1Nlc3Npb24gJiYgKG1faXNGb3JjZUV4cGlyZWQgfHwgbV9leHBpcnkgPCBjdXJyZW50VGlt
ZSgpKTsKK30KKworYm9vbCBQYXJzZWRDb29raWU6OmlzVW5kZXJTaXplTGltaXQoKSBjb25zdAor
eworICAgIHJldHVybiBtX3ZhbHVlLmxlbmd0aCgpIDw9IENvb2tpZU1hbmFnZXI6Om1heENvb2tp
ZUxlbmd0aCgpICYmIG1fbmFtZS5sZW5ndGgoKSA8PSBDb29raWVNYW5hZ2VyOjptYXhDb29raWVM
ZW5ndGgoKTsKK30KKworU3RyaW5nIFBhcnNlZENvb2tpZTo6dG9TdHJpbmcoKSBjb25zdAorewor
ICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLmFwcGVuZChuYW1lKCkpOwor
ICAgIGJ1aWxkZXIuYXBwZW5kKCIgPSAiKTsKKyAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSgpKTsK
KyAgICBidWlsZGVyLmFwcGVuZCgiOyBEb21haW4gPSAiKTsKKyAgICBidWlsZGVyLmFwcGVuZChk
b21haW4oKSk7CisgICAgYnVpbGRlci5hcHBlbmQoIjsgUGF0aCA9ICIpOworICAgIGJ1aWxkZXIu
YXBwZW5kKHBhdGgoKSk7CisgICAgYnVpbGRlci5hcHBlbmQoIjsgUHJvdG9jb2wgPSAiKTsKKyAg
ICBidWlsZGVyLmFwcGVuZChwcm90b2NvbCgpKTsKKyAgICByZXR1cm4gYnVpbGRlci50b1N0cmlu
ZygpOworfQorCitTdHJpbmcgUGFyc2VkQ29va2llOjp0b05hbWVWYWx1ZVBhaXIoKSBjb25zdAor
eworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcgZXF1YWwoIj0iKTsKKworICAgIHNpemVfdCBjb29r
aWVMZW5ndGggPSBtX25hbWUubGVuZ3RoKCkgKyBtX3ZhbHVlLmxlbmd0aCgpICsgMjsKKyAgICBW
ZWN0b3I8VUNoYXI+IHJlc3VsdDsKKyAgICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShj
b29raWVMZW5ndGgpOworICAgIGFwcGVuZChyZXN1bHQsIG1fbmFtZSk7CisgICAgYXBwZW5kKHJl
c3VsdCwgZXF1YWwpOworICAgIGFwcGVuZChyZXN1bHQsIG1fdmFsdWUpOworCisgICAgcmV0dXJu
IFN0cmluZzo6YWRvcHQocmVzdWx0KTsKK30KKwordm9pZCBQYXJzZWRDb29raWU6OmFwcGVuZFdl
YkNvcmVDb29raWUoVmVjdG9yPENvb2tpZT4mIGNvb2tpZVZlY3RvcikgY29uc3QKK3sKKyAgICBj
b29raWVWZWN0b3IuYXBwZW5kKENvb2tpZShTdHJpbmcobV9uYW1lKSwgU3RyaW5nKG1fdmFsdWUp
LCBTdHJpbmcobV9kb21haW4pLAorICAgICAgICAgICAgU3RyaW5nKG1fcGF0aCksIG1fZXhwaXJ5
LCBtX2lzSHR0cE9ubHksIG1faXNTZWN1cmUsIG1faXNTZXNzaW9uKSk7Cit9Cit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2Jl
cnJ5L1BhcnNlZENvb2tpZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Q
YXJzZWRDb29raWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MjFiZDlhM2ExZTQzNjlkMTU5NGM0ZTUyZTdhODdm
Mjk2YTk4MTBkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxh
Y2tiZXJyeS9QYXJzZWRDb29raWUuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWls
LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGFyc2VkQ29va2llX2gKKyNkZWZpbmUg
UGFyc2VkQ29va2llX2gKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorCituYW1lc3BhY2UgV1RGIHsK
K2NsYXNzIFN0cmluZzsKK30KK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgS1VSTDsKKwor
Ly8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29va2llIGludGVybmFsbHkKKy8vIEl0IGNhbiBl
aXRoZXIgYmUgY3JlYXRlZCBieSB0aGUgQ29va2llUGFyc2VyIHdoaWNoIHdpbGwgdGhlbiBmaWxs
IGl0CisvLyBvciBpdCBjYW4gYmUgY3JlYXRlZCBieSB0aGUgYmFja2luZyBzdG9yZSBmaWxsaW5n
IGl0IGluIHRoZSBjb25zdHJ1Y3Rvci4KK2NsYXNzIFBhcnNlZENvb2tpZSB7CitwdWJsaWM6Cisg
ICAgLy8gRGVmYXVsdCBjb29raWUgOiBlbXB0eSBkb21haW4sIG5vbiBzZWN1cmUgYW5kIHNlc3Np
b24KKyAgICBQYXJzZWRDb29raWUoZG91YmxlIGN1cnJlbnRUaW1lKTsKKworICAgIC8vIEZvciBi
YWNraW5nIHN0b3JlIGNvb2tpZXMgKHRob3NlIGNvb2tpZXMgYXJlIG5ldmVyIHNlc3Npb24gY29v
a2llcykuCisgICAgUGFyc2VkQ29va2llKGNvbnN0IFN0cmluZyYgLypuYW1lKi8sIGNvbnN0IFN0
cmluZyYgLyp2YWx1ZSovLCBjb25zdCBTdHJpbmcmIC8qZG9tYWluKi8sY29uc3QgU3RyaW5nJiAv
KnByb3RvY29sKi8sIGNvbnN0IFN0cmluZyYgLypwYXRoKi8sIGRvdWJsZSAvKmV4cGlyeSovLCBk
b3VibGUgLypsYXN0QWNjZXNzZWQqLywgZG91YmxlIC8qY3JlYXRpb25UaW1lKi8sIGJvb2wgLypp
c1NlY3VyZSovLCBib29sIC8qaXNIdHRwT25seSovKTsKKworICAgIFBhcnNlZENvb2tpZShjb25z
dCBQYXJzZWRDb29raWUqKTsKKworICAgIH5QYXJzZWRDb29raWUoKTsKKworICAgIGNvbnN0IFN0
cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIHZvaWQgc2V0TmFtZShj
b25zdCBTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorCisgICAgY29uc3QgU3RyaW5n
JiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2b2lkIHNldFZhbHVlKGNv
bnN0IFN0cmluZyYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9CisKKyAgICBjb25zdCBTdHJp
bmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBtX3BhdGg7IH0KKyAgICB2b2lkIHNldFBhdGgoY29u
c3QgU3RyaW5nJiBwYXRoKSB7IG1fcGF0aCA9IHBhdGg7IH0KKworICAgIGNvbnN0IFN0cmluZyYg
ZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbV9kb21haW47IH0KKyAgICB2b2lkIHNldERvbWFpbihj
b25zdCBTdHJpbmcmIGRvbWFpbikgeyBtX2RvbWFpbiA9IGRvbWFpbi5sb3dlcigpOyB9CisKKyAg
ICBjb25zdCBTdHJpbmcmIHByb3RvY29sKCkgY29uc3QgeyByZXR1cm4gbV9wcm90b2NvbDsgfQor
ICAgIHZvaWQgc2V0UHJvdG9jb2woY29uc3QgU3RyaW5nJiBwcm90b2NvbCkgeyBtX3Byb3RvY29s
ID0gcHJvdG9jb2w7IH0KKworICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhvZCB1c2VkIHRv
IHNldCB0aGUgZG9tYWluIHRvIHRoZSByZXF1ZXN0J3MgdXJsLgorICAgIHZvaWQgc2V0RGVmYXVs
dERvbWFpbihjb25zdCBLVVJMJik7CisgICAgYm9vbCBoYXNEZWZhdWx0RG9tYWluKCkgY29uc3Qg
eyByZXR1cm4gbV9oYXNEZWZhdWx0RG9tYWluOyB9CisKKyAgICBkb3VibGUgZXhwaXJ5KCkgY29u
c3QgeyByZXR1cm4gbV9leHBpcnk7IH0KKyAgICB2b2lkIHNldEV4cGlyeShjb25zdCBTdHJpbmcm
KTsKKyAgICB2b2lkIGZvcmNlRXhwaXJlKCkgeyBtX2lzRm9yY2VFeHBpcmVkICA9IHRydWU7IH0K
KyAgICB2b2lkIHNldE1heEFnZShjb25zdCBTdHJpbmcmKTsKKworICAgIGRvdWJsZSBsYXN0QWNj
ZXNzZWQoKSBjb25zdCB7IHJldHVybiBtX2xhc3RBY2Nlc3NlZDsgfQorICAgIHZvaWQgc2V0TGFz
dEFjY2Vzc2VkKGRvdWJsZSBsYXN0QWNjZXNzZWQpIHsgbV9sYXN0QWNjZXNzZWQgPSBsYXN0QWNj
ZXNzZWQ7fQorCisgICAgZG91YmxlIGNyZWF0aW9uVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fY3Jl
YXRpb25UaW1lOyB9CisgICAgdm9pZCBzZXRDcmVhdGlvblRpbWUoZG91YmxlIGNyZWF0aW9uVGlt
ZSkgeyBtX2NyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsgfQorCisgICAgYm9vbCBpc1NlY3Vy
ZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNTZWN1cmU7IH0KKyAgICB2b2lkIHNldFNlY3VyZUZsYWco
Ym9vbCBzZWN1cmUpIHsgbV9pc1NlY3VyZSA9IHNlY3VyZTsgfQorCisgICAgYm9vbCBpc0h0dHBP
bmx5KCkgY29uc3QgeyByZXR1cm4gbV9pc0h0dHBPbmx5OyB9CisgICAgdm9pZCBzZXRJc0h0dHBP
bmx5KGJvb2wgaXNIdHRwT25seSkgeyBtX2lzSHR0cE9ubHkgPSBpc0h0dHBPbmx5OyB9CisKKyAg
ICBib29sIGlzU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1faXNTZXNzaW9uOyB9CisKKyAgICBi
b29sIGhhc0V4cGlyZWQoKSBjb25zdDsKKyAgICBib29sIGlzRm9yY2VFeHBpcmVkKCkgY29uc3Qg
eyByZXR1cm4gbV9pc0ZvcmNlRXhwaXJlZDsgfQorICAgIGJvb2wgaXNVbmRlclNpemVMaW1pdCgp
IGNvbnN0OworCisgICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgU3RyaW5nIHRvTmFt
ZVZhbHVlUGFpcigpIGNvbnN0OworICAgIHZvaWQgYXBwZW5kV2ViQ29yZUNvb2tpZShWZWN0b3I8
Q29va2llPiYgY29va2llVmVjdG9yKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9u
YW1lOworICAgIFN0cmluZyBtX3ZhbHVlOworICAgIFN0cmluZyBtX2RvbWFpbjsKKyAgICBTdHJp
bmcgbV9wcm90b2NvbDsKKyAgICBTdHJpbmcgbV9wYXRoOworICAgIGRvdWJsZSBtX2V4cGlyeTsK
KyAgICBib29sIG1faXNNYXhBZ2VTZXQ7CisKKyAgICBkb3VibGUgbV9jcmVhdGlvblRpbWU7Cisg
ICAgLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgTFJVIHJlcGxhY2VtZW50IHBvbGljeS4KKyAgICBk
b3VibGUgbV9sYXN0QWNjZXNzZWQ7CisKKyAgICBib29sIG1faGFzRGVmYXVsdERvbWFpbjsKKyAg
ICBib29sIG1faXNTZWN1cmU7CisgICAgYm9vbCBtX2lzSHR0cE9ubHk7CisgICAgYm9vbCBtX2lz
U2Vzc2lvbjsKKyAgICBib29sIG1faXNGb3JjZUV4cGlyZWQ7Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBQYXJzZWRDb29raWVfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128303</attachid>
            <date>2012-02-22 15:31:25 -0800</date>
            <delta_ts>2012-02-23 10:30:27 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73654-20120222183201.patch</filename>
            <type>text/plain</type>
            <size>108396</size>
            <attacher name="Konrad Piascik">kpiascik</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTkwNGZmYTlmZThhMjRm
Y2Y4NDg2MmJjYmZjYmY0YTAwNWFiODE1OS4uN2ZmMWJmYTgxYmRiYTcwYzA4ZGNlMjg3NmMyMzRj
NDg2Y2FlNTI1MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI3IEBACisyMDEyLTAyLTIyICBLb25y
YWQgUGlhc2NpayAgPGtwaWFzY2lrQHJpbS5jb20+CisKKyAgICAgICAgVXBzdHJlYW0gQmxhY2tC
ZXJyeSBDb29raWUgTWFuYWdlbWVudCBDbGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZGVkIE1hbnVhbFRlc3RzL2Nvb2tpZVNwZWVkVGVzdC5o
dG1sIGFzIHdlbGwgYXMgdGVzdGVkIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgb24gdGhlIEJsYWNr
QmVycnkgcG9ydCB3aXRoIGh0dHA6Ly90ZXN0c3VpdGVzLm9wZXJhLmNvbS9jb29raWVzLworICAg
ICAgICBQYXNzZXMgYWxsIG5vbiBDb29raWUgMiB0ZXN0cyBzaW5jZSBDb29raWUgMiBpcyBub3Qg
aW1wbGVtZW50ZWQvc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgRXJyb3IgaGFuZGxp
bmcgYW5kIGV4dGVuZGVkIHRlc3RzIGRvIG5vdCBhbGwgcGFzcyBhbmQgd2lsbCBiZSB1cGRhdGVk
IHdpdGggZnV0dXJlIGJ1Z3MvcGF0Y2hlcy4KKworICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVy
cnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmg6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llSmFyQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmg6IEFkZGVkLgorICAgICAgICAqIHBs
YXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgQW5kcmV5
IEtvc3lha292ICA8Y2FzZXFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6
IFtleHBlcmltZW50YWxdIGFkZCBhIG1vZGUgdG8gZGlzcGxheSB0aW1lbGluZSBldmVudHMgYWxp
Z25lZCBieSB0aGUgc3RhcnQgdGltZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi43MzE5Y2IwNDVlODUwMmNmZDllZGZiMjUxZThlMmUwN2I2YTBlZDBjCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCAr
MSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNo
YWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjZGVmaW5lIEVOQUJMRV9D
T09LSUVfREVCVUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmUuaCIKKworI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNs
dWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiU1FM
aXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSAiU1FMaXRlVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5n
Lmg+CisKKyNpZiBFTkFCTEVfQ09PS0lFX0RFQlVHCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtTG9nLmg+CisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBmb3Jt
YXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4u
KQorI2VuZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1FeGVjdXRhYmxlTWVzc2Fn
ZS5oPgorCit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TWVzc2FnZUNsaWVudDsKK3VzaW5n
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUeXBlZFJlcGx5QnVmZmVyOwordXNpbmcgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlOworCitzdGF0aWMgY29uc3QgZG91
YmxlIHNfZGF0YWJhc2VUaW1lckludGVydmFsID0gMjsKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUo
KQorICAgIDogTWVzc2FnZUNsaWVudChNZXNzYWdlQ2xpZW50OjpSZXBseUZlYXR1cmUgfCBNZXNz
YWdlQ2xpZW50OjpTeW5jRmVhdHVyZSkKKyAgICAsIG1fdGFibGVOYW1lKCJjb29raWVzIikgLy8g
VGhpcyBpcyBjaG9zZW4gdG8gbWF0Y2ggTW96aWxsYSdzIHRhYmxlIG5hbWUuCisgICAgLCBtX2Ri
VGltZXIodGhpcywgJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0
YWJhc2VUaW1lckZpcmVkKQorICAgICwgbV9pbnNlcnRTdGF0ZW1lbnQoMCkKKyAgICAsIG1fdXBk
YXRlU3RhdGVtZW50KDApCisgICAgLCBtX2RlbGV0ZVN0YXRlbWVudCgwKQoreworICAgIG1fZGJU
aW1lckNsaWVudCA9IG5ldyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R2VuZXJpY1RpbWVyQ2xpZW50
KHRoaXMpOworICAgIG1fZGJUaW1lci5zZXRDbGllbnQobV9kYlRpbWVyQ2xpZW50KTsKKworICAg
IHB0aHJlYWRfYXR0cl90IHRocmVhZEF0dHJzOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJl
YWRBdHRycyk7CisgICAgY3JlYXRlVGhyZWFkKCJjb29raWVfZGF0YWJhc2UiLCB0aHJlYWRBdHRy
cyk7Cit9CisKK0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp+Q29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBtX2RiVGltZXJDbGllbnQ7CisgICAgbV9kYlRpbWVy
Q2xpZW50ID0gMDsKKyAgICAvLyBGSVhNRTogVGhpcyBvYmplY3Qgd2lsbCBuZXZlciBiZSBkZWxl
dGVkIGR1ZSB0byB0aGUgc2V0IHVwIG9mIENvb2tpZU1hbmFnZXIgKGl0J3MgYSBzaW5nbGV0b24p
CisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBEZXN0cnVjdGluZyIpOworI2lm
bmRlZiBOREVCVUcKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIEFTU0VSVChtX2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAgfQorI2VuZGlm
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnVwZ3JhZGVUYWJsZUlmTmVl
ZGVkKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VGaWVsZHMsIGNvbnN0IFN0cmluZyYgcHJpbWFyeUtl
eUZpZWxkcykKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgYm9vbCBj
cmVhdGlvblRpbWVFeGlzdHMgPSBmYWxzZTsKKyAgICBib29sIHByb3RvY29sRXhpc3RzID0gZmFs
c2U7CisKKyAgICBpZiAoIW1fZGIudGFibGVFeGlzdHMobV90YWJsZU5hbWUpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgdGFibGUgaGFzIHRoZSByZXF1
aXJlZCBkYXRhYmFzZSBmaWVsZHMKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJQUkFH
TUEgdGFibGVfaW5mbygiICsgbV90YWJsZU5hbWUgKyAiKTsiOworCisgICAgICAgIFNRTGl0ZVN0
YXRlbWVudCBzdGF0ZW1lbnQobV9kYiwgcXVlcnkpOworICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgcHJlcGFyZSBzdGF0ZW1l
bnQgdG8gcXVlcnkgY29va2llIHRhYmxlIGluZm8uIHNxbDolcyIsIHF1ZXJ5LnV0ZjgoKS5kYXRh
KCkpOworICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpID09IFNRTFJlc3VsdFJvdykgeworICAgICAg
ICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIGNyZWF0aW9uVGltZSwgKCJjcmVhdGlv
blRpbWUiKSk7CisgICAgICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgcHJvdG9j
b2wsICgicHJvdG9jb2wiKSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHN0YXRlbWVudC5n
ZXRDb2x1bW5UZXh0KDEpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gY3JlYXRpb25UaW1lKQor
ICAgICAgICAgICAgICAgIGNyZWF0aW9uVGltZUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICBp
ZiAobmFtZSA9PSBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICBwcm90b2NvbEV4aXN0cyA9IHRy
dWU7CisgICAgICAgICAgICBpZiAoY3JlYXRpb25UaW1lRXhpc3RzICYmIHByb3RvY29sRXhpc3Rz
KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMT0coTmV0d29y
aywgIk5lZWQgdG8gdXBkYXRlIGNvb2tpZSB0YWJsZSBzY2hlbWEuIik7CisgICAgfQorCisgICAg
Ly8gRHJvcCBhbmQgcmVjcmVhdGUgdGhlIGNvb2tpZSB0YWJsZSB0byB1cGRhdGUgdG8gdGhlIGxh
dGVzdCBkYXRhYmFzZSBmaWVsZHMuCisgICAgLy8gV2UgZG8gbm90IHVzZSBhbHRlciB0YWJsZSAt
IGFkZCBjb2x1bW4gYmVjYXVzZSB0aGF0IG1ldGhvZCBjYW5ub3QgYWRkIHByaW1hcnkga2V5cy4K
KyAgICBWZWN0b3I8U3RyaW5nPiBjb21tYW5kczsKKworICAgIC8vIEJhY2t1cCBleGlzdGluZyB0
YWJsZQorICAgIFN0cmluZyByZW5hbWVRdWVyeSA9ICJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5h
bWUgKyAiIFJFTkFNRSBUTyBCYWNrdXBfIiArIG1fdGFibGVOYW1lICsgIjsiOworICAgIGNvbW1h
bmRzLmFwcGVuZChyZW5hbWVRdWVyeSk7CisKKyAgICAvLyBSZWNyZWF0ZSB0aGUgY29va2llIHRh
YmxlIHVzaW5nIHRoZSBuZXcgZGF0YWJhc2UgYW5kIHByaW1hcnkga2V5IGZpZWxkcworICAgIFN0
cmluZyBjcmVhdGVUYWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgIik7CisgICAgY3JlYXRlVGFibGVR
dWVyeSArPSBtX3RhYmxlTmFtZTsKKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIgKyBkYXRh
YmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzICsgIik7IjsKKyAgICBjb21tYW5k
cy5hcHBlbmQoY3JlYXRlVGFibGVRdWVyeSk7CisKKyAgICAvLyBDb3B5IHRoZSBvbGQgZGF0YSBp
bnRvIHRoZSBuZXcgdGFibGUuIElmIGEgY29sdW1uIGRvZXMgbm90IGV4aXN0cywKKyAgICAvLyB3
ZSBoYXZlIHRvIHB1dCBhICcnIGluIHRoZSBzZWxlY3Qgc3RhdGVtZW50IHRvIG1ha2UgdGhlIG51
bWJlciBvZiBjb2x1bW5zCisgICAgLy8gZXF1YWwgaW4gdGhlIGluc2VydCBzdGF0ZW1lbnQuCisg
ICAgU3RyaW5nIG1pZ3JhdGlvblF1ZXJ5KCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICIpOworICAg
IG1pZ3JhdGlvblF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIG1pZ3JhdGlvblF1ZXJ5ICs9ICIg
U0VMRUNUICoiOworICAgIGlmICghY3JlYXRpb25UaW1lRXhpc3RzKQorICAgICAgICBtaWdyYXRp
b25RdWVyeSArPSAiLCcnIjsKKyAgICBpZiAoIXByb3RvY29sRXhpc3RzKQorICAgICAgICBtaWdy
YXRpb25RdWVyeSArPSAiLCcnIjsKKyAgICBtaWdyYXRpb25RdWVyeSArPSAiIEZST00gQmFja3Vw
XyIgKyBtX3RhYmxlTmFtZTsKKyAgICBjb21tYW5kcy5hcHBlbmQobWlncmF0aW9uUXVlcnkpOwor
CisgICAgLy8gVGhlIG5ldyBjb2x1bW5zIHdpbGwgYmUgYmxhbmssIHNldCB0aGUgbmV3IHZhbHVl
cy4KKyAgICBpZiAoIWNyZWF0aW9uVGltZUV4aXN0cykgeworICAgICAgICBTdHJpbmcgc2V0Q3Jl
YXRpb25UaW1lUXVlcnkgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIGNyZWF0aW9u
VGltZSA9IGxhc3RBY2Nlc3NlZDsiOworICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2V0Q3JlYXRp
b25UaW1lUXVlcnkpOworICAgIH0KKworICAgIGlmICghcHJvdG9jb2xFeGlzdHMpIHsKKyAgICAg
ICAgU3RyaW5nIHNldFByb3RvY29sUXVlcnkgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIg
U0VUIHByb3RvY29sID0gJ2h0dHAnIFdIRVJFIGlzU2VjdXJlID0gJzAnOyI7CisgICAgICAgIFN0
cmluZyBzZXRQcm90b2NvbFF1ZXJ5MiA9ICJVUERBVEUgIiArIG1fdGFibGVOYW1lICsgIiBTRVQg
cHJvdG9jb2wgPSAnaHR0cHMnIFdIRVJFIGlzU2VjdXJlID0gJzEnOyI7CisgICAgICAgIGNvbW1h
bmRzLmFwcGVuZChzZXRQcm90b2NvbFF1ZXJ5KTsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5kKHNl
dFByb3RvY29sUXVlcnkyKTsKKyAgICB9CisKKyAgICAvLyBEcm9wIHRoZSBiYWNrdXAgdGFibGUK
KyAgICBTdHJpbmcgZHJvcEJhY2t1cFF1ZXJ5ID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTIEJhY2t1
cF8iICsgbV90YWJsZU5hbWUgKyAiOyI7CisgICAgY29tbWFuZHMuYXBwZW5kKGRyb3BCYWNrdXBR
dWVyeSk7CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RiLCBmYWxzZSk7
CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKyAgICBzaXplX3QgY29tbWFuZFNpemUgPSBjb21t
YW5kcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21tYW5kU2l6ZTsgKytp
KSB7CisgICAgICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZChjb21tYW5kc1tpXSkpIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFsdGVyIGNvb2tpZSB0YWJsZSB3aGVuIGV4
ZWN1dGluZyBzcWw6JXMiLCBjb21tYW5kc1tpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAg
IExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjaygpOworCisgICAgICAgICAgICAv
LyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBpZiB3ZSBkbywgcmVuYW1lIHRoZSBjdXJy
ZW50IGNvb2tpZSB0YWJsZSBmb3IgZnV0dXJlIHJlc3RvcmF0aW9uLiBUaGlzIGhhcyB0aGUgc2lk
ZSBlZmZlY3Qgb2YKKyAgICAgICAgICAgIC8vIGNsZWFyaW5nIHRoZSBjdXJyZW50IGNvb2tpZSB0
YWJsZSwgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiBjb250aW51YWxseSBoaXR0aW5nIHRoaXMgY2Fz
ZSBhbmQgaGVuY2UgbmV2ZXIgYmVpbmcgYWJsZSB0byB1c2UgdGhlCisgICAgICAgICAgICAvLyBj
b29raWUgdGFibGUuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgIFN0cmluZyByZW5hbWVRdWVyeSA9ICJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5hbWUgKyAi
IFJFTkFNRSBUTyBCYWNrdXAyXyIgKyBtX3RhYmxlTmFtZSArICI7IjsKKyAgICAgICAgICAgIGlm
ICghbV9kYi5leGVjdXRlQ29tbWFuZChyZW5hbWVRdWVyeSkpIHsKKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoIkZhaWxlZCB0byBiYWNrdXAgZXhpc3RpbmcgY29va2llIHRhYmxlLiIpOworICAg
ICAgICAgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5s
YXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICB9CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgTE9HKE5ldHdvcmss
ICJTdWNjZXNzZnVsbHkgdXBkYXRlZCBjb29raWUgdGFibGUgc2NoZW1hLiIpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpvcGVuKGNvbnN0IFN0cmluZyYgY29va2llSmFy
KQoreworICAgIGRpc3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZU9wZW4sIHRoaXMsIGNvb2tpZUphcikpOworfQor
Cit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuKGNvbnN0IFN0cmlu
ZyYgY29va2llSmFyKQoreworICAgIEFTU0VSVChpc0N1cnJlbnRUaHJlYWQoKSk7CisgICAgaWYg
KG1fZGIuaXNPcGVuKCkpCisgICAgICAgIGNsb3NlKCk7CisKKyAgICBpZiAoIW1fZGIub3Blbihj
b29raWVKYXIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IG9wZW4gdGhlIGNvb2tp
ZSBkYXRhYmFzZS4gTm8gY29va2llIHdpbGwgYmUgc3RvcmVkISIpOworICAgICAgICBMT0dfRVJS
T1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYi5leGVjdXRlQ29tbWFuZCgiUFJBR01BIGxv
Y2tpbmdfbW9kZT1FWENMVVNJVkU7Iik7CisgICAgbV9kYi5leGVjdXRlQ29tbWFuZCgiUFJBR01B
IGpvdXJuYWxfbW9kZT1UUlVOQ0FURTsiKTsKKworICAgIGNvbnN0IFN0cmluZyBwcmltYXJ5S2V5
RmllbGRzKCJQUklNQVJZIEtFWSAocHJvdG9jb2wsIGhvc3QsIHBhdGgsIG5hbWUpIik7CisgICAg
Y29uc3QgU3RyaW5nIGRhdGFiYXNlRmllbGRzKCJuYW1lIFRFWFQsIHZhbHVlIFRFWFQsIGhvc3Qg
VEVYVCwgcGF0aCBURVhULCBleHBpcnkgRE9VQkxFLCBsYXN0QWNjZXNzZWQgRE9VQkxFLCBpc1Nl
Y3VyZSBJTlRFR0VSLCBpc0h0dHBPbmx5IElOVEVHRVIsIGNyZWF0aW9uVGltZSBET1VCTEUsIHBy
b3RvY29sIFRFWFQiKTsKKyAgICAvLyBVcGRhdGUgdGFibGUgdG8gYWRkIHRoZSBuZXcgY29sdW1u
IGNyZWF0aW9uVGltZSBhbmQgcHJvdG9jb2wgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5Lgor
ICAgIHVwZ3JhZGVUYWJsZUlmTmVlZGVkKGRhdGFiYXNlRmllbGRzLCBwcmltYXJ5S2V5RmllbGRz
KTsKKworICAgIC8vIENyZWF0ZSB0YWJsZSBpZiBub3QgZXhzaXN0IGluIGNhc2UgdGhhdCB0aGUg
dXBncmFkZVRhYmxlSWZOZWVkZWQoKSBmYWlsZWQgYWNjaWRlbnRhbGx5LgorICAgIFN0cmluZyBj
cmVhdGVUYWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiKTsKKyAgICBjcmVh
dGVUYWJsZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIC8vIFRoaXMgdGFibGUgc2NoZW1hIGlz
IGNvbXBsaWFudCB3aXRoIE1vemlsbGEncy4KKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIg
KyBkYXRhYmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzKyIpOyI7CisKKyAgICBp
ZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoY3JlYXRlVGFibGVRdWVyeSkpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgY29va2llcyBp
bnRvLiBObyBjb29raWUgd2lsbCBiZSBzdG9yZWQhIik7CisgICAgICAgIExPR19FUlJPUigiU1FM
aXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGNs
b3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcgaW5zZXJ0UXVlcnko
IklOU0VSVCBPUiBSRVBMQUNFIElOVE8gIik7CisgICAgaW5zZXJ0UXVlcnkgKz0gbV90YWJsZU5h
bWU7CisgICAgaW5zZXJ0UXVlcnkgKz0gIiAobmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGly
eSwgbGFzdEFjY2Vzc2VkLCBpc1NlY3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90
b2NvbCkgVkFMVUVTICg/MSwgPzIsID8zLCA/NCwgPzUsID82LCA/NywgPzgsID85LCA/MTApOyI7
CisKKyAgICBtX2luc2VydFN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgaW5z
ZXJ0UXVlcnkpOworICAgIGlmIChtX2luc2VydFN0YXRlbWVudC0+cHJlcGFyZSgpKSB7CisgICAg
ICAgIExPR19FUlJPUigiQ2Fubm90IHNhdmUgY29va2llcyIpOworICAgICAgICBMT0dfRVJST1Io
IlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0K
KworICAgIFN0cmluZyB1cGRhdGVRdWVyeSgiVVBEQVRFICIpOworICAgIHVwZGF0ZVF1ZXJ5ICs9
IG1fdGFibGVOYW1lOworICAgIC8vIFRoZSB3aGVyZSBzdGF0ZW1lbnQgaXMgY2hvc2VuIHRvIG1h
dGNoIENvb2tpZU1hcCBrZXkuCisgICAgdXBkYXRlUXVlcnkgKz0gIiBTRVQgbmFtZSA9ID8xLCB2
YWx1ZSA9ID8yLCBob3N0ID0gPzMsIHBhdGggPSA/NCwgZXhwaXJ5ID0gPzUsIGxhc3RBY2Nlc3Nl
ZCA9ID82LCBpc1NlY3VyZSA9ID83LCBpc0h0dHBPbmx5ID0gPzgsIGNyZWF0aW9uVGltZSA9ID85
LCBwcm90b2NvbCA9ID8xMCB3aGVyZSBwcm90b2NvbCA9ID8xMCBhbmQgbmFtZSA9ID8xIGFuZCBo
b3N0ID0gPzMgYW5kIHBhdGggPSA/NDsiOworICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gbmV3IFNR
TGl0ZVN0YXRlbWVudChtX2RiLCB1cGRhdGVRdWVyeSk7CisKKyAgICBpZiAobV91cGRhdGVTdGF0
ZW1lbnQtPnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCB1cGRhdGUgY29v
a2llcyIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1f
ZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVM
RVRFIEZST00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgLy8gVGhl
IHdoZXJlIHN0YXRlbWVudCBpcyBjaG9zZW4gdG8gbWF0Y2ggQ29va2llTWFwIGtleS4KKyAgICBk
ZWxldGVRdWVyeSArPSAiIFdIRVJFIG5hbWU9PzEgYW5kIGhvc3Q9PzIgYW5kIHBhdGg9PzMgYW5k
IHByb3RvY29sPT80OyI7CisgICAgbV9kZWxldGVTdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVt
ZW50KG1fZGIsIGRlbGV0ZVF1ZXJ5KTsKKworICAgIGlmIChtX2RlbGV0ZVN0YXRlbWVudC0+cHJl
cGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29raWVzIik7Cisg
ICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJy
b3JNc2coKSk7CisgICAgfQorCit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6
OmNsb3NlKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gQ2xvc2luZyIpOworCisgICAgc2l6ZV90IGNoYW5nZWRD
b29raWVzU2l6ZTsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIGlmIChtX2RiVGltZXIuc3RhcnRlZCgpKQorICAgICAgICAgICAgbV9kYlRpbWVyLnN0
b3AoKTsKKyAgICAgICAgY2hhbmdlZENvb2tpZXNTaXplID0gbV9jaGFuZ2VkQ29va2llcy5zaXpl
KCk7CisgICAgfQorCisgICAgaWYgKGNoYW5nZWRDb29raWVzU2l6ZSA+IDApCisgICAgICAgIGlu
dm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgZGVsZXRlIG1faW5zZXJ0U3RhdGVt
ZW50OworICAgIG1faW5zZXJ0U3RhdGVtZW50ID0gMDsKKyAgICBkZWxldGUgbV91cGRhdGVTdGF0
ZW1lbnQ7CisgICAgbV91cGRhdGVTdGF0ZW1lbnQgPSAwOworICAgIGRlbGV0ZSBtX2RlbGV0ZVN0
YXRlbWVudDsKKyAgICBtX2RlbGV0ZVN0YXRlbWVudCA9IDA7CisKKyAgICBpZiAobV9kYi5pc09w
ZW4oKSkKKyAgICAgICAgbV9kYi5jbG9zZSgpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlOjppbnNlcnQoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29v
a2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgaW5zZXJ0aW5nIGNvb2tpZSAlcyB0
byBxdWV1ZS4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgYWRkVG9D
aGFuZ2VRdWV1ZShjb29raWUsIEluc2VydCk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmU6OnVwZGF0ZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICBDb29r
aWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGFkZGluZyB1cGRhdGluZyBjb29raWUgJXMgdG8g
cXVldWUuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFkZFRvQ2hh
bmdlUXVldWUoY29va2llLCBVcGRhdGUpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjpyZW1vdmUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29va2ll
TG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgZGVsZXRpbmcgY29va2llICVzIHRvIHF1
ZXVlLiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBhZGRUb0NoYW5n
ZVF1ZXVlKGNvb2tpZSwgRGVsZXRlKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZTo6cmVtb3ZlQWxsKCkKK3sKKyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2Fs
bE1lc3NhZ2UoJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VSZW1vdmVBbGwsIHRo
aXMpKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3Zl
QWxsKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICghbV9kYi5p
c09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5n
U3RvcmUgLSByZW1vdmUgQWxsIGNvb2tpZXMgZnJvbSBiYWNraW5nc3RvcmUiKTsKKworICAgIHsK
KyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgbV9jaGFuZ2VkQ29v
a2llcy5jbGVhcigpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVMRVRFIEZS
T00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgZGVsZXRlUXVlcnkg
Kz0gIjsiOworCisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RiLCBkZWxl
dGVRdWVyeSk7CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJDb3VsZCBub3QgcHJlcGFyZSBERUxFVEUgKiBzdGF0ZW1lbnQiKTsKKyAgICAg
ICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1z
ZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZGVsZXRlU3RhdGVtZW50
LmV4ZWN1dGVDb21tYW5kKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNv
b2tpZSBmcm9tIGRhdGFiYXNlIik7CisgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1l
c3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OmdldENvb2tpZXNGcm9tRGF0
YWJhc2UoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQgaW50
IGxpbWl0KQoreworICAgIC8vIEl0IGlzIG5vdCBhIGh1Z2UgcGVyZm9ybWFuY2UgaGl0IHRvIHdh
aXQgb24gdGhlIHJlcGx5IGhlcmUgYmVjYXVzZSB0aGlzIGlzIG9ubHkgZG9uZSBvbmNlIGR1cmlu
ZyBzZXR1cCBhbmQgd2hlbiB0dXJuaW5nIG9mZiBwcml2YXRlIG1vZGUuCisgICAgVHlwZWRSZXBs
eUJ1ZmZlcjwgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiA+IHJlcGx5QnVmZmVyKDApOworICAgIGRp
c3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZVdpdGhSZXR1cm4oJkNvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0LCAmcmVwbHlCdWZm
ZXIsIHRoaXMsIGxpbWl0KSk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBjb29raWVzID0g
cmVwbHlCdWZmZXIucG9pbnRlcigpOworICAgIHN0YWNrT2ZDb29raWVzLnN3YXAoKmNvb2tpZXMp
OworICAgIGRlbGV0ZSBjb29raWVzOworfQorCitWZWN0b3I8UGFyc2VkQ29va2llKj4qIENvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0KHVuc2lnbmVk
IGludCBsaW1pdCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgLy8g
Q2hlY2sgdGhhdCB0aGUgdGFibGUgZXhpc3RzIHRvIGF2b2lkIGRvaW5nIGFuIHVubmVjZXNzYXJ5
IHJlcXVlc3QuCisgICAgaWYgKCFtX2RiLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIFN0cmluZ0J1aWxkZXIgc2VsZWN0UXVlcnk7CisgICAgc2VsZWN0UXVlcnkuYXBwZW5kKCJT
RUxFQ1QgbmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBpc1Nl
Y3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90b2NvbCBGUk9NICIpOworICAgIHNl
bGVjdFF1ZXJ5LmFwcGVuZChtX3RhYmxlTmFtZSk7CisgICAgaWYgKGxpbWl0ID4gMCkgeworICAg
ICAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIiBPUkRFUiBCWSBsYXN0QWNjZXNzZWQgQVNDIik7Cisg
ICAgICAgIHNlbGVjdFF1ZXJ5LmFwcGVuZCgiIExJTUlUICIgKyBTdHJpbmc6Om51bWJlcihsaW1p
dCkpOworICAgIH0KKyAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIjsiKTsKKworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gaW52b2tlR2V0QWxsQ29va2llcyB3aXRoIHNlbGVjdCBx
dWVyeSAlcyIsIHNlbGVjdFF1ZXJ5LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBT
UUxpdGVTdGF0ZW1lbnQgc2VsZWN0U3RhdGVtZW50KG1fZGIsIHNlbGVjdFF1ZXJ5LnRvU3RyaW5n
KCkpOworCisgICAgaWYgKHNlbGVjdFN0YXRlbWVudC5wcmVwYXJlKCkpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDYW5ub3QgcmV0cmlldmVkIGNvb2tpZXMgZnJvbSB0aGUgZGF0YWJhc2UiKTsKKyAg
ICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJv
ck1zZygpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVmVjdG9yPFBhcnNlZENv
b2tpZSo+KiBjb29raWVzID0gbmV3IFZlY3RvcjxQYXJzZWRDb29raWUqPjsKKyAgICB3aGlsZSAo
c2VsZWN0U3RhdGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAgLy8gVGhl
cmUgaXMgYSByb3cgdG8gZmV0Y2gKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdFN0YXRl
bWVudC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZWxlY3RTdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDMpOworICAgICAgICBkb3VibGUgZXhwaXJ5ID0gc2VsZWN0
U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg0KTsKKyAgICAgICAgZG91YmxlIGxhc3RBY2Nlc3Nl
ZCA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoNSk7CisgICAgICAgIGJvb2wgaXNT
ZWN1cmUgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDYpOworICAgICAgICBib29sIGlz
SHR0cE9ubHkgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDcpOworICAgICAgICBkb3Vi
bGUgY3JlYXRpb25UaW1lID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg4KTsKKyAg
ICAgICAgU3RyaW5nIHByb3RvY29sID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRleHQoOSk7
CisKKyAgICAgICAgY29va2llcy0+YXBwZW5kKG5ldyBQYXJzZWRDb29raWUobmFtZSwgdmFsdWUs
IGRvbWFpbiwgcHJvdG9jb2wsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBjcmVhdGlvblRp
bWUsIGlzU2VjdXJlLCBpc0h0dHBPbmx5KSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvb2tpZXM7
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRh
YmFzZVN5bmNocm9ub3VzbHkoKQoreworICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3Jl
IC0gc2VuZGluZyB0byBkYXRhYmFzZSBpbW1lZGlhdGVseSIpOworICAgIHsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgaWYgKG1fZGJUaW1lci5zdGFydGVkKCkp
CisgICAgICAgICAgICBtX2RiVGltZXIuc3RvcCgpOworICAgIH0KKyAgICBkaXNwYXRjaFN5bmNN
ZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9y
ZTo6aW52b2tlU2VuZENoYW5nZXNUb0RhdGFiYXNlLCB0aGlzKSk7Cit9CisKK3ZvaWQgQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRhYmFzZShpbnQgbmV4dEludGVy
dmFsKQoreworICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgaWYgKCFtX2RiVGlt
ZXIuc3RhcnRlZCgpKSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0g
U3RhcnRpbmcgb25lIHNob3Qgc2VuZCB0byBkYXRhYmFzZSIpOworICAgICAgICBtX2RiVGltZXIu
c3RhcnQobmV4dEludGVydmFsKTsKKyAgICB9IGVsc2UgeworI2lmICFOREVCVUcKKyAgICAgICAg
Q29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBUaW1lciBhbHJlYWR5IHJ1bm5pbmcsIHNr
aXBwaW5nIHRoaXMgcmVxdWVzdCIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIENvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2VUaW1lckZpcmVkKCkKK3sK
KyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJkNvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlOjppbnZva2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UsIHRoaXMpKTsKK30K
Kwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlU2VuZENoYW5nZXNUb0Rh
dGFiYXNlKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgaWYgKCFt
X2RiLmlzT3BlbigpKSB7CisgICAgICAgIExPR19FUlJPUigiVGltZXIgRmlyZWQsIGJ1dCBkYXRh
YmFzZSBpcyBjbG9zZWQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8
Q29va2llQWN0aW9uPiBjaGFuZ2VkQ29va2llczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2Vy
IGxvY2sobV9tdXRleCk7CisgICAgICAgIGNoYW5nZWRDb29raWVzLnN3YXAobV9jaGFuZ2VkQ29v
a2llcyk7CisgICAgICAgIEFTU0VSVChtX2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAg
fQorCisgICAgaWYgKGNoYW5nZWRDb29raWVzLmlzRW1wdHkoKSkgeworICAgICAgICBDb29raWVM
b2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIFRpbWVyIGZpcmVkLCBidXQgbm8gY29va2llcyBpbiBj
aGFuZ2VsaXN0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ29va2llTG9nKCJDb29r
aWVCYWNraW5nU3RvcmUgLSBUaW1lciBmaXJlZCwgc2VuZGluZyBjaGFuZ2VzIHRvIGRhdGFiYXNl
LiBXZSBoYXZlICVkIGNoYW5nZXMiLCBjaGFuZ2VkQ29va2llcy5zaXplKCkpOworICAgIFNRTGl0
ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKG1fZGIsIGZhbHNlKTsKKyAgICB0cmFuc2FjdGlvbi5i
ZWdpbigpOworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGNo
YW5nZSBsaXN0IHRvIG1ha2UgY2FsbHMKKyAgICAvLyBJZiBlcnJvciBvY2N1cnMsIGlnbm9yZSBp
dCBhbmQgY29udGludWUgdG8gdGhlIG5leHQgc3RhdGVtZW50CisgICAgc2l6ZV90IHNpemVPZkNo
YW5nZSA9IGNoYW5nZWRDb29raWVzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHNpemVPZkNoYW5nZTsgaSsrKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCogbV9zdGF0ZW1l
bnQ7CisgICAgICAgIGNvbnN0IFBhcnNlZENvb2tpZSBjb29raWUgPSBjaGFuZ2VkQ29va2llc1tp
XS5maXJzdDsKKyAgICAgICAgVXBkYXRlUGFyYW1ldGVyIGFjdGlvbiA9IGNoYW5nZWRDb29raWVz
W2ldLnNlY29uZDsKKworICAgICAgICBpZiAoYWN0aW9uID09IERlbGV0ZSkgeworICAgICAgICAg
ICAgbV9zdGF0ZW1lbnQgPSBtX2RlbGV0ZVN0YXRlbWVudDsKKyAgICAgICAgICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gZGVsZXRpbmcgY29va2llICVzLiIsIGNvb2tpZS50b1N0
cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgICAgICAvLyBCaW5kcyBhbGwgdGhlIHZh
bHVlcworICAgICAgICAgICAgaWYgKG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29raWUubmFt
ZSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLmRvbWFpbigpKQorICAgICAg
ICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29raWUucGF0aCgpKSB8fCBt
X3N0YXRlbWVudC0+YmluZFRleHQoNCwgY29va2llLnByb3RvY29sKCkpKSB7CisgICAgICAgICAg
ICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgYmluZCBjb29raWUgZGF0YSB0byBkZWxldGUiKTsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIu
bGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICBD
b29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIHVwZGF0aW5nIGNvb2tpZSAlcy4iLCBjb29r
aWUudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBtX3N0YXRlbWVu
dCA9IG1fdXBkYXRlU3RhdGVtZW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGluc2VydGluZyBjb29raWUgJXMu
IiwgY29va2llLnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgbV9z
dGF0ZW1lbnQgPSBtX2luc2VydFN0YXRlbWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gQmluZHMgYWxsIHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIGlmIChtX3N0YXRlbWVudC0+
YmluZFRleHQoMSwgY29va2llLm5hbWUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGNv
b2tpZS52YWx1ZSgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgz
LCBjb29raWUuZG9tYWluKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCg0LCBjb29raWUucGF0
aCgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kRG91YmxlKDUsIGNvb2tp
ZS5leHBpcnkoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmREb3VibGUoNiwgY29va2llLmxhc3RBY2Nl
c3NlZCgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kSW50NjQoNywgY29v
a2llLmlzU2VjdXJlKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kSW50NjQoOCwgY29va2llLmlzSHR0
cE9ubHkoKSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZERvdWJsZSg5LCBj
b29raWUuY3JlYXRpb25UaW1lKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxMCwgY29va2ll
LnByb3RvY29sKCkpKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgYmluZCBj
b29raWUgZGF0YSB0byBzYXZlIik7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUg
RXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCByYyA9IG1fc3RhdGVtZW50LT5zdGVw
KCk7CisgICAgICAgIG1fc3RhdGVtZW50LT5yZXNldCgpOworICAgICAgICBpZiAocmMgIT0gU1FM
UmVzdWx0T2sgJiYgcmMgIT0gU1FMUmVzdWx0RG9uZSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJDYW5ub3QgbWFrZSBjYWxsIHRvIHRoZSBkYXRhYmFzZSIpOworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgQ29va2llTG9n
KCJDb29raWVCYWNraW5nU3RvcmUgLSB0cmFuc2FjdGlvbiBjb21wbGV0ZSIpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjphZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNl
ZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKQorewor
ICAgIEFTU0VSVCghY2hhbmdlZENvb2tpZS0+aXNTZXNzaW9uKCkpOworICAgIFBhcnNlZENvb2tp
ZSBjb29raWVDb3B5KGNoYW5nZWRDb29raWUpOworICAgIENvb2tpZUFjdGlvbiBhY3Rpb24oY29v
a2llQ29weSwgYWN0aW9uUGFyYW0pOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayht
X211dGV4KTsKKyAgICAgICAgbV9jaGFuZ2VkQ29va2llcy5hcHBlbmQoYWN0aW9uKTsKKyAgICAg
ICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBtX2NoYW5nZWRjb29raWVzIGhhcyAl
ZC4iLCBtX2NoYW5nZWRDb29raWVzLnNpemUoKSk7CisgICAgfQorICAgIHNlbmRDaGFuZ2VzVG9E
YXRhYmFzZShzX2RhdGFiYXNlVGltZXJJbnRlcnZhbCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iOWI3ZGVjZGQxZDY3
OTk4NjdmMGM5MzE4ZWE2NDM5ODQ1OWUxMTIzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxleW8uY29tPgorICog
Q29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9oCisjZGVm
aW5lIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlX2gKKworI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCisjaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJUaW1lci5oIgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybVRpbWVyLmg+CisjaW5jbHVkZSA8R2VuZXJpY1RpbWVyQ2xpZW50
Lmg+CisjaW5jbHVkZSA8VGhyZWFkVGltZXJDbGllbnQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nUHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYv
dGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2Vk
Q29va2llOworCitjbGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSA6IHB1YmxpYyBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TWVzc2FnZUNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLCBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06OlRocmVhZFRpbWVyQ2xpZW50
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUqIGNyZWF0
ZSgpIHsgcmV0dXJuIG5ldyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsgfQorCisgICAgdm9p
ZCBvcGVuKGNvbnN0IFN0cmluZyYgY29va2llSmFyKTsKKworICAgIHZvaWQgaW5zZXJ0KGNvbnN0
IFBhcnNlZENvb2tpZSopOworICAgIHZvaWQgdXBkYXRlKGNvbnN0IFBhcnNlZENvb2tpZSopOwor
ICAgIHZvaWQgcmVtb3ZlKGNvbnN0IFBhcnNlZENvb2tpZSopOworCisgICAgdm9pZCByZW1vdmVB
bGwoKTsKKworICAgIC8vIElmIGEgbGltaXQgaXMgbm90IHNldCwgdGhlIG1ldGhvZCB3aWxsIHJl
dHVybiBhbGwgY29va2llcyBpbiB0aGUgZGF0YWJhc2UKKyAgICB2b2lkIGdldENvb2tpZXNGcm9t
RGF0YWJhc2UoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQg
aW50IGxpbWl0ID0gMCk7CisKKyAgICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZVN5bmNocm9u
b3VzbHkoKTsKKworICAgIC8vIFRocmVhZFRpbWVyQ2xpZW50IG1ldGhvZHMKKyAgICB2aXJ0dWFs
IGJvb2wgd2lsbEZpcmVUaW1lcigpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGludCBn
ZXRQdWxzZUNvZGUoKSBjb25zdCB7IHJldHVybiBwdWxzZUNvZGUoKTsgfQorICAgIHZpcnR1YWwg
aW50IGdldENvbm5lY3Rpb25JZCgpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25JZCgpOyB9Cisg
ICAgdmlydHVhbCBpbnQgZGVmYXVsdFRpbWVyUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiB0aHJl
YWRQcmlvcml0eSgpOyB9CisKK3ByaXZhdGU6CisgICAgZW51bSBVcGRhdGVQYXJhbWV0ZXIgewor
ICAgICAgICBJbnNlcnQsCisgICAgICAgIFVwZGF0ZSwKKyAgICAgICAgRGVsZXRlLAorICAgIH07
CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpOworICAgIH5Db29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBhZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNl
ZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKTsKKyAg
ICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZShpbnQgaW50ZXJ2YWwpOworICAgIHZvaWQgc2Vu
ZENoYW5nZXNUb0RhdGFiYXNlVGltZXJGaXJlZCgpOworICAgIHZvaWQgdXBncmFkZVRhYmxlSWZO
ZWVkZWQoY29uc3QgU3RyaW5nJiBkYXRhYmFzZVNjaGVtYSwgY29uc3QgU3RyaW5nJiBwcmltYXJ5
a2V5RmllbGRzKTsKKworICAgIHZvaWQgaW52b2tlT3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUph
cik7CisgICAgdm9pZCBpbnZva2VSZW1vdmVBbGwoKTsKKyAgICBWZWN0b3I8UGFyc2VkQ29va2ll
Kj4qIGludm9rZUdldENvb2tpZXNXaXRoTGltaXQodW5zaWduZWQgaW50IGxpbWl0KTsKKyAgICB2
b2lkIGludm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgdm9pZCBjbG9zZSgpOwor
CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IFBhcnNlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyPiBD
b29raWVBY3Rpb247CisgICAgVmVjdG9yPENvb2tpZUFjdGlvbj4gbV9jaGFuZ2VkQ29va2llczsK
KyAgICBNdXRleCBtX211dGV4OworCisgICAgU3RyaW5nIG1fdGFibGVOYW1lOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpUaW1lcjxDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZT4gbV9kYlRp
bWVyOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHZW5lcmljVGltZXJDbGllbnQqIG1fZGJU
aW1lckNsaWVudDsKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RiOworICAgIFNRTGl0ZVN0YXRlbWVu
dCAqbV9pbnNlcnRTdGF0ZW1lbnQ7CisgICAgU1FMaXRlU3RhdGVtZW50ICptX3VwZGF0ZVN0YXRl
bWVudDsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgKm1fZGVsZXRlU3RhdGVtZW50OworfTsKKworQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUmIGNvb2tpZUJhY2tpbmdTdG9yZSgpOworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZUph
ckJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29r
aWVKYXJCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41ZjAxNzE3YjkyNDMyYzQ3MTVhZGE0MTgw
YTIzYjlhZmE1NGY0M2YyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVKYXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDExMiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogQ29w
eXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIGh0dHA6Ly93d3cudG9yY2htb2JpbGUu
Y29tLworICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLTIw
MTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkNvb2tpZUphci5oIgorCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiQ29v
a2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIK
KyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJLVVJM
LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiUGFnZUdyb3VwTG9hZERlZmVycmVyLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNp
bmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU3Ry
aW5nIGNvb2tpZXMoRG9jdW1lbnQgY29uc3QqIGRvY3VtZW50LCBLVVJMIGNvbnN0JiB1cmwpCit7
CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisgICAgUGFnZSogcGFnZSA9
IGZyYW1lID8gZnJhbWUtPnBhZ2UoKSA6IDA7CisKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKworICAgIGlmICghKGZyYW1lICYmIGZyYW1lLT5sb2FkZXIoKSAmJiBm
cmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisg
ICAgaWYgKCFzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihmcmFtZS0+
bG9hZGVyKCktPmNsaWVudCgpKS0+Y29va2llc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIFN0
cmluZygpOworCisgICAgQVNTRVJUKGRvY3VtZW50ICYmIHVybCA9PSBkb2N1bWVudC0+Y29va2ll
VVJMKCkpOworICAgIC8vICdIdHRwT25seScgY29va2llcyBzaG91bGQgbm8gYmUgYWNjZXNzaWJs
ZSBmcm9tIHNjcmlwdHMsIHNvIHdlIGZpbHRlciB0aGVtIG91dCBoZXJlCisgICAgU3RyaW5nIHJl
c3VsdCA9IGNvb2tpZU1hbmFnZXIoKS5nZXRDb29raWUodXJsLCBOb0h0dHBPbmx5Q29va2llKTsK
KworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgc2V0Q29va2llcyhEb2N1bWVudCogZG9j
dW1lbnQsIEtVUkwgY29uc3QmIHVybCwgU3RyaW5nIGNvbnN0JiB2YWx1ZSkKK3sKKyAgICBGcmFt
ZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKKyAgICBQYWdlKiBwYWdlID0gZnJhbWUgPyBm
cmFtZS0+cGFnZSgpIDogMDsKKworICAgIGlmICghcGFnZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKCEoZnJhbWUgJiYgZnJhbWUtPmxvYWRlcigpICYmIGZyYW1lLT5sb2FkZXIoKS0+Y2xp
ZW50KCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXN0YXRpY19jYXN0PEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeSo+KGZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpLT5jb29raWVz
RW5hYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoZG9jdW1lbnQgJiYgdXJs
ID09IGRvY3VtZW50LT5jb29raWVVUkwoKSk7CisgICAgY29va2llTWFuYWdlcigpLnNldENvb2tp
ZXModXJsLCB2YWx1ZSk7Cit9CisKK2Jvb2wgY29va2llc0VuYWJsZWQoRG9jdW1lbnQgY29uc3Qq
KQoreworICAgIC8vIEZJWE1FLiBDdXJyZW50bHkgY29va2llIGlzIGVuYWJsZWQgYnkgZGVmYXVs
dCwgbm8gc2V0dGluZyBvbiBwcm9wZXJ0eSBwYWdlLgorICAgIHJldHVybiB0cnVlOworfQorCiti
b29sIGdldFJhd0Nvb2tpZXMoY29uc3QgRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBLVVJMJiB1
cmwsIFZlY3RvcjxDb29raWU+JiByYXdDb29raWVzKQoreworICAgIFZlY3RvcjxQYXJzZWRDb29r
aWUqPiByZXN1bHQ7CisgICAgY29va2llTWFuYWdlcigpLmdldFJhd0Nvb2tpZXMocmVzdWx0LCB1
cmwsIFdpdGhIdHRwT25seUNvb2tpZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVz
dWx0LnNpemUoKTsgaSsrKQorICAgICAgICByZXN1bHRbaV0tPmFwcGVuZFdlYkNvcmVDb29raWUo
cmF3Q29va2llcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZGVsZXRlQ29va2llKGNv
bnN0IERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIGNv
b2tpZU5hbWUpCit7CisgICAgLy8gQ29va2llcyBhcmUgbm90IGJvdW5kIHRvIHRoZSBkb2N1bWVu
dC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHBhc3MKKyAgICAvLyBpbiB0aGUgZG9jdW1l
bnQgb2JqZWN0IHRvIGZpbmQgdGhlIHRhcmdldGVkIGNvb2tpZXMgaW4gY29va2llIG1hbmFnZXIu
CisgICAgY29va2llTWFuYWdlcigpLnJlbW92ZUNvb2tpZVdpdGhOYW1lKHVybCwgY29va2llTmFt
ZSk7Cit9CisKK1N0cmluZyBjb29raWVSZXF1ZXN0SGVhZGVyRmllbGRWYWx1ZShjb25zdCBEb2N1
bWVudCogZG9jdW1lbnQsIGNvbnN0IEtVUkwgJnVybCkKK3sKKyAgICBBU1NFUlQoZG9jdW1lbnQp
OworCisgICAgaWYgKCEoZG9jdW1lbnQtPmZyYW1lKCkgJiYgZG9jdW1lbnQtPmZyYW1lKCktPmxv
YWRlcigpICYmIGRvY3VtZW50LT5mcmFtZSgpLT5sb2FkZXIoKS0+Y2xpZW50KCkpKQorICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBpZiAoIXN0YXRpY19jYXN0PEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeSo+KGRvY3VtZW50LT5mcmFtZSgpLT5sb2FkZXIoKS0+Y2xpZW50KCkpLT5j
b29raWVzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICByZXR1cm4g
Y29va2llTWFuYWdlcigpLmdldENvb2tpZSh1cmwsIFdpdGhIdHRwT25seUNvb2tpZXMpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jNmQxZjhjNmEwNGQ2
YTA2ZmM0NzU5NDgxOTk4ZDIzNzNiOWIyZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDYw
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxq
dWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwg
MjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZp
bmUgRU5BQkxFX0NPT0tJRV9ERUJVRyAwCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfU1VQRVJfVkVS
Qk9TRV9ERUJVRyAwCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfTElNSVRfREVCVUcgMAorCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorCisjaW5jbHVkZSAi
Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaCIKKyNpbmNsdWRlICJDb29raWVQYXJzZXIuaCIK
KyNpbmNsdWRlICJDdXJyZW50VGltZS5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKyNpbmNs
dWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiV2Vi
U2V0dGluZ3MuaCIKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1DbGllbnQuaD4KKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1FeGVjdXRhYmxlTWVzc2FnZS5oPgorI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2VDbGllbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1OYXZpZ2F0b3JIYW5kbGVyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8
d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworI2lmIEVOQUJMRV9DT09LSUVfREVC
VUcKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cuaD4KKyNlbmRpZgorCisjaWYgRU5B
QkxFX0NPT0tJRV9TVVBFUl9WRVJCT1NFX0RFQlVHCisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQs
IC4uLikgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TG9nTGV2ZWxJbmZvLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUg
Q29va2llTG9nKGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVOQUJMRV9DT09LSUVfU1VQRVJfVkVS
Qk9TRV9ERUJVRworCisjaWYgRU5BQkxFX0NPT0tJRV9MSU1JVF9ERUJVRworI2RlZmluZSBDb29r
aWVMaW1pdExvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBmb3JtYXQsICMjIF9fVkFfQVJHU19f
KQorI2Vsc2UKKyNkZWZpbmUgQ29va2llTGltaXRMb2coZm9ybWF0LCAuLi4pCisjZW5kaWYgLy8g
RU5BQkxFX0NPT0tJRV9MSU1JVF9ERUJVRworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIE1h
eCBjb3VudCBjb25zdGFudHMuCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc19nbG9iYWxNYXhDb29r
aWVDb3VudCA9IDYwMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc19tYXhDb29raWVDb3VudFBl
ckhvc3QgPSA2MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzX2Nvb2tpZXNUb0RlbGV0ZVdoZW5M
aW1pdFJlYWNoZWQgPSA2MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzX2RlbGF5VG9TdGFydENv
b2tpZUNsZWFudXAgPSAxMDsKKworc3RhdGljIHZvaWQgZmx1c2hDb29raWVzT25FeGl0KHZvaWQp
Cit7CisgICAgY29va2llTWFuYWdlcigpLmZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlKCk7Cit9
CisKK0Nvb2tpZU1hbmFnZXImIGNvb2tpZU1hbmFnZXIoKQoreworICAgIHN0YXRpYyBDb29raWVN
YW5hZ2VyICpjb29raWVNYW5hZ2VyID0gMDsKKyAgICBpZiAoIWNvb2tpZU1hbmFnZXIpIHsKKyAg
ICAgICAgLy8gT3BlbiB0aGUgY29va2llSmFyIG5vdyBhbmQgZ2V0IHRoZSBiYWNraW5nIHN0b3Jl
IGNvb2tpZXMgdG8gZmlsbCB0aGUgbWFuYWdlci4KKyAgICAgICAgY29va2llTWFuYWdlciA9IG5l
dyBDb29raWVNYW5hZ2VyOworICAgICAgICBjb29raWVNYW5hZ2VyLT5tX2Nvb2tpZUJhY2tpbmdT
dG9yZS0+b3Blbihjb29raWVNYW5hZ2VyLT5jb29raWVKYXIoKSk7CisgICAgICAgIGNvb2tpZU1h
bmFnZXItPmdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKTsKKyAgICAgICAgQ29va2llTG9nKCJDb29r
aWVNYW5hZ2VyIC0gQmFja2luZ3N0b3JlIGxvYWQgY29tcGxldGUuXG4iKTsKKworICAgICAgICBh
dGV4aXQoJmZsdXNoQ29va2llc09uRXhpdCk7CisgICAgfQorICAgIHJldHVybiAqY29va2llTWFu
YWdlcjsKK30KKworQ29va2llTWFuYWdlcjo6Q29va2llTWFuYWdlcigpCisgICAgOiBtX2NvdW50
KDApCisgICAgLCBtX3ByaXZhdGVNb2RlKGZhbHNlKQorICAgICwgbV9zaG91bGREdW1wQWxsQ29v
a2llcyhmYWxzZSkKKyAgICAsIG1fY29va2llSmFyRmlsZU5hbWUocGF0aEJ5QXBwZW5kaW5nQ29t
cG9uZW50KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpDbGllbnQ6OmdldCgpLT5nZXRBcHBsaWNhdGlv
bkRhdGFEaXJlY3RvcnkoKS5jX3N0cigpLCAiL2Nvb2tpZUNvbGxlY3Rpb24uZGIiKSkKKyAgICAs
IG1fcG9saWN5KENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lBbHdheXMpCisgICAgLCBtX2Nvb2tp
ZUJhY2tpbmdTdG9yZShDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6Y3JlYXRlKCkpCisgICAg
LCBtX2xpbWl0VGltZXIodGhpcywgJkNvb2tpZU1hbmFnZXI6OmNvb2tpZUxpbWl0Q2xlYW5VcCkK
K3sKK30KKworQ29va2llTWFuYWdlcjo6fkNvb2tpZU1hbmFnZXIoKQoreworICAgIHJlbW92ZUFs
bENvb2tpZXMoRG9Ob3RSZW1vdmVGcm9tQmFja2luZ1N0b3JlKTsKKyAgICAvLyBUT0RPOiBtX21h
bmFnZXJNYXAgYW5kIHRoZSB0b3AgbGF5ZXIgcHJvdG9jb2xNYXBzIGFyZSBub3QgcHJvcGVybHkg
ZGVsZXRlZC4KKyAgICAvLyBEbyBub3QgZGVsZXRlIGFueSBwcm90b2NvbCBtYXBzIHRvIGF2b2lk
IGRvdWJsZS1kZWxldGlvbiBvZiB0aGUgbWFwcyB0aGF0IGFyZQorICAgIC8vIGJlaW5nIHVzZWQg
Zm9yIGJvdGggc2VjdXJlIGFuZCBub24tc2VjdXJlIHByb3RvY29sczsgdGhpcyBsZWFrIGlzIE9L
IHNpbmNlCisgICAgLy8gdGhlcmUncyBub3RoaW5nIGltcG9ydGFudCBpbiB0aGUgaGFzaHRhYmxl
IGRlc3RydWN0b3JzLCBhbmQgdGhlIG1lbW9yeSB3aWxsIGJlIHJlY2xhaW1lZCBvbiBleGl0CisK
KyAgICAvLyBGSVhNRTogQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUgaXMgbm90IGRlbGV0ZWQs
IG9ubHkgZmx1c2hlZAorICAgIC8vIChjdXJyZW50bHkgdGhlIGRlc3RydWN0b3IgaXMgbmV2ZXIg
Y2FsbGVkIHNpbmNlIHRoaXMgY2xhc3MgaXMgYQorICAgIC8vIHNpbmdsZXRvbjsgb24gZXhpdCwg
dGhlIGRiIGlzIGZsdXNoZWQgbWFudWFsbHkuIFRoaXMgY2FsbCBpcyBvbmx5IGhlcmUKKyAgICAv
LyBhcyBhIGZhbGxiYWNrIGluIGNhc2UgdGhpcyBjbGFzcyBpcyBtYWRlIGEgbm9uLXNpbmdsZXRv
bi4KKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+c2VuZENoYW5nZXNUb0RhdGFiYXNlU3luY2hy
b25vdXNseSgpOworfQorCisvLyBTb3J0aW5nIGxvZ2ljIGlzIGJhc2VkIG9uIENvb2tpZSBTcGVj
IFJGQzYyNjUsIHNlY3Rpb24gNS40LjIKK3N0YXRpYyBib29sIGNvb2tpZVNvcnRlcihQYXJzZWRD
b29raWUqIGEsIFBhcnNlZENvb2tpZSogYikKK3sKKyAgICBpZiAoYS0+cGF0aCgpLmxlbmd0aCgp
ID09IGItPnBhdGgoKS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIGEtPmNyZWF0aW9uVGltZSgp
IDw9IGItPmNyZWF0aW9uVGltZSgpOworICAgIHJldHVybiBhLT5wYXRoKCkubGVuZ3RoKCkgPiBi
LT5wYXRoKCkubGVuZ3RoKCk7Cit9CisKKy8vIFJldHVybnMgd2hldGhlciB0aGUgcHJvdG9jb2wg
c3VwcG9ydHMgZG9tYWlucworc3RhdGljIGJvb2wgc2hvdWxkSWdub3JlRG9tYWluKGNvbnN0IFN0
cmluZyBwcm90b2NvbCkKK3sKKyAgICAvLyBpZ25vcmUgZG9tYWluIHNlY3VyaXR5IGZvciBmaWxl
IGFuZCBsb2NhbAorICAgIGlmICgocHJvdG9jb2wgPT0gImZpbGUiIHx8IHByb3RvY29sID09ICJs
b2NhbCIgKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2
b2lkIENvb2tpZU1hbmFnZXI6OnNldENvb2tpZXMoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJp
bmcmIHZhbHVlKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIFNldHRpbmcgY29v
a2llcyIpOworICAgIENvb2tpZVBhcnNlciBwYXJzZXIodXJsKTsKKyAgICBWZWN0b3I8UGFyc2Vk
Q29va2llKj4gY29va2llcyA9IHBhcnNlci5wYXJzZSh2YWx1ZSk7CisKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGNvb2tpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGFyc2VkQ29va2ll
KiBjb29raWUgPSBjb29raWVzW2ldOworICAgICAgICBpZiAoIXNob3VsZFJlamVjdEZvclNlY3Vy
aXR5UmVhc29uKGNvb2tpZSwgdXJsKSkgeworICAgICAgICAgICAgQmFja2luZ1N0b3JlUmVtb3Zh
bFBvbGljeSB0cmVhdG1lbnQgPSBtX3ByaXZhdGVNb2RlID8gRG9Ob3RSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlIDogUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZTsKKyAgICAgICAgICAgIGNoZWNrQW5kVHJl
YXRDb29raWUoY29va2llLCB0cmVhdG1lbnQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
IGRlbGV0ZSBjb29raWU7CisgICAgfQorfQorCitib29sIENvb2tpZU1hbmFnZXI6OnNob3VsZFJl
amVjdEZvclNlY3VyaXR5UmVhc29uKGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llLCBjb25zdCBL
VVJMJiB1cmwpCit7CisgICAgLy8gV2UgaGF2ZSB0byBkaXNhYmxlIHRoZSBmb2xsb3dpbmcgY2hl
Y2sgYmVjYXVzZSBzaXRlcyBsaWtlIEZhY2Vib29rIGFuZAorICAgIC8vIEdtYWlsIGN1cnJlbnRs
eSBkbyBub3QgZm9sbG93IHRoZSBzcGVjLgorI2lmIDAKKyAgICAvLyBDaGVjayBpZiBwYXRoIGF0
dHJpYnV0ZSBpcyBhIHByZWZpeCBvZiB0aGUgcmVxdWVzdCBVUkkuCisgICAgaWYgKCF1cmwucGF0
aCgpLnN0YXJ0c1dpdGgoY29va2llLT5wYXRoKCkpKSB7CisgICAgICAgIExPR19FUlJPUigiQ29v
a2llICVzIGlzIHJlamVjdGVkIGJlY2F1c2UgaXRzIHBhdGggZG9lcyBub3QgbWF0aCB0aGUgVVJM
ICVzXG4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgdXJsLnN0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKworICAg
IC8vIGlnbm9yZSBkb21haW4gc2VjdXJpdHkgaWYgcHJvdG9jb2wgZG9lc24ndCBoYXZlIGRvbWFp
bnMKKyAgICBpZiAoc2hvdWxkSWdub3JlRG9tYWluKGNvb2tpZS0+cHJvdG9jb2woKSkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJlamVjdCBDb29raWUgaWYgZG9tYWluIGlzIGVt
cHR5CisgICAgaWYgKCFjb29raWUtPmRvbWFpbigpLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIGlmICghY29va2llLT5oYXNEZWZhdWx0RG9tYWluKCkpIHsKKyAgICAgICAg
Ly8gQ2hlY2sgaWYgdGhlIGRvbWFpbiBjb250YWlucyBhbiBlbWJlZGRlZCBkb3QuCisgICAgICAg
IGludCBkb3RQb3NpdGlvbiA9IGNvb2tpZS0+ZG9tYWluKCkuZmluZCgiLiIsIDEpOworICAgICAg
ICBpZiAoZG90UG9zaXRpb24gPT0gLTEgfHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pihkb3RQ
b3NpdGlvbikgPT0gY29va2llLT5kb21haW4oKS5sZW5ndGgoKSkgeworICAgICAgICAgICAgTE9H
X0VSUk9SKCJDb29raWUgJXMgaXMgcmVqZWN0ZWQgYmVjYXVzZSBpdHMgZG9tYWluIGRvZXMgbm90
IGNvbnRhaW4gYW4gZW1iZWRkZWQgZG90LlxuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5k
YXRhKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICAvLyBUaGUgcmVxdWVzdCBob3N0IHNob3VsZCBkb21haW4gbWF0Y2ggdGhlIERvbWFpbiBhdHRy
aWJ1dGUuCisgICAgLy8gRG9tYWluIHN0cmluZyBzdGFydHMgd2l0aCBhIGRvdCwgc28gYS5iLmNv
bSBzaG91bGQgZG9tYWluIG1hdGNoIC5hLmIuY29tLgorICAgIC8vIGFkZCBhICIuIiBhdCBiZWdp
bm5pbmcgb2YgaG9zdCBuYW1lLCBiZWNhdXNlIGl0IGNhbiBoYW5kbGUgbWFueSBjYXNlcyBzdWNo
IGFzCisgICAgLy8gYS5iLmNvbSBtYXRjaGVzIGIuY29tLCBhLmIuY29tIG1hdGNoZXMgLkIuY29t
IGFuZCBhLmIuY29tIG1hdGNoZXMgLkEuYi5Db20KKyAgICAvLyBhbmQgc28gb24uCisgICAgU3Ry
aW5nIGhvc3REb21haW5OYW1lID0gdXJsLmhvc3QoKTsKKyAgICBob3N0RG9tYWluTmFtZSA9IGhv
c3REb21haW5OYW1lLnN0YXJ0c1dpdGgoIi4iKSA/IGhvc3REb21haW5OYW1lIDogIi4iICsgaG9z
dERvbWFpbk5hbWU7CisgICAgaWYgKCFob3N0RG9tYWluTmFtZS5lbmRzV2l0aChjb29raWUtPmRv
bWFpbigpLCBmYWxzZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb29raWUgJXMgaXMgcmVqZWN0
ZWQgYmVjYXVzZSBpdHMgZG9tYWluIGRvZXMgbm90IGRvbWFpbiBtYXRjaCB0aGUgVVJMICVzXG4i
LCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgdXJsLnN0cmluZygpLnV0ZjgoKS5k
YXRhKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gV2Ugc2hvdWxkIGNo
ZWNrIGZvciBhbiBlbWJlZGRlZCBkb3QgaW4gdGhlIHBvcnRpb24gb2Ygc3RyaW5nIGluIHRoZSBo
b3N0IG5vdCBpbiB0aGUgZG9tYWluCisgICAgLy8gYnV0IHRvIG1hdGNoIGZpcmVmb3ggYmVoYXZp
b3VyIHdlIGRvIG5vdC4KKworICAgIHJldHVybiBmYWxzZTsKK30KKworU3RyaW5nIENvb2tpZU1h
bmFnZXI6OmdldENvb2tpZShjb25zdCBLVVJMJiB1cmwsIENvb2tpZUZpbHRlciBmaWx0ZXIpIGNv
bnN0Cit7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHJhd0Nvb2tpZXM7CisgICAgcmF3Q29v
a2llcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHNfbWF4Q29va2llQ291bnRQZXJIb3N0KTsKKwor
ICAgIC8vIFJldHJpZXZlIGNvb2tpZXMgcmVsYXRlZCB0byB0aGlzIHVybAorICAgIGdldFJhd0Nv
b2tpZXMocmF3Q29va2llcywgdXJsLCBmaWx0ZXIpOworCisgICAgQ29va2llTG9nKCJDb29raWVN
YW5hZ2VyIC0gdGhlcmUgYXJlICVkIGNvb2tpZXMgaW4gcmF3IGNvb2tpZXNcbiIsIHJhd0Nvb2tp
ZXMuc2l6ZSgpKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBjb29raWUgaGVhZGVyIHN0cmluZyB1
c2luZyB0aGUgcmV0cmlldmVkIGNvb2tpZXMKKyAgICBTdHJpbmdCdWlsZGVyIGNvb2tpZVN0cmlu
Z0J1aWxkZXI7CisgICAgY29va2llU3RyaW5nQnVpbGRlci5yZXNlcnZlQ2FwYWNpdHkoNTEyKTsK
KyAgICBzaXplX3QgY29va2llU2l6ZSA9IHJhd0Nvb2tpZXMuc2l6ZSgpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgY29va2llU2l6ZTsgaSsrKSB7CisgICAgICAgIGNvb2tpZVN0cmluZ0J1
aWxkZXIuYXBwZW5kKHJhd0Nvb2tpZXNbaV0tPnRvTmFtZVZhbHVlUGFpcigpKTsKKyAgICAgICAg
aWYgKGkgIT0gY29va2llU2l6ZS0xKQorICAgICAgICAgICAgY29va2llU3RyaW5nQnVpbGRlci5h
cHBlbmQoIjsgIik7CisgICAgfQorCisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gY29v
a2llU3RyaW5nIGlzIC0gJXNcbiIsIGNvb2tpZVN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKS51dGY4
KCkuZGF0YSgpKTsKKworICAgIHJldHVybiBjb29raWVTdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7
CisKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpnZXRSYXdDb29raWVzKFZlY3RvcjxQYXJzZWRD
b29raWUqPiAmc3RhY2tPZkNvb2tpZXMsIGNvbnN0IEtVUkwmIHJlcXVlc3RVUkwsIENvb2tpZUZp
bHRlciBmaWx0ZXIpIGNvbnN0Cit7CisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZ2V0
UmF3Q29va2llcyAtIHByb2Nlc3NpbmcgdXJsIHdpdGggZG9tYWluIC0gJXMgJiBwcm90b2NvbDog
JXMgJiBwYXRoOiAlc1xuIiwgcmVxdWVzdFVSTC5ob3N0KCkudXRmOCgpLmRhdGEoKSwgcmVxdWVz
dFVSTC5wcm90b2NvbCgpLnV0ZjgoKS5kYXRhKCksIHJlcXVlc3RVUkwucGF0aCgpLnV0ZjgoKS5k
YXRhKCkpOworCisgICAgYm9vbCBzcGVjaWFsQ2FzZUZvckxvY2FsID0gKHJlcXVlc3RVUkwucHJv
dG9jb2xJcygibG9jYWwiKSB8fCByZXF1ZXN0VVJMLnByb3RvY29sSXMoImZpbGUiKSkgJiYgbV9z
aG91bGREdW1wQWxsQ29va2llczsKKyAgICBib29sIGlzQ29ubmVjdGlvblNlY3VyZSA9IHJlcXVl
c3RVUkwucHJvdG9jb2xJcygiaHR0cHMiKSB8fCByZXF1ZXN0VVJMLnByb3RvY29sSXMoIndzcyIp
IHx8IHNwZWNpYWxDYXNlRm9yTG9jYWw7CisKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4gY29v
a2llQ2FuZGlkYXRlczsKKyAgICBWZWN0b3I8Q29va2llTWFwKj4gcHJvdG9jb2xzVG9TZWFyY2g7
CisKKyAgICBpZiAoc3BlY2lhbENhc2VGb3JMb2NhbCkKKyAgICAgICAgY29weVZhbHVlc1RvVmVj
dG9yKG1fbWFuYWdlck1hcCwgcHJvdG9jb2xzVG9TZWFyY2gpOworICAgIGVsc2UgeworICAgICAg
ICBwcm90b2NvbHNUb1NlYXJjaC5hcHBlbmQobV9tYW5hZ2VyTWFwLmdldChyZXF1ZXN0VVJMLnBy
b3RvY29sKCkpKTsKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgYSBoYWNrIGZvciB3ZWJ3b3Jr
cyBhcHBzOyBSRkMgNjI2NSBzYXlzICJDb29raWVzIGRvIG5vdCBwcm92aWRlIGlzb2xhdGlvbiBi
eSBzY2hlbWUiCisgICAgICAgIC8vIHNvIHdlIHNob3VsZCBub3QgYmUgY2hlY2tpbmcgcHJvdG9j
b2xzIGF0IGFsbC4gU2VlIFBSIDEzNTU5NQorICAgICAgICBpZiAobV9zaG91bGREdW1wQWxsQ29v
a2llcykgeworICAgICAgICAgICAgcHJvdG9jb2xzVG9TZWFyY2guYXBwZW5kKG1fbWFuYWdlck1h
cC5nZXQoImZpbGUiKSk7CisgICAgICAgICAgICBwcm90b2NvbHNUb1NlYXJjaC5hcHBlbmQobV9t
YW5hZ2VyTWFwLmdldCgibG9jYWwiKSk7CisgICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxT
dHJpbmc+IGRlbGltaXRlZEhvc3Q7CisgICAgcmVxdWVzdFVSTC5ob3N0KCkubG93ZXIoKS5zcGxp
dCgiLiIsIHRydWUsIGRlbGltaXRlZEhvc3QpOworCisgICAgLy8gR28gdGhyb3VnaCBhbGwgdGhl
IHByb3RvY29sIHRyZWVzIHRoYXQgd2UgbmVlZCB0byBzZWFyY2ggZm9yCisgICAgLy8gYW5kIGdl
dCBhbGwgY29va2llcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhpcyBkb21haW4KKyAgICBmb3IgKHNp
emVfdCBrID0gMDsgayA8IHByb3RvY29sc1RvU2VhcmNoLnNpemUoKTsgaysrKSB7CisgICAgICAg
IENvb2tpZU1hcCogY3VycmVudE1hcCA9IHByb3RvY29sc1RvU2VhcmNoW2tdOworCisgICAgICAg
IC8vIGlmIG5vIGNvb2tpZXMgZXhpc3QgZm9yIHRoaXMgcHJvdG9jb2wsIGJyZWFrIHJpZ2h0IGF3
YXkKKyAgICAgICAgaWYgKCFjdXJyZW50TWFwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gbG9va2luZyBhdCBwcm90b2NvbCBtYXAg
JXMgXG4iLCBjdXJyZW50TWFwLT5nZXROYW1lKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAgICAg
Ly8gU3BlY2lhbCBjYXNlIGZvciBsb2NhbCBhbmQgZmlsZXMgLSBiZWNhdXNlIFdlYkFwcHMgZXhw
ZWN0IHRvIGdldCBBTEwgY29va2llcyBmcm9tIHRoZSBiYWNraW5nLXN0b3JlIG9uIGxvY2FsIHBy
b3RvY29sCisgICAgICAgIGlmIChzcGVjaWFsQ2FzZUZvckxvY2FsKSB7CisgICAgICAgICAgICBD
b29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBzcGVjaWFsIGNhc2UgZmluZCBpbiBwcm90b2NvbCBt
YXAgLSAlc1xuIiwgY3VycmVudE1hcC0+Z2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICAgICAgY3VycmVudE1hcC0+Z2V0QWxsQ2hpbGRDb29raWVzKCZjb29raWVDYW5kaWRhdGVzKTsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEdldCBjb29raWVzIGZyb20gdGhlIG51
bGwgZG9tYWluIG1hcAorICAgICAgICAgICAgY3VycmVudE1hcC0+Z2V0QWxsQ29va2llcygmY29v
a2llQ2FuZGlkYXRlcyk7CisKKyAgICAgICAgICAgIC8vIEdldCBjb29raWVzIGZyb20gdGhlIHZh
bGlkIGRvbWFpbiBtYXBzCisgICAgICAgICAgICBpbnQgaSA9IGRlbGltaXRlZEhvc3Quc2l6ZSgp
LTE7CisgICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgQ29va2ll
TG9nKCJDb29raWVNYW5hZ2VyIC0gZmluZGluZyAlcyBpbiBjdXJyZW50bWFwXG4iLCBkZWxpbWl0
ZWRIb3N0W2ldLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRNYXAgPSBj
dXJyZW50TWFwLT5nZXRTdWJkb21haW5NYXAoZGVsaW1pdGVkSG9zdFtpXSk7CisgICAgICAgICAg
ICAgICAgLy8gaWYgdGhpcyBzdWJkb21haW4vZG9tYWluIGRvZXMgbm90IGV4aXN0IGluIG91ciBt
YXBwaW5nIHRoZW4gd2Ugc2ltcGx5IGV4aXQKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRN
YXApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gY2Fu
bm90IGZpbmQgbmV4dCBtYXAgZXhpdGluZyB0aGUgd2hpbGUgbG9vcC5cbiIpOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29v
a2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZm91bmQgdGhlIG1hcCwgZ3JhYmJpbmcgY29va2llcyBm
cm9tIHRoaXMgbWFwXG4iKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50TWFwLT5nZXRBbGxDb29r
aWVzKCZjb29raWVDYW5kaWRhdGVzKTsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSB0
aGVyZSBhcmUgJWQgY29va2llcyBpbiBjYW5kaWRhdGVcbiIsIGNvb2tpZUNhbmRpZGF0ZXMuc2l6
ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29va2llQ2FuZGlkYXRlcy5zaXpl
KCk7ICsraSkgeworICAgICAgICBQYXJzZWRDb29raWUqIGNvb2tpZSA9IGNvb2tpZUNhbmRpZGF0
ZXNbaV07CisKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBwYXRoLW1hdGNoZXMgcnVsZXMg
aW4gUkZDNjI2NSwgc2VjdGlvbiA1LjEuNCwKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCBhICcv
JyBhdCB0aGUgZW5kIG9mIGNvb2tpZS1wYXRoIGZvciBjb21wYXJpc29uIGlmIHRoZSBjb29raWUt
cGF0aCBpcyBub3QgZW5kIHdpdGggJy8nLgorICAgICAgICBTdHJpbmcgcGF0aCA9IGNvb2tpZS0+
cGF0aCgpOworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBjb21wYXJpbmcgY29v
a2llIHBhdGggJXMgKGxlbiAlZCkgdG8gcmVxdWVzdCBwYXRoICVzIChsZW4gJWQpIiwgcGF0aC51
dGY4KCkuZGF0YSgpLCBwYXRoLmxlbmd0aCgpLCByZXF1ZXN0VVJMLnBhdGgoKS51dGY4KCkuZGF0
YSgpLCBwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShwYXRo
LCByZXF1ZXN0VVJMLnBhdGgoKSkgJiYgIXBhdGguZW5kc1dpdGgoIi8iLCBmYWxzZSkpCisgICAg
ICAgICAgICBwYXRoICs9ICIvIjsKKworICAgICAgICAvLyBPbmx5IHNlY3VyZSBjb25uZWN0aW9u
cyBoYXZlIGFjY2VzcyB0byBzZWN1cmUgY29va2llcy4gVW5sZXNzIHNwZWNpYWxDYXNlRm9yTG9j
YWwgaXMgdHJ1ZQorICAgICAgICAvLyBHZXQgdGhlIGNvb2tpZXMgZmlsdGVyaW5nIG91dCBIdHRw
T25seSBjb29raWVzIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaWYgKHJlcXVlc3RVUkwucGF0aCgp
LnN0YXJ0c1dpdGgocGF0aCwgZmFsc2UpICYmIChpc0Nvbm5lY3Rpb25TZWN1cmUgfHwgIWNvb2tp
ZS0+aXNTZWN1cmUoKSkgJiYgKGZpbHRlciA9PSBXaXRoSHR0cE9ubHlDb29raWVzIHx8ICFjb29r
aWUtPmlzSHR0cE9ubHkoKSkpIHsKKyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdl
ciAtIGNvb2tpZSBjaG9zZW4gLSAlc1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRh
KCkpOworICAgICAgICAgICAgY29va2llLT5zZXRMYXN0QWNjZXNzZWQoY3VycmVudFRpbWUoKSk7
CisgICAgICAgICAgICBzdGFja09mQ29va2llcy5hcHBlbmQoY29va2llKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHN0ZDo6c29ydChzdGFja09mQ29va2llcy5iZWdpbigpLCBzdGFja09mQ29v
a2llcy5lbmQoKSwgY29va2llU29ydGVyKTsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpyZW1v
dmVBbGxDb29raWVzKEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgYmFja2luZ1N0b3JlUmVtb3Zh
bCkKK3sKKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46Oml0ZXJhdG9yIGZpcnN0ID0g
bV9tYW5hZ2VyTWFwLmJlZ2luKCk7CisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+Ojpp
dGVyYXRvciBlbmQgPSBtX21hbmFnZXJNYXAuZW5kKCk7CisgICAgZm9yIChIYXNoTWFwPFN0cmlu
ZywgQ29va2llTWFwKj46Oml0ZXJhdG9yIGl0ID0gZmlyc3Q7IGl0ICE9IGVuZDsgKytpdCkKKyAg
ICAgICAgaXQtPnNlY29uZC0+ZGVsZXRlQWxsQ29va2llc0FuZERvbWFpbnMoKTsKKworICAgIGlm
IChiYWNraW5nU3RvcmVSZW1vdmFsID09IFJlbW92ZUZyb21CYWNraW5nU3RvcmUpCisgICAgICAg
IG1fY29va2llQmFja2luZ1N0b3JlLT5yZW1vdmVBbGwoKTsKKyAgICBtX2NvdW50ID0gMDsKK30K
Kwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVKYXIoY29uc3QgY2hhciogZmlsZU5hbWUp
Cit7CisgICAgbV9jb29raWVKYXJGaWxlTmFtZSA9IFN0cmluZyhmaWxlTmFtZSk7CisgICAgbV9j
b29raWVCYWNraW5nU3RvcmUtPm9wZW4obV9jb29raWVKYXJGaWxlTmFtZSk7Cit9CisKK3ZvaWQg
Q29va2llTWFuYWdlcjo6Y2hlY2tBbmRUcmVhdENvb2tpZShQYXJzZWRDb29raWUqIGNhbmRpZGF0
ZUNvb2tpZSwgQmFja2luZ1N0b3JlUmVtb3ZhbFBvbGljeSBwb3N0VG9CYWNraW5nU3RvcmUpCit7
CisgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gY2hlY2tBbmRUcmVhdENvb2tpZSAtIHBy
b2Nlc3NpbmcgdXJsIHdpdGggZG9tYWluIC0gJXMgJiBwcm90b2NvbCAlc1xuIiwgY2FuZGlkYXRl
Q29va2llLT5kb21haW4oKS51dGY4KCkuZGF0YSgpLCBjYW5kaWRhdGVDb29raWUtPnByb3RvY29s
KCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBjb25zdCBib29sIGlnbm9yZURvbWFpbiA9IHNob3Vs
ZElnbm9yZURvbWFpbihjYW5kaWRhdGVDb29raWUtPnByb3RvY29sKCkpOworCisgICAgLy8gRGV0
ZXJtaW5lIHdoaWNoIHByb3RvY29sIHRyZWUgdG8gYWRkIHRoZSBjb29raWUgdG8uIENyZWF0ZSBv
bmUgaWYgbmVjZXNzYXJ5LgorICAgIENvb2tpZU1hcCogY3VyTWFwID0gMDsKKyAgICBpZiAobV9t
YW5hZ2VyTWFwLmNvbnRhaW5zKGNhbmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSkpCisgICAgICAg
IGN1ck1hcCA9IG1fbWFuYWdlck1hcC5nZXQoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpKTsK
KyAgICBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSBzZWN1cmUgdmVyc2lvbiwg
aWYgaXQgaXMsIGxpbmsgaXQgdG8gdGhlIG5vbi1zZWN1cmUgdmVyc2lvbgorICAgICAgICAvLyBM
aW5rIGN1ck1hcCB0byB0aGUgbmV3IHByb3RvY29sIGFzIHdlbGwgYXMgdGhlIG9sZCBvbmUgaWYg
aXQgZG9lc24ndCBleGlzdAorICAgICAgICBpZiAoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgp
ID09ICJodHRwcyIpIHsKKyAgICAgICAgICAgIGN1ck1hcCA9IG1fbWFuYWdlck1hcC5nZXQoImh0
dHAiKTsKKyAgICAgICAgICAgIGlmICghY3VyTWFwKSB7CisgICAgICAgICAgICAgICAgY3VyTWFw
ID0gbmV3IENvb2tpZU1hcCgiaHR0cCIpOworICAgICAgICAgICAgICAgIG1fbWFuYWdlck1hcC5h
ZGQoImh0dHAiLCBjdXJNYXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNh
bmRpZGF0ZUNvb2tpZS0+cHJvdG9jb2woKSA9PSAid3NzIikgeworICAgICAgICAgICAgY3VyTWFw
ID0gbV9tYW5hZ2VyTWFwLmdldCgid3MiKTsKKyAgICAgICAgICAgIGlmICghY3VyTWFwKSB7Cisg
ICAgICAgICAgICAgICAgY3VyTWFwID0gbmV3IENvb2tpZU1hcCgid3MiKTsKKyAgICAgICAgICAg
ICAgICBtX21hbmFnZXJNYXAuYWRkKCJ3cyIsIGN1ck1hcCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgY3VyTWFwID0gbmV3IENvb2tpZU1hcChjYW5kaWRhdGVD
b29raWUtPnByb3RvY29sKCkpOworCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAt
IGFkZGluZyBwcm90b2NvbCBjb29raWVtYXAgLSAlc1xuIiwgY3VyTWFwLT5nZXROYW1lKCkudXRm
OCgpLmRhdGEoKSk7CisKKyAgICAgICAgbV9tYW5hZ2VyTWFwLmFkZChjYW5kaWRhdGVDb29raWUt
PnByb3RvY29sKCksIGN1ck1hcCk7CisgICAgfQorCisgICAgLy8gSWYgcHJvdG9jb2wgc3VwcG9y
dCBkb21haW4sIHdlIGhhdmUgdG8gdHJhdmVyc2UgdGhlIGRvbWFpbiB0cmVlIHRvIGZpbmQgdGhl
IHJpZ2h0CisgICAgLy8gY29va2llTWFwIHRvIGhhbmRsZSB3aXRoCisgICAgaWYgKCFpZ25vcmVE
b21haW4pCisgICAgICAgIGN1ck1hcCA9IGZpbmRPckNyZWF0ZUNvb2tpZU1hcChjdXJNYXAsIGNh
bmRpZGF0ZUNvb2tpZS0+ZG9tYWluKCksIGNhbmRpZGF0ZUNvb2tpZS0+aGFzRXhwaXJlZCgpKTsK
KworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHByb3BlciBtYXAgZm9yIHRoaXMgY29va2ll
LCB3ZSBjYW4gbW9kaWZ5IGl0CisgICAgLy8gSWYgY29va2llIGRvZXMgbm90IGV4aXN0IGFuZCBo
YXMgZXhwaXJlZCwgZGVsZXRlIGl0CisgICAgLy8gSWYgY29va2llIGV4aXN0cyBhbmQgaXQgaGFz
IGV4cGlyZWQsIHNvIHdlIG11c3QgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCwgaWYgbm90IHVwZGF0
ZSBpdAorICAgIC8vIElmIGNvb2tpZSBleHBpcmVkIGFuZCBjYW1lIGZyb20gdGhlIEJhY2tpbmdT
dG9yZSAodGhlcmVmb3JlIGRvZXMgbm90IGV4aXN0KSwgd2UgaGF2ZSB0byByZW1vdmUgZnJvbSBk
YXRhYmFzZQorICAgIC8vIElmIGNvb2tpZSBkb2VzIG5vdCBleGlzdCAmIGl0J3MgdmFsaWQsIGFk
ZCBpdCB0byB0aGUgY3VycmVudCBtYXAKKworICAgIGlmIChjYW5kaWRhdGVDb29raWUtPmhhc0V4
cGlyZWQoKSB8fCBjYW5kaWRhdGVDb29raWUtPmlzRm9yY2VFeHBpcmVkKCkpIHsKKyAgICAgICAg
Ly8gU3BlY2lhbCBjYXNlIGZvciBnZXRCYWNraW5nU3RvcmVDb29raWVzKCkgdG8gY2F0Y2ggZXhw
aXJlZCBjb29raWVzCisgICAgICAgIGlmIChwb3N0VG9CYWNraW5nU3RvcmUgPT0gQmFja2luZ1N0
b3JlQ29va2llRW50cnkpCisgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+cmVtb3Zl
KGNhbmRpZGF0ZUNvb2tpZSk7CisgICAgICAgIGVsc2UgaWYgKGN1ck1hcCkgeworICAgICAgICAg
ICAgYm9vbCBjb29raWVBbHJlYWR5RXhpc3RzID0gY3VyTWFwLT5leGlzdHNDb29raWUoY2FuZGlk
YXRlQ29va2llKTsKKyAgICAgICAgICAgIGlmIChjb29raWVBbHJlYWR5RXhpc3RzKSB7CisgICAg
ICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZXhwaXJlZCBjb29raWUgZXhp
c3RzIGluIG1lbW9yeSIpOworICAgICAgICAgICAgICAgIFBhcnNlZENvb2tpZSogZXhwaXJlZCA9
IGN1ck1hcC0+cmVtb3ZlQ29va2llKGNhbmRpZGF0ZUNvb2tpZSk7CisgICAgICAgICAgICAgICAg
Ly8gQ29va2llIGlzIHVzZWxlc3MsIFJlbW92ZSB0aGUgY29va2llIGZyb20gdGhlIGJhY2tpbmdz
dG9yZSBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgICAgICAvLyBCYWNrdXAgY2hlY2sgZm9yIEJh
Y2tpbmdTdG9yZUNvb2tpZUVudHJ5IGluY2FzZSBzb21lb25lIGluY29ycmVjdGx5IHVzZXMgdGhp
cyBlbnVtCisgICAgICAgICAgICAgICAgaWYgKHBvc3RUb0JhY2tpbmdTdG9yZSAhPSBCYWNraW5n
U3RvcmVDb29raWVFbnRyeSAmJiAhZXhwaXJlZC0+aXNTZXNzaW9uKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZXhwaXJlZCBjb29raWUgaXMgbm9u
c2Vzc2lvbiwgZGVsZXRpbmcgZnJvbSBkYiIpOworICAgICAgICAgICAgICAgICAgICBtX2Nvb2tp
ZUJhY2tpbmdTdG9yZS0+cmVtb3ZlKGV4cGlyZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBkZWxldGUgZXhwaXJlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICBkZWxldGUgY2FuZGlkYXRlQ29va2llOworICAgIH0gZWxzZSB7CisgICAg
ICAgIEFTU0VSVChjdXJNYXApOworICAgICAgICBib29sIGNvb2tpZUFscmVhZHlFeGlzdHMgPSBj
dXJNYXAtPmV4aXN0c0Nvb2tpZShjYW5kaWRhdGVDb29raWUpOworICAgICAgICBpZiAoY29va2ll
QWxyZWFkeUV4aXN0cykKKyAgICAgICAgICAgIHVwZGF0ZShjdXJNYXAsIGNhbmRpZGF0ZUNvb2tp
ZSwgcG9zdFRvQmFja2luZ1N0b3JlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkQ29v
a2llVG9NYXAoY3VyTWFwLCBjYW5kaWRhdGVDb29raWUsIHBvc3RUb0JhY2tpbmdTdG9yZSk7Cisg
ICAgfQorfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmFkZENvb2tpZVRvTWFwKENvb2tpZU1hcCog
dGFyZ2V0TWFwLCBQYXJzZWRDb29raWUqIGNhbmRpZGF0ZUNvb2tpZSwgQmFja2luZ1N0b3JlUmVt
b3ZhbFBvbGljeSBwb3N0VG9CYWNraW5nU3RvcmUpCit7CisgICAgUGFyc2VkQ29va2llKiBvbGRl
c3RDb29raWUgPSAwOworICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbm90IHJlYWNoZWQgdGhlIHBl
ciBjb29raWUgZG9tYWluIGxpbWl0LgorICAgIC8vIElmIHRoYXQgaXMgbm90IHRydWUsIHdlIGNo
ZWNrIGlmIHRoZSBnbG9iYWwgbGltaXQgaGFzIGJlZW4gcmVhY2hlZCBpZiBiYWNraW5nc3RvcmUg
bW9kZSBpcyBvbgorICAgIC8vIFR3byBwb2ludHM6CisgICAgLy8gMSkgV2Ugb25seSBkbyBhIGds
b2JhbCBjaGVjayBpZiBiYWNraW5nc3RvcmUgbW9kZSBpcyBvbiBiZWNhdXNlIHRoZSBnbG9iYWwg
Y29va2llIGxpbWl0IG9ubHkKKyAgICAvLyAgICBjb3VudHMgc2Vzc2lvbiBjb29raWVzIHRoYXQg
YXJlIHNhdmVkIGluIHRoZSBkYXRhYmFzZS4gSWYgdGhlIHVzZXIgZ29lcyBvdmVyIHRoZSBsaW1p
dAorICAgIC8vICAgIHdoZW4gdGhleSBhcmUgaW4gcHJpdmF0ZSBtb2RlLCB3ZSBrbm93IHRoYXQg
dGhlIHRvdGFsIGNvb2tpZSBsaW1pdCB3aWxsIGJlIHVuZGVyIHRoZSBsaW1pdAorICAgIC8vICAg
IG9uY2UgdGhlIHVzZXIgZ29lcyBiYWNrIHRvIG5vcm1hbCBtb2RlIChtZW1vcnkgZGVsZXRlZCBh
bmQgcmVsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UpCisgICAgLy8gMikgV2UgdXNlIGVsc2UgaWYg
Zm9yIHRoaXMgc3RhdGVtZW50IGJlY2F1c2UgaWYgd2UgcmVtb3ZlIGEgY29va2llIGluIHRoZSAx
c3Qgc3RhdGVtZW50CisgICAgLy8gICAgdGhlbiBpdCBtZWFucyB0aGUgZ2xvYmFsIGNvdW50IHdp
bGwgbmV2ZXIgZXhjZWVkIHRoZSBsaW1pdAorCisgICAgQ29va2llTGltaXRMb2coIkNvb2tpZU1h
bmFnZXIgLSBsb2NhbCBjb3VudDogJWQgIGdsb2JhbCBjb3VudDogJWQiLCB0YXJnZXRNYXAtPmNv
dW50KCksIG1fY291bnQpOworICAgIGlmICh0YXJnZXRNYXAtPmNvdW50KCkgPj0gc19tYXhDb29r
aWVDb3VudFBlckhvc3QpIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZGVs
ZXRpbmcgb2xkZXN0IGNvb2tpZSBmcm9tIHRoaXMgbWFwIGR1ZSB0byBkb21haW4gY291bnQuXG4i
KTsKKyAgICAgICAgb2xkZXN0Q29va2llID0gdGFyZ2V0TWFwLT5yZW1vdmVPbGRlc3RDb29raWUo
KTsKKyAgICB9IGVsc2UgaWYgKG1fY291bnQgPj0gc19nbG9iYWxNYXhDb29raWVDb3VudCAmJiAo
cG9zdFRvQmFja2luZ1N0b3JlICE9IERvTm90UmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSkpIHsKKyAg
ICAgICAgICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gR2xvYmFsIGxpbWl0IHJl
YWNoZWQsIGluaXRpYXRlIGNvb2tpZSBsaW1pdCBjbGVhbiB1cC4iKTsKKyAgICAgICAgICAgIGlu
aXRpYXRlQ29va2llTGltaXRDbGVhblVwKCk7CisgICAgfQorCisgICAgQ29va2llTG9nKCJDb29r
aWVNYW5hZ2VyIC0gYWRkaW5nIG5ldyBjb29raWUgLSAlcy5cbiIsIGNhbmRpZGF0ZUNvb2tpZS0+
dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHRhcmdldE1hcC0+YWRkQ29va2llKGNh
bmRpZGF0ZUNvb2tpZSk7CisKKyAgICAvLyBPbmx5IGFkZCBub24gc2Vzc2lvbiBjb29raWUgdG8g
dGhlIGJhY2tpbmcgc3RvcmUuCisgICAgaWYgKHBvc3RUb0JhY2tpbmdTdG9yZSA9PSBSZW1vdmVG
cm9tQmFja2luZ1N0b3JlKSB7CisgICAgICAgIGlmIChvbGRlc3RDb29raWUgJiYgIW9sZGVzdENv
b2tpZS0+aXNTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdl
ciAtIG9sZGVzdENvb2tpZSBleGlzdHMsIGRlbGV0aW5nIGl0IGZyb20gYmFja2luZ3N0b3JlIGFu
ZCBkZXN0cnVjdGluZy5cbiIpOworICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJl
bW92ZShvbGRlc3RDb29raWUpOworICAgICAgICB9CisgICAgICAgIGlmICghY2FuZGlkYXRlQ29v
a2llLT5pc1Nlc3Npb24oKSkKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5pbnNl
cnQoY2FuZGlkYXRlQ29va2llKTsKKyAgICB9CisgICAgaWYgKG9sZGVzdENvb2tpZSkKKyAgICAg
ICAgZGVsZXRlIG9sZGVzdENvb2tpZTsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjp1cGRhdGUo
Q29va2llTWFwKiB0YXJnZXRNYXAsIFBhcnNlZENvb2tpZSogbmV3Q29va2llLCBCYWNraW5nU3Rv
cmVSZW1vdmFsUG9saWN5IHBvc3RUb0JhY2tpbmdTdG9yZSkKK3sKKyAgICAvLyBJZiBvbGQgY29v
a2llIGlzIG5vbi1zZXNzaW9uIGFuZCBuZXcgb25lIGlzLCB3ZSBoYXZlIHRvIGRlbGV0ZSBpdCBm
cm9tIGJhY2tpbmdzdG9yZQorICAgIC8vIElmIG5ldyBjb29raWUgaXMgbm9uLXNlc3Npb24gYW5k
IG9sZCBvbmUgaXMsIHdlIGhhdmUgdG8gYWRkIGl0IHRvIGJhY2tpbmdzdG9yZQorICAgIC8vIElm
IGJvdGggc2Vzc2lvbnMgYXJlIG5vbi1zZXNzaW9uLCB0aGVuIHdlIHVwZGF0ZSBpdCBpbiB0aGUg
YmFja2luZ3N0b3JlCisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSB1cGRhdGluZyBu
ZXcgY29va2llIC0gJXMuXG4iLCBuZXdDb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7
CisKKyAgICBQYXJzZWRDb29raWUqIG9sZENvb2tpZSA9IHRhcmdldE1hcC0+dXBkYXRlQ29va2ll
KG5ld0Nvb2tpZSk7CisKKyAgICBBU1NFUlQob2xkQ29va2llKTsKKworICAgIGJvb2wgbmV3SXNT
ZXNzaW9uID0gbmV3Q29va2llLT5pc1Nlc3Npb24oKTsKKyAgICBib29sIG9sZElzU2Vzc2lvbiA9
IG9sZENvb2tpZS0+aXNTZXNzaW9uKCk7CisKKyAgICBpZiAocG9zdFRvQmFja2luZ1N0b3JlID09
IFJlbW92ZUZyb21CYWNraW5nU3RvcmUpIHsKKyAgICAgICAgaWYgKCFuZXdJc1Nlc3Npb24gJiYg
IW9sZElzU2Vzc2lvbikKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT51cGRhdGUo
bmV3Q29va2llKTsKKyAgICAgICAgZWxzZSBpZiAobmV3SXNTZXNzaW9uICYmICFvbGRJc1Nlc3Np
b24pIHsKKyAgICAgICAgICAgIC8vIE11c3QgbWFudWFsbHkgZGVjcmVhc2UgdGhlIGNvdW50ZXIg
YmVjYXVzZSBpdCB3YXMgbm90IGNvdW50ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIGNvb2tp
ZSB3YXMgcmVtb3ZlZCBpbiBjb29raWVNYXAuCisgICAgICAgICAgICByZW1vdmVkQ29va2llKCk7
CisgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+cmVtb3ZlKG9sZENvb2tpZSk7Cisg
ICAgICAgIH0gZWxzZSBpZiAoIW5ld0lzU2Vzc2lvbiAmJiBvbGRJc1Nlc3Npb24pIHsKKyAgICAg
ICAgICAgIC8vIE11c3QgbWFudWFsbHkgaW5jcmVhc2UgdGhlIGNvdW50ZXIgYmVjYXVzZSBpdCB3
YXMgbm90IGNvdW50ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIGNvb2tpZSB3YXMgYWRkZWQg
aW4gY29va2llTWFwLgorICAgICAgICAgICAgYWRkZWRDb29raWUoKTsKKyAgICAgICAgICAgIG1f
Y29va2llQmFja2luZ1N0b3JlLT5pbnNlcnQobmV3Q29va2llKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICBkZWxldGUgb2xkQ29va2llOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmdldEJhY2tp
bmdTdG9yZUNvb2tpZXMoKQoreworICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQg
anVzdCBhZnRlciBoYXZpbmcgY3JlYXRlZCB0aGUgY29va2llTWFuYWdlcgorICAgIC8vIE5FVkVS
IGFmdGVyd2FyZHMhCisgICAgQVNTRVJUKCFtX2NvdW50KTsKKworICAgIFZlY3RvcjxQYXJzZWRD
b29raWUqPiBjb29raWVzOworICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5nZXRDb29raWVzRnJv
bURhdGFiYXNlKGNvb2tpZXMpOworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIEJhY2tp
bmdzdG9yZSBoYXMgJWQgY29va2llcywgbG9hZGluZyB0aGVtIGluIG1lbW9yeSBub3ciLCBjb29r
aWVzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29raWVzLnNpemUoKTsg
KytpKSB7CisgICAgICAgIFBhcnNlZENvb2tpZSogbmV3Q29va2llID0gY29va2llc1tpXTsKKyAg
ICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShuZXdDb29raWUsIEJhY2tpbmdTdG9yZUNvb2tpZUVu
dHJ5KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0UHJpdmF0ZU1vZGUoY29u
c3QgYm9vbCBtb2RlKQoreworICAgIGlmIChtX3ByaXZhdGVNb2RlID09IG1vZGUpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fcHJpdmF0ZU1vZGUgPSBtb2RlOworICAgIGlmICghbW9kZSkgewor
ICAgICAgICByZW1vdmVBbGxDb29raWVzKERvTm90UmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSk7Cisg
ICAgICAgIGdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKTsKKyAgICB9Cit9CisKK0Nvb2tpZU1hcCog
Q29va2llTWFuYWdlcjo6ZmluZE9yQ3JlYXRlQ29va2llTWFwKENvb2tpZU1hcCogcHJvdG9jb2xN
YXAsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBib29sIGZpbmRPbmx5KQoreworICAgIC8vIEV4cGxv
ZGUgdGhlIGRvbWFpbiB3aXRoIHRoZSAnLicgZGVsaW1pdGVyCisgICAgVmVjdG9yPFN0cmluZz4g
ZGVsaW1pdGVkSG9zdDsKKyAgICBkb21haW4uc3BsaXQoIi4iLCBkZWxpbWl0ZWRIb3N0KTsKKwor
ICAgIENvb2tpZU1hcCogY3VyTWFwID0gcHJvdG9jb2xNYXA7CisgICAgc2l6ZV90IGhvc3RTaXpl
ID0gZGVsaW1pdGVkSG9zdC5zaXplKCk7CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIg
LSBsb29raW5nIGF0IHByb3RvY29sIG1hcCAlcyBcbiIsIHByb3RvY29sTWFwLT5nZXROYW1lKCku
dXRmOCgpLmRhdGEoKSk7CisKKyAgICAvLyBGaW5kICYgY3JlYXRlIG5lY2Vzc2FyeSBDb29raWVN
YXBzIGJ5IHRyYXZlcnNpbmcgZG93biB0aGUgZG9tYWluIHRyZWUKKyAgICAvLyBFYWNoIENvb2tp
ZU1hcCByZXByZXNlbnQgYSBzdWJzZWN0aW9uIG9mIHRoZSBkb21haW4sIGRlbGltaXRlZCBieSAi
LiIKKyAgICBpbnQgaSA9IGhvc3RTaXplIC0gMTsKKyAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAg
ICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZpbmRpbmcgJXMgaW4gY3VycmVudG1hcFxu
IiwgZGVsaW1pdGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgQ29va2llTWFwKiBu
ZXh0TWFwID0gY3VyTWFwLT5nZXRTdWJkb21haW5NYXAoZGVsaW1pdGVkSG9zdFtpXSk7CisgICAg
ICAgIGlmICghbmV4dE1hcCkgeworICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2Vy
IC0gY2Fubm90IGZpbmQgbWFwXG4iKTsKKyAgICAgICAgICAgIGlmIChmaW5kT25seSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdl
ciAtIGNyZWF0aW5nICVzIGluIGN1cnJlbnRtYXAgJXNcbiIsIGRlbGltaXRlZEhvc3RbaV0udXRm
OCgpLmRhdGEoKSwgY3VyTWFwLT5nZXROYW1lKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAg
ICBuZXh0TWFwID0gbmV3IENvb2tpZU1hcChkZWxpbWl0ZWRIb3N0W2ldKTsKKyAgICAgICAgICAg
IENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGFkZGluZyBzdWJkb21haW4gdG8gbWFwXG4iKTsK
KyAgICAgICAgICAgIGN1ck1hcC0+YWRkU3ViZG9tYWluTWFwKGRlbGltaXRlZEhvc3RbaV0sIG5l
eHRNYXApOworICAgICAgICB9CisgICAgICAgIGN1ck1hcCA9IG5leHRNYXA7CisgICAgICAgIGkt
LTsKKyAgICB9CisgICAgcmV0dXJuIGN1ck1hcDsKK30KKworCit2b2lkIENvb2tpZU1hbmFnZXI6
OnJlbW92ZUNvb2tpZVdpdGhOYW1lKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBjb29r
aWVOYW1lKQoreworICAgIC8vIFdlIGdldCBhbGwgY29va2llcyBmcm9tIGFsbCBkb21haW5zIHRo
YXQgZG9tYWluIG1hdGNoZXMgdGhlIHJlcXVlc3QgZG9tYWluCisgICAgLy8gYW5kIGRlbGV0ZSBh
bnkgY29va2llcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB0aGF0IHBhdGggbWF0Y2hlcyB0aGUg
cmVxdWVzdCBwYXRoCisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHJlc3VsdHM7CisgICAgZ2V0
UmF3Q29va2llcyhyZXN1bHRzLCB1cmwsIFdpdGhIdHRwT25seUNvb2tpZXMpOworICAgIC8vIERl
bGV0ZSB0aGUgY29va2llcyB0aGF0IHBhdGggbWF0Y2hlcyB0aGUgcmVxdWVzdCBwYXRoCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFBh
cnNlZENvb2tpZSogY29va2llID0gcmVzdWx0c1tpXTsKKyAgICAgICAgaWYgKCFlcXVhbElnbm9y
aW5nQ2FzZShjb29raWUtPm5hbWUoKSwgY29va2llTmFtZSkpCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgaWYgKHVybC5wYXRoKCkuc3RhcnRzV2l0aChjb29raWUtPnBhdGgoKSwgZmFs
c2UpKSB7CisgICAgICAgICAgICBjb29raWUtPmZvcmNlRXhwaXJlKCk7CisgICAgICAgICAgICBj
aGVja0FuZFRyZWF0Q29va2llKGNvb2tpZSwgUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSk7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6aW5pdGlhdGVDb29raWVMaW1p
dENsZWFuVXAoKQoreworICAgIGlmICghbV9saW1pdFRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAg
ICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gU3RhcnRpbmcgYSB0aW1lciBmb3IgY29va2ll
IGNsZWFudXAiKTsKKyAgICAgICAgbV9saW1pdFRpbWVyLnN0YXJ0T25lU2hvdChzX2RlbGF5VG9T
dGFydENvb2tpZUNsZWFudXApOworICAgIH0gZWxzZSB7CisjaWYgIU5ERUJVRworICAgICAgICBD
b29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBDb29raWUgY2xlYW51cCB0aW1lciBhbHJlYWR5IHJ1
bm5pbmciKTsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpjb29raWVM
aW1pdENsZWFuVXAoVGltZXI8Q29va2llTWFuYWdlcj4qIHRpbWVyKQoreworICAgIEFTU0VSVF9V
TlVTRUQodGltZXIsIHRpbWVyID09ICZtX2xpbWl0VGltZXIpOworCisgICAgQ29va2llTGltaXRM
b2coIkNvb2tpZU1hbmFnZXIgLSBTdGFydGluZyBjb29raWUgY2xlYW4gdXAiKTsKKworICAgIHNp
emVfdCBudW1iZXJPZkNvb2tpZXNPdmVyTGltaXQgPSAobV9jb3VudCA+IHNfZ2xvYmFsTWF4Q29v
a2llQ291bnQpID8gbV9jb3VudCAtIHNfZ2xvYmFsTWF4Q29va2llQ291bnQgOiAwOworICAgIHNp
emVfdCBhbW91bnRUb0RlbGV0ZSA9IHNfY29va2llc1RvRGVsZXRlV2hlbkxpbWl0UmVhY2hlZCAr
IG51bWJlck9mQ29va2llc092ZXJMaW1pdDsKKworICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVN
YW5hZ2VyIC0gRXhjZXNzOiAlZCAgQW1vdW50IHRvIERlbGV0ZTogJWQiLCBudW1iZXJPZkNvb2tp
ZXNPdmVyTGltaXQsIGFtb3VudFRvRGVsZXRlKTsKKworICAgIC8vIENhbGwgdGhlIGRhdGFiYXNl
IHRvIGRlbGV0ZSAnYW1vdW50VG9EZWxldGUnIG9mIGNvb2tpZXMKKyAgICBWZWN0b3I8UGFyc2Vk
Q29va2llKj4gY29va2llc1RvRGVsZXRlOworICAgIGNvb2tpZXNUb0RlbGV0ZS5yZXNlcnZlSW5p
dGlhbENhcGFjaXR5KGFtb3VudFRvRGVsZXRlKTsKKworICAgIENvb2tpZUxpbWl0TG9nKCJDb29r
aWVNYW5hZ2VyIC0gQ2FsbGluZyBkYXRhYmFzZSB0byBjbGVhbiB1cCIpOworICAgIG1fY29va2ll
QmFja2luZ1N0b3JlLT5nZXRDb29raWVzRnJvbURhdGFiYXNlKGNvb2tpZXNUb0RlbGV0ZSwgYW1v
dW50VG9EZWxldGUpOworCisgICAgLy8gQ29va2llcyBhcmUgb3JkZXJlZCBpbiBBU0Mgb3JkZXIg
YnkgbGFzdEFjY2Vzc2VkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhbW91bnRUb0RlbGV0
ZTsgKytpKSB7CisgICAgICAgIC8vIEV4cGlyZSB0aGVtIGFuZCBjYWxsIGNoZWNrYW5kdHJlYXQg
dG8gZGVsZXRlIHRoZW0gZnJvbSBtZW1vcnkgYW5kIGRhdGFiYXNlCisgICAgICAgIFBhcnNlZENv
b2tpZSogbmV3Q29va2llID0gY29va2llc1RvRGVsZXRlW2ldOworICAgICAgICBDb29raWVMaW1p
dExvZygiQ29va2llTWFuYWdlciAtIEV4cGlyZSBjb29raWU6ICVzIGFuZCBkZWxldGUiLCBuZXdD
b29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIG5ld0Nvb2tpZS0+Zm9y
Y2VFeHBpcmUoKTsKKyAgICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShuZXdDb29raWUsIFJlbW92
ZUZyb21CYWNraW5nU3RvcmUpOworICAgIH0KKworICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVN
YW5hZ2VyIC0gQ29va2llIGNsZWFuIHVwIGNvbXBsZXRlLiIpOworfQorCit2b2lkIENvb2tpZU1h
bmFnZXI6OmZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlKCkKK3sKKyAgICBDb29raWVMb2coIkNv
b2tpZU1hbmFnZXIgLSBmbHVzaENvb2tpZXNUb0JhY2tpbmdTdG9yZSBzdGFydGluZy5cbiIpOwor
ICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gc2h1dGRvd24sIHNvIHdlIG5lZWQgdG8gYmUgc3Vy
ZSB0aGUgT1MgZG9lc24ndCBraWxsIHVzIGJlZm9yZSB0aGUgZGIgd3JpdGUgZmluaXNoZXMuCisg
ICAgLy8gT25jZSBzaG91bGQgYmUgZW5vdWdoIHNpbmNlIHRoaXMgZXh0ZW5kcyB0ZXJpbWluYXRp
b24gYnkgMiBzZWNvbmRzLgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOYXZpZ2F0b3JIYW5k
bGVyOjpzZW5kRXh0ZW5kVGVybWluYXRlKCk7CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnNl
bmRDaGFuZ2VzVG9EYXRhYmFzZVN5bmNocm9ub3VzbHkoKTsKKyAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBmbHVzaENvb2tpZXNUb0JhY2tpbmdTdG9yZSBmaW5pc2hlZC5cbiIpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjc4ZDI2YzZmZDQwMGI5N2Zi
ZjU2YjljYmY0MTk0NDU0YjFiY2QzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuaApAQCAtMCwwICsxLDE2MCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4u
Y2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMiBSZXNlYXJj
aCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ29va2llTWFu
YWdlcl9oCisjZGVmaW5lIENvb2tpZU1hbmFnZXJfaAorCisjaW5jbHVkZSAiQ29va2llTWFwLmgi
CisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
KyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUd1YXJkZWRQ
b2ludGVyLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdURiB7Citj
bGFzcyBTdHJpbmc7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmU7CitjbGFzcyBQYXJzZWRDb29raWU7CitjbGFzcyBLVVJMOworCitl
bnVtIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgeworICAgIFJlbW92ZUZyb21CYWNraW5nU3Rv
cmUsCisgICAgQmFja2luZ1N0b3JlQ29va2llRW50cnksCisgICAgRG9Ob3RSZW1vdmVGcm9tQmFj
a2luZ1N0b3JlCit9OworCitlbnVtIENvb2tpZUZpbHRlciB7CisgICAgTm9IdHRwT25seUNvb2tp
ZSwKKyAgICBXaXRoSHR0cE9ubHlDb29raWVzLAorfTsKKworZW51bSBDb29raWVTdG9yYWdlQWNj
ZXB0UG9saWN5IHsKKyAgICBDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5QWx3YXlzLAorICAgIENv
b2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lOZXZlciwKKyAgICBDb29raWVTdG9yYWdlQWNjZXB0UG9s
aWN5T25seUZyb21NYWluRG9jdW1lbnREb21haW4KK307CisKKy8qCisgICogVGhlIENvb2tpZU1h
bmFnZXIgY2xhc3MgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBoYW5kbGVzIGFuZCBzZWxlY3Rp
dmVseSBwZXJzaXN0cworICAqIGluY29taW5nIGNvb2tpZXMuIFRoaXMgY2xhc3MgY29udGFpbnMg
YSB0cmVlIG9mIGRvbWFpbnMgZm9yIHF1aWNrZXIKKyAgKiBjb29raWUgZG9tYWluIGxvb2t1cC4g
VGhlIHRvcCBvZiB0aGUgdHJlZSByZXByZXNlbnRzIGEgbnVsbCB2YWx1ZSBmb3IgYSBudWxsIGRv
bWFpbi4KKyAgKiBUaGUgbnVsbCBkb21haW4gY29udGFpbnMgcmVmZXJlbmNlcyB0byB0b3AgbGV2
ZWwgZG9tYWlucyBhbmQgZWFjaCBub2RlIGJlbG93CisgICogcmVwcmVzZW50cyBhIHN1Yi1zZWN0
aW9uIG9mIGEgZG9tYWluLCBkZWxpbWl0ZWQgYnkgIi4iCisgICoKKyAgKiBJZiBhIGNvb2tpZSBo
YXMgYSBkb21haW4gImEuYi5jb20iLCBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbm9kZSBuYW1l
ZCAiYSIgaW4gdGhpcyB0cmVlLgorICAqIGluIHRoZSBicmFuY2ggIiItPiJjb20iLT4iYiItPiJh
IgorICAqCisgICogQ29va2llIHNwZWNzIGZvbGxvdyB0aGUgUkZDIDYyNjUgc3BlYyBzaGVldC4K
KyAgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1CisgICovCisKK2NsYXNzIENv
b2tpZU1hbmFnZXI6IHB1YmxpYyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3VhcmRlZFBvaW50ZXJC
YXNlIHsKK3B1YmxpYzoKKyAgICBib29sIGNhbkxvY2FsQWNjZXNzQWxsQ29va2llcygpIGNvbnN0
IHsgcmV0dXJuIG1fc2hvdWxkRHVtcEFsbENvb2tpZXM7IH0KKyAgICB2b2lkIHNldENhbkxvY2Fs
QWNjZXNzQWxsQ29va2llcyhib29sIGVuYWJsZWQpIHsgbV9zaG91bGREdW1wQWxsQ29va2llcyA9
IGVuYWJsZWQ7IH0KKworICAgIHZvaWQgc2V0Q29va2llcyhjb25zdCBLVVJMJiwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSk7CisKKyAgICB2b2lkIHJlbW92ZUFsbENvb2tpZXMoQmFja2luZ1N0b3JlUmVt
b3ZhbFBvbGljeSk7CisgICAgdm9pZCByZW1vdmVDb29raWVXaXRoTmFtZShjb25zdCBLVVJMJiwg
Y29uc3QgU3RyaW5nJiBjb29raWVOYW1lKTsKKworICAgIHVuc2lnbmVkIHNob3J0IGNvb2tpZXND
b3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY291bnQ7IH0KKworICAgIHZvaWQgc2V0Q29va2llSmFy
KGNvbnN0IGNoYXIqKTsKKyAgICBjb25zdCBTdHJpbmcmIGNvb2tpZUphcigpIGNvbnN0IHsgcmV0
dXJuIG1fY29va2llSmFyRmlsZU5hbWU7IH0KKworICAgIC8vIENvdW50IHVwZGF0ZSBtZXRob2QK
KyAgICB2b2lkIHJlbW92ZWRDb29raWUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fY291bnQg
PiAwKTsKKyAgICAgICAgLS1tX2NvdW50OworICAgIH0KKyAgICB2b2lkIGFkZGVkQ29va2llKCkg
eyArK21fY291bnQ7IH0KKworICAgIC8vIENvbnN0YW50cyBnZXR0ZXIuCisgICAgc3RhdGljIHVu
c2lnbmVkIGludCBtYXhDb29raWVMZW5ndGgoKSB7IHJldHVybiBzX21heENvb2tpZUxlbmd0aDsg
fSAKKworICAgIHZvaWQgc2V0Q29va2llUG9saWN5KENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kg
cG9saWN5KSB7IG1fcG9saWN5ID0gcG9saWN5OyB9CisgICAgQ29va2llU3RvcmFnZUFjY2VwdFBv
bGljeSBjb29raWVQb2xpY3koKSBjb25zdCB7IHJldHVybiBtX3BvbGljeTsgfQorICAgIHZvaWQg
c2V0UHJpdmF0ZU1vZGUoY29uc3QgYm9vbCk7CisKKyAgICBTdHJpbmcgZ2V0Q29va2llKGNvbnN0
IEtVUkwmIHJlcXVlc3RVUkwsIENvb2tpZUZpbHRlcikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5z
IGFsbCBjb29raWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFVSTCBh
cyByYXcgY29va2llcy4KKyAgICB2b2lkIGdldFJhd0Nvb2tpZXMoVmVjdG9yPFBhcnNlZENvb2tp
ZSo+JiBzdGFja09mQ29va2llcywgY29uc3QgS1VSTCYgcmVxdWVzdFVSTCwgQ29va2llRmlsdGVy
ID0gV2l0aEh0dHBPbmx5Q29va2llcykgY29uc3Q7CisKKyAgICB2b2lkIGZsdXNoQ29va2llc1Rv
QmFja2luZ1N0b3JlKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIENvb2tpZU1hbmFnZXImIGNv
b2tpZU1hbmFnZXIoKTsKKworICAgIENvb2tpZU1hbmFnZXIoKTsKKyAgICB+Q29va2llTWFuYWdl
cigpOworCisgICAgdm9pZCBjaGVja0FuZFRyZWF0Q29va2llKFBhcnNlZENvb2tpZSosIEJhY2tp
bmdTdG9yZVJlbW92YWxQb2xpY3kpOworCisgICAgYm9vbCBzaG91bGRSZWplY3RGb3JTZWN1cml0
eVJlYXNvbihjb25zdCBQYXJzZWRDb29raWUqLCBjb25zdCBLVVJMJik7CisKKyAgICB2b2lkIGFk
ZENvb2tpZVRvTWFwKENvb2tpZU1hcCosIFBhcnNlZENvb2tpZSosIEJhY2tpbmdTdG9yZVJlbW92
YWxQb2xpY3kpOworICAgIHZvaWQgdXBkYXRlKENvb2tpZU1hcCosIFBhcnNlZENvb2tpZSosIEJh
Y2tpbmdTdG9yZVJlbW92YWxQb2xpY3kpOworCisgICAgQ29va2llTWFwKiBmaW5kT3JDcmVhdGVD
b29raWVNYXAoQ29va2llTWFwKiBwcm90b2NvbE1hcCwgY29uc3QgU3RyaW5nJiBkb21haW4sIGJv
b2wgZmluZE9ubHkpOworCisgICAgdm9pZCBpbml0aWF0ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpOwor
ICAgIHZvaWQgY29va2llTGltaXRDbGVhblVwKFRpbWVyPENvb2tpZU1hbmFnZXI+Kik7CisKKyAg
ICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj4gbV9tYW5hZ2VyTWFwOworCisgICAgdW5zaWdu
ZWQgc2hvcnQgbV9jb3VudDsKKworICAgIGJvb2wgbV9wcml2YXRlTW9kZTsKKyAgICBib29sIG1f
c2hvdWxkRHVtcEFsbENvb2tpZXM7CisKKyAgICBTdHJpbmcgbV9jb29raWVKYXJGaWxlTmFtZTsK
KworICAgIC8vIEZJWE1FOiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgICB2b2lk
IGdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKTsKKworICAgIC8vIENvb2tpZSBzaXplIGxpbWl0IG9m
IDRrQiBhcyBhZHZpc2VkIHBlciBSRkMyMTA5CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNf
bWF4Q29va2llTGVuZ3RoID0gNDA5NjsKKworICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kg
bV9wb2xpY3k7CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSogbV9jb29raWVCYWNr
aW5nU3RvcmU7CisgICAgVGltZXI8Q29va2llTWFuYWdlcj4gbV9saW1pdFRpbWVyOworCit9Owor
CisvLyBHZXQgdGhlIGdsb2JhbCBpbnN0YW5jZS4KK0Nvb2tpZU1hbmFnZXImIGNvb2tpZU1hbmFn
ZXIoKTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQ29va2llTWFuYWdl
cl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZU1hcC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uYjE0MWI3ODgxMzMxNTkzZDk1YjkzM2M3MGY5ZDY2MTFiMmE1MmZjZQot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29v
a2llTWFwLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwg
MjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENv
cHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNkZWZpbmUgRU5BQkxFX0NPT0tJRV9ERUJVRyAwCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJDb29raWVNYXAuaCIKKworI2luY2x1ZGUgIkNvb2tpZU1hbmFn
ZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisj
aW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCisjaWYgRU5BQkxFX0NPT0tJRV9ERUJVRwor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxvZy5oPgorI2RlZmluZSBDb29raWVMb2coZm9y
bWF0LCAuLi4pIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2dBbHdheXMoQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkxvZ0xldmVsSW5mbywgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVm
aW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikKKyNlbmRpZiAvLyBFTkFCTEVfQ09PS0lFX0RFQlVH
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29va2llTWFwOjpDb29raWVNYXAoY29uc3QgU3Ry
aW5nJiBuYW1lKQorICAgIDogbV9vbGRlc3RDb29raWUoMCkKKyAgICAsIG1fbmFtZShuYW1lKQor
eworfQorCitDb29raWVNYXA6On5Db29raWVNYXAoKQoreworICAgIC8vIFRoZXJlIGlzIG5vIG5l
ZWQgdG8gZGVsZXRlIG1fb2xkZXN0Q29va2llIGFzIGl0IGlzIGhhbmRsZWQgaW4gZGVsZXRpbmcg
bV9jb29raWVNYXAKKyAgICBkZWxldGVBbGxWYWx1ZXMobV9jb29raWVNYXApOworICAgIG1fY29v
a2llTWFwLmNsZWFyKCk7CisgICAgZGVsZXRlQWxsVmFsdWVzKG1fc3ViZG9tYWlucyk7CisgICAg
bV9zdWJkb21haW5zLmNsZWFyKCk7Cit9CisKK2Jvb2wgQ29va2llTWFwOjpleGlzdHNDb29raWUo
Y29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpIGNvbnN0Cit7CisgICAgU3RyaW5nIGtleSA9IGNv
b2tpZS0+bmFtZSgpICsgY29va2llLT5wYXRoKCk7CisgICAgcmV0dXJuIG1fY29va2llTWFwLmNv
bnRhaW5zKGtleSk7Cit9CisKK3ZvaWQgQ29va2llTWFwOjphZGRDb29raWUoUGFyc2VkQ29va2ll
KiBjb29raWUpCit7CisgICAgU3RyaW5nIGtleSA9IGNvb2tpZS0+bmFtZSgpICsgY29va2llLT5w
YXRoKCk7CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVtcHRpbmcgdG8gYWRkIGNv
b2tpZSAtICVzIiwgY29va2llLT5uYW1lKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBBU1NFUlQo
IW1fY29va2llTWFwLmNvbnRhaW5zKGtleSkpOworICAgIG1fY29va2llTWFwLmFkZChrZXksIGNv
b2tpZSk7CisgICAgaWYgKCFjb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAgICBjb29raWVNYW5h
Z2VyKCkuYWRkZWRDb29raWUoKTsKKyAgICBpZiAoIW1fb2xkZXN0Q29va2llIHx8IG1fb2xkZXN0
Q29va2llLT5sYXN0QWNjZXNzZWQoKSA+IGNvb2tpZS0+bGFzdEFjY2Vzc2VkKCkpCisgICAgICAg
IG1fb2xkZXN0Q29va2llID0gY29va2llOworfQorCitQYXJzZWRDb29raWUqIENvb2tpZU1hcDo6
dXBkYXRlQ29va2llKFBhcnNlZENvb2tpZSogbmV3Q29va2llKQoreworICAgIFN0cmluZyBrZXkg
PSBuZXdDb29raWUtPm5hbWUoKSArIG5ld0Nvb2tpZS0+cGF0aCgpOworICAgIFBhcnNlZENvb2tp
ZSogb2xkQ29va2llID0gbV9jb29raWVNYXAudGFrZShrZXkpOworICAgIEFTU0VSVChvbGRDb29r
aWUpOworICAgIG1fY29va2llTWFwLmFkZChrZXksIG5ld0Nvb2tpZSk7CisgICAgaWYgKG9sZENv
b2tpZSA9PSBtX29sZGVzdENvb2tpZSkKKyAgICAgICAgdXBkYXRlT2xkZXN0Q29va2llKCk7Cisg
ICAgcmV0dXJuIG9sZENvb2tpZTsKK30KKworUGFyc2VkQ29va2llKiBDb29raWVNYXA6OnJlbW92
ZUNvb2tpZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICAvLyBGaW5kIGEgcHJl
dmlvdXMgZW50cnkgZm9yIGRlbGV0aW9uCisgICAgU3RyaW5nIGtleSA9IGNvb2tpZS0+bmFtZSgp
ICsgY29va2llLT5wYXRoKCk7CisgICAgUGFyc2VkQ29va2llKiBwcmV2Q29va2llID0gbV9jb29r
aWVNYXAudGFrZShrZXkpOworCisgICAgaWYgKCFwcmV2Q29va2llKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIGlmIChwcmV2Q29va2llID09IG1fb2xkZXN0Q29va2llKQorICAgICAgICB1cGRh
dGVPbGRlc3RDb29raWUoKTsKKyAgICBlbHNlIGlmIChwcmV2Q29va2llICE9IGNvb2tpZSkgewor
ICAgICAgICAvLyBUaGUgY29va2llIHdlIHVzZWQgdG8gc2VhcmNoIGlzIGZvcmNlIGV4cGlyZWQs
IHdlIG11c3QgZG8gdGhlIHNhbWUKKyAgICAgICAgLy8gdG8gdGhlIGNvb2tpZSBpbiBtZW1vcnkg
dG9vLgorICAgICAgICBpZiAoY29va2llLT5pc0ZvcmNlRXhwaXJlZCgpKQorICAgICAgICAgICAg
cHJldkNvb2tpZS0+Zm9yY2VFeHBpcmUoKTsKKyAgICAgICAgZGVsZXRlIGNvb2tpZTsKKyAgICB9
CisKKyAgICBpZiAoIXByZXZDb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAgICBjb29raWVNYW5h
Z2VyKCkucmVtb3ZlZENvb2tpZSgpOworICAgIHJldHVybiBwcmV2Q29va2llOworfQorCitDb29r
aWVNYXAqIENvb2tpZU1hcDo6Z2V0U3ViZG9tYWluTWFwKGNvbnN0IFN0cmluZyYgc3ViZG9tYWlu
KQoreworI2lmIEVOQUJMRV9DT09LSUVfREVCVUcKKyAgICBpZiAoIW1fc3ViZG9tYWlucy5jb250
YWlucyhzdWJkb21haW4pKQorICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtICVzIGRvZXMg
bm90IGV4aXN0IGluIHRoaXMgbWFwIiwgc3ViZG9tYWluLnV0ZjgoKS5kYXRhKCkpOworI2VuZGlm
CisgICAgcmV0dXJuIG1fc3ViZG9tYWlucy5nZXQoc3ViZG9tYWluKTsKK30KKwordm9pZCBDb29r
aWVNYXA6OmFkZFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmIHN1YmRvbWFpbiwgQ29va2llTWFw
KiBuZXdEb21haW4pCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSBBdHRlbXB0aW5nIHRv
IGFkZCBzdWJkb21haW4gLSAlcyIsIHN1YmRvbWFpbi51dGY4KCkuZGF0YSgpKTsKKyAgICBtX3N1
YmRvbWFpbnMuYWRkKHN1YmRvbWFpbiwgbmV3RG9tYWluKTsKK30KKwordm9pZCBDb29raWVNYXA6
OmdldEFsbENvb2tpZXMoVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBzdGFja09mQ29va2llcykKK3sK
KyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVtcHRpbmcgdG8gY29weSBNYXA6JXMgY29v
a2llcyB3aXRoICVkIGNvb2tpZXMgaW50byB2ZWN0b3JzIiwgbV9uYW1lLnV0ZjgoKS5kYXRhKCks
IG1fY29va2llTWFwLnNpemUoKSk7CisKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4gbmV3Q29v
a2llczsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9jb29raWVNYXAsIG5ld0Nvb2tpZXMpOwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q29va2llcy5zaXplKCk7IGkrKykgeworICAg
ICAgICBQYXJzZWRDb29raWUqIG5ld0Nvb2tpZSA9IG5ld0Nvb2tpZXNbaV07CisgICAgICAgIGlm
IChuZXdDb29raWUtPmhhc0V4cGlyZWQoKSkgeworICAgICAgICAgICAgLy8gTm90aWNlIHRoYXQg
d2UgZG9uJ3QgZGVsZXRlIGZyb20gYmFja2luZ3N0b3JlLiBUaGVzZSBleHBpcmVkIGNvb2tpZXMg
d2lsbCBiZQorICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIG1hbmFnZXIgbG9hZHMgdGhlIGJh
Y2tpbmdzdG9yZSBhZ2Fpbi4KKyAgICAgICAgICAgIFBhcnNlZENvb2tpZSogZXhwaXJlZCA9IHJl
bW92ZUNvb2tpZShuZXdDb29raWUpOworICAgICAgICAgICAgZGVsZXRlIGV4cGlyZWQ7CisgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgc3RhY2tPZkNvb2tpZXMtPmFwcGVuZChuZXdDb29raWUp
OworICAgIH0KKworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gc3RhY2sgb2YgY29va2llcyBu
b3cgaGF2ZSAlZCBjb29raWVzIGluIGl0IiwgKCpzdGFja09mQ29va2llcykuc2l6ZSgpKTsKKwor
fQorCitQYXJzZWRDb29raWUqIENvb2tpZU1hcDo6cmVtb3ZlT2xkZXN0Q29va2llKCkKK3sKKyAg
ICAvLyBGSVhNRTogTWFrZSBzdXJlIGl0IGZpbmRzIHRoZSBHTE9CQUwgb2xkZXN0IGNvb2tpZSwg
bm90IHRoZSBmaXJzdCBvbGRlc3Rjb29raWUgaXQgZmluZHMuCisgICAgUGFyc2VkQ29va2llKiBv
bGRlc3RDb29raWUgPSBtX29sZGVzdENvb2tpZTsKKworICAgIC8vIElmIHRoaXMgbWFwIGhhcyBh
biBvbGRlc3RDb29raWUsIHJlbW92ZSBpdC4gSWYgbm90LCBkbyBhIERGUyB0byBzZWFyY2ggZm9y
IGEgY2hpbGQgdGhhdCBkb2VzCisgICAgaWYgKCFvbGRlc3RDb29raWUpIHsKKworICAgICAgICBD
b29raWVMb2coIkNvb2tpZU1hcCAtIG5vIG9sZGVzdENvb2tpZSBleGlzdCIpOworCisgICAgICAg
IC8vIEJhc2UgY2FzZSBpcyBpZiB0aGUgbWFwIGhhcyBubyBjaGlsZCBhbmQgbm8gY29va2llcywg
d2UgcmV0dXJuIGEgbnVsbC4KKyAgICAgICAgaWYgKCFtX3N1YmRvbWFpbnMuc2l6ZSgpKSB7Cisg
ICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIG5vIHN1YmRvbWFpbnMsIGJhc2UgY2Fz
ZSByZWFjaGVkLCByZXR1cm4gMCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0K
KworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIGxvb2tpbmcgaW50byBzdWJkb21haW5z
Iik7CisKKyAgICAgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46Oml0ZXJhdG9y
IGl0ID0gbV9zdWJkb21haW5zLmJlZ2luKCk7IGl0ICE9IG1fc3ViZG9tYWlucy5lbmQoKTsgKytp
dCkgeworICAgICAgICAgICAgb2xkZXN0Q29va2llID0gaXQtPnNlY29uZC0+cmVtb3ZlT2xkZXN0
Q29va2llKCk7CisgICAgICAgICAgICBpZiAob2xkZXN0Q29va2llKQorICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29r
aWVNYXAgLSBvbGRlc3RDb29raWUgZXhpc3QuIik7CisgICAgICAgIG9sZGVzdENvb2tpZSA9IHJl
bW92ZUNvb2tpZShtX29sZGVzdENvb2tpZSk7CisgICAgfQorCisgICAgcmV0dXJuIG9sZGVzdENv
b2tpZTsKK30KKwordm9pZCBDb29raWVNYXA6OnVwZGF0ZU9sZGVzdENvb2tpZSgpCit7CisgICAg
aWYgKCFtX2Nvb2tpZU1hcC5zaXplKCkpCisgICAgICAgIG1fb2xkZXN0Q29va2llID0gMDsKKyAg
ICBlbHNlIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFBhcnNlZENvb2tpZSo+OjppdGVyYXRv
ciBpdCA9IG1fY29va2llTWFwLmJlZ2luKCk7CisgICAgICAgIG1fb2xkZXN0Q29va2llID0gaXQt
PnNlY29uZDsKKyAgICAgICAgKytpdDsKKyAgICAgICAgZm9yICg7IGl0ICE9IG1fY29va2llTWFw
LmVuZCgpOyArK2l0KQorICAgICAgICAgICAgaWYgKG1fb2xkZXN0Q29va2llLT5sYXN0QWNjZXNz
ZWQoKSA+IGl0LT5zZWNvbmQtPmxhc3RBY2Nlc3NlZCgpKQorICAgICAgICAgICAgICAgIG1fb2xk
ZXN0Q29va2llID0gaXQtPnNlY29uZDsKKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFwOjpkZWxl
dGVBbGxDb29raWVzQW5kRG9tYWlucygpCit7CisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1h
cCo+OjppdGVyYXRvciBmaXJzdCA9IG1fc3ViZG9tYWlucy5iZWdpbigpOworICAgIEhhc2hNYXA8
U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgZW5kID0gbV9zdWJkb21haW5zLmVuZCgpOwor
ICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IGZpcnN0
OyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworCisgICAgSGFz
aE1hcDxTdHJpbmcsIFBhcnNlZENvb2tpZSo+OjppdGVyYXRvciBmaXJzdENvb2tpZUl0ZXJhdG9y
ID0gbV9jb29raWVNYXAuYmVnaW4oKTsKKyAgICBIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2ll
Kj46Oml0ZXJhdG9yIGVuZENvb2tpZUl0ZXJhdG9yID0gbV9jb29raWVNYXAuZW5kKCk7CisgICAg
Zm9yIChIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj46Oml0ZXJhdG9yIGl0ID0gZmlyc3RD
b29raWVJdGVyYXRvcjsgaXQgIT0gZW5kQ29va2llSXRlcmF0b3I7ICsraXQpCisgICAgICAgIGRl
bGV0ZSBpdC0+c2Vjb25kOworCisgICAgbV9zdWJkb21haW5zLmNsZWFyKCk7CisgICAgbV9jb29r
aWVNYXAuY2xlYXIoKTsKKworICAgIG1fb2xkZXN0Q29va2llID0gMDsKK30KKwordm9pZCBDb29r
aWVNYXA6OmdldEFsbENoaWxkQ29va2llcyhWZWN0b3I8UGFyc2VkQ29va2llKj4qIHN0YWNrT2ZD
b29raWVzKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gZ2V0QWxsQ2hpbGRDb29raWVz
IGluIE1hcCAtICVzIiwgZ2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAgIGdldEFsbENvb2tp
ZXMoc3RhY2tPZkNvb2tpZXMpOworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+
OjppdGVyYXRvciBpdCA9IG1fc3ViZG9tYWlucy5iZWdpbigpOyBpdCAhPSBtX3N1YmRvbWFpbnMu
ZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFsbENoaWxkQ29va2llcyhzdGFj
a09mQ29va2llcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjczYmExM2Zh
Y2MxNGE1MTUyZWExMzk4ODhlNDQ0M2E4ZWExZDdlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5oCkBAIC0wLDAgKzEsOTYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJh
aXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVNYXBfaAorI2Rl
ZmluZSBDb29raWVNYXBfaAorCisjaW5jbHVkZSAiSGFzaE1hcC5oIgorI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVmVjdG9yLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvU3Ry
aW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBhcnNlZENvb2tpZTsK
KworLyogQSBjb29raWUgbWFwIGlzIGEgbm9kZSBpbiB0aGUgdHJlZSBoZWxkIGJ5IENvb2tpZU1h
bmFnZXIgdGhhdCByZXByZXNlbnRzCisgKiBjb29raWVzIHRoYXQgbWF0Y2hlcyBhIGNvbW1vbiBk
b21haW4uCisgKgorICogQSBDb29raWVNYXAgaG9sZHMgcmVmZXJlbmNlIHRvIHRoZSBjb29raWVz
IHRoYXQgaXQgY29udGFpbnMgYW5kIHRoZSBjaGlsZAorICogZG9tYWlucyB0aGF0IGV4aXN0IHdp
dGhpbiB0aGUgdHJlZS4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGNvb2tpZSBwZXIgaG9zdCBpcyBs
aW1pdGVkIGJ5IENvb2tpZU1hbmFnZXI6OnNfbWF4Q29va2llQ291bnRQZXJIb3N0CisgKi8KKwor
Y2xhc3MgQ29va2llTWFwIHsKKworcHVibGljOgorICAgIENvb2tpZU1hcChjb25zdCBTdHJpbmcm
IG5hbWUgPSAiIik7CisgICAgfkNvb2tpZU1hcCgpOworCisgICAgdW5zaWduZWQgaW50IGNvdW50
KCkgY29uc3QgeyByZXR1cm4gbV9jb29raWVNYXAuc2l6ZSgpOyB9CisgICAgY29uc3QgU3RyaW5n
JiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisKKyAgICB2b2lkIGFkZENvb2tp
ZShQYXJzZWRDb29raWUqKTsKKworICAgIC8vIFJldHVybmluZyB0aGUgb3JpZ2luYWwgY29va2ll
IG9iamVjdCBzbyBtYW5hZ2VyIGNhbiBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVzIGlu
IHRoZSBkYXRhYmFzZSBxdWV1ZS4KKyAgICBQYXJzZWRDb29raWUqIHVwZGF0ZUNvb2tpZShQYXJz
ZWRDb29raWUqKTsKKworICAgIC8vIE5lZWQgdG8gcmV0dXJuIHRoZSByZWZlcmVuY2UgdG8gdGhl
IHJlbW92ZWQgY29va2llIHNvIG1hbmFnZXIgY2FuIGRlYWwgd2l0aCBpdCAoZ2FyYmFnZSBjb2xs
ZWN0KS4KKyAgICBQYXJzZWRDb29raWUqIHJlbW92ZUNvb2tpZShjb25zdCBQYXJzZWRDb29raWUq
KTsKKyAgICBib29sIGV4aXN0c0Nvb2tpZShjb25zdCBQYXJzZWRDb29raWUqKSBjb25zdDsKKwor
ICAgIC8vIFJldHVybnMgYSBtYXAgd2l0aCB0aGF0IGdpdmVuIHN1YmRvbWFpbi4KKyAgICBDb29r
aWVNYXAqIGdldFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGFkZFN1YmRv
bWFpbk1hcChjb25zdCBTdHJpbmcmLCBDb29raWVNYXAqKTsKKyAgICB2b2lkIGRlbGV0ZUFsbENv
b2tpZXNBbmREb21haW5zKCk7CisKKyAgICB2b2lkIGdldEFsbENvb2tpZXMoVmVjdG9yPFBhcnNl
ZENvb2tpZSo+Kik7CisgICAgdm9pZCBnZXRBbGxDaGlsZENvb2tpZXMoVmVjdG9yPFBhcnNlZENv
b2tpZSo+KiBzdGFja09mQ29va2llcyk7CisgICAgUGFyc2VkQ29va2llKiByZW1vdmVPbGRlc3RD
b29raWUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZU9sZGVzdENvb2tpZSgpOworCisg
ICAgLy8gVGhlIGtleSBpcyB0aGUgdHVwbGUgKG5hbWUsIHBhdGgpLgorICAgIC8vIFRoZSBzcGVj
IGFza3MgdG8gaGF2ZSBhbHNvIGRvbWFpbiwgd2hpY2ggaXMgaW1wbGllZCBieSBjaG9vc2luZyB0
aGUgQ29va2llTWFwIHJlbGV2YW50IHRvIHRoZSBkb21haW4uCisgICAgSGFzaE1hcDxTdHJpbmcs
IFBhcnNlZENvb2tpZSo+IG1fY29va2llTWFwOworCisgICAgLy8gVGhlIGtleSBpcyBhIHN1YnNl
Y3Rpb24gb2YgdGhlIGRvbWFpbi4KKyAgICAvLyBleDogaWYgaW5zZXJ0aW5nIGFjY291bnRzLmdv
b2dsZS5jb20gJiB0aGlzIGNvb2tpZW1hcCBpcyAiY29tIiwgdGhpcyBzdWJkb21haW4gbWFwIHdp
bGwgY29udGFpbiAiZ29vZ2xlIgorICAgIC8vIHRoZSAiZ29vZ2xlIiBjb29raWVtYXAgd2lsbCBj
b250YWluICJhY2NvdW50cyIgaW4gaXRzIHN1YmRvbWFpbiBtYXAuCisgICAgSGFzaE1hcDxTdHJp
bmcsIENvb2tpZU1hcCo+IG1fc3ViZG9tYWluczsKKworICAgIC8vIFN0b3JlIHRoZSBvbGRlc3Qg
Y29va2llIHRvIHNwZWVkIHVwIExSVSBjaGVja3MuCisgICAgUGFyc2VkQ29va2llKiBtX29sZGVz
dENvb2tpZTsKKyAgICBjb25zdCBTdHJpbmcgbV9uYW1lOworCisgICAgLy8gRklYTUUgOiBzaG91
bGQgaGF2ZSBhIG1fc2hvdWxkVXBkYXRlIGZsYWcgdG8gdXBkYXRlIHRoZSBuZXR3b3JrIGxheWVy
IG9ubHkgd2hlbiB0aGUgbWFwIGhhcyBjaGFuZ2VkLgorfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gQ29va2llTWFwX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yZGE3Yjc4NWFm
NWQ4ZTVhYjNiNmQ0MmVlY2NhY2VmODE4ZWIwZDhmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuY3BwCkBAIC0wLDAgKzEs
Mzk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFm
ZnJhaXhAcGxleW8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2Vh
cmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8gCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJDb29raWVQYXJzZXIuaCIKKworI2luY2x1ZGUgIkN1cnJlbnRUaW1l
LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0
aWMgaW5saW5lIGJvb2wgaXNDb29raWVIZWFkZXJTZXBhcmF0b3IoVUNoYXIgYykKK3sKKyAgICBy
ZXR1cm4gKGMgPT0gJ1xyJyB8fCBjID09J1xuJyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBp
c0xpZ2h0d2VpZ2h0U3BhY2UoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gKGMgPT0gJyAnIHx8IGMg
PT0gJ1x0Jyk7Cit9CisKK0Nvb2tpZVBhcnNlcjo6Q29va2llUGFyc2VyKGNvbnN0IEtVUkwmIGRl
ZmF1bHRDb29raWVVUkwpCisgICAgOiBtX2RlZmF1bHRDb29raWVVUkwoZGVmYXVsdENvb2tpZVVS
TCkKK3sKK30KKworQ29va2llUGFyc2VyOjp+Q29va2llUGFyc2VyKCkKK3sKK30KKworVmVjdG9y
PFBhcnNlZENvb2tpZSo+IENvb2tpZVBhcnNlcjo6cGFyc2UoY29uc3QgU3RyaW5nJiBjb29raWVz
KQoreworICAgIHVuc2lnbmVkIGNvb2tpZVN0YXJ0LCBjb29raWVFbmQgPSAwOworICAgIGRvdWJs
ZSBjdXJUaW1lID0gY3VycmVudFRpbWUoKTsKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKiwgND4g
cGFyc2VkQ29va2llczsKKworICAgIHVuc2lnbmVkIGNvb2tpZXNMZW5ndGggPSBjb29raWVzLmxl
bmd0aCgpOworICAgIGlmICghY29va2llc0xlbmd0aCkgLy8gQ29kZSBiZWxvdyBkb2Vzbid0IGhh
bmRsZSB0aGlzIGNhc2UKKyAgICAgICAgcmV0dXJuIHBhcnNlZENvb2tpZXM7CisKKyAgICAvLyBJ
dGVyYXRlIG92ZXIgdGhlIGhlYWRlciB0byBwYXJzZSBhbGwgdGhlIGNvb2tpZXMuCisgICAgd2hp
bGUgKGNvb2tpZUVuZCA8PSBjb29raWVzTGVuZ3RoKSB7CisgICAgICAgIGNvb2tpZVN0YXJ0ID0g
Y29va2llRW5kOworICAgICAgICAKKyAgICAgICAgLy8gRmluZCBhIGNvb2tpZSBzZXBhcmF0b3Iu
CisgICAgICAgIHdoaWxlIChjb29raWVFbmQgPD0gY29va2llc0xlbmd0aCAmJiAhaXNDb29raWVI
ZWFkZXJTZXBhcmF0b3IoY29va2llc1tjb29raWVFbmRdKSkKKyAgICAgICAgICAgIGNvb2tpZUVu
ZCsrOworCisgICAgICAgIC8vIERldGVjdCBhbiBlbXB0eSBjb29raWUgYW5kIGdvIHRvIHRoZSBu
ZXh0IG9uZS4KKyAgICAgICAgaWYgKGNvb2tpZVN0YXJ0ID09IGNvb2tpZUVuZCkgeworICAgICAg
ICAgICAgKytjb29raWVFbmQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmIChjb29raWVFbmQgPCBjb29raWVzTGVuZ3RoICYmIGlzQ29va2llSGVhZGVyU2Vw
YXJhdG9yKGNvb2tpZXNbY29va2llRW5kXSkpCisgICAgICAgICAgICArK2Nvb2tpZUVuZDsKKwor
ICAgICAgICBQYXJzZWRDb29raWUqIGNvb2tpZSA9IHBhcnNlT25lQ29va2llKGNvb2tpZXMsIGNv
b2tpZVN0YXJ0LCBjb29raWVFbmQgLSAxLCBjdXJUaW1lKTsKKyAgICAgICAgaWYgKGNvb2tpZSkK
KyAgICAgICAgICAgIHBhcnNlZENvb2tpZXMuYXBwZW5kKGNvb2tpZSk7CisgICAgfQorICAgIHJl
dHVybiBwYXJzZWRDb29raWVzOworfQorCisvLyBQYXJzZSB0aGUgc3RyaW5nIHdpdGhvdXQgIlNl
dC1Db29raWUiIGFjY29yZGluZyB0byBGaXJlZm94IGdyYW1tYXIgKGxvb3NlbHkgUkZDIDIxMDkg
Y29tcGxpYW50KQorLy8gc2VlIG5ldHdlcmsvY29va2llL3NyYy9uc0Nvb2tpZVNlcnZpY2UuY3Bw
IGNvbW1lbnQgZm9yIGl0CitQYXJzZWRDb29raWUqIENvb2tpZVBhcnNlcjo6cGFyc2VPbmVDb29r
aWUoY29uc3QgU3RyaW5nJiBjb29raWUsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQsIGRv
dWJsZSBjdXJUaW1lKQoreworICAgIFBhcnNlZENvb2tpZSogcmVzID0gbmV3IFBhcnNlZENvb2tp
ZShjdXJUaW1lKTsKKworICAgIGlmICghcmVzKSB7CisgICAgICAgIExPR19FUlJPUigiT3V0IG9m
IG1lbW9yeSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IHBy
b3RvY29sCisgICAgcmVzLT5zZXRQcm90b2NvbChtX2RlZmF1bHRDb29raWVVUkwucHJvdG9jb2wo
KSk7CisKKyAgICAvLyBQYXJzZSBbTkFNRSAiPSJdIFZBTFVFCisKKyAgICB1bnNpZ25lZCB0b2tl
bkVuZCA9IHN0YXJ0OyAvLyBUb2tlbiBlbmQgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZSAn
PScgb3IgdGhlIGVuZCBvZiBhIHRva2VuCisgICAgdW5zaWduZWQgcGFpckVuZCA9IHN0YXJ0OyAv
LyBQYWlyIGVuZCBjb250YWlucyBhbHdheXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnOycKKworICAg
IC8vIGZpbmQgdGhlICpmaXJzdCogJzsnIGFuZCB0aGUgJz0nIChpZiB0aGV5IGV4aXN0KQorICAg
IGJvb2wgcXVvdGVGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgZm91bmRFcXVhbCA9IGZhbHNlOwor
ICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kICYmIChjb29raWVbcGFpckVuZF0gIT0gJzsnIHx8IHF1
b3RlRm91bmQpKSB7CisgICAgICAgIGlmICh0b2tlbkVuZCA9PSBzdGFydCAmJiBjb29raWVbcGFp
ckVuZF0gPT0gJz0nKSB7CisgICAgICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgICAg
ICAgICBmb3VuZEVxdWFsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llW3Bh
aXJFbmRdID09ICciJykKKyAgICAgICAgICAgIHF1b3RlRm91bmQgPSAhcXVvdGVGb3VuZDsKKyAg
ICAgICAgcGFpckVuZCsrOworICAgIH0KKworICAgIHVuc2lnbmVkIHRva2VuU3RhcnQgPSBzdGFy
dDsKKworICAgIGJvb2wgaGFzTmFtZSA9IGZhbHNlOyAvLyBUaGlzIGlzIGEgaGFjayB0byBhdm9p
ZCBjaGFuZ2luZyB0b28gbXVjaCBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IGJydXRhbGx5IGJyaXR0bGUgY29kZS4KKyAgICBpZiAodG9rZW5FbmQgIT0gc3RhcnQpIHsKKyAg
ICAgICAgLy8gVGhlcmUgaXMgYSAnPScgc28gcGFyc2UgdGhlIE5BTUUKKyAgICAgICAgdW5zaWdu
ZWQgbmFtZUVuZCA9IHRva2VuRW5kOworCisgICAgICAgIC8vIFRoZSB0b2tlbkVuZCBpcyB0aGUg
cG9zaXRpb24gb2YgdGhlICc9JyBzbyB0aGUgbmFtZUVuZCBpcyBvbmUgbGVzcworICAgICAgICBu
YW1lRW5kLS07CisKKyAgICAgICAgLy8gUmVtb3ZlIGxpZ2h0d2VpZ2h0IHNwYWNlcy4KKyAgICAg
ICAgd2hpbGUgKG5hbWVFbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVtuYW1lRW5kXSkp
CisgICAgICAgICAgICBuYW1lRW5kLS07CisKKyAgICAgICAgd2hpbGUgKHRva2VuU3RhcnQgPCBu
YW1lRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAgICAg
ICAgICAgdG9rZW5TdGFydCsrOworCisgICAgICAgIGlmIChuYW1lRW5kICsgMSA8PSB0b2tlblN0
YXJ0KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkVtcHR5IG5hbWUuIFJlamVjdGluZyB0aGUg
Y29va2llIik7CisgICAgICAgICAgICBkZWxldGUgcmVzOworICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbmFtZSA9IGNvb2tpZS5zdWJzdHJpbmcodG9r
ZW5TdGFydCwgbmFtZUVuZCArIDEgLSBzdGFydCk7CisgICAgICAgIHJlcy0+c2V0TmFtZShuYW1l
KTsKKyAgICAgICAgaGFzTmFtZSA9IHRydWU7CisgICAgfQorCisgICAgLy8gTm93IHBhcnNlIHRo
ZSBWQUxVRQorICAgIHRva2VuU3RhcnQgPSB0b2tlbkVuZCArIDE7CisgICAgaWYgKCFoYXNOYW1l
KQorICAgICAgICAtLXRva2VuU3RhcnQ7CisKKyAgICAvLyBTa2lwIGxpZ2h0d2VpZ2h0IHNwYWNl
cyBpbiBvdXIgdG9rZW4KKyAgICB3aGlsZSAodG9rZW5TdGFydCA8IHBhaXJFbmQgJiYgaXNMaWdo
dHdlaWdodFNwYWNlKGNvb2tpZVt0b2tlblN0YXJ0XSkpCisgICAgICAgIHRva2VuU3RhcnQrKzsK
KworICAgIHRva2VuRW5kID0gcGFpckVuZDsKKyAgICB3aGlsZSAodG9rZW5FbmQgPiB0b2tlblN0
YXJ0ICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5FbmQgLSAxXSkpCisgICAgICAg
IHRva2VuRW5kLS07CisKKyAgICBTdHJpbmcgdmFsdWU7CisgICAgaWYgKHRva2VuRW5kID09IHRv
a2VuU3RhcnQpIHsKKyAgICAgICAgLy8gRmlyZWZveCBhY2NlcHRzIGVtcHR5IHZhbHVlIHNvIHdl
IHdpbGwgZG8gdGhlIHNhbWUKKyAgICAgICAgdmFsdWUgPSBTdHJpbmcoKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgdmFsdWUgPSBjb29raWUuc3Vic3RyaW5nKHRva2VuU3RhcnQsIHRva2VuRW5kIC0g
dG9rZW5TdGFydCk7CisKKyAgICBpZiAoaGFzTmFtZSkKKyAgICAgICAgcmVzLT5zZXRWYWx1ZSh2
YWx1ZSk7CisgICAgZWxzZSBpZiAoZm91bmRFcXVhbCkgeworICAgICAgICBkZWxldGUgcmVzOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgcmVzLT5zZXROYW1lKHZhbHVl
KTsgLy8gTm8gTkFNRT1WQUxVRSwgb25seSBOQU1FCisKKyAgICB3aGlsZSAocGFpckVuZCA8IGVu
ZCkgeworICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIG5leHQgcGFpciBhcyBwYWlyRW5kIGlzIG9u
IHRoZSAnOycgYW5kIGZhc3QtZm9yd2FyZCBhbnkgbGlnaHR3ZWlnaHQgc3BhY2VzLgorICAgICAg
ICBwYWlyRW5kKys7CisgICAgICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kICYmIGlzTGlnaHR3ZWln
aHRTcGFjZShjb29raWVbcGFpckVuZF0pKQorICAgICAgICAgICAgcGFpckVuZCsrOworCisgICAg
ICAgIHRva2VuU3RhcnQgPSBwYWlyRW5kOworICAgICAgICB0b2tlbkVuZCA9IHRva2VuU3RhcnQ7
IC8vIGluaXRpYWxpemUgdG9rZW4gZW5kIHRvIGNhdGNoIGZpcnN0ICc9JworCisgICAgICAgIHdo
aWxlIChwYWlyRW5kIDwgZW5kICYmIGNvb2tpZVtwYWlyRW5kXSAhPSAnOycpIHsKKyAgICAgICAg
ICAgIGlmICh0b2tlbkVuZCA9PSB0b2tlblN0YXJ0ICYmIGNvb2tpZVtwYWlyRW5kXSA9PSAnPScp
CisgICAgICAgICAgICAgICAgdG9rZW5FbmQgPSBwYWlyRW5kOworICAgICAgICAgICAgcGFpckVu
ZCsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUUgOiBzaG91bGQgd2Ugc2tpcCBsaWdo
dHdlaWdodCBzcGFjZXMgaGVyZSA/CisKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdG9rZW5F
bmQgLSB0b2tlblN0YXJ0OworICAgICAgICB1bnNpZ25lZCB0b2tlblN0YXJ0U3ZnID0gdG9rZW5T
dGFydDsKKworICAgICAgICBTdHJpbmcgcGFyc2VkVmFsdWU7CisgICAgICAgIGlmICh0b2tlblN0
YXJ0ICE9IHRva2VuRW5kKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbiBlcXVhbCBzaWdu
IHNvIHJlbW92ZSBsaWdodHdlaWdodCBzcGFjZXMgaW4gVkFMVUUKKyAgICAgICAgICAgIHRva2Vu
U3RhcnQgPSB0b2tlbkVuZCArIDE7CisgICAgICAgICAgICB3aGlsZSAodG9rZW5TdGFydCA8IHBh
aXJFbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVt0b2tlblN0YXJ0XSkpCisgICAgICAg
ICAgICAgICAgdG9rZW5TdGFydCsrOworCisgICAgICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7
CisgICAgICAgICAgICB3aGlsZSAodG9rZW5FbmQgPiB0b2tlblN0YXJ0ICYmIGlzTGlnaHR3ZWln
aHRTcGFjZShjb29raWVbdG9rZW5FbmQgLSAxXSkpCisgICAgICAgICAgICAgICAgdG9rZW5FbmQt
LTsKKworICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBjb29raWUuc3Vic3RyaW5nKHRva2VuU3Rh
cnQsIHRva2VuRW5kIC0gdG9rZW5TdGFydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAvLyBJZiB0aGUgcGFyc2VkVmFsdWUgaXMgZW1wdHksIGluaXRpYWxpc2UgaXQgaW4gY2FzZSB3
ZSBuZWVkIGl0CisgICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IFN0cmluZygpOworICAgICAgICAg
ICAgLy8gSGFuZGxlIGEgdG9rZW4gd2l0aG91dCB2YWx1ZS4KKyAgICAgICAgICAgIGxlbmd0aCA9
IHBhaXJFbmQgLSB0b2tlblN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAvLyBEZXRlY3Qgd2hp
Y2ggImNvb2tpZS1hdiIgaXMgcGFyc2VkCisgICAgICAgLy8gTG9vayBhdCB0aGUgZmlyc3QgY2hh
ciB0aGVuIHBhcnNlIHRoZSB3aG9sZSBmb3IgcGVyZm9ybWFuY2UgaXNzdWUKKyAgICAgICAgc3dp
dGNoIChjb29raWVbdG9rZW5TdGFydFN2Z10pIHsKKyAgICAgICAgY2FzZSAnUCc6CisgICAgICAg
IGNhc2UgJ3AnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA0ICYmIGNvb2tpZS5maW5k
KCJhdGgiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgLy8g
V2UgbmVlZCB0aGUgcGF0aCB0byBiZSBkZWNvZGVkIHRvIG1hdGNoIHRob3NlIHJldHVybmVkIGZy
b20gS1VSTDo6cGF0aCgpLgorICAgICAgICAgICAgICAgIC8vIFRoZSBwYXRoIGF0dHJpYnV0ZSBt
YXkgb3IgbWF5IG5vdCBpbmNsdWRlIHBlcmNlbnQtZW5jb2RlZCBjaGFyYWN0ZXJzLiBGb3J0dW5h
dGVseQorICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwZXJjZW50LWVuY29kZWQg
Y2hhcmFjdGVycywgZGVjb2RpbmcgdGhlIHVybCBpcyBhIG5vLW9wLgorICAgICAgICAgICAgICAg
IHJlcy0+c2V0UGF0aChkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXMocGFyc2VkVmFsdWUpKTsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNv
b2tpZSAlcyAocGF0aCkiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAg
IGRlbGV0ZSByZXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ0QnOgorICAgICAg
ICBjYXNlICdkJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNiAmJiBjb29raWUuZmlu
ZCgib21haW4iLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAg
aWYgKHBhcnNlZFZhbHVlLmxlbmd0aCgpID4gMSAmJiBwYXJzZWRWYWx1ZVswXSA9PSAnIicgJiYg
cGFyc2VkVmFsdWVbcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAxXSA9PSAnIicpCisgICAgICAgICAg
ICAgICAgICAgIHBhcnNlZFZhbHVlID0gcGFyc2VkVmFsdWUuc3Vic3RyaW5nKDEsIHBhcnNlZFZh
bHVlLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRvbWFpbiBkb2Vz
IG5vdCBzdGFydCB3aXRoIGEgZG90LCBhZGQgb25lIGZvciBzZWN1cml0eSBjaGVja3MsCisgICAg
ICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGFiLmMuY29tIGRvc2Ugbm90IGRvbWFpbiBtYXRj
aCBiLmMuY29tOworICAgICAgICAgICAgICAgIFN0cmluZyByZWFsRG9tYWluID0gcGFyc2VkVmFs
dWVbMF0gPT0gJy4nID8gcGFyc2VkVmFsdWUgOiAiLiIgKyBwYXJzZWRWYWx1ZTsKKyAgICAgICAg
ICAgICAgICByZXMtPnNldERvbWFpbihyZWFsRG9tYWluKTsKKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSAlcyAoZG9tYWluKSIs
IGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnRScgOgorICAgICAgICBjYXNlICdlJyA6IHsK
KyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgieHBpcmVzIiwgdG9r
ZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICByZXMtPnNldEV4cGlyeShw
YXJzZWRWYWx1ZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJS
T1IoIkludmFsaWQgY29va2llICVzIChleHBpcmVzKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7
CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
Y2FzZSAnTScgOgorICAgICAgICBjYXNlICdtJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGgg
Pj0gNyAmJiBjb29raWUuZmluZCgiYXgtYWdlIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkK
KyAgICAgICAgICAgICAgICByZXMtPnNldE1heEFnZShwYXJzZWRWYWx1ZSk7CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzICht
YXgtYWdlKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRl
IHJlczsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnQycgOgorICAgICAgICBjYXNl
ICdjJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgib21t
ZW50IiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAvLyBXZSBk
byBub3QgaGF2ZSByb29tIGZvciB0aGUgY29tbWVudCBwYXJ0IChhbmQgc28gZG8gTW96aWxsYSkg
c28ganVzdCBsb2cgdGhlIGNvbW1lbnQuCisgICAgICAgICAgICAgICAgTE9HKE5ldHdvcmssICJD
b21tZW50ICVzIGZvciBQYXJzZWRDb29raWUgOiAlc1xuIiwgcGFyc2VkVmFsdWUuYXNjaWkoKS5k
YXRhKCksIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzIChjb21tZW50KSIsIGNvb2tp
ZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisKKyAgICAgICAgY2FzZSAnVicgOgorICAgICAgICBjYXNlICd2JyA6IHsKKyAgICAg
ICAgICAgIGlmIChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgiZXJzaW9uIiwgdG9rZW5TdGFy
dFN2ZyArIDEsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHRoZSBvdXQt
b2YtZGF0ZWQgQ29va2llIFNwZWMoUkZDMjk2NSwgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwv
cmZjMjk2NSkgZGVmaW5lZAorICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBvZiB2ZXJzaW9u
IGNhbiBvbmx5IGNvbnRhaW4gRElHSVQsIHNvbWUgcmFuZG9tIHNpdGVzLCBlLmcuIGh0dHBzOi8v
ZGV2Zm9ydW1zLmFwcGxlLmNvbQorICAgICAgICAgICAgICAgIC8vIHdvdWxkIHVzZSBkb3VibGUg
cXVvdGF0aW9uIG1hcmtzIHRvIHF1b3RlIHRoZSBkaWdpdC4gU28gd2UgbmVlZCB0byBnZXQgcmlk
IG9mIHRoZW0gZm9yIGNvbXBsaWFuY2UuCisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFZhbHVl
Lmxlbmd0aCgpID4gMSAmJiBwYXJzZWRWYWx1ZVswXSA9PSAnIicgJiYgcGFyc2VkVmFsdWVbcGFy
c2VkVmFsdWUubGVuZ3RoKCkgLSAxXSA9PSAnIicpCisgICAgICAgICAgICAgICAgICAgIHBhcnNl
ZFZhbHVlID0gcGFyc2VkVmFsdWUuc3Vic3RyaW5nKDEsIHBhcnNlZFZhbHVlLmxlbmd0aCgpIC0g
Mik7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkVmFsdWUudG9JbnQoKSAhPSAxKSB7Cisg
ICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiUGFyc2VkQ29va2llIHZlcnNpb24gJWQgbm90
IHN1cHBvcnRlZCAob25seSBzdXBwb3J0IHZlcnNpb249MSkiLCBwYXJzZWRWYWx1ZS50b0ludCgp
KTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llICVzICh2ZXJzaW9uKSIsIGNvb2tp
ZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisKKyAgICAgICAgY2FzZSAnUycgOgorICAgICAgICBjYXNlICdzJyA6IHsKKyAgICAg
ICAgICAgIC8vIFNlY3VyZSBpcyBhIHN0YW5kYWxvbmUgdG9rZW4gKCJTZWN1cmU7IikKKyAgICAg
ICAgICAgIGlmIChsZW5ndGggPj0gNiAmJiBjb29raWUuZmluZCgiZWN1cmUiLCB0b2tlblN0YXJ0
U3ZnICsgMSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0U2VjdXJlRmxhZyh0cnVl
KTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxp
ZCBjb29raWUgJXMgKHNlY3VyZSkiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAg
ICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICdIJzoKKyAg
ICAgICAgY2FzZSAnaCc6IHsKKyAgICAgICAgICAgIC8vIEh0dHBPbmx5IGlzIGEgc3RhbmRhbG9u
ZSB0b2tlbiAoIkh0dHBPbmx5OyIpCisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDggJiYgY29v
a2llLmZpbmQoInR0cE9ubHkiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAgICAg
ICAgICAgIHJlcy0+c2V0SXNIdHRwT25seSh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgeworICAg
ICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUgJXMgKEh0dHBPbmx5KSIsIGNv
b2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgIC8vIElmIGxlbmd0
aCA9PSAwLCB3ZSBzaG91bGQgYmUgYXQgdGhlIGVuZCBvZiB0aGUgY29va2llIChjYXNlIDogIjtc
ciIpIHNvIGlnbm9yZSBpdAorICAgICAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgICAg
ICBMT0dfRVJST1IoIkludmFsaWQgdG9rZW4gZm9yIGNvb2tpZSAlcyIsIGNvb2tpZS5hc2NpaSgp
LmRhdGEoKSk7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlm
IHRoZSBjb29raWUgaXMgdmFsaWQgd2l0aCByZXNwZWN0IHRvIHRoZSBzaXplIGxpbWl0LworICAg
IGlmICghcmVzLT5pc1VuZGVyU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJQYXJz
ZWRDb29raWUgJXMgaXMgYWJvdmUgdGhlIDRrYiBpbiBsZW5ndGggOiBSRUpFQ1RFRCIsIGNvb2tp
ZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKworICAgIC8vIElmIHNvbWUgcGFpciB3YXMgbm90IHByb3ZpZGVkLCBkdXJpbmcg
cGFyc2luZyB0aGVuIGFwcGx5IHNvbWUgZGVmYXVsdCB2YWx1ZQorICAgIC8vIHRoZSByZXN0IGhh
cyBiZWVuIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLgorCisgICAgLy8gSWYgbm8gZG9tYWluIHdh
cyBwcm92aWRlZCwgc2V0IGl0IHRvIHRoZSBob3N0CisgICAgaWYgKCFyZXMtPmRvbWFpbigpKQor
ICAgICAgICByZXMtPnNldERlZmF1bHREb21haW4obV9kZWZhdWx0Q29va2llVVJMKTsKKworICAg
IC8vIEFjY29yZGluZyB0byB0aGUgQ29va2llIFNwZWNpZmljYWl0b24gKFJGQzYyNjUsIHNlY3Rp
b24gNC4xLjIuNCBhbmQgNS4yLjQsIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUp
LAorICAgIC8vIElmIG5vIHBhdGggd2FzIHByb3ZpZGVkIG9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIg
b2YgdGhlIHBhdGggdmFsdWUgaXMgbm90ICcvJywgc2V0IGl0IHRvIHRoZSBob3N0J3MgcGF0aAor
ICAgIC8vCisgICAgLy8gUkVGRVJFTkNFCisgICAgLy8gNC4xLjIuNC4gVGhlIFBhdGggQXR0cmli
dXRlCisgICAgLy8KKyAgICAvLyBUaGUgc2NvcGUgb2YgZWFjaCBjb29raWUgaXMgbGltaXRlZCB0
byBhIHNldCBvZiBwYXRocywgY29udHJvbGxlZCBieQorICAgIC8vIHRoZSBQYXRoIGF0dHJpYnV0
ZS4gSWYgdGhlIHNlcnZlciBvbWl0cyB0aGUgUGF0aCBhdHRyaWJ1dGUsIHRoZSB1c2VyCisgICAg
Ly8gYWdlbnQgd2lsbCB1c2UgdGhlICJkaXJlY3RvcnkiIG9mIHRoZSByZXF1ZXN0LXVyaSdzIHBh
dGggY29tcG9uZW50IGFzCisgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWUuIChTZWUgU2VjdGlvbiA1
LjEuNCBmb3IgbW9yZSBkZXRhaWxzLikKKyAgICAvLyAuLi4uLi4uLi4uLgorICAgIC8vIDUuMi40
LiBUaGUgUGF0aCBBdHRyaWJ1dGUKKyAgICAvLworICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFt
ZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nICJQYXRoIiwKKyAgICAvLyB0
aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLgorICAg
IC8vCisgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBlbXB0eSBvciBpZiB0aGUgZmly
c3QgY2hhcmFjdGVyIG9mIHRoZQorICAgIC8vIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgJXgyRiAo
Ii8iKToKKyAgICAvLworICAgIC8vIExldCBjb29raWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRo
LgorICAgIC8vCisgICAgLy8gT3RoZXJ3aXNlOgorICAgIC8vCisgICAgLy8gTGV0IGNvb2tpZS1w
YXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuCisgICAgLy8KKyAgICAvLyBBcHBlbmQgYW4gYXR0
cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtCisg
ICAgLy8gbmFtZSBvZiBQYXRoIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLXBhdGgu
CisgICAgaWYgKCFyZXMtPnBhdGgoKSB8fCAhcmVzLT5wYXRoKCkubGVuZ3RoKCkgfHwgIXJlcy0+
cGF0aCgpLnN0YXJ0c1dpdGgoIi8iLCBmYWxzZSkpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBt
X2RlZmF1bHRDb29raWVVUkwuc3RyaW5nKCkuc3Vic3RyaW5nKG1fZGVmYXVsdENvb2tpZVVSTC5w
YXRoU3RhcnQoKSwgbV9kZWZhdWx0Q29va2llVVJMLnBhdGhBZnRlckxhc3RTbGFzaCgpIC0gbV9k
ZWZhdWx0Q29va2llVVJMLnBhdGhTdGFydCgpIC0gMSk7CisgICAgICAgIGlmIChwYXRoLmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMg
cmVhZGluZyB0aGUgcmF3IHVybCBzdHJpbmcsIGl0IGNvdWxkIGNvbnRhaW4gcGVyY2VudC1lbmNv
ZGVkIHNlcXVlbmNlcy4gV2UKKyAgICAgICAgLy8gd2FudCBpdCB0byBiZSBjb21wYXJhYmxlIHRv
IHRoZSByZXR1cm4gdmFsdWUgb2YgdXJsLnBhdGgoKSwgd2hpY2ggaXMgbm90IHBlcmNlbnQtZW5j
b2RlZCwKKyAgICAgICAgLy8gc28gd2UgbXVzdCByZW1vdmUgdGhlIGVzY2FwZSBzZXF1ZW5jZXMu
CisgICAgICAgIHJlcy0+c2V0UGF0aChkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXMocGF0aCkpOwor
ICAgIH0KKyAKKyAgICByZXR1cm4gcmVzOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNl
ci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi45MmU0OGQzNmViMjY1NjA2YzdkMjFmODQ0YjI0ZGFiZTFjZjk2ODIyCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQ
YXJzZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGll
biBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxleW8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEw
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBDb29raWVQYXJzZXJfaAorI2RlZmluZSBDb29raWVQYXJzZXJfaAorCisjaW5jbHVkZSAi
S1VSTC5oIgorI2luY2x1ZGUgIlZlY3Rvci5oIgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0
cmluZzsKK30KK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2VkQ29va2llOworCitj
bGFzcyBDb29raWVQYXJzZXIgeworcHVibGljOgorICAgIENvb2tpZVBhcnNlcihjb25zdCBLVVJM
JiBkZWZhdWx0Q29va2llVVJMKTsKKyAgICB+Q29va2llUGFyc2VyKCk7CisKKyAgICAvLyBQYXJz
ZXMgYSBzZXF1ZW5jZSBvZiAiQ29va2llOiIgaGVhZGVyIGFuZCByZXR1cm4gdGhlIHBhcnNlZCBj
b29raWVzLgorICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiBwYXJzZShjb25zdCBTdHJpbmcmIGNv
b2tpZXMpOworCitwcml2YXRlOgorICAgIC8vIEZJWE1FOiBjdXJUaW1lLCBzdGFydCwgZW5kIHBh
cmFtZXRlcnMgc2hvdWxkIGJlIHJlbW92ZWQuIEFuZCB0aGlzIG1ldGhvZCBjYW4gYmUgcHVibGlj
LgorICAgIFBhcnNlZENvb2tpZSogcGFyc2VPbmVDb29raWUoY29uc3QgU3RyaW5nJiBjb29raWUs
IHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQsIGRvdWJsZSBjdXJUaW1lKTsKKworICAgIEtV
UkwgbV9kZWZhdWx0Q29va2llVVJMOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gQ29va2llUGFyc2VyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2JsYWNrYmVycnkvUGFyc2VkQ29va2llLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvUGFyc2VkQ29va2llLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xZmY3ZmU2MDBhZTdlN2Q4
M2IwOGQ4YTk5NTE2Y2RjMTAxMmJmODM0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwCkBAIC0wLDAgKzEsMTkwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGp1bGll
bi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2Vh
cmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5oIgorCisjaW5jbHVkZSAiQ29va2llTWFuYWdl
ci5oIgorI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1
ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK1BhcnNlZENvb2tpZTo6UGFyc2VkQ29va2llKGRvdWJsZSBjdXJy
ZW50VGltZSkKKyAgICA6IG1fZXhwaXJ5KDApCisgICAgLCBtX2NyZWF0aW9uVGltZShjdXJyZW50
VGltZSkKKyAgICAsIG1fbGFzdEFjY2Vzc2VkKGN1cnJlbnRUaW1lKQorICAgICwgbV9pc01heEFn
ZVNldChmYWxzZSkKKyAgICAsIG1faGFzRGVmYXVsdERvbWFpbihmYWxzZSkKKyAgICAsIG1faXNT
ZWN1cmUoZmFsc2UpCisgICAgLCBtX2lzSHR0cE9ubHkoZmFsc2UpCisgICAgLCBtX2lzU2Vzc2lv
bih0cnVlKQorICAgICwgbV9pc0ZvcmNlRXhwaXJlZChmYWxzZSkKK3sKK30KKworUGFyc2VkQ29v
a2llOjpQYXJzZWRDb29raWUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVl
LCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwcm90b2NvbCwgY29uc3QgU3Ry
aW5nJiBwYXRoLCBkb3VibGUgZXhwaXJ5LCBkb3VibGUgbGFzdEFjY2Vzc2VkLCBkb3VibGUgY3Jl
YXRpb25UaW1lLCBib29sIGlzU2VjdXJlLCBib29sIGlzSHR0cE9ubHkpCisgICAgOiBtX25hbWUo
bmFtZSkKKyAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgLCBtX2RvbWFpbihkb21haW4pCisgICAg
LCBtX3Byb3RvY29sKHByb3RvY29sKQorICAgICwgbV9wYXRoKHBhdGgpCisgICAgLCBtX2V4cGly
eShleHBpcnkpCisgICAgLCBtX2NyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpCisgICAgLCBtX2xh
c3RBY2Nlc3NlZChsYXN0QWNjZXNzZWQpCisgICAgLCBtX2lzTWF4QWdlU2V0KGZhbHNlKQorICAg
ICwgbV9oYXNEZWZhdWx0RG9tYWluKGZhbHNlKQorICAgICwgbV9pc1NlY3VyZShpc1NlY3VyZSkK
KyAgICAsIG1faXNIdHRwT25seShpc0h0dHBPbmx5KQorICAgICwgbV9pc1Nlc3Npb24oZmFsc2Up
CisgICAgLCBtX2lzRm9yY2VFeHBpcmVkKGZhbHNlKQoreworfQorCitQYXJzZWRDb29raWU6OlBh
cnNlZENvb2tpZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKKyAgICA6IG1fbmFtZShTdHJp
bmcoY29va2llLT5tX25hbWUpKQorICAgICwgbV92YWx1ZShTdHJpbmcoY29va2llLT5tX3ZhbHVl
KSkKKyAgICAsIG1fZG9tYWluKFN0cmluZyhjb29raWUtPm1fZG9tYWluKSkKKyAgICAsIG1fcHJv
dG9jb2woU3RyaW5nKGNvb2tpZS0+bV9wcm90b2NvbCkpCisgICAgLCBtX3BhdGgoU3RyaW5nKGNv
b2tpZS0+bV9wYXRoKSkKKyAgICAsIG1fZXhwaXJ5KGNvb2tpZS0+bV9leHBpcnkpCisgICAgLCBt
X2NyZWF0aW9uVGltZShjb29raWUtPm1fY3JlYXRpb25UaW1lKQorICAgICwgbV9sYXN0QWNjZXNz
ZWQoY29va2llLT5tX2xhc3RBY2Nlc3NlZCkKKyAgICAsIG1faXNNYXhBZ2VTZXQoY29va2llLT5t
X2lzTWF4QWdlU2V0KQorICAgICwgbV9oYXNEZWZhdWx0RG9tYWluKGNvb2tpZS0+bV9oYXNEZWZh
dWx0RG9tYWluKQorICAgICwgbV9pc1NlY3VyZShjb29raWUtPm1faXNTZWN1cmUpCisgICAgLCBt
X2lzSHR0cE9ubHkoY29va2llLT5tX2lzSHR0cE9ubHkpCisgICAgLCBtX2lzU2Vzc2lvbihjb29r
aWUtPm1faXNTZXNzaW9uKQorICAgICwgbV9pc0ZvcmNlRXhwaXJlZChjb29raWUtPm1faXNGb3Jj
ZUV4cGlyZWQpCit7Cit9CisKK1BhcnNlZENvb2tpZTo6flBhcnNlZENvb2tpZSgpCit7Cit9CisK
K3ZvaWQgUGFyc2VkQ29va2llOjpzZXRFeHBpcnkoY29uc3QgU3RyaW5nJiBleHBpcnkpCit7Cisg
ICAgLy8gSWYgYSBjb29raWUgaGFzIGJvdGggdGhlIE1heC1BZ2UgYW5kIHRoZSBFeHBpcmVzIGF0
dHJpYnV0ZSwKKyAgICAvLyB0aGUgTWF4LUFnZSBhdHRyaWJ1dGUgaGFzIHByZWNlZGVuY2UgYW5k
IGNvbnRyb2xzIHRoZSBleHBpcmF0aW9uIGRhdGUgb2YgdGhlIGNvb2tpZS4KKyAgICBpZiAobV9p
c01heEFnZVNldCB8fCBleHBpcnkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X2lzU2Vzc2lvbiA9IGZhbHNlOworCisgICAgbV9leHBpcnkgPSBzdGF0aWNfY2FzdDxkb3VibGU+
KGN1cmxfZ2V0ZGF0ZShleHBpcnkudXRmOCgpLmRhdGEoKSwgMCkpOworCisgICAgaWYgKG1fZXhw
aXJ5ID09IC0xKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IHBhcnNlIGRhdGUiKTsK
KyAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBjb25zaWRlciB0aGF0IHRoZSBjb29raWUgaXMgc2Vz
c2lvbiBvbmx5CisgICAgICAgIG1faXNTZXNzaW9uID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQg
UGFyc2VkQ29va2llOjpzZXRNYXhBZ2UoY29uc3QgU3RyaW5nJiBtYXhBZ2UpCit7CisgICAgLy8g
QWNjb3JkaW5nIHRvIHRoZSBIVFRQIENvb2tpZSBzcGVjaWZpY2F0aW9uIChSRkM2MjY1LCBodHRw
Oi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1KSwKKyAgICAvLyB0aGUgZmlyc3QgY2hhcmFj
dGVyIGNhbiBiZSBhIERJR0lUIG9yIGEgIi0iLCBhbmQgdGhlIHJlbWluZGVyCisgICAgLy8gb2Yg
dGhlIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4gRElHSVQgY2hhcmFjdGVycy4KKyAgICBpZiAobWF4
QWdlLmlzRW1wdHkoKSB8fCAobWF4QWdlWzBdICE9ICctJyAmJiAhaXNBU0NJSURpZ2l0KG1heEFn
ZVswXSkpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IHBhcnNlIE1heC1BZ2UgOiAl
cywgZmlyc3QgY2hhcmFjdGVyIGNhbiBvbmx5IGJlICctJyBvciBhc2NpaSBkaWdpdC4iLCBtYXhB
Z2UuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBv
azsKKyAgICBpbnQgdmFsdWUgPSBtYXhBZ2UudG9JbnRTdHJpY3QoJm9rKTsKKworICAgIGlmICgh
b2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgcGFyc2UgTWF4LUFnZSA6ICVzIiwg
bWF4QWdlLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2V4
cGlyeSA9IHZhbHVlOworICAgIG1faXNNYXhBZ2VTZXQgPSB0cnVlOworICAgIG1faXNTZXNzaW9u
ID0gZmFsc2U7CisKKyAgICAvLyBJZiBtYXhBZ2UgdmFsdWUgaXMgbm90IHBvc2l0aXZlLCBsZXQg
ZXhwaXJ5LXRpbWUgYmUgdGhlIGVhcmxpZXN0IHJlcHJlc2VudGFibGUgdGltZS4KKyAgICBpZiAo
bV9leHBpcnkgPiAwKQorICAgICAgICBtX2V4cGlyeSArPSBjdXJyZW50VGltZSgpOworICAgIGVs
c2UKKyAgICAgICAgbV9leHBpcnkgPSAwOworfQorCit2b2lkIFBhcnNlZENvb2tpZTo6c2V0RGVm
YXVsdERvbWFpbihjb25zdCBLVVJMJiByZXF1ZXN0VVJMKQoreworICAgIHNldERvbWFpbihyZXF1
ZXN0VVJMLmhvc3QoKSk7CisgICAgbV9oYXNEZWZhdWx0RG9tYWluID0gdHJ1ZTsKK30KKworYm9v
bCBQYXJzZWRDb29raWU6Omhhc0V4cGlyZWQoKSBjb25zdAoreworICAgIC8vIFNlc3Npb24gY29v
a2llcyBkbyBub3QgZXhwaXJlLCB0aGV5IHdpbGwganVzdCBub3QgYmUgc2F2ZWQgdG8gdGhlIGJh
Y2tpbmcgc3RvcmUuCisgICAgcmV0dXJuICFtX2lzU2Vzc2lvbiAmJiAobV9pc0ZvcmNlRXhwaXJl
ZCB8fCBtX2V4cGlyeSA8IGN1cnJlbnRUaW1lKCkpOworfQorCitib29sIFBhcnNlZENvb2tpZTo6
aXNVbmRlclNpemVMaW1pdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmFsdWUubGVuZ3RoKCkg
PD0gQ29va2llTWFuYWdlcjo6bWF4Q29va2llTGVuZ3RoKCkgJiYgbV9uYW1lLmxlbmd0aCgpIDw9
IENvb2tpZU1hbmFnZXI6Om1heENvb2tpZUxlbmd0aCgpOworfQorCitTdHJpbmcgUGFyc2VkQ29v
a2llOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAg
IGJ1aWxkZXIuYXBwZW5kKG5hbWUoKSk7CisgICAgYnVpbGRlci5hcHBlbmQoIiA9ICIpOworICAg
IGJ1aWxkZXIuYXBwZW5kKHZhbHVlKCkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCI7IERvbWFpbiA9
ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKGRvbWFpbigpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgi
OyBQYXRoID0gIik7CisgICAgYnVpbGRlci5hcHBlbmQocGF0aCgpKTsKKyAgICBidWlsZGVyLmFw
cGVuZCgiOyBQcm90b2NvbCA9ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKHByb3RvY29sKCkpOwor
ICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Cit9CisKK1N0cmluZyBQYXJzZWRDb29raWU6
OnRvTmFtZVZhbHVlUGFpcigpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZyBlcXVh
bCgiPSIpOworCisgICAgc2l6ZV90IGNvb2tpZUxlbmd0aCA9IG1fbmFtZS5sZW5ndGgoKSArIG1f
dmFsdWUubGVuZ3RoKCkgKyAyOworICAgIFZlY3RvcjxVQ2hhcj4gcmVzdWx0OworICAgIHJlc3Vs
dC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNvb2tpZUxlbmd0aCk7CisgICAgYXBwZW5kKHJlc3Vs
dCwgbV9uYW1lKTsKKyAgICBhcHBlbmQocmVzdWx0LCBlcXVhbCk7CisgICAgYXBwZW5kKHJlc3Vs
dCwgbV92YWx1ZSk7CisKKyAgICByZXR1cm4gU3RyaW5nOjphZG9wdChyZXN1bHQpOworfQorCit2
b2lkIFBhcnNlZENvb2tpZTo6YXBwZW5kV2ViQ29yZUNvb2tpZShWZWN0b3I8Q29va2llPiYgY29v
a2llVmVjdG9yKSBjb25zdAoreworICAgIGNvb2tpZVZlY3Rvci5hcHBlbmQoQ29va2llKFN0cmlu
ZyhtX25hbWUpLCBTdHJpbmcobV92YWx1ZSksIFN0cmluZyhtX2RvbWFpbiksCisgICAgICAgICAg
ICBTdHJpbmcobV9wYXRoKSwgbV9leHBpcnksIG1faXNIdHRwT25seSwgbV9pc1NlY3VyZSwgbV9p
c1Nlc3Npb24pKTsKK30KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFyc2VkQ29va2llLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmNhMzQz
ZDEzZjNlNWZjNTVmMzg0NGRjOWNiOTlhMzdhNmNiOThlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oCkBAIC0wLDAg
KzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEp1bGllbiBDaGFmZnJh
aXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExLCAy
MDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBQYXJzZWRDb29raWVfaAorI2RlZmluZSBQYXJzZWRDb29raWVfaAorCisjaW5jbHVkZSAiQ29v
a2llLmgiCisjaW5jbHVkZSA8d3RmL0Zhc3RBbGxvY0Jhc2UuaD4KKworbmFtZXNwYWNlIFdURiB7
CitjbGFzcyBTdHJpbmc7Cit9CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEtVUkw7CisK
Ky8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvb2tpZSBpbnRlcm5hbGx5CisvLyBJdCBjYW4g
ZWl0aGVyIGJlIGNyZWF0ZWQgYnkgdGhlIENvb2tpZVBhcnNlciB3aGljaCB3aWxsIHRoZW4gZmls
bCBpdAorLy8gb3IgaXQgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIGJhY2tpbmcgc3RvcmUgZmlsbGlu
ZyBpdCBpbiB0aGUgY29uc3RydWN0b3IuCitjbGFzcyBQYXJzZWRDb29raWUgeworV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb29raWUgOiBlbXB0eSBk
b21haW4sIG5vbiBzZWN1cmUgYW5kIHNlc3Npb24KKyAgICBQYXJzZWRDb29raWUoZG91YmxlIGN1
cnJlbnRUaW1lKTsKKworICAgIC8vIEZvciBiYWNraW5nIHN0b3JlIGNvb2tpZXMgKHRob3NlIGNv
b2tpZXMgYXJlIG5ldmVyIHNlc3Npb24gY29va2llcykuCisgICAgUGFyc2VkQ29va2llKGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiBkb21haW4s
IGNvbnN0IFN0cmluZyYgcHJvdG9jb2wsIGNvbnN0IFN0cmluZyYgcGF0aCwgZG91YmxlIGV4cGly
eSwgZG91YmxlIGxhc3RBY2Nlc3NlZCwgZG91YmxlIGNyZWF0aW9uVGltZSwgYm9vbCBpc1NlY3Vy
ZSwgYm9vbCBpc0h0dHBPbmx5KTsKKworICAgIFBhcnNlZENvb2tpZShjb25zdCBQYXJzZWRDb29r
aWUqKTsKKworICAgIH5QYXJzZWRDb29raWUoKTsKKworICAgIGNvbnN0IFN0cmluZyYgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcm
IG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorCisgICAgY29uc3QgU3RyaW5nJiB2YWx1ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2b2lkIHNldFZhbHVlKGNvbnN0IFN0cmluZyYg
dmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9CisKKyAgICBjb25zdCBTdHJpbmcmIHBhdGgoKSBj
b25zdCB7IHJldHVybiBtX3BhdGg7IH0KKyAgICB2b2lkIHNldFBhdGgoY29uc3QgU3RyaW5nJiBw
YXRoKSB7IG1fcGF0aCA9IHBhdGg7IH0KKworICAgIGNvbnN0IFN0cmluZyYgZG9tYWluKCkgY29u
c3QgeyByZXR1cm4gbV9kb21haW47IH0KKyAgICB2b2lkIHNldERvbWFpbihjb25zdCBTdHJpbmcm
IGRvbWFpbikgeyBtX2RvbWFpbiA9IGRvbWFpbi5sb3dlcigpOyB9CisKKyAgICBjb25zdCBTdHJp
bmcmIHByb3RvY29sKCkgY29uc3QgeyByZXR1cm4gbV9wcm90b2NvbDsgfQorICAgIHZvaWQgc2V0
UHJvdG9jb2woY29uc3QgU3RyaW5nJiBwcm90b2NvbCkgeyBtX3Byb3RvY29sID0gcHJvdG9jb2w7
IH0KKworICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhvZCB1c2VkIHRvIHNldCB0aGUgZG9t
YWluIHRvIHRoZSByZXF1ZXN0J3MgdXJsLgorICAgIHZvaWQgc2V0RGVmYXVsdERvbWFpbihjb25z
dCBLVVJMJik7CisgICAgYm9vbCBoYXNEZWZhdWx0RG9tYWluKCkgY29uc3QgeyByZXR1cm4gbV9o
YXNEZWZhdWx0RG9tYWluOyB9CisKKyAgICBkb3VibGUgZXhwaXJ5KCkgY29uc3QgeyByZXR1cm4g
bV9leHBpcnk7IH0KKyAgICB2b2lkIHNldEV4cGlyeShjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lk
IGZvcmNlRXhwaXJlKCkgeyBtX2lzRm9yY2VFeHBpcmVkICA9IHRydWU7IH0KKyAgICB2b2lkIHNl
dE1heEFnZShjb25zdCBTdHJpbmcmKTsKKworICAgIGRvdWJsZSBsYXN0QWNjZXNzZWQoKSBjb25z
dCB7IHJldHVybiBtX2xhc3RBY2Nlc3NlZDsgfQorICAgIHZvaWQgc2V0TGFzdEFjY2Vzc2VkKGRv
dWJsZSBsYXN0QWNjZXNzZWQpIHsgbV9sYXN0QWNjZXNzZWQgPSBsYXN0QWNjZXNzZWQ7fQorCisg
ICAgZG91YmxlIGNyZWF0aW9uVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fY3JlYXRpb25UaW1lOyB9
CisgICAgdm9pZCBzZXRDcmVhdGlvblRpbWUoZG91YmxlIGNyZWF0aW9uVGltZSkgeyBtX2NyZWF0
aW9uVGltZSA9IGNyZWF0aW9uVGltZTsgfQorCisgICAgYm9vbCBpc1NlY3VyZSgpIGNvbnN0IHsg
cmV0dXJuIG1faXNTZWN1cmU7IH0KKyAgICB2b2lkIHNldFNlY3VyZUZsYWcoYm9vbCBzZWN1cmUp
IHsgbV9pc1NlY3VyZSA9IHNlY3VyZTsgfQorCisgICAgYm9vbCBpc0h0dHBPbmx5KCkgY29uc3Qg
eyByZXR1cm4gbV9pc0h0dHBPbmx5OyB9CisgICAgdm9pZCBzZXRJc0h0dHBPbmx5KGJvb2wgaXNI
dHRwT25seSkgeyBtX2lzSHR0cE9ubHkgPSBpc0h0dHBPbmx5OyB9CisKKyAgICBib29sIGlzU2Vz
c2lvbigpIGNvbnN0IHsgcmV0dXJuIG1faXNTZXNzaW9uOyB9CisKKyAgICBib29sIGhhc0V4cGly
ZWQoKSBjb25zdDsKKyAgICBib29sIGlzRm9yY2VFeHBpcmVkKCkgY29uc3QgeyByZXR1cm4gbV9p
c0ZvcmNlRXhwaXJlZDsgfQorICAgIGJvb2wgaXNVbmRlclNpemVMaW1pdCgpIGNvbnN0OworCisg
ICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgU3RyaW5nIHRvTmFtZVZhbHVlUGFpcigp
IGNvbnN0OworICAgIHZvaWQgYXBwZW5kV2ViQ29yZUNvb2tpZShWZWN0b3I8Q29va2llPiYgY29v
a2llVmVjdG9yKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9uYW1lOworICAgIFN0
cmluZyBtX3ZhbHVlOworICAgIFN0cmluZyBtX2RvbWFpbjsKKyAgICBTdHJpbmcgbV9wcm90b2Nv
bDsKKyAgICBTdHJpbmcgbV9wYXRoOworICAgIGRvdWJsZSBtX2V4cGlyeTsKKyAgICBkb3VibGUg
bV9jcmVhdGlvblRpbWU7CisgICAgLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgTFJVIHJlcGxhY2Vt
ZW50IHBvbGljeS4KKyAgICBkb3VibGUgbV9sYXN0QWNjZXNzZWQ7CisKKyAgICBib29sIG1faXNN
YXhBZ2VTZXQ7CisgICAgYm9vbCBtX2hhc0RlZmF1bHREb21haW47CisgICAgYm9vbCBtX2lzU2Vj
dXJlOworICAgIGJvb2wgbV9pc0h0dHBPbmx5OworICAgIGJvb2wgbV9pc1Nlc3Npb247CisgICAg
Ym9vbCBtX2lzRm9yY2VFeHBpcmVkOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gUGFyc2VkQ29va2llX2gKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxv
ZwppbmRleCBiZmY3N2I4YTQ0ODk1N2U1MGU4NDZjNzEyMjY5MzJiY2Q2MjdlMTI3Li40YTIzN2Ex
MGFlZTY2MWU1NjEzZDFmMWY2NDg5MGViZmY1ZjIxM2I1IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cK
KysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMjIgIEtvbnJhZCBQaWFz
Y2lrICA8a3BpYXNjaWtAcmltLmNvbT4KKworICAgICAgICBVcHN0cmVhbSBCbGFja0JlcnJ5IENv
b2tpZSBNYW5hZ2VtZW50IENsYXNzZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTczNjU0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgTWFudWFsIHRlc3QgdG8gc2VlIGluIG1pbGxpc2Vjb25kcyBob3cgcXVp
Y2tseSAxMDAgd3JpdGVzIGZvbGxvd2VkIGJ5IDEwMCByZWFkcyB0YWtlLgorICAgICAgICBUaGlz
IHRlc3QgaXMgcmFuIHR3aWNlIGFuZCB0aGUgYXZlcmF0ZSByZWFkIGFuZCB3cml0ZSBmb3IgZWFj
aCBvZiB0aGUgMiBydW5zIGlzIHNob3duLgorCisgICAgICAgICogTWFudWFsVGVzdHMvY29va2ll
U3BlZWRUZXN0Lmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTIwICBSeW9zdWtlIE5pd2EgIDxybml3
YUB3ZWJraXQub3JnPgogCiAgICAgICAgIHBlcmYtby1tYXRpYzogRXh0cmFjdCBsb2dpYyB0byBn
ZW5lcmF0ZSBKU09OIHJlc3BvbnNlcyBhcyBjbGFzc2VzIHRvIHVuaXQgdGVzdApkaWZmIC0tZ2l0
IGEvTWFudWFsVGVzdHMvY29va2llU3BlZWRUZXN0Lmh0bWwgYi9NYW51YWxUZXN0cy9jb29raWVT
cGVlZFRlc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43NjBmN2RjNDc5ZTQyNWRhMzYxOTJjMGM0NmI0MDdi
YmRlOWI2MGJmCi0tLSAvZGV2L251bGwKKysrIGIvTWFudWFsVGVzdHMvY29va2llU3BlZWRUZXN0
Lmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPkNvb2tpZSBUZXN0PC90
aXRsZT4KKzxzY3JpcHQ+CitmdW5jdGlvbiBjb29raWVUZXN0KCl7CisgICAgdmFyIHRvdGFsVyA9
IDAuMDsKKyAgICB2YXIgdG90YWxSID0gMC4wOworICAgIGZvcih2YXIgaT0wOyBpIDwgMTAwOyBp
KyspeworICAgICAgICB2YXIgcmFuZG9tTnVtYmVyPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSox
MSk7CisgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoKTsKKyAgICAgICAgdGltZS5zZXRUaW1l
KHRpbWUuZ2V0VGltZSgpICsgMTAwMCk7CisgICAgICAgIHZhciBjb29raWVTdHJpbmcgPSAiY29v
a2llIiArIHJhbmRvbU51bWJlciArICI9dHJ1ZTsgZXhwaXJlcz0iICsgdGltZS50b0dNVFN0cmlu
ZygpOworICAgICAgICB2YXIgcHJlVyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBk
b2N1bWVudC5jb29raWUgPSBjb29raWVTdHJpbmc7CisgICAgICAgIHZhciBwb3N0VyA9IG5ldyBE
YXRlKCkuZ2V0VGltZSgpOworICAgICAgICBpZihkb2N1bWVudC5jb29raWUuaW5kZXhPZigoImNv
b2tpZSIgKyByYW5kb21OdW1iZXIpPiAwKSk7CisgICAgICAgIHZhciBwb3N0UiA9IG5ldyBEYXRl
KCkuZ2V0VGltZSgpOworICAgICAgICB0b3RhbFcgKz0gKHBvc3RXIC0gcHJlVyk7CisgICAgICAg
IHRvdGFsUiArPSAocG9zdFIgLSBwb3N0Vyk7CisgICAgfQorICAgIGRvY3VtZW50LndyaXRlKCI8
YnI+PGJyPmF2ZyBSKG1pbGxpcyk6IiArIHRvdGFsUi8xMDApOworICAgIGRvY3VtZW50LndyaXRl
KCI8YnI+YXZnIFcobWlsbGlzKToiICsgdG90YWxXLzEwMCk7Cit9CisKKzwvc2NyaXB0PgorPC9o
ZWFkPgorPGJvZHkgb25sb2FkPSJqYXZhc2NyaXB0OmNvb2tpZVRlc3QoKTtzZXRUaW1lb3V0KGNv
b2tpZVRlc3QoKSwgMTAwMCk7Ij4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128496</attachid>
            <date>2012-02-23 10:30:33 -0800</date>
            <delta_ts>2012-02-23 12:20:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73654-20120223133111.patch</filename>
            <type>text/plain</type>
            <size>106998</size>
            <attacher name="Konrad Piascik">kpiascik</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTkwNGZmYTlmZThhMjRm
Y2Y4NDg2MmJjYmZjYmY0YTAwNWFiODE1OS4uN2ZmMWJmYTgxYmRiYTcwYzA4ZGNlMjg3NmMyMzRj
NDg2Y2FlNTI1MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI3IEBACisyMDEyLTAyLTIyICBLb25y
YWQgUGlhc2NpayAgPGtwaWFzY2lrQHJpbS5jb20+CisKKyAgICAgICAgVXBzdHJlYW0gQmxhY2tC
ZXJyeSBDb29raWUgTWFuYWdlbWVudCBDbGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZGVkIE1hbnVhbFRlc3RzL2Nvb2tpZVNwZWVkVGVzdC5o
dG1sIGFzIHdlbGwgYXMgdGVzdGVkIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgb24gdGhlIEJsYWNr
QmVycnkgcG9ydCB3aXRoIGh0dHA6Ly90ZXN0c3VpdGVzLm9wZXJhLmNvbS9jb29raWVzLworICAg
ICAgICBQYXNzZXMgYWxsIG5vbiBDb29raWUgMiB0ZXN0cyBzaW5jZSBDb29raWUgMiBpcyBub3Qg
aW1wbGVtZW50ZWQvc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgRXJyb3IgaGFuZGxp
bmcgYW5kIGV4dGVuZGVkIHRlc3RzIGRvIG5vdCBhbGwgcGFzcyBhbmQgd2lsbCBiZSB1cGRhdGVk
IHdpdGggZnV0dXJlIGJ1Z3MvcGF0Y2hlcy4KKworICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVy
cnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmg6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llSmFyQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmg6IEFkZGVkLgorICAgICAgICAqIHBs
YXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgQW5kcmV5
IEtvc3lha292ICA8Y2FzZXFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6
IFtleHBlcmltZW50YWxdIGFkZCBhIG1vZGUgdG8gZGlzcGxheSB0aW1lbGluZSBldmVudHMgYWxp
Z25lZCBieSB0aGUgc3RhcnQgdGltZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi43MzE5Y2IwNDVlODUwMmNmZDllZGZiMjUxZThlMmUwN2I2YTBlZDBjCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCAr
MSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNo
YWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjZGVmaW5lIEVOQUJMRV9D
T09LSUVfREVCVUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmUuaCIKKworI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNs
dWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiU1FM
aXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSAiU1FMaXRlVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5n
Lmg+CisKKyNpZiBFTkFCTEVfQ09PS0lFX0RFQlVHCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtTG9nLmg+CisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBmb3Jt
YXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4u
KQorI2VuZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1FeGVjdXRhYmxlTWVzc2Fn
ZS5oPgorCit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TWVzc2FnZUNsaWVudDsKK3VzaW5n
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUeXBlZFJlcGx5QnVmZmVyOwordXNpbmcgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlOworCitzdGF0aWMgY29uc3QgZG91
YmxlIHNfZGF0YWJhc2VUaW1lckludGVydmFsID0gMjsKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUo
KQorICAgIDogTWVzc2FnZUNsaWVudChNZXNzYWdlQ2xpZW50OjpSZXBseUZlYXR1cmUgfCBNZXNz
YWdlQ2xpZW50OjpTeW5jRmVhdHVyZSkKKyAgICAsIG1fdGFibGVOYW1lKCJjb29raWVzIikgLy8g
VGhpcyBpcyBjaG9zZW4gdG8gbWF0Y2ggTW96aWxsYSdzIHRhYmxlIG5hbWUuCisgICAgLCBtX2Ri
VGltZXIodGhpcywgJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0
YWJhc2VUaW1lckZpcmVkKQorICAgICwgbV9pbnNlcnRTdGF0ZW1lbnQoMCkKKyAgICAsIG1fdXBk
YXRlU3RhdGVtZW50KDApCisgICAgLCBtX2RlbGV0ZVN0YXRlbWVudCgwKQoreworICAgIG1fZGJU
aW1lckNsaWVudCA9IG5ldyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R2VuZXJpY1RpbWVyQ2xpZW50
KHRoaXMpOworICAgIG1fZGJUaW1lci5zZXRDbGllbnQobV9kYlRpbWVyQ2xpZW50KTsKKworICAg
IHB0aHJlYWRfYXR0cl90IHRocmVhZEF0dHJzOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJl
YWRBdHRycyk7CisgICAgY3JlYXRlVGhyZWFkKCJjb29raWVfZGF0YWJhc2UiLCB0aHJlYWRBdHRy
cyk7Cit9CisKK0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp+Q29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBtX2RiVGltZXJDbGllbnQ7CisgICAgbV9kYlRpbWVy
Q2xpZW50ID0gMDsKKyAgICAvLyBGSVhNRTogVGhpcyBvYmplY3Qgd2lsbCBuZXZlciBiZSBkZWxl
dGVkIGR1ZSB0byB0aGUgc2V0IHVwIG9mIENvb2tpZU1hbmFnZXIgKGl0J3MgYSBzaW5nbGV0b24p
CisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBEZXN0cnVjdGluZyIpOworI2lm
bmRlZiBOREVCVUcKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIEFTU0VSVChtX2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAgfQorI2VuZGlm
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnVwZ3JhZGVUYWJsZUlmTmVl
ZGVkKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VGaWVsZHMsIGNvbnN0IFN0cmluZyYgcHJpbWFyeUtl
eUZpZWxkcykKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgYm9vbCBj
cmVhdGlvblRpbWVFeGlzdHMgPSBmYWxzZTsKKyAgICBib29sIHByb3RvY29sRXhpc3RzID0gZmFs
c2U7CisKKyAgICBpZiAoIW1fZGIudGFibGVFeGlzdHMobV90YWJsZU5hbWUpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgdGFibGUgaGFzIHRoZSByZXF1
aXJlZCBkYXRhYmFzZSBmaWVsZHMKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJQUkFH
TUEgdGFibGVfaW5mbygiICsgbV90YWJsZU5hbWUgKyAiKTsiOworCisgICAgICAgIFNRTGl0ZVN0
YXRlbWVudCBzdGF0ZW1lbnQobV9kYiwgcXVlcnkpOworICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgcHJlcGFyZSBzdGF0ZW1l
bnQgdG8gcXVlcnkgY29va2llIHRhYmxlIGluZm8uIHNxbDolcyIsIHF1ZXJ5LnV0ZjgoKS5kYXRh
KCkpOworICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpID09IFNRTFJlc3VsdFJvdykgeworICAgICAg
ICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIGNyZWF0aW9uVGltZSwgKCJjcmVhdGlv
blRpbWUiKSk7CisgICAgICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgcHJvdG9j
b2wsICgicHJvdG9jb2wiKSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHN0YXRlbWVudC5n
ZXRDb2x1bW5UZXh0KDEpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gY3JlYXRpb25UaW1lKQor
ICAgICAgICAgICAgICAgIGNyZWF0aW9uVGltZUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICBp
ZiAobmFtZSA9PSBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICBwcm90b2NvbEV4aXN0cyA9IHRy
dWU7CisgICAgICAgICAgICBpZiAoY3JlYXRpb25UaW1lRXhpc3RzICYmIHByb3RvY29sRXhpc3Rz
KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMT0coTmV0d29y
aywgIk5lZWQgdG8gdXBkYXRlIGNvb2tpZSB0YWJsZSBzY2hlbWEuIik7CisgICAgfQorCisgICAg
Ly8gRHJvcCBhbmQgcmVjcmVhdGUgdGhlIGNvb2tpZSB0YWJsZSB0byB1cGRhdGUgdG8gdGhlIGxh
dGVzdCBkYXRhYmFzZSBmaWVsZHMuCisgICAgLy8gV2UgZG8gbm90IHVzZSBhbHRlciB0YWJsZSAt
IGFkZCBjb2x1bW4gYmVjYXVzZSB0aGF0IG1ldGhvZCBjYW5ub3QgYWRkIHByaW1hcnkga2V5cy4K
KyAgICBWZWN0b3I8U3RyaW5nPiBjb21tYW5kczsKKworICAgIC8vIEJhY2t1cCBleGlzdGluZyB0
YWJsZQorICAgIFN0cmluZyByZW5hbWVRdWVyeSA9ICJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5h
bWUgKyAiIFJFTkFNRSBUTyBCYWNrdXBfIiArIG1fdGFibGVOYW1lICsgIjsiOworICAgIGNvbW1h
bmRzLmFwcGVuZChyZW5hbWVRdWVyeSk7CisKKyAgICAvLyBSZWNyZWF0ZSB0aGUgY29va2llIHRh
YmxlIHVzaW5nIHRoZSBuZXcgZGF0YWJhc2UgYW5kIHByaW1hcnkga2V5IGZpZWxkcworICAgIFN0
cmluZyBjcmVhdGVUYWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgIik7CisgICAgY3JlYXRlVGFibGVR
dWVyeSArPSBtX3RhYmxlTmFtZTsKKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIgKyBkYXRh
YmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzICsgIik7IjsKKyAgICBjb21tYW5k
cy5hcHBlbmQoY3JlYXRlVGFibGVRdWVyeSk7CisKKyAgICAvLyBDb3B5IHRoZSBvbGQgZGF0YSBp
bnRvIHRoZSBuZXcgdGFibGUuIElmIGEgY29sdW1uIGRvZXMgbm90IGV4aXN0cywKKyAgICAvLyB3
ZSBoYXZlIHRvIHB1dCBhICcnIGluIHRoZSBzZWxlY3Qgc3RhdGVtZW50IHRvIG1ha2UgdGhlIG51
bWJlciBvZiBjb2x1bW5zCisgICAgLy8gZXF1YWwgaW4gdGhlIGluc2VydCBzdGF0ZW1lbnQuCisg
ICAgU3RyaW5nIG1pZ3JhdGlvblF1ZXJ5KCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICIpOworICAg
IG1pZ3JhdGlvblF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIG1pZ3JhdGlvblF1ZXJ5ICs9ICIg
U0VMRUNUICoiOworICAgIGlmICghY3JlYXRpb25UaW1lRXhpc3RzKQorICAgICAgICBtaWdyYXRp
b25RdWVyeSArPSAiLCcnIjsKKyAgICBpZiAoIXByb3RvY29sRXhpc3RzKQorICAgICAgICBtaWdy
YXRpb25RdWVyeSArPSAiLCcnIjsKKyAgICBtaWdyYXRpb25RdWVyeSArPSAiIEZST00gQmFja3Vw
XyIgKyBtX3RhYmxlTmFtZTsKKyAgICBjb21tYW5kcy5hcHBlbmQobWlncmF0aW9uUXVlcnkpOwor
CisgICAgLy8gVGhlIG5ldyBjb2x1bW5zIHdpbGwgYmUgYmxhbmssIHNldCB0aGUgbmV3IHZhbHVl
cy4KKyAgICBpZiAoIWNyZWF0aW9uVGltZUV4aXN0cykgeworICAgICAgICBTdHJpbmcgc2V0Q3Jl
YXRpb25UaW1lUXVlcnkgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIGNyZWF0aW9u
VGltZSA9IGxhc3RBY2Nlc3NlZDsiOworICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2V0Q3JlYXRp
b25UaW1lUXVlcnkpOworICAgIH0KKworICAgIGlmICghcHJvdG9jb2xFeGlzdHMpIHsKKyAgICAg
ICAgU3RyaW5nIHNldFByb3RvY29sUXVlcnkgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIg
U0VUIHByb3RvY29sID0gJ2h0dHAnIFdIRVJFIGlzU2VjdXJlID0gJzAnOyI7CisgICAgICAgIFN0
cmluZyBzZXRQcm90b2NvbFF1ZXJ5MiA9ICJVUERBVEUgIiArIG1fdGFibGVOYW1lICsgIiBTRVQg
cHJvdG9jb2wgPSAnaHR0cHMnIFdIRVJFIGlzU2VjdXJlID0gJzEnOyI7CisgICAgICAgIGNvbW1h
bmRzLmFwcGVuZChzZXRQcm90b2NvbFF1ZXJ5KTsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5kKHNl
dFByb3RvY29sUXVlcnkyKTsKKyAgICB9CisKKyAgICAvLyBEcm9wIHRoZSBiYWNrdXAgdGFibGUK
KyAgICBTdHJpbmcgZHJvcEJhY2t1cFF1ZXJ5ID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTIEJhY2t1
cF8iICsgbV90YWJsZU5hbWUgKyAiOyI7CisgICAgY29tbWFuZHMuYXBwZW5kKGRyb3BCYWNrdXBR
dWVyeSk7CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RiLCBmYWxzZSk7
CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKyAgICBzaXplX3QgY29tbWFuZFNpemUgPSBjb21t
YW5kcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21tYW5kU2l6ZTsgKytp
KSB7CisgICAgICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZChjb21tYW5kc1tpXSkpIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFsdGVyIGNvb2tpZSB0YWJsZSB3aGVuIGV4
ZWN1dGluZyBzcWw6JXMiLCBjb21tYW5kc1tpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAg
IExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjaygpOworCisgICAgICAgICAgICAv
LyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBpZiB3ZSBkbywgcmVuYW1lIHRoZSBjdXJy
ZW50IGNvb2tpZSB0YWJsZSBmb3IgZnV0dXJlIHJlc3RvcmF0aW9uLiBUaGlzIGhhcyB0aGUgc2lk
ZSBlZmZlY3Qgb2YKKyAgICAgICAgICAgIC8vIGNsZWFyaW5nIHRoZSBjdXJyZW50IGNvb2tpZSB0
YWJsZSwgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiBjb250aW51YWxseSBoaXR0aW5nIHRoaXMgY2Fz
ZSBhbmQgaGVuY2UgbmV2ZXIgYmVpbmcgYWJsZSB0byB1c2UgdGhlCisgICAgICAgICAgICAvLyBj
b29raWUgdGFibGUuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgIFN0cmluZyByZW5hbWVRdWVyeSA9ICJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5hbWUgKyAi
IFJFTkFNRSBUTyBCYWNrdXAyXyIgKyBtX3RhYmxlTmFtZSArICI7IjsKKyAgICAgICAgICAgIGlm
ICghbV9kYi5leGVjdXRlQ29tbWFuZChyZW5hbWVRdWVyeSkpIHsKKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoIkZhaWxlZCB0byBiYWNrdXAgZXhpc3RpbmcgY29va2llIHRhYmxlLiIpOworICAg
ICAgICAgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5s
YXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICB9CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgTE9HKE5ldHdvcmss
ICJTdWNjZXNzZnVsbHkgdXBkYXRlZCBjb29raWUgdGFibGUgc2NoZW1hLiIpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpvcGVuKGNvbnN0IFN0cmluZyYgY29va2llSmFy
KQoreworICAgIGRpc3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZU9wZW4sIHRoaXMsIGNvb2tpZUphcikpOworfQor
Cit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuKGNvbnN0IFN0cmlu
ZyYgY29va2llSmFyKQoreworICAgIEFTU0VSVChpc0N1cnJlbnRUaHJlYWQoKSk7CisgICAgaWYg
KG1fZGIuaXNPcGVuKCkpCisgICAgICAgIGNsb3NlKCk7CisKKyAgICBpZiAoIW1fZGIub3Blbihj
b29raWVKYXIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IG9wZW4gdGhlIGNvb2tp
ZSBkYXRhYmFzZS4gTm8gY29va2llIHdpbGwgYmUgc3RvcmVkISIpOworICAgICAgICBMT0dfRVJS
T1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYi5leGVjdXRlQ29tbWFuZCgiUFJBR01BIGxv
Y2tpbmdfbW9kZT1FWENMVVNJVkU7Iik7CisgICAgbV9kYi5leGVjdXRlQ29tbWFuZCgiUFJBR01B
IGpvdXJuYWxfbW9kZT1UUlVOQ0FURTsiKTsKKworICAgIGNvbnN0IFN0cmluZyBwcmltYXJ5S2V5
RmllbGRzKCJQUklNQVJZIEtFWSAocHJvdG9jb2wsIGhvc3QsIHBhdGgsIG5hbWUpIik7CisgICAg
Y29uc3QgU3RyaW5nIGRhdGFiYXNlRmllbGRzKCJuYW1lIFRFWFQsIHZhbHVlIFRFWFQsIGhvc3Qg
VEVYVCwgcGF0aCBURVhULCBleHBpcnkgRE9VQkxFLCBsYXN0QWNjZXNzZWQgRE9VQkxFLCBpc1Nl
Y3VyZSBJTlRFR0VSLCBpc0h0dHBPbmx5IElOVEVHRVIsIGNyZWF0aW9uVGltZSBET1VCTEUsIHBy
b3RvY29sIFRFWFQiKTsKKyAgICAvLyBVcGRhdGUgdGFibGUgdG8gYWRkIHRoZSBuZXcgY29sdW1u
IGNyZWF0aW9uVGltZSBhbmQgcHJvdG9jb2wgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5Lgor
ICAgIHVwZ3JhZGVUYWJsZUlmTmVlZGVkKGRhdGFiYXNlRmllbGRzLCBwcmltYXJ5S2V5RmllbGRz
KTsKKworICAgIC8vIENyZWF0ZSB0YWJsZSBpZiBub3QgZXhzaXN0IGluIGNhc2UgdGhhdCB0aGUg
dXBncmFkZVRhYmxlSWZOZWVkZWQoKSBmYWlsZWQgYWNjaWRlbnRhbGx5LgorICAgIFN0cmluZyBj
cmVhdGVUYWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiKTsKKyAgICBjcmVh
dGVUYWJsZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIC8vIFRoaXMgdGFibGUgc2NoZW1hIGlz
IGNvbXBsaWFudCB3aXRoIE1vemlsbGEncy4KKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIg
KyBkYXRhYmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzKyIpOyI7CisKKyAgICBp
ZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoY3JlYXRlVGFibGVRdWVyeSkpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgY29va2llcyBp
bnRvLiBObyBjb29raWUgd2lsbCBiZSBzdG9yZWQhIik7CisgICAgICAgIExPR19FUlJPUigiU1FM
aXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGNs
b3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcgaW5zZXJ0UXVlcnko
IklOU0VSVCBPUiBSRVBMQUNFIElOVE8gIik7CisgICAgaW5zZXJ0UXVlcnkgKz0gbV90YWJsZU5h
bWU7CisgICAgaW5zZXJ0UXVlcnkgKz0gIiAobmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGly
eSwgbGFzdEFjY2Vzc2VkLCBpc1NlY3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90
b2NvbCkgVkFMVUVTICg/MSwgPzIsID8zLCA/NCwgPzUsID82LCA/NywgPzgsID85LCA/MTApOyI7
CisKKyAgICBtX2luc2VydFN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgaW5z
ZXJ0UXVlcnkpOworICAgIGlmIChtX2luc2VydFN0YXRlbWVudC0+cHJlcGFyZSgpKSB7CisgICAg
ICAgIExPR19FUlJPUigiQ2Fubm90IHNhdmUgY29va2llcyIpOworICAgICAgICBMT0dfRVJST1Io
IlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0K
KworICAgIFN0cmluZyB1cGRhdGVRdWVyeSgiVVBEQVRFICIpOworICAgIHVwZGF0ZVF1ZXJ5ICs9
IG1fdGFibGVOYW1lOworICAgIC8vIFRoZSB3aGVyZSBzdGF0ZW1lbnQgaXMgY2hvc2VuIHRvIG1h
dGNoIENvb2tpZU1hcCBrZXkuCisgICAgdXBkYXRlUXVlcnkgKz0gIiBTRVQgbmFtZSA9ID8xLCB2
YWx1ZSA9ID8yLCBob3N0ID0gPzMsIHBhdGggPSA/NCwgZXhwaXJ5ID0gPzUsIGxhc3RBY2Nlc3Nl
ZCA9ID82LCBpc1NlY3VyZSA9ID83LCBpc0h0dHBPbmx5ID0gPzgsIGNyZWF0aW9uVGltZSA9ID85
LCBwcm90b2NvbCA9ID8xMCB3aGVyZSBwcm90b2NvbCA9ID8xMCBhbmQgbmFtZSA9ID8xIGFuZCBo
b3N0ID0gPzMgYW5kIHBhdGggPSA/NDsiOworICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gbmV3IFNR
TGl0ZVN0YXRlbWVudChtX2RiLCB1cGRhdGVRdWVyeSk7CisKKyAgICBpZiAobV91cGRhdGVTdGF0
ZW1lbnQtPnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCB1cGRhdGUgY29v
a2llcyIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1f
ZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVM
RVRFIEZST00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgLy8gVGhl
IHdoZXJlIHN0YXRlbWVudCBpcyBjaG9zZW4gdG8gbWF0Y2ggQ29va2llTWFwIGtleS4KKyAgICBk
ZWxldGVRdWVyeSArPSAiIFdIRVJFIG5hbWU9PzEgYW5kIGhvc3Q9PzIgYW5kIHBhdGg9PzMgYW5k
IHByb3RvY29sPT80OyI7CisgICAgbV9kZWxldGVTdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVt
ZW50KG1fZGIsIGRlbGV0ZVF1ZXJ5KTsKKworICAgIGlmIChtX2RlbGV0ZVN0YXRlbWVudC0+cHJl
cGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29raWVzIik7Cisg
ICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJy
b3JNc2coKSk7CisgICAgfQorCit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6
OmNsb3NlKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gQ2xvc2luZyIpOworCisgICAgc2l6ZV90IGNoYW5nZWRD
b29raWVzU2l6ZTsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIGlmIChtX2RiVGltZXIuc3RhcnRlZCgpKQorICAgICAgICAgICAgbV9kYlRpbWVyLnN0
b3AoKTsKKyAgICAgICAgY2hhbmdlZENvb2tpZXNTaXplID0gbV9jaGFuZ2VkQ29va2llcy5zaXpl
KCk7CisgICAgfQorCisgICAgaWYgKGNoYW5nZWRDb29raWVzU2l6ZSA+IDApCisgICAgICAgIGlu
dm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgZGVsZXRlIG1faW5zZXJ0U3RhdGVt
ZW50OworICAgIG1faW5zZXJ0U3RhdGVtZW50ID0gMDsKKyAgICBkZWxldGUgbV91cGRhdGVTdGF0
ZW1lbnQ7CisgICAgbV91cGRhdGVTdGF0ZW1lbnQgPSAwOworICAgIGRlbGV0ZSBtX2RlbGV0ZVN0
YXRlbWVudDsKKyAgICBtX2RlbGV0ZVN0YXRlbWVudCA9IDA7CisKKyAgICBpZiAobV9kYi5pc09w
ZW4oKSkKKyAgICAgICAgbV9kYi5jbG9zZSgpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlOjppbnNlcnQoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29v
a2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgaW5zZXJ0aW5nIGNvb2tpZSAlcyB0
byBxdWV1ZS4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgYWRkVG9D
aGFuZ2VRdWV1ZShjb29raWUsIEluc2VydCk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmU6OnVwZGF0ZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICBDb29r
aWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGFkZGluZyB1cGRhdGluZyBjb29raWUgJXMgdG8g
cXVldWUuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFkZFRvQ2hh
bmdlUXVldWUoY29va2llLCBVcGRhdGUpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjpyZW1vdmUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29va2ll
TG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgZGVsZXRpbmcgY29va2llICVzIHRvIHF1
ZXVlLiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBhZGRUb0NoYW5n
ZVF1ZXVlKGNvb2tpZSwgRGVsZXRlKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZTo6cmVtb3ZlQWxsKCkKK3sKKyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2Fs
bE1lc3NhZ2UoJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VSZW1vdmVBbGwsIHRo
aXMpKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3Zl
QWxsKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICghbV9kYi5p
c09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5n
U3RvcmUgLSByZW1vdmUgQWxsIGNvb2tpZXMgZnJvbSBiYWNraW5nc3RvcmUiKTsKKworICAgIHsK
KyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgbV9jaGFuZ2VkQ29v
a2llcy5jbGVhcigpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVMRVRFIEZS
T00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgZGVsZXRlUXVlcnkg
Kz0gIjsiOworCisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RiLCBkZWxl
dGVRdWVyeSk7CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJDb3VsZCBub3QgcHJlcGFyZSBERUxFVEUgKiBzdGF0ZW1lbnQiKTsKKyAgICAg
ICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1z
ZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZGVsZXRlU3RhdGVtZW50
LmV4ZWN1dGVDb21tYW5kKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNv
b2tpZSBmcm9tIGRhdGFiYXNlIik7CisgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1l
c3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OmdldENvb2tpZXNGcm9tRGF0
YWJhc2UoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQgaW50
IGxpbWl0KQoreworICAgIC8vIEl0IGlzIG5vdCBhIGh1Z2UgcGVyZm9ybWFuY2UgaGl0IHRvIHdh
aXQgb24gdGhlIHJlcGx5IGhlcmUgYmVjYXVzZSB0aGlzIGlzIG9ubHkgZG9uZSBvbmNlIGR1cmlu
ZyBzZXR1cCBhbmQgd2hlbiB0dXJuaW5nIG9mZiBwcml2YXRlIG1vZGUuCisgICAgVHlwZWRSZXBs
eUJ1ZmZlcjwgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiA+IHJlcGx5QnVmZmVyKDApOworICAgIGRp
c3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZVdpdGhSZXR1cm4oJkNvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0LCAmcmVwbHlCdWZm
ZXIsIHRoaXMsIGxpbWl0KSk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBjb29raWVzID0g
cmVwbHlCdWZmZXIucG9pbnRlcigpOworICAgIHN0YWNrT2ZDb29raWVzLnN3YXAoKmNvb2tpZXMp
OworICAgIGRlbGV0ZSBjb29raWVzOworfQorCitWZWN0b3I8UGFyc2VkQ29va2llKj4qIENvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0KHVuc2lnbmVk
IGludCBsaW1pdCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgLy8g
Q2hlY2sgdGhhdCB0aGUgdGFibGUgZXhpc3RzIHRvIGF2b2lkIGRvaW5nIGFuIHVubmVjZXNzYXJ5
IHJlcXVlc3QuCisgICAgaWYgKCFtX2RiLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIFN0cmluZ0J1aWxkZXIgc2VsZWN0UXVlcnk7CisgICAgc2VsZWN0UXVlcnkuYXBwZW5kKCJT
RUxFQ1QgbmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBpc1Nl
Y3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90b2NvbCBGUk9NICIpOworICAgIHNl
bGVjdFF1ZXJ5LmFwcGVuZChtX3RhYmxlTmFtZSk7CisgICAgaWYgKGxpbWl0ID4gMCkgeworICAg
ICAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIiBPUkRFUiBCWSBsYXN0QWNjZXNzZWQgQVNDIik7Cisg
ICAgICAgIHNlbGVjdFF1ZXJ5LmFwcGVuZCgiIExJTUlUICIgKyBTdHJpbmc6Om51bWJlcihsaW1p
dCkpOworICAgIH0KKyAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIjsiKTsKKworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gaW52b2tlR2V0QWxsQ29va2llcyB3aXRoIHNlbGVjdCBx
dWVyeSAlcyIsIHNlbGVjdFF1ZXJ5LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBT
UUxpdGVTdGF0ZW1lbnQgc2VsZWN0U3RhdGVtZW50KG1fZGIsIHNlbGVjdFF1ZXJ5LnRvU3RyaW5n
KCkpOworCisgICAgaWYgKHNlbGVjdFN0YXRlbWVudC5wcmVwYXJlKCkpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDYW5ub3QgcmV0cmlldmVkIGNvb2tpZXMgZnJvbSB0aGUgZGF0YWJhc2UiKTsKKyAg
ICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJv
ck1zZygpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVmVjdG9yPFBhcnNlZENv
b2tpZSo+KiBjb29raWVzID0gbmV3IFZlY3RvcjxQYXJzZWRDb29raWUqPjsKKyAgICB3aGlsZSAo
c2VsZWN0U3RhdGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAgLy8gVGhl
cmUgaXMgYSByb3cgdG8gZmV0Y2gKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdFN0YXRl
bWVudC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZWxlY3RTdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDMpOworICAgICAgICBkb3VibGUgZXhwaXJ5ID0gc2VsZWN0
U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg0KTsKKyAgICAgICAgZG91YmxlIGxhc3RBY2Nlc3Nl
ZCA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoNSk7CisgICAgICAgIGJvb2wgaXNT
ZWN1cmUgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDYpOworICAgICAgICBib29sIGlz
SHR0cE9ubHkgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDcpOworICAgICAgICBkb3Vi
bGUgY3JlYXRpb25UaW1lID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg4KTsKKyAg
ICAgICAgU3RyaW5nIHByb3RvY29sID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRleHQoOSk7
CisKKyAgICAgICAgY29va2llcy0+YXBwZW5kKG5ldyBQYXJzZWRDb29raWUobmFtZSwgdmFsdWUs
IGRvbWFpbiwgcHJvdG9jb2wsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBjcmVhdGlvblRp
bWUsIGlzU2VjdXJlLCBpc0h0dHBPbmx5KSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvb2tpZXM7
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRh
YmFzZVN5bmNocm9ub3VzbHkoKQoreworICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3Jl
IC0gc2VuZGluZyB0byBkYXRhYmFzZSBpbW1lZGlhdGVseSIpOworICAgIHsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgaWYgKG1fZGJUaW1lci5zdGFydGVkKCkp
CisgICAgICAgICAgICBtX2RiVGltZXIuc3RvcCgpOworICAgIH0KKyAgICBkaXNwYXRjaFN5bmNN
ZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9y
ZTo6aW52b2tlU2VuZENoYW5nZXNUb0RhdGFiYXNlLCB0aGlzKSk7Cit9CisKK3ZvaWQgQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRhYmFzZShpbnQgbmV4dEludGVy
dmFsKQoreworICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgaWYgKCFtX2RiVGlt
ZXIuc3RhcnRlZCgpKSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0g
U3RhcnRpbmcgb25lIHNob3Qgc2VuZCB0byBkYXRhYmFzZSIpOworICAgICAgICBtX2RiVGltZXIu
c3RhcnQobmV4dEludGVydmFsKTsKKyAgICB9IGVsc2UgeworI2lmICFOREVCVUcKKyAgICAgICAg
Q29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBUaW1lciBhbHJlYWR5IHJ1bm5pbmcsIHNr
aXBwaW5nIHRoaXMgcmVxdWVzdCIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIENvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2VUaW1lckZpcmVkKCkKK3sK
KyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJkNvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlOjppbnZva2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UsIHRoaXMpKTsKK30K
Kwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlU2VuZENoYW5nZXNUb0Rh
dGFiYXNlKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgaWYgKCFt
X2RiLmlzT3BlbigpKSB7CisgICAgICAgIExPR19FUlJPUigiVGltZXIgRmlyZWQsIGJ1dCBkYXRh
YmFzZSBpcyBjbG9zZWQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8
Q29va2llQWN0aW9uPiBjaGFuZ2VkQ29va2llczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2Vy
IGxvY2sobV9tdXRleCk7CisgICAgICAgIGNoYW5nZWRDb29raWVzLnN3YXAobV9jaGFuZ2VkQ29v
a2llcyk7CisgICAgICAgIEFTU0VSVChtX2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAg
fQorCisgICAgaWYgKGNoYW5nZWRDb29raWVzLmlzRW1wdHkoKSkgeworICAgICAgICBDb29raWVM
b2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIFRpbWVyIGZpcmVkLCBidXQgbm8gY29va2llcyBpbiBj
aGFuZ2VsaXN0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ29va2llTG9nKCJDb29r
aWVCYWNraW5nU3RvcmUgLSBUaW1lciBmaXJlZCwgc2VuZGluZyBjaGFuZ2VzIHRvIGRhdGFiYXNl
LiBXZSBoYXZlICVkIGNoYW5nZXMiLCBjaGFuZ2VkQ29va2llcy5zaXplKCkpOworICAgIFNRTGl0
ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKG1fZGIsIGZhbHNlKTsKKyAgICB0cmFuc2FjdGlvbi5i
ZWdpbigpOworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGNo
YW5nZSBsaXN0IHRvIG1ha2UgY2FsbHMKKyAgICAvLyBJZiBlcnJvciBvY2N1cnMsIGlnbm9yZSBp
dCBhbmQgY29udGludWUgdG8gdGhlIG5leHQgc3RhdGVtZW50CisgICAgc2l6ZV90IHNpemVPZkNo
YW5nZSA9IGNoYW5nZWRDb29raWVzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHNpemVPZkNoYW5nZTsgaSsrKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCogbV9zdGF0ZW1l
bnQ7CisgICAgICAgIGNvbnN0IFBhcnNlZENvb2tpZSBjb29raWUgPSBjaGFuZ2VkQ29va2llc1tp
XS5maXJzdDsKKyAgICAgICAgVXBkYXRlUGFyYW1ldGVyIGFjdGlvbiA9IGNoYW5nZWRDb29raWVz
W2ldLnNlY29uZDsKKworICAgICAgICBpZiAoYWN0aW9uID09IERlbGV0ZSkgeworICAgICAgICAg
ICAgbV9zdGF0ZW1lbnQgPSBtX2RlbGV0ZVN0YXRlbWVudDsKKyAgICAgICAgICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gZGVsZXRpbmcgY29va2llICVzLiIsIGNvb2tpZS50b1N0
cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgICAgICAvLyBCaW5kcyBhbGwgdGhlIHZh
bHVlcworICAgICAgICAgICAgaWYgKG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29raWUubmFt
ZSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLmRvbWFpbigpKQorICAgICAg
ICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29raWUucGF0aCgpKSB8fCBt
X3N0YXRlbWVudC0+YmluZFRleHQoNCwgY29va2llLnByb3RvY29sKCkpKSB7CisgICAgICAgICAg
ICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgYmluZCBjb29raWUgZGF0YSB0byBkZWxldGUiKTsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIu
bGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICBD
b29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIHVwZGF0aW5nIGNvb2tpZSAlcy4iLCBjb29r
aWUudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBtX3N0YXRlbWVu
dCA9IG1fdXBkYXRlU3RhdGVtZW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGluc2VydGluZyBjb29raWUgJXMu
IiwgY29va2llLnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgbV9z
dGF0ZW1lbnQgPSBtX2luc2VydFN0YXRlbWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gQmluZHMgYWxsIHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIGlmIChtX3N0YXRlbWVudC0+
YmluZFRleHQoMSwgY29va2llLm5hbWUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGNv
b2tpZS52YWx1ZSgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgz
LCBjb29raWUuZG9tYWluKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCg0LCBjb29raWUucGF0
aCgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kRG91YmxlKDUsIGNvb2tp
ZS5leHBpcnkoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmREb3VibGUoNiwgY29va2llLmxhc3RBY2Nl
c3NlZCgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kSW50NjQoNywgY29v
a2llLmlzU2VjdXJlKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kSW50NjQoOCwgY29va2llLmlzSHR0
cE9ubHkoKSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZERvdWJsZSg5LCBj
b29raWUuY3JlYXRpb25UaW1lKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxMCwgY29va2ll
LnByb3RvY29sKCkpKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgYmluZCBj
b29raWUgZGF0YSB0byBzYXZlIik7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUg
RXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCByYyA9IG1fc3RhdGVtZW50LT5zdGVw
KCk7CisgICAgICAgIG1fc3RhdGVtZW50LT5yZXNldCgpOworICAgICAgICBpZiAocmMgIT0gU1FM
UmVzdWx0T2sgJiYgcmMgIT0gU1FMUmVzdWx0RG9uZSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJDYW5ub3QgbWFrZSBjYWxsIHRvIHRoZSBkYXRhYmFzZSIpOworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgQ29va2llTG9n
KCJDb29raWVCYWNraW5nU3RvcmUgLSB0cmFuc2FjdGlvbiBjb21wbGV0ZSIpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjphZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNl
ZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKQorewor
ICAgIEFTU0VSVCghY2hhbmdlZENvb2tpZS0+aXNTZXNzaW9uKCkpOworICAgIFBhcnNlZENvb2tp
ZSBjb29raWVDb3B5KGNoYW5nZWRDb29raWUpOworICAgIENvb2tpZUFjdGlvbiBhY3Rpb24oY29v
a2llQ29weSwgYWN0aW9uUGFyYW0pOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayht
X211dGV4KTsKKyAgICAgICAgbV9jaGFuZ2VkQ29va2llcy5hcHBlbmQoYWN0aW9uKTsKKyAgICAg
ICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBtX2NoYW5nZWRjb29raWVzIGhhcyAl
ZC4iLCBtX2NoYW5nZWRDb29raWVzLnNpemUoKSk7CisgICAgfQorICAgIHNlbmRDaGFuZ2VzVG9E
YXRhYmFzZShzX2RhdGFiYXNlVGltZXJJbnRlcnZhbCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iOWI3ZGVjZGQxZDY3
OTk4NjdmMGM5MzE4ZWE2NDM5ODQ1OWUxMTIzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxleW8uY29tPgorICog
Q29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9oCisjZGVm
aW5lIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlX2gKKworI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCisjaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJUaW1lci5oIgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybVRpbWVyLmg+CisjaW5jbHVkZSA8R2VuZXJpY1RpbWVyQ2xpZW50
Lmg+CisjaW5jbHVkZSA8VGhyZWFkVGltZXJDbGllbnQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nUHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYv
dGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2Vk
Q29va2llOworCitjbGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSA6IHB1YmxpYyBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TWVzc2FnZUNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLCBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06OlRocmVhZFRpbWVyQ2xpZW50
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUqIGNyZWF0
ZSgpIHsgcmV0dXJuIG5ldyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsgfQorCisgICAgdm9p
ZCBvcGVuKGNvbnN0IFN0cmluZyYgY29va2llSmFyKTsKKworICAgIHZvaWQgaW5zZXJ0KGNvbnN0
IFBhcnNlZENvb2tpZSopOworICAgIHZvaWQgdXBkYXRlKGNvbnN0IFBhcnNlZENvb2tpZSopOwor
ICAgIHZvaWQgcmVtb3ZlKGNvbnN0IFBhcnNlZENvb2tpZSopOworCisgICAgdm9pZCByZW1vdmVB
bGwoKTsKKworICAgIC8vIElmIGEgbGltaXQgaXMgbm90IHNldCwgdGhlIG1ldGhvZCB3aWxsIHJl
dHVybiBhbGwgY29va2llcyBpbiB0aGUgZGF0YWJhc2UKKyAgICB2b2lkIGdldENvb2tpZXNGcm9t
RGF0YWJhc2UoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQg
aW50IGxpbWl0ID0gMCk7CisKKyAgICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZVN5bmNocm9u
b3VzbHkoKTsKKworICAgIC8vIFRocmVhZFRpbWVyQ2xpZW50IG1ldGhvZHMKKyAgICB2aXJ0dWFs
IGJvb2wgd2lsbEZpcmVUaW1lcigpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGludCBn
ZXRQdWxzZUNvZGUoKSBjb25zdCB7IHJldHVybiBwdWxzZUNvZGUoKTsgfQorICAgIHZpcnR1YWwg
aW50IGdldENvbm5lY3Rpb25JZCgpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25JZCgpOyB9Cisg
ICAgdmlydHVhbCBpbnQgZGVmYXVsdFRpbWVyUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiB0aHJl
YWRQcmlvcml0eSgpOyB9CisKK3ByaXZhdGU6CisgICAgZW51bSBVcGRhdGVQYXJhbWV0ZXIgewor
ICAgICAgICBJbnNlcnQsCisgICAgICAgIFVwZGF0ZSwKKyAgICAgICAgRGVsZXRlLAorICAgIH07
CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpOworICAgIH5Db29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBhZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNl
ZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKTsKKyAg
ICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZShpbnQgaW50ZXJ2YWwpOworICAgIHZvaWQgc2Vu
ZENoYW5nZXNUb0RhdGFiYXNlVGltZXJGaXJlZCgpOworICAgIHZvaWQgdXBncmFkZVRhYmxlSWZO
ZWVkZWQoY29uc3QgU3RyaW5nJiBkYXRhYmFzZVNjaGVtYSwgY29uc3QgU3RyaW5nJiBwcmltYXJ5
a2V5RmllbGRzKTsKKworICAgIHZvaWQgaW52b2tlT3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUph
cik7CisgICAgdm9pZCBpbnZva2VSZW1vdmVBbGwoKTsKKyAgICBWZWN0b3I8UGFyc2VkQ29va2ll
Kj4qIGludm9rZUdldENvb2tpZXNXaXRoTGltaXQodW5zaWduZWQgaW50IGxpbWl0KTsKKyAgICB2
b2lkIGludm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgdm9pZCBjbG9zZSgpOwor
CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IFBhcnNlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyPiBD
b29raWVBY3Rpb247CisgICAgVmVjdG9yPENvb2tpZUFjdGlvbj4gbV9jaGFuZ2VkQ29va2llczsK
KyAgICBNdXRleCBtX211dGV4OworCisgICAgU3RyaW5nIG1fdGFibGVOYW1lOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpUaW1lcjxDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZT4gbV9kYlRp
bWVyOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHZW5lcmljVGltZXJDbGllbnQqIG1fZGJU
aW1lckNsaWVudDsKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RiOworICAgIFNRTGl0ZVN0YXRlbWVu
dCAqbV9pbnNlcnRTdGF0ZW1lbnQ7CisgICAgU1FMaXRlU3RhdGVtZW50ICptX3VwZGF0ZVN0YXRl
bWVudDsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgKm1fZGVsZXRlU3RhdGVtZW50OworfTsKKworQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUmIGNvb2tpZUJhY2tpbmdTdG9yZSgpOworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZUph
ckJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29r
aWVKYXJCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zOTVjNmFmMjc4NDNjMDAyMDM3ZWNlZTk3
ZDhmMDNhY2Q3NTE1YjYzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVKYXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDExMCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogQ29w
eXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIGh0dHA6Ly93d3cudG9yY2htb2JpbGUu
Y29tLworICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLTIw
MTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkNvb2tpZUphci5oIgorCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiQ29v
a2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIK
KyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJLVVJM
LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiUGFnZUdyb3VwTG9hZERlZmVycmVyLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNp
bmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU3Ry
aW5nIGNvb2tpZXMoRG9jdW1lbnQgY29uc3QqIGRvY3VtZW50LCBLVVJMIGNvbnN0JiB1cmwpCit7
CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisgICAgUGFnZSogcGFnZSA9
IGZyYW1lID8gZnJhbWUtPnBhZ2UoKSA6IDA7CisKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKworICAgIGlmICghKGZyYW1lICYmIGZyYW1lLT5sb2FkZXIoKSAmJiBm
cmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisg
ICAgaWYgKCFzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihmcmFtZS0+
bG9hZGVyKCktPmNsaWVudCgpKS0+Y29va2llc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIFN0
cmluZygpOworCisgICAgQVNTRVJUKGRvY3VtZW50ICYmIHVybCA9PSBkb2N1bWVudC0+Y29va2ll
VVJMKCkpOworICAgIC8vICdIdHRwT25seScgY29va2llcyBzaG91bGQgbm8gYmUgYWNjZXNzaWJs
ZSBmcm9tIHNjcmlwdHMsIHNvIHdlIGZpbHRlciB0aGVtIG91dCBoZXJlCisgICAgcmV0dXJuIGNv
b2tpZU1hbmFnZXIoKS5nZXRDb29raWUodXJsLCBOb0h0dHBPbmx5Q29va2llKTsKK30KKwordm9p
ZCBzZXRDb29raWVzKERvY3VtZW50KiBkb2N1bWVudCwgS1VSTCBjb25zdCYgdXJsLCBTdHJpbmcg
Y29uc3QmIHZhbHVlKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOwor
ICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZSA/IGZyYW1lLT5wYWdlKCkgOiAwOworCisgICAgaWYgKCFw
YWdlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIShmcmFtZSAmJiBmcmFtZS0+bG9hZGVy
KCkgJiYgZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4oZnJhbWUtPmxv
YWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEFTU0VSVChkb2N1bWVudCAmJiB1cmwgPT0gZG9jdW1lbnQtPmNvb2tpZVVSTCgpKTsKKyAg
ICBjb29raWVNYW5hZ2VyKCkuc2V0Q29va2llcyh1cmwsIHZhbHVlKTsKK30KKworYm9vbCBjb29r
aWVzRW5hYmxlZChEb2N1bWVudCBjb25zdCopCit7CisgICAgLy8gRklYTUUuIEN1cnJlbnRseSBj
b29raWUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBubyBzZXR0aW5nIG9uIHByb3BlcnR5IHBhZ2Uu
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBEb2N1bWVu
dCogZG9jdW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgVmVjdG9yPENvb2tpZT4mIHJhd0Nvb2tpZXMp
Cit7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHJlc3VsdDsKKyAgICBjb29raWVNYW5hZ2Vy
KCkuZ2V0UmF3Q29va2llcyhyZXN1bHQsIHVybCwgV2l0aEh0dHBPbmx5Q29va2llcyk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspCisgICAgICAgIHJlc3Vs
dFtpXS0+YXBwZW5kV2ViQ29yZUNvb2tpZShyYXdDb29raWVzKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBkZWxldGVDb29raWUoY29uc3QgRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2llTmFtZSkKK3sKKyAgICAvLyBDb29raWVzIGFy
ZSBub3QgYm91bmQgdG8gdGhlIGRvY3VtZW50LiBUaGVyZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8g
cGFzcworICAgIC8vIGluIHRoZSBkb2N1bWVudCBvYmplY3QgdG8gZmluZCB0aGUgdGFyZ2V0ZWQg
Y29va2llcyBpbiBjb29raWUgbWFuYWdlci4KKyAgICBjb29raWVNYW5hZ2VyKCkucmVtb3ZlQ29v
a2llV2l0aE5hbWUodXJsLCBjb29raWVOYW1lKTsKK30KKworU3RyaW5nIGNvb2tpZVJlcXVlc3RI
ZWFkZXJGaWVsZFZhbHVlKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgS1VSTCAmdXJs
KQoreworICAgIEFTU0VSVChkb2N1bWVudCk7CisKKyAgICBpZiAoIShkb2N1bWVudC0+ZnJhbWUo
KSAmJiBkb2N1bWVudC0+ZnJhbWUoKS0+bG9hZGVyKCkgJiYgZG9jdW1lbnQtPmZyYW1lKCktPmxv
YWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGlmICgh
c3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4oZG9jdW1lbnQtPmZyYW1l
KCktPmxvYWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisgICAgICAgIHJldHVy
biBTdHJpbmcoKTsKKworICAgIHJldHVybiBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2llKHVybCwg
V2l0aEh0dHBPbmx5Q29va2llcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmU0YTgwOTJiNThmOGNiMDM0NWY3Y2MyZTgzNGI4MGRmOGQxMjQxZGUKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4
LCAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICog
Q29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBFTkFCTEVfQ09PS0lFX0RFQlVHIDAKKyNkZWZp
bmUgRU5BQkxFX0NPT0tJRV9TVVBFUl9WRVJCT1NFX0RFQlVHIDAKKyNkZWZpbmUgRU5BQkxFX0NP
T0tJRV9MSU1JVF9ERUJVRyAwCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29r
aWVNYW5hZ2VyLmgiCisKKyNpbmNsdWRlICJDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oIgor
I2luY2x1ZGUgIkNvb2tpZVBhcnNlci5oIgorI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5j
bHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJXZWJT
ZXR0aW5ncy5oIgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUNsaWVudC5oPgorI2luY2x1
ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUV4ZWN1dGFibGVNZXNzYWdlLmg+CisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0
Zm9ybU5hdmlnYXRvckhhbmRsZXIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisjaWYgRU5BQkxFX0NPT0tJRV9ERUJV
RworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxvZy5oPgorI2VuZGlmCisKKyNpZiBFTkFC
TEVfQ09PS0lFX1NVUEVSX1ZFUkJPU0VfREVCVUcKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwg
Li4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbEluZm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBD
b29raWVMb2coZm9ybWF0LCAuLi4pCisjZW5kaWYgLy8gRU5BQkxFX0NPT0tJRV9TVVBFUl9WRVJC
T1NFX0RFQlVHCisKKyNpZiBFTkFCTEVfQ09PS0lFX0xJTUlUX0RFQlVHCisjZGVmaW5lIENvb2tp
ZUxpbWl0TG9nKGZvcm1hdCwgLi4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18p
CisjZWxzZQorI2RlZmluZSBDb29raWVMaW1pdExvZyhmb3JtYXQsIC4uLikKKyNlbmRpZiAvLyBF
TkFCTEVfQ09PS0lFX0xJTUlUX0RFQlVHCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gTWF4
IGNvdW50IGNvbnN0YW50cy4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzX2dsb2JhbE1heENvb2tp
ZUNvdW50ID0gNjAwMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzX21heENvb2tpZUNvdW50UGVy
SG9zdCA9IDYwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfY29va2llc1RvRGVsZXRlV2hlbkxp
bWl0UmVhY2hlZCA9IDYwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfZGVsYXlUb1N0YXJ0Q29v
a2llQ2xlYW51cCA9IDEwOworCitzdGF0aWMgdm9pZCBmbHVzaENvb2tpZXNPbkV4aXQodm9pZCkK
K3sKKyAgICBjb29raWVNYW5hZ2VyKCkuZmx1c2hDb29raWVzVG9CYWNraW5nU3RvcmUoKTsKK30K
KworQ29va2llTWFuYWdlciYgY29va2llTWFuYWdlcigpCit7CisgICAgc3RhdGljIENvb2tpZU1h
bmFnZXIgKmNvb2tpZU1hbmFnZXIgPSAwOworICAgIGlmICghY29va2llTWFuYWdlcikgeworICAg
ICAgICAvLyBPcGVuIHRoZSBjb29raWVKYXIgbm93IGFuZCBnZXQgdGhlIGJhY2tpbmcgc3RvcmUg
Y29va2llcyB0byBmaWxsIHRoZSBtYW5hZ2VyLgorICAgICAgICBjb29raWVNYW5hZ2VyID0gbmV3
IENvb2tpZU1hbmFnZXI7CisgICAgICAgIGNvb2tpZU1hbmFnZXItPm1fY29va2llQmFja2luZ1N0
b3JlLT5vcGVuKGNvb2tpZU1hbmFnZXItPmNvb2tpZUphcigpKTsKKyAgICAgICAgY29va2llTWFu
YWdlci0+Z2V0QmFja2luZ1N0b3JlQ29va2llcygpOworICAgICAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBCYWNraW5nc3RvcmUgbG9hZCBjb21wbGV0ZS5cbiIpOworCisgICAgICAgIGF0
ZXhpdCgmZmx1c2hDb29raWVzT25FeGl0KTsKKyAgICB9CisgICAgcmV0dXJuICpjb29raWVNYW5h
Z2VyOworfQorCitDb29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKCkKKyAgICA6IG1fY291bnQo
MCkKKyAgICAsIG1fcHJpdmF0ZU1vZGUoZmFsc2UpCisgICAgLCBtX3Nob3VsZER1bXBBbGxDb29r
aWVzKGZhbHNlKQorICAgICwgbV9jb29raWVKYXJGaWxlTmFtZShwYXRoQnlBcHBlbmRpbmdDb21w
b25lbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkNsaWVudDo6Z2V0KCktPmdldEFwcGxpY2F0aW9u
RGF0YURpcmVjdG9yeSgpLmNfc3RyKCksICIvY29va2llQ29sbGVjdGlvbi5kYiIpKQorICAgICwg
bV9wb2xpY3koQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeUFsd2F5cykKKyAgICAsIG1fY29va2ll
QmFja2luZ1N0b3JlKENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpjcmVhdGUoKSkKKyAgICAs
IG1fbGltaXRUaW1lcih0aGlzLCAmQ29va2llTWFuYWdlcjo6Y29va2llTGltaXRDbGVhblVwKQor
eworfQorCitDb29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7CisgICAgcmVtb3ZlQWxs
Q29va2llcyhEb05vdFJlbW92ZUZyb21CYWNraW5nU3RvcmUpOworICAgIC8vIEZJWE1FOiBtX21h
bmFnZXJNYXAgYW5kIHRoZSB0b3AgbGF5ZXIgcHJvdG9jb2xNYXBzIGFyZSBub3QgcHJvcGVybHkg
ZGVsZXRlZC4KKyAgICAvLyBEbyBub3QgZGVsZXRlIGFueSBwcm90b2NvbCBtYXBzIHRvIGF2b2lk
IGRvdWJsZS1kZWxldGlvbiBvZiB0aGUgbWFwcyB0aGF0IGFyZQorICAgIC8vIGJlaW5nIHVzZWQg
Zm9yIGJvdGggc2VjdXJlIGFuZCBub24tc2VjdXJlIHByb3RvY29sczsgdGhpcyBsZWFrIGlzIE9L
IHNpbmNlCisgICAgLy8gdGhlcmUncyBub3RoaW5nIGltcG9ydGFudCBpbiB0aGUgaGFzaHRhYmxl
IGRlc3RydWN0b3JzLCBhbmQgdGhlIG1lbW9yeSB3aWxsIGJlIHJlY2xhaW1lZCBvbiBleGl0CisK
KyAgICAvLyBGSVhNRTogQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUgaXMgbm90IGRlbGV0ZWQs
IG9ubHkgZmx1c2hlZAorICAgIC8vIChjdXJyZW50bHkgdGhlIGRlc3RydWN0b3IgaXMgbmV2ZXIg
Y2FsbGVkIHNpbmNlIHRoaXMgY2xhc3MgaXMgYQorICAgIC8vIHNpbmdsZXRvbjsgb24gZXhpdCwg
dGhlIGRiIGlzIGZsdXNoZWQgbWFudWFsbHkuIFRoaXMgY2FsbCBpcyBvbmx5IGhlcmUKKyAgICAv
LyBhcyBhIGZhbGxiYWNrIGluIGNhc2UgdGhpcyBjbGFzcyBpcyBtYWRlIGEgbm9uLXNpbmdsZXRv
bi4KKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+c2VuZENoYW5nZXNUb0RhdGFiYXNlU3luY2hy
b25vdXNseSgpOworfQorCisvLyBTb3J0aW5nIGxvZ2ljIGlzIGJhc2VkIG9uIENvb2tpZSBTcGVj
IFJGQzYyNjUsIHNlY3Rpb24gNS40LjIKK3N0YXRpYyBib29sIGNvb2tpZVNvcnRlcihQYXJzZWRD
b29raWUqIGEsIFBhcnNlZENvb2tpZSogYikKK3sKKyAgICBpZiAoYS0+cGF0aCgpLmxlbmd0aCgp
ID09IGItPnBhdGgoKS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIGEtPmNyZWF0aW9uVGltZSgp
IDw9IGItPmNyZWF0aW9uVGltZSgpOworICAgIHJldHVybiBhLT5wYXRoKCkubGVuZ3RoKCkgPiBi
LT5wYXRoKCkubGVuZ3RoKCk7Cit9CisKKy8vIFJldHVybnMgd2hldGhlciB0aGUgcHJvdG9jb2wg
c3VwcG9ydHMgZG9tYWlucworc3RhdGljIGJvb2wgc2hvdWxkSWdub3JlRG9tYWluKGNvbnN0IFN0
cmluZyBwcm90b2NvbCkKK3sKKyAgICAvLyBpZ25vcmUgZG9tYWluIHNlY3VyaXR5IGZvciBmaWxl
IGFuZCBsb2NhbAorICAgIHJldHVybiBwcm90b2NvbCA9PSAiZmlsZSIgfHwgcHJvdG9jb2wgPT0g
ImxvY2FsIjsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVzKGNvbnN0IEtVUkwm
IHVybCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFn
ZXIgLSBTZXR0aW5nIGNvb2tpZXMiKTsKKyAgICBDb29raWVQYXJzZXIgcGFyc2VyKHVybCk7Cisg
ICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IGNvb2tpZXMgPSBwYXJzZXIucGFyc2UodmFsdWUpOwor
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29raWVzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIFBhcnNlZENvb2tpZSogY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgaWYgKCFzaG91
bGRSZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb29raWUsIHVybCkpIHsKKyAgICAgICAgICAgIEJh
Y2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgdHJlYXRtZW50ID0gbV9wcml2YXRlTW9kZSA/IERvTm90
UmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSA6IFJlbW92ZUZyb21CYWNraW5nU3RvcmU7CisgICAgICAg
ICAgICBjaGVja0FuZFRyZWF0Q29va2llKGNvb2tpZSwgdHJlYXRtZW50KTsKKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBkZWxldGUgY29va2llOworICAgIH0KK30KKworYm9vbCBDb29raWVN
YW5hZ2VyOjpzaG91bGRSZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb25zdCBQYXJzZWRDb29raWUq
IGNvb2tpZSwgY29uc3QgS1VSTCYgdXJsKQoreworICAgIC8vIFdlIGhhdmUgdG8gZGlzYWJsZSB0
aGUgZm9sbG93aW5nIGNoZWNrIGJlY2F1c2Ugc2l0ZXMgbGlrZSBGYWNlYm9vayBhbmQKKyAgICAv
LyBHbWFpbCBjdXJyZW50bHkgZG8gbm90IGZvbGxvdyB0aGUgc3BlYy4KKyNpZiAwCisgICAgLy8g
Q2hlY2sgaWYgcGF0aCBhdHRyaWJ1dGUgaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QgVVJJLgor
ICAgIGlmICghdXJsLnBhdGgoKS5zdGFydHNXaXRoKGNvb2tpZS0+cGF0aCgpKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkNvb2tpZSAlcyBpcyByZWplY3RlZCBiZWNhdXNlIGl0cyBwYXRoIGRvZXMg
bm90IG1hdGggdGhlIFVSTCAlc1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCks
IHVybC5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorI2VuZGlmCisKKyAgICAvLyBpZ25vcmUgZG9tYWluIHNlY3VyaXR5IGlmIHByb3RvY29sIGRv
ZXNuJ3QgaGF2ZSBkb21haW5zCisgICAgaWYgKHNob3VsZElnbm9yZURvbWFpbihjb29raWUtPnBy
b3RvY29sKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZWplY3QgQ29va2ll
IGlmIGRvbWFpbiBpcyBlbXB0eQorICAgIGlmICghY29va2llLT5kb21haW4oKS5sZW5ndGgoKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIWNvb2tpZS0+aGFzRGVmYXVsdERvbWFp
bigpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkb21haW4gY29udGFpbnMgYW4gZW1iZWRk
ZWQgZG90LgorICAgICAgICBpbnQgZG90UG9zaXRpb24gPSBjb29raWUtPmRvbWFpbigpLmZpbmQo
Ii4iLCAxKTsKKyAgICAgICAgaWYgKGRvdFBvc2l0aW9uID09IC0xIHx8IHN0YXRpY19jYXN0PHVu
c2lnbmVkIGludD4oZG90UG9zaXRpb24pID09IGNvb2tpZS0+ZG9tYWluKCkubGVuZ3RoKCkpIHsK
KyAgICAgICAgICAgIExPR19FUlJPUigiQ29va2llICVzIGlzIHJlamVjdGVkIGJlY2F1c2UgaXRz
IGRvbWFpbiBkb2VzIG5vdCBjb250YWluIGFuIGVtYmVkZGVkIGRvdC5cbiIsIGNvb2tpZS0+dG9T
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gVGhlIHJlcXVlc3QgaG9zdCBzaG91bGQgZG9tYWluIG1hdGNo
IHRoZSBEb21haW4gYXR0cmlidXRlLgorICAgIC8vIERvbWFpbiBzdHJpbmcgc3RhcnRzIHdpdGgg
YSBkb3QsIHNvIGEuYi5jb20gc2hvdWxkIGRvbWFpbiBtYXRjaCAuYS5iLmNvbS4KKyAgICAvLyBh
ZGQgYSAiLiIgYXQgYmVnaW5uaW5nIG9mIGhvc3QgbmFtZSwgYmVjYXVzZSBpdCBjYW4gaGFuZGxl
IG1hbnkgY2FzZXMgc3VjaCBhcworICAgIC8vIGEuYi5jb20gbWF0Y2hlcyBiLmNvbSwgYS5iLmNv
bSBtYXRjaGVzIC5CLmNvbSBhbmQgYS5iLmNvbSBtYXRjaGVzIC5BLmIuQ29tCisgICAgLy8gYW5k
IHNvIG9uLgorICAgIFN0cmluZyBob3N0RG9tYWluTmFtZSA9IHVybC5ob3N0KCk7CisgICAgaG9z
dERvbWFpbk5hbWUgPSBob3N0RG9tYWluTmFtZS5zdGFydHNXaXRoKCIuIikgPyBob3N0RG9tYWlu
TmFtZSA6ICIuIiArIGhvc3REb21haW5OYW1lOworICAgIGlmICghaG9zdERvbWFpbk5hbWUuZW5k
c1dpdGgoY29va2llLT5kb21haW4oKSwgZmFsc2UpKSB7CisgICAgICAgIExPR19FUlJPUigiQ29v
a2llICVzIGlzIHJlamVjdGVkIGJlY2F1c2UgaXRzIGRvbWFpbiBkb2VzIG5vdCBkb21haW4gbWF0
Y2ggdGhlIFVSTCAlc1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCksIHVybC5z
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IC8vIFdlIHNob3VsZCBjaGVjayBmb3IgYW4gZW1iZWRkZWQgZG90IGluIHRoZSBwb3J0aW9uIG9m
IHN0cmluZyBpbiB0aGUgaG9zdCBub3QgaW4gdGhlIGRvbWFpbgorICAgIC8vIGJ1dCB0byBtYXRj
aCBmaXJlZm94IGJlaGF2aW91ciB3ZSBkbyBub3QuCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K1N0cmluZyBDb29raWVNYW5hZ2VyOjpnZXRDb29raWUoY29uc3QgS1VSTCYgdXJsLCBDb29raWVG
aWx0ZXIgZmlsdGVyKSBjb25zdAoreworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiByYXdDb29r
aWVzOworICAgIHJhd0Nvb2tpZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzX21heENvb2tpZUNv
dW50UGVySG9zdCk7CisKKyAgICAvLyBSZXRyaWV2ZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1
cmwKKyAgICBnZXRSYXdDb29raWVzKHJhd0Nvb2tpZXMsIHVybCwgZmlsdGVyKTsKKworICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIHRoZXJlIGFyZSAlZCBjb29raWVzIGluIHJhdyBjb29r
aWVzXG4iLCByYXdDb29raWVzLnNpemUoKSk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgY29va2ll
IGhlYWRlciBzdHJpbmcgdXNpbmcgdGhlIHJldHJpZXZlZCBjb29raWVzCisgICAgU3RyaW5nQnVp
bGRlciBjb29raWVTdHJpbmdCdWlsZGVyOworICAgIGNvb2tpZVN0cmluZ0J1aWxkZXIucmVzZXJ2
ZUNhcGFjaXR5KDUxMik7CisgICAgc2l6ZV90IGNvb2tpZVNpemUgPSByYXdDb29raWVzLnNpemUo
KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb2tpZVNpemU7IGkrKykgeworICAgICAg
ICBjb29raWVTdHJpbmdCdWlsZGVyLmFwcGVuZChyYXdDb29raWVzW2ldLT50b05hbWVWYWx1ZVBh
aXIoKSk7CisgICAgICAgIGlmIChpICE9IGNvb2tpZVNpemUtMSkKKyAgICAgICAgICAgIGNvb2tp
ZVN0cmluZ0J1aWxkZXIuYXBwZW5kKCI7ICIpOworICAgIH0KKworICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGNvb2tpZVN0cmluZyBpcyAtICVzXG4iLCBjb29raWVTdHJpbmdCdWlsZGVy
LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gY29va2llU3RyaW5nQnVp
bGRlci50b1N0cmluZygpOworCit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6Z2V0UmF3Q29va2ll
cyhWZWN0b3I8UGFyc2VkQ29va2llKj4gJnN0YWNrT2ZDb29raWVzLCBjb25zdCBLVVJMJiByZXF1
ZXN0VVJMLCBDb29raWVGaWx0ZXIgZmlsdGVyKSBjb25zdAoreworICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGdldFJhd0Nvb2tpZXMgLSBwcm9jZXNzaW5nIHVybCB3aXRoIGRvbWFpbiAt
ICVzICYgcHJvdG9jb2w6ICVzICYgcGF0aDogJXNcbiIsIHJlcXVlc3RVUkwuaG9zdCgpLnV0Zjgo
KS5kYXRhKCksIHJlcXVlc3RVUkwucHJvdG9jb2woKS51dGY4KCkuZGF0YSgpLCByZXF1ZXN0VVJM
LnBhdGgoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGJvb2wgc3BlY2lhbENhc2VGb3JMb2NhbCA9
IChyZXF1ZXN0VVJMLnByb3RvY29sSXMoImxvY2FsIikgfHwgcmVxdWVzdFVSTC5wcm90b2NvbElz
KCJmaWxlIikpICYmIG1fc2hvdWxkRHVtcEFsbENvb2tpZXM7CisgICAgYm9vbCBpc0Nvbm5lY3Rp
b25TZWN1cmUgPSByZXF1ZXN0VVJMLnByb3RvY29sSXMoImh0dHBzIikgfHwgcmVxdWVzdFVSTC5w
cm90b2NvbElzKCJ3c3MiKSB8fCBzcGVjaWFsQ2FzZUZvckxvY2FsOworCisgICAgVmVjdG9yPFBh
cnNlZENvb2tpZSo+IGNvb2tpZUNhbmRpZGF0ZXM7CisgICAgVmVjdG9yPENvb2tpZU1hcCo+IHBy
b3RvY29sc1RvU2VhcmNoOworCisgICAgaWYgKHNwZWNpYWxDYXNlRm9yTG9jYWwpCisgICAgICAg
IGNvcHlWYWx1ZXNUb1ZlY3RvcihtX21hbmFnZXJNYXAsIHByb3RvY29sc1RvU2VhcmNoKTsKKyAg
ICBlbHNlIHsKKyAgICAgICAgcHJvdG9jb2xzVG9TZWFyY2guYXBwZW5kKG1fbWFuYWdlck1hcC5n
ZXQocmVxdWVzdFVSTC5wcm90b2NvbCgpKSk7CisgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIGEg
aGFjayBmb3Igd2Vid29ya3MgYXBwczsgUkZDIDYyNjUgc2F5cyAiQ29va2llcyBkbyBub3QgcHJv
dmlkZSBpc29sYXRpb24gYnkgc2NoZW1lIgorICAgICAgICAvLyBzbyB3ZSBzaG91bGQgbm90IGJl
IGNoZWNraW5nIHByb3RvY29scyBhdCBhbGwuIFNlZSBQUiAxMzU1OTUKKyAgICAgICAgaWYgKG1f
c2hvdWxkRHVtcEFsbENvb2tpZXMpIHsKKyAgICAgICAgICAgIHByb3RvY29sc1RvU2VhcmNoLmFw
cGVuZChtX21hbmFnZXJNYXAuZ2V0KCJmaWxlIikpOworICAgICAgICAgICAgcHJvdG9jb2xzVG9T
ZWFyY2guYXBwZW5kKG1fbWFuYWdlck1hcC5nZXQoImxvY2FsIikpOworICAgICAgIH0KKyAgICB9
CisKKyAgICBWZWN0b3I8U3RyaW5nPiBkZWxpbWl0ZWRIb3N0OworICAgIHJlcXVlc3RVUkwuaG9z
dCgpLmxvd2VyKCkuc3BsaXQoIi4iLCB0cnVlLCBkZWxpbWl0ZWRIb3N0KTsKKworICAgIC8vIEdv
IHRocm91Z2ggYWxsIHRoZSBwcm90b2NvbCB0cmVlcyB0aGF0IHdlIG5lZWQgdG8gc2VhcmNoIGZv
cgorICAgIC8vIGFuZCBnZXQgYWxsIGNvb2tpZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMgZG9t
YWluCisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwcm90b2NvbHNUb1NlYXJjaC5zaXplKCk7
IGsrKykgeworICAgICAgICBDb29raWVNYXAqIGN1cnJlbnRNYXAgPSBwcm90b2NvbHNUb1NlYXJj
aFtrXTsKKworICAgICAgICAvLyBpZiBubyBjb29raWVzIGV4aXN0IGZvciB0aGlzIHByb3RvY29s
LCBicmVhayByaWdodCBhd2F5CisgICAgICAgIGlmICghY3VycmVudE1hcCkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGxvb2tpbmcg
YXQgcHJvdG9jb2wgbWFwICVzIFxuIiwgY3VycmVudE1hcC0+Z2V0TmFtZSgpLnV0ZjgoKS5kYXRh
KCkpOworCisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgbG9jYWwgYW5kIGZpbGVzIC0gYmVj
YXVzZSBXZWJBcHBzIGV4cGVjdCB0byBnZXQgQUxMIGNvb2tpZXMgZnJvbSB0aGUgYmFja2luZy1z
dG9yZSBvbiBsb2NhbCBwcm90b2NvbAorICAgICAgICBpZiAoc3BlY2lhbENhc2VGb3JMb2NhbCkg
eworICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gc3BlY2lhbCBjYXNlIGZp
bmQgaW4gcHJvdG9jb2wgbWFwIC0gJXNcbiIsIGN1cnJlbnRNYXAtPmdldE5hbWUoKS51dGY4KCku
ZGF0YSgpKTsKKyAgICAgICAgICAgIGN1cnJlbnRNYXAtPmdldEFsbENoaWxkQ29va2llcygmY29v
a2llQ2FuZGlkYXRlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHZXQgY29v
a2llcyBmcm9tIHRoZSBudWxsIGRvbWFpbiBtYXAKKyAgICAgICAgICAgIGN1cnJlbnRNYXAtPmdl
dEFsbENvb2tpZXMoJmNvb2tpZUNhbmRpZGF0ZXMpOworCisgICAgICAgICAgICAvLyBHZXQgY29v
a2llcyBmcm9tIHRoZSB2YWxpZCBkb21haW4gbWFwcworICAgICAgICAgICAgaW50IGkgPSBkZWxp
bWl0ZWRIb3N0LnNpemUoKS0xOworICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAg
ICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZpbmRpbmcgJXMgaW4gY3VycmVu
dG1hcFxuIiwgZGVsaW1pdGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAg
ICBjdXJyZW50TWFwID0gY3VycmVudE1hcC0+Z2V0U3ViZG9tYWluTWFwKGRlbGltaXRlZEhvc3Rb
aV0pOworICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgc3ViZG9tYWluL2RvbWFpbiBkb2VzIG5v
dCBleGlzdCBpbiBvdXIgbWFwcGluZyB0aGVuIHdlIHNpbXBseSBleGl0CisgICAgICAgICAgICAg
ICAgaWYgKCFjdXJyZW50TWFwKSB7CisgICAgICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGNhbm5vdCBmaW5kIG5leHQgbWFwIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3Au
XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZvdW5kIHRoZSBtYXAsIGdy
YWJiaW5nIGNvb2tpZXMgZnJvbSB0aGlzIG1hcFxuIik7CisgICAgICAgICAgICAgICAgY3VycmVu
dE1hcC0+Z2V0QWxsQ29va2llcygmY29va2llQ2FuZGlkYXRlcyk7CisgICAgICAgICAgICAgICAg
aS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQ29va2llTG9nKCJD
b29raWVNYW5hZ2VyIC0gdGhlcmUgYXJlICVkIGNvb2tpZXMgaW4gY2FuZGlkYXRlXG4iLCBjb29r
aWVDYW5kaWRhdGVzLnNpemUoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb2tp
ZUNhbmRpZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUg
PSBjb29raWVDYW5kaWRhdGVzW2ldOworCisgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgcGF0
aC1tYXRjaGVzIHJ1bGVzIGluIFJGQzYyNjUsIHNlY3Rpb24gNS4xLjQsCisgICAgICAgIC8vIHdl
IHNob3VsZCBhZGQgYSAnLycgYXQgdGhlIGVuZCBvZiBjb29raWUtcGF0aCBmb3IgY29tcGFyaXNv
biBpZiB0aGUgY29va2llLXBhdGggaXMgbm90IGVuZCB3aXRoICcvJy4KKyAgICAgICAgU3RyaW5n
IHBhdGggPSBjb29raWUtPnBhdGgoKTsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2Vy
IC0gY29tcGFyaW5nIGNvb2tpZSBwYXRoICVzIChsZW4gJWQpIHRvIHJlcXVlc3QgcGF0aCAlcyAo
bGVuICVkKSIsIHBhdGgudXRmOCgpLmRhdGEoKSwgcGF0aC5sZW5ndGgoKSwgcmVxdWVzdFVSTC5w
YXRoKCkudXRmOCgpLmRhdGEoKSwgcGF0aC5sZW5ndGgoKSk7CisgICAgICAgIGlmICghZXF1YWxJ
Z25vcmluZ0Nhc2UocGF0aCwgcmVxdWVzdFVSTC5wYXRoKCkpICYmICFwYXRoLmVuZHNXaXRoKCIv
IiwgZmFsc2UpKQorICAgICAgICAgICAgcGF0aCArPSAiLyI7CisKKyAgICAgICAgLy8gT25seSBz
ZWN1cmUgY29ubmVjdGlvbnMgaGF2ZSBhY2Nlc3MgdG8gc2VjdXJlIGNvb2tpZXMuIFVubGVzcyBz
cGVjaWFsQ2FzZUZvckxvY2FsIGlzIHRydWUKKyAgICAgICAgLy8gR2V0IHRoZSBjb29raWVzIGZp
bHRlcmluZyBvdXQgSHR0cE9ubHkgY29va2llcyBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIChy
ZXF1ZXN0VVJMLnBhdGgoKS5zdGFydHNXaXRoKHBhdGgsIGZhbHNlKSAmJiAoaXNDb25uZWN0aW9u
U2VjdXJlIHx8ICFjb29raWUtPmlzU2VjdXJlKCkpICYmIChmaWx0ZXIgPT0gV2l0aEh0dHBPbmx5
Q29va2llcyB8fCAhY29va2llLT5pc0h0dHBPbmx5KCkpKSB7CisgICAgICAgICAgICBDb29raWVM
b2coIkNvb2tpZU1hbmFnZXIgLSBjb29raWUgY2hvc2VuIC0gJXNcbiIsIGNvb2tpZS0+dG9TdHJp
bmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGNvb2tpZS0+c2V0TGFzdEFjY2Vzc2Vk
KGN1cnJlbnRUaW1lKCkpOworICAgICAgICAgICAgc3RhY2tPZkNvb2tpZXMuYXBwZW5kKGNvb2tp
ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNvcnQoc3RhY2tPZkNvb2tpZXMuYmVn
aW4oKSwgc3RhY2tPZkNvb2tpZXMuZW5kKCksIGNvb2tpZVNvcnRlcik7Cit9CisKK3ZvaWQgQ29v
a2llTWFuYWdlcjo6cmVtb3ZlQWxsQ29va2llcyhCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5IGJh
Y2tpbmdTdG9yZVJlbW92YWwpCit7CisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+Ojpp
dGVyYXRvciBmaXJzdCA9IG1fbWFuYWdlck1hcC5iZWdpbigpOworICAgIEhhc2hNYXA8U3RyaW5n
LCBDb29raWVNYXAqPjo6aXRlcmF0b3IgZW5kID0gbV9tYW5hZ2VyTWFwLmVuZCgpOworICAgIGZv
ciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IGZpcnN0OyBpdCAh
PSBlbmQ7ICsraXQpCisgICAgICAgIGl0LT5zZWNvbmQtPmRlbGV0ZUFsbENvb2tpZXNBbmREb21h
aW5zKCk7CisKKyAgICBpZiAoYmFja2luZ1N0b3JlUmVtb3ZhbCA9PSBSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlKQorICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+cmVtb3ZlQWxsKCk7CisgICAg
bV9jb3VudCA9IDA7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0Q29va2llSmFyKGNvbnN0
IGNoYXIqIGZpbGVOYW1lKQoreworICAgIG1fY29va2llSmFyRmlsZU5hbWUgPSBTdHJpbmcoZmls
ZU5hbWUpOworICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5vcGVuKG1fY29va2llSmFyRmlsZU5h
bWUpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmNoZWNrQW5kVHJlYXRDb29raWUoUGFyc2Vk
Q29va2llKiBjYW5kaWRhdGVDb29raWUsIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRv
QmFja2luZ1N0b3JlKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGNoZWNrQW5k
VHJlYXRDb29raWUgLSBwcm9jZXNzaW5nIHVybCB3aXRoIGRvbWFpbiAtICVzICYgcHJvdG9jb2wg
JXNcbiIsIGNhbmRpZGF0ZUNvb2tpZS0+ZG9tYWluKCkudXRmOCgpLmRhdGEoKSwgY2FuZGlkYXRl
Q29va2llLT5wcm90b2NvbCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgY29uc3QgYm9vbCBpZ25v
cmVEb21haW4gPSBzaG91bGRJZ25vcmVEb21haW4oY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgp
KTsKKworICAgIC8vIERldGVybWluZSB3aGljaCBwcm90b2NvbCB0cmVlIHRvIGFkZCB0aGUgY29v
a2llIHRvLiBDcmVhdGUgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBDb29raWVNYXAqIGN1ck1hcCA9
IDA7CisgICAgaWYgKG1fbWFuYWdlck1hcC5jb250YWlucyhjYW5kaWRhdGVDb29raWUtPnByb3Rv
Y29sKCkpKQorICAgICAgICBjdXJNYXAgPSBtX21hbmFnZXJNYXAuZ2V0KGNhbmRpZGF0ZUNvb2tp
ZS0+cHJvdG9jb2woKSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGEg
c2VjdXJlIHZlcnNpb24sIGlmIGl0IGlzLCBsaW5rIGl0IHRvIHRoZSBub24tc2VjdXJlIHZlcnNp
b24KKyAgICAgICAgLy8gTGluayBjdXJNYXAgdG8gdGhlIG5ldyBwcm90b2NvbCBhcyB3ZWxsIGFz
IHRoZSBvbGQgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgaWYgKGNhbmRpZGF0ZUNv
b2tpZS0+cHJvdG9jb2woKSA9PSAiaHR0cHMiKSB7CisgICAgICAgICAgICBjdXJNYXAgPSBtX21h
bmFnZXJNYXAuZ2V0KCJodHRwIik7CisgICAgICAgICAgICBpZiAoIWN1ck1hcCkgeworICAgICAg
ICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29raWVNYXAoImh0dHAiKTsKKyAgICAgICAgICAgICAg
ICBtX21hbmFnZXJNYXAuYWRkKCJodHRwIiwgY3VyTWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIGlmIChjYW5kaWRhdGVDb29raWUtPnByb3RvY29sKCkgPT0gIndzcyIpIHsKKyAg
ICAgICAgICAgIGN1ck1hcCA9IG1fbWFuYWdlck1hcC5nZXQoIndzIik7CisgICAgICAgICAgICBp
ZiAoIWN1ck1hcCkgeworICAgICAgICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29raWVNYXAoIndz
Iik7CisgICAgICAgICAgICAgICAgbV9tYW5hZ2VyTWFwLmFkZCgid3MiLCBjdXJNYXApOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29r
aWVNYXAoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpKTsKKworICAgICAgICBDb29raWVMb2co
IkNvb2tpZU1hbmFnZXIgLSBhZGRpbmcgcHJvdG9jb2wgY29va2llbWFwIC0gJXNcbiIsIGN1ck1h
cC0+Z2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgIG1fbWFuYWdlck1hcC5hZGQo
Y2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpLCBjdXJNYXApOworICAgIH0KKworICAgIC8vIElm
IHByb3RvY29sIHN1cHBvcnQgZG9tYWluLCB3ZSBoYXZlIHRvIHRyYXZlcnNlIHRoZSBkb21haW4g
dHJlZSB0byBmaW5kIHRoZSByaWdodAorICAgIC8vIGNvb2tpZU1hcCB0byBoYW5kbGUgd2l0aAor
ICAgIGlmICghaWdub3JlRG9tYWluKQorICAgICAgICBjdXJNYXAgPSBmaW5kT3JDcmVhdGVDb29r
aWVNYXAoY3VyTWFwLCBjYW5kaWRhdGVDb29raWUtPmRvbWFpbigpLCBjYW5kaWRhdGVDb29raWUt
Pmhhc0V4cGlyZWQoKSk7CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBwcm9wZXIgbWFw
IGZvciB0aGlzIGNvb2tpZSwgd2UgY2FuIG1vZGlmeSBpdAorICAgIC8vIElmIGNvb2tpZSBkb2Vz
IG5vdCBleGlzdCBhbmQgaGFzIGV4cGlyZWQsIGRlbGV0ZSBpdAorICAgIC8vIElmIGNvb2tpZSBl
eGlzdHMgYW5kIGl0IGhhcyBleHBpcmVkLCBzbyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIHRoZSBt
YXAsIGlmIG5vdCB1cGRhdGUgaXQKKyAgICAvLyBJZiBjb29raWUgZXhwaXJlZCBhbmQgY2FtZSBm
cm9tIHRoZSBCYWNraW5nU3RvcmUgKHRoZXJlZm9yZSBkb2VzIG5vdCBleGlzdCksIHdlIGhhdmUg
dG8gcmVtb3ZlIGZyb20gZGF0YWJhc2UKKyAgICAvLyBJZiBjb29raWUgZG9lcyBub3QgZXhpc3Qg
JiBpdCdzIHZhbGlkLCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgbWFwCisKKyAgICBpZiAoY2FuZGlk
YXRlQ29va2llLT5oYXNFeHBpcmVkKCkgfHwgY2FuZGlkYXRlQ29va2llLT5pc0ZvcmNlRXhwaXJl
ZCgpKSB7CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZ2V0QmFja2luZ1N0b3JlQ29va2ll
cygpIHRvIGNhdGNoIGV4cGlyZWQgY29va2llcworICAgICAgICBpZiAocG9zdFRvQmFja2luZ1N0
b3JlID09IEJhY2tpbmdTdG9yZUNvb2tpZUVudHJ5KQorICAgICAgICAgICAgbV9jb29raWVCYWNr
aW5nU3RvcmUtPnJlbW92ZShjYW5kaWRhdGVDb29raWUpOworICAgICAgICBlbHNlIGlmIChjdXJN
YXApIHsKKyAgICAgICAgICAgIGJvb2wgY29va2llQWxyZWFkeUV4aXN0cyA9IGN1ck1hcC0+ZXhp
c3RzQ29va2llKGNhbmRpZGF0ZUNvb2tpZSk7CisgICAgICAgICAgICBpZiAoY29va2llQWxyZWFk
eUV4aXN0cykgeworICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGV4
cGlyZWQgY29va2llIGV4aXN0cyBpbiBtZW1vcnkiKTsKKyAgICAgICAgICAgICAgICBQYXJzZWRD
b29raWUqIGV4cGlyZWQgPSBjdXJNYXAtPnJlbW92ZUNvb2tpZShjYW5kaWRhdGVDb29raWUpOwor
ICAgICAgICAgICAgICAgIC8vIENvb2tpZSBpcyB1c2VsZXNzLCBSZW1vdmUgdGhlIGNvb2tpZSBm
cm9tIHRoZSBiYWNraW5nc3RvcmUgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgLy8gQmFj
a3VwIGNoZWNrIGZvciBCYWNraW5nU3RvcmVDb29raWVFbnRyeSBpbmNhc2Ugc29tZW9uZSBpbmNv
cnJlY3RseSB1c2VzIHRoaXMgZW51bQorICAgICAgICAgICAgICAgIGlmIChwb3N0VG9CYWNraW5n
U3RvcmUgIT0gQmFja2luZ1N0b3JlQ29va2llRW50cnkgJiYgIWV4cGlyZWQtPmlzU2Vzc2lvbigp
KSB7CisgICAgICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGV4cGly
ZWQgY29va2llIGlzIG5vbnNlc3Npb24sIGRlbGV0aW5nIGZyb20gZGIiKTsKKyAgICAgICAgICAg
ICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJlbW92ZShleHBpcmVkKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIGV4cGlyZWQ7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZGVsZXRlIGNhbmRpZGF0ZUNvb2tpZTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoY3VyTWFwKTsKKyAgICAgICAgYm9vbCBjb29raWVB
bHJlYWR5RXhpc3RzID0gY3VyTWFwLT5leGlzdHNDb29raWUoY2FuZGlkYXRlQ29va2llKTsKKyAg
ICAgICAgaWYgKGNvb2tpZUFscmVhZHlFeGlzdHMpCisgICAgICAgICAgICB1cGRhdGUoY3VyTWFw
LCBjYW5kaWRhdGVDb29raWUsIHBvc3RUb0JhY2tpbmdTdG9yZSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGFkZENvb2tpZVRvTWFwKGN1ck1hcCwgY2FuZGlkYXRlQ29va2llLCBwb3N0VG9C
YWNraW5nU3RvcmUpOworICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjphZGRDb29raWVU
b01hcChDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBjYW5kaWRhdGVDb29raWUs
IEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRvQmFja2luZ1N0b3JlKQoreworICAgIFBh
cnNlZENvb2tpZSogb2xkZXN0Q29va2llID0gMDsKKyAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5v
dCByZWFjaGVkIHRoZSBwZXIgY29va2llIGRvbWFpbiBsaW1pdC4KKyAgICAvLyBJZiB0aGF0IGlz
IG5vdCB0cnVlLCB3ZSBjaGVjayBpZiB0aGUgZ2xvYmFsIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQg
aWYgYmFja2luZ3N0b3JlIG1vZGUgaXMgb24KKyAgICAvLyBUd28gcG9pbnRzOgorICAgIC8vIDEp
IFdlIG9ubHkgZG8gYSBnbG9iYWwgY2hlY2sgaWYgYmFja2luZ3N0b3JlIG1vZGUgaXMgb24gYmVj
YXVzZSB0aGUgZ2xvYmFsIGNvb2tpZSBsaW1pdCBvbmx5CisgICAgLy8gICAgY291bnRzIHNlc3Np
b24gY29va2llcyB0aGF0IGFyZSBzYXZlZCBpbiB0aGUgZGF0YWJhc2UuIElmIHRoZSB1c2VyIGdv
ZXMgb3ZlciB0aGUgbGltaXQKKyAgICAvLyAgICB3aGVuIHRoZXkgYXJlIGluIHByaXZhdGUgbW9k
ZSwgd2Uga25vdyB0aGF0IHRoZSB0b3RhbCBjb29raWUgbGltaXQgd2lsbCBiZSB1bmRlciB0aGUg
bGltaXQKKyAgICAvLyAgICBvbmNlIHRoZSB1c2VyIGdvZXMgYmFjayB0byBub3JtYWwgbW9kZSAo
bWVtb3J5IGRlbGV0ZWQgYW5kIHJlbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlKQorICAgIC8vIDIp
IFdlIHVzZSBlbHNlIGlmIGZvciB0aGlzIHN0YXRlbWVudCBiZWNhdXNlIGlmIHdlIHJlbW92ZSBh
IGNvb2tpZSBpbiB0aGUgMXN0IHN0YXRlbWVudAorICAgIC8vICAgIHRoZW4gaXQgbWVhbnMgdGhl
IGdsb2JhbCBjb3VudCB3aWxsIG5ldmVyIGV4Y2VlZCB0aGUgbGltaXQKKworICAgIENvb2tpZUxp
bWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gbG9jYWwgY291bnQ6ICVkICBnbG9iYWwgY291bnQ6ICVk
IiwgdGFyZ2V0TWFwLT5jb3VudCgpLCBtX2NvdW50KTsKKyAgICBpZiAodGFyZ2V0TWFwLT5jb3Vu
dCgpID49IHNfbWF4Q29va2llQ291bnRQZXJIb3N0KSB7CisgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGRlbGV0aW5nIG9sZGVzdCBjb29raWUgZnJvbSB0aGlzIG1hcCBkdWUgdG8g
ZG9tYWluIGNvdW50LlxuIik7CisgICAgICAgIG9sZGVzdENvb2tpZSA9IHRhcmdldE1hcC0+cmVt
b3ZlT2xkZXN0Q29va2llKCk7CisgICAgfSBlbHNlIGlmIChtX2NvdW50ID49IHNfZ2xvYmFsTWF4
Q29va2llQ291bnQgJiYgKHBvc3RUb0JhY2tpbmdTdG9yZSAhPSBEb05vdFJlbW92ZUZyb21CYWNr
aW5nU3RvcmUpKSB7CisgICAgICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gR2xv
YmFsIGxpbWl0IHJlYWNoZWQsIGluaXRpYXRlIGNvb2tpZSBsaW1pdCBjbGVhbiB1cC4iKTsKKyAg
ICAgICAgaW5pdGlhdGVDb29raWVMaW1pdENsZWFuVXAoKTsKKyAgICB9CisKKyAgICBDb29raWVM
b2coIkNvb2tpZU1hbmFnZXIgLSBhZGRpbmcgbmV3IGNvb2tpZSAtICVzLlxuIiwgY2FuZGlkYXRl
Q29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgdGFyZ2V0TWFwLT5hZGRD
b29raWUoY2FuZGlkYXRlQ29va2llKTsKKworICAgIC8vIE9ubHkgYWRkIG5vbiBzZXNzaW9uIGNv
b2tpZSB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgICBpZiAocG9zdFRvQmFja2luZ1N0b3JlID09
IFJlbW92ZUZyb21CYWNraW5nU3RvcmUpIHsKKyAgICAgICAgaWYgKG9sZGVzdENvb2tpZSAmJiAh
b2xkZXN0Q29va2llLT5pc1Nlc3Npb24oKSkgeworICAgICAgICAgICAgQ29va2llTG9nKCJDb29r
aWVNYW5hZ2VyIC0gb2xkZXN0Q29va2llIGV4aXN0cywgZGVsZXRpbmcgaXQgZnJvbSBiYWNraW5n
c3RvcmUgYW5kIGRlc3RydWN0aW5nLlxuIik7CisgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdT
dG9yZS0+cmVtb3ZlKG9sZGVzdENvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjYW5k
aWRhdGVDb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3Rv
cmUtPmluc2VydChjYW5kaWRhdGVDb29raWUpOworICAgIH0KKyAgICBpZiAob2xkZXN0Q29va2ll
KQorICAgICAgICBkZWxldGUgb2xkZXN0Q29va2llOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6
OnVwZGF0ZShDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBuZXdDb29raWUsIEJh
Y2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRvQmFja2luZ1N0b3JlKQoreworICAgIC8vIElm
IG9sZCBjb29raWUgaXMgbm9uLXNlc3Npb24gYW5kIG5ldyBvbmUgaXMsIHdlIGhhdmUgdG8gZGVs
ZXRlIGl0IGZyb20gYmFja2luZ3N0b3JlCisgICAgLy8gSWYgbmV3IGNvb2tpZSBpcyBub24tc2Vz
c2lvbiBhbmQgb2xkIG9uZSBpcywgd2UgaGF2ZSB0byBhZGQgaXQgdG8gYmFja2luZ3N0b3JlCisg
ICAgLy8gSWYgYm90aCBzZXNzaW9ucyBhcmUgbm9uLXNlc3Npb24sIHRoZW4gd2UgdXBkYXRlIGl0
IGluIHRoZSBiYWNraW5nc3RvcmUKKworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIHVw
ZGF0aW5nIG5ldyBjb29raWUgLSAlcy5cbiIsIG5ld0Nvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCku
ZGF0YSgpKTsKKworICAgIFBhcnNlZENvb2tpZSogb2xkQ29va2llID0gdGFyZ2V0TWFwLT51cGRh
dGVDb29raWUobmV3Q29va2llKTsKKworICAgIEFTU0VSVChvbGRDb29raWUpOworCisgICAgaWYg
KHBvc3RUb0JhY2tpbmdTdG9yZSA9PSBSZW1vdmVGcm9tQmFja2luZ1N0b3JlKSB7CisgICAgICAg
IGJvb2wgbmV3SXNTZXNzaW9uID0gbmV3Q29va2llLT5pc1Nlc3Npb24oKTsKKyAgICAgICAgYm9v
bCBvbGRJc1Nlc3Npb24gPSBvbGRDb29raWUtPmlzU2Vzc2lvbigpOworICAgICAgICBpZiAoIW5l
d0lzU2Vzc2lvbiAmJiAhb2xkSXNTZXNzaW9uKQorICAgICAgICAgICAgbV9jb29raWVCYWNraW5n
U3RvcmUtPnVwZGF0ZShuZXdDb29raWUpOworICAgICAgICBlbHNlIGlmIChuZXdJc1Nlc3Npb24g
JiYgIW9sZElzU2Vzc2lvbikgeworICAgICAgICAgICAgLy8gTXVzdCBtYW51YWxseSBkZWNyZWFz
ZSB0aGUgY291bnRlciBiZWNhdXNlIGl0IHdhcyBub3QgY291bnRlZCB3aGVuCisgICAgICAgICAg
ICAvLyB0aGUgY29va2llIHdhcyByZW1vdmVkIGluIGNvb2tpZU1hcC4KKyAgICAgICAgICAgIHJl
bW92ZWRDb29raWUoKTsKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5yZW1vdmUo
b2xkQ29va2llKTsKKyAgICAgICAgfSBlbHNlIGlmICghbmV3SXNTZXNzaW9uICYmIG9sZElzU2Vz
c2lvbikgeworICAgICAgICAgICAgLy8gTXVzdCBtYW51YWxseSBpbmNyZWFzZSB0aGUgY291bnRl
ciBiZWNhdXNlIGl0IHdhcyBub3QgY291bnRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgY29v
a2llIHdhcyBhZGRlZCBpbiBjb29raWVNYXAuCisgICAgICAgICAgICBhZGRlZENvb2tpZSgpOwor
ICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmluc2VydChuZXdDb29raWUpOworICAg
ICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBvbGRDb29raWU7Cit9CisKK3ZvaWQgQ29va2llTWFu
YWdlcjo6Z2V0QmFja2luZ1N0b3JlQ29va2llcygpCit7CisgICAgLy8gVGhpcyBtZXRob2Qgc2hv
dWxkIGJlIGNhbGxlZCBqdXN0IGFmdGVyIGhhdmluZyBjcmVhdGVkIHRoZSBjb29raWVNYW5hZ2Vy
CisgICAgLy8gTkVWRVIgYWZ0ZXJ3YXJkcyEKKyAgICBBU1NFUlQoIW1fY291bnQpOworCisgICAg
VmVjdG9yPFBhcnNlZENvb2tpZSo+IGNvb2tpZXM7CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUt
PmdldENvb2tpZXNGcm9tRGF0YWJhc2UoY29va2llcyk7CisgICAgQ29va2llTG9nKCJDb29raWVN
YW5hZ2VyIC0gQmFja2luZ3N0b3JlIGhhcyAlZCBjb29raWVzLCBsb2FkaW5nIHRoZW0gaW4gbWVt
b3J5IG5vdyIsIGNvb2tpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNv
b2tpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBj
b29raWVzW2ldOworICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKG5ld0Nvb2tpZSwgQmFja2lu
Z1N0b3JlQ29va2llRW50cnkpOworICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRQ
cml2YXRlTW9kZShjb25zdCBib29sIG1vZGUpCit7CisgICAgaWYgKG1fcHJpdmF0ZU1vZGUgPT0g
bW9kZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlTW9kZSA9IG1vZGU7CisgICAg
aWYgKCFtb2RlKSB7CisgICAgICAgIHJlbW92ZUFsbENvb2tpZXMoRG9Ob3RSZW1vdmVGcm9tQmFj
a2luZ1N0b3JlKTsKKyAgICAgICAgZ2V0QmFja2luZ1N0b3JlQ29va2llcygpOworICAgIH0KK30K
KworQ29va2llTWFwKiBDb29raWVNYW5hZ2VyOjpmaW5kT3JDcmVhdGVDb29raWVNYXAoQ29va2ll
TWFwKiBwcm90b2NvbE1hcCwgY29uc3QgU3RyaW5nJiBkb21haW4sIGJvb2wgZmluZE9ubHkpCit7
CisgICAgLy8gRXhwbG9kZSB0aGUgZG9tYWluIHdpdGggdGhlICcuJyBkZWxpbWl0ZXIKKyAgICBW
ZWN0b3I8U3RyaW5nPiBkZWxpbWl0ZWRIb3N0OworICAgIGRvbWFpbi5zcGxpdCgiLiIsIGRlbGlt
aXRlZEhvc3QpOworCisgICAgQ29va2llTWFwKiBjdXJNYXAgPSBwcm90b2NvbE1hcDsKKyAgICBz
aXplX3QgaG9zdFNpemUgPSBkZWxpbWl0ZWRIb3N0LnNpemUoKTsKKworICAgIENvb2tpZUxvZygi
Q29va2llTWFuYWdlciAtIGxvb2tpbmcgYXQgcHJvdG9jb2wgbWFwICVzIFxuIiwgcHJvdG9jb2xN
YXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIC8vIEZpbmQgJiBjcmVhdGUgbmVj
ZXNzYXJ5IENvb2tpZU1hcHMgYnkgdHJhdmVyc2luZyBkb3duIHRoZSBkb21haW4gdHJlZQorICAg
IC8vIEVhY2ggQ29va2llTWFwIHJlcHJlc2VudCBhIHN1YnNlY3Rpb24gb2YgdGhlIGRvbWFpbiwg
ZGVsaW1pdGVkIGJ5ICIuIgorICAgIGludCBpID0gaG9zdFNpemUgLSAxOworICAgIHdoaWxlIChp
ID49IDApIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZmluZGluZyAlcyBp
biBjdXJyZW50bWFwXG4iLCBkZWxpbWl0ZWRIb3N0W2ldLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICBDb29raWVNYXAqIG5leHRNYXAgPSBjdXJNYXAtPmdldFN1YmRvbWFpbk1hcChkZWxpbWl0ZWRI
b3N0W2ldKTsKKyAgICAgICAgaWYgKCFuZXh0TWFwKSB7CisgICAgICAgICAgICBDb29raWVMb2co
IkNvb2tpZU1hbmFnZXIgLSBjYW5ub3QgZmluZCBtYXBcbiIpOworICAgICAgICAgICAgaWYgKGZp
bmRPbmx5KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gY3JlYXRpbmcgJXMgaW4gY3VycmVudG1hcCAlc1xuIiwgZGVsaW1p
dGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpLCBjdXJNYXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIG5leHRNYXAgPSBuZXcgQ29va2llTWFwKGRlbGltaXRlZEhvc3RbaV0p
OworICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gYWRkaW5nIHN1YmRvbWFp
biB0byBtYXBcbiIpOworICAgICAgICAgICAgY3VyTWFwLT5hZGRTdWJkb21haW5NYXAoZGVsaW1p
dGVkSG9zdFtpXSwgbmV4dE1hcCk7CisgICAgICAgIH0KKyAgICAgICAgY3VyTWFwID0gbmV4dE1h
cDsKKyAgICAgICAgaS0tOworICAgIH0KKyAgICByZXR1cm4gY3VyTWFwOworfQorCisKK3ZvaWQg
Q29va2llTWFuYWdlcjo6cmVtb3ZlQ29va2llV2l0aE5hbWUoY29uc3QgS1VSTCYgdXJsLCBjb25z
dCBTdHJpbmcmIGNvb2tpZU5hbWUpCit7CisgICAgLy8gV2UgZ2V0IGFsbCBjb29raWVzIGZyb20g
YWxsIGRvbWFpbnMgdGhhdCBkb21haW4gbWF0Y2hlcyB0aGUgcmVxdWVzdCBkb21haW4KKyAgICAv
LyBhbmQgZGVsZXRlIGFueSBjb29raWVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRoYXQgcGF0
aCBtYXRjaGVzIHRoZSByZXF1ZXN0IHBhdGgKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4gcmVz
dWx0czsKKyAgICBnZXRSYXdDb29raWVzKHJlc3VsdHMsIHVybCwgV2l0aEh0dHBPbmx5Q29va2ll
cyk7CisgICAgLy8gRGVsZXRlIHRoZSBjb29raWVzIHRoYXQgcGF0aCBtYXRjaGVzIHRoZSByZXF1
ZXN0IHBhdGgKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKysp
IHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUgPSByZXN1bHRzW2ldOworICAgICAgICBp
ZiAoIWVxdWFsSWdub3JpbmdDYXNlKGNvb2tpZS0+bmFtZSgpLCBjb29raWVOYW1lKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodXJsLnBhdGgoKS5zdGFydHNXaXRoKGNvb2tp
ZS0+cGF0aCgpLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGNvb2tpZS0+Zm9yY2VFeHBpcmUoKTsK
KyAgICAgICAgICAgIGNoZWNrQW5kVHJlYXRDb29raWUoY29va2llLCBSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjppbml0
aWF0ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpCit7CisgICAgaWYgKCFtX2xpbWl0VGltZXIuaXNBY3Rp
dmUoKSkgeworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBTdGFydGluZyBhIHRp
bWVyIGZvciBjb29raWUgY2xlYW51cCIpOworICAgICAgICBtX2xpbWl0VGltZXIuc3RhcnRPbmVT
aG90KHNfZGVsYXlUb1N0YXJ0Q29va2llQ2xlYW51cCk7CisgICAgfSBlbHNlIHsKKyNpZiAhTkRF
QlVHCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIENvb2tpZSBjbGVhbnVwIHRp
bWVyIGFscmVhZHkgcnVubmluZyIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIENvb2tpZU1h
bmFnZXI6OmNvb2tpZUxpbWl0Q2xlYW5VcChUaW1lcjxDb29raWVNYW5hZ2VyPiogdGltZXIpCit7
CisgICAgQVNTRVJUX1VOVVNFRCh0aW1lciwgdGltZXIgPT0gJm1fbGltaXRUaW1lcik7CisKKyAg
ICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIFN0YXJ0aW5nIGNvb2tpZSBjbGVhbiB1
cCIpOworCisgICAgc2l6ZV90IG51bWJlck9mQ29va2llc092ZXJMaW1pdCA9IChtX2NvdW50ID4g
c19nbG9iYWxNYXhDb29raWVDb3VudCkgPyBtX2NvdW50IC0gc19nbG9iYWxNYXhDb29raWVDb3Vu
dCA6IDA7CisgICAgc2l6ZV90IGFtb3VudFRvRGVsZXRlID0gc19jb29raWVzVG9EZWxldGVXaGVu
TGltaXRSZWFjaGVkICsgbnVtYmVyT2ZDb29raWVzT3ZlckxpbWl0OworCisgICAgQ29va2llTGlt
aXRMb2coIkNvb2tpZU1hbmFnZXIgLSBFeGNlc3M6ICVkICBBbW91bnQgdG8gRGVsZXRlOiAlZCIs
IG51bWJlck9mQ29va2llc092ZXJMaW1pdCwgYW1vdW50VG9EZWxldGUpOworCisgICAgLy8gQ2Fs
bCB0aGUgZGF0YWJhc2UgdG8gZGVsZXRlICdhbW91bnRUb0RlbGV0ZScgb2YgY29va2llcworICAg
IFZlY3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVzVG9EZWxldGU7CisgICAgY29va2llc1RvRGVs
ZXRlLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoYW1vdW50VG9EZWxldGUpOworCisgICAgQ29va2ll
TGltaXRMb2coIkNvb2tpZU1hbmFnZXIgLSBDYWxsaW5nIGRhdGFiYXNlIHRvIGNsZWFuIHVwIik7
CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmdldENvb2tpZXNGcm9tRGF0YWJhc2UoY29va2ll
c1RvRGVsZXRlLCBhbW91bnRUb0RlbGV0ZSk7CisKKyAgICAvLyBDb29raWVzIGFyZSBvcmRlcmVk
IGluIEFTQyBvcmRlciBieSBsYXN0QWNjZXNzZWQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGFtb3VudFRvRGVsZXRlOyArK2kpIHsKKyAgICAgICAgLy8gRXhwaXJlIHRoZW0gYW5kIGNhbGwg
Y2hlY2thbmR0cmVhdCB0byBkZWxldGUgdGhlbSBmcm9tIG1lbW9yeSBhbmQgZGF0YWJhc2UKKyAg
ICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBjb29raWVzVG9EZWxldGVbaV07CisgICAg
ICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gRXhwaXJlIGNvb2tpZTogJXMgYW5k
IGRlbGV0ZSIsIG5ld0Nvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAg
bmV3Q29va2llLT5mb3JjZUV4cGlyZSgpOworICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKG5l
d0Nvb2tpZSwgUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSk7CisgICAgfQorCisgICAgQ29va2llTGlt
aXRMb2coIkNvb2tpZU1hbmFnZXIgLSBDb29raWUgY2xlYW4gdXAgY29tcGxldGUuIik7Cit9CisK
K3ZvaWQgQ29va2llTWFuYWdlcjo6Zmx1c2hDb29raWVzVG9CYWNraW5nU3RvcmUoKQoreworICAg
IENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlIHN0
YXJ0aW5nLlxuIik7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBzaHV0ZG93biwgc28gd2Ug
bmVlZCB0byBiZSBzdXJlIHRoZSBPUyBkb2Vzbid0IGtpbGwgdXMgYmVmb3JlIHRoZSBkYiB3cml0
ZSBmaW5pc2hlcy4KKyAgICAvLyBPbmNlIHNob3VsZCBiZSBlbm91Z2ggc2luY2UgdGhpcyBleHRl
bmRzIHRlcmltaW5hdGlvbiBieSAyIHNlY29uZHMuCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
Ok5hdmlnYXRvckhhbmRsZXI6OnNlbmRFeHRlbmRUZXJtaW5hdGUoKTsKKyAgICBtX2Nvb2tpZUJh
Y2tpbmdTdG9yZS0+c2VuZENoYW5nZXNUb0RhdGFiYXNlU3luY2hyb25vdXNseSgpOworICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlIGZpbmlz
aGVkLlxuIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDQ5
NmE3NDdjNWE5Nzk3ZTA1NDE2YzY5ZDZlOTlmYTJiYmUyMDliYQotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oCkBAIC0w
LDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEp1bGllbiBDaGFm
ZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEw
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZpbmUgQ29va2llTWFuYWdlcl9oCisKKyNpbmNsdWRl
ICJDb29raWVNYXAuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1l
c3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsKK2NsYXNzIEtVUkw7CisKK2VudW0gQmFj
a2luZ1N0b3JlUmVtb3ZhbFBvbGljeSB7CisgICAgUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSwKKyAg
ICBCYWNraW5nU3RvcmVDb29raWVFbnRyeSwKKyAgICBEb05vdFJlbW92ZUZyb21CYWNraW5nU3Rv
cmUKK307CisKK2VudW0gQ29va2llRmlsdGVyIHsKKyAgICBOb0h0dHBPbmx5Q29va2llLAorICAg
IFdpdGhIdHRwT25seUNvb2tpZXMsCit9OworCitlbnVtIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xp
Y3kgeworICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lBbHdheXMsCisgICAgQ29va2llU3Rv
cmFnZUFjY2VwdFBvbGljeU5ldmVyLAorICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lPbmx5
RnJvbU1haW5Eb2N1bWVudERvbWFpbgorfTsKKworLyoKKyAgKiBUaGUgQ29va2llTWFuYWdlciBj
bGFzcyBpcyBhIHNpbmdsZXRvbiBjbGFzcyB0aGF0IGhhbmRsZXMgYW5kIHNlbGVjdGl2ZWx5IHBl
cnNpc3RzCisgICogaW5jb21pbmcgY29va2llcy4gVGhpcyBjbGFzcyBjb250YWlucyBhIHRyZWUg
b2YgZG9tYWlucyBmb3IgcXVpY2tlcgorICAqIGNvb2tpZSBkb21haW4gbG9va3VwLiBUaGUgdG9w
IG9mIHRoZSB0cmVlIHJlcHJlc2VudHMgYSBudWxsIHZhbHVlIGZvciBhIG51bGwgZG9tYWluLgor
ICAqIFRoZSBudWxsIGRvbWFpbiBjb250YWlucyByZWZlcmVuY2VzIHRvIHRvcCBsZXZlbCBkb21h
aW5zIGFuZCBlYWNoIG5vZGUgYmVsb3cKKyAgKiByZXByZXNlbnRzIGEgc3ViLXNlY3Rpb24gb2Yg
YSBkb21haW4sIGRlbGltaXRlZCBieSAiLiIKKyAgKgorICAqIElmIGEgY29va2llIGhhcyBhIGRv
bWFpbiAiYS5iLmNvbSIsIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBub2RlIG5hbWVkICJhIiBp
biB0aGlzIHRyZWUuCisgICogaW4gdGhlIGJyYW5jaCAiIi0+ImNvbSItPiJiIi0+ImEiCisgICoK
KyAgKiBDb29raWUgc3BlY3MgZm9sbG93IHRoZSBSRkMgNjI2NSBzcGVjIHNoZWV0LgorICAqIGh0
dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUKKyAgKi8KKworY2xhc3MgQ29va2llTWFu
YWdlcjogcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2Ugewor
cHVibGljOgorICAgIGJvb2wgY2FuTG9jYWxBY2Nlc3NBbGxDb29raWVzKCkgY29uc3QgeyByZXR1
cm4gbV9zaG91bGREdW1wQWxsQ29va2llczsgfQorICAgIHZvaWQgc2V0Q2FuTG9jYWxBY2Nlc3NB
bGxDb29raWVzKGJvb2wgZW5hYmxlZCkgeyBtX3Nob3VsZER1bXBBbGxDb29raWVzID0gZW5hYmxl
ZDsgfQorCisgICAgdm9pZCBzZXRDb29raWVzKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHZh
bHVlKTsKKworICAgIHZvaWQgcmVtb3ZlQWxsQ29va2llcyhCYWNraW5nU3RvcmVSZW1vdmFsUG9s
aWN5KTsKKyAgICB2b2lkIHJlbW92ZUNvb2tpZVdpdGhOYW1lKGNvbnN0IEtVUkwmLCBjb25zdCBT
dHJpbmcmIGNvb2tpZU5hbWUpOworCisgICAgdW5zaWduZWQgc2hvcnQgY29va2llc0NvdW50KCkg
Y29uc3QgeyByZXR1cm4gbV9jb3VudDsgfQorCisgICAgdm9pZCBzZXRDb29raWVKYXIoY29uc3Qg
Y2hhciopOworICAgIGNvbnN0IFN0cmluZyYgY29va2llSmFyKCkgY29uc3QgeyByZXR1cm4gbV9j
b29raWVKYXJGaWxlTmFtZTsgfQorCisgICAgLy8gQ291bnQgdXBkYXRlIG1ldGhvZAorICAgIHZv
aWQgcmVtb3ZlZENvb2tpZSgpCisgICAgeworICAgICAgICBBU1NFUlQobV9jb3VudCA+IDApOwor
ICAgICAgICAtLW1fY291bnQ7CisgICAgfQorICAgIHZvaWQgYWRkZWRDb29raWUoKSB7ICsrbV9j
b3VudDsgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGludCBtYXhDb29raWVMZW5ndGgoKSB7IHJl
dHVybiBzX21heENvb2tpZUxlbmd0aDsgfSAKKworICAgIHZvaWQgc2V0Q29va2llUG9saWN5KENv
b2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kgcG9saWN5KSB7IG1fcG9saWN5ID0gcG9saWN5OyB9Cisg
ICAgQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeSBjb29raWVQb2xpY3koKSBjb25zdCB7IHJldHVy
biBtX3BvbGljeTsgfQorICAgIHZvaWQgc2V0UHJpdmF0ZU1vZGUoY29uc3QgYm9vbCk7CisKKyAg
ICBTdHJpbmcgZ2V0Q29va2llKGNvbnN0IEtVUkwmIHJlcXVlc3RVUkwsIENvb2tpZUZpbHRlcikg
Y29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIGFsbCBjb29raWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQg
d2l0aCB0aGUgc3BlY2lmaWVkIFVSTCBhcyByYXcgY29va2llcy4KKyAgICB2b2lkIGdldFJhd0Nv
b2tpZXMoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgY29uc3QgS1VSTCYg
cmVxdWVzdFVSTCwgQ29va2llRmlsdGVyID0gV2l0aEh0dHBPbmx5Q29va2llcykgY29uc3Q7CisK
KyAgICB2b2lkIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlKCk7CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIENvb2tpZU1hbmFnZXImIGNvb2tpZU1hbmFnZXIoKTsKKworICAgIENvb2tpZU1hbmFn
ZXIoKTsKKyAgICB+Q29va2llTWFuYWdlcigpOworCisgICAgdm9pZCBjaGVja0FuZFRyZWF0Q29v
a2llKFBhcnNlZENvb2tpZSosIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kpOworCisgICAgYm9v
bCBzaG91bGRSZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb25zdCBQYXJzZWRDb29raWUqLCBjb25z
dCBLVVJMJik7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvTWFwKENvb2tpZU1hcCosIFBhcnNlZENv
b2tpZSosIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kpOworICAgIHZvaWQgdXBkYXRlKENvb2tp
ZU1hcCosIFBhcnNlZENvb2tpZSosIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kpOworCisgICAg
Q29va2llTWFwKiBmaW5kT3JDcmVhdGVDb29raWVNYXAoQ29va2llTWFwKiBwcm90b2NvbE1hcCwg
Y29uc3QgU3RyaW5nJiBkb21haW4sIGJvb2wgZmluZE9ubHkpOworCisgICAgdm9pZCBpbml0aWF0
ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpOworICAgIHZvaWQgY29va2llTGltaXRDbGVhblVwKFRpbWVy
PENvb2tpZU1hbmFnZXI+Kik7CisKKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj4gbV9t
YW5hZ2VyTWFwOworCisgICAgdW5zaWduZWQgc2hvcnQgbV9jb3VudDsKKworICAgIGJvb2wgbV9w
cml2YXRlTW9kZTsKKyAgICBib29sIG1fc2hvdWxkRHVtcEFsbENvb2tpZXM7CisKKyAgICBTdHJp
bmcgbV9jb29raWVKYXJGaWxlTmFtZTsKKworICAgIC8vIEZJWE1FOiBUaGlzIG1ldGhvZCBzaG91
bGQgYmUgcmVtb3ZlZC4KKyAgICB2b2lkIGdldEJhY2tpbmdTdG9yZUNvb2tpZXMoKTsKKworICAg
IC8vIENvb2tpZSBzaXplIGxpbWl0IG9mIDRrQiBhcyBhZHZpc2VkIHBlciBSRkMyMTA5CisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfbWF4Q29va2llTGVuZ3RoID0gNDA5NjsKKworICAgIENv
b2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kgbV9wb2xpY3k7CisKKyAgICBDb29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZSogbV9jb29raWVCYWNraW5nU3RvcmU7CisgICAgVGltZXI8Q29va2llTWFuYWdl
cj4gbV9saW1pdFRpbWVyOworCit9OworCisvLyBHZXQgdGhlIGdsb2JhbCBpbnN0YW5jZS4KK0Nv
b2tpZU1hbmFnZXImIGNvb2tpZU1hbmFnZXIoKTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gQ29va2llTWFuYWdlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGQyNzJhZDJmZGEwZWU3MTcy
M2QzYzNjMmU3YzNlMTg0NzNkMDU1ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmNwcApAQCAtMCwwICsxLDIxMSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hh
ZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJ
biBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgRU5BQkxFX0NPT0tJ
RV9ERUJVRyAwCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29raWVNYXAuaCIK
KworI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5j
bHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCisj
aWYgRU5BQkxFX0NPT0tJRV9ERUJVRworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxvZy5o
PgorI2RlZmluZSBDb29raWVMb2coZm9ybWF0LCAuLi4pIEJsYWNrQmVycnk6OlBsYXRmb3JtOjps
b2dBbHdheXMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgZm9ybWF0LCAjIyBf
X1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikKKyNlbmRp
ZiAvLyBFTkFCTEVfQ09PS0lFX0RFQlVHCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29va2ll
TWFwOjpDb29raWVNYXAoY29uc3QgU3RyaW5nJiBuYW1lKQorICAgIDogbV9vbGRlc3RDb29raWUo
MCkKKyAgICAsIG1fbmFtZShuYW1lKQoreworfQorCitDb29raWVNYXA6On5Db29raWVNYXAoKQor
eworICAgIGRlbGV0ZUFsbENvb2tpZXNBbmREb21haW5zKCk7Cit9CisKK2Jvb2wgQ29va2llTWFw
OjpleGlzdHNDb29raWUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpIGNvbnN0Cit7CisgICAg
U3RyaW5nIGtleSA9IGNvb2tpZS0+bmFtZSgpICsgY29va2llLT5wYXRoKCk7CisgICAgcmV0dXJu
IG1fY29va2llTWFwLmNvbnRhaW5zKGtleSk7Cit9CisKK3ZvaWQgQ29va2llTWFwOjphZGRDb29r
aWUoUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgU3RyaW5nIGtleSA9IGNvb2tpZS0+bmFt
ZSgpICsgY29va2llLT5wYXRoKCk7CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVt
cHRpbmcgdG8gYWRkIGNvb2tpZSAtICVzIiwgY29va2llLT5uYW1lKCkudXRmOCgpLmRhdGEoKSk7
CisKKyAgICBBU1NFUlQoIW1fY29va2llTWFwLmNvbnRhaW5zKGtleSkpOworICAgIG1fY29va2ll
TWFwLmFkZChrZXksIGNvb2tpZSk7CisgICAgaWYgKCFjb29raWUtPmlzU2Vzc2lvbigpKQorICAg
ICAgICBjb29raWVNYW5hZ2VyKCkuYWRkZWRDb29raWUoKTsKKyAgICBpZiAoIW1fb2xkZXN0Q29v
a2llIHx8IG1fb2xkZXN0Q29va2llLT5sYXN0QWNjZXNzZWQoKSA+IGNvb2tpZS0+bGFzdEFjY2Vz
c2VkKCkpCisgICAgICAgIG1fb2xkZXN0Q29va2llID0gY29va2llOworfQorCitQYXJzZWRDb29r
aWUqIENvb2tpZU1hcDo6dXBkYXRlQ29va2llKFBhcnNlZENvb2tpZSogbmV3Q29va2llKQorewor
ICAgIFN0cmluZyBrZXkgPSBuZXdDb29raWUtPm5hbWUoKSArIG5ld0Nvb2tpZS0+cGF0aCgpOwor
ICAgIFBhcnNlZENvb2tpZSogb2xkQ29va2llID0gbV9jb29raWVNYXAudGFrZShrZXkpOworICAg
IEFTU0VSVChvbGRDb29raWUpOworICAgIG1fY29va2llTWFwLmFkZChrZXksIG5ld0Nvb2tpZSk7
CisgICAgaWYgKG9sZENvb2tpZSA9PSBtX29sZGVzdENvb2tpZSkKKyAgICAgICAgdXBkYXRlT2xk
ZXN0Q29va2llKCk7CisgICAgcmV0dXJuIG9sZENvb2tpZTsKK30KKworUGFyc2VkQ29va2llKiBD
b29raWVNYXA6OnJlbW92ZUNvb2tpZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAg
ICAvLyBGaW5kIGEgcHJldmlvdXMgZW50cnkgZm9yIGRlbGV0aW9uCisgICAgU3RyaW5nIGtleSA9
IGNvb2tpZS0+bmFtZSgpICsgY29va2llLT5wYXRoKCk7CisgICAgUGFyc2VkQ29va2llKiBwcmV2
Q29va2llID0gbV9jb29raWVNYXAudGFrZShrZXkpOworCisgICAgaWYgKCFwcmV2Q29va2llKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwcmV2Q29va2llID09IG1fb2xkZXN0Q29va2ll
KQorICAgICAgICB1cGRhdGVPbGRlc3RDb29raWUoKTsKKyAgICBlbHNlIGlmIChwcmV2Q29va2ll
ICE9IGNvb2tpZSkgeworICAgICAgICAvLyBUaGUgY29va2llIHdlIHVzZWQgdG8gc2VhcmNoIGlz
IGZvcmNlIGV4cGlyZWQsIHdlIG11c3QgZG8gdGhlIHNhbWUKKyAgICAgICAgLy8gdG8gdGhlIGNv
b2tpZSBpbiBtZW1vcnkgdG9vLgorICAgICAgICBpZiAoY29va2llLT5pc0ZvcmNlRXhwaXJlZCgp
KQorICAgICAgICAgICAgcHJldkNvb2tpZS0+Zm9yY2VFeHBpcmUoKTsKKyAgICAgICAgZGVsZXRl
IGNvb2tpZTsKKyAgICB9CisKKyAgICBpZiAoIXByZXZDb29raWUtPmlzU2Vzc2lvbigpKQorICAg
ICAgICBjb29raWVNYW5hZ2VyKCkucmVtb3ZlZENvb2tpZSgpOworICAgIHJldHVybiBwcmV2Q29v
a2llOworfQorCitDb29raWVNYXAqIENvb2tpZU1hcDo6Z2V0U3ViZG9tYWluTWFwKGNvbnN0IFN0
cmluZyYgc3ViZG9tYWluKQoreworI2lmIEVOQUJMRV9DT09LSUVfREVCVUcKKyAgICBpZiAoIW1f
c3ViZG9tYWlucy5jb250YWlucyhzdWJkb21haW4pKQorICAgICAgICBDb29raWVMb2coIkNvb2tp
ZU1hcCAtICVzIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgbWFwIiwgc3ViZG9tYWluLnV0ZjgoKS5k
YXRhKCkpOworI2VuZGlmCisgICAgcmV0dXJuIG1fc3ViZG9tYWlucy5nZXQoc3ViZG9tYWluKTsK
K30KKwordm9pZCBDb29raWVNYXA6OmFkZFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcmIHN1YmRv
bWFpbiwgQ29va2llTWFwKiBuZXdEb21haW4pCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYXAg
LSBBdHRlbXB0aW5nIHRvIGFkZCBzdWJkb21haW4gLSAlcyIsIHN1YmRvbWFpbi51dGY4KCkuZGF0
YSgpKTsKKyAgICBtX3N1YmRvbWFpbnMuYWRkKHN1YmRvbWFpbiwgbmV3RG9tYWluKTsKK30KKwor
dm9pZCBDb29raWVNYXA6OmdldEFsbENvb2tpZXMoVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBzdGFj
a09mQ29va2llcykKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIEF0dGVtcHRpbmcgdG8g
Y29weSBNYXA6JXMgY29va2llcyB3aXRoICVkIGNvb2tpZXMgaW50byB2ZWN0b3JzIiwgbV9uYW1l
LnV0ZjgoKS5kYXRhKCksIG1fY29va2llTWFwLnNpemUoKSk7CisKKyAgICBWZWN0b3I8UGFyc2Vk
Q29va2llKj4gbmV3Q29va2llczsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9jb29raWVNYXAs
IG5ld0Nvb2tpZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q29va2llcy5zaXpl
KCk7IGkrKykgeworICAgICAgICBQYXJzZWRDb29raWUqIG5ld0Nvb2tpZSA9IG5ld0Nvb2tpZXNb
aV07CisgICAgICAgIGlmIChuZXdDb29raWUtPmhhc0V4cGlyZWQoKSkgeworICAgICAgICAgICAg
Ly8gTm90aWNlIHRoYXQgd2UgZG9uJ3QgZGVsZXRlIGZyb20gYmFja2luZ3N0b3JlLiBUaGVzZSBl
eHBpcmVkIGNvb2tpZXMgd2lsbCBiZQorICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIG1hbmFn
ZXIgbG9hZHMgdGhlIGJhY2tpbmdzdG9yZSBhZ2Fpbi4KKyAgICAgICAgICAgIFBhcnNlZENvb2tp
ZSogZXhwaXJlZCA9IHJlbW92ZUNvb2tpZShuZXdDb29raWUpOworICAgICAgICAgICAgZGVsZXRl
IGV4cGlyZWQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc3RhY2tPZkNvb2tpZXMtPmFw
cGVuZChuZXdDb29raWUpOworICAgIH0KKworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gc3Rh
Y2sgb2YgY29va2llcyBub3cgaGF2ZSAlZCBjb29raWVzIGluIGl0IiwgKCpzdGFja09mQ29va2ll
cykuc2l6ZSgpKTsKKworfQorCitQYXJzZWRDb29raWUqIENvb2tpZU1hcDo6cmVtb3ZlT2xkZXN0
Q29va2llKCkKK3sKKyAgICAvLyBGSVhNRTogTWFrZSBzdXJlIGl0IGZpbmRzIHRoZSBHTE9CQUwg
b2xkZXN0IGNvb2tpZSwgbm90IHRoZSBmaXJzdCBvbGRlc3Rjb29raWUgaXQgZmluZHMuCisgICAg
UGFyc2VkQ29va2llKiBvbGRlc3RDb29raWUgPSBtX29sZGVzdENvb2tpZTsKKworICAgIC8vIElm
IHRoaXMgbWFwIGhhcyBhbiBvbGRlc3RDb29raWUsIHJlbW92ZSBpdC4gSWYgbm90LCBkbyBhIERG
UyB0byBzZWFyY2ggZm9yIGEgY2hpbGQgdGhhdCBkb2VzCisgICAgaWYgKCFvbGRlc3RDb29raWUp
IHsKKworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIG5vIG9sZGVzdENvb2tpZSBleGlz
dCIpOworCisgICAgICAgIC8vIEJhc2UgY2FzZSBpcyBpZiB0aGUgbWFwIGhhcyBubyBjaGlsZCBh
bmQgbm8gY29va2llcywgd2UgcmV0dXJuIGEgbnVsbC4KKyAgICAgICAgaWYgKCFtX3N1YmRvbWFp
bnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIG5vIHN1YmRv
bWFpbnMsIGJhc2UgY2FzZSByZWFjaGVkLCByZXR1cm4gMCIpOworICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIH0KKworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIGxvb2tpbmcg
aW50byBzdWJkb21haW5zIik7CisKKyAgICAgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2ll
TWFwKj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJkb21haW5zLmJlZ2luKCk7IGl0ICE9IG1fc3ViZG9t
YWlucy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgb2xkZXN0Q29va2llID0gaXQtPnNlY29u
ZC0+cmVtb3ZlT2xkZXN0Q29va2llKCk7CisgICAgICAgICAgICBpZiAob2xkZXN0Q29va2llKQor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAg
Q29va2llTG9nKCJDb29raWVNYXAgLSBvbGRlc3RDb29raWUgZXhpc3QuIik7CisgICAgICAgIG9s
ZGVzdENvb2tpZSA9IHJlbW92ZUNvb2tpZShtX29sZGVzdENvb2tpZSk7CisgICAgfQorCisgICAg
cmV0dXJuIG9sZGVzdENvb2tpZTsKK30KKwordm9pZCBDb29raWVNYXA6OnVwZGF0ZU9sZGVzdENv
b2tpZSgpCit7CisgICAgaWYgKCFtX2Nvb2tpZU1hcC5zaXplKCkpCisgICAgICAgIG1fb2xkZXN0
Q29va2llID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFBhcnNlZENv
b2tpZSo+OjppdGVyYXRvciBpdCA9IG1fY29va2llTWFwLmJlZ2luKCk7CisgICAgICAgIG1fb2xk
ZXN0Q29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgKytpdDsKKyAgICAgICAgZm9yICg7IGl0
ICE9IG1fY29va2llTWFwLmVuZCgpOyArK2l0KQorICAgICAgICAgICAgaWYgKG1fb2xkZXN0Q29v
a2llLT5sYXN0QWNjZXNzZWQoKSA+IGl0LT5zZWNvbmQtPmxhc3RBY2Nlc3NlZCgpKQorICAgICAg
ICAgICAgICAgIG1fb2xkZXN0Q29va2llID0gaXQtPnNlY29uZDsKKyAgICB9Cit9CisKK3ZvaWQg
Q29va2llTWFwOjpkZWxldGVBbGxDb29raWVzQW5kRG9tYWlucygpCit7CisgICAgZGVsZXRlQWxs
VmFsdWVzKG1fc3ViZG9tYWlucyk7CisgICAgbV9zdWJkb21haW5zLmNsZWFyKCk7CisgICAgZGVs
ZXRlQWxsVmFsdWVzKG1fY29va2llTWFwKTsKKyAgICBtX2Nvb2tpZU1hcC5jbGVhcigpOworCisg
ICAgbV9vbGRlc3RDb29raWUgPSAwOworfQorCit2b2lkIENvb2tpZU1hcDo6Z2V0QWxsQ2hpbGRD
b29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiogc3RhY2tPZkNvb2tpZXMpCit7CisgICAgQ29v
a2llTG9nKCJDb29raWVNYXAgLSBnZXRBbGxDaGlsZENvb2tpZXMgaW4gTWFwIC0gJXMiLCBnZXRO
YW1lKCkudXRmOCgpLmRhdGEoKSk7CisgICAgZ2V0QWxsQ29va2llcyhzdGFja09mQ29va2llcyk7
CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46Oml0ZXJhdG9yIGl0ID0gbV9z
dWJkb21haW5zLmJlZ2luKCk7IGl0ICE9IG1fc3ViZG9tYWlucy5lbmQoKTsgKytpdCkKKyAgICAg
ICAgaXQtPnNlY29uZC0+Z2V0QWxsQ2hpbGRDb29raWVzKHN0YWNrT2ZDb29raWVzKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVNYXAuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNr
YmVycnkvQ29va2llTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzNiYTEzZmFjYzE0YTUxNTJlYTEzOTg4OGU0
NDQzYThlYTFkN2UwNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvQ29va2llTWFwLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBD
b3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIENvb2tpZU1hcF9oCisjZGVmaW5lIENvb2tpZU1hcF9oCisK
KyNpbmNsdWRlICJIYXNoTWFwLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNs
dWRlICJWZWN0b3IuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2VkQ29va2llOworCisvKiBBIGNvb2tpZSBtYXAg
aXMgYSBub2RlIGluIHRoZSB0cmVlIGhlbGQgYnkgQ29va2llTWFuYWdlciB0aGF0IHJlcHJlc2Vu
dHMKKyAqIGNvb2tpZXMgdGhhdCBtYXRjaGVzIGEgY29tbW9uIGRvbWFpbi4KKyAqCisgKiBBIENv
b2tpZU1hcCBob2xkcyByZWZlcmVuY2UgdG8gdGhlIGNvb2tpZXMgdGhhdCBpdCBjb250YWlucyBh
bmQgdGhlIGNoaWxkCisgKiBkb21haW5zIHRoYXQgZXhpc3Qgd2l0aGluIHRoZSB0cmVlLgorICoK
KyAqIFRoZSBudW1iZXIgb2YgY29va2llIHBlciBob3N0IGlzIGxpbWl0ZWQgYnkgQ29va2llTWFu
YWdlcjo6c19tYXhDb29raWVDb3VudFBlckhvc3QKKyAqLworCitjbGFzcyBDb29raWVNYXAgewor
CitwdWJsaWM6CisgICAgQ29va2llTWFwKGNvbnN0IFN0cmluZyYgbmFtZSA9ICIiKTsKKyAgICB+
Q29va2llTWFwKCk7CisKKyAgICB1bnNpZ25lZCBpbnQgY291bnQoKSBjb25zdCB7IHJldHVybiBt
X2Nvb2tpZU1hcC5zaXplKCk7IH0KKyAgICBjb25zdCBTdHJpbmcmIGdldE5hbWUoKSBjb25zdCB7
IHJldHVybiBtX25hbWU7IH0KKworICAgIHZvaWQgYWRkQ29va2llKFBhcnNlZENvb2tpZSopOwor
CisgICAgLy8gUmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBjb29raWUgb2JqZWN0IHNvIG1hbmFnZXIg
Y2FuIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHVwZGF0ZXMgaW4gdGhlIGRhdGFiYXNlIHF1ZXVl
LgorICAgIFBhcnNlZENvb2tpZSogdXBkYXRlQ29va2llKFBhcnNlZENvb2tpZSopOworCisgICAg
Ly8gTmVlZCB0byByZXR1cm4gdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVtb3ZlZCBjb29raWUgc28g
bWFuYWdlciBjYW4gZGVhbCB3aXRoIGl0IChnYXJiYWdlIGNvbGxlY3QpLgorICAgIFBhcnNlZENv
b2tpZSogcmVtb3ZlQ29va2llKGNvbnN0IFBhcnNlZENvb2tpZSopOworICAgIGJvb2wgZXhpc3Rz
Q29va2llKGNvbnN0IFBhcnNlZENvb2tpZSopIGNvbnN0OworCisgICAgLy8gUmV0dXJucyBhIG1h
cCB3aXRoIHRoYXQgZ2l2ZW4gc3ViZG9tYWluLgorICAgIENvb2tpZU1hcCogZ2V0U3ViZG9tYWlu
TWFwKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgYWRkU3ViZG9tYWluTWFwKGNvbnN0IFN0cmlu
ZyYsIENvb2tpZU1hcCopOworICAgIHZvaWQgZGVsZXRlQWxsQ29va2llc0FuZERvbWFpbnMoKTsK
KworICAgIHZvaWQgZ2V0QWxsQ29va2llcyhWZWN0b3I8UGFyc2VkQ29va2llKj4qKTsKKyAgICB2
b2lkIGdldEFsbENoaWxkQ29va2llcyhWZWN0b3I8UGFyc2VkQ29va2llKj4qIHN0YWNrT2ZDb29r
aWVzKTsKKyAgICBQYXJzZWRDb29raWUqIHJlbW92ZU9sZGVzdENvb2tpZSgpOworCitwcml2YXRl
OgorICAgIHZvaWQgdXBkYXRlT2xkZXN0Q29va2llKCk7CisKKyAgICAvLyBUaGUga2V5IGlzIHRo
ZSB0dXBsZSAobmFtZSwgcGF0aCkuCisgICAgLy8gVGhlIHNwZWMgYXNrcyB0byBoYXZlIGFsc28g
ZG9tYWluLCB3aGljaCBpcyBpbXBsaWVkIGJ5IGNob29zaW5nIHRoZSBDb29raWVNYXAgcmVsZXZh
bnQgdG8gdGhlIGRvbWFpbi4KKyAgICBIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj4gbV9j
b29raWVNYXA7CisKKyAgICAvLyBUaGUga2V5IGlzIGEgc3Vic2VjdGlvbiBvZiB0aGUgZG9tYWlu
LgorICAgIC8vIGV4OiBpZiBpbnNlcnRpbmcgYWNjb3VudHMuZ29vZ2xlLmNvbSAmIHRoaXMgY29v
a2llbWFwIGlzICJjb20iLCB0aGlzIHN1YmRvbWFpbiBtYXAgd2lsbCBjb250YWluICJnb29nbGUi
CisgICAgLy8gdGhlICJnb29nbGUiIGNvb2tpZW1hcCB3aWxsIGNvbnRhaW4gImFjY291bnRzIiBp
biBpdHMgc3ViZG9tYWluIG1hcC4KKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj4gbV9z
dWJkb21haW5zOworCisgICAgLy8gU3RvcmUgdGhlIG9sZGVzdCBjb29raWUgdG8gc3BlZWQgdXAg
TFJVIGNoZWNrcy4KKyAgICBQYXJzZWRDb29raWUqIG1fb2xkZXN0Q29va2llOworICAgIGNvbnN0
IFN0cmluZyBtX25hbWU7CisKKyAgICAvLyBGSVhNRSA6IHNob3VsZCBoYXZlIGEgbV9zaG91bGRV
cGRhdGUgZmxhZyB0byB1cGRhdGUgdGhlIG5ldHdvcmsgbGF5ZXIgb25seSB3aGVuIHRoZSBtYXAg
aGFzIGNoYW5nZWQuCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBD
b29raWVNYXBfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJy
eS9Db29raWVQYXJzZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9D
b29raWVQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmUxZWI0NGFhNDEyYmQwNzViOWUzZmIyMmQxMjJi
NGM5ZGRhZjVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9i
bGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5jcHAKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5by5jb20+Cisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLyAKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNv
b2tpZVBhcnNlci5oIgorCisjaW5jbHVkZSAiQ3VycmVudFRpbWUuaCIKKyNpbmNsdWRlICJMb2dn
aW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNkZWZpbmUgTE9HX0FORF9ERUxFVEUo
Zm9ybWF0LCAuLi4pIFwKKyAgICB7IFwKKyAgICAgICAgTE9HX0VSUk9SKGZvcm1hdCwgIyMgX19W
QV9BUkdTX18pOyBcCisgICAgICAgIGRlbGV0ZSByZXM7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwK
KyAgICB9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0Nvb2tpZUhlYWRlclNlcGFyYXRvcihVQ2hh
ciBjKQoreworICAgIHJldHVybiAoYyA9PSAnXHInIHx8IGMgPT0nXG4nKTsKK30KKworc3RhdGlj
IGlubGluZSBib29sIGlzTGlnaHR3ZWlnaHRTcGFjZShVQ2hhciBjKQoreworICAgIHJldHVybiAo
YyA9PSAnICcgfHwgYyA9PSAnXHQnKTsKK30KKworQ29va2llUGFyc2VyOjpDb29raWVQYXJzZXIo
Y29uc3QgS1VSTCYgZGVmYXVsdENvb2tpZVVSTCkKKyAgICA6IG1fZGVmYXVsdENvb2tpZVVSTChk
ZWZhdWx0Q29va2llVVJMKQoreworfQorCitDb29raWVQYXJzZXI6On5Db29raWVQYXJzZXIoKQor
eworfQorCitWZWN0b3I8UGFyc2VkQ29va2llKj4gQ29va2llUGFyc2VyOjpwYXJzZShjb25zdCBT
dHJpbmcmIGNvb2tpZXMpCit7CisgICAgdW5zaWduZWQgY29va2llU3RhcnQsIGNvb2tpZUVuZCA9
IDA7CisgICAgZG91YmxlIGN1clRpbWUgPSBjdXJyZW50VGltZSgpOworICAgIFZlY3RvcjxQYXJz
ZWRDb29raWUqLCA0PiBwYXJzZWRDb29raWVzOworCisgICAgdW5zaWduZWQgY29va2llc0xlbmd0
aCA9IGNvb2tpZXMubGVuZ3RoKCk7CisgICAgaWYgKCFjb29raWVzTGVuZ3RoKSAvLyBDb2RlIGJl
bG93IGRvZXNuJ3QgaGFuZGxlIHRoaXMgY2FzZQorICAgICAgICByZXR1cm4gcGFyc2VkQ29va2ll
czsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaGVhZGVyIHRvIHBhcnNlIGFsbCB0aGUgY29v
a2llcy4KKyAgICB3aGlsZSAoY29va2llRW5kIDw9IGNvb2tpZXNMZW5ndGgpIHsKKyAgICAgICAg
Y29va2llU3RhcnQgPSBjb29raWVFbmQ7CisgICAgICAgIAorICAgICAgICAvLyBGaW5kIGEgY29v
a2llIHNlcGFyYXRvci4KKyAgICAgICAgd2hpbGUgKGNvb2tpZUVuZCA8PSBjb29raWVzTGVuZ3Ro
ICYmICFpc0Nvb2tpZUhlYWRlclNlcGFyYXRvcihjb29raWVzW2Nvb2tpZUVuZF0pKQorICAgICAg
ICAgICAgY29va2llRW5kKys7CisKKyAgICAgICAgLy8gRGV0ZWN0IGFuIGVtcHR5IGNvb2tpZSBh
bmQgZ28gdG8gdGhlIG5leHQgb25lLgorICAgICAgICBpZiAoY29va2llU3RhcnQgPT0gY29va2ll
RW5kKSB7CisgICAgICAgICAgICArK2Nvb2tpZUVuZDsKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvb2tpZUVuZCA8IGNvb2tpZXNMZW5ndGggJiYgaXND
b29raWVIZWFkZXJTZXBhcmF0b3IoY29va2llc1tjb29raWVFbmRdKSkKKyAgICAgICAgICAgICsr
Y29va2llRW5kOworCisgICAgICAgIFBhcnNlZENvb2tpZSogY29va2llID0gcGFyc2VPbmVDb29r
aWUoY29va2llcywgY29va2llU3RhcnQsIGNvb2tpZUVuZCAtIDEsIGN1clRpbWUpOworICAgICAg
ICBpZiAoY29va2llKQorICAgICAgICAgICAgcGFyc2VkQ29va2llcy5hcHBlbmQoY29va2llKTsK
KyAgICB9CisgICAgcmV0dXJuIHBhcnNlZENvb2tpZXM7Cit9CisKKy8vIFRoZSBjb29raWUgU3Ry
aW5nIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIHdpbGwgb25seSBjb250aWFuIHRoZSBuYW1lIHZh
bHVlIHBhaXJzIGFzIHdlbGwgYXMgb3RoZXIgcmVsYXRlZCBjb29raWUKKy8vIGF0dHJpYnV0ZXMg
c3VjaCBhcyBtYXgtYWdlIGFuZCBkb21haW4uIFNldC1Db29raWUgc2hvdWxkIG5ldmVyIGJlIHBh
cnQgb2YgdGhpcyBzdHJpbmcuCitQYXJzZWRDb29raWUqIENvb2tpZVBhcnNlcjo6cGFyc2VPbmVD
b29raWUoY29uc3QgU3RyaW5nJiBjb29raWUsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQs
IGRvdWJsZSBjdXJUaW1lKQoreworICAgIFBhcnNlZENvb2tpZSogcmVzID0gbmV3IFBhcnNlZENv
b2tpZShjdXJUaW1lKTsKKworICAgIGlmICghcmVzKQorICAgICAgICBMT0dfQU5EX0RFTEVURSgi
T3V0IG9mIG1lbW9yeSIpOworCisgICAgcmVzLT5zZXRQcm90b2NvbChtX2RlZmF1bHRDb29raWVV
UkwucHJvdG9jb2woKSk7CisKKyAgICAvLyBQYXJzZSBbTkFNRSAiPSJdIFZBTFVFCisgICAgdW5z
aWduZWQgdG9rZW5FbmQgPSBzdGFydDsgLy8gVG9rZW4gZW5kIGNvbnRhaW5zIHRoZSBwb3NpdGlv
biBvZiB0aGUgJz0nIG9yIHRoZSBlbmQgb2YgYSB0b2tlbgorICAgIHVuc2lnbmVkIHBhaXJFbmQg
PSBzdGFydDsgLy8gUGFpciBlbmQgY29udGFpbnMgYWx3YXlzIHRoZSBwb3NpdGlvbiBvZiB0aGUg
JzsnCisKKyAgICAvLyBmaW5kIHRoZSAqZmlyc3QqICc7JyBhbmQgdGhlICc9JyAoaWYgdGhleSBl
eGlzdCkKKyAgICBib29sIHF1b3RlRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGZvdW5kRXF1YWwg
PSBmYWxzZTsKKyAgICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiAoY29va2llW3BhaXJFbmRdICE9
ICc7JyB8fCBxdW90ZUZvdW5kKSkgeworICAgICAgICBpZiAodG9rZW5FbmQgPT0gc3RhcnQgJiYg
Y29va2llW3BhaXJFbmRdID09ICc9JykgeworICAgICAgICAgICAgdG9rZW5FbmQgPSBwYWlyRW5k
OworICAgICAgICAgICAgZm91bmRFcXVhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KGNvb2tpZVtwYWlyRW5kXSA9PSAnIicpCisgICAgICAgICAgICBxdW90ZUZvdW5kID0gIXF1b3Rl
Rm91bmQ7CisgICAgICAgIHBhaXJFbmQrKzsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0b2tlblN0
YXJ0ID0gc3RhcnQ7CisKKyAgICBib29sIGhhc05hbWUgPSBmYWxzZTsgLy8gVGhpcyBpcyBhIGhh
Y2sgdG8gYXZvaWQgY2hhbmdpbmcgdG9vIG11Y2ggaW4gdGhpcworICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBicnV0YWxseSBicml0dGxlIGNvZGUuCisgICAgaWYgKHRva2VuRW5kICE9IHN0
YXJ0KSB7CisgICAgICAgIC8vIFRoZXJlIGlzIGEgJz0nIHNvIHBhcnNlIHRoZSBOQU1FCisgICAg
ICAgIHVuc2lnbmVkIG5hbWVFbmQgPSB0b2tlbkVuZDsKKworICAgICAgICAvLyBUaGUgdG9rZW5F
bmQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnPScgc28gdGhlIG5hbWVFbmQgaXMgb25lIGxlc3MK
KyAgICAgICAgbmFtZUVuZC0tOworCisgICAgICAgIC8vIFJlbW92ZSBsaWdodHdlaWdodCBzcGFj
ZXMuCisgICAgICAgIHdoaWxlIChuYW1lRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVb
bmFtZUVuZF0pKQorICAgICAgICAgICAgbmFtZUVuZC0tOworCisgICAgICAgIHdoaWxlICh0b2tl
blN0YXJ0IDwgbmFtZUVuZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuU3RhcnRd
KSkKKyAgICAgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgICAgICBpZiAobmFtZUVuZCArIDEg
PD0gdG9rZW5TdGFydCkKKyAgICAgICAgICAgIExPR19BTkRfREVMRVRFKCJFbXB0eSBuYW1lLiBS
ZWplY3RpbmcgdGhlIGNvb2tpZSIpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gY29va2llLnN1
YnN0cmluZyh0b2tlblN0YXJ0LCBuYW1lRW5kICsgMSAtIHN0YXJ0KTsKKyAgICAgICAgcmVzLT5z
ZXROYW1lKG5hbWUpOworICAgICAgICBoYXNOYW1lID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBO
b3cgcGFyc2UgdGhlIFZBTFVFCisgICAgdG9rZW5TdGFydCA9IHRva2VuRW5kICsgMTsKKyAgICBp
ZiAoIWhhc05hbWUpCisgICAgICAgIC0tdG9rZW5TdGFydDsKKworICAgIC8vIFNraXAgbGlnaHR3
ZWlnaHQgc3BhY2VzIGluIG91ciB0b2tlbgorICAgIHdoaWxlICh0b2tlblN0YXJ0IDwgcGFpckVu
ZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuU3RhcnRdKSkKKyAgICAgICAgdG9r
ZW5TdGFydCsrOworCisgICAgdG9rZW5FbmQgPSBwYWlyRW5kOworICAgIHdoaWxlICh0b2tlbkVu
ZCA+IHRva2VuU3RhcnQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVt0b2tlbkVuZCAtIDFd
KSkKKyAgICAgICAgdG9rZW5FbmQtLTsKKworICAgIFN0cmluZyB2YWx1ZTsKKyAgICBpZiAodG9r
ZW5FbmQgPT0gdG9rZW5TdGFydCkgeworICAgICAgICAvLyBGaXJlZm94IGFjY2VwdHMgZW1wdHkg
dmFsdWUgc28gd2Ugd2lsbCBkbyB0aGUgc2FtZQorICAgICAgICB2YWx1ZSA9IFN0cmluZygpOwor
ICAgIH0gZWxzZQorICAgICAgICB2YWx1ZSA9IGNvb2tpZS5zdWJzdHJpbmcodG9rZW5TdGFydCwg
dG9rZW5FbmQgLSB0b2tlblN0YXJ0KTsKKworICAgIGlmIChoYXNOYW1lKQorICAgICAgICByZXMt
PnNldFZhbHVlKHZhbHVlKTsKKyAgICBlbHNlIGlmIChmb3VuZEVxdWFsKSB7CisgICAgICAgIGRl
bGV0ZSByZXM7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZQorICAgICAgICByZXMtPnNl
dE5hbWUodmFsdWUpOyAvLyBObyBOQU1FPVZBTFVFLCBvbmx5IE5BTUUKKworICAgIHdoaWxlIChw
YWlyRW5kIDwgZW5kKSB7CisgICAgICAgIC8vIFN3aXRjaCB0byB0aGUgbmV4dCBwYWlyIGFzIHBh
aXJFbmQgaXMgb24gdGhlICc7JyBhbmQgZmFzdC1mb3J3YXJkIGFueSBsaWdodHdlaWdodCBzcGFj
ZXMuCisgICAgICAgIHBhaXJFbmQrKzsKKyAgICAgICAgd2hpbGUgKHBhaXJFbmQgPCBlbmQgJiYg
aXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVtwYWlyRW5kXSkpCisgICAgICAgICAgICBwYWlyRW5k
Kys7CisKKyAgICAgICAgdG9rZW5TdGFydCA9IHBhaXJFbmQ7CisgICAgICAgIHRva2VuRW5kID0g
dG9rZW5TdGFydDsgLy8gaW5pdGlhbGl6ZSB0b2tlbiBlbmQgdG8gY2F0Y2ggZmlyc3QgJz0nCisK
KyAgICAgICAgd2hpbGUgKHBhaXJFbmQgPCBlbmQgJiYgY29va2llW3BhaXJFbmRdICE9ICc7Jykg
eworICAgICAgICAgICAgaWYgKHRva2VuRW5kID09IHRva2VuU3RhcnQgJiYgY29va2llW3BhaXJF
bmRdID09ICc9JykKKyAgICAgICAgICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgICAg
ICAgICBwYWlyRW5kKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRSA6IHNob3VsZCB3
ZSBza2lwIGxpZ2h0d2VpZ2h0IHNwYWNlcyBoZXJlID8KKworICAgICAgICB1bnNpZ25lZCBsZW5n
dGggPSB0b2tlbkVuZCAtIHRva2VuU3RhcnQ7CisgICAgICAgIHVuc2lnbmVkIHRva2VuU3RhcnRT
dmcgPSB0b2tlblN0YXJ0OworCisgICAgICAgIFN0cmluZyBwYXJzZWRWYWx1ZTsKKyAgICAgICAg
aWYgKHRva2VuU3RhcnQgIT0gdG9rZW5FbmQpIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFu
IGVxdWFsIHNpZ24gc28gcmVtb3ZlIGxpZ2h0d2VpZ2h0IHNwYWNlcyBpbiBWQUxVRQorICAgICAg
ICAgICAgdG9rZW5TdGFydCA9IHRva2VuRW5kICsgMTsKKyAgICAgICAgICAgIHdoaWxlICh0b2tl
blN0YXJ0IDwgcGFpckVuZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuU3RhcnRd
KSkKKyAgICAgICAgICAgICAgICB0b2tlblN0YXJ0Kys7CisKKyAgICAgICAgICAgIHRva2VuRW5k
ID0gcGFpckVuZDsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbkVuZCA+IHRva2VuU3RhcnQgJiYg
aXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVt0b2tlbkVuZCAtIDFdKSkKKyAgICAgICAgICAgICAg
ICB0b2tlbkVuZC0tOworCisgICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IGNvb2tpZS5zdWJzdHJp
bmcodG9rZW5TdGFydCwgdG9rZW5FbmQgLSB0b2tlblN0YXJ0KTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIC8vIElmIHRoZSBwYXJzZWRWYWx1ZSBpcyBlbXB0eSwgaW5pdGlhbGlzZSBp
dCBpbiBjYXNlIHdlIG5lZWQgaXQKKyAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gU3RyaW5nKCk7
CisgICAgICAgICAgICAvLyBIYW5kbGUgYSB0b2tlbiB3aXRob3V0IHZhbHVlLgorICAgICAgICAg
ICAgbGVuZ3RoID0gcGFpckVuZCAtIHRva2VuU3RhcnQ7CisgICAgICAgIH0KKworICAgICAgIC8v
IERldGVjdCB3aGljaCAiY29va2llLWF2IiBpcyBwYXJzZWQKKyAgICAgICAvLyBMb29rIGF0IHRo
ZSBmaXJzdCBjaGFyIHRoZW4gcGFyc2UgdGhlIHdob2xlIGZvciBwZXJmb3JtYW5jZSBpc3N1ZQor
ICAgICAgICBzd2l0Y2ggKGNvb2tpZVt0b2tlblN0YXJ0U3ZnXSkgeworICAgICAgICBjYXNlICdQ
JzoKKyAgICAgICAgY2FzZSAncCcgOiB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDQgJiYg
Y29va2llLmZpbmQoImF0aCIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpIHsKKyAgICAgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRoZSBwYXRoIHRvIGJlIGRlY29kZWQgdG8gbWF0Y2ggdGhvc2Ug
cmV0dXJuZWQgZnJvbSBLVVJMOjpwYXRoKCkuCisgICAgICAgICAgICAgICAgLy8gVGhlIHBhdGgg
YXR0cmlidXRlIG1heSBvciBtYXkgbm90IGluY2x1ZGUgcGVyY2VudC1lbmNvZGVkIGNoYXJhY3Rl
cnMuIEZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBlcmNl
bnQtZW5jb2RlZCBjaGFyYWN0ZXJzLCBkZWNvZGluZyB0aGUgdXJsIGlzIGEgbm8tb3AuCisgICAg
ICAgICAgICAgICAgcmVzLT5zZXRQYXRoKGRlY29kZVVSTEVzY2FwZVNlcXVlbmNlcyhwYXJzZWRW
YWx1ZSkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgTE9HX0FORF9ERUxF
VEUoIkludmFsaWQgY29va2llICVzIChwYXRoKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ0QnOgorICAgICAg
ICBjYXNlICdkJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNiAmJiBjb29raWUuZmlu
ZCgib21haW4iLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAg
aWYgKHBhcnNlZFZhbHVlLmxlbmd0aCgpID4gMSAmJiBwYXJzZWRWYWx1ZVswXSA9PSAnIicgJiYg
cGFyc2VkVmFsdWVbcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAxXSA9PSAnIicpCisgICAgICAgICAg
ICAgICAgICAgIHBhcnNlZFZhbHVlID0gcGFyc2VkVmFsdWUuc3Vic3RyaW5nKDEsIHBhcnNlZFZh
bHVlLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRvbWFpbiBkb2Vz
IG5vdCBzdGFydCB3aXRoIGEgZG90LCBhZGQgb25lIGZvciBzZWN1cml0eSBjaGVja3MsCisgICAg
ICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGFiLmMuY29tIGRvc2Ugbm90IGRvbWFpbiBtYXRj
aCBiLmMuY29tOworICAgICAgICAgICAgICAgIFN0cmluZyByZWFsRG9tYWluID0gcGFyc2VkVmFs
dWVbMF0gPT0gJy4nID8gcGFyc2VkVmFsdWUgOiAiLiIgKyBwYXJzZWRWYWx1ZTsKKyAgICAgICAg
ICAgICAgICByZXMtPnNldERvbWFpbihyZWFsRG9tYWluKTsKKyAgICAgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgICAgIExPR19BTkRfREVMRVRFKCJJbnZhbGlkIGNvb2tpZSAlcyAoZG9tYWlu
KSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorCisgICAgICAgIGNhc2UgJ0UnIDoKKyAgICAgICAgY2FzZSAnZScgOiB7CisgICAgICAgICAg
ICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoInhwaXJlcyIsIHRva2VuU3RhcnRTdmcg
KyAxLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgcmVzLT5zZXRFeHBpcnkocGFyc2VkVmFsdWUp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIExPR19BTkRfREVMRVRFKCJJbnZh
bGlkIGNvb2tpZSAlcyAoZXhwaXJlcykiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdNJyA6CisgICAgICAgIGNh
c2UgJ20nIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA3ICYmIGNvb2tpZS5maW5kKCJh
eC1hZ2UiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHJlcy0+
c2V0TWF4QWdlKHBhcnNlZFZhbHVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBMT0dfQU5EX0RFTEVURSgiSW52YWxpZCBjb29raWUgJXMgKG1heC1hZ2UpIiwgY29va2llLmFz
Y2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
Y2FzZSAnQycgOgorICAgICAgICBjYXNlICdjJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGgg
Pj0gNyAmJiBjb29raWUuZmluZCgib21tZW50IiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkK
KyAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSByb29tIGZvciB0aGUgY29tbWVudCBw
YXJ0IChhbmQgc28gZG8gTW96aWxsYSkgc28ganVzdCBsb2cgdGhlIGNvbW1lbnQuCisgICAgICAg
ICAgICAgICAgTE9HKE5ldHdvcmssICJDb21tZW50ICVzIGZvciBQYXJzZWRDb29raWUgOiAlc1xu
IiwgcGFyc2VkVmFsdWUuYXNjaWkoKS5kYXRhKCksIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTE9HX0FORF9ERUxFVEUoIkludmFsaWQg
Y29va2llICVzIChjb21tZW50KSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ1YnIDoKKyAgICAgICAgY2FzZSAn
dicgOiB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoImVyc2lv
biIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHRo
b3VnaCB0aGUgb3V0LW9mLWRhdGVkIENvb2tpZSBTcGVjKFJGQzI5NjUsIGh0dHA6Ly90b29scy5p
ZXRmLm9yZy9odG1sL3JmYzI5NjUpIGRlZmluZWQKKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFs
dWUgb2YgdmVyc2lvbiBjYW4gb25seSBjb250YWluIERJR0lULCBzb21lIHJhbmRvbSBzaXRlcywg
ZS5nLiBodHRwczovL2RldmZvcnVtcy5hcHBsZS5jb20KKyAgICAgICAgICAgICAgICAvLyB3b3Vs
ZCB1c2UgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyB0byBxdW90ZSB0aGUgZGlnaXQuIFNvIHdlIG5l
ZWQgdG8gZ2V0IHJpZCBvZiB0aGVtIGZvciBjb21wbGlhbmNlLgorICAgICAgICAgICAgICAgIGlm
IChwYXJzZWRWYWx1ZS5sZW5ndGgoKSA+IDEgJiYgcGFyc2VkVmFsdWVbMF0gPT0gJyInICYmIHBh
cnNlZFZhbHVlW3BhcnNlZFZhbHVlLmxlbmd0aCgpIC0gMV0gPT0gJyInKQorICAgICAgICAgICAg
ICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnN1YnN0cmluZygxLCBwYXJzZWRWYWx1
ZS5sZW5ndGgoKSAtIDIpOworCisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFZhbHVlLnRvSW50
KCkgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FORF9ERUxFVEUoIlBhcnNlZENvb2tp
ZSB2ZXJzaW9uICVkIG5vdCBzdXBwb3J0ZWQgKG9ubHkgc3VwcG9ydCB2ZXJzaW9uPTEpIiwgcGFy
c2VkVmFsdWUudG9JbnQoKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBM
T0dfQU5EX0RFTEVURSgiSW52YWxpZCBjb29raWUgJXMgKHZlcnNpb24pIiwgY29va2llLmFzY2lp
KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2Fz
ZSAnUycgOgorICAgICAgICBjYXNlICdzJyA6IHsKKyAgICAgICAgICAgIC8vIFNlY3VyZSBpcyBh
IHN0YW5kYWxvbmUgdG9rZW4gKCJTZWN1cmU7IikKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0g
NiAmJiBjb29raWUuZmluZCgiZWN1cmUiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAg
ICAgICAgICAgICAgIHJlcy0+c2V0U2VjdXJlRmxhZyh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICBMT0dfQU5EX0RFTEVURSgiSW52YWxpZCBjb29raWUgJXMgKHNlY3Vy
ZSkiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgY2FzZSAnSCc6CisgICAgICAgIGNhc2UgJ2gnOiB7CisgICAgICAgICAgICAv
LyBIdHRwT25seSBpcyBhIHN0YW5kYWxvbmUgdG9rZW4gKCJIdHRwT25seTsiKQorICAgICAgICAg
ICAgaWYgKGxlbmd0aCA+PSA4ICYmIGNvb2tpZS5maW5kKCJ0dHBPbmx5IiwgdG9rZW5TdGFydFN2
ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICByZXMtPnNldElzSHR0cE9ubHkodHJ1ZSk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTE9HX0FORF9ERUxFVEUoIkludmFs
aWQgY29va2llICVzIChIdHRwT25seSkiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAg
ICAgLy8gSWYgbGVuZ3RoID09IDAsIHdlIHNob3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjb29r
aWUgKGNhc2UgOiAiO1xyIikgc28gaWdub3JlIGl0CisgICAgICAgICAgICBpZiAobGVuZ3RoKQor
ICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCB0b2tlbiBmb3IgY29va2llICVzIiwg
Y29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gQ2hlY2sgaWYgdGhlIGNvb2tpZSBpcyB2YWxpZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNp
emUgbGltaXQuCisgICAgaWYgKCFyZXMtPmlzVW5kZXJTaXplTGltaXQoKSkKKyAgICAgICAgTE9H
X0FORF9ERUxFVEUoIlBhcnNlZENvb2tpZSAlcyBpcyBhYm92ZSB0aGUgNGtiIGluIGxlbmd0aCA6
IFJFSkVDVEVEIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKworICAgIC8vIElmIHNvbWUgcGFp
ciB3YXMgbm90IHByb3ZpZGVkLCBkdXJpbmcgcGFyc2luZyB0aGVuIGFwcGx5IHNvbWUgZGVmYXVs
dCB2YWx1ZQorICAgIC8vIHRoZSByZXN0IGhhcyBiZWVuIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9y
LgorCisgICAgLy8gSWYgbm8gZG9tYWluIHdhcyBwcm92aWRlZCwgc2V0IGl0IHRvIHRoZSBob3N0
CisgICAgaWYgKCFyZXMtPmRvbWFpbigpKQorICAgICAgICByZXMtPnNldERlZmF1bHREb21haW4o
bV9kZWZhdWx0Q29va2llVVJMKTsKKworICAgIC8vIEFjY29yZGluZyB0byB0aGUgQ29va2llIFNw
ZWNpZmljYWl0b24gKFJGQzYyNjUsIHNlY3Rpb24gNC4xLjIuNCBhbmQgNS4yLjQsIGh0dHA6Ly90
b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUpLAorICAgIC8vIElmIG5vIHBhdGggd2FzIHByb3Zp
ZGVkIG9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhdGggdmFsdWUgaXMgbm90ICcvJywg
c2V0IGl0IHRvIHRoZSBob3N0J3MgcGF0aAorICAgIC8vCisgICAgLy8gUkVGRVJFTkNFCisgICAg
Ly8gNC4xLjIuNC4gVGhlIFBhdGggQXR0cmlidXRlCisgICAgLy8KKyAgICAvLyBUaGUgc2NvcGUg
b2YgZWFjaCBjb29raWUgaXMgbGltaXRlZCB0byBhIHNldCBvZiBwYXRocywgY29udHJvbGxlZCBi
eQorICAgIC8vIHRoZSBQYXRoIGF0dHJpYnV0ZS4gSWYgdGhlIHNlcnZlciBvbWl0cyB0aGUgUGF0
aCBhdHRyaWJ1dGUsIHRoZSB1c2VyCisgICAgLy8gYWdlbnQgd2lsbCB1c2UgdGhlICJkaXJlY3Rv
cnkiIG9mIHRoZSByZXF1ZXN0LXVyaSdzIHBhdGggY29tcG9uZW50IGFzCisgICAgLy8gdGhlIGRl
ZmF1bHQgdmFsdWUuIChTZWUgU2VjdGlvbiA1LjEuNCBmb3IgbW9yZSBkZXRhaWxzLikKKyAgICAv
LyAuLi4uLi4uLi4uLgorICAgIC8vIDUuMi40LiBUaGUgUGF0aCBBdHRyaWJ1dGUKKyAgICAvLwor
ICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0
aGUgc3RyaW5nICJQYXRoIiwKKyAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhl
IGNvb2tpZS1hdiBhcyBmb2xsb3dzLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS12
YWx1ZSBpcyBlbXB0eSBvciBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQorICAgIC8vIGF0
dHJpYnV0ZS12YWx1ZSBpcyBub3QgJXgyRiAoIi8iKToKKyAgICAvLworICAgIC8vIExldCBjb29r
aWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRoLgorICAgIC8vCisgICAgLy8gT3RoZXJ3aXNlOgor
ICAgIC8vCisgICAgLy8gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuCisg
ICAgLy8KKyAgICAvLyBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRl
LWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtCisgICAgLy8gbmFtZSBvZiBQYXRoIGFuZCBhbiBhdHRy
aWJ1dGUtdmFsdWUgb2YgY29va2llLXBhdGguCisgICAgaWYgKCFyZXMtPnBhdGgoKSB8fCAhcmVz
LT5wYXRoKCkubGVuZ3RoKCkgfHwgIXJlcy0+cGF0aCgpLnN0YXJ0c1dpdGgoIi8iLCBmYWxzZSkp
IHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBtX2RlZmF1bHRDb29raWVVUkwuc3RyaW5nKCkuc3Vi
c3RyaW5nKG1fZGVmYXVsdENvb2tpZVVSTC5wYXRoU3RhcnQoKSwgbV9kZWZhdWx0Q29va2llVVJM
LnBhdGhBZnRlckxhc3RTbGFzaCgpIC0gbV9kZWZhdWx0Q29va2llVVJMLnBhdGhTdGFydCgpIC0g
MSk7CisgICAgICAgIGlmIChwYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHBhdGggPSAiLyI7
CisgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgcmVhZGluZyB0aGUgcmF3IHVybCBzdHJpbmcsIGl0
IGNvdWxkIGNvbnRhaW4gcGVyY2VudC1lbmNvZGVkIHNlcXVlbmNlcy4gV2UKKyAgICAgICAgLy8g
d2FudCBpdCB0byBiZSBjb21wYXJhYmxlIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgdXJsLnBhdGgo
KSwgd2hpY2ggaXMgbm90IHBlcmNlbnQtZW5jb2RlZCwKKyAgICAgICAgLy8gc28gd2UgbXVzdCBy
ZW1vdmUgdGhlIGVzY2FwZSBzZXF1ZW5jZXMuCisgICAgICAgIHJlcy0+c2V0UGF0aChkZWNvZGVV
UkxFc2NhcGVTZXF1ZW5jZXMocGF0aCkpOworICAgIH0KKyAKKyAgICByZXR1cm4gcmVzOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
YmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MmU0OGQzNmViMjY1NjA2Yzdk
MjFmODQ0YjI0ZGFiZTFjZjk2ODIyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxleW8u
Y29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVQYXJzZXJfaAorI2RlZmluZSBD
b29raWVQYXJzZXJfaAorCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlZlY3Rvci5oIgor
CituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgUGFyc2VkQ29va2llOworCitjbGFzcyBDb29raWVQYXJzZXIgeworcHVibGljOgor
ICAgIENvb2tpZVBhcnNlcihjb25zdCBLVVJMJiBkZWZhdWx0Q29va2llVVJMKTsKKyAgICB+Q29v
a2llUGFyc2VyKCk7CisKKyAgICAvLyBQYXJzZXMgYSBzZXF1ZW5jZSBvZiAiQ29va2llOiIgaGVh
ZGVyIGFuZCByZXR1cm4gdGhlIHBhcnNlZCBjb29raWVzLgorICAgIFZlY3RvcjxQYXJzZWRDb29r
aWUqPiBwYXJzZShjb25zdCBTdHJpbmcmIGNvb2tpZXMpOworCitwcml2YXRlOgorICAgIC8vIEZJ
WE1FOiBjdXJUaW1lLCBzdGFydCwgZW5kIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlbW92ZWQuIEFu
ZCB0aGlzIG1ldGhvZCBjYW4gYmUgcHVibGljLgorICAgIFBhcnNlZENvb2tpZSogcGFyc2VPbmVD
b29raWUoY29uc3QgU3RyaW5nJiBjb29raWUsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQs
IGRvdWJsZSBjdXJUaW1lKTsKKworICAgIEtVUkwgbV9kZWZhdWx0Q29va2llVVJMOworfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQ29va2llUGFyc2VyX2gKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFyc2VkQ29va2llLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFyc2VkQ29va2llLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4xZmY3ZmU2MDBhZTdlN2Q4M2IwOGQ4YTk5NTE2Y2RjMTAxMmJmODM0Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRD
b29raWUuY3BwCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAy
MDA5IEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29w
eXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhcnNlZENvb2tpZS5o
IgorCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgi
CisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlIDxjdXJs
L2N1cmwuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvU3RyaW5nQnVpbGRlci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhcnNlZENvb2tp
ZTo6UGFyc2VkQ29va2llKGRvdWJsZSBjdXJyZW50VGltZSkKKyAgICA6IG1fZXhwaXJ5KDApCisg
ICAgLCBtX2NyZWF0aW9uVGltZShjdXJyZW50VGltZSkKKyAgICAsIG1fbGFzdEFjY2Vzc2VkKGN1
cnJlbnRUaW1lKQorICAgICwgbV9pc01heEFnZVNldChmYWxzZSkKKyAgICAsIG1faGFzRGVmYXVs
dERvbWFpbihmYWxzZSkKKyAgICAsIG1faXNTZWN1cmUoZmFsc2UpCisgICAgLCBtX2lzSHR0cE9u
bHkoZmFsc2UpCisgICAgLCBtX2lzU2Vzc2lvbih0cnVlKQorICAgICwgbV9pc0ZvcmNlRXhwaXJl
ZChmYWxzZSkKK3sKK30KKworUGFyc2VkQ29va2llOjpQYXJzZWRDb29raWUoY29uc3QgU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3Qg
U3RyaW5nJiBwcm90b2NvbCwgY29uc3QgU3RyaW5nJiBwYXRoLCBkb3VibGUgZXhwaXJ5LCBkb3Vi
bGUgbGFzdEFjY2Vzc2VkLCBkb3VibGUgY3JlYXRpb25UaW1lLCBib29sIGlzU2VjdXJlLCBib29s
IGlzSHR0cE9ubHkpCisgICAgOiBtX25hbWUobmFtZSkKKyAgICAsIG1fdmFsdWUodmFsdWUpCisg
ICAgLCBtX2RvbWFpbihkb21haW4pCisgICAgLCBtX3Byb3RvY29sKHByb3RvY29sKQorICAgICwg
bV9wYXRoKHBhdGgpCisgICAgLCBtX2V4cGlyeShleHBpcnkpCisgICAgLCBtX2NyZWF0aW9uVGlt
ZShjcmVhdGlvblRpbWUpCisgICAgLCBtX2xhc3RBY2Nlc3NlZChsYXN0QWNjZXNzZWQpCisgICAg
LCBtX2lzTWF4QWdlU2V0KGZhbHNlKQorICAgICwgbV9oYXNEZWZhdWx0RG9tYWluKGZhbHNlKQor
ICAgICwgbV9pc1NlY3VyZShpc1NlY3VyZSkKKyAgICAsIG1faXNIdHRwT25seShpc0h0dHBPbmx5
KQorICAgICwgbV9pc1Nlc3Npb24oZmFsc2UpCisgICAgLCBtX2lzRm9yY2VFeHBpcmVkKGZhbHNl
KQoreworfQorCitQYXJzZWRDb29raWU6OlBhcnNlZENvb2tpZShjb25zdCBQYXJzZWRDb29raWUq
IGNvb2tpZSkKKyAgICA6IG1fbmFtZShTdHJpbmcoY29va2llLT5tX25hbWUpKQorICAgICwgbV92
YWx1ZShTdHJpbmcoY29va2llLT5tX3ZhbHVlKSkKKyAgICAsIG1fZG9tYWluKFN0cmluZyhjb29r
aWUtPm1fZG9tYWluKSkKKyAgICAsIG1fcHJvdG9jb2woU3RyaW5nKGNvb2tpZS0+bV9wcm90b2Nv
bCkpCisgICAgLCBtX3BhdGgoU3RyaW5nKGNvb2tpZS0+bV9wYXRoKSkKKyAgICAsIG1fZXhwaXJ5
KGNvb2tpZS0+bV9leHBpcnkpCisgICAgLCBtX2NyZWF0aW9uVGltZShjb29raWUtPm1fY3JlYXRp
b25UaW1lKQorICAgICwgbV9sYXN0QWNjZXNzZWQoY29va2llLT5tX2xhc3RBY2Nlc3NlZCkKKyAg
ICAsIG1faXNNYXhBZ2VTZXQoY29va2llLT5tX2lzTWF4QWdlU2V0KQorICAgICwgbV9oYXNEZWZh
dWx0RG9tYWluKGNvb2tpZS0+bV9oYXNEZWZhdWx0RG9tYWluKQorICAgICwgbV9pc1NlY3VyZShj
b29raWUtPm1faXNTZWN1cmUpCisgICAgLCBtX2lzSHR0cE9ubHkoY29va2llLT5tX2lzSHR0cE9u
bHkpCisgICAgLCBtX2lzU2Vzc2lvbihjb29raWUtPm1faXNTZXNzaW9uKQorICAgICwgbV9pc0Zv
cmNlRXhwaXJlZChjb29raWUtPm1faXNGb3JjZUV4cGlyZWQpCit7Cit9CisKK1BhcnNlZENvb2tp
ZTo6flBhcnNlZENvb2tpZSgpCit7Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjpzZXRFeHBpcnko
Y29uc3QgU3RyaW5nJiBleHBpcnkpCit7CisgICAgLy8gSWYgYSBjb29raWUgaGFzIGJvdGggdGhl
IE1heC1BZ2UgYW5kIHRoZSBFeHBpcmVzIGF0dHJpYnV0ZSwKKyAgICAvLyB0aGUgTWF4LUFnZSBh
dHRyaWJ1dGUgaGFzIHByZWNlZGVuY2UgYW5kIGNvbnRyb2xzIHRoZSBleHBpcmF0aW9uIGRhdGUg
b2YgdGhlIGNvb2tpZS4KKyAgICBpZiAobV9pc01heEFnZVNldCB8fCBleHBpcnkuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2lzU2Vzc2lvbiA9IGZhbHNlOworCisgICAgbV9l
eHBpcnkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGN1cmxfZ2V0ZGF0ZShleHBpcnkudXRmOCgpLmRh
dGEoKSwgMCkpOworCisgICAgaWYgKG1fZXhwaXJ5ID09IC0xKSB7CisgICAgICAgIExPR19FUlJP
UigiQ291bGQgbm90IHBhcnNlIGRhdGUiKTsKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBjb25z
aWRlciB0aGF0IHRoZSBjb29raWUgaXMgc2Vzc2lvbiBvbmx5CisgICAgICAgIG1faXNTZXNzaW9u
ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjpzZXRNYXhBZ2UoY29uc3Qg
U3RyaW5nJiBtYXhBZ2UpCit7CisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBIVFRQIENvb2tpZSBz
cGVjaWZpY2F0aW9uIChSRkM2MjY1LCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1
KSwKKyAgICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNhbiBiZSBhIERJR0lUIG9yIGEgIi0iLCBh
bmQgdGhlIHJlbWluZGVyCisgICAgLy8gb2YgdGhlIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4gRElH
SVQgY2hhcmFjdGVycy4KKyAgICBpZiAobWF4QWdlLmlzRW1wdHkoKSB8fCAobWF4QWdlWzBdICE9
ICctJyAmJiAhaXNBU0NJSURpZ2l0KG1heEFnZVswXSkpKSB7CisgICAgICAgIExPR19FUlJPUigi
Q291bGQgbm90IHBhcnNlIE1heC1BZ2UgOiAlcywgZmlyc3QgY2hhcmFjdGVyIGNhbiBvbmx5IGJl
ICctJyBvciBhc2NpaSBkaWdpdC4iLCBtYXhBZ2UuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgYm9vbCBvazsKKyAgICBpbnQgdmFsdWUgPSBtYXhBZ2UudG9J
bnRTdHJpY3QoJm9rKTsKKworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3Vs
ZCBub3QgcGFyc2UgTWF4LUFnZSA6ICVzIiwgbWF4QWdlLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBtX2V4cGlyeSA9IHZhbHVlOworICAgIG1faXNNYXhBZ2VT
ZXQgPSB0cnVlOworICAgIG1faXNTZXNzaW9uID0gZmFsc2U7CisKKyAgICAvLyBJZiBtYXhBZ2Ug
dmFsdWUgaXMgbm90IHBvc2l0aXZlLCBsZXQgZXhwaXJ5LXRpbWUgYmUgdGhlIGVhcmxpZXN0IHJl
cHJlc2VudGFibGUgdGltZS4KKyAgICBpZiAobV9leHBpcnkgPiAwKQorICAgICAgICBtX2V4cGly
eSArPSBjdXJyZW50VGltZSgpOworICAgIGVsc2UKKyAgICAgICAgbV9leHBpcnkgPSAwOworfQor
Cit2b2lkIFBhcnNlZENvb2tpZTo6c2V0RGVmYXVsdERvbWFpbihjb25zdCBLVVJMJiByZXF1ZXN0
VVJMKQoreworICAgIHNldERvbWFpbihyZXF1ZXN0VVJMLmhvc3QoKSk7CisgICAgbV9oYXNEZWZh
dWx0RG9tYWluID0gdHJ1ZTsKK30KKworYm9vbCBQYXJzZWRDb29raWU6Omhhc0V4cGlyZWQoKSBj
b25zdAoreworICAgIC8vIFNlc3Npb24gY29va2llcyBkbyBub3QgZXhwaXJlLCB0aGV5IHdpbGwg
anVzdCBub3QgYmUgc2F2ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUuCisgICAgcmV0dXJuICFtX2lz
U2Vzc2lvbiAmJiAobV9pc0ZvcmNlRXhwaXJlZCB8fCBtX2V4cGlyeSA8IGN1cnJlbnRUaW1lKCkp
OworfQorCitib29sIFBhcnNlZENvb2tpZTo6aXNVbmRlclNpemVMaW1pdCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fdmFsdWUubGVuZ3RoKCkgPD0gQ29va2llTWFuYWdlcjo6bWF4Q29va2llTGVu
Z3RoKCkgJiYgbV9uYW1lLmxlbmd0aCgpIDw9IENvb2tpZU1hbmFnZXI6Om1heENvb2tpZUxlbmd0
aCgpOworfQorCitTdHJpbmcgUGFyc2VkQ29va2llOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAg
U3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgIGJ1aWxkZXIuYXBwZW5kKG5hbWUoKSk7CisgICAg
YnVpbGRlci5hcHBlbmQoIiA9ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKHZhbHVlKCkpOworICAg
IGJ1aWxkZXIuYXBwZW5kKCI7IERvbWFpbiA9ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKGRvbWFp
bigpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiOyBQYXRoID0gIik7CisgICAgYnVpbGRlci5hcHBl
bmQocGF0aCgpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiOyBQcm90b2NvbCA9ICIpOworICAgIGJ1
aWxkZXIuYXBwZW5kKHByb3RvY29sKCkpOworICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7
Cit9CisKK1N0cmluZyBQYXJzZWRDb29raWU6OnRvTmFtZVZhbHVlUGFpcigpIGNvbnN0Cit7Cisg
ICAgc3RhdGljIGNvbnN0IFN0cmluZyBlcXVhbCgiPSIpOworCisgICAgc2l6ZV90IGNvb2tpZUxl
bmd0aCA9IG1fbmFtZS5sZW5ndGgoKSArIG1fdmFsdWUubGVuZ3RoKCkgKyAyOworICAgIFZlY3Rv
cjxVQ2hhcj4gcmVzdWx0OworICAgIHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNvb2tp
ZUxlbmd0aCk7CisgICAgYXBwZW5kKHJlc3VsdCwgbV9uYW1lKTsKKyAgICBhcHBlbmQocmVzdWx0
LCBlcXVhbCk7CisgICAgYXBwZW5kKHJlc3VsdCwgbV92YWx1ZSk7CisKKyAgICByZXR1cm4gU3Ry
aW5nOjphZG9wdChyZXN1bHQpOworfQorCit2b2lkIFBhcnNlZENvb2tpZTo6YXBwZW5kV2ViQ29y
ZUNvb2tpZShWZWN0b3I8Q29va2llPiYgY29va2llVmVjdG9yKSBjb25zdAoreworICAgIGNvb2tp
ZVZlY3Rvci5hcHBlbmQoQ29va2llKFN0cmluZyhtX25hbWUpLCBTdHJpbmcobV92YWx1ZSksIFN0
cmluZyhtX2RvbWFpbiksCisgICAgICAgICAgICBTdHJpbmcobV9wYXRoKSwgbV9leHBpcnksIG1f
aXNIdHRwT25seSwgbV9pc1NlY3VyZSwgbV9pc1Nlc3Npb24pKTsKK30KK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkv
UGFyc2VkQ29va2llLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNl
ZENvb2tpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmNhMzQzZDEzZjNlNWZjNTVmMzg0NGRjOWNiOTlhMzdhNmNi
OThlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2Jl
cnJ5L1BhcnNlZENvb2tpZS5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4LCAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29t
PgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBQYXJzZWRDb29raWVfaAorI2RlZmluZSBQYXJz
ZWRDb29raWVfaAorCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSA8d3RmL0Zhc3RBbGxv
Y0Jhc2UuaD4KKworbmFtZXNwYWNlIFdURiB7CitjbGFzcyBTdHJpbmc7Cit9CituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIEtVUkw7CisKKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNv
b2tpZSBpbnRlcm5hbGx5CisvLyBJdCBjYW4gZWl0aGVyIGJlIGNyZWF0ZWQgYnkgdGhlIENvb2tp
ZVBhcnNlciB3aGljaCB3aWxsIHRoZW4gZmlsbCBpdAorLy8gb3IgaXQgY2FuIGJlIGNyZWF0ZWQg
YnkgdGhlIGJhY2tpbmcgc3RvcmUgZmlsbGluZyBpdCBpbiB0aGUgY29uc3RydWN0b3IuCitjbGFz
cyBQYXJzZWRDb29raWUgeworV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAg
Ly8gRGVmYXVsdCBjb29raWUgOiBlbXB0eSBkb21haW4sIG5vbiBzZWN1cmUgYW5kIHNlc3Npb24K
KyAgICBQYXJzZWRDb29raWUoZG91YmxlIGN1cnJlbnRUaW1lKTsKKworICAgIC8vIEZvciBiYWNr
aW5nIHN0b3JlIGNvb2tpZXMgKHRob3NlIGNvb2tpZXMgYXJlIG5ldmVyIHNlc3Npb24gY29va2ll
cykuCisgICAgUGFyc2VkQ29va2llKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0IFN0cmluZyYgcHJvdG9jb2wsIGNvbnN0
IFN0cmluZyYgcGF0aCwgZG91YmxlIGV4cGlyeSwgZG91YmxlIGxhc3RBY2Nlc3NlZCwgZG91Ymxl
IGNyZWF0aW9uVGltZSwgYm9vbCBpc1NlY3VyZSwgYm9vbCBpc0h0dHBPbmx5KTsKKworICAgIFBh
cnNlZENvb2tpZShjb25zdCBQYXJzZWRDb29raWUqKTsKKworICAgIH5QYXJzZWRDb29raWUoKTsK
KworICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAg
IHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorCisg
ICAgY29uc3QgU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2
b2lkIHNldFZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9CisK
KyAgICBjb25zdCBTdHJpbmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBtX3BhdGg7IH0KKyAgICB2
b2lkIHNldFBhdGgoY29uc3QgU3RyaW5nJiBwYXRoKSB7IG1fcGF0aCA9IHBhdGg7IH0KKworICAg
IGNvbnN0IFN0cmluZyYgZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbV9kb21haW47IH0KKyAgICB2
b2lkIHNldERvbWFpbihjb25zdCBTdHJpbmcmIGRvbWFpbikgeyBtX2RvbWFpbiA9IGRvbWFpbi5s
b3dlcigpOyB9CisKKyAgICBjb25zdCBTdHJpbmcmIHByb3RvY29sKCkgY29uc3QgeyByZXR1cm4g
bV9wcm90b2NvbDsgfQorICAgIHZvaWQgc2V0UHJvdG9jb2woY29uc3QgU3RyaW5nJiBwcm90b2Nv
bCkgeyBtX3Byb3RvY29sID0gcHJvdG9jb2w7IH0KKworICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFs
IG1ldGhvZCB1c2VkIHRvIHNldCB0aGUgZG9tYWluIHRvIHRoZSByZXF1ZXN0J3MgdXJsLgorICAg
IHZvaWQgc2V0RGVmYXVsdERvbWFpbihjb25zdCBLVVJMJik7CisgICAgYm9vbCBoYXNEZWZhdWx0
RG9tYWluKCkgY29uc3QgeyByZXR1cm4gbV9oYXNEZWZhdWx0RG9tYWluOyB9CisKKyAgICBkb3Vi
bGUgZXhwaXJ5KCkgY29uc3QgeyByZXR1cm4gbV9leHBpcnk7IH0KKyAgICB2b2lkIHNldEV4cGly
eShjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGZvcmNlRXhwaXJlKCkgeyBtX2lzRm9yY2VFeHBp
cmVkICA9IHRydWU7IH0KKyAgICB2b2lkIHNldE1heEFnZShjb25zdCBTdHJpbmcmKTsKKworICAg
IGRvdWJsZSBsYXN0QWNjZXNzZWQoKSBjb25zdCB7IHJldHVybiBtX2xhc3RBY2Nlc3NlZDsgfQor
ICAgIHZvaWQgc2V0TGFzdEFjY2Vzc2VkKGRvdWJsZSBsYXN0QWNjZXNzZWQpIHsgbV9sYXN0QWNj
ZXNzZWQgPSBsYXN0QWNjZXNzZWQ7fQorCisgICAgZG91YmxlIGNyZWF0aW9uVGltZSgpIGNvbnN0
IHsgcmV0dXJuIG1fY3JlYXRpb25UaW1lOyB9CisgICAgdm9pZCBzZXRDcmVhdGlvblRpbWUoZG91
YmxlIGNyZWF0aW9uVGltZSkgeyBtX2NyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsgfQorCisg
ICAgYm9vbCBpc1NlY3VyZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNTZWN1cmU7IH0KKyAgICB2b2lk
IHNldFNlY3VyZUZsYWcoYm9vbCBzZWN1cmUpIHsgbV9pc1NlY3VyZSA9IHNlY3VyZTsgfQorCisg
ICAgYm9vbCBpc0h0dHBPbmx5KCkgY29uc3QgeyByZXR1cm4gbV9pc0h0dHBPbmx5OyB9CisgICAg
dm9pZCBzZXRJc0h0dHBPbmx5KGJvb2wgaXNIdHRwT25seSkgeyBtX2lzSHR0cE9ubHkgPSBpc0h0
dHBPbmx5OyB9CisKKyAgICBib29sIGlzU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1faXNTZXNz
aW9uOyB9CisKKyAgICBib29sIGhhc0V4cGlyZWQoKSBjb25zdDsKKyAgICBib29sIGlzRm9yY2VF
eHBpcmVkKCkgY29uc3QgeyByZXR1cm4gbV9pc0ZvcmNlRXhwaXJlZDsgfQorICAgIGJvb2wgaXNV
bmRlclNpemVMaW1pdCgpIGNvbnN0OworCisgICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Cisg
ICAgU3RyaW5nIHRvTmFtZVZhbHVlUGFpcigpIGNvbnN0OworICAgIHZvaWQgYXBwZW5kV2ViQ29y
ZUNvb2tpZShWZWN0b3I8Q29va2llPiYgY29va2llVmVjdG9yKSBjb25zdDsKKworcHJpdmF0ZToK
KyAgICBTdHJpbmcgbV9uYW1lOworICAgIFN0cmluZyBtX3ZhbHVlOworICAgIFN0cmluZyBtX2Rv
bWFpbjsKKyAgICBTdHJpbmcgbV9wcm90b2NvbDsKKyAgICBTdHJpbmcgbV9wYXRoOworICAgIGRv
dWJsZSBtX2V4cGlyeTsKKyAgICBkb3VibGUgbV9jcmVhdGlvblRpbWU7CisgICAgLy8gVGhpcyBp
cyB1c2VkIGZvciB0aGUgTFJVIHJlcGxhY2VtZW50IHBvbGljeS4KKyAgICBkb3VibGUgbV9sYXN0
QWNjZXNzZWQ7CisKKyAgICBib29sIG1faXNNYXhBZ2VTZXQ7CisgICAgYm9vbCBtX2hhc0RlZmF1
bHREb21haW47CisgICAgYm9vbCBtX2lzU2VjdXJlOworICAgIGJvb2wgbV9pc0h0dHBPbmx5Owor
ICAgIGJvb2wgbV9pc1Nlc3Npb247CisgICAgYm9vbCBtX2lzRm9yY2VFeHBpcmVkOworfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUGFyc2VkQ29va2llX2gKZGlmZiAt
LWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBiZmY3N2I4YTQ0ODk1N2U1MGU4NDZj
NzEyMjY5MzJiY2Q2MjdlMTI3Li5iNDg4YmZiNThiYjVlOGUxMzc0MWQzMzI4OWJhNmNmZmU3NDdh
MDBkIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUg
QEAKKzIwMTItMDItMjIgIEtvbnJhZCBQaWFzY2lrICA8a3BpYXNjaWtAcmltLmNvbT4KKworICAg
ICAgICBVcHN0cmVhbSBCbGFja0JlcnJ5IENvb2tpZSBNYW5hZ2VtZW50IENsYXNzZXMKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjU0CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTWFudWFsIHRlc3QgdG8g
c2VlIGluIG1pbGxpc2Vjb25kcyBob3cgcXVpY2tseSAxMDAgd3JpdGVzIGZvbGxvd2VkIGJ5IDEw
MCByZWFkcyB0YWtlLgorICAgICAgICBUaGlzIHRlc3QgaXMgcmFuIHR3aWNlIGFuZCB0aGUgYXZl
cmFnZSByZWFkIGFuZCB3cml0ZSBmb3IgZWFjaCBvZiB0aGUgMiBydW5zIGlzIHNob3duLgorCisg
ICAgICAgICogTWFudWFsVGVzdHMvY29va2llU3BlZWRUZXN0Lmh0bWw6IEFkZGVkLgorCiAyMDEy
LTAyLTIwICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgogCiAgICAgICAgIHBlcmYt
by1tYXRpYzogRXh0cmFjdCBsb2dpYyB0byBnZW5lcmF0ZSBKU09OIHJlc3BvbnNlcyBhcyBjbGFz
c2VzIHRvIHVuaXQgdGVzdApkaWZmIC0tZ2l0IGEvTWFudWFsVGVzdHMvY29va2llU3BlZWRUZXN0
Lmh0bWwgYi9NYW51YWxUZXN0cy9jb29raWVTcGVlZFRlc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43NjBm
N2RjNDc5ZTQyNWRhMzYxOTJjMGM0NmI0MDdiYmRlOWI2MGJmCi0tLSAvZGV2L251bGwKKysrIGIv
TWFudWFsVGVzdHMvY29va2llU3BlZWRUZXN0Lmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPGh0bWw+
PGhlYWQ+PHRpdGxlPkNvb2tpZSBUZXN0PC90aXRsZT4KKzxzY3JpcHQ+CitmdW5jdGlvbiBjb29r
aWVUZXN0KCl7CisgICAgdmFyIHRvdGFsVyA9IDAuMDsKKyAgICB2YXIgdG90YWxSID0gMC4wOwor
ICAgIGZvcih2YXIgaT0wOyBpIDwgMTAwOyBpKyspeworICAgICAgICB2YXIgcmFuZG9tTnVtYmVy
PU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxMSk7CisgICAgICAgIHZhciB0aW1lID0gbmV3IERh
dGUoKTsKKyAgICAgICAgdGltZS5zZXRUaW1lKHRpbWUuZ2V0VGltZSgpICsgMTAwMCk7CisgICAg
ICAgIHZhciBjb29raWVTdHJpbmcgPSAiY29va2llIiArIHJhbmRvbU51bWJlciArICI9dHJ1ZTsg
ZXhwaXJlcz0iICsgdGltZS50b0dNVFN0cmluZygpOworICAgICAgICB2YXIgcHJlVyA9IG5ldyBE
YXRlKCkuZ2V0VGltZSgpOworICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVTdHJpbmc7
CisgICAgICAgIHZhciBwb3N0VyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBpZihk
b2N1bWVudC5jb29raWUuaW5kZXhPZigoImNvb2tpZSIgKyByYW5kb21OdW1iZXIpPiAwKSk7Cisg
ICAgICAgIHZhciBwb3N0UiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICB0b3RhbFcg
Kz0gKHBvc3RXIC0gcHJlVyk7CisgICAgICAgIHRvdGFsUiArPSAocG9zdFIgLSBwb3N0Vyk7Cisg
ICAgfQorICAgIGRvY3VtZW50LndyaXRlKCI8YnI+PGJyPmF2ZyBSKG1pbGxpcyk6IiArIHRvdGFs
Ui8xMDApOworICAgIGRvY3VtZW50LndyaXRlKCI8YnI+YXZnIFcobWlsbGlzKToiICsgdG90YWxX
LzEwMCk7Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSJqYXZhc2NyaXB0
OmNvb2tpZVRlc3QoKTtzZXRUaW1lb3V0KGNvb2tpZVRlc3QoKSwgMTAwMCk7Ij4KKzwvYm9keT4K
KzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128534</attachid>
            <date>2012-02-23 12:20:47 -0800</date>
            <delta_ts>2012-02-23 20:34:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73654-20120223152124.patch</filename>
            <type>text/plain</type>
            <size>107031</size>
            <attacher name="Konrad Piascik">kpiascik</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTkwNGZmYTlmZThhMjRm
Y2Y4NDg2MmJjYmZjYmY0YTAwNWFiODE1OS4uZjA4OTZkNzFkZTc1ODlhNWIwNzkyOTQwODZjZjk0
Njc5OTgzNmRiMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI3IEBACisyMDEyLTAyLTIzICBLb25y
YWQgUGlhc2NpayAgPGtwaWFzY2lrQHJpbS5jb20+CisKKyAgICAgICAgVXBzdHJlYW0gQmxhY2tC
ZXJyeSBDb29raWUgTWFuYWdlbWVudCBDbGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZGVkIE1hbnVhbFRlc3RzL2Nvb2tpZVNwZWVkVGVzdC5o
dG1sIGFzIHdlbGwgYXMgdGVzdGVkIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgb24gdGhlIEJsYWNr
QmVycnkgcG9ydCB3aXRoIGh0dHA6Ly90ZXN0c3VpdGVzLm9wZXJhLmNvbS9jb29raWVzLworICAg
ICAgICBQYXNzZXMgYWxsIG5vbiBDb29raWUgMiB0ZXN0cyBzaW5jZSBDb29raWUgMiBpcyBub3Qg
aW1wbGVtZW50ZWQvc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgRXJyb3IgaGFuZGxp
bmcgYW5kIGV4dGVuZGVkIHRlc3RzIGRvIG5vdCBhbGwgcGFzcyBhbmQgd2lsbCBiZSB1cGRhdGVk
IHdpdGggZnV0dXJlIGJ1Z3MvcGF0Y2hlcy4KKworICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVy
cnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmg6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llSmFyQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFwLmg6IEFkZGVkLgorICAgICAgICAqIHBs
YXRmb3JtL2JsYWNrYmVycnkvQ29va2llUGFyc2VyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vYmxhY2tiZXJyeS9Db29raWVQYXJzZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgQW5kcmV5
IEtvc3lha292ICA8Y2FzZXFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6
IFtleHBlcmltZW50YWxdIGFkZCBhIG1vZGUgdG8gZGlzcGxheSB0aW1lbGluZSBldmVudHMgYWxp
Z25lZCBieSB0aGUgc3RhcnQgdGltZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi43MzE5Y2IwNDVlODUwMmNmZDllZGZiMjUxZThlMmUwN2I2YTBlZDBjCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCAr
MSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNo
YWZmcmFpeEBwbGV5by5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjZGVmaW5lIEVOQUJMRV9D
T09LSUVfREVCVUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llRGF0
YWJhc2VCYWNraW5nU3RvcmUuaCIKKworI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNs
dWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiU1FM
aXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSAiU1FMaXRlVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5n
Lmg+CisKKyNpZiBFTkFCTEVfQ09PS0lFX0RFQlVHCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtTG9nLmg+CisjZGVmaW5lIENvb2tpZUxvZyhmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCBmb3Jt
YXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4u
KQorI2VuZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1FeGVjdXRhYmxlTWVzc2Fn
ZS5oPgorCit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TWVzc2FnZUNsaWVudDsKK3VzaW5n
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUeXBlZFJlcGx5QnVmZmVyOwordXNpbmcgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlOworCitzdGF0aWMgY29uc3QgZG91
YmxlIHNfZGF0YWJhc2VUaW1lckludGVydmFsID0gMjsKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUo
KQorICAgIDogTWVzc2FnZUNsaWVudChNZXNzYWdlQ2xpZW50OjpSZXBseUZlYXR1cmUgfCBNZXNz
YWdlQ2xpZW50OjpTeW5jRmVhdHVyZSkKKyAgICAsIG1fdGFibGVOYW1lKCJjb29raWVzIikgLy8g
VGhpcyBpcyBjaG9zZW4gdG8gbWF0Y2ggTW96aWxsYSdzIHRhYmxlIG5hbWUuCisgICAgLCBtX2Ri
VGltZXIodGhpcywgJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0
YWJhc2VUaW1lckZpcmVkKQorICAgICwgbV9pbnNlcnRTdGF0ZW1lbnQoMCkKKyAgICAsIG1fdXBk
YXRlU3RhdGVtZW50KDApCisgICAgLCBtX2RlbGV0ZVN0YXRlbWVudCgwKQoreworICAgIG1fZGJU
aW1lckNsaWVudCA9IG5ldyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R2VuZXJpY1RpbWVyQ2xpZW50
KHRoaXMpOworICAgIG1fZGJUaW1lci5zZXRDbGllbnQobV9kYlRpbWVyQ2xpZW50KTsKKworICAg
IHB0aHJlYWRfYXR0cl90IHRocmVhZEF0dHJzOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJl
YWRBdHRycyk7CisgICAgY3JlYXRlVGhyZWFkKCJjb29raWVfZGF0YWJhc2UiLCB0aHJlYWRBdHRy
cyk7Cit9CisKK0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp+Q29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBtX2RiVGltZXJDbGllbnQ7CisgICAgbV9kYlRpbWVy
Q2xpZW50ID0gMDsKKyAgICAvLyBGSVhNRTogVGhpcyBvYmplY3Qgd2lsbCBuZXZlciBiZSBkZWxl
dGVkIGR1ZSB0byB0aGUgc2V0IHVwIG9mIENvb2tpZU1hbmFnZXIgKGl0J3MgYSBzaW5nbGV0b24p
CisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBEZXN0cnVjdGluZyIpOworI2lm
bmRlZiBOREVCVUcKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIEFTU0VSVChtX2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAgfQorI2VuZGlm
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnVwZ3JhZGVUYWJsZUlmTmVl
ZGVkKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VGaWVsZHMsIGNvbnN0IFN0cmluZyYgcHJpbWFyeUtl
eUZpZWxkcykKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgYm9vbCBj
cmVhdGlvblRpbWVFeGlzdHMgPSBmYWxzZTsKKyAgICBib29sIHByb3RvY29sRXhpc3RzID0gZmFs
c2U7CisKKyAgICBpZiAoIW1fZGIudGFibGVFeGlzdHMobV90YWJsZU5hbWUpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgdGFibGUgaGFzIHRoZSByZXF1
aXJlZCBkYXRhYmFzZSBmaWVsZHMKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJQUkFH
TUEgdGFibGVfaW5mbygiICsgbV90YWJsZU5hbWUgKyAiKTsiOworCisgICAgICAgIFNRTGl0ZVN0
YXRlbWVudCBzdGF0ZW1lbnQobV9kYiwgcXVlcnkpOworICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgcHJlcGFyZSBzdGF0ZW1l
bnQgdG8gcXVlcnkgY29va2llIHRhYmxlIGluZm8uIHNxbDolcyIsIHF1ZXJ5LnV0ZjgoKS5kYXRh
KCkpOworICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpID09IFNRTFJlc3VsdFJvdykgeworICAgICAg
ICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIGNyZWF0aW9uVGltZSwgKCJjcmVhdGlv
blRpbWUiKSk7CisgICAgICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgcHJvdG9j
b2wsICgicHJvdG9jb2wiKSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHN0YXRlbWVudC5n
ZXRDb2x1bW5UZXh0KDEpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gY3JlYXRpb25UaW1lKQor
ICAgICAgICAgICAgICAgIGNyZWF0aW9uVGltZUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICBp
ZiAobmFtZSA9PSBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICBwcm90b2NvbEV4aXN0cyA9IHRy
dWU7CisgICAgICAgICAgICBpZiAoY3JlYXRpb25UaW1lRXhpc3RzICYmIHByb3RvY29sRXhpc3Rz
KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMT0coTmV0d29y
aywgIk5lZWQgdG8gdXBkYXRlIGNvb2tpZSB0YWJsZSBzY2hlbWEuIik7CisgICAgfQorCisgICAg
Ly8gRHJvcCBhbmQgcmVjcmVhdGUgdGhlIGNvb2tpZSB0YWJsZSB0byB1cGRhdGUgdG8gdGhlIGxh
dGVzdCBkYXRhYmFzZSBmaWVsZHMuCisgICAgLy8gV2UgZG8gbm90IHVzZSBhbHRlciB0YWJsZSAt
IGFkZCBjb2x1bW4gYmVjYXVzZSB0aGF0IG1ldGhvZCBjYW5ub3QgYWRkIHByaW1hcnkga2V5cy4K
KyAgICBWZWN0b3I8U3RyaW5nPiBjb21tYW5kczsKKworICAgIC8vIEJhY2t1cCBleGlzdGluZyB0
YWJsZQorICAgIFN0cmluZyByZW5hbWVRdWVyeSA9ICJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5h
bWUgKyAiIFJFTkFNRSBUTyBCYWNrdXBfIiArIG1fdGFibGVOYW1lICsgIjsiOworICAgIGNvbW1h
bmRzLmFwcGVuZChyZW5hbWVRdWVyeSk7CisKKyAgICAvLyBSZWNyZWF0ZSB0aGUgY29va2llIHRh
YmxlIHVzaW5nIHRoZSBuZXcgZGF0YWJhc2UgYW5kIHByaW1hcnkga2V5IGZpZWxkcworICAgIFN0
cmluZyBjcmVhdGVUYWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgIik7CisgICAgY3JlYXRlVGFibGVR
dWVyeSArPSBtX3RhYmxlTmFtZTsKKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIgKyBkYXRh
YmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzICsgIik7IjsKKyAgICBjb21tYW5k
cy5hcHBlbmQoY3JlYXRlVGFibGVRdWVyeSk7CisKKyAgICAvLyBDb3B5IHRoZSBvbGQgZGF0YSBp
bnRvIHRoZSBuZXcgdGFibGUuIElmIGEgY29sdW1uIGRvZXMgbm90IGV4aXN0cywKKyAgICAvLyB3
ZSBoYXZlIHRvIHB1dCBhICcnIGluIHRoZSBzZWxlY3Qgc3RhdGVtZW50IHRvIG1ha2UgdGhlIG51
bWJlciBvZiBjb2x1bW5zCisgICAgLy8gZXF1YWwgaW4gdGhlIGluc2VydCBzdGF0ZW1lbnQuCisg
ICAgU3RyaW5nIG1pZ3JhdGlvblF1ZXJ5KCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICIpOworICAg
IG1pZ3JhdGlvblF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIG1pZ3JhdGlvblF1ZXJ5ICs9ICIg
U0VMRUNUICoiOworICAgIGlmICghY3JlYXRpb25UaW1lRXhpc3RzKQorICAgICAgICBtaWdyYXRp
b25RdWVyeSArPSAiLCcnIjsKKyAgICBpZiAoIXByb3RvY29sRXhpc3RzKQorICAgICAgICBtaWdy
YXRpb25RdWVyeSArPSAiLCcnIjsKKyAgICBtaWdyYXRpb25RdWVyeSArPSAiIEZST00gQmFja3Vw
XyIgKyBtX3RhYmxlTmFtZTsKKyAgICBjb21tYW5kcy5hcHBlbmQobWlncmF0aW9uUXVlcnkpOwor
CisgICAgLy8gVGhlIG5ldyBjb2x1bW5zIHdpbGwgYmUgYmxhbmssIHNldCB0aGUgbmV3IHZhbHVl
cy4KKyAgICBpZiAoIWNyZWF0aW9uVGltZUV4aXN0cykgeworICAgICAgICBTdHJpbmcgc2V0Q3Jl
YXRpb25UaW1lUXVlcnkgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIgU0VUIGNyZWF0aW9u
VGltZSA9IGxhc3RBY2Nlc3NlZDsiOworICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2V0Q3JlYXRp
b25UaW1lUXVlcnkpOworICAgIH0KKworICAgIGlmICghcHJvdG9jb2xFeGlzdHMpIHsKKyAgICAg
ICAgU3RyaW5nIHNldFByb3RvY29sUXVlcnkgPSAiVVBEQVRFICIgKyBtX3RhYmxlTmFtZSArICIg
U0VUIHByb3RvY29sID0gJ2h0dHAnIFdIRVJFIGlzU2VjdXJlID0gJzAnOyI7CisgICAgICAgIFN0
cmluZyBzZXRQcm90b2NvbFF1ZXJ5MiA9ICJVUERBVEUgIiArIG1fdGFibGVOYW1lICsgIiBTRVQg
cHJvdG9jb2wgPSAnaHR0cHMnIFdIRVJFIGlzU2VjdXJlID0gJzEnOyI7CisgICAgICAgIGNvbW1h
bmRzLmFwcGVuZChzZXRQcm90b2NvbFF1ZXJ5KTsKKyAgICAgICAgY29tbWFuZHMuYXBwZW5kKHNl
dFByb3RvY29sUXVlcnkyKTsKKyAgICB9CisKKyAgICAvLyBEcm9wIHRoZSBiYWNrdXAgdGFibGUK
KyAgICBTdHJpbmcgZHJvcEJhY2t1cFF1ZXJ5ID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTIEJhY2t1
cF8iICsgbV90YWJsZU5hbWUgKyAiOyI7CisgICAgY29tbWFuZHMuYXBwZW5kKGRyb3BCYWNrdXBR
dWVyeSk7CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RiLCBmYWxzZSk7
CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKyAgICBzaXplX3QgY29tbWFuZFNpemUgPSBjb21t
YW5kcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21tYW5kU2l6ZTsgKytp
KSB7CisgICAgICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZChjb21tYW5kc1tpXSkpIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFsdGVyIGNvb2tpZSB0YWJsZSB3aGVuIGV4
ZWN1dGluZyBzcWw6JXMiLCBjb21tYW5kc1tpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAg
IExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjaygpOworCisgICAgICAgICAgICAv
LyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBpZiB3ZSBkbywgcmVuYW1lIHRoZSBjdXJy
ZW50IGNvb2tpZSB0YWJsZSBmb3IgZnV0dXJlIHJlc3RvcmF0aW9uLiBUaGlzIGhhcyB0aGUgc2lk
ZSBlZmZlY3Qgb2YKKyAgICAgICAgICAgIC8vIGNsZWFyaW5nIHRoZSBjdXJyZW50IGNvb2tpZSB0
YWJsZSwgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiBjb250aW51YWxseSBoaXR0aW5nIHRoaXMgY2Fz
ZSBhbmQgaGVuY2UgbmV2ZXIgYmVpbmcgYWJsZSB0byB1c2UgdGhlCisgICAgICAgICAgICAvLyBj
b29raWUgdGFibGUuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgIFN0cmluZyByZW5hbWVRdWVyeSA9ICJBTFRFUiBUQUJMRSAiICsgbV90YWJsZU5hbWUgKyAi
IFJFTkFNRSBUTyBCYWNrdXAyXyIgKyBtX3RhYmxlTmFtZSArICI7IjsKKyAgICAgICAgICAgIGlm
ICghbV9kYi5leGVjdXRlQ29tbWFuZChyZW5hbWVRdWVyeSkpIHsKKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoIkZhaWxlZCB0byBiYWNrdXAgZXhpc3RpbmcgY29va2llIHRhYmxlLiIpOworICAg
ICAgICAgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5s
YXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICB9CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgTE9HKE5ldHdvcmss
ICJTdWNjZXNzZnVsbHkgdXBkYXRlZCBjb29raWUgdGFibGUgc2NoZW1hLiIpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpvcGVuKGNvbnN0IFN0cmluZyYgY29va2llSmFy
KQoreworICAgIGRpc3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6Omludm9rZU9wZW4sIHRoaXMsIGNvb2tpZUphcikpOworfQor
Cit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VPcGVuKGNvbnN0IFN0cmlu
ZyYgY29va2llSmFyKQoreworICAgIEFTU0VSVChpc0N1cnJlbnRUaHJlYWQoKSk7CisgICAgaWYg
KG1fZGIuaXNPcGVuKCkpCisgICAgICAgIGNsb3NlKCk7CisKKyAgICBpZiAoIW1fZGIub3Blbihj
b29raWVKYXIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IG9wZW4gdGhlIGNvb2tp
ZSBkYXRhYmFzZS4gTm8gY29va2llIHdpbGwgYmUgc3RvcmVkISIpOworICAgICAgICBMT0dfRVJS
T1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYi5leGVjdXRlQ29tbWFuZCgiUFJBR01BIGxv
Y2tpbmdfbW9kZT1FWENMVVNJVkU7Iik7CisgICAgbV9kYi5leGVjdXRlQ29tbWFuZCgiUFJBR01B
IGpvdXJuYWxfbW9kZT1UUlVOQ0FURTsiKTsKKworICAgIGNvbnN0IFN0cmluZyBwcmltYXJ5S2V5
RmllbGRzKCJQUklNQVJZIEtFWSAocHJvdG9jb2wsIGhvc3QsIHBhdGgsIG5hbWUpIik7CisgICAg
Y29uc3QgU3RyaW5nIGRhdGFiYXNlRmllbGRzKCJuYW1lIFRFWFQsIHZhbHVlIFRFWFQsIGhvc3Qg
VEVYVCwgcGF0aCBURVhULCBleHBpcnkgRE9VQkxFLCBsYXN0QWNjZXNzZWQgRE9VQkxFLCBpc1Nl
Y3VyZSBJTlRFR0VSLCBpc0h0dHBPbmx5IElOVEVHRVIsIGNyZWF0aW9uVGltZSBET1VCTEUsIHBy
b3RvY29sIFRFWFQiKTsKKyAgICAvLyBVcGRhdGUgdGFibGUgdG8gYWRkIHRoZSBuZXcgY29sdW1u
IGNyZWF0aW9uVGltZSBhbmQgcHJvdG9jb2wgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5Lgor
ICAgIHVwZ3JhZGVUYWJsZUlmTmVlZGVkKGRhdGFiYXNlRmllbGRzLCBwcmltYXJ5S2V5RmllbGRz
KTsKKworICAgIC8vIENyZWF0ZSB0YWJsZSBpZiBub3QgZXhzaXN0IGluIGNhc2UgdGhhdCB0aGUg
dXBncmFkZVRhYmxlSWZOZWVkZWQoKSBmYWlsZWQgYWNjaWRlbnRhbGx5LgorICAgIFN0cmluZyBj
cmVhdGVUYWJsZVF1ZXJ5KCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiKTsKKyAgICBjcmVh
dGVUYWJsZVF1ZXJ5ICs9IG1fdGFibGVOYW1lOworICAgIC8vIFRoaXMgdGFibGUgc2NoZW1hIGlz
IGNvbXBsaWFudCB3aXRoIE1vemlsbGEncy4KKyAgICBjcmVhdGVUYWJsZVF1ZXJ5ICs9ICIgKCIg
KyBkYXRhYmFzZUZpZWxkcyArICIsICIgKyBwcmltYXJ5S2V5RmllbGRzKyIpOyI7CisKKyAgICBp
ZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoY3JlYXRlVGFibGVRdWVyeSkpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgY29va2llcyBp
bnRvLiBObyBjb29raWUgd2lsbCBiZSBzdG9yZWQhIik7CisgICAgICAgIExPR19FUlJPUigiU1FM
aXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGNs
b3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcgaW5zZXJ0UXVlcnko
IklOU0VSVCBPUiBSRVBMQUNFIElOVE8gIik7CisgICAgaW5zZXJ0UXVlcnkgKz0gbV90YWJsZU5h
bWU7CisgICAgaW5zZXJ0UXVlcnkgKz0gIiAobmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGly
eSwgbGFzdEFjY2Vzc2VkLCBpc1NlY3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90
b2NvbCkgVkFMVUVTICg/MSwgPzIsID8zLCA/NCwgPzUsID82LCA/NywgPzgsID85LCA/MTApOyI7
CisKKyAgICBtX2luc2VydFN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgaW5z
ZXJ0UXVlcnkpOworICAgIGlmIChtX2luc2VydFN0YXRlbWVudC0+cHJlcGFyZSgpKSB7CisgICAg
ICAgIExPR19FUlJPUigiQ2Fubm90IHNhdmUgY29va2llcyIpOworICAgICAgICBMT0dfRVJST1Io
IlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0K
KworICAgIFN0cmluZyB1cGRhdGVRdWVyeSgiVVBEQVRFICIpOworICAgIHVwZGF0ZVF1ZXJ5ICs9
IG1fdGFibGVOYW1lOworICAgIC8vIFRoZSB3aGVyZSBzdGF0ZW1lbnQgaXMgY2hvc2VuIHRvIG1h
dGNoIENvb2tpZU1hcCBrZXkuCisgICAgdXBkYXRlUXVlcnkgKz0gIiBTRVQgbmFtZSA9ID8xLCB2
YWx1ZSA9ID8yLCBob3N0ID0gPzMsIHBhdGggPSA/NCwgZXhwaXJ5ID0gPzUsIGxhc3RBY2Nlc3Nl
ZCA9ID82LCBpc1NlY3VyZSA9ID83LCBpc0h0dHBPbmx5ID0gPzgsIGNyZWF0aW9uVGltZSA9ID85
LCBwcm90b2NvbCA9ID8xMCB3aGVyZSBwcm90b2NvbCA9ID8xMCBhbmQgbmFtZSA9ID8xIGFuZCBo
b3N0ID0gPzMgYW5kIHBhdGggPSA/NDsiOworICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gbmV3IFNR
TGl0ZVN0YXRlbWVudChtX2RiLCB1cGRhdGVRdWVyeSk7CisKKyAgICBpZiAobV91cGRhdGVTdGF0
ZW1lbnQtPnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCB1cGRhdGUgY29v
a2llcyIpOworICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1f
ZGIubGFzdEVycm9yTXNnKCkpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVM
RVRFIEZST00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgLy8gVGhl
IHdoZXJlIHN0YXRlbWVudCBpcyBjaG9zZW4gdG8gbWF0Y2ggQ29va2llTWFwIGtleS4KKyAgICBk
ZWxldGVRdWVyeSArPSAiIFdIRVJFIG5hbWU9PzEgYW5kIGhvc3Q9PzIgYW5kIHBhdGg9PzMgYW5k
IHByb3RvY29sPT80OyI7CisgICAgbV9kZWxldGVTdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVt
ZW50KG1fZGIsIGRlbGV0ZVF1ZXJ5KTsKKworICAgIGlmIChtX2RlbGV0ZVN0YXRlbWVudC0+cHJl
cGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29raWVzIik7Cisg
ICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJy
b3JNc2coKSk7CisgICAgfQorCit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6
OmNsb3NlKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gQ2xvc2luZyIpOworCisgICAgc2l6ZV90IGNoYW5nZWRD
b29raWVzU2l6ZTsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Cisg
ICAgICAgIGlmIChtX2RiVGltZXIuc3RhcnRlZCgpKQorICAgICAgICAgICAgbV9kYlRpbWVyLnN0
b3AoKTsKKyAgICAgICAgY2hhbmdlZENvb2tpZXNTaXplID0gbV9jaGFuZ2VkQ29va2llcy5zaXpl
KCk7CisgICAgfQorCisgICAgaWYgKGNoYW5nZWRDb29raWVzU2l6ZSA+IDApCisgICAgICAgIGlu
dm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgZGVsZXRlIG1faW5zZXJ0U3RhdGVt
ZW50OworICAgIG1faW5zZXJ0U3RhdGVtZW50ID0gMDsKKyAgICBkZWxldGUgbV91cGRhdGVTdGF0
ZW1lbnQ7CisgICAgbV91cGRhdGVTdGF0ZW1lbnQgPSAwOworICAgIGRlbGV0ZSBtX2RlbGV0ZVN0
YXRlbWVudDsKKyAgICBtX2RlbGV0ZVN0YXRlbWVudCA9IDA7CisKKyAgICBpZiAobV9kYi5pc09w
ZW4oKSkKKyAgICAgICAgbV9kYi5jbG9zZSgpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlOjppbnNlcnQoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29v
a2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgaW5zZXJ0aW5nIGNvb2tpZSAlcyB0
byBxdWV1ZS4iLCBjb29raWUtPnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgYWRkVG9D
aGFuZ2VRdWV1ZShjb29raWUsIEluc2VydCk7Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNr
aW5nU3RvcmU6OnVwZGF0ZShjb25zdCBQYXJzZWRDb29raWUqIGNvb2tpZSkKK3sKKyAgICBDb29r
aWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGFkZGluZyB1cGRhdGluZyBjb29raWUgJXMgdG8g
cXVldWUuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFkZFRvQ2hh
bmdlUXVldWUoY29va2llLCBVcGRhdGUpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2lu
Z1N0b3JlOjpyZW1vdmUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgQ29va2ll
TG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBhZGRpbmcgZGVsZXRpbmcgY29va2llICVzIHRvIHF1
ZXVlLiIsIGNvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBhZGRUb0NoYW5n
ZVF1ZXVlKGNvb2tpZSwgRGVsZXRlKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZTo6cmVtb3ZlQWxsKCkKK3sKKyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2Fs
bE1lc3NhZ2UoJkNvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VSZW1vdmVBbGwsIHRo
aXMpKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlUmVtb3Zl
QWxsKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICghbV9kYi5p
c09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ29va2llTG9nKCJDb29raWVCYWNraW5n
U3RvcmUgLSByZW1vdmUgQWxsIGNvb2tpZXMgZnJvbSBiYWNraW5nc3RvcmUiKTsKKworICAgIHsK
KyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgbV9jaGFuZ2VkQ29v
a2llcy5jbGVhcigpOworICAgIH0KKworICAgIFN0cmluZyBkZWxldGVRdWVyeSgiREVMRVRFIEZS
T00gIik7CisgICAgZGVsZXRlUXVlcnkgKz0gbV90YWJsZU5hbWU7CisgICAgZGVsZXRlUXVlcnkg
Kz0gIjsiOworCisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RiLCBkZWxl
dGVRdWVyeSk7CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJDb3VsZCBub3QgcHJlcGFyZSBERUxFVEUgKiBzdGF0ZW1lbnQiKTsKKyAgICAg
ICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1z
ZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZGVsZXRlU3RhdGVtZW50
LmV4ZWN1dGVDb21tYW5kKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNv
b2tpZSBmcm9tIGRhdGFiYXNlIik7CisgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1l
c3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OmdldENvb2tpZXNGcm9tRGF0
YWJhc2UoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQgaW50
IGxpbWl0KQoreworICAgIC8vIEl0IGlzIG5vdCBhIGh1Z2UgcGVyZm9ybWFuY2UgaGl0IHRvIHdh
aXQgb24gdGhlIHJlcGx5IGhlcmUgYmVjYXVzZSB0aGlzIGlzIG9ubHkgZG9uZSBvbmNlIGR1cmlu
ZyBzZXR1cCBhbmQgd2hlbiB0dXJuaW5nIG9mZiBwcml2YXRlIG1vZGUuCisgICAgVHlwZWRSZXBs
eUJ1ZmZlcjwgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiA+IHJlcGx5QnVmZmVyKDApOworICAgIGRp
c3BhdGNoTWVzc2FnZShjcmVhdGVNZXRob2RDYWxsTWVzc2FnZVdpdGhSZXR1cm4oJkNvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0LCAmcmVwbHlCdWZm
ZXIsIHRoaXMsIGxpbWl0KSk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+KiBjb29raWVzID0g
cmVwbHlCdWZmZXIucG9pbnRlcigpOworICAgIHN0YWNrT2ZDb29raWVzLnN3YXAoKmNvb2tpZXMp
OworICAgIGRlbGV0ZSBjb29raWVzOworfQorCitWZWN0b3I8UGFyc2VkQ29va2llKj4qIENvb2tp
ZURhdGFiYXNlQmFja2luZ1N0b3JlOjppbnZva2VHZXRDb29raWVzV2l0aExpbWl0KHVuc2lnbmVk
IGludCBsaW1pdCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgLy8g
Q2hlY2sgdGhhdCB0aGUgdGFibGUgZXhpc3RzIHRvIGF2b2lkIGRvaW5nIGFuIHVubmVjZXNzYXJ5
IHJlcXVlc3QuCisgICAgaWYgKCFtX2RiLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIFN0cmluZ0J1aWxkZXIgc2VsZWN0UXVlcnk7CisgICAgc2VsZWN0UXVlcnkuYXBwZW5kKCJT
RUxFQ1QgbmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBpc1Nl
Y3VyZSwgaXNIdHRwT25seSwgY3JlYXRpb25UaW1lLCBwcm90b2NvbCBGUk9NICIpOworICAgIHNl
bGVjdFF1ZXJ5LmFwcGVuZChtX3RhYmxlTmFtZSk7CisgICAgaWYgKGxpbWl0ID4gMCkgeworICAg
ICAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIiBPUkRFUiBCWSBsYXN0QWNjZXNzZWQgQVNDIik7Cisg
ICAgICAgIHNlbGVjdFF1ZXJ5LmFwcGVuZCgiIExJTUlUICIgKyBTdHJpbmc6Om51bWJlcihsaW1p
dCkpOworICAgIH0KKyAgICBzZWxlY3RRdWVyeS5hcHBlbmQoIjsiKTsKKworICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gaW52b2tlR2V0QWxsQ29va2llcyB3aXRoIHNlbGVjdCBx
dWVyeSAlcyIsIHNlbGVjdFF1ZXJ5LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBT
UUxpdGVTdGF0ZW1lbnQgc2VsZWN0U3RhdGVtZW50KG1fZGIsIHNlbGVjdFF1ZXJ5LnRvU3RyaW5n
KCkpOworCisgICAgaWYgKHNlbGVjdFN0YXRlbWVudC5wcmVwYXJlKCkpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDYW5ub3QgcmV0cmlldmVkIGNvb2tpZXMgZnJvbSB0aGUgZGF0YWJhc2UiKTsKKyAg
ICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJv
ck1zZygpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVmVjdG9yPFBhcnNlZENv
b2tpZSo+KiBjb29raWVzID0gbmV3IFZlY3RvcjxQYXJzZWRDb29raWUqPjsKKyAgICB3aGlsZSAo
c2VsZWN0U3RhdGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAgLy8gVGhl
cmUgaXMgYSByb3cgdG8gZmV0Y2gKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdFN0YXRl
bWVudC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZWxlY3RTdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHNlbGVjdFN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDMpOworICAgICAgICBkb3VibGUgZXhwaXJ5ID0gc2VsZWN0
U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg0KTsKKyAgICAgICAgZG91YmxlIGxhc3RBY2Nlc3Nl
ZCA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoNSk7CisgICAgICAgIGJvb2wgaXNT
ZWN1cmUgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDYpOworICAgICAgICBib29sIGlz
SHR0cE9ubHkgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDcpOworICAgICAgICBkb3Vi
bGUgY3JlYXRpb25UaW1lID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg4KTsKKyAg
ICAgICAgU3RyaW5nIHByb3RvY29sID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRleHQoOSk7
CisKKyAgICAgICAgY29va2llcy0+YXBwZW5kKG5ldyBQYXJzZWRDb29raWUobmFtZSwgdmFsdWUs
IGRvbWFpbiwgcHJvdG9jb2wsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBjcmVhdGlvblRp
bWUsIGlzU2VjdXJlLCBpc0h0dHBPbmx5KSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvb2tpZXM7
Cit9CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRh
YmFzZVN5bmNocm9ub3VzbHkoKQoreworICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3Jl
IC0gc2VuZGluZyB0byBkYXRhYmFzZSBpbW1lZGlhdGVseSIpOworICAgIHsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICAgICAgaWYgKG1fZGJUaW1lci5zdGFydGVkKCkp
CisgICAgICAgICAgICBtX2RiVGltZXIuc3RvcCgpOworICAgIH0KKyAgICBkaXNwYXRjaFN5bmNN
ZXNzYWdlKGNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9y
ZTo6aW52b2tlU2VuZENoYW5nZXNUb0RhdGFiYXNlLCB0aGlzKSk7Cit9CisKK3ZvaWQgQ29va2ll
RGF0YWJhc2VCYWNraW5nU3RvcmU6OnNlbmRDaGFuZ2VzVG9EYXRhYmFzZShpbnQgbmV4dEludGVy
dmFsKQoreworICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7CisgICAgaWYgKCFtX2RiVGlt
ZXIuc3RhcnRlZCgpKSB7CisgICAgICAgIENvb2tpZUxvZygiQ29va2llQmFja2luZ1N0b3JlIC0g
U3RhcnRpbmcgb25lIHNob3Qgc2VuZCB0byBkYXRhYmFzZSIpOworICAgICAgICBtX2RiVGltZXIu
c3RhcnQobmV4dEludGVydmFsKTsKKyAgICB9IGVsc2UgeworI2lmICFOREVCVUcKKyAgICAgICAg
Q29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBUaW1lciBhbHJlYWR5IHJ1bm5pbmcsIHNr
aXBwaW5nIHRoaXMgcmVxdWVzdCIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIENvb2tpZURh
dGFiYXNlQmFja2luZ1N0b3JlOjpzZW5kQ2hhbmdlc1RvRGF0YWJhc2VUaW1lckZpcmVkKCkKK3sK
KyAgICBkaXNwYXRjaE1lc3NhZ2UoY3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJkNvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlOjppbnZva2VTZW5kQ2hhbmdlc1RvRGF0YWJhc2UsIHRoaXMpKTsKK30K
Kwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6aW52b2tlU2VuZENoYW5nZXNUb0Rh
dGFiYXNlKCkKK3sKKyAgICBBU1NFUlQoaXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgaWYgKCFt
X2RiLmlzT3BlbigpKSB7CisgICAgICAgIExPR19FUlJPUigiVGltZXIgRmlyZWQsIGJ1dCBkYXRh
YmFzZSBpcyBjbG9zZWQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8
Q29va2llQWN0aW9uPiBjaGFuZ2VkQ29va2llczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2Vy
IGxvY2sobV9tdXRleCk7CisgICAgICAgIGNoYW5nZWRDb29raWVzLnN3YXAobV9jaGFuZ2VkQ29v
a2llcyk7CisgICAgICAgIEFTU0VSVChtX2NoYW5nZWRDb29raWVzLmlzRW1wdHkoKSk7CisgICAg
fQorCisgICAgaWYgKGNoYW5nZWRDb29raWVzLmlzRW1wdHkoKSkgeworICAgICAgICBDb29raWVM
b2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIFRpbWVyIGZpcmVkLCBidXQgbm8gY29va2llcyBpbiBj
aGFuZ2VsaXN0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ29va2llTG9nKCJDb29r
aWVCYWNraW5nU3RvcmUgLSBUaW1lciBmaXJlZCwgc2VuZGluZyBjaGFuZ2VzIHRvIGRhdGFiYXNl
LiBXZSBoYXZlICVkIGNoYW5nZXMiLCBjaGFuZ2VkQ29va2llcy5zaXplKCkpOworICAgIFNRTGl0
ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKG1fZGIsIGZhbHNlKTsKKyAgICB0cmFuc2FjdGlvbi5i
ZWdpbigpOworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGNo
YW5nZSBsaXN0IHRvIG1ha2UgY2FsbHMKKyAgICAvLyBJZiBlcnJvciBvY2N1cnMsIGlnbm9yZSBp
dCBhbmQgY29udGludWUgdG8gdGhlIG5leHQgc3RhdGVtZW50CisgICAgc2l6ZV90IHNpemVPZkNo
YW5nZSA9IGNoYW5nZWRDb29raWVzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHNpemVPZkNoYW5nZTsgaSsrKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCogbV9zdGF0ZW1l
bnQ7CisgICAgICAgIGNvbnN0IFBhcnNlZENvb2tpZSBjb29raWUgPSBjaGFuZ2VkQ29va2llc1tp
XS5maXJzdDsKKyAgICAgICAgVXBkYXRlUGFyYW1ldGVyIGFjdGlvbiA9IGNoYW5nZWRDb29raWVz
W2ldLnNlY29uZDsKKworICAgICAgICBpZiAoYWN0aW9uID09IERlbGV0ZSkgeworICAgICAgICAg
ICAgbV9zdGF0ZW1lbnQgPSBtX2RlbGV0ZVN0YXRlbWVudDsKKyAgICAgICAgICAgIENvb2tpZUxv
ZygiQ29va2llQmFja2luZ1N0b3JlIC0gZGVsZXRpbmcgY29va2llICVzLiIsIGNvb2tpZS50b1N0
cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgICAgICAvLyBCaW5kcyBhbGwgdGhlIHZh
bHVlcworICAgICAgICAgICAgaWYgKG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29raWUubmFt
ZSgpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLmRvbWFpbigpKQorICAgICAg
ICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29raWUucGF0aCgpKSB8fCBt
X3N0YXRlbWVudC0+YmluZFRleHQoNCwgY29va2llLnByb3RvY29sKCkpKSB7CisgICAgICAgICAg
ICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgYmluZCBjb29raWUgZGF0YSB0byBkZWxldGUiKTsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIu
bGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICBD
b29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIHVwZGF0aW5nIGNvb2tpZSAlcy4iLCBjb29r
aWUudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBtX3N0YXRlbWVu
dCA9IG1fdXBkYXRlU3RhdGVtZW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBDb29raWVMb2coIkNvb2tpZUJhY2tpbmdTdG9yZSAtIGluc2VydGluZyBjb29raWUgJXMu
IiwgY29va2llLnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgbV9z
dGF0ZW1lbnQgPSBtX2luc2VydFN0YXRlbWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gQmluZHMgYWxsIHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIGlmIChtX3N0YXRlbWVudC0+
YmluZFRleHQoMSwgY29va2llLm5hbWUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGNv
b2tpZS52YWx1ZSgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgz
LCBjb29raWUuZG9tYWluKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCg0LCBjb29raWUucGF0
aCgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kRG91YmxlKDUsIGNvb2tp
ZS5leHBpcnkoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmREb3VibGUoNiwgY29va2llLmxhc3RBY2Nl
c3NlZCgpKQorICAgICAgICAgICAgICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kSW50NjQoNywgY29v
a2llLmlzU2VjdXJlKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kSW50NjQoOCwgY29va2llLmlzSHR0
cE9ubHkoKSkKKyAgICAgICAgICAgICAgICB8fCBtX3N0YXRlbWVudC0+YmluZERvdWJsZSg5LCBj
b29raWUuY3JlYXRpb25UaW1lKCkpIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxMCwgY29va2ll
LnByb3RvY29sKCkpKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgYmluZCBj
b29raWUgZGF0YSB0byBzYXZlIik7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUg
RXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCByYyA9IG1fc3RhdGVtZW50LT5zdGVw
KCk7CisgICAgICAgIG1fc3RhdGVtZW50LT5yZXNldCgpOworICAgICAgICBpZiAocmMgIT0gU1FM
UmVzdWx0T2sgJiYgcmMgIT0gU1FMUmVzdWx0RG9uZSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJDYW5ub3QgbWFrZSBjYWxsIHRvIHRoZSBkYXRhYmFzZSIpOworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgQ29va2llTG9n
KCJDb29raWVCYWNraW5nU3RvcmUgLSB0cmFuc2FjdGlvbiBjb21wbGV0ZSIpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjphZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNl
ZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKQorewor
ICAgIEFTU0VSVCghY2hhbmdlZENvb2tpZS0+aXNTZXNzaW9uKCkpOworICAgIFBhcnNlZENvb2tp
ZSBjb29raWVDb3B5KGNoYW5nZWRDb29raWUpOworICAgIENvb2tpZUFjdGlvbiBhY3Rpb24oY29v
a2llQ29weSwgYWN0aW9uUGFyYW0pOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayht
X211dGV4KTsKKyAgICAgICAgbV9jaGFuZ2VkQ29va2llcy5hcHBlbmQoYWN0aW9uKTsKKyAgICAg
ICAgQ29va2llTG9nKCJDb29raWVCYWNraW5nU3RvcmUgLSBtX2NoYW5nZWRjb29raWVzIGhhcyAl
ZC4iLCBtX2NoYW5nZWRDb29raWVzLnNpemUoKSk7CisgICAgfQorICAgIHNlbmRDaGFuZ2VzVG9E
YXRhYmFzZShzX2RhdGFiYXNlVGltZXJJbnRlcnZhbCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmUvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iOWI3ZGVjZGQxZDY3
OTk4NjdmMGM5MzE4ZWE2NDM5ODQ1OWUxMTIzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS9Db29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxleW8uY29tPgorICog
Q29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9oCisjZGVm
aW5lIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlX2gKKworI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCisjaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJUaW1lci5oIgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybVRpbWVyLmg+CisjaW5jbHVkZSA8R2VuZXJpY1RpbWVyQ2xpZW50
Lmg+CisjaW5jbHVkZSA8VGhyZWFkVGltZXJDbGllbnQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nUHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYv
dGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGFyc2Vk
Q29va2llOworCitjbGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSA6IHB1YmxpYyBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TWVzc2FnZUNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLCBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06OlRocmVhZFRpbWVyQ2xpZW50
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUqIGNyZWF0
ZSgpIHsgcmV0dXJuIG5ldyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsgfQorCisgICAgdm9p
ZCBvcGVuKGNvbnN0IFN0cmluZyYgY29va2llSmFyKTsKKworICAgIHZvaWQgaW5zZXJ0KGNvbnN0
IFBhcnNlZENvb2tpZSopOworICAgIHZvaWQgdXBkYXRlKGNvbnN0IFBhcnNlZENvb2tpZSopOwor
ICAgIHZvaWQgcmVtb3ZlKGNvbnN0IFBhcnNlZENvb2tpZSopOworCisgICAgdm9pZCByZW1vdmVB
bGwoKTsKKworICAgIC8vIElmIGEgbGltaXQgaXMgbm90IHNldCwgdGhlIG1ldGhvZCB3aWxsIHJl
dHVybiBhbGwgY29va2llcyBpbiB0aGUgZGF0YWJhc2UKKyAgICB2b2lkIGdldENvb2tpZXNGcm9t
RGF0YWJhc2UoVmVjdG9yPFBhcnNlZENvb2tpZSo+JiBzdGFja09mQ29va2llcywgdW5zaWduZWQg
aW50IGxpbWl0ID0gMCk7CisKKyAgICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZVN5bmNocm9u
b3VzbHkoKTsKKworICAgIC8vIFRocmVhZFRpbWVyQ2xpZW50IG1ldGhvZHMKKyAgICB2aXJ0dWFs
IGJvb2wgd2lsbEZpcmVUaW1lcigpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGludCBn
ZXRQdWxzZUNvZGUoKSBjb25zdCB7IHJldHVybiBwdWxzZUNvZGUoKTsgfQorICAgIHZpcnR1YWwg
aW50IGdldENvbm5lY3Rpb25JZCgpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25JZCgpOyB9Cisg
ICAgdmlydHVhbCBpbnQgZGVmYXVsdFRpbWVyUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiB0aHJl
YWRQcmlvcml0eSgpOyB9CisKK3ByaXZhdGU6CisgICAgZW51bSBVcGRhdGVQYXJhbWV0ZXIgewor
ICAgICAgICBJbnNlcnQsCisgICAgICAgIFVwZGF0ZSwKKyAgICAgICAgRGVsZXRlLAorICAgIH07
CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpOworICAgIH5Db29raWVEYXRhYmFz
ZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBhZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhcnNl
ZENvb2tpZSogY2hhbmdlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyIGFjdGlvblBhcmFtKTsKKyAg
ICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZShpbnQgaW50ZXJ2YWwpOworICAgIHZvaWQgc2Vu
ZENoYW5nZXNUb0RhdGFiYXNlVGltZXJGaXJlZCgpOworICAgIHZvaWQgdXBncmFkZVRhYmxlSWZO
ZWVkZWQoY29uc3QgU3RyaW5nJiBkYXRhYmFzZVNjaGVtYSwgY29uc3QgU3RyaW5nJiBwcmltYXJ5
a2V5RmllbGRzKTsKKworICAgIHZvaWQgaW52b2tlT3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUph
cik7CisgICAgdm9pZCBpbnZva2VSZW1vdmVBbGwoKTsKKyAgICBWZWN0b3I8UGFyc2VkQ29va2ll
Kj4qIGludm9rZUdldENvb2tpZXNXaXRoTGltaXQodW5zaWduZWQgaW50IGxpbWl0KTsKKyAgICB2
b2lkIGludm9rZVNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgdm9pZCBjbG9zZSgpOwor
CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IFBhcnNlZENvb2tpZSwgVXBkYXRlUGFyYW1ldGVyPiBD
b29raWVBY3Rpb247CisgICAgVmVjdG9yPENvb2tpZUFjdGlvbj4gbV9jaGFuZ2VkQ29va2llczsK
KyAgICBNdXRleCBtX211dGV4OworCisgICAgU3RyaW5nIG1fdGFibGVOYW1lOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpUaW1lcjxDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZT4gbV9kYlRp
bWVyOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHZW5lcmljVGltZXJDbGllbnQqIG1fZGJU
aW1lckNsaWVudDsKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RiOworICAgIFNRTGl0ZVN0YXRlbWVu
dCAqbV9pbnNlcnRTdGF0ZW1lbnQ7CisgICAgU1FMaXRlU3RhdGVtZW50ICptX3VwZGF0ZVN0YXRl
bWVudDsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgKm1fZGVsZXRlU3RhdGVtZW50OworfTsKKworQ29v
a2llRGF0YWJhc2VCYWNraW5nU3RvcmUmIGNvb2tpZUJhY2tpbmdTdG9yZSgpOworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZV9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZUph
ckJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29r
aWVKYXJCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zOTVjNmFmMjc4NDNjMDAyMDM3ZWNlZTk3
ZDhmMDNhY2Q3NTE1YjYzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVKYXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDExMCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogQ29w
eXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIGh0dHA6Ly93d3cudG9yY2htb2JpbGUu
Y29tLworICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLTIw
MTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkNvb2tpZUphci5oIgorCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiQ29v
a2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIK
KyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJLVVJM
LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiUGFnZUdyb3VwTG9hZERlZmVycmVyLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNp
bmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU3Ry
aW5nIGNvb2tpZXMoRG9jdW1lbnQgY29uc3QqIGRvY3VtZW50LCBLVVJMIGNvbnN0JiB1cmwpCit7
CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisgICAgUGFnZSogcGFnZSA9
IGZyYW1lID8gZnJhbWUtPnBhZ2UoKSA6IDA7CisKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKworICAgIGlmICghKGZyYW1lICYmIGZyYW1lLT5sb2FkZXIoKSAmJiBm
cmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisg
ICAgaWYgKCFzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihmcmFtZS0+
bG9hZGVyKCktPmNsaWVudCgpKS0+Y29va2llc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIFN0
cmluZygpOworCisgICAgQVNTRVJUKGRvY3VtZW50ICYmIHVybCA9PSBkb2N1bWVudC0+Y29va2ll
VVJMKCkpOworICAgIC8vICdIdHRwT25seScgY29va2llcyBzaG91bGQgbm8gYmUgYWNjZXNzaWJs
ZSBmcm9tIHNjcmlwdHMsIHNvIHdlIGZpbHRlciB0aGVtIG91dCBoZXJlCisgICAgcmV0dXJuIGNv
b2tpZU1hbmFnZXIoKS5nZXRDb29raWUodXJsLCBOb0h0dHBPbmx5Q29va2llKTsKK30KKwordm9p
ZCBzZXRDb29raWVzKERvY3VtZW50KiBkb2N1bWVudCwgS1VSTCBjb25zdCYgdXJsLCBTdHJpbmcg
Y29uc3QmIHZhbHVlKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOwor
ICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZSA/IGZyYW1lLT5wYWdlKCkgOiAwOworCisgICAgaWYgKCFw
YWdlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIShmcmFtZSAmJiBmcmFtZS0+bG9hZGVy
KCkgJiYgZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4oZnJhbWUtPmxv
YWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEFTU0VSVChkb2N1bWVudCAmJiB1cmwgPT0gZG9jdW1lbnQtPmNvb2tpZVVSTCgpKTsKKyAg
ICBjb29raWVNYW5hZ2VyKCkuc2V0Q29va2llcyh1cmwsIHZhbHVlKTsKK30KKworYm9vbCBjb29r
aWVzRW5hYmxlZChEb2N1bWVudCBjb25zdCopCit7CisgICAgLy8gRklYTUUuIEN1cnJlbnRseSBj
b29raWUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBubyBzZXR0aW5nIG9uIHByb3BlcnR5IHBhZ2Uu
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ2V0UmF3Q29va2llcyhjb25zdCBEb2N1bWVu
dCogZG9jdW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgVmVjdG9yPENvb2tpZT4mIHJhd0Nvb2tpZXMp
Cit7CisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHJlc3VsdDsKKyAgICBjb29raWVNYW5hZ2Vy
KCkuZ2V0UmF3Q29va2llcyhyZXN1bHQsIHVybCwgV2l0aEh0dHBPbmx5Q29va2llcyk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspCisgICAgICAgIHJlc3Vs
dFtpXS0+YXBwZW5kV2ViQ29yZUNvb2tpZShyYXdDb29raWVzKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBkZWxldGVDb29raWUoY29uc3QgRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2llTmFtZSkKK3sKKyAgICAvLyBDb29raWVzIGFy
ZSBub3QgYm91bmQgdG8gdGhlIGRvY3VtZW50LiBUaGVyZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8g
cGFzcworICAgIC8vIGluIHRoZSBkb2N1bWVudCBvYmplY3QgdG8gZmluZCB0aGUgdGFyZ2V0ZWQg
Y29va2llcyBpbiBjb29raWUgbWFuYWdlci4KKyAgICBjb29raWVNYW5hZ2VyKCkucmVtb3ZlQ29v
a2llV2l0aE5hbWUodXJsLCBjb29raWVOYW1lKTsKK30KKworU3RyaW5nIGNvb2tpZVJlcXVlc3RI
ZWFkZXJGaWVsZFZhbHVlKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgS1VSTCAmdXJs
KQoreworICAgIEFTU0VSVChkb2N1bWVudCk7CisKKyAgICBpZiAoIShkb2N1bWVudC0+ZnJhbWUo
KSAmJiBkb2N1bWVudC0+ZnJhbWUoKS0+bG9hZGVyKCkgJiYgZG9jdW1lbnQtPmZyYW1lKCktPmxv
YWRlcigpLT5jbGllbnQoKSkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGlmICgh
c3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4oZG9jdW1lbnQtPmZyYW1l
KCktPmxvYWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpCisgICAgICAgIHJldHVy
biBTdHJpbmcoKTsKKworICAgIHJldHVybiBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2llKHVybCwg
V2l0aEh0dHBPbmx5Q29va2llcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hbmFnZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmQ3OTM4MGZkOWJjOTdjOWI5MzE4YjViZDRiMjFiYmUzZjFlODUyNWUKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4
LCAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICog
Q29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBFTkFCTEVfQ09PS0lFX0RFQlVHIDAKKyNkZWZp
bmUgRU5BQkxFX0NPT0tJRV9TVVBFUl9WRVJCT1NFX0RFQlVHIDAKKyNkZWZpbmUgRU5BQkxFX0NP
T0tJRV9MSU1JVF9ERUJVRyAwCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29r
aWVNYW5hZ2VyLmgiCisKKyNpbmNsdWRlICJDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5oIgor
I2luY2x1ZGUgIkNvb2tpZVBhcnNlci5oIgorI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5j
bHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJXZWJT
ZXR0aW5ncy5oIgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUNsaWVudC5oPgorI2luY2x1
ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUV4ZWN1dGFibGVNZXNzYWdlLmg+CisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0
Zm9ybU5hdmlnYXRvckhhbmRsZXIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisjaWYgRU5BQkxFX0NPT0tJRV9ERUJV
RworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxvZy5oPgorI2VuZGlmCisKKyNpZiBFTkFC
TEVfQ09PS0lFX1NVUEVSX1ZFUkJPU0VfREVCVUcKKyNkZWZpbmUgQ29va2llTG9nKGZvcm1hdCwg
Li4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbEluZm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBD
b29raWVMb2coZm9ybWF0LCAuLi4pCisjZW5kaWYgLy8gRU5BQkxFX0NPT0tJRV9TVVBFUl9WRVJC
T1NFX0RFQlVHCisKKyNpZiBFTkFCTEVfQ09PS0lFX0xJTUlUX0RFQlVHCisjZGVmaW5lIENvb2tp
ZUxpbWl0TG9nKGZvcm1hdCwgLi4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sIGZvcm1hdCwgIyMgX19WQV9BUkdTX18p
CisjZWxzZQorI2RlZmluZSBDb29raWVMaW1pdExvZyhmb3JtYXQsIC4uLikKKyNlbmRpZiAvLyBF
TkFCTEVfQ09PS0lFX0xJTUlUX0RFQlVHCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gTWF4
IGNvdW50IGNvbnN0YW50cy4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzX2dsb2JhbE1heENvb2tp
ZUNvdW50ID0gNjAwMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzX21heENvb2tpZUNvdW50UGVy
SG9zdCA9IDYwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfY29va2llc1RvRGVsZXRlV2hlbkxp
bWl0UmVhY2hlZCA9IDYwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfZGVsYXlUb1N0YXJ0Q29v
a2llQ2xlYW51cCA9IDEwOworCitzdGF0aWMgdm9pZCBmbHVzaENvb2tpZXNPbkV4aXQodm9pZCkK
K3sKKyAgICBjb29raWVNYW5hZ2VyKCkuZmx1c2hDb29raWVzVG9CYWNraW5nU3RvcmUoKTsKK30K
KworQ29va2llTWFuYWdlciYgY29va2llTWFuYWdlcigpCit7CisgICAgc3RhdGljIENvb2tpZU1h
bmFnZXIgKmNvb2tpZU1hbmFnZXIgPSAwOworICAgIGlmICghY29va2llTWFuYWdlcikgeworICAg
ICAgICAvLyBPcGVuIHRoZSBjb29raWVKYXIgbm93IGFuZCBnZXQgdGhlIGJhY2tpbmcgc3RvcmUg
Y29va2llcyB0byBmaWxsIHRoZSBtYW5hZ2VyLgorICAgICAgICBjb29raWVNYW5hZ2VyID0gbmV3
IENvb2tpZU1hbmFnZXI7CisgICAgICAgIGNvb2tpZU1hbmFnZXItPm1fY29va2llQmFja2luZ1N0
b3JlLT5vcGVuKGNvb2tpZU1hbmFnZXItPmNvb2tpZUphcigpKTsKKyAgICAgICAgY29va2llTWFu
YWdlci0+Z2V0QmFja2luZ1N0b3JlQ29va2llcygpOworICAgICAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBCYWNraW5nc3RvcmUgbG9hZCBjb21wbGV0ZS5cbiIpOworCisgICAgICAgIGF0
ZXhpdCgmZmx1c2hDb29raWVzT25FeGl0KTsKKyAgICB9CisgICAgcmV0dXJuICpjb29raWVNYW5h
Z2VyOworfQorCitDb29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKCkKKyAgICA6IG1fY291bnQo
MCkKKyAgICAsIG1fcHJpdmF0ZU1vZGUoZmFsc2UpCisgICAgLCBtX3Nob3VsZER1bXBBbGxDb29r
aWVzKGZhbHNlKQorICAgICwgbV9jb29raWVKYXJGaWxlTmFtZShwYXRoQnlBcHBlbmRpbmdDb21w
b25lbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkNsaWVudDo6Z2V0KCktPmdldEFwcGxpY2F0aW9u
RGF0YURpcmVjdG9yeSgpLmNfc3RyKCksICIvY29va2llQ29sbGVjdGlvbi5kYiIpKQorICAgICwg
bV9wb2xpY3koQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeUFsd2F5cykKKyAgICAsIG1fY29va2ll
QmFja2luZ1N0b3JlKENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpjcmVhdGUoKSkKKyAgICAs
IG1fbGltaXRUaW1lcih0aGlzLCAmQ29va2llTWFuYWdlcjo6Y29va2llTGltaXRDbGVhblVwKQor
eworfQorCitDb29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7CisgICAgcmVtb3ZlQWxs
Q29va2llcyhEb05vdFJlbW92ZUZyb21CYWNraW5nU3RvcmUpOworICAgIC8vIEZJWE1FOiBtX21h
bmFnZXJNYXAgYW5kIHRoZSB0b3AgbGF5ZXIgcHJvdG9jb2xNYXBzIGFyZSBub3QgcHJvcGVybHkg
ZGVsZXRlZC4KKyAgICAvLyBEbyBub3QgZGVsZXRlIGFueSBwcm90b2NvbCBtYXBzIHRvIGF2b2lk
IGRvdWJsZS1kZWxldGlvbiBvZiB0aGUgbWFwcyB0aGF0IGFyZQorICAgIC8vIGJlaW5nIHVzZWQg
Zm9yIGJvdGggc2VjdXJlIGFuZCBub24tc2VjdXJlIHByb3RvY29sczsgdGhpcyBsZWFrIGlzIE9L
IHNpbmNlCisgICAgLy8gdGhlcmUncyBub3RoaW5nIGltcG9ydGFudCBpbiB0aGUgaGFzaHRhYmxl
IGRlc3RydWN0b3JzLCBhbmQgdGhlIG1lbW9yeSB3aWxsIGJlIHJlY2xhaW1lZCBvbiBleGl0CisK
KyAgICAvLyBGSVhNRTogQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUgaXMgbm90IGRlbGV0ZWQs
IG9ubHkgZmx1c2hlZAorICAgIC8vIChjdXJyZW50bHkgdGhlIGRlc3RydWN0b3IgaXMgbmV2ZXIg
Y2FsbGVkIHNpbmNlIHRoaXMgY2xhc3MgaXMgYQorICAgIC8vIHNpbmdsZXRvbjsgb24gZXhpdCwg
dGhlIGRiIGlzIGZsdXNoZWQgbWFudWFsbHkuIFRoaXMgY2FsbCBpcyBvbmx5IGhlcmUKKyAgICAv
LyBhcyBhIGZhbGxiYWNrIGluIGNhc2UgdGhpcyBjbGFzcyBpcyBtYWRlIGEgbm9uLXNpbmdsZXRv
bi4KKyAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+c2VuZENoYW5nZXNUb0RhdGFiYXNlU3luY2hy
b25vdXNseSgpOworfQorCisvLyBTb3J0aW5nIGxvZ2ljIGlzIGJhc2VkIG9uIENvb2tpZSBTcGVj
IFJGQzYyNjUsIHNlY3Rpb24gNS40LjIKK3N0YXRpYyBib29sIGNvb2tpZVNvcnRlcihQYXJzZWRD
b29raWUqIGEsIFBhcnNlZENvb2tpZSogYikKK3sKKyAgICBpZiAoYS0+cGF0aCgpLmxlbmd0aCgp
ID09IGItPnBhdGgoKS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIGEtPmNyZWF0aW9uVGltZSgp
IDw9IGItPmNyZWF0aW9uVGltZSgpOworICAgIHJldHVybiBhLT5wYXRoKCkubGVuZ3RoKCkgPiBi
LT5wYXRoKCkubGVuZ3RoKCk7Cit9CisKKy8vIFJldHVybnMgd2hldGhlciB0aGUgcHJvdG9jb2wg
c3VwcG9ydHMgZG9tYWlucworc3RhdGljIGJvb2wgc2hvdWxkSWdub3JlRG9tYWluKGNvbnN0IFN0
cmluZyBwcm90b2NvbCkKK3sKKyAgICAvLyBpZ25vcmUgZG9tYWluIHNlY3VyaXR5IGZvciBmaWxl
IGFuZCBsb2NhbAorICAgIHJldHVybiBwcm90b2NvbCA9PSAiZmlsZSIgfHwgcHJvdG9jb2wgPT0g
ImxvY2FsIjsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVzKGNvbnN0IEtVUkwm
IHVybCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBDb29raWVMb2coIkNvb2tpZU1hbmFn
ZXIgLSBTZXR0aW5nIGNvb2tpZXMiKTsKKyAgICBDb29raWVQYXJzZXIgcGFyc2VyKHVybCk7Cisg
ICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IGNvb2tpZXMgPSBwYXJzZXIucGFyc2UodmFsdWUpOwor
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29raWVzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIFBhcnNlZENvb2tpZSogY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgaWYgKCFzaG91
bGRSZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb29raWUsIHVybCkpIHsKKyAgICAgICAgICAgIEJh
Y2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgdHJlYXRtZW50ID0gbV9wcml2YXRlTW9kZSA/IERvTm90
UmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSA6IFJlbW92ZUZyb21CYWNraW5nU3RvcmU7CisgICAgICAg
ICAgICBjaGVja0FuZFRyZWF0Q29va2llKGNvb2tpZSwgdHJlYXRtZW50KTsKKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBkZWxldGUgY29va2llOworICAgIH0KK30KKworYm9vbCBDb29raWVN
YW5hZ2VyOjpzaG91bGRSZWplY3RGb3JTZWN1cml0eVJlYXNvbihjb25zdCBQYXJzZWRDb29raWUq
IGNvb2tpZSwgY29uc3QgS1VSTCYgdXJsKQoreworICAgIC8vIFdlIGhhdmUgdG8gZGlzYWJsZSB0
aGUgZm9sbG93aW5nIGNoZWNrIGJlY2F1c2Ugc2l0ZXMgbGlrZSBGYWNlYm9vayBhbmQKKyAgICAv
LyBHbWFpbCBjdXJyZW50bHkgZG8gbm90IGZvbGxvdyB0aGUgc3BlYy4KKyNpZiAwCisgICAgLy8g
Q2hlY2sgaWYgcGF0aCBhdHRyaWJ1dGUgaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QgVVJJLgor
ICAgIGlmICghdXJsLnBhdGgoKS5zdGFydHNXaXRoKGNvb2tpZS0+cGF0aCgpKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkNvb2tpZSAlcyBpcyByZWplY3RlZCBiZWNhdXNlIGl0cyBwYXRoIGRvZXMg
bm90IG1hdGggdGhlIFVSTCAlc1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCks
IHVybC5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorI2VuZGlmCisKKyAgICAvLyBpZ25vcmUgZG9tYWluIHNlY3VyaXR5IGlmIHByb3RvY29sIGRv
ZXNuJ3QgaGF2ZSBkb21haW5zCisgICAgaWYgKHNob3VsZElnbm9yZURvbWFpbihjb29raWUtPnBy
b3RvY29sKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZWplY3QgQ29va2ll
IGlmIGRvbWFpbiBpcyBlbXB0eQorICAgIGlmICghY29va2llLT5kb21haW4oKS5sZW5ndGgoKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIWNvb2tpZS0+aGFzRGVmYXVsdERvbWFp
bigpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkb21haW4gY29udGFpbnMgYW4gZW1iZWRk
ZWQgZG90LgorICAgICAgICBpbnQgZG90UG9zaXRpb24gPSBjb29raWUtPmRvbWFpbigpLmZpbmQo
Ii4iLCAxKTsKKyAgICAgICAgaWYgKGRvdFBvc2l0aW9uID09IC0xIHx8IHN0YXRpY19jYXN0PHVu
c2lnbmVkIGludD4oZG90UG9zaXRpb24pID09IGNvb2tpZS0+ZG9tYWluKCkubGVuZ3RoKCkpIHsK
KyAgICAgICAgICAgIExPR19FUlJPUigiQ29va2llICVzIGlzIHJlamVjdGVkIGJlY2F1c2UgaXRz
IGRvbWFpbiBkb2VzIG5vdCBjb250YWluIGFuIGVtYmVkZGVkIGRvdC5cbiIsIGNvb2tpZS0+dG9T
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gVGhlIHJlcXVlc3QgaG9zdCBzaG91bGQgZG9tYWluIG1hdGNo
IHRoZSBEb21haW4gYXR0cmlidXRlLgorICAgIC8vIERvbWFpbiBzdHJpbmcgc3RhcnRzIHdpdGgg
YSBkb3QsIHNvIGEuYi5jb20gc2hvdWxkIGRvbWFpbiBtYXRjaCAuYS5iLmNvbS4KKyAgICAvLyBh
ZGQgYSAiLiIgYXQgYmVnaW5uaW5nIG9mIGhvc3QgbmFtZSwgYmVjYXVzZSBpdCBjYW4gaGFuZGxl
IG1hbnkgY2FzZXMgc3VjaCBhcworICAgIC8vIGEuYi5jb20gbWF0Y2hlcyBiLmNvbSwgYS5iLmNv
bSBtYXRjaGVzIC5CLmNvbSBhbmQgYS5iLmNvbSBtYXRjaGVzIC5BLmIuQ29tCisgICAgLy8gYW5k
IHNvIG9uLgorICAgIFN0cmluZyBob3N0RG9tYWluTmFtZSA9IHVybC5ob3N0KCk7CisgICAgaG9z
dERvbWFpbk5hbWUgPSBob3N0RG9tYWluTmFtZS5zdGFydHNXaXRoKCIuIikgPyBob3N0RG9tYWlu
TmFtZSA6ICIuIiArIGhvc3REb21haW5OYW1lOworICAgIGlmICghaG9zdERvbWFpbk5hbWUuZW5k
c1dpdGgoY29va2llLT5kb21haW4oKSwgZmFsc2UpKSB7CisgICAgICAgIExPR19FUlJPUigiQ29v
a2llICVzIGlzIHJlamVjdGVkIGJlY2F1c2UgaXRzIGRvbWFpbiBkb2VzIG5vdCBkb21haW4gbWF0
Y2ggdGhlIFVSTCAlc1xuIiwgY29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCksIHVybC5z
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IC8vIFdlIHNob3VsZCBjaGVjayBmb3IgYW4gZW1iZWRkZWQgZG90IGluIHRoZSBwb3J0aW9uIG9m
IHN0cmluZyBpbiB0aGUgaG9zdCBub3QgaW4gdGhlIGRvbWFpbgorICAgIC8vIGJ1dCB0byBtYXRj
aCBmaXJlZm94IGJlaGF2aW91ciB3ZSBkbyBub3QuCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K1N0cmluZyBDb29raWVNYW5hZ2VyOjpnZXRDb29raWUoY29uc3QgS1VSTCYgdXJsLCBDb29raWVG
aWx0ZXIgZmlsdGVyKSBjb25zdAoreworICAgIFZlY3RvcjxQYXJzZWRDb29raWUqPiByYXdDb29r
aWVzOworICAgIHJhd0Nvb2tpZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzX21heENvb2tpZUNv
dW50UGVySG9zdCk7CisKKyAgICAvLyBSZXRyaWV2ZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1
cmwKKyAgICBnZXRSYXdDb29raWVzKHJhd0Nvb2tpZXMsIHVybCwgZmlsdGVyKTsKKworICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIHRoZXJlIGFyZSAlZCBjb29raWVzIGluIHJhdyBjb29r
aWVzXG4iLCByYXdDb29raWVzLnNpemUoKSk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgY29va2ll
IGhlYWRlciBzdHJpbmcgdXNpbmcgdGhlIHJldHJpZXZlZCBjb29raWVzCisgICAgU3RyaW5nQnVp
bGRlciBjb29raWVTdHJpbmdCdWlsZGVyOworICAgIGNvb2tpZVN0cmluZ0J1aWxkZXIucmVzZXJ2
ZUNhcGFjaXR5KDUxMik7CisgICAgc2l6ZV90IGNvb2tpZVNpemUgPSByYXdDb29raWVzLnNpemUo
KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb2tpZVNpemU7IGkrKykgeworICAgICAg
ICBjb29raWVTdHJpbmdCdWlsZGVyLmFwcGVuZChyYXdDb29raWVzW2ldLT50b05hbWVWYWx1ZVBh
aXIoKSk7CisgICAgICAgIGlmIChpICE9IGNvb2tpZVNpemUtMSkKKyAgICAgICAgICAgIGNvb2tp
ZVN0cmluZ0J1aWxkZXIuYXBwZW5kKCI7ICIpOworICAgIH0KKworICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGNvb2tpZVN0cmluZyBpcyAtICVzXG4iLCBjb29raWVTdHJpbmdCdWlsZGVy
LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gY29va2llU3RyaW5nQnVp
bGRlci50b1N0cmluZygpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmdldFJhd0Nvb2tpZXMo
VmVjdG9yPFBhcnNlZENvb2tpZSo+ICZzdGFja09mQ29va2llcywgY29uc3QgS1VSTCYgcmVxdWVz
dFVSTCwgQ29va2llRmlsdGVyIGZpbHRlcikgY29uc3QKK3sKKyAgICBDb29raWVMb2coIkNvb2tp
ZU1hbmFnZXIgLSBnZXRSYXdDb29raWVzIC0gcHJvY2Vzc2luZyB1cmwgd2l0aCBkb21haW4gLSAl
cyAmIHByb3RvY29sOiAlcyAmIHBhdGg6ICVzXG4iLCByZXF1ZXN0VVJMLmhvc3QoKS51dGY4KCku
ZGF0YSgpLCByZXF1ZXN0VVJMLnByb3RvY29sKCkudXRmOCgpLmRhdGEoKSwgcmVxdWVzdFVSTC5w
YXRoKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBib29sIHNwZWNpYWxDYXNlRm9yTG9jYWwgPSAo
cmVxdWVzdFVSTC5wcm90b2NvbElzKCJsb2NhbCIpIHx8IHJlcXVlc3RVUkwucHJvdG9jb2xJcygi
ZmlsZSIpKSAmJiBtX3Nob3VsZER1bXBBbGxDb29raWVzOworICAgIGJvb2wgaXNDb25uZWN0aW9u
U2VjdXJlID0gcmVxdWVzdFVSTC5wcm90b2NvbElzKCJodHRwcyIpIHx8IHJlcXVlc3RVUkwucHJv
dG9jb2xJcygid3NzIikgfHwgc3BlY2lhbENhc2VGb3JMb2NhbDsKKworICAgIFZlY3RvcjxQYXJz
ZWRDb29raWUqPiBjb29raWVDYW5kaWRhdGVzOworICAgIFZlY3RvcjxDb29raWVNYXAqPiBwcm90
b2NvbHNUb1NlYXJjaDsKKworICAgIGlmIChzcGVjaWFsQ2FzZUZvckxvY2FsKQorICAgICAgICBj
b3B5VmFsdWVzVG9WZWN0b3IobV9tYW5hZ2VyTWFwLCBwcm90b2NvbHNUb1NlYXJjaCk7CisgICAg
ZWxzZSB7CisgICAgICAgIHByb3RvY29sc1RvU2VhcmNoLmFwcGVuZChtX21hbmFnZXJNYXAuZ2V0
KHJlcXVlc3RVUkwucHJvdG9jb2woKSkpOworICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBhIGhh
Y2sgZm9yIHdlYndvcmtzIGFwcHM7IFJGQyA2MjY1IHNheXMgIkNvb2tpZXMgZG8gbm90IHByb3Zp
ZGUgaXNvbGF0aW9uIGJ5IHNjaGVtZSIKKyAgICAgICAgLy8gc28gd2Ugc2hvdWxkIG5vdCBiZSBj
aGVja2luZyBwcm90b2NvbHMgYXQgYWxsLiBTZWUgUFIgMTM1NTk1CisgICAgICAgIGlmIChtX3No
b3VsZER1bXBBbGxDb29raWVzKSB7CisgICAgICAgICAgICBwcm90b2NvbHNUb1NlYXJjaC5hcHBl
bmQobV9tYW5hZ2VyTWFwLmdldCgiZmlsZSIpKTsKKyAgICAgICAgICAgIHByb3RvY29sc1RvU2Vh
cmNoLmFwcGVuZChtX21hbmFnZXJNYXAuZ2V0KCJsb2NhbCIpKTsKKyAgICAgICB9CisgICAgfQor
CisgICAgVmVjdG9yPFN0cmluZz4gZGVsaW1pdGVkSG9zdDsKKyAgICByZXF1ZXN0VVJMLmhvc3Qo
KS5sb3dlcigpLnNwbGl0KCIuIiwgdHJ1ZSwgZGVsaW1pdGVkSG9zdCk7CisKKyAgICAvLyBHbyB0
aHJvdWdoIGFsbCB0aGUgcHJvdG9jb2wgdHJlZXMgdGhhdCB3ZSBuZWVkIHRvIHNlYXJjaCBmb3IK
KyAgICAvLyBhbmQgZ2V0IGFsbCBjb29raWVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGlzIGRvbWFp
bgorICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcHJvdG9jb2xzVG9TZWFyY2guc2l6ZSgpOyBr
KyspIHsKKyAgICAgICAgQ29va2llTWFwKiBjdXJyZW50TWFwID0gcHJvdG9jb2xzVG9TZWFyY2hb
a107CisKKyAgICAgICAgLy8gaWYgbm8gY29va2llcyBleGlzdCBmb3IgdGhpcyBwcm90b2NvbCwg
YnJlYWsgcmlnaHQgYXdheQorICAgICAgICBpZiAoIWN1cnJlbnRNYXApCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBsb29raW5nIGF0
IHByb3RvY29sIG1hcCAlcyBcbiIsIGN1cnJlbnRNYXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgp
KTsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGxvY2FsIGFuZCBmaWxlcyAtIGJlY2F1
c2UgV2ViQXBwcyBleHBlY3QgdG8gZ2V0IEFMTCBjb29raWVzIGZyb20gdGhlIGJhY2tpbmctc3Rv
cmUgb24gbG9jYWwgcHJvdG9jb2wKKyAgICAgICAgaWYgKHNwZWNpYWxDYXNlRm9yTG9jYWwpIHsK
KyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIHNwZWNpYWwgY2FzZSBmaW5k
IGluIHByb3RvY29sIG1hcCAtICVzXG4iLCBjdXJyZW50TWFwLT5nZXROYW1lKCkudXRmOCgpLmRh
dGEoKSk7CisgICAgICAgICAgICBjdXJyZW50TWFwLT5nZXRBbGxDaGlsZENvb2tpZXMoJmNvb2tp
ZUNhbmRpZGF0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0IGNvb2tp
ZXMgZnJvbSB0aGUgbnVsbCBkb21haW4gbWFwCisgICAgICAgICAgICBjdXJyZW50TWFwLT5nZXRB
bGxDb29raWVzKCZjb29raWVDYW5kaWRhdGVzKTsKKworICAgICAgICAgICAgLy8gR2V0IGNvb2tp
ZXMgZnJvbSB0aGUgdmFsaWQgZG9tYWluIG1hcHMKKyAgICAgICAgICAgIGludCBpID0gZGVsaW1p
dGVkSG9zdC5zaXplKCkgLSAxOworICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAg
ICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZpbmRpbmcgJXMgaW4gY3VycmVu
dG1hcFxuIiwgZGVsaW1pdGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAg
ICBjdXJyZW50TWFwID0gY3VycmVudE1hcC0+Z2V0U3ViZG9tYWluTWFwKGRlbGltaXRlZEhvc3Rb
aV0pOworICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgc3ViZG9tYWluL2RvbWFpbiBkb2VzIG5v
dCBleGlzdCBpbiBvdXIgbWFwcGluZyB0aGVuIHdlIHNpbXBseSBleGl0CisgICAgICAgICAgICAg
ICAgaWYgKCFjdXJyZW50TWFwKSB7CisgICAgICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGNhbm5vdCBmaW5kIG5leHQgbWFwIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3Au
XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZvdW5kIHRoZSBtYXAsIGdy
YWJiaW5nIGNvb2tpZXMgZnJvbSB0aGlzIG1hcFxuIik7CisgICAgICAgICAgICAgICAgY3VycmVu
dE1hcC0+Z2V0QWxsQ29va2llcygmY29va2llQ2FuZGlkYXRlcyk7CisgICAgICAgICAgICAgICAg
aS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQ29va2llTG9nKCJD
b29raWVNYW5hZ2VyIC0gdGhlcmUgYXJlICVkIGNvb2tpZXMgaW4gY2FuZGlkYXRlXG4iLCBjb29r
aWVDYW5kaWRhdGVzLnNpemUoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb2tp
ZUNhbmRpZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUg
PSBjb29raWVDYW5kaWRhdGVzW2ldOworCisgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgcGF0
aC1tYXRjaGVzIHJ1bGVzIGluIFJGQzYyNjUsIHNlY3Rpb24gNS4xLjQsCisgICAgICAgIC8vIHdl
IHNob3VsZCBhZGQgYSAnLycgYXQgdGhlIGVuZCBvZiBjb29raWUtcGF0aCBmb3IgY29tcGFyaXNv
biBpZiB0aGUgY29va2llLXBhdGggaXMgbm90IGVuZCB3aXRoICcvJy4KKyAgICAgICAgU3RyaW5n
IHBhdGggPSBjb29raWUtPnBhdGgoKTsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2Vy
IC0gY29tcGFyaW5nIGNvb2tpZSBwYXRoICVzIChsZW4gJWQpIHRvIHJlcXVlc3QgcGF0aCAlcyAo
bGVuICVkKSIsIHBhdGgudXRmOCgpLmRhdGEoKSwgcGF0aC5sZW5ndGgoKSwgcmVxdWVzdFVSTC5w
YXRoKCkudXRmOCgpLmRhdGEoKSwgcGF0aC5sZW5ndGgoKSk7CisgICAgICAgIGlmICghZXF1YWxJ
Z25vcmluZ0Nhc2UocGF0aCwgcmVxdWVzdFVSTC5wYXRoKCkpICYmICFwYXRoLmVuZHNXaXRoKCIv
IiwgZmFsc2UpKQorICAgICAgICAgICAgcGF0aCArPSAiLyI7CisKKyAgICAgICAgLy8gT25seSBz
ZWN1cmUgY29ubmVjdGlvbnMgaGF2ZSBhY2Nlc3MgdG8gc2VjdXJlIGNvb2tpZXMuIFVubGVzcyBz
cGVjaWFsQ2FzZUZvckxvY2FsIGlzIHRydWUKKyAgICAgICAgLy8gR2V0IHRoZSBjb29raWVzIGZp
bHRlcmluZyBvdXQgSHR0cE9ubHkgY29va2llcyBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIChy
ZXF1ZXN0VVJMLnBhdGgoKS5zdGFydHNXaXRoKHBhdGgsIGZhbHNlKSAmJiAoaXNDb25uZWN0aW9u
U2VjdXJlIHx8ICFjb29raWUtPmlzU2VjdXJlKCkpICYmIChmaWx0ZXIgPT0gV2l0aEh0dHBPbmx5
Q29va2llcyB8fCAhY29va2llLT5pc0h0dHBPbmx5KCkpKSB7CisgICAgICAgICAgICBDb29raWVM
b2coIkNvb2tpZU1hbmFnZXIgLSBjb29raWUgY2hvc2VuIC0gJXNcbiIsIGNvb2tpZS0+dG9TdHJp
bmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGNvb2tpZS0+c2V0TGFzdEFjY2Vzc2Vk
KGN1cnJlbnRUaW1lKCkpOworICAgICAgICAgICAgc3RhY2tPZkNvb2tpZXMuYXBwZW5kKGNvb2tp
ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNvcnQoc3RhY2tPZkNvb2tpZXMuYmVn
aW4oKSwgc3RhY2tPZkNvb2tpZXMuZW5kKCksIGNvb2tpZVNvcnRlcik7Cit9CisKK3ZvaWQgQ29v
a2llTWFuYWdlcjo6cmVtb3ZlQWxsQ29va2llcyhCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5IGJh
Y2tpbmdTdG9yZVJlbW92YWwpCit7CisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+Ojpp
dGVyYXRvciBmaXJzdCA9IG1fbWFuYWdlck1hcC5iZWdpbigpOworICAgIEhhc2hNYXA8U3RyaW5n
LCBDb29raWVNYXAqPjo6aXRlcmF0b3IgZW5kID0gbV9tYW5hZ2VyTWFwLmVuZCgpOworICAgIGZv
ciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IGZpcnN0OyBpdCAh
PSBlbmQ7ICsraXQpCisgICAgICAgIGl0LT5zZWNvbmQtPmRlbGV0ZUFsbENvb2tpZXNBbmREb21h
aW5zKCk7CisKKyAgICBpZiAoYmFja2luZ1N0b3JlUmVtb3ZhbCA9PSBSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlKQorICAgICAgICBtX2Nvb2tpZUJhY2tpbmdTdG9yZS0+cmVtb3ZlQWxsKCk7CisgICAg
bV9jb3VudCA9IDA7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0Q29va2llSmFyKGNvbnN0
IGNoYXIqIGZpbGVOYW1lKQoreworICAgIG1fY29va2llSmFyRmlsZU5hbWUgPSBTdHJpbmcoZmls
ZU5hbWUpOworICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5vcGVuKG1fY29va2llSmFyRmlsZU5h
bWUpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmNoZWNrQW5kVHJlYXRDb29raWUoUGFyc2Vk
Q29va2llKiBjYW5kaWRhdGVDb29raWUsIEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRv
QmFja2luZ1N0b3JlKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGNoZWNrQW5k
VHJlYXRDb29raWUgLSBwcm9jZXNzaW5nIHVybCB3aXRoIGRvbWFpbiAtICVzICYgcHJvdG9jb2wg
JXNcbiIsIGNhbmRpZGF0ZUNvb2tpZS0+ZG9tYWluKCkudXRmOCgpLmRhdGEoKSwgY2FuZGlkYXRl
Q29va2llLT5wcm90b2NvbCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgY29uc3QgYm9vbCBpZ25v
cmVEb21haW4gPSBzaG91bGRJZ25vcmVEb21haW4oY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgp
KTsKKworICAgIC8vIERldGVybWluZSB3aGljaCBwcm90b2NvbCB0cmVlIHRvIGFkZCB0aGUgY29v
a2llIHRvLiBDcmVhdGUgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBDb29raWVNYXAqIGN1ck1hcCA9
IDA7CisgICAgaWYgKG1fbWFuYWdlck1hcC5jb250YWlucyhjYW5kaWRhdGVDb29raWUtPnByb3Rv
Y29sKCkpKQorICAgICAgICBjdXJNYXAgPSBtX21hbmFnZXJNYXAuZ2V0KGNhbmRpZGF0ZUNvb2tp
ZS0+cHJvdG9jb2woKSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGEg
c2VjdXJlIHZlcnNpb24sIGlmIGl0IGlzLCBsaW5rIGl0IHRvIHRoZSBub24tc2VjdXJlIHZlcnNp
b24KKyAgICAgICAgLy8gTGluayBjdXJNYXAgdG8gdGhlIG5ldyBwcm90b2NvbCBhcyB3ZWxsIGFz
IHRoZSBvbGQgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgaWYgKGNhbmRpZGF0ZUNv
b2tpZS0+cHJvdG9jb2woKSA9PSAiaHR0cHMiKSB7CisgICAgICAgICAgICBjdXJNYXAgPSBtX21h
bmFnZXJNYXAuZ2V0KCJodHRwIik7CisgICAgICAgICAgICBpZiAoIWN1ck1hcCkgeworICAgICAg
ICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29raWVNYXAoImh0dHAiKTsKKyAgICAgICAgICAgICAg
ICBtX21hbmFnZXJNYXAuYWRkKCJodHRwIiwgY3VyTWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIGlmIChjYW5kaWRhdGVDb29raWUtPnByb3RvY29sKCkgPT0gIndzcyIpIHsKKyAg
ICAgICAgICAgIGN1ck1hcCA9IG1fbWFuYWdlck1hcC5nZXQoIndzIik7CisgICAgICAgICAgICBp
ZiAoIWN1ck1hcCkgeworICAgICAgICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29raWVNYXAoIndz
Iik7CisgICAgICAgICAgICAgICAgbV9tYW5hZ2VyTWFwLmFkZCgid3MiLCBjdXJNYXApOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29r
aWVNYXAoY2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpKTsKKworICAgICAgICBDb29raWVMb2co
IkNvb2tpZU1hbmFnZXIgLSBhZGRpbmcgcHJvdG9jb2wgY29va2llbWFwIC0gJXNcbiIsIGN1ck1h
cC0+Z2V0TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgIG1fbWFuYWdlck1hcC5hZGQo
Y2FuZGlkYXRlQ29va2llLT5wcm90b2NvbCgpLCBjdXJNYXApOworICAgIH0KKworICAgIC8vIElm
IHByb3RvY29sIHN1cHBvcnQgZG9tYWluLCB3ZSBoYXZlIHRvIHRyYXZlcnNlIHRoZSBkb21haW4g
dHJlZSB0byBmaW5kIHRoZSByaWdodAorICAgIC8vIGNvb2tpZU1hcCB0byBoYW5kbGUgd2l0aAor
ICAgIGlmICghaWdub3JlRG9tYWluKQorICAgICAgICBjdXJNYXAgPSBmaW5kT3JDcmVhdGVDb29r
aWVNYXAoY3VyTWFwLCBjYW5kaWRhdGVDb29raWUtPmRvbWFpbigpLCBjYW5kaWRhdGVDb29raWUt
Pmhhc0V4cGlyZWQoKSk7CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBwcm9wZXIgbWFw
IGZvciB0aGlzIGNvb2tpZSwgd2UgY2FuIG1vZGlmeSBpdAorICAgIC8vIElmIGNvb2tpZSBkb2Vz
IG5vdCBleGlzdCBhbmQgaGFzIGV4cGlyZWQsIGRlbGV0ZSBpdAorICAgIC8vIElmIGNvb2tpZSBl
eGlzdHMgYW5kIGl0IGhhcyBleHBpcmVkLCBzbyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIHRoZSBt
YXAsIGlmIG5vdCB1cGRhdGUgaXQKKyAgICAvLyBJZiBjb29raWUgZXhwaXJlZCBhbmQgY2FtZSBm
cm9tIHRoZSBCYWNraW5nU3RvcmUgKHRoZXJlZm9yZSBkb2VzIG5vdCBleGlzdCksIHdlIGhhdmUg
dG8gcmVtb3ZlIGZyb20gZGF0YWJhc2UKKyAgICAvLyBJZiBjb29raWUgZG9lcyBub3QgZXhpc3Qg
JiBpdCdzIHZhbGlkLCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgbWFwCisKKyAgICBpZiAoY2FuZGlk
YXRlQ29va2llLT5oYXNFeHBpcmVkKCkgfHwgY2FuZGlkYXRlQ29va2llLT5pc0ZvcmNlRXhwaXJl
ZCgpKSB7CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZ2V0QmFja2luZ1N0b3JlQ29va2ll
cygpIHRvIGNhdGNoIGV4cGlyZWQgY29va2llcworICAgICAgICBpZiAocG9zdFRvQmFja2luZ1N0
b3JlID09IEJhY2tpbmdTdG9yZUNvb2tpZUVudHJ5KQorICAgICAgICAgICAgbV9jb29raWVCYWNr
aW5nU3RvcmUtPnJlbW92ZShjYW5kaWRhdGVDb29raWUpOworICAgICAgICBlbHNlIGlmIChjdXJN
YXApIHsKKyAgICAgICAgICAgIGJvb2wgY29va2llQWxyZWFkeUV4aXN0cyA9IGN1ck1hcC0+ZXhp
c3RzQ29va2llKGNhbmRpZGF0ZUNvb2tpZSk7CisgICAgICAgICAgICBpZiAoY29va2llQWxyZWFk
eUV4aXN0cykgeworICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGV4
cGlyZWQgY29va2llIGV4aXN0cyBpbiBtZW1vcnkiKTsKKyAgICAgICAgICAgICAgICBQYXJzZWRD
b29raWUqIGV4cGlyZWQgPSBjdXJNYXAtPnJlbW92ZUNvb2tpZShjYW5kaWRhdGVDb29raWUpOwor
ICAgICAgICAgICAgICAgIC8vIENvb2tpZSBpcyB1c2VsZXNzLCBSZW1vdmUgdGhlIGNvb2tpZSBm
cm9tIHRoZSBiYWNraW5nc3RvcmUgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgLy8gQmFj
a3VwIGNoZWNrIGZvciBCYWNraW5nU3RvcmVDb29raWVFbnRyeSBpbmNhc2Ugc29tZW9uZSBpbmNv
cnJlY3RseSB1c2VzIHRoaXMgZW51bQorICAgICAgICAgICAgICAgIGlmIChwb3N0VG9CYWNraW5n
U3RvcmUgIT0gQmFja2luZ1N0b3JlQ29va2llRW50cnkgJiYgIWV4cGlyZWQtPmlzU2Vzc2lvbigp
KSB7CisgICAgICAgICAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGV4cGly
ZWQgY29va2llIGlzIG5vbnNlc3Npb24sIGRlbGV0aW5nIGZyb20gZGIiKTsKKyAgICAgICAgICAg
ICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPnJlbW92ZShleHBpcmVkKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIGV4cGlyZWQ7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZGVsZXRlIGNhbmRpZGF0ZUNvb2tpZTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoY3VyTWFwKTsKKyAgICAgICAgYm9vbCBjb29raWVB
bHJlYWR5RXhpc3RzID0gY3VyTWFwLT5leGlzdHNDb29raWUoY2FuZGlkYXRlQ29va2llKTsKKyAg
ICAgICAgaWYgKGNvb2tpZUFscmVhZHlFeGlzdHMpCisgICAgICAgICAgICB1cGRhdGUoY3VyTWFw
LCBjYW5kaWRhdGVDb29raWUsIHBvc3RUb0JhY2tpbmdTdG9yZSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGFkZENvb2tpZVRvTWFwKGN1ck1hcCwgY2FuZGlkYXRlQ29va2llLCBwb3N0VG9C
YWNraW5nU3RvcmUpOworICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjphZGRDb29raWVU
b01hcChDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBjYW5kaWRhdGVDb29raWUs
IEJhY2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRvQmFja2luZ1N0b3JlKQoreworICAgIFBh
cnNlZENvb2tpZSogb2xkZXN0Q29va2llID0gMDsKKyAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5v
dCByZWFjaGVkIHRoZSBwZXIgY29va2llIGRvbWFpbiBsaW1pdC4KKyAgICAvLyBJZiB0aGF0IGlz
IG5vdCB0cnVlLCB3ZSBjaGVjayBpZiB0aGUgZ2xvYmFsIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQg
aWYgYmFja2luZ3N0b3JlIG1vZGUgaXMgb24KKyAgICAvLyBUd28gcG9pbnRzOgorICAgIC8vIDEp
IFdlIG9ubHkgZG8gYSBnbG9iYWwgY2hlY2sgaWYgYmFja2luZ3N0b3JlIG1vZGUgaXMgb24gYmVj
YXVzZSB0aGUgZ2xvYmFsIGNvb2tpZSBsaW1pdCBvbmx5CisgICAgLy8gICAgY291bnRzIHNlc3Np
b24gY29va2llcyB0aGF0IGFyZSBzYXZlZCBpbiB0aGUgZGF0YWJhc2UuIElmIHRoZSB1c2VyIGdv
ZXMgb3ZlciB0aGUgbGltaXQKKyAgICAvLyAgICB3aGVuIHRoZXkgYXJlIGluIHByaXZhdGUgbW9k
ZSwgd2Uga25vdyB0aGF0IHRoZSB0b3RhbCBjb29raWUgbGltaXQgd2lsbCBiZSB1bmRlciB0aGUg
bGltaXQKKyAgICAvLyAgICBvbmNlIHRoZSB1c2VyIGdvZXMgYmFjayB0byBub3JtYWwgbW9kZSAo
bWVtb3J5IGRlbGV0ZWQgYW5kIHJlbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlKQorICAgIC8vIDIp
IFdlIHVzZSBlbHNlIGlmIGZvciB0aGlzIHN0YXRlbWVudCBiZWNhdXNlIGlmIHdlIHJlbW92ZSBh
IGNvb2tpZSBpbiB0aGUgMXN0IHN0YXRlbWVudAorICAgIC8vICAgIHRoZW4gaXQgbWVhbnMgdGhl
IGdsb2JhbCBjb3VudCB3aWxsIG5ldmVyIGV4Y2VlZCB0aGUgbGltaXQKKworICAgIENvb2tpZUxp
bWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gbG9jYWwgY291bnQ6ICVkICBnbG9iYWwgY291bnQ6ICVk
IiwgdGFyZ2V0TWFwLT5jb3VudCgpLCBtX2NvdW50KTsKKyAgICBpZiAodGFyZ2V0TWFwLT5jb3Vu
dCgpID49IHNfbWF4Q29va2llQ291bnRQZXJIb3N0KSB7CisgICAgICAgIENvb2tpZUxvZygiQ29v
a2llTWFuYWdlciAtIGRlbGV0aW5nIG9sZGVzdCBjb29raWUgZnJvbSB0aGlzIG1hcCBkdWUgdG8g
ZG9tYWluIGNvdW50LlxuIik7CisgICAgICAgIG9sZGVzdENvb2tpZSA9IHRhcmdldE1hcC0+cmVt
b3ZlT2xkZXN0Q29va2llKCk7CisgICAgfSBlbHNlIGlmIChtX2NvdW50ID49IHNfZ2xvYmFsTWF4
Q29va2llQ291bnQgJiYgKHBvc3RUb0JhY2tpbmdTdG9yZSAhPSBEb05vdFJlbW92ZUZyb21CYWNr
aW5nU3RvcmUpKSB7CisgICAgICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gR2xv
YmFsIGxpbWl0IHJlYWNoZWQsIGluaXRpYXRlIGNvb2tpZSBsaW1pdCBjbGVhbiB1cC4iKTsKKyAg
ICAgICAgaW5pdGlhdGVDb29raWVMaW1pdENsZWFuVXAoKTsKKyAgICB9CisKKyAgICBDb29raWVM
b2coIkNvb2tpZU1hbmFnZXIgLSBhZGRpbmcgbmV3IGNvb2tpZSAtICVzLlxuIiwgY2FuZGlkYXRl
Q29va2llLT50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgdGFyZ2V0TWFwLT5hZGRD
b29raWUoY2FuZGlkYXRlQ29va2llKTsKKworICAgIC8vIE9ubHkgYWRkIG5vbiBzZXNzaW9uIGNv
b2tpZSB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgICBpZiAocG9zdFRvQmFja2luZ1N0b3JlID09
IFJlbW92ZUZyb21CYWNraW5nU3RvcmUpIHsKKyAgICAgICAgaWYgKG9sZGVzdENvb2tpZSAmJiAh
b2xkZXN0Q29va2llLT5pc1Nlc3Npb24oKSkgeworICAgICAgICAgICAgQ29va2llTG9nKCJDb29r
aWVNYW5hZ2VyIC0gb2xkZXN0Q29va2llIGV4aXN0cywgZGVsZXRpbmcgaXQgZnJvbSBiYWNraW5n
c3RvcmUgYW5kIGRlc3RydWN0aW5nLlxuIik7CisgICAgICAgICAgICBtX2Nvb2tpZUJhY2tpbmdT
dG9yZS0+cmVtb3ZlKG9sZGVzdENvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjYW5k
aWRhdGVDb29raWUtPmlzU2Vzc2lvbigpKQorICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3Rv
cmUtPmluc2VydChjYW5kaWRhdGVDb29raWUpOworICAgIH0KKyAgICBpZiAob2xkZXN0Q29va2ll
KQorICAgICAgICBkZWxldGUgb2xkZXN0Q29va2llOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6
OnVwZGF0ZShDb29raWVNYXAqIHRhcmdldE1hcCwgUGFyc2VkQ29va2llKiBuZXdDb29raWUsIEJh
Y2tpbmdTdG9yZVJlbW92YWxQb2xpY3kgcG9zdFRvQmFja2luZ1N0b3JlKQoreworICAgIC8vIElm
IG9sZCBjb29raWUgaXMgbm9uLXNlc3Npb24gYW5kIG5ldyBvbmUgaXMsIHdlIGhhdmUgdG8gZGVs
ZXRlIGl0IGZyb20gYmFja2luZ3N0b3JlCisgICAgLy8gSWYgbmV3IGNvb2tpZSBpcyBub24tc2Vz
c2lvbiBhbmQgb2xkIG9uZSBpcywgd2UgaGF2ZSB0byBhZGQgaXQgdG8gYmFja2luZ3N0b3JlCisg
ICAgLy8gSWYgYm90aCBzZXNzaW9ucyBhcmUgbm9uLXNlc3Npb24sIHRoZW4gd2UgdXBkYXRlIGl0
IGluIHRoZSBiYWNraW5nc3RvcmUKKworICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIHVw
ZGF0aW5nIG5ldyBjb29raWUgLSAlcy5cbiIsIG5ld0Nvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCku
ZGF0YSgpKTsKKworICAgIFBhcnNlZENvb2tpZSogb2xkQ29va2llID0gdGFyZ2V0TWFwLT51cGRh
dGVDb29raWUobmV3Q29va2llKTsKKworICAgIEFTU0VSVChvbGRDb29raWUpOworCisgICAgaWYg
KHBvc3RUb0JhY2tpbmdTdG9yZSA9PSBSZW1vdmVGcm9tQmFja2luZ1N0b3JlKSB7CisgICAgICAg
IGJvb2wgbmV3SXNTZXNzaW9uID0gbmV3Q29va2llLT5pc1Nlc3Npb24oKTsKKyAgICAgICAgYm9v
bCBvbGRJc1Nlc3Npb24gPSBvbGRDb29raWUtPmlzU2Vzc2lvbigpOworICAgICAgICBpZiAoIW5l
d0lzU2Vzc2lvbiAmJiAhb2xkSXNTZXNzaW9uKQorICAgICAgICAgICAgbV9jb29raWVCYWNraW5n
U3RvcmUtPnVwZGF0ZShuZXdDb29raWUpOworICAgICAgICBlbHNlIGlmIChuZXdJc1Nlc3Npb24g
JiYgIW9sZElzU2Vzc2lvbikgeworICAgICAgICAgICAgLy8gTXVzdCBtYW51YWxseSBkZWNyZWFz
ZSB0aGUgY291bnRlciBiZWNhdXNlIGl0IHdhcyBub3QgY291bnRlZCB3aGVuCisgICAgICAgICAg
ICAvLyB0aGUgY29va2llIHdhcyByZW1vdmVkIGluIGNvb2tpZU1hcC4KKyAgICAgICAgICAgIHJl
bW92ZWRDb29raWUoKTsKKyAgICAgICAgICAgIG1fY29va2llQmFja2luZ1N0b3JlLT5yZW1vdmUo
b2xkQ29va2llKTsKKyAgICAgICAgfSBlbHNlIGlmICghbmV3SXNTZXNzaW9uICYmIG9sZElzU2Vz
c2lvbikgeworICAgICAgICAgICAgLy8gTXVzdCBtYW51YWxseSBpbmNyZWFzZSB0aGUgY291bnRl
ciBiZWNhdXNlIGl0IHdhcyBub3QgY291bnRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgY29v
a2llIHdhcyBhZGRlZCBpbiBjb29raWVNYXAuCisgICAgICAgICAgICBhZGRlZENvb2tpZSgpOwor
ICAgICAgICAgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmluc2VydChuZXdDb29raWUpOworICAg
ICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBvbGRDb29raWU7Cit9CisKK3ZvaWQgQ29va2llTWFu
YWdlcjo6Z2V0QmFja2luZ1N0b3JlQ29va2llcygpCit7CisgICAgLy8gVGhpcyBtZXRob2Qgc2hv
dWxkIGJlIGNhbGxlZCBqdXN0IGFmdGVyIGhhdmluZyBjcmVhdGVkIHRoZSBjb29raWVNYW5hZ2Vy
CisgICAgLy8gTkVWRVIgYWZ0ZXJ3YXJkcyEKKyAgICBBU1NFUlQoIW1fY291bnQpOworCisgICAg
VmVjdG9yPFBhcnNlZENvb2tpZSo+IGNvb2tpZXM7CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUt
PmdldENvb2tpZXNGcm9tRGF0YWJhc2UoY29va2llcyk7CisgICAgQ29va2llTG9nKCJDb29raWVN
YW5hZ2VyIC0gQmFja2luZ3N0b3JlIGhhcyAlZCBjb29raWVzLCBsb2FkaW5nIHRoZW0gaW4gbWVt
b3J5IG5vdyIsIGNvb2tpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNv
b2tpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBj
b29raWVzW2ldOworICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKG5ld0Nvb2tpZSwgQmFja2lu
Z1N0b3JlQ29va2llRW50cnkpOworICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRQ
cml2YXRlTW9kZShjb25zdCBib29sIG1vZGUpCit7CisgICAgaWYgKG1fcHJpdmF0ZU1vZGUgPT0g
bW9kZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlTW9kZSA9IG1vZGU7CisgICAg
aWYgKCFtb2RlKSB7CisgICAgICAgIHJlbW92ZUFsbENvb2tpZXMoRG9Ob3RSZW1vdmVGcm9tQmFj
a2luZ1N0b3JlKTsKKyAgICAgICAgZ2V0QmFja2luZ1N0b3JlQ29va2llcygpOworICAgIH0KK30K
KworQ29va2llTWFwKiBDb29raWVNYW5hZ2VyOjpmaW5kT3JDcmVhdGVDb29raWVNYXAoQ29va2ll
TWFwKiBwcm90b2NvbE1hcCwgY29uc3QgU3RyaW5nJiBkb21haW4sIGJvb2wgZmluZE9ubHkpCit7
CisgICAgLy8gRXhwbG9kZSB0aGUgZG9tYWluIHdpdGggdGhlICcuJyBkZWxpbWl0ZXIKKyAgICBW
ZWN0b3I8U3RyaW5nPiBkZWxpbWl0ZWRIb3N0OworICAgIGRvbWFpbi5zcGxpdCgiLiIsIGRlbGlt
aXRlZEhvc3QpOworCisgICAgQ29va2llTWFwKiBjdXJNYXAgPSBwcm90b2NvbE1hcDsKKyAgICBz
aXplX3QgaG9zdFNpemUgPSBkZWxpbWl0ZWRIb3N0LnNpemUoKTsKKworICAgIENvb2tpZUxvZygi
Q29va2llTWFuYWdlciAtIGxvb2tpbmcgYXQgcHJvdG9jb2wgbWFwICVzIFxuIiwgcHJvdG9jb2xN
YXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIC8vIEZpbmQgJiBjcmVhdGUgbmVj
ZXNzYXJ5IENvb2tpZU1hcHMgYnkgdHJhdmVyc2luZyBkb3duIHRoZSBkb21haW4gdHJlZQorICAg
IC8vIEVhY2ggQ29va2llTWFwIHJlcHJlc2VudCBhIHN1YnNlY3Rpb24gb2YgdGhlIGRvbWFpbiwg
ZGVsaW1pdGVkIGJ5ICIuIgorICAgIGludCBpID0gaG9zdFNpemUgLSAxOworICAgIHdoaWxlIChp
ID49IDApIHsKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gZmluZGluZyAlcyBp
biBjdXJyZW50bWFwXG4iLCBkZWxpbWl0ZWRIb3N0W2ldLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICBDb29raWVNYXAqIG5leHRNYXAgPSBjdXJNYXAtPmdldFN1YmRvbWFpbk1hcChkZWxpbWl0ZWRI
b3N0W2ldKTsKKyAgICAgICAgaWYgKCFuZXh0TWFwKSB7CisgICAgICAgICAgICBDb29raWVMb2co
IkNvb2tpZU1hbmFnZXIgLSBjYW5ub3QgZmluZCBtYXBcbiIpOworICAgICAgICAgICAgaWYgKGZp
bmRPbmx5KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgQ29va2llTG9n
KCJDb29raWVNYW5hZ2VyIC0gY3JlYXRpbmcgJXMgaW4gY3VycmVudG1hcCAlc1xuIiwgZGVsaW1p
dGVkSG9zdFtpXS51dGY4KCkuZGF0YSgpLCBjdXJNYXAtPmdldE5hbWUoKS51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIG5leHRNYXAgPSBuZXcgQ29va2llTWFwKGRlbGltaXRlZEhvc3RbaV0p
OworICAgICAgICAgICAgQ29va2llTG9nKCJDb29raWVNYW5hZ2VyIC0gYWRkaW5nIHN1YmRvbWFp
biB0byBtYXBcbiIpOworICAgICAgICAgICAgY3VyTWFwLT5hZGRTdWJkb21haW5NYXAoZGVsaW1p
dGVkSG9zdFtpXSwgbmV4dE1hcCk7CisgICAgICAgIH0KKyAgICAgICAgY3VyTWFwID0gbmV4dE1h
cDsKKyAgICAgICAgaS0tOworICAgIH0KKyAgICByZXR1cm4gY3VyTWFwOworfQorCisKK3ZvaWQg
Q29va2llTWFuYWdlcjo6cmVtb3ZlQ29va2llV2l0aE5hbWUoY29uc3QgS1VSTCYgdXJsLCBjb25z
dCBTdHJpbmcmIGNvb2tpZU5hbWUpCit7CisgICAgLy8gV2UgZ2V0IGFsbCBjb29raWVzIGZyb20g
YWxsIGRvbWFpbnMgdGhhdCBkb21haW4gbWF0Y2hlcyB0aGUgcmVxdWVzdCBkb21haW4KKyAgICAv
LyBhbmQgZGVsZXRlIGFueSBjb29raWVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRoYXQgcGF0
aCBtYXRjaGVzIHRoZSByZXF1ZXN0IHBhdGgKKyAgICBWZWN0b3I8UGFyc2VkQ29va2llKj4gcmVz
dWx0czsKKyAgICBnZXRSYXdDb29raWVzKHJlc3VsdHMsIHVybCwgV2l0aEh0dHBPbmx5Q29va2ll
cyk7CisgICAgLy8gRGVsZXRlIHRoZSBjb29raWVzIHRoYXQgcGF0aCBtYXRjaGVzIHRoZSByZXF1
ZXN0IHBhdGgKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKysp
IHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUgPSByZXN1bHRzW2ldOworICAgICAgICBp
ZiAoIWVxdWFsSWdub3JpbmdDYXNlKGNvb2tpZS0+bmFtZSgpLCBjb29raWVOYW1lKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodXJsLnBhdGgoKS5zdGFydHNXaXRoKGNvb2tp
ZS0+cGF0aCgpLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGNvb2tpZS0+Zm9yY2VFeHBpcmUoKTsK
KyAgICAgICAgICAgIGNoZWNrQW5kVHJlYXRDb29raWUoY29va2llLCBSZW1vdmVGcm9tQmFja2lu
Z1N0b3JlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjppbml0
aWF0ZUNvb2tpZUxpbWl0Q2xlYW5VcCgpCit7CisgICAgaWYgKCFtX2xpbWl0VGltZXIuaXNBY3Rp
dmUoKSkgeworICAgICAgICBDb29raWVMb2coIkNvb2tpZU1hbmFnZXIgLSBTdGFydGluZyBhIHRp
bWVyIGZvciBjb29raWUgY2xlYW51cCIpOworICAgICAgICBtX2xpbWl0VGltZXIuc3RhcnRPbmVT
aG90KHNfZGVsYXlUb1N0YXJ0Q29va2llQ2xlYW51cCk7CisgICAgfSBlbHNlIHsKKyNpZiAhTkRF
QlVHCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIENvb2tpZSBjbGVhbnVwIHRp
bWVyIGFscmVhZHkgcnVubmluZyIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIENvb2tpZU1h
bmFnZXI6OmNvb2tpZUxpbWl0Q2xlYW5VcChUaW1lcjxDb29raWVNYW5hZ2VyPiogdGltZXIpCit7
CisgICAgQVNTRVJUX1VOVVNFRCh0aW1lciwgdGltZXIgPT0gJm1fbGltaXRUaW1lcik7CisKKyAg
ICBDb29raWVMaW1pdExvZygiQ29va2llTWFuYWdlciAtIFN0YXJ0aW5nIGNvb2tpZSBjbGVhbiB1
cCIpOworCisgICAgc2l6ZV90IG51bWJlck9mQ29va2llc092ZXJMaW1pdCA9IChtX2NvdW50ID4g
c19nbG9iYWxNYXhDb29raWVDb3VudCkgPyBtX2NvdW50IC0gc19nbG9iYWxNYXhDb29raWVDb3Vu
dCA6IDA7CisgICAgc2l6ZV90IGFtb3VudFRvRGVsZXRlID0gc19jb29raWVzVG9EZWxldGVXaGVu
TGltaXRSZWFjaGVkICsgbnVtYmVyT2ZDb29raWVzT3ZlckxpbWl0OworCisgICAgQ29va2llTGlt
aXRMb2coIkNvb2tpZU1hbmFnZXIgLSBFeGNlc3M6ICVkICBBbW91bnQgdG8gRGVsZXRlOiAlZCIs
IG51bWJlck9mQ29va2llc092ZXJMaW1pdCwgYW1vdW50VG9EZWxldGUpOworCisgICAgLy8gQ2Fs
bCB0aGUgZGF0YWJhc2UgdG8gZGVsZXRlICdhbW91bnRUb0RlbGV0ZScgb2YgY29va2llcworICAg
IFZlY3RvcjxQYXJzZWRDb29raWUqPiBjb29raWVzVG9EZWxldGU7CisgICAgY29va2llc1RvRGVs
ZXRlLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoYW1vdW50VG9EZWxldGUpOworCisgICAgQ29va2ll
TGltaXRMb2coIkNvb2tpZU1hbmFnZXIgLSBDYWxsaW5nIGRhdGFiYXNlIHRvIGNsZWFuIHVwIik7
CisgICAgbV9jb29raWVCYWNraW5nU3RvcmUtPmdldENvb2tpZXNGcm9tRGF0YWJhc2UoY29va2ll
c1RvRGVsZXRlLCBhbW91bnRUb0RlbGV0ZSk7CisKKyAgICAvLyBDb29raWVzIGFyZSBvcmRlcmVk
IGluIEFTQyBvcmRlciBieSBsYXN0QWNjZXNzZWQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGFtb3VudFRvRGVsZXRlOyArK2kpIHsKKyAgICAgICAgLy8gRXhwaXJlIHRoZW0gYW5kIGNhbGwg
Y2hlY2thbmR0cmVhdCB0byBkZWxldGUgdGhlbSBmcm9tIG1lbW9yeSBhbmQgZGF0YWJhc2UKKyAg
ICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBjb29raWVzVG9EZWxldGVbaV07CisgICAg
ICAgIENvb2tpZUxpbWl0TG9nKCJDb29raWVNYW5hZ2VyIC0gRXhwaXJlIGNvb2tpZTogJXMgYW5k
IGRlbGV0ZSIsIG5ld0Nvb2tpZS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAg
bmV3Q29va2llLT5mb3JjZUV4cGlyZSgpOworICAgICAgICBjaGVja0FuZFRyZWF0Q29va2llKG5l
d0Nvb2tpZSwgUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSk7CisgICAgfQorCisgICAgQ29va2llTGlt
aXRMb2coIkNvb2tpZU1hbmFnZXIgLSBDb29raWUgY2xlYW4gdXAgY29tcGxldGUuIik7Cit9CisK
K3ZvaWQgQ29va2llTWFuYWdlcjo6Zmx1c2hDb29raWVzVG9CYWNraW5nU3RvcmUoKQoreworICAg
IENvb2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlIHN0
YXJ0aW5nLlxuIik7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBzaHV0ZG93biwgc28gd2Ug
bmVlZCB0byBiZSBzdXJlIHRoZSBPUyBkb2Vzbid0IGtpbGwgdXMgYmVmb3JlIHRoZSBkYiB3cml0
ZSBmaW5pc2hlcy4KKyAgICAvLyBPbmNlIHNob3VsZCBiZSBlbm91Z2ggc2luY2UgdGhpcyBleHRl
bmRzIHRlcmltaW5hdGlvbiBieSAyIHNlY29uZHMuCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
Ok5hdmlnYXRvckhhbmRsZXI6OnNlbmRFeHRlbmRUZXJtaW5hdGUoKTsKKyAgICBtX2Nvb2tpZUJh
Y2tpbmdTdG9yZS0+c2VuZENoYW5nZXNUb0RhdGFiYXNlU3luY2hyb25vdXNseSgpOworICAgIENv
b2tpZUxvZygiQ29va2llTWFuYWdlciAtIGZsdXNoQ29va2llc1RvQmFja2luZ1N0b3JlIGZpbmlz
aGVkLlxuIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9Db29raWVNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjk3
YjlmOTYyZGM5NWQ1NjMyYTM4OGNkMzkxMjc1MjM0NTZkOTVmYQotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvQ29va2llTWFuYWdlci5oCkBAIC0w
LDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEp1bGllbiBDaGFm
ZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEw
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZpbmUgQ29va2llTWFuYWdlcl9oCisKKyNpbmNsdWRl
ICJDb29raWVNYXAuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1l
c3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTsKK2NsYXNzIEtVUkw7CisKK2VudW0gQmFj
a2luZ1N0b3JlUmVtb3ZhbFBvbGljeSB7CisgICAgUmVtb3ZlRnJvbUJhY2tpbmdTdG9yZSwKKyAg
ICBCYWNraW5nU3RvcmVDb29raWVFbnRyeSwKKyAgICBEb05vdFJlbW92ZUZyb21CYWNraW5nU3Rv
cmUKK307CisKK2VudW0gQ29va2llRmlsdGVyIHsKKyAgICBOb0h0dHBPbmx5Q29va2llLAorICAg
IFdpdGhIdHRwT25seUNvb2tpZXMsCit9OworCitlbnVtIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xp
Y3kgeworICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lBbHdheXMsCisgICAgQ29va2llU3Rv
cmFnZUFjY2VwdFBvbGljeU5ldmVyLAorICAgIENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lPbmx5
RnJvbU1haW5Eb2N1bWVudERvbWFpbgorfTsKKworLyoKKyAgKiBUaGUgQ29va2llTWFuYWdlciBj
bGFzcyBpcyBhIHNpbmdsZXRvbiBjbGFzcyB0aGF0IGhhbmRsZXMgYW5kIHNlbGVjdGl2ZWx5IHBl
cnNpc3RzCisgICogaW5jb21pbmcgY29va2llcy4gVGhpcyBjbGFzcyBjb250YWlucyBhIHRyZWUg
b2YgZG9tYWlucyBmb3IgcXVpY2tlcgorICAqIGNvb2tpZSBkb21haW4gbG9va3VwLiBUaGUgdG9w
IG9mIHRoZSB0cmVlIHJlcHJlc2VudHMgYSBudWxsIHZhbHVlIGZvciBhIG51bGwgZG9tYWluLgor
ICAqIFRoZSBudWxsIGRvbWFpbiBjb250YWlucyByZWZlcmVuY2VzIHRvIHRvcCBsZXZlbCBkb21h
aW5zIGFuZCBlYWNoIG5vZGUgYmVsb3cKKyAgKiByZXByZXNlbnRzIGEgc3ViLXNlY3Rpb24gb2Yg
YSBkb21haW4sIGRlbGltaXRlZCBieSAiLiIKKyAgKgorICAqIElmIGEgY29va2llIGhhcyBhIGRv
bWFpbiAiYS5iLmNvbSIsIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBub2RlIG5hbWVkICJhIiBp
biB0aGlzIHRyZWUuCisgICogaW4gdGhlIGJyYW5jaCAiIi0+ImNvbSItPiJiIi0+ImEiCisgICoK
KyAgKiBDb29raWUgc3BlY3MgZm9sbG93IHRoZSBSRkMgNjI2NSBzcGVjIHNoZWV0LgorICAqIGh0
dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUKKyAgKi8KKworY2xhc3MgQ29va2llTWFu
YWdlcjogcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2Ugewor
cHVibGljOgorICAgIGJvb2wgY2FuTG9jYWxBY2Nlc3NBbGxDb29raWVzKCkgY29uc3QgeyByZXR1
cm4gbV9zaG91bGREdW1wQWxsQ29va2llczsgfQorICAgIHZvaWQgc2V0Q2FuTG9jYWxBY2Nlc3NB
bGxDb29raWVzKGJvb2wgZW5hYmxlZCkgeyBtX3Nob3VsZER1bXBBbGxDb29raWVzID0gZW5hYmxl
ZDsgfQorCisgICAgdm9pZCBzZXRDb29raWVzKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHZh
bHVlKTsKKworICAgIHZvaWQgcmVtb3ZlQWxsQ29va2llcyhCYWNraW5nU3RvcmVSZW1vdmFsUG9s
aWN5KTsKKyAgICB2b2lkIHJlbW92ZUNvb2tpZVdpdGhOYW1lKGNvbnN0IEtVUkwmLCBjb25zdCBT
dHJpbmcmIGNvb2tpZU5hbWUpOworCisgICAgdW5zaWduZWQgc2hvcnQgY29va2llc0NvdW50KCkg
Y29uc3QgeyByZXR1cm4gbV9jb3VudDsgfQorCisgICAgdm9pZCBzZXRDb29raWVKYXIoY29uc3Qg
Y2hhciopOworICAgIGNvbnN0IFN0cmluZyYgY29va2llSmFyKCkgY29uc3QgeyByZXR1cm4gbV9j
b29raWVKYXJGaWxlTmFtZTsgfQorCisgICAgLy8gQ291bnQgdXBkYXRlIG1ldGhvZAorICAgIHZv
aWQgcmVtb3ZlZENvb2tpZSgpCisgICAgeworICAgICAgICBBU1NFUlQobV9jb3VudCA+IDApOwor
ICAgICAgICAtLW1fY291bnQ7CisgICAgfQorICAgIHZvaWQgYWRkZWRDb29raWUoKSB7ICsrbV9j
b3VudDsgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIG1heENvb2tpZUxlbmd0aCgpIHsgcmV0dXJu
IHNfbWF4Q29va2llTGVuZ3RoOyB9CisKKyAgICB2b2lkIHNldENvb2tpZVBvbGljeShDb29raWVT
dG9yYWdlQWNjZXB0UG9saWN5IHBvbGljeSkgeyBtX3BvbGljeSA9IHBvbGljeTsgfQorICAgIENv
b2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3kgY29va2llUG9saWN5KCkgY29uc3QgeyByZXR1cm4gbV9w
b2xpY3k7IH0KKyAgICB2b2lkIHNldFByaXZhdGVNb2RlKGNvbnN0IGJvb2wpOworCisgICAgU3Ry
aW5nIGdldENvb2tpZShjb25zdCBLVVJMJiByZXF1ZXN0VVJMLCBDb29raWVGaWx0ZXIpIGNvbnN0
OworCisgICAgLy8gUmV0dXJucyBhbGwgY29va2llcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGgg
dGhlIHNwZWNpZmllZCBVUkwgYXMgcmF3IGNvb2tpZXMuCisgICAgdm9pZCBnZXRSYXdDb29raWVz
KFZlY3RvcjxQYXJzZWRDb29raWUqPiYgc3RhY2tPZkNvb2tpZXMsIGNvbnN0IEtVUkwmIHJlcXVl
c3RVUkwsIENvb2tpZUZpbHRlciA9IFdpdGhIdHRwT25seUNvb2tpZXMpIGNvbnN0OworCisgICAg
dm9pZCBmbHVzaENvb2tpZXNUb0JhY2tpbmdTdG9yZSgpOworCitwcml2YXRlOgorICAgIGZyaWVu
ZCBDb29raWVNYW5hZ2VyJiBjb29raWVNYW5hZ2VyKCk7CisKKyAgICBDb29raWVNYW5hZ2VyKCk7
CisgICAgfkNvb2tpZU1hbmFnZXIoKTsKKworICAgIHZvaWQgY2hlY2tBbmRUcmVhdENvb2tpZShQ
YXJzZWRDb29raWUqLCBCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5KTsKKworICAgIGJvb2wgc2hv
dWxkUmVqZWN0Rm9yU2VjdXJpdHlSZWFzb24oY29uc3QgUGFyc2VkQ29va2llKiwgY29uc3QgS1VS
TCYpOworCisgICAgdm9pZCBhZGRDb29raWVUb01hcChDb29raWVNYXAqLCBQYXJzZWRDb29raWUq
LCBCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5KTsKKyAgICB2b2lkIHVwZGF0ZShDb29raWVNYXAq
LCBQYXJzZWRDb29raWUqLCBCYWNraW5nU3RvcmVSZW1vdmFsUG9saWN5KTsKKworICAgIENvb2tp
ZU1hcCogZmluZE9yQ3JlYXRlQ29va2llTWFwKENvb2tpZU1hcCogcHJvdG9jb2xNYXAsIGNvbnN0
IFN0cmluZyYgZG9tYWluLCBib29sIGZpbmRPbmx5KTsKKworICAgIHZvaWQgaW5pdGlhdGVDb29r
aWVMaW1pdENsZWFuVXAoKTsKKyAgICB2b2lkIGNvb2tpZUxpbWl0Q2xlYW5VcChUaW1lcjxDb29r
aWVNYW5hZ2VyPiopOworCisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+IG1fbWFuYWdl
ck1hcDsKKworICAgIHVuc2lnbmVkIHNob3J0IG1fY291bnQ7CisKKyAgICBib29sIG1fcHJpdmF0
ZU1vZGU7CisgICAgYm9vbCBtX3Nob3VsZER1bXBBbGxDb29raWVzOworCisgICAgU3RyaW5nIG1f
Y29va2llSmFyRmlsZU5hbWU7CisKKyAgICAvLyBGSVhNRTogVGhpcyBtZXRob2Qgc2hvdWxkIGJl
IHJlbW92ZWQuCisgICAgdm9pZCBnZXRCYWNraW5nU3RvcmVDb29raWVzKCk7CisKKyAgICAvLyBD
b29raWUgc2l6ZSBsaW1pdCBvZiA0a0IgYXMgYWR2aXNlZCBwZXIgUkZDMjEwOQorICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBzX21heENvb2tpZUxlbmd0aCA9IDQwOTY7CisKKyAgICBDb29raWVT
dG9yYWdlQWNjZXB0UG9saWN5IG1fcG9saWN5OworCisgICAgQ29va2llRGF0YWJhc2VCYWNraW5n
U3RvcmUqIG1fY29va2llQmFja2luZ1N0b3JlOworICAgIFRpbWVyPENvb2tpZU1hbmFnZXI+IG1f
bGltaXRUaW1lcjsKKworfTsKKworLy8gR2V0IHRoZSBnbG9iYWwgaW5zdGFuY2UuCitDb29raWVN
YW5hZ2VyJiBjb29raWVNYW5hZ2VyKCk7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIENvb2tpZU1hbmFnZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9Db29raWVNYXAuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxh
Y2tiZXJyeS9Db29raWVNYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRjNmQ1NDFhZGRlZmQwYWEyMjIyYjFj
NjBlMmQ2N2Q4MWEyZTIxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZU1hcC5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFp
eEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjZGVmaW5lIEVOQUJMRV9DT09LSUVfREVC
VUcgMAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llTWFwLmgiCisKKyNp
bmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUg
IlBhcnNlZENvb2tpZS5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworI2lmIEVO
QUJMRV9DT09LSUVfREVCVUcKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cuaD4KKyNk
ZWZpbmUgQ29va2llTG9nKGZvcm1hdCwgLi4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3
YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sIGZvcm1hdCwgIyMgX19WQV9B
UkdTX18pCisjZWxzZQorI2RlZmluZSBDb29raWVMb2coZm9ybWF0LCAuLi4pCisjZW5kaWYgLy8g
RU5BQkxFX0NPT0tJRV9ERUJVRworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0Nvb2tpZU1hcDo6
Q29va2llTWFwKGNvbnN0IFN0cmluZyYgbmFtZSkKKyAgICA6IG1fb2xkZXN0Q29va2llKDApCisg
ICAgLCBtX25hbWUobmFtZSkKK3sKK30KKworQ29va2llTWFwOjp+Q29va2llTWFwKCkKK3sKKyAg
ICBkZWxldGVBbGxDb29raWVzQW5kRG9tYWlucygpOworfQorCitib29sIENvb2tpZU1hcDo6ZXhp
c3RzQ29va2llKGNvbnN0IFBhcnNlZENvb2tpZSogY29va2llKSBjb25zdAoreworICAgIFN0cmlu
ZyBrZXkgPSBjb29raWUtPm5hbWUoKSArIGNvb2tpZS0+cGF0aCgpOworICAgIHJldHVybiBtX2Nv
b2tpZU1hcC5jb250YWlucyhrZXkpOworfQorCit2b2lkIENvb2tpZU1hcDo6YWRkQ29va2llKFBh
cnNlZENvb2tpZSogY29va2llKQoreworICAgIFN0cmluZyBrZXkgPSBjb29raWUtPm5hbWUoKSAr
IGNvb2tpZS0+cGF0aCgpOworCisgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSBBdHRlbXB0aW5n
IHRvIGFkZCBjb29raWUgLSAlcyIsIGNvb2tpZS0+bmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworCisg
ICAgQVNTRVJUKCFtX2Nvb2tpZU1hcC5jb250YWlucyhrZXkpKTsKKyAgICBtX2Nvb2tpZU1hcC5h
ZGQoa2V5LCBjb29raWUpOworICAgIGlmICghY29va2llLT5pc1Nlc3Npb24oKSkKKyAgICAgICAg
Y29va2llTWFuYWdlcigpLmFkZGVkQ29va2llKCk7CisgICAgaWYgKCFtX29sZGVzdENvb2tpZSB8
fCBtX29sZGVzdENvb2tpZS0+bGFzdEFjY2Vzc2VkKCkgPiBjb29raWUtPmxhc3RBY2Nlc3NlZCgp
KQorICAgICAgICBtX29sZGVzdENvb2tpZSA9IGNvb2tpZTsKK30KKworUGFyc2VkQ29va2llKiBD
b29raWVNYXA6OnVwZGF0ZUNvb2tpZShQYXJzZWRDb29raWUqIG5ld0Nvb2tpZSkKK3sKKyAgICBT
dHJpbmcga2V5ID0gbmV3Q29va2llLT5uYW1lKCkgKyBuZXdDb29raWUtPnBhdGgoKTsKKyAgICBQ
YXJzZWRDb29raWUqIG9sZENvb2tpZSA9IG1fY29va2llTWFwLnRha2Uoa2V5KTsKKyAgICBBU1NF
UlQob2xkQ29va2llKTsKKyAgICBtX2Nvb2tpZU1hcC5hZGQoa2V5LCBuZXdDb29raWUpOworICAg
IGlmIChvbGRDb29raWUgPT0gbV9vbGRlc3RDb29raWUpCisgICAgICAgIHVwZGF0ZU9sZGVzdENv
b2tpZSgpOworICAgIHJldHVybiBvbGRDb29raWU7Cit9CisKK1BhcnNlZENvb2tpZSogQ29va2ll
TWFwOjpyZW1vdmVDb29raWUoY29uc3QgUGFyc2VkQ29va2llKiBjb29raWUpCit7CisgICAgLy8g
RmluZCBhIHByZXZpb3VzIGVudHJ5IGZvciBkZWxldGlvbgorICAgIFN0cmluZyBrZXkgPSBjb29r
aWUtPm5hbWUoKSArIGNvb2tpZS0+cGF0aCgpOworICAgIFBhcnNlZENvb2tpZSogcHJldkNvb2tp
ZSA9IG1fY29va2llTWFwLnRha2Uoa2V5KTsKKworICAgIGlmICghcHJldkNvb2tpZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBpZiAocHJldkNvb2tpZSA9PSBtX29sZGVzdENvb2tpZSkKKyAg
ICAgICAgdXBkYXRlT2xkZXN0Q29va2llKCk7CisgICAgZWxzZSBpZiAocHJldkNvb2tpZSAhPSBj
b29raWUpIHsKKyAgICAgICAgLy8gVGhlIGNvb2tpZSB3ZSB1c2VkIHRvIHNlYXJjaCBpcyBmb3Jj
ZSBleHBpcmVkLCB3ZSBtdXN0IGRvIHRoZSBzYW1lCisgICAgICAgIC8vIHRvIHRoZSBjb29raWUg
aW4gbWVtb3J5IHRvby4KKyAgICAgICAgaWYgKGNvb2tpZS0+aXNGb3JjZUV4cGlyZWQoKSkKKyAg
ICAgICAgICAgIHByZXZDb29raWUtPmZvcmNlRXhwaXJlKCk7CisgICAgICAgIGRlbGV0ZSBjb29r
aWU7CisgICAgfQorCisgICAgaWYgKCFwcmV2Q29va2llLT5pc1Nlc3Npb24oKSkKKyAgICAgICAg
Y29va2llTWFuYWdlcigpLnJlbW92ZWRDb29raWUoKTsKKyAgICByZXR1cm4gcHJldkNvb2tpZTsK
K30KKworQ29va2llTWFwKiBDb29raWVNYXA6OmdldFN1YmRvbWFpbk1hcChjb25zdCBTdHJpbmcm
IHN1YmRvbWFpbikKK3sKKyNpZiBFTkFCTEVfQ09PS0lFX0RFQlVHCisgICAgaWYgKCFtX3N1YmRv
bWFpbnMuY29udGFpbnMoc3ViZG9tYWluKSkKKyAgICAgICAgQ29va2llTG9nKCJDb29raWVNYXAg
LSAlcyBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIG1hcCIsIHN1YmRvbWFpbi51dGY4KCkuZGF0YSgp
KTsKKyNlbmRpZgorICAgIHJldHVybiBtX3N1YmRvbWFpbnMuZ2V0KHN1YmRvbWFpbik7Cit9CisK
K3ZvaWQgQ29va2llTWFwOjphZGRTdWJkb21haW5NYXAoY29uc3QgU3RyaW5nJiBzdWJkb21haW4s
IENvb2tpZU1hcCogbmV3RG9tYWluKQoreworICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gQXR0
ZW1wdGluZyB0byBhZGQgc3ViZG9tYWluIC0gJXMiLCBzdWJkb21haW4udXRmOCgpLmRhdGEoKSk7
CisgICAgbV9zdWJkb21haW5zLmFkZChzdWJkb21haW4sIG5ld0RvbWFpbik7Cit9CisKK3ZvaWQg
Q29va2llTWFwOjpnZXRBbGxDb29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiogc3RhY2tPZkNv
b2tpZXMpCit7CisgICAgQ29va2llTG9nKCJDb29raWVNYXAgLSBBdHRlbXB0aW5nIHRvIGNvcHkg
TWFwOiVzIGNvb2tpZXMgd2l0aCAlZCBjb29raWVzIGludG8gdmVjdG9ycyIsIG1fbmFtZS51dGY4
KCkuZGF0YSgpLCBtX2Nvb2tpZU1hcC5zaXplKCkpOworCisgICAgVmVjdG9yPFBhcnNlZENvb2tp
ZSo+IG5ld0Nvb2tpZXM7CisgICAgY29weVZhbHVlc1RvVmVjdG9yKG1fY29va2llTWFwLCBuZXdD
b29raWVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0Nvb2tpZXMuc2l6ZSgpOyBp
KyspIHsKKyAgICAgICAgUGFyc2VkQ29va2llKiBuZXdDb29raWUgPSBuZXdDb29raWVzW2ldOwor
ICAgICAgICBpZiAobmV3Q29va2llLT5oYXNFeHBpcmVkKCkpIHsKKyAgICAgICAgICAgIC8vIE5v
dGljZSB0aGF0IHdlIGRvbid0IGRlbGV0ZSBmcm9tIGJhY2tpbmdzdG9yZS4gVGhlc2UgZXhwaXJl
ZCBjb29raWVzIHdpbGwgYmUKKyAgICAgICAgICAgIC8vIGRlbGV0ZWQgd2hlbiBtYW5hZ2VyIGxv
YWRzIHRoZSBiYWNraW5nc3RvcmUgYWdhaW4uCisgICAgICAgICAgICBQYXJzZWRDb29raWUqIGV4
cGlyZWQgPSByZW1vdmVDb29raWUobmV3Q29va2llKTsKKyAgICAgICAgICAgIGRlbGV0ZSBleHBp
cmVkOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHN0YWNrT2ZDb29raWVzLT5hcHBlbmQo
bmV3Q29va2llKTsKKyAgICB9CisKKyAgICBDb29raWVMb2coIkNvb2tpZU1hcCAtIHN0YWNrIG9m
IGNvb2tpZXMgbm93IGhhdmUgJWQgY29va2llcyBpbiBpdCIsICgqc3RhY2tPZkNvb2tpZXMpLnNp
emUoKSk7Cit9CisKK1BhcnNlZENvb2tpZSogQ29va2llTWFwOjpyZW1vdmVPbGRlc3RDb29raWUo
KQoreworICAgIC8vIEZJWE1FOiBNYWtlIHN1cmUgaXQgZmluZHMgdGhlIEdMT0JBTCBvbGRlc3Qg
Y29va2llLCBub3QgdGhlIGZpcnN0IG9sZGVzdGNvb2tpZSBpdCBmaW5kcy4KKyAgICBQYXJzZWRD
b29raWUqIG9sZGVzdENvb2tpZSA9IG1fb2xkZXN0Q29va2llOworCisgICAgLy8gSWYgdGhpcyBt
YXAgaGFzIGFuIG9sZGVzdENvb2tpZSwgcmVtb3ZlIGl0LiBJZiBub3QsIGRvIGEgREZTIHRvIHNl
YXJjaCBmb3IgYSBjaGlsZCB0aGF0IGRvZXMKKyAgICBpZiAoIW9sZGVzdENvb2tpZSkgeworCisg
ICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gbm8gb2xkZXN0Q29va2llIGV4aXN0Iik7CisK
KyAgICAgICAgLy8gQmFzZSBjYXNlIGlzIGlmIHRoZSBtYXAgaGFzIG5vIGNoaWxkIGFuZCBubyBj
b29raWVzLCB3ZSByZXR1cm4gYSBudWxsLgorICAgICAgICBpZiAoIW1fc3ViZG9tYWlucy5zaXpl
KCkpIHsKKyAgICAgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gbm8gc3ViZG9tYWlucywg
YmFzZSBjYXNlIHJlYWNoZWQsIHJldHVybiAwIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgfQorCisgICAgICAgIENvb2tpZUxvZygiQ29va2llTWFwIC0gbG9va2luZyBpbnRvIHN1
YmRvbWFpbnMiKTsKKworICAgICAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6
aXRlcmF0b3IgaXQgPSBtX3N1YmRvbWFpbnMuYmVnaW4oKTsgaXQgIT0gbV9zdWJkb21haW5zLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgICAgICBvbGRlc3RDb29raWUgPSBpdC0+c2Vjb25kLT5yZW1v
dmVPbGRlc3RDb29raWUoKTsKKyAgICAgICAgICAgIGlmIChvbGRlc3RDb29raWUpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDb29raWVM
b2coIkNvb2tpZU1hcCAtIG9sZGVzdENvb2tpZSBleGlzdC4iKTsKKyAgICAgICAgb2xkZXN0Q29v
a2llID0gcmVtb3ZlQ29va2llKG1fb2xkZXN0Q29va2llKTsKKyAgICB9CisKKyAgICByZXR1cm4g
b2xkZXN0Q29va2llOworfQorCit2b2lkIENvb2tpZU1hcDo6dXBkYXRlT2xkZXN0Q29va2llKCkK
K3sKKyAgICBpZiAoIW1fY29va2llTWFwLnNpemUoKSkKKyAgICAgICAgbV9vbGRlc3RDb29raWUg
PSAwOworICAgIGVsc2UgeworICAgICAgICBIYXNoTWFwPFN0cmluZywgUGFyc2VkQ29va2llKj46
Oml0ZXJhdG9yIGl0ID0gbV9jb29raWVNYXAuYmVnaW4oKTsKKyAgICAgICAgbV9vbGRlc3RDb29r
aWUgPSBpdC0+c2Vjb25kOworICAgICAgICArK2l0OworICAgICAgICBmb3IgKDsgaXQgIT0gbV9j
b29raWVNYXAuZW5kKCk7ICsraXQpCisgICAgICAgICAgICBpZiAobV9vbGRlc3RDb29raWUtPmxh
c3RBY2Nlc3NlZCgpID4gaXQtPnNlY29uZC0+bGFzdEFjY2Vzc2VkKCkpCisgICAgICAgICAgICAg
ICAgbV9vbGRlc3RDb29raWUgPSBpdC0+c2Vjb25kOworICAgIH0KK30KKwordm9pZCBDb29raWVN
YXA6OmRlbGV0ZUFsbENvb2tpZXNBbmREb21haW5zKCkKK3sKKyAgICBkZWxldGVBbGxWYWx1ZXMo
bV9zdWJkb21haW5zKTsKKyAgICBtX3N1YmRvbWFpbnMuY2xlYXIoKTsKKyAgICBkZWxldGVBbGxW
YWx1ZXMobV9jb29raWVNYXApOworICAgIG1fY29va2llTWFwLmNsZWFyKCk7CisKKyAgICBtX29s
ZGVzdENvb2tpZSA9IDA7Cit9CisKK3ZvaWQgQ29va2llTWFwOjpnZXRBbGxDaGlsZENvb2tpZXMo
VmVjdG9yPFBhcnNlZENvb2tpZSo+KiBzdGFja09mQ29va2llcykKK3sKKyAgICBDb29raWVMb2co
IkNvb2tpZU1hcCAtIGdldEFsbENoaWxkQ29va2llcyBpbiBNYXAgLSAlcyIsIGdldE5hbWUoKS51
dGY4KCkuZGF0YSgpKTsKKyAgICBnZXRBbGxDb29raWVzKHN0YWNrT2ZDb29raWVzKTsKKyAgICBm
b3IgKEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQgPSBtX3N1YmRvbWFp
bnMuYmVnaW4oKTsgaXQgIT0gbV9zdWJkb21haW5zLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+
c2Vjb25kLT5nZXRBbGxDaGlsZENvb2tpZXMoc3RhY2tPZkNvb2tpZXMpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFj
a2JlcnJ5L0Nvb2tpZU1hcC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9D
b29raWVNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43M2JhMTNmYWNjMTRhNTE1MmVhMTM5ODg4ZTQ0NDNhOGVh
MWQ3ZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9Db29raWVNYXAuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBK
dWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpZm5kZWYgQ29va2llTWFwX2gKKyNkZWZpbmUgQ29va2llTWFwX2gKKworI2luY2x1
ZGUgIkhhc2hNYXAuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlZl
Y3Rvci5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBQYXJzZWRDb29raWU7CisKKy8qIEEgY29va2llIG1hcCBpcyBhIG5v
ZGUgaW4gdGhlIHRyZWUgaGVsZCBieSBDb29raWVNYW5hZ2VyIHRoYXQgcmVwcmVzZW50cworICog
Y29va2llcyB0aGF0IG1hdGNoZXMgYSBjb21tb24gZG9tYWluLgorICoKKyAqIEEgQ29va2llTWFw
IGhvbGRzIHJlZmVyZW5jZSB0byB0aGUgY29va2llcyB0aGF0IGl0IGNvbnRhaW5zIGFuZCB0aGUg
Y2hpbGQKKyAqIGRvbWFpbnMgdGhhdCBleGlzdCB3aXRoaW4gdGhlIHRyZWUuCisgKgorICogVGhl
IG51bWJlciBvZiBjb29raWUgcGVyIGhvc3QgaXMgbGltaXRlZCBieSBDb29raWVNYW5hZ2VyOjpz
X21heENvb2tpZUNvdW50UGVySG9zdAorICovCisKK2NsYXNzIENvb2tpZU1hcCB7CisKK3B1Ymxp
YzoKKyAgICBDb29raWVNYXAoY29uc3QgU3RyaW5nJiBuYW1lID0gIiIpOworICAgIH5Db29raWVN
YXAoKTsKKworICAgIHVuc2lnbmVkIGludCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29va2ll
TWFwLnNpemUoKTsgfQorICAgIGNvbnN0IFN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJu
IG1fbmFtZTsgfQorCisgICAgdm9pZCBhZGRDb29raWUoUGFyc2VkQ29va2llKik7CisKKyAgICAv
LyBSZXR1cm5pbmcgdGhlIG9yaWdpbmFsIGNvb2tpZSBvYmplY3Qgc28gbWFuYWdlciBjYW4ga2Vl
cCBhIHJlZmVyZW5jZSB0byB0aGUgdXBkYXRlcyBpbiB0aGUgZGF0YWJhc2UgcXVldWUuCisgICAg
UGFyc2VkQ29va2llKiB1cGRhdGVDb29raWUoUGFyc2VkQ29va2llKik7CisKKyAgICAvLyBOZWVk
IHRvIHJldHVybiB0aGUgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGNvb2tpZSBzbyBtYW5hZ2Vy
IGNhbiBkZWFsIHdpdGggaXQgKGdhcmJhZ2UgY29sbGVjdCkuCisgICAgUGFyc2VkQ29va2llKiBy
ZW1vdmVDb29raWUoY29uc3QgUGFyc2VkQ29va2llKik7CisgICAgYm9vbCBleGlzdHNDb29raWUo
Y29uc3QgUGFyc2VkQ29va2llKikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIGEgbWFwIHdpdGgg
dGhhdCBnaXZlbiBzdWJkb21haW4uCisgICAgQ29va2llTWFwKiBnZXRTdWJkb21haW5NYXAoY29u
c3QgU3RyaW5nJik7CisgICAgdm9pZCBhZGRTdWJkb21haW5NYXAoY29uc3QgU3RyaW5nJiwgQ29v
a2llTWFwKik7CisgICAgdm9pZCBkZWxldGVBbGxDb29raWVzQW5kRG9tYWlucygpOworCisgICAg
dm9pZCBnZXRBbGxDb29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiopOworICAgIHZvaWQgZ2V0
QWxsQ2hpbGRDb29raWVzKFZlY3RvcjxQYXJzZWRDb29raWUqPiogc3RhY2tPZkNvb2tpZXMpOwor
ICAgIFBhcnNlZENvb2tpZSogcmVtb3ZlT2xkZXN0Q29va2llKCk7CisKK3ByaXZhdGU6CisgICAg
dm9pZCB1cGRhdGVPbGRlc3RDb29raWUoKTsKKworICAgIC8vIFRoZSBrZXkgaXMgdGhlIHR1cGxl
IChuYW1lLCBwYXRoKS4KKyAgICAvLyBUaGUgc3BlYyBhc2tzIHRvIGhhdmUgYWxzbyBkb21haW4s
IHdoaWNoIGlzIGltcGxpZWQgYnkgY2hvb3NpbmcgdGhlIENvb2tpZU1hcCByZWxldmFudCB0byB0
aGUgZG9tYWluLgorICAgIEhhc2hNYXA8U3RyaW5nLCBQYXJzZWRDb29raWUqPiBtX2Nvb2tpZU1h
cDsKKworICAgIC8vIFRoZSBrZXkgaXMgYSBzdWJzZWN0aW9uIG9mIHRoZSBkb21haW4uCisgICAg
Ly8gZXg6IGlmIGluc2VydGluZyBhY2NvdW50cy5nb29nbGUuY29tICYgdGhpcyBjb29raWVtYXAg
aXMgImNvbSIsIHRoaXMgc3ViZG9tYWluIG1hcCB3aWxsIGNvbnRhaW4gImdvb2dsZSIKKyAgICAv
LyB0aGUgImdvb2dsZSIgY29va2llbWFwIHdpbGwgY29udGFpbiAiYWNjb3VudHMiIGluIGl0cyBz
dWJkb21haW4gbWFwLgorICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPiBtX3N1YmRvbWFp
bnM7CisKKyAgICAvLyBTdG9yZSB0aGUgb2xkZXN0IGNvb2tpZSB0byBzcGVlZCB1cCBMUlUgY2hl
Y2tzLgorICAgIFBhcnNlZENvb2tpZSogbV9vbGRlc3RDb29raWU7CisgICAgY29uc3QgU3RyaW5n
IG1fbmFtZTsKKworICAgIC8vIEZJWE1FIDogc2hvdWxkIGhhdmUgYSBtX3Nob3VsZFVwZGF0ZSBm
bGFnIHRvIHVwZGF0ZSB0aGUgbmV0d29yayBsYXllciBvbmx5IHdoZW4gdGhlIG1hcCBoYXMgY2hh
bmdlZC4KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIENvb2tpZU1h
cF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tp
ZVBhcnNlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZVBh
cnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZTFlYjQ0YWE0MTJiZDA3NWI5ZTNmYjIyZDEyMmI0YzlkZGFm
NWUxOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVy
cnkvQ29va2llUGFyc2VyLmNwcApAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSBKdWxpZW4gQ2hhZmZyYWl4IDxqY2hhZmZyYWl4QHBsZXlvLmNvbT4KKyAqIENvcHly
aWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovIAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llUGFy
c2VyLmgiCisKKyNpbmNsdWRlICJDdXJyZW50VGltZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIK
KyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2RlZmluZSBMT0dfQU5EX0RFTEVURShmb3JtYXQs
IC4uLikgXAorICAgIHsgXAorICAgICAgICBMT0dfRVJST1IoZm9ybWF0LCAjIyBfX1ZBX0FSR1Nf
Xyk7IFwKKyAgICAgICAgZGVsZXRlIHJlczsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0K
Kworc3RhdGljIGlubGluZSBib29sIGlzQ29va2llSGVhZGVyU2VwYXJhdG9yKFVDaGFyIGMpCit7
CisgICAgcmV0dXJuIChjID09ICdccicgfHwgYyA9PSdcbicpOworfQorCitzdGF0aWMgaW5saW5l
IGJvb2wgaXNMaWdodHdlaWdodFNwYWNlKFVDaGFyIGMpCit7CisgICAgcmV0dXJuIChjID09ICcg
JyB8fCBjID09ICdcdCcpOworfQorCitDb29raWVQYXJzZXI6OkNvb2tpZVBhcnNlcihjb25zdCBL
VVJMJiBkZWZhdWx0Q29va2llVVJMKQorICAgIDogbV9kZWZhdWx0Q29va2llVVJMKGRlZmF1bHRD
b29raWVVUkwpCit7Cit9CisKK0Nvb2tpZVBhcnNlcjo6fkNvb2tpZVBhcnNlcigpCit7Cit9CisK
K1ZlY3RvcjxQYXJzZWRDb29raWUqPiBDb29raWVQYXJzZXI6OnBhcnNlKGNvbnN0IFN0cmluZyYg
Y29va2llcykKK3sKKyAgICB1bnNpZ25lZCBjb29raWVTdGFydCwgY29va2llRW5kID0gMDsKKyAg
ICBkb3VibGUgY3VyVGltZSA9IGN1cnJlbnRUaW1lKCk7CisgICAgVmVjdG9yPFBhcnNlZENvb2tp
ZSosIDQ+IHBhcnNlZENvb2tpZXM7CisKKyAgICB1bnNpZ25lZCBjb29raWVzTGVuZ3RoID0gY29v
a2llcy5sZW5ndGgoKTsKKyAgICBpZiAoIWNvb2tpZXNMZW5ndGgpIC8vIENvZGUgYmVsb3cgZG9l
c24ndCBoYW5kbGUgdGhpcyBjYXNlCisgICAgICAgIHJldHVybiBwYXJzZWRDb29raWVzOworCisg
ICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBoZWFkZXIgdG8gcGFyc2UgYWxsIHRoZSBjb29raWVzLgor
ICAgIHdoaWxlIChjb29raWVFbmQgPD0gY29va2llc0xlbmd0aCkgeworICAgICAgICBjb29raWVT
dGFydCA9IGNvb2tpZUVuZDsKKyAgICAgICAgCisgICAgICAgIC8vIEZpbmQgYSBjb29raWUgc2Vw
YXJhdG9yLgorICAgICAgICB3aGlsZSAoY29va2llRW5kIDw9IGNvb2tpZXNMZW5ndGggJiYgIWlz
Q29va2llSGVhZGVyU2VwYXJhdG9yKGNvb2tpZXNbY29va2llRW5kXSkpCisgICAgICAgICAgICBj
b29raWVFbmQrKzsKKworICAgICAgICAvLyBEZXRlY3QgYW4gZW1wdHkgY29va2llIGFuZCBnbyB0
byB0aGUgbmV4dCBvbmUuCisgICAgICAgIGlmIChjb29raWVTdGFydCA9PSBjb29raWVFbmQpIHsK
KyAgICAgICAgICAgICsrY29va2llRW5kOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoY29va2llRW5kIDwgY29va2llc0xlbmd0aCAmJiBpc0Nvb2tpZUhl
YWRlclNlcGFyYXRvcihjb29raWVzW2Nvb2tpZUVuZF0pKQorICAgICAgICAgICAgKytjb29raWVF
bmQ7CisKKyAgICAgICAgUGFyc2VkQ29va2llKiBjb29raWUgPSBwYXJzZU9uZUNvb2tpZShjb29r
aWVzLCBjb29raWVTdGFydCwgY29va2llRW5kIC0gMSwgY3VyVGltZSk7CisgICAgICAgIGlmIChj
b29raWUpCisgICAgICAgICAgICBwYXJzZWRDb29raWVzLmFwcGVuZChjb29raWUpOworICAgIH0K
KyAgICByZXR1cm4gcGFyc2VkQ29va2llczsKK30KKworLy8gVGhlIGNvb2tpZSBTdHJpbmcgcGFz
c2VkIGludG8gdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGNvbnRpYW4gdGhlIG5hbWUgdmFsdWUgcGFp
cnMgYXMgd2VsbCBhcyBvdGhlciByZWxhdGVkIGNvb2tpZQorLy8gYXR0cmlidXRlcyBzdWNoIGFz
IG1heC1hZ2UgYW5kIGRvbWFpbi4gU2V0LUNvb2tpZSBzaG91bGQgbmV2ZXIgYmUgcGFydCBvZiB0
aGlzIHN0cmluZy4KK1BhcnNlZENvb2tpZSogQ29va2llUGFyc2VyOjpwYXJzZU9uZUNvb2tpZShj
b25zdCBTdHJpbmcmIGNvb2tpZSwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCwgZG91Ymxl
IGN1clRpbWUpCit7CisgICAgUGFyc2VkQ29va2llKiByZXMgPSBuZXcgUGFyc2VkQ29va2llKGN1
clRpbWUpOworCisgICAgaWYgKCFyZXMpCisgICAgICAgIExPR19BTkRfREVMRVRFKCJPdXQgb2Yg
bWVtb3J5Iik7CisKKyAgICByZXMtPnNldFByb3RvY29sKG1fZGVmYXVsdENvb2tpZVVSTC5wcm90
b2NvbCgpKTsKKworICAgIC8vIFBhcnNlIFtOQU1FICI9Il0gVkFMVUUKKyAgICB1bnNpZ25lZCB0
b2tlbkVuZCA9IHN0YXJ0OyAvLyBUb2tlbiBlbmQgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRo
ZSAnPScgb3IgdGhlIGVuZCBvZiBhIHRva2VuCisgICAgdW5zaWduZWQgcGFpckVuZCA9IHN0YXJ0
OyAvLyBQYWlyIGVuZCBjb250YWlucyBhbHdheXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnOycKKwor
ICAgIC8vIGZpbmQgdGhlICpmaXJzdCogJzsnIGFuZCB0aGUgJz0nIChpZiB0aGV5IGV4aXN0KQor
ICAgIGJvb2wgcXVvdGVGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgZm91bmRFcXVhbCA9IGZhbHNl
OworICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kICYmIChjb29raWVbcGFpckVuZF0gIT0gJzsnIHx8
IHF1b3RlRm91bmQpKSB7CisgICAgICAgIGlmICh0b2tlbkVuZCA9PSBzdGFydCAmJiBjb29raWVb
cGFpckVuZF0gPT0gJz0nKSB7CisgICAgICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAg
ICAgICAgICBmb3VuZEVxdWFsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2ll
W3BhaXJFbmRdID09ICciJykKKyAgICAgICAgICAgIHF1b3RlRm91bmQgPSAhcXVvdGVGb3VuZDsK
KyAgICAgICAgcGFpckVuZCsrOworICAgIH0KKworICAgIHVuc2lnbmVkIHRva2VuU3RhcnQgPSBz
dGFydDsKKworICAgIGJvb2wgaGFzTmFtZSA9IGZhbHNlOyAvLyBUaGlzIGlzIGEgaGFjayB0byBh
dm9pZCBjaGFuZ2luZyB0b28gbXVjaCBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIGJydXRhbGx5IGJyaXR0bGUgY29kZS4KKyAgICBpZiAodG9rZW5FbmQgIT0gc3RhcnQpIHsK
KyAgICAgICAgLy8gVGhlcmUgaXMgYSAnPScgc28gcGFyc2UgdGhlIE5BTUUKKyAgICAgICAgdW5z
aWduZWQgbmFtZUVuZCA9IHRva2VuRW5kOworCisgICAgICAgIC8vIFRoZSB0b2tlbkVuZCBpcyB0
aGUgcG9zaXRpb24gb2YgdGhlICc9JyBzbyB0aGUgbmFtZUVuZCBpcyBvbmUgbGVzcworICAgICAg
ICBuYW1lRW5kLS07CisKKyAgICAgICAgLy8gUmVtb3ZlIGxpZ2h0d2VpZ2h0IHNwYWNlcy4KKyAg
ICAgICAgd2hpbGUgKG5hbWVFbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVtuYW1lRW5k
XSkpCisgICAgICAgICAgICBuYW1lRW5kLS07CisKKyAgICAgICAgd2hpbGUgKHRva2VuU3RhcnQg
PCBuYW1lRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAg
ICAgICAgICAgdG9rZW5TdGFydCsrOworCisgICAgICAgIGlmIChuYW1lRW5kICsgMSA8PSB0b2tl
blN0YXJ0KQorICAgICAgICAgICAgTE9HX0FORF9ERUxFVEUoIkVtcHR5IG5hbWUuIFJlamVjdGlu
ZyB0aGUgY29va2llIik7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjb29raWUuc3Vic3RyaW5n
KHRva2VuU3RhcnQsIG5hbWVFbmQgKyAxIC0gc3RhcnQpOworICAgICAgICByZXMtPnNldE5hbWUo
bmFtZSk7CisgICAgICAgIGhhc05hbWUgPSB0cnVlOworICAgIH0KKworICAgIC8vIE5vdyBwYXJz
ZSB0aGUgVkFMVUUKKyAgICB0b2tlblN0YXJ0ID0gdG9rZW5FbmQgKyAxOworICAgIGlmICghaGFz
TmFtZSkKKyAgICAgICAgLS10b2tlblN0YXJ0OworCisgICAgLy8gU2tpcCBsaWdodHdlaWdodCBz
cGFjZXMgaW4gb3VyIHRva2VuCisgICAgd2hpbGUgKHRva2VuU3RhcnQgPCBwYWlyRW5kICYmIGlz
TGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAgICAgICB0b2tlblN0YXJ0
Kys7CisKKyAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgd2hpbGUgKHRva2VuRW5kID4gdG9r
ZW5TdGFydCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuRW5kIC0gMV0pKQorICAg
ICAgICB0b2tlbkVuZC0tOworCisgICAgU3RyaW5nIHZhbHVlOworICAgIGlmICh0b2tlbkVuZCA9
PSB0b2tlblN0YXJ0KSB7CisgICAgICAgIC8vIEZpcmVmb3ggYWNjZXB0cyBlbXB0eSB2YWx1ZSBz
byB3ZSB3aWxsIGRvIHRoZSBzYW1lCisgICAgICAgIHZhbHVlID0gU3RyaW5nKCk7CisgICAgfSBl
bHNlCisgICAgICAgIHZhbHVlID0gY29va2llLnN1YnN0cmluZyh0b2tlblN0YXJ0LCB0b2tlbkVu
ZCAtIHRva2VuU3RhcnQpOworCisgICAgaWYgKGhhc05hbWUpCisgICAgICAgIHJlcy0+c2V0VmFs
dWUodmFsdWUpOworICAgIGVsc2UgaWYgKGZvdW5kRXF1YWwpIHsKKyAgICAgICAgZGVsZXRlIHJl
czsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlCisgICAgICAgIHJlcy0+c2V0TmFtZSh2
YWx1ZSk7IC8vIE5vIE5BTUU9VkFMVUUsIG9ubHkgTkFNRQorCisgICAgd2hpbGUgKHBhaXJFbmQg
PCBlbmQpIHsKKyAgICAgICAgLy8gU3dpdGNoIHRvIHRoZSBuZXh0IHBhaXIgYXMgcGFpckVuZCBp
cyBvbiB0aGUgJzsnIGFuZCBmYXN0LWZvcndhcmQgYW55IGxpZ2h0d2VpZ2h0IHNwYWNlcy4KKyAg
ICAgICAgcGFpckVuZCsrOworICAgICAgICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiBpc0xpZ2h0
d2VpZ2h0U3BhY2UoY29va2llW3BhaXJFbmRdKSkKKyAgICAgICAgICAgIHBhaXJFbmQrKzsKKwor
ICAgICAgICB0b2tlblN0YXJ0ID0gcGFpckVuZDsKKyAgICAgICAgdG9rZW5FbmQgPSB0b2tlblN0
YXJ0OyAvLyBpbml0aWFsaXplIHRva2VuIGVuZCB0byBjYXRjaCBmaXJzdCAnPScKKworICAgICAg
ICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiBjb29raWVbcGFpckVuZF0gIT0gJzsnKSB7CisgICAg
ICAgICAgICBpZiAodG9rZW5FbmQgPT0gdG9rZW5TdGFydCAmJiBjb29raWVbcGFpckVuZF0gPT0g
Jz0nKQorICAgICAgICAgICAgICAgIHRva2VuRW5kID0gcGFpckVuZDsKKyAgICAgICAgICAgIHBh
aXJFbmQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FIDogc2hvdWxkIHdlIHNraXAg
bGlnaHR3ZWlnaHQgc3BhY2VzIGhlcmUgPworCisgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRv
a2VuRW5kIC0gdG9rZW5TdGFydDsKKyAgICAgICAgdW5zaWduZWQgdG9rZW5TdGFydFN2ZyA9IHRv
a2VuU3RhcnQ7CisKKyAgICAgICAgU3RyaW5nIHBhcnNlZFZhbHVlOworICAgICAgICBpZiAodG9r
ZW5TdGFydCAhPSB0b2tlbkVuZCkgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXF1YWwg
c2lnbiBzbyByZW1vdmUgbGlnaHR3ZWlnaHQgc3BhY2VzIGluIFZBTFVFCisgICAgICAgICAgICB0
b2tlblN0YXJ0ID0gdG9rZW5FbmQgKyAxOworICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RhcnQg
PCBwYWlyRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAg
ICAgICAgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgICAgICAgICAgdG9rZW5FbmQgPSBwYWly
RW5kOworICAgICAgICAgICAgd2hpbGUgKHRva2VuRW5kID4gdG9rZW5TdGFydCAmJiBpc0xpZ2h0
d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuRW5kIC0gMV0pKQorICAgICAgICAgICAgICAgIHRva2Vu
RW5kLS07CisKKyAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gY29va2llLnN1YnN0cmluZyh0b2tl
blN0YXJ0LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgLy8gSWYgdGhlIHBhcnNlZFZhbHVlIGlzIGVtcHR5LCBpbml0aWFsaXNlIGl0IGluIGNh
c2Ugd2UgbmVlZCBpdAorICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBTdHJpbmcoKTsKKyAgICAg
ICAgICAgIC8vIEhhbmRsZSBhIHRva2VuIHdpdGhvdXQgdmFsdWUuCisgICAgICAgICAgICBsZW5n
dGggPSBwYWlyRW5kIC0gdG9rZW5TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgLy8gRGV0ZWN0
IHdoaWNoICJjb29raWUtYXYiIGlzIHBhcnNlZAorICAgICAgIC8vIExvb2sgYXQgdGhlIGZpcnN0
IGNoYXIgdGhlbiBwYXJzZSB0aGUgd2hvbGUgZm9yIHBlcmZvcm1hbmNlIGlzc3VlCisgICAgICAg
IHN3aXRjaCAoY29va2llW3Rva2VuU3RhcnRTdmddKSB7CisgICAgICAgIGNhc2UgJ1AnOgorICAg
ICAgICBjYXNlICdwJyA6IHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNCAmJiBjb29raWUu
ZmluZCgiYXRoIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkgeworICAgICAgICAgICAgICAg
IC8vIFdlIG5lZWQgdGhlIHBhdGggdG8gYmUgZGVjb2RlZCB0byBtYXRjaCB0aG9zZSByZXR1cm5l
ZCBmcm9tIEtVUkw6OnBhdGgoKS4KKyAgICAgICAgICAgICAgICAvLyBUaGUgcGF0aCBhdHRyaWJ1
dGUgbWF5IG9yIG1heSBub3QgaW5jbHVkZSBwZXJjZW50LWVuY29kZWQgY2hhcmFjdGVycy4gRm9y
dHVuYXRlbHkKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcGVyY2VudC1lbmNv
ZGVkIGNoYXJhY3RlcnMsIGRlY29kaW5nIHRoZSB1cmwgaXMgYSBuby1vcC4KKyAgICAgICAgICAg
ICAgICByZXMtPnNldFBhdGgoZGVjb2RlVVJMRXNjYXBlU2VxdWVuY2VzKHBhcnNlZFZhbHVlKSk7
CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBMT0dfQU5EX0RFTEVURSgiSW52
YWxpZCBjb29raWUgJXMgKHBhdGgpIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnRCc6CisgICAgICAgIGNhc2Ug
J2QnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA2ICYmIGNvb2tpZS5maW5kKCJvbWFp
biIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFy
c2VkVmFsdWUubGVuZ3RoKCkgPiAxICYmIHBhcnNlZFZhbHVlWzBdID09ICciJyAmJiBwYXJzZWRW
YWx1ZVtwYXJzZWRWYWx1ZS5sZW5ndGgoKSAtIDFdID09ICciJykKKyAgICAgICAgICAgICAgICAg
ICAgcGFyc2VkVmFsdWUgPSBwYXJzZWRWYWx1ZS5zdWJzdHJpbmcoMSwgcGFyc2VkVmFsdWUubGVu
Z3RoKCkgLSAyKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGRvZXMgbm90IHN0
YXJ0IHdpdGggYSBkb3QsIGFkZCBvbmUgZm9yIHNlY3VyaXR5IGNoZWNrcywKKyAgICAgICAgICAg
ICAgICAvLyBGb3IgZXhhbXBsZTogYWIuYy5jb20gZG9zZSBub3QgZG9tYWluIG1hdGNoIGIuYy5j
b207CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYWxEb21haW4gPSBwYXJzZWRWYWx1ZVswXSA9
PSAnLicgPyBwYXJzZWRWYWx1ZSA6ICIuIiArIHBhcnNlZFZhbHVlOworICAgICAgICAgICAgICAg
IHJlcy0+c2V0RG9tYWluKHJlYWxEb21haW4pOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgTE9HX0FORF9ERUxFVEUoIkludmFsaWQgY29va2llICVzIChkb21haW4pIiwgY29v
a2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAg
ICAgICAgY2FzZSAnRScgOgorICAgICAgICBjYXNlICdlJyA6IHsKKyAgICAgICAgICAgIGlmIChs
ZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgieHBpcmVzIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZh
bHNlKSkKKyAgICAgICAgICAgICAgICByZXMtPnNldEV4cGlyeShwYXJzZWRWYWx1ZSk7CisgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTE9HX0FORF9ERUxFVEUoIkludmFsaWQgY29v
a2llICVzIChleHBpcmVzKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ00nIDoKKyAgICAgICAgY2FzZSAnbScg
OiB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoImF4LWFnZSIs
IHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgcmVzLT5zZXRNYXhB
Z2UocGFyc2VkVmFsdWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIExPR19B
TkRfREVMRVRFKCJJbnZhbGlkIGNvb2tpZSAlcyAobWF4LWFnZSkiLCBjb29raWUuYXNjaWkoKS5k
YXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdD
JyA6CisgICAgICAgIGNhc2UgJ2MnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA3ICYm
IGNvb2tpZS5maW5kKCJvbW1lbnQiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAg
ICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIHJvb20gZm9yIHRoZSBjb21tZW50IHBhcnQgKGFu
ZCBzbyBkbyBNb3ppbGxhKSBzbyBqdXN0IGxvZyB0aGUgY29tbWVudC4KKyAgICAgICAgICAgICAg
ICBMT0coTmV0d29yaywgIkNvbW1lbnQgJXMgZm9yIFBhcnNlZENvb2tpZSA6ICVzXG4iLCBwYXJz
ZWRWYWx1ZS5hc2NpaSgpLmRhdGEoKSwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMT0dfQU5EX0RFTEVURSgiSW52YWxpZCBjb29raWUg
JXMgKGNvbW1lbnQpIiwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnVicgOgorICAgICAgICBjYXNlICd2JyA6IHsK
KyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgiZXJzaW9uIiwgdG9r
ZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHRo
ZSBvdXQtb2YtZGF0ZWQgQ29va2llIFNwZWMoUkZDMjk2NSwgaHR0cDovL3Rvb2xzLmlldGYub3Jn
L2h0bWwvcmZjMjk2NSkgZGVmaW5lZAorICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBvZiB2
ZXJzaW9uIGNhbiBvbmx5IGNvbnRhaW4gRElHSVQsIHNvbWUgcmFuZG9tIHNpdGVzLCBlLmcuIGh0
dHBzOi8vZGV2Zm9ydW1zLmFwcGxlLmNvbQorICAgICAgICAgICAgICAgIC8vIHdvdWxkIHVzZSBk
b3VibGUgcXVvdGF0aW9uIG1hcmtzIHRvIHF1b3RlIHRoZSBkaWdpdC4gU28gd2UgbmVlZCB0byBn
ZXQgcmlkIG9mIHRoZW0gZm9yIGNvbXBsaWFuY2UuCisgICAgICAgICAgICAgICAgaWYgKHBhcnNl
ZFZhbHVlLmxlbmd0aCgpID4gMSAmJiBwYXJzZWRWYWx1ZVswXSA9PSAnIicgJiYgcGFyc2VkVmFs
dWVbcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAxXSA9PSAnIicpCisgICAgICAgICAgICAgICAgICAg
IHBhcnNlZFZhbHVlID0gcGFyc2VkVmFsdWUuc3Vic3RyaW5nKDEsIHBhcnNlZFZhbHVlLmxlbmd0
aCgpIC0gMik7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkVmFsdWUudG9JbnQoKSAhPSAx
KQorICAgICAgICAgICAgICAgICAgICBMT0dfQU5EX0RFTEVURSgiUGFyc2VkQ29va2llIHZlcnNp
b24gJWQgbm90IHN1cHBvcnRlZCAob25seSBzdXBwb3J0IHZlcnNpb249MSkiLCBwYXJzZWRWYWx1
ZS50b0ludCgpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIExPR19BTkRf
REVMRVRFKCJJbnZhbGlkIGNvb2tpZSAlcyAodmVyc2lvbikiLCBjb29raWUuYXNjaWkoKS5kYXRh
KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdTJyA6
CisgICAgICAgIGNhc2UgJ3MnIDogeworICAgICAgICAgICAgLy8gU2VjdXJlIGlzIGEgc3RhbmRh
bG9uZSB0b2tlbiAoIlNlY3VyZTsiKQorICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA2ICYmIGNv
b2tpZS5maW5kKCJlY3VyZSIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAg
ICAgICAgcmVzLT5zZXRTZWN1cmVGbGFnKHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIExPR19BTkRfREVMRVRFKCJJbnZhbGlkIGNvb2tpZSAlcyAoc2VjdXJlKSIsIGNv
b2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlICdIJzoKKyAgICAgICAgY2FzZSAnaCc6IHsKKyAgICAgICAgICAgIC8vIEh0dHBP
bmx5IGlzIGEgc3RhbmRhbG9uZSB0b2tlbiAoIkh0dHBPbmx5OyIpCisgICAgICAgICAgICBpZiAo
bGVuZ3RoID49IDggJiYgY29va2llLmZpbmQoInR0cE9ubHkiLCB0b2tlblN0YXJ0U3ZnICsgMSwg
ZmFsc2UpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0SXNIdHRwT25seSh0cnVlKTsKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMT0dfQU5EX0RFTEVURSgiSW52YWxpZCBjb29r
aWUgJXMgKEh0dHBPbmx5KSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAvLyBJ
ZiBsZW5ndGggPT0gMCwgd2Ugc2hvdWxkIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvb2tpZSAoY2Fz
ZSA6ICI7XHIiKSBzbyBpZ25vcmUgaXQKKyAgICAgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAg
ICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIHRva2VuIGZvciBjb29raWUgJXMiLCBjb29raWUu
YXNjaWkoKS5kYXRhKCkpOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBD
aGVjayBpZiB0aGUgY29va2llIGlzIHZhbGlkIHdpdGggcmVzcGVjdCB0byB0aGUgc2l6ZSBsaW1p
dC4KKyAgICBpZiAoIXJlcy0+aXNVbmRlclNpemVMaW1pdCgpKQorICAgICAgICBMT0dfQU5EX0RF
TEVURSgiUGFyc2VkQ29va2llICVzIGlzIGFib3ZlIHRoZSA0a2IgaW4gbGVuZ3RoIDogUkVKRUNU
RUQiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworCisgICAgLy8gSWYgc29tZSBwYWlyIHdhcyBu
b3QgcHJvdmlkZWQsIGR1cmluZyBwYXJzaW5nIHRoZW4gYXBwbHkgc29tZSBkZWZhdWx0IHZhbHVl
CisgICAgLy8gdGhlIHJlc3QgaGFzIGJlZW4gZG9uZSBpbiB0aGUgY29uc3RydWN0b3IuCisKKyAg
ICAvLyBJZiBubyBkb21haW4gd2FzIHByb3ZpZGVkLCBzZXQgaXQgdG8gdGhlIGhvc3QKKyAgICBp
ZiAoIXJlcy0+ZG9tYWluKCkpCisgICAgICAgIHJlcy0+c2V0RGVmYXVsdERvbWFpbihtX2RlZmF1
bHRDb29raWVVUkwpOworCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBDb29raWUgU3BlY2lmaWNh
aXRvbiAoUkZDNjI2NSwgc2VjdGlvbiA0LjEuMi40IGFuZCA1LjIuNCwgaHR0cDovL3Rvb2xzLmll
dGYub3JnL2h0bWwvcmZjNjI2NSksCisgICAgLy8gSWYgbm8gcGF0aCB3YXMgcHJvdmlkZWQgb3Ig
dGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcGF0aCB2YWx1ZSBpcyBub3QgJy8nLCBzZXQgaXQg
dG8gdGhlIGhvc3QncyBwYXRoCisgICAgLy8KKyAgICAvLyBSRUZFUkVOQ0UKKyAgICAvLyA0LjEu
Mi40LiBUaGUgUGF0aCBBdHRyaWJ1dGUKKyAgICAvLworICAgIC8vIFRoZSBzY29wZSBvZiBlYWNo
IGNvb2tpZSBpcyBsaW1pdGVkIHRvIGEgc2V0IG9mIHBhdGhzLCBjb250cm9sbGVkIGJ5CisgICAg
Ly8gdGhlIFBhdGggYXR0cmlidXRlLiBJZiB0aGUgc2VydmVyIG9taXRzIHRoZSBQYXRoIGF0dHJp
YnV0ZSwgdGhlIHVzZXIKKyAgICAvLyBhZ2VudCB3aWxsIHVzZSB0aGUgImRpcmVjdG9yeSIgb2Yg
dGhlIHJlcXVlc3QtdXJpJ3MgcGF0aCBjb21wb25lbnQgYXMKKyAgICAvLyB0aGUgZGVmYXVsdCB2
YWx1ZS4gKFNlZSBTZWN0aW9uIDUuMS40IGZvciBtb3JlIGRldGFpbHMuKQorICAgIC8vIC4uLi4u
Li4uLi4uCisgICAgLy8gNS4yLjQuIFRoZSBQYXRoIEF0dHJpYnV0ZQorICAgIC8vCisgICAgLy8g
SWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJp
bmcgIlBhdGgiLAorICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2ll
LWF2IGFzIGZvbGxvd3MuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlz
IGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCisgICAgLy8gYXR0cmlidXRl
LXZhbHVlIGlzIG5vdCAleDJGICgiLyIpOgorICAgIC8vCisgICAgLy8gTGV0IGNvb2tpZS1wYXRo
IGJlIHRoZSBkZWZhdWx0LXBhdGguCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2U6CisgICAgLy8K
KyAgICAvLyBMZXQgY29va2llLXBhdGggYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS4KKyAgICAvLwor
ICAgIC8vIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3
aXRoIGFuIGF0dHJpYnV0ZS0KKyAgICAvLyBuYW1lIG9mIFBhdGggYW5kIGFuIGF0dHJpYnV0ZS12
YWx1ZSBvZiBjb29raWUtcGF0aC4KKyAgICBpZiAoIXJlcy0+cGF0aCgpIHx8ICFyZXMtPnBhdGgo
KS5sZW5ndGgoKSB8fCAhcmVzLT5wYXRoKCkuc3RhcnRzV2l0aCgiLyIsIGZhbHNlKSkgeworICAg
ICAgICBTdHJpbmcgcGF0aCA9IG1fZGVmYXVsdENvb2tpZVVSTC5zdHJpbmcoKS5zdWJzdHJpbmco
bV9kZWZhdWx0Q29va2llVVJMLnBhdGhTdGFydCgpLCBtX2RlZmF1bHRDb29raWVVUkwucGF0aEFm
dGVyTGFzdFNsYXNoKCkgLSBtX2RlZmF1bHRDb29raWVVUkwucGF0aFN0YXJ0KCkgLSAxKTsKKyAg
ICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKQorICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAg
ICAgLy8gU2luY2UgdGhpcyBpcyByZWFkaW5nIHRoZSByYXcgdXJsIHN0cmluZywgaXQgY291bGQg
Y29udGFpbiBwZXJjZW50LWVuY29kZWQgc2VxdWVuY2VzLiBXZQorICAgICAgICAvLyB3YW50IGl0
IHRvIGJlIGNvbXBhcmFibGUgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiB1cmwucGF0aCgpLCB3aGlj
aCBpcyBub3QgcGVyY2VudC1lbmNvZGVkLAorICAgICAgICAvLyBzbyB3ZSBtdXN0IHJlbW92ZSB0
aGUgZXNjYXBlIHNlcXVlbmNlcy4KKyAgICAgICAgcmVzLT5zZXRQYXRoKGRlY29kZVVSTEVzY2Fw
ZVNlcXVlbmNlcyhwYXRoKSk7CisgICAgfQorIAorICAgIHJldHVybiByZXM7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Js
YWNrYmVycnkvQ29va2llUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2Jl
cnJ5L0Nvb2tpZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkyZTQ4ZDM2ZWIyNjU2MDZjN2QyMWY4NDRi
MjRkYWJlMWNmOTY4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ibGFja2JlcnJ5L0Nvb2tpZVBhcnNlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5by5jb20+Cisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIENvb2tpZVBhcnNlcl9oCisjZGVmaW5lIENvb2tpZVBh
cnNlcl9oCisKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiVmVjdG9yLmgiCisKK25hbWVz
cGFjZSBXVEYgeworY2xhc3MgU3RyaW5nOworfQorbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFz
cyBQYXJzZWRDb29raWU7CisKK2NsYXNzIENvb2tpZVBhcnNlciB7CitwdWJsaWM6CisgICAgQ29v
a2llUGFyc2VyKGNvbnN0IEtVUkwmIGRlZmF1bHRDb29raWVVUkwpOworICAgIH5Db29raWVQYXJz
ZXIoKTsKKworICAgIC8vIFBhcnNlcyBhIHNlcXVlbmNlIG9mICJDb29raWU6IiBoZWFkZXIgYW5k
IHJldHVybiB0aGUgcGFyc2VkIGNvb2tpZXMuCisgICAgVmVjdG9yPFBhcnNlZENvb2tpZSo+IHBh
cnNlKGNvbnN0IFN0cmluZyYgY29va2llcyk7CisKK3ByaXZhdGU6CisgICAgLy8gRklYTUU6IGN1
clRpbWUsIHN0YXJ0LCBlbmQgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVtb3ZlZC4gQW5kIHRoaXMg
bWV0aG9kIGNhbiBiZSBwdWJsaWMuCisgICAgUGFyc2VkQ29va2llKiBwYXJzZU9uZUNvb2tpZShj
b25zdCBTdHJpbmcmIGNvb2tpZSwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCwgZG91Ymxl
IGN1clRpbWUpOworCisgICAgS1VSTCBtX2RlZmF1bHRDb29raWVVUkw7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDb29raWVQYXJzZXJfaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRDb29raWUuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjFmZjdmZTYwMGFlN2U3ZDgzYjA4ZDhhOTk1MTZjZGMxMDEyYmY4MzQKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1BhcnNlZENvb2tpZS5j
cHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVs
aWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisKKyNp
bmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQ3VycmVudFRpbWUuaCIKKyNpbmNs
dWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPGN1cmwvY3VybC5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJp
bmdCdWlsZGVyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFyc2VkQ29va2llOjpQYXJz
ZWRDb29raWUoZG91YmxlIGN1cnJlbnRUaW1lKQorICAgIDogbV9leHBpcnkoMCkKKyAgICAsIG1f
Y3JlYXRpb25UaW1lKGN1cnJlbnRUaW1lKQorICAgICwgbV9sYXN0QWNjZXNzZWQoY3VycmVudFRp
bWUpCisgICAgLCBtX2lzTWF4QWdlU2V0KGZhbHNlKQorICAgICwgbV9oYXNEZWZhdWx0RG9tYWlu
KGZhbHNlKQorICAgICwgbV9pc1NlY3VyZShmYWxzZSkKKyAgICAsIG1faXNIdHRwT25seShmYWxz
ZSkKKyAgICAsIG1faXNTZXNzaW9uKHRydWUpCisgICAgLCBtX2lzRm9yY2VFeHBpcmVkKGZhbHNl
KQoreworfQorCitQYXJzZWRDb29raWU6OlBhcnNlZENvb2tpZShjb25zdCBTdHJpbmcmIG5hbWUs
IGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBTdHJpbmcm
IHByb3RvY29sLCBjb25zdCBTdHJpbmcmIHBhdGgsIGRvdWJsZSBleHBpcnksIGRvdWJsZSBsYXN0
QWNjZXNzZWQsIGRvdWJsZSBjcmVhdGlvblRpbWUsIGJvb2wgaXNTZWN1cmUsIGJvb2wgaXNIdHRw
T25seSkKKyAgICA6IG1fbmFtZShuYW1lKQorICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAgICAsIG1f
ZG9tYWluKGRvbWFpbikKKyAgICAsIG1fcHJvdG9jb2wocHJvdG9jb2wpCisgICAgLCBtX3BhdGgo
cGF0aCkKKyAgICAsIG1fZXhwaXJ5KGV4cGlyeSkKKyAgICAsIG1fY3JlYXRpb25UaW1lKGNyZWF0
aW9uVGltZSkKKyAgICAsIG1fbGFzdEFjY2Vzc2VkKGxhc3RBY2Nlc3NlZCkKKyAgICAsIG1faXNN
YXhBZ2VTZXQoZmFsc2UpCisgICAgLCBtX2hhc0RlZmF1bHREb21haW4oZmFsc2UpCisgICAgLCBt
X2lzU2VjdXJlKGlzU2VjdXJlKQorICAgICwgbV9pc0h0dHBPbmx5KGlzSHR0cE9ubHkpCisgICAg
LCBtX2lzU2Vzc2lvbihmYWxzZSkKKyAgICAsIG1faXNGb3JjZUV4cGlyZWQoZmFsc2UpCit7Cit9
CisKK1BhcnNlZENvb2tpZTo6UGFyc2VkQ29va2llKGNvbnN0IFBhcnNlZENvb2tpZSogY29va2ll
KQorICAgIDogbV9uYW1lKFN0cmluZyhjb29raWUtPm1fbmFtZSkpCisgICAgLCBtX3ZhbHVlKFN0
cmluZyhjb29raWUtPm1fdmFsdWUpKQorICAgICwgbV9kb21haW4oU3RyaW5nKGNvb2tpZS0+bV9k
b21haW4pKQorICAgICwgbV9wcm90b2NvbChTdHJpbmcoY29va2llLT5tX3Byb3RvY29sKSkKKyAg
ICAsIG1fcGF0aChTdHJpbmcoY29va2llLT5tX3BhdGgpKQorICAgICwgbV9leHBpcnkoY29va2ll
LT5tX2V4cGlyeSkKKyAgICAsIG1fY3JlYXRpb25UaW1lKGNvb2tpZS0+bV9jcmVhdGlvblRpbWUp
CisgICAgLCBtX2xhc3RBY2Nlc3NlZChjb29raWUtPm1fbGFzdEFjY2Vzc2VkKQorICAgICwgbV9p
c01heEFnZVNldChjb29raWUtPm1faXNNYXhBZ2VTZXQpCisgICAgLCBtX2hhc0RlZmF1bHREb21h
aW4oY29va2llLT5tX2hhc0RlZmF1bHREb21haW4pCisgICAgLCBtX2lzU2VjdXJlKGNvb2tpZS0+
bV9pc1NlY3VyZSkKKyAgICAsIG1faXNIdHRwT25seShjb29raWUtPm1faXNIdHRwT25seSkKKyAg
ICAsIG1faXNTZXNzaW9uKGNvb2tpZS0+bV9pc1Nlc3Npb24pCisgICAgLCBtX2lzRm9yY2VFeHBp
cmVkKGNvb2tpZS0+bV9pc0ZvcmNlRXhwaXJlZCkKK3sKK30KKworUGFyc2VkQ29va2llOjp+UGFy
c2VkQ29va2llKCkKK3sKK30KKwordm9pZCBQYXJzZWRDb29raWU6OnNldEV4cGlyeShjb25zdCBT
dHJpbmcmIGV4cGlyeSkKK3sKKyAgICAvLyBJZiBhIGNvb2tpZSBoYXMgYm90aCB0aGUgTWF4LUFn
ZSBhbmQgdGhlIEV4cGlyZXMgYXR0cmlidXRlLAorICAgIC8vIHRoZSBNYXgtQWdlIGF0dHJpYnV0
ZSBoYXMgcHJlY2VkZW5jZSBhbmQgY29udHJvbHMgdGhlIGV4cGlyYXRpb24gZGF0ZSBvZiB0aGUg
Y29va2llLgorICAgIGlmIChtX2lzTWF4QWdlU2V0IHx8IGV4cGlyeS5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1faXNTZXNzaW9uID0gZmFsc2U7CisKKyAgICBtX2V4cGlyeSA9
IHN0YXRpY19jYXN0PGRvdWJsZT4oY3VybF9nZXRkYXRlKGV4cGlyeS51dGY4KCkuZGF0YSgpLCAw
KSk7CisKKyAgICBpZiAobV9leHBpcnkgPT0gLTEpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3Vs
ZCBub3QgcGFyc2UgZGF0ZSIpOworICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGNvbnNpZGVyIHRo
YXQgdGhlIGNvb2tpZSBpcyBzZXNzaW9uIG9ubHkKKyAgICAgICAgbV9pc1Nlc3Npb24gPSB0cnVl
OworICAgIH0KK30KKwordm9pZCBQYXJzZWRDb29raWU6OnNldE1heEFnZShjb25zdCBTdHJpbmcm
IG1heEFnZSkKK3sKKyAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIEhUVFAgQ29va2llIHNwZWNpZmlj
YXRpb24gKFJGQzYyNjUsIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUpLAorICAg
IC8vIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2FuIGJlIGEgRElHSVQgb3IgYSAiLSIsIGFuZCB0aGUg
cmVtaW5kZXIKKyAgICAvLyBvZiB0aGUgdmFsdWUgY2FuIG9ubHkgY29udGFpbiBESUdJVCBjaGFy
YWN0ZXJzLgorICAgIGlmIChtYXhBZ2UuaXNFbXB0eSgpIHx8IChtYXhBZ2VbMF0gIT0gJy0nICYm
ICFpc0FTQ0lJRGlnaXQobWF4QWdlWzBdKSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBu
b3QgcGFyc2UgTWF4LUFnZSA6ICVzLCBmaXJzdCBjaGFyYWN0ZXIgY2FuIG9ubHkgYmUgJy0nIG9y
IGFzY2lpIGRpZ2l0LiIsIG1heEFnZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBib29sIG9rOworICAgIGludCB2YWx1ZSA9IG1heEFnZS50b0ludFN0cmlj
dCgmb2spOworCisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBw
YXJzZSBNYXgtQWdlIDogJXMiLCBtYXhBZ2UuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIG1fZXhwaXJ5ID0gdmFsdWU7CisgICAgbV9pc01heEFnZVNldCA9IHRy
dWU7CisgICAgbV9pc1Nlc3Npb24gPSBmYWxzZTsKKworICAgIC8vIElmIG1heEFnZSB2YWx1ZSBp
cyBub3QgcG9zaXRpdmUsIGxldCBleHBpcnktdGltZSBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50
YWJsZSB0aW1lLgorICAgIGlmIChtX2V4cGlyeSA+IDApCisgICAgICAgIG1fZXhwaXJ5ICs9IGN1
cnJlbnRUaW1lKCk7CisgICAgZWxzZQorICAgICAgICBtX2V4cGlyeSA9IDA7Cit9CisKK3ZvaWQg
UGFyc2VkQ29va2llOjpzZXREZWZhdWx0RG9tYWluKGNvbnN0IEtVUkwmIHJlcXVlc3RVUkwpCit7
CisgICAgc2V0RG9tYWluKHJlcXVlc3RVUkwuaG9zdCgpKTsKKyAgICBtX2hhc0RlZmF1bHREb21h
aW4gPSB0cnVlOworfQorCitib29sIFBhcnNlZENvb2tpZTo6aGFzRXhwaXJlZCgpIGNvbnN0Cit7
CisgICAgLy8gU2Vzc2lvbiBjb29raWVzIGRvIG5vdCBleHBpcmUsIHRoZXkgd2lsbCBqdXN0IG5v
dCBiZSBzYXZlZCB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgICByZXR1cm4gIW1faXNTZXNzaW9u
ICYmIChtX2lzRm9yY2VFeHBpcmVkIHx8IG1fZXhwaXJ5IDwgY3VycmVudFRpbWUoKSk7Cit9CisK
K2Jvb2wgUGFyc2VkQ29va2llOjppc1VuZGVyU2l6ZUxpbWl0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV92YWx1ZS5sZW5ndGgoKSA8PSBDb29raWVNYW5hZ2VyOjptYXhDb29raWVMZW5ndGgoKSAm
JiBtX25hbWUubGVuZ3RoKCkgPD0gQ29va2llTWFuYWdlcjo6bWF4Q29va2llTGVuZ3RoKCk7Cit9
CisKK1N0cmluZyBQYXJzZWRDb29raWU6OnRvU3RyaW5nKCkgY29uc3QKK3sKKyAgICBTdHJpbmdC
dWlsZGVyIGJ1aWxkZXI7CisgICAgYnVpbGRlci5hcHBlbmQobmFtZSgpKTsKKyAgICBidWlsZGVy
LmFwcGVuZCgiID0gIik7CisgICAgYnVpbGRlci5hcHBlbmQodmFsdWUoKSk7CisgICAgYnVpbGRl
ci5hcHBlbmQoIjsgRG9tYWluID0gIik7CisgICAgYnVpbGRlci5hcHBlbmQoZG9tYWluKCkpOwor
ICAgIGJ1aWxkZXIuYXBwZW5kKCI7IFBhdGggPSAiKTsKKyAgICBidWlsZGVyLmFwcGVuZChwYXRo
KCkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCI7IFByb3RvY29sID0gIik7CisgICAgYnVpbGRlci5h
cHBlbmQocHJvdG9jb2woKSk7CisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKK30KKwor
U3RyaW5nIFBhcnNlZENvb2tpZTo6dG9OYW1lVmFsdWVQYWlyKCkgY29uc3QKK3sKKyAgICBzdGF0
aWMgY29uc3QgU3RyaW5nIGVxdWFsKCI9Iik7CisKKyAgICBzaXplX3QgY29va2llTGVuZ3RoID0g
bV9uYW1lLmxlbmd0aCgpICsgbV92YWx1ZS5sZW5ndGgoKSArIDI7CisgICAgVmVjdG9yPFVDaGFy
PiByZXN1bHQ7CisgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoY29va2llTGVuZ3Ro
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBtX25hbWUpOworICAgIGFwcGVuZChyZXN1bHQsIGVxdWFs
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBtX3ZhbHVlKTsKKworICAgIHJldHVybiBTdHJpbmc6OmFk
b3B0KHJlc3VsdCk7Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjphcHBlbmRXZWJDb3JlQ29va2ll
KFZlY3RvcjxDb29raWU+JiBjb29raWVWZWN0b3IpIGNvbnN0Cit7CisgICAgY29va2llVmVjdG9y
LmFwcGVuZChDb29raWUoU3RyaW5nKG1fbmFtZSksIFN0cmluZyhtX3ZhbHVlKSwgU3RyaW5nKG1f
ZG9tYWluKSwKKyAgICAgICAgICAgIFN0cmluZyhtX3BhdGgpLCBtX2V4cGlyeSwgbV9pc0h0dHBP
bmx5LCBtX2lzU2VjdXJlLCBtX2lzU2Vzc2lvbikpOworfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9QYXJzZWRD
b29raWUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFyc2VkQ29va2ll
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uY2EzNDNkMTNmM2U1ZmM1NWYzODQ0ZGM5Y2I5OWEzN2E2Y2I5OGVmNAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUGFy
c2VkQ29va2llLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgs
IDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBD
b3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIFBhcnNlZENvb2tpZV9oCisjZGVmaW5lIFBhcnNlZENvb2tp
ZV9oCisKKyNpbmNsdWRlICJDb29raWUuaCIKKyNpbmNsdWRlIDx3dGYvRmFzdEFsbG9jQmFzZS5o
PgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgS1VSTDsKKworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29va2llIGlu
dGVybmFsbHkKKy8vIEl0IGNhbiBlaXRoZXIgYmUgY3JlYXRlZCBieSB0aGUgQ29va2llUGFyc2Vy
IHdoaWNoIHdpbGwgdGhlbiBmaWxsIGl0CisvLyBvciBpdCBjYW4gYmUgY3JlYXRlZCBieSB0aGUg
YmFja2luZyBzdG9yZSBmaWxsaW5nIGl0IGluIHRoZSBjb25zdHJ1Y3Rvci4KK2NsYXNzIFBhcnNl
ZENvb2tpZSB7CitXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICAvLyBEZWZh
dWx0IGNvb2tpZSA6IGVtcHR5IGRvbWFpbiwgbm9uIHNlY3VyZSBhbmQgc2Vzc2lvbgorICAgIFBh
cnNlZENvb2tpZShkb3VibGUgY3VycmVudFRpbWUpOworCisgICAgLy8gRm9yIGJhY2tpbmcgc3Rv
cmUgY29va2llcyAodGhvc2UgY29va2llcyBhcmUgbmV2ZXIgc2Vzc2lvbiBjb29raWVzKS4KKyAg
ICBQYXJzZWRDb29raWUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBj
b25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwcm90b2NvbCwgY29uc3QgU3RyaW5n
JiBwYXRoLCBkb3VibGUgZXhwaXJ5LCBkb3VibGUgbGFzdEFjY2Vzc2VkLCBkb3VibGUgY3JlYXRp
b25UaW1lLCBib29sIGlzU2VjdXJlLCBib29sIGlzSHR0cE9ubHkpOworCisgICAgUGFyc2VkQ29v
a2llKGNvbnN0IFBhcnNlZENvb2tpZSopOworCisgICAgflBhcnNlZENvb2tpZSgpOworCisgICAg
Y29uc3QgU3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisgICAgdm9pZCBz
ZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkgeyBtX25hbWUgPSBuYW1lOyB9CisKKyAgICBjb25z
dCBTdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorICAgIHZvaWQgc2V0
VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0KKworICAgIGNv
bnN0IFN0cmluZyYgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcGF0aDsgfQorICAgIHZvaWQgc2V0
UGF0aChjb25zdCBTdHJpbmcmIHBhdGgpIHsgbV9wYXRoID0gcGF0aDsgfQorCisgICAgY29uc3Qg
U3RyaW5nJiBkb21haW4oKSBjb25zdCB7IHJldHVybiBtX2RvbWFpbjsgfQorICAgIHZvaWQgc2V0
RG9tYWluKGNvbnN0IFN0cmluZyYgZG9tYWluKSB7IG1fZG9tYWluID0gZG9tYWluLmxvd2VyKCk7
IH0KKworICAgIGNvbnN0IFN0cmluZyYgcHJvdG9jb2woKSBjb25zdCB7IHJldHVybiBtX3Byb3Rv
Y29sOyB9CisgICAgdm9pZCBzZXRQcm90b2NvbChjb25zdCBTdHJpbmcmIHByb3RvY29sKSB7IG1f
cHJvdG9jb2wgPSBwcm90b2NvbDsgfQorCisgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgbWV0aG9k
IHVzZWQgdG8gc2V0IHRoZSBkb21haW4gdG8gdGhlIHJlcXVlc3QncyB1cmwuCisgICAgdm9pZCBz
ZXREZWZhdWx0RG9tYWluKGNvbnN0IEtVUkwmKTsKKyAgICBib29sIGhhc0RlZmF1bHREb21haW4o
KSBjb25zdCB7IHJldHVybiBtX2hhc0RlZmF1bHREb21haW47IH0KKworICAgIGRvdWJsZSBleHBp
cnkoKSBjb25zdCB7IHJldHVybiBtX2V4cGlyeTsgfQorICAgIHZvaWQgc2V0RXhwaXJ5KGNvbnN0
IFN0cmluZyYpOworICAgIHZvaWQgZm9yY2VFeHBpcmUoKSB7IG1faXNGb3JjZUV4cGlyZWQgID0g
dHJ1ZTsgfQorICAgIHZvaWQgc2V0TWF4QWdlKGNvbnN0IFN0cmluZyYpOworCisgICAgZG91Ymxl
IGxhc3RBY2Nlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdEFjY2Vzc2VkOyB9CisgICAgdm9p
ZCBzZXRMYXN0QWNjZXNzZWQoZG91YmxlIGxhc3RBY2Nlc3NlZCkgeyBtX2xhc3RBY2Nlc3NlZCA9
IGxhc3RBY2Nlc3NlZDt9CisKKyAgICBkb3VibGUgY3JlYXRpb25UaW1lKCkgY29uc3QgeyByZXR1
cm4gbV9jcmVhdGlvblRpbWU7IH0KKyAgICB2b2lkIHNldENyZWF0aW9uVGltZShkb3VibGUgY3Jl
YXRpb25UaW1lKSB7IG1fY3JlYXRpb25UaW1lID0gY3JlYXRpb25UaW1lOyB9CisKKyAgICBib29s
IGlzU2VjdXJlKCkgY29uc3QgeyByZXR1cm4gbV9pc1NlY3VyZTsgfQorICAgIHZvaWQgc2V0U2Vj
dXJlRmxhZyhib29sIHNlY3VyZSkgeyBtX2lzU2VjdXJlID0gc2VjdXJlOyB9CisKKyAgICBib29s
IGlzSHR0cE9ubHkoKSBjb25zdCB7IHJldHVybiBtX2lzSHR0cE9ubHk7IH0KKyAgICB2b2lkIHNl
dElzSHR0cE9ubHkoYm9vbCBpc0h0dHBPbmx5KSB7IG1faXNIdHRwT25seSA9IGlzSHR0cE9ubHk7
IH0KKworICAgIGJvb2wgaXNTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9pc1Nlc3Npb247IH0K
KworICAgIGJvb2wgaGFzRXhwaXJlZCgpIGNvbnN0OworICAgIGJvb2wgaXNGb3JjZUV4cGlyZWQo
KSBjb25zdCB7IHJldHVybiBtX2lzRm9yY2VFeHBpcmVkOyB9CisgICAgYm9vbCBpc1VuZGVyU2l6
ZUxpbWl0KCkgY29uc3Q7CisKKyAgICBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKyAgICBTdHJp
bmcgdG9OYW1lVmFsdWVQYWlyKCkgY29uc3Q7CisgICAgdm9pZCBhcHBlbmRXZWJDb3JlQ29va2ll
KFZlY3RvcjxDb29raWU+JiBjb29raWVWZWN0b3IpIGNvbnN0OworCitwcml2YXRlOgorICAgIFN0
cmluZyBtX25hbWU7CisgICAgU3RyaW5nIG1fdmFsdWU7CisgICAgU3RyaW5nIG1fZG9tYWluOwor
ICAgIFN0cmluZyBtX3Byb3RvY29sOworICAgIFN0cmluZyBtX3BhdGg7CisgICAgZG91YmxlIG1f
ZXhwaXJ5OworICAgIGRvdWJsZSBtX2NyZWF0aW9uVGltZTsKKyAgICAvLyBUaGlzIGlzIHVzZWQg
Zm9yIHRoZSBMUlUgcmVwbGFjZW1lbnQgcG9saWN5LgorICAgIGRvdWJsZSBtX2xhc3RBY2Nlc3Nl
ZDsKKworICAgIGJvb2wgbV9pc01heEFnZVNldDsKKyAgICBib29sIG1faGFzRGVmYXVsdERvbWFp
bjsKKyAgICBib29sIG1faXNTZWN1cmU7CisgICAgYm9vbCBtX2lzSHR0cE9ubHk7CisgICAgYm9v
bCBtX2lzU2Vzc2lvbjsKKyAgICBib29sIG1faXNGb3JjZUV4cGlyZWQ7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBQYXJzZWRDb29raWVfaApkaWZmIC0tZ2l0IGEv
Q2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IGJmZjc3YjhhNDQ4OTU3ZTUwZTg0NmM3MTIyNjkz
MmJjZDYyN2UxMjcuLmQ3MDE5MjM4NzA3ZDg2ZDIzYWZlODljYTU0N2Y1MzBjNzM3Mjk0N2IgMTAw
NjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNSBAQAorMjAx
Mi0wMi0yMyAgS29ucmFkIFBpYXNjaWsgIDxrcGlhc2Npa0ByaW0uY29tPgorCisgICAgICAgIFVw
c3RyZWFtIEJsYWNrQmVycnkgQ29va2llIE1hbmFnZW1lbnQgQ2xhc3NlcworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2NTQKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNYW51YWwgdGVzdCB0byBzZWUgaW4g
bWlsbGlzZWNvbmRzIGhvdyBxdWlja2x5IDEwMCB3cml0ZXMgZm9sbG93ZWQgYnkgMTAwIHJlYWRz
IHRha2UuCisgICAgICAgIFRoaXMgdGVzdCBpcyByYW4gdHdpY2UgYW5kIHRoZSBhdmVyYWdlIHJl
YWQgYW5kIHdyaXRlIGZvciBlYWNoIG9mIHRoZSAyIHJ1bnMgaXMgc2hvd24uCisKKyAgICAgICAg
KiBNYW51YWxUZXN0cy9jb29raWVTcGVlZFRlc3QuaHRtbDogQWRkZWQuCisKIDIwMTItMDItMjAg
IFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgcGVyZi1vLW1hdGlj
OiBFeHRyYWN0IGxvZ2ljIHRvIGdlbmVyYXRlIEpTT04gcmVzcG9uc2VzIGFzIGNsYXNzZXMgdG8g
dW5pdCB0ZXN0CmRpZmYgLS1naXQgYS9NYW51YWxUZXN0cy9jb29raWVTcGVlZFRlc3QuaHRtbCBi
L01hbnVhbFRlc3RzL2Nvb2tpZVNwZWVkVGVzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjg2MzM1NTdlM2Yz
NjJiZDc4OGM5OWIwN2FkZTlmYWY2ODU4OTIyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9NYW51YWxU
ZXN0cy9jb29raWVTcGVlZFRlc3QuaHRtbApAQCAtMCwwICsxLDI4IEBACis8aHRtbD48aGVhZD48
dGl0bGU+Q29va2llIFRlc3Q8L3RpdGxlPgorPHNjcmlwdD4KK2Z1bmN0aW9uIGNvb2tpZVRlc3Qo
KXsKKyAgICB2YXIgdG90YWxXID0gMC4wOworICAgIHZhciB0b3RhbFIgPSAwLjA7CisgICAgdmFy
IG51bUxvb3BzID0gMTAwOworICAgIGZvcih2YXIgaT0wOyBpIDwgbnVtTG9vcHM7IGkrKyl7Cisg
ICAgICAgIHZhciByYW5kb21OdW1iZXI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjExKTsKKyAg
ICAgICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgpOworICAgICAgICB0aW1lLnNldFRpbWUodGltZS5n
ZXRUaW1lKCkgKyAxMDAwKTsKKyAgICAgICAgdmFyIGNvb2tpZVN0cmluZyA9ICJjb29raWUiICsg
cmFuZG9tTnVtYmVyICsgIj10cnVlOyBleHBpcmVzPSIgKyB0aW1lLnRvR01UU3RyaW5nKCk7Cisg
ICAgICAgIHZhciBwcmVXID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGRvY3VtZW50
LmNvb2tpZSA9IGNvb2tpZVN0cmluZzsKKyAgICAgICAgdmFyIHBvc3RXID0gbmV3IERhdGUoKS5n
ZXRUaW1lKCk7CisgICAgICAgIGlmKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCgiY29va2llIiAr
IHJhbmRvbU51bWJlcik+IDApKTsKKyAgICAgICAgdmFyIHBvc3RSID0gbmV3IERhdGUoKS5nZXRU
aW1lKCk7CisgICAgICAgIHRvdGFsVyArPSAocG9zdFcgLSBwcmVXKTsKKyAgICAgICAgdG90YWxS
ICs9IChwb3N0UiAtIHBvc3RXKTsKKyAgICB9CisgICAgZG9jdW1lbnQud3JpdGUoIjxicj48YnI+
YXZnIFIobWlsbGlzKToiICsgdG90YWxSL251bUxvb3BzKTsKKyAgICBkb2N1bWVudC53cml0ZSgi
PGJyPmF2ZyBXKG1pbGxpcyk6IiArIHRvdGFsVy9udW1Mb29wcyk7Cit9CisKKzwvc2NyaXB0Pgor
PC9oZWFkPgorPGJvZHkgb25sb2FkPSJqYXZhc2NyaXB0OmNvb2tpZVRlc3QoKTtzZXRUaW1lb3V0
KGNvb2tpZVRlc3QoKSwgMTAwMCk7Ij4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>