<?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>125431</bug_id>
          
          <creation_ts>2013-12-08 15:28:34 -0800</creation_ts>
          <short_desc>All observable PageLoadState properties should change in an atomic fashion, with properly nested change notifications</short_desc>
          <delta_ts>2013-12-10 18:05:14 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>mitz</reporter>
          <assigned_to>mitz</assigned_to>
          <cc>andersca</cc>
    
    <cc>darin</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>957723</commentid>
    <comment_count>0</comment_count>
    <who name="">mitz</who>
    <bug_when>2013-12-08 15:28:34 -0800</bug_when>
    <thetext>All observable PageLoadState properties should change in an atomic fashion, with properly nested change notifications</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957726</commentid>
    <comment_count>1</comment_count>
      <attachid>218719</attachid>
    <who name="">mitz</who>
    <bug_when>2013-12-08 15:45:05 -0800</bug_when>
    <thetext>Created attachment 218719
Add PageLoadState::commitChangesIfNeeded and Change objects to manage committing changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957974</commentid>
    <comment_count>2</comment_count>
      <attachid>218719</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-12-09 10:40:05 -0800</bug_when>
    <thetext>Comment on attachment 218719
Add PageLoadState::commitChangesIfNeeded and Change objects to manage committing changes

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

The basic approach here seems good. Making sure we don’t forget to commit changes by requiring a change object to make the changes is a clever technique. To me the change object seems like a change delivery deferral object, more like PageGroupLoadDeferrer than anything else. So it’s a little irritating that it’s called “a change”; that doesn’t make it clear that the timing of its destruction is important and observable.

Also kind of sad that the change object doesn’t help us get m_needsCommitting set correctly.

I am not so happy with the unpredictable timing for committing changes when they happen in functions that lack an explicit call to commitChangesIfNeeded. I assume that there is some good reason that this is guaranteed to be OK, but it’s not entirely obvious to me from reading the code. Deferring to the end of the last function that was making a change seems sort of “too far to defer” and yet “not deferred far enough”, but maybe that’s just an unfounded or aesthetic worry.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:32
&gt; +    : m_data()

It seems to me that making m_data const is not the right way to express its semantics. Can we leave it non-const and just take care to modify it only in the commit function? I would suggest that instead of using const we give this a name that makes it clear you should not modify it. It is equally incorrect to modify m_pendingData without setting m_needsCommitting as to modify m_data, so I think the const does not help us enough here; I could argue that we need m_pendingData to be const.

If you decide that you like the const trick, there’s a different const trick we can play with m_pendingData, where we make a function that you have to call to get a non-const reference to it, and that call sets m_needsCommitting so you can’t forget to do that.

Maybe m_uncommittedState and m_committedState are good names. And maybe m_needsCommitting could be renamed m_mayHaveUncommittedChanges, because the boolean doesn’t really indicate whether we need committing. Although I suppose it’s like needsDisplay and such so maybe doesn’t need a name change.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:34
&gt; +    , m_changeCount(0)

I’m not sure that “change count” is a good name for this because that sounds like a count of the total number of changes to page load state. To me it seems to be a count of the number of page load changes that are currently being done, which the names does not make clear. Maybe “outstanding” or “underway” in the name will help.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:37
&gt; +    m_pendingData.state = State::Finished;
&gt; +    m_pendingData.estimatedProgress = 0;

This code could go in a PageLoadState::Data constructor and then we could avoid both the explicit construction of m_data above and avoid these lines of code.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:38
&gt; +    *const_cast&lt;Data*&gt;(&amp;m_data) = m_pendingData;

If we keep it, no need to involve a pointer in this type cast:

    const_cast&lt;Data&amp;&gt;(m_data) = m_pendingData;

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:69
&gt; +void PageLoadState::commitChangesIfNeeded()

I notice that the changes are committed in a particular order. Did we put specific thought into the ordering? If so, please add a brief comment explaining the thinking, including the fact that the “did” ordering is the reverse of the “will”.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:76
&gt; +    bool titleChanged = m_pendingData.title != m_data.title;

The other comparisons below have m_data on left and m_pendingData on the right. Would be nice to be consistent.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:90
&gt; +    *const_cast&lt;Data*&gt;(&amp;m_data) = m_pendingData;

Same const_cast pointer/reference thing here.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:107
&gt;      setState(State::Finished);

Strange that this is done through a function while all the rest is done by setting members of m_pendingData directly.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:118
&gt; -    m_pendingAPIRequestURL = String();
&gt; -    m_provisionalURL = String();
&gt; -    m_url = String();
&gt; +    m_pendingData.pendingAPIRequestURL = String();
&gt; +    m_pendingData.provisionalURL = String();
&gt; +    m_pendingData.url = String();
&gt;  
&gt; -    m_unreachableURL = String();
&gt; +    m_pendingData.unreachableURL = String();
&gt;      m_lastUnreachableURL = String();
&gt;  
&gt; -    callObserverCallback(&amp;Observer::willChangeTitle);
&gt; -    m_title = String();
&gt; -    callObserverCallback(&amp;Observer::didChangeTitle);
&gt; -
&gt; -    callObserverCallback(&amp;Observer::willChangeEstimatedProgress);
&gt; -    m_estimatedProgress = 0;
&gt; -    callObserverCallback(&amp;Observer::didChangeEstimatedProgress);
&gt; +    m_pendingData.title = String();
&gt; +
&gt; +    m_pendingData.estimatedProgress = 0;

Maybe PageLoadState::Data should have a reset member function for this.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:126
&gt; -String PageLoadState::activeURL() const
&gt; +String PageLoadState::activeURL(const Data&amp; data)

Seems like this could be a member of PageLoadState::Data.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:157
&gt;  // Always start progress at initialProgressValue. This helps provide feedback as
&gt;  // soon as a load starts.
&gt;  
&gt;  static const double initialProgressValue = 0.1;

I’d like this better at the top of the file, and I’d like the comment better as a single line.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:331
&gt;  void PageLoadState::setState(State state)

This function is not helpful any more. I suggest inlining it at the call sites.

&gt; Source/WebKit2/UIProcess/PageLoadState.cpp:335
&gt; +    m_pendingData.state = state;

Why do we not set m_needsCommitting here? Couldn’t isLoading or activeURL change based on a state change? This question only arises because we left this as a separate function.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:62
&gt; +        WTF_MAKE_NONCOPYABLE(Change);

Since we have a member that is a reference, we don’t need to use this macro. I like the economy of not using it.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:67
&gt; +        Change(Change&amp;&amp; other)
&gt; +            : m_pageLoadState(other.m_pageLoadState)
&gt; +        {
&gt; +        }

I think the compiler will write this move constructor for us, exactly like this, as long as we don’t declare any move or copy constructors. Unless maybe explicitly defining the private constructor inhibits that? I suggest trying without this and I expect we will see that it “just works”.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:75
&gt; +        friend class PageLoadState;

I suspect that this is unneeded. I seem to recall that a nested class always bestows friendship on the class it is nested in.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:89
&gt; +    Change change() { return Change(*this); }

Since the constructor of Change is not explicit, I don’t think we need to invoke the constructor explicitly here. If we do want to be explicit, then I suggest we use the “explicit” keyword when declaring the constructor.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:90
&gt; +    void commitChangesIfNeeded();

This function doesn’t need “if needed” in its name. It always commits changes if they exist and never commits changes that don’t exist, so I think “commit changes” is a good name for it.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:92
&gt; +    void reset(const Change&amp;);

Since the Change object argument is debug-only it would be a little nicer if we could have found an idiom that optimizes the pointer out entirely. Maybe the assertion would be in an inline function and then the function to do the real work would not take the Change object.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:131
&gt; +    void beginChange() { m_changeCount++; }

I’d use pre-increment since that’s more idiomatic in our code (for reasons that are presumably obsolete).

&gt; Source/WebKit2/UIProcess/PageLoadState.h:154
&gt; +    static String activeURL(const Data&amp;);
&gt; +    static double estimatedProgress(const Data&amp;);

I think both of these would be good as members of Data.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:159
&gt; +    String m_lastUnreachableURL;

It’s not obvious that this is part of m_pendingData and needs to participate in the idiom where you need to set m_needsCommitting if you change it. One way to possibly make that clearer would be to have a struct for uncommitted data that derives from the struct for committed data and includes this field.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:162
&gt; +    int m_changeCount;

I suggest considering unsigned instead of int.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:604
&gt; +    auto change = m_pageLoadState.change();
&gt; +
&gt; +    m_pageLoadState.setPendingAPIRequestURL(change, url);

I think it’s unclear that these change objects are RAII objects and people might overlook the importance of their lifetimes.

Should I be concerned that this change will be committed all the way at the end of this loadURL function rather than earlier, say right after this function call? To put this another way, I would be tempted to write this:

    m_pageLoadState.setPendingAPIRequestURL(m_pageLoadState.change(), url);

Is there something wrong with writing it that way in a case like this where there is only a single change?

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:688
&gt;      if (!isValid())
&gt;          reattachToWebProcess();
&gt;  
&gt; -    m_pageLoadState.setUnreachableURL(unreachableURL);
&gt; +    auto change = m_pageLoadState.change();
&gt; +
&gt; +    m_pageLoadState.setUnreachableURL(change, unreachableURL);

Strangely, in this function we do the work after calling reattachToWebProcess. Inconsistent with the other cases above.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:2420
&gt; +    const String&amp; pendingAPIRequestURL = m_pageLoadState.pendingAPIRequestURL();
&gt; +    auto change = m_pageLoadState.change();
&gt; +
&gt; +    if (request.url() != pendingAPIRequestURL)
&gt; +        m_pageLoadState.clearPendingAPIRequestURL(change);

I think the pendingAPIRequestURL local variable makes this code harder to read. I suggest not using a local for it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>958210</commentid>
    <comment_count>3</comment_count>
      <attachid>218834</attachid>
    <who name="">mitz</who>
    <bug_when>2013-12-09 22:15:31 -0800</bug_when>
    <thetext>Created attachment 218834
Add PageLoadState::commitChanges and Transaction objects to manage committing changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>958214</commentid>
    <comment_count>4</comment_count>
    <who name="">mitz</who>
    <bug_when>2013-12-09 22:40:48 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 218719 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=218719&amp;action=review

Thank you for the detailed review. I’ve posted an updated patch which addresses some of your comments. I will also address some of them below:

&gt; The basic approach here seems good. Making sure we don’t forget to commit changes by requiring a change object to make the changes is a clever technique. To me the change object seems like a change delivery deferral object, more like PageGroupLoadDeferrer than anything else. So it’s a little irritating that it’s called “a change”; that doesn’t make it clear that the timing of its destruction is important and observable.

I have renamed it Transaction, even though arguably the semantics don’t fully match.

&gt; Also kind of sad that the change object doesn’t help us get m_needsCommitting set correctly.

I have addressed this by making the mutating function take a Transaction::Token. Constructing a Token, which is now necessary to cause mutation, now sets the flag correctly. Callers can’t construct a Token themselves, only cause it to be constructed as a side effect of calling a mutating function.

&gt; I am not so happy with the unpredictable timing for committing changes when they happen in functions that lack an explicit call to commitChangesIfNeeded. I assume that there is some good reason that this is guaranteed to be OK, but it’s not entirely obvious to me from reading the code. Deferring to the end of the last function that was making a change seems sort of “too far to defer” and yet “not deferred far enough”, but maybe that’s just an unfounded or aesthetic worry.

PageLoadState is for consumption by clients of the WebKit API, so it is mostly important to commit changes before returning to the client, and sometimes before calling out to the client, but otherwise, while executing in the framework, it’s not important to commit changes. By deferring committing changes until we are almost ready to leave framework code, we may be saving ourselves some reentrancy trouble.

We’ll still need to consider how this mechanism interacts with clients that call the API from multiple threads, to the extent that we’re allowing it.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:32
&gt; &gt; +    : m_data()
&gt; 
&gt; It seems to me that making m_data const is not the right way to express its semantics. Can we leave it non-const and just take care to modify it only in the commit function? I would suggest that instead of using const we give this a name that makes it clear you should not modify it. It is equally incorrect to modify m_pendingData without setting m_needsCommitting as to modify m_data, so I think the const does not help us enough here; I could argue that we need m_pendingData to be const.

I dropped the constness.

&gt; If you decide that you like the const trick, there’s a different const trick we can play with m_pendingData, where we make a function that you have to call to get a non-const reference to it, and that call sets m_needsCommitting so you can’t forget to do that.

I didn’t do this, and I addressed changing the flag differently (see above).

&gt; Maybe m_uncommittedState and m_committedState are good names.

I switched to those names.

&gt; And maybe m_needsCommitting could be renamed m_mayHaveUncommittedChanges, because the boolean doesn’t really indicate whether we need committing. Although I suppose it’s like needsDisplay and such so maybe doesn’t need a name change.

I changed to this name anyway.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:34
&gt; &gt; +    , m_changeCount(0)
&gt; 
&gt; I’m not sure that “change count” is a good name for this because that sounds like a count of the total number of changes to page load state. To me it seems to be a count of the number of page load changes that are currently being done, which the names does not make clear. Maybe “outstanding” or “underway” in the name will help.

Renamed to m_outstandingTransactionCount.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:37
&gt; &gt; +    m_pendingData.state = State::Finished;
&gt; &gt; +    m_pendingData.estimatedProgress = 0;
&gt; 
&gt; This code could go in a PageLoadState::Data constructor and then we could avoid both the explicit construction of m_data above and avoid these lines of code.

Moved to the Data constructor.

&gt; I notice that the changes are committed in a particular order. Did we put specific thought into the ordering? If so, please add a brief comment explaining the thinking, including the fact that the “did” ordering is the reverse of the “will”.

The ordering doesn’t matter much, and I haven’t put much thought into it. We may find that we need to change it, but the order should not be part of the API. The “did” being in reverse order to the “will” is a requirement of Cocoa Key-Value Observing (which is our only concrete Observer so far), and I added a comment to the effect.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:76
&gt; &gt; +    bool titleChanged = m_pendingData.title != m_data.title;
&gt; 
&gt; The other comparisons below have m_data on left and m_pendingData on the right. Would be nice to be consistent.

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:107
&gt; &gt;      setState(State::Finished);
&gt; 
&gt; Strange that this is done through a function while all the rest is done by setting members of m_pendingData directly.

Fixed.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:118
&gt; &gt; -    m_pendingAPIRequestURL = String();
&gt; &gt; -    m_provisionalURL = String();
&gt; &gt; -    m_url = String();
&gt; &gt; +    m_pendingData.pendingAPIRequestURL = String();
&gt; &gt; +    m_pendingData.provisionalURL = String();
&gt; &gt; +    m_pendingData.url = String();
&gt; &gt;  
&gt; &gt; -    m_unreachableURL = String();
&gt; &gt; +    m_pendingData.unreachableURL = String();
&gt; &gt;      m_lastUnreachableURL = String();
&gt; &gt;  
&gt; &gt; -    callObserverCallback(&amp;Observer::willChangeTitle);
&gt; &gt; -    m_title = String();
&gt; &gt; -    callObserverCallback(&amp;Observer::didChangeTitle);
&gt; &gt; -
&gt; &gt; -    callObserverCallback(&amp;Observer::willChangeEstimatedProgress);
&gt; &gt; -    m_estimatedProgress = 0;
&gt; &gt; -    callObserverCallback(&amp;Observer::didChangeEstimatedProgress);
&gt; &gt; +    m_pendingData.title = String();
&gt; &gt; +
&gt; &gt; +    m_pendingData.estimatedProgress = 0;
&gt; 
&gt; Maybe PageLoadState::Data should have a reset member function for this.

I think of Data as a simple way to get two instances of the data members we need to duplicate. I don’t want to put logic into it.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:126
&gt; &gt; -String PageLoadState::activeURL() const
&gt; &gt; +String PageLoadState::activeURL(const Data&amp; data)
&gt; 
&gt; Seems like this could be a member of PageLoadState::Data.

See above.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:157
&gt; &gt;  // Always start progress at initialProgressValue. This helps provide feedback as
&gt; &gt;  // soon as a load starts.
&gt; &gt;  
&gt; &gt;  static const double initialProgressValue = 0.1;
&gt; 
&gt; I’d like this better at the top of the file, and I’d like the comment better as a single line.

Done.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.cpp:331
&gt; &gt;  void PageLoadState::setState(State state)
&gt; 
&gt; This function is not helpful any more. I suggest inlining it at the call sites.

Done.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:62
&gt; &gt; +        WTF_MAKE_NONCOPYABLE(Change);
&gt; 
&gt; Since we have a member that is a reference, we don’t need to use this macro. I like the economy of not using it.

Forgot to remove this before posting the patch. Maybe I’ll remember to do it before committing it!

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:67
&gt; &gt; +        Change(Change&amp;&amp; other)
&gt; &gt; +            : m_pageLoadState(other.m_pageLoadState)
&gt; &gt; +        {
&gt; &gt; +        }
&gt; 
&gt; I think the compiler will write this move constructor for us, exactly like this, as long as we don’t declare any move or copy constructors. Unless maybe explicitly defining the private constructor inhibits that? I suggest trying without this and I expect we will see that it “just works”.

It didn’t work, at least not with the WTF_MAKE_NONCOPYABLE in place.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:75
&gt; &gt; +        friend class PageLoadState;
&gt; 
&gt; I suspect that this is unneeded. I seem to recall that a nested class always bestows friendship on the class it is nested in.

It is needed.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:89
&gt; &gt; +    Change change() { return Change(*this); }
&gt; 
&gt; Since the constructor of Change is not explicit, I don’t think we need to invoke the constructor explicitly here. If we do want to be explicit, then I suggest we use the “explicit” keyword when declaring the constructor.

Changed to return *this.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:90
&gt; &gt; +    void commitChangesIfNeeded();
&gt; 
&gt; This function doesn’t need “if needed” in its name. It always commits changes if they exist and never commits changes that don’t exist, so I think “commit changes” is a good name for it.

Removed ifNeeded from the name.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:92
&gt; &gt; +    void reset(const Change&amp;);
&gt; 
&gt; Since the Change object argument is debug-only it would be a little nicer if we could have found an idiom that optimizes the pointer out entirely. Maybe the assertion would be in an inline function and then the function to do the real work would not take the Change object.

The mutating functions now take a Token, which have no data members or virtual functions when assertions are disabled. I don’t know whether that allows the compiler to not pass a pointer, but I’d like to think it does.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:131
&gt; &gt; +    void beginChange() { m_changeCount++; }
&gt; 
&gt; I’d use pre-increment since that’s more idiomatic in our code (for reasons that are presumably obsolete).

Done!

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:154
&gt; &gt; +    static String activeURL(const Data&amp;);
&gt; &gt; +    static double estimatedProgress(const Data&amp;);
&gt; 
&gt; I think both of these would be good as members of Data.

I disagree.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:159
&gt; &gt; +    String m_lastUnreachableURL;
&gt; 
&gt; It’s not obvious that this is part of m_pendingData and needs to participate in the idiom where you need to set m_needsCommitting if you change it.

It’s not obvious because it’s not true, as far as I understand.

&gt; &gt; Source/WebKit2/UIProcess/PageLoadState.h:162
&gt; &gt; +    int m_changeCount;
&gt; 
&gt; I suggest considering unsigned instead of int.

Done.

&gt; &gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:604
&gt; &gt; +    auto change = m_pageLoadState.change();
&gt; &gt; +
&gt; &gt; +    m_pageLoadState.setPendingAPIRequestURL(change, url);
&gt; 
&gt; I think it’s unclear that these change objects are RAII objects and people might overlook the importance of their lifetimes.

It’s possible. Hopefully people will look at existing code and at least copy it if they don’t understand why it is the way it is.

&gt; Should I be concerned that this change will be committed all the way at the end of this loadURL function rather than earlier, say right after this function call? To put this another way, I would be tempted to write this:
&gt; 
&gt;     m_pageLoadState.setPendingAPIRequestURL(m_pageLoadState.change(), url);
&gt; 
&gt; Is there something wrong with writing it that way in a case like this where there is only a single change?

No, but I’ve deliberately avoided this pattern so that people aren’t tempted to do it in functions that do multiple changes. I wish there was a way to prevent passing a temporary Change (now: Transaction::Token).

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:688
&gt; &gt;      if (!isValid())
&gt; &gt;          reattachToWebProcess();
&gt; &gt;  
&gt; &gt; -    m_pageLoadState.setUnreachableURL(unreachableURL);
&gt; &gt; +    auto change = m_pageLoadState.change();
&gt; &gt; +
&gt; &gt; +    m_pageLoadState.setUnreachableURL(change, unreachableURL);
&gt; 
&gt; Strangely, in this function we do the work after calling reattachToWebProcess. Inconsistent with the other cases above.

The change log mentions how this addresses a FIXME. Maybe the inconsistency is more important than the FIXME. Maybe we can rely more on KVO in our Cocoa API and remove some of the delegate methods so that this ordering issue becomes moot (for Cocoa, at least).

I think it would be interesting to see how far we can go with an API that doesn’t have a callback like “the provisional request was redirected” because clients can just observe that the provisional URL has changed. Is that not enough information for a client?

&gt; &gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:2420
&gt; &gt; +    const String&amp; pendingAPIRequestURL = m_pageLoadState.pendingAPIRequestURL();
&gt; &gt; +    auto change = m_pageLoadState.change();
&gt; &gt; +
&gt; &gt; +    if (request.url() != pendingAPIRequestURL)
&gt; &gt; +        m_pageLoadState.clearPendingAPIRequestURL(change);
&gt; 
&gt; I think the pendingAPIRequestURL local variable makes this code harder to read. I suggest not using a local for it.

Removed. I made this change back when I had a draconian version of the PageLoadState API that disallowed reading whenever there were outstanding Changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>958583</commentid>
    <comment_count>5</comment_count>
      <attachid>218834</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2013-12-10 17:39:20 -0800</bug_when>
    <thetext>Comment on attachment 218834
Add PageLoadState::commitChanges and Transaction objects to manage committing changes

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

&gt; Source/WebKit2/ChangeLog:26
&gt; +        (WebKit::PageLoadState::endTransaction): Added. Calles when a Transaction is desctructed.

Desctructed.

&gt; Source/WebKit2/ChangeLog:69
&gt; +        and made its consturctor initialize state and estimatedProgress.

Consturctor.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:67
&gt; +        Transaction(Transaction&amp;&amp; other)
&gt; +            : m_pageLoadState(other.m_pageLoadState)
&gt; +        {
&gt; +        }

I think this move constructor should “empty out” the old object. 

Otherwise you could get into situations where a moved-from transaction object still invokes endTransaction(). One way to do this is to have a boolean flag. I would just make m_pageLoadState a pointer instead and null it out when moving and then check that it’s not null before calling endTransaction inside the Transaction destructor.

&gt; Source/WebKit2/UIProcess/PageLoadState.h:77
&gt; +        Transaction(PageLoadState&amp; pageLoadState)

I think you should make this constructor explicit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>958589</commentid>
    <comment_count>6</comment_count>
    <who name="">mitz</who>
    <bug_when>2013-12-10 18:05:14 -0800</bug_when>
    <thetext>Fixed in &lt;http://trac.webkit.org/r160405&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>218719</attachid>
            <date>2013-12-08 15:45:05 -0800</date>
            <delta_ts>2013-12-09 22:15:29 -0800</delta_ts>
            <desc>Add PageLoadState::commitChangesIfNeeded and Change objects to manage committing changes</desc>
            <filename>bug-125431-20131208154520.patch</filename>
            <type>text/plain</type>
            <size>34334</size>
            <attacher>mitz</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2MDI5MykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDg5IEBACisyMDEzLTEyLTA4ICBEYW4gQmVy
bnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CisKKyAgICAgICAgQWxsIG9ic2VydmFibGUgUGFnZUxv
YWRTdGF0ZSBwcm9wZXJ0aWVzIHNob3VsZCBjaGFuZ2UgaW4gYW4gYXRvbWljIGZhc2hpb24sIHdp
dGggcHJvcGVybHkgbmVzdGVkIGNoYW5nZSBub3RpZmljYXRpb25zCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjU0MzEKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvQ29jb2EvV0tC
cm93c2luZ0NvbnRleHRDb250cm9sbGVyLm1tOgorICAgICAgICBBZGRlZCBQYWdlTG9hZFN0YXRl
T2JzZXJ2ZXI6Ont3aWxsLGRpZH1DaGFuZ2VBY3RpdmVVUkwgb3ZlcnJpZGVzIHRoYXQgY2FsbAor
ICAgICAgICAte3dpbGwsZGlkfUNoYW5nZVZhbHVlRm9yS2V5Oi4KKworICAgICAgICAqIFVJUHJv
Y2Vzcy9QYWdlTG9hZFN0YXRlLmNwcDoKKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6
UGFnZUxvYWRTdGF0ZSk6IEluaXRpYWxpemUgbmV3IG1lbWJlciB2YXJpYWJsZXMuCisgICAgICAg
IChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmVuZENoYW5nZSk6IEFkZGVkLiBDYWxsZWQgd2hlbiBh
IENoYW5nZSBpcyBkZXN0cnVjdGVkLiBEZWNyZW1lbnRzCisgICAgICAgIHRoZSBjaGFuZ2UgY291
bnQsIGFuZCBpZiBpdCBpcyB6ZXJvLCBjb21taXRzIGNoYW5nZXMgb2YgbmVlZGVkLgorICAgICAg
ICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpjb21taXRDaGFuZ2VzSWZOZWVkZWQpOiBBZGRlZC4g
Q2hlY2tzIGZvciBkaWZmZXJlbmNlcyBpbiBvYnNlcnZhYmxlCisgICAgICAgIHByb3BlcnRpZXMg
YmV0d2VlbiB0aGUgY3VycmVudCBzdGF0ZSBhbmQgdGhlIHBlbmRpbmcgc3RhdGUsIHRoZW4gbWFr
ZXMgYXBwcm9wcmlhdGUKKyAgICAgICAgd2lsbENoYW5nZSBPYnNlcnZlciBjYWxsYmFja3MsIHRo
ZW4gY29waWVzIHRoZSBwZW5kaW5nIHN0YXRlIGludG8gdGhlIGN1cnJlbnQgc3RhdGUsIHRoZW4K
KyAgICAgICAgbWFrZXMgYXBwcm9wcmlhdGUgZGlkQ2hhbmdlIE9ic2VydmVyIGNhbGxiYWNrcyBp
biByZXZlcnNlIG9yZGVyLiBBbHNvIGFkZGVkIGFjdGl2ZSBVUkwgdG8KKyAgICAgICAgdGhlIHNl
dCBvZiBvYnNlcnZhYmxlIHByb3BlcnRpZXMuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3Rh
dGU6OnJlc2V0KTogQ2hhbmdlZCB0byB0YWtlIGEgQ2hhbmdlJiwgc2V0IG1fbmVlZHNDb21taXR0
aW5nIHRvIHRydWUsCisgICAgICAgIGFjdCBvbiBtX3BlbmRpbmdEYXRhLCBhbmQgbm90IG1ha2Ug
b2JzZXJ2ZXIgY2FsbGJhY2tzLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjppc0xv
YWRpbmcpOiBDaGFuZ2VkIHRvIGFjY2VzcyBtX2RhdGEuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VM
b2FkU3RhdGU6OmFjdGl2ZVVSTCk6IENoYW5nZWQgdG8gY2FsbCBhIHN0YXRpYyBmdW5jdGlvbiBm
YWN0b3JlZCBvdXQgb2YgdGhpcy4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6ZXN0
aW1hdGVkUHJvZ3Jlc3MpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6
cGVuZGluZ0FQSVJlcXVlc3RVUkwpOiBDaGFuZ2VkIHRvIGFjY2VzcyBtX2RhdGEuCisgICAgICAg
IChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKTogQ2hhbmdl
ZCB0byB0YWtlIGEgQ2hhbmdlJiwgc2V0CisgICAgICAgIG1fbmVlZHNDb21taXR0aW5nIHRvIHRy
dWUsIGFjdCBvbiBtX3BlbmRpbmdEYXRhLCBhbmQgbm90IG1ha2Ugb2JzZXJ2ZXIgY2FsbGJhY2tz
LgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpjbGVhclBlbmRpbmdBUElSZXF1ZXN0
VVJMKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmRpZFN0YXJ0UHJv
dmlzaW9uYWxMb2FkKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmRp
ZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZCk6IERpdHRvLgorICAgICAg
ICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRGYWlsUHJvdmlzaW9uYWxMb2FkKTogRGl0dG8u
CisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmRpZENvbW1pdExvYWQpOiBEaXR0by4K
KyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6ZGlkRmluaXNoTG9hZCk6IERpdHRvLgor
ICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRGYWlsTG9hZCk6IERpdHRvLgorICAg
ICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKTog
RGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OnNldFVucmVhY2hhYmxlVVJM
KTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OnRpdGxlKTogQ2hhbmdl
ZCB0byBhY2Nlc3MgbV9kYXRhLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpzZXRU
aXRsZSk6IENoYW5nZWQgdG8gdGFrZSBhIENoYW5nZSYsIHNldCBtX25lZWRzQ29tbWl0dGluZywg
YW5kCisgICAgICAgIG5vdCBtYWtlIG9ic2VydmVyIGNhbGxiYWNrcy4KKyAgICAgICAgKFdlYktp
dDo6UGFnZUxvYWRTdGF0ZTo6ZGlkU3RhcnRQcm9ncmVzcyk6IERpdHRvLgorICAgICAgICAoV2Vi
S2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRDaGFuZ2VQcm9ncmVzcyk6IERpdHRvLgorICAgICAgICAo
V2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRGaW5pc2hQcm9ncmVzcyk6IERpdHRvLgorICAgICAg
ICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpzZXRTdGF0ZSk6IERpdHRvLgorICAgICAgICAqIFVJ
UHJvY2Vzcy9QYWdlTG9hZFN0YXRlLmg6CisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6
OkNoYW5nZTo6Q2hhbmdlKTogQWRkZWQuIENhbGxzIFBhZ2VMb2FkU3RhdGU6OmJlZ2luQ2hhbmdl
KCkuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OkNoYW5nZTo6fkNoYW5nZSk6IEFk
ZGVkLiBDYWxscyBQYWdlTG9hZFN0YXRlOjplbmRDaGFuZ2UoKS4KKyAgICAgICAgKFdlYktpdDo6
UGFnZUxvYWRTdGF0ZTo6Y2hhbmdlKTogQWRkZWQuIFJldHVybnMgYSBDaGFuZ2UgZm9yIHRoaXMg
UGFnZUxvYWRTdGF0ZS4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6cHJvdmlzaW9u
YWxVUkwpOiBDaGFuZ2VkIHRvIGFjY2VzcyBtX2RhdGEuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VM
b2FkU3RhdGU6OnVybCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjp1
bnJlYWNoYWJsZVVSTCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpi
ZWdpbkNoYW5nZSk6IEFkZGVkLiBJbmNyZW1lbnRzIHRoZSBjaGFuZ2UgY291bnQuCisKKyAgICAg
ICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViUGFn
ZVByb3h5Ojpsb2FkVVJMKTogQ2hhbmdlZCB0byBjcmVhdGUgYSBQYWdlTG9hZFN0YXRlOjpDaGFu
Z2UgYW5kIHBhc3MgaXQKKyAgICAgICAgYWxvbmcuCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQ
cm94eTo6bG9hZFVSTFJlcXVlc3QpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVBy
b3h5Ojpsb2FkQWx0ZXJuYXRlSFRNTFN0cmluZyk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpX
ZWJQYWdlUHJveHk6OnJlbG9hZCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJv
eHk6OmdvRm9yd2FyZCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6Omdv
QmFjayk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmdvVG9CYWNrRm9y
d2FyZEl0ZW0pOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpyZWNlaXZl
ZFBvbGljeURlY2lzaW9uKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6
ZGlkU3RhcnRQcm9ncmVzcyk6IERpdHRvLiBBbHNvIGFkZGVkIGEgY2FsbCB0bworICAgICAgICBQ
YWdlTG9hZFN0YXRlOjpjb21taXRDaGFuZ2VzIGJlZm9yZSBjYWxsaW5nIHRoZSBjbGllbnQsIHNv
IHRoYXQgdGhlIGNsaWVudCBzZWVzIHRoZSB1cGRhdGVkCisgICAgICAgIHN0YXRlLgorICAgICAg
ICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmRpZENoYW5nZVByb2dyZXNzKTogRGl0dG8uCisgICAg
ICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlkRmluaXNoUHJvZ3Jlc3MpOiBEaXR0by4KKyAg
ICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWRTdGFydFByb3Zpc2lvbmFsTG9hZEZvckZy
YW1lKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlkUmVjZWl2ZVNl
cnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAg
KFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWRGYWlsUHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUpOiBE
aXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWRDb21taXRMb2FkRm9yRnJh
bWUpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWRGaW5pc2hMb2Fk
Rm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWRGYWls
TG9hZEZvckZyYW1lKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlk
U2FtZURvY3VtZW50TmF2aWdhdGlvbkZvckZyYW1lKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6
OldlYlBhZ2VQcm94eTo6ZGlkUmVjZWl2ZVRpdGxlRm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAg
KFdlYktpdDo6V2ViUGFnZVByb3h5OjpkZWNpZGVQb2xpY3lGb3JOYXZpZ2F0aW9uQWN0aW9uKTog
Q2hhbmdlZCB0byBjcmVhdGUgYQorICAgICAgICBQYWdlTG9hZFN0YXRlOjpDaGFuZ2UgYW5kIHBh
c3MgaXQgYWxvbmcuCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6cHJvY2Vzc0RpZENy
YXNoKTogRGl0dG8uIFRoaXMgYWRkcmVzc2VkIGEgRklYTUUgYWJvdXQgdGhlIGNsaWVudCBub3QK
KyAgICAgICAgc2VlaW5nIHRoZSBzdGF0ZSBwcmlvciB0byB0aGUgY3Jhc2gsIGJlY2F1c2Ugbm93
IHRoZSBjaGFuZ2VzIGNhdXNlZCBieSByZXNldCgpIGFyZW7igJl0CisgICAgICAgIGNvbW1pdHRl
ZCB1bnRpbCBhZnRlciB0aGUgY2xpZW50IGNhbGxiYWNrLgorCisgICAgICAgICogVUlQcm9jZXNz
L2NmL1dlYlBhZ2VQcm94eUNGLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5Ojpy
ZXN0b3JlRnJvbVNlc3Npb25TdGF0ZURhdGEpOiBDaGFuZ2VkIHRvIGNyZWF0ZSBhCisgICAgICAg
IFBhZ2VMb2FkU3RhdGU6OkNoYW5nZSBhbmQgcGFzcyBpdCBhbG9uZy4KKwogMjAxMy0xMi0wNyAg
U2FtIFdlaW5pZyAgPHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFtDb2NvYV0gUmVtb3ZlIHdl
YlByb2Nlc3NQbHVnSW5Jbml0aWFsaXplOiBmcm9tIHRoZSBXS1dlYlByb2Nlc3NQbHVnSW4gcHJv
dG9jb2wKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9QYWdlTG9hZFN0YXRlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGFnZUxvYWRTdGF0ZS5jcHAJ
KHJldmlzaW9uIDE2MDI5MykKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9QYWdlTG9hZFN0
YXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksOSArMjksMTMgQEAKIG5hbWVzcGFjZSBXZWJL
aXQgewogCiBQYWdlTG9hZFN0YXRlOjpQYWdlTG9hZFN0YXRlKCkKLSAgICA6IG1fc3RhdGUoU3Rh
dGU6OkZpbmlzaGVkKQotICAgICwgbV9lc3RpbWF0ZWRQcm9ncmVzcygwKQoteworICAgIDogbV9k
YXRhKCkKKyAgICAsIG1fbmVlZHNDb21taXR0aW5nKGZhbHNlKQorICAgICwgbV9jaGFuZ2VDb3Vu
dCgwKQoreworICAgIG1fcGVuZGluZ0RhdGEuc3RhdGUgPSBTdGF0ZTo6RmluaXNoZWQ7CisgICAg
bV9wZW5kaW5nRGF0YS5lc3RpbWF0ZWRQcm9ncmVzcyA9IDA7CisgICAgKmNvbnN0X2Nhc3Q8RGF0
YSo+KCZtX2RhdGEpID0gbV9wZW5kaW5nRGF0YTsKIH0KIAogUGFnZUxvYWRTdGF0ZTo6flBhZ2VM
b2FkU3RhdGUoKQpAQCAtNTQsMTg1ICs1OCwyNTkgQEAgdm9pZCBQYWdlTG9hZFN0YXRlOjpyZW1v
dmVPYnNlcnZlcihPYnNlcgogICAgIG1fb2JzZXJ2ZXJzLnJlbW92ZShpbmRleCk7CiB9CiAKLXZv
aWQgUGFnZUxvYWRTdGF0ZTo6cmVzZXQoKQordm9pZCBQYWdlTG9hZFN0YXRlOjplbmRDaGFuZ2Uo
KQoreworICAgIEFTU0VSVChtX2NoYW5nZUNvdW50ID4gMCk7CisKKyAgICBpZiAoIS0tbV9jaGFu
Z2VDb3VudCkKKyAgICAgICAgY29tbWl0Q2hhbmdlc0lmTmVlZGVkKCk7Cit9CisKK3ZvaWQgUGFn
ZUxvYWRTdGF0ZTo6Y29tbWl0Q2hhbmdlc0lmTmVlZGVkKCkKK3sKKyAgICBpZiAoIW1fbmVlZHND
b21taXR0aW5nKQorICAgICAgICByZXR1cm47CisKKyAgICBtX25lZWRzQ29tbWl0dGluZyA9IGZh
bHNlOworCisgICAgYm9vbCB0aXRsZUNoYW5nZWQgPSBtX3BlbmRpbmdEYXRhLnRpdGxlICE9IG1f
ZGF0YS50aXRsZTsKKyAgICBib29sIGlzTG9hZGluZ0NoYW5nZWQgPSBpc0xvYWRpbmdTdGF0ZSht
X2RhdGEuc3RhdGUpICE9IGlzTG9hZGluZ1N0YXRlKG1fcGVuZGluZ0RhdGEuc3RhdGUpOworICAg
IGJvb2wgYWN0aXZlVVJMQ2hhbmdlZCA9IGFjdGl2ZVVSTChtX2RhdGEpICE9IGFjdGl2ZVVSTCht
X3BlbmRpbmdEYXRhKTsKKyAgICBib29sIGVzdGltYXRlZFByb2dyZXNzQ2hhbmdlZCA9IGVzdGlt
YXRlZFByb2dyZXNzKG1fZGF0YSkgIT0gZXN0aW1hdGVkUHJvZ3Jlc3MobV9wZW5kaW5nRGF0YSk7
CisKKyAgICBpZiAodGl0bGVDaGFuZ2VkKQorICAgICAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygm
T2JzZXJ2ZXI6OndpbGxDaGFuZ2VUaXRsZSk7CisgICAgaWYgKGlzTG9hZGluZ0NoYW5nZWQpCisg
ICAgICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZUlzTG9hZGlu
Zyk7CisgICAgaWYgKGFjdGl2ZVVSTENoYW5nZWQpCisgICAgICAgIGNhbGxPYnNlcnZlckNhbGxi
YWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZUFjdGl2ZVVSTCk7CisgICAgaWYgKGVzdGltYXRlZFBy
b2dyZXNzQ2hhbmdlZCkKKyAgICAgICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjp3
aWxsQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOworCisgICAgKmNvbnN0X2Nhc3Q8RGF0YSo+KCZt
X2RhdGEpID0gbV9wZW5kaW5nRGF0YTsKKworICAgIGlmIChlc3RpbWF0ZWRQcm9ncmVzc0NoYW5n
ZWQpCisgICAgICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdlRXN0
aW1hdGVkUHJvZ3Jlc3MpOworICAgIGlmIChhY3RpdmVVUkxDaGFuZ2VkKQorICAgICAgICBjYWxs
T2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OmRpZENoYW5nZUFjdGl2ZVVSTCk7CisgICAgaWYg
KGlzTG9hZGluZ0NoYW5nZWQpCisgICAgICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZl
cjo6ZGlkQ2hhbmdlSXNMb2FkaW5nKTsKKyAgICBpZiAodGl0bGVDaGFuZ2VkKQorICAgICAgICBj
YWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OmRpZENoYW5nZVRpdGxlKTsKK30KKwordm9p
ZCBQYWdlTG9hZFN0YXRlOjpyZXNldChjb25zdCBDaGFuZ2UmIGNoYW5nZSkKIHsKKyAgICBBU1NF
UlRfVU5VU0VEKGNoYW5nZSwgJmNoYW5nZS5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhpcyk7CisKKyAg
ICBtX25lZWRzQ29tbWl0dGluZyA9IHRydWU7CiAgICAgc2V0U3RhdGUoU3RhdGU6OkZpbmlzaGVk
KTsKIAotICAgIG1fcGVuZGluZ0FQSVJlcXVlc3RVUkwgPSBTdHJpbmcoKTsKLSAgICBtX3Byb3Zp
c2lvbmFsVVJMID0gU3RyaW5nKCk7Ci0gICAgbV91cmwgPSBTdHJpbmcoKTsKKyAgICBtX3BlbmRp
bmdEYXRhLnBlbmRpbmdBUElSZXF1ZXN0VVJMID0gU3RyaW5nKCk7CisgICAgbV9wZW5kaW5nRGF0
YS5wcm92aXNpb25hbFVSTCA9IFN0cmluZygpOworICAgIG1fcGVuZGluZ0RhdGEudXJsID0gU3Ry
aW5nKCk7CiAKLSAgICBtX3VucmVhY2hhYmxlVVJMID0gU3RyaW5nKCk7CisgICAgbV9wZW5kaW5n
RGF0YS51bnJlYWNoYWJsZVVSTCA9IFN0cmluZygpOwogICAgIG1fbGFzdFVucmVhY2hhYmxlVVJM
ID0gU3RyaW5nKCk7CiAKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxD
aGFuZ2VUaXRsZSk7Ci0gICAgbV90aXRsZSA9IFN0cmluZygpOwotICAgIGNhbGxPYnNlcnZlckNh
bGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdlVGl0bGUpOwotCi0gICAgY2FsbE9ic2VydmVyQ2Fs
bGJhY2soJk9ic2VydmVyOjp3aWxsQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOwotICAgIG1fZXN0
aW1hdGVkUHJvZ3Jlc3MgPSAwOwotICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6
ZGlkQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOworICAgIG1fcGVuZGluZ0RhdGEudGl0bGUgPSBT
dHJpbmcoKTsKKworICAgIG1fcGVuZGluZ0RhdGEuZXN0aW1hdGVkUHJvZ3Jlc3MgPSAwOwogfQog
CiBib29sIFBhZ2VMb2FkU3RhdGU6OmlzTG9hZGluZygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlz
TG9hZGluZ1N0YXRlKG1fc3RhdGUpOworICAgIHJldHVybiBpc0xvYWRpbmdTdGF0ZShtX2RhdGEu
c3RhdGUpOwogfQogCi1TdHJpbmcgUGFnZUxvYWRTdGF0ZTo6YWN0aXZlVVJMKCkgY29uc3QKK1N0
cmluZyBQYWdlTG9hZFN0YXRlOjphY3RpdmVVUkwoY29uc3QgRGF0YSYgZGF0YSkKIHsKICAgICAv
LyBJZiB0aGVyZSBpcyBhIGN1cnJlbnRseSBwZW5kaW5nIFVSTCwgaXQgaXMgdGhlIGFjdGl2ZSBV
UkwsCiAgICAgLy8gZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gbWFpbiBmcmFtZSB5ZXQsIGFzIGl0IG1p
Z2h0IGJlIHRoZQogICAgIC8vIGZpcnN0IEFQSSByZXF1ZXN0LgotICAgIGlmICghbV9wZW5kaW5n
QVBJUmVxdWVzdFVSTC5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuIG1fcGVuZGluZ0FQSVJlcXVl
c3RVUkw7CisgICAgaWYgKCFkYXRhLnBlbmRpbmdBUElSZXF1ZXN0VVJMLmlzTnVsbCgpKQorICAg
ICAgICByZXR1cm4gZGF0YS5wZW5kaW5nQVBJUmVxdWVzdFVSTDsKIAotICAgIGlmICghbV91bnJl
YWNoYWJsZVVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBtX3VucmVhY2hhYmxlVVJMOwor
ICAgIGlmICghZGF0YS51bnJlYWNoYWJsZVVSTC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBk
YXRhLnVucmVhY2hhYmxlVVJMOwogCi0gICAgc3dpdGNoIChtX3N0YXRlKSB7CisgICAgc3dpdGNo
IChkYXRhLnN0YXRlKSB7CiAgICAgY2FzZSBTdGF0ZTo6UHJvdmlzaW9uYWw6Ci0gICAgICAgIHJl
dHVybiBtX3Byb3Zpc2lvbmFsVVJMOworICAgICAgICByZXR1cm4gZGF0YS5wcm92aXNpb25hbFVS
TDsKICAgICBjYXNlIFN0YXRlOjpDb21taXR0ZWQ6CiAgICAgY2FzZSBTdGF0ZTo6RmluaXNoZWQ6
Ci0gICAgICAgIHJldHVybiBtX3VybDsKKyAgICAgICAgcmV0dXJuIGRhdGEudXJsOwogICAgIH0K
IAogICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgIHJldHVybiBTdHJpbmcoKTsKIH0KIAor
U3RyaW5nIFBhZ2VMb2FkU3RhdGU6OmFjdGl2ZVVSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFj
dGl2ZVVSTChtX2RhdGEpOworfQorCiAvLyBBbHdheXMgc3RhcnQgcHJvZ3Jlc3MgYXQgaW5pdGlh
bFByb2dyZXNzVmFsdWUuIFRoaXMgaGVscHMgcHJvdmlkZSBmZWVkYmFjayBhcwogLy8gc29vbiBh
cyBhIGxvYWQgc3RhcnRzLgogCiBzdGF0aWMgY29uc3QgZG91YmxlIGluaXRpYWxQcm9ncmVzc1Zh
bHVlID0gMC4xOwogCi1kb3VibGUgUGFnZUxvYWRTdGF0ZTo6ZXN0aW1hdGVkUHJvZ3Jlc3MoKSBj
b25zdAorZG91YmxlIFBhZ2VMb2FkU3RhdGU6OmVzdGltYXRlZFByb2dyZXNzKGNvbnN0IERhdGEm
IGRhdGEpCiB7Ci0gICAgaWYgKCFtX3BlbmRpbmdBUElSZXF1ZXN0VVJMLmlzTnVsbCgpKQorICAg
IGlmICghZGF0YS5wZW5kaW5nQVBJUmVxdWVzdFVSTC5pc051bGwoKSkKICAgICAgICAgcmV0dXJu
IGluaXRpYWxQcm9ncmVzc1ZhbHVlOwogCi0gICAgcmV0dXJuIG1fZXN0aW1hdGVkUHJvZ3Jlc3M7
CisgICAgcmV0dXJuIGRhdGEuZXN0aW1hdGVkUHJvZ3Jlc3M7Cit9CisKK2RvdWJsZSBQYWdlTG9h
ZFN0YXRlOjplc3RpbWF0ZWRQcm9ncmVzcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGVzdGltYXRl
ZFByb2dyZXNzKG1fZGF0YSk7CiB9CiAKIGNvbnN0IFN0cmluZyYgUGFnZUxvYWRTdGF0ZTo6cGVu
ZGluZ0FQSVJlcXVlc3RVUkwoKSBjb25zdAogewotICAgIHJldHVybiBtX3BlbmRpbmdBUElSZXF1
ZXN0VVJMOworICAgIHJldHVybiBtX2RhdGEucGVuZGluZ0FQSVJlcXVlc3RVUkw7CiB9CiAKLXZv
aWQgUGFnZUxvYWRTdGF0ZTo6c2V0UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgU3RyaW5nJiBw
ZW5kaW5nQVBJUmVxdWVzdFVSTCkKK3ZvaWQgUGFnZUxvYWRTdGF0ZTo6c2V0UGVuZGluZ0FQSVJl
cXVlc3RVUkwoY29uc3QgQ2hhbmdlJiBjaGFuZ2UsIGNvbnN0IFN0cmluZyYgcGVuZGluZ0FQSVJl
cXVlc3RVUkwpCiB7Ci0gICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjp3aWxsQ2hh
bmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOwotICAgIG1fcGVuZGluZ0FQSVJlcXVlc3RVUkwgPSBwZW5k
aW5nQVBJUmVxdWVzdFVSTDsKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OmRp
ZENoYW5nZUVzdGltYXRlZFByb2dyZXNzKTsKKyAgICBBU1NFUlRfVU5VU0VEKGNoYW5nZSwgJmNo
YW5nZS5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhpcyk7CisKKyAgICBtX25lZWRzQ29tbWl0dGluZyA9
IHRydWU7CisgICAgbV9wZW5kaW5nRGF0YS5wZW5kaW5nQVBJUmVxdWVzdFVSTCA9IHBlbmRpbmdB
UElSZXF1ZXN0VVJMOwogfQogCi12b2lkIFBhZ2VMb2FkU3RhdGU6OmNsZWFyUGVuZGluZ0FQSVJl
cXVlc3RVUkwoKQordm9pZCBQYWdlTG9hZFN0YXRlOjpjbGVhclBlbmRpbmdBUElSZXF1ZXN0VVJM
KGNvbnN0IENoYW5nZSYgY2hhbmdlKQogewotICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNl
cnZlcjo6d2lsbENoYW5nZUVzdGltYXRlZFByb2dyZXNzKTsKLSAgICBtX3BlbmRpbmdBUElSZXF1
ZXN0VVJMID0gU3RyaW5nKCk7Ci0gICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpk
aWRDaGFuZ2VFc3RpbWF0ZWRQcm9ncmVzcyk7CisgICAgQVNTRVJUX1VOVVNFRChjaGFuZ2UsICZj
aGFuZ2UubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworCisgICAgbV9uZWVkc0NvbW1pdHRpbmcg
PSB0cnVlOworICAgIG1fcGVuZGluZ0RhdGEucGVuZGluZ0FQSVJlcXVlc3RVUkwgPSBTdHJpbmco
KTsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRTdGFydFByb3Zpc2lvbmFsTG9hZChjb25z
dCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB1bnJlYWNoYWJsZVVSTCkKK3ZvaWQgUGFnZUxv
YWRTdGF0ZTo6ZGlkU3RhcnRQcm92aXNpb25hbExvYWQoY29uc3QgQ2hhbmdlJiBjaGFuZ2UsIGNv
bnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIHVucmVhY2hhYmxlVVJMKQogewotICAgIEFT
U0VSVChtX3Byb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CisgICAgQVNTRVJUX1VOVVNFRChjaGFu
Z2UsICZjaGFuZ2UubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVChtX3BlbmRp
bmdEYXRhLnByb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CiAKKyAgICBtX25lZWRzQ29tbWl0dGlu
ZyA9IHRydWU7CiAgICAgc2V0U3RhdGUoU3RhdGU6OlByb3Zpc2lvbmFsKTsKIAotICAgIG1fcHJv
dmlzaW9uYWxVUkwgPSB1cmw7CisgICAgbV9wZW5kaW5nRGF0YS5wcm92aXNpb25hbFVSTCA9IHVy
bDsKIAotICAgIHNldFVucmVhY2hhYmxlVVJMKHVucmVhY2hhYmxlVVJMKTsKKyAgICBzZXRVbnJl
YWNoYWJsZVVSTChjaGFuZ2UsIHVucmVhY2hhYmxlVVJMKTsKIH0KIAotdm9pZCBQYWdlTG9hZFN0
YXRlOjpkaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbExvYWQoY29uc3QgU3Ry
aW5nJiB1cmwpCit2b2lkIFBhZ2VMb2FkU3RhdGU6OmRpZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZv
clByb3Zpc2lvbmFsTG9hZChjb25zdCBDaGFuZ2UmIGNoYW5nZSwgY29uc3QgU3RyaW5nJiB1cmwp
CiB7Ci0gICAgQVNTRVJUKG1fc3RhdGUgPT0gU3RhdGU6OlByb3Zpc2lvbmFsKTsKKyAgICBBU1NF
UlRfVU5VU0VEKGNoYW5nZSwgJmNoYW5nZS5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhpcyk7CisgICAg
QVNTRVJUKG1fcGVuZGluZ0RhdGEuc3RhdGUgPT0gU3RhdGU6OlByb3Zpc2lvbmFsKTsKIAotICAg
IG1fcHJvdmlzaW9uYWxVUkwgPSB1cmw7CisgICAgbV9uZWVkc0NvbW1pdHRpbmcgPSB0cnVlOwor
ICAgIG1fcGVuZGluZ0RhdGEucHJvdmlzaW9uYWxVUkwgPSB1cmw7CiB9CiAKLXZvaWQgUGFnZUxv
YWRTdGF0ZTo6ZGlkRmFpbFByb3Zpc2lvbmFsTG9hZCgpCit2b2lkIFBhZ2VMb2FkU3RhdGU6OmRp
ZEZhaWxQcm92aXNpb25hbExvYWQoY29uc3QgQ2hhbmdlJiBjaGFuZ2UpCiB7Ci0gICAgQVNTRVJU
KG1fc3RhdGUgPT0gU3RhdGU6OlByb3Zpc2lvbmFsKTsKKyAgICBBU1NFUlRfVU5VU0VEKGNoYW5n
ZSwgJmNoYW5nZS5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhpcyk7CisgICAgQVNTRVJUKG1fcGVuZGlu
Z0RhdGEuc3RhdGUgPT0gU3RhdGU6OlByb3Zpc2lvbmFsKTsKIAorICAgIG1fbmVlZHNDb21taXR0
aW5nID0gdHJ1ZTsKICAgICBzZXRTdGF0ZShTdGF0ZTo6RmluaXNoZWQpOwogCi0gICAgbV9wcm92
aXNpb25hbFVSTCA9IFN0cmluZygpOwotICAgIG1fdW5yZWFjaGFibGVVUkwgPSBtX2xhc3RVbnJl
YWNoYWJsZVVSTDsKKyAgICBtX3BlbmRpbmdEYXRhLnByb3Zpc2lvbmFsVVJMID0gU3RyaW5nKCk7
CisgICAgbV9wZW5kaW5nRGF0YS51bnJlYWNoYWJsZVVSTCA9IG1fbGFzdFVucmVhY2hhYmxlVVJM
OwogfQogCi12b2lkIFBhZ2VMb2FkU3RhdGU6OmRpZENvbW1pdExvYWQoKQordm9pZCBQYWdlTG9h
ZFN0YXRlOjpkaWRDb21taXRMb2FkKGNvbnN0IENoYW5nZSYgY2hhbmdlKQogewotICAgIEFTU0VS
VChtX3N0YXRlID09IFN0YXRlOjpQcm92aXNpb25hbCk7CisgICAgQVNTRVJUX1VOVVNFRChjaGFu
Z2UsICZjaGFuZ2UubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVChtX3BlbmRp
bmdEYXRhLnN0YXRlID09IFN0YXRlOjpQcm92aXNpb25hbCk7CiAKKyAgICBtX25lZWRzQ29tbWl0
dGluZyA9IHRydWU7CiAgICAgc2V0U3RhdGUoU3RhdGU6OkNvbW1pdHRlZCk7CiAKLSAgICBtX3Vy
bCA9IG1fcHJvdmlzaW9uYWxVUkw7Ci0gICAgbV9wcm92aXNpb25hbFVSTCA9IFN0cmluZygpOwor
ICAgIG1fcGVuZGluZ0RhdGEudXJsID0gbV9wZW5kaW5nRGF0YS5wcm92aXNpb25hbFVSTDsKKyAg
ICBtX3BlbmRpbmdEYXRhLnByb3Zpc2lvbmFsVVJMID0gU3RyaW5nKCk7CiAKLSAgICBtX3RpdGxl
ID0gU3RyaW5nKCk7CisgICAgbV9wZW5kaW5nRGF0YS50aXRsZSA9IFN0cmluZygpOwogfQogCi12
b2lkIFBhZ2VMb2FkU3RhdGU6OmRpZEZpbmlzaExvYWQoKQordm9pZCBQYWdlTG9hZFN0YXRlOjpk
aWRGaW5pc2hMb2FkKGNvbnN0IENoYW5nZSYgY2hhbmdlKQogewotICAgIEFTU0VSVChtX3N0YXRl
ID09IFN0YXRlOjpDb21taXR0ZWQpOwotICAgIEFTU0VSVChtX3Byb3Zpc2lvbmFsVVJMLmlzRW1w
dHkoKSk7CisgICAgQVNTRVJUX1VOVVNFRChjaGFuZ2UsICZjaGFuZ2UubV9wYWdlTG9hZFN0YXRl
ID09IHRoaXMpOworICAgIEFTU0VSVChtX3BlbmRpbmdEYXRhLnN0YXRlID09IFN0YXRlOjpDb21t
aXR0ZWQpOworICAgIEFTU0VSVChtX3BlbmRpbmdEYXRhLnByb3Zpc2lvbmFsVVJMLmlzRW1wdHko
KSk7CiAKKyAgICBtX25lZWRzQ29tbWl0dGluZyA9IHRydWU7CiAgICAgc2V0U3RhdGUoU3RhdGU6
OkZpbmlzaGVkKTsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRGYWlsTG9hZCgpCit2b2lk
IFBhZ2VMb2FkU3RhdGU6OmRpZEZhaWxMb2FkKGNvbnN0IENoYW5nZSYgY2hhbmdlKQogewotICAg
IEFTU0VSVChtX3Byb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CisgICAgQVNTRVJUX1VOVVNFRChj
aGFuZ2UsICZjaGFuZ2UubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVChtX3Bl
bmRpbmdEYXRhLnByb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CiAKKyAgICBtX25lZWRzQ29tbWl0
dGluZyA9IHRydWU7CiAgICAgc2V0U3RhdGUoU3RhdGU6OkZpbmlzaGVkKTsKIH0KIAotdm9pZCBQ
YWdlTG9hZFN0YXRlOjpkaWRTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKGNvbnN0IFN0cmluZyYgdXJs
KQordm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKGNvbnN0IENo
YW5nZSYgY2hhbmdlLCBjb25zdCBTdHJpbmcmIHVybCkKIHsKLSAgICBBU1NFUlQoIW1fdXJsLmlz
RW1wdHkoKSk7CisgICAgQVNTRVJUX1VOVVNFRChjaGFuZ2UsICZjaGFuZ2UubV9wYWdlTG9hZFN0
YXRlID09IHRoaXMpOworICAgIEFTU0VSVCghbV9kYXRhLnVybC5pc0VtcHR5KCkpOwogCi0gICAg
bV91cmwgPSB1cmw7CisgICAgbV9uZWVkc0NvbW1pdHRpbmcgPSB0cnVlOworICAgIG1fcGVuZGlu
Z0RhdGEudXJsID0gdXJsOwogfQogCi12b2lkIFBhZ2VMb2FkU3RhdGU6OnNldFVucmVhY2hhYmxl
VVJMKGNvbnN0IFN0cmluZyYgdW5yZWFjaGFibGVVUkwpCit2b2lkIFBhZ2VMb2FkU3RhdGU6OnNl
dFVucmVhY2hhYmxlVVJMKGNvbnN0IENoYW5nZSYgY2hhbmdlLCBjb25zdCBTdHJpbmcmIHVucmVh
Y2hhYmxlVVJMKQogewotICAgIG1fbGFzdFVucmVhY2hhYmxlVVJMID0gbV91bnJlYWNoYWJsZVVS
TDsKLSAgICBtX3VucmVhY2hhYmxlVVJMID0gdW5yZWFjaGFibGVVUkw7CisgICAgQVNTRVJUX1VO
VVNFRChjaGFuZ2UsICZjaGFuZ2UubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworCisgICAgbV9u
ZWVkc0NvbW1pdHRpbmcgPSB0cnVlOworCisgICAgbV9sYXN0VW5yZWFjaGFibGVVUkwgPSBtX3Bl
bmRpbmdEYXRhLnVucmVhY2hhYmxlVVJMOworICAgIG1fcGVuZGluZ0RhdGEudW5yZWFjaGFibGVV
UkwgPSB1bnJlYWNoYWJsZVVSTDsKIH0KIAogY29uc3QgU3RyaW5nJiBQYWdlTG9hZFN0YXRlOjp0
aXRsZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fdGl0bGU7CisgICAgcmV0dXJuIG1fZGF0YS50
aXRsZTsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRp
dGxlKQordm9pZCBQYWdlTG9hZFN0YXRlOjpzZXRUaXRsZShjb25zdCBDaGFuZ2UmIGNoYW5nZSwg
Y29uc3QgU3RyaW5nJiB0aXRsZSkKIHsKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2
ZXI6OndpbGxDaGFuZ2VUaXRsZSk7Ci0gICAgbV90aXRsZSA9IHRpdGxlOwotICAgIGNhbGxPYnNl
cnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdlVGl0bGUpOworICAgIEFTU0VSVF9VTlVT
RUQoY2hhbmdlLCAmY2hhbmdlLm1fcGFnZUxvYWRTdGF0ZSA9PSB0aGlzKTsKKworICAgIG1fbmVl
ZHNDb21taXR0aW5nID0gdHJ1ZTsKKyAgICBtX3BlbmRpbmdEYXRhLnRpdGxlID0gdGl0bGU7CiB9
CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6ZGlkU3RhcnRQcm9ncmVzcygpCit2b2lkIFBhZ2VMb2Fk
U3RhdGU6OmRpZFN0YXJ0UHJvZ3Jlc3MoY29uc3QgQ2hhbmdlJiBjaGFuZ2UpCiB7Ci0gICAgY2Fs
bE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjp3aWxsQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3Mp
OwotICAgIG1fZXN0aW1hdGVkUHJvZ3Jlc3MgPSBpbml0aWFsUHJvZ3Jlc3NWYWx1ZTsKLSAgICBj
YWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OmRpZENoYW5nZUVzdGltYXRlZFByb2dyZXNz
KTsKKyAgICBBU1NFUlRfVU5VU0VEKGNoYW5nZSwgJmNoYW5nZS5tX3BhZ2VMb2FkU3RhdGUgPT0g
dGhpcyk7CisKKyAgICBtX25lZWRzQ29tbWl0dGluZyA9IHRydWU7CisgICAgbV9wZW5kaW5nRGF0
YS5lc3RpbWF0ZWRQcm9ncmVzcyA9IGluaXRpYWxQcm9ncmVzc1ZhbHVlOwogfQogCi12b2lkIFBh
Z2VMb2FkU3RhdGU6OmRpZENoYW5nZVByb2dyZXNzKGRvdWJsZSB2YWx1ZSkKK3ZvaWQgUGFnZUxv
YWRTdGF0ZTo6ZGlkQ2hhbmdlUHJvZ3Jlc3MoY29uc3QgQ2hhbmdlJiBjaGFuZ2UsIGRvdWJsZSB2
YWx1ZSkKIHsKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxDaGFuZ2VF
c3RpbWF0ZWRQcm9ncmVzcyk7Ci0gICAgbV9lc3RpbWF0ZWRQcm9ncmVzcyA9IHZhbHVlOwotICAg
IGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jl
c3MpOworICAgIEFTU0VSVF9VTlVTRUQoY2hhbmdlLCAmY2hhbmdlLm1fcGFnZUxvYWRTdGF0ZSA9
PSB0aGlzKTsKKworICAgIG1fbmVlZHNDb21taXR0aW5nID0gdHJ1ZTsKKyAgICBtX3BlbmRpbmdE
YXRhLmVzdGltYXRlZFByb2dyZXNzID0gdmFsdWU7CiB9CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6
ZGlkRmluaXNoUHJvZ3Jlc3MoKQordm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRGaW5pc2hQcm9ncmVz
cyhjb25zdCBDaGFuZ2UmIGNoYW5nZSkKIHsKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2Jz
ZXJ2ZXI6OndpbGxDaGFuZ2VFc3RpbWF0ZWRQcm9ncmVzcyk7Ci0gICAgbV9lc3RpbWF0ZWRQcm9n
cmVzcyA9IDE7Ci0gICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpkaWRDaGFuZ2VF
c3RpbWF0ZWRQcm9ncmVzcyk7CisgICAgQVNTRVJUX1VOVVNFRChjaGFuZ2UsICZjaGFuZ2UubV9w
YWdlTG9hZFN0YXRlID09IHRoaXMpOworCisgICAgbV9uZWVkc0NvbW1pdHRpbmcgPSB0cnVlOwor
ICAgIG1fcGVuZGluZ0RhdGEuZXN0aW1hdGVkUHJvZ3Jlc3MgPSAxOwogfQogCiBib29sIFBhZ2VM
b2FkU3RhdGU6OmlzTG9hZGluZ1N0YXRlKFN0YXRlIHN0YXRlKQpAQCAtMjUyLDIxICszMzAsOSBA
QCBib29sIFBhZ2VMb2FkU3RhdGU6OmlzTG9hZGluZ1N0YXRlKFN0YXRlCiAKIHZvaWQgUGFnZUxv
YWRTdGF0ZTo6c2V0U3RhdGUoU3RhdGUgc3RhdGUpCiB7Ci0gICAgaWYgKG1fc3RhdGUgPT0gc3Rh
dGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgaXNMb2FkaW5nSXNDaGFuZ2luZyA9IGZh
bHNlOworICAgIEFTU0VSVChtX2NoYW5nZUNvdW50KTsKIAotICAgIGlmIChpc0xvYWRpbmdTdGF0
ZShtX3N0YXRlKSAhPSBpc0xvYWRpbmdTdGF0ZShzdGF0ZSkpCi0gICAgICAgIGlzTG9hZGluZ0lz
Q2hhbmdpbmcgPSB0cnVlOwotCi0gICAgaWYgKGlzTG9hZGluZ0lzQ2hhbmdpbmcpCi0gICAgICAg
IGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZUlzTG9hZGluZyk7Ci0K
LSAgICBtX3N0YXRlID0gc3RhdGU7Ci0KLSAgICBpZiAoaXNMb2FkaW5nSXNDaGFuZ2luZykKLSAg
ICAgICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpkaWRDaGFuZ2VJc0xvYWRpbmcp
OworICAgIG1fcGVuZGluZ0RhdGEuc3RhdGUgPSBzdGF0ZTsKIH0KIAogdm9pZCBQYWdlTG9hZFN0
YXRlOjpjYWxsT2JzZXJ2ZXJDYWxsYmFjayh2b2lkIChPYnNlcnZlcjo6KmNhbGxiYWNrKSgpKQpJ
bmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1BhZ2VMb2FkU3RhdGUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGFnZUxvYWRTdGF0ZS5oCShyZXZpc2lvbiAx
NjAyOTMpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGFnZUxvYWRTdGF0ZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC01MSw2OSArNTEsMTE1IEBAIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB2
b2lkIHdpbGxDaGFuZ2VUaXRsZSgpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIGRpZENoYW5n
ZVRpdGxlKCkgPSAwOwogCisgICAgICAgIHZpcnR1YWwgdm9pZCB3aWxsQ2hhbmdlQWN0aXZlVVJM
KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlQWN0aXZlVVJMKCkgPSAwOwor
CiAgICAgICAgIHZpcnR1YWwgdm9pZCB3aWxsQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MoKSA9IDA7
CiAgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFuZ2VFc3RpbWF0ZWRQcm9ncmVzcygpID0gMDsK
ICAgICB9OwogCisgICAgY2xhc3MgQ2hhbmdlIHsKKyAgICAgICAgV1RGX01BS0VfTk9OQ09QWUFC
TEUoQ2hhbmdlKTsKKyAgICBwdWJsaWM6CisgICAgICAgIENoYW5nZShDaGFuZ2UmJiBvdGhlcikK
KyAgICAgICAgICAgIDogbV9wYWdlTG9hZFN0YXRlKG90aGVyLm1fcGFnZUxvYWRTdGF0ZSkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgfkNoYW5nZSgpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5lbmRDaGFuZ2UoKTsKKyAgICAgICAgfQorCisgICAgcHJp
dmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIFBhZ2VMb2FkU3RhdGU7CisKKyAgICAgICAgQ2hh
bmdlKFBhZ2VMb2FkU3RhdGUmIHBhZ2VMb2FkU3RhdGUpCisgICAgICAgICAgICA6IG1fcGFnZUxv
YWRTdGF0ZShwYWdlTG9hZFN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBtX3BhZ2VMb2Fk
U3RhdGUuYmVnaW5DaGFuZ2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFBhZ2VMb2FkU3RhdGUm
IG1fcGFnZUxvYWRTdGF0ZTsKKyAgICB9OworCiAgICAgdm9pZCBhZGRPYnNlcnZlcihPYnNlcnZl
ciYpOwogICAgIHZvaWQgcmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXImKTsKIAotICAgIHZvaWQgcmVz
ZXQoKTsKKyAgICBDaGFuZ2UgY2hhbmdlKCkgeyByZXR1cm4gQ2hhbmdlKCp0aGlzKTsgfQorICAg
IHZvaWQgY29tbWl0Q2hhbmdlc0lmTmVlZGVkKCk7CisKKyAgICB2b2lkIHJlc2V0KGNvbnN0IENo
YW5nZSYpOwogCiAgICAgYm9vbCBpc0xvYWRpbmcoKSBjb25zdDsKIAotICAgIGNvbnN0IFN0cmlu
ZyYgcHJvdmlzaW9uYWxVUkwoKSBjb25zdCB7IHJldHVybiBtX3Byb3Zpc2lvbmFsVVJMOyB9Ci0g
ICAgY29uc3QgU3RyaW5nJiB1cmwoKSBjb25zdCB7IHJldHVybiBtX3VybDsgfQotICAgIGNvbnN0
IFN0cmluZyYgdW5yZWFjaGFibGVVUkwoKSBjb25zdCB7IHJldHVybiBtX3VucmVhY2hhYmxlVVJM
OyB9CisgICAgY29uc3QgU3RyaW5nJiBwcm92aXNpb25hbFVSTCgpIGNvbnN0IHsgcmV0dXJuIG1f
ZGF0YS5wcm92aXNpb25hbFVSTDsgfQorICAgIGNvbnN0IFN0cmluZyYgdXJsKCkgY29uc3QgeyBy
ZXR1cm4gbV9kYXRhLnVybDsgfQorICAgIGNvbnN0IFN0cmluZyYgdW5yZWFjaGFibGVVUkwoKSBj
b25zdCB7IHJldHVybiBtX2RhdGEudW5yZWFjaGFibGVVUkw7IH0KIAogICAgIFN0cmluZyBhY3Rp
dmVVUkwoKSBjb25zdDsKIAogICAgIGRvdWJsZSBlc3RpbWF0ZWRQcm9ncmVzcygpIGNvbnN0Owog
CiAgICAgY29uc3QgU3RyaW5nJiBwZW5kaW5nQVBJUmVxdWVzdFVSTCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAgdm9pZCBjbGVh
clBlbmRpbmdBUElSZXF1ZXN0VVJMKCk7CisgICAgdm9pZCBzZXRQZW5kaW5nQVBJUmVxdWVzdFVS
TChjb25zdCBDaGFuZ2UmLCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGNsZWFyUGVuZGluZ0FQ
SVJlcXVlc3RVUkwoY29uc3QgQ2hhbmdlJik7CiAKLSAgICB2b2lkIGRpZFN0YXJ0UHJvdmlzaW9u
YWxMb2FkKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIHVucmVhY2hhYmxlVVJMKTsK
LSAgICB2b2lkIGRpZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZChjb25z
dCBTdHJpbmcmIHVybCk7Ci0gICAgdm9pZCBkaWRGYWlsUHJvdmlzaW9uYWxMb2FkKCk7CisgICAg
dm9pZCBkaWRTdGFydFByb3Zpc2lvbmFsTG9hZChjb25zdCBDaGFuZ2UmLCBjb25zdCBTdHJpbmcm
IHVybCwgY29uc3QgU3RyaW5nJiB1bnJlYWNoYWJsZVVSTCk7CisgICAgdm9pZCBkaWRSZWNlaXZl
U2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbExvYWQoY29uc3QgQ2hhbmdlJiwgY29uc3QgU3Ry
aW5nJiB1cmwpOworICAgIHZvaWQgZGlkRmFpbFByb3Zpc2lvbmFsTG9hZChjb25zdCBDaGFuZ2Um
KTsKIAotICAgIHZvaWQgZGlkQ29tbWl0TG9hZCgpOwotICAgIHZvaWQgZGlkRmluaXNoTG9hZCgp
OwotICAgIHZvaWQgZGlkRmFpbExvYWQoKTsKKyAgICB2b2lkIGRpZENvbW1pdExvYWQoY29uc3Qg
Q2hhbmdlJik7CisgICAgdm9pZCBkaWRGaW5pc2hMb2FkKGNvbnN0IENoYW5nZSYpOworICAgIHZv
aWQgZGlkRmFpbExvYWQoY29uc3QgQ2hhbmdlJik7CiAKLSAgICB2b2lkIGRpZFNhbWVEb2N1bWVu
dE5hdmlnYXRpb24oY29uc3QgU3RyaW5nJiB1cmwpOworICAgIHZvaWQgZGlkU2FtZURvY3VtZW50
TmF2aWdhdGlvbihjb25zdCBDaGFuZ2UmLCBjb25zdCBTdHJpbmcmIHVybCk7CiAKLSAgICB2b2lk
IHNldFVucmVhY2hhYmxlVVJMKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgc2V0VW5yZWFjaGFi
bGVVUkwoY29uc3QgQ2hhbmdlJiwgY29uc3QgU3RyaW5nJik7CiAKICAgICBjb25zdCBTdHJpbmcm
IHRpdGxlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmcmKTsKKyAgICB2
b2lkIHNldFRpdGxlKGNvbnN0IENoYW5nZSYsIGNvbnN0IFN0cmluZyYpOwogCi0gICAgdm9pZCBk
aWRTdGFydFByb2dyZXNzKCk7Ci0gICAgdm9pZCBkaWRDaGFuZ2VQcm9ncmVzcyhkb3VibGUpOwot
ICAgIHZvaWQgZGlkRmluaXNoUHJvZ3Jlc3MoKTsKKyAgICB2b2lkIGRpZFN0YXJ0UHJvZ3Jlc3Mo
Y29uc3QgQ2hhbmdlJik7CisgICAgdm9pZCBkaWRDaGFuZ2VQcm9ncmVzcyhjb25zdCBDaGFuZ2Um
LCBkb3VibGUpOworICAgIHZvaWQgZGlkRmluaXNoUHJvZ3Jlc3MoY29uc3QgQ2hhbmdlJik7CiAK
IHByaXZhdGU6CiAgICAgc3RhdGljIGJvb2wgaXNMb2FkaW5nU3RhdGUoU3RhdGUpOwogICAgIHZv
aWQgc2V0U3RhdGUoU3RhdGUpOwogCisgICAgdm9pZCBiZWdpbkNoYW5nZSgpIHsgbV9jaGFuZ2VD
b3VudCsrOyB9CisgICAgdm9pZCBlbmRDaGFuZ2UoKTsKKwogICAgIHZvaWQgY2FsbE9ic2VydmVy
Q2FsbGJhY2sodm9pZCAoT2JzZXJ2ZXI6OiopKCkpOwogCiAgICAgVmVjdG9yPE9ic2VydmVyKj4g
bV9vYnNlcnZlcnM7CiAKLSAgICBTdGF0ZSBtX3N0YXRlOworICAgIHN0cnVjdCBEYXRhIHsKKyAg
ICAgICAgU3RhdGUgc3RhdGU7CiAKLSAgICBTdHJpbmcgbV9wZW5kaW5nQVBJUmVxdWVzdFVSTDsK
KyAgICAgICAgU3RyaW5nIHBlbmRpbmdBUElSZXF1ZXN0VVJMOwogCi0gICAgU3RyaW5nIG1fcHJv
dmlzaW9uYWxVUkw7Ci0gICAgU3RyaW5nIG1fdXJsOworICAgICAgICBTdHJpbmcgcHJvdmlzaW9u
YWxVUkw7CisgICAgICAgIFN0cmluZyB1cmw7CiAKLSAgICBTdHJpbmcgbV91bnJlYWNoYWJsZVVS
TDsKLSAgICBTdHJpbmcgbV9sYXN0VW5yZWFjaGFibGVVUkw7CisgICAgICAgIFN0cmluZyB1bnJl
YWNoYWJsZVVSTDsKIAotICAgIFN0cmluZyBtX3RpdGxlOworICAgICAgICBTdHJpbmcgdGl0bGU7
CisKKyAgICAgICAgZG91YmxlIGVzdGltYXRlZFByb2dyZXNzOworICAgIH07CisKKyAgICBzdGF0
aWMgU3RyaW5nIGFjdGl2ZVVSTChjb25zdCBEYXRhJik7CisgICAgc3RhdGljIGRvdWJsZSBlc3Rp
bWF0ZWRQcm9ncmVzcyhjb25zdCBEYXRhJik7CisKKyAgICBjb25zdCBEYXRhIG1fZGF0YTsKKyAg
ICBEYXRhIG1fcGVuZGluZ0RhdGE7CisKKyAgICBTdHJpbmcgbV9sYXN0VW5yZWFjaGFibGVVUkw7
CiAKLSAgICBkb3VibGUgbV9lc3RpbWF0ZWRQcm9ncmVzczsKKyAgICBib29sIG1fbmVlZHNDb21t
aXR0aW5nOworICAgIGludCBtX2NoYW5nZUNvdW50OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkocmV2
aXNpb24gMTYwMjkzKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTU5OSw3ICs1OTksOSBAQCBib29sIFdlYlBhZ2VQcm94eTo6
bWF5YmVJbml0aWFsaXplU2FuZGJvCiAKIHZvaWQgV2ViUGFnZVByb3h5Ojpsb2FkVVJMKGNvbnN0
IFN0cmluZyYgdXJsLCBBUEk6Ok9iamVjdCogdXNlckRhdGEpCiB7Ci0gICAgbV9wYWdlTG9hZFN0
YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKHVybCk7CisgICAgYXV0byBjaGFuZ2UgPSBtX3Bh
Z2VMb2FkU3RhdGUuY2hhbmdlKCk7CisKKyAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQ
SVJlcXVlc3RVUkwoY2hhbmdlLCB1cmwpOwogCiAgICAgaWYgKCFpc1ZhbGlkKCkpCiAgICAgICAg
IHJlYXR0YWNoVG9XZWJQcm9jZXNzKCk7CkBAIC02MTQsNyArNjE2LDkgQEAgdm9pZCBXZWJQYWdl
UHJveHk6OmxvYWRVUkwoY29uc3QgU3RyaW5nJgogCiB2b2lkIFdlYlBhZ2VQcm94eTo6bG9hZFVS
TFJlcXVlc3QoV2ViVVJMUmVxdWVzdCogdXJsUmVxdWVzdCwgQVBJOjpPYmplY3QqIHVzZXJEYXRh
KQogewotICAgIG1fcGFnZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJUmVxdWVzdFVSTCh1cmxSZXF1
ZXN0LT5yZXNvdXJjZVJlcXVlc3QoKS51cmwoKSk7CisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VM
b2FkU3RhdGUuY2hhbmdlKCk7CisKKyAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQSVJl
cXVlc3RVUkwoY2hhbmdlLCB1cmxSZXF1ZXN0LT5yZXNvdXJjZVJlcXVlc3QoKS51cmwoKSk7CiAK
ICAgICBpZiAoIWlzVmFsaWQoKSkKICAgICAgICAgcmVhdHRhY2hUb1dlYlByb2Nlc3MoKTsKQEAg
LTY3OSw3ICs2ODMsOSBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6bG9hZEFsdGVybmF0ZUhUTUxTdHJp
CiAgICAgaWYgKCFpc1ZhbGlkKCkpCiAgICAgICAgIHJlYXR0YWNoVG9XZWJQcm9jZXNzKCk7CiAK
LSAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0VW5yZWFjaGFibGVVUkwodW5yZWFjaGFibGVVUkwpOwor
ICAgIGF1dG8gY2hhbmdlID0gbV9wYWdlTG9hZFN0YXRlLmNoYW5nZSgpOworCisgICAgbV9wYWdl
TG9hZFN0YXRlLnNldFVucmVhY2hhYmxlVVJMKGNoYW5nZSwgdW5yZWFjaGFibGVVUkwpOwogCiAg
ICAgaWYgKG1fbWFpbkZyYW1lKQogICAgICAgICBtX21haW5GcmFtZS0+c2V0VW5yZWFjaGFibGVV
UkwodW5yZWFjaGFibGVVUkwpOwpAQCAtNzIyLDcgKzcyOCw4IEBAIHZvaWQgV2ViUGFnZVByb3h5
OjpyZWxvYWQoYm9vbCByZWxvYWRGcm8KIAogICAgIGlmIChtX2JhY2tGb3J3YXJkTGlzdC0+Y3Vy
cmVudEl0ZW0oKSkgewogICAgICAgICBTdHJpbmcgdXJsID0gbV9iYWNrRm9yd2FyZExpc3QtPmN1
cnJlbnRJdGVtKCktPnVybCgpOwotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQ
SVJlcXVlc3RVUkwodXJsKTsKKyAgICAgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3RhdGUu
Y2hhbmdlKCk7CisgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJUmVxdWVzdFVS
TChjaGFuZ2UsIHVybCk7CiAKICAgICAgICAgLy8gV2UgbWF5IG5vdCBoYXZlIGFuIGV4dGVuc2lv
biB5ZXQgaWYgYmFjay9mb3J3YXJkIGxpc3Qgd2FzIHJlaW5zdGF0ZWQgYWZ0ZXIgYSBXZWJQcm9j
ZXNzIGNyYXNoIG9yIGEgYnJvd3NlciByZWxhdW5jaAogICAgICAgICBib29sIGNyZWF0ZWRFeHRl
bnNpb24gPSBtYXliZUluaXRpYWxpemVTYW5kYm94RXh0ZW5zaW9uSGFuZGxlKFVSTChVUkwoKSwg
dXJsKSwgc2FuZGJveEV4dGVuc2lvbkhhbmRsZSk7CkBAIC03NDgsNyArNzU1LDkgQEAgdm9pZCBX
ZWJQYWdlUHJveHk6OmdvRm9yd2FyZCgpCiAgICAgaWYgKCFmb3J3YXJkSXRlbSkKICAgICAgICAg
cmV0dXJuOwogCi0gICAgbV9wYWdlTG9hZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKGZv
cndhcmRJdGVtLT51cmwoKSk7CisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3RhdGUuY2hh
bmdlKCk7CisKKyAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQSVJlcXVlc3RVUkwoY2hh
bmdlLCBmb3J3YXJkSXRlbS0+dXJsKCkpOwogCiAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKICAgICAg
ICAgcmVhdHRhY2hUb1dlYlByb2Nlc3NXaXRoSXRlbShmb3J3YXJkSXRlbSk7CkBAIC03NzMsNyAr
NzgyLDkgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdvQmFjaygpCiAgICAgaWYgKCFiYWNrSXRlbSkK
ICAgICAgICAgcmV0dXJuOwogCi0gICAgbV9wYWdlTG9hZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1
ZXN0VVJMKGJhY2tJdGVtLT51cmwoKSk7CisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3Rh
dGUuY2hhbmdlKCk7CisKKyAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQSVJlcXVlc3RV
UkwoY2hhbmdlLCBiYWNrSXRlbS0+dXJsKCkpOwogCiAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKICAg
ICAgICAgcmVhdHRhY2hUb1dlYlByb2Nlc3NXaXRoSXRlbShiYWNrSXRlbSk7CkBAIC03OTYsNyAr
ODA3LDkgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdvVG9CYWNrRm9yd2FyZEl0ZW0oVwogICAgICAg
ICByZXR1cm47CiAgICAgfQogICAgIAotICAgIG1fcGFnZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJ
UmVxdWVzdFVSTChpdGVtLT51cmwoKSk7CisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3Rh
dGUuY2hhbmdlKCk7CisKKyAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQSVJlcXVlc3RV
UkwoY2hhbmdlLCBpdGVtLT51cmwoKSk7CiAKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6
OldlYlBhZ2U6OkdvVG9CYWNrRm9yd2FyZEl0ZW0oaXRlbS0+aXRlbUlEKCkpLCBtX3BhZ2VJRCk7
CiAgICAgbV9wcm9jZXNzLT5yZXNwb25zaXZlbmVzc1RpbWVyKCktPnN0YXJ0KCk7CkBAIC0xNDA0
LDggKzE0MTcsMTAgQEAgdm9pZCBXZWJQYWdlUHJveHk6OnJlY2VpdmVkUG9saWN5RGVjaXNpbwog
ICAgIGlmICghaXNWYWxpZCgpKQogICAgICAgICByZXR1cm47CiAKKyAgICBhdXRvIGNoYW5nZSA9
IG1fcGFnZUxvYWRTdGF0ZS5jaGFuZ2UoKTsKKwogICAgIGlmIChhY3Rpb24gPT0gUG9saWN5SWdu
b3JlKQotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuY2xlYXJQZW5kaW5nQVBJUmVxdWVzdFVSTCgp
OworICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuY2xlYXJQZW5kaW5nQVBJUmVxdWVzdFVSTChjaGFu
Z2UpOwogCiAgICAgdWludDY0X3QgZG93bmxvYWRJRCA9IDA7CiAgICAgaWYgKGFjdGlvbiA9PSBQ
b2xpY3lEb3dubG9hZCkgewpAQCAtMjA0NSwyOCArMjA2MCwzNiBAQCBkb3VibGUgV2ViUGFnZVBy
b3h5Ojplc3RpbWF0ZWRQcm9ncmVzcygpCiAKIHZvaWQgV2ViUGFnZVByb3h5OjpkaWRTdGFydFBy
b2dyZXNzKCkKIHsKLSAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkU3RhcnRQcm9ncmVzcygpOworICAg
IGF1dG8gY2hhbmdlID0gbV9wYWdlTG9hZFN0YXRlLmNoYW5nZSgpOworICAgIG1fcGFnZUxvYWRT
dGF0ZS5kaWRTdGFydFByb2dyZXNzKGNoYW5nZSk7CiAKKyAgICBtX3BhZ2VMb2FkU3RhdGUuY29t
bWl0Q2hhbmdlc0lmTmVlZGVkKCk7CiAgICAgbV9sb2FkZXJDbGllbnQuZGlkU3RhcnRQcm9ncmVz
cyh0aGlzKTsKIH0KIAogdm9pZCBXZWJQYWdlUHJveHk6OmRpZENoYW5nZVByb2dyZXNzKGRvdWJs
ZSB2YWx1ZSkKIHsKLSAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkQ2hhbmdlUHJvZ3Jlc3ModmFsdWUp
OworICAgIGF1dG8gY2hhbmdlID0gbV9wYWdlTG9hZFN0YXRlLmNoYW5nZSgpOworICAgIG1fcGFn
ZUxvYWRTdGF0ZS5kaWRDaGFuZ2VQcm9ncmVzcyhjaGFuZ2UsIHZhbHVlKTsKIAorICAgIG1fcGFn
ZUxvYWRTdGF0ZS5jb21taXRDaGFuZ2VzSWZOZWVkZWQoKTsKICAgICBtX2xvYWRlckNsaWVudC5k
aWRDaGFuZ2VQcm9ncmVzcyh0aGlzKTsKIH0KIAogdm9pZCBXZWJQYWdlUHJveHk6OmRpZEZpbmlz
aFByb2dyZXNzKCkKIHsKLSAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkRmluaXNoUHJvZ3Jlc3MoKTsK
KyAgICBhdXRvIGNoYW5nZSA9IG1fcGFnZUxvYWRTdGF0ZS5jaGFuZ2UoKTsKKyAgICBtX3BhZ2VM
b2FkU3RhdGUuZGlkRmluaXNoUHJvZ3Jlc3MoY2hhbmdlKTsKIAorICAgIG1fcGFnZUxvYWRTdGF0
ZS5jb21taXRDaGFuZ2VzSWZOZWVkZWQoKTsKICAgICBtX2xvYWRlckNsaWVudC5kaWRGaW5pc2hQ
cm9ncmVzcyh0aGlzKTsKIH0KIAogdm9pZCBXZWJQYWdlUHJveHk6OmRpZFN0YXJ0UHJvdmlzaW9u
YWxMb2FkRm9yRnJhbWUodWludDY0X3QgZnJhbWVJRCwgY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0
IFN0cmluZyYgdW5yZWFjaGFibGVVUkwsIENvcmVJUEM6Ok1lc3NhZ2VEZWNvZGVyJiBkZWNvZGVy
KQogewotICAgIG1fcGFnZUxvYWRTdGF0ZS5jbGVhclBlbmRpbmdBUElSZXF1ZXN0VVJMKCk7Cisg
ICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3RhdGUuY2hhbmdlKCk7CisKKyAgICBtX3BhZ2VM
b2FkU3RhdGUuY2xlYXJQZW5kaW5nQVBJUmVxdWVzdFVSTChjaGFuZ2UpOwogCiAgICAgUmVmUHRy
PEFQSTo6T2JqZWN0PiB1c2VyRGF0YTsKICAgICBXZWJDb250ZXh0VXNlck1lc3NhZ2VEZWNvZGVy
IG1lc3NhZ2VEZWNvZGVyKHVzZXJEYXRhLCBwcm9jZXNzKCkpOwpAQCAtMjA3OCwxMSArMjEwMSwx
MiBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6ZGlkU3RhcnRQcm92aXNpb25hbExvCiAgICAgTUVTU0FH
RV9DSEVDS19VUkwodXJsKTsKIAogICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSkKLSAgICAg
ICAgbV9wYWdlTG9hZFN0YXRlLmRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKHVybCwgdW5yZWFjaGFi
bGVVUkwpOworICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkU3RhcnRQcm92aXNpb25hbExvYWQo
Y2hhbmdlLCB1cmwsIHVucmVhY2hhYmxlVVJMKTsKIAogICAgIGZyYW1lLT5zZXRVbnJlYWNoYWJs
ZVVSTCh1bnJlYWNoYWJsZVVSTCk7CiAgICAgZnJhbWUtPmRpZFN0YXJ0UHJvdmlzaW9uYWxMb2Fk
KHVybCk7CiAKKyAgICBtX3BhZ2VMb2FkU3RhdGUuY29tbWl0Q2hhbmdlc0lmTmVlZGVkKCk7CiAg
ICAgbV9sb2FkZXJDbGllbnQuZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFtZSh0aGlzLCBm
cmFtZSwgdXNlckRhdGEuZ2V0KCkpOwogfQogCkBAIC0yMDk3LDExICsyMTIxLDE0IEBAIHZvaWQg
V2ViUGFnZVByb3h5OjpkaWRSZWNlaXZlU2VydmVyUmVkaXIKICAgICBNRVNTQUdFX0NIRUNLKGZy
YW1lKTsKICAgICBNRVNTQUdFX0NIRUNLX1VSTCh1cmwpOwogCisgICAgYXV0byBjaGFuZ2UgPSBt
X3BhZ2VMb2FkU3RhdGUuY2hhbmdlKCk7CisKICAgICBpZiAoZnJhbWUtPmlzTWFpbkZyYW1lKCkp
Ci0gICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5kaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92
aXNpb25hbExvYWQodXJsKTsKKyAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmRpZFJlY2VpdmVTZXJ2
ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZChjaGFuZ2UsIHVybCk7CiAKICAgICBmcmFtZS0+
ZGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2FkKHVybCk7CiAKKyAgICBt
X3BhZ2VMb2FkU3RhdGUuY29tbWl0Q2hhbmdlc0lmTmVlZGVkKCk7CiAgICAgbV9sb2FkZXJDbGll
bnQuZGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUodGhp
cywgZnJhbWUsIHVzZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjExNSwxMSArMjE0MiwxNCBAQCB2
b2lkIFdlYlBhZ2VQcm94eTo6ZGlkRmFpbFByb3Zpc2lvbmFsTG9hCiAgICAgV2ViRnJhbWVQcm94
eSogZnJhbWUgPSBtX3Byb2Nlc3MtPndlYkZyYW1lKGZyYW1lSUQpOwogICAgIE1FU1NBR0VfQ0hF
Q0soZnJhbWUpOwogCisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3RhdGUuY2hhbmdlKCk7
CisKICAgICBpZiAoZnJhbWUtPmlzTWFpbkZyYW1lKCkpCi0gICAgICAgIG1fcGFnZUxvYWRTdGF0
ZS5kaWRGYWlsUHJvdmlzaW9uYWxMb2FkKCk7CisgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5kaWRG
YWlsUHJvdmlzaW9uYWxMb2FkKGNoYW5nZSk7CiAKICAgICBmcmFtZS0+ZGlkRmFpbFByb3Zpc2lv
bmFsTG9hZCgpOwogCisgICAgbV9wYWdlTG9hZFN0YXRlLmNvbW1pdENoYW5nZXNJZk5lZWRlZCgp
OwogICAgIG1fbG9hZGVyQ2xpZW50LmRpZEZhaWxQcm92aXNpb25hbExvYWRXaXRoRXJyb3JGb3JG
cmFtZSh0aGlzLCBmcmFtZSwgZXJyb3IsIHVzZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjE0Niw4
ICsyMTc2LDEwIEBAIHZvaWQgV2ViUGFnZVByb3h5OjpkaWRDb21taXRMb2FkRm9yRnJhbWUKICAg
ICBXZWJGcmFtZVByb3h5KiBmcmFtZSA9IG1fcHJvY2Vzcy0+d2ViRnJhbWUoZnJhbWVJRCk7CiAg
ICAgTUVTU0FHRV9DSEVDSyhmcmFtZSk7CiAKKyAgICBhdXRvIGNoYW5nZSA9IG1fcGFnZUxvYWRT
dGF0ZS5jaGFuZ2UoKTsKKwogICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSkgewotICAgICAg
ICBtX3BhZ2VMb2FkU3RhdGUuZGlkQ29tbWl0TG9hZCgpOworICAgICAgICBtX3BhZ2VMb2FkU3Rh
dGUuZGlkQ29tbWl0TG9hZChjaGFuZ2UpOwogICAgICAgICBtX3BhZ2VDbGllbnQuZGlkQ29tbWl0
TG9hZEZvck1haW5GcmFtZSgpOwogICAgIH0KIApAQCAtMjE3MCw2ICsyMjAyLDcgQEAgdm9pZCBX
ZWJQYWdlUHJveHk6OmRpZENvbW1pdExvYWRGb3JGcmFtZQogICAgIGlmIChmcmFtZS0+aXNNYWlu
RnJhbWUoKSAmJiBzdGF0aWNfY2FzdDxGcmFtZUxvYWRUeXBlPihvcGFxdWVGcmFtZUxvYWRUeXBl
KSA9PSBGcmFtZUxvYWRUeXBlU3RhbmRhcmQpCiAgICAgICAgIG1fcGFnZVNjYWxlRmFjdG9yID0g
MTsKIAorICAgIG1fcGFnZUxvYWRTdGF0ZS5jb21taXRDaGFuZ2VzSWZOZWVkZWQoKTsKICAgICBt
X2xvYWRlckNsaWVudC5kaWRDb21taXRMb2FkRm9yRnJhbWUodGhpcywgZnJhbWUsIHVzZXJEYXRh
LmdldCgpKTsKIH0KIApAQCAtMjE5NiwxMSArMjIyOSwxNCBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6
ZGlkRmluaXNoTG9hZEZvckZyYW1lCiAgICAgV2ViRnJhbWVQcm94eSogZnJhbWUgPSBtX3Byb2Nl
c3MtPndlYkZyYW1lKGZyYW1lSUQpOwogICAgIE1FU1NBR0VfQ0hFQ0soZnJhbWUpOwogCisgICAg
YXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3RhdGUuY2hhbmdlKCk7CisKICAgICBpZiAoZnJhbWUt
PmlzTWFpbkZyYW1lKCkpCi0gICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5kaWRGaW5pc2hMb2FkKCk7
CisgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5kaWRGaW5pc2hMb2FkKGNoYW5nZSk7CiAKICAgICBm
cmFtZS0+ZGlkRmluaXNoTG9hZCgpOwogCisgICAgbV9wYWdlTG9hZFN0YXRlLmNvbW1pdENoYW5n
ZXNJZk5lZWRlZCgpOwogICAgIG1fbG9hZGVyQ2xpZW50LmRpZEZpbmlzaExvYWRGb3JGcmFtZSh0
aGlzLCBmcmFtZSwgdXNlckRhdGEuZ2V0KCkpOwogfQogCkBAIC0yMjE2LDExICsyMjUyLDE0IEBA
IHZvaWQgV2ViUGFnZVByb3h5OjpkaWRGYWlsTG9hZEZvckZyYW1lKHUKIAogICAgIGNsZWFyTG9h
ZERlcGVuZGVudENhbGxiYWNrcygpOwogCisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3Rh
dGUuY2hhbmdlKCk7CisKICAgICBpZiAoZnJhbWUtPmlzTWFpbkZyYW1lKCkpCi0gICAgICAgIG1f
cGFnZUxvYWRTdGF0ZS5kaWRGYWlsTG9hZCgpOworICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuZGlk
RmFpbExvYWQoY2hhbmdlKTsKIAogICAgIGZyYW1lLT5kaWRGYWlsTG9hZCgpOwogCisgICAgbV9w
YWdlTG9hZFN0YXRlLmNvbW1pdENoYW5nZXNJZk5lZWRlZCgpOwogICAgIG1fbG9hZGVyQ2xpZW50
LmRpZEZhaWxMb2FkV2l0aEVycm9yRm9yRnJhbWUodGhpcywgZnJhbWUsIGVycm9yLCB1c2VyRGF0
YS5nZXQoKSk7CiB9CiAKQEAgLTIyMzUsMTIgKzIyNzQsMTUgQEAgdm9pZCBXZWJQYWdlUHJveHk6
OmRpZFNhbWVEb2N1bWVudE5hdmlnYQogICAgIE1FU1NBR0VfQ0hFQ0soZnJhbWUpOwogICAgIE1F
U1NBR0VfQ0hFQ0tfVVJMKHVybCk7CiAKKyAgICBhdXRvIGNoYW5nZSA9IG1fcGFnZUxvYWRTdGF0
ZS5jaGFuZ2UoKTsKKwogICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSkKLSAgICAgICAgbV9w
YWdlTG9hZFN0YXRlLmRpZFNhbWVEb2N1bWVudE5hdmlnYXRpb24odXJsKTsKKyAgICAgICAgbV9w
YWdlTG9hZFN0YXRlLmRpZFNhbWVEb2N1bWVudE5hdmlnYXRpb24oY2hhbmdlLCB1cmwpOwogCi0g
ICAgbV9wYWdlTG9hZFN0YXRlLmNsZWFyUGVuZGluZ0FQSVJlcXVlc3RVUkwoKTsKKyAgICBtX3Bh
Z2VMb2FkU3RhdGUuY2xlYXJQZW5kaW5nQVBJUmVxdWVzdFVSTChjaGFuZ2UpOwogICAgIGZyYW1l
LT5kaWRTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKHVybCk7CiAKKyAgICBtX3BhZ2VMb2FkU3RhdGUu
Y29tbWl0Q2hhbmdlc0lmTmVlZGVkKCk7CiAgICAgbV9sb2FkZXJDbGllbnQuZGlkU2FtZURvY3Vt
ZW50TmF2aWdhdGlvbkZvckZyYW1lKHRoaXMsIGZyYW1lLCBzdGF0aWNfY2FzdDxTYW1lRG9jdW1l
bnROYXZpZ2F0aW9uVHlwZT4ob3BhcXVlU2FtZURvY3VtZW50TmF2aWdhdGlvblR5cGUpLCB1c2Vy
RGF0YS5nZXQoKSk7CiB9CiAKQEAgLTIyNTQsMTEgKzIyOTYsMTQgQEAgdm9pZCBXZWJQYWdlUHJv
eHk6OmRpZFJlY2VpdmVUaXRsZUZvckZyYQogICAgIFdlYkZyYW1lUHJveHkqIGZyYW1lID0gbV9w
cm9jZXNzLT53ZWJGcmFtZShmcmFtZUlEKTsKICAgICBNRVNTQUdFX0NIRUNLKGZyYW1lKTsKIAor
ICAgIGF1dG8gY2hhbmdlID0gbV9wYWdlTG9hZFN0YXRlLmNoYW5nZSgpOworCiAgICAgaWYgKGZy
YW1lLT5pc01haW5GcmFtZSgpKQotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0VGl0bGUodGl0
bGUpOworICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0VGl0bGUoY2hhbmdlLCB0aXRsZSk7CiAK
ICAgICBmcmFtZS0+ZGlkQ2hhbmdlVGl0bGUodGl0bGUpOwogICAgIAorICAgIG1fcGFnZUxvYWRT
dGF0ZS5jb21taXRDaGFuZ2VzSWZOZWVkZWQoKTsKICAgICBtX2xvYWRlckNsaWVudC5kaWRSZWNl
aXZlVGl0bGVGb3JGcmFtZSh0aGlzLCB0aXRsZSwgZnJhbWUsIHVzZXJEYXRhLmdldCgpKTsKIH0K
IApAQCAtMjM2OCw4ICsyNDEzLDExIEBAIHZvaWQgV2ViUGFnZVByb3h5OjpkZWNpZGVQb2xpY3lG
b3JOYXZpZ2EKICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKG1lc3NhZ2VEZWNvZGVyKSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgaWYgKHJlcXVlc3QudXJsKCkgIT0gbV9wYWdlTG9hZFN0YXRlLnBl
bmRpbmdBUElSZXF1ZXN0VVJMKCkpCi0gICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5jbGVhclBlbmRp
bmdBUElSZXF1ZXN0VVJMKCk7CisgICAgY29uc3QgU3RyaW5nJiBwZW5kaW5nQVBJUmVxdWVzdFVS
TCA9IG1fcGFnZUxvYWRTdGF0ZS5wZW5kaW5nQVBJUmVxdWVzdFVSTCgpOworICAgIGF1dG8gY2hh
bmdlID0gbV9wYWdlTG9hZFN0YXRlLmNoYW5nZSgpOworCisgICAgaWYgKHJlcXVlc3QudXJsKCkg
IT0gcGVuZGluZ0FQSVJlcXVlc3RVUkwpCisgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5jbGVhclBl
bmRpbmdBUElSZXF1ZXN0VVJMKGNoYW5nZSk7CiAKICAgICBXZWJGcmFtZVByb3h5KiBmcmFtZSA9
IG1fcHJvY2Vzcy0+d2ViRnJhbWUoZnJhbWVJRCk7CiAgICAgTUVTU0FHRV9DSEVDSyhmcmFtZSk7
CkBAIC0zNjYzLDExICszNzExLDEyIEBAIHZvaWQgV2ViUGFnZVByb3h5Ojpwcm9jZXNzRGlkQ3Jh
c2goKQogCiAgICAgcmVzZXRTdGF0ZUFmdGVyUHJvY2Vzc0V4aXRlZCgpOwogCi0gICAgLy8gRklY
TUU6IENvbnNpZGVyIGNhbGxpbmcgcmVzZXQgYWZ0ZXIgY2FsbGluZyBvdXQgdG8gdGhlIGxvYWRl
ciBjbGllbnQsCi0gICAgLy8gaGF2aW5nIHRoZSBwYWdlIGxvYWQgc3RhdGUgYXZhaWxhYmxlIGNv
dWxkIGJlIHVzZWZ1bC4KLSAgICBtX3BhZ2VMb2FkU3RhdGUucmVzZXQoKTsKKyAgICBhdXRvIGNo
YW5nZSA9IG1fcGFnZUxvYWRTdGF0ZS5jaGFuZ2UoKTsKKworICAgIG1fcGFnZUxvYWRTdGF0ZS5y
ZXNldChjaGFuZ2UpOwogCiAgICAgbV9wYWdlQ2xpZW50LnByb2Nlc3NEaWRDcmFzaCgpOworCiAg
ICAgbV9sb2FkZXJDbGllbnQucHJvY2Vzc0RpZENyYXNoKHRoaXMpOwogfQogCkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL0NvY29hL1dLQnJvd3NpbmdDb250ZXh0Q29udHJvbGxl
ci5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL0NvY29hL1dL
QnJvd3NpbmdDb250ZXh0Q29udHJvbGxlci5tbQkocmV2aXNpb24gMTYwMjkzKQorKysgU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9Db2NvYS9XS0Jyb3dzaW5nQ29udGV4dENvbnRyb2xsZXIu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTg0LDYgKzg0LDE2IEBAIHByaXZhdGU6CiAgICAgICAgIFtt
X2NvbnRyb2xsZXIgZGlkQ2hhbmdlVmFsdWVGb3JLZXk6QCJ0aXRsZSJdOwogICAgIH0KIAorICAg
IHZpcnR1YWwgdm9pZCB3aWxsQ2hhbmdlQWN0aXZlVVJMKCkgT1ZFUlJJREUKKyAgICB7CisgICAg
ICAgIFttX2NvbnRyb2xsZXIgd2lsbENoYW5nZVZhbHVlRm9yS2V5OkAiYWN0aXZlVVJMIl07Cisg
ICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZENoYW5nZUFjdGl2ZVVSTCgpIE9WRVJSSURFCisg
ICAgeworICAgICAgICBbbV9jb250cm9sbGVyIGRpZENoYW5nZVZhbHVlRm9yS2V5OkAiYWN0aXZl
VVJMIl07CisgICAgfQorCiAgICAgdmlydHVhbCB2b2lkIHdpbGxDaGFuZ2VFc3RpbWF0ZWRQcm9n
cmVzcygpIE9WRVJSSURFCiAgICAgewogICAgICAgICBbbV9jb250cm9sbGVyIHdpbGxDaGFuZ2VW
YWx1ZUZvcktleTpAImVzdGltYXRlZFByb2dyZXNzIl07CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvY2YvV2ViUGFnZVByb3h5Q0YuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9jZi9XZWJQYWdlUHJveHlDRi5jcHAJKHJldmlzaW9uIDE2MDI5MykKKysr
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9jZi9XZWJQYWdlUHJveHlDRi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTE1MSw2ICsxNTEsOCBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6cmVzdG9yZUZyb21T
ZXNzaW9uU3RhCiAgICAgICAgICAgICBwcm92aXNpb25hbFVSTCA9IHN0YXRpY19jYXN0PENGU3Ry
aW5nUmVmPih2YWx1ZSk7CiAgICAgfQogCisgICAgYXV0byBjaGFuZ2UgPSBtX3BhZ2VMb2FkU3Rh
dGUuY2hhbmdlKCk7CisKICAgICBpZiAoYmFja0ZvcndhcmRMaXN0RGljdGlvbmFyeSkgewogICAg
ICAgICBpZiAoIW1fYmFja0ZvcndhcmRMaXN0LT5yZXN0b3JlRnJvbUNGRGljdGlvbmFyeVJlcHJl
c2VudGF0aW9uKGJhY2tGb3J3YXJkTGlzdERpY3Rpb25hcnkpKQogICAgICAgICAgICAgTE9HKFNl
c3Npb25TdGF0ZSwgIkZhaWxlZCB0byByZXN0b3JlIGJhY2svZm9yd2FyZCBsaXN0IGZyb20gU2Vz
c2lvbkhpc3RvcnkgZGljdGlvbmFyeSIpOwpAQCAtMTY1LDcgKzE2Nyw3IEBAIHZvaWQgV2ViUGFn
ZVByb3h5OjpyZXN0b3JlRnJvbVNlc3Npb25TdGEKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vz
cygpLnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OlJlc3RvcmVTZXNzaW9uKHN0YXRlKSwgbV9wYWdl
SUQpOwogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoV2Vi
QmFja0ZvcndhcmRMaXN0SXRlbSogaXRlbSA9IG1fYmFja0ZvcndhcmRMaXN0LT5jdXJyZW50SXRl
bSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wYWdlTG9hZFN0YXRlLnNldFBlbmRpbmdB
UElSZXF1ZXN0VVJMKGl0ZW0tPnVybCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFn
ZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJUmVxdWVzdFVSTChjaGFuZ2UsIGl0ZW0tPnVybCgpKTsK
IAogICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6V2ViUGFnZTo6
UmVzdG9yZVNlc3Npb25BbmROYXZpZ2F0ZVRvQ3VycmVudEl0ZW0oc3RhdGUpLCBtX3BhZ2VJRCk7
CiAgICAgICAgICAgICAgICAgfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>218834</attachid>
            <date>2013-12-09 22:15:31 -0800</date>
            <delta_ts>2013-12-10 17:39:20 -0800</delta_ts>
            <desc>Add PageLoadState::commitChanges and Transaction objects to manage committing changes</desc>
            <filename>bug-125431-20131209221535.patch</filename>
            <type>text/plain</type>
            <size>36967</size>
            <attacher>mitz</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2MDM0NykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEwNiBAQAorMjAxMy0xMi0wOSAgRGFuIEJl
cm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgorCisgICAgICAgIEFsbCBvYnNlcnZhYmxlIFBhZ2VM
b2FkU3RhdGUgcHJvcGVydGllcyBzaG91bGQgY2hhbmdlIGluIGFuIGF0b21pYyBmYXNoaW9uLCB3
aXRoIHByb3Blcmx5IG5lc3RlZCBjaGFuZ2Ugbm90aWZpY2F0aW9ucworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NDMxCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTWFkZSBQYWdlTG9hZFN0YXRlIG1haW50
YWluIHR3byBjb3BpZXMgb2YgaXRzIHN0YXRlIGRhdGEgbWVtYmVycywgb25lIHJlcHJlc2VudGlu
ZyB0aGUKKyAgICAgICAgY29tbWl0dGVkIHN0YXRlIGFuZCBvbmUgcG9zc2libHkgY29udGFpbmlu
ZyB1bmNvbW1pdHRlZCBjaGFuZ2VzLiBXaGVuIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCwKKyAgICAg
ICAgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgYW5kIHRoZSB1bmNvbW1pdHRlZCBzdGF0
ZSBpcyBjb3BpZWQgaW50byB0aGUgY29tbWl0dGVkIHN0YXRlLgorICAgICAgICBDaGFuZ2VzIGNh
biBiZSBjb21taXR0ZWQgZXhwbGljaXRseSBhdCBhbnkgdGltZSwgYnV0IGFyZSBhbHNvIGNvbW1p
dHRlZCB3aGVuIHRoZSBsYXN0CisgICAgICAgIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uIGVuZHMu
IFRyYW5zYWN0aW9ucyBhcmUgUkFJSSBvYmplY3RzIHZlbmRlZCBieSB0aGUgUGFnZUxvYWRTdGF0
ZS4KKyAgICAgICAgTXV0YXRpbmcgdGhlIFBhZ2VMb2FkU3RhdGUgcmVxdWlyZXMgaG9sZGluZyBh
IFRyYW5zYWN0aW9uLCB3aGljaCBpcyBlbmZvcmNlZCBieSBtYWtpbmcgYWxsCisgICAgICAgIHRo
ZSBtdXRhdGluZyBtZW1iZXIgZnVuY3Rpb25zIHRha2UgYSBUcmFuc2FjdGlvbjo6VG9rZW4uIFBh
c3NpbmcgYSBUb2tlbiBhbHNvIG1hcmtzIHRoZQorICAgICAgICBQYWdlTG9hZFN0YXRlIGFzIHBv
c3NpYmx5IGhhdmluZyB1bmNvbW1pdHRlZCBjaGFuZ2VzLgorCisgICAgICAgICogVUlQcm9jZXNz
L0FQSS9Db2NvYS9XS0Jyb3dzaW5nQ29udGV4dENvbnRyb2xsZXIubW06CisgICAgICAgIEFkZGVk
IFBhZ2VMb2FkU3RhdGVPYnNlcnZlcjo6e3dpbGwsZGlkfUNoYW5nZUFjdGl2ZVVSTCBvdmVycmlk
ZXMgdGhhdCBjYWxsCisgICAgICAgIC17d2lsbCxkaWR9Q2hhbmdlVmFsdWVGb3JLZXk6LgorCisg
ICAgICAgICogVUlQcm9jZXNzL1BhZ2VMb2FkU3RhdGUuY3BwOgorICAgICAgICBNb3ZlZCBjb25z
dGFudCBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIGZpbGUgdG8gdGhlIGJlZ2lubmluZyBhbmQgcmV3
b3JkZWQgY29tbWVudC4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6UGFnZUxvYWRT
dGF0ZSk6IEFkZGVkIGluaXRpYWxpemVycyBmb3IgbmV3IG1lbWJlciB2YXJpYWJsZXMsIHJlbW92
ZWQKKyAgICAgICAgaW5pdGlhbGl6YXRpb24gb2YgbWVtYmVycyB0aGF0IGFyZSBub3QgcGFydCBv
ZiBEYXRhLCB3aGljaCBpbml0aWFsaXplcyB0aGVtIGluIGl0cworICAgICAgICBjb25zdHJ1Y3Rv
ci4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6ZW5kVHJhbnNhY3Rpb24pOiBBZGRl
ZC4gQ2FsbGVzIHdoZW4gYSBUcmFuc2FjdGlvbiBpcyBkZXNjdHJ1Y3RlZC4KKyAgICAgICAgRGVj
cmVtZW50cyB0aGUgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24gY291bnQsIGFuZCBpZiBpdCBpcyB6
ZXJvLCBjb21taXRzIGNoYW5nZXMuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmNv
bW1pdENoYW5nZXMpOiBBZGRlZC4gQ2hlY2tzIGZvciBkaWZmZXJlbmNlcyBpbiBvYnNlcnZhYmxl
CisgICAgICAgIHByb3BlcnRpZXMgYmV0d2VlbiB0aGUgY29tbWl0dGVkIHN0YXRlIGFuZCB0aGUg
dW5jb21taXR0ZWQgc3RhdGUsIHRoZW4gbWFrZXMgYXBwcm9wcmlhdGUKKyAgICAgICAgd2lsbENo
YW5nZSBPYnNlcnZlciBjYWxsYmFja3MsIHRoZW4gY29waWVzIHRoZSB1bmNvbW1pdHRlZCBzdGF0
ZSBpbnRvIHRoZSBjb21taXR0ZWQgc3RhdGUsCisgICAgICAgIHRoZW4gbWFrZXMgYXBwcm9wcmlh
dGUgZGlkQ2hhbmdlIE9ic2VydmVyIGNhbGxiYWNrcyBpbiByZXZlcnNlIG9yZGVyLiBBbHNvIGFk
ZGVkIGFjdGl2ZSBVUkwKKyAgICAgICAgdG8gdGhlIHNldCBvZiBvYnNlcnZhYmxlIHByb3BlcnRp
ZXMuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OnJlc2V0KTogQ2hhbmdlZCB0byB0
YWtlIGEgdHJhbnNhY3Rpb24gdG9rZW4sIGFjdCBvbgorICAgICAgICBtX3VuY29tbWl0dGVkU3Rh
dGUsIGFuZCBub3QgbWFrZSBvYnNlcnZlciBjYWxsYmFja3MuCisgICAgICAgIChXZWJLaXQ6OlBh
Z2VMb2FkU3RhdGU6OmlzTG9hZGluZyk6IENoYW5nZWQgdG8gYWNjZXNzIG1fY29tbWl0dGVkU3Rh
dGUuCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmFjdGl2ZVVSTCk6IENoYW5nZWQg
dG8gY2FsbCBhIHN0YXRpYyBmdW5jdGlvbiBmYWN0b3JlZCBvdXQgb2YgdGhpcy4KKyAgICAgICAg
KFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6ZXN0aW1hdGVkUHJvZ3Jlc3MpOiBEaXR0by4KKyAgICAg
ICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6cGVuZGluZ0FQSVJlcXVlc3RVUkwpOiBDaGFuZ2Vk
IHRvIGFjY2VzcyBtX2NvbW1pdHRlZFN0YXRlLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0
YXRlOjpzZXRQZW5kaW5nQVBJUmVxdWVzdFVSTCk6IENoYW5nZWQgdG8gdGFrZSBhIHRyYW5zYWN0
aW9uIHRva2VuLCBhY3QKKyAgICAgICAgb24gbV91bmNvbW1pdHRlZFN0YXRlLCBhbmQgbm90IG1h
a2Ugb2JzZXJ2ZXIgY2FsbGJhY2tzLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpj
bGVhclBlbmRpbmdBUElSZXF1ZXN0VVJMKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VM
b2FkU3RhdGU6OmRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKTogRGl0dG8uCisgICAgICAgIChXZWJL
aXQ6OlBhZ2VMb2FkU3RhdGU6OmRpZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFs
TG9hZCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRGYWlsUHJv
dmlzaW9uYWxMb2FkKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OmRp
ZENvbW1pdExvYWQpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6ZGlk
RmluaXNoTG9hZCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRG
YWlsTG9hZCk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpkaWRTYW1l
RG9jdW1lbnROYXZpZ2F0aW9uKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3Rh
dGU6OnNldFVucmVhY2hhYmxlVVJMKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2Fk
U3RhdGU6OnRpdGxlKTogQ2hhbmdlZCB0byBhY2Nlc3MgbV9jb21taXR0ZWRTdGF0ZS4KKyAgICAg
ICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6c2V0VGl0bGUpOiBDaGFuZ2VkIHRvIHRha2UgYSB0
cmFuc2FjdGlvbiB0b2tlbiwgYWN0IG9uCisgICAgICAgIG1fdW5jb21taXR0ZWRTdGF0ZSwgYW5k
IG5vdCBtYWtlIG9ic2VydmVyIGNhbGxiYWNrcy4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRT
dGF0ZTo6ZGlkU3RhcnRQcm9ncmVzcyk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9h
ZFN0YXRlOjpkaWRDaGFuZ2VQcm9ncmVzcyk6IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpQYWdl
TG9hZFN0YXRlOjpkaWRGaW5pc2hQcm9ncmVzcyk6IERpdHRvLgorICAgICAgICAqIFVJUHJvY2Vz
cy9QYWdlTG9hZFN0YXRlLmg6CisgICAgICAgIChXZWJLaXQ6OlBhZ2VMb2FkU3RhdGU6OlRyYW5z
YWN0aW9uOjpUcmFuc2FjdGlvbik6IEFkZGVkLiBDYWxscworICAgICAgICBQYWdlTG9hZFN0YXRl
OjpiZWdpblRyYW5zYWN0aW9uLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpUcmFu
c2FjdGlvbjo6flRyYW5zYWN0aW9uKTogQWRkZWQuIENhbGxzCisgICAgICAgIFBhZ2VMb2FkU3Rh
dGU6OmVuZFRyYW5zYWN0aW9uLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjpUcmFu
c2FjdGlvbjo6VG9rZW46OlRva2VuKTogQWRkZWQuIFNldHMgbV9tYXlIYXZlVW5jb21taXR0ZWRD
aGFuZ2VzLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjp0cmFuc2FjdGlvbik6IEFk
ZGVkLiBSZXR1cm5zIGEgVHJhbnNhY3Rpb24gZm9yIHRoaXMgUGFnZUxvYWRTdGF0ZS4KKyAgICAg
ICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6cHJvdmlzaW9uYWxVUkwpOiBDaGFuZ2VkIHRvIGFj
Y2VzcyBtX2NvbW1pdHRlZFN0YXRlLgorICAgICAgICAoV2ViS2l0OjpQYWdlTG9hZFN0YXRlOjp1
cmwpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6dW5yZWFjaGFibGVV
UkwpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6YmVnaW5UcmFuc2Fj
dGlvbik6IEFkZGVkLiBJbmNyZW1lbnRzIHRoZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbgorICAg
ICAgICBjb3VudC4KKyAgICAgICAgKFdlYktpdDo6UGFnZUxvYWRTdGF0ZTo6RGF0YTo6RGF0YSk6
IEFkZGVkLiBNb3ZlZCBpbnRlcm5hbCBzdGF0ZSBtZW1iZXJzIGludG8gdGhpcyBzdHJ1Y3QKKyAg
ICAgICAgYW5kIG1hZGUgaXRzIGNvbnN0dXJjdG9yIGluaXRpYWxpemUgc3RhdGUgYW5kIGVzdGlt
YXRlZFByb2dyZXNzLgorCisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHA6Cisg
ICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6bG9hZFVSTCk6IENoYW5nZWQgdG8gY3JlYXRl
IGEgUGFnZUxvYWRTdGF0ZTo6VHJhbnNhY3Rpb24gYW5kIHBhc3MgaXQKKyAgICAgICAgYWxvbmcu
CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6bG9hZFVSTFJlcXVlc3QpOiBEaXR0by4K
KyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5Ojpsb2FkQWx0ZXJuYXRlSFRNTFN0cmluZyk6
IERpdHRvLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OnJlbG9hZCk6IERpdHRvLgor
ICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmdvRm9yd2FyZCk6IERpdHRvLgorICAgICAg
ICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmdvQmFjayk6IERpdHRvLgorICAgICAgICAoV2ViS2l0
OjpXZWJQYWdlUHJveHk6OmdvVG9CYWNrRm9yd2FyZEl0ZW0pOiBEaXR0by4KKyAgICAgICAgKFdl
YktpdDo6V2ViUGFnZVByb3h5OjpyZWNlaXZlZFBvbGljeURlY2lzaW9uKTogRGl0dG8uCisgICAg
ICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlkU3RhcnRQcm9ncmVzcyk6IERpdHRvLiBBbHNv
IGFkZGVkIGEgY2FsbCB0bworICAgICAgICBQYWdlTG9hZFN0YXRlOjpjb21taXRDaGFuZ2VzIGJl
Zm9yZSBjYWxsaW5nIHRoZSBjbGllbnQsIHNvIHRoYXQgdGhlIGNsaWVudCBzZWVzIHRoZSB1cGRh
dGVkCisgICAgICAgIHN0YXRlLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmRpZENo
YW5nZVByb2dyZXNzKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlk
RmluaXNoUHJvZ3Jlc3MpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5Ojpk
aWRTdGFydFByb3Zpc2lvbmFsTG9hZEZvckZyYW1lKTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6
OldlYlBhZ2VQcm94eTo6ZGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2Fk
Rm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWRGYWls
UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFn
ZVByb3h5OjpkaWRDb21taXRMb2FkRm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6
V2ViUGFnZVByb3h5OjpkaWRGaW5pc2hMb2FkRm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAgKFdl
YktpdDo6V2ViUGFnZVByb3h5OjpkaWRGYWlsTG9hZEZvckZyYW1lKTogRGl0dG8uCisgICAgICAg
IChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlkU2FtZURvY3VtZW50TmF2aWdhdGlvbkZvckZyYW1l
KTogRGl0dG8uCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGlkUmVjZWl2ZVRpdGxl
Rm9yRnJhbWUpOiBEaXR0by4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkZWNpZGVQ
b2xpY3lGb3JOYXZpZ2F0aW9uQWN0aW9uKTogQ2hhbmdlZCB0byBjcmVhdGUgYQorICAgICAgICBQ
YWdlTG9hZFN0YXRlOjpUcmFuc2FjdGlvbiBhbmQgcGFzcyBpdCBhbG9uZy4KKyAgICAgICAgKFdl
YktpdDo6V2ViUGFnZVByb3h5Ojpwcm9jZXNzRGlkQ3Jhc2gpOiBEaXR0by4gVGhpcyBhZGRyZXNz
ZWQgYSBGSVhNRSBhYm91dCB0aGUgY2xpZW50IG5vdAorICAgICAgICBzZWVpbmcgdGhlIHN0YXRl
IHByaW9yIHRvIHRoZSBjcmFzaCwgYmVjYXVzZSBub3cgdGhlIGNoYW5nZXMgY3Vhc2VkIGJ5IHJl
c2V0KCkgYXJlbuKAmXQKKyAgICAgICAgY29tbWl0dGVkIHVudGlsIGFmdGVyIHRoZSBjbGllbnQg
Y2FsbGJhY2suCisKKyAgICAgICAgKiBVSVByb2Nlc3MvY2YvV2ViUGFnZVByb3h5Q0YuY3BwOgor
ICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OnJlc3RvcmVGcm9tU2Vzc2lvblN0YXRlRGF0
YSk6IENoYW5nZWQgdG8gY3JlYXRlIGEKKyAgICAgICAgUGFnZUxvYWRTdGF0ZTo6VHJhbnNhY3Rp
b24gYW5kIHBhc3MgaXQgYWxvbmcuCisKIDIwMTMtMTItMDkgIEFuZGVycyBDYXJsc3NvbiAgPGFu
ZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBCZWdpbiB3b3JraW5nIG9uIGEgVXNlckRhdGEg
Y2xhc3MgaW50ZW5kZWQgdG8gcmVwbGFjZSBVc2VyTWVzc2FnZUNvZGVycwpJbmRleDogU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL1BhZ2VMb2FkU3RhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9QYWdlTG9hZFN0YXRlLmNwcAkocmV2aXNpb24gMTYwMzQ3KQor
KysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1BhZ2VMb2FkU3RhdGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yOCw5ICsyOCwxMiBAQAogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIAorLy8gUHJvZ3Jl
c3MgYWx3YXlzIHN0YXJ0cyBhdCB0aGlzIHZhbHVlLiBUaGlzIGhlbHBzIHByb3ZpZGUgZmVlZGJh
Y2sgYXMgc29vbiBhcyBhIGxvYWQgc3RhcnRzLgorc3RhdGljIGNvbnN0IGRvdWJsZSBpbml0aWFs
UHJvZ3Jlc3NWYWx1ZSA9IDAuMTsKKwogUGFnZUxvYWRTdGF0ZTo6UGFnZUxvYWRTdGF0ZSgpCi0g
ICAgOiBtX3N0YXRlKFN0YXRlOjpGaW5pc2hlZCkKLSAgICAsIG1fZXN0aW1hdGVkUHJvZ3Jlc3Mo
MCkKKyAgICA6IG1fbWF5SGF2ZVVuY29tbWl0dGVkQ2hhbmdlcyhmYWxzZSkKKyAgICAsIG1fb3V0
c3RhbmRpbmdUcmFuc2FjdGlvbkNvdW50KDApCiB7CiB9CiAKQEAgLTU0LDE4NSArNTcsMjMzIEBA
IHZvaWQgUGFnZUxvYWRTdGF0ZTo6cmVtb3ZlT2JzZXJ2ZXIoT2JzZXIKICAgICBtX29ic2VydmVy
cy5yZW1vdmUoaW5kZXgpOwogfQogCi12b2lkIFBhZ2VMb2FkU3RhdGU6OnJlc2V0KCkKK3ZvaWQg
UGFnZUxvYWRTdGF0ZTo6ZW5kVHJhbnNhY3Rpb24oKQoreworICAgIEFTU0VSVChtX291dHN0YW5k
aW5nVHJhbnNhY3Rpb25Db3VudCA+IDApOworCisgICAgaWYgKCEtLW1fb3V0c3RhbmRpbmdUcmFu
c2FjdGlvbkNvdW50KQorICAgICAgICBjb21taXRDaGFuZ2VzKCk7Cit9CisKK3ZvaWQgUGFnZUxv
YWRTdGF0ZTo6Y29tbWl0Q2hhbmdlcygpCit7CisgICAgaWYgKCFtX21heUhhdmVVbmNvbW1pdHRl
ZENoYW5nZXMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fbWF5SGF2ZVVuY29tbWl0dGVkQ2hh
bmdlcyA9IGZhbHNlOworCisgICAgYm9vbCB0aXRsZUNoYW5nZWQgPSBtX2NvbW1pdHRlZFN0YXRl
LnRpdGxlICE9IG1fdW5jb21taXR0ZWRTdGF0ZS50aXRsZTsKKyAgICBib29sIGlzTG9hZGluZ0No
YW5nZWQgPSBpc0xvYWRpbmdTdGF0ZShtX2NvbW1pdHRlZFN0YXRlLnN0YXRlKSAhPSBpc0xvYWRp
bmdTdGF0ZShtX3VuY29tbWl0dGVkU3RhdGUuc3RhdGUpOworICAgIGJvb2wgYWN0aXZlVVJMQ2hh
bmdlZCA9IGFjdGl2ZVVSTChtX2NvbW1pdHRlZFN0YXRlKSAhPSBhY3RpdmVVUkwobV91bmNvbW1p
dHRlZFN0YXRlKTsKKyAgICBib29sIGVzdGltYXRlZFByb2dyZXNzQ2hhbmdlZCA9IGVzdGltYXRl
ZFByb2dyZXNzKG1fY29tbWl0dGVkU3RhdGUpICE9IGVzdGltYXRlZFByb2dyZXNzKG1fdW5jb21t
aXR0ZWRTdGF0ZSk7CisKKyAgICBpZiAodGl0bGVDaGFuZ2VkKQorICAgICAgICBjYWxsT2JzZXJ2
ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxDaGFuZ2VUaXRsZSk7CisgICAgaWYgKGlzTG9hZGlu
Z0NoYW5nZWQpCisgICAgICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENo
YW5nZUlzTG9hZGluZyk7CisgICAgaWYgKGFjdGl2ZVVSTENoYW5nZWQpCisgICAgICAgIGNhbGxP
YnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZUFjdGl2ZVVSTCk7CisgICAgaWYg
KGVzdGltYXRlZFByb2dyZXNzQ2hhbmdlZCkKKyAgICAgICAgY2FsbE9ic2VydmVyQ2FsbGJhY2so
Jk9ic2VydmVyOjp3aWxsQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOworCisgICAgbV9jb21taXR0
ZWRTdGF0ZSA9IG1fdW5jb21taXR0ZWRTdGF0ZTsKKworICAgIC8vIFRoZSAiZGlkIiBvcmRlcmlu
ZyBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgIndpbGwiLiBUaGlzIGlzIGEgcmVxdWlyZW1lbnQgb2Yg
Q29jb2EgS2V5LVZhbHVlIE9ic2VydmluZy4KKyAgICBpZiAoZXN0aW1hdGVkUHJvZ3Jlc3NDaGFu
Z2VkKQorICAgICAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OmRpZENoYW5nZUVz
dGltYXRlZFByb2dyZXNzKTsKKyAgICBpZiAoYWN0aXZlVVJMQ2hhbmdlZCkKKyAgICAgICAgY2Fs
bE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpkaWRDaGFuZ2VBY3RpdmVVUkwpOworICAgIGlm
IChpc0xvYWRpbmdDaGFuZ2VkKQorICAgICAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2
ZXI6OmRpZENoYW5nZUlzTG9hZGluZyk7CisgICAgaWYgKHRpdGxlQ2hhbmdlZCkKKyAgICAgICAg
Y2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpkaWRDaGFuZ2VUaXRsZSk7Cit9CisKK3Zv
aWQgUGFnZUxvYWRTdGF0ZTo6cmVzZXQoY29uc3QgVHJhbnNhY3Rpb246OlRva2VuJiB0b2tlbikK
IHsKLSAgICBzZXRTdGF0ZShTdGF0ZTo6RmluaXNoZWQpOworICAgIEFTU0VSVF9VTlVTRUQodG9r
ZW4sICZ0b2tlbi5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhpcyk7CisKKyAgICBtX3VuY29tbWl0dGVk
U3RhdGUuc3RhdGUgPSBTdGF0ZTo6RmluaXNoZWQ7CiAKLSAgICBtX3BlbmRpbmdBUElSZXF1ZXN0
VVJMID0gU3RyaW5nKCk7Ci0gICAgbV9wcm92aXNpb25hbFVSTCA9IFN0cmluZygpOwotICAgIG1f
dXJsID0gU3RyaW5nKCk7CisgICAgbV91bmNvbW1pdHRlZFN0YXRlLnBlbmRpbmdBUElSZXF1ZXN0
VVJMID0gU3RyaW5nKCk7CisgICAgbV91bmNvbW1pdHRlZFN0YXRlLnByb3Zpc2lvbmFsVVJMID0g
U3RyaW5nKCk7CisgICAgbV91bmNvbW1pdHRlZFN0YXRlLnVybCA9IFN0cmluZygpOwogCi0gICAg
bV91bnJlYWNoYWJsZVVSTCA9IFN0cmluZygpOworICAgIG1fdW5jb21taXR0ZWRTdGF0ZS51bnJl
YWNoYWJsZVVSTCA9IFN0cmluZygpOwogICAgIG1fbGFzdFVucmVhY2hhYmxlVVJMID0gU3RyaW5n
KCk7CiAKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxDaGFuZ2VUaXRs
ZSk7Ci0gICAgbV90aXRsZSA9IFN0cmluZygpOwotICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZP
YnNlcnZlcjo6ZGlkQ2hhbmdlVGl0bGUpOwotCi0gICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9i
c2VydmVyOjp3aWxsQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOwotICAgIG1fZXN0aW1hdGVkUHJv
Z3Jlc3MgPSAwOwotICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdl
RXN0aW1hdGVkUHJvZ3Jlc3MpOworICAgIG1fdW5jb21taXR0ZWRTdGF0ZS50aXRsZSA9IFN0cmlu
ZygpOworCisgICAgbV91bmNvbW1pdHRlZFN0YXRlLmVzdGltYXRlZFByb2dyZXNzID0gMDsKIH0K
IAogYm9vbCBQYWdlTG9hZFN0YXRlOjppc0xvYWRpbmcoKSBjb25zdAogewotICAgIHJldHVybiBp
c0xvYWRpbmdTdGF0ZShtX3N0YXRlKTsKKyAgICByZXR1cm4gaXNMb2FkaW5nU3RhdGUobV9jb21t
aXR0ZWRTdGF0ZS5zdGF0ZSk7CiB9CiAKLVN0cmluZyBQYWdlTG9hZFN0YXRlOjphY3RpdmVVUkwo
KSBjb25zdAorU3RyaW5nIFBhZ2VMb2FkU3RhdGU6OmFjdGl2ZVVSTChjb25zdCBEYXRhJiBkYXRh
KQogewogICAgIC8vIElmIHRoZXJlIGlzIGEgY3VycmVudGx5IHBlbmRpbmcgVVJMLCBpdCBpcyB0
aGUgYWN0aXZlIFVSTCwKICAgICAvLyBldmVuIHdoZW4gdGhlcmUncyBubyBtYWluIGZyYW1lIHll
dCwgYXMgaXQgbWlnaHQgYmUgdGhlCiAgICAgLy8gZmlyc3QgQVBJIHJlcXVlc3QuCi0gICAgaWYg
KCFtX3BlbmRpbmdBUElSZXF1ZXN0VVJMLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gbV9wZW5k
aW5nQVBJUmVxdWVzdFVSTDsKKyAgICBpZiAoIWRhdGEucGVuZGluZ0FQSVJlcXVlc3RVUkwuaXNO
dWxsKCkpCisgICAgICAgIHJldHVybiBkYXRhLnBlbmRpbmdBUElSZXF1ZXN0VVJMOwogCi0gICAg
aWYgKCFtX3VucmVhY2hhYmxlVVJMLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIG1fdW5yZWFj
aGFibGVVUkw7CisgICAgaWYgKCFkYXRhLnVucmVhY2hhYmxlVVJMLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIGRhdGEudW5yZWFjaGFibGVVUkw7CiAKLSAgICBzd2l0Y2ggKG1fc3RhdGUpIHsK
KyAgICBzd2l0Y2ggKGRhdGEuc3RhdGUpIHsKICAgICBjYXNlIFN0YXRlOjpQcm92aXNpb25hbDoK
LSAgICAgICAgcmV0dXJuIG1fcHJvdmlzaW9uYWxVUkw7CisgICAgICAgIHJldHVybiBkYXRhLnBy
b3Zpc2lvbmFsVVJMOwogICAgIGNhc2UgU3RhdGU6OkNvbW1pdHRlZDoKICAgICBjYXNlIFN0YXRl
OjpGaW5pc2hlZDoKLSAgICAgICAgcmV0dXJuIG1fdXJsOworICAgICAgICByZXR1cm4gZGF0YS51
cmw7CiAgICAgfQogCiAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIFN0cmlu
ZygpOwogfQogCi0vLyBBbHdheXMgc3RhcnQgcHJvZ3Jlc3MgYXQgaW5pdGlhbFByb2dyZXNzVmFs
dWUuIFRoaXMgaGVscHMgcHJvdmlkZSBmZWVkYmFjayBhcwotLy8gc29vbiBhcyBhIGxvYWQgc3Rh
cnRzLgotCi1zdGF0aWMgY29uc3QgZG91YmxlIGluaXRpYWxQcm9ncmVzc1ZhbHVlID0gMC4xOwor
U3RyaW5nIFBhZ2VMb2FkU3RhdGU6OmFjdGl2ZVVSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFj
dGl2ZVVSTChtX2NvbW1pdHRlZFN0YXRlKTsKK30KIAotZG91YmxlIFBhZ2VMb2FkU3RhdGU6OmVz
dGltYXRlZFByb2dyZXNzKCkgY29uc3QKK2RvdWJsZSBQYWdlTG9hZFN0YXRlOjplc3RpbWF0ZWRQ
cm9ncmVzcyhjb25zdCBEYXRhJiBkYXRhKQogewotICAgIGlmICghbV9wZW5kaW5nQVBJUmVxdWVz
dFVSTC5pc051bGwoKSkKKyAgICBpZiAoIWRhdGEucGVuZGluZ0FQSVJlcXVlc3RVUkwuaXNOdWxs
KCkpCiAgICAgICAgIHJldHVybiBpbml0aWFsUHJvZ3Jlc3NWYWx1ZTsKIAotICAgIHJldHVybiBt
X2VzdGltYXRlZFByb2dyZXNzOworICAgIHJldHVybiBkYXRhLmVzdGltYXRlZFByb2dyZXNzOwor
fQorCitkb3VibGUgUGFnZUxvYWRTdGF0ZTo6ZXN0aW1hdGVkUHJvZ3Jlc3MoKSBjb25zdAorewor
ICAgIHJldHVybiBlc3RpbWF0ZWRQcm9ncmVzcyhtX2NvbW1pdHRlZFN0YXRlKTsKIH0KIAogY29u
c3QgU3RyaW5nJiBQYWdlTG9hZFN0YXRlOjpwZW5kaW5nQVBJUmVxdWVzdFVSTCgpIGNvbnN0CiB7
Ci0gICAgcmV0dXJuIG1fcGVuZGluZ0FQSVJlcXVlc3RVUkw7CisgICAgcmV0dXJuIG1fY29tbWl0
dGVkU3RhdGUucGVuZGluZ0FQSVJlcXVlc3RVUkw7CiB9CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6
c2V0UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgU3RyaW5nJiBwZW5kaW5nQVBJUmVxdWVzdFVS
TCkKK3ZvaWQgUGFnZUxvYWRTdGF0ZTo6c2V0UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgVHJh
bnNhY3Rpb246OlRva2VuJiB0b2tlbiwgY29uc3QgU3RyaW5nJiBwZW5kaW5nQVBJUmVxdWVzdFVS
TCkKIHsKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxDaGFuZ2VFc3Rp
bWF0ZWRQcm9ncmVzcyk7Ci0gICAgbV9wZW5kaW5nQVBJUmVxdWVzdFVSTCA9IHBlbmRpbmdBUElS
ZXF1ZXN0VVJMOwotICAgIGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdl
RXN0aW1hdGVkUHJvZ3Jlc3MpOworICAgIEFTU0VSVF9VTlVTRUQodG9rZW4sICZ0b2tlbi5tX3Bh
Z2VMb2FkU3RhdGUgPT0gdGhpcyk7CisgICAgbV91bmNvbW1pdHRlZFN0YXRlLnBlbmRpbmdBUElS
ZXF1ZXN0VVJMID0gcGVuZGluZ0FQSVJlcXVlc3RVUkw7CiB9CiAKLXZvaWQgUGFnZUxvYWRTdGF0
ZTo6Y2xlYXJQZW5kaW5nQVBJUmVxdWVzdFVSTCgpCit2b2lkIFBhZ2VMb2FkU3RhdGU6OmNsZWFy
UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgVHJhbnNhY3Rpb246OlRva2VuJiB0b2tlbikKIHsK
LSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxDaGFuZ2VFc3RpbWF0ZWRQ
cm9ncmVzcyk7Ci0gICAgbV9wZW5kaW5nQVBJUmVxdWVzdFVSTCA9IFN0cmluZygpOwotICAgIGNh
bGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3Mp
OworICAgIEFTU0VSVF9VTlVTRUQodG9rZW4sICZ0b2tlbi5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhp
cyk7CisgICAgbV91bmNvbW1pdHRlZFN0YXRlLnBlbmRpbmdBUElSZXF1ZXN0VVJMID0gU3RyaW5n
KCk7CiB9CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6ZGlkU3RhcnRQcm92aXNpb25hbExvYWQoY29u
c3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdW5yZWFjaGFibGVVUkwpCit2b2lkIFBhZ2VM
b2FkU3RhdGU6OmRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKGNvbnN0IFRyYW5zYWN0aW9uOjpUb2tl
biYgdG9rZW4sIGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIHVucmVhY2hhYmxlVVJM
KQogewotICAgIEFTU0VSVChtX3Byb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CisgICAgQVNTRVJU
X1VOVVNFRCh0b2tlbiwgJnRva2VuLm1fcGFnZUxvYWRTdGF0ZSA9PSB0aGlzKTsKKyAgICBBU1NF
UlQobV91bmNvbW1pdHRlZFN0YXRlLnByb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CiAKLSAgICBz
ZXRTdGF0ZShTdGF0ZTo6UHJvdmlzaW9uYWwpOworICAgIG1fdW5jb21taXR0ZWRTdGF0ZS5zdGF0
ZSA9IFN0YXRlOjpQcm92aXNpb25hbDsKIAotICAgIG1fcHJvdmlzaW9uYWxVUkwgPSB1cmw7Cisg
ICAgbV91bmNvbW1pdHRlZFN0YXRlLnByb3Zpc2lvbmFsVVJMID0gdXJsOwogCi0gICAgc2V0VW5y
ZWFjaGFibGVVUkwodW5yZWFjaGFibGVVUkwpOworICAgIHNldFVucmVhY2hhYmxlVVJMKHRva2Vu
LCB1bnJlYWNoYWJsZVVSTCk7CiB9CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6ZGlkUmVjZWl2ZVNl
cnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2FkKGNvbnN0IFN0cmluZyYgdXJsKQordm9pZCBQ
YWdlTG9hZFN0YXRlOjpkaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbExvYWQo
Y29uc3QgVHJhbnNhY3Rpb246OlRva2VuJiB0b2tlbiwgY29uc3QgU3RyaW5nJiB1cmwpCiB7Ci0g
ICAgQVNTRVJUKG1fc3RhdGUgPT0gU3RhdGU6OlByb3Zpc2lvbmFsKTsKKyAgICBBU1NFUlRfVU5V
U0VEKHRva2VuLCAmdG9rZW4ubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVCht
X3VuY29tbWl0dGVkU3RhdGUuc3RhdGUgPT0gU3RhdGU6OlByb3Zpc2lvbmFsKTsKIAotICAgIG1f
cHJvdmlzaW9uYWxVUkwgPSB1cmw7CisgICAgbV91bmNvbW1pdHRlZFN0YXRlLnByb3Zpc2lvbmFs
VVJMID0gdXJsOwogfQogCi12b2lkIFBhZ2VMb2FkU3RhdGU6OmRpZEZhaWxQcm92aXNpb25hbExv
YWQoKQordm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRGYWlsUHJvdmlzaW9uYWxMb2FkKGNvbnN0IFRy
YW5zYWN0aW9uOjpUb2tlbiYgdG9rZW4pCiB7Ci0gICAgQVNTRVJUKG1fc3RhdGUgPT0gU3RhdGU6
OlByb3Zpc2lvbmFsKTsKKyAgICBBU1NFUlRfVU5VU0VEKHRva2VuLCAmdG9rZW4ubV9wYWdlTG9h
ZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVChtX3VuY29tbWl0dGVkU3RhdGUuc3RhdGUgPT0g
U3RhdGU6OlByb3Zpc2lvbmFsKTsKIAotICAgIHNldFN0YXRlKFN0YXRlOjpGaW5pc2hlZCk7Cisg
ICAgbV91bmNvbW1pdHRlZFN0YXRlLnN0YXRlID0gU3RhdGU6OkZpbmlzaGVkOwogCi0gICAgbV9w
cm92aXNpb25hbFVSTCA9IFN0cmluZygpOwotICAgIG1fdW5yZWFjaGFibGVVUkwgPSBtX2xhc3RV
bnJlYWNoYWJsZVVSTDsKKyAgICBtX3VuY29tbWl0dGVkU3RhdGUucHJvdmlzaW9uYWxVUkwgPSBT
dHJpbmcoKTsKKyAgICBtX3VuY29tbWl0dGVkU3RhdGUudW5yZWFjaGFibGVVUkwgPSBtX2xhc3RV
bnJlYWNoYWJsZVVSTDsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRDb21taXRMb2FkKCkK
K3ZvaWQgUGFnZUxvYWRTdGF0ZTo6ZGlkQ29tbWl0TG9hZChjb25zdCBUcmFuc2FjdGlvbjo6VG9r
ZW4mIHRva2VuKQogewotICAgIEFTU0VSVChtX3N0YXRlID09IFN0YXRlOjpQcm92aXNpb25hbCk7
CisgICAgQVNTRVJUX1VOVVNFRCh0b2tlbiwgJnRva2VuLm1fcGFnZUxvYWRTdGF0ZSA9PSB0aGlz
KTsKKyAgICBBU1NFUlQobV91bmNvbW1pdHRlZFN0YXRlLnN0YXRlID09IFN0YXRlOjpQcm92aXNp
b25hbCk7CiAKLSAgICBzZXRTdGF0ZShTdGF0ZTo6Q29tbWl0dGVkKTsKKyAgICBtX3VuY29tbWl0
dGVkU3RhdGUuc3RhdGUgPSBTdGF0ZTo6Q29tbWl0dGVkOwogCi0gICAgbV91cmwgPSBtX3Byb3Zp
c2lvbmFsVVJMOwotICAgIG1fcHJvdmlzaW9uYWxVUkwgPSBTdHJpbmcoKTsKKyAgICBtX3VuY29t
bWl0dGVkU3RhdGUudXJsID0gbV91bmNvbW1pdHRlZFN0YXRlLnByb3Zpc2lvbmFsVVJMOworICAg
IG1fdW5jb21taXR0ZWRTdGF0ZS5wcm92aXNpb25hbFVSTCA9IFN0cmluZygpOwogCi0gICAgbV90
aXRsZSA9IFN0cmluZygpOworICAgIG1fdW5jb21taXR0ZWRTdGF0ZS50aXRsZSA9IFN0cmluZygp
OwogfQogCi12b2lkIFBhZ2VMb2FkU3RhdGU6OmRpZEZpbmlzaExvYWQoKQordm9pZCBQYWdlTG9h
ZFN0YXRlOjpkaWRGaW5pc2hMb2FkKGNvbnN0IFRyYW5zYWN0aW9uOjpUb2tlbiYgdG9rZW4pCiB7
Ci0gICAgQVNTRVJUKG1fc3RhdGUgPT0gU3RhdGU6OkNvbW1pdHRlZCk7Ci0gICAgQVNTRVJUKG1f
cHJvdmlzaW9uYWxVUkwuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlRfVU5VU0VEKHRva2VuLCAmdG9r
ZW4ubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVChtX3VuY29tbWl0dGVkU3Rh
dGUuc3RhdGUgPT0gU3RhdGU6OkNvbW1pdHRlZCk7CisgICAgQVNTRVJUKG1fdW5jb21taXR0ZWRT
dGF0ZS5wcm92aXNpb25hbFVSTC5pc0VtcHR5KCkpOwogCi0gICAgc2V0U3RhdGUoU3RhdGU6OkZp
bmlzaGVkKTsKKyAgICBtX3VuY29tbWl0dGVkU3RhdGUuc3RhdGUgPSBTdGF0ZTo6RmluaXNoZWQ7
CiB9CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6ZGlkRmFpbExvYWQoKQordm9pZCBQYWdlTG9hZFN0
YXRlOjpkaWRGYWlsTG9hZChjb25zdCBUcmFuc2FjdGlvbjo6VG9rZW4mIHRva2VuKQogewotICAg
IEFTU0VSVChtX3Byb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CisgICAgQVNTRVJUX1VOVVNFRCh0
b2tlbiwgJnRva2VuLm1fcGFnZUxvYWRTdGF0ZSA9PSB0aGlzKTsKKyAgICBBU1NFUlQobV91bmNv
bW1pdHRlZFN0YXRlLnByb3Zpc2lvbmFsVVJMLmlzRW1wdHkoKSk7CiAKLSAgICBzZXRTdGF0ZShT
dGF0ZTo6RmluaXNoZWQpOworICAgIG1fdW5jb21taXR0ZWRTdGF0ZS5zdGF0ZSA9IFN0YXRlOjpG
aW5pc2hlZDsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRTYW1lRG9jdW1lbnROYXZpZ2F0
aW9uKGNvbnN0IFN0cmluZyYgdXJsKQordm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRTYW1lRG9jdW1l
bnROYXZpZ2F0aW9uKGNvbnN0IFRyYW5zYWN0aW9uOjpUb2tlbiYgdG9rZW4sIGNvbnN0IFN0cmlu
ZyYgdXJsKQogewotICAgIEFTU0VSVCghbV91cmwuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlRfVU5V
U0VEKHRva2VuLCAmdG9rZW4ubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIEFTU0VSVCgh
bV91bmNvbW1pdHRlZFN0YXRlLnVybC5pc0VtcHR5KCkpOwogCi0gICAgbV91cmwgPSB1cmw7Cisg
ICAgbV91bmNvbW1pdHRlZFN0YXRlLnVybCA9IHVybDsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRl
OjpzZXRVbnJlYWNoYWJsZVVSTChjb25zdCBTdHJpbmcmIHVucmVhY2hhYmxlVVJMKQordm9pZCBQ
YWdlTG9hZFN0YXRlOjpzZXRVbnJlYWNoYWJsZVVSTChjb25zdCBUcmFuc2FjdGlvbjo6VG9rZW4m
IHRva2VuLCBjb25zdCBTdHJpbmcmIHVucmVhY2hhYmxlVVJMKQogewotICAgIG1fbGFzdFVucmVh
Y2hhYmxlVVJMID0gbV91bnJlYWNoYWJsZVVSTDsKLSAgICBtX3VucmVhY2hhYmxlVVJMID0gdW5y
ZWFjaGFibGVVUkw7CisgICAgQVNTRVJUX1VOVVNFRCh0b2tlbiwgJnRva2VuLm1fcGFnZUxvYWRT
dGF0ZSA9PSB0aGlzKTsKKworICAgIG1fbGFzdFVucmVhY2hhYmxlVVJMID0gbV91bmNvbW1pdHRl
ZFN0YXRlLnVucmVhY2hhYmxlVVJMOworICAgIG1fdW5jb21taXR0ZWRTdGF0ZS51bnJlYWNoYWJs
ZVVSTCA9IHVucmVhY2hhYmxlVVJMOwogfQogCiBjb25zdCBTdHJpbmcmIFBhZ2VMb2FkU3RhdGU6
OnRpdGxlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV90aXRsZTsKKyAgICByZXR1cm4gbV9jb21t
aXR0ZWRTdGF0ZS50aXRsZTsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpzZXRUaXRsZShjb25z
dCBTdHJpbmcmIHRpdGxlKQordm9pZCBQYWdlTG9hZFN0YXRlOjpzZXRUaXRsZShjb25zdCBUcmFu
c2FjdGlvbjo6VG9rZW4mIHRva2VuLCBjb25zdCBTdHJpbmcmIHRpdGxlKQogewotICAgIGNhbGxP
YnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZVRpdGxlKTsKLSAgICBtX3RpdGxl
ID0gdGl0bGU7Ci0gICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpkaWRDaGFuZ2VU
aXRsZSk7CisgICAgQVNTRVJUX1VOVVNFRCh0b2tlbiwgJnRva2VuLm1fcGFnZUxvYWRTdGF0ZSA9
PSB0aGlzKTsKKyAgICBtX3VuY29tbWl0dGVkU3RhdGUudGl0bGUgPSB0aXRsZTsKIH0KIAotdm9p
ZCBQYWdlTG9hZFN0YXRlOjpkaWRTdGFydFByb2dyZXNzKCkKK3ZvaWQgUGFnZUxvYWRTdGF0ZTo6
ZGlkU3RhcnRQcm9ncmVzcyhjb25zdCBUcmFuc2FjdGlvbjo6VG9rZW4mIHRva2VuKQogewotICAg
IGNhbGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZUVzdGltYXRlZFByb2dy
ZXNzKTsKLSAgICBtX2VzdGltYXRlZFByb2dyZXNzID0gaW5pdGlhbFByb2dyZXNzVmFsdWU7Ci0g
ICAgY2FsbE9ic2VydmVyQ2FsbGJhY2soJk9ic2VydmVyOjpkaWRDaGFuZ2VFc3RpbWF0ZWRQcm9n
cmVzcyk7CisgICAgQVNTRVJUX1VOVVNFRCh0b2tlbiwgJnRva2VuLm1fcGFnZUxvYWRTdGF0ZSA9
PSB0aGlzKTsKKyAgICBtX3VuY29tbWl0dGVkU3RhdGUuZXN0aW1hdGVkUHJvZ3Jlc3MgPSBpbml0
aWFsUHJvZ3Jlc3NWYWx1ZTsKIH0KIAotdm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRDaGFuZ2VQcm9n
cmVzcyhkb3VibGUgdmFsdWUpCit2b2lkIFBhZ2VMb2FkU3RhdGU6OmRpZENoYW5nZVByb2dyZXNz
KGNvbnN0IFRyYW5zYWN0aW9uOjpUb2tlbiYgdG9rZW4sIGRvdWJsZSB2YWx1ZSkKIHsKLSAgICBj
YWxsT2JzZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OndpbGxDaGFuZ2VFc3RpbWF0ZWRQcm9ncmVz
cyk7Ci0gICAgbV9lc3RpbWF0ZWRQcm9ncmVzcyA9IHZhbHVlOwotICAgIGNhbGxPYnNlcnZlckNh
bGxiYWNrKCZPYnNlcnZlcjo6ZGlkQ2hhbmdlRXN0aW1hdGVkUHJvZ3Jlc3MpOworICAgIEFTU0VS
VF9VTlVTRUQodG9rZW4sICZ0b2tlbi5tX3BhZ2VMb2FkU3RhdGUgPT0gdGhpcyk7CisgICAgbV91
bmNvbW1pdHRlZFN0YXRlLmVzdGltYXRlZFByb2dyZXNzID0gdmFsdWU7CiB9CiAKLXZvaWQgUGFn
ZUxvYWRTdGF0ZTo6ZGlkRmluaXNoUHJvZ3Jlc3MoKQordm9pZCBQYWdlTG9hZFN0YXRlOjpkaWRG
aW5pc2hQcm9ncmVzcyhjb25zdCBUcmFuc2FjdGlvbjo6VG9rZW4mIHRva2VuKQogewotICAgIGNh
bGxPYnNlcnZlckNhbGxiYWNrKCZPYnNlcnZlcjo6d2lsbENoYW5nZUVzdGltYXRlZFByb2dyZXNz
KTsKLSAgICBtX2VzdGltYXRlZFByb2dyZXNzID0gMTsKLSAgICBjYWxsT2JzZXJ2ZXJDYWxsYmFj
aygmT2JzZXJ2ZXI6OmRpZENoYW5nZUVzdGltYXRlZFByb2dyZXNzKTsKKyAgICBBU1NFUlRfVU5V
U0VEKHRva2VuLCAmdG9rZW4ubV9wYWdlTG9hZFN0YXRlID09IHRoaXMpOworICAgIG1fdW5jb21t
aXR0ZWRTdGF0ZS5lc3RpbWF0ZWRQcm9ncmVzcyA9IDE7CiB9CiAKIGJvb2wgUGFnZUxvYWRTdGF0
ZTo6aXNMb2FkaW5nU3RhdGUoU3RhdGUgc3RhdGUpCkBAIC0yNTAsMjUgKzMwMSw2IEBAIGJvb2wg
UGFnZUxvYWRTdGF0ZTo6aXNMb2FkaW5nU3RhdGUoU3RhdGUKICAgICByZXR1cm4gZmFsc2U7CiB9
CiAKLXZvaWQgUGFnZUxvYWRTdGF0ZTo6c2V0U3RhdGUoU3RhdGUgc3RhdGUpCi17Ci0gICAgaWYg
KG1fc3RhdGUgPT0gc3RhdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgaXNMb2FkaW5n
SXNDaGFuZ2luZyA9IGZhbHNlOwotCi0gICAgaWYgKGlzTG9hZGluZ1N0YXRlKG1fc3RhdGUpICE9
IGlzTG9hZGluZ1N0YXRlKHN0YXRlKSkKLSAgICAgICAgaXNMb2FkaW5nSXNDaGFuZ2luZyA9IHRy
dWU7Ci0KLSAgICBpZiAoaXNMb2FkaW5nSXNDaGFuZ2luZykKLSAgICAgICAgY2FsbE9ic2VydmVy
Q2FsbGJhY2soJk9ic2VydmVyOjp3aWxsQ2hhbmdlSXNMb2FkaW5nKTsKLQotICAgIG1fc3RhdGUg
PSBzdGF0ZTsKLQotICAgIGlmIChpc0xvYWRpbmdJc0NoYW5naW5nKQotICAgICAgICBjYWxsT2Jz
ZXJ2ZXJDYWxsYmFjaygmT2JzZXJ2ZXI6OmRpZENoYW5nZUlzTG9hZGluZyk7Ci19Ci0KIHZvaWQg
UGFnZUxvYWRTdGF0ZTo6Y2FsbE9ic2VydmVyQ2FsbGJhY2sodm9pZCAoT2JzZXJ2ZXI6OipjYWxs
YmFjaykoKSkKIHsKICAgICBmb3IgKGF1dG8qIG9ic2VydmVyIDogbV9vYnNlcnZlcnMpCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGFnZUxvYWRTdGF0ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9QYWdlTG9hZFN0YXRlLmgJKHJldmlzaW9uIDE2MDM0
NykKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9QYWdlTG9hZFN0YXRlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTUxLDY5ICs1MSwxMzUgQEAgcHVibGljOgogICAgICAgICB2aXJ0dWFsIHZvaWQg
d2lsbENoYW5nZVRpdGxlKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlVGl0
bGUoKSA9IDA7CiAKKyAgICAgICAgdmlydHVhbCB2b2lkIHdpbGxDaGFuZ2VBY3RpdmVVUkwoKSA9
IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFuZ2VBY3RpdmVVUkwoKSA9IDA7CisKICAg
ICAgICAgdmlydHVhbCB2b2lkIHdpbGxDaGFuZ2VFc3RpbWF0ZWRQcm9ncmVzcygpID0gMDsKICAg
ICAgICAgdmlydHVhbCB2b2lkIGRpZENoYW5nZUVzdGltYXRlZFByb2dyZXNzKCkgPSAwOwogICAg
IH07CiAKKyAgICBjbGFzcyBUcmFuc2FjdGlvbiB7CisgICAgICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKFRyYW5zYWN0aW9uKTsKKyAgICBwdWJsaWM6CisgICAgICAgIFRyYW5zYWN0aW9uKFRyYW5z
YWN0aW9uJiYgb3RoZXIpCisgICAgICAgICAgICA6IG1fcGFnZUxvYWRTdGF0ZShvdGhlci5tX3Bh
Z2VMb2FkU3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIH5UcmFuc2FjdGlv
bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5lbmRUcmFuc2FjdGlv
bigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgUGFn
ZUxvYWRTdGF0ZTsKKworICAgICAgICBUcmFuc2FjdGlvbihQYWdlTG9hZFN0YXRlJiBwYWdlTG9h
ZFN0YXRlKQorICAgICAgICAgICAgOiBtX3BhZ2VMb2FkU3RhdGUocGFnZUxvYWRTdGF0ZSkKKyAg
ICAgICAgeworICAgICAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmJlZ2luVHJhbnNhY3Rpb24oKTsK
KyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFRva2VuIHsKKyAgICAgICAgcHVibGljOgorICAg
ICAgICAgICAgVG9rZW4oVHJhbnNhY3Rpb24mIHRyYW5zYWN0aW9uKQorI2lmICFBU1NFUlRfRElT
QUJMRUQKKyAgICAgICAgICAgICAgICA6IG1fcGFnZUxvYWRTdGF0ZSh0cmFuc2FjdGlvbi5tX3Bh
Z2VMb2FkU3RhdGUpCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFu
c2FjdGlvbi5tX3BhZ2VMb2FkU3RhdGUubV9tYXlIYXZlVW5jb21taXR0ZWRDaGFuZ2VzID0gdHJ1
ZTsKKyAgICAgICAgICAgIH0KKworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICAgICAgICAgIFBh
Z2VMb2FkU3RhdGUmIG1fcGFnZUxvYWRTdGF0ZTsKKyNlbmRpZgorICAgICAgICB9OworCisgICAg
ICAgIFBhZ2VMb2FkU3RhdGUmIG1fcGFnZUxvYWRTdGF0ZTsKKyAgICB9OworCiAgICAgdm9pZCBh
ZGRPYnNlcnZlcihPYnNlcnZlciYpOwogICAgIHZvaWQgcmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIm
KTsKIAotICAgIHZvaWQgcmVzZXQoKTsKKyAgICBUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbigpIHsg
cmV0dXJuICp0aGlzOyB9CisgICAgdm9pZCBjb21taXRDaGFuZ2VzKCk7CisKKyAgICB2b2lkIHJl
c2V0KGNvbnN0IFRyYW5zYWN0aW9uOjpUb2tlbiYpOwogCiAgICAgYm9vbCBpc0xvYWRpbmcoKSBj
b25zdDsKIAotICAgIGNvbnN0IFN0cmluZyYgcHJvdmlzaW9uYWxVUkwoKSBjb25zdCB7IHJldHVy
biBtX3Byb3Zpc2lvbmFsVVJMOyB9Ci0gICAgY29uc3QgU3RyaW5nJiB1cmwoKSBjb25zdCB7IHJl
dHVybiBtX3VybDsgfQotICAgIGNvbnN0IFN0cmluZyYgdW5yZWFjaGFibGVVUkwoKSBjb25zdCB7
IHJldHVybiBtX3VucmVhY2hhYmxlVVJMOyB9CisgICAgY29uc3QgU3RyaW5nJiBwcm92aXNpb25h
bFVSTCgpIGNvbnN0IHsgcmV0dXJuIG1fY29tbWl0dGVkU3RhdGUucHJvdmlzaW9uYWxVUkw7IH0K
KyAgICBjb25zdCBTdHJpbmcmIHVybCgpIGNvbnN0IHsgcmV0dXJuIG1fY29tbWl0dGVkU3RhdGUu
dXJsOyB9CisgICAgY29uc3QgU3RyaW5nJiB1bnJlYWNoYWJsZVVSTCgpIGNvbnN0IHsgcmV0dXJu
IG1fY29tbWl0dGVkU3RhdGUudW5yZWFjaGFibGVVUkw7IH0KIAogICAgIFN0cmluZyBhY3RpdmVV
UkwoKSBjb25zdDsKIAogICAgIGRvdWJsZSBlc3RpbWF0ZWRQcm9ncmVzcygpIGNvbnN0OwogCiAg
ICAgY29uc3QgU3RyaW5nJiBwZW5kaW5nQVBJUmVxdWVzdFVSTCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAgdm9pZCBjbGVhclBl
bmRpbmdBUElSZXF1ZXN0VVJMKCk7CisgICAgdm9pZCBzZXRQZW5kaW5nQVBJUmVxdWVzdFVSTChj
b25zdCBUcmFuc2FjdGlvbjo6VG9rZW4mLCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGNsZWFy
UGVuZGluZ0FQSVJlcXVlc3RVUkwoY29uc3QgVHJhbnNhY3Rpb246OlRva2VuJik7CiAKLSAgICB2
b2lkIGRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJp
bmcmIHVucmVhY2hhYmxlVVJMKTsKLSAgICB2b2lkIGRpZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZv
clByb3Zpc2lvbmFsTG9hZChjb25zdCBTdHJpbmcmIHVybCk7Ci0gICAgdm9pZCBkaWRGYWlsUHJv
dmlzaW9uYWxMb2FkKCk7CisgICAgdm9pZCBkaWRTdGFydFByb3Zpc2lvbmFsTG9hZChjb25zdCBU
cmFuc2FjdGlvbjo6VG9rZW4mLCBjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB1bnJl
YWNoYWJsZVVSTCk7CisgICAgdm9pZCBkaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNp
b25hbExvYWQoY29uc3QgVHJhbnNhY3Rpb246OlRva2VuJiwgY29uc3QgU3RyaW5nJiB1cmwpOwor
ICAgIHZvaWQgZGlkRmFpbFByb3Zpc2lvbmFsTG9hZChjb25zdCBUcmFuc2FjdGlvbjo6VG9rZW4m
KTsKIAotICAgIHZvaWQgZGlkQ29tbWl0TG9hZCgpOwotICAgIHZvaWQgZGlkRmluaXNoTG9hZCgp
OwotICAgIHZvaWQgZGlkRmFpbExvYWQoKTsKKyAgICB2b2lkIGRpZENvbW1pdExvYWQoY29uc3Qg
VHJhbnNhY3Rpb246OlRva2VuJik7CisgICAgdm9pZCBkaWRGaW5pc2hMb2FkKGNvbnN0IFRyYW5z
YWN0aW9uOjpUb2tlbiYpOworICAgIHZvaWQgZGlkRmFpbExvYWQoY29uc3QgVHJhbnNhY3Rpb246
OlRva2VuJik7CiAKLSAgICB2b2lkIGRpZFNhbWVEb2N1bWVudE5hdmlnYXRpb24oY29uc3QgU3Ry
aW5nJiB1cmwpOworICAgIHZvaWQgZGlkU2FtZURvY3VtZW50TmF2aWdhdGlvbihjb25zdCBUcmFu
c2FjdGlvbjo6VG9rZW4mLCBjb25zdCBTdHJpbmcmIHVybCk7CiAKLSAgICB2b2lkIHNldFVucmVh
Y2hhYmxlVVJMKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgc2V0VW5yZWFjaGFibGVVUkwoY29u
c3QgVHJhbnNhY3Rpb246OlRva2VuJiwgY29uc3QgU3RyaW5nJik7CiAKICAgICBjb25zdCBTdHJp
bmcmIHRpdGxlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmcmKTsKKyAg
ICB2b2lkIHNldFRpdGxlKGNvbnN0IFRyYW5zYWN0aW9uOjpUb2tlbiYsIGNvbnN0IFN0cmluZyYp
OwogCi0gICAgdm9pZCBkaWRTdGFydFByb2dyZXNzKCk7Ci0gICAgdm9pZCBkaWRDaGFuZ2VQcm9n
cmVzcyhkb3VibGUpOwotICAgIHZvaWQgZGlkRmluaXNoUHJvZ3Jlc3MoKTsKKyAgICB2b2lkIGRp
ZFN0YXJ0UHJvZ3Jlc3MoY29uc3QgVHJhbnNhY3Rpb246OlRva2VuJik7CisgICAgdm9pZCBkaWRD
aGFuZ2VQcm9ncmVzcyhjb25zdCBUcmFuc2FjdGlvbjo6VG9rZW4mLCBkb3VibGUpOworICAgIHZv
aWQgZGlkRmluaXNoUHJvZ3Jlc3MoY29uc3QgVHJhbnNhY3Rpb246OlRva2VuJik7CiAKIHByaXZh
dGU6CiAgICAgc3RhdGljIGJvb2wgaXNMb2FkaW5nU3RhdGUoU3RhdGUpOwotICAgIHZvaWQgc2V0
U3RhdGUoU3RhdGUpOworCisgICAgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgeyArK21fb3V0c3Rh
bmRpbmdUcmFuc2FjdGlvbkNvdW50OyB9CisgICAgdm9pZCBlbmRUcmFuc2FjdGlvbigpOwogCiAg
ICAgdm9pZCBjYWxsT2JzZXJ2ZXJDYWxsYmFjayh2b2lkIChPYnNlcnZlcjo6KikoKSk7CiAKICAg
ICBWZWN0b3I8T2JzZXJ2ZXIqPiBtX29ic2VydmVyczsKIAotICAgIFN0YXRlIG1fc3RhdGU7Cisg
ICAgc3RydWN0IERhdGEgeworICAgICAgICBEYXRhKCkKKyAgICAgICAgICAgIDogc3RhdGUoU3Rh
dGU6OkZpbmlzaGVkKQorICAgICAgICAgICAgLCBlc3RpbWF0ZWRQcm9ncmVzcygwKQorICAgICAg
ICB7CisgICAgICAgIH0KIAotICAgIFN0cmluZyBtX3BlbmRpbmdBUElSZXF1ZXN0VVJMOworICAg
ICAgICBTdGF0ZSBzdGF0ZTsKIAotICAgIFN0cmluZyBtX3Byb3Zpc2lvbmFsVVJMOwotICAgIFN0
cmluZyBtX3VybDsKKyAgICAgICAgU3RyaW5nIHBlbmRpbmdBUElSZXF1ZXN0VVJMOwogCi0gICAg
U3RyaW5nIG1fdW5yZWFjaGFibGVVUkw7Ci0gICAgU3RyaW5nIG1fbGFzdFVucmVhY2hhYmxlVVJM
OworICAgICAgICBTdHJpbmcgcHJvdmlzaW9uYWxVUkw7CisgICAgICAgIFN0cmluZyB1cmw7CiAK
LSAgICBTdHJpbmcgbV90aXRsZTsKKyAgICAgICAgU3RyaW5nIHVucmVhY2hhYmxlVVJMOworCisg
ICAgICAgIFN0cmluZyB0aXRsZTsKKworICAgICAgICBkb3VibGUgZXN0aW1hdGVkUHJvZ3Jlc3M7
CisgICAgfTsKKworICAgIHN0YXRpYyBTdHJpbmcgYWN0aXZlVVJMKGNvbnN0IERhdGEmKTsKKyAg
ICBzdGF0aWMgZG91YmxlIGVzdGltYXRlZFByb2dyZXNzKGNvbnN0IERhdGEmKTsKKworICAgIERh
dGEgbV9jb21taXR0ZWRTdGF0ZTsKKyAgICBEYXRhIG1fdW5jb21taXR0ZWRTdGF0ZTsKKworICAg
IFN0cmluZyBtX2xhc3RVbnJlYWNoYWJsZVVSTDsKIAotICAgIGRvdWJsZSBtX2VzdGltYXRlZFBy
b2dyZXNzOworICAgIGJvb2wgbV9tYXlIYXZlVW5jb21taXR0ZWRDaGFuZ2VzOworICAgIHVuc2ln
bmVkIG1fb3V0c3RhbmRpbmdUcmFuc2FjdGlvbkNvdW50OwogfTsKIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAko
cmV2aXNpb24gMTYwMzQ3KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94
eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU5OSw3ICs1OTksOSBAQCBib29sIFdlYlBhZ2VQcm94
eTo6bWF5YmVJbml0aWFsaXplU2FuZGJvCiAKIHZvaWQgV2ViUGFnZVByb3h5Ojpsb2FkVVJMKGNv
bnN0IFN0cmluZyYgdXJsLCBBUEk6Ok9iamVjdCogdXNlckRhdGEpCiB7Ci0gICAgbV9wYWdlTG9h
ZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKHVybCk7CisgICAgYXV0byB0cmFuc2FjdGlv
biA9IG1fcGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOworCisgICAgbV9wYWdlTG9hZFN0YXRl
LnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKHRyYW5zYWN0aW9uLCB1cmwpOwogCiAgICAgaWYgKCFp
c1ZhbGlkKCkpCiAgICAgICAgIHJlYXR0YWNoVG9XZWJQcm9jZXNzKCk7CkBAIC02MTQsNyArNjE2
LDkgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmxvYWRVUkwoY29uc3QgU3RyaW5nJgogCiB2b2lkIFdl
YlBhZ2VQcm94eTo6bG9hZFVSTFJlcXVlc3QoV2ViVVJMUmVxdWVzdCogdXJsUmVxdWVzdCwgQVBJ
OjpPYmplY3QqIHVzZXJEYXRhKQogewotICAgIG1fcGFnZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJ
UmVxdWVzdFVSTCh1cmxSZXF1ZXN0LT5yZXNvdXJjZVJlcXVlc3QoKS51cmwoKSk7CisgICAgYXV0
byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOworCisgICAgbV9w
YWdlTG9hZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKHRyYW5zYWN0aW9uLCB1cmxSZXF1
ZXN0LT5yZXNvdXJjZVJlcXVlc3QoKS51cmwoKSk7CiAKICAgICBpZiAoIWlzVmFsaWQoKSkKICAg
ICAgICAgcmVhdHRhY2hUb1dlYlByb2Nlc3MoKTsKQEAgLTY3OSw3ICs2ODMsOSBAQCB2b2lkIFdl
YlBhZ2VQcm94eTo6bG9hZEFsdGVybmF0ZUhUTUxTdHJpCiAgICAgaWYgKCFpc1ZhbGlkKCkpCiAg
ICAgICAgIHJlYXR0YWNoVG9XZWJQcm9jZXNzKCk7CiAKLSAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0
VW5yZWFjaGFibGVVUkwodW5yZWFjaGFibGVVUkwpOworICAgIGF1dG8gdHJhbnNhY3Rpb24gPSBt
X3BhZ2VMb2FkU3RhdGUudHJhbnNhY3Rpb24oKTsKKworICAgIG1fcGFnZUxvYWRTdGF0ZS5zZXRV
bnJlYWNoYWJsZVVSTCh0cmFuc2FjdGlvbiwgdW5yZWFjaGFibGVVUkwpOwogCiAgICAgaWYgKG1f
bWFpbkZyYW1lKQogICAgICAgICBtX21haW5GcmFtZS0+c2V0VW5yZWFjaGFibGVVUkwodW5yZWFj
aGFibGVVUkwpOwpAQCAtNzIyLDcgKzcyOCw4IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpyZWxvYWQo
Ym9vbCByZWxvYWRGcm8KIAogICAgIGlmIChtX2JhY2tGb3J3YXJkTGlzdC0+Y3VycmVudEl0ZW0o
KSkgewogICAgICAgICBTdHJpbmcgdXJsID0gbV9iYWNrRm9yd2FyZExpc3QtPmN1cnJlbnRJdGVt
KCktPnVybCgpOwotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQSVJlcXVlc3RV
UkwodXJsKTsKKyAgICAgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRTdGF0ZS50cmFu
c2FjdGlvbigpOworICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0UGVuZGluZ0FQSVJlcXVlc3RV
UkwodHJhbnNhY3Rpb24sIHVybCk7CiAKICAgICAgICAgLy8gV2UgbWF5IG5vdCBoYXZlIGFuIGV4
dGVuc2lvbiB5ZXQgaWYgYmFjay9mb3J3YXJkIGxpc3Qgd2FzIHJlaW5zdGF0ZWQgYWZ0ZXIgYSBX
ZWJQcm9jZXNzIGNyYXNoIG9yIGEgYnJvd3NlciByZWxhdW5jaAogICAgICAgICBib29sIGNyZWF0
ZWRFeHRlbnNpb24gPSBtYXliZUluaXRpYWxpemVTYW5kYm94RXh0ZW5zaW9uSGFuZGxlKFVSTChV
UkwoKSwgdXJsKSwgc2FuZGJveEV4dGVuc2lvbkhhbmRsZSk7CkBAIC03NDgsNyArNzU1LDkgQEAg
dm9pZCBXZWJQYWdlUHJveHk6OmdvRm9yd2FyZCgpCiAgICAgaWYgKCFmb3J3YXJkSXRlbSkKICAg
ICAgICAgcmV0dXJuOwogCi0gICAgbV9wYWdlTG9hZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0
VVJMKGZvcndhcmRJdGVtLT51cmwoKSk7CisgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxv
YWRTdGF0ZS50cmFuc2FjdGlvbigpOworCisgICAgbV9wYWdlTG9hZFN0YXRlLnNldFBlbmRpbmdB
UElSZXF1ZXN0VVJMKHRyYW5zYWN0aW9uLCBmb3J3YXJkSXRlbS0+dXJsKCkpOwogCiAgICAgaWYg
KCFpc1ZhbGlkKCkpIHsKICAgICAgICAgcmVhdHRhY2hUb1dlYlByb2Nlc3NXaXRoSXRlbShmb3J3
YXJkSXRlbSk7CkBAIC03NzMsNyArNzgyLDkgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdvQmFjaygp
CiAgICAgaWYgKCFiYWNrSXRlbSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgbV9wYWdlTG9hZFN0
YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKGJhY2tJdGVtLT51cmwoKSk7CisgICAgYXV0byB0
cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOworCisgICAgbV9wYWdl
TG9hZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKHRyYW5zYWN0aW9uLCBiYWNrSXRlbS0+
dXJsKCkpOwogCiAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKICAgICAgICAgcmVhdHRhY2hUb1dlYlBy
b2Nlc3NXaXRoSXRlbShiYWNrSXRlbSk7CkBAIC03OTYsNyArODA3LDkgQEAgdm9pZCBXZWJQYWdl
UHJveHk6OmdvVG9CYWNrRm9yd2FyZEl0ZW0oVwogICAgICAgICByZXR1cm47CiAgICAgfQogICAg
IAotICAgIG1fcGFnZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJUmVxdWVzdFVSTChpdGVtLT51cmwo
KSk7CisgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigp
OworCisgICAgbV9wYWdlTG9hZFN0YXRlLnNldFBlbmRpbmdBUElSZXF1ZXN0VVJMKHRyYW5zYWN0
aW9uLCBpdGVtLT51cmwoKSk7CiAKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBh
Z2U6OkdvVG9CYWNrRm9yd2FyZEl0ZW0oaXRlbS0+aXRlbUlEKCkpLCBtX3BhZ2VJRCk7CiAgICAg
bV9wcm9jZXNzLT5yZXNwb25zaXZlbmVzc1RpbWVyKCktPnN0YXJ0KCk7CkBAIC0xNDA0LDggKzE0
MTcsMTAgQEAgdm9pZCBXZWJQYWdlUHJveHk6OnJlY2VpdmVkUG9saWN5RGVjaXNpbwogICAgIGlm
ICghaXNWYWxpZCgpKQogICAgICAgICByZXR1cm47CiAKKyAgICBhdXRvIHRyYW5zYWN0aW9uID0g
bV9wYWdlTG9hZFN0YXRlLnRyYW5zYWN0aW9uKCk7CisKICAgICBpZiAoYWN0aW9uID09IFBvbGlj
eUlnbm9yZSkKLSAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmNsZWFyUGVuZGluZ0FQSVJlcXVlc3RV
UkwoKTsKKyAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmNsZWFyUGVuZGluZ0FQSVJlcXVlc3RVUkwo
dHJhbnNhY3Rpb24pOwogCiAgICAgdWludDY0X3QgZG93bmxvYWRJRCA9IDA7CiAgICAgaWYgKGFj
dGlvbiA9PSBQb2xpY3lEb3dubG9hZCkgewpAQCAtMjA0NSwyOCArMjA2MCwzNiBAQCBkb3VibGUg
V2ViUGFnZVByb3h5Ojplc3RpbWF0ZWRQcm9ncmVzcygpCiAKIHZvaWQgV2ViUGFnZVByb3h5Ojpk
aWRTdGFydFByb2dyZXNzKCkKIHsKLSAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkU3RhcnRQcm9ncmVz
cygpOworICAgIGF1dG8gdHJhbnNhY3Rpb24gPSBtX3BhZ2VMb2FkU3RhdGUudHJhbnNhY3Rpb24o
KTsKKyAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkU3RhcnRQcm9ncmVzcyh0cmFuc2FjdGlvbik7CiAK
KyAgICBtX3BhZ2VMb2FkU3RhdGUuY29tbWl0Q2hhbmdlcygpOwogICAgIG1fbG9hZGVyQ2xpZW50
LmRpZFN0YXJ0UHJvZ3Jlc3ModGhpcyk7CiB9CiAKIHZvaWQgV2ViUGFnZVByb3h5OjpkaWRDaGFu
Z2VQcm9ncmVzcyhkb3VibGUgdmFsdWUpCiB7Ci0gICAgbV9wYWdlTG9hZFN0YXRlLmRpZENoYW5n
ZVByb2dyZXNzKHZhbHVlKTsKKyAgICBhdXRvIHRyYW5zYWN0aW9uID0gbV9wYWdlTG9hZFN0YXRl
LnRyYW5zYWN0aW9uKCk7CisgICAgbV9wYWdlTG9hZFN0YXRlLmRpZENoYW5nZVByb2dyZXNzKHRy
YW5zYWN0aW9uLCB2YWx1ZSk7CiAKKyAgICBtX3BhZ2VMb2FkU3RhdGUuY29tbWl0Q2hhbmdlcygp
OwogICAgIG1fbG9hZGVyQ2xpZW50LmRpZENoYW5nZVByb2dyZXNzKHRoaXMpOwogfQogCiB2b2lk
IFdlYlBhZ2VQcm94eTo6ZGlkRmluaXNoUHJvZ3Jlc3MoKQogewotICAgIG1fcGFnZUxvYWRTdGF0
ZS5kaWRGaW5pc2hQcm9ncmVzcygpOworICAgIGF1dG8gdHJhbnNhY3Rpb24gPSBtX3BhZ2VMb2Fk
U3RhdGUudHJhbnNhY3Rpb24oKTsKKyAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkRmluaXNoUHJvZ3Jl
c3ModHJhbnNhY3Rpb24pOwogCisgICAgbV9wYWdlTG9hZFN0YXRlLmNvbW1pdENoYW5nZXMoKTsK
ICAgICBtX2xvYWRlckNsaWVudC5kaWRGaW5pc2hQcm9ncmVzcyh0aGlzKTsKIH0KIAogdm9pZCBX
ZWJQYWdlUHJveHk6OmRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUodWludDY0X3QgZnJh
bWVJRCwgY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdW5yZWFjaGFibGVVUkwsIENv
cmVJUEM6Ok1lc3NhZ2VEZWNvZGVyJiBkZWNvZGVyKQogewotICAgIG1fcGFnZUxvYWRTdGF0ZS5j
bGVhclBlbmRpbmdBUElSZXF1ZXN0VVJMKCk7CisgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1fcGFn
ZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOworCisgICAgbV9wYWdlTG9hZFN0YXRlLmNsZWFyUGVu
ZGluZ0FQSVJlcXVlc3RVUkwodHJhbnNhY3Rpb24pOwogCiAgICAgUmVmUHRyPEFQSTo6T2JqZWN0
PiB1c2VyRGF0YTsKICAgICBXZWJDb250ZXh0VXNlck1lc3NhZ2VEZWNvZGVyIG1lc3NhZ2VEZWNv
ZGVyKHVzZXJEYXRhLCBwcm9jZXNzKCkpOwpAQCAtMjA3OCwxMSArMjEwMSwxMiBAQCB2b2lkIFdl
YlBhZ2VQcm94eTo6ZGlkU3RhcnRQcm92aXNpb25hbExvCiAgICAgTUVTU0FHRV9DSEVDS19VUkwo
dXJsKTsKIAogICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSkKLSAgICAgICAgbV9wYWdlTG9h
ZFN0YXRlLmRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKHVybCwgdW5yZWFjaGFibGVVUkwpOworICAg
ICAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkU3RhcnRQcm92aXNpb25hbExvYWQodHJhbnNhY3Rpb24s
IHVybCwgdW5yZWFjaGFibGVVUkwpOwogCiAgICAgZnJhbWUtPnNldFVucmVhY2hhYmxlVVJMKHVu
cmVhY2hhYmxlVVJMKTsKICAgICBmcmFtZS0+ZGlkU3RhcnRQcm92aXNpb25hbExvYWQodXJsKTsK
IAorICAgIG1fcGFnZUxvYWRTdGF0ZS5jb21taXRDaGFuZ2VzKCk7CiAgICAgbV9sb2FkZXJDbGll
bnQuZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFtZSh0aGlzLCBmcmFtZSwgdXNlckRhdGEu
Z2V0KCkpOwogfQogCkBAIC0yMDk3LDExICsyMTIxLDE0IEBAIHZvaWQgV2ViUGFnZVByb3h5Ojpk
aWRSZWNlaXZlU2VydmVyUmVkaXIKICAgICBNRVNTQUdFX0NIRUNLKGZyYW1lKTsKICAgICBNRVNT
QUdFX0NIRUNLX1VSTCh1cmwpOwogCisgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRT
dGF0ZS50cmFuc2FjdGlvbigpOworCiAgICAgaWYgKGZyYW1lLT5pc01haW5GcmFtZSgpKQotICAg
ICAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9u
YWxMb2FkKHVybCk7CisgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5kaWRSZWNlaXZlU2VydmVyUmVk
aXJlY3RGb3JQcm92aXNpb25hbExvYWQodHJhbnNhY3Rpb24sIHVybCk7CiAKICAgICBmcmFtZS0+
ZGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2FkKHVybCk7CiAKKyAgICBt
X3BhZ2VMb2FkU3RhdGUuY29tbWl0Q2hhbmdlcygpOwogICAgIG1fbG9hZGVyQ2xpZW50LmRpZFJl
Y2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZEZvckZyYW1lKHRoaXMsIGZyYW1l
LCB1c2VyRGF0YS5nZXQoKSk7CiB9CiAKQEAgLTIxMTUsMTEgKzIxNDIsMTQgQEAgdm9pZCBXZWJQ
YWdlUHJveHk6OmRpZEZhaWxQcm92aXNpb25hbExvYQogICAgIFdlYkZyYW1lUHJveHkqIGZyYW1l
ID0gbV9wcm9jZXNzLT53ZWJGcmFtZShmcmFtZUlEKTsKICAgICBNRVNTQUdFX0NIRUNLKGZyYW1l
KTsKIAorICAgIGF1dG8gdHJhbnNhY3Rpb24gPSBtX3BhZ2VMb2FkU3RhdGUudHJhbnNhY3Rpb24o
KTsKKwogICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSkKLSAgICAgICAgbV9wYWdlTG9hZFN0
YXRlLmRpZEZhaWxQcm92aXNpb25hbExvYWQoKTsKKyAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmRp
ZEZhaWxQcm92aXNpb25hbExvYWQodHJhbnNhY3Rpb24pOwogCiAgICAgZnJhbWUtPmRpZEZhaWxQ
cm92aXNpb25hbExvYWQoKTsKIAorICAgIG1fcGFnZUxvYWRTdGF0ZS5jb21taXRDaGFuZ2VzKCk7
CiAgICAgbV9sb2FkZXJDbGllbnQuZGlkRmFpbFByb3Zpc2lvbmFsTG9hZFdpdGhFcnJvckZvckZy
YW1lKHRoaXMsIGZyYW1lLCBlcnJvciwgdXNlckRhdGEuZ2V0KCkpOwogfQogCkBAIC0yMTQ2LDgg
KzIxNzYsMTAgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmRpZENvbW1pdExvYWRGb3JGcmFtZQogICAg
IFdlYkZyYW1lUHJveHkqIGZyYW1lID0gbV9wcm9jZXNzLT53ZWJGcmFtZShmcmFtZUlEKTsKICAg
ICBNRVNTQUdFX0NIRUNLKGZyYW1lKTsKIAorICAgIGF1dG8gdHJhbnNhY3Rpb24gPSBtX3BhZ2VM
b2FkU3RhdGUudHJhbnNhY3Rpb24oKTsKKwogICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSkg
ewotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkQ29tbWl0TG9hZCgpOworICAgICAgICBtX3Bh
Z2VMb2FkU3RhdGUuZGlkQ29tbWl0TG9hZCh0cmFuc2FjdGlvbik7CiAgICAgICAgIG1fcGFnZUNs
aWVudC5kaWRDb21taXRMb2FkRm9yTWFpbkZyYW1lKCk7CiAgICAgfQogCkBAIC0yMTcwLDYgKzIy
MDIsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6ZGlkQ29tbWl0TG9hZEZvckZyYW1lCiAgICAgaWYg
KGZyYW1lLT5pc01haW5GcmFtZSgpICYmIHN0YXRpY19jYXN0PEZyYW1lTG9hZFR5cGU+KG9wYXF1
ZUZyYW1lTG9hZFR5cGUpID09IEZyYW1lTG9hZFR5cGVTdGFuZGFyZCkKICAgICAgICAgbV9wYWdl
U2NhbGVGYWN0b3IgPSAxOwogCisgICAgbV9wYWdlTG9hZFN0YXRlLmNvbW1pdENoYW5nZXMoKTsK
ICAgICBtX2xvYWRlckNsaWVudC5kaWRDb21taXRMb2FkRm9yRnJhbWUodGhpcywgZnJhbWUsIHVz
ZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjE5NiwxMSArMjIyOSwxNCBAQCB2b2lkIFdlYlBhZ2VQ
cm94eTo6ZGlkRmluaXNoTG9hZEZvckZyYW1lCiAgICAgV2ViRnJhbWVQcm94eSogZnJhbWUgPSBt
X3Byb2Nlc3MtPndlYkZyYW1lKGZyYW1lSUQpOwogICAgIE1FU1NBR0VfQ0hFQ0soZnJhbWUpOwog
CisgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOwor
CiAgICAgaWYgKGZyYW1lLT5pc01haW5GcmFtZSgpKQotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUu
ZGlkRmluaXNoTG9hZCgpOworICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuZGlkRmluaXNoTG9hZCh0
cmFuc2FjdGlvbik7CiAKICAgICBmcmFtZS0+ZGlkRmluaXNoTG9hZCgpOwogCisgICAgbV9wYWdl
TG9hZFN0YXRlLmNvbW1pdENoYW5nZXMoKTsKICAgICBtX2xvYWRlckNsaWVudC5kaWRGaW5pc2hM
b2FkRm9yRnJhbWUodGhpcywgZnJhbWUsIHVzZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjIxNiwx
MSArMjI1MiwxNCBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6ZGlkRmFpbExvYWRGb3JGcmFtZSh1CiAK
ICAgICBjbGVhckxvYWREZXBlbmRlbnRDYWxsYmFja3MoKTsKIAorICAgIGF1dG8gdHJhbnNhY3Rp
b24gPSBtX3BhZ2VMb2FkU3RhdGUudHJhbnNhY3Rpb24oKTsKKwogICAgIGlmIChmcmFtZS0+aXNN
YWluRnJhbWUoKSkKLSAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmRpZEZhaWxMb2FkKCk7CisgICAg
ICAgIG1fcGFnZUxvYWRTdGF0ZS5kaWRGYWlsTG9hZCh0cmFuc2FjdGlvbik7CiAKICAgICBmcmFt
ZS0+ZGlkRmFpbExvYWQoKTsKIAorICAgIG1fcGFnZUxvYWRTdGF0ZS5jb21taXRDaGFuZ2VzKCk7
CiAgICAgbV9sb2FkZXJDbGllbnQuZGlkRmFpbExvYWRXaXRoRXJyb3JGb3JGcmFtZSh0aGlzLCBm
cmFtZSwgZXJyb3IsIHVzZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjIzNSwxMiArMjI3NCwxNSBA
QCB2b2lkIFdlYlBhZ2VQcm94eTo6ZGlkU2FtZURvY3VtZW50TmF2aWdhCiAgICAgTUVTU0FHRV9D
SEVDSyhmcmFtZSk7CiAgICAgTUVTU0FHRV9DSEVDS19VUkwodXJsKTsKIAorICAgIGF1dG8gdHJh
bnNhY3Rpb24gPSBtX3BhZ2VMb2FkU3RhdGUudHJhbnNhY3Rpb24oKTsKKwogICAgIGlmIChmcmFt
ZS0+aXNNYWluRnJhbWUoKSkKLSAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmRpZFNhbWVEb2N1bWVu
dE5hdmlnYXRpb24odXJsKTsKKyAgICAgICAgbV9wYWdlTG9hZFN0YXRlLmRpZFNhbWVEb2N1bWVu
dE5hdmlnYXRpb24odHJhbnNhY3Rpb24sIHVybCk7CiAKLSAgICBtX3BhZ2VMb2FkU3RhdGUuY2xl
YXJQZW5kaW5nQVBJUmVxdWVzdFVSTCgpOworICAgIG1fcGFnZUxvYWRTdGF0ZS5jbGVhclBlbmRp
bmdBUElSZXF1ZXN0VVJMKHRyYW5zYWN0aW9uKTsKICAgICBmcmFtZS0+ZGlkU2FtZURvY3VtZW50
TmF2aWdhdGlvbih1cmwpOwogCisgICAgbV9wYWdlTG9hZFN0YXRlLmNvbW1pdENoYW5nZXMoKTsK
ICAgICBtX2xvYWRlckNsaWVudC5kaWRTYW1lRG9jdW1lbnROYXZpZ2F0aW9uRm9yRnJhbWUodGhp
cywgZnJhbWUsIHN0YXRpY19jYXN0PFNhbWVEb2N1bWVudE5hdmlnYXRpb25UeXBlPihvcGFxdWVT
YW1lRG9jdW1lbnROYXZpZ2F0aW9uVHlwZSksIHVzZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjI1
NCwxMSArMjI5NiwxNCBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6ZGlkUmVjZWl2ZVRpdGxlRm9yRnJh
CiAgICAgV2ViRnJhbWVQcm94eSogZnJhbWUgPSBtX3Byb2Nlc3MtPndlYkZyYW1lKGZyYW1lSUQp
OwogICAgIE1FU1NBR0VfQ0hFQ0soZnJhbWUpOwogCisgICAgYXV0byB0cmFuc2FjdGlvbiA9IG1f
cGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOworCiAgICAgaWYgKGZyYW1lLT5pc01haW5GcmFt
ZSgpKQotICAgICAgICBtX3BhZ2VMb2FkU3RhdGUuc2V0VGl0bGUodGl0bGUpOworICAgICAgICBt
X3BhZ2VMb2FkU3RhdGUuc2V0VGl0bGUodHJhbnNhY3Rpb24sIHRpdGxlKTsKIAogICAgIGZyYW1l
LT5kaWRDaGFuZ2VUaXRsZSh0aXRsZSk7CiAgICAgCisgICAgbV9wYWdlTG9hZFN0YXRlLmNvbW1p
dENoYW5nZXMoKTsKICAgICBtX2xvYWRlckNsaWVudC5kaWRSZWNlaXZlVGl0bGVGb3JGcmFtZSh0
aGlzLCB0aXRsZSwgZnJhbWUsIHVzZXJEYXRhLmdldCgpKTsKIH0KIApAQCAtMjM2OCw4ICsyNDEz
LDEwIEBAIHZvaWQgV2ViUGFnZVByb3h5OjpkZWNpZGVQb2xpY3lGb3JOYXZpZ2EKICAgICBpZiAo
IWRlY29kZXIuZGVjb2RlKG1lc3NhZ2VEZWNvZGVyKSkKICAgICAgICAgcmV0dXJuOwogCisgICAg
YXV0byB0cmFuc2FjdGlvbiA9IG1fcGFnZUxvYWRTdGF0ZS50cmFuc2FjdGlvbigpOworCiAgICAg
aWYgKHJlcXVlc3QudXJsKCkgIT0gbV9wYWdlTG9hZFN0YXRlLnBlbmRpbmdBUElSZXF1ZXN0VVJM
KCkpCi0gICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5jbGVhclBlbmRpbmdBUElSZXF1ZXN0VVJMKCk7
CisgICAgICAgIG1fcGFnZUxvYWRTdGF0ZS5jbGVhclBlbmRpbmdBUElSZXF1ZXN0VVJMKHRyYW5z
YWN0aW9uKTsKIAogICAgIFdlYkZyYW1lUHJveHkqIGZyYW1lID0gbV9wcm9jZXNzLT53ZWJGcmFt
ZShmcmFtZUlEKTsKICAgICBNRVNTQUdFX0NIRUNLKGZyYW1lKTsKQEAgLTM2NjMsMTEgKzM3MTAs
MTIgQEAgdm9pZCBXZWJQYWdlUHJveHk6OnByb2Nlc3NEaWRDcmFzaCgpCiAKICAgICByZXNldFN0
YXRlQWZ0ZXJQcm9jZXNzRXhpdGVkKCk7CiAKLSAgICAvLyBGSVhNRTogQ29uc2lkZXIgY2FsbGlu
ZyByZXNldCBhZnRlciBjYWxsaW5nIG91dCB0byB0aGUgbG9hZGVyIGNsaWVudCwKLSAgICAvLyBo
YXZpbmcgdGhlIHBhZ2UgbG9hZCBzdGF0ZSBhdmFpbGFibGUgY291bGQgYmUgdXNlZnVsLgotICAg
IG1fcGFnZUxvYWRTdGF0ZS5yZXNldCgpOworICAgIGF1dG8gdHJhbnNhY3Rpb24gPSBtX3BhZ2VM
b2FkU3RhdGUudHJhbnNhY3Rpb24oKTsKKworICAgIG1fcGFnZUxvYWRTdGF0ZS5yZXNldCh0cmFu
c2FjdGlvbik7CiAKICAgICBtX3BhZ2VDbGllbnQucHJvY2Vzc0RpZENyYXNoKCk7CisKICAgICBt
X2xvYWRlckNsaWVudC5wcm9jZXNzRGlkQ3Jhc2godGhpcyk7CiB9CiAKSW5kZXg6IFNvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9BUEkvQ29jb2EvV0tCcm93c2luZ0NvbnRleHRDb250cm9sbGVyLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvQ29jb2EvV0tCcm93
c2luZ0NvbnRleHRDb250cm9sbGVyLm1tCShyZXZpc2lvbiAxNjAzNDcpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL0NvY29hL1dLQnJvd3NpbmdDb250ZXh0Q29udHJvbGxlci5tbQko
d29ya2luZyBjb3B5KQpAQCAtODQsNiArODQsMTYgQEAgcHJpdmF0ZToKICAgICAgICAgW21fY29u
dHJvbGxlciBkaWRDaGFuZ2VWYWx1ZUZvcktleTpAInRpdGxlIl07CiAgICAgfQogCisgICAgdmly
dHVhbCB2b2lkIHdpbGxDaGFuZ2VBY3RpdmVVUkwoKSBPVkVSUklERQorICAgIHsKKyAgICAgICAg
W21fY29udHJvbGxlciB3aWxsQ2hhbmdlVmFsdWVGb3JLZXk6QCJhY3RpdmVVUkwiXTsKKyAgICB9
CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlQWN0aXZlVVJMKCkgT1ZFUlJJREUKKyAgICB7
CisgICAgICAgIFttX2NvbnRyb2xsZXIgZGlkQ2hhbmdlVmFsdWVGb3JLZXk6QCJhY3RpdmVVUkwi
XTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHZvaWQgd2lsbENoYW5nZUVzdGltYXRlZFByb2dyZXNz
KCkgT1ZFUlJJREUKICAgICB7CiAgICAgICAgIFttX2NvbnRyb2xsZXIgd2lsbENoYW5nZVZhbHVl
Rm9yS2V5OkAiZXN0aW1hdGVkUHJvZ3Jlc3MiXTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9jZi9XZWJQYWdlUHJveHlDRi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL2NmL1dlYlBhZ2VQcm94eUNGLmNwcAkocmV2aXNpb24gMTYwMzQ3KQorKysgU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL2NmL1dlYlBhZ2VQcm94eUNGLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTUxLDYgKzE1MSw4IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpyZXN0b3JlRnJvbVNlc3Np
b25TdGEKICAgICAgICAgICAgIHByb3Zpc2lvbmFsVVJMID0gc3RhdGljX2Nhc3Q8Q0ZTdHJpbmdS
ZWY+KHZhbHVlKTsKICAgICB9CiAKKyAgICBhdXRvIHRyYW5zYWN0aW9uID0gbV9wYWdlTG9hZFN0
YXRlLnRyYW5zYWN0aW9uKCk7CisKICAgICBpZiAoYmFja0ZvcndhcmRMaXN0RGljdGlvbmFyeSkg
ewogICAgICAgICBpZiAoIW1fYmFja0ZvcndhcmRMaXN0LT5yZXN0b3JlRnJvbUNGRGljdGlvbmFy
eVJlcHJlc2VudGF0aW9uKGJhY2tGb3J3YXJkTGlzdERpY3Rpb25hcnkpKQogICAgICAgICAgICAg
TE9HKFNlc3Npb25TdGF0ZSwgIkZhaWxlZCB0byByZXN0b3JlIGJhY2svZm9yd2FyZCBsaXN0IGZy
b20gU2Vzc2lvbkhpc3RvcnkgZGljdGlvbmFyeSIpOwpAQCAtMTY1LDcgKzE2Nyw3IEBAIHZvaWQg
V2ViUGFnZVByb3h5OjpyZXN0b3JlRnJvbVNlc3Npb25TdGEKICAgICAgICAgICAgICAgICAgICAg
cHJvY2VzcygpLnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OlJlc3RvcmVTZXNzaW9uKHN0YXRlKSwg
bV9wYWdlSUQpOwogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBp
ZiAoV2ViQmFja0ZvcndhcmRMaXN0SXRlbSogaXRlbSA9IG1fYmFja0ZvcndhcmRMaXN0LT5jdXJy
ZW50SXRlbSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wYWdlTG9hZFN0YXRlLnNldFBl
bmRpbmdBUElSZXF1ZXN0VVJMKGl0ZW0tPnVybCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fcGFnZUxvYWRTdGF0ZS5zZXRQZW5kaW5nQVBJUmVxdWVzdFVSTCh0cmFuc2FjdGlvbiwgaXRl
bS0+dXJsKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKS5zZW5kKE1lc3NhZ2Vz
OjpXZWJQYWdlOjpSZXN0b3JlU2Vzc2lvbkFuZE5hdmlnYXRlVG9DdXJyZW50SXRlbShzdGF0ZSks
IG1fcGFnZUlEKTsKICAgICAgICAgICAgICAgICB9Cg==
</data>
<flag name="review"
          id="242362"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
      

    </bug>

</bugzilla>