<?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>22765</bug_id>
          
          <creation_ts>2008-12-09 14:55:39 -0800</creation_ts>
          <short_desc>Limit the size of local storage to a fixed quota.</short_desc>
          <delta_ts>2009-10-05 13:39:21 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>29991</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yael">yael</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>beidson</cc>
    
    <cc>benm</cc>
    
    <cc>ddkilzer</cc>
    
    <cc>hausmann</cc>
    
    <cc>jorlow</cc>
    
    <cc>kangax</cc>
    
    <cc>laszlo.gombos</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>102019</commentid>
    <comment_count>0</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2008-12-09 14:55:39 -0800</bug_when>
    <thetext>Set a limit on the size of local storage per origin.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102022</commentid>
    <comment_count>1</comment_count>
      <attachid>25899</attachid>
    <who name="Yael">yael</who>
    <bug_when>2008-12-09 14:59:12 -0800</bug_when>
    <thetext>Created attachment 25899
Setting a limit on local storage size.

This patch is setting a fixed limit on the size of local storage.
Some issues are still left open e.g. should DatabaseTracker be modified to support LocalStorage quota or is LocalStorage an entity on its own.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102650</commentid>
    <comment_count>2</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2008-12-16 03:03:59 -0800</bug_when>
    <thetext>I can review the Qt bits, but I don&apos;t feel comfortable reviewing the local storage changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105269</commentid>
    <comment_count>3</comment_count>
      <attachid>26616</attachid>
    <who name="Yael">yael</who>
    <bug_when>2009-01-11 14:10:55 -0800</bug_when>
    <thetext>Created attachment 26616
Update previous patch.

This patch updates the previous patch. It adds a callback to the ChromeClient when a new LocalStorageArea is created, to get the quota for the given origin.
This patch also adds the ability to delete LocalStorage or SessionStorage selectively (by origin)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107499</commentid>
    <comment_count>4</comment_count>
      <attachid>26616</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2009-01-29 02:40:47 -0800</bug_when>
    <thetext>Comment on attachment 26616
Update previous patch.

Brady, could you take a look at the non-Qt bits of this patch?

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123468</commentid>
    <comment_count>5</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-05-28 14:36:26 -0700</bug_when>
    <thetext>&gt; virtual unsigned long long quotaForLocalStorage(Frame*) = 0;

Keying off of the Frame* may be problematic given a world of workers. I&apos;m guessing there are two distinct purposes for the frame argument.
1) Figure out what SecurityOrigin the frame is in, and return the quota for that origin
2) Figure out where to present UI (should that be needed)

If so, maybe have this take two arguments, one for each purpose, where the frame can be NULL in the worker case. </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123544</commentid>
    <comment_count>6</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2009-05-29 05:50:31 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; 
&gt; If so, maybe have this take two arguments, one for each purpose, where the
&gt; frame can be NULL in the worker case. 
&gt; 

First off, Thank you for reviewing the patch.
Regarding the added argument, do you have an example of another place in the code where the Frame argument is duplicated? reviewers tend to reject patches if there are extra arguments without a really good reason. 
Thanks!
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123588</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-05-29 12:03:45 -0700</bug_when>
    <thetext>I put a question back to you...

Why is this not quotaForLocalStorage(SecurityOrigin*) &lt;period&gt;. What does the Frame have to do with the quota for an origin?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123682</commentid>
    <comment_count>8</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2009-05-30 05:27:47 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; I put a question back to you...
&gt; 
&gt; Why is this not quotaForLocalStorage(SecurityOrigin*) &lt;period&gt;. What does the
&gt; Frame have to do with the quota for an origin?
&gt; 

I cannot assume that all ports will show a UI in this callback. Passing the Frame gives enough context and flexibility for the ports to do what they need. As an example, the same is done in exceededDatabaseQuota(Frame*, const String&amp;);

When WebWorkers start supporting LocalStorage, this will need to be revisited, and an additional parameter could be added at that time.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123726</commentid>
    <comment_count>9</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2009-05-31 03:46:37 -0700</bug_when>
    <thetext>FYI LocalStorage within web workers is not part of the spec anymore, so that shouldn&apos;t be a concern.

Also FYI I&apos;m currently finishing up a patch for refactoring DOM storage for use in multi-process browsers (https://bugs.webkit.org/show_bug.cgi?id=25376) which will definitely conflict with this patch.  We may need to coordinate if this doesn&apos;t get landed soon (and the review gods are favorable to me :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123727</commentid>
    <comment_count>10</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2009-05-31 03:56:50 -0700</bug_when>
    <thetext>Ugh.  I can&apos;t &apos;officially&apos; review this due to permissions issues...  I tried to cut the files (and some of the diffs) out that I didn&apos;t comment on.


I haven&apos;t looked at the SQL or locking side of this very closely yet.  In general, I worry that it&apos;s adding a lot of complexity....but I can&apos;t think of any better ways to do a lot of this.


&gt; Index: WebCore/storage/StorageArea.cpp
&gt; ===================================================================
&gt; --- WebCore/storage/StorageArea.cpp	(revision 39799)
&gt; +++ WebCore/storage/StorageArea.cpp	(working copy)
&gt; @@ -36,12 +36,16 @@
&gt;  StorageArea::StorageArea(SecurityOrigin* origin)
&gt;      : m_securityOrigin(origin)
&gt;      , m_storageMap(StorageMap::create())
&gt; +    , m_quota(UINT_MAX) // default used for sessionStorage which is unlimited
&gt; +    , m_deleted(false)
&gt;  {
&gt;  }
&gt;  
&gt;  StorageArea::StorageArea(SecurityOrigin* origin, StorageArea* area)
&gt;      : m_securityOrigin(origin)
&gt;      , m_storageMap(area-&gt;m_storageMap)
&gt; +    , m_quota(area-&gt;m_quota)
&gt; +    , m_deleted(area-&gt;m_deleted)
&gt;  {
&gt;  }
&gt;  
&gt; @@ -51,11 +55,16 @@
&gt;  
&gt;  unsigned StorageArea::internalLength() const
&gt;  {
&gt; +    if (m_deleted)
&gt; +        return 0;
&gt;      return m_storageMap-&gt;length();
&gt;  }
&gt;  
&gt;  String StorageArea::internalKey(unsigned index, ExceptionCode&amp; ec) const
&gt;  {
&gt; +    if (m_deleted)
&gt; +        return String();
&gt; +    
&gt;      String key;
&gt;      
&gt;      if (!m_storageMap-&gt;key(index, key)) {
&gt; @@ -68,21 +77,29 @@
&gt;  
&gt;  String StorageArea::internalGetItem(const String&amp; key) const
&gt;  {
&gt; +    if (m_deleted)
&gt; +        return String();
&gt;      return m_storageMap-&gt;getItem(key);
&gt;  }
&gt;  
&gt; -void StorageArea::internalSetItem(const String&amp; key, const String&amp; value, ExceptionCode&amp;, Frame* frame)
&gt; +void StorageArea::internalSetItem(const String&amp; key, const String&amp; value, ExceptionCode&amp; ec, Frame* frame)
&gt;  {
&gt; +    if (m_deleted)
&gt; +        return;
&gt;      ASSERT(!value.isNull());
&gt;      
&gt; -    // FIXME: For LocalStorage where a disk quota will be enforced, here is where we need to do quota checking.
&gt; -    //        If we decide to enforce a memory quota for SessionStorage, this is where we&apos;d do that, also.
&gt; -    // if (&lt;over quota&gt;) {
&gt; -    //     ec = INVALID_ACCESS_ERR;
&gt; -    //     return;
&gt; -    // }
&gt; -    
&gt; -    String oldValue;   
&gt; +    String oldValue = m_storageMap-&gt;getItem(key);   
&gt; +    unsigned long long usage = m_storageMap-&gt;totalUsage();

I think your equality means to check if oldValue is null (i.e. not present).  Also you use &quot;usage = usage +&quot; where &quot;usage +=&quot; is probably clearer.  That said, I kind of feel like doing this calculation here and in the storage map is just asking for accounting errors in the future.  Maybe you could pass in the quota delta to storageMap, create a helper function that they both share, or have storageMap make quota decisions (and return ec when the limit is hit)?

&gt; +    if (oldValue != value) {
&gt; +        usage = usage + value.length() * sizeof(UChar) - oldValue.length() * sizeof(UChar);
&gt; +    }
&gt; +    else {
&gt; +        usage += (key.length() + value.length()) * sizeof(UChar);
&gt; +    }
&gt; +    if (usage &gt; m_quota) {
&gt; +        ec = QUOTA_EXCEEDED_ERR;
&gt; +        return;
&gt; +    }
&gt;      RefPtr&lt;StorageMap&gt; newMap = m_storageMap-&gt;setItem(key, value, oldValue);
&gt;      
&gt;      if (newMap)
&gt; Index: WebCore/storage/SessionStorage.cpp
&gt; ===================================================================
&gt; --- WebCore/storage/SessionStorage.cpp	(revision 39799)
&gt; +++ WebCore/storage/SessionStorage.cpp	(working copy)
&gt; @@ -72,4 +72,17 @@
&gt;      return storageArea.release();
&gt;  }
&gt;  
&gt; +
&gt; +void SessionStorage::origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt; &gt;&amp; result)
&gt; +{
&gt; +    copyKeysToVector(m_storageAreaMap, result);
&gt;  }
&gt; +
&gt; +void SessionStorage::deleteStorageArea(SecurityOrigin* origin)
&gt; +{
&gt; +    RefPtr&lt;SessionStorageArea&gt; storageArea = m_storageAreaMap.take(origin);

Storage object might still refer to the storage area.  Basically any page that&apos;s currently open when you clear storage will just stop working correctly because of your m_delete checks.

Why is this necessary?  Can&apos;t you just clear the storageMap and schedule a sync of the database?

&gt; +    if (storageArea)
&gt; +        storageArea.get()-&gt;markDeleted();
&gt; +}
&gt; +
&gt; +}
&gt; Index: WebCore/storage/LocalStorage.cpp
&gt; ===================================================================
&gt; --- WebCore/storage/LocalStorage.cpp	(revision 39799)
&gt; +++ WebCore/storage/LocalStorage.cpp	(working copy)
&gt; @@ -26,6 +26,7 @@
&gt;  #include &quot;config.h&quot;
&gt;  #include &quot;LocalStorage.h&quot;
&gt;  
&gt; +#include &quot;ChromeClient.h&quot;
&gt;  #include &quot;CString.h&quot;
&gt;  #include &quot;EventNames.h&quot;
&gt;  #include &quot;FileSystem.h&quot;
&gt; @@ -34,6 +35,7 @@
&gt;  #include &quot;LocalStorageArea.h&quot;
&gt;  #include &quot;Page.h&quot;
&gt;  #include &quot;PageGroup.h&quot;
&gt; +#include &quot;SQLiteStatement.h&quot;
&gt;  #include &quot;StorageArea.h&quot;
&gt;  #include &lt;wtf/StdLibExtras.h&gt;
&gt;  
&gt; @@ -62,6 +64,7 @@
&gt;  
&gt;  LocalStorage::LocalStorage(const String&amp; path)
&gt;      : m_path(path.copy())
&gt; +    , m_importComplete(false)
&gt;  {
&gt;      // If the path is empty, we know we&apos;re never going to be using the thread for anything, so don&apos;t start it.
&gt;      // In the future, we might also want to consider removing it from the DOM in that case - &lt;rdar://problem/5960470&gt;
&gt; @@ -76,6 +79,7 @@
&gt;  LocalStorage::~LocalStorage()
&gt;  {
&gt;      ASSERT(localStorageMap().get(m_path) == this);
&gt; +    m_database.close();
&gt;      localStorageMap().remove(m_path);
&gt;  }
&gt;  
&gt; @@ -83,32 +87,55 @@
&gt;  {
&gt;      ASSERT(isMainThread());
&gt;  
&gt; -    // FIXME: If the security origin in question has never had a storage area established,
&gt; -    // we need to ask a client call if establishing it is okay.  If the client denies the request,
&gt; -    // this method will return null.
&gt; -    // The sourceFrame argument exists for the purpose of asking a client.
&gt; -    // To know if an area has previously been established, we need to wait until this LocalStorage 
&gt; -    // object has finished it&apos;s AreaImport task.
&gt; -
&gt; -
&gt; -    // FIXME: If the storage area is being established for the first time here, we need to 
&gt; -    // sync its existance and quota out to disk via an task of type AreaSync
&gt; -
&gt;      RefPtr&lt;LocalStorageArea&gt; storageArea;
&gt;      if (storageArea = m_storageAreaMap.get(origin))
&gt;          return storageArea.release();
&gt; +    // wait for import to complete before we know if this origin already has a quota associated with it
&gt; +    waitForImportComplete();
&gt; +    
&gt; +    unsigned long long quota;
&gt; +    
&gt; +    {
&gt; +        MutexLocker importLock(m_importLock);
&gt; +        quota =  m_securityOriginQuoteMap.get(origin);
&gt; +    }
&gt; +    
&gt; +    Page* page = sourceFrame-&gt;page();
&gt; +    ASSERT(page);
&gt; +    
&gt; +    bool syncRequired(false);

Isn&apos;t the norm for primitives to initialize with = ?

So if something has a 0 quota we&apos;re always going to check with the client?  We should probably only do this if it&apos;s not in the quota map, right?

&gt; +    if (quota == 0) {
&gt; +        quota = page-&gt;chrome()-&gt;client()-&gt;quotaForLocalStorage(sourceFrame);
&gt; +        syncRequired = true;
&gt; +    }
&gt;          
&gt; +    if (quota == 0)
&gt; +        return 0;
&gt; +    
&gt;      storageArea = LocalStorageArea::create(origin, this);
&gt; +    storageArea-&gt;setQuota(quota);
&gt;      m_storageAreaMap.set(origin, storageArea);
&gt; +    
&gt; +    if (syncRequired)
&gt; +    {
&gt; +        {
&gt; +            MutexLocker importLock(m_importLock);
&gt; +            m_securityOriginQuoteMap.set(origin, quota);
&gt; +        }
&gt; +        
&gt; +        {
&gt; +            MutexLocker syncLock(m_syncLock);
&gt; +            m_securityOriginsWaitingSync.set(origin, quota);
&gt; +        }
&gt; +        if (m_thread)
&gt; +            m_thread-&gt;scheduleSync(this);
&gt; +    }
&gt; +        
&gt;      return storageArea.release();
&gt;  }
&gt;  
&gt;  String LocalStorage::fullDatabaseFilename(SecurityOrigin* origin)
&gt;  {
&gt; -    // FIXME: Once we actually track origin/quota entries to see which origins have local storage established,
&gt; -    // we will return an empty path name if the origin isn&apos;t allowed to have LocalStorage.
&gt; -    // We&apos;ll need to wait here until the AreaImport task to complete before making that decision.
&gt; -
&gt;      if (m_path.isEmpty())
&gt;          return String();
&gt;  
&gt; @@ -124,18 +151,165 @@
&gt;      return pathByAppendingComponent(m_path, origin-&gt;databaseIdentifier() + &quot;.localstorage&quot;);
&gt;  }
&gt;  
&gt; +void LocalStorage::origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt; &gt;&amp; result)
&gt; +{
&gt; +    ASSERT(isMainThread());
&gt; +    waitForImportComplete();
&gt; +    MutexLocker importLock(m_importLock);
&gt; +    copyKeysToVector(m_securityOriginQuoteMap, result);
&gt; +}
&gt; +
&gt; +void LocalStorage::deleteStorageArea(SecurityOrigin* origin)
&gt; +{
&gt; +    ASSERT(isMainThread());
&gt; +    RefPtr&lt;LocalStorageArea&gt; storageArea = m_storageAreaMap.take(origin);
&gt; +    if (!storageArea)
&gt; +        return;
&gt; +    
&gt; +    // clear
&gt; +    storageArea-&gt;scheduleClear();
&gt; +    
&gt; +    // schedule removing from index database
&gt; +    {
&gt; +        MutexLocker syncLock(m_syncLock);
&gt; +        m_securityOriginsWaitingSync.set(origin, 0);
&gt; +    }
&gt; +    if (m_thread)
&gt; +        m_thread-&gt;scheduleSync(this);
&gt; +    
&gt; +    // kill the storageArea thread 
&gt; +    storageArea-&gt;scheduleFinalSync();
&gt; +    
&gt; +    //delete file in the file system
&gt; +    deleteFile(fullDatabaseFilename(origin));
&gt; +    
&gt; +    // remove from quota map
&gt; +    {
&gt; +        MutexLocker importLock(m_importLock);
&gt; +        m_securityOriginQuoteMap.take(origin);
&gt; +    }    
&gt; +}
&gt; +
&gt; +bool LocalStorage::openIndexDatabase()
&gt; +{
&gt; +    ASSERT(!isMainThread());
&gt; +    ASSERT(!m_database.isOpen());
&gt; +
&gt; +    if (m_path.isEmpty())
&gt; +        return false;
&gt; +    
&gt; +    if (!makeAllDirectories(m_path)) {
&gt; +        LOG_ERROR(&quot;Unabled to create LocalStorage database path %s&quot;, m_path.utf8().data());
&gt; +        return false;
&gt; +    }
&gt; +    
&gt; +    String databaseFilename = pathByAppendingComponent(m_path, &quot;localstorage.db&quot;);
&gt; +    if (databaseFilename.isEmpty()) {
&gt; +        LOG_ERROR(&quot;Filename for local storage index database is empty - local storage path %s&quot;, m_path.utf8().data());
&gt; +        return false;
&gt; +    }

This shouldn&apos;t be possible since we currently do not create a thread for storage when m_path is empty.  I think you can just use an assert.

&gt; +
&gt; +    if (!m_database.open(databaseFilename)) {
&gt; +        LOG_ERROR(&quot;Failed to open index database file %s for local storage&quot;, databaseFilename.utf8().data());
&gt; +        return false;
&gt; +    }
&gt; +
&gt; +    if (!m_database.executeCommand(&quot;CREATE TABLE IF NOT EXISTS Origins (origin TEXT UNIQUE ON CONFLICT REPLACE, quota INTEGER NOT NULL ON CONFLICT FAIL);&quot;)) {

What&apos;s this on conflict fail business?  That only applies when you use UNIQUE, right?

&gt; +        LOG_ERROR(&quot;Failed to create table Origins for local storage %s&quot;, m_path.utf8().data());
&gt; +        return false;
&gt; +    }
&gt; +    return true;
&gt; +}
&gt; +
&gt;  void LocalStorage::performImport()
&gt;  {
&gt;      ASSERT(!isMainThread());
&gt;  
&gt; -    // FIXME: Import all known local storage origins here along with their quotas
&gt; +    // Import all known local storage origins here along with their quotas
&gt; +    if (!openIndexDatabase()) {
&gt; +        markImported();
&gt; +        return;

I wonder if it&apos;s better for localStorage to operate as if privateBrowsing is true when import errors happen.  Otherwise transient failures could cause some really weird behaviors...especially if there were values in the database that we start to overwrite when we later sync.

&gt; +    }
&gt; +    
&gt; +    SQLiteStatement query(m_database, &quot;SELECT origin, quota FROM Origins&quot;);
&gt; +    if (query.prepare() != SQLResultOk) {
&gt; +        LOG_ERROR(&quot;Unable to select origins from Origins table for local storage %s&quot;, m_path.utf8().data());
&gt; +        markImported();
&gt; +        return;
&gt; +    }
&gt; +
&gt; +    int result;
&gt; +    SecurityOriginQuoteMap importedItemsMap;
&gt; +    while ((result = query.step()) == SQLResultRow) {
&gt; +        RefPtr&lt;SecurityOrigin&gt; origin = SecurityOrigin::createFromDatabaseIdentifier(query.getColumnText(0));
&gt; +        importedItemsMap.set(origin.get(), query.getColumnInt64(1));
&gt; +    }
&gt; +    
&gt; +    {
&gt; +        MutexLocker importLock(m_importLock);
&gt; +        m_securityOriginQuoteMap.swap(importedItemsMap);
&gt; +    }
&gt; +
&gt; +    if (result != SQLResultDone) {
&gt; +        LOG_ERROR(&quot;Error reading Origins from Origins table for local storage %s&quot;, m_path.utf8().data());
&gt; +        markImported();
&gt; +        return;
&gt; +    }
&gt; +    markImported();
&gt;  }
&gt;  
&gt;  void LocalStorage::performSync()
&gt;  {
&gt;      ASSERT(!isMainThread());
&gt;  
&gt; -    // FIXME: Write out new origins and quotas here
&gt; +    // Write out new origins and quotas here
&gt; +    
&gt; +    if (!m_database.isOpen())
&gt; +        return;
&gt; +
&gt; +    SQLiteStatement insertQuery(m_database, &quot;INSERT INTO Origins VALUES (?, ?)&quot;);
&gt; +    SQLiteStatement removeQuery(m_database, &quot;DELETE FROM Origins WHERE origin=?&quot;);
&gt; +    if (insertQuery.prepare() != SQLResultOk) {
&gt; +        LOG_ERROR(&quot;Failed to prepare insert statement - cannot write to local storage database %s&quot;, m_path.utf8().data());
&gt; +        return;
&gt; +    }
&gt; +    if (removeQuery.prepare() != SQLResultOk) {
&gt; +        LOG_ERROR(&quot;Failed to prepare insert statement - cannot write to local storage database %s&quot;, m_path.utf8().data());
&gt; +        return;
&gt; +    }
&gt; +    
&gt; +    SecurityOriginQuoteMap itemsToSync;
&gt; +    {
&gt; +        MutexLocker syncLock(m_syncLock);
&gt; +        m_securityOriginsWaitingSync.swap(itemsToSync);
&gt; +    }
&gt; +    
&gt; +    SecurityOriginQuoteMap::iterator end = itemsToSync.end();
&gt; +
&gt; +    for (SecurityOriginQuoteMap::iterator it = itemsToSync.begin(); it != end; ++it) {
&gt; +        if (it-&gt;second &gt; 0) {
&gt; +            insertQuery.bindText(1, it-&gt;first-&gt;databaseIdentifier());
&gt; +            insertQuery.bindInt64(2, it-&gt;second);
&gt; +    
&gt; +            int result = insertQuery.step();
&gt; +            if (result != SQLResultDone) {
&gt; +                LOG_ERROR(&quot;Failed to add origin to the local storage database %s - %i&quot;, m_path.utf8().data(), result);
&gt; +                break;
&gt; +            }
&gt; +            insertQuery.reset();
&gt; +        }
&gt; +        else {
&gt; +            removeQuery.bindText(1, it-&gt;first-&gt;databaseIdentifier());
&gt; +    
&gt; +            int result = removeQuery.step();
&gt; +            if (result != SQLResultDone) {
&gt; +                LOG_ERROR(&quot;Failed to remove origin from the local storage database %s - %i&quot;, m_path.utf8().data(), result);
&gt; +                break;
&gt; +            }
&gt; +            removeQuery.reset();
&gt; +        }
&gt; +    }
&gt; +    itemsToSync.clear();
&gt;  }
&gt;  
&gt;  void LocalStorage::close()
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123729</commentid>
    <comment_count>11</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2009-05-31 04:27:28 -0700</bug_when>
    <thetext>Also, this patch seems to be designed so that, on the first time a site is accessed which tries to use local storage, page-&gt;chrome()-&gt;client()-&gt;quotaForLocalStorage() is called.  From what I understand, this is to allow a browser to ask the client whether the app should be given space.  Is my understanding correct?

It seems like a better model might be to give them some default amount of space (which can be set to 0...probably put this into page-&gt;settings()?) and then do a callback any time they want to go beyond this space.  The browser could decide whether or not to ignore it or present it to the user.

I like this better because it&apos;d allow browsers to give sites a modest amount of space per site (where the definition of modest is decided by each browser...possibly 0 when space is tight or sites are not trusted) in return for the user being bugged less.  This also gives the browser full control over when to &quot;bug&quot; the user.

For example, lets say gmail used localStorage.  When I first load it up, it could store some basic machine-specific preferences without me being prompted.  Then, let&apos;s say that I wanted to sync my email box.  It&apos;d start storing data until the limit is hit.  My browser could then ask me if I wanted to give gmail more space.  If I choose yes, it&apos;d keep filling up until some other limit was hit (or maybe never if I told it I trust that origin).

In addition, there probably needs to be some interface to the quotas so that the browser can display the information to users and allow them to adjust the quota.  This makes me wonder if it should be in its own class.

Lastly, isn&apos;t there some other quota management already in WebKit?  It seems there probably should be some central way to manage this?  Definitely Database and maybe AppCache seem to fall into this category.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123830</commentid>
    <comment_count>12</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2009-06-01 06:15:19 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Also, this patch seems to be designed so that, on the first time a site is
&gt; accessed which tries to use local storage,
&gt; page-&gt;chrome()-&gt;client()-&gt;quotaForLocalStorage() is called.  From what I
&gt; understand, this is to allow a browser to ask the client whether the app should
&gt; be given space.  Is my understanding correct?
&gt; 
&gt; It seems like a better model might be to give them some default amount of space
&gt; (which can be set to 0...probably put this into page-&gt;settings()?) and then do
&gt; a callback any time they want to go beyond this space.  The browser could
&gt; decide whether or not to ignore it or present it to the user.
&gt; 
&gt; I like this better because it&apos;d allow browsers to give sites a modest amount of
&gt; space per site (where the definition of modest is decided by each
&gt; browser...possibly 0 when space is tight or sites are not trusted) in return
&gt; for the user being bugged less.  This also gives the browser full control over
&gt; when to &quot;bug&quot; the user.
&gt; 
&gt; For example, lets say gmail used localStorage.  When I first load it up, it
&gt; could store some basic machine-specific preferences without me being prompted. 
&gt; Then, let&apos;s say that I wanted to sync my email box.  It&apos;d start storing data
&gt; until the limit is hit.  My browser could then ask me if I wanted to give gmail
&gt; more space.  If I choose yes, it&apos;d keep filling up until some other limit was
&gt; hit (or maybe never if I told it I trust that origin).
&gt; 
&gt; In addition, there probably needs to be some interface to the quotas so that
&gt; the browser can display the information to users and allow them to adjust the
&gt; quota.  This makes me wonder if it should be in its own class.
&gt; 
&gt; Lastly, isn&apos;t there some other quota management already in WebKit?  It seems
&gt; there probably should be some central way to manage this?  Definitely Database
&gt; and maybe AppCache seem to fall into this category.
&gt; 


Thank you for a very thorough review. I will remove the review flag for now, as this obviously needs more work :-)
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152434</commentid>
    <comment_count>13</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2009-10-05 13:39:21 -0700</bug_when>
    <thetext>

*** This bug has been marked as a duplicate of bug 29991 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>25899</attachid>
            <date>2008-12-09 14:59:12 -0800</date>
            <delta_ts>2009-01-11 14:10:55 -0800</delta_ts>
            <desc>Setting a limit on local storage size.</desc>
            <filename>localstorage.patch</filename>
            <type>text/plain</type>
            <size>27928</size>
            <attacher name="Yael">yael</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwCShyZXZpc2lv
biAzOTAyNCkKKysrIFdlYktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMzYsNiArMTM2LDcgQEAKICAgICBRRmlsZTo6cmVtb3ZlKCJEYXRh
YmFzZXMuZGIiKTsKICAgICBRRGlyOjpjdXJyZW50KCkucm1kaXIoImh0dHBfd3d3Lm15ZXhhbXBs
ZS5jb21fMCIpOwogICAgIFFGaWxlOjpyZW1vdmUoImh0dHBfd3d3Lm15ZXhhbXBsZS5jb21fMC5s
b2NhbHN0b3JhZ2UiKTsKKyAgICBRRmlsZTo6cmVtb3ZlKCJsb2NhbHN0b3JhZ2UuZGIiKTsKIH0K
IAogY2xhc3MgTmF2aWdhdGlvblJlcXVlc3RPdmVycmlkZSA6IHB1YmxpYyBRV2ViUGFnZQpAQCAt
Mzg2LDcgKzM4NywxNiBAQAogICAgIG1fcGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNj
cmlwdCgidmFyIGRiMjsgZGIyPW9wZW5EYXRhYmFzZSgndGVzdGRiJywgJzEuMCcsICd0ZXN0IGRh
dGFiYXNlIEFQSScsIDUwMDAwKTsiKTsKICAgICBRVFJZX0NPTVBBUkUoc3B5LmNvdW50KCksMSk7
CiAKKyAgICBRU2lnbmFsU3B5IHNweUxvY2FsU3RvcmFnZShtX3BhZ2UsIFNJR05BTChxdW90YUZv
ckxvY2FsU3RvcmFnZShRV2ViRnJhbWUgKikpKTsKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNl
dExvY2FsU3RvcmFnZVF1b3RhKDApOworICAgIG1fcGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRl
SmF2YVNjcmlwdCgibG9jYWxTdG9yYWdlLnRlc3Q9J1RoaXMgbG9jYWwgc3RvcmFnZSB0ZXN0IHdp
bGwgZmFpbCc7Iik7CisgICAgUVRSWV9DT01QQVJFKHNweUxvY2FsU3RvcmFnZS5jb3VudCgpLCAx
KTsKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNldExvY2FsU3RvcmFnZVF1b3RhKDUwMDApOwor
ICAgIG1fcGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgibG9jYWxTdG9yYWdl
LnRlc3Q9J1RoaXMgaXMgZmlyc3Qgcm91bmQgb2YgdGhlIHRlc3QgZm9yIGxvY2FsIHN0b3JhZ2Un
OyIpOworICAgIFFUUllfQ09NUEFSRShzcHlMb2NhbFN0b3JhZ2UuY291bnQoKSwgMik7CiAgICAg
bV9wYWdlLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJsb2NhbFN0b3JhZ2UudGVz
dD0nVGhpcyBpcyBhIHRlc3QgZm9yIGxvY2FsIHN0b3JhZ2UnOyIpOworICAgIFFUUllfQ09NUEFS
RShzcHlMb2NhbFN0b3JhZ2UuY291bnQoKSwgMik7CisgICAgCiAgICAgbV92aWV3LT5zZXRIdG1s
KFFTdHJpbmcoIjxodG1sPjxib2R5IGlkPSdiJz50ZXh0PC9ib2R5PjwvaHRtbD4iKSwgUVVybCgi
aHR0cDovL3d3dy5teWV4YW1wbGUuY29tIikpOwogCiAgICAgUVZhcmlhbnQgczEgPSBtX3BhZ2Ut
Pm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoImxvY2FsU3RvcmFnZS50ZXN0Iik7Cklu
ZGV4OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAJKHJldmlz
aW9uIDM5MDI0KQorKysgV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzkxLDYgKzM5MSwxMiBAQAogICAgIGVtaXQgbV93ZWJQYWdl
LT5leGNlZWRlZERhdGFiYXNlUXVvdGEoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgZGF0
YWJhc2VOYW1lKTsKIH0KIAordW5zaWduZWQgbG9uZyBsb25nIENocm9tZUNsaWVudFF0OjpxdW90
YUZvckxvY2FsU3RvcmFnZShGcmFtZSogZnJhbWUpCit7CisgICAgZW1pdCBtX3dlYlBhZ2UtPnF1
b3RhRm9yTG9jYWxTdG9yYWdlKFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFtZSkpOworICAgIHJl
dHVybiBtX3dlYlBhZ2UtPnNldHRpbmdzKCktPmxvY2FsU3RvcmFnZVF1b3RhKCk7Cit9CisKIHZv
aWQgQ2hyb21lQ2xpZW50UXQ6OnJ1bk9wZW5QYW5lbChGcmFtZSogZnJhbWUsIFBhc3NSZWZQdHI8
RmlsZUNob29zZXI+IHBycEZpbGVDaG9vc2VyKQogewogICAgIC8vIEZJWE1FOiBTdXBwb3J0IG11
bHRpcGxlIGZpbGVzLgpJbmRleDogV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVu
dFF0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVu
dFF0LmgJKHJldmlzaW9uIDM5MDI0KQorKysgV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9t
ZUNsaWVudFF0LmgJKHdvcmtpbmcgY29weSkKQEAgLTExNCw2ICsxMTQsNyBAQAogICAgICAgICB2
aXJ0dWFsIHZvaWQgcHJpbnQoRnJhbWUqKTsKIAogICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZWVk
ZWREYXRhYmFzZVF1b3RhKEZyYW1lKiwgY29uc3QgU3RyaW5nJik7CisgICAgICAgIHZpcnR1YWwg
dW5zaWduZWQgbG9uZyBsb25nIHF1b3RhRm9yTG9jYWxTdG9yYWdlKEZyYW1lKik7CiAKICAgICAg
ICAgdmlydHVhbCB2b2lkIHJ1bk9wZW5QYW5lbChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29z
ZXI+KTsKIApJbmRleDogV2ViS2l0L3F0L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
cXQvQ2hhbmdlTG9nCShyZXZpc2lvbiAzOTE0NikKKysrIFdlYktpdC9xdC9DaGFuZ2VMb2cJKHdv
cmtpbmcgY29weSkKQEAgLTEsMyArMSwyNCBAQAorMjAwOC0xMi0wOSAgWWFlbCBBaGFyb24gIDx5
YWVsLmFoYXJvbkBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisgICAgICAgIEFQSSB0byBzdXBwb3J0IG1hbmFnaW5nIHRoZSBxdW90YSBvZiBsb2NhbHN0
b3JhZ2UuCisgICAgICAgIFRoaXMgaXMgdGhlIG1pbmltdW0gcmVxdWlyZWQgZm9yIHRlc3Rpbmcg
dGhlIGZlYXR1cmUuIAorICAgICAgICBNb3JlIGVuaGFuY2VtZW50cyB3aWxsIGNvbWUgbGF0ZXIu
CisKKyAgICAgICAgKiBBcGkvcXdlYnBhZ2UuY3BwOgorICAgICAgICAqIEFwaS9xd2VicGFnZS5o
OgorICAgICAgICAqIEFwaS9xd2Vic2V0dGluZ3MuY3BwOgorICAgICAgICAoUVdlYlNldHRpbmdz
OjpRV2ViU2V0dGluZ3MpOgorICAgICAgICAoUVdlYlNldHRpbmdzOjpzZXRMb2NhbFN0b3JhZ2VR
dW90YSk6CisgICAgICAgIChRV2ViU2V0dGluZ3M6OmxvY2FsU3RvcmFnZVF1b3RhKToKKyAgICAg
ICAgKiBBcGkvcXdlYnNldHRpbmdzLmg6CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvQ2hyb21l
Q2xpZW50UXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hyb21lQ2xpZW50UXQ6OnF1b3RhRm9y
TG9jYWxTdG9yYWdlKToKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5o
OgorICAgICAgICAqIHRlc3RzL3F3ZWJwYWdlL3RzdF9xd2VicGFnZS5jcHA6CisgICAgICAgICh0
c3RfUVdlYlBhZ2U6OmNsZWFudXBUZXN0Q2FzZSk6CisgICAgICAgICh0c3RfUVdlYlBhZ2U6OmRh
dGFiYXNlKToKKwogMjAwOC0xMi0wOSAgQXJpeWEgSGlkYXlhdCAgPGFyaXlhLmhpZGF5YXRAdHJv
bGx0ZWNoLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTaW1vbiBIYXVzbWFubi4KSW5kZXg6
IFdlYktpdC9xdC9BcGkvcXdlYnBhZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3
ZWJwYWdlLmgJKHJldmlzaW9uIDM5MDI0KQorKysgV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yNzUsNyArMjc1LDkgQEAKICAgICB2b2lkIG1pY3JvRm9jdXNDaGFu
Z2VkKCk7CiAgICAgdm9pZCBjb250ZW50c0NoYW5nZWQoKTsKICAgICB2b2lkIGV4Y2VlZGVkRGF0
YWJhc2VRdW90YShRV2ViRnJhbWUqIGZyYW1lLCBRU3RyaW5nIGRhdGFiYXNlTmFtZSk7CisgICAg
dm9pZCBxdW90YUZvckxvY2FsU3RvcmFnZShRV2ViRnJhbWUqIGZyYW1lKTsKIAorCiBwcm90ZWN0
ZWQ6CiAgICAgdmlydHVhbCBRV2ViUGFnZSAqY3JlYXRlV2luZG93KFdlYldpbmRvd1R5cGUgdHlw
ZSk7CiAgICAgdmlydHVhbCBRT2JqZWN0ICpjcmVhdGVQbHVnaW4oY29uc3QgUVN0cmluZyAmY2xh
c3NpZCwgY29uc3QgUVVybCAmdXJsLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1OYW1lcywgY29u
c3QgUVN0cmluZ0xpc3QgJnBhcmFtVmFsdWVzKTsKSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdlYnNl
dHRpbmdzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5jcHAJ
KHJldmlzaW9uIDM5MDI0KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8UVVybD4KICNpbmNsdWRlIDxR
RmlsZUluZm8+CiAKK2NvbnN0IHFpbnQ2NCBkZWZhdWx0RGF0YWJhc2VRdW90YSA9IDUgKiAxMDI0
ICogMTAyNDsKIGNsYXNzIFFXZWJTZXR0aW5nc1ByaXZhdGUKIHsKIHB1YmxpYzoKQEAgLTU1LDYg
KzU2LDcgQEAKICAgICBRU3RyaW5nIGxvY2FsU3RvcmFnZURhdGFiYXNlUGF0aDsKICAgICBRU3Ry
aW5nIG9mZmxpbmVXZWJBcHBsaWNhdGlvbkNhY2hlUGF0aDsKICAgICBxaW50NjQgb2ZmbGluZVN0
b3JhZ2VEZWZhdWx0UXVvdGE7CisgICAgcWludDY0IGxvY2FsU3RvcmFnZVF1b3RhOwogCiAgICAg
dm9pZCBhcHBseSgpOwogICAgIFdlYkNvcmU6OlNldHRpbmdzICpzZXR0aW5nczsKQEAgLTMyMiw4
ICszMjQsOCBAQAogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6T2ZmbGlu
ZVN0b3JhZ2VEYXRhYmFzZUVuYWJsZWQsIHRydWUpOwogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0
KFFXZWJTZXR0aW5nczo6T2ZmbGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVkLCB0cnVlKTsK
ICAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChRV2ViU2V0dGluZ3M6OkxvY2FsU3RvcmFnZURhdGFi
YXNlRW5hYmxlZCwgdHJ1ZSk7Ci0gICAgZC0+b2ZmbGluZVN0b3JhZ2VEZWZhdWx0UXVvdGEgPSA1
ICogMTAyNCAqIDEwMjQ7Ci0KKyAgICBkLT5vZmZsaW5lU3RvcmFnZURlZmF1bHRRdW90YSA9IGRl
ZmF1bHREYXRhYmFzZVF1b3RhOworICAgIGQtPmxvY2FsU3RvcmFnZVF1b3RhID0gZGVmYXVsdERh
dGFiYXNlUXVvdGE7CiB9CiAKIC8qIQpAQCAtMzMzLDYgKzMzNSw3IEBACiAgICAgOiBkKG5ldyBR
V2ViU2V0dGluZ3NQcml2YXRlKHNldHRpbmdzKSkKIHsKICAgICBkLT5zZXR0aW5ncyA9IHNldHRp
bmdzOworICAgIGQtPmxvY2FsU3RvcmFnZVF1b3RhID0gZGVmYXVsdERhdGFiYXNlUXVvdGE7CiAg
ICAgZC0+YXBwbHkoKTsKICAgICBhbGxTZXR0aW5ncygpLT5hcHBlbmQoZCk7CiB9CkBAIC03MzQs
MyArNzM3LDI1IEBACiAgICAgUVdlYlNldHRpbmdzUHJpdmF0ZSAqZ2xvYmFsID0gUVdlYlNldHRp
bmdzOjpnbG9iYWxTZXR0aW5ncygpLT5kOwogICAgIHJldHVybiBnbG9iYWwtPmxvY2FsU3RvcmFn
ZURhdGFiYXNlUGF0aDsKIH0KKworLyohCisgICAgU2V0cyB0aGUgcXVvdGEgZm9yIEhUTUw1IGxv
Y2FsIHN0b3JhZ2UgZGF0YWJhc2UgdG8gXGEgbWF4aW11bVNpemUuCisKKyAgICBTZXR0aW5nIGl0
IHRvIDAgZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisKKyAgICBcc2EgbG9jYWxTdG9yYWdlUXVvdGEo
KQorKi8KK3ZvaWQgUVdlYlNldHRpbmdzOjpzZXRMb2NhbFN0b3JhZ2VRdW90YShxaW50NjQgbWF4
aW11bVNpemUpCit7CisgICAgZC0+bG9jYWxTdG9yYWdlUXVvdGEgPSBtYXhpbXVtU2l6ZTsKK30K
KworLyohCisgICAgR2V0cyB0aGUgcXVvdGEgZm9yIEhUTUw1IGxvY2FsIHN0b3JhZ2UgZGF0YWJh
c2UgLgorCisgICAgXHNhIHNldExvY2FsU3RvcmFnZVF1b3RhKCkKKyovCitxaW50NjQgUVdlYlNl
dHRpbmdzOjpsb2NhbFN0b3JhZ2VRdW90YSgpCit7CisgICAgcmV0dXJuIGQtPmxvY2FsU3RvcmFn
ZVF1b3RhOworfQpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5oCShyZXZpc2lvbiAzOTAyNCkKKysrIFdl
YktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmgJKHdvcmtpbmcgY29weSkKQEAgLTExOCw2ICsxMTgs
OSBAQAogICAgIHZvaWQgc2V0TG9jYWxTdG9yYWdlRGF0YWJhc2VQYXRoKGNvbnN0IFFTdHJpbmcm
IHBhdGgpOwogICAgIFFTdHJpbmcgbG9jYWxTdG9yYWdlRGF0YWJhc2VQYXRoKCkgY29uc3Q7CiAK
KyAgICB2b2lkIHNldExvY2FsU3RvcmFnZVF1b3RhKHFpbnQ2NCBtYXhpbXVtU2l6ZSk7CisgICAg
cWludDY0IGxvY2FsU3RvcmFnZVF1b3RhKCk7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNz
IFFXZWJQYWdlUHJpdmF0ZTsKICAgICBmcmllbmQgY2xhc3MgUVdlYlNldHRpbmdzUHJpdmF0ZTsK
SW5kZXg6IFdlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9x
dC9BcGkvcXdlYnBhZ2UuY3BwCShyZXZpc2lvbiAzOTAyNCkKKysrIFdlYktpdC9xdC9BcGkvcXdl
YnBhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNTUzLDUgKzI1NTMsMTEgQEAKICAgICBhbmQg
dGhlIHF1b3RhIGFsbG9jYXRlZCB0byB0aGF0IHdlYiBzaXRlIGlzIGV4Y2VlZGVkLgogKi8KIAor
LyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnF1b3RhRm9yTG9jYWxTdG9yYWdlKFFXZWJGcmFt
ZSogZnJhbWUpOwogCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IGxvY2Fs
IHN0b3JhZ2UgYXJlYSBpcyBjcmVhdGVkIGFuZCB0aGUgcXVvdGEgYWxsb2NhdGVkIHRvIHRoYXQg
YXJlYSBpcyBzZXQuCisqLworCisKICNpbmNsdWRlICJtb2NfcXdlYnBhZ2UuY3BwIgpJbmRleDog
V2ViQ29yZS9zdG9yYWdlL1N0b3JhZ2VBcmVhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9y
YWdlL1N0b3JhZ2VBcmVhLmgJKHJldmlzaW9uIDM4ODYwKQorKysgV2ViQ29yZS9zdG9yYWdlL1N0
b3JhZ2VBcmVhLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDggQEAKICAgICAgICAgdmly
dHVhbCBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KSBjb25zdCB7IHJldHVybiBpbnRl
cm5hbENvbnRhaW5zKGtleSk7IH0KICAgICAgICAgCiAgICAgICAgIFNlY3VyaXR5T3JpZ2luKiBz
ZWN1cml0eU9yaWdpbigpIHsgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW4uZ2V0KCk7IH0KKyAgICAg
ICAgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhKCkgeyByZXR1cm4gbV9xdW90YTsgfQorICAgICAg
ICB2b2lkIHNldFF1b3RhKHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90YSkgeyBtX3F1b3RhID0gcXVv
dGE7IH0KIAogICAgIHByb3RlY3RlZDoKICAgICAgICAgU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmln
aW4qKTsKQEAgLTc2LDYgKzc4LDcgQEAKIAogICAgICAgICBSZWZQdHI8U2VjdXJpdHlPcmlnaW4+
IG1fc2VjdXJpdHlPcmlnaW47CiAgICAgICAgIFJlZlB0cjxTdG9yYWdlTWFwPiBtX3N0b3JhZ2VN
YXA7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtX3F1b3RhOwogICAgIH07CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TdG9yYWdlTWFwLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZU1hcC5jcHAJKHJldmlzaW9uIDM4
ODYwKQorKysgV2ViQ29yZS9zdG9yYWdlL1N0b3JhZ2VNYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zNiw2ICszNiw3IEBACiBTdG9yYWdlTWFwOjpTdG9yYWdlTWFwKCkKICAgICA6IG1faXRlcmF0
b3IobV9tYXAuZW5kKCkpCiAgICAgLCBtX2l0ZXJhdG9ySW5kZXgoVUlOVF9NQVgpCisgICAgLCBt
X3RvdGFsVXNhZ2UoMCkKIHsKIH0KIApAQCAtNDMsNiArNDQsNyBAQAogewogICAgIFJlZlB0cjxT
dG9yYWdlTWFwPiBuZXdNYXAgPSBjcmVhdGUoKTsKICAgICBuZXdNYXAtPm1fbWFwID0gbV9tYXA7
CisgICAgbmV3TWFwLT5tX3RvdGFsVXNhZ2UgPSBtX3RvdGFsVXNhZ2U7CiAgICAgcmV0dXJuIG5l
d01hcC5yZWxlYXNlKCk7CiB9CiAKQEAgLTExMyw5ICsxMTUsMTEgQEAKICAgICBpZiAoYWRkUmVz
dWx0LnNlY29uZCkgewogICAgICAgICAvLyBUaGVyZSB3YXMgbm8gIm9sZFZhbHVlIiBzbyBudWxs
IGl0IG91dC4KICAgICAgICAgb2xkVmFsdWUgPSBTdHJpbmcoKTsKKyAgICAgICAgbV90b3RhbFVz
YWdlICs9IChrZXkubGVuZ3RoKCkgKyB2YWx1ZS5sZW5ndGgoKSkgKiBzaXplb2YoVUNoYXIpOwog
ICAgIH0gZWxzZSB7CiAgICAgICAgIG9sZFZhbHVlID0gYWRkUmVzdWx0LmZpcnN0LT5zZWNvbmQ7
CiAgICAgICAgIGFkZFJlc3VsdC5maXJzdC0+c2Vjb25kID0gdmFsdWU7CisgICAgICAgIG1fdG90
YWxVc2FnZSA9IG1fdG90YWxVc2FnZSArIHZhbHVlLmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSAt
IG9sZFZhbHVlLmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKTsKICAgICB9CiAKICAgICBpbnZhbGlk
YXRlSXRlcmF0b3IoKTsKQEAgLTEzNCw4ICsxMzgsMTAgQEAKICAgICB9CiAKICAgICBvbGRWYWx1
ZSA9IG1fbWFwLnRha2Uoa2V5KTsKLSAgICBpZiAoIW9sZFZhbHVlLmlzTnVsbCgpKQorICAgIGlm
ICghb2xkVmFsdWUuaXNOdWxsKCkpIHsKICAgICAgICAgaW52YWxpZGF0ZUl0ZXJhdG9yKCk7Cisg
ICAgICAgIG1fdG90YWxVc2FnZSAtPSAoa2V5Lmxlbmd0aCgpICsgb2xkVmFsdWUubGVuZ3RoKCkp
ICogc2l6ZW9mKFVDaGFyKTsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTE1Myw2ICsx
NTksNyBAQAogCiAgICAgaWYgKHJlc3VsdC5zZWNvbmQpCiAgICAgICAgIHJlc3VsdC5maXJzdC0+
c2Vjb25kID0gdmFsdWUuY29weSgpOworICAgIG1fdG90YWxVc2FnZSArPSAoa2V5Lmxlbmd0aCgp
ICsgdmFsdWUubGVuZ3RoKCkpICogc2l6ZW9mKFVDaGFyKTsKIH0KIAogfQpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0xvY2FsU3RvcmFnZUFyZWEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvTG9jYWxTdG9yYWdlQXJlYS5oCShyZXZpc2lvbiAzODg2MCkKKysrIFdlYkNvcmUvc3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VBcmVhLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDYgKzQ5LDcgQEAKICAg
ICAgICAgc3RhdGljIFBhc3NSZWZQdHI8TG9jYWxTdG9yYWdlQXJlYT4gY3JlYXRlKFNlY3VyaXR5
T3JpZ2luKiBvcmlnaW4sIExvY2FsU3RvcmFnZSogbG9jYWxTdG9yYWdlKSB7IHJldHVybiBhZG9w
dFJlZihuZXcgTG9jYWxTdG9yYWdlQXJlYShvcmlnaW4sIGxvY2FsU3RvcmFnZSkpOyB9CiAKICAg
ICAgICAgdm9pZCBzY2hlZHVsZUZpbmFsU3luYygpOworICAgICAgICB2b2lkIHdhaXRGb3JJbXBv
cnRDb21wbGV0ZSgpIGNvbnN0OwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTG9jYWxTdG9yYWdl
QXJlYShTZWN1cml0eU9yaWdpbiosIExvY2FsU3RvcmFnZSopOwpJbmRleDogV2ViQ29yZS9zdG9y
YWdlL0xvY2FsU3RvcmFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9Mb2NhbFN0
b3JhZ2UuaAkocmV2aXNpb24gMzg4NjApCisrKyBXZWJDb3JlL3N0b3JhZ2UvTG9jYWxTdG9yYWdl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJMb2NhbFN0b3Jh
Z2VUYXNrLmgiCiAjaW5jbHVkZSAiTG9jYWxTdG9yYWdlVGhyZWFkLmgiCiAjaW5jbHVkZSAiU2Vj
dXJpdHlPcmlnaW5IYXNoLmgiCisjaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKIAogI2luY2x1
ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KQEAgLTYwLDYgKzYx
LDkgQEAKICAgICAgICAgTG9jYWxTdG9yYWdlQXJlYU1hcCBtX3N0b3JhZ2VBcmVhTWFwOwogCiAg
ICAgICAgIFJlZlB0cjxMb2NhbFN0b3JhZ2VUaHJlYWQ+IG1fdGhyZWFkOworICAgICAgICB2b2lk
IHdhaXRGb3JJbXBvcnRDb21wbGV0ZSgpIGNvbnN0OworICAgICAgICB2b2lkIG1hcmtJbXBvcnRl
ZCgpOworICAgICAgICBib29sIG9wZW5JbmRleERhdGFiYXNlKCk7CiAKICAgICAvLyBUaGUgZm9s
bG93aW5nIG1lbWJlcnMgYXJlIHN1YmplY3QgdG8gdGhyZWFkIHN5bmNocm9uaXphdGlvbiBpc3N1
ZXMKICAgICBwdWJsaWM6CkBAIC03MSw5ICs3NSwxNSBAQAogCiAgICAgcHJpdmF0ZToKICAgICAg
ICAgU3RyaW5nIG1fcGF0aDsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKIAog
ICAgICAgICB0eXBlZGVmIEhhc2hNYXA8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwgdW5zaWduZWQg
bG9uZyBsb25nLCBTZWN1cml0eU9yaWdpbkhhc2g+IFNlY3VyaXR5T3JpZ2luUXVvdGVNYXA7CiAg
ICAgICAgIFNlY3VyaXR5T3JpZ2luUXVvdGVNYXAgbV9zZWN1cml0eU9yaWdpblF1b3RlTWFwOwor
ICAgICAgICBTZWN1cml0eU9yaWdpblF1b3RlTWFwIG1fc2VjdXJpdHlPcmlnaW5zV2FpdGluZ1N5
bmM7CisgICAgICAgIG11dGFibGUgTXV0ZXggbV9pbXBvcnRMb2NrOworICAgICAgICBtdXRhYmxl
IE11dGV4IG1fc3luY0xvY2s7CisgICAgICAgIG11dGFibGUgYm9vbCBtX2ltcG9ydENvbXBsZXRl
OworICAgICAgICBtdXRhYmxlIFRocmVhZENvbmRpdGlvbiBtX2ltcG9ydENvbmRpdGlvbjsKICAg
ICB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU3Rv
cmFnZUFyZWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9TdG9yYWdlQXJlYS5j
cHAJKHJldmlzaW9uIDM4ODYwKQorKysgV2ViQ29yZS9zdG9yYWdlL1N0b3JhZ2VBcmVhLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzYsNiArMzYsNyBAQAogU3RvcmFnZUFyZWE6OlN0b3JhZ2VBcmVh
KFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiAgICAgOiBtX3NlY3VyaXR5T3JpZ2luKG9yaWdpbikK
ICAgICAsIG1fc3RvcmFnZU1hcChTdG9yYWdlTWFwOjpjcmVhdGUoKSkKKyAgICAsIG1fcXVvdGEo
VUlOVF9NQVgpIC8vIHNlc3Npb25TdG9yYWdlIHNob3VsZCBiZSB1bmxpbWl0ZWQKIHsKIH0KIApA
QCAtNzUsMTQgKzc2LDE4IEBACiB7CiAgICAgQVNTRVJUKCF2YWx1ZS5pc051bGwoKSk7CiAgICAg
Ci0gICAgLy8gRklYTUU6IEZvciBMb2NhbFN0b3JhZ2Ugd2hlcmUgYSBkaXNrIHF1b3RhIHdpbGwg
YmUgZW5mb3JjZWQsIGhlcmUgaXMgd2hlcmUgd2UgbmVlZCB0byBkbyBxdW90YSBjaGVja2luZy4K
LSAgICAvLyAgICAgICAgSWYgd2UgZGVjaWRlIHRvIGVuZm9yY2UgYSBtZW1vcnkgcXVvdGEgZm9y
IFNlc3Npb25TdG9yYWdlLCB0aGlzIGlzIHdoZXJlIHdlJ2QgZG8gdGhhdCwgYWxzby4KLSAgICAv
LyBpZiAoPG92ZXIgcXVvdGE+KSB7Ci0gICAgLy8gICAgIGVjID0gSU5WQUxJRF9BQ0NFU1NfRVJS
OwotICAgIC8vICAgICByZXR1cm47Ci0gICAgLy8gfQotICAgIAotICAgIFN0cmluZyBvbGRWYWx1
ZTsgICAKKyAgICBTdHJpbmcgb2xkVmFsdWUgPSBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5KTsg
ICAKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdXNhZ2UgPSBtX3N0b3JhZ2VNYXAtPnRvdGFsVXNh
Z2UoKTsKKyAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgdXNhZ2UgPSB1c2Fn
ZSArIHZhbHVlLmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSAtIG9sZFZhbHVlLmxlbmd0aCgpICog
c2l6ZW9mKFVDaGFyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHVzYWdlICs9IChrZXku
bGVuZ3RoKCkgKyB2YWx1ZS5sZW5ndGgoKSkgKiBzaXplb2YoVUNoYXIpOworICAgIH0KKyAgICBp
ZiAodXNhZ2UgPiBtX3F1b3RhKSB7CisgICAgICAgIGVjID0gUVVPVEFfRVhDRUVERURfRVJSOwor
ICAgICAgICByZXR1cm47CisgICAgfQogICAgIFJlZlB0cjxTdG9yYWdlTWFwPiBuZXdNYXAgPSBt
X3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUpOwogICAgIAogICAgIGlm
IChuZXdNYXApCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZU1hcC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvc3RvcmFnZS9TdG9yYWdlTWFwLmgJKHJldmlzaW9uIDM4ODYwKQorKysgV2Vi
Q29yZS9zdG9yYWdlL1N0b3JhZ2VNYXAuaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsOCBA
QAogICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KSBjb25zdDsKIAogICAg
ICAgICB2b2lkIGltcG9ydEl0ZW0oY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUpIGNvbnN0OworICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsVXNh
Z2UoKSB7IHJldHVybiBtX3RvdGFsVXNhZ2U7IH0KIAogICAgIHByaXZhdGU6CiAgICAgICAgIFN0
b3JhZ2VNYXAoKTsKQEAgLTU4LDYgKzYwLDcgQEAKICAgICAgICAgbXV0YWJsZSBIYXNoTWFwPFN0
cmluZywgU3RyaW5nPiBtX21hcDsKICAgICAgICAgbXV0YWJsZSBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPjo6aXRlcmF0b3IgbV9pdGVyYXRvcjsKICAgICAgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2l0
ZXJhdG9ySW5kZXg7CisgICAgICAgIG11dGFibGUgdW5zaWduZWQgbG9uZyBsb25nIG1fdG90YWxV
c2FnZTsKICAgICB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvTG9jYWxTdG9yYWdlQXJlYS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdl
L0xvY2FsU3RvcmFnZUFyZWEuY3BwCShyZXZpc2lvbiAzODg2MCkKKysrIFdlYkNvcmUvc3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VBcmVhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzMsMzkgKzczLDMzIEBA
CiAgICAgbV9maW5hbFN5bmNTY2hlZHVsZWQgPSB0cnVlOwogfQogCi11bnNpZ25lZCBMb2NhbFN0
b3JhZ2VBcmVhOjpsZW5ndGgoKSBjb25zdAordm9pZCBMb2NhbFN0b3JhZ2VBcmVhOjp3YWl0Rm9y
SW1wb3J0Q29tcGxldGUoKSBjb25zdAogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAK
ICAgICBpZiAobV9pbXBvcnRDb21wbGV0ZSkKLSAgICAgICAgcmV0dXJuIGludGVybmFsTGVuZ3Ro
KCk7CisgICAgICAgIHJldHVybjsKIAogICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2ltcG9ydExv
Y2spOwogICAgIGlmIChtX2ltcG9ydENvbXBsZXRlKQotICAgICAgICByZXR1cm4gaW50ZXJuYWxM
ZW5ndGgoKTsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgd2hpbGUgKCFtX2ltcG9ydENvbXBsZXRl
KQogICAgICAgICBtX2ltcG9ydENvbmRpdGlvbi53YWl0KG1faW1wb3J0TG9jayk7CiAgICAgQVNT
RVJUKG1faW1wb3J0Q29tcGxldGUpOworfQorCit1bnNpZ25lZCBMb2NhbFN0b3JhZ2VBcmVhOjps
ZW5ndGgoKSBjb25zdAoreworICAgIHdhaXRGb3JJbXBvcnRDb21wbGV0ZSgpOwogICAgIAogICAg
IHJldHVybiBpbnRlcm5hbExlbmd0aCgpOwogfQogCiBTdHJpbmcgTG9jYWxTdG9yYWdlQXJlYTo6
a2V5KHVuc2lnbmVkIGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QKIHsKLSAgICBBU1NF
UlQoaXNNYWluVGhyZWFkKCkpOworICAgIHdhaXRGb3JJbXBvcnRDb21wbGV0ZSgpOwogCi0gICAg
aWYgKG1faW1wb3J0Q29tcGxldGUpCi0gICAgICAgIHJldHVybiBpbnRlcm5hbEtleShpbmRleCwg
ZWMpOwotCi0gICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1faW1wb3J0TG9jayk7Ci0gICAgaWYgKG1f
aW1wb3J0Q29tcGxldGUpCi0gICAgICAgIHJldHVybiBpbnRlcm5hbEtleShpbmRleCwgZWMpOwot
Ci0gICAgd2hpbGUgKCFtX2ltcG9ydENvbXBsZXRlKQotICAgICAgICBtX2ltcG9ydENvbmRpdGlv
bi53YWl0KG1faW1wb3J0TG9jayk7Ci0gICAgQVNTRVJUKG1faW1wb3J0Q29tcGxldGUpOwotCiAg
ICAgcmV0dXJuIGludGVybmFsS2V5KGluZGV4LCBlYyk7CiB9CiAKQEAgLTEzMywxNCArMTI3LDgg
QEAKIAogdm9pZCBMb2NhbFN0b3JhZ2VBcmVhOjpzZXRJdGVtKGNvbnN0IFN0cmluZyYga2V5LCBj
b25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYywgRnJhbWUqIGZyYW1lKQogewot
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0KLSAgICBpZiAobV9pbXBvcnRDb21wbGV0ZSkg
ewotICAgICAgICBpbnRlcm5hbFNldEl0ZW0oa2V5LCB2YWx1ZSwgZWMsIGZyYW1lKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2ltcG9ydExvY2sp
OworICAgIC8vIEluIG9yZGVyIHRvIGVuZm9yY2UgdGhlIHF1b3RhLCB3ZSBoYXZlIHRvIGZpbmlz
aCB0aGUgYXJlYSBpbXBvcnQgYmVmb3JlIHNldEl0ZW0gY2FuIHRha2UgcGxhY2UKKyAgICB3YWl0
Rm9ySW1wb3J0Q29tcGxldGUoKTsKICAgICBpbnRlcm5hbFNldEl0ZW0oa2V5LCB2YWx1ZSwgZWMs
IGZyYW1lKTsKIH0KIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL0xvY2FsU3RvcmFnZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0xvY2FsU3RvcmFnZS5jcHAJKHJldmlzaW9uIDM4
ODYwKQorKysgV2ViQ29yZS9zdG9yYWdlL0xvY2FsU3RvcmFnZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJMb2NhbFN0
b3JhZ2UuaCIKIAorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgogI2luY2x1ZGUgIkNTdHJpbmcu
aCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgpAQCAt
MzQsNiArMzUsNyBAQAogI2luY2x1ZGUgIkxvY2FsU3RvcmFnZUFyZWEuaCIKICNpbmNsdWRlICJQ
YWdlLmgiCiAjaW5jbHVkZSAiUGFnZUdyb3VwLmgiCisjaW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50
LmgiCiAjaW5jbHVkZSAiU3RvcmFnZUFyZWEuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+CiAKQEAgLTYyLDYgKzY0LDcgQEAKIAogTG9jYWxTdG9yYWdlOjpMb2NhbFN0b3JhZ2UoY29u
c3QgU3RyaW5nJiBwYXRoKQogICAgIDogbV9wYXRoKHBhdGguY29weSgpKQorICAgICwgbV9pbXBv
cnRDb21wbGV0ZShmYWxzZSkKIHsKICAgICAvLyBJZiB0aGUgcGF0aCBpcyBlbXB0eSwgd2Uga25v
dyB3ZSdyZSBuZXZlciBnb2luZyB0byBiZSB1c2luZyB0aGUgdGhyZWFkIGZvciBhbnl0aGluZywg
c28gZG9uJ3Qgc3RhcnQgaXQuCiAgICAgLy8gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWxzbyB3
YW50IHRvIGNvbnNpZGVyIHJlbW92aW5nIGl0IGZyb20gdGhlIERPTSBpbiB0aGF0IGNhc2UgLSA8
cmRhcjovL3Byb2JsZW0vNTk2MDQ3MD4KQEAgLTc2LDYgKzc5LDcgQEAKIExvY2FsU3RvcmFnZTo6
fkxvY2FsU3RvcmFnZSgpCiB7CiAgICAgQVNTRVJUKGxvY2FsU3RvcmFnZU1hcCgpLmdldChtX3Bh
dGgpID09IHRoaXMpOworICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKICAgICBsb2NhbFN0b3JhZ2VN
YXAoKS5yZW1vdmUobV9wYXRoKTsKIH0KIApAQCAtODMsMzIgKzg3LDUwIEBACiB7CiAgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKIAotICAgIC8vIEZJWE1FOiBJZiB0aGUgc2VjdXJpdHkgb3Jp
Z2luIGluIHF1ZXN0aW9uIGhhcyBuZXZlciBoYWQgYSBzdG9yYWdlIGFyZWEgZXN0YWJsaXNoZWQs
Ci0gICAgLy8gd2UgbmVlZCB0byBhc2sgYSBjbGllbnQgY2FsbCBpZiBlc3RhYmxpc2hpbmcgaXQg
aXMgb2theS4gIElmIHRoZSBjbGllbnQgZGVuaWVzIHRoZSByZXF1ZXN0LAotICAgIC8vIHRoaXMg
bWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuCi0gICAgLy8gVGhlIHNvdXJjZUZyYW1lIGFyZ3VtZW50
IGV4aXN0cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNraW5nIGEgY2xpZW50LgotICAgIC8vIFRvIGtu
b3cgaWYgYW4gYXJlYSBoYXMgcHJldmlvdXNseSBiZWVuIGVzdGFibGlzaGVkLCB3ZSBuZWVkIHRv
IHdhaXQgdW50aWwgdGhpcyBMb2NhbFN0b3JhZ2UgCi0gICAgLy8gb2JqZWN0IGhhcyBmaW5pc2hl
ZCBpdCdzIEFyZWFJbXBvcnQgdGFzay4KLQotCi0gICAgLy8gRklYTUU6IElmIHRoZSBzdG9yYWdl
IGFyZWEgaXMgYmVpbmcgZXN0YWJsaXNoZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGhlcmUsIHdlIG5l
ZWQgdG8gCi0gICAgLy8gc3luYyBpdHMgZXhpc3RhbmNlIGFuZCBxdW90YSBvdXQgdG8gZGlzayB2
aWEgYW4gdGFzayBvZiB0eXBlIEFyZWFTeW5jCi0KICAgICBSZWZQdHI8TG9jYWxTdG9yYWdlQXJl
YT4gc3RvcmFnZUFyZWE7CiAgICAgaWYgKHN0b3JhZ2VBcmVhID0gbV9zdG9yYWdlQXJlYU1hcC5n
ZXQob3JpZ2luKSkKICAgICAgICAgcmV0dXJuIHN0b3JhZ2VBcmVhLnJlbGVhc2UoKTsKKyAgICAv
LyB3YWl0IGZvciBpbXBvcnQgdG8gY29tcGxldGUgYmVmb3JlIHdlIGtub3cgaWYgdGhpcyBvcmln
aW4gYWxyZWFkeSBoYXMgYSBxdW90YSBhc3NvY2lhdGVkIHdpdGggaXQKKyAgICB3YWl0Rm9ySW1w
b3J0Q29tcGxldGUoKTsKKyAgICAKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgcXVvdGE7CisgICAg
CisgICAgeworICAgICAgICBNdXRleExvY2tlciBpbXBvcnRMb2NrKG1faW1wb3J0TG9jayk7Cisg
ICAgICAgIHF1b3RhID0gIG1fc2VjdXJpdHlPcmlnaW5RdW90ZU1hcC5nZXQob3JpZ2luKTsKKyAg
ICB9CisgICAgCisgICAgUGFnZSogcGFnZSA9IHNvdXJjZUZyYW1lLT5wYWdlKCk7CisgICAgQVNT
RVJUKHBhZ2UpOworICAgIAorICAgIGJvb2wgc3luY1JlcXVpcmVkKGZhbHNlKTsKKyAgICBpZiAo
cXVvdGEgPT0gMCkgeworICAgICAgICBxdW90YSA9IHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+
cXVvdGFGb3JMb2NhbFN0b3JhZ2Uoc291cmNlRnJhbWUpOworICAgICAgICBzeW5jUmVxdWlyZWQg
PSB0cnVlOworICAgIH0KICAgICAgICAgCisgICAgaWYgKHF1b3RhID09IDApCisgICAgICAgIHJl
dHVybiAwOworICAgIAogICAgIHN0b3JhZ2VBcmVhID0gTG9jYWxTdG9yYWdlQXJlYTo6Y3JlYXRl
KG9yaWdpbiwgdGhpcyk7CisgICAgc3RvcmFnZUFyZWEtPnNldFF1b3RhKHF1b3RhKTsKICAgICBt
X3N0b3JhZ2VBcmVhTWFwLnNldChvcmlnaW4sIHN0b3JhZ2VBcmVhKTsKKyAgICAKKyAgICBpZiAo
c3luY1JlcXVpcmVkKQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhMb2NrZXIg
c3luY0xvY2sobV9zeW5jTG9jayk7CisgICAgICAgICAgICBtX3NlY3VyaXR5T3JpZ2luc1dhaXRp
bmdTeW5jLnNldChvcmlnaW4sIHF1b3RhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV90aHJl
YWQpCisgICAgICAgICAgICBtX3RocmVhZC0+c2NoZWR1bGVTeW5jKHRoaXMpOworICAgIH0KKyAg
ICAgICAgCiAgICAgcmV0dXJuIHN0b3JhZ2VBcmVhLnJlbGVhc2UoKTsKIH0KIAogU3RyaW5nIExv
Y2FsU3RvcmFnZTo6ZnVsbERhdGFiYXNlRmlsZW5hbWUoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikK
IHsKLSAgICAvLyBGSVhNRTogT25jZSB3ZSBhY3R1YWxseSB0cmFjayBvcmlnaW4vcXVvdGEgZW50
cmllcyB0byBzZWUgd2hpY2ggb3JpZ2lucyBoYXZlIGxvY2FsIHN0b3JhZ2UgZXN0YWJsaXNoZWQs
Ci0gICAgLy8gd2Ugd2lsbCByZXR1cm4gYW4gZW1wdHkgcGF0aCBuYW1lIGlmIHRoZSBvcmlnaW4g
aXNuJ3QgYWxsb3dlZCB0byBoYXZlIExvY2FsU3RvcmFnZS4KLSAgICAvLyBXZSdsbCBuZWVkIHRv
IHdhaXQgaGVyZSB1bnRpbCB0aGUgQXJlYUltcG9ydCB0YXNrIHRvIGNvbXBsZXRlIGJlZm9yZSBt
YWtpbmcgdGhhdCBkZWNpc2lvbi4KLQogICAgIGlmIChtX3BhdGguaXNFbXB0eSgpKQogICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7CiAKQEAgLTEyNCwxOCArMTQ2LDExMCBAQAogICAgIHJldHVybiBw
YXRoQnlBcHBlbmRpbmdDb21wb25lbnQobV9wYXRoLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmll
cigpICsgIi5sb2NhbHN0b3JhZ2UiKTsKIH0KIAorYm9vbCBMb2NhbFN0b3JhZ2U6Om9wZW5JbmRl
eERhdGFiYXNlKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQo
IW1fZGF0YWJhc2UuaXNPcGVuKCkpOworCisgICAgaWYgKG1fcGF0aC5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhtX3Bh
dGgpKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlZCB0byBjcmVhdGUgTG9jYWxTdG9yYWdl
IGRhdGFiYXNlIHBhdGggJXMiLCBtX3BhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgCisgICAgU3RyaW5nIGRhdGFiYXNlRmlsZW5hbWUgPSBwYXRo
QnlBcHBlbmRpbmdDb21wb25lbnQobV9wYXRoLCAibG9jYWxzdG9yYWdlLmRiIik7CisgICAgaWYg
KGRhdGFiYXNlRmlsZW5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIExPR19FUlJPUigiRmlsZW5h
bWUgZm9yIGxvY2FsIHN0b3JhZ2UgaW5kZXggZGF0YWJhc2UgaXMgZW1wdHkgLSBsb2NhbCBzdG9y
YWdlIHBhdGggJXMiLCBtX3BhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICBpZiAoIW1fZGF0YWJhc2Uub3BlbihkYXRhYmFzZUZpbGVuYW1lKSkg
eworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGluZGV4IGRhdGFiYXNlIGZpbGUg
JXMgZm9yIGxvY2FsIHN0b3JhZ2UiLCBkYXRhYmFzZUZpbGVuYW1lLnV0ZjgoKS5kYXRhKCkpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1
dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBPcmlnaW5zIChvcmlnaW4gVEVY
VCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgcXVvdGEgSU5URUdFUiBOT1QgTlVMTCBPTiBD
T05GTElDVCBGQUlMKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUg
dGFibGUgT3JpZ2lucyBmb3IgbG9jYWwgc3RvcmFnZSAlcyIsIG1fcGF0aC51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwog
dm9pZCBMb2NhbFN0b3JhZ2U6OnBlcmZvcm1JbXBvcnQoKQogewogICAgIEFTU0VSVCghaXNNYWlu
VGhyZWFkKCkpOwogCi0gICAgLy8gRklYTUU6IEltcG9ydCBhbGwga25vd24gbG9jYWwgc3RvcmFn
ZSBvcmlnaW5zIGhlcmUgYWxvbmcgd2l0aCB0aGVpciBxdW90YXMKKyAgICAvLyBJbXBvcnQgYWxs
IGtub3duIGxvY2FsIHN0b3JhZ2Ugb3JpZ2lucyBoZXJlIGFsb25nIHdpdGggdGhlaXIgcXVvdGFz
CisgICAgaWYgKCFvcGVuSW5kZXhEYXRhYmFzZSgpKSB7CisgICAgICAgIG1hcmtJbXBvcnRlZCgp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVy
eShtX2RhdGFiYXNlLCAiU0VMRUNUIG9yaWdpbiwgcXVvdGEgRlJPTSBPcmlnaW5zIik7CisgICAg
aWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICBMT0dfRVJST1Io
IlVuYWJsZSB0byBzZWxlY3Qgb3JpZ2lucyBmcm9tIE9yaWdpbnMgdGFibGUgZm9yIGxvY2FsIHN0
b3JhZ2UgJXMiLCBtX3BhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIG1hcmtJbXBvcnRlZCgp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHJlc3VsdDsKKyAgICBTZWN1cml0
eU9yaWdpblF1b3RlTWFwIGltcG9ydGVkSXRlbXNNYXA7CisgICAgd2hpbGUgKChyZXN1bHQgPSBx
dWVyeS5zdGVwKCkpID09IFNRTFJlc3VsdFJvdykgeworICAgICAgICBSZWZQdHI8U2VjdXJpdHlP
cmlnaW4+IG9yaWdpbiA9IFNlY3VyaXR5T3JpZ2luOjpjcmVhdGVGcm9tRGF0YWJhc2VJZGVudGlm
aWVyKHF1ZXJ5LmdldENvbHVtblRleHQoMCkpOworICAgICAgICBpbXBvcnRlZEl0ZW1zTWFwLnNl
dChvcmlnaW4uZ2V0KCksIHF1ZXJ5LmdldENvbHVtbkludDY0KDEpKTsKKyAgICB9CisgICAgCisg
ICAgeworICAgICAgICBNdXRleExvY2tlciBpbXBvcnRMb2NrKG1faW1wb3J0TG9jayk7CisgICAg
ICAgIG1fc2VjdXJpdHlPcmlnaW5RdW90ZU1hcC5zd2FwKGltcG9ydGVkSXRlbXNNYXApOworICAg
IH0KKworICAgIGlmIChyZXN1bHQgIT0gU1FMUmVzdWx0RG9uZSkgeworICAgICAgICBMT0dfRVJS
T1IoIkVycm9yIHJlYWRpbmcgT3JpZ2lucyBmcm9tIE9yaWdpbnMgdGFibGUgZm9yIGxvY2FsIHN0
b3JhZ2UgJXMiLCBtX3BhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIG1hcmtJbXBvcnRlZCgp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1hcmtJbXBvcnRlZCgpOwogfQogCiB2b2lk
IExvY2FsU3RvcmFnZTo6cGVyZm9ybVN5bmMoKQogewogICAgIEFTU0VSVCghaXNNYWluVGhyZWFk
KCkpOwogCi0gICAgLy8gRklYTUU6IFdyaXRlIG91dCBuZXcgb3JpZ2lucyBhbmQgcXVvdGFzIGhl
cmUKKyAgICAvLyBXcml0ZSBvdXQgbmV3IG9yaWdpbnMgYW5kIHF1b3RhcyBoZXJlCisgICAgCisg
ICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBTUUxp
dGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIklOU0VSVCBJTlRPIE9yaWdpbnMgVkFMVUVT
ICg/LCA/KSIpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBpbnNlcnQgc3RhdGVtZW50IC0gY2Fu
bm90IHdyaXRlIHRvIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgJXMiLCBtX3BhdGgudXRmOCgpLmRh
dGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgU2VjdXJpdHlPcmlnaW5R
dW90ZU1hcCBpdGVtc1RvU3luYzsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIHN5bmNMb2Nr
KG1fc3luY0xvY2spOworICAgICAgICBtX3NlY3VyaXR5T3JpZ2luc1dhaXRpbmdTeW5jLnN3YXAo
aXRlbXNUb1N5bmMpOworICAgIH0KKyAgICAKKyAgICBTZWN1cml0eU9yaWdpblF1b3RlTWFwOjpp
dGVyYXRvciBlbmQgPSBpdGVtc1RvU3luYy5lbmQoKTsKKworICAgIGZvciAoU2VjdXJpdHlPcmln
aW5RdW90ZU1hcDo6aXRlcmF0b3IgaXQgPSBpdGVtc1RvU3luYy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKworICAgICAgICBxdWVyeS5iaW5kVGV4dCgxLCBpdC0+Zmlyc3QtPmRhdGFiYXNl
SWRlbnRpZmllcigpKTsKKyAgICAgICAgcXVlcnkuYmluZEludDY0KDIsIGl0LT5zZWNvbmQpOwor
CisgICAgICAgIGludCByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CisgICAgICAgIGlmIChyZXN1bHQg
IT0gU1FMUmVzdWx0RG9uZSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gdXBk
YXRlIGl0ZW0gaW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgJXMgLSAlaSIsIG1fcGF0aC51
dGY4KCkuZGF0YSgpLCByZXN1bHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgcXVlcnkucmVzZXQoKTsKKyAgICB9CisgICAgaXRlbXNUb1N5bmMuY2xlYXIoKTsKIH0K
IAogdm9pZCBMb2NhbFN0b3JhZ2U6OmNsb3NlKCkKQEAgLTE2OSw0ICsyODMsMjkgQEAKICAgICAg
ICAgbV90aHJlYWQtPnNjaGVkdWxlU3luYyhhcmVhKTsKIH0KIAordm9pZCBMb2NhbFN0b3JhZ2U6
OndhaXRGb3JJbXBvcnRDb21wbGV0ZSgpIGNvbnN0Cit7CisgICAgQVNTRVJUKGlzTWFpblRocmVh
ZCgpKTsKKworICAgIGlmIChtX2ltcG9ydENvbXBsZXRlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBNdXRleExvY2tlciBsb2NrZXIobV9pbXBvcnRMb2NrKTsKKyAgICBpZiAobV9pbXBvcnRDb21w
bGV0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKCFtX2ltcG9ydENvbXBsZXRlKQor
ICAgICAgICBtX2ltcG9ydENvbmRpdGlvbi53YWl0KG1faW1wb3J0TG9jayk7CisgICAgQVNTRVJU
KG1faW1wb3J0Q29tcGxldGUpOworfQorCit2b2lkIExvY2FsU3RvcmFnZTo6bWFya0ltcG9ydGVk
KCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIE11dGV4TG9ja2VyIGxv
Y2tlcihtX2ltcG9ydExvY2spOworICAgIG1faW1wb3J0Q29tcGxldGUgPSB0cnVlOworICAgIG1f
aW1wb3J0Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL2RvbS9FeGNlcHRpb25Db2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2RvbS9FeGNlcHRpb25Db2RlLmNwcAkocmV2aXNpb24gMzg4NjApCisrKyBXZWJDb3JlL2RvbS9F
eGNlcHRpb25Db2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTgsNyArNTgsMTEgQEAKICAgICAi
SU5WQUxJRF9BQ0NFU1NfRVJSIiwKICAgICAiVkFMSURBVElPTl9FUlIiLAogICAgICJUWVBFX01J
U01BVENIX0VSUiIsCi0gICAgIlNFQ1VSSVRZX0VSUiIKKyAgICAiU0VDVVJJVFlfRVJSIiwKKyAg
ICAiTkVUV09SS19FUlIiLAorICAgICJBQk9SVF9FUlIiLAorICAgICJVUkxfTUlTTUFUQ0hfRVJS
IiwKKyAgICAiUVVPVEFfRVhDRUVERURfRVJSIgogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIqIGNv
bnN0IHJhbmdlRXhjZXB0aW9uTmFtZXNbXSA9IHsKSW5kZXg6IFdlYkNvcmUvZG9tL0RPTUNvcmVF
eGNlcHRpb24uaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL0RPTUNvcmVFeGNlcHRpb24u
aWRsCShyZXZpc2lvbiAzODg2MCkKKysrIFdlYkNvcmUvZG9tL0RPTUNvcmVFeGNlcHRpb24uaWRs
CSh3b3JraW5nIGNvcHkpCkBAIC02Niw2ICs2NiwxNiBAQAogICAgICAgICBjb25zdCB1bnNpZ25l
ZCBzaG9ydCAgICAgIFZBTElEQVRJT05fRVJSICAgICAgICAgICAgICAgICA9IDE2OwogICAgICAg
ICAvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAzOgogICAgICAgICBjb25zdCB1bnNpZ25lZCBz
aG9ydCAgICAgIFRZUEVfTUlTTUFUQ0hfRVJSICAgICAgICAgICAgICA9IDE3OworICAgICAgICAv
LyBJbnRyb2R1Y2VkIGluIEhUTUw1OgorICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgICAg
IFNFQ1VSSVRZX0VSUiAgICAgICAgICAgICAgICAgICA9IDE4OworICAgICAgICAvLyBJbnRyb2R1
Y2VkIGluIEhUTUw1OgorICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgICAgIE5FVFdPUktf
RVJSICAgICAgICAgICAgICAgICAgICA9IDE5OworICAgICAgICAvLyBJbnRyb2R1Y2VkIGluIEhU
TUw1OgorICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgICAgIEFCT1JUX0VSUiAgICAgICAg
ICAgICAgICAgICAgICA9IDIwOworICAgICAgICAvLyBJbnRyb2R1Y2VkIGluIEhUTUw1OgorICAg
ICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgICAgIFVSTF9NSVNNQVRDSF9FUlIgICAgICAgICAg
ICAgICA9IDIxOworICAgICAgICAvLyBJbnRyb2R1Y2VkIGluIEhUTUw1OgorICAgICAgICBjb25z
dCB1bnNpZ25lZCBzaG9ydCAgICAgIFFVT1RBX0VYQ0VFREVEX0VSUiAgICAgICAgICAgICA9IDIy
OwogICAgIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUvZG9tL0V4Y2VwdGlvbkNvZGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2RvbS9FeGNlcHRpb25Db2RlLmgJKHJldmlzaW9uIDM4ODYwKQorKysg
V2ViQ29yZS9kb20vRXhjZXB0aW9uQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSwx
MyBAQAogICAgICAgICBUWVBFX01JU01BVENIX0VSUiA9IDE3LAogCiAgICAgICAgIC8vIFhNTEh0
dHBSZXF1ZXN0IGV4dGVuc2lvbjoKLSAgICAgICAgU0VDVVJJVFlfRVJSID0gMTgKKyAgICAgICAg
U0VDVVJJVFlfRVJSID0gMTgsCisgICAgCisgICAgICAgIC8vIEludHJvZHVjZWQgaW4gSFRNTDU6
CisgICAgICAgIE5FVFdPUktfRVJSID0gMTksCisgICAgICAgIEFCT1JUX0VSUiA9IDIwLAorICAg
ICAgICBVUkxfTUlTTUFUQ0hfRVJSID0gMjEsCisgICAgICAgIFFVT1RBX0VYQ0VFREVEX0VSUiA9
IDIyCiAgICAgfTsKIAogICAgIGVudW0gRXhjZXB0aW9uVHlwZSB7CkluZGV4OiBXZWJDb3JlL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMzkxNDYp
CisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ5IEBACisy
MDA4LTEyLTA5ICBZYWVsIEFoYXJvbiAgPHlhZWwuYWhhcm9uQG5va2lhLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGaXJzdCBzdHViIGF0IGxp
bWl0aW5nIHRoZSBxdW90YSBmb3IgbG9jYWxzdG9yYWdlLgorCisgICAgICAgICogZG9tL0RPTUNv
cmVFeGNlcHRpb24uaWRsOgorICAgICAgICAqIGRvbS9FeGNlcHRpb25Db2RlLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Oik6CisgICAgICAgICogZG9tL0V4Y2VwdGlvbkNvZGUuaDoKKyAgICAgICAg
KFdlYkNvcmU6Oik6CisgICAgICAgICogbG9hZGVyL0VtcHR5Q2xpZW50cy5oOgorICAgICAgICAo
V2ViQ29yZTo6RW1wdHlDaHJvbWVDbGllbnQ6OnF1b3RhRm9yTG9jYWxTdG9yYWdlKToKKyAgICAg
ICAgKiBwYWdlL0Nocm9tZUNsaWVudC5oOgorICAgICAgICAqIHN0b3JhZ2UvTG9jYWxTdG9yYWdl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsU3RvcmFnZTo6TG9jYWxTdG9yYWdlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxvY2FsU3RvcmFnZTo6fkxvY2FsU3RvcmFnZSk6CisgICAgICAgIChX
ZWJDb3JlOjpMb2NhbFN0b3JhZ2U6OnN0b3JhZ2VBcmVhKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
Y2FsU3RvcmFnZTo6ZnVsbERhdGFiYXNlRmlsZW5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6TG9j
YWxTdG9yYWdlOjpvcGVuSW5kZXhEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0
b3JhZ2U6OnBlcmZvcm1JbXBvcnQpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdlOjpw
ZXJmb3JtU3luYyk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2U6OndhaXRGb3JJbXBv
cnRDb21wbGV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2U6Om1hcmtJbXBvcnRl
ZCk6CisgICAgICAgICogc3RvcmFnZS9Mb2NhbFN0b3JhZ2UuaDoKKyAgICAgICAgKiBzdG9yYWdl
L0xvY2FsU3RvcmFnZUFyZWEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdlQXJl
YTo6d2FpdEZvckltcG9ydENvbXBsZXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsU3RvcmFn
ZUFyZWE6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2VBcmVhOjprZXkp
OgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdlQXJlYTo6c2V0SXRlbSk6CisgICAgICAg
ICogc3RvcmFnZS9Mb2NhbFN0b3JhZ2VBcmVhLmg6CisgICAgICAgICogc3RvcmFnZS9TdG9yYWdl
QXJlYS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdG9yYWdlQXJlYTo6U3RvcmFnZUFyZWEpOgor
ICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZUFyZWE6OmludGVybmFsU2V0SXRlbSk6CisgICAgICAg
ICogc3RvcmFnZS9TdG9yYWdlQXJlYS5oOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZUFyZWE6
OnF1b3RhKToKKyAgICAgICAgKFdlYkNvcmU6OlN0b3JhZ2VBcmVhOjpzZXRRdW90YSk6CisgICAg
ICAgICogc3RvcmFnZS9TdG9yYWdlTWFwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0b3JhZ2VN
YXA6OlN0b3JhZ2VNYXApOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZU1hcDo6Y29weSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdG9yYWdlTWFwOjpzZXRJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6
OlN0b3JhZ2VNYXA6OnJlbW92ZUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZU1hcDo6
aW1wb3J0SXRlbSk6CisgICAgICAgICogc3RvcmFnZS9TdG9yYWdlTWFwLmg6CisgICAgICAgIChX
ZWJDb3JlOjpTdG9yYWdlTWFwOjp0b3RhbFVzYWdlKToKKwogMjAwOC0xMi0wOSAgRGF2aWQgSHlh
dHQgIDxoeWF0dEBhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIGNvZGUgdGhhdCB3aWxsIGNyZWF0
ZSBjdXN0b20gQ1NTIHNjcm9sbGJhcnMgZnJvbSB0aGUgPGJvZHk+LCB0aGUgZG9jdW1lbnQgZWxl
bWVudCAoPGh0bWw+KSBhbmQgdGhlIG93bmluZwpJbmRleDogV2ViQ29yZS9wYWdlL0Nocm9tZUNs
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9DaHJvbWVDbGllbnQuaAkocmV2aXNp
b24gMzg4NjApCisrKyBXZWJDb3JlL3BhZ2UvQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkK
QEAgLTEyNCw2ICsxMjQsOCBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgcHJpbnQoRnJhbWUqKSA9
IDA7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VlZGVkRGF0YWJhc2VRdW90YShGcmFtZSos
IGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lKSA9IDA7CisgICAgICAgIC8vIEZJWE1FOiBUaGlz
IHdpbGwgYnJlYWsgYWxsIG90aGVyIGJ1aWxkcy4gV2hhdCB0byBkbyBhYm91dCBpdD8KKyAgICAg
ICAgdmlydHVhbCB1bnNpZ25lZCBsb25nIGxvbmcgcXVvdGFGb3JMb2NhbFN0b3JhZ2UoRnJhbWUq
KSA9IDA7CiAKICNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCiAgICAgICAgIHZpcnR1YWwg
dm9pZCBkYXNoYm9hcmRSZWdpb25zQ2hhbmdlZCgpOwpJbmRleDogV2ViQ29yZS9sb2FkZXIvRW1w
dHlDbGllbnRzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9sb2FkZXIvRW1wdHlDbGllbnRzLmgJ
KHJldmlzaW9uIDM4ODYwKQorKysgV2ViQ29yZS9sb2FkZXIvRW1wdHlDbGllbnRzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEyNiw2ICsxMjYsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBwcmludChGcmFt
ZSopIHsgfQogCiAgICAgdmlydHVhbCB2b2lkIGV4Y2VlZGVkRGF0YWJhc2VRdW90YShGcmFtZSos
IGNvbnN0IFN0cmluZyYpIHsgfQorICAgIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBsb25nIHF1b3Rh
Rm9yTG9jYWxTdG9yYWdlKEZyYW1lKikgeyByZXR1cm4gMDsgfQogCiAgICAgdmlydHVhbCB2b2lk
IHJ1bk9wZW5QYW5lbChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29zZXI+KSB7IH0KIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26616</attachid>
            <date>2009-01-11 14:10:55 -0800</date>
            <delta_ts>2009-06-01 06:15:55 -0700</delta_ts>
            <desc>Update previous patch.</desc>
            <filename>storage.patch</filename>
            <type>text/plain</type>
            <size>47537</size>
            <attacher name="Yael">yael</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50Lm1tCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50Lm1tCShy
ZXZpc2lvbiAzOTc5OSkKKysrIFdlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xp
ZW50Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC01MTAsNiArNTEwLDExIEBACiAgICAgRU5EX0JMT0NL
X09CSkNfRVhDRVBUSU9OUzsKIH0KICAgICAKK3Vuc2lnbmVkIGxvbmcgbG9uZyBXZWJDaHJvbWVD
bGllbnQ6OnF1b3RhRm9yTG9jYWxTdG9yYWdlKEZyYW1lKikKK3sKKyAgICByZXR1cm4gVUlOVF9N
QVg7Cit9CisKIHZvaWQgV2ViQ2hyb21lQ2xpZW50Ojpwb3B1bGF0ZVZpc2l0ZWRMaW5rcygpCiB7
CiAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TOwpJbmRleDogV2ViS2l0L21hYy9XZWJD
b3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvbWFjL1dl
YkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCShyZXZpc2lvbiAzOTc5OSkKKysrIFdlYktp
dC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTEwNiw2ICsxMDYsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBwcmludChXZWJDb3JlOjpGcmFtZSop
OwogCiAgICAgdmlydHVhbCB2b2lkIGV4Y2VlZGVkRGF0YWJhc2VRdW90YShXZWJDb3JlOjpGcmFt
ZSosIGNvbnN0IFdlYkNvcmU6OlN0cmluZyYgZGF0YWJhc2VOYW1lKTsKKyAgICB2aXJ0dWFsIHVu
c2lnbmVkIGxvbmcgbG9uZyBxdW90YUZvckxvY2FsU3RvcmFnZShGcmFtZSopOwogCiAgICAgdmly
dHVhbCB2b2lkIHBvcHVsYXRlVmlzaXRlZExpbmtzKCk7CiAKSW5kZXg6IFdlYktpdC9tYWMvQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9tYWMvQ2hhbmdlTG9nCShyZXZpc2lvbiAzOTgw
OCkKKysrIFdlYktpdC9tYWMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIg
QEAKKzIwMDktMDEtMTEgIFlhZWwgQWhhcm9uIDx5YWVsLmFoYXJvbkBub2tpYS5jb20+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIERlZmF1bHQgY2FsbGJh
Y2sgZm9yIExvY2FsU3RvcmFnZSBxdW90YSByZXR1cm5zIHVubGltaXRlZCBzaXplLgorCisgICAg
ICAgICogV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50Lmg6CisgICAgICAgICogV2ViQ29y
ZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50Lm1tOgorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50Ojpx
dW90YUZvckxvY2FsU3RvcmFnZSk6CisKIDIwMDktMDEtMTEgIERtaXRyeSBUaXRvdiAgPGRpbWlj
aEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4
OiBXZWJLaXQvcXQvdGVzdHMvcXdlYnBhZ2UvdHN0X3F3ZWJwYWdlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvcXQvdGVzdHMvcXdlYnBhZ2UvdHN0X3F3ZWJwYWdlLmNwcAkocmV2aXNpb24gMzk3
OTkpCisrKyBXZWJLaXQvcXQvdGVzdHMvcXdlYnBhZ2UvdHN0X3F3ZWJwYWdlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTM4LDYgKzEzOCw3IEBACiAgICAgUUZpbGU6OnJlbW92ZSgiRGF0YWJhc2Vz
LmRiIik7CiAgICAgUURpcjo6Y3VycmVudCgpLnJtZGlyKCJodHRwX3d3dy5teWV4YW1wbGUuY29t
XzAiKTsKICAgICBRRmlsZTo6cmVtb3ZlKCJodHRwX3d3dy5teWV4YW1wbGUuY29tXzAubG9jYWxz
dG9yYWdlIik7CisgICAgUUZpbGU6OnJlbW92ZSgibG9jYWxzdG9yYWdlLmRiIik7CiB9CiAKIGNs
YXNzIE5hdmlnYXRpb25SZXF1ZXN0T3ZlcnJpZGUgOiBwdWJsaWMgUVdlYlBhZ2UKQEAgLTM4OCw3
ICszODksMTYgQEAKICAgICBtX3BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQo
InZhciBkYjI7IGRiMj1vcGVuRGF0YWJhc2UoJ3Rlc3RkYicsICcxLjAnLCAndGVzdCBkYXRhYmFz
ZSBBUEknLCA1MDAwMCk7Iik7CiAgICAgUVRSWV9DT01QQVJFKHNweS5jb3VudCgpLDEpOwogCisg
ICAgUVNpZ25hbFNweSBzcHlMb2NhbFN0b3JhZ2UobV9wYWdlLCBTSUdOQUwocXVvdGFGb3JMb2Nh
bFN0b3JhZ2UoUVdlYkZyYW1lICopKSk7CisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRMb2Nh
bFN0b3JhZ2VRdW90YSgwKTsKKyAgICBtX3BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFT
Y3JpcHQoImxvY2FsU3RvcmFnZS50ZXN0PSdUaGlzIGxvY2FsIHN0b3JhZ2UgdGVzdCB3aWxsIGZh
aWwnOyIpOworICAgIFFUUllfQ09NUEFSRShzcHlMb2NhbFN0b3JhZ2UuY291bnQoKSwgMSk7Cisg
ICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRMb2NhbFN0b3JhZ2VRdW90YSg1MDAwKTsKKyAgICBt
X3BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoImxvY2FsU3RvcmFnZS50ZXN0
PSdUaGlzIGlzIGZpcnN0IHJvdW5kIG9mIHRoZSB0ZXN0IGZvciBsb2NhbCBzdG9yYWdlJzsiKTsK
KyAgICBRVFJZX0NPTVBBUkUoc3B5TG9jYWxTdG9yYWdlLmNvdW50KCksIDIpOwogICAgIG1fcGFn
ZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgibG9jYWxTdG9yYWdlLnRlc3Q9J1Ro
aXMgaXMgYSB0ZXN0IGZvciBsb2NhbCBzdG9yYWdlJzsiKTsKKyAgICBRVFJZX0NPTVBBUkUoc3B5
TG9jYWxTdG9yYWdlLmNvdW50KCksIDIpOworICAgIAogICAgIG1fdmlldy0+c2V0SHRtbChRU3Ry
aW5nKCI8aHRtbD48Ym9keSBpZD0nYic+dGV4dDwvYm9keT48L2h0bWw+IiksIFFVcmwoImh0dHA6
Ly93d3cubXlleGFtcGxlLmNvbSIpKTsKIAogICAgIFFWYXJpYW50IHMxID0gbV9wYWdlLT5tYWlu
RnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJsb2NhbFN0b3JhZ2UudGVzdCIpOwpAQCAtMzk5
LDYgKzQwOSw0NSBAQAogICAgIFFWYXJpYW50IHMyID0gbV9wYWdlLT5tYWluRnJhbWUoKS0+ZXZh
bHVhdGVKYXZhU2NyaXB0KCJzZXNzaW9uU3RvcmFnZS50ZXN0Iik7CiAgICAgUUNPTVBBUkUoczIu
dG9TdHJpbmcoKSwgUVN0cmluZygiVGhpcyBpcyBhIHRlc3QgZm9yIHNlc3Npb24gc3RvcmFnZSIp
KTsKIAorICAgIC8vIGZpbGwgTG9jYWxTdG9yYWdlIGFuZCB0aGVuIHRlc3QgdGhhdCBpdCBnZXRz
IGNsZWFyZWQKKyAgICBtX3ZpZXctPnNldEh0bWwoUVN0cmluZygiPGh0bWw+PGJvZHkgaWQ9J2In
PnRleHQ8L2JvZHk+PC9odG1sPiIpLCBRVXJsKCJodHRwOi8vd3d3Lm15ZXhhbXBsZTEuY29tIikp
OworICAgIG1fcGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgic2Vzc2lvblN0
b3JhZ2UudGVzdDE9J3Rlc3QxJyIpOworICAgIFFWYXJpYW50IHMzID0gbV9wYWdlLT5tYWluRnJh
bWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJzZXNzaW9uU3RvcmFnZS50ZXN0MSIpOworICAgIFFD
T01QQVJFKHMzLnRvU3RyaW5nKCksIFFTdHJpbmcoInRlc3QxIikpOworICAgIG1fcGFnZS0+bWFp
bkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgibG9jYWxTdG9yYWdlLnRlc3QyPSd0ZXN0Mici
KTsKKyAgICBRVmFyaWFudCBzNCA9IG1fcGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNj
cmlwdCgibG9jYWxTdG9yYWdlLnRlc3QyIik7CisgICAgUUNPTVBBUkUoczQudG9TdHJpbmcoKSwg
UVN0cmluZygidGVzdDIiKSk7CisgICAgbV92aWV3LT5zZXRIdG1sKFFTdHJpbmcoIjxodG1sPjxi
b2R5IGlkPSdiJz50ZXh0PC9ib2R5PjwvaHRtbD4iKSwgUVVybCgiaHR0cDovL3d3dy5teWV4YW1w
bGUyLmNvbSIpKTsKKyAgICBtX3BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQo
InNlc3Npb25TdG9yYWdlLnRlc3QxPSd0ZXN0MSciKTsKKyAgICBzMyA9IG1fcGFnZS0+bWFpbkZy
YW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgic2Vzc2lvblN0b3JhZ2UudGVzdDEiKTsKKyAgICBR
Q09NUEFSRShzMy50b1N0cmluZygpLCBRU3RyaW5nKCJ0ZXN0MSIpKTsKKyAgICBtX3BhZ2UtPm1h
aW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoImxvY2FsU3RvcmFnZS50ZXN0Mj0ndGVzdDIn
Iik7CisgICAgczQgPSBtX3BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoImxv
Y2FsU3RvcmFnZS50ZXN0MiIpOworICAgIFFDT01QQVJFKHM0LnRvU3RyaW5nKCksIFFTdHJpbmco
InRlc3QyIikpOworICAgIC8vIGVuc3VyZSBMb2NhbFN0b3JhZ2UgZmlsZXMgd2VyZSBjcmVhdGVk
CisgICAgUVZFUklGWShRRmlsZTo6ZXhpc3RzKCJodHRwX3d3dy5teWV4YW1wbGUuY29tXzAubG9j
YWxzdG9yYWdlIikpOworICAgIFFWRVJJRlkoUUZpbGU6OmV4aXN0cygiaHR0cF93d3cubXlleGFt
cGxlMS5jb21fMC5sb2NhbHN0b3JhZ2UiKSk7CisgICAgUVZFUklGWShRRmlsZTo6ZXhpc3RzKCJo
dHRwX3d3dy5teWV4YW1wbGUyLmNvbV8wLmxvY2Fsc3RvcmFnZSIpKTsKKyAgICBtX3BhZ2UtPnRy
aWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkNsZWFyTG9jYWxTdG9yYWdlKTsKKyAgICBtX3BhZ2UtPnRy
aWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkNsZWFyU2Vzc2lvblN0b3JhZ2UpOworICAgIC8vIGVuc3Vy
ZSBMb2NhbFN0b3JhZ2UgZmlsZXMgIHdlcmUgZ29uZQorICAgIFFWRVJJRlkoIVFGaWxlOjpleGlz
dHMoImh0dHBfd3d3Lm15ZXhhbXBsZTEuY29tXzAubG9jYWxzdG9yYWdlIikpOworICAgIFFWRVJJ
RlkoIVFGaWxlOjpleGlzdHMoImh0dHBfd3d3Lm15ZXhhbXBsZTIuY29tXzAubG9jYWxzdG9yYWdl
IikpOworICAgIC8vIGVuc3VyZSB2YWx1ZXMgYXJlIGNsZWFyZWQKKyAgICBzMyA9IG1fcGFnZS0+
bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgic2Vzc2lvblN0b3JhZ2UudGVzdDIiKTsK
KyAgICBRQ09NUEFSRShzMy50b1N0cmluZygpLCBRU3RyaW5nKCkpOworICAgIHM0ID0gbV9wYWdl
LT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJsb2NhbFN0b3JhZ2UudGVzdDIiKTsK
KyAgICBRQ09NUEFSRShzNC50b1N0cmluZygpLCBRU3RyaW5nKCkpOworICAgIC8vIGVuc3VyZSB3
ZSBjYW4gc2V0IHZhbHVlcyBhZ2FpbgorICAgIG1fcGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRl
SmF2YVNjcmlwdCgic2Vzc2lvblN0b3JhZ2UudGVzdDI9J3Nlc3Npb25TdG9yYWdlIGFmdGVyIGNs
ZWFyJyIpOworICAgIHMzID0gbV9wYWdlLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0
KCJzZXNzaW9uU3RvcmFnZS50ZXN0MiIpOworICAgIFFDT01QQVJFKHMzLnRvU3RyaW5nKCksIFFT
dHJpbmcoInNlc3Npb25TdG9yYWdlIGFmdGVyIGNsZWFyIikpOworICAgIG1fcGFnZS0+bWFpbkZy
YW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgibG9jYWxTdG9yYWdlLnRlc3QyPSdsb2NhbFN0b3Jh
Z2UgYWZ0ZXIgY2xlYXInIik7CisgICAgczQgPSBtX3BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0
ZUphdmFTY3JpcHQoImxvY2FsU3RvcmFnZS50ZXN0MiIpOworICAgIFFDT01QQVJFKHM0LnRvU3Ry
aW5nKCksIFFTdHJpbmcoImxvY2FsU3RvcmFnZSBhZnRlciBjbGVhciIpKTsKKyAgICAKKyAgICBt
X3BhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkNsZWFyTG9jYWxTdG9yYWdlKTsKKwogICAg
IG1fdmlldy0+c2V0SHRtbChRU3RyaW5nKCI8aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+PGRpdj48
L2Rpdj48L2JvZHk+PC9odG1sPiIpLCBRVXJsKCJodHRwOi8vd3d3Lm15ZXhhbXBsZS5jb20iKSk7
CiAgICAgbV9wYWdlLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJ2YXIgZGIzOyBk
YjM9b3BlbkRhdGFiYXNlKCd0ZXN0ZGInLCAnMS4wJywgJ3Rlc3QgZGF0YWJhc2UgQVBJJywgNTAw
MDApO2RiMy50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeyB0eC5leGVjdXRlU3FsKCdDUkVBVEUg
VEFCTEUgSUYgTk9UIEVYSVNUUyBUZXN0ICh0ZXh0IFRFWFQpJywgW10pOyB9LCBmdW5jdGlvbih0
eCwgcmVzdWx0KSB7IH0sIGZ1bmN0aW9uKHR4LCBlcnJvcikgeyB9KTsiKTsKICAgICBRVGVzdDo6
cVdhaXQoMjAwKTsKSW5kZXg6IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRR
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVu
dFF0LmNwcAkocmV2aXNpb24gMzk3OTkpCisrKyBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hy
b21lQ2xpZW50UXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOTYsNiArMzk2LDEyIEBACiAgICAg
ZW1pdCBtX3dlYlBhZ2UtPmRhdGFiYXNlUXVvdGFFeGNlZWRlZChRV2ViRnJhbWVQcml2YXRlOjpr
aXQoZnJhbWUpLCBkYXRhYmFzZU5hbWUpOwogfQogCit1bnNpZ25lZCBsb25nIGxvbmcgQ2hyb21l
Q2xpZW50UXQ6OnF1b3RhRm9yTG9jYWxTdG9yYWdlKEZyYW1lKiBmcmFtZSkKK3sKKyAgICBlbWl0
IG1fd2ViUGFnZS0+cXVvdGFGb3JMb2NhbFN0b3JhZ2UoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZy
YW1lKSk7CisgICAgcmV0dXJuIG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+bG9jYWxTdG9yYWdlUXVv
dGEoKTsKK30KKwogdm9pZCBDaHJvbWVDbGllbnRRdDo6cnVuT3BlblBhbmVsKEZyYW1lKiBmcmFt
ZSwgUGFzc1JlZlB0cjxGaWxlQ2hvb3Nlcj4gcHJwRmlsZUNob29zZXIpCiB7CiAgICAgUmVmUHRy
PEZpbGVDaG9vc2VyPiBmaWxlQ2hvb3NlciA9IHBycEZpbGVDaG9vc2VyOwpJbmRleDogV2ViS2l0
L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmgJKHJldmlzaW9uIDM5Nzk5KQorKysg
V2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmgJKHdvcmtpbmcgY29weSkK
QEAgLTExNSw2ICsxMTUsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgcHJpbnQoRnJhbWUqKTsK
IAogICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZWVkZWREYXRhYmFzZVF1b3RhKEZyYW1lKiwgY29u
c3QgU3RyaW5nJik7CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhRm9y
TG9jYWxTdG9yYWdlKEZyYW1lKik7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIHJ1bk9wZW5QYW5l
bChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29zZXI+KTsKIApJbmRleDogV2ViS2l0L3F0L0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQ2hhbmdlTG9nCShyZXZpc2lvbiAzOTgw
OCkKKysrIFdlYktpdC9xdC9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyNCBA
QAorMjAwOS0wMS0xMSAgWWFlbCBBaGFyb24gPHlhZWwuYWhhcm9uQG5va2lhLmNvbT4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgRGVmYXVsdCBjYWxsYmFj
ayBmb3IgTG9jYWxTdG9yYWdlIHF1b3RhIHJldHVybnMgdW5saW1pdGVkIHNpemUuCisgICAgICAg
IEFkZGVkIHRoZSBhYmlsaXR5IHRvIGRlbGV0ZSBMb2NhbFN0b3JhZ2UgYW5kIFNlc3Npb25TdG9y
YWdlLgorCisgICAgICAgICogQXBpL3F3ZWJwYWdlLmNwcDoKKyAgICAgICAgKFFXZWJQYWdlOjp0
cmlnZ2VyQWN0aW9uKToKKyAgICAgICAgKiBBcGkvcXdlYnBhZ2UuaDoKKyAgICAgICAgKiBBcGkv
cXdlYnNldHRpbmdzLmNwcDoKKyAgICAgICAgKFFXZWJTZXR0aW5nczo6UVdlYlNldHRpbmdzKToK
KyAgICAgICAgKFFXZWJTZXR0aW5nczo6c2V0TG9jYWxTdG9yYWdlUXVvdGEpOgorICAgICAgICAo
UVdlYlNldHRpbmdzOjpsb2NhbFN0b3JhZ2VRdW90YSk6CisgICAgICAgICogQXBpL3F3ZWJzZXR0
aW5ncy5oOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OjpxdW90YUZvckxvY2FsU3RvcmFnZSk6Cisg
ICAgICAgICogV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaDoKKyAgICAgICAgKiB0ZXN0
cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwOgorICAgICAgICAodHN0X1FXZWJQYWdlOjpjbGVh
bnVwVGVzdENhc2UpOgorICAgICAgICAodHN0X1FXZWJQYWdlOjpkYXRhYmFzZSk6CisKIDIwMDkt
MDEtMDkgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24uaGF1c21hbm5Abm9raWEuY29tPgogCiAgICAg
ICAgIFJ1YmJlci1zdGFtcGVkIGJ5IFRvciBBcm5lIFZlc3Riw7guCkluZGV4OiBXZWJLaXQvcXQv
QXBpL3F3ZWJwYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5oCShy
ZXZpc2lvbiAzOTc5OSkKKysrIFdlYktpdC9xdC9BcGkvcXdlYnBhZ2UuaAkod29ya2luZyBjb3B5
KQpAQCAtMTQ3LDYgKzE0Nyw4IEBACiAKICAgICAgICAgSW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9y
LAogICAgICAgICBJbnNlcnRMaW5lU2VwYXJhdG9yLAorICAgICAgICBDbGVhckxvY2FsU3RvcmFn
ZSwKKyAgICAgICAgQ2xlYXJTZXNzaW9uU3RvcmFnZSwKIAogICAgICAgICBXZWJBY3Rpb25Db3Vu
dAogICAgIH07CkBAIC0yOTcsNiArMjk5LDcgQEAKICAgICB2b2lkIG1pY3JvRm9jdXNDaGFuZ2Vk
KCk7CiAgICAgdm9pZCBjb250ZW50c0NoYW5nZWQoKTsKICAgICB2b2lkIGRhdGFiYXNlUXVvdGFF
eGNlZWRlZChRV2ViRnJhbWUqIGZyYW1lLCBRU3RyaW5nIGRhdGFiYXNlTmFtZSk7CisgICAgdm9p
ZCBxdW90YUZvckxvY2FsU3RvcmFnZShRV2ViRnJhbWUqIGZyYW1lKTsKIAogICAgIHZvaWQgc2F2
ZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lKiBmcmFtZSwgUVdlYkhpc3RvcnlJdGVtKiBp
dGVtKTsKICAgICB2b2lkIHJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZSogZnJh
bWUpOwpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcAkocmV2aXNpb24gMzk3OTkpCisrKyBXZWJL
aXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcg
QEAKICNpbmNsdWRlIDxRVXJsPgogI2luY2x1ZGUgPFFGaWxlSW5mbz4KIAorY29uc3QgcWludDY0
IGRlZmF1bHREYXRhYmFzZVF1b3RhID0gNSAqIDEwMjQgKiAxMDI0OwogY2xhc3MgUVdlYlNldHRp
bmdzUHJpdmF0ZQogewogcHVibGljOgpAQCAtNTUsNiArNTYsNyBAQAogICAgIFFTdHJpbmcgbG9j
YWxTdG9yYWdlRGF0YWJhc2VQYXRoOwogICAgIFFTdHJpbmcgb2ZmbGluZVdlYkFwcGxpY2F0aW9u
Q2FjaGVQYXRoOwogICAgIHFpbnQ2NCBvZmZsaW5lU3RvcmFnZURlZmF1bHRRdW90YTsKKyAgICBx
aW50NjQgbG9jYWxTdG9yYWdlUXVvdGE7CiAKICAgICB2b2lkIGFwcGx5KCk7CiAgICAgV2ViQ29y
ZTo6U2V0dGluZ3MgKnNldHRpbmdzOwpAQCAtMzI3LDggKzMyOSw4IEBACiAgICAgZC0+YXR0cmli
dXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpPZmZsaW5lU3RvcmFnZURhdGFiYXNlRW5hYmxlZCwg
dHJ1ZSk7CiAgICAgZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpPZmZsaW5lV2Vi
QXBwbGljYXRpb25DYWNoZUVuYWJsZWQsIHRydWUpOwogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0
KFFXZWJTZXR0aW5nczo6TG9jYWxTdG9yYWdlRGF0YWJhc2VFbmFibGVkLCB0cnVlKTsKLSAgICBk
LT5vZmZsaW5lU3RvcmFnZURlZmF1bHRRdW90YSA9IDUgKiAxMDI0ICogMTAyNDsKLQorICAgIGQt
Pm9mZmxpbmVTdG9yYWdlRGVmYXVsdFF1b3RhID0gZGVmYXVsdERhdGFiYXNlUXVvdGE7CisgICAg
ZC0+bG9jYWxTdG9yYWdlUXVvdGEgPSBkZWZhdWx0RGF0YWJhc2VRdW90YTsKIH0KIAogLyohCkBA
IC0zMzgsNiArMzQwLDcgQEAKICAgICA6IGQobmV3IFFXZWJTZXR0aW5nc1ByaXZhdGUoc2V0dGlu
Z3MpKQogewogICAgIGQtPnNldHRpbmdzID0gc2V0dGluZ3M7CisgICAgZC0+bG9jYWxTdG9yYWdl
UXVvdGEgPSBkZWZhdWx0RGF0YWJhc2VRdW90YTsKICAgICBkLT5hcHBseSgpOwogICAgIGFsbFNl
dHRpbmdzKCktPmFwcGVuZChkKTsKIH0KQEAgLTc2MCwzICs3NjMsMjUgQEAKICAgICBRV2ViU2V0
dGluZ3NQcml2YXRlICpnbG9iYWwgPSBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCktPmQ7
CiAgICAgcmV0dXJuIGdsb2JhbC0+bG9jYWxTdG9yYWdlRGF0YWJhc2VQYXRoOwogfQorCisvKiEK
KyAgICBTZXRzIHRoZSBxdW90YSBmb3IgSFRNTDUgbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSB0byBc
YSBtYXhpbXVtU2l6ZS4KKworICAgIFNldHRpbmcgaXQgdG8gMCBkaXNhYmxlcyB0aGUgZmVhdHVy
ZS4KKworICAgIFxzYSBsb2NhbFN0b3JhZ2VRdW90YSgpCisqLwordm9pZCBRV2ViU2V0dGluZ3M6
OnNldExvY2FsU3RvcmFnZVF1b3RhKHFpbnQ2NCBtYXhpbXVtU2l6ZSkKK3sKKyAgICBkLT5sb2Nh
bFN0b3JhZ2VRdW90YSA9IG1heGltdW1TaXplOworfQorCisvKiEKKyAgICBHZXRzIHRoZSBxdW90
YSBmb3IgSFRNTDUgbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSAuCisKKyAgICBcc2Egc2V0TG9jYWxT
dG9yYWdlUXVvdGEoKQorKi8KK3FpbnQ2NCBRV2ViU2V0dGluZ3M6OmxvY2FsU3RvcmFnZVF1b3Rh
KCkKK3sKKyAgICByZXR1cm4gZC0+bG9jYWxTdG9yYWdlUXVvdGE7Cit9CkluZGV4OiBXZWJLaXQv
cXQvQXBpL3F3ZWJzZXR0aW5ncy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnNl
dHRpbmdzLmgJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3Mu
aAkod29ya2luZyBjb3B5KQpAQCAtMTE4LDYgKzExOCw5IEBACiAgICAgdm9pZCBzZXRMb2NhbFN0
b3JhZ2VEYXRhYmFzZVBhdGgoY29uc3QgUVN0cmluZyYgcGF0aCk7CiAgICAgUVN0cmluZyBsb2Nh
bFN0b3JhZ2VEYXRhYmFzZVBhdGgoKSBjb25zdDsKIAorICAgIHZvaWQgc2V0TG9jYWxTdG9yYWdl
UXVvdGEocWludDY0IG1heGltdW1TaXplKTsKKyAgICBxaW50NjQgbG9jYWxTdG9yYWdlUXVvdGEo
KTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgUVdlYlBhZ2VQcml2YXRlOwogICAgIGZy
aWVuZCBjbGFzcyBRV2ViU2V0dGluZ3NQcml2YXRlOwpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vi
cGFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAJKHJldmlz
aW9uIDM5Nzk5KQorKysgV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTYwLDYgKzYwLDExIEBACiAjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCiAjaW5j
bHVkZSAiUHJvZ3Jlc3NUcmFja2VyLmgiCiAjaW5jbHVkZSAiUmVmUHRyLmgiCisjaWYgRU5BQkxF
KERPTV9TVE9SQUdFKQorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2Vz
c2lvblN0b3JhZ2UuaCIKKyNpbmNsdWRlICJMb2NhbFN0b3JhZ2UuaCIKKyNlbmRpZgogI2luY2x1
ZGUgIkhhc2hNYXAuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiV2lu
ZG93RmVhdHVyZXMuaCIKQEAgLTE2Nyw2ICsxNzIsOCBAQAogCiAgICAgIkluc2VydE5ld2xpbmUi
LCAvLyBJbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3IKICAgICAiSW5zZXJ0TGluZUJyZWFrIiwgLy8g
SW5zZXJ0TGluZVNlcGFyYXRvcgorICAgIDAsIC8vIENsZWFyTG9jYWxTdG9yYWdlCisgICAgMCwg
Ly8gQ2xlYXJTZXNzaW9uU3RvcmFnZQogCiAgICAgMCAvLyBXZWJBY3Rpb25Db3VudAogfTsKQEAg
LTEwODQsNiArMTA5MSw4IEBACiAgICAgXHZhbHVlIEluc3BlY3RFbGVtZW50IFNob3cgdGhlIFdl
YiBJbnNwZWN0b3Igd2l0aCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIEhUTUwgZWxlbWVudC4K
ICAgICBcdmFsdWUgSW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yIEluc2VydCBhIG5ldyBwYXJhZ3Jh
cGguCiAgICAgXHZhbHVlIEluc2VydExpbmVTZXBhcmF0b3IgSW5zZXJ0IGEgbmV3IGxpbmUuCisg
ICAgXHZhbHVlIENsZWFyTG9jYWxTdG9yYWdlIERlbGV0ZSB0aGUgTG9hY2xTdG9yYWdlIGFzc29j
aWF0ZWQgd2l0aCB0aGlzIHBhZ2UgZ3JvdXAKKyAgICBcdmFsdWUgQ2xlYXJTZXNzaW9uU3RvcmFn
ZSBEZWxldGUgdGhlIFNlc3Npb25TdG9yYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UKICAg
ICBcb21pdHZhbHVlIFdlYkFjdGlvbkNvdW50CiAKICovCkBAIC0xNDIzLDYgKzE0MzIsMzYgQEAK
ICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBkLT5wYWdlLT5pbnNwZWN0b3JDb250
cm9sbGVyKCktPnNob3coKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENsZWFy
TG9jYWxTdG9yYWdlOgorICAgICAgICB7CisjaWYgRU5BQkxFKERPTV9TVE9SQUdFKQorICAgICAg
ICAgICAgUGFzc1JlZlB0cjxMb2NhbFN0b3JhZ2U+IGxvY2FsU3RvcmFnZSA9IExvY2FsU3RvcmFn
ZTo6bG9jYWxTdG9yYWdlKGQtPnBhZ2UtPnNldHRpbmdzKCktPmxvY2FsU3RvcmFnZURhdGFiYXNl
UGF0aCgpKTsKKyAgICAgICAgICAgIGlmICghbG9jYWxTdG9yYWdlKQorICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgVmVjdG9yPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gPiBvcmln
aW5MaXN0OworICAgICAgICAgICAgbG9jYWxTdG9yYWdlLT5vcmlnaW5zKG9yaWdpbkxpc3QpOwor
ICAgICAgICAgICAgVmVjdG9yPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gPjo6aXRlcmF0b3IgaXQg
PSBvcmlnaW5MaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBWZWN0b3I8UmVmUHRyPFNlY3VyaXR5
T3JpZ2luPiA+OjppdGVyYXRvciBlbmQgPSBvcmlnaW5MaXN0LmVuZCgpOworICAgICAgICAgICAg
Zm9yICg7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UtPmRl
bGV0ZVN0b3JhZ2VBcmVhKGl0LT5nZXQoKSk7CisjZW5kaWYgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgY2FzZSBDbGVhclNlc3Npb25T
dG9yYWdlOgorICAgICAgICB7CisjaWYgRU5BQkxFKERPTV9TVE9SQUdFKQorICAgICAgICAgICAg
UGFzc1JlZlB0cjxTZXNzaW9uU3RvcmFnZT4gc2Vzc2lvblN0b3JhZ2UgPSBkLT5wYWdlLT5zZXNz
aW9uU3RvcmFnZSgpOworICAgICAgICAgICAgaWYgKCFzZXNzaW9uU3RvcmFnZSkKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFZlY3RvcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+
ID4gb3JpZ2luTGlzdDsKKyAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLT5vcmlnaW5zKG9yaWdp
bkxpc3QpOworICAgICAgICAgICAgVmVjdG9yPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gPjo6aXRl
cmF0b3IgaXQgPSBvcmlnaW5MaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBWZWN0b3I8UmVmUHRy
PFNlY3VyaXR5T3JpZ2luPiA+OjppdGVyYXRvciBlbmQgPSBvcmlnaW5MaXN0LmVuZCgpOworICAg
ICAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICAgICBzZXNzaW9u
U3RvcmFnZS0+ZGVsZXRlU3RvcmFnZUFyZWEoaXQtPmdldCgpKTsKKyNlbmRpZiAgICAgICAgICAg
IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAg
ICAgICAgIGNvbW1hbmQgPSBlZGl0b3JDb21tYW5kRm9yV2ViQWN0aW9ucyhhY3Rpb24pOwogICAg
ICAgICAgICAgYnJlYWs7CkBAIC0yNjQ1LDYgKzI2ODQsMTIgQEAKICovCiAKIC8qIQorICAgIFxm
biB2b2lkIFFXZWJQYWdlOjpxdW90YUZvckxvY2FsU3RvcmFnZShRV2ViRnJhbWUqIGZyYW1lKTsK
KworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBhIG5ldyBsb2NhbCBzdG9yYWdlIGFy
ZWEgaXMgY3JlYXRlZCBhbmQgdGhlIHF1b3RhIGFsbG9jYXRlZCB0byB0aGF0IGFyZWEgaXMgc2V0
LgorKi8KKworLyohCiAgIFxzaW5jZSA0LjUKICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnJlc3RvcmVG
cmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZSogZnJhbWUpOwogCkluZGV4OiBXZWJLaXQvZ3Rr
L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudEd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L2d0ay9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRHdGsuY3BwCShyZXZpc2lvbiAzOTc5OSkK
KysrIFdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50R3RrLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDA0LDYgKzQwNCwxMiBAQAogI2VuZGlmCiB9CiAKK3Vuc2lnbmVkIGxvbmcg
bG9uZyBDaHJvbWVDbGllbnQ6OnF1b3RhRm9yTG9jYWxTdG9yYWdlKEZyYW1lKikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBVSU5UX01BWDsKK30KKwogdm9pZCBDaHJvbWVD
bGllbnQ6OnJ1bk9wZW5QYW5lbChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29zZXI+IHBycEZp
bGVDaG9vc2VyKQogewogICAgIFJlZlB0cjxGaWxlQ2hvb3Nlcj4gY2hvb3NlciA9IHBycEZpbGVD
aG9vc2VyOwpJbmRleDogV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRHdGsu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudEd0
ay5oCShyZXZpc2lvbiAzOTc5OSkKKysrIFdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvQ2hyb21l
Q2xpZW50R3RrLmgJKHdvcmtpbmcgY29weSkKQEAgLTk4LDYgKzk4LDcgQEAKICAgICAgICAgdmly
dHVhbCB2b2lkIHByaW50KFdlYkNvcmU6OkZyYW1lKik7CiAKICAgICAgICAgdmlydHVhbCB2b2lk
IGV4Y2VlZGVkRGF0YWJhc2VRdW90YShXZWJDb3JlOjpGcmFtZSosIGNvbnN0IFdlYkNvcmU6OlN0
cmluZyYpOworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90YUZvckxvY2Fs
U3RvcmFnZShGcmFtZSopOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBydW5PcGVuUGFuZWwoV2Vi
Q29yZTo6RnJhbWUqLCBQYXNzUmVmUHRyPFdlYkNvcmU6OkZpbGVDaG9vc2VyPik7CiAKSW5kZXg6
IFdlYktpdC9ndGsvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9ndGsvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTgwOCkKKysrIFdlYktpdC9ndGsvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMTIgQEAKKzIwMDktMDEtMTEgIFlhZWwgQWhhcm9uIDx5YWVsLmFoYXJvbkBu
b2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAg
IERlZmF1bHQgY2FsbGJhY2sgZm9yIExvY2FsU3RvcmFnZSBxdW90YSByZXR1cm5zIHVubGltaXRl
ZCBzaXplLgorCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50R3RrLmNwcDoK
KyAgICAgICAgKFdlYktpdDo6Q2hyb21lQ2xpZW50OjpxdW90YUZvckxvY2FsU3RvcmFnZSk6Cisg
ICAgICAgICogV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50R3RrLmg6CisKIDIwMDktMDEtMTEg
IFhhbiBMb3BleiAgPHhhbkBnbm9tZS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSG9sZ2Vy
IEZyZXl0aGVyLgpJbmRleDogV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L3dpbi9DaGFuZ2VMb2cJKHJldmlzaW9uIDM5ODA4KQorKysgV2ViS2l0L3dpbi9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wMS0xMSAgWWFlbCBBaGFy
b24gPHlhZWwuYWhhcm9uQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKyAgICAgICAgRGVmYXVsdCBjYWxsYmFjayBmb3IgTG9jYWxTdG9yYWdlIHF1b3Rh
IHJldHVybnMgdW5saW1pdGVkIHNpemUuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJD
aHJvbWVDbGllbnQuY3BwOgorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50OjpxdW90YUZvckxvY2Fs
U3RvcmFnZSk6CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50Lmg6CisK
IDIwMDktMDEtMTEgIERtaXRyeSBUaXRvdiAgPGRpbWljaEBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBw
b3J0L1dlYkNocm9tZUNsaWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3Jl
U3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuY3BwCShyZXZpc2lvbiAzOTc5OSkKKysrIFdlYktpdC93
aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NTQxLDYgKzU0MSwxMSBAQAogICAgIH0KIH0KIAordW5zaWduZWQgbG9uZyBsb25nIFdlYkNocm9t
ZUNsaWVudDo6cXVvdGFGb3JMb2NhbFN0b3JhZ2UoRnJhbWUqKQoreworICAgIHJldHVybiBVSU5U
X01BWDsKK30KKwogdm9pZCBXZWJDaHJvbWVDbGllbnQ6OnBvcHVsYXRlVmlzaXRlZExpbmtzKCkK
IHsKICAgICBXZWJIaXN0b3J5KiBoaXN0b3J5ID0gV2ViSGlzdG9yeTo6c2hhcmVkSGlzdG9yeSgp
OwpJbmRleDogV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCShy
ZXZpc2lvbiAzOTc5OSkKKysrIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xp
ZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw2ICsxMDYsNyBAQAogICAgIHZpcnR1YWwgdm9p
ZCBwcmludChXZWJDb3JlOjpGcmFtZSopOwogCiAgICAgdmlydHVhbCB2b2lkIGV4Y2VlZGVkRGF0
YWJhc2VRdW90YShXZWJDb3JlOjpGcmFtZSosIGNvbnN0IFdlYkNvcmU6OlN0cmluZyYpOworICAg
IHZpcnR1YWwgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhRm9yTG9jYWxTdG9yYWdlKEZyYW1lKik7
CiAKICAgICB2aXJ0dWFsIHZvaWQgcG9wdWxhdGVWaXNpdGVkTGlua3MoKTsKIApJbmRleDogV2Vi
S2l0L3d4L1dlYktpdFN1cHBvcnQvQ2hyb21lQ2xpZW50V3guaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvd3gvV2ViS2l0U3VwcG9ydC9DaHJvbWVDbGllbnRXeC5oCShyZXZpc2lvbiAzOTc5OSkKKysr
IFdlYktpdC93eC9XZWJLaXRTdXBwb3J0L0Nocm9tZUNsaWVudFd4LmgJKHdvcmtpbmcgY29weSkK
QEAgLTExMSw2ICsxMTEsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBwcmludChGcmFtZSopOwogCiAg
ICAgdmlydHVhbCB2b2lkIGV4Y2VlZGVkRGF0YWJhc2VRdW90YShGcmFtZSosIGNvbnN0IFN0cmlu
ZyYpOworICAgIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhRm9yTG9jYWxTdG9yYWdl
KEZyYW1lKik7CiAKICAgICB2aXJ0dWFsIHZvaWQgcnVuT3BlblBhbmVsKEZyYW1lKiwgUGFzc1Jl
ZlB0cjxGaWxlQ2hvb3Nlcj4pOwogCkluZGV4OiBXZWJLaXQvd3gvV2ViS2l0U3VwcG9ydC9DaHJv
bWVDbGllbnRXeC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3d4L1dlYktpdFN1cHBvcnQvQ2hy
b21lQ2xpZW50V3guY3BwCShyZXZpc2lvbiAzOTc5OSkKKysrIFdlYktpdC93eC9XZWJLaXRTdXBw
b3J0L0Nocm9tZUNsaWVudFd4LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzUzLDYgKzM1MywxMiBA
QAogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgbG9uZyBDaHJvbWVD
bGllbnRXeDo6cXVvdGFGb3JMb2NhbFN0b3JhZ2UoRnJhbWUqKQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgcmV0dXJuIFVJTlRfTUFYOworfQorCiB2b2lkIENocm9tZUNsaWVudFd4Ojpz
Y3JvbGwoY29uc3QgSW50U2l6ZSYsIGNvbnN0IEludFJlY3QmLCBjb25zdCBJbnRSZWN0JikKIHsK
ICAgICBub3RJbXBsZW1lbnRlZCgpOwpJbmRleDogV2ViS2l0L3d4L0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvd3gvQ2hhbmdlTG9nCShyZXZpc2lvbiAzOTgwOCkKKysrIFdlYktpdC93
eC9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wMS0xMSAg
WWFlbCBBaGFyb24gPHlhZWwuYWhhcm9uQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgRGVmYXVsdCBjYWxsYmFjayBmb3IgTG9jYWxTdG9y
YWdlIHF1b3RhIHJldHVybnMgdW5saW1pdGVkIHNpemUuCisKKyAgICAgICAgKiBXZWJLaXRTdXBw
b3J0L0Nocm9tZUNsaWVudFd4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNocm9tZUNsaWVudFd4
OjpxdW90YUZvckxvY2FsU3RvcmFnZSk6CisgICAgICAgICogV2ViS2l0U3VwcG9ydC9DaHJvbWVD
bGllbnRXeC5oOgorCiAyMDA5LTAxLTA1ICBBZGFtIFRyZWF0ICA8YWRhbS50cmVhdEB0b3JjaG1v
YmlsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR2VvcmdlIFN0YWlrb3MuCkluZGV4OiBX
ZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZUFyZWEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvU3RvcmFnZUFyZWEuaAkocmV2aXNpb24gMzk3OTkpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU3Rv
cmFnZUFyZWEuaAkod29ya2luZyBjb3B5KQpAQCAtNTMsNiArNTMsMTAgQEAKICAgICAgICAgdmly
dHVhbCBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KSBjb25zdCB7IHJldHVybiBpbnRl
cm5hbENvbnRhaW5zKGtleSk7IH0KICAgICAgICAgCiAgICAgICAgIFNlY3VyaXR5T3JpZ2luKiBz
ZWN1cml0eU9yaWdpbigpIHsgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW4uZ2V0KCk7IH0KKyAgICAg
ICAgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhKCkgeyByZXR1cm4gbV9xdW90YTsgfQorICAgICAg
ICB2b2lkIHNldFF1b3RhKHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90YSkgeyBtX3F1b3RhID0gcXVv
dGE7IH0KKyAgICAgICAgdm9pZCBtYXJrRGVsZXRlZCgpIHttX2RlbGV0ZWQgPSB0cnVlO30KKyAg
ICAgICAgYm9vbCBkZWxldGVkKCkgeyByZXR1cm4gbV9kZWxldGVkOyB9CiAKICAgICBwcm90ZWN0
ZWQ6CiAgICAgICAgIFN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luKik7CkBAIC03Niw2ICs4MCw4
IEBACiAKICAgICAgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBtX3NlY3VyaXR5T3JpZ2luOwog
ICAgICAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOworICAgICAgICB1bnNpZ25l
ZCBsb25nIGxvbmcgbV9xdW90YTsKKyAgICAgICAgYm9vbCBtX2RlbGV0ZWQ7CiAgICAgfTsKIAog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL1N0b3JhZ2VNYXAu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9TdG9yYWdlTWFwLmNwcAkocmV2aXNp
b24gMzk3OTkpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZU1hcC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM2LDYgKzM2LDcgQEAKIFN0b3JhZ2VNYXA6OlN0b3JhZ2VNYXAoKQogICAgIDogbV9p
dGVyYXRvcihtX21hcC5lbmQoKSkKICAgICAsIG1faXRlcmF0b3JJbmRleChVSU5UX01BWCkKKyAg
ICAsIG1fdG90YWxVc2FnZSgwKQogewogfQogCkBAIC00Myw2ICs0NCw3IEBACiB7CiAgICAgUmVm
UHRyPFN0b3JhZ2VNYXA+IG5ld01hcCA9IGNyZWF0ZSgpOwogICAgIG5ld01hcC0+bV9tYXAgPSBt
X21hcDsKKyAgICBuZXdNYXAtPm1fdG90YWxVc2FnZSA9IG1fdG90YWxVc2FnZTsKICAgICByZXR1
cm4gbmV3TWFwLnJlbGVhc2UoKTsKIH0KIApAQCAtMTEzLDkgKzExNSwxMSBAQAogICAgIGlmIChh
ZGRSZXN1bHQuc2Vjb25kKSB7CiAgICAgICAgIC8vIFRoZXJlIHdhcyBubyAib2xkVmFsdWUiIHNv
IG51bGwgaXQgb3V0LgogICAgICAgICBvbGRWYWx1ZSA9IFN0cmluZygpOworICAgICAgICBtX3Rv
dGFsVXNhZ2UgKz0gKGtleS5sZW5ndGgoKSArIHZhbHVlLmxlbmd0aCgpKSAqIHNpemVvZihVQ2hh
cik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgb2xkVmFsdWUgPSBhZGRSZXN1bHQuZmlyc3QtPnNl
Y29uZDsKICAgICAgICAgYWRkUmVzdWx0LmZpcnN0LT5zZWNvbmQgPSB2YWx1ZTsKKyAgICAgICAg
bV90b3RhbFVzYWdlID0gbV90b3RhbFVzYWdlICsgdmFsdWUubGVuZ3RoKCkgKiBzaXplb2YoVUNo
YXIpIC0gb2xkVmFsdWUubGVuZ3RoKCkgKiBzaXplb2YoVUNoYXIpOwogICAgIH0KIAogICAgIGlu
dmFsaWRhdGVJdGVyYXRvcigpOwpAQCAtMTM0LDggKzEzOCwxMCBAQAogICAgIH0KIAogICAgIG9s
ZFZhbHVlID0gbV9tYXAudGFrZShrZXkpOwotICAgIGlmICghb2xkVmFsdWUuaXNOdWxsKCkpCisg
ICAgaWYgKCFvbGRWYWx1ZS5pc051bGwoKSkgewogICAgICAgICBpbnZhbGlkYXRlSXRlcmF0b3Io
KTsKKyAgICAgICAgbV90b3RhbFVzYWdlIC09IChrZXkubGVuZ3RoKCkgKyBvbGRWYWx1ZS5sZW5n
dGgoKSkgKiBzaXplb2YoVUNoYXIpOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtMTUz
LDYgKzE1OSw3IEBACiAKICAgICBpZiAocmVzdWx0LnNlY29uZCkKICAgICAgICAgcmVzdWx0LmZp
cnN0LT5zZWNvbmQgPSB2YWx1ZS5jb3B5KCk7CisgICAgbV90b3RhbFVzYWdlICs9IChrZXkubGVu
Z3RoKCkgKyB2YWx1ZS5sZW5ndGgoKSkgKiBzaXplb2YoVUNoYXIpOwogfQogCiB9CkluZGV4OiBX
ZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9T
dG9yYWdlLmgJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9zdG9yYWdlL1N0b3JhZ2UuaAko
d29ya2luZyBjb3B5KQpAQCAtNTIsNiArNTIsNyBAQAogICAgICAgICBib29sIGNvbnRhaW5zKGNv
bnN0IFN0cmluZyYga2V5KSBjb25zdDsKIAogICAgICAgICB2b2lkIGRpc2Nvbm5lY3RGcmFtZSgp
IHsgbV9mcmFtZSA9IDA7IH0KKyAgICAgICAgYm9vbCBkZWxldGVkKCkgeyByZXR1cm4gbV9zdG9y
YWdlQXJlYS0+ZGVsZXRlZCgpOyB9CiAKICAgICBwcml2YXRlOgogICAgICAgICBTdG9yYWdlKEZy
YW1lKiwgUGFzc1JlZlB0cjxTdG9yYWdlQXJlYT4pOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0xv
Y2FsU3RvcmFnZUFyZWEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvTG9jYWxTdG9y
YWdlQXJlYS5oCShyZXZpc2lvbiAzOTc5OSkKKysrIFdlYkNvcmUvc3RvcmFnZS9Mb2NhbFN0b3Jh
Z2VBcmVhLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDYgKzQ5LDggQEAKICAgICAgICAgc3RhdGlj
IFBhc3NSZWZQdHI8TG9jYWxTdG9yYWdlQXJlYT4gY3JlYXRlKFNlY3VyaXR5T3JpZ2luKiBvcmln
aW4sIExvY2FsU3RvcmFnZSogbG9jYWxTdG9yYWdlKSB7IHJldHVybiBhZG9wdFJlZihuZXcgTG9j
YWxTdG9yYWdlQXJlYShvcmlnaW4sIGxvY2FsU3RvcmFnZSkpOyB9CiAKICAgICAgICAgdm9pZCBz
Y2hlZHVsZUZpbmFsU3luYygpOworICAgICAgICB2b2lkIHdhaXRGb3JJbXBvcnRDb21wbGV0ZSgp
IGNvbnN0OworICAgICAgICB2b2lkIHNjaGVkdWxlQ2xlYXIoKTsKIAogICAgIHByaXZhdGU6CiAg
ICAgICAgIExvY2FsU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW4qLCBMb2NhbFN0b3JhZ2UqKTsK
QEAgLTU4LDcgKzYwLDYgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGFyZWFDbGVhcmVkKEZyYW1l
KiBzb3VyY2VGcmFtZSk7CiAKICAgICAgICAgdm9pZCBzY2hlZHVsZUl0ZW1Gb3JTeW5jKGNvbnN0
IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKLSAgICAgICAgdm9pZCBzY2hlZHVs
ZUNsZWFyKCk7CiAgICAgICAgIHZvaWQgZGlzcGF0Y2hTdG9yYWdlRXZlbnQoY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIEZy
YW1lKiBzb3VyY2VGcmFtZSk7CiAKICAgICAgICAgVGltZXI8TG9jYWxTdG9yYWdlQXJlYT4gbV9z
eW5jVGltZXI7ICAgICAgICAKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TZXNzaW9uU3RvcmFnZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9TZXNzaW9uU3RvcmFnZS5oCShyZXZpc2lv
biAzOTc5OSkKKysrIFdlYkNvcmUvc3RvcmFnZS9TZXNzaW9uU3RvcmFnZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC00Myw2ICs0Myw4IEBACiAgICAgICAgIFBhc3NSZWZQdHI8U2Vzc2lvblN0b3JhZ2U+
IGNvcHkoUGFnZSopOwogICAgICAgICAKICAgICAgICAgUGFzc1JlZlB0cjxTdG9yYWdlQXJlYT4g
c3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW4qKTsKKyAgICAgICAgdm9pZCBvcmlnaW5zKFZlY3Rv
cjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+ID4mIHJlc3VsdCk7CisgICAgICAgIHZvaWQgZGVsZXRl
U3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbik7CiAKICNpZm5kZWYgTkRFQlVHCiAg
ICAgICAgIFBhZ2UqIHBhZ2UoKSB7IHJldHVybiBtX3BhZ2U7IH0KSW5kZXg6IFdlYkNvcmUvc3Rv
cmFnZS9Mb2NhbFN0b3JhZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvTG9jYWxT
dG9yYWdlLmgJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9zdG9yYWdlL0xvY2FsU3RvcmFn
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiTG9jYWxTdG9y
YWdlVGFzay5oIgogI2luY2x1ZGUgIkxvY2FsU3RvcmFnZVRocmVhZC5oIgogI2luY2x1ZGUgIlNl
Y3VyaXR5T3JpZ2luSGFzaC5oIgorI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNlLmgiCiAKICNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CkBAIC00Nyw2ICs0
OCw4IEBACiAgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPExvY2FsU3RvcmFnZT4gbG9jYWxTdG9y
YWdlKGNvbnN0IFN0cmluZyYgcGF0aCk7CiAKICAgICAgICAgUGFzc1JlZlB0cjxTdG9yYWdlQXJl
YT4gc3RvcmFnZUFyZWEoRnJhbWUqIHNvdXJjZUZyYW1lLCBTZWN1cml0eU9yaWdpbiopOworICAg
ICAgICB2b2lkIG9yaWdpbnMoVmVjdG9yPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gPiYgcmVzdWx0
KTsKKyAgICAgICAgdm9pZCBkZWxldGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbiogb3JpZ2lu
KTsKIAogICAgICAgICBib29sIHNjaGVkdWxlSW1wb3J0KFBhc3NSZWZQdHI8TG9jYWxTdG9yYWdl
QXJlYT4pOwogICAgICAgICB2b2lkIHNjaGVkdWxlU3luYyhQYXNzUmVmUHRyPExvY2FsU3RvcmFn
ZUFyZWE+KTsKQEAgLTYwLDYgKzYzLDkgQEAKICAgICAgICAgTG9jYWxTdG9yYWdlQXJlYU1hcCBt
X3N0b3JhZ2VBcmVhTWFwOwogCiAgICAgICAgIFJlZlB0cjxMb2NhbFN0b3JhZ2VUaHJlYWQ+IG1f
dGhyZWFkOworICAgICAgICB2b2lkIHdhaXRGb3JJbXBvcnRDb21wbGV0ZSgpIGNvbnN0OworICAg
ICAgICB2b2lkIG1hcmtJbXBvcnRlZCgpOworICAgICAgICBib29sIG9wZW5JbmRleERhdGFiYXNl
KCk7CiAKICAgICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIHN1YmplY3QgdG8gdGhyZWFk
IHN5bmNocm9uaXphdGlvbiBpc3N1ZXMKICAgICBwdWJsaWM6CkBAIC03MSw5ICs3NywxNSBAQAog
CiAgICAgcHJpdmF0ZToKICAgICAgICAgU3RyaW5nIG1fcGF0aDsKKyAgICAgICAgU1FMaXRlRGF0
YWJhc2UgbV9kYXRhYmFzZTsKIAogICAgICAgICB0eXBlZGVmIEhhc2hNYXA8UmVmUHRyPFNlY3Vy
aXR5T3JpZ2luPiwgdW5zaWduZWQgbG9uZyBsb25nLCBTZWN1cml0eU9yaWdpbkhhc2g+IFNlY3Vy
aXR5T3JpZ2luUXVvdGVNYXA7CiAgICAgICAgIFNlY3VyaXR5T3JpZ2luUXVvdGVNYXAgbV9zZWN1
cml0eU9yaWdpblF1b3RlTWFwOworICAgICAgICBTZWN1cml0eU9yaWdpblF1b3RlTWFwIG1fc2Vj
dXJpdHlPcmlnaW5zV2FpdGluZ1N5bmM7CisgICAgICAgIG11dGFibGUgTXV0ZXggbV9pbXBvcnRM
b2NrOworICAgICAgICBtdXRhYmxlIE11dGV4IG1fc3luY0xvY2s7CisgICAgICAgIG11dGFibGUg
Ym9vbCBtX2ltcG9ydENvbXBsZXRlOworICAgICAgICBtdXRhYmxlIFRocmVhZENvbmRpdGlvbiBt
X2ltcG9ydENvbmRpdGlvbjsKICAgICB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZUFyZWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
c3RvcmFnZS9TdG9yYWdlQXJlYS5jcHAJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9zdG9y
YWdlL1N0b3JhZ2VBcmVhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsMTIgKzM2LDE2IEBACiBT
dG9yYWdlQXJlYTo6U3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKICAgICA6IG1f
c2VjdXJpdHlPcmlnaW4ob3JpZ2luKQogICAgICwgbV9zdG9yYWdlTWFwKFN0b3JhZ2VNYXA6OmNy
ZWF0ZSgpKQorICAgICwgbV9xdW90YShVSU5UX01BWCkgLy8gZGVmYXVsdCB1c2VkIGZvciBzZXNz
aW9uU3RvcmFnZSB3aGljaCBpcyB1bmxpbWl0ZWQKKyAgICAsIG1fZGVsZXRlZChmYWxzZSkKIHsK
IH0KIAogU3RvcmFnZUFyZWE6OlN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFN0
b3JhZ2VBcmVhKiBhcmVhKQogICAgIDogbV9zZWN1cml0eU9yaWdpbihvcmlnaW4pCiAgICAgLCBt
X3N0b3JhZ2VNYXAoYXJlYS0+bV9zdG9yYWdlTWFwKQorICAgICwgbV9xdW90YShhcmVhLT5tX3F1
b3RhKQorICAgICwgbV9kZWxldGVkKGFyZWEtPm1fZGVsZXRlZCkKIHsKIH0KIApAQCAtNTEsMTEg
KzU1LDE2IEBACiAKIHVuc2lnbmVkIFN0b3JhZ2VBcmVhOjppbnRlcm5hbExlbmd0aCgpIGNvbnN0
CiB7CisgICAgaWYgKG1fZGVsZXRlZCkKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIG1f
c3RvcmFnZU1hcC0+bGVuZ3RoKCk7CiB9CiAKIFN0cmluZyBTdG9yYWdlQXJlYTo6aW50ZXJuYWxL
ZXkodW5zaWduZWQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAogeworICAgIGlmICht
X2RlbGV0ZWQpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICAKICAgICBTdHJpbmcga2V5
OwogICAgIAogICAgIGlmICghbV9zdG9yYWdlTWFwLT5rZXkoaW5kZXgsIGtleSkpIHsKQEAgLTY4
LDIxICs3NywyOSBAQAogCiBTdHJpbmcgU3RvcmFnZUFyZWE6OmludGVybmFsR2V0SXRlbShjb25z
dCBTdHJpbmcmIGtleSkgY29uc3QKIHsKKyAgICBpZiAobV9kZWxldGVkKQorICAgICAgICByZXR1
cm4gU3RyaW5nKCk7CiAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+Z2V0SXRlbShrZXkpOwogfQog
Ci12b2lkIFN0b3JhZ2VBcmVhOjppbnRlcm5hbFNldEl0ZW0oY29uc3QgU3RyaW5nJiBrZXksIGNv
bnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmLCBGcmFtZSogZnJhbWUpCit2b2lkIFN0
b3JhZ2VBcmVhOjppbnRlcm5hbFNldEl0ZW0oY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmlu
ZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmIGVjLCBGcmFtZSogZnJhbWUpCiB7CisgICAgaWYgKG1f
ZGVsZXRlZCkKKyAgICAgICAgcmV0dXJuOwogICAgIEFTU0VSVCghdmFsdWUuaXNOdWxsKCkpOwog
ICAgIAotICAgIC8vIEZJWE1FOiBGb3IgTG9jYWxTdG9yYWdlIHdoZXJlIGEgZGlzayBxdW90YSB3
aWxsIGJlIGVuZm9yY2VkLCBoZXJlIGlzIHdoZXJlIHdlIG5lZWQgdG8gZG8gcXVvdGEgY2hlY2tp
bmcuCi0gICAgLy8gICAgICAgIElmIHdlIGRlY2lkZSB0byBlbmZvcmNlIGEgbWVtb3J5IHF1b3Rh
IGZvciBTZXNzaW9uU3RvcmFnZSwgdGhpcyBpcyB3aGVyZSB3ZSdkIGRvIHRoYXQsIGFsc28uCi0g
ICAgLy8gaWYgKDxvdmVyIHF1b3RhPikgewotICAgIC8vICAgICBlYyA9IElOVkFMSURfQUNDRVNT
X0VSUjsKLSAgICAvLyAgICAgcmV0dXJuOwotICAgIC8vIH0KLSAgICAKLSAgICBTdHJpbmcgb2xk
VmFsdWU7ICAgCisgICAgU3RyaW5nIG9sZFZhbHVlID0gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtl
eSk7ICAgCisgICAgdW5zaWduZWQgbG9uZyBsb25nIHVzYWdlID0gbV9zdG9yYWdlTWFwLT50b3Rh
bFVzYWdlKCk7CisgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIHVzYWdlID0g
dXNhZ2UgKyB2YWx1ZS5sZW5ndGgoKSAqIHNpemVvZihVQ2hhcikgLSBvbGRWYWx1ZS5sZW5ndGgo
KSAqIHNpemVvZihVQ2hhcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB1c2FnZSArPSAo
a2V5Lmxlbmd0aCgpICsgdmFsdWUubGVuZ3RoKCkpICogc2l6ZW9mKFVDaGFyKTsKKyAgICB9Cisg
ICAgaWYgKHVzYWdlID4gbV9xdW90YSkgeworICAgICAgICBlYyA9IFFVT1RBX0VYQ0VFREVEX0VS
UjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbmV3TWFw
ID0gbV9zdG9yYWdlTWFwLT5zZXRJdGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAKICAg
ICBpZiAobmV3TWFwKQpAQCAtOTUsNiArMTEyLDggQEAKIAogdm9pZCBTdG9yYWdlQXJlYTo6aW50
ZXJuYWxSZW1vdmVJdGVtKGNvbnN0IFN0cmluZyYga2V5LCBGcmFtZSogZnJhbWUpCiB7ICAgCisg
ICAgaWYgKG1fZGVsZXRlZCkKKyAgICAgICAgcmV0dXJuOwogICAgIFN0cmluZyBvbGRWYWx1ZTsK
ICAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbmV3TWFwID0gbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVt
KGtleSwgb2xkVmFsdWUpOwogICAgIGlmIChuZXdNYXApCkBAIC0xMDcsNiArMTI2LDkgQEAKIAog
dm9pZCBTdG9yYWdlQXJlYTo6aW50ZXJuYWxDbGVhcihGcmFtZSogZnJhbWUpCiB7CisgICAgaWYg
KG1fZGVsZXRlZCkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKICAgICBtX3N0b3JhZ2VNYXAg
PSBTdG9yYWdlTWFwOjpjcmVhdGUoKTsKICAgICAKICAgICBhcmVhQ2xlYXJlZChmcmFtZSk7CkBA
IC0xMTQsNiArMTM2LDkgQEAKIAogYm9vbCBTdG9yYWdlQXJlYTo6aW50ZXJuYWxDb250YWlucyhj
b25zdCBTdHJpbmcmIGtleSkgY29uc3QKIHsKKyAgICBpZiAobV9kZWxldGVkKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIAogICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmNvbnRhaW5z
KGtleSk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TdG9yYWdlTWFwLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL1N0b3JhZ2VNYXAuaAkocmV2aXNpb24gMzk3OTkpCisrKyBX
ZWJDb3JlL3N0b3JhZ2UvU3RvcmFnZU1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw4
IEBACiAgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpIGNvbnN0OwogCiAg
ICAgICAgIHZvaWQgaW1wb3J0SXRlbShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSkgY29uc3Q7CisgICAgICAgIAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxV
c2FnZSgpIHsgcmV0dXJuIG1fdG90YWxVc2FnZTsgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAg
U3RvcmFnZU1hcCgpOwpAQCAtNTgsNiArNjAsNyBAQAogICAgICAgICBtdXRhYmxlIEhhc2hNYXA8
U3RyaW5nLCBTdHJpbmc+IG1fbWFwOwogICAgICAgICBtdXRhYmxlIEhhc2hNYXA8U3RyaW5nLCBT
dHJpbmc+OjppdGVyYXRvciBtX2l0ZXJhdG9yOwogICAgICAgICBtdXRhYmxlIHVuc2lnbmVkIG1f
aXRlcmF0b3JJbmRleDsKKyAgICAgICAgbXV0YWJsZSB1bnNpZ25lZCBsb25nIGxvbmcgbV90b3Rh
bFVzYWdlOwogICAgIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
c3RvcmFnZS9Mb2NhbFN0b3JhZ2VBcmVhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvTG9jYWxTdG9yYWdlQXJlYS5jcHAJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9zdG9y
YWdlL0xvY2FsU3RvcmFnZUFyZWEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MSw0MSArNzEsMzYg
QEAKICAgICBtX3N5bmNUaW1lci5zdG9wKCk7CiAgICAgc3luY1RpbWVyRmlyZWQoJm1fc3luY1Rp
bWVyKTsKICAgICBtX2ZpbmFsU3luY1NjaGVkdWxlZCA9IHRydWU7CisgICAgbWFya0RlbGV0ZWQo
KTsKIH0KIAotdW5zaWduZWQgTG9jYWxTdG9yYWdlQXJlYTo6bGVuZ3RoKCkgY29uc3QKK3ZvaWQg
TG9jYWxTdG9yYWdlQXJlYTo6d2FpdEZvckltcG9ydENvbXBsZXRlKCkgY29uc3QKIHsKICAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOwogCiAgICAgaWYgKG1faW1wb3J0Q29tcGxldGUpCi0gICAg
ICAgIHJldHVybiBpbnRlcm5hbExlbmd0aCgpOworICAgICAgICByZXR1cm47CiAKICAgICBNdXRl
eExvY2tlciBsb2NrZXIobV9pbXBvcnRMb2NrKTsKICAgICBpZiAobV9pbXBvcnRDb21wbGV0ZSkK
LSAgICAgICAgcmV0dXJuIGludGVybmFsTGVuZ3RoKCk7CisgICAgICAgIHJldHVybjsKIAogICAg
IHdoaWxlICghbV9pbXBvcnRDb21wbGV0ZSkKICAgICAgICAgbV9pbXBvcnRDb25kaXRpb24ud2Fp
dChtX2ltcG9ydExvY2spOwogICAgIEFTU0VSVChtX2ltcG9ydENvbXBsZXRlKTsKK30KKwordW5z
aWduZWQgTG9jYWxTdG9yYWdlQXJlYTo6bGVuZ3RoKCkgY29uc3QKK3sKKyAgICB3YWl0Rm9ySW1w
b3J0Q29tcGxldGUoKTsKICAgICAKICAgICByZXR1cm4gaW50ZXJuYWxMZW5ndGgoKTsKIH0KIAog
U3RyaW5nIExvY2FsU3RvcmFnZUFyZWE6OmtleSh1bnNpZ25lZCBpbmRleCwgRXhjZXB0aW9uQ29k
ZSYgZWMpIGNvbnN0CiB7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICB3YWl0Rm9y
SW1wb3J0Q29tcGxldGUoKTsKIAotICAgIGlmIChtX2ltcG9ydENvbXBsZXRlKQotICAgICAgICBy
ZXR1cm4gaW50ZXJuYWxLZXkoaW5kZXgsIGVjKTsKLQotICAgIE11dGV4TG9ja2VyIGxvY2tlciht
X2ltcG9ydExvY2spOwotICAgIGlmIChtX2ltcG9ydENvbXBsZXRlKQotICAgICAgICByZXR1cm4g
aW50ZXJuYWxLZXkoaW5kZXgsIGVjKTsKLQotICAgIHdoaWxlICghbV9pbXBvcnRDb21wbGV0ZSkK
LSAgICAgICAgbV9pbXBvcnRDb25kaXRpb24ud2FpdChtX2ltcG9ydExvY2spOwotICAgIEFTU0VS
VChtX2ltcG9ydENvbXBsZXRlKTsKLQogICAgIHJldHVybiBpbnRlcm5hbEtleShpbmRleCwgZWMp
OwogfQogCkBAIC0xMzMsMTQgKzEyOCw4IEBACiAKIHZvaWQgTG9jYWxTdG9yYWdlQXJlYTo6c2V0
SXRlbShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29k
ZSYgZWMsIEZyYW1lKiBmcmFtZSkKIHsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCi0g
ICAgaWYgKG1faW1wb3J0Q29tcGxldGUpIHsKLSAgICAgICAgaW50ZXJuYWxTZXRJdGVtKGtleSwg
dmFsdWUsIGVjLCBmcmFtZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNdXRleExv
Y2tlciBsb2NrZXIobV9pbXBvcnRMb2NrKTsKKyAgICAvLyBJbiBvcmRlciB0byBlbmZvcmNlIHRo
ZSBxdW90YSwgd2UgaGF2ZSB0byBmaW5pc2ggdGhlIGFyZWEgaW1wb3J0IGJlZm9yZSBzZXRJdGVt
IGNhbiB0YWtlIHBsYWNlCisgICAgd2FpdEZvckltcG9ydENvbXBsZXRlKCk7CiAgICAgaW50ZXJu
YWxTZXRJdGVtKGtleSwgdmFsdWUsIGVjLCBmcmFtZSk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvc3Rv
cmFnZS9TZXNzaW9uU3RvcmFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL1Nl
c3Npb25TdG9yYWdlLmNwcAkocmV2aXNpb24gMzk3OTkpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU2Vz
c2lvblN0b3JhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Miw0ICs3MiwxNyBAQAogICAgIHJl
dHVybiBzdG9yYWdlQXJlYS5yZWxlYXNlKCk7CiB9CiAKKwordm9pZCBTZXNzaW9uU3RvcmFnZTo6
b3JpZ2lucyhWZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+JiByZXN1bHQpCit7CisgICAg
Y29weUtleXNUb1ZlY3RvcihtX3N0b3JhZ2VBcmVhTWFwLCByZXN1bHQpOwogfQorCit2b2lkIFNl
c3Npb25TdG9yYWdlOjpkZWxldGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbiogb3JpZ2luKQor
eworICAgIFJlZlB0cjxTZXNzaW9uU3RvcmFnZUFyZWE+IHN0b3JhZ2VBcmVhID0gbV9zdG9yYWdl
QXJlYU1hcC50YWtlKG9yaWdpbik7CisgICAgaWYgKHN0b3JhZ2VBcmVhKQorICAgICAgICBzdG9y
YWdlQXJlYS5nZXQoKS0+bWFya0RlbGV0ZWQoKTsKK30KKworfQpJbmRleDogV2ViQ29yZS9zdG9y
YWdlL0xvY2FsU3RvcmFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0xvY2Fs
U3RvcmFnZS5jcHAJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9zdG9yYWdlL0xvY2FsU3Rv
cmFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb25m
aWcuaCIKICNpbmNsdWRlICJMb2NhbFN0b3JhZ2UuaCIKIAorI2luY2x1ZGUgIkNocm9tZUNsaWVu
dC5oIgogI2luY2x1ZGUgIkNTdHJpbmcuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5j
bHVkZSAiRmlsZVN5c3RlbS5oIgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgIkxvY2FsU3Rv
cmFnZUFyZWEuaCIKICNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUGFnZUdyb3VwLmgiCisj
aW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFnZUFyZWEuaCIKICNp
bmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CiAKQEAgLTYyLDYgKzY0LDcgQEAKIAogTG9jYWxT
dG9yYWdlOjpMb2NhbFN0b3JhZ2UoY29uc3QgU3RyaW5nJiBwYXRoKQogICAgIDogbV9wYXRoKHBh
dGguY29weSgpKQorICAgICwgbV9pbXBvcnRDb21wbGV0ZShmYWxzZSkKIHsKICAgICAvLyBJZiB0
aGUgcGF0aCBpcyBlbXB0eSwgd2Uga25vdyB3ZSdyZSBuZXZlciBnb2luZyB0byBiZSB1c2luZyB0
aGUgdGhyZWFkIGZvciBhbnl0aGluZywgc28gZG9uJ3Qgc3RhcnQgaXQuCiAgICAgLy8gSW4gdGhl
IGZ1dHVyZSwgd2UgbWlnaHQgYWxzbyB3YW50IHRvIGNvbnNpZGVyIHJlbW92aW5nIGl0IGZyb20g
dGhlIERPTSBpbiB0aGF0IGNhc2UgLSA8cmRhcjovL3Byb2JsZW0vNTk2MDQ3MD4KQEAgLTc2LDYg
Kzc5LDcgQEAKIExvY2FsU3RvcmFnZTo6fkxvY2FsU3RvcmFnZSgpCiB7CiAgICAgQVNTRVJUKGxv
Y2FsU3RvcmFnZU1hcCgpLmdldChtX3BhdGgpID09IHRoaXMpOworICAgIG1fZGF0YWJhc2UuY2xv
c2UoKTsKICAgICBsb2NhbFN0b3JhZ2VNYXAoKS5yZW1vdmUobV9wYXRoKTsKIH0KIApAQCAtODMs
MzIgKzg3LDU1IEBACiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKIAotICAgIC8vIEZJ
WE1FOiBJZiB0aGUgc2VjdXJpdHkgb3JpZ2luIGluIHF1ZXN0aW9uIGhhcyBuZXZlciBoYWQgYSBz
dG9yYWdlIGFyZWEgZXN0YWJsaXNoZWQsCi0gICAgLy8gd2UgbmVlZCB0byBhc2sgYSBjbGllbnQg
Y2FsbCBpZiBlc3RhYmxpc2hpbmcgaXQgaXMgb2theS4gIElmIHRoZSBjbGllbnQgZGVuaWVzIHRo
ZSByZXF1ZXN0LAotICAgIC8vIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuCi0gICAgLy8g
VGhlIHNvdXJjZUZyYW1lIGFyZ3VtZW50IGV4aXN0cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNraW5n
IGEgY2xpZW50LgotICAgIC8vIFRvIGtub3cgaWYgYW4gYXJlYSBoYXMgcHJldmlvdXNseSBiZWVu
IGVzdGFibGlzaGVkLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhpcyBMb2NhbFN0b3JhZ2UgCi0g
ICAgLy8gb2JqZWN0IGhhcyBmaW5pc2hlZCBpdCdzIEFyZWFJbXBvcnQgdGFzay4KLQotCi0gICAg
Ly8gRklYTUU6IElmIHRoZSBzdG9yYWdlIGFyZWEgaXMgYmVpbmcgZXN0YWJsaXNoZWQgZm9yIHRo
ZSBmaXJzdCB0aW1lIGhlcmUsIHdlIG5lZWQgdG8gCi0gICAgLy8gc3luYyBpdHMgZXhpc3RhbmNl
IGFuZCBxdW90YSBvdXQgdG8gZGlzayB2aWEgYW4gdGFzayBvZiB0eXBlIEFyZWFTeW5jCi0KICAg
ICBSZWZQdHI8TG9jYWxTdG9yYWdlQXJlYT4gc3RvcmFnZUFyZWE7CiAgICAgaWYgKHN0b3JhZ2VB
cmVhID0gbV9zdG9yYWdlQXJlYU1hcC5nZXQob3JpZ2luKSkKICAgICAgICAgcmV0dXJuIHN0b3Jh
Z2VBcmVhLnJlbGVhc2UoKTsKKyAgICAvLyB3YWl0IGZvciBpbXBvcnQgdG8gY29tcGxldGUgYmVm
b3JlIHdlIGtub3cgaWYgdGhpcyBvcmlnaW4gYWxyZWFkeSBoYXMgYSBxdW90YSBhc3NvY2lhdGVk
IHdpdGggaXQKKyAgICB3YWl0Rm9ySW1wb3J0Q29tcGxldGUoKTsKKyAgICAKKyAgICB1bnNpZ25l
ZCBsb25nIGxvbmcgcXVvdGE7CisgICAgCisgICAgeworICAgICAgICBNdXRleExvY2tlciBpbXBv
cnRMb2NrKG1faW1wb3J0TG9jayk7CisgICAgICAgIHF1b3RhID0gIG1fc2VjdXJpdHlPcmlnaW5R
dW90ZU1hcC5nZXQob3JpZ2luKTsKKyAgICB9CisgICAgCisgICAgUGFnZSogcGFnZSA9IHNvdXJj
ZUZyYW1lLT5wYWdlKCk7CisgICAgQVNTRVJUKHBhZ2UpOworICAgIAorICAgIGJvb2wgc3luY1Jl
cXVpcmVkKGZhbHNlKTsKKyAgICBpZiAocXVvdGEgPT0gMCkgeworICAgICAgICBxdW90YSA9IHBh
Z2UtPmNocm9tZSgpLT5jbGllbnQoKS0+cXVvdGFGb3JMb2NhbFN0b3JhZ2Uoc291cmNlRnJhbWUp
OworICAgICAgICBzeW5jUmVxdWlyZWQgPSB0cnVlOworICAgIH0KICAgICAgICAgCisgICAgaWYg
KHF1b3RhID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIAogICAgIHN0b3JhZ2VBcmVhID0g
TG9jYWxTdG9yYWdlQXJlYTo6Y3JlYXRlKG9yaWdpbiwgdGhpcyk7CisgICAgc3RvcmFnZUFyZWEt
PnNldFF1b3RhKHF1b3RhKTsKICAgICBtX3N0b3JhZ2VBcmVhTWFwLnNldChvcmlnaW4sIHN0b3Jh
Z2VBcmVhKTsKKyAgICAKKyAgICBpZiAoc3luY1JlcXVpcmVkKQorICAgIHsKKyAgICAgICAgewor
ICAgICAgICAgICAgTXV0ZXhMb2NrZXIgaW1wb3J0TG9jayhtX2ltcG9ydExvY2spOworICAgICAg
ICAgICAgbV9zZWN1cml0eU9yaWdpblF1b3RlTWFwLnNldChvcmlnaW4sIHF1b3RhKTsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhMb2NrZXIgc3luY0xv
Y2sobV9zeW5jTG9jayk7CisgICAgICAgICAgICBtX3NlY3VyaXR5T3JpZ2luc1dhaXRpbmdTeW5j
LnNldChvcmlnaW4sIHF1b3RhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV90aHJlYWQpCisg
ICAgICAgICAgICBtX3RocmVhZC0+c2NoZWR1bGVTeW5jKHRoaXMpOworICAgIH0KKyAgICAgICAg
CiAgICAgcmV0dXJuIHN0b3JhZ2VBcmVhLnJlbGVhc2UoKTsKIH0KIAogU3RyaW5nIExvY2FsU3Rv
cmFnZTo6ZnVsbERhdGFiYXNlRmlsZW5hbWUoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAg
ICAvLyBGSVhNRTogT25jZSB3ZSBhY3R1YWxseSB0cmFjayBvcmlnaW4vcXVvdGEgZW50cmllcyB0
byBzZWUgd2hpY2ggb3JpZ2lucyBoYXZlIGxvY2FsIHN0b3JhZ2UgZXN0YWJsaXNoZWQsCi0gICAg
Ly8gd2Ugd2lsbCByZXR1cm4gYW4gZW1wdHkgcGF0aCBuYW1lIGlmIHRoZSBvcmlnaW4gaXNuJ3Qg
YWxsb3dlZCB0byBoYXZlIExvY2FsU3RvcmFnZS4KLSAgICAvLyBXZSdsbCBuZWVkIHRvIHdhaXQg
aGVyZSB1bnRpbCB0aGUgQXJlYUltcG9ydCB0YXNrIHRvIGNvbXBsZXRlIGJlZm9yZSBtYWtpbmcg
dGhhdCBkZWNpc2lvbi4KLQogICAgIGlmIChtX3BhdGguaXNFbXB0eSgpKQogICAgICAgICByZXR1
cm4gU3RyaW5nKCk7CiAKQEAgLTEyNCwxOCArMTUxLDE2NSBAQAogICAgIHJldHVybiBwYXRoQnlB
cHBlbmRpbmdDb21wb25lbnQobV9wYXRoLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsg
Ii5sb2NhbHN0b3JhZ2UiKTsKIH0KIAordm9pZCBMb2NhbFN0b3JhZ2U6Om9yaWdpbnMoVmVjdG9y
PFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gPiYgcmVzdWx0KQoreworICAgIEFTU0VSVChpc01haW5U
aHJlYWQoKSk7CisgICAgd2FpdEZvckltcG9ydENvbXBsZXRlKCk7CisgICAgTXV0ZXhMb2NrZXIg
aW1wb3J0TG9jayhtX2ltcG9ydExvY2spOworICAgIGNvcHlLZXlzVG9WZWN0b3IobV9zZWN1cml0
eU9yaWdpblF1b3RlTWFwLCByZXN1bHQpOworfQorCit2b2lkIExvY2FsU3RvcmFnZTo6ZGVsZXRl
U3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sKKyAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOworICAgIFJlZlB0cjxMb2NhbFN0b3JhZ2VBcmVhPiBzdG9yYWdlQXJlYSA9IG1f
c3RvcmFnZUFyZWFNYXAudGFrZShvcmlnaW4pOworICAgIGlmICghc3RvcmFnZUFyZWEpCisgICAg
ICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBjbGVhcgorICAgIHN0b3JhZ2VBcmVhLT5zY2hlZHVs
ZUNsZWFyKCk7CisgICAgCisgICAgLy8gc2NoZWR1bGUgcmVtb3ZpbmcgZnJvbSBpbmRleCBkYXRh
YmFzZQorICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgc3luY0xvY2sobV9zeW5jTG9jayk7Cisg
ICAgICAgIG1fc2VjdXJpdHlPcmlnaW5zV2FpdGluZ1N5bmMuc2V0KG9yaWdpbiwgMCk7CisgICAg
fQorICAgIGlmIChtX3RocmVhZCkKKyAgICAgICAgbV90aHJlYWQtPnNjaGVkdWxlU3luYyh0aGlz
KTsKKyAgICAKKyAgICAvLyBraWxsIHRoZSBzdG9yYWdlQXJlYSB0aHJlYWQgCisgICAgc3RvcmFn
ZUFyZWEtPnNjaGVkdWxlRmluYWxTeW5jKCk7CisgICAgCisgICAgLy9kZWxldGUgZmlsZSBpbiB0
aGUgZmlsZSBzeXN0ZW0KKyAgICBkZWxldGVGaWxlKGZ1bGxEYXRhYmFzZUZpbGVuYW1lKG9yaWdp
bikpOworICAgIAorICAgIC8vIHJlbW92ZSBmcm9tIHF1b3RhIG1hcAorICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgaW1wb3J0TG9jayhtX2ltcG9ydExvY2spOworICAgICAgICBtX3NlY3VyaXR5
T3JpZ2luUXVvdGVNYXAudGFrZShvcmlnaW4pOworICAgIH0gICAgCit9CisKK2Jvb2wgTG9jYWxT
dG9yYWdlOjpvcGVuSW5kZXhEYXRhYmFzZSgpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQo
KSk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlLmlzT3BlbigpKTsKKworICAgIGlmIChtX3BhdGgu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgaWYgKCFtYWtlQWxs
RGlyZWN0b3JpZXMobV9wYXRoKSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZWQgdG8gY3Jl
YXRlIExvY2FsU3RvcmFnZSBkYXRhYmFzZSBwYXRoICVzIiwgbV9wYXRoLnV0ZjgoKS5kYXRhKCkp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIFN0cmluZyBkYXRhYmFz
ZUZpbGVuYW1lID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KG1fcGF0aCwgImxvY2Fsc3RvcmFn
ZS5kYiIpOworICAgIGlmIChkYXRhYmFzZUZpbGVuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICBM
T0dfRVJST1IoIkZpbGVuYW1lIGZvciBsb2NhbCBzdG9yYWdlIGluZGV4IGRhdGFiYXNlIGlzIGVt
cHR5IC0gbG9jYWwgc3RvcmFnZSBwYXRoICVzIiwgbV9wYXRoLnV0ZjgoKS5kYXRhKCkpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLm9wZW4oZGF0
YWJhc2VGaWxlbmFtZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBpbmRl
eCBkYXRhYmFzZSBmaWxlICVzIGZvciBsb2NhbCBzdG9yYWdlIiwgZGF0YWJhc2VGaWxlbmFtZS51
dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICgh
bV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgT3Jp
Z2lucyAob3JpZ2luIFRFWFQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHF1b3RhIElOVEVH
RVIgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJG
YWlsZWQgdG8gY3JlYXRlIHRhYmxlIE9yaWdpbnMgZm9yIGxvY2FsIHN0b3JhZ2UgJXMiLCBtX3Bh
dGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0
dXJuIHRydWU7Cit9CisKIHZvaWQgTG9jYWxTdG9yYWdlOjpwZXJmb3JtSW1wb3J0KCkKIHsKICAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKIAotICAgIC8vIEZJWE1FOiBJbXBvcnQgYWxsIGtu
b3duIGxvY2FsIHN0b3JhZ2Ugb3JpZ2lucyBoZXJlIGFsb25nIHdpdGggdGhlaXIgcXVvdGFzCisg
ICAgLy8gSW1wb3J0IGFsbCBrbm93biBsb2NhbCBzdG9yYWdlIG9yaWdpbnMgaGVyZSBhbG9uZyB3
aXRoIHRoZWlyIHF1b3RhcworICAgIGlmICghb3BlbkluZGV4RGF0YWJhc2UoKSkgeworICAgICAg
ICBtYXJrSW1wb3J0ZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBTUUxp
dGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4sIHF1b3RhIEZST00g
T3JpZ2lucyIpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gc2VsZWN0IG9yaWdpbnMgZnJvbSBPcmlnaW5zIHRh
YmxlIGZvciBsb2NhbCBzdG9yYWdlICVzIiwgbV9wYXRoLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICBtYXJrSW1wb3J0ZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCByZXN1
bHQ7CisgICAgU2VjdXJpdHlPcmlnaW5RdW90ZU1hcCBpbXBvcnRlZEl0ZW1zTWFwOworICAgIHdo
aWxlICgocmVzdWx0ID0gcXVlcnkuc3RlcCgpKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAg
UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbjo6Y3JlYXRlRnJv
bURhdGFiYXNlSWRlbnRpZmllcihxdWVyeS5nZXRDb2x1bW5UZXh0KDApKTsKKyAgICAgICAgaW1w
b3J0ZWRJdGVtc01hcC5zZXQob3JpZ2luLmdldCgpLCBxdWVyeS5nZXRDb2x1bW5JbnQ2NCgxKSk7
CisgICAgfQorICAgIAorICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgaW1wb3J0TG9jayhtX2lt
cG9ydExvY2spOworICAgICAgICBtX3NlY3VyaXR5T3JpZ2luUXVvdGVNYXAuc3dhcChpbXBvcnRl
ZEl0ZW1zTWFwKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdERvbmUpIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZWFkaW5nIE9yaWdpbnMgZnJvbSBPcmlnaW5zIHRh
YmxlIGZvciBsb2NhbCBzdG9yYWdlICVzIiwgbV9wYXRoLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICBtYXJrSW1wb3J0ZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtYXJrSW1wb3J0
ZWQoKTsKIH0KIAogdm9pZCBMb2NhbFN0b3JhZ2U6OnBlcmZvcm1TeW5jKCkKIHsKICAgICBBU1NF
UlQoIWlzTWFpblRocmVhZCgpKTsKIAotICAgIC8vIEZJWE1FOiBXcml0ZSBvdXQgbmV3IG9yaWdp
bnMgYW5kIHF1b3RhcyBoZXJlCisgICAgLy8gV3JpdGUgb3V0IG5ldyBvcmlnaW5zIGFuZCBxdW90
YXMgaGVyZQorICAgIAorICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgU1FMaXRlU3RhdGVtZW50IGluc2VydFF1ZXJ5KG1fZGF0YWJhc2UsICJJTlNF
UlQgSU5UTyBPcmlnaW5zIFZBTFVFUyAoPywgPykiKTsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcmVt
b3ZlUXVlcnkobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIE9yaWdpbnMgV0hFUkUgb3JpZ2luPT8i
KTsKKyAgICBpZiAoaW5zZXJ0UXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgaW5zZXJ0IHN0YXRlbWVudCAtIGNhbm5v
dCB3cml0ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlICVzIiwgbV9wYXRoLnV0ZjgoKS5kYXRh
KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChyZW1vdmVRdWVyeS5wcmVwYXJl
KCkgIT0gU1FMUmVzdWx0T2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFy
ZSBpbnNlcnQgc3RhdGVtZW50IC0gY2Fubm90IHdyaXRlIHRvIGxvY2FsIHN0b3JhZ2UgZGF0YWJh
c2UgJXMiLCBtX3BhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgCisgICAgU2VjdXJpdHlPcmlnaW5RdW90ZU1hcCBpdGVtc1RvU3luYzsKKyAgICB7CisgICAg
ICAgIE11dGV4TG9ja2VyIHN5bmNMb2NrKG1fc3luY0xvY2spOworICAgICAgICBtX3NlY3VyaXR5
T3JpZ2luc1dhaXRpbmdTeW5jLnN3YXAoaXRlbXNUb1N5bmMpOworICAgIH0KKyAgICAKKyAgICBT
ZWN1cml0eU9yaWdpblF1b3RlTWFwOjppdGVyYXRvciBlbmQgPSBpdGVtc1RvU3luYy5lbmQoKTsK
KworICAgIGZvciAoU2VjdXJpdHlPcmlnaW5RdW90ZU1hcDo6aXRlcmF0b3IgaXQgPSBpdGVtc1Rv
U3luYy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQg
PiAwKSB7CisgICAgICAgICAgICBpbnNlcnRRdWVyeS5iaW5kVGV4dCgxLCBpdC0+Zmlyc3QtPmRh
dGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgICAgIGluc2VydFF1ZXJ5LmJpbmRJbnQ2NCgy
LCBpdC0+c2Vjb25kKTsKKyAgICAKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBpbnNlcnRRdWVy
eS5zdGVwKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdERvbmUpIHsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBhZGQgb3JpZ2luIHRvIHRoZSBsb2Nh
bCBzdG9yYWdlIGRhdGFiYXNlICVzIC0gJWkiLCBtX3BhdGgudXRmOCgpLmRhdGEoKSwgcmVzdWx0
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlu
c2VydFF1ZXJ5LnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICByZW1vdmVRdWVyeS5iaW5kVGV4dCgxLCBpdC0+Zmlyc3QtPmRhdGFiYXNlSWRlbnRpZmllcigp
KTsKKyAgICAKKyAgICAgICAgICAgIGludCByZXN1bHQgPSByZW1vdmVRdWVyeS5zdGVwKCk7Cisg
ICAgICAgICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdERvbmUpIHsKKyAgICAgICAgICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byByZW1vdmUgb3JpZ2luIGZyb20gdGhlIGxvY2FsIHN0b3Jh
Z2UgZGF0YWJhc2UgJXMgLSAlaSIsIG1fcGF0aC51dGY4KCkuZGF0YSgpLCByZXN1bHQpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlUXVl
cnkucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVtc1RvU3luYy5jbGVhcigpOwog
fQogCiB2b2lkIExvY2FsU3RvcmFnZTo6Y2xvc2UoKQpAQCAtMTY5LDQgKzM0MywyOSBAQAogICAg
ICAgICBtX3RocmVhZC0+c2NoZWR1bGVTeW5jKGFyZWEpOwogfQogCit2b2lkIExvY2FsU3RvcmFn
ZTo6d2FpdEZvckltcG9ydENvbXBsZXRlKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOworCisgICAgaWYgKG1faW1wb3J0Q29tcGxldGUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2ltcG9ydExvY2spOworICAgIGlmIChtX2ltcG9ydENv
bXBsZXRlKQorICAgICAgICByZXR1cm47CisKKyAgICB3aGlsZSAoIW1faW1wb3J0Q29tcGxldGUp
CisgICAgICAgIG1faW1wb3J0Q29uZGl0aW9uLndhaXQobV9pbXBvcnRMb2NrKTsKKyAgICBBU1NF
UlQobV9pbXBvcnRDb21wbGV0ZSk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlOjptYXJrSW1wb3J0
ZWQoKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgTXV0ZXhMb2NrZXIg
bG9ja2VyKG1faW1wb3J0TG9jayk7CisgICAgbV9pbXBvcnRDb21wbGV0ZSA9IHRydWU7CisgICAg
bV9pbXBvcnRDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IFdlYkNvcmUvZG9tL0V4Y2VwdGlvbkNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvZG9tL0V4Y2VwdGlvbkNvZGUuY3BwCShyZXZpc2lvbiAzOTc5OSkKKysrIFdlYkNvcmUvZG9t
L0V4Y2VwdGlvbkNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OCw3ICs1OCwxMSBAQAogICAg
ICJJTlZBTElEX0FDQ0VTU19FUlIiLAogICAgICJWQUxJREFUSU9OX0VSUiIsCiAgICAgIlRZUEVf
TUlTTUFUQ0hfRVJSIiwKLSAgICAiU0VDVVJJVFlfRVJSIgorICAgICJTRUNVUklUWV9FUlIiLAor
ICAgICJORVRXT1JLX0VSUiIsCisgICAgIkFCT1JUX0VSUiIsCisgICAgIlVSTF9NSVNNQVRDSF9F
UlIiLAorICAgICJRVU9UQV9FWENFRURFRF9FUlIiCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciog
Y29uc3QgcmFuZ2VFeGNlcHRpb25OYW1lc1tdID0gewpJbmRleDogV2ViQ29yZS9kb20vRE9NQ29y
ZUV4Y2VwdGlvbi5pZGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vRE9NQ29yZUV4Y2VwdGlv
bi5pZGwJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9kb20vRE9NQ29yZUV4Y2VwdGlvbi5p
ZGwJKHdvcmtpbmcgY29weSkKQEAgLTY2LDYgKzY2LDE2IEBACiAgICAgICAgIGNvbnN0IHVuc2ln
bmVkIHNob3J0ICAgICAgVkFMSURBVElPTl9FUlIgICAgICAgICAgICAgICAgID0gMTY7CiAgICAg
ICAgIC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDM6CiAgICAgICAgIGNvbnN0IHVuc2lnbmVk
IHNob3J0ICAgICAgVFlQRV9NSVNNQVRDSF9FUlIgICAgICAgICAgICAgID0gMTc7CisgICAgICAg
IC8vIEludHJvZHVjZWQgaW4gSFRNTDU6CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICAg
ICAgU0VDVVJJVFlfRVJSICAgICAgICAgICAgICAgICAgID0gMTg7CisgICAgICAgIC8vIEludHJv
ZHVjZWQgaW4gSFRNTDU6CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICAgICAgTkVUV09S
S19FUlIgICAgICAgICAgICAgICAgICAgID0gMTk7CisgICAgICAgIC8vIEludHJvZHVjZWQgaW4g
SFRNTDU6CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICAgICAgQUJPUlRfRVJSICAgICAg
ICAgICAgICAgICAgICAgID0gMjA7CisgICAgICAgIC8vIEludHJvZHVjZWQgaW4gSFRNTDU6Cisg
ICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICAgICAgVVJMX01JU01BVENIX0VSUiAgICAgICAg
ICAgICAgID0gMjE7CisgICAgICAgIC8vIEludHJvZHVjZWQgaW4gSFRNTDU6CisgICAgICAgIGNv
bnN0IHVuc2lnbmVkIHNob3J0ICAgICAgUVVPVEFfRVhDRUVERURfRVJSICAgICAgICAgICAgID0g
MjI7CiAgICAgfTsKIAogfQpJbmRleDogV2ViQ29yZS9kb20vRXhjZXB0aW9uQ29kZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvZG9tL0V4Y2VwdGlvbkNvZGUuaAkocmV2aXNpb24gMzk3OTkpCisr
KyBXZWJDb3JlL2RvbS9FeGNlcHRpb25Db2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUxLDcgKzUx
LDEzIEBACiAgICAgICAgIFRZUEVfTUlTTUFUQ0hfRVJSID0gMTcsCiAKICAgICAgICAgLy8gWE1M
SHR0cFJlcXVlc3QgZXh0ZW5zaW9uOgotICAgICAgICBTRUNVUklUWV9FUlIgPSAxOAorICAgICAg
ICBTRUNVUklUWV9FUlIgPSAxOCwKKyAgICAKKyAgICAgICAgLy8gSW50cm9kdWNlZCBpbiBIVE1M
NToKKyAgICAgICAgTkVUV09SS19FUlIgPSAxOSwKKyAgICAgICAgQUJPUlRfRVJSID0gMjAsCisg
ICAgICAgIFVSTF9NSVNNQVRDSF9FUlIgPSAyMSwKKyAgICAgICAgUVVPVEFfRVhDRUVERURfRVJS
ID0gMjIKICAgICB9OwogCiAgICAgZW51bSBFeGNlcHRpb25UeXBlIHsKSW5kZXg6IFdlYkNvcmUv
Q2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAzOTgw
OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjggQEAK
KzIwMDktMDEtMTEgIFlhZWwgQWhhcm9uIDx5YWVsLmFoYXJvbkBub2tpYS5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIEFkZGVkIGEgcXVvdGEgZm9y
IExvY2FsIHN0b3JhZ2UsIHRvIGJlIHNldCBieSB0aGUgY2xpZW50LgorICAgICAgICBBZGRlZCB0
aGUgYWJpbGl0eSB0byBkZWxldGUgTG9jYWxTdG9yYWdlIGFuZCBTZXNzaW9uU3RvcmFnZSAgICAg
ICAgCisKKyAgICAgICAgKiBkb20vRE9NQ29yZUV4Y2VwdGlvbi5pZGw6CisgICAgICAgICogZG9t
L0V4Y2VwdGlvbkNvZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKiBkb20v
RXhjZXB0aW9uQ29kZS5oOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKiBsb2FkZXIv
RW1wdHlDbGllbnRzLmg6CisgICAgICAgIChXZWJDb3JlOjpFbXB0eUNocm9tZUNsaWVudDo6cXVv
dGFGb3JMb2NhbFN0b3JhZ2UpOgorICAgICAgICAqIHBhZ2UvQ2hyb21lQ2xpZW50Lmg6CisgICAg
ICAgICogcGFnZS9ET01XaW5kb3cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RE9NV2luZG93Ojpz
ZXNzaW9uU3RvcmFnZSk6CisgICAgICAgICogc3RvcmFnZS9Mb2NhbFN0b3JhZ2UuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdlOjpMb2NhbFN0b3JhZ2UpOgorICAgICAgICAoV2Vi
Q29yZTo6TG9jYWxTdG9yYWdlOjp+TG9jYWxTdG9yYWdlKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
Y2FsU3RvcmFnZTo6c3RvcmFnZUFyZWEpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdl
OjpmdWxsRGF0YWJhc2VGaWxlbmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2U6
Om9yaWdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdlOjpkZWxldGVTdG9yYWdl
QXJlYSk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2U6Om9wZW5JbmRleERhdGFiYXNl
KToKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsU3RvcmFnZTo6cGVyZm9ybUltcG9ydCk6CisgICAg
ICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2U6OnBlcmZvcm1TeW5jKToKKyAgICAgICAgKFdlYkNv
cmU6OkxvY2FsU3RvcmFnZTo6d2FpdEZvckltcG9ydENvbXBsZXRlKToKKyAgICAgICAgKFdlYkNv
cmU6OkxvY2FsU3RvcmFnZTo6bWFya0ltcG9ydGVkKToKKyAgICAgICAgKiBzdG9yYWdlL0xvY2Fs
U3RvcmFnZS5oOgorICAgICAgICAqIHN0b3JhZ2UvTG9jYWxTdG9yYWdlQXJlYS5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2VBcmVhOjpzY2hlZHVsZUZpbmFsU3luYyk6CisgICAg
ICAgIChXZWJDb3JlOjpMb2NhbFN0b3JhZ2VBcmVhOjp3YWl0Rm9ySW1wb3J0Q29tcGxldGUpOgor
ICAgICAgICAoV2ViQ29yZTo6TG9jYWxTdG9yYWdlQXJlYTo6bGVuZ3RoKToKKyAgICAgICAgKFdl
YkNvcmU6OkxvY2FsU3RvcmFnZUFyZWE6OmtleSk6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbFN0
b3JhZ2VBcmVhOjpzZXRJdGVtKToKKyAgICAgICAgKiBzdG9yYWdlL0xvY2FsU3RvcmFnZUFyZWEu
aDoKKyAgICAgICAgKiBzdG9yYWdlL1Nlc3Npb25TdG9yYWdlLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlNlc3Npb25TdG9yYWdlOjpvcmlnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlNlc3Npb25T
dG9yYWdlOjpkZWxldGVTdG9yYWdlQXJlYSk6CisgICAgICAgICogc3RvcmFnZS9TZXNzaW9uU3Rv
cmFnZS5oOgorICAgICAgICAqIHN0b3JhZ2UvU3RvcmFnZS5oOgorICAgICAgICAoV2ViQ29yZTo6
U3RvcmFnZTo6ZGVsZXRlZCk6CisgICAgICAgICogc3RvcmFnZS9TdG9yYWdlQXJlYS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTdG9yYWdlQXJlYTo6U3RvcmFnZUFyZWEpOgorICAgICAgICAoV2Vi
Q29yZTo6U3RvcmFnZUFyZWE6OmludGVybmFsTGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlN0
b3JhZ2VBcmVhOjppbnRlcm5hbEtleSk6CisgICAgICAgIChXZWJDb3JlOjpTdG9yYWdlQXJlYTo6
aW50ZXJuYWxHZXRJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlN0b3JhZ2VBcmVhOjppbnRlcm5h
bFNldEl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZUFyZWE6OmludGVybmFsUmVtb3Zl
SXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpTdG9yYWdlQXJlYTo6aW50ZXJuYWxDbGVhcik6Cisg
ICAgICAgIChXZWJDb3JlOjpTdG9yYWdlQXJlYTo6aW50ZXJuYWxDb250YWlucyk6CisgICAgICAg
ICogc3RvcmFnZS9TdG9yYWdlQXJlYS5oOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZUFyZWE6
OnF1b3RhKToKKyAgICAgICAgKFdlYkNvcmU6OlN0b3JhZ2VBcmVhOjpzZXRRdW90YSk6CisgICAg
ICAgIChXZWJDb3JlOjpTdG9yYWdlQXJlYTo6bWFya0RlbGV0ZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6U3RvcmFnZUFyZWE6OmRlbGV0ZWQpOgorICAgICAgICAqIHN0b3JhZ2UvU3RvcmFnZU1hcC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpTdG9yYWdlTWFwOjpTdG9yYWdlTWFwKToKKyAgICAgICAg
KFdlYkNvcmU6OlN0b3JhZ2VNYXA6OmNvcHkpOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZU1h
cDo6c2V0SXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpTdG9yYWdlTWFwOjpyZW1vdmVJdGVtKToK
KyAgICAgICAgKFdlYkNvcmU6OlN0b3JhZ2VNYXA6OmltcG9ydEl0ZW0pOgorICAgICAgICAqIHN0
b3JhZ2UvU3RvcmFnZU1hcC5oOgorICAgICAgICAoV2ViQ29yZTo6U3RvcmFnZU1hcDo6dG90YWxV
c2FnZSk6CisKIDIwMDktMDEtMTEgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQKSW5kZXg6IFdlYkNvcmUvcGFn
ZS9DaHJvbWVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvQ2hyb21lQ2xpZW50
LmgJKHJldmlzaW9uIDM5Nzk5KQorKysgV2ViQ29yZS9wYWdlL0Nocm9tZUNsaWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMjYsNiArMTI2LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIHByaW50
KEZyYW1lKikgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBleGNlZWRlZERhdGFiYXNlUXVv
dGEoRnJhbWUqLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSkgPSAwOworICAgICAgICB2aXJ0
dWFsIHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90YUZvckxvY2FsU3RvcmFnZShGcmFtZSopID0gMDsK
IAogI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKICAgICAgICAgdmlydHVhbCB2b2lkIGRh
c2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCk7CkluZGV4OiBXZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcAkocmV2aXNpb24gMzk3
OTkpCisrKyBXZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzE1
LDcgKzMxNSw3IEBACiAjaWYgRU5BQkxFKERPTV9TVE9SQUdFKQogU3RvcmFnZSogRE9NV2luZG93
OjpzZXNzaW9uU3RvcmFnZSgpIGNvbnN0CiB7Ci0gICAgaWYgKG1fc2Vzc2lvblN0b3JhZ2UpCisg
ICAgaWYgKG1fc2Vzc2lvblN0b3JhZ2UgJiYgIW1fc2Vzc2lvblN0b3JhZ2UtPmRlbGV0ZWQoKSkK
ICAgICAgICAgcmV0dXJuIG1fc2Vzc2lvblN0b3JhZ2UuZ2V0KCk7CiAgICAgICAgIAogICAgIFBh
Z2UqIHBhZ2UgPSBtX2ZyYW1lLT5wYWdlKCk7CkluZGV4OiBXZWJDb3JlL2xvYWRlci9FbXB0eUNs
aWVudHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkocmV2
aXNpb24gMzk3OTkpCisrKyBXZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkod29ya2luZyBj
b3B5KQpAQCAtMTI3LDYgKzEyNyw3IEBACiAgICAgdmlydHVhbCB2b2lkIHByaW50KEZyYW1lKikg
eyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgZXhjZWVkZWREYXRhYmFzZVF1b3RhKEZyYW1lKiwgY29u
c3QgU3RyaW5nJikgeyB9CisgICAgdmlydHVhbCB1bnNpZ25lZCBsb25nIGxvbmcgcXVvdGFGb3JM
b2NhbFN0b3JhZ2UoRnJhbWUqKSB7IHJldHVybiBVSU5UX01BWDsgfQogCiAgICAgdmlydHVhbCB2
b2lkIHJ1bk9wZW5QYW5lbChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29zZXI+KSB7IH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>