<?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>141877</bug_id>
          
          <creation_ts>2015-02-21 20:56:53 -0800</creation_ts>
          <short_desc>Web Inspector: split out CSSAgent wrapper classes to fix protocol layering violation and cruft</short_desc>
          <delta_ts>2016-12-13 15:33:55 -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>Web Inspector</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Brian Burg">burg</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>benjamin</cc>
    
    <cc>inspector-bugzilla-changes</cc>
    
    <cc>jonowells</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1071057</commentid>
    <comment_count>0</comment_count>
    <who name="Brian Burg">burg</who>
    <bug_when>2015-02-21 20:56:53 -0800</bug_when>
    <thetext>Yuck!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071058</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2015-02-21 20:57:03 -0800</bug_when>
    <thetext>&lt;rdar://problem/19915490&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071059</commentid>
    <comment_count>2</comment_count>
      <attachid>247080</attachid>
    <who name="Brian Burg">burg</who>
    <bug_when>2015-02-21 20:58:58 -0800</bug_when>
    <thetext>Created attachment 247080
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071060</commentid>
    <comment_count>3</comment_count>
    <who name="Brian Burg">burg</who>
    <bug_when>2015-02-21 22:10:50 -0800</bug_when>
    <thetext>Yeah, I know, this will be hell to review. Maybe we can do it in person at WebKitCon. The gist of this change: be able to introspect, dump and modify CSS from other backend agents.

Currently, CSSAgent heavily uses a wrapper class InspectorStyleSheet, which represents a stylesheet or an inline style (with subclass InspectorStyleSheetForInlineStyle). These classes hold source range data, raw style text, and have a basic API for mutating properties or entire stylesheets.

These existing classes do not map well to what actually is shared and differs between inline styles and stylesheets. As a result, the code is convoluted and littered with null checks to tell apart the two &quot;modes&quot;. There is also a lot of code to maintain up-to-date source data, raw text, and style rules, but each piece of data has a different lifetime. To top it all off, responsibility for protocol encoding is split across CSSAgent and the various wrapper classes. In some cases, a style rule descends through 3 protocol object builder methods to fully construct a protocol object.

I&apos;m proceeding in several steps to clean up this mess:

1. Convert to using a &quot;StyleRuleSet&quot; abstraction.

A StyleRuleSet contains a number of &quot;StyleRule&quot; instances. Inline style rules are represented by InlineStyleRuleSet. Its single rule has no selector. It overrides mutation methods to modify the element&apos;s style attribute. Stylesheets are represented by the StylesheetRuleSet subclass.

2. Move all protocol builder classes to CSSAgent

3. Straighten out StyleRule, StyleProperty, etc. Protocol builder methods should walk over a wrapper hierarchy that mirrors the actual CSS stylesheet/rule/property hierarchy.

4. Remove unnecessary wrapper methods that are made obsolete by proper per-style and per-property APIs introduced in (3)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071067</commentid>
    <comment_count>4</comment_count>
      <attachid>247080</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2015-02-22 07:36:50 -0800</bug_when>
    <thetext>Comment on attachment 247080
WIP

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

Looks nice! I&apos;ll defer to others for this review, but I found two little nits up front.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:201
&gt; +        return String::format(&quot;SetStyleSheetText %&quot; PRIu64, m_ruleSet-&gt;identifier());

%llu instead of PRIu64? I had to Google it.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:555
&gt; +                CSSStyleDeclaration* style = ruleSet ? ruleSet-&gt;inlineStyle() : nullptr;
&gt; +                if (style)

Nit: One line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071775</commentid>
    <comment_count>5</comment_count>
      <attachid>247264</attachid>
    <who name="Brian Burg">burg</who>
    <bug_when>2015-02-24 13:50:10 -0800</bug_when>
    <thetext>Created attachment 247264
WIP 2

The latest WIP patch is pretty close to the design I wanted. The main difference from ToT is that the protocol builders do less work digging for values. Instead that code is put in wrapper classes (StyleRule, StyleProperty, RuleSelector, etc) that can be used by other parts of the inspector backend. 

They are called &apos;wrappers&apos; because they don&apos;t really own any data. At the top level, CSSAgent owns InlineStyleRuleSet&apos;s and StylesheetRuleSet&apos;s, which contain parsed data and strong refs to the CSSStyleSheet or Element. All other wrappers (styles, rules, selectors) are facades on top of the RuleSet&apos;s parsed source data and the relevant CSSOM objects.

To minimize unnecessary refcounting and cycles, wrappers are noncopyable, stack allocated views only accessible through lambdas/functor interfaces. It&apos;s better to show what I mean with examples, so I&apos;ll highlight a few interesting lines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071807</commentid>
    <comment_count>6</comment_count>
      <attachid>247264</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2015-02-24 15:11:23 -0800</bug_when>
    <thetext>Comment on attachment 247264
WIP 2

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

I like the functional aspect of this. I&apos;m not totally familiar with the code, but I really like that it is separating out into discrete classes / files that can be more easily understood on their own. I mostly just made style nits as I looked over it.

&gt; Source/JavaScriptCore/inspector/protocol/CSS.json:9
&gt;              &quot;id&quot;: &quot;StyleSheetId&quot;,
&gt; -            &quot;type&quot;: &quot;string&quot;
&gt; +            &quot;type&quot;: &quot;integer&quot;
&gt;          },

We need to make sure the frontend handles this properly with legacy backends.

&gt; Source/JavaScriptCore/inspector/protocol/CSS.json:-180
&gt; -            &quot;enum&quot;: [&quot;active&quot;, &quot;inactive&quot;, &quot;disabled&quot;, &quot;style&quot;],

Good research! I just found this out myself.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:216
&gt; -        return String::format(&quot;SetStyleSheetText %s&quot;, m_styleSheet-&gt;id().utf8().data());
&gt; +        return String::format(&quot;SetStyleSheetText %&quot; PRIu64, m_ruleSet-&gt;identifier());

Nit: %llu

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:256
&gt; +        if (is&lt;StylesheetRuleSet&gt;(m_ruleSet))
&gt; +            downcast&lt;StylesheetRuleSet&gt;(m_ruleSet.get()).withStyleForId(m_cssId, handler);
&gt; +        if (is&lt;InlineStyleRuleSet&gt;(m_ruleSet))
&gt; +            downcast&lt;InlineStyleRuleSet&gt;(m_ruleSet.get()).withInlineStyle(handler);

Nit: else-if since I believe these are mutually exclusive. Same in redo as well.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:718
&gt; +    if (is&lt;InlineStyleRuleSet&gt;(ruleSet)) {

Ditto.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1070
&gt; +        return Inspector::Protocol::CSS::CSSMedia::Source::ImportRule;
&gt; +        break;

You can remove all these break after returns. They would be &quot;-Wunreachable-code&quot; warnings.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1096
&gt; +        auto selectorObject = Inspector::Protocol::CSS::CSSSelector::create()
&gt; +            .setText(selector.selectorText())
&gt; +            .release();

While you are here. I&apos;ve considered moving &quot;matches&quot; into CSSSelector. Instead of CSS.getMatchedStylesForNode&apos;s awkward matchedCSSRules out parameter array.

This information is already only computable when there is a context element (m_element) so it only gets good values when created in a getMatchedStylesForNode response.

Doesn&apos;t need to be added, just something to keep in mind we might want to do.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1125
&gt; +    CollectRuleSelectorsFunctor collectSelector(element);

Could be inlined, it might read better! I thought collectorSelector was going to be used elsewhere, or had some destruction semantics, but it doesn&apos;t.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1143
&gt; +    CollectStylesheetRulesFunctor()

Stylesheet =&gt; StyleSheet? Seems we do the latter more often.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1223
&gt; +            sourceURL = &quot;&quot;;

Nit: String() instead of &quot;&quot; when possible.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1241
&gt; +                        sourceURL = &quot;&quot;;

Ditto

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1436
&gt; +    CollectPropertyShorthandsFunctor()
&gt; +    : m_shorthandsArray(Inspector::Protocol::Array&lt;Inspector::Protocol::CSS::ShorthandEntry&gt;::create())
&gt; +    {
&gt; +    }

Style: There have been a few of these Collect class with broken indentation which you will want to clean up.

&gt; Source/WebCore/inspector/InspectorCSSAgent.cpp:1481
&gt; +        propertyObject-&gt;setParsedOk(property.parsedOk());
&gt; +        propertyObject-&gt;setImplicit(property.isImplicit());

If these are always set, maybe they should not be optional.

&gt; Source/WebCore/inspector/InspectorDOMTracingAgent.h:130
&gt; -    
&gt; +

lol.

&gt; Source/WebCore/inspector/InspectorInlineStyleRuleSet.cpp:59
&gt; +        m_element-&gt;setAttribute(&quot;style&quot;, text, ec);

Nit: ASCIILiteral, here and a few other places.

&gt; Source/WebCore/inspector/InspectorInlineStyleRuleSet.h:77
&gt; +    StyleDeclaration wrapper(CSSId(identifier(), 0), *inlineStyle(), this);

These seem like they need a special constructor instead of passing 0, unless the 0 is really needed. Style attributes don&apos;t have a &quot;rule ordinal&quot; do they?

&gt; Source/WebCore/inspector/InspectorRuleSelector.h:42
&gt; +    RuleSelector(RuleSelector&amp;&amp;) = default;

That explains the tweet.

&gt; Source/WebCore/inspector/InspectorStyleDeclaration.cpp:73
&gt; +    HashSet&lt;String&gt; foundProperties;
&gt; +
&gt; +    if (RefPtr&lt;WebCore::CSSRuleSourceData&gt; sourceData = styleSourceData()) {
&gt; +        Vector&lt;WebCore::CSSPropertySourceData&gt;&amp; sourcePropertyData = sourceData-&gt;styleSourceData-&gt;propertyData;
&gt; +
&gt; +        for (auto&amp; data : sourcePropertyData) {
&gt; +            foundProperties.add(data.name.lower());
&gt; +            result.append(StyleProperty(*this, data, true));
&gt; +        }
&gt; +    }
&gt; +
&gt; +    for (int i = 0, size = m_declaration.length(); i &lt; size; ++i) {
&gt; +        String name = m_declaration.item(i);
&gt; +        if (foundProperties.contains(name.lower()))
&gt; +            continue;
&gt; +
&gt; +        foundProperties.add(name.lower());
&gt; +        result.append(StyleProperty(*this, WebCore::CSSPropertySourceData(name, m_declaration.getPropertyValue(name), !m_declaration.getPropertyPriority(name).isEmpty(), true, WebCore::SourceRange()), false));
&gt; +    }

Lots of name.lower()s. I wonder if the case folding HashSet would be better:

  HashSet&lt;String, CaseFoldingHash&gt; foundProperties;

Or at the very least, eliminating some of the duplicate lower() calls.

&gt; Source/WebCore/inspector/InspectorStyleRule.h:48
&gt; +class StyleRule final {

Is the final needed, this doesn&apos;t subclass anything, right?

&gt; Source/WebCore/inspector/InspectorStyleRule.h:60
&gt; +    bool hasSelectors();

Not used. Might be removable.

&gt; Source/WebCore/inspector/InspectorStyleRuleSet.cpp:114
&gt; +std::unique_ptr&lt;ParsedRuleSetData&gt; ParsedRuleSetData::createEmpty()
&gt; +    {
&gt; +        return std::make_unique&lt;ParsedRuleSetData&gt;(emptyString(), std::make_unique&lt;RuleSourceDataList&gt;(), std::make_unique&lt;StyleRuleList&gt;());
&gt; +    }

More weird whitespace.

Also, maybe String() instead of emptyString().</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247080</attachid>
            <date>2015-02-21 20:58:58 -0800</date>
            <delta_ts>2015-02-24 13:50:10 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>141877.patch</filename>
            <type>text/plain</type>
            <size>207429</size>
            <attacher name="Brian Burg">burg</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvcHJvdG9jb2wvQ1NT
Lmpzb24gYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL3Byb3RvY29sL0NTUy5qc29u
CmluZGV4IGYwMjIxNmQuLjg5M2RiYTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9pbnNwZWN0b3IvcHJvdG9jb2wvQ1NTLmpzb24KKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3Jl
L2luc3BlY3Rvci9wcm90b2NvbC9DU1MuanNvbgpAQCAtNSw3ICs1LDcgQEAKICAgICAidHlwZXMi
OiBbCiAgICAgICAgIHsKICAgICAgICAgICAgICJpZCI6ICJTdHlsZVNoZWV0SWQiLAotICAgICAg
ICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAg
ICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgImlkIjogIkNTU1N0eWxlSWQiLApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
IGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4
IGJlMDE0ZmQuLjhmZDk0ZmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTI1NjAsOCArMjU2MCw2IEBACiAJCTgxRjY1RkY2MTM3
ODhGQUEwMEZGNkYyRCAvKiBEcmFnU3RhdGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDgxRjY1RkY1MTM3ODhGQUEwMEZGNkYyRCAvKiBEcmFnU3RhdGUu
aCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk4MkFC
MTc0MzEyNEI5OUVDMDBDNTA2OUQgLyogSW5zcGVjdG9yQ1NTQWdlbnQuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODJBQjE3NDExMjRCOTlFQzAwQzUw
NjlEIC8qIEluc3BlY3RvckNTU0FnZW50LmNwcCAqLzsgfTsKIAkJODJBQjE3NDQxMjRCOTlFQzAw
QzUwNjlEIC8qIEluc3BlY3RvckNTU0FnZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA4MkFCMTc0MjEyNEI5OUVDMDBDNTA2OUQgLyogSW5zcGVjdG9y
Q1NTQWdlbnQuaCAqLzsgfTsKLQkJODJBQjE3NzMxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3Rv
clN0eWxlU2hlZXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gODJBQjE3NkYxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hlZXQuY3Bw
ICovOyB9OwotCQk4MkFCMTc3NDEyNUM4MjY3MDBDNTA2OUQgLyogSW5zcGVjdG9yU3R5bGVTaGVl
dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODJBQjE3
NzAxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hlZXQuaCAqLzsgfTsKIAkJODJB
QjE3NzUxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclJlc291cmNlQWdlbnQuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODJBQjE3NzExMjVDODI2
NzAwQzUwNjlEIC8qIEluc3BlY3RvclJlc291cmNlQWdlbnQuY3BwICovOyB9OwogCQk4MkFCMTc3
NjEyNUM4MjY3MDBDNTA2OUQgLyogSW5zcGVjdG9yUmVzb3VyY2VBZ2VudC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODJBQjE3NzIxMjVDODI2NzAwQzUw
NjlEIC8qIEluc3BlY3RvclJlc291cmNlQWdlbnQuaCAqLzsgfTsKIAkJODJFM0Q4REUxMjJFQTBE
MTAwM0FFNUJDIC8qIENTU1Byb3BlcnR5U291cmNlRGF0YS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MkUzRDhEQzEyMkVBMEQxMDAzQUU1QkMgLyog
Q1NTUHJvcGVydHlTb3VyY2VEYXRhLmNwcCAqLzsgfTsKQEAgLTU1NzIsNiArNTU3MCwxNiBAQAog
CQlDNEQ0RjUyQzE5NzVDODhCMDAzRUY1QkMgLyogUmVwbGF5YWJsZVRpbWVyLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEQ0RjUyODE5NzVDODhCMDAz
RUY1QkMgLyogUmVwbGF5YWJsZVRpbWVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKIAkJQzRENEY1MkQxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFi
bGVUaW1lcnMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQzRENEY1MjkxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFibGVUaW1lcnMuY3BwICovOyB9
OwogCQlDNEQ0RjUyRTE5NzVDODhCMDAzRUY1QkMgLyogUmVwbGF5YWJsZVRpbWVycy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzRENEY1MkExOTc1Qzg4
QjAwM0VGNUJDIC8qIFJlcGxheWFibGVUaW1lcnMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRF
UyA9IChQcml2YXRlLCApOyB9OyB9OworCQlDNEU2NTdGMjFBOTdGN0E3MDA0NzlDMTUgLyogSW5z
cGVjdG9yQ1NTSWQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEM0RTY1N0YxMUE5N0Y3QTcwMDQ3OUMxNSAvKiBJbnNwZWN0b3JDU1NJZC5oICovOyB9Owor
CQlDNEU2NTdGQTFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1
N0YzMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JJbmxpbmVTdHlsZVJ1bGVTZXQuY3BwICov
OyB9OworCQlDNEU2NTdGQjFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5bGVS
dWxlU2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBD
NEU2NTdGNDFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0Lmgg
Ki87IH07CisJCUM0RTY1N0ZDMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGUu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1N0Y1
MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGUuaCAqLzsgfTsKKwkJQzRFNjU3
RkQxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUHJvcGVydHkuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1N0Y2MUE5N0ZCRUQwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVByb3BlcnR5LmggKi87IH07CisJCUM0RTY1N0ZFMUE5N0ZC
RUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGVTZXQuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1N0Y3MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJ
bnNwZWN0b3JTdHlsZVJ1bGVTZXQuaCAqLzsgfTsKKwkJQzRFNjU3RkYxQTk3RkJFRDAwNDc5QzE1
IC8qIEluc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1N0Y4MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNw
ZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5jcHAgKi87IH07CisJCUM0RTY1ODAwMUE5N0ZCRUQwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzRFNjU3RjkxQTk3RkJFRDAwNDc5QzE1IC8qIElu
c3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmggKi87IH07CisJCUM0RTY1ODAyMUE5ODAxNjgwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQzRFNjU4MDExQTk4MDE2ODAwNDc5QzE1IC8qIEluc3BlY3Rv
clN0eWxlUnVsZS5jcHAgKi87IH07CisJCUM0RTY1ODA0MUE5ODRCNTIwMDQ3OUMxNSAvKiBJbnNw
ZWN0b3JTdHlsZVJ1bGVTZXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQzRFNjU4MDMxQTk4NEI1MjAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUnVs
ZVNldC5jcHAgKi87IH07CiAJCUM1MEQwRTgzMEZGNDI3MjkwMEFDMjY0NCAvKiBTdG9yYWdlTmFt
ZXNwYWNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBD
NTBEMEU4MTBGRjQyNzI5MDBBQzI2NDQgLyogU3RvcmFnZU5hbWVzcGFjZS5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUM1MTM3Q0YyMTFBNTgzNzgw
MDRBREI5OSAvKiBKU0RPTVN0cmluZ0xpc3QuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQzUxMzdDRjAxMUE1ODM3ODAwNEFEQjk5IC8qIEpTRE9NU3Ry
aW5nTGlzdC5jcHAgKi87IH07CiAJCUM1MTM3Q0YzMTFBNTgzNzgwMDRBREI5OSAvKiBKU0RPTVN0
cmluZ0xpc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEM1MTM3Q0YxMTFBNTgzNzgwMDRBREI5OSAvKiBKU0RPTVN0cmluZ0xpc3QuaCAqLzsgfTsKQEAg
LTk3NzMsOCArOTc4MSw2IEBACiAJCTgyMjU0MzJDQTlENEI0Q0Y0NjI4RUM3RiAvKiBKU0JlZm9y
ZVVubG9hZEV2ZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpT
QmVmb3JlVW5sb2FkRXZlbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MkFC
MTc0MTEyNEI5OUVDMDBDNTA2OUQgLyogSW5zcGVjdG9yQ1NTQWdlbnQuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9yQ1NTQWdlbnQuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk4MkFCMTc0MjEyNEI5OUVDMDBDNTA2OUQgLyogSW5zcGVj
dG9yQ1NTQWdlbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5zcGVjdG9y
Q1NTQWdlbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJODJBQjE3NkYxMjVDODI2
NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hlZXQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVTaGVldC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07Ci0JCTgyQUIxNzcwMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JTdHls
ZVNoZWV0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEluc3BlY3RvclN0eWxl
U2hlZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODJBQjE3NzExMjVDODI2NzAw
QzUwNjlEIC8qIEluc3BlY3RvclJlc291cmNlQWdlbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9yUmVzb3VyY2VBZ2VudC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTgyQUIxNzcyMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JS
ZXNvdXJjZUFnZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEluc3BlY3Rv
clJlc291cmNlQWdlbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODJFM0Q4REMx
MjJFQTBEMTAwM0FFNUJDIC8qIENTU1Byb3BlcnR5U291cmNlRGF0YS5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NQcm9wZXJ0eVNvdXJjZURhdGEuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTMwMzcsNiArMTMwNDMsMTYgQEAKIAkJQzRENEY1
MjgxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFibGVUaW1lci5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBSZXBsYXlhYmxlVGltZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJQzRENEY1MjkxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFibGVUaW1lcnMuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVwbGF5YWJsZVRpbWVycy5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM0RDRGNTJBMTk3NUM4OEIwMDNFRjVC
QyAvKiBSZXBsYXlhYmxlVGltZXJzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFJlcGxheWFibGVUaW1lcnMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzRFNjU3
RjExQTk3RjdBNzAwNDc5QzE1IC8qIEluc3BlY3RvckNTU0lkLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IEluc3BlY3RvckNTU0lkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUM0RTY1N0YzMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JJbmxpbmVTdHlsZVJ1
bGVTZXQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9y
SW5saW5lU3R5bGVSdWxlU2V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzRF
NjU3RjQxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvcklubGluZVN0eWxlUnVsZVNldC5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbnNwZWN0b3JJbmxpbmVTdHlsZVJ1bGVT
ZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzRFNjU3RjUxQTk3RkJFRDAwNDc5
QzE1IC8qIEluc3BlY3RvclN0eWxlUnVsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBJbnNwZWN0b3JTdHlsZVJ1bGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
QzRFNjU3RjYxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUHJvcGVydHkuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2NTdGNzFBOTdGQkVEMDA0NzlDMTUgLyog
SW5zcGVjdG9yU3R5bGVSdWxlU2V0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEluc3BlY3RvclN0eWxlUnVsZVNldC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlD
NEU2NTdGODFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVzaGVl
dFJ1bGVTZXQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2NTdGOTFBOTdG
QkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzRFNjU4MDExQTk4MDE2ODAwNDc5QzE1IC8qIEluc3Bl
Y3RvclN0eWxlUnVsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJ
bnNwZWN0b3JTdHlsZVJ1bGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2
NTgwMzFBOTg0QjUyMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEluc3BlY3RvclN0eWxlUnVsZVNldC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM1MEQwRTgxMEZGNDI3MjkwMEFDMjY0NCAv
KiBTdG9yYWdlTmFtZXNwYWNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN0
b3JhZ2VOYW1lc3BhY2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzUxMzdDRjAx
MUE1ODM3ODAwNEFEQjk5IC8qIEpTRE9NU3RyaW5nTGlzdC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBKU0RPTVN0cmluZ0xpc3QuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlDNTEzN0NGMTExQTU4Mzc4MDA0QURCOTkgLyogSlNET01TdHJpbmdMaXN0
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTRE9NU3RyaW5nTGlzdC5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTUyODIsNiArMTUyOTgsNyBAQAogCQkJCTFD
ODFCOTU2MEU5NzMzMDgwMDI2NkUwNyAvKiBJbnNwZWN0b3JDb250cm9sbGVyLmggKi8sCiAJCQkJ
ODJBQjE3NDExMjRCOTlFQzAwQzUwNjlEIC8qIEluc3BlY3RvckNTU0FnZW50LmNwcCAqLywKIAkJ
CQk4MkFCMTc0MjEyNEI5OUVDMDBDNTA2OUQgLyogSW5zcGVjdG9yQ1NTQWdlbnQuaCAqLywKKwkJ
CQlDNEU2NTdGMTFBOTdGN0E3MDA0NzlDMTUgLyogSW5zcGVjdG9yQ1NTSWQuaCAqLywKIAkJCQk3
QUIwQjFCRTEyMTFBNjIyMDBBNzY5NDAgLyogSW5zcGVjdG9yRGF0YWJhc2VBZ2VudC5jcHAgKi8s
CiAJCQkJN0FCMEIxQkYxMjExQTYyMjAwQTc2OTQwIC8qIEluc3BlY3RvckRhdGFiYXNlQWdlbnQu
aCAqLywKIAkJCQlGM0Y1Q0YxMjEyRUQ4MUIzMDA4NEM1NjkgLyogSW5zcGVjdG9yRGF0YWJhc2VJ
bnN0cnVtZW50YXRpb24uaCAqLywKQEAgLTE1MzA2LDYgKzE1MzIzLDggQEAKIAkJCQk3QTU0ODU3
RTE0RTAyRDUxMDA2QUUwNUEgLyogSW5zcGVjdG9ySGlzdG9yeS5oICovLAogCQkJCTdBQ0Q4OEQx
MTRDMDhCRDYwMDg0RUREMiAvKiBJbnNwZWN0b3JJbmRleGVkREJBZ2VudC5jcHAgKi8sCiAJCQkJ
N0FDRDg4RDIxNEMwOEJENjAwODRFREQyIC8qIEluc3BlY3RvckluZGV4ZWREQkFnZW50LmggKi8s
CisJCQkJQzRFNjU3RjMxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvcklubGluZVN0eWxlUnVs
ZVNldC5jcHAgKi8sCisJCQkJQzRFNjU3RjQxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3Rvcklu
bGluZVN0eWxlUnVsZVNldC5oICovLAogCQkJCTIwRDYyOTI0MTI1MzY5MEIwMDA4MTU0MyAvKiBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwICovLAogCQkJCTIwRDYyOTI1MTI1MzY5MEIwMDA4
MTU0MyAvKiBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCAqLywKIAkJCQlBNTg0MEUxQTE4N0I3
NEQ1MDA4NDNCMTAgLyogSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llLmNwcCAqLywKQEAg
LTE1MzI1LDggKzE1MzQ0LDEzIEBACiAJCQkJOTlDQzBCNjUxOEJFOUYxNTAwNkNFQkNDIC8qIElu
c3BlY3RvclJlcGxheUFnZW50LmggKi8sCiAJCQkJODJBQjE3NzExMjVDODI2NzAwQzUwNjlEIC8q
IEluc3BlY3RvclJlc291cmNlQWdlbnQuY3BwICovLAogCQkJCTgyQUIxNzcyMTI1QzgyNjcwMEM1
MDY5RCAvKiBJbnNwZWN0b3JSZXNvdXJjZUFnZW50LmggKi8sCi0JCQkJODJBQjE3NkYxMjVDODI2
NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hlZXQuY3BwICovLAotCQkJCTgyQUIxNzcwMTI1
QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JTdHlsZVNoZWV0LmggKi8sCisJCQkJQzRFNjU4MDEx
QTk4MDE2ODAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUnVsZS5jcHAgKi8sCisJCQkJQzRFNjU3
RjUxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUnVsZS5oICovLAorCQkJCUM0RTY1
N0Y2MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVByb3BlcnR5LmggKi8sCisJCQkJ
QzRFNjU4MDMxQTk4NEI1MjAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUnVsZVNldC5jcHAgKi8s
CisJCQkJQzRFNjU3RjcxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUnVsZVNldC5o
ICovLAorCQkJCUM0RTY1N0Y4MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0
UnVsZVNldC5jcHAgKi8sCisJCQkJQzRFNjU3RjkxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3Rv
clN0eWxlc2hlZXRSdWxlU2V0LmggKi8sCiAJCQkJNzU0MTMzQTkxMDJFMDBGNDAwMDc1RDAwIC8q
IEluc3BlY3RvclRpbWVsaW5lQWdlbnQuY3BwICovLAogCQkJCTc1NDEzM0E3MTAyRTAwRTgwMDA3
NUQwMCAvKiBJbnNwZWN0b3JUaW1lbGluZUFnZW50LmggKi8sCiAJCQkJQTU5M0NGOEExODQwNTM1
MjAwQkZDRTI3IC8qIEluc3BlY3RvcldlYkFnZW50QmFzZS5oICovLApAQCAtMjQwMzUsNiArMjQw
NTksNyBAQAogCQkJCTg1OTA5RDJCMEFDQzdENTUwMERGMDFGMSAvKiBET01DU1NWYWx1ZUxpc3RJ
bnRlcm5hbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTEwQjlDQ0MwQjc0N0E0NDAwM0VEODkwIC8q
IERPTUN1c3RvbVhQYXRoTlNSZXNvbHZlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJODVBQ0FCQjAw
QTlDQUY4MDAwNjcxRTkwIC8qIERPTURvY3VtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlDNEU2
NTdGQjFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmggaW4g
SGVhZGVycyAqLywKIAkJCQk4NTA4OUNEQjBBOThDNDI4MDBBMjc1QUEgLyogRE9NRG9jdW1lbnRG
cmFnbWVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNDQzMTFGODIxMkU0RTY2QzAwMEE4RDE5IC8q
IERPTURvY3VtZW50RnJhZ21lbnRJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNDQzMTFD
RDYxMkU0RTIyRDAwMEE4RDE5IC8qIERPTURvY3VtZW50RnJhZ21lbnRQcml2YXRlLmggaW4gSGVh
ZGVycyAqLywKQEAgLTI0NTYzLDYgKzI0NTg4LDcgQEAKIAkJCQk5MzA3RjFEODBBRjJENTkwMDBE
QkEzMUEgLyogSGl0VGVzdFJlc3VsdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkMzQkMyOUMwRTkx
QUIwRjAwODM1NTg4IC8qIEhvc3RXaW5kb3cuaCBpbiBIZWFkZXJzICovLAogCQkJCUZEMzE2MDk5
MTJCMDI2RjcwMEMxQTM1OSAvKiBIUlRGRGF0YWJhc2UuaCBpbiBIZWFkZXJzICovLAorCQkJCUM0
RTY1N0ZFMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGVTZXQuaCBpbiBIZWFk
ZXJzICovLAogCQkJCUZEMzE2MDlCMTJCMDI2RjcwMEMxQTM1OSAvKiBIUlRGRGF0YWJhc2VMb2Fk
ZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCUZEMzE2MDlEMTJCMDI2RjcwMEMxQTM1OSAvKiBIUlRG
RWxldmF0aW9uLmggaW4gSGVhZGVycyAqLywKIAkJCQlGRDMxNjA5RjEyQjAyNkY3MDBDMUEzNTkg
LyogSFJURktlcm5lbC5oIGluIEhlYWRlcnMgKi8sCkBAIC0yNDgxNSw3ICsyNDg0MSw2IEBACiAJ
CQkJNEY2RkRENjUxMzQxREVERDAwMUY4RUUzIC8qIEluc3BlY3RvclBhZ2VBZ2VudC5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJOTlDQzBCNjcxOEJFOUYxNTAwNkNFQkNDIC8qIEluc3BlY3RvclJlcGxh
eUFnZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQk4MkFCMTc3NjEyNUM4MjY3MDBDNTA2OUQgLyog
SW5zcGVjdG9yUmVzb3VyY2VBZ2VudC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJODJBQjE3NzQxMjVD
ODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hlZXQuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTc1NDEzM0E4MTAyRTAwRTgwMDA3NUQwMCAvKiBJbnNwZWN0b3JUaW1lbGluZUFnZW50LmggaW4g
SGVhZGVycyAqLywKIAkJCQlBNTkzQ0Y4QjE4NDA1MzUyMDBCRkNFMjcgLyogSW5zcGVjdG9yV2Vi
QWdlbnRCYXNlLmggaW4gSGVhZGVycyAqLywKIAkJCQlGMzgxMEMxQzEzNjVBNDk2MDBFRDZFMzMg
LyogSW5zcGVjdG9yV29ya2VyQWdlbnQuaCBpbiBIZWFkZXJzICovLApAQCAtMjUzOTAsNiArMjU0
MTUsNyBAQAogCQkJCTMxMDYwMzc1MTQzMjgxOUMwMEFCRjRCQSAvKiBKU1dlYktpdENTU0ZpbHRl
clZhbHVlLmggaW4gSGVhZGVycyAqLywKIAkJCQkzMTZGRTA3MjBFNkNDQkVFMDBCRjYwODggLyog
SlNDU1NLZXlmcmFtZVJ1bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTMxNkZFMDc0MEU2Q0NCRUUw
MEJGNjA4OCAvKiBKU0NTU0tleWZyYW1lc1J1bGUuaCBpbiBIZWFkZXJzICovLAorCQkJCUM0RTY1
N0ZEMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVByb3BlcnR5LmggaW4gSGVhZGVy
cyAqLywKIAkJCQk0OTgzOTE0MDBGMUU3Njc1MDBDMjM3ODIgLyogSlNXZWJLaXRDU1NNYXRyaXgu
aCBpbiBIZWFkZXJzICovLAogCQkJCThBRDBBNTk1MTRDODgzMzYwMDBEODNDNSAvKiBKU1dlYktp
dENTU1JlZ2lvblJ1bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTMxNjExRTVCMEUxQzRERTAwMEY2
QTU3OSAvKiBKU1dlYktpdENTU1RyYW5zZm9ybVZhbHVlLmggaW4gSGVhZGVycyAqLywKQEAgLTI1
NDQ2LDYgKzI1NDcyLDcgQEAKIAkJCQlFNEI2NUE1QzEzMkZBQ0IwMDA3MEU3QkUgLyogTGVnYWN5
VGlsZUxheWVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlFNEUzOUFGQjEzMzBFRkE4MDAzQUIyNzQg
LyogTGVnYWN5VGlsZUxheWVyUG9vbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNTEyREQ4RjUwRDkx
RTZBRjAwMEY4OUVFIC8qIExlZ2FjeVdlYkFyY2hpdmUuaCBpbiBIZWFkZXJzICovLAorCQkJCUM0
RTY1N0ZDMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRTY1QkVCMEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRkY2NDkxMEVBRDE1QzIwMEMxRDZGNyAvKiBMZW5ndGhCb3guaCBpbiBIZWFk
ZXJzICovLAogCQkJCUU1QkE3RDYzMTUxNDM3Q0EwMEZFMUUzRiAvKiBMZW5ndGhGdW5jdGlvbnMu
aCBpbiBIZWFkZXJzICovLApAQCAtMjY1MTgsNiArMjY1NDUsNyBAQAogCQkJCUIyMjI3QUE5MEQw
MEJGMjIwMDcxQjc4MiAvKiBTVkdTdG9wRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQjIy
MjdBQUMwRDAwQkYyMjAwNzFCNzgyIC8qIFNWR1N0cmluZ0xpc3QuaCBpbiBIZWFkZXJzICovLAog
CQkJCUIyMjI3QUI4MEQwMEJGMjIwMDcxQjc4MiAvKiBTVkdTdHlsZUVsZW1lbnQuaCBpbiBIZWFk
ZXJzICovLAorCQkJCUM0RTY1N0YyMUE5N0Y3QTcwMDQ3OUMxNSAvKiBJbnNwZWN0b3JDU1NJZC5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJQjIyMjdBQkIwRDAwQkYyMjAwNzFCNzgyIC8qIFNWR1NWR0Vs
ZW1lbnQuaCBpbiBIZWFkZXJzICovLAogCQkJCUQzRjNEMzY4MUE2OUIxQTUwMDU5RkMyQiAvKiBK
U1dlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCUIyMjI3QUJF
MEQwMEJGMjIwMDcxQjc4MiAvKiBTVkdTd2l0Y2hFbGVtZW50LmggaW4gSGVhZGVycyAqLywKQEAg
LTI2OTIxLDYgKzI2OTQ5LDcgQEAKIAkJCQkxQUNFNTNFQjBBOEQxOEU3MDAyMjk0N0QgLyogWE1M
U2VyaWFsaXplci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNTkwNUFEQzAxMzAyRjNDRTAwRjExNkRG
IC8qIFhNTFRyZWVWaWV3ZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTFBQjdGQzY5MEE4QjkyRUMw
MEQ5RDM3QiAvKiBYUGF0aEV2YWx1YXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQzRFNjU4MDAx
QTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQzYwREE1QjBEMkEzMUY3MDBCOTkxOEYgLyogWFBhdGhFeGNlcHRpb24uaCBp
biBIZWFkZXJzICovLAogCQkJCTFBQjdGQzZDMEE4QjkyRUMwMEQ5RDM3QiAvKiBYUGF0aEV4cHJl
c3Npb24uaCBpbiBIZWFkZXJzICovLAogCQkJCTFBQjdGQzZGMEE4QjkyRUMwMEQ5RDM3QiAvKiBY
UGF0aEV4cHJlc3Npb25Ob2RlLmggaW4gSGVhZGVycyAqLywKQEAgLTI4MTM0LDYgKzI4MTYzLDcg
QEAKIAkJCQlBOEVBNzlGODBBMTkxNkRGMDBBOEVGNUYgLyogSFRNTE1lbnVFbGVtZW50LmNwcCBp
biBTb3VyY2VzICovLAogCQkJCTJCRThFMkM5MTJBNThBMDEwMEZBRDU1MCAvKiBIVE1MTWV0YUNo
YXJzZXRQYXJzZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTg3MURDMjcwQTE1MjA1NzAwQjEy
QTY4IC8qIEhUTUxNZXRhRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlDNEU2NTgwMjFB
OTgwMTY4MDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUE0NTQ0MjRBMTE5QjM2NjEwMDlCRTkxMiAvKiBIVE1MTWV0ZXJFbGVtZW50LmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUE4Q0ZGN0E5MEExNTY5NzgwMDBBNDIzNCAvKiBIVE1MTW9kRWxlbWVu
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOERGM0ZENTA5N0ZBMEZDMDA1Mjk4MUIgLyogSFRN
TE5hbWVDb2xsZWN0aW9uLmNwcCBpbiBTb3VyY2VzICovLApAQCAtMjgyOTUsNyArMjgzMjUsNiBA
QAogCQkJCTRGNkZERDY0MTM0MURFREQwMDFGOEVFMyAvKiBJbnNwZWN0b3JQYWdlQWdlbnQuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJOTlDQzBCNjYxOEJFOUYxNTAwNkNFQkNDIC8qIEluc3BlY3Rv
clJlcGxheUFnZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTgyQUIxNzc1MTI1QzgyNjcwMEM1
MDY5RCAvKiBJbnNwZWN0b3JSZXNvdXJjZUFnZW50LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTgy
QUIxNzczMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JTdHlsZVNoZWV0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTc1NDEzM0FBMTAyRTAwRjQwMDA3NUQwMCAvKiBJbnNwZWN0b3JUaW1lbGlu
ZUFnZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUYzODEwQzFCMTM2NUE0OTYwMEVENkUzMyAv
KiBJbnNwZWN0b3JXb3JrZXJBZ2VudC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlGMzUwQjczNTEz
RjEzNzdEMDA4ODBDNDMgLyogSW5zdHJ1bWVudGluZ0FnZW50cy5jcHAgaW4gU291cmNlcyAqLywK
QEAgLTI4OTgwLDYgKzI5MDA5LDcgQEAKIAkJCQkzMTZGRTA3MTBFNkNDQkVFMDBCRjYwODggLyog
SlNDU1NLZXlmcmFtZVJ1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMzE2RkUwNzMwRTZDQ0JF
RTAwQkY2MDg4IC8qIEpTQ1NTS2V5ZnJhbWVzUnVsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk0
OTgzOTEzRjBGMUU3Njc1MDBDMjM3ODIgLyogSlNXZWJLaXRDU1NNYXRyaXguY3BwIGluIFNvdXJj
ZXMgKi8sCisJCQkJQzRFNjU3RkExQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvcklubGluZVN0
eWxlUnVsZVNldC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4QUQwQTU5NDE0Qzg4MzM2MDAwRDgz
QzUgLyogSlNXZWJLaXRDU1NSZWdpb25SdWxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTMxNjEx
RTVBMEUxQzRERTAwMEY2QTU3OSAvKiBKU1dlYktpdENTU1RyYW5zZm9ybVZhbHVlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTNGMkIzM0VFMTY1QUYxNTYwMEUzOTg3QyAvKiBKU1dlYktpdENTU1Zp
ZXdwb3J0UnVsZS5jcHAgaW4gU291cmNlcyAqLywKQEAgLTI5MzYwLDYgKzI5MzkwLDcgQEAKIAkJ
CQk1M0M4Mjk4RDEzRDhEOTI3MDBERTJERUIgLyogUmVuZGVyRmxleGlibGVCb3guY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJNTA4Q0NBNTAxM0NGMTA2QjAwMzE1MUYzIC8qIFJlbmRlckZsb3dUaHJl
YWQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTg3MURFRDQwQTE1MzBDNzAwQjEyQTY4IC8qIFJl
bmRlckZyYW1lLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUM0RTY1N0ZGMUE5N0ZCRUQwMDQ3OUMx
NSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkw
RkQzMDgwRTExN0NGN0U3MDBBNzkxRjcgLyogUmVuZGVyRnJhbWVCYXNlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUE4NzFERUQyMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJGcmFtZVNldC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQlDREVBN0M4NTEyNzYyMzA0MDBCODQ2REQgLyogUmVuZGVyRnVs
bFNjcmVlbi5jcHAgaW4gU291cmNlcyAqLywKQEAgLTI5OTkyLDYgKzMwMDIzLDcgQEAKIAkJCQk0
MTk4QkRGMDFBODExNDIyMDBCMjJGQjUgLyogUmVhZGFibGVTdHJlYW1KU1NvdXJjZS5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQk0OTQ1QkZEMzEzQ0Y4MDkwMDBDQzNCMzggLyogVHJhbnNmb3JtU3Rh
dGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJRTE3QjQ5MTUxNkE5QjA5NDAwMUM4ODM5IC8qIFRy
YW5zaXRpb25FdmVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlDNEU2NTgwNDFBOTg0QjUyMDA0
NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTQ5
RTkxMUQxMEVGODZENDcwMDlEMENBRiAvKiBUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJODU0RkU3MzYwQTIyOTdCRTAwNThEN0FEIC8qIFRyYXZlcnNh
bC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNEQ2NEI1QzEzNEE1QjZCMDBFNThGREEgLyogVHJl
ZVNjb3BlLmNwcCBpbiBTb3VyY2VzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3Nz
L0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oIGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU0Nv
bXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oCmluZGV4IGVmZGMxNTcuLjQyZjI5MWEgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmgKQEAgLTg1
LDkgKzg1LDkgQEAgcHJpdmF0ZToKIAogY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9u
IGZpbmFsIDogcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gewogcHVibGljOgotICAgIHN0YXRp
YyBQYXNzUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gY3JlYXRlKFBhc3NSZWZQ
dHI8Tm9kZT4gbm9kZSwgYm9vbCBhbGxvd1Zpc2l0ZWRTdHlsZSA9IGZhbHNlLCBjb25zdCBTdHJp
bmcmIHBzZXVkb0VsZW1lbnROYW1lID0gU3RyaW5nKCkpCisgICAgc3RhdGljIFJlZjxDU1NDb21w
dXRlZFN0eWxlRGVjbGFyYXRpb24+IGNyZWF0ZShQYXNzUmVmUHRyPE5vZGU+IG5vZGUsIGJvb2wg
YWxsb3dWaXNpdGVkU3R5bGUgPSBmYWxzZSwgY29uc3QgU3RyaW5nJiBwc2V1ZG9FbGVtZW50TmFt
ZSA9IFN0cmluZygpKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDU1NDb21w
dXRlZFN0eWxlRGVjbGFyYXRpb24obm9kZSwgYWxsb3dWaXNpdGVkU3R5bGUsIHBzZXVkb0VsZW1l
bnROYW1lKSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZigqbmV3IENTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbihub2RlLCBhbGxvd1Zpc2l0ZWRTdHlsZSwgcHNldWRvRWxlbWVudE5hbWUpKTsK
ICAgICB9CiAgICAgdmlydHVhbCB+Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uKCk7CiAKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNoZWV0LmggYi9Tb3VyY2UvV2Vi
Q29yZS9jc3MvQ1NTU3R5bGVTaGVldC5oCmluZGV4IGQzMTJlZWMuLjBkYWYyMWEgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNoZWV0LmgKKysrIGIvU291cmNlL1dlYkNv
cmUvY3NzL0NTU1N0eWxlU2hlZXQuaApAQCAtMTE3LDYgKzExNyw3IEBAIHB1YmxpYzoKICAgICB2
b2lkIHJlYXR0YWNoQ2hpbGRSdWxlQ1NTT01XcmFwcGVycygpOwogCiAgICAgU3R5bGVTaGVldENv
bnRlbnRzJiBjb250ZW50cygpIHsgcmV0dXJuIG1fY29udGVudHM7IH0KKyAgICBjb25zdCBTdHls
ZVNoZWV0Q29udGVudHMmIGNvbnRlbnRzKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50czsgfQog
CiAgICAgdm9pZCBkZXRhY2hGcm9tRG9jdW1lbnQoKSB7IG1fb3duZXJOb2RlID0gbnVsbHB0cjsg
fQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdl
bnQuY3BwIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcApp
bmRleCA5MjYzMDJjLi5mMjc3YjU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JDU1NBZ2VudC5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgIkNTU0Nv
bXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oIgogI2luY2x1ZGUgIkNTU0ltcG9ydFJ1bGUuaCIKKyNp
bmNsdWRlICJDU1NNZWRpYVJ1bGUuaCIKICNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCiAj
aW5jbHVkZSAiQ1NTUHJvcGVydHlTb3VyY2VEYXRhLmgiCiAjaW5jbHVkZSAiQ1NTUnVsZS5oIgpA
QCAtNDEsNyArNDIsOSBAQAogI2luY2x1ZGUgIkluc3BlY3RvckRPTUFnZW50LmgiCiAjaW5jbHVk
ZSAiSW5zcGVjdG9yUGFnZUFnZW50LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9ySGlzdG9yeS5oIgor
I2luY2x1ZGUgIkluc3BlY3RvcklubGluZVN0eWxlUnVsZVNldC5oIgogI2luY2x1ZGUgIkluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlUnVsZS5oIgog
I2luY2x1ZGUgIkluc3RydW1lbnRpbmdBZ2VudHMuaCIKICNpbmNsdWRlICJOYW1lZEZsb3dDb2xs
ZWN0aW9uLmgiCiAjaW5jbHVkZSAiTm9kZS5oIgpAQCAtNTQsNyArNTcsOSBAQAogI2luY2x1ZGUg
IlN0eWxlUmVzb2x2ZXIuaCIKICNpbmNsdWRlICJTdHlsZVJ1bGUuaCIKICNpbmNsdWRlICJTdHls
ZVNoZWV0TGlzdC5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgogI2luY2x1ZGUg
IldlYktpdE5hbWVkRmxvdy5oIgorI2luY2x1ZGUgPGluc3BlY3Rvci9Db250ZW50U2VhcmNoVXRp
bGl0aWVzLmg+CiAjaW5jbHVkZSA8aW5zcGVjdG9yL0luc3BlY3RvclByb3RvY29sT2JqZWN0cy5o
PgogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1JlZi5oPgpAQCAtMTUx
LDU5ICsxNTYsNTIgQEAgdm9pZCBDaGFuZ2VSZWdpb25PdmVyc2V0VGFzazo6dGltZXJGaXJlZCgp
CiAgICAgbV9uYW1lZEZsb3dzLmNsZWFyKCk7CiB9CiAKLWNsYXNzIEluc3BlY3RvckNTU0FnZW50
OjpTdHlsZVNoZWV0QWN0aW9uIDogcHVibGljIEluc3BlY3Rvckhpc3Rvcnk6OkFjdGlvbiB7Ci0g
ICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3R5bGVTaGVldEFjdGlvbik7CitjbGFzcyBJbnNwZWN0
b3JDU1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0aW9uIDogcHVibGljIEluc3BlY3Rvckhpc3Rvcnk6
OkFjdGlvbiB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3R5bGVSdWxlU2V0QWN0aW9uKTsK
IHB1YmxpYzoKLSAgICBTdHlsZVNoZWV0QWN0aW9uKGNvbnN0IFN0cmluZyYgbmFtZSwgSW5zcGVj
dG9yU3R5bGVTaGVldCogc3R5bGVTaGVldCkKKyAgICBTdHlsZVJ1bGVTZXRBY3Rpb24oY29uc3Qg
U3RyaW5nJiBuYW1lLCBSZWY8U3R5bGVSdWxlU2V0PiYmIHJ1bGVTZXQpCiAgICAgICAgIDogSW5z
cGVjdG9ySGlzdG9yeTo6QWN0aW9uKG5hbWUpCi0gICAgICAgICwgbV9zdHlsZVNoZWV0KHN0eWxl
U2hlZXQpCisgICAgICAgICwgbV9ydWxlU2V0KFdURjo6bW92ZShydWxlU2V0KSkKICAgICB7CiAg
ICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPEluc3BlY3RvclN0eWxlU2hlZXQ+IG1fc3R5
bGVTaGVldDsKKyAgICBSZWY8U3R5bGVSdWxlU2V0PiBtX3J1bGVTZXQ7CiB9OwogCi1jbGFzcyBJ
bnNwZWN0b3JDU1NBZ2VudDo6U2V0U3R5bGVTaGVldFRleHRBY3Rpb24gZmluYWwgOiBwdWJsaWMg
SW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24geworY2xhc3MgSW5zcGVjdG9yQ1NT
QWdlbnQ6OlNldFN0eWxlU2hlZXRUZXh0QWN0aW9uIGZpbmFsIDogcHVibGljIEluc3BlY3RvckNT
U0FnZW50OjpTdHlsZVJ1bGVTZXRBY3Rpb24gewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFNl
dFN0eWxlU2hlZXRUZXh0QWN0aW9uKTsKIHB1YmxpYzoKLSAgICBTZXRTdHlsZVNoZWV0VGV4dEFj
dGlvbihJbnNwZWN0b3JTdHlsZVNoZWV0KiBzdHlsZVNoZWV0LCBjb25zdCBTdHJpbmcmIHRleHQp
Ci0gICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24oQVNDSUlMaXRl
cmFsKCJTZXRTdHlsZVNoZWV0VGV4dCIpLCBzdHlsZVNoZWV0KQorICAgIFNldFN0eWxlU2hlZXRU
ZXh0QWN0aW9uKFJlZjxTdHlsZVJ1bGVTZXQ+JiYgcnVsZVNldCwgY29uc3QgU3RyaW5nJiB0ZXh0
KQorICAgICAgICA6IEluc3BlY3RvckNTU0FnZW50OjpTdHlsZVJ1bGVTZXRBY3Rpb24oQVNDSUlM
aXRlcmFsKCJTZXRTdHlsZVNoZWV0VGV4dCIpLCBXVEY6Om1vdmUocnVsZVNldCkpCiAgICAgICAg
ICwgbV90ZXh0KHRleHQpCiAgICAgewogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCBwZXJmb3Jt
KEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgaWYgKCFtX3N0eWxl
U2hlZXQtPmdldFRleHQoJm1fb2xkVGV4dCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIG1fb2xkVGV4dCA9IG1fcnVsZVNldC0+Z2V0VGV4dCgpOwogICAgICAgICByZXR1cm4g
cmVkbyhlYyk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIHVuZG8oRXhjZXB0aW9uQ29kZSYg
ZWMpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sIHVuZG8oRXhjZXB0aW9uQ29kZSYpIG92ZXJy
aWRlCiAgICAgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0LT5zZXRUZXh0KG1fb2xkVGV4dCwg
ZWMpKSB7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXQtPnJlcGFyc2VTdHlsZVNoZWV0KG1fb2xk
VGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIG1fcnVsZVNldC0+cmVwbGFjZVRleHQobV9vbGRUZXh0KTsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIHJlZG8oRXhjZXB0
aW9uQ29kZSYgZWMpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sIHJlZG8oRXhjZXB0aW9uQ29k
ZSYpIG92ZXJyaWRlCiAgICAgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0LT5zZXRUZXh0KG1f
dGV4dCwgZWMpKSB7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXQtPnJlcGFyc2VTdHlsZVNoZWV0
KG1fdGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIG1fcnVsZVNldC0+cmVwbGFjZVRleHQobV90ZXh0KTsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgdmlydHVhbCBTdHJpbmcgbWVyZ2VJZCgp
IG92ZXJyaWRlCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIlNldFN0eWxl
U2hlZXRUZXh0ICVzIiwgbV9zdHlsZVNoZWV0LT5pZCgpLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIlNldFN0eWxlU2hlZXRUZXh0ICUiIFBSSXU2NCwgbV9y
dWxlU2V0LT5pZGVudGlmaWVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBtZXJnZShz
dGQ6OnVuaXF1ZV9wdHI8QWN0aW9uPiBhY3Rpb24pIG92ZXJyaWRlCisgICAgdmlydHVhbCB2b2lk
IG1lcmdlKHN0ZDo6dW5pcXVlX3B0cjxJbnNwZWN0b3JIaXN0b3J5OjpBY3Rpb24+IGFjdGlvbikg
b3ZlcnJpZGUKICAgICB7CiAgICAgICAgIEFTU0VSVChhY3Rpb24tPm1lcmdlSWQoKSA9PSBtZXJn
ZUlkKCkpOwogCkBAIC0yMTYsMTEgKzIxNCwxMSBAQCBwcml2YXRlOgogICAgIFN0cmluZyBtX29s
ZFRleHQ7CiB9OwogCi1jbGFzcyBJbnNwZWN0b3JDU1NBZ2VudDo6U2V0U3R5bGVUZXh0QWN0aW9u
IGZpbmFsIDogcHVibGljIEluc3BlY3RvckNTU0FnZW50OjpTdHlsZVNoZWV0QWN0aW9uIHsKK2Ns
YXNzIEluc3BlY3RvckNTU0FnZW50OjpTZXRTdHlsZVRleHRBY3Rpb24gZmluYWwgOiBwdWJsaWMg
SW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlUnVsZVNldEFjdGlvbiB7CiAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoU2V0U3R5bGVUZXh0QWN0aW9uKTsKIHB1YmxpYzoKLSAgICBTZXRTdHlsZVRleHRB
Y3Rpb24oSW5zcGVjdG9yU3R5bGVTaGVldCogc3R5bGVTaGVldCwgY29uc3QgSW5zcGVjdG9yQ1NT
SWQmIGNzc0lkLCBjb25zdCBTdHJpbmcmIHRleHQpCi0gICAgICAgIDogSW5zcGVjdG9yQ1NTQWdl
bnQ6OlN0eWxlU2hlZXRBY3Rpb24oQVNDSUlMaXRlcmFsKCJTZXRTdHlsZVRleHQiKSwgc3R5bGVT
aGVldCkKKyAgICBTZXRTdHlsZVRleHRBY3Rpb24oUmVmPFN0eWxlUnVsZVNldD4mJiBydWxlU2V0
LCBjb25zdCBDU1NJZCYgY3NzSWQsIGNvbnN0IFN0cmluZyYgdGV4dCkKKyAgICAgICAgOiBJbnNw
ZWN0b3JDU1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0aW9uKEFTQ0lJTGl0ZXJhbCgiU2V0U3R5bGVU
ZXh0IiksIFdURjo6bW92ZShydWxlU2V0KSkKICAgICAgICAgLCBtX2Nzc0lkKGNzc0lkKQogICAg
ICAgICAsIG1fdGV4dCh0ZXh0KQogICAgIHsKQEAgLTIzMSwyMCArMjI5LDIxIEBAIHB1YmxpYzoK
ICAgICAgICAgcmV0dXJuIHJlZG8oZWMpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCB1bmRv
KEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2Vw
dGlvbkNvZGUmKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc3R5bGVTaGVldC0+
c2V0U3R5bGVUZXh0KG1fY3NzSWQsIG1fb2xkVGV4dCwgbnVsbHB0ciwgZWMpOworICAgICAgICBT
dHJpbmcgZHVtbXlPbGRUZXh0OworICAgICAgICByZXR1cm4gbV9ydWxlU2V0LT5zZXRUZXh0Rm9y
U3R5bGUobV9jc3NJZCwgbV9vbGRUZXh0LCBkdW1teU9sZFRleHQpOwogICAgIH0KIAotICAgIHZp
cnR1YWwgYm9vbCByZWRvKEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQorICAgIHZpcnR1YWwg
Ym9vbCByZWRvKEV4Y2VwdGlvbkNvZGUmKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgcmV0dXJu
IG1fc3R5bGVTaGVldC0+c2V0U3R5bGVUZXh0KG1fY3NzSWQsIG1fdGV4dCwgJm1fb2xkVGV4dCwg
ZWMpOworICAgICAgICByZXR1cm4gbV9ydWxlU2V0LT5zZXRUZXh0Rm9yU3R5bGUobV9jc3NJZCwg
bV90ZXh0LCBtX29sZFRleHQpOwogICAgIH0KIAogICAgIHZpcnR1YWwgU3RyaW5nIG1lcmdlSWQo
KSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgQVNTRVJUKG1fc3R5bGVTaGVldC0+aWQoKSA9PSBt
X2Nzc0lkLnN0eWxlU2hlZXRJZCgpKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCJT
ZXRTdHlsZVRleHQgJXM6JXUiLCBtX3N0eWxlU2hlZXQtPmlkKCkudXRmOCgpLmRhdGEoKSwgbV9j
c3NJZC5vcmRpbmFsKCkpOworICAgICAgICBBU1NFUlQobV9ydWxlU2V0LT5pZGVudGlmaWVyKCkg
PT0gbV9jc3NJZC5zdHlsZXNoZWV0SWQoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmc6OmZvcm1h
dCgiU2V0U3R5bGVUZXh0ICUiIFBSSXU2NCAiOiUiIFBSSXU2NCwgbV9ydWxlU2V0LT5pZGVudGlm
aWVyKCksIG1fY3NzSWQucnVsZU9yZGluYWwoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lk
IG1lcmdlKHN0ZDo6dW5pcXVlX3B0cjxBY3Rpb24+IGFjdGlvbikgb3ZlcnJpZGUKQEAgLTI1Niw1
MCArMjU1LDU5IEBAIHB1YmxpYzoKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgSW5zcGVjdG9yQ1NT
SWQgbV9jc3NJZDsKKyAgICBDU1NJZCBtX2Nzc0lkOwogICAgIFN0cmluZyBtX3RleHQ7CiAgICAg
U3RyaW5nIG1fb2xkVGV4dDsKIH07CiAKLWNsYXNzIEluc3BlY3RvckNTU0FnZW50OjpTZXRSdWxl
U2VsZWN0b3JBY3Rpb24gZmluYWwgOiBwdWJsaWMgSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hl
ZXRBY3Rpb24geworY2xhc3MgSW5zcGVjdG9yQ1NTQWdlbnQ6OlNldFJ1bGVTZWxlY3RvckFjdGlv
biBmaW5hbCA6IHB1YmxpYyBJbnNwZWN0b3JDU1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0aW9uIHsK
ICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTZXRSdWxlU2VsZWN0b3JBY3Rpb24pOwogcHVibGlj
OgotICAgIFNldFJ1bGVTZWxlY3RvckFjdGlvbihJbnNwZWN0b3JTdHlsZVNoZWV0KiBzdHlsZVNo
ZWV0LCBjb25zdCBJbnNwZWN0b3JDU1NJZCYgY3NzSWQsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3Ip
Ci0gICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24oQVNDSUlMaXRl
cmFsKCJTZXRSdWxlU2VsZWN0b3IiKSwgc3R5bGVTaGVldCkKKyAgICBTZXRSdWxlU2VsZWN0b3JB
Y3Rpb24oUmVmPFN0eWxlUnVsZVNldD4mJiBydWxlU2V0LCBjb25zdCBDU1NJZCYgY3NzSWQsIGNv
bnN0IFN0cmluZyYgc2VsZWN0b3JUZXh0KQorICAgICAgICA6IEluc3BlY3RvckNTU0FnZW50OjpT
dHlsZVJ1bGVTZXRBY3Rpb24oQVNDSUlMaXRlcmFsKCJTZXRSdWxlU2VsZWN0b3IiKSwgV1RGOjpt
b3ZlKHJ1bGVTZXQpKQogICAgICAgICAsIG1fY3NzSWQoY3NzSWQpCi0gICAgICAgICwgbV9zZWxl
Y3RvcihzZWxlY3RvcikKKyAgICAgICAgLCBtX3NlbGVjdG9yVGV4dChzZWxlY3RvclRleHQpCiAg
ICAgewogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCBwZXJmb3JtKEV4Y2VwdGlvbkNvZGUmIGVj
KSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgbV9vbGRTZWxlY3RvciA9IG1fc3R5bGVTaGVldC0+
cnVsZVNlbGVjdG9yKG1fY3NzSWQsIGVjKTsKLSAgICAgICAgaWYgKGVjKQorICAgICAgICBpZiAo
IWlzPFN0eWxlc2hlZXRSdWxlU2V0PihtX3J1bGVTZXQpKQogICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGlmICghZG93bmNhc3Q8U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNl
dC5nZXQoKSkuc2VsZWN0b3JUZXh0Rm9yUnVsZShtX2Nzc0lkLCBtX29sZFNlbGVjdG9yVGV4dCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICAgICAgcmV0dXJuIHJlZG8oZWMpOwog
ICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlk
ZQorICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2VwdGlvbkNvZGUmKSBvdmVycmlkZQogICAgIHsK
LSAgICAgICAgcmV0dXJuIG1fc3R5bGVTaGVldC0+c2V0UnVsZVNlbGVjdG9yKG1fY3NzSWQsIG1f
b2xkU2VsZWN0b3IsIGVjKTsKKyAgICAgICAgaWYgKCFpczxTdHlsZXNoZWV0UnVsZVNldD4obV9y
dWxlU2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gZG93
bmNhc3Q8U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNldC5nZXQoKSkuc2V0U2VsZWN0b3JUZXh0
Rm9yUnVsZShtX2Nzc0lkLCBtX29sZFNlbGVjdG9yVGV4dCk7CiAgICAgfQogCi0gICAgdmlydHVh
bCBib29sIHJlZG8oRXhjZXB0aW9uQ29kZSYgZWMpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29s
IHJlZG8oRXhjZXB0aW9uQ29kZSYpIG92ZXJyaWRlCiAgICAgewotICAgICAgICByZXR1cm4gbV9z
dHlsZVNoZWV0LT5zZXRSdWxlU2VsZWN0b3IobV9jc3NJZCwgbV9zZWxlY3RvciwgZWMpOworICAg
ICAgICBpZiAoIWlzPFN0eWxlc2hlZXRSdWxlU2V0PihtX3J1bGVTZXQpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBkb3duY2FzdDxTdHlsZXNoZWV0UnVsZVNl
dD4obV9ydWxlU2V0LmdldCgpKS5zZXRTZWxlY3RvclRleHRGb3JSdWxlKG1fY3NzSWQsIG1fc2Vs
ZWN0b3JUZXh0KTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgSW5zcGVjdG9yQ1NTSWQgbV9jc3NJ
ZDsKLSAgICBTdHJpbmcgbV9zZWxlY3RvcjsKLSAgICBTdHJpbmcgbV9vbGRTZWxlY3RvcjsKKyAg
ICBDU1NJZCBtX2Nzc0lkOworICAgIFN0cmluZyBtX3NlbGVjdG9yVGV4dDsKKyAgICBTdHJpbmcg
bV9vbGRTZWxlY3RvclRleHQ7CiB9OwogCi1jbGFzcyBJbnNwZWN0b3JDU1NBZ2VudDo6QWRkUnVs
ZUFjdGlvbiBmaW5hbCA6IHB1YmxpYyBJbnNwZWN0b3JDU1NBZ2VudDo6U3R5bGVTaGVldEFjdGlv
biB7CitjbGFzcyBJbnNwZWN0b3JDU1NBZ2VudDo6QWRkUnVsZUFjdGlvbiBmaW5hbCA6IHB1Ymxp
YyBJbnNwZWN0b3JDU1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0aW9uIHsKICAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShBZGRSdWxlQWN0aW9uKTsKIHB1YmxpYzoKLSAgICBBZGRSdWxlQWN0aW9uKElu
c3BlY3RvclN0eWxlU2hlZXQqIHN0eWxlU2hlZXQsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3IpCi0g
ICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24oQVNDSUlMaXRlcmFs
KCJBZGRSdWxlIiksIHN0eWxlU2hlZXQpCisgICAgQWRkUnVsZUFjdGlvbihSZWY8U3R5bGVSdWxl
U2V0PiYmIHJ1bGVTZXQsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3IpCisgICAgICAgIDogSW5zcGVj
dG9yQ1NTQWdlbnQ6OlN0eWxlUnVsZVNldEFjdGlvbihBU0NJSUxpdGVyYWwoIkFkZFJ1bGUiKSwg
V1RGOjptb3ZlKHJ1bGVTZXQpKQogICAgICAgICAsIG1fc2VsZWN0b3Ioc2VsZWN0b3IpCiAgICAg
ewogICAgIH0KQEAgLTMxMSwzOCArMzE5LDM2IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgYm9v
bCB1bmRvKEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgcmV0dXJu
IG1fc3R5bGVTaGVldC0+ZGVsZXRlUnVsZShtX25ld0lkLCBlYyk7CisgICAgICAgIGlmICghaXM8
U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIAorICAgICAgICByZXR1cm4gZG93bmNhc3Q8U3R5bGVzaGVldFJ1bGVTZXQ+KG1f
cnVsZVNldC5nZXQoKSkuZGVsZXRlUnVsZShtX25ld0lkLCBlYyk7CiAgICAgfQogCiAgICAgdmly
dHVhbCBib29sIHJlZG8oRXhjZXB0aW9uQ29kZSYgZWMpIG92ZXJyaWRlCiAgICAgewotICAgICAg
ICBDU1NTdHlsZVJ1bGUqIGNzc1N0eWxlUnVsZSA9IG1fc3R5bGVTaGVldC0+YWRkUnVsZShtX3Nl
bGVjdG9yLCBlYyk7Ci0gICAgICAgIGlmIChlYykKKyAgICAgICAgaWYgKCFpczxTdHlsZXNoZWV0
UnVsZVNldD4obV9ydWxlU2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
CisgICAgICAgIFN0eWxlc2hlZXRSdWxlU2V0JiBydWxlU2V0ID0gZG93bmNhc3Q8U3R5bGVzaGVl
dFJ1bGVTZXQ+KG1fcnVsZVNldC5nZXQoKSk7CisgICAgICAgIENTU1N0eWxlUnVsZSogY3NzU3R5
bGVSdWxlID0gcnVsZVNldC5hZGRSdWxlKG1fc2VsZWN0b3IsIGVjKTsKKyAgICAgICAgaWYgKGVj
IHx8ICFjc3NTdHlsZVJ1bGUpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIG1f
bmV3SWQgPSBtX3N0eWxlU2hlZXQtPnJ1bGVJZChjc3NTdHlsZVJ1bGUpOworICAgICAgICBtX25l
d0lkID0gcnVsZVNldC5ydWxlSWQoKmNzc1N0eWxlUnVsZSk7CiAgICAgICAgIHJldHVybiB0cnVl
OwogICAgIH0KIAotICAgIEluc3BlY3RvckNTU0lkIG5ld1J1bGVJZCgpIHsgcmV0dXJuIG1fbmV3
SWQ7IH0KKyAgICBDU1NJZCBuZXdSdWxlSWQoKSB7IHJldHVybiBtX25ld0lkOyB9CiAKIHByaXZh
dGU6Ci0gICAgSW5zcGVjdG9yQ1NTSWQgbV9uZXdJZDsKKyAgICBDU1NJZCBtX25ld0lkOwogICAg
IFN0cmluZyBtX3NlbGVjdG9yOwogICAgIFN0cmluZyBtX29sZFNlbGVjdG9yOwogfTsKIAotLy8g
c3RhdGljCi1DU1NTdHlsZVJ1bGUqIEluc3BlY3RvckNTU0FnZW50Ojphc0NTU1N0eWxlUnVsZShD
U1NSdWxlJiBydWxlKQotewotICAgIGlmICghaXM8Q1NTU3R5bGVSdWxlPihydWxlKSkKLSAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuIGRvd25jYXN0PENTU1N0eWxlUnVsZT4oJnJ1
bGUpOwotfQotCiBJbnNwZWN0b3JDU1NBZ2VudDo6SW5zcGVjdG9yQ1NTQWdlbnQoSW5zdHJ1bWVu
dGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cywgSW5zcGVjdG9yRE9NQWdlbnQqIGRvbUFn
ZW50KQogICAgIDogSW5zcGVjdG9yQWdlbnRCYXNlKEFTQ0lJTGl0ZXJhbCgiQ1NTIiksIGluc3Ry
dW1lbnRpbmdBZ2VudHMpCiAgICAgLCBtX2RvbUFnZW50KGRvbUFnZW50KQotICAgICwgbV9sYXN0
U3R5bGVTaGVldElkKDEpCiB7CiAgICAgbV9kb21BZ2VudC0+c2V0RE9NTGlzdGVuZXIodGhpcyk7
CiB9CkBAIC0zNzUsMTAgKzM4MSwxMCBAQCB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpkaXNjYXJk
QWdlbnQoKQogCiB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpyZXNldCgpCiB7Ci0gICAgbV9pZFRv
SW5zcGVjdG9yU3R5bGVTaGVldC5jbGVhcigpOwotICAgIG1fY3NzU3R5bGVTaGVldFRvSW5zcGVj
dG9yU3R5bGVTaGVldC5jbGVhcigpOwotICAgIG1fbm9kZVRvSW5zcGVjdG9yU3R5bGVTaGVldC5j
bGVhcigpOwotICAgIG1fZG9jdW1lbnRUb0luc3BlY3RvclN0eWxlU2hlZXQuY2xlYXIoKTsKKyAg
ICBtX2lkZW50aWZpZXJUb1J1bGVTZXRNYXAuY2xlYXIoKTsKKyAgICBtX2Nzc1N0eWxlU2hlZXRU
b1J1bGVTZXRNYXAuY2xlYXIoKTsKKyAgICBtX25vZGVUb0lubGluZVJ1bGVTZXRNYXAuY2xlYXIo
KTsKKyAgICBtX2RvY3VtZW50VG9JbnNwZWN0b3JSdWxlU2V0TWFwLmNsZWFyKCk7CiAgICAgcmVz
ZXROb25QZXJzaXN0ZW50RGF0YSgpOwogfQogCkBAIC01NDQsOSArNTUwLDEwIEBAIHZvaWQgSW5z
cGVjdG9yQ1NTQWdlbnQ6OmdldE1hdGNoZWRTdHlsZXNGb3JOb2RlKEVycm9yU3RyaW5nJiBlcnJv
clN0cmluZywgaW50IG5vCiAgICAgICAgICAgICAgICAgLnNldE1hdGNoZWRDU1NSdWxlcyhidWls
ZEFycmF5Rm9yTWF0Y2hlZFJ1bGVMaXN0KHBhcmVudE1hdGNoZWRSdWxlcywgc3R5bGVSZXNvbHZl
ciwgcGFyZW50RWxlbWVudCkpCiAgICAgICAgICAgICAgICAgLnJlbGVhc2UoKTsKICAgICAgICAg
ICAgIGlmIChwYXJlbnRFbGVtZW50LT5zdHlsZSgpICYmIHBhcmVudEVsZW1lbnQtPnN0eWxlKCkt
Pmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGlu
ZVN0eWxlKiBzdHlsZVNoZWV0ID0gYXNJbnNwZWN0b3JTdHlsZVNoZWV0KHBhcmVudEVsZW1lbnQp
OwotICAgICAgICAgICAgICAgIGlmIChzdHlsZVNoZWV0KQotICAgICAgICAgICAgICAgICAgICBl
bnRyeS0+c2V0SW5saW5lU3R5bGUoc3R5bGVTaGVldC0+YnVpbGRPYmplY3RGb3JTdHlsZShzdHls
ZVNoZWV0LT5zdHlsZUZvcklkKEluc3BlY3RvckNTU0lkKHN0eWxlU2hlZXQtPmlkKCksIDApKSkp
OworICAgICAgICAgICAgICAgIElubGluZVN0eWxlUnVsZVNldCogcnVsZVNldCA9IGFzSW5saW5l
UnVsZVNldCgqcGFyZW50RWxlbWVudCk7CisgICAgICAgICAgICAgICAgQ1NTU3R5bGVEZWNsYXJh
dGlvbiogc3R5bGUgPSBydWxlU2V0ID8gcnVsZVNldC0+aW5saW5lU3R5bGUoKSA6IG51bGxwdHI7
CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlKQorICAgICAgICAgICAgICAgICAgICBlbnRyeS0+
c2V0SW5saW5lU3R5bGUocnVsZVNldC0+YnVpbGRPYmplY3RGb3JTdHlsZSgqc3R5bGUpKTsKICAg
ICAgICAgICAgIH0KIAogICAgICAgICAgICAgZW50cmllcy0+YWRkSXRlbShXVEY6Om1vdmUoZW50
cnkpKTsKQEAgLTU1NywxOSArNTY0LDIyIEBAIHZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmdldE1h
dGNoZWRTdHlsZXNGb3JOb2RlKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgaW50IG5vCiAgICAg
fQogfQogCi12b2lkIEluc3BlY3RvckNTU0FnZW50OjpnZXRJbmxpbmVTdHlsZXNGb3JOb2RlKEVy
cm9yU3RyaW5nJiBlcnJvclN0cmluZywgaW50IG5vZGVJZCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU3R5bGU+JiBpbmxpbmVTdHlsZSwgUmVmUHRyPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU3R5bGU+JiBhdHRyaWJ1dGVzU3R5bGUpCit2b2lkIEluc3BlY3RvckNT
U0FnZW50OjpnZXRJbmxpbmVTdHlsZXNGb3JOb2RlKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywg
aW50IG5vZGVJZCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+JiBp
bmxpbmVTdHlsZU9iamVjdCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5
bGU+JiBhdHRyaWJ1dGVzU3R5bGVPYmplY3QpCiB7CiAgICAgRWxlbWVudCogZWxlbWVudCA9IGVs
ZW1lbnRGb3JJZChlcnJvclN0cmluZywgbm9kZUlkKTsKICAgICBpZiAoIWVsZW1lbnQpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZSogc3R5
bGVTaGVldCA9IGFzSW5zcGVjdG9yU3R5bGVTaGVldChlbGVtZW50KTsKLSAgICBpZiAoIXN0eWxl
U2hlZXQpCisgICAgSW5saW5lU3R5bGVSdWxlU2V0KiBydWxlU2V0ID0gYXNJbmxpbmVSdWxlU2V0
KCplbGVtZW50KTsKKyAgICBpZiAoIXJ1bGVTZXQpCisgICAgICAgIHJldHVybjsKKworICAgIENT
U1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlID0gZWxlbWVudC0+c3R5bGUoKTsKKyAgICBpZiAoIXN0
eWxlKQogICAgICAgICByZXR1cm47CiAKLSAgICBpbmxpbmVTdHlsZSA9IHN0eWxlU2hlZXQtPmJ1
aWxkT2JqZWN0Rm9yU3R5bGUoZWxlbWVudC0+c3R5bGUoKSk7Ci0gICAgUmVmUHRyPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGF0dHJpYnV0ZXMgPSBidWlsZE9iamVjdEZvckF0
dHJpYnV0ZXNTdHlsZShlbGVtZW50KTsKLSAgICBhdHRyaWJ1dGVzU3R5bGUgPSBhdHRyaWJ1dGVz
ID8gYXR0cmlidXRlcy5yZWxlYXNlKCkgOiBudWxscHRyOworICAgIGlubGluZVN0eWxlT2JqZWN0
ID0gcnVsZVNldC0+YnVpbGRPYmplY3RGb3JTdHlsZSgqc3R5bGUpOworICAgIGF0dHJpYnV0ZXNT
dHlsZU9iamVjdCA9IGJ1aWxkT2JqZWN0Rm9yQXR0cmlidXRlc1N0eWxlKCplbGVtZW50KTsKIH0K
IAogdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUoRXJyb3JT
dHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgbm9kZUlkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJvcGVy
dHk+PiYgc3R5bGUpCkBAIC01NzgsOSArNTg4LDkgQEAgdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6
Z2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgbm8K
ICAgICBpZiAoIWVsZW1lbnQpCiAgICAgICAgIHJldHVybjsKIAotICAgIFJlZlB0cjxDU1NDb21w
dXRlZFN0eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5bGVJbmZvID0gQ1NTQ29tcHV0ZWRTdHls
ZURlY2xhcmF0aW9uOjpjcmVhdGUoZWxlbWVudCwgdHJ1ZSk7Ci0gICAgUmVmPEluc3BlY3RvclN0
eWxlPiBpbnNwZWN0b3JTdHlsZSA9IEluc3BlY3RvclN0eWxlOjpjcmVhdGUoSW5zcGVjdG9yQ1NT
SWQoKSwgY29tcHV0ZWRTdHlsZUluZm8sIG51bGxwdHIpOwotICAgIHN0eWxlID0gaW5zcGVjdG9y
U3R5bGUtPmJ1aWxkQXJyYXlGb3JDb21wdXRlZFN0eWxlKCk7CisgICAgUmVmPENTU0NvbXB1dGVk
U3R5bGVEZWNsYXJhdGlvbj4gY29tcHV0ZWRTdHlsZSA9IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJh
dGlvbjo6Y3JlYXRlKGVsZW1lbnQsIHRydWUpOworICAgIFJlZjxJbnNwZWN0b3I6OlN0eWxlUnVs
ZT4gc3R5bGVSdWxlID0gSW5zcGVjdG9yOjpTdHlsZVJ1bGU6OmNyZWF0ZShDU1NJZCgpLCBXVEY6
Om1vdmUoY29tcHV0ZWRTdHlsZSksIG51bGxwdHIpOworICAgIHN0eWxlID0gc3R5bGVSdWxlLT5i
dWlsZEFycmF5Rm9yQ29tcHV0ZWRTdHlsZSgpOwogfQogCiB2b2lkIEluc3BlY3RvckNTU0FnZW50
OjpnZXRBbGxTdHlsZVNoZWV0cyhFcnJvclN0cmluZyYsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3Rv
Y29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRIZWFkZXI+
PiYgc3R5bGVJbmZvcykKQEAgLTU5Nyw4MiArNjA3LDg5IEBAIHZvaWQgSW5zcGVjdG9yQ1NTQWdl
bnQ6OmdldEFsbFN0eWxlU2hlZXRzKEVycm9yU3RyaW5nJiwgUmVmUHRyPEluc3BlY3Rvcjo6UHJv
dG9jCiAgICAgfQogfQogCi12b2lkIEluc3BlY3RvckNTU0FnZW50OjpnZXRTdHlsZVNoZWV0KEVy
cm9yU3RyaW5nJiBlcnJvclN0cmluZywgY29uc3QgU3RyaW5nJiBzdHlsZVNoZWV0SWQsIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRCb2R5PiYgc3R5bGVTaGVl
dE9iamVjdCkKK3ZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmdldFN0eWxlU2hlZXQoRXJyb3JTdHJp
bmcmIGVycm9yU3RyaW5nLCBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRJZCBz
dHlsZXNoZWV0SWQsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hl
ZXRCb2R5PiYgc3R5bGVTaGVldE9iamVjdCkKIHsKLSAgICBJbnNwZWN0b3JTdHlsZVNoZWV0KiBp
bnNwZWN0b3JTdHlsZVNoZWV0ID0gYXNzZXJ0U3R5bGVTaGVldEZvcklkKGVycm9yU3RyaW5nLCBz
dHlsZVNoZWV0SWQpOwotICAgIGlmICghaW5zcGVjdG9yU3R5bGVTaGVldCkKKyAgICBTdHlsZVJ1
bGVTZXQqIHJ1bGVTZXQgPSBydWxlU2V0Rm9yU3R5bGVzaGVldElkKGVycm9yU3RyaW5nLCBzdHls
ZXNoZWV0SWQpOworICAgIGlmICghaXM8U3R5bGVzaGVldFJ1bGVTZXQ+KHJ1bGVTZXQpKQogICAg
ICAgICByZXR1cm47CiAKLSAgICBzdHlsZVNoZWV0T2JqZWN0ID0gaW5zcGVjdG9yU3R5bGVTaGVl
dC0+YnVpbGRPYmplY3RGb3JTdHlsZVNoZWV0KCk7CisgICAgc3R5bGVTaGVldE9iamVjdCA9IGRv
d25jYXN0PFN0eWxlc2hlZXRSdWxlU2V0PihydWxlU2V0KS0+YnVpbGRPYmplY3RGb3JTdHlsZVNo
ZWV0KCk7CiB9CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmdldFN0eWxlU2hlZXRUZXh0KEVy
cm9yU3RyaW5nJiBlcnJvclN0cmluZywgY29uc3QgU3RyaW5nJiBzdHlsZVNoZWV0SWQsIFN0cmlu
ZyogcmVzdWx0KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0U3R5bGVTaGVldFRleHQoRXJy
b3JTdHJpbmcmIGVycm9yU3RyaW5nLCBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hl
ZXRJZCBzdHlsZXNoZWV0SWQsIFN0cmluZyogcmVzdWx0KQogewotICAgIEluc3BlY3RvclN0eWxl
U2hlZXQqIGluc3BlY3RvclN0eWxlU2hlZXQgPSBhc3NlcnRTdHlsZVNoZWV0Rm9ySWQoZXJyb3JT
dHJpbmcsIHN0eWxlU2hlZXRJZCk7Ci0gICAgaWYgKCFpbnNwZWN0b3JTdHlsZVNoZWV0KQorICAg
IFN0eWxlUnVsZVNldCogcnVsZVNldCA9IHJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoZXJyb3JTdHJp
bmcsIHN0eWxlc2hlZXRJZCk7CisgICAgaWYgKCFpczxTdHlsZXNoZWV0UnVsZVNldD4ocnVsZVNl
dCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGluc3BlY3RvclN0eWxlU2hlZXQtPmdldFRleHQo
cmVzdWx0KTsKKyAgICAqcmVzdWx0ID0gcnVsZVNldC0+Z2V0VGV4dCgpOwogfQogCi12b2lkIElu
c3BlY3RvckNTU0FnZW50OjpzZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0cmluZyYgZXJyb3JTdHJp
bmcsIGNvbnN0IFN0cmluZyYgc3R5bGVTaGVldElkLCBjb25zdCBTdHJpbmcmIHRleHQpCit2b2lk
IEluc3BlY3RvckNTU0FnZW50OjpzZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0cmluZyYgZXJyb3JT
dHJpbmcsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldElkIHN0eWxlc2hlZXRJ
ZCwgY29uc3QgU3RyaW5nJiB0ZXh0KQogewotICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIGluc3Bl
Y3RvclN0eWxlU2hlZXQgPSBhc3NlcnRTdHlsZVNoZWV0Rm9ySWQoZXJyb3JTdHJpbmcsIHN0eWxl
U2hlZXRJZCk7Ci0gICAgaWYgKCFpbnNwZWN0b3JTdHlsZVNoZWV0KQorICAgIFN0eWxlUnVsZVNl
dCogcnVsZVNldCA9IHJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoZXJyb3JTdHJpbmcsIHN0eWxlc2hl
ZXRJZCk7CisgICAgaWYgKCFydWxlU2V0KQogICAgICAgICByZXR1cm47CiAKICAgICBFeGNlcHRp
b25Db2RlIGVjID0gMDsKLSAgICBtX2RvbUFnZW50LT5oaXN0b3J5KCktPnBlcmZvcm0oc3RkOjpt
YWtlX3VuaXF1ZTxTZXRTdHlsZVNoZWV0VGV4dEFjdGlvbj4oaW5zcGVjdG9yU3R5bGVTaGVldCwg
dGV4dCksIGVjKTsKKyAgICBtX2RvbUFnZW50LT5oaXN0b3J5KCktPnBlcmZvcm0oc3RkOjptYWtl
X3VuaXF1ZTxTZXRTdHlsZVNoZWV0VGV4dEFjdGlvbj4oKnJ1bGVTZXQsIHRleHQpLCBlYyk7CiAg
ICAgZXJyb3JTdHJpbmcgPSBJbnNwZWN0b3JET01BZ2VudDo6dG9FcnJvclN0cmluZyhlYyk7CiB9
CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OnNldFN0eWxlVGV4dChFcnJvclN0cmluZyYgZXJy
b3JTdHJpbmcsIGNvbnN0IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+JiYgZnVsbFN0eWxlSWQsIGNv
bnN0IFN0cmluZyYgdGV4dCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5
bGU+JiByZXN1bHQpCit2b2lkIEluc3BlY3RvckNTU0FnZW50OjpzZXRTdHlsZVRleHQoRXJyb3JT
dHJpbmcmIGVycm9yU3RyaW5nLCBjb25zdCBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiYmIHN0eWxl
SWRPYmplY3QsIGNvbnN0IFN0cmluZyYgdGV4dCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTU3R5bGU+JiByZXN1bHQpCiB7Ci0gICAgSW5zcGVjdG9yQ1NTSWQgY29tcG91bmRJ
ZChmdWxsU3R5bGVJZC5jb3B5UmVmKCkpOwotICAgIEFTU0VSVCghY29tcG91bmRJZC5pc0VtcHR5
KCkpOworICAgIENTU0lkIHN0eWxlSWQoc3R5bGVJZE9iamVjdC5jb3B5UmVmKCkpOworICAgIEFT
U0VSVCghc3R5bGVJZC5pc0VtcHR5KCkpOwogCi0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5z
cGVjdG9yU3R5bGVTaGVldCA9IGFzc2VydFN0eWxlU2hlZXRGb3JJZChlcnJvclN0cmluZywgY29t
cG91bmRJZC5zdHlsZVNoZWV0SWQoKSk7Ci0gICAgaWYgKCFpbnNwZWN0b3JTdHlsZVNoZWV0KQor
ICAgIFN0eWxlUnVsZVNldCogcnVsZVNldCA9IHJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoZXJyb3JT
dHJpbmcsIHN0eWxlSWQuc3R5bGVzaGVldElkKCkpOworICAgIGlmICghcnVsZVNldCkKICAgICAg
ICAgcmV0dXJuOwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgYm9vbCBzdWNjZXNz
ID0gbV9kb21BZ2VudC0+aGlzdG9yeSgpLT5wZXJmb3JtKHN0ZDo6bWFrZV91bmlxdWU8U2V0U3R5
bGVUZXh0QWN0aW9uPihpbnNwZWN0b3JTdHlsZVNoZWV0LCBjb21wb3VuZElkLCB0ZXh0KSwgZWMp
OwotICAgIGlmIChzdWNjZXNzKQotICAgICAgICByZXN1bHQgPSBpbnNwZWN0b3JTdHlsZVNoZWV0
LT5idWlsZE9iamVjdEZvclN0eWxlKGluc3BlY3RvclN0eWxlU2hlZXQtPnN0eWxlRm9ySWQoY29t
cG91bmRJZCkpOworICAgIGJvb2wgc3VjY2VzcyA9IG1fZG9tQWdlbnQtPmhpc3RvcnkoKS0+cGVy
Zm9ybShzdGQ6Om1ha2VfdW5pcXVlPFNldFN0eWxlVGV4dEFjdGlvbj4oKnJ1bGVTZXQsIHN0eWxl
SWQsIHRleHQpLCBlYyk7CisKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBpZiAoQ1NTU3R5
bGVEZWNsYXJhdGlvbiogc3R5bGUgPSBydWxlU2V0LT5zdHlsZUZvcklkKHN0eWxlSWQpKQorICAg
ICAgICAgICAgcmVzdWx0ID0gcnVsZVNldC0+YnVpbGRPYmplY3RGb3JTdHlsZSgqc3R5bGUpOwor
ICAgIH0KICAgICBlcnJvclN0cmluZyA9IEluc3BlY3RvckRPTUFnZW50Ojp0b0Vycm9yU3RyaW5n
KGVjKTsKIH0KIAotdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6c2V0UnVsZVNlbGVjdG9yKEVycm9y
U3RyaW5nJiBlcnJvclN0cmluZywgY29uc3QgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4mJiBmdWxs
UnVsZUlkLCBjb25zdCBTdHJpbmcmIHNlbGVjdG9yLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NSdWxlPiYgcmVzdWx0KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6c2V0UnVs
ZVNlbGVjdG9yKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgY29uc3QgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4mJiBydWxlSWRPYmplY3QsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3JUZXh0LCBSZWZQ
dHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiYgcmVzdWx0KQogewotICAgIElu
c3BlY3RvckNTU0lkIGNvbXBvdW5kSWQoZnVsbFJ1bGVJZC5jb3B5UmVmKCkpOwotICAgIEFTU0VS
VCghY29tcG91bmRJZC5pc0VtcHR5KCkpOworICAgIENTU0lkIHJ1bGVJZChydWxlSWRPYmplY3Qu
Y29weVJlZigpKTsKKyAgICBBU1NFUlQoIXJ1bGVJZC5pc0VtcHR5KCkpOwogCi0gICAgSW5zcGVj
dG9yU3R5bGVTaGVldCogaW5zcGVjdG9yU3R5bGVTaGVldCA9IGFzc2VydFN0eWxlU2hlZXRGb3JJ
ZChlcnJvclN0cmluZywgY29tcG91bmRJZC5zdHlsZVNoZWV0SWQoKSk7Ci0gICAgaWYgKCFpbnNw
ZWN0b3JTdHlsZVNoZWV0KQorICAgIFN0eWxlUnVsZVNldCogcnVsZVNldCA9IHJ1bGVTZXRGb3JT
dHlsZXNoZWV0SWQoZXJyb3JTdHJpbmcsIHJ1bGVJZC5zdHlsZXNoZWV0SWQoKSk7CisgICAgaWYg
KCFpczxTdHlsZXNoZWV0UnVsZVNldD4ocnVsZVNldCkpCiAgICAgICAgIHJldHVybjsKIAorICAg
IFN0eWxlc2hlZXRSdWxlU2V0JiBzdHlsZXNoZWV0UnVsZVNldCA9IGRvd25jYXN0PFN0eWxlc2hl
ZXRSdWxlU2V0PigqcnVsZVNldCk7CisgICAgCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0g
ICAgYm9vbCBzdWNjZXNzID0gbV9kb21BZ2VudC0+aGlzdG9yeSgpLT5wZXJmb3JtKHN0ZDo6bWFr
ZV91bmlxdWU8U2V0UnVsZVNlbGVjdG9yQWN0aW9uPihpbnNwZWN0b3JTdHlsZVNoZWV0LCBjb21w
b3VuZElkLCBzZWxlY3RvciksIGVjKTsKKyAgICBpZiAoIW1fZG9tQWdlbnQtPmhpc3RvcnkoKS0+
cGVyZm9ybShzdGQ6Om1ha2VfdW5pcXVlPFNldFJ1bGVTZWxlY3RvckFjdGlvbj4oc3R5bGVzaGVl
dFJ1bGVTZXQsIHJ1bGVJZCwgc2VsZWN0b3JUZXh0KSwgZWMpKSB7CisgICAgICAgIGVycm9yU3Ry
aW5nID0gSW5zcGVjdG9yRE9NQWdlbnQ6OnRvRXJyb3JTdHJpbmcoZWMpOworICAgICAgICByZXR1
cm47CisgICAgfQogCi0gICAgaWYgKHN1Y2Nlc3MpCi0gICAgICAgIHJlc3VsdCA9IGluc3BlY3Rv
clN0eWxlU2hlZXQtPmJ1aWxkT2JqZWN0Rm9yUnVsZShpbnNwZWN0b3JTdHlsZVNoZWV0LT5ydWxl
Rm9ySWQoY29tcG91bmRJZCksIG51bGxwdHIpOwotICAgIGVycm9yU3RyaW5nID0gSW5zcGVjdG9y
RE9NQWdlbnQ6OnRvRXJyb3JTdHJpbmcoZWMpOworICAgIGlmIChDU1NTdHlsZVJ1bGUqIHN0eWxl
UnVsZSA9IHN0eWxlc2hlZXRSdWxlU2V0LnJ1bGVGb3JJZChydWxlSWQpKQorICAgICAgICByZXN1
bHQgPSBXZWJDb3JlOjpidWlsZE9iamVjdEZvclN0eWxlUnVsZSgqc3R5bGVSdWxlLCBzdHlsZXNo
ZWV0UnVsZVNldCwgbnVsbHB0cik7CiB9CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmFkZFJ1
bGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBjb25zdCBpbnQgY29udGV4dE5vZGVJZCwgY29u
c3QgU3RyaW5nJiBzZWxlY3RvciwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
UnVsZT4mIHJlc3VsdCkKK3ZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmFkZFJ1bGUoRXJyb3JTdHJp
bmcmIGVycm9yU3RyaW5nLCBjb25zdCBpbnQgY29udGV4dE5vZGVJZCwgY29uc3QgU3RyaW5nJiBz
ZWxlY3RvclRleHQsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+JiBy
ZXN1bHQpCiB7CiAgICAgTm9kZSogbm9kZSA9IG1fZG9tQWdlbnQtPmFzc2VydE5vZGUoZXJyb3JT
dHJpbmcsIGNvbnRleHROb2RlSWQpOwogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuOwog
Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9yU3R5bGVTaGVldCA9IHZpYUluc3Bl
Y3RvclN0eWxlU2hlZXQoJm5vZGUtPmRvY3VtZW50KCksIHRydWUpOwotICAgIGlmICghaW5zcGVj
dG9yU3R5bGVTaGVldCkgeworICAgIFN0eWxlc2hlZXRSdWxlU2V0KiBydWxlU2V0ID0gaW5zcGVj
dG9yUnVsZVNldEZvckRvY3VtZW50KG5vZGUtPmRvY3VtZW50KCksIHRydWUpOworICAgIGlmICgh
cnVsZVNldCkgewogICAgICAgICBlcnJvclN0cmluZyA9IEFTQ0lJTGl0ZXJhbCgiTm8gdGFyZ2V0
IHN0eWxlc2hlZXQgZm91bmQiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOwotICAgIGF1dG8gYWN0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxBZGRS
dWxlQWN0aW9uPihpbnNwZWN0b3JTdHlsZVNoZWV0LCBzZWxlY3Rvcik7CisgICAgYXV0byBhY3Rp
b24gPSBzdGQ6Om1ha2VfdW5pcXVlPEFkZFJ1bGVBY3Rpb24+KCpydWxlU2V0LCBzZWxlY3RvclRl
eHQpOwogICAgIEFkZFJ1bGVBY3Rpb24qIHJhd0FjdGlvbiA9IGFjdGlvbi5nZXQoKTsKICAgICBi
b29sIHN1Y2Nlc3MgPSBtX2RvbUFnZW50LT5oaXN0b3J5KCktPnBlcmZvcm0oV1RGOjptb3ZlKGFj
dGlvbiksIGVjKTsKICAgICBpZiAoIXN1Y2Nlc3MpIHsKQEAgLTY4MCw5ICs2OTcsOSBAQCB2b2lk
IEluc3BlY3RvckNTU0FnZW50OjphZGRSdWxlKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgY29u
c3QgaW50IGNvbnRleHROb2RlSQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgSW5zcGVj
dG9yQ1NTSWQgcnVsZUlkID0gcmF3QWN0aW9uLT5uZXdSdWxlSWQoKTsKLSAgICBDU1NTdHlsZVJ1
bGUqIHJ1bGUgPSBpbnNwZWN0b3JTdHlsZVNoZWV0LT5ydWxlRm9ySWQocnVsZUlkKTsKLSAgICBy
ZXN1bHQgPSBpbnNwZWN0b3JTdHlsZVNoZWV0LT5idWlsZE9iamVjdEZvclJ1bGUocnVsZSwgbnVs
bHB0cik7CisgICAgQ1NTSWQgcnVsZUlkID0gcmF3QWN0aW9uLT5uZXdSdWxlSWQoKTsKKyAgICBp
ZiAoQ1NTU3R5bGVSdWxlKiBydWxlID0gcnVsZVNldC0+cnVsZUZvcklkKHJ1bGVJZCkpCisgICAg
ICAgIHJlc3VsdCA9IFdlYkNvcmU6OmJ1aWxkT2JqZWN0Rm9yU3R5bGVSdWxlKCpydWxlLCAqcnVs
ZVNldCwgbnVsbHB0cik7CiB9CiAKIHZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmdldFN1cHBvcnRl
ZENTU1Byb3BlcnRpZXMoRXJyb3JTdHJpbmcmLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6
QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eUluZm8+PiYgY3NzUHJv
cGVydGllcykKQEAgLTc0NywyMiArNzY0LDE5IEBAIHZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6Omdl
dE5hbWVkRmxvd0NvbGxlY3Rpb24oRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgZG9jCiAg
ICAgcmVzdWx0ID0gV1RGOjptb3ZlKG5hbWVkRmxvd3MpOwogfQogCi1JbnNwZWN0b3JTdHlsZVNo
ZWV0Rm9ySW5saW5lU3R5bGUqIEluc3BlY3RvckNTU0FnZW50Ojphc0luc3BlY3RvclN0eWxlU2hl
ZXQoRWxlbWVudCogZWxlbWVudCkKK0lubGluZVN0eWxlUnVsZVNldCogSW5zcGVjdG9yQ1NTQWdl
bnQ6OmFzSW5saW5lUnVsZVNldChFbGVtZW50JiBlbGVtZW50KQogewotICAgIE5vZGVUb0luc3Bl
Y3RvclN0eWxlU2hlZXQ6Oml0ZXJhdG9yIGl0ID0gbV9ub2RlVG9JbnNwZWN0b3JTdHlsZVNoZWV0
LmZpbmQoZWxlbWVudCk7Ci0gICAgaWYgKGl0ID09IG1fbm9kZVRvSW5zcGVjdG9yU3R5bGVTaGVl
dC5lbmQoKSkgewotICAgICAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQt
PmlzU3R5bGVkRWxlbWVudCgpID8gZWxlbWVudC0+c3R5bGUoKSA6IG51bGxwdHI7Ci0gICAgICAg
IGlmICghc3R5bGUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBhdXRvIGZpbmRS
ZXN1bHQgPSBtX25vZGVUb0lubGluZVJ1bGVTZXRNYXAuZmluZCgmZWxlbWVudCk7CisgICAgaWYg
KGZpbmRSZXN1bHQgIT0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFwLmVuZCgpKQorICAgICAgICBy
ZXR1cm4gZmluZFJlc3VsdC0+dmFsdWUuZ2V0KCk7CiAKLSAgICAgICAgU3RyaW5nIG5ld1N0eWxl
U2hlZXRJZCA9IFN0cmluZzo6bnVtYmVyKG1fbGFzdFN0eWxlU2hlZXRJZCsrKTsKLSAgICAgICAg
UmVmUHRyPEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZT4gaW5zcGVjdG9yU3R5bGVT
aGVldCA9IEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6Y3JlYXRlKG5ld1N0eWxl
U2hlZXRJZCwgZWxlbWVudCwgU3R5bGVTaGVldE9yaWdpbjo6QXV0aG9yLCB0aGlzKTsKLSAgICAg
ICAgbV9pZFRvSW5zcGVjdG9yU3R5bGVTaGVldC5zZXQobmV3U3R5bGVTaGVldElkLCBpbnNwZWN0
b3JTdHlsZVNoZWV0KTsKLSAgICAgICAgbV9ub2RlVG9JbnNwZWN0b3JTdHlsZVNoZWV0LnNldChl
bGVtZW50LCBpbnNwZWN0b3JTdHlsZVNoZWV0KTsKLSAgICAgICAgcmV0dXJuIGluc3BlY3RvclN0
eWxlU2hlZXQuZ2V0KCk7Ci0gICAgfQorICAgIGlmICghZWxlbWVudC5pc1N0eWxlZEVsZW1lbnQo
KSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICByZXR1cm4gaXQtPnZhbHVlLmdldCgp
OworICAgIFJlZlB0cjxJbmxpbmVTdHlsZVJ1bGVTZXQ+IGlubGluZVN0eWxlID0gSW5saW5lU3R5
bGVSdWxlU2V0OjpjcmVhdGUoZWxlbWVudCk7CisgICAgbV9pZGVudGlmaWVyVG9SdWxlU2V0TWFw
LnNldChpbmxpbmVTdHlsZS0+aWRlbnRpZmllcigpLCBpbmxpbmVTdHlsZSk7CisgICAgbV9ub2Rl
VG9JbmxpbmVSdWxlU2V0TWFwLnNldCgmZWxlbWVudCwgaW5saW5lU3R5bGUpOworICAgIHJldHVy
biBpbmxpbmVTdHlsZS5nZXQoKTsKIH0KIAogRWxlbWVudCogSW5zcGVjdG9yQ1NTQWdlbnQ6OmVs
ZW1lbnRGb3JJZChFcnJvclN0cmluZyYgZXJyb3JTdHJpbmcsIGludCBub2RlSWQpCkBAIC03ODgs
MTU1ICs4MDIsMzA5IEBAIGludCBJbnNwZWN0b3JDU1NBZ2VudDo6ZG9jdW1lbnROb2RlV2l0aFJl
cXVlc3RlZEZsb3dzSWQoRG9jdW1lbnQqIGRvY3VtZW50KQogICAgIHJldHVybiBkb2N1bWVudE5v
ZGVJZDsKIH0KIAotc3RhdGljIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxl
U2hlZXRIZWFkZXI+IGJ1aWxkT2JqZWN0Rm9yU3R5bGVTaGVldEluZm8oSW5zcGVjdG9yU3R5bGVT
aGVldCYgc2hlZXQpCitzdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5
bGVTaGVldEhlYWRlcj4gYnVpbGRPYmplY3RGb3JTdHlsZVNoZWV0SW5mbyhTdHlsZXNoZWV0UnVs
ZVNldCYgc3R5bGVzaGVldCkKIHsKICAgICBTdHJpbmcgZnJhbWVJZCA9IEFTQ0lJTGl0ZXJhbCgi
KFVua25vd24pIik7Ci0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gc2hlZXQub3duZXJEb2N1bWVu
dCgpOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IHN0eWxlc2hlZXQub3duZXJEb2N1bWVudCgp
OwogICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50ID8gZG9jdW1lbnQtPmZyYW1lKCkgOiBudWxs
cHRyOwogICAgIGlmIChJbnN0cnVtZW50aW5nQWdlbnRzKiBpbnN0cnVtZW50aW5nQWdlbnRzID0g
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjppbnN0cnVtZW50aW5nQWdlbnRzRm9yRnJhbWUoZnJh
bWUpKQogICAgICAgICBpZiAoSW5zcGVjdG9yUGFnZUFnZW50KiBwYWdlQWdlbnQgPSBpbnN0cnVt
ZW50aW5nQWdlbnRzLT5pbnNwZWN0b3JQYWdlQWdlbnQoKSkKICAgICAgICAgICAgIGZyYW1lSWQg
PSBwYWdlQWdlbnQtPmZyYW1lSWQoZnJhbWUpOwotICAgIAorCiAgICAgcmV0dXJuIEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEhlYWRlcjo6Y3JlYXRlKCkKLSAgICAuc2V0
U3R5bGVTaGVldElkKHNoZWV0LmlkKCkpCi0gICAgLnNldE9yaWdpbihzdHlsZXNoZWV0T3JpZ2lu
VG9Qcm90b2NvbEVudW0oc2hlZXQub3JpZ2luKCkpKQotICAgIC5zZXREaXNhYmxlZCghc2hlZXQu
aXNFbmFibGVkKCkpCi0gICAgLnNldFNvdXJjZVVSTChzaGVldC5maW5hbFVSTCgpKQotICAgIC5z
ZXRUaXRsZShzaGVldC50aXRsZSgpKQorICAgIC5zZXRTdHlsZVNoZWV0SWQoc3R5bGVzaGVldC5p
ZGVudGlmaWVyKCkpCisgICAgLnNldE9yaWdpbihzdHlsZXNoZWV0T3JpZ2luVG9Qcm90b2NvbEVu
dW0oc3R5bGVzaGVldC5vcmlnaW4oKSkpCisgICAgLnNldERpc2FibGVkKCFzdHlsZXNoZWV0Lmlz
RW5hYmxlZCgpKQorICAgIC5zZXRTb3VyY2VVUkwoc3R5bGVzaGVldC5maW5hbFVSTCgpKQorICAg
IC5zZXRUaXRsZShzdHlsZXNoZWV0LnRpdGxlKCkpCiAgICAgLnNldEZyYW1lSWQoZnJhbWVJZCkK
ICAgICAucmVsZWFzZSgpOwogfQogCi12b2lkIEluc3BlY3RvckNTU0FnZW50Ojpjb2xsZWN0U3R5
bGVTaGVldHMoQ1NTU3R5bGVTaGVldCYgc3R5bGVTaGVldCwgSW5zcGVjdG9yOjpQcm90b2NvbDo6
QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0SGVhZGVyPiYgcmVz
dWx0KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Y29sbGVjdFN0eWxlU2hlZXRzKENTU1N0eWxl
U2hlZXQmIHN0eWxlc2hlZXQsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEhlYWRlcj4mIHJlc3VsdCkKIHsKLSAgICBpZiAo
SW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9yU3R5bGVTaGVldCA9IGJpbmRTdHlsZVNoZWV0
KCZzdHlsZVNoZWV0KSkKLSAgICAgICAgcmVzdWx0LmFkZEl0ZW0oYnVpbGRPYmplY3RGb3JTdHls
ZVNoZWV0SW5mbygqaW5zcGVjdG9yU3R5bGVTaGVldCkpOworICAgIFN0eWxlc2hlZXRSdWxlU2V0
JiBydWxlU2V0ID0gYmluZFN0eWxlU2hlZXQoc3R5bGVzaGVldCk7CisgICAgcmVzdWx0LmFkZEl0
ZW0oYnVpbGRPYmplY3RGb3JTdHlsZVNoZWV0SW5mbyhydWxlU2V0KSk7CiAKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwLCBzaXplID0gc3R5bGVTaGVldC5sZW5ndGgoKTsgaSA8IHNpemU7ICsraSkg
ewotICAgICAgICBDU1NSdWxlKiBydWxlID0gc3R5bGVTaGVldC5pdGVtKGkpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDAsIHNpemUgPSBzdHlsZXNoZWV0Lmxlbmd0aCgpOyBpIDwgc2l6ZTsgKytp
KSB7CisgICAgICAgIENTU1J1bGUqIHJ1bGUgPSBzdHlsZXNoZWV0Lml0ZW0oaSk7CiAgICAgICAg
IGlmICghaXM8Q1NTSW1wb3J0UnVsZT4ocnVsZSkpCiAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgCi0gICAgICAgIGlmIChDU1NTdHlsZVNoZWV0KiBpbXBvcnRlZFN0eWxlU2hlZXQgPSBk
b3duY2FzdDxDU1NJbXBvcnRSdWxlPigqcnVsZSkuc3R5bGVTaGVldCgpKQotICAgICAgICAgICAg
Y29sbGVjdFN0eWxlU2hlZXRzKCppbXBvcnRlZFN0eWxlU2hlZXQsIHJlc3VsdCk7CisKKyAgICAg
ICAgaWYgKENTU1N0eWxlU2hlZXQqIGltcG9ydGVkU3R5bGVzaGVldCA9IGRvd25jYXN0PENTU0lt
cG9ydFJ1bGU+KCpydWxlKS5zdHlsZVNoZWV0KCkpCisgICAgICAgICAgICBjb2xsZWN0U3R5bGVT
aGVldHMoKmltcG9ydGVkU3R5bGVzaGVldCwgcmVzdWx0KTsKICAgICB9CiB9CiAKLUluc3BlY3Rv
clN0eWxlU2hlZXQqIEluc3BlY3RvckNTU0FnZW50OjpiaW5kU3R5bGVTaGVldChDU1NTdHlsZVNo
ZWV0KiBzdHlsZVNoZWV0KQorU3R5bGVzaGVldFJ1bGVTZXQmIEluc3BlY3RvckNTU0FnZW50Ojpi
aW5kU3R5bGVTaGVldChDU1NTdHlsZVNoZWV0JiBzdHlsZXNoZWV0KQogewotICAgIFJlZlB0cjxJ
bnNwZWN0b3JTdHlsZVNoZWV0PiBpbnNwZWN0b3JTdHlsZVNoZWV0ID0gbV9jc3NTdHlsZVNoZWV0
VG9JbnNwZWN0b3JTdHlsZVNoZWV0LmdldChzdHlsZVNoZWV0KTsKLSAgICBpZiAoIWluc3BlY3Rv
clN0eWxlU2hlZXQpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gU3RyaW5nOjpudW1iZXIobV9sYXN0
U3R5bGVTaGVldElkKyspOwotICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBzdHlsZVNoZWV0
LT5vd25lckRvY3VtZW50KCk7Ci0gICAgICAgIGluc3BlY3RvclN0eWxlU2hlZXQgPSBJbnNwZWN0
b3JTdHlsZVNoZWV0OjpjcmVhdGUoaWQsIHN0eWxlU2hlZXQsIGRldGVjdE9yaWdpbihzdHlsZVNo
ZWV0LCBkb2N1bWVudCksIEluc3BlY3RvckRPTUFnZW50Ojpkb2N1bWVudFVSTFN0cmluZyhkb2N1
bWVudCksIHRoaXMpOwotICAgICAgICBtX2lkVG9JbnNwZWN0b3JTdHlsZVNoZWV0LnNldChpZCwg
aW5zcGVjdG9yU3R5bGVTaGVldCk7Ci0gICAgICAgIG1fY3NzU3R5bGVTaGVldFRvSW5zcGVjdG9y
U3R5bGVTaGVldC5zZXQoc3R5bGVTaGVldCwgaW5zcGVjdG9yU3R5bGVTaGVldCk7Ci0gICAgfQot
ICAgIHJldHVybiBpbnNwZWN0b3JTdHlsZVNoZWV0LmdldCgpOworICAgIGF1dG8gZmluZFJlc3Vs
dCA9IG1fY3NzU3R5bGVTaGVldFRvUnVsZVNldE1hcC5maW5kKCZzdHlsZXNoZWV0KTsKKyAgICBp
ZiAoZmluZFJlc3VsdCAhPSBtX2Nzc1N0eWxlU2hlZXRUb1J1bGVTZXRNYXAuZW5kKCkpCisgICAg
ICAgIHJldHVybiAqZmluZFJlc3VsdC0+dmFsdWU7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQg
PSBzdHlsZXNoZWV0Lm93bmVyRG9jdW1lbnQoKTsKKyAgICBSZWZQdHI8U3R5bGVzaGVldFJ1bGVT
ZXQ+IHJ1bGVTZXQgPSBTdHlsZXNoZWV0UnVsZVNldDo6Y3JlYXRlKHN0eWxlc2hlZXQsIGRldGVj
dE9yaWdpbihzdHlsZXNoZWV0LCBkb2N1bWVudCksIEluc3BlY3RvckRPTUFnZW50Ojpkb2N1bWVu
dFVSTFN0cmluZyhkb2N1bWVudCksIHRoaXMpOworICAgIG1faWRlbnRpZmllclRvUnVsZVNldE1h
cC5zZXQocnVsZVNldC0+aWRlbnRpZmllcigpLCBydWxlU2V0KTsKKyAgICBtX2Nzc1N0eWxlU2hl
ZXRUb1J1bGVTZXRNYXAuc2V0KCZzdHlsZXNoZWV0LCBydWxlU2V0KTsKKyAgICByZXR1cm4gKnJ1
bGVTZXQ7CiB9CiAKLUluc3BlY3RvclN0eWxlU2hlZXQqIEluc3BlY3RvckNTU0FnZW50Ojp2aWFJ
bnNwZWN0b3JTdHlsZVNoZWV0KERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBjcmVhdGVJZkFic2Vu
dCkKK1N0eWxlc2hlZXRSdWxlU2V0KiBJbnNwZWN0b3JDU1NBZ2VudDo6aW5zcGVjdG9yUnVsZVNl
dEZvckRvY3VtZW50KERvY3VtZW50JiBkb2N1bWVudCwgYm9vbCBjcmVhdGVJZkFic2VudCkKIHsK
LSAgICBpZiAoIWRvY3VtZW50KSB7Ci0gICAgICAgIEFTU0VSVCghY3JlYXRlSWZBYnNlbnQpOwot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBpZiAoIWRvY3VtZW50LT5pc0hU
TUxEb2N1bWVudCgpICYmICFkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpKQorICAgIGlmICghZG9j
dW1lbnQuaXNIVE1MRG9jdW1lbnQoKSAmJiAhZG9jdW1lbnQuaXNTVkdEb2N1bWVudCgpKQogICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIFJlZlB0cjxJbnNwZWN0b3JTdHlsZVNoZWV0PiBp
bnNwZWN0b3JTdHlsZVNoZWV0ID0gbV9kb2N1bWVudFRvSW5zcGVjdG9yU3R5bGVTaGVldC5nZXQo
ZG9jdW1lbnQpOwotICAgIGlmIChpbnNwZWN0b3JTdHlsZVNoZWV0IHx8ICFjcmVhdGVJZkFic2Vu
dCkKLSAgICAgICAgcmV0dXJuIGluc3BlY3RvclN0eWxlU2hlZXQuZ2V0KCk7CisgICAgUmVmUHRy
PFN0eWxlc2hlZXRSdWxlU2V0PiBydWxlU2V0ID0gbV9kb2N1bWVudFRvSW5zcGVjdG9yUnVsZVNl
dE1hcC5nZXQoJmRvY3VtZW50KTsKKyAgICBpZiAocnVsZVNldCB8fCAhY3JlYXRlSWZBYnNlbnQp
CisgICAgICAgIHJldHVybiBydWxlU2V0LmdldCgpOwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7Ci0gICAgUmVmUHRyPEVsZW1lbnQ+IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LT5jcmVhdGVF
bGVtZW50KCJzdHlsZSIsIGVjKTsKKyAgICBSZWZQdHI8RWxlbWVudD4gc3R5bGVFbGVtZW50ID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiLCBlYyk7CiAgICAgaWYgKCFlYykKICAgICAg
ICAgc3R5bGVFbGVtZW50LT5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9jc3MiLCBlYyk7CiAg
ICAgaWYgKCFlYykgewogICAgICAgICBDb250YWluZXJOb2RlKiB0YXJnZXROb2RlOwogICAgICAg
ICAvLyBIRUFEIGlzIGFic2VudCBpbiBJbWFnZURvY3VtZW50cywgZm9yIGV4YW1wbGUuCi0gICAg
ICAgIGlmIChhdXRvKiBoZWFkID0gZG9jdW1lbnQtPmhlYWQoKSkKKyAgICAgICAgaWYgKGF1dG8q
IGhlYWQgPSBkb2N1bWVudC5oZWFkKCkpCiAgICAgICAgICAgICB0YXJnZXROb2RlID0gaGVhZDsK
LSAgICAgICAgZWxzZSBpZiAoYXV0byogYm9keSA9IGRvY3VtZW50LT5ib2R5T3JGcmFtZXNldCgp
KQorICAgICAgICBlbHNlIGlmIChhdXRvKiBib2R5ID0gZG9jdW1lbnQuYm9keU9yRnJhbWVzZXQo
KSkKICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBib2R5OwogICAgICAgICBlbHNlCiAgICAgICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgICAgICBJbmxpbmVTdHlsZU92ZXJyaWRlU2NvcGUg
b3ZlcnJpZGVTY29wZShkb2N1bWVudCk7CisgICAgICAgIElubGluZVN0eWxlT3ZlcnJpZGVTY29w
ZSBvdmVycmlkZVNjb3BlKCZkb2N1bWVudCk7CiAgICAgICAgIHRhcmdldE5vZGUtPmFwcGVuZENo
aWxkKHN0eWxlRWxlbWVudCwgZWMpOwogICAgIH0KICAgICBpZiAoZWMpCiAgICAgICAgIHJldHVy
biBudWxscHRyOwogCi0gICAgQ1NTU3R5bGVTaGVldCogY3NzU3R5bGVTaGVldCA9IG51bGxwdHI7
CisgICAgQ1NTU3R5bGVTaGVldCogc3R5bGVzaGVldCA9IG51bGxwdHI7CiAgICAgaWYgKHN0eWxl
RWxlbWVudC0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICBjc3NTdHlsZVNoZWV0ID0gZG93bmNh
c3Q8SFRNTFN0eWxlRWxlbWVudD4oKnN0eWxlRWxlbWVudCkuc2hlZXQoKTsKKyAgICAgICAgc3R5
bGVzaGVldCA9IGRvd25jYXN0PEhUTUxTdHlsZUVsZW1lbnQ+KCpzdHlsZUVsZW1lbnQpLnNoZWV0
KCk7CiAgICAgZWxzZSBpZiAoc3R5bGVFbGVtZW50LT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAg
Y3NzU3R5bGVTaGVldCA9IGRvd25jYXN0PFNWR1N0eWxlRWxlbWVudD4oKnN0eWxlRWxlbWVudCku
c2hlZXQoKTsKKyAgICAgICAgc3R5bGVzaGVldCA9IGRvd25jYXN0PFNWR1N0eWxlRWxlbWVudD4o
KnN0eWxlRWxlbWVudCkuc2hlZXQoKTsKIAotICAgIGlmICghY3NzU3R5bGVTaGVldCkKKyAgICBp
ZiAoIXN0eWxlc2hlZXQpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgU3RyaW5nIGlk
ID0gU3RyaW5nOjpudW1iZXIobV9sYXN0U3R5bGVTaGVldElkKyspOwotICAgIGluc3BlY3RvclN0
eWxlU2hlZXQgPSBJbnNwZWN0b3JTdHlsZVNoZWV0OjpjcmVhdGUoaWQsIGNzc1N0eWxlU2hlZXQs
IFN0eWxlU2hlZXRPcmlnaW46Okluc3BlY3RvciwgSW5zcGVjdG9yRE9NQWdlbnQ6OmRvY3VtZW50
VVJMU3RyaW5nKGRvY3VtZW50KSwgdGhpcyk7Ci0gICAgbV9pZFRvSW5zcGVjdG9yU3R5bGVTaGVl
dC5zZXQoaWQsIGluc3BlY3RvclN0eWxlU2hlZXQpOwotICAgIG1fY3NzU3R5bGVTaGVldFRvSW5z
cGVjdG9yU3R5bGVTaGVldC5zZXQoY3NzU3R5bGVTaGVldCwgaW5zcGVjdG9yU3R5bGVTaGVldCk7
Ci0gICAgbV9kb2N1bWVudFRvSW5zcGVjdG9yU3R5bGVTaGVldC5zZXQoZG9jdW1lbnQsIGluc3Bl
Y3RvclN0eWxlU2hlZXQpOwotICAgIHJldHVybiBpbnNwZWN0b3JTdHlsZVNoZWV0LmdldCgpOwor
ICAgIFJlZlB0cjxTdHlsZXNoZWV0UnVsZVNldD4gbmV3UnVsZVNldCA9IFN0eWxlc2hlZXRSdWxl
U2V0OjpjcmVhdGUoKnN0eWxlc2hlZXQsIFN0eWxlU2hlZXRPcmlnaW46Okluc3BlY3RvciwgSW5z
cGVjdG9yRE9NQWdlbnQ6OmRvY3VtZW50VVJMU3RyaW5nKCZkb2N1bWVudCksIHRoaXMpOworICAg
IG1faWRlbnRpZmllclRvUnVsZVNldE1hcC5zZXQobmV3UnVsZVNldC0+aWRlbnRpZmllcigpLCBu
ZXdSdWxlU2V0KTsKKyAgICBtX2Nzc1N0eWxlU2hlZXRUb1J1bGVTZXRNYXAuc2V0KHN0eWxlc2hl
ZXQsIG5ld1J1bGVTZXQpOworICAgIG1fZG9jdW1lbnRUb0luc3BlY3RvclJ1bGVTZXRNYXAuc2V0
KCZkb2N1bWVudCwgbmV3UnVsZVNldCk7CisgICAgcmV0dXJuIG5ld1J1bGVTZXQuZ2V0KCk7CiB9
CiAKLUluc3BlY3RvclN0eWxlU2hlZXQqIEluc3BlY3RvckNTU0FnZW50Ojphc3NlcnRTdHlsZVNo
ZWV0Rm9ySWQoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBjb25zdCBTdHJpbmcmIHN0eWxlU2hl
ZXRJZCkKK1N0eWxlUnVsZVNldCogSW5zcGVjdG9yQ1NTQWdlbnQ6OnJ1bGVTZXRGb3JTdHlsZXNo
ZWV0SWQoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OlN0eWxlU2hlZXRJZCBzdHlsZXNoZWV0SWQpCiB7Ci0gICAgSWRUb0luc3BlY3RvclN0eWxlU2hl
ZXQ6Oml0ZXJhdG9yIGl0ID0gbV9pZFRvSW5zcGVjdG9yU3R5bGVTaGVldC5maW5kKHN0eWxlU2hl
ZXRJZCk7Ci0gICAgaWYgKGl0ID09IG1faWRUb0luc3BlY3RvclN0eWxlU2hlZXQuZW5kKCkpIHsK
LSAgICAgICAgZXJyb3JTdHJpbmcgPSBBU0NJSUxpdGVyYWwoIk5vIHN0eWxlIHNoZWV0IHdpdGgg
Z2l2ZW4gaWQgZm91bmQiKTsKKyAgICBpZiAoc3R5bGVzaGVldElkIDw9IDApIHsKKyAgICAgICAg
ZXJyb3JTdHJpbmcgPSBBU0NJSUxpdGVyYWwoIkludmFsaWQgaWRlbmlmaWVyIGZvciBzdHlsZXNo
ZWV0LiIpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgcmV0dXJuIGl0LT52
YWx1ZS5nZXQoKTsKKworICAgIHVpbnQ2NF90IGtleSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihz
dHlsZXNoZWV0SWQpOworICAgIGF1dG8gZmluZFJlc3VsdCA9IG1faWRlbnRpZmllclRvUnVsZVNl
dE1hcC5maW5kKGtleSk7CisgICAgaWYgKGZpbmRSZXN1bHQgPT0gbV9pZGVudGlmaWVyVG9SdWxl
U2V0TWFwLmVuZCgpKSB7CisgICAgICAgIGVycm9yU3RyaW5nID0gQVNDSUlMaXRlcmFsKCJObyBz
dHlsZXNoZWV0IHdpdGggZ2l2ZW4gaWQgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisgICAgfQorICAgIHJldHVybiBmaW5kUmVzdWx0LT52YWx1ZS5nZXQoKTsKIH0KIAotU3R5bGVT
aGVldE9yaWdpbiBJbnNwZWN0b3JDU1NBZ2VudDo6ZGV0ZWN0T3JpZ2luKENTU1N0eWxlU2hlZXQq
IHBhZ2VTdHlsZVNoZWV0LCBEb2N1bWVudCogb3duZXJEb2N1bWVudCkKK1N0eWxlU2hlZXRPcmln
aW4gSW5zcGVjdG9yQ1NTQWdlbnQ6OmRldGVjdE9yaWdpbihDU1NTdHlsZVNoZWV0JiBzdHlsZXNo
ZWV0LCBEb2N1bWVudCogb3duZXJEb2N1bWVudCkKIHsKLSAgICBpZiAoIXBhZ2VTdHlsZVNoZWV0
KQotICAgICAgICByZXR1cm4gU3R5bGVTaGVldE9yaWdpbjo6QXV0aG9yOwotCi0gICAgTm9kZSog
b3duZXJOb2RlID0gcGFnZVN0eWxlU2hlZXQtPm93bmVyTm9kZSgpOwotICAgIGlmICghb3duZXJO
b2RlICYmIHBhZ2VTdHlsZVNoZWV0LT5ocmVmKCkuaXNFbXB0eSgpKQorICAgIE5vZGUqIG93bmVy
Tm9kZSA9IHN0eWxlc2hlZXQub3duZXJOb2RlKCk7CisgICAgaWYgKCFvd25lck5vZGUgJiYgc3R5
bGVzaGVldC5ocmVmKCkuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gU3R5bGVTaGVldE9yaWdp
bjo6VXNlckFnZW50OwogCiAgICAgaWYgKG93bmVyTm9kZSAmJiBvd25lck5vZGUtPm5vZGVOYW1l
KCkgPT0gIiNkb2N1bWVudCIpCiAgICAgICAgIHJldHVybiBTdHlsZVNoZWV0T3JpZ2luOjpVc2Vy
OwogCi0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5qZWN0ZWRTdHlsZXNoZWV0ID0gdmlhSW5z
cGVjdG9yU3R5bGVTaGVldChvd25lckRvY3VtZW50LCBmYWxzZSk7Ci0gICAgaWYgKGluamVjdGVk
U3R5bGVzaGVldCAmJiBwYWdlU3R5bGVTaGVldCA9PSBpbmplY3RlZFN0eWxlc2hlZXQtPnBhZ2VT
dHlsZVNoZWV0KCkpCisgICAgU3R5bGVzaGVldFJ1bGVTZXQqIGluc3BlY3RvclJ1bGVTZXQgPSBv
d25lckRvY3VtZW50ID8gaW5zcGVjdG9yUnVsZVNldEZvckRvY3VtZW50KCpvd25lckRvY3VtZW50
LCBmYWxzZSkgOiBudWxscHRyOworICAgIGlmIChpbnNwZWN0b3JSdWxlU2V0ICYmICZpbnNwZWN0
b3JSdWxlU2V0LT5wYWdlU3R5bGVTaGVldCgpPT0gJnN0eWxlc2hlZXQpCiAgICAgICAgIHJldHVy
biBTdHlsZVNoZWV0T3JpZ2luOjpJbnNwZWN0b3I7CiAKICAgICByZXR1cm4gU3R5bGVTaGVldE9y
aWdpbjo6QXV0aG9yOwogfQogCi1SZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NS
dWxlPiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRPYmplY3RGb3JSdWxlKFN0eWxlUnVsZSogc3R5
bGVSdWxlLCBTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBFbGVtZW50KiBlbGVtZW50KQor
Ly8gQ29kZSBmb3IgdHJhbnNsYXRpbmcgYmV0d2VlbiBpbnNwZWN0b3IgQ1NTIHdyYXBwZXJzIGFu
ZCBpbnNwZWN0b3IgcHJvdG9jb2wuCisvLyBUT0RPOiBhbG1vc3QgYWxsIG9mIHRoZSBidWlsZCpP
YmplY3QgYW5kICpUb1Byb3RvY29sRW51bSBmdW5jdGlvbnMgc2hvdWxkIGJlIHN0YXRpYy4KKwor
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luIHN0eWxlc2hlZXRPcmln
aW5Ub1Byb3RvY29sRW51bShTdHlsZVNoZWV0T3JpZ2luIG9yaWdpbikKIHsKLSAgICBpZiAoIXN0
eWxlUnVsZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgc3dpdGNoIChvcmlnaW4pIHsK
KyAgICBjYXNlIFN0eWxlU2hlZXRPcmlnaW46Okluc3BlY3RvcjoKKyAgICAgICAgcmV0dXJuIElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldE9yaWdpbjo6SW5zcGVjdG9yOworICAg
IGNhc2UgU3R5bGVTaGVldE9yaWdpbjo6VXNlckFnZW50OgorICAgICAgICByZXR1cm4gSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luOjpVc2VyQWdlbnQ7CisgICAgY2Fz
ZSBTdHlsZVNoZWV0T3JpZ2luOjpVc2VyOgorICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90
b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luOjpVc2VyOworICAgIGNhc2UgU3R5bGVTaGVldE9y
aWdpbjo6QXV0aG9yOgorICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpT
dHlsZVNoZWV0T3JpZ2luOjpSZWd1bGFyOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpT
dHlsZVNoZWV0T3JpZ2luOjpSZWd1bGFyOworICAgIH0KK30KIAorSW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlIG1lZGlhTGlzdFNvdXJjZVRvUHJvdG9jb2xFbnVtKE1l
ZGlhTGlzdFNvdXJjZSBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICBjYXNl
IE1lZGlhTGlzdFNvdXJjZTo6TWVkaWFSdWxlOgorICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQ
cm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlOjpNZWRpYVJ1bGU7CisgICAgY2FzZSBNZWRp
YUxpc3RTb3VyY2U6OkltcG9ydFJ1bGU6CisgICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OkNTU01lZGlhOjpTb3VyY2U6OkltcG9ydFJ1bGU7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgTWVkaWFMaXN0U291cmNlOjpMaW5rZWRTaGVldDoKKyAgICAgICAgcmV0dXJuIElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE6OlNvdXJjZTo6TGlua2VkU2hlZXQ7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgTWVkaWFMaXN0U291cmNlOjpJbmxpbmVTaGVldDoKKyAg
ICAgICAgcmV0dXJuIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE6OlNvdXJjZTo6
SW5saW5lU2hlZXQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpDU1NNZWRpYTo6U291cmNlOjpJbmxpbmVTaGVldDsKKyAgICB9Cit9CisKK1JlZlB0cjxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlNvdXJjZVJhbmdlPiBidWlsZFNvdXJjZVJhbmdlT2JqZWN0
KGNvbnN0IFNvdXJjZVJhbmdlJiByYW5nZSwgVmVjdG9yPHNpemVfdD4mIGxpbmVFbmRpbmdzKQor
eworICAgIFRleHRQb3NpdGlvbiBzdGFydCA9IENvbnRlbnRTZWFyY2hVdGlsaXRpZXM6OnRleHRQ
b3NpdGlvbkZyb21PZmZzZXQocmFuZ2Uuc3RhcnQsIGxpbmVFbmRpbmdzKTsKKyAgICBUZXh0UG9z
aXRpb24gZW5kID0gQ29udGVudFNlYXJjaFV0aWxpdGllczo6dGV4dFBvc2l0aW9uRnJvbU9mZnNl
dChyYW5nZS5lbmQsIGxpbmVFbmRpbmdzKTsKKworICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OlNvdXJjZVJhbmdlOjpjcmVhdGUoKQorICAgICAgICAuc2V0U3RhcnRMaW5lKHN0
YXJ0Lm1fbGluZS56ZXJvQmFzZWRJbnQoKSkKKyAgICAgICAgLnNldFN0YXJ0Q29sdW1uKHN0YXJ0
Lm1fY29sdW1uLnplcm9CYXNlZEludCgpKQorICAgICAgICAuc2V0RW5kTGluZShlbmQubV9saW5l
Lnplcm9CYXNlZEludCgpKQorICAgICAgICAuc2V0RW5kQ29sdW1uKGVuZC5tX2NvbHVtbi56ZXJv
QmFzZWRJbnQoKSkKKyAgICAgICAgLnJlbGVhc2UoKTsKK30KKworUmVmPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTTWVkaWE+IGJ1aWxkTWVkaWFPYmplY3QoY29uc3QgTWVkaWFMaXN0JiBt
ZWRpYSwgTWVkaWFMaXN0U291cmNlIG1lZGlhTGlzdFNvdXJjZSwgY29uc3QgU3RyaW5nJiBzb3Vy
Y2VVUkwpCit7CisgICAgYXV0byBtZWRpYU9iamVjdCA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6Q1NTTWVkaWE6OmNyZWF0ZSgpCisgICAgICAgIC5zZXRUZXh0KG1lZGlhLm1lZGlhVGV4dCgp
KQorICAgICAgICAuc2V0U291cmNlKG1lZGlhTGlzdFNvdXJjZVRvUHJvdG9jb2xFbnVtKG1lZGlh
TGlzdFNvdXJjZSkpCisgICAgICAgIC5yZWxlYXNlKCk7CisKKyAgICBpZiAoIXNvdXJjZVVSTC5p
c0VtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFPYmplY3QtPnNldFNvdXJjZVVSTChzb3VyY2VVUkwp
OworICAgICAgICBtZWRpYU9iamVjdC0+c2V0U291cmNlTGluZShtZWRpYS5xdWVyaWVzKCktPmxh
c3RMaW5lKCkpOworICAgIH0KKyAgICByZXR1cm4gV1RGOjptb3ZlKG1lZGlhT2JqZWN0KTsKK30K
Kwordm9pZCBmaWxsTWVkaWFMaXN0Q2hhaW4oQ1NTUnVsZSYgcnVsZSwgSW5zcGVjdG9yOjpQcm90
b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYT4mIG1lZGlhQXJy
YXkpCit7CisgICAgTWVkaWFMaXN0KiBtZWRpYUxpc3Q7CisgICAgQ1NTUnVsZSogcGFyZW50UnVs
ZSA9ICZydWxlOworICAgIFN0cmluZyBzb3VyY2VVUkw7CisgICAgd2hpbGUgKHBhcmVudFJ1bGUp
IHsKKyAgICAgICAgQ1NTU3R5bGVTaGVldCogcGFyZW50U3R5bGVTaGVldCA9IG51bGxwdHI7Cisg
ICAgICAgIGJvb2wgaXNNZWRpYVJ1bGUgPSB0cnVlOworICAgICAgICBpZiAoaXM8Q1NTTWVkaWFS
dWxlPigqcGFyZW50UnVsZSkpIHsKKyAgICAgICAgICAgIENTU01lZGlhUnVsZSYgbWVkaWFSdWxl
ID0gZG93bmNhc3Q8Q1NTTWVkaWFSdWxlPigqcGFyZW50UnVsZSk7CisgICAgICAgICAgICBtZWRp
YUxpc3QgPSBtZWRpYVJ1bGUubWVkaWEoKTsKKyAgICAgICAgICAgIHBhcmVudFN0eWxlU2hlZXQg
PSBtZWRpYVJ1bGUucGFyZW50U3R5bGVTaGVldCgpOworICAgICAgICB9IGVsc2UgaWYgKGlzPENT
U0ltcG9ydFJ1bGU+KCpwYXJlbnRSdWxlKSkgeworICAgICAgICAgICAgQ1NTSW1wb3J0UnVsZSYg
aW1wb3J0UnVsZSA9IGRvd25jYXN0PENTU0ltcG9ydFJ1bGU+KCpwYXJlbnRSdWxlKTsKKyAgICAg
ICAgICAgIG1lZGlhTGlzdCA9ICZpbXBvcnRSdWxlLm1lZGlhKCk7CisgICAgICAgICAgICBwYXJl
bnRTdHlsZVNoZWV0ID0gaW1wb3J0UnVsZS5wYXJlbnRTdHlsZVNoZWV0KCk7CisgICAgICAgICAg
ICBpc01lZGlhUnVsZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1lZGlh
TGlzdCA9IG51bGxwdHI7CisKKyAgICAgICAgaWYgKHBhcmVudFN0eWxlU2hlZXQpIHsKKyAgICAg
ICAgICAgIHNvdXJjZVVSTCA9IHBhcmVudFN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFzZVVSTCgp
OworICAgICAgICAgICAgaWYgKHNvdXJjZVVSTC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
c291cmNlVVJMID0gSW5zcGVjdG9yRE9NQWdlbnQ6OmRvY3VtZW50VVJMU3RyaW5nKHBhcmVudFN0
eWxlU2hlZXQtPm93bmVyRG9jdW1lbnQoKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
c291cmNlVVJMID0gIiI7CisKKyAgICAgICAgaWYgKG1lZGlhTGlzdCAmJiBtZWRpYUxpc3QtPmxl
bmd0aCgpKQorICAgICAgICAgICAgbWVkaWFBcnJheS5hZGRJdGVtKGJ1aWxkTWVkaWFPYmplY3Qo
Km1lZGlhTGlzdCwgaXNNZWRpYVJ1bGUgPyBNZWRpYUxpc3RTb3VyY2U6Ok1lZGlhUnVsZSA6IE1l
ZGlhTGlzdFNvdXJjZTo6SW1wb3J0UnVsZSwgc291cmNlVVJMKSk7CisKKyAgICAgICAgaWYgKHBh
cmVudFJ1bGUtPnBhcmVudFJ1bGUoKSkKKyAgICAgICAgICAgIHBhcmVudFJ1bGUgPSBwYXJlbnRS
dWxlLT5wYXJlbnRSdWxlKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ1NTU3R5bGVT
aGVldCogc3R5bGVTaGVldCA9IHBhcmVudFJ1bGUtPnBhcmVudFN0eWxlU2hlZXQoKTsKKyAgICAg
ICAgICAgIHdoaWxlIChzdHlsZVNoZWV0KSB7CisgICAgICAgICAgICAgICAgbWVkaWFMaXN0ID0g
c3R5bGVTaGVldC0+bWVkaWEoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFMaXN0ICYmIG1l
ZGlhTGlzdC0+bGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQqIGRvYyA9
IHN0eWxlU2hlZXQtPm93bmVyRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRv
YykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVVSTCA9IGRvYy0+dXJsKCk7CisgICAg
ICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHlsZVNoZWV0LT5jb250ZW50cygpLmJhc2VVUkwo
KS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBzdHlsZVNo
ZWV0LT5jb250ZW50cygpLmJhc2VVUkwoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICAgICAgc291cmNlVVJMID0gIiI7CisgICAgICAgICAgICAgICAgICAg
IG1lZGlhQXJyYXkuYWRkSXRlbShidWlsZE1lZGlhT2JqZWN0KCptZWRpYUxpc3QsIHN0eWxlU2hl
ZXQtPm93bmVyTm9kZSgpID8gTWVkaWFMaXN0U291cmNlOjpMaW5rZWRTaGVldCA6IE1lZGlhTGlz
dFNvdXJjZTo6SW5saW5lU2hlZXQsIHNvdXJjZVVSTCkpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBwYXJlbnRSdWxlID0gc3R5bGVTaGVldC0+b3duZXJSdWxlKCk7CisgICAg
ICAgICAgICAgICAgaWYgKHBhcmVudFJ1bGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIHN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0LT5wYXJlbnRTdHlsZVNoZWV0
KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1JlZjxJbnNwZWN0b3I6
OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+PiBidWls
ZEFycmF5Rm9yUnVsZUxpc3QoU3R5bGVSdWxlTGlzdCYgcnVsZUxpc3QsIFN0eWxlc2hlZXRSdWxl
U2V0JiBzdHlsZXNoZWV0KQoreworICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVjdG9yOjpQcm90b2Nv
bDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPjo6Y3JlYXRlKCk7Cisg
ICAgZm9yIChhdXRvJiBydWxlIDogcnVsZUxpc3QpIHsKKyAgICAgICAgaWYgKCFydWxlKQorICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmVzdWx0LT5hZGRJdGVtKGJ1aWxkT2JqZWN0
Rm9yU3R5bGVSdWxlKCpydWxlLCBzdHlsZXNoZWV0LCBudWxscHRyKSk7CisgICAgfQorICAgIHJl
dHVybiBXVEY6Om1vdmUocmVzdWx0KTsKK30KKworUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTUnVsZT4gYnVpbGRPYmplY3RGb3JTdHlsZVJ1bGUoQ1NTU3R5bGVSdWxlJiBydWxl
LCBTdHlsZXNoZWV0UnVsZVNldCYgc3R5bGVzaGVldCwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAg
ICBhdXRvIHJlc3VsdCA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZTo6Y3JlYXRl
KCkKKyAgICAgICAgLnNldFNlbGVjdG9yTGlzdChzdHlsZXNoZWV0LmJ1aWxkT2JqZWN0Rm9yU2Vs
ZWN0b3JMaXN0KHJ1bGUsIGVsZW1lbnQpKQorICAgICAgICAuc2V0U291cmNlTGluZShydWxlLnN0
eWxlUnVsZSgpLnNvdXJjZUxpbmUoKSkKKyAgICAgICAgLnNldE9yaWdpbihzdHlsZXNoZWV0T3Jp
Z2luVG9Qcm90b2NvbEVudW0oc3R5bGVzaGVldC5vcmlnaW4oKSkpCisgICAgICAgIC5zZXRTdHls
ZShzdHlsZXNoZWV0LmJ1aWxkT2JqZWN0Rm9yU3R5bGUocnVsZS5zdHlsZSgpKSkKKyAgICAgICAg
LnJlbGVhc2UoKTsKKworICAgIC8vICJzb3VyY2VVUkwiIGlzIHByZXNlbnQgb25seSBmb3IgcmVn
dWxhciBydWxlcywgb3RoZXJ3aXNlICJvcmlnaW4iIHNob3VsZCBiZSB1c2VkIGluIHRoZSBmcm9u
dGVuZC4KKyAgICBpZiAoc3R5bGVzaGVldC5vcmlnaW4oKSA9PSBTdHlsZVNoZWV0T3JpZ2luOjpB
dXRob3IpCisgICAgICAgIHJlc3VsdC0+c2V0U291cmNlVVJMKHN0eWxlc2hlZXQuZmluYWxVUkwo
KSk7CisKKyAgICBpZiAoc3R5bGVzaGVldC5jYW5CaW5kKCkpIHsKKyAgICAgICAgQ1NTSWQgaWQo
c3R5bGVzaGVldC5ydWxlSWQocnVsZSkpOworICAgICAgICBpZiAoIWlkLmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIHJlc3VsdC0+c2V0UnVsZUlkKGlkLmFzUHJvdG9jb2xWYWx1ZTxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OkNTU1J1bGVJZD4oKSk7CisgICAgfQorCisgICAgYXV0byBtZWRpYUFy
cmF5ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpDU1NNZWRpYT46OmNyZWF0ZSgpOworCisgICAgZmlsbE1lZGlhTGlzdENoYWluKHJ1bGUsIG1l
ZGlhQXJyYXkuZ2V0KCkpOworICAgIGlmIChtZWRpYUFycmF5LT5sZW5ndGgoKSkKKyAgICAgICAg
cmVzdWx0LT5zZXRNZWRpYShXVEY6Om1vdmUobWVkaWFBcnJheSkpOworCisgICAgcmV0dXJuIFdU
Rjo6bW92ZShyZXN1bHQpOworfQorCitSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpD
U1NSdWxlPiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRPYmplY3RGb3JNYXRjaGVkUnVsZShTdHls
ZVJ1bGUmIHN0eWxlUnVsZSwgU3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgRWxlbWVudCog
ZWxlbWVudCkKK3sKICAgICAvLyBTdHlsZVJ1bGVzIHJldHVybmVkIGJ5IFN0eWxlUmVzb2x2ZXI6
OnN0eWxlUnVsZXNGb3JFbGVtZW50IGxhY2sgcGFyZW50IHBvaW50ZXJzIHNpbmNlIHRoYXQgaW5m
b21hdGlvbiBpcyBub3QgY2hlYXBseSBhdmFpbGFibGUuCiAgICAgLy8gU2luY2UgdGhlIGluc3Bl
Y3RvciB3YW50cyB0byB3YWxrIHRoZSBwYXJlbnQgY2hhaW4sIHdlIGNvbnN0cnVjdCB0aGUgZnVs
bCB3cmFwcGVycyBoZXJlLgotICAgIENTU1N0eWxlUnVsZSogY3Nzb21XcmFwcGVyID0gc3R5bGVS
ZXNvbHZlci5pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkuZ2V0V3JhcHBlckZvclJ1bGVJblNoZWV0
cyhzdHlsZVJ1bGUsIHN0eWxlUmVzb2x2ZXIuZG9jdW1lbnQoKS5zdHlsZVNoZWV0Q29sbGVjdGlv
bigpKTsKLSAgICBpZiAoIWNzc29tV3JhcHBlcikKKyAgICBDU1NTdHlsZVJ1bGUqIHN0eWxlUnVs
ZVdyYXBwZXIgPSBzdHlsZVJlc29sdmVyLmluc3BlY3RvckNTU09NV3JhcHBlcnMoKS5nZXRXcmFw
cGVyRm9yUnVsZUluU2hlZXRzKCZzdHlsZVJ1bGUsIHN0eWxlUmVzb2x2ZXIuZG9jdW1lbnQoKS5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpKTsKKyAgICBpZiAoIXN0eWxlUnVsZVdyYXBwZXIgfHwgIXN0
eWxlUnVsZVdyYXBwZXItPnBhcmVudFN0eWxlU2hlZXQoKSkKICAgICAgICAgcmV0dXJuIG51bGxw
dHI7Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9yU3R5bGVTaGVldCA9IGJpbmRT
dHlsZVNoZWV0KGNzc29tV3JhcHBlci0+cGFyZW50U3R5bGVTaGVldCgpKTsKLSAgICByZXR1cm4g
aW5zcGVjdG9yU3R5bGVTaGVldCA/IGluc3BlY3RvclN0eWxlU2hlZXQtPmJ1aWxkT2JqZWN0Rm9y
UnVsZShjc3NvbVdyYXBwZXIsIGVsZW1lbnQpIDogbnVsbHB0cjsKKworICAgIFN0eWxlc2hlZXRS
dWxlU2V0JiBydWxlU2V0ID0gYmluZFN0eWxlU2hlZXQoKnN0eWxlUnVsZVdyYXBwZXItPnBhcmVu
dFN0eWxlU2hlZXQoKSk7CisgICAgcmV0dXJuIFdlYkNvcmU6OmJ1aWxkT2JqZWN0Rm9yU3R5bGVS
dWxlKCpzdHlsZVJ1bGVXcmFwcGVyLCBydWxlU2V0LCBlbGVtZW50KTsKIH0KIAotUmVmUHRyPElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4gSW5zcGVjdG9yQ1NTQWdlbnQ6OmJ1aWxk
T2JqZWN0Rm9yUnVsZShDU1NTdHlsZVJ1bGUqIHJ1bGUpCitSZWZQdHI8SW5zcGVjdG9yOjpQcm90
b2NvbDo6Q1NTOjpDU1NSdWxlPiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRPYmplY3RGb3JTdHls
ZVJ1bGUoQ1NTU3R5bGVSdWxlJiBydWxlKQogewotICAgIGlmICghcnVsZSkKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0KLSAgICBBU1NFUlQocnVsZS0+cGFyZW50U3R5bGVTaGVldCgpKTsKLSAg
ICBJbnNwZWN0b3JTdHlsZVNoZWV0KiBpbnNwZWN0b3JTdHlsZVNoZWV0ID0gYmluZFN0eWxlU2hl
ZXQocnVsZS0+cGFyZW50U3R5bGVTaGVldCgpKTsKLSAgICByZXR1cm4gaW5zcGVjdG9yU3R5bGVT
aGVldCA/IGluc3BlY3RvclN0eWxlU2hlZXQtPmJ1aWxkT2JqZWN0Rm9yUnVsZShydWxlLCBudWxs
cHRyKSA6IG51bGxwdHI7CisgICAgQVNTRVJUKHJ1bGUucGFyZW50U3R5bGVTaGVldCgpKTsKKyAg
ICBTdHlsZXNoZWV0UnVsZVNldCYgcnVsZVNldCA9IGJpbmRTdHlsZVNoZWV0KCpydWxlLnBhcmVu
dFN0eWxlU2hlZXQoKSk7CisgICAgcmV0dXJuIFdlYkNvcmU6OmJ1aWxkT2JqZWN0Rm9yU3R5bGVS
dWxlKHJ1bGUsIHJ1bGVTZXQsIG51bGxwdHIpOwogfQogCiBSZWZQdHI8SW5zcGVjdG9yOjpQcm90
b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpSdWxlTWF0Y2g+PiBJbnNwZWN0
b3JDU1NBZ2VudDo6YnVpbGRBcnJheUZvck1hdGNoZWRSdWxlTGlzdChjb25zdCBWZWN0b3I8UmVm
UHRyPFN0eWxlUnVsZT4+JiBtYXRjaGVkUnVsZXMsIFN0eWxlUmVzb2x2ZXImIHN0eWxlUmVzb2x2
ZXIsIEVsZW1lbnQqIGVsZW1lbnQpCkBAIC05NDcsNyArMTExNSwxMCBAQCBSZWZQdHI8SW5zcGVj
dG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpSdWxlTWF0Y2g+
PiBJbnNwZWN0bwogICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZWxlbWVudC0+
ZG9jdW1lbnQoKSk7CiAKICAgICBmb3IgKGF1dG8mIG1hdGNoZWRSdWxlIDogbWF0Y2hlZFJ1bGVz
KSB7Ci0gICAgICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+IHJ1
bGVPYmplY3QgPSBidWlsZE9iamVjdEZvclJ1bGUobWF0Y2hlZFJ1bGUuZ2V0KCksIHN0eWxlUmVz
b2x2ZXIsIGVsZW1lbnQpOworICAgICAgICBpZiAoIW1hdGNoZWRSdWxlKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
UnVsZT4gcnVsZU9iamVjdCA9IGJ1aWxkT2JqZWN0Rm9yTWF0Y2hlZFJ1bGUoKm1hdGNoZWRSdWxl
LCBzdHlsZVJlc29sdmVyLCBlbGVtZW50KTsKICAgICAgICAgaWYgKCFydWxlT2JqZWN0KQogICAg
ICAgICAgICAgY29udGludWU7CiAKQEAgLTk3MiwyMiArMTE0MywyMSBAQCBSZWZQdHI8SW5zcGVj
dG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpSdWxlTWF0Y2g+
PiBJbnNwZWN0bwogICAgIHJldHVybiBXVEY6Om1vdmUocmVzdWx0KTsKIH0KIAotUmVmUHRyPElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IEluc3BlY3RvckNTU0FnZW50OjpidWls
ZE9iamVjdEZvckF0dHJpYnV0ZXNTdHlsZShFbGVtZW50KiBlbGVtZW50KQorUmVmUHRyPEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IEluc3BlY3RvckNTU0FnZW50OjpidWlsZE9i
amVjdEZvckF0dHJpYnV0ZXNTdHlsZShFbGVtZW50JiBlbGVtZW50KQogewotICAgIEFTU0VSVChl
bGVtZW50KTsKLSAgICBpZiAoIWlzPFN0eWxlZEVsZW1lbnQ+KCplbGVtZW50KSkKKyAgICBpZiAo
IWlzPFN0eWxlZEVsZW1lbnQ+KGVsZW1lbnQpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAog
ICAgIC8vIEZJWE1FOiBVZ2xpbmVzcyBiZWxvdy4KLSAgICBTdHlsZVByb3BlcnRpZXMqIGF0dHJp
YnV0ZVN0eWxlID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnRpZXMqPihkb3duY2FzdDxTdHlsZWRF
bGVtZW50PihlbGVtZW50KS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisgICAgU3R5
bGVQcm9wZXJ0aWVzKiBhdHRyaWJ1dGVTdHlsZSA9IGNvbnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0aWVz
Kj4oZG93bmNhc3Q8U3R5bGVkRWxlbWVudD4oZWxlbWVudCkucHJlc2VudGF0aW9uQXR0cmlidXRl
U3R5bGUoKSk7CiAgICAgaWYgKCFhdHRyaWJ1dGVTdHlsZSkKICAgICAgICAgcmV0dXJuIG51bGxw
dHI7CiAKICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihhdHRyaWJ1dGVTdHls
ZS0+aXNNdXRhYmxlKCkpOwogICAgIE11dGFibGVTdHlsZVByb3BlcnRpZXMqIG11dGFibGVBdHRy
aWJ1dGVTdHlsZSA9IHN0YXRpY19jYXN0PE11dGFibGVTdHlsZVByb3BlcnRpZXMqPihhdHRyaWJ1
dGVTdHlsZSk7CiAKLSAgICBSZWY8SW5zcGVjdG9yU3R5bGU+IGluc3BlY3RvclN0eWxlID0gSW5z
cGVjdG9yU3R5bGU6OmNyZWF0ZShJbnNwZWN0b3JDU1NJZCgpLCBtdXRhYmxlQXR0cmlidXRlU3R5
bGUtPmVuc3VyZUNTU1N0eWxlRGVjbGFyYXRpb24oKSwgbnVsbHB0cik7Ci0gICAgcmV0dXJuIGlu
c3BlY3RvclN0eWxlLT5idWlsZE9iamVjdEZvclN0eWxlKCk7CisgICAgUmVmPEluc3BlY3Rvcjo6
U3R5bGVSdWxlPiBzdHlsZVJ1bGUgPSBJbnNwZWN0b3I6OlN0eWxlUnVsZTo6Y3JlYXRlKENTU0lk
KCksICptdXRhYmxlQXR0cmlidXRlU3R5bGUtPmVuc3VyZUNTU1N0eWxlRGVjbGFyYXRpb24oKSwg
bnVsbHB0cik7CisgICAgcmV0dXJuIHN0eWxlUnVsZS0+YnVpbGRPYmplY3RGb3JTdHlsZSgpOwog
fQogCiBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpSZWdpb24+PiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRBcnJheUZvclJlZ2lvbnMo
RXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBSZWZQdHI8Tm9kZUxpc3Q+JiYgcmVnaW9uTGlzdCwg
aW50IGRvY3VtZW50Tm9kZUlkKQpAQCAtMTA0OCw3ICsxMjE4LDcgQEAgUmVmUHRyPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6TmFtZWRGbG93PiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRPYmpl
Y3RGb3JOYW0KIHZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmRpZFJlbW92ZURvY3VtZW50KERvY3Vt
ZW50KiBkb2N1bWVudCkKIHsKICAgICBpZiAoZG9jdW1lbnQpCi0gICAgICAgIG1fZG9jdW1lbnRU
b0luc3BlY3RvclN0eWxlU2hlZXQucmVtb3ZlKGRvY3VtZW50KTsKKyAgICAgICAgbV9kb2N1bWVu
dFRvSW5zcGVjdG9yUnVsZVNldE1hcC5yZW1vdmUoZG9jdW1lbnQpOwogfQogCiB2b2lkIEluc3Bl
Y3RvckNTU0FnZW50OjpkaWRSZW1vdmVET01Ob2RlKE5vZGUqIG5vZGUpCkBAIC0xMDYwLDEyICsx
MjMwLDEwIEBAIHZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmRpZFJlbW92ZURPTU5vZGUoTm9kZSog
bm9kZSkKICAgICBpZiAobm9kZUlkKQogICAgICAgICBtX25vZGVJZFRvRm9yY2VkUHNldWRvU3Rh
dGUucmVtb3ZlKG5vZGVJZCk7CiAKLSAgICBOb2RlVG9JbnNwZWN0b3JTdHlsZVNoZWV0OjppdGVy
YXRvciBpdCA9IG1fbm9kZVRvSW5zcGVjdG9yU3R5bGVTaGVldC5maW5kKG5vZGUpOwotICAgIGlm
IChpdCA9PSBtX25vZGVUb0luc3BlY3RvclN0eWxlU2hlZXQuZW5kKCkpCisgICAgUmVmUHRyPElu
bGluZVN0eWxlUnVsZVNldD4gZm91bmRSdWxlU2V0ID0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFw
LnRha2Uobm9kZSk7CisgICAgaWYgKCFmb3VuZFJ1bGVTZXQpCiAgICAgICAgIHJldHVybjsKLQot
ICAgIG1faWRUb0luc3BlY3RvclN0eWxlU2hlZXQucmVtb3ZlKGl0LT52YWx1ZS0+aWQoKSk7Ci0g
ICAgbV9ub2RlVG9JbnNwZWN0b3JTdHlsZVNoZWV0LnJlbW92ZShub2RlKTsKKyAgICBtX2lkZW50
aWZpZXJUb1J1bGVTZXRNYXAucmVtb3ZlKGZvdW5kUnVsZVNldC0+aWRlbnRpZmllcigpKTsKIH0K
IAogdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6ZGlkTW9kaWZ5RE9NQXR0cihFbGVtZW50KiBlbGVt
ZW50KQpAQCAtMTA3MywzMCArMTI0MSwzMSBAQCB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpkaWRN
b2RpZnlET01BdHRyKEVsZW1lbnQqIGVsZW1lbnQpCiAgICAgaWYgKCFlbGVtZW50KQogICAgICAg
ICByZXR1cm47CiAKLSAgICBOb2RlVG9JbnNwZWN0b3JTdHlsZVNoZWV0OjppdGVyYXRvciBpdCA9
IG1fbm9kZVRvSW5zcGVjdG9yU3R5bGVTaGVldC5maW5kKGVsZW1lbnQpOwotICAgIGlmIChpdCA9
PSBtX25vZGVUb0luc3BlY3RvclN0eWxlU2hlZXQuZW5kKCkpCisgICAgYXV0byBmaW5kUmVzdWx0
ID0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFwLmZpbmQoZWxlbWVudCk7CisgICAgaWYgKGZpbmRS
ZXN1bHQgPT0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFwLmVuZCgpKQogICAgICAgICByZXR1cm47
CiAKLSAgICBpdC0+dmFsdWUtPmRpZE1vZGlmeUVsZW1lbnRBdHRyaWJ1dGUoKTsKKyAgICBmaW5k
UmVzdWx0LT52YWx1ZS0+ZGlkTW9kaWZ5RWxlbWVudEF0dHJpYnV0ZSgpOwogfQogCi12b2lkIElu
c3BlY3RvckNTU0FnZW50OjpzdHlsZVNoZWV0Q2hhbmdlZChJbnNwZWN0b3JTdHlsZVNoZWV0JiBz
dHlsZVNoZWV0KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6c3R5bGVTaGVldENoYW5nZWQoU3R5
bGVzaGVldFJ1bGVTZXQmIHN0eWxlc2hlZXQpCiB7CiAgICAgaWYgKG1fZnJvbnRlbmREaXNwYXRj
aGVyKQotICAgICAgICBtX2Zyb250ZW5kRGlzcGF0Y2hlci0+c3R5bGVTaGVldENoYW5nZWQoc3R5
bGVTaGVldC5pZCgpKTsKKyAgICAgICAgbV9mcm9udGVuZERpc3BhdGNoZXItPnN0eWxlU2hlZXRD
aGFuZ2VkKHN0eWxlc2hlZXQuaWRlbnRpZmllcigpKTsKIH0KIAogdm9pZCBJbnNwZWN0b3JDU1NB
Z2VudDo6cmVzZXRQc2V1ZG9TdGF0ZXMoKQogewogICAgIEhhc2hTZXQ8RG9jdW1lbnQqPiBkb2N1
bWVudHNUb0NoYW5nZTsKLSAgICBmb3IgKE5vZGVJZFRvRm9yY2VkUHNldWRvU3RhdGU6Oml0ZXJh
dG9yIGl0ID0gbV9ub2RlSWRUb0ZvcmNlZFBzZXVkb1N0YXRlLmJlZ2luKCksIGVuZCA9IG1fbm9k
ZUlkVG9Gb3JjZWRQc2V1ZG9TdGF0ZS5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IGlmIChFbGVtZW50KiBlbGVtZW50ID0gZG93bmNhc3Q8RWxlbWVudD4obV9kb21BZ2VudC0+bm9k
ZUZvcklkKGl0LT5rZXkpKSkKLSAgICAgICAgICAgIGRvY3VtZW50c1RvQ2hhbmdlLmFkZCgmZWxl
bWVudC0+ZG9jdW1lbnQoKSk7CisgICAgZm9yIChhdXRvJiBub2RlSWQgOiBtX25vZGVJZFRvRm9y
Y2VkUHNldWRvU3RhdGUua2V5cygpKSB7CisgICAgICAgIE5vZGUqIG5vZGUgPSBtX2RvbUFnZW50
LT5ub2RlRm9ySWQobm9kZUlkKTsKKyAgICAgICAgaWYgKGlzPEVsZW1lbnQ+KG5vZGUpKQorICAg
ICAgICAgICAgZG9jdW1lbnRzVG9DaGFuZ2UuYWRkKCZkb3duY2FzdDxFbGVtZW50Pihub2RlKS0+
ZG9jdW1lbnQoKSk7CiAgICAgfQogCiAgICAgbV9ub2RlSWRUb0ZvcmNlZFBzZXVkb1N0YXRlLmNs
ZWFyKCk7Ci0gICAgZm9yIChIYXNoU2V0PERvY3VtZW50Kj46Oml0ZXJhdG9yIGl0ID0gZG9jdW1l
bnRzVG9DaGFuZ2UuYmVnaW4oKSwgZW5kID0gZG9jdW1lbnRzVG9DaGFuZ2UuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkKLSAgICAgICAgKCppdCktPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0
eWxlSW1tZWRpYXRlbHkpOworICAgIGZvciAoRG9jdW1lbnQqIGRvY3VtZW50IDogZG9jdW1lbnRz
VG9DaGFuZ2UpCisgICAgICAgIGRvY3VtZW50LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNT
dHlsZUltbWVkaWF0ZWx5KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmggYi9Tb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaAppbmRleCBiMzMxYTc3Li5iOWRl
ZTE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdl
bnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaApA
QCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCiAjaW5jbHVkZSAiQ29u
dGVudFNlY3VyaXR5UG9saWN5LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9yRE9NQWdlbnQuaCIKLSNp
bmNsdWRlICJJbnNwZWN0b3JTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVz
aGVldFJ1bGVTZXQuaCIKICNpbmNsdWRlICJJbnNwZWN0b3JXZWJBZ2VudEJhc2UuaCIKICNpbmNs
dWRlICJTZWN1cml0eUNvbnRleHQuaCIKICNpbmNsdWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXJzLmg+CkBAIC00MCw2ICs0MCw3IEBACiAKIG5hbWVzcGFjZSBJbnNwZWN0
b3IgewogY2xhc3MgQ1NTRnJvbnRlbmREaXNwYXRjaGVyOworY2xhc3MgSW5saW5lU3R5bGVSdWxl
U2V0OwogfQogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC02NSw3ICs2Niw3IEBAIGNsYXNzIElu
c3BlY3RvckNTU0FnZW50IGZpbmFsCiAgICAgOiBwdWJsaWMgSW5zcGVjdG9yQWdlbnRCYXNlCiAg
ICAgLCBwdWJsaWMgSW5zcGVjdG9yRE9NQWdlbnQ6OkRPTUxpc3RlbmVyCiAgICAgLCBwdWJsaWMg
SW5zcGVjdG9yOjpDU1NCYWNrZW5kRGlzcGF0Y2hlckhhbmRsZXIKLSAgICAsIHB1YmxpYyBJbnNw
ZWN0b3JTdHlsZVNoZWV0OjpMaXN0ZW5lciB7CisgICAgLCBwdWJsaWMgSW5zcGVjdG9yOjpTdHls
ZXNoZWV0UnVsZVNldDo6TGlzdGVuZXIgewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEluc3Bl
Y3RvckNTU0FnZW50KTsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKQEAg
LTg5LDggKzkwLDYgQEAgcHVibGljOgogICAgIEluc3BlY3RvckNTU0FnZW50KEluc3RydW1lbnRp
bmdBZ2VudHMqLCBJbnNwZWN0b3JET01BZ2VudCopOwogICAgIHZpcnR1YWwgfkluc3BlY3RvckNT
U0FnZW50KCk7CiAKLSAgICBzdGF0aWMgQ1NTU3R5bGVSdWxlKiBhc0NTU1N0eWxlUnVsZShDU1NS
dWxlJik7Ci0KICAgICB2aXJ0dWFsIHZvaWQgZGlkQ3JlYXRlRnJvbnRlbmRBbmRCYWNrZW5kKElu
c3BlY3Rvcjo6RnJvbnRlbmRDaGFubmVsKiwgSW5zcGVjdG9yOjpCYWNrZW5kRGlzcGF0Y2hlciop
IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCB3aWxsRGVzdHJveUZyb250ZW5kQW5kQmFja2Vu
ZChJbnNwZWN0b3I6OkRpc2Nvbm5lY3RSZWFzb24pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9p
ZCBkaXNjYXJkQWdlbnQoKSBvdmVycmlkZTsKQEAgLTExMiw5ICsxMTEsOSBAQCBwdWJsaWM6CiAg
ICAgdmlydHVhbCB2b2lkIGdldElubGluZVN0eWxlc0Zvck5vZGUoRXJyb3JTdHJpbmcmLCBpbnQg
bm9kZUlkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4mIGlubGlu
ZVN0eWxlLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4mIGF0dHJp
YnV0ZXMpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCBnZXRNYXRjaGVkU3R5bGVzRm9yTm9k
ZShFcnJvclN0cmluZyYsIGludCBub2RlSWQsIGNvbnN0IGJvb2wqIGluY2x1ZGVQc2V1ZG8sIGNv
bnN0IGJvb2wqIGluY2x1ZGVJbmhlcml0ZWQsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpB
cnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlJ1bGVNYXRjaD4+JiBtYXRjaGVkQ1NTUnVs
ZXMsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29s
OjpDU1M6OlBzZXVkb0lkTWF0Y2hlcz4+JiBwc2V1ZG9JZE1hdGNoZXMsIFJlZlB0cjxJbnNwZWN0
b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkluaGVyaXRlZFN0
eWxlRW50cnk+PiYgaW5oZXJpdGVkRW50cmllcykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lk
IGdldEFsbFN0eWxlU2hlZXRzKEVycm9yU3RyaW5nJiwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEhlYWRlcj4+
JiBzdHlsZVNoZWV0SW5mb3MpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgdm9pZCBnZXRTdHlsZVNo
ZWV0KEVycm9yU3RyaW5nJiwgY29uc3QgU3RyaW5nJiBzdHlsZVNoZWV0SWQsIFJlZlB0cjxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRCb2R5PiYgcmVzdWx0KSBvdmVycmlk
ZTsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0U3R5bGVTaGVldFRleHQoRXJyb3JTdHJpbmcmLCBjb25z
dCBTdHJpbmcmIHN0eWxlU2hlZXRJZCwgU3RyaW5nKiByZXN1bHQpIG92ZXJyaWRlOwotICAgIHZp
cnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0cmluZyYsIGNvbnN0IFN0cmluZyYg
c3R5bGVTaGVldElkLCBjb25zdCBTdHJpbmcmIHRleHQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwg
dm9pZCBnZXRTdHlsZVNoZWV0KEVycm9yU3RyaW5nJiwgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpTdHlsZVNoZWV0SWQgc3R5bGVTaGVldElkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6
Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keT4mIHJlc3VsdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2
b2lkIGdldFN0eWxlU2hlZXRUZXh0KEVycm9yU3RyaW5nJiwgSW5zcGVjdG9yOjpQcm90b2NvbDo6
Q1NTOjpTdHlsZVNoZWV0SWQgc3R5bGVTaGVldElkLCBTdHJpbmcqIHJlc3VsdCkgb3ZlcnJpZGU7
CisgICAgdmlydHVhbCB2b2lkIHNldFN0eWxlU2hlZXRUZXh0KEVycm9yU3RyaW5nJiwgSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0SWQgc3R5bGVTaGVldElkLCBjb25zdCBTdHJp
bmcmIHRleHQpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVRleHQoRXJyb3JT
dHJpbmcmLCBjb25zdCBSZWZQdHI8SW5zcGVjdG9yOjpJbnNwZWN0b3JPYmplY3Q+JiYgc3R5bGVJ
ZCwgY29uc3QgU3RyaW5nJiB0ZXh0LCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpD
U1NTdHlsZT4mIHJlc3VsdCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkIHNldFJ1bGVTZWxl
Y3RvcihFcnJvclN0cmluZyYsIGNvbnN0IFJlZlB0cjxJbnNwZWN0b3I6Okluc3BlY3Rvck9iamVj
dD4mJiBydWxlSWQsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3IsIFJlZlB0cjxJbnNwZWN0b3I6OlBy
b3RvY29sOjpDU1M6OkNTU1J1bGU+JiByZXN1bHQpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9p
ZCBhZGRSdWxlKEVycm9yU3RyaW5nJiwgaW50IGNvbnRleHROb2RlSWQsIGNvbnN0IFN0cmluZyYg
c2VsZWN0b3IsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+JiByZXN1
bHQpIG92ZXJyaWRlOwpAQCAtMTIzLDM0ICsxMjIsMzQgQEAgcHVibGljOgogICAgIHZpcnR1YWwg
dm9pZCBnZXROYW1lZEZsb3dDb2xsZWN0aW9uKEVycm9yU3RyaW5nJiwgaW50IGRvY3VtZW50Tm9k
ZUlkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpOYW1lZEZsb3c+PiYgcmVzdWx0KSBvdmVycmlkZTsKIAogcHJpdmF0ZToKLSAgICBj
bGFzcyBTdHlsZVNoZWV0QWN0aW9uOworICAgIGNsYXNzIFN0eWxlUnVsZVNldEFjdGlvbjsKICAg
ICBjbGFzcyBTZXRTdHlsZVNoZWV0VGV4dEFjdGlvbjsKICAgICBjbGFzcyBTZXRTdHlsZVRleHRB
Y3Rpb247CiAgICAgY2xhc3MgU2V0UnVsZVNlbGVjdG9yQWN0aW9uOwogICAgIGNsYXNzIEFkZFJ1
bGVBY3Rpb247CiAKLSAgICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBSZWZQdHI8SW5zcGVjdG9y
U3R5bGVTaGVldD4+IElkVG9JbnNwZWN0b3JTdHlsZVNoZWV0OwotICAgIHR5cGVkZWYgSGFzaE1h
cDxDU1NTdHlsZVNoZWV0KiwgUmVmUHRyPEluc3BlY3RvclN0eWxlU2hlZXQ+PiBDU1NTdHlsZVNo
ZWV0VG9JbnNwZWN0b3JTdHlsZVNoZWV0OwotICAgIHR5cGVkZWYgSGFzaE1hcDxOb2RlKiwgUmVm
UHRyPEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZT4+IE5vZGVUb0luc3BlY3RvclN0
eWxlU2hlZXQ7IC8vIGJvZ3VzICJzdHlsZXNoZWV0cyIgd2l0aCBlbGVtZW50cycgaW5saW5lIHN0
eWxlcwotICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8RG9jdW1lbnQ+LCBSZWZQdHI8SW5zcGVj
dG9yU3R5bGVTaGVldD4+IERvY3VtZW50VG9WaWFJbnNwZWN0b3JTdHlsZVNoZWV0OyAvLyAidmlh
IGluc3BlY3RvciIgc3R5bGVzaGVldHMKKyAgICB0eXBlZGVmIEhhc2hNYXA8dWludDY0X3QsIFJl
ZlB0cjxJbnNwZWN0b3I6OlN0eWxlUnVsZVNldD4+IElkZW50aWZpZXJUb1J1bGVTZXRNYXA7Cisg
ICAgdHlwZWRlZiBIYXNoTWFwPENTU1N0eWxlU2hlZXQqLCBSZWZQdHI8SW5zcGVjdG9yOjpTdHls
ZXNoZWV0UnVsZVNldD4+IENTU1N0eWxlU2hlZXRUb1J1bGVTZXRNYXA7CisgICAgdHlwZWRlZiBI
YXNoTWFwPE5vZGUqLCBSZWZQdHI8SW5zcGVjdG9yOjpJbmxpbmVTdHlsZVJ1bGVTZXQ+PiBOb2Rl
VG9JbmxpbmVSdWxlU2V0TWFwOworICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8RG9jdW1lbnQ+
LCBSZWZQdHI8SW5zcGVjdG9yOjpTdHlsZXNoZWV0UnVsZVNldD4+IERvY3VtZW50VG9JbnNwZWN0
b3JSdWxlU2V0TWFwOyAvLyAidmlhIGluc3BlY3RvciIgc3R5bGVzaGVldHMKICAgICB0eXBlZGVm
IEhhc2hNYXA8aW50LCB1bnNpZ25lZD4gTm9kZUlkVG9Gb3JjZWRQc2V1ZG9TdGF0ZTsKIAogICAg
IHZvaWQgcmVzZXROb25QZXJzaXN0ZW50RGF0YSgpOwotICAgIEluc3BlY3RvclN0eWxlU2hlZXRG
b3JJbmxpbmVTdHlsZSogYXNJbnNwZWN0b3JTdHlsZVNoZWV0KEVsZW1lbnQqIGVsZW1lbnQpOwor
ICAgIEluc3BlY3Rvcjo6SW5saW5lU3R5bGVSdWxlU2V0KiBhc0lubGluZVJ1bGVTZXQoRWxlbWVu
dCYgZWxlbWVudCk7CiAgICAgRWxlbWVudCogZWxlbWVudEZvcklkKEVycm9yU3RyaW5nJiwgaW50
IG5vZGVJZCk7CiAgICAgaW50IGRvY3VtZW50Tm9kZVdpdGhSZXF1ZXN0ZWRGbG93c0lkKERvY3Vt
ZW50Kik7CiAgICAgdm9pZCBjb2xsZWN0U3R5bGVTaGVldHMoQ1NTU3R5bGVTaGVldCYsIEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVT
aGVldEhlYWRlcj4mKTsKIAotICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIGJpbmRTdHlsZVNoZWV0
KENTU1N0eWxlU2hlZXQqKTsKLSAgICBJbnNwZWN0b3JTdHlsZVNoZWV0KiB2aWFJbnNwZWN0b3JT
dHlsZVNoZWV0KERvY3VtZW50KiwgYm9vbCBjcmVhdGVJZkFic2VudCk7Ci0gICAgSW5zcGVjdG9y
U3R5bGVTaGVldCogYXNzZXJ0U3R5bGVTaGVldEZvcklkKEVycm9yU3RyaW5nJiwgY29uc3QgU3Ry
aW5nJik7CisgICAgSW5zcGVjdG9yOjpTdHlsZXNoZWV0UnVsZVNldCYgYmluZFN0eWxlU2hlZXQo
Q1NTU3R5bGVTaGVldCYpOworICAgIEluc3BlY3Rvcjo6U3R5bGVzaGVldFJ1bGVTZXQqIGluc3Bl
Y3RvclJ1bGVTZXRGb3JEb2N1bWVudChEb2N1bWVudCYsIGJvb2wgY3JlYXRlSWZBYnNlbnQpOwor
ICAgIEluc3BlY3Rvcjo6U3R5bGVSdWxlU2V0KiBydWxlU2V0Rm9yU3R5bGVzaGVldElkKEVycm9y
U3RyaW5nJiwgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0SWQpOwogCi0gICAg
U3R5bGVTaGVldE9yaWdpbiBkZXRlY3RPcmlnaW4oQ1NTU3R5bGVTaGVldCogcGFnZVN0eWxlU2hl
ZXQsIERvY3VtZW50KiBvd25lckRvY3VtZW50KTsKKyAgICBJbnNwZWN0b3I6OlN0eWxlU2hlZXRP
cmlnaW4gZGV0ZWN0T3JpZ2luKENTU1N0eWxlU2hlZXQmIHBhZ2VTdHlsZVNoZWV0LCBEb2N1bWVu
dCogb3duZXJEb2N1bWVudCk7CiAKLSAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpDU1NSdWxlPiBidWlsZE9iamVjdEZvclJ1bGUoU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciYs
IEVsZW1lbnQqKTsKLSAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxl
PiBidWlsZE9iamVjdEZvclJ1bGUoQ1NTU3R5bGVSdWxlKik7CisgICAgUmVmUHRyPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4gYnVpbGRPYmplY3RGb3JNYXRjaGVkUnVsZShTdHls
ZVJ1bGUmLCBTdHlsZVJlc29sdmVyJiwgRWxlbWVudCopOworICAgIFJlZlB0cjxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+IGJ1aWxkT2JqZWN0Rm9yU3R5bGVSdWxlKENTU1N0eWxl
UnVsZSYpOwogICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OlJ1bGVNYXRjaD4+IGJ1aWxkQXJyYXlGb3JNYXRjaGVkUnVsZUxpc3Qo
Y29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVJ1bGU+PiYsIFN0eWxlUmVzb2x2ZXImLCBFbGVtZW50
Kik7Ci0gICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGJ1aWxk
T2JqZWN0Rm9yQXR0cmlidXRlc1N0eWxlKEVsZW1lbnQqKTsKKyAgICBSZWZQdHI8SW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4gYnVpbGRPYmplY3RGb3JBdHRyaWJ1dGVzU3R5bGUo
RWxlbWVudCYpOwogICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OlJlZ2lvbj4+IGJ1aWxkQXJyYXlGb3JSZWdpb25zKEVycm9yU3Ry
aW5nJiwgUmVmUHRyPE5vZGVMaXN0PiYmLCBpbnQgZG9jdW1lbnROb2RlSWQpOwogICAgIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6Ok5hbWVkRmxvdz4gYnVpbGRPYmplY3RGb3JOYW1l
ZEZsb3coRXJyb3JTdHJpbmcmLCBXZWJLaXROYW1lZEZsb3cqLCBpbnQgZG9jdW1lbnROb2RlSWQp
OwogCkBAIC0xNjAsNyArMTU5LDcgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgZGlkTW9k
aWZ5RE9NQXR0cihFbGVtZW50Kikgb3ZlcnJpZGU7CiAKICAgICAvLyBJbnNwZWN0b3JDU1NBZ2Vu
dDo6TGlzdGVuZXIgaW1wbGVtZW50YXRpb24KLSAgICB2aXJ0dWFsIHZvaWQgc3R5bGVTaGVldENo
YW5nZWQoSW5zcGVjdG9yU3R5bGVTaGVldCYpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBz
dHlsZVNoZWV0Q2hhbmdlZChJbnNwZWN0b3I6OlN0eWxlc2hlZXRSdWxlU2V0Jikgb3ZlcnJpZGU7
CiAKICAgICB2b2lkIHJlc2V0UHNldWRvU3RhdGVzKCk7CiAKQEAgLTE2OCwxNyArMTY3LDI3IEBA
IHByaXZhdGU6CiAgICAgUmVmUHRyPEluc3BlY3Rvcjo6Q1NTQmFja2VuZERpc3BhdGNoZXI+IG1f
YmFja2VuZERpc3BhdGNoZXI7CiAgICAgSW5zcGVjdG9yRE9NQWdlbnQqIG1fZG9tQWdlbnQ7CiAK
LSAgICBJZFRvSW5zcGVjdG9yU3R5bGVTaGVldCBtX2lkVG9JbnNwZWN0b3JTdHlsZVNoZWV0Owot
ICAgIENTU1N0eWxlU2hlZXRUb0luc3BlY3RvclN0eWxlU2hlZXQgbV9jc3NTdHlsZVNoZWV0VG9J
bnNwZWN0b3JTdHlsZVNoZWV0OwotICAgIE5vZGVUb0luc3BlY3RvclN0eWxlU2hlZXQgbV9ub2Rl
VG9JbnNwZWN0b3JTdHlsZVNoZWV0OwotICAgIERvY3VtZW50VG9WaWFJbnNwZWN0b3JTdHlsZVNo
ZWV0IG1fZG9jdW1lbnRUb0luc3BlY3RvclN0eWxlU2hlZXQ7CisgICAgSWRlbnRpZmllclRvUnVs
ZVNldE1hcCBtX2lkZW50aWZpZXJUb1J1bGVTZXRNYXA7CisgICAgQ1NTU3R5bGVTaGVldFRvUnVs
ZVNldE1hcCBtX2Nzc1N0eWxlU2hlZXRUb1J1bGVTZXRNYXA7CisgICAgTm9kZVRvSW5saW5lUnVs
ZVNldE1hcCBtX25vZGVUb0lubGluZVJ1bGVTZXRNYXA7CisgICAgRG9jdW1lbnRUb0luc3BlY3Rv
clJ1bGVTZXRNYXAgbV9kb2N1bWVudFRvSW5zcGVjdG9yUnVsZVNldE1hcDsKKwogICAgIE5vZGVJ
ZFRvRm9yY2VkUHNldWRvU3RhdGUgbV9ub2RlSWRUb0ZvcmNlZFBzZXVkb1N0YXRlOwogICAgIEhh
c2hTZXQ8aW50PiBtX25hbWVkRmxvd0NvbGxlY3Rpb25zUmVxdWVzdGVkOwogICAgIHN0ZDo6dW5p
cXVlX3B0cjxDaGFuZ2VSZWdpb25PdmVyc2V0VGFzaz4gbV9jaGFuZ2VSZWdpb25PdmVyc2V0VGFz
azsKLQotICAgIGludCBtX2xhc3RTdHlsZVNoZWV0SWQ7CiB9OwogCisvLyBUT0RPOiByZW1vdmUg
dGhlc2UgZGVjbGFyYXRpb25zIHdoZW4gdGhlaXIgdXNlcyBhcmUgcmVtb3ZlZCBmcm9tIEluc3Bl
Y3RvclN0eWxlU2hlZXQuY3BwLgorY2xhc3MgTWVkaWFMaXN0OworCitJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW4gc3R5bGVzaGVldE9yaWdpblRvUHJvdG9jb2xFbnVt
KEluc3BlY3Rvcjo6U3R5bGVTaGVldE9yaWdpbiBvcmlnaW4pOworSW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlIG1lZGlhTGlzdFNvdXJjZVRvUHJvdG9jb2xFbnVtKElu
c3BlY3Rvcjo6TWVkaWFMaXN0U291cmNlIHNvdXJjZSk7CitSZWZQdHI8SW5zcGVjdG9yOjpQcm90
b2NvbDo6Q1NTOjpTb3VyY2VSYW5nZT4gYnVpbGRTb3VyY2VSYW5nZU9iamVjdChjb25zdCBTb3Vy
Y2VSYW5nZSYgcmFuZ2UsIFZlY3RvcjxzaXplX3Q+JiBsaW5lRW5kaW5ncyk7CitSZWY8SW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYT4gYnVpbGRNZWRpYU9iamVjdChjb25zdCBNZWRp
YUxpc3QmIG1lZGlhLCBJbnNwZWN0b3I6Ok1lZGlhTGlzdFNvdXJjZSBtZWRpYUxpc3RTb3VyY2Us
IGNvbnN0IFN0cmluZyYgc291cmNlVVJMKTsKK3ZvaWQgZmlsbE1lZGlhTGlzdENoYWluKENTU1J1
bGUmIHJ1bGUsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTTWVkaWE+JiBtZWRpYUFycmF5KTsKK1JlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpB
cnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+PiBidWlsZEFycmF5Rm9yUnVs
ZUxpc3QoU3R5bGVSdWxlTGlzdCYgcnVsZUxpc3QsIEluc3BlY3Rvcjo6U3R5bGVzaGVldFJ1bGVT
ZXQmKTsKK1JlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+IGJ1aWxkT2Jq
ZWN0Rm9yU3R5bGVSdWxlKENTU1N0eWxlUnVsZSYgcnVsZSwgSW5zcGVjdG9yOjpTdHlsZXNoZWV0
UnVsZVNldCYgc3R5bGVzaGVldCwgRWxlbWVudCogZWxlbWVudCk7CisKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKIAogI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvckNTU0FnZW50X2gpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTSWQuaCBiL1NvdXJj
ZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NJZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjRhNzRiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTSWQuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IFVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgSW5zcGVjdG9yQ1NTSWRfaAorI2RlZmluZSBJbnNwZWN0b3JDU1NJZF9oCisKKyNpbmNs
dWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHd0Zi9S
ZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIElu
c3BlY3RvciB7CisKK2NsYXNzIENTU0lkIHsKK3B1YmxpYzoKKyAgICBDU1NJZCgpIHsgfQorCisg
ICAgZXhwbGljaXQgQ1NTSWQoY29uc3QgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4mJiB2YWx1ZSkK
KyAgICB7CisgICAgICAgIGlmICghdmFsdWUtPmdldEludGVnZXIoQVNDSUlMaXRlcmFsKCJzdHls
ZVNoZWV0SWQiKSwgbV9zdHlsZXNoZWV0SWQpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIGlmICghdmFsdWUtPmdldEludGVnZXIoQVNDSUlMaXRlcmFsKCJvcmRpbmFsIiksIG1fcnVs
ZU9yZGluYWwpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENTU0lkKHVpbnQ2
NF90IHN0eWxlc2hlZXRJZCwgdWludDY0X3QgcnVsZU9yZGluYWwpCisgICAgICAgIDogbV9zdHls
ZXNoZWV0SWQoc3R5bGVzaGVldElkKQorICAgICAgICAsIG1fcnVsZU9yZGluYWwocnVsZU9yZGlu
YWwpCisgICAgeworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFt
X3N0eWxlc2hlZXRJZDsgfQorCisgICAgdWludDY0X3Qgc3R5bGVzaGVldElkKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdHlsZXNoZWV0SWQ7IH0KKyAgICB1aW50NjRfdCBydWxlT3JkaW5hbCgpIGNvbnN0
IHsgcmV0dXJuIG1fcnVsZU9yZGluYWw7IH0KKworICAgIC8vIFByb3RvY29sVHlwZSBpcyBlaXRo
ZXIgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZUlkIG9yIEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTUnVsZUlkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByb3RvY29sVHlw
ZT4KKyAgICBSZWZQdHI8UHJvdG9jb2xUeXBlPiBhc1Byb3RvY29sVmFsdWUoKSBjb25zdAorICAg
IHsKKyAgICAgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOwor
CisgICAgICAgIHJldHVybiBQcm90b2NvbFR5cGU6OmNyZWF0ZSgpCisgICAgICAgICAgICAuc2V0
U3R5bGVTaGVldElkKG1fc3R5bGVzaGVldElkKQorICAgICAgICAgICAgLnNldE9yZGluYWwobV9y
dWxlT3JkaW5hbCkKKyAgICAgICAgICAgIC5yZWxlYXNlKCk7CisgICAgfQorCitwcml2YXRlOgor
ICAgIHVpbnQ2NF90IG1fc3R5bGVzaGVldElkIHswfTsKKyAgICB1aW50NjRfdCBtX3J1bGVPcmRp
bmFsIHswfTsKK307CisKK30gLy8gbmFtZXNwYWNlIEluc3BlY3RvcgorCisjZW5kaWYgLy8gSW5z
cGVjdG9yQ1NTSWRfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3Bl
Y3RvcklubGluZVN0eWxlUnVsZVNldC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi43NTc5YTI2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvcklubGluZVN0eWxlUnVsZVNldC5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkluc3BlY3RvcklubGluZVN0eWxl
UnVsZVNldC5oIgorCisjaW5jbHVkZSAiQ1NTU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNTU0FnZW50LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9y
U3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiTm9kZS5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKKworbmFtZXNwYWNlIEluc3BlY3RvciB7CisKK1JlZjxJbmxpbmVTdHlsZVJ1bGVTZXQ+IElu
bGluZVN0eWxlUnVsZVNldDo6Y3JlYXRlKFJlZjxFbGVtZW50PiYmIGVsZW1lbnQpCit7CisgICAg
cmV0dXJuIGFkb3B0UmVmKCpuZXcgSW5saW5lU3R5bGVSdWxlU2V0KFdURjo6bW92ZShlbGVtZW50
KSkpOworfQorCitJbmxpbmVTdHlsZVJ1bGVTZXQ6OklubGluZVN0eWxlUnVsZVNldChSZWY8RWxl
bWVudD4mJiBlbGVtZW50KQorICAgIDogU3R5bGVSdWxlU2V0KCkKKyAgICAsIG1fZWxlbWVudChX
VEY6Om1vdmUoZWxlbWVudCkpCit7Cit9CisKK0lubGluZVN0eWxlUnVsZVNldDo6fklubGluZVN0
eWxlUnVsZVNldCgpIHsgfQorICAgIAordm9pZCBJbmxpbmVTdHlsZVJ1bGVTZXQ6OnJlcGxhY2VU
ZXh0KGNvbnN0IFN0cmluZyYgdGV4dCkKK3sKKyAgICB7CisgICAgICAgIEluc3BlY3RvckNTU0Fn
ZW50OjpJbmxpbmVTdHlsZU92ZXJyaWRlU2NvcGUgb3ZlcnJpZGVTY29wZSgmbV9lbGVtZW50LT5k
b2N1bWVudCgpKTsKKyAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAgICAgICAgbV9lbGVtZW50
LT5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgdGV4dCwgZWMpOworICAgIH0KKworICAgIGNvbW1pdFJ1
bGVTZXRDaGFuZ2UoUGFyc2VkUnVsZVNldERhdGE6OmNyZWF0ZShtX2VsZW1lbnQpKTsKK30KKwor
Ym9vbCBJbmxpbmVTdHlsZVJ1bGVTZXQ6OnNldFRleHRGb3JTdHlsZShDU1NTdHlsZURlY2xhcmF0
aW9uJiBzdHlsZSwgY29uc3QgU3RyaW5nJiBzdHlsZVRleHQpCit7CisgICAgQVNTRVJUX1VOVVNF
RChzdHlsZSwgJnN0eWxlID09IGlubGluZVN0eWxlKCkpOworCisgICAgcmVwbGFjZVRleHQoc3R5
bGVUZXh0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbmxpbmVTdHlsZVJ1bGVTZXQ6
OnNldFRleHRGb3JTdHlsZShjb25zdCBDU1NJZCYgaWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiBz
dHlsZVRleHQsIFN0cmluZyYgb2xkU3R5bGVUZXh0KQoreworICAgIEFTU0VSVF9VTlVTRUQoaWRl
bnRpZmllciwgIWlkZW50aWZpZXIucnVsZU9yZGluYWwoKSk7CisKKyAgICBvbGRTdHlsZVRleHQg
PSBnZXRUZXh0KCk7CisgICAgcmVwbGFjZVRleHQoc3R5bGVUZXh0KTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKyAgICAKK3ZvaWQgSW5saW5lU3R5bGVSdWxlU2V0OjpkaWRNb2RpZnlFbGVtZW50QXR0
cmlidXRlKCkKK3sKKyAgICAvLyBEcm9wIHN0YWxlIHBhcnNlZCBkYXRhIHNpbmNlIGl0IGNhbiBi
ZSByZWdlbmVyYXRlZCB3aGVuIG5lZWRlZC4KKyAgICBjb21taXRSdWxlU2V0Q2hhbmdlKG51bGxw
dHIpOworfQorCitEb2N1bWVudCogSW5saW5lU3R5bGVSdWxlU2V0Ojpvd25lckRvY3VtZW50KCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gJm1fZWxlbWVudC0+ZG9jdW1lbnQoKTsKK30KKworc3RkOjp1
bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRhPiBJbmxpbmVTdHlsZVJ1bGVTZXQ6Om9yaWdpbmFs
U291cmNlRGF0YSgpCit7CisgICAgcmV0dXJuIFBhcnNlZFJ1bGVTZXREYXRhOjpjcmVhdGUobV9l
bGVtZW50LmdldCgpKTsKK30KKworUmVmUHRyPFN0eWxlUnVsZT4gSW5saW5lU3R5bGVSdWxlU2V0
OjppbnNwZWN0b3JTdHlsZUZvcklkKGNvbnN0IENTU0lkJiBpZGVudGlmaWVyKQoreworICAgIEFT
U0VSVF9VTlVTRUQoaWRlbnRpZmllciwgIWlkZW50aWZpZXIucnVsZU9yZGluYWwoKSk7CisKKyAg
ICBpZiAoQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUgPSBpbmxpbmVTdHlsZSgpKQorICAgICAg
ICByZXR1cm4gU3R5bGVSdWxlOjpjcmVhdGUoaWRlbnRpZmllciwgKnN0eWxlLCB0aGlzKTsKKwor
ICAgIHJldHVybiBudWxscHRyOworfQorCitDU1NTdHlsZURlY2xhcmF0aW9uKiBJbmxpbmVTdHls
ZVJ1bGVTZXQ6OmlubGluZVN0eWxlKCkKK3sKKyAgICByZXR1cm4gbV9lbGVtZW50LT5zdHlsZSgp
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmggYi9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNzUyYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbmxpbmVTdHlsZVJ1bGVTZXQuaApAQCAtMCwwICsx
LDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE1IFVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rv
bi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisg
KiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMK
KyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgSW5saW5lU3R5bGVSdWxlU2V0X2gKKyNkZWZpbmUgSW5s
aW5lU3R5bGVSdWxlU2V0X2gKKworI2luY2x1ZGUgIkluc3BlY3RvckNTU0lkLmgiCisjaW5jbHVk
ZSAiSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmgiCisjaW5jbHVkZSA8d3RmL1R5cGVDYXN0cy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOworY2xhc3Mg
RWxlbWVudDsKK3N0cnVjdCBDU1NSdWxlU291cmNlRGF0YTsKK30KKworbmFtZXNwYWNlIEluc3Bl
Y3RvciB7CisKK2NsYXNzIElubGluZVN0eWxlUnVsZVNldCBmaW5hbCA6IHB1YmxpYyBTdHlsZVJ1
bGVTZXQgeworcHVibGljOgorICAgIHN0YXRpYyBSZWY8SW5saW5lU3R5bGVSdWxlU2V0PiBjcmVh
dGUoUmVmPFdlYkNvcmU6OkVsZW1lbnQ+JiYpOworICAgIHZpcnR1YWwgfklubGluZVN0eWxlUnVs
ZVNldCgpOworCisgICAgLy8gU3R5bGVSdWxlU2V0IEFQSQorICAgIHZpcnR1YWwgYm9vbCBpc0lu
bGluZVN0eWxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwg
dm9pZCByZXBsYWNlVGV4dChjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwg
c3RkOjp1bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRhPiBvcmlnaW5hbFNvdXJjZURhdGEoKSBv
dmVycmlkZTsKKyAgICB2aXJ0dWFsIFJlZlB0cjxTdHlsZVJ1bGU+IGluc3BlY3RvclN0eWxlRm9y
SWQoY29uc3QgQ1NTSWQmKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkNTU1N0eWxl
RGVjbGFyYXRpb24qIHN0eWxlRm9ySWQoY29uc3QgQ1NTSWQmIGlkZW50aWZpZXIpIG92ZXJyaWRl
CisgICAgeworICAgICAgICBBU1NFUlRfVU5VU0VEKGlkZW50aWZpZXIsICFpZGVudGlmaWVyLnJ1
bGVPcmRpbmFsKCkpOworICAgICAgICByZXR1cm4gaW5saW5lU3R5bGUoKTsKKyAgICB9CisgICAg
dmlydHVhbCBXZWJDb3JlOjpEb2N1bWVudCogb3duZXJEb2N1bWVudCgpIGNvbnN0IG92ZXJyaWRl
OworCisgICAgLy8gSW5saW5lU3R5bGVSdWxlU2V0IEFQSQorICAgIFdlYkNvcmU6OkNTU1N0eWxl
RGVjbGFyYXRpb24qIGlubGluZVN0eWxlKCk7CisgICAgCisgICAgLy8gQ2FsbGVkIGZyb20gQ1NT
QWdlbnQgdGhyb3VnaCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uCisgICAgdm9pZCBkaWRNb2Rp
ZnlFbGVtZW50QXR0cmlidXRlKCk7CisKK3ByaXZhdGU6CisgICAgSW5saW5lU3R5bGVSdWxlU2V0
KFJlZjxXZWJDb3JlOjpFbGVtZW50PiYmKTsKKworICAgIC8vIEFsc28gYWNjZXNzZWQgYnkgZnJp
ZW5kIGNsYXNzIEluc3BlY3RvclN0eWxlLgorICAgIHZpcnR1YWwgYm9vbCBzZXRUZXh0Rm9yU3R5
bGUoV2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiYsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRl
OworICAgIHZpcnR1YWwgYm9vbCBzZXRUZXh0Rm9yU3R5bGUoY29uc3QgQ1NTSWQmLCBjb25zdCBT
dHJpbmcmIHRleHQsIFN0cmluZyYgb2xkVGV4dCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisKKyAg
ICBSZWY8V2ViQ29yZTo6RWxlbWVudD4gbV9lbGVtZW50OworfTsKKworfSAvLyBuYW1lc3BhY2Ug
SW5zcGVjdG9yCisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oSW5zcGVjdG9yOjpJbmxp
bmVTdHlsZVJ1bGVTZXQpCitzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgSW5zcGVjdG9yOjpTdHls
ZVJ1bGVTZXQmIHJ1bGVTZXQpIHsgcmV0dXJuIHJ1bGVTZXQuaXNJbmxpbmVTdHlsZSgpOyB9CitT
UEVDSUFMSVpFX1RZUEVfVFJBSVRTX0VORCgpCisKKyNlbmRpZiAvLyBJbmxpbmVTdHlsZVJ1bGVT
ZXRfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxl
UHJvcGVydHkuaCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVByb3Bl
cnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YTUxMAotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVByb3Bl
cnR5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBVbml2ZXJz
aXR5IG9mIFdhc2hpbmd0b24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEluc3BlY3RvclN0eWxlUHJv
cGVydHlfaAorI2RlZmluZSBJbnNwZWN0b3JTdHlsZVByb3BlcnR5X2gKKworI2luY2x1ZGUgIkNT
U1Byb3BlcnR5U291cmNlRGF0YS5oIgorCituYW1lc3BhY2UgSW5zcGVjdG9yIHsKKworc3RydWN0
IFN0eWxlUHJvcGVydHkgeworICAgIFN0eWxlUHJvcGVydHkoKSB7IH0KKworICAgIFN0eWxlUHJv
cGVydHkoV2ViQ29yZTo6Q1NTUHJvcGVydHlTb3VyY2VEYXRhIHNvdXJjZURhdGEsIGJvb2wgaGFz
U291cmNlLCBib29sIGRpc2FibGVkKQorICAgICAgICA6IHNvdXJjZURhdGEoc291cmNlRGF0YSkK
KyAgICAgICAgLCBoYXNTb3VyY2UoaGFzU291cmNlKQorICAgICAgICAsIGRpc2FibGVkKGRpc2Fi
bGVkKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIHNldFJhd1RleHRGcm9tU3R5bGVEZWNsYXJh
dGlvbihjb25zdCBTdHJpbmcmIHN0eWxlRGVjbGFyYXRpb24pCisgICAgeworICAgICAgICB1bnNp
Z25lZCBzdGFydCA9IHNvdXJjZURhdGEucmFuZ2Uuc3RhcnQ7CisgICAgICAgIHVuc2lnbmVkIGVu
ZCA9IHNvdXJjZURhdGEucmFuZ2UuZW5kOworICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9J
TVBMSUNBVElPTihzdGFydCA8IGVuZCk7CisgICAgICAgIEFTU0VSVChlbmQgPD0gc3R5bGVEZWNs
YXJhdGlvbi5sZW5ndGgoKSk7CisgICAgICAgIHJhd1RleHQgPSBzdHlsZURlY2xhcmF0aW9uLnN1
YnN0cmluZyhzdGFydCwgZW5kIC0gc3RhcnQpOworICAgIH0KKworICAgIGJvb2wgaGFzUmF3VGV4
dCgpIGNvbnN0IHsgcmV0dXJuICFyYXdUZXh0LmlzRW1wdHkoKTsgfQorCisgICAgV2ViQ29yZTo6
Q1NTUHJvcGVydHlTb3VyY2VEYXRhIHNvdXJjZURhdGE7CisgICAgYm9vbCBoYXNTb3VyY2Uge2Zh
bHNlfTsKKyAgICBib29sIGRpc2FibGVkIHtmYWxzZX07CisgICAgU3RyaW5nIHJhd1RleHQ7Cit9
OworCit9IC8vIG5hbWVzcGFjZSBJbnNwZWN0b3IKKworI2VuZGlmIC8vIEluc3BlY3RvclN0eWxl
UHJvcGVydHlfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rv
clN0eWxlUnVsZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVS
dWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZhMjQ1Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlUnVs
ZS5jcHAKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVy
c2l0eSBvZiBXYXNoaW5ndG9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkluc3BlY3RvclN0eWxlUnVsZS5oIgorCisjaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCisj
aW5jbHVkZSAiQ1NTUHJvcGVydHlTb3VyY2VEYXRhLmgiCisjaW5jbHVkZSAiQ1NTU3R5bGVEZWNs
YXJhdGlvbi5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNTU0FnZW50LmgiCisjaW5jbHVkZSAiSW5z
cGVjdG9yU3R5bGVQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlUnVsZVNldC5o
IgorI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlIDxpbnNwZWN0b3IvQ29udGVudFNlYXJjaFV0
aWxpdGllcy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIEluc3Bl
Y3RvciB7CisKK1JlZjxTdHlsZVJ1bGU+IFN0eWxlUnVsZTo6Y3JlYXRlKGNvbnN0IENTU0lkJiBz
dHlsZUlkLCBSZWY8Q1NTU3R5bGVEZWNsYXJhdGlvbj4mJiBzdHlsZSwgU3R5bGVSdWxlU2V0KiBy
dWxlU2V0KQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFN0eWxlUnVsZShzdHlsZUlkLCBX
VEY6Om1vdmUoc3R5bGUpLCBydWxlU2V0KSk7Cit9CisKK1N0eWxlUnVsZTo6U3R5bGVSdWxlKGNv
bnN0IENTU0lkJiBzdHlsZUlkLCBSZWY8Q1NTU3R5bGVEZWNsYXJhdGlvbj4mJiBzdHlsZSwgU3R5
bGVSdWxlU2V0KiBydWxlU2V0KQorICAgIDogbV9zdHlsZUlkKHN0eWxlSWQpCisgICAgLCBtX3N0
eWxlKFdURjo6bW92ZShzdHlsZSkpCisgICAgLCBtX3J1bGVTZXQocnVsZVNldCkKK3sKK30KKwor
U3R5bGVSdWxlOjp+U3R5bGVSdWxlKCkKK3sKK30KKworUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6Q1NTU3R5bGU+IFN0eWxlUnVsZTo6YnVpbGRPYmplY3RGb3JTdHlsZSgpCit7Cisg
ICAgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IHJlc3VsdCA9IGJ1aWxk
T2JqZWN0Rm9yU3R5bGVXaXRoUHJvcGVydGllcygpOworICAgIGlmICghc3R5bGVJZCgpLmlzRW1w
dHkoKSkKKyAgICAgICAgcmVzdWx0LT5zZXRTdHlsZUlkKHN0eWxlSWQoKS5hc1Byb3RvY29sVmFs
dWU8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZUlkPigpKTsKKworICAgIHJlc3Vs
dC0+c2V0V2lkdGgoY3NzU3R5bGUoKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aWR0aCIpKTsKKyAgICBy
ZXN1bHQtPnNldEhlaWdodChjc3NTdHlsZSgpLmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpKTsK
KworICAgIGlmIChSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHNvdXJjZURhdGEgPSBydWxlU291
cmNlRGF0YSgpKSB7CisgICAgICAgIGF1dG8gbGluZUVuZGluZ3MgPSBDb250ZW50U2VhcmNoVXRp
bGl0aWVzOjpsaW5lRW5kaW5ncyhtX3J1bGVTZXQtPmdldFRleHQoKSk7CisgICAgICAgIHJlc3Vs
dC0+c2V0UmFuZ2UoYnVpbGRTb3VyY2VSYW5nZU9iamVjdChzb3VyY2VEYXRhLT5ydWxlQm9keVJh
bmdlLCAqbGluZUVuZGluZ3MpKTsKKyAgICB9CisKKyAgICByZXR1cm4gV1RGOjptb3ZlKHJlc3Vs
dCk7Cit9CisKK1JlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OkNTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4+IFN0eWxlUnVsZTo6YnVpbGRBcnJh
eUZvckNvbXB1dGVkU3R5bGUoKQoreworICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVjdG9yOjpQcm90
b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJv
cGVydHk+OjpjcmVhdGUoKTsKKyAgICBWZWN0b3I8U3R5bGVQcm9wZXJ0eT4gcHJvcGVydGllczsK
KyAgICBwb3B1bGF0ZUFsbFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICBmb3IgKGF1dG8m
IHByb3BlcnR5IDogcHJvcGVydGllcykgeworICAgICAgICBjb25zdCBDU1NQcm9wZXJ0eVNvdXJj
ZURhdGEmIHNvdXJjZURhdGEgPSBwcm9wZXJ0eS5zb3VyY2VEYXRhOworICAgICAgICBhdXRvIGVu
dHJ5ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk6
OmNyZWF0ZSgpCisgICAgICAgICAgICAuc2V0TmFtZShzb3VyY2VEYXRhLm5hbWUpCisgICAgICAg
ICAgICAuc2V0VmFsdWUoc291cmNlRGF0YS52YWx1ZSkKKyAgICAgICAgICAgIC5yZWxlYXNlKCk7
CisgICAgICAgIHJlc3VsdC0+YWRkSXRlbShXVEY6Om1vdmUoZW50cnkpKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gV1RGOjptb3ZlKHJlc3VsdCk7Cit9CisKK2Jvb2wgU3R5bGVSdWxlOjpnZXRTdHls
ZVRleHQoU3RyaW5nJiByZXN1bHQpCit7CisgICAgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBz
b3VyY2VEYXRhID0gcnVsZVNvdXJjZURhdGEoKTsKKyAgICBpZiAoIXNvdXJjZURhdGEpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIFN0cmluZyBzdHlsZXNoZWV0VGV4dCA9IG1fcnVsZVNl
dC0+Z2V0VGV4dCgpOworICAgIFNvdXJjZVJhbmdlJiBib2R5UmFuZ2UgPSBzb3VyY2VEYXRhLT5y
dWxlQm9keVJhbmdlOworICAgIHJlc3VsdCA9IHN0eWxlc2hlZXRUZXh0LnN1YnN0cmluZyhib2R5
UmFuZ2Uuc3RhcnQsIGJvZHlSYW5nZS5lbmQgLSBib2R5UmFuZ2Uuc3RhcnQpOworICAgIHJldHVy
biB0cnVlOworfQorCitSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IFN0eWxlUnVsZTo6cnVsZVNv
dXJjZURhdGEoKQoreworICAgIHJldHVybiBtX3J1bGVTZXQgPyBtX3J1bGVTZXQtPnNvdXJjZURh
dGFGb3JTdHlsZShtX3N0eWxlLmdldCgpKSA6IG51bGxwdHI7Cit9CisKK1JlZlB0cjxDU1NTdHls
ZVNvdXJjZURhdGE+IFN0eWxlUnVsZTo6c3R5bGVTb3VyY2VEYXRhKCkKK3sKKyAgICBpZiAoIW1f
cnVsZVNldCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBpZiAoUmVmUHRyPENTU1J1
bGVTb3VyY2VEYXRhPiBzb3VyY2VEYXRhID0gbV9ydWxlU2V0LT5zb3VyY2VEYXRhRm9yU3R5bGUo
bV9zdHlsZS5nZXQoKSkpCisgICAgICAgIHJldHVybiBzb3VyY2VEYXRhLT5zdHlsZVNvdXJjZURh
dGE7CisKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworYm9vbCBTdHlsZVJ1bGU6OnBvcHVsYXRl
QWxsUHJvcGVydGllcyhWZWN0b3I8U3R5bGVQcm9wZXJ0eT4mIHJlc3VsdCkKK3sKKyAgICBIYXNo
U2V0PFN0cmluZz4gc291cmNlUHJvcGVydHlOYW1lczsKKworICAgIFJlZlB0cjxDU1NSdWxlU291
cmNlRGF0YT4gc291cmNlRGF0YSA9IHJ1bGVTb3VyY2VEYXRhKCk7CisgICAgaWYgKHNvdXJjZURh
dGEpIHsKKyAgICAgICAgVmVjdG9yPENTU1Byb3BlcnR5U291cmNlRGF0YT4mIHNvdXJjZVByb3Bl
cnR5RGF0YSA9IHNvdXJjZURhdGEtPnN0eWxlU291cmNlRGF0YS0+cHJvcGVydHlEYXRhOworCisg
ICAgICAgIFN0cmluZyBzdHlsZURlY2xhcmF0aW9uOworICAgICAgICBib29sIGlzU3R5bGVUZXh0
S25vd24gPSBnZXRTdHlsZVRleHQoc3R5bGVEZWNsYXJhdGlvbik7CisgICAgICAgIEFTU0VSVF9V
TlVTRUQoaXNTdHlsZVRleHRLbm93biwgaXNTdHlsZVRleHRLbm93bik7CisgICAgICAgIGZvciAo
YXV0byYgZGF0YSA6IHNvdXJjZVByb3BlcnR5RGF0YSkgeworICAgICAgICAgICAgU3R5bGVQcm9w
ZXJ0eSBwcm9wZXJ0eShkYXRhLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBwcm9wZXJ0eS5z
ZXRSYXdUZXh0RnJvbVN0eWxlRGVjbGFyYXRpb24oc3R5bGVEZWNsYXJhdGlvbik7CisgICAgICAg
ICAgICByZXN1bHQuYXBwZW5kKHByb3BlcnR5KTsKKyAgICAgICAgICAgIHNvdXJjZVByb3BlcnR5
TmFtZXMuYWRkKGRhdGEubmFtZS5sb3dlcigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZv
ciAoaW50IGkgPSAwLCBzaXplID0gbV9zdHlsZS0+bGVuZ3RoKCk7IGkgPCBzaXplOyArK2kpIHsK
KyAgICAgICAgU3RyaW5nIG5hbWUgPSBtX3N0eWxlLT5pdGVtKGkpOworICAgICAgICBpZiAoc291
cmNlUHJvcGVydHlOYW1lcy5jb250YWlucyhuYW1lLmxvd2VyKCkpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgc291cmNlUHJvcGVydHlOYW1lcy5hZGQobmFtZS5sb3dlcigpKTsK
KyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5U291cmNlRGF0
YShuYW1lLCBtX3N0eWxlLT5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLCAhbV9zdHlsZS0+Z2V0UHJv
cGVydHlQcmlvcml0eShuYW1lKS5pc0VtcHR5KCksIHRydWUsIFNvdXJjZVJhbmdlKCkpLCBmYWxz
ZSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUmVmPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IFN0eWxlUnVsZTo6YnVpbGRPYmplY3RGb3JTdHls
ZVdpdGhQcm9wZXJ0aWVzKCkKK3sKKyAgICBWZWN0b3I8U3R5bGVQcm9wZXJ0eT4gcHJvcGVydGll
czsKKyAgICBwb3B1bGF0ZUFsbFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICBhdXRvIHBy
b3BlcnRpZXNBcnJheSA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk+OjpjcmVhdGUoKTsKKyAgICBhdXRvIHNob3J0aGFuZEVu
dHJpZXMgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpD
U1M6OlNob3J0aGFuZEVudHJ5Pjo6Y3JlYXRlKCk7CisgICAgSGFzaE1hcDxTdHJpbmcsIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5Pj4gcHJvcGVydHlOYW1lVG9Q
cmV2aW91c0FjdGl2ZVByb3BlcnR5OworICAgIEhhc2hTZXQ8U3RyaW5nPiBmb3VuZFNob3J0aGFu
ZHM7CisgICAgU3RyaW5nIHByZXZpb3VzUHJpb3JpdHk7CisgICAgU3RyaW5nIHByZXZpb3VzU3Rh
dHVzOworICAgIGF1dG8gbGluZUVuZGluZ3MgPSBDb250ZW50U2VhcmNoVXRpbGl0aWVzOjpsaW5l
RW5kaW5ncyhtX3J1bGVTZXQtPmdldFRleHQoKSk7CisgICAgUmVmUHRyPENTU1J1bGVTb3VyY2VE
YXRhPiBzb3VyY2VEYXRhID0gcnVsZVNvdXJjZURhdGEoKTsKKyAgICB1bnNpZ25lZCBydWxlQm9k
eVJhbmdlU3RhcnQgPSBzb3VyY2VEYXRhID8gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5zdGFy
dCA6IDA7CisKKyAgICBmb3IgKGF1dG8mIHByb3BlcnR5IDogcHJvcGVydGllcykgeworICAgICAg
ICBjb25zdCBDU1NQcm9wZXJ0eVNvdXJjZURhdGEmIHByb3BlcnR5RW50cnkgPSBwcm9wZXJ0eS5z
b3VyY2VEYXRhOworICAgICAgICBjb25zdCBTdHJpbmcmIG5hbWUgPSBwcm9wZXJ0eUVudHJ5Lm5h
bWU7CisKKyAgICAgICAgLy8gVmlzdWFsIFN0dWRpbyBkaXNhZ3JlZXMgd2l0aCBvdGhlciBjb21w
aWxlcnMgYXMgdG8gd2hldGhlciAnY2xhc3MnIGlzIG5lZWRlZCBoZXJlLgorI2lmIENPTVBJTEVS
KE1TVkMpCisgICAgICAgIGVudW0gY2xhc3MgUHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0
dXMgc3RhdHVzOworI2Vsc2UKKyAgICAgICAgZW51bSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU1Byb3BlcnR5U3RhdHVzIHN0YXR1czsKKyNlbmRpZgorICAgICAgICBzdGF0dXMgPSBwcm9w
ZXJ0eS5kaXNhYmxlZCA/IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0
dXM6OkRpc2FibGVkIDogSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1
czo6QWN0aXZlOworCisgICAgICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNT
U1Byb3BlcnR5PiBwcm9wZXJ0eU9iamVjdCA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
UHJvcGVydHk6OmNyZWF0ZSgpCisgICAgICAgICAgICAuc2V0TmFtZShuYW1lLmxvd2VyKCkpCisg
ICAgICAgICAgICAuc2V0VmFsdWUocHJvcGVydHlFbnRyeS52YWx1ZSkKKyAgICAgICAgICAgIC5y
ZWxlYXNlKCk7CisKKyAgICAgICAgLy8gRGVmYXVsdCAicGFyc2VkT2siID09IHRydWUuCisgICAg
ICAgIGlmICghcHJvcGVydHlFbnRyeS5wYXJzZWRPaykKKyAgICAgICAgICAgIHByb3BlcnR5T2Jq
ZWN0LT5zZXRQYXJzZWRPayhmYWxzZSk7CisgICAgICAgIGlmIChwcm9wZXJ0eS5oYXNSYXdUZXh0
KCkpCisgICAgICAgICAgICBwcm9wZXJ0eU9iamVjdC0+c2V0VGV4dChwcm9wZXJ0eS5yYXdUZXh0
KTsKKworICAgICAgICAvLyBEZWZhdWx0ICJwcmlvcml0eSIgPT0gIiIuCisgICAgICAgIGlmIChw
cm9wZXJ0eUVudHJ5LmltcG9ydGFudCkKKyAgICAgICAgICAgIHByb3BlcnR5T2JqZWN0LT5zZXRQ
cmlvcml0eSgiaW1wb3J0YW50Iik7CisgICAgICAgIGlmICghcHJvcGVydHkuZGlzYWJsZWQpIHsK
KyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5oYXNTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBB
U1NFUlQoc291cmNlRGF0YSk7CisgICAgICAgICAgICAgICAgcHJvcGVydHlPYmplY3QtPnNldElt
cGxpY2l0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgcmFuZ2UgaXMg
cmVsYXRpdmUgdG8gdGhlIHN0eWxlIGJvZHkgc3RhcnQuCisgICAgICAgICAgICAgICAgLy8gU2hv
dWxkIGJlIGNvbnZlcnRlZCBpbnRvIGFuIGFic29sdXRlIHJhbmdlIChyZWxhdGl2ZSB0byB0aGUg
c3R5bGVzaGVldCBzdGFydCkKKyAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHByb3BlciBjb252
ZXJzaW9uIGludG8gbGluZTpjb2x1bW4uCisgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgYWJz
b2x1dGVQcm9wZXJ0eVJhbmdlID0gcHJvcGVydHlFbnRyeS5yYW5nZTsKKyAgICAgICAgICAgICAg
ICBhYnNvbHV0ZVByb3BlcnR5UmFuZ2Uuc3RhcnQgKz0gcnVsZUJvZHlSYW5nZVN0YXJ0OworICAg
ICAgICAgICAgICAgIGFic29sdXRlUHJvcGVydHlSYW5nZS5lbmQgKz0gcnVsZUJvZHlSYW5nZVN0
YXJ0OworICAgICAgICAgICAgICAgIHByb3BlcnR5T2JqZWN0LT5zZXRSYW5nZShidWlsZFNvdXJj
ZVJhbmdlT2JqZWN0KGFic29sdXRlUHJvcGVydHlSYW5nZSwgKmxpbmVFbmRpbmdzKSk7CisKKyAg
ICAgICAgICAgICAgICAvLyBQYXJzZWQgcHJvcGVydHkgb3ZlcnJpZGVzIGFueSBwcm9wZXJ0eSB3
aXRoIHRoZSBzYW1lIG5hbWUuIE5vbi1wYXJzZWQgcHJvcGVydHkgb3ZlcnJpZGVzCisgICAgICAg
ICAgICAgICAgLy8gcHJldmlvdXMgbm9uLXBhcnNlZCBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5h
bWUgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRJbmFjdGl2YXRlID0gZmFs
c2U7CisgICAgICAgICAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eUlkID0gY3NzUHJvcGVy
dHlJRChuYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFt
ZXMgdG8gdHJlYXQgbm9uLXByZWZpeGVkIGFuZCB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgbmFt
ZXMgdGhlIHNhbWUgKG9wYWNpdHkgdnMuIC13ZWJraXQtb3BhY2l0eSkuCisgICAgICAgICAgICAg
ICAgU3RyaW5nIGNhbm9uaWNhbFByb3BlcnR5TmFtZSA9IHByb3BlcnR5SWQgPyBnZXRQcm9wZXJ0
eU5hbWVTdHJpbmcocHJvcGVydHlJZCkgOiBuYW1lOworICAgICAgICAgICAgICAgIEhhc2hNYXA8
U3RyaW5nLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eT4+Ojpp
dGVyYXRvciBhY3RpdmVJdCA9IHByb3BlcnR5TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eS5m
aW5kKGNhbm9uaWNhbFByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUl0
ICE9IHByb3BlcnR5TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eS5lbmQoKSkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAocHJvcGVydHlFbnRyeS5wYXJzZWRPaykgeworICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBzdWNjZXNzUHJpb3JpdHkgPSBhY3RpdmVJdC0+dmFsdWUtPmdldFN0
cmluZyhJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5OjpQcmlvcml0eSwgcHJl
dmlvdXNQcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3NTdGF0
dXMgPSBhY3RpdmVJdC0+dmFsdWUtPmdldFN0cmluZyhJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU1Byb3BlcnR5OjpTdGF0dXMsIHByZXZpb3VzU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChzdWNjZXNzU3RhdHVzICYmIHByZXZpb3VzU3RhdHVzICE9ICJpbmFjdGl2ZSIp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlFbnRyeS5pbXBvcnRh
bnQgfHwgIXN1Y2Nlc3NQcmlvcml0eSkgLy8gUHJpb3JpdHkgbm90IHNldCA9PSAibm90IGltcG9y
dGFudCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEluYWN0aXZhdGUg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBJ
bnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5U3RhdHVzOjpBY3RpdmUpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5hY3RpdmF0ZSBhIG5vbi1pbXBvcnRh
bnQgcHJvcGVydHkgZm9sbG93aW5nIHRoZSBzYW1lLW5hbWVkIGltcG9ydGFudCBwcm9wZXJ0eS4K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSW5zcGVjdG9yOjpQcm90
b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1czo6SW5hY3RpdmU7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91c1BhcnNl
ZE9rOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gYWN0aXZlSXQtPnZh
bHVlLT5nZXRCb29sZWFuKEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk6OlBh
cnNlZE9rLCBwcmV2aW91c1BhcnNlZE9rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChz
dWNjZXNzICYmICFwcmV2aW91c1BhcnNlZE9rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNob3VsZEluYWN0aXZhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZVRvUHJldmlv
dXNBY3RpdmVQcm9wZXJ0eS5zZXQoY2Fub25pY2FsUHJvcGVydHlOYW1lLCBwcm9wZXJ0eU9iamVj
dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSW5hY3RpdmF0ZSkgeworICAgICAgICAg
ICAgICAgICAgICBhY3RpdmVJdC0+dmFsdWUtPnNldFN0YXR1cyhJbnNwZWN0b3I6OlByb3RvY29s
OjpDU1M6OkNTU1Byb3BlcnR5U3RhdHVzOjpJbmFjdGl2ZSk7CisgICAgICAgICAgICAgICAgICAg
IHByb3BlcnR5TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eS5zZXQoY2Fub25pY2FsUHJvcGVy
dHlOYW1lLCBwcm9wZXJ0eU9iamVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sIGltcGxpY2l0ID0gbV9zdHlsZS0+aXNQcm9w
ZXJ0eUltcGxpY2l0KG5hbWUpOworICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgImltcGxpY2l0
IiA9PSBmYWxzZS4KKyAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXQpCisgICAgICAgICAgICAg
ICAgICAgIHByb3BlcnR5T2JqZWN0LT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICAgICAgICAgICAg
ICBzdGF0dXMgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5U3RhdHVzOjpT
dHlsZTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydGhhbmQgPSBtX3N0eWxlLT5nZXRQ
cm9wZXJ0eVNob3J0aGFuZChuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNob3J0aGFuZC5p
c0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFNob3J0aGFuZHMuY29u
dGFpbnMoc2hvcnRoYW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTaG9ydGhh
bmRzLmFkZChzaG9ydGhhbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBlbnRyeSA9
IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U2hvcnRoYW5kRW50cnk6OmNyZWF0ZSgpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoc2hvcnRoYW5kKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzaG9ydGhhbmRWYWx1ZShzaG9ydGhhbmQpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBzaG9ydGhhbmRFbnRyaWVzLT5hZGRJdGVtKFdURjo6bW92ZShlbnRyeSkpOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgLy8gRGVmYXVsdCAic3RhdHVzIiA9PSAic3R5bGUiLgorICAgICAgICBp
ZiAoc3RhdHVzICE9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXM6
OlN0eWxlKQorICAgICAgICAgICAgcHJvcGVydHlPYmplY3QtPnNldFN0YXR1cyhzdGF0dXMpOwor
CisgICAgICAgIHByb3BlcnRpZXNBcnJheS0+YWRkSXRlbShXVEY6Om1vdmUocHJvcGVydHlPYmpl
Y3QpKTsKKyAgICB9CisKKyAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NT
dHlsZTo6Y3JlYXRlKCkKKyAgICAgICAgLnNldENzc1Byb3BlcnRpZXMoV1RGOjptb3ZlKHByb3Bl
cnRpZXNBcnJheSkpCisgICAgICAgIC5zZXRTaG9ydGhhbmRFbnRyaWVzKFdURjo6bW92ZShzaG9y
dGhhbmRFbnRyaWVzKSkKKyAgICAgICAgLnJlbGVhc2UoKTsKK30KKworYm9vbCBTdHlsZVJ1bGU6
OnNldFN0eWxlVGV4dChjb25zdCBTdHJpbmcmIHN0eWxlVGV4dCkKK3sKKyAgICBpZiAoIW1fcnVs
ZVNldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIG1fcnVsZVNldC0+c2V0
VGV4dEZvclN0eWxlKG1fc3R5bGUuZ2V0KCksIHN0eWxlVGV4dCk7Cit9CisKK1N0cmluZyBTdHls
ZVJ1bGU6OnNob3J0aGFuZFZhbHVlKGNvbnN0IFN0cmluZyYgc2hvcnRoYW5kUHJvcGVydHkpCit7
CisgICAgU3RyaW5nIHZhbHVlID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShzaG9ydGhhbmRQ
cm9wZXJ0eSk7CisgICAgaWYgKCF2YWx1ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2YWx1
ZTsKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fc3R5bGUtPmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nIGluZGl2aWR1YWxQ
cm9wZXJ0eSA9IG1fc3R5bGUtPml0ZW0oaSk7CisgICAgICAgIGlmIChtX3N0eWxlLT5nZXRQcm9w
ZXJ0eVNob3J0aGFuZChpbmRpdmlkdWFsUHJvcGVydHkpICE9IHNob3J0aGFuZFByb3BlcnR5KQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChtX3N0eWxlLT5pc1Byb3BlcnR5SW1w
bGljaXQoaW5kaXZpZHVhbFByb3BlcnR5KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBTdHJpbmcgaW5kaXZpZHVhbFZhbHVlID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShpbmRp
dmlkdWFsUHJvcGVydHkpOworICAgICAgICBpZiAoaW5kaXZpZHVhbFZhbHVlID09ICJpbml0aWFs
IikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIWJ1aWxkZXIuaXNFbXB0eSgp
KQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKKyAgICAgICAgYnVpbGRlci5hcHBl
bmQoaW5kaXZpZHVhbFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmco
KTsKK30KKworU3RyaW5nIFN0eWxlUnVsZTo6c2hvcnRoYW5kUHJpb3JpdHkoY29uc3QgU3RyaW5n
JiBzaG9ydGhhbmRQcm9wZXJ0eSkKK3sKKyAgICBTdHJpbmcgcHJpb3JpdHkgPSBtX3N0eWxlLT5n
ZXRQcm9wZXJ0eVByaW9yaXR5KHNob3J0aGFuZFByb3BlcnR5KTsKKyAgICBpZiAocHJpb3JpdHku
aXNFbXB0eSgpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3N0eWxlLT5s
ZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmcgaW5kaXZpZHVhbFByb3BlcnR5ID0g
bV9zdHlsZS0+aXRlbShpKTsKKyAgICAgICAgICAgIGlmIChtX3N0eWxlLT5nZXRQcm9wZXJ0eVNo
b3J0aGFuZChpbmRpdmlkdWFsUHJvcGVydHkpICE9IHNob3J0aGFuZFByb3BlcnR5KQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHJpb3JpdHkgPSBtX3N0eWxlLT5nZXRQ
cm9wZXJ0eVByaW9yaXR5KGluZGl2aWR1YWxQcm9wZXJ0eSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcHJpb3JpdHk7Cit9CisKK1ZlY3RvcjxTdHJp
bmc+IFN0eWxlUnVsZTo6bG9uZ2hhbmRQcm9wZXJ0aWVzKGNvbnN0IFN0cmluZyYgc2hvcnRoYW5k
UHJvcGVydHkpCit7CisgICAgVmVjdG9yPFN0cmluZz4gcHJvcGVydGllczsKKyAgICBIYXNoU2V0
PFN0cmluZz4gZm91bmRQcm9wZXJ0aWVzOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBt
X3N0eWxlLT5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFN0cmluZyBpbmRpdmlkdWFsUHJvcGVy
dHkgPSBtX3N0eWxlLT5pdGVtKGkpOworICAgICAgICBpZiAoZm91bmRQcm9wZXJ0aWVzLmNvbnRh
aW5zKGluZGl2aWR1YWxQcm9wZXJ0eSkgfHwgbV9zdHlsZS0+Z2V0UHJvcGVydHlTaG9ydGhhbmQo
aW5kaXZpZHVhbFByb3BlcnR5KSAhPSBzaG9ydGhhbmRQcm9wZXJ0eSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIGZvdW5kUHJvcGVydGllcy5hZGQoaW5kaXZpZHVhbFByb3BlcnR5
KTsKKyAgICAgICAgcHJvcGVydGllcy5hcHBlbmQoaW5kaXZpZHVhbFByb3BlcnR5KTsKKyAgICB9
CisgICAgcmV0dXJuIHByb3BlcnRpZXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVJ1bGUuaCBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVJ1bGUuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY5NDIwCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlUnVsZS5oCkBAIC0wLDAgKzEsNzYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICog
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBJbnNwZWN0b3JTdHlsZVJ1bGVfaAorI2RlZmluZSBJbnNwZWN0
b3JTdHlsZVJ1bGVfaAorCisjaW5jbHVkZSAiSW5zcGVjdG9yQ1NTSWQuaCIKKyNpbmNsdWRlIDxp
bnNwZWN0b3IvSW5zcGVjdG9yUHJvdG9jb2xPYmplY3RzLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKK2NsYXNzIENTU1N0eWxlRGVjbGFyYXRpb247CitzdHJ1Y3QgQ1NTUnVsZVNvdXJjZURhdGE7
CitzdHJ1Y3QgQ1NTU3R5bGVTb3VyY2VEYXRhOworfTsKKworbmFtZXNwYWNlIEluc3BlY3RvciB7
CisKK2NsYXNzIFN0eWxlUnVsZVNldDsKK3N0cnVjdCBTdHlsZVByb3BlcnR5OworCitjbGFzcyBT
dHlsZVJ1bGUgZmluYWwgOiBwdWJsaWMgUmVmQ291bnRlZDxTdHlsZVJ1bGU+IHsKK3B1YmxpYzoK
KyAgICBzdGF0aWMgUmVmPFN0eWxlUnVsZT4gY3JlYXRlKGNvbnN0IENTU0lkJiBzdHlsZUlkLCBS
ZWY8V2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbj4mJiwgU3R5bGVSdWxlU2V0KiBydWxlU2V0
KTsKKyAgICB+U3R5bGVSdWxlKCk7CisKKyAgICBXZWJDb3JlOjpDU1NTdHlsZURlY2xhcmF0aW9u
JiBjc3NTdHlsZSgpIHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KKyAgICBSZWZQdHI8V2ViQ29y
ZTo6Q1NTUnVsZVNvdXJjZURhdGE+IHJ1bGVTb3VyY2VEYXRhKCk7CisgICAgUmVmUHRyPFdlYkNv
cmU6OkNTU1N0eWxlU291cmNlRGF0YT4gc3R5bGVTb3VyY2VEYXRhKCk7CisgICAgQ1NTSWQgc3R5
bGVJZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVJZDsgfQorICAgIFN0eWxlUnVsZVNldCogc3R5
bGVSdWxlU2V0KCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0OyB9CisKKyAgICBib29sIGdldFN0
eWxlVGV4dChTdHJpbmcmIHJlc3VsdCk7CisgICAgYm9vbCBzZXRTdHlsZVRleHQoY29uc3QgU3Ry
aW5nJik7CisKKyAgICAvLyBUT0RPOiBtb3ZlIG1lIHNvbWV3aGVyZSBlbHNlLgorICAgIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlPiBidWlsZE9iamVjdEZvclN0eWxl
KCk7CisgICAgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGJ1aWxkT2Jq
ZWN0Rm9yU3R5bGVXaXRoUHJvcGVydGllcygpOworICAgIFJlZjxJbnNwZWN0b3I6OlByb3RvY29s
OjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0
eT4+IGJ1aWxkQXJyYXlGb3JDb21wdXRlZFN0eWxlKCk7Citwcml2YXRlOgorICAgIFN0eWxlUnVs
ZShjb25zdCBDU1NJZCYgc3R5bGVJZCwgUmVmPFdlYkNvcmU6OkNTU1N0eWxlRGVjbGFyYXRpb24+
JiYsIFN0eWxlUnVsZVNldCogcnVsZVNldCk7CisKKyAgICBib29sIHBvcHVsYXRlQWxsUHJvcGVy
dGllcyhWZWN0b3I8U3R5bGVQcm9wZXJ0eT4mIHJlc3VsdCk7CisgICAgU3RyaW5nIHNob3J0aGFu
ZFZhbHVlKGNvbnN0IFN0cmluZyYgc2hvcnRoYW5kUHJvcGVydHkpOworICAgIFN0cmluZyBzaG9y
dGhhbmRQcmlvcml0eShjb25zdCBTdHJpbmcmIHNob3J0aGFuZFByb3BlcnR5KTsKKyAgICBWZWN0
b3I8U3RyaW5nPiBsb25naGFuZFByb3BlcnRpZXMoY29uc3QgU3RyaW5nJiBzaG9ydGhhbmRQcm9w
ZXJ0eSk7CisKKyAgICBDU1NJZCBtX3N0eWxlSWQ7CisgICAgUmVmPFdlYkNvcmU6OkNTU1N0eWxl
RGVjbGFyYXRpb24+IG1fc3R5bGU7CisgICAgU3R5bGVSdWxlU2V0KiBtX3J1bGVTZXQ7Cit9Owor
Cit9IC8vIG5hbWVzcGFjZSBJbnNwZWN0b3IKKworI2VuZGlmIC8vIEluc3BlY3RvclN0eWxlUnVs
ZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVS
dWxlU2V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVJ1bGVT
ZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjA2YTQKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVSdWxl
U2V0LmNwcApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBVbml2
ZXJzaXR5IG9mIFdhc2hpbmd0b24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmgiCisKKyNpbmNsdWRlICJDU1NJbXBvcnRS
dWxlLmgiCisjaW5jbHVkZSAiQ1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1ZGUgIkNTU01lZGlh
UnVsZS5oIgorI2luY2x1ZGUgIkNTU1BhcnNlci5oIgorI2luY2x1ZGUgIkNTU1J1bGUuaCIKKyNp
bmNsdWRlICJDU1NSdWxlTGlzdC5oIgorI2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgorI2lu
Y2x1ZGUgIkNTU1N0eWxlU2hlZXQuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNs
dWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVSdWxlLmgiCisjaW5jbHVk
ZSAiSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuaCIgLy8gRm9yIFBhcnNlZFJ1bGVTZXREYXRh
OjpjcmVhdGUoKS4KKyNpbmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKKwordXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBJbnNwZWN0b3IgeworCitQYXJzZWRSdWxlU2V0
RGF0YTo6UGFyc2VkUnVsZVNldERhdGEoU3RyaW5nIHNvdXJjZVRleHQsIHN0ZDo6dW5pcXVlX3B0
cjxSdWxlU291cmNlRGF0YUxpc3Q+IHNvdXJjZURhdGEsIHN0ZDo6dW5pcXVlX3B0cjxTdHlsZVJ1
bGVMaXN0PiBzdHlsZVJ1bGVzKQorICAgIDogbV9zb3VyY2VUZXh0KHNvdXJjZVRleHQpCisgICAg
LCBtX2ZsYXR0ZW5lZFNvdXJjZURhdGEoV1RGOjptb3ZlKHNvdXJjZURhdGEpKQorICAgICwgbV9m
bGF0dGVuZWRTdHlsZVJ1bGVzKFdURjo6bW92ZShzdHlsZVJ1bGVzKSkKK3sKK30KKworc3RhdGlj
IENTU1BhcnNlckNvbnRleHQgcGFyc2VyQ29udGV4dEZvckRvY3VtZW50KERvY3VtZW50KiBkb2N1
bWVudCkKK3sKKyAgICByZXR1cm4gZG9jdW1lbnQgPyBDU1NQYXJzZXJDb250ZXh0KCpkb2N1bWVu
dCkgOiBzdHJpY3RDU1NQYXJzZXJDb250ZXh0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsYXR0ZW5T
b3VyY2VEYXRhKFJ1bGVTb3VyY2VEYXRhTGlzdCYgc291cmNlRGF0YUxpc3QsIFJ1bGVTb3VyY2VE
YXRhTGlzdCYgZmxhdHRlbmVkRGF0YUxpc3QpCit7CisgICAgZm9yIChhdXRvJiBzb3VyY2VEYXRh
IDogc291cmNlRGF0YUxpc3QpIHsKKyAgICAgICAgaWYgKHNvdXJjZURhdGEtPnR5cGUgPT0gQ1NT
UnVsZVNvdXJjZURhdGE6OlNUWUxFX1JVTEUpCisgICAgICAgICAgICBmbGF0dGVuZWREYXRhTGlz
dC5hcHBlbmQoc291cmNlRGF0YSk7CisgICAgICAgIGVsc2UgaWYgKHNvdXJjZURhdGEtPnR5cGUg
PT0gQ1NTUnVsZVNvdXJjZURhdGE6Ok1FRElBX1JVTEUpCisgICAgICAgICAgICBmbGF0dGVuU291
cmNlRGF0YShzb3VyY2VEYXRhLT5jaGlsZFJ1bGVzLCBmbGF0dGVuZWREYXRhTGlzdCk7CisgICAg
ICAgIGVsc2UgaWYgKHNvdXJjZURhdGEtPnR5cGUgPT0gQ1NTUnVsZVNvdXJjZURhdGE6OlNVUFBP
UlRTX1JVTEUpCisgICAgICAgICAgICBmbGF0dGVuU291cmNlRGF0YShzb3VyY2VEYXRhLT5jaGls
ZFJ1bGVzLCBmbGF0dGVuZWREYXRhTGlzdCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmbGF0
dGVuU3R5bGVSdWxlcyhDU1NSdWxlTGlzdCYgcnVsZUxpc3QsIFN0eWxlUnVsZUxpc3QmIHJlc3Vs
dCk7CisKK3N0YXRpYyB2b2lkIGZsYXR0ZW5TdHlsZVJ1bGVzKFJlZlB0cjxDU1NSdWxlPiYmIHJ1
bGUsIFN0eWxlUnVsZUxpc3QmIHJlc3VsdCkKK3sKKyAgICBpZiAoIXJ1bGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChpczxDU1NTdHlsZVJ1bGU+KCpydWxlKSkgeworICAgICAgICByZXN1
bHQuYXBwZW5kKCZkb3duY2FzdDxDU1NTdHlsZVJ1bGU+KCpydWxlKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoaXM8Q1NTTWVkaWFSdWxlPigqcnVsZSkpCisgICAgICAgIGZs
YXR0ZW5TdHlsZVJ1bGVzKGRvd25jYXN0PENTU01lZGlhUnVsZT4oKnJ1bGUpLmNzc1J1bGVzKCks
IHJlc3VsdCk7CisKKyAgICBpZiAoaXM8Q1NTS2V5ZnJhbWVzUnVsZT4oKnJ1bGUpKQorICAgICAg
ICBmbGF0dGVuU3R5bGVSdWxlcyhkb3duY2FzdDxDU1NLZXlmcmFtZXNSdWxlPigqcnVsZSkuY3Nz
UnVsZXMoKSwgcmVzdWx0KTsKKworICAgIGlmIChpczxDU1NTdXBwb3J0c1J1bGU+KCpydWxlKSkK
KyAgICAgICAgZmxhdHRlblN0eWxlUnVsZXMoZG93bmNhc3Q8Q1NTU3VwcG9ydHNSdWxlPigqcnVs
ZSkuY3NzUnVsZXMoKSwgcmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQgZmxhdHRlblN0eWxlUnVs
ZXMoQ1NTUnVsZUxpc3QmIHJ1bGVMaXN0LCBTdHlsZVJ1bGVMaXN0JiByZXN1bHQpCit7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVMaXN0Lmxlbmd0aCgpOyArK2kpCisgICAgICAg
IGZsYXR0ZW5TdHlsZVJ1bGVzKHJ1bGVMaXN0Lml0ZW0oaSksIHJlc3VsdCk7Cit9CisKK3N0ZDo6
dW5pcXVlX3B0cjxQYXJzZWRSdWxlU2V0RGF0YT4gUGFyc2VkUnVsZVNldERhdGE6OmNyZWF0ZShT
dHlsZXNoZWV0UnVsZVNldCYgc3R5bGVzaGVldCkKK3sKKyAgICBTdHJpbmcgb3JpZ2luYWxTdHls
ZXNoZWV0VGV4dDsKKyAgICBpZiAoIXN0eWxlc2hlZXQub3JpZ2luYWxTb3VyY2VUZXh0KG9yaWdp
bmFsU3R5bGVzaGVldFRleHQpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVy
biBQYXJzZWRSdWxlU2V0RGF0YTo6Y3JlYXRlV2l0aFRleHQoc3R5bGVzaGVldCwgb3JpZ2luYWxT
dHlsZXNoZWV0VGV4dCk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxQYXJzZWRSdWxlU2V0RGF0YT4g
UGFyc2VkUnVsZVNldERhdGE6OmNyZWF0ZUVtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBz
dGQ6Om1ha2VfdW5pcXVlPFBhcnNlZFJ1bGVTZXREYXRhPihlbXB0eVN0cmluZygpLCBzdGQ6Om1h
a2VfdW5pcXVlPFJ1bGVTb3VyY2VEYXRhTGlzdD4oKSwgc3RkOjptYWtlX3VuaXF1ZTxTdHlsZVJ1
bGVMaXN0PigpKTsKKyAgICB9CisgICAgCitzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERh
dGE+IFBhcnNlZFJ1bGVTZXREYXRhOjpjcmVhdGVXaXRoVGV4dChTdHlsZXNoZWV0UnVsZVNldCYg
c3R5bGVzaGVldCwgY29uc3QgU3RyaW5nJiBzdHlsZXNoZWV0VGV4dCkKK3sKKyAgICBDU1NQYXJz
ZXIgcGFyc2VyKHBhcnNlckNvbnRleHRGb3JEb2N1bWVudChzdHlsZXNoZWV0Lm93bmVyRG9jdW1l
bnQoKSkpOworCisgICAgUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gY29udGVudHMgPSBTdHls
ZVNoZWV0Q29udGVudHM6OmNyZWF0ZSgpOworICAgIGludCBzdGFydExpbmUgPSAwOworICAgIGF1
dG8gc291cmNlRGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8UnVsZVNvdXJjZURhdGFMaXN0PigpOwor
ICAgIHBhcnNlci5wYXJzZVNoZWV0KGNvbnRlbnRzLmdldCgpLCBzdHlsZXNoZWV0VGV4dCwgc3Rh
cnRMaW5lLCBzb3VyY2VEYXRhLmdldCgpKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgdGVt
cG9yYXJ5IHNvbHV0aW9uIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgZmxhdCBzb3VyY2VEYXRhIHN0
cnVjdHVyZQorICAgIC8vIGNvbnRhaW5pbmcgb25seSBzdHlsZSBydWxlcywgZXZlbiB0aG91Z2gg
Q1NTUGFyc2VyIG5vdyBwcm92aWRlcyB0aGUgZnVsbCBydWxlIHNvdXJjZSBkYXRhIHRyZWUuCisg
ICAgYXV0byBmbGF0dGVuZWRTb3VyY2VEYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxSdWxlU291cmNl
RGF0YUxpc3Q+KCk7CisgICAgZmxhdHRlblNvdXJjZURhdGEoKnNvdXJjZURhdGEsICpmbGF0dGVu
ZWRTb3VyY2VEYXRhKTsKKworICAgIGF1dG8gZmxhdHRlbmVkUnVsZXMgPSBzdGQ6Om1ha2VfdW5p
cXVlPFN0eWxlUnVsZUxpc3Q+KCk7CisgICAgYXV0byBydWxlVHJlZSA9IHN0eWxlc2hlZXQucGFn
ZVN0eWxlU2hlZXQoKS5jc3NSdWxlcygpOworICAgIGZsYXR0ZW5TdHlsZVJ1bGVzKCpydWxlVHJl
ZSwgKmZsYXR0ZW5lZFJ1bGVzKTsKKworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFBhcnNl
ZFJ1bGVTZXREYXRhPihzdHlsZXNoZWV0VGV4dCwgV1RGOjptb3ZlKGZsYXR0ZW5lZFNvdXJjZURh
dGEpLCBXVEY6Om1vdmUoZmxhdHRlbmVkUnVsZXMpKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFBh
cnNlZFJ1bGVTZXREYXRhPiBQYXJzZWRSdWxlU2V0RGF0YTo6Y3JlYXRlKEVsZW1lbnQmIGVsZW1l
bnQpCit7CisgICAgU3RyaW5nIHNvdXJjZVRleHQgPSBlbGVtZW50LmlzU3R5bGVkRWxlbWVudCgp
ID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0eWxlIikuc3RyaW5nKCkgOiBTdHJpbmcoKTsKKyAg
ICBhdXRvIHNvdXJjZURhdGEgPSBDU1NSdWxlU291cmNlRGF0YTo6Y3JlYXRlKENTU1J1bGVTb3Vy
Y2VEYXRhOjpTVFlMRV9SVUxFKTsKKworICAgIGlmIChzb3VyY2VUZXh0LmlzRW1wdHkoKSkgewor
ICAgICAgICBzb3VyY2VEYXRhLT5ydWxlQm9keVJhbmdlLnN0YXJ0ID0gMDsKKyAgICAgICAgc291
cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5lbmQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIFJl
ZlB0cjxNdXRhYmxlU3R5bGVQcm9wZXJ0aWVzPiBkdW1teURlY2xhcmF0aW9uID0gTXV0YWJsZVN0
eWxlUHJvcGVydGllczo6Y3JlYXRlKCk7CisgICAgICAgIENTU1BhcnNlciBwYXJzZXIocGFyc2Vy
Q29udGV4dEZvckRvY3VtZW50KCZlbGVtZW50LmRvY3VtZW50KCkpKTsKKyAgICAgICAgcGFyc2Vy
LnBhcnNlRGVjbGFyYXRpb24oZHVtbXlEZWNsYXJhdGlvbi5nZXQoKSwgc291cmNlVGV4dCwgc291
cmNlRGF0YS5nZXQoKSwgJmVsZW1lbnQuZG9jdW1lbnQoKS5lbGVtZW50U2hlZXQoKS5jb250ZW50
cygpKTsKKyAgICB9CisKKyAgICBhdXRvIHNvdXJjZURhdGFMaXN0ID0gc3RkOjptYWtlX3VuaXF1
ZTxSdWxlU291cmNlRGF0YUxpc3Q+KDEpOworICAgIHNvdXJjZURhdGFMaXN0LT5hcHBlbmQoV1RG
Ojptb3ZlKHNvdXJjZURhdGEpKTsKKworICAgIGF1dG8gZmxhdHRlbmVkUnVsZXMgPSBzdGQ6Om1h
a2VfdW5pcXVlPFN0eWxlUnVsZUxpc3Q+KCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8
UGFyc2VkUnVsZVNldERhdGE+KHNvdXJjZVRleHQsIFdURjo6bW92ZShzb3VyY2VEYXRhTGlzdCks
IFdURjo6bW92ZShmbGF0dGVuZWRSdWxlcykpOworfQorCit1aW50NjRfdCBTdHlsZVJ1bGVTZXQ6
OnNfbmV4dFJ1bGVTZXRJZCA9IDE7CisgICAgCitTdHlsZVJ1bGVTZXQ6OlN0eWxlUnVsZVNldCgp
CisgICAgOiBtX2lkZW50aWZpZXIoc19uZXh0UnVsZVNldElkKyspCit7Cit9CisKK1N0eWxlUnVs
ZVNldDo6flN0eWxlUnVsZVNldCgpIHsgfQorCit2b2lkIFN0eWxlUnVsZVNldDo6Y29tbWl0UnVs
ZVNldENoYW5nZShzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+IHBhcnNlZERhdGEp
Cit7CisgICAgbV9wYXJzZWRSdWxlU2V0RGF0YSA9IFdURjo6bW92ZShwYXJzZWREYXRhKTsKKyAg
ICBpZiAobV9wYXJzZWRSdWxlU2V0RGF0YSkgLy8gSWYgbnVsbHB0ciwgd2UgY2FuIGludmFsaWRh
dGUgd2l0aG91dCBlYWdlcmx5IHJlcGFyc2luZy4KKyAgICAgICAgbm90aWZ5UnVsZVNldENoYW5n
ZWQoKTsKK30KKworUGFyc2VkUnVsZVNldERhdGEmIFN0eWxlUnVsZVNldDo6cGFyc2VkUnVsZVNl
dERhdGEoKQoreworICAgIGlmICghbV9wYXJzZWRSdWxlU2V0RGF0YSkKKyAgICAgICAgbV9wYXJz
ZWRSdWxlU2V0RGF0YSA9IG9yaWdpbmFsU291cmNlRGF0YSgpOworCisgICAgaWYgKCFtX3BhcnNl
ZFJ1bGVTZXREYXRhKQorICAgICAgICBtX3BhcnNlZFJ1bGVTZXREYXRhID0gUGFyc2VkUnVsZVNl
dERhdGE6OmNyZWF0ZUVtcHR5KCk7CisKKyAgICBBU1NFUlQobV9wYXJzZWRSdWxlU2V0RGF0YSk7
CisgICAgcmV0dXJuICptX3BhcnNlZFJ1bGVTZXREYXRhOworfQorICAKK2NvbnN0IFN0cmluZyYg
U3R5bGVSdWxlU2V0OjpnZXRUZXh0KCkKK3sKKyAgICByZXR1cm4gcGFyc2VkUnVsZVNldERhdGEo
KS5zb3VyY2VUZXh0KCk7Cit9CisKK3N0YXRpYyBzaXplX3Qgc291cmNlRGF0YU9yZGluYWxGb3JT
dHlsZShDU1NTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSwgU3R5bGVSdWxlTGlzdCYgZmxhdHRlbmVk
UnVsZXMpCit7CisgICAgZm9yIChzaXplX3QgcnVsZU9yZGluYWwgPSAwOyBydWxlT3JkaW5hbCA8
IGZsYXR0ZW5lZFJ1bGVzLnNpemUoKTsgKytydWxlT3JkaW5hbCkKKyAgICAgICAgaWYgKCZmbGF0
dGVuZWRSdWxlcy5hdChydWxlT3JkaW5hbCktPnN0eWxlKCkgPT0gJnN0eWxlKQorICAgICAgICAg
ICAgcmV0dXJuIHJ1bGVPcmRpbmFsOworICAgIAorICAgIHJldHVybiBub3RGb3VuZDsKK30KKwor
Q1NTSWQgU3R5bGVSdWxlU2V0OjpydWxlT3JTdHlsZUlkKENTU1N0eWxlRGVjbGFyYXRpb24mIHN0
eWxlKQoreworICAgIGF1dG8gcnVsZU9yZGluYWwgPSBzb3VyY2VEYXRhT3JkaW5hbEZvclN0eWxl
KHN0eWxlLCBwYXJzZWRSdWxlU2V0RGF0YSgpLmZsYXR0ZW5lZFN0eWxlUnVsZXMoKSk7CisgICAg
cmV0dXJuIChydWxlT3JkaW5hbCAhPSBub3RGb3VuZCkgPyBDU1NJZChpZGVudGlmaWVyKCksIHJ1
bGVPcmRpbmFsKSA6IENTU0lkKCk7Cit9CisKK1JlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gU3R5
bGVSdWxlU2V0Ojpzb3VyY2VEYXRhRm9yUnVsZShDU1NTdHlsZVJ1bGUmIHJ1bGUpCit7CisgICAg
YXV0byYgcnVsZXMgPSBwYXJzZWRSdWxlU2V0RGF0YSgpLmZsYXR0ZW5lZFN0eWxlUnVsZXMoKTsK
KyAgICBzaXplX3QgcnVsZU9yZGluYWwgPSBydWxlcy5maW5kKCZydWxlKTsKKyAgICBpZiAocnVs
ZU9yZGluYWwgPT0gbm90Rm91bmQpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAg
IGF1dG8mIHNvdXJjZURhdGEgPSBwYXJzZWRSdWxlU2V0RGF0YSgpLmZsYXR0ZW5lZFNvdXJjZURh
dGEoKTsKKyAgICByZXR1cm4gc291cmNlRGF0YS5hdChydWxlT3JkaW5hbCk7Cit9CisKK1JlZlB0
cjxDU1NSdWxlU291cmNlRGF0YT4gU3R5bGVSdWxlU2V0Ojpzb3VyY2VEYXRhRm9yU3R5bGUoQ1NT
U3R5bGVEZWNsYXJhdGlvbiYgc3R5bGUpCit7CisgICAgc2l6ZV90IHJ1bGVPcmRpbmFsID0gc291
cmNlRGF0YU9yZGluYWxGb3JTdHlsZShzdHlsZSwgcGFyc2VkUnVsZVNldERhdGEoKS5mbGF0dGVu
ZWRTdHlsZVJ1bGVzKCkpOworICAgIHJldHVybiAocnVsZU9yZGluYWwgIT0gbm90Rm91bmQpID8g
cGFyc2VkUnVsZVNldERhdGEoKS5mbGF0dGVuZWRTb3VyY2VEYXRhKCkuYXQocnVsZU9yZGluYWwp
IDogbnVsbHB0cjsKK30KKyAgICAKKy8vIEZJWE1FOiBtb3ZlIHRvIEluc3BlY3RvckNTU0FnZW50
LmNwcAorUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IFN0eWxlUnVs
ZVNldDo6YnVpbGRPYmplY3RGb3JTdHlsZShDU1NTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSkKK3sK
KyAgICBDU1NJZCBpZCA9IHJ1bGVPclN0eWxlSWQoc3R5bGUpOworICAgIGlmIChpZC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgcmV0dXJuIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU6
OmNyZWF0ZSgpCisgICAgICAgIC5zZXRDc3NQcm9wZXJ0aWVzKEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk+OjpjcmVhdGUoKSkK
KyAgICAgICAgLnNldFNob3J0aGFuZEVudHJpZXMoSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTaG9ydGhhbmRFbnRyeT46OmNyZWF0ZSgpKQorICAg
ICAgICAucmVsZWFzZSgpOworICAgIH0KKyAgICBSZWZQdHI8U3R5bGVSdWxlPiBzdHlsZVJ1bGUg
PSBpbnNwZWN0b3JTdHlsZUZvcklkKGlkKTsKKyAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NTdHlsZT4gcmVzdWx0ID0gc3R5bGVSdWxlLT5idWlsZE9iamVjdEZvclN0eWxl
KCk7CisgICAgCisgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIHVzZSBTdHlsZVJ1bGUgc2luY2Ug
aXQgYWxyZWFkeSBkb2VzIHRoZXNlIGNvbXB1dGF0aW9ucy4KKyAgICAvLyBTdHlsZSB0ZXh0IGNh
bm5vdCBiZSByZXRyaWV2ZWQgd2l0aG91dCBzdHlsZXNoZWV0LCBzbyBzZXQgY3NzVGV4dCBoZXJl
LgorICAgIGlmIChSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHNvdXJjZURhdGEgPSBzb3VyY2VE
YXRhRm9yU3R5bGUoc3R5bGUpKSB7CisgICAgICAgIFN0cmluZyBzdHlsZXNoZWV0VGV4dCA9IGdl
dFRleHQoKTsKKyAgICAgICAgY29uc3QgU291cmNlUmFuZ2UmIGJvZHlSYW5nZSA9IHNvdXJjZURh
dGEtPnJ1bGVCb2R5UmFuZ2U7CisgICAgICAgIHJlc3VsdC0+c2V0Q3NzVGV4dChzdHlsZXNoZWV0
VGV4dC5zdWJzdHJpbmcoYm9keVJhbmdlLnN0YXJ0LCBib2R5UmFuZ2UuZW5kIC0gYm9keVJhbmdl
LnN0YXJ0KSk7CisgICAgfQorICAgIAorICAgIHJldHVybiBXVEY6Om1vdmUocmVzdWx0KTsKK30K
KworfSAvLyBuYW1lc3BhY2UgSW5zcGVjdG9yCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uM2E4M2IzNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9JbnNwZWN0b3JTdHlsZVJ1bGVTZXQuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxNSBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24uCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZu
ZGVmIEluc3BlY3RvclN0eWxlUnVsZVNldF9oCisjZGVmaW5lIEluc3BlY3RvclN0eWxlUnVsZVNl
dF9oCisKKyNpbmNsdWRlICJDU1NQcm9wZXJ0eVNvdXJjZURhdGEuaCIKKyNpbmNsdWRlIDx3dGYv
UmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KKworLy8gRklYTUU6IHJlbW92ZQorI2luY2x1ZGUgPGluc3BlY3Rvci9J
bnNwZWN0b3JQcm90b2NvbE9iamVjdHMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3Mg
Q1NTU3R5bGVEZWNsYXJhdGlvbjsKK2NsYXNzIENTU1N0eWxlUnVsZTsKK2NsYXNzIERvY3VtZW50
OworY2xhc3MgRWxlbWVudDsKKwordHlwZWRlZiBWZWN0b3I8UmVmUHRyPENTU1N0eWxlUnVsZT4+
IFN0eWxlUnVsZUxpc3Q7Cit9CisKK25hbWVzcGFjZSBJbnNwZWN0b3IgeworCitjbGFzcyBDU1NJ
ZDsKK2NsYXNzIFN0eWxlUnVsZTsKK2NsYXNzIFN0eWxlc2hlZXRSdWxlU2V0OworCitzdHJ1Y3Qg
UGFyc2VkUnVsZVNldERhdGEgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFBhcnNlZFJ1bGVT
ZXREYXRhKTsKK3B1YmxpYzoKKyAgICBQYXJzZWRSdWxlU2V0RGF0YShTdHJpbmcsIHN0ZDo6dW5p
cXVlX3B0cjxXZWJDb3JlOjpSdWxlU291cmNlRGF0YUxpc3Q+LCBzdGQ6OnVuaXF1ZV9wdHI8V2Vi
Q29yZTo6U3R5bGVSdWxlTGlzdD4pOworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2Vk
UnVsZVNldERhdGE+IGNyZWF0ZShTdHlsZXNoZWV0UnVsZVNldCYpOworICAgIHN0YXRpYyBzdGQ6
OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+IGNyZWF0ZShXZWJDb3JlOjpFbGVtZW50Jik7
CisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIHBhcnNlIG1vZGlmaWVkIHN0eWxlc2hlZXQgdGV4dC4g
VGhlIG9yaWdpbmFsIFN0eWxlU2hlZXRDb250ZW50cyBpcworICAgIC8vIGltbXV0YWJsZSBhbmQg
d2lsbCBubyBsb25nZXIgbWF0Y2ggdGhlIHN0eWxlc2hlZXQncyB0ZXh0LCBydWxlcyBhbmQgZGVj
bGFyYXRpb25zLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+
IGNyZWF0ZVdpdGhUZXh0KFN0eWxlc2hlZXRSdWxlU2V0JiwgY29uc3QgU3RyaW5nJiBzb3VyY2VU
ZXh0KTsKKyAgICAvLyBGb3IgdXNlciBhbmQgdXNlciBhZ2VudCBzdHlsZXNoZWV0cy4KKyAgICBz
dGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRhPiBjcmVhdGVFbXB0eSgpOwor
ICAgIAorICAgIGNvbnN0IFN0cmluZyYgc291cmNlVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fc291
cmNlVGV4dDsgfQorICAgIFdlYkNvcmU6OlJ1bGVTb3VyY2VEYXRhTGlzdCYgZmxhdHRlbmVkU291
cmNlRGF0YSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9mbGF0dGVuZWRTb3VyY2VE
YXRhKTsKKyAgICAgICAgcmV0dXJuICptX2ZsYXR0ZW5lZFNvdXJjZURhdGE7CisgICAgfQorICAg
IFdlYkNvcmU6OlN0eWxlUnVsZUxpc3QmIGZsYXR0ZW5lZFN0eWxlUnVsZXMoKSBjb25zdAorICAg
IHsKKyAgICAgICAgQVNTRVJUKG1fZmxhdHRlbmVkU3R5bGVSdWxlcyk7CisgICAgICAgIHJldHVy
biAqbV9mbGF0dGVuZWRTdHlsZVJ1bGVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTdHJpbmcg
bV9zb3VyY2VUZXh0OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpSdWxlU291cmNlRGF0
YUxpc3Q+IG1fZmxhdHRlbmVkU291cmNlRGF0YTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29y
ZTo6U3R5bGVSdWxlTGlzdD4gbV9mbGF0dGVuZWRTdHlsZVJ1bGVzOworfTsKKworY2xhc3MgU3R5
bGVSdWxlU2V0IDogcHVibGljIFJlZkNvdW50ZWQ8U3R5bGVSdWxlU2V0PiB7CitwdWJsaWM6Cisg
ICAgU3R5bGVSdWxlU2V0KCk7CisgICAgdmlydHVhbCB+U3R5bGVSdWxlU2V0KCk7CisKKyAgICB1
aW50NjRfdCBpZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbV9pZGVudGlmaWVyOyB9CisgICAg
dmlydHVhbCBib29sIGlzU3R5bGVzaGVldCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAg
dmlydHVhbCBib29sIGlzSW5saW5lU3R5bGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAg
IAorICAgIGNvbnN0IFN0cmluZyYgZ2V0VGV4dCgpOworICAgIHZpcnR1YWwgdm9pZCByZXBsYWNl
VGV4dChjb25zdCBTdHJpbmcmKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxQ
YXJzZWRSdWxlU2V0RGF0YT4gb3JpZ2luYWxTb3VyY2VEYXRhKCkgPSAwOworICAgIHZpcnR1YWwg
UmVmUHRyPFN0eWxlUnVsZT4gaW5zcGVjdG9yU3R5bGVGb3JJZChjb25zdCBDU1NJZCYpID0gMDsK
KworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSdWxlU2V0Q2hhbmdlZCgpIHsgfQorICAgIHZpcnR1
YWwgV2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGVGb3JJZChjb25zdCBDU1NJZCYp
ID0gMDsKKyAgICAvLyBGSVhNRTogcmVtb3ZlLgorICAgIHZpcnR1YWwgV2ViQ29yZTo6RG9jdW1l
bnQqIG93bmVyRG9jdW1lbnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIHNldFRleHRG
b3JTdHlsZShjb25zdCBDU1NJZCYsIGNvbnN0IFN0cmluZyYgdGV4dCwgU3RyaW5nJiBvbGRUZXh0
KSA9IDA7CisgICAgdmlydHVhbCBib29sIHNldFRleHRGb3JTdHlsZShXZWJDb3JlOjpDU1NTdHls
ZURlY2xhcmF0aW9uJiwgY29uc3QgU3RyaW5nJikgPSAwOworICAgIAorICAgIFJlZlB0cjxXZWJD
b3JlOjpDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0YUZvclN0eWxlKFdlYkNvcmU6OkNTU1N0
eWxlRGVjbGFyYXRpb24mIHN0eWxlKTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6Q1NTUnVsZVNvdXJj
ZURhdGE+IHNvdXJjZURhdGFGb3JSdWxlKFdlYkNvcmU6OkNTU1N0eWxlUnVsZSYgcnVsZSk7CisK
KyAgICBDU1NJZCBydWxlT3JTdHlsZUlkKFdlYkNvcmU6OkNTU1N0eWxlRGVjbGFyYXRpb24mKTsK
KworICAgIC8vIEZJWE1FOiBtb3ZlIHRvIEluc3BlY3RvckNTU0FnZW50LmNwcAorICAgIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+IGJ1aWxkT2JqZWN0Rm9yUnVsZShX
ZWJDb3JlOjpDU1NTdHlsZVJ1bGUmLCBXZWJDb3JlOjpFbGVtZW50Kik7CisgICAgUmVmUHRyPElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGJ1aWxkT2JqZWN0Rm9yU3R5bGUoV2Vi
Q29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiYpOworcHJvdGVjdGVkOgorICAgIFBhcnNlZFJ1bGVT
ZXREYXRhJiBwYXJzZWRSdWxlU2V0RGF0YSgpOworICAgIHZvaWQgY29tbWl0UnVsZVNldENoYW5n
ZShzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+KTsKKworcHJpdmF0ZToKKyAgICBz
dGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+IG1fcGFyc2VkUnVsZVNldERhdGE7Cisg
ICAgdWludDY0X3QgbV9pZGVudGlmaWVyOworCisgICAgc3RhdGljIHVpbnQ2NF90IHNfbmV4dFJ1
bGVTZXRJZDsKK307CisgICAKK30gLy8gbmFtZXNwYWNlIEluc3BlY3RvcgorCisjZW5kaWYgLy8g
SW5zcGVjdG9yU3R5bGVSdWxlU2V0X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JTdHlsZVNoZWV0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JTdHlsZVNoZWV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2
MzA0NC4uMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5
bGVTaGVldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYzICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
LSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TgotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVTaGVldC5o
IgotCi0jaW5jbHVkZSAiQ1NTSW1wb3J0UnVsZS5oIgotI2luY2x1ZGUgIkNTU0tleWZyYW1lc1J1
bGUuaCIKLSNpbmNsdWRlICJDU1NNZWRpYVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NQYXJzZXIuaCIK
LSNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlTb3Vy
Y2VEYXRhLmgiCi0jaW5jbHVkZSAiQ1NTUnVsZS5oIgotI2luY2x1ZGUgIkNTU1J1bGVMaXN0Lmgi
Ci0jaW5jbHVkZSAiQ1NTU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTU3R5bGVTaGVldC5oIgot
I2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgotI2luY2x1ZGUgIkNvbnRlbnRTZWN1cml0eVBv
bGljeS5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRWxlbWVudC5oIgotI2lu
Y2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgotI2luY2x1
ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKLSNpbmNsdWRlICJIVE1MU3R5bGVFbGVtZW50LmgiCi0j
aW5jbHVkZSAiSW5zcGVjdG9yQ1NTQWdlbnQuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JQYWdlQWdl
bnQuaCIKLSNpbmNsdWRlICJOb2RlLmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgotI2luY2x1
ZGUgIlNWR05hbWVzLmgiCi0jaW5jbHVkZSAiU3R5bGVQcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAi
U3R5bGVSZXNvbHZlci5oIgotI2luY2x1ZGUgIlN0eWxlUnVsZS5oIgotI2luY2x1ZGUgIlN0eWxl
UnVsZUltcG9ydC5oIgotI2luY2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgotI2luY2x1ZGUg
IlN0eWxlU2hlZXRMaXN0LmgiCi0jaW5jbHVkZSA8aW5zcGVjdG9yL0NvbnRlbnRTZWFyY2hVdGls
aXRpZXMuaD4KLSNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KLSNpbmNsdWRlIDx3dGYvdGV4
dC9TdHJpbmdCdWlsZGVyLmg+Ci0jaW5jbHVkZSA8eWFyci9SZWd1bGFyRXhwcmVzc2lvbi5oPgot
Ci11c2luZyBJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTsKLXVzaW5nIFdlYkNvcmU6OlJ1bGVT
b3VyY2VEYXRhTGlzdDsKLXVzaW5nIFdlYkNvcmU6OkNTU1J1bGVTb3VyY2VEYXRhOwotCi1jbGFz
cyBQYXJzZWRTdHlsZVNoZWV0IHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQYXJzZWRTdHls
ZVNoZWV0KTsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBQYXJz
ZWRTdHlsZVNoZWV0KCkgeyB9Ci0KLSAgICBjb25zdCBTdHJpbmcmIHRleHQoKSBjb25zdCB7IEFT
U0VSVChtX2hhc1RleHQpOyByZXR1cm4gbV90ZXh0OyB9Ci0gICAgdm9pZCBzZXRUZXh0KGNvbnN0
IFN0cmluZyYgdGV4dCk7Ci0gICAgYm9vbCBoYXNUZXh0KCkgY29uc3QgeyByZXR1cm4gbV9oYXNU
ZXh0OyB9Ci0gICAgUnVsZVNvdXJjZURhdGFMaXN0KiBzb3VyY2VEYXRhKCkgY29uc3QgeyByZXR1
cm4gbV9zb3VyY2VEYXRhLmdldCgpOyB9Ci0gICAgdm9pZCBzZXRTb3VyY2VEYXRhKHN0ZDo6dW5p
cXVlX3B0cjxSdWxlU291cmNlRGF0YUxpc3Q+KTsKLSAgICBib29sIGhhc1NvdXJjZURhdGEoKSBj
b25zdCB7IHJldHVybiBtX3NvdXJjZURhdGEgIT0gbnVsbHB0cjsgfQotICAgIFJlZlB0cjxXZWJD
b3JlOjpDU1NSdWxlU291cmNlRGF0YT4gcnVsZVNvdXJjZURhdGFBdCh1bnNpZ25lZCkgY29uc3Q7
Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fdGV4dDsKLSAgICBib29sIG1faGFzVGV4dCB7ZmFs
c2V9OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxSdWxlU291cmNlRGF0YUxpc3Q+IG1fc291cmNlRGF0
YTsKLX07Ci0KLXZvaWQgUGFyc2VkU3R5bGVTaGVldDo6c2V0VGV4dChjb25zdCBTdHJpbmcmIHRl
eHQpCi17Ci0gICAgbV9oYXNUZXh0ID0gdHJ1ZTsKLSAgICBtX3RleHQgPSB0ZXh0OwotICAgIHNl
dFNvdXJjZURhdGEobnVsbHB0cik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsYXR0ZW5Tb3VyY2VEYXRh
KFJ1bGVTb3VyY2VEYXRhTGlzdCogZGF0YUxpc3QsIFJ1bGVTb3VyY2VEYXRhTGlzdCogdGFyZ2V0
KQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YUxpc3QtPnNpemUoKTsgKytpKSB7
Ci0gICAgICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4mIGRhdGEgPSBkYXRhTGlzdC0+YXQo
aSk7Ci0gICAgICAgIGlmIChkYXRhLT50eXBlID09IENTU1J1bGVTb3VyY2VEYXRhOjpTVFlMRV9S
VUxFKQotICAgICAgICAgICAgdGFyZ2V0LT5hcHBlbmQoZGF0YSk7Ci0gICAgICAgIGVsc2UgaWYg
KGRhdGEtPnR5cGUgPT0gQ1NTUnVsZVNvdXJjZURhdGE6Ok1FRElBX1JVTEUpCi0gICAgICAgICAg
ICBmbGF0dGVuU291cmNlRGF0YSgmZGF0YS0+Y2hpbGRSdWxlcywgdGFyZ2V0KTsKLSAgICAgICAg
ZWxzZSBpZiAoZGF0YS0+dHlwZSA9PSBDU1NSdWxlU291cmNlRGF0YTo6U1VQUE9SVFNfUlVMRSkK
LSAgICAgICAgICAgIGZsYXR0ZW5Tb3VyY2VEYXRhKCZkYXRhLT5jaGlsZFJ1bGVzLCB0YXJnZXQp
OwotICAgIH0KLX0KLQotdm9pZCBQYXJzZWRTdHlsZVNoZWV0OjpzZXRTb3VyY2VEYXRhKHN0ZDo6
dW5pcXVlX3B0cjxSdWxlU291cmNlRGF0YUxpc3Q+IHNvdXJjZURhdGEpCi17Ci0gICAgaWYgKCFz
b3VyY2VEYXRhKSB7Ci0gICAgICAgIG1fc291cmNlRGF0YS5yZXNldCgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgbV9zb3VyY2VEYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxSdWxlU291
cmNlRGF0YUxpc3Q+KCk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1
dGlvbiB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGZsYXQgc291cmNlRGF0YSBzdHJ1Y3R1cmUKLSAg
ICAvLyBjb250YWluaW5nIG9ubHkgc3R5bGUgcnVsZXMsIGV2ZW4gdGhvdWdoIENTU1BhcnNlciBu
b3cgcHJvdmlkZXMgdGhlIGZ1bGwgcnVsZSBzb3VyY2UgZGF0YSB0cmVlLgotICAgIC8vIE5vcm1h
bGx5LCB3ZSBzaG91bGQganVzdCBhc3NpZ24gbV9zb3VyY2VEYXRhID0gc291cmNlRGF0YTsKLSAg
ICBmbGF0dGVuU291cmNlRGF0YShzb3VyY2VEYXRhLmdldCgpLCBtX3NvdXJjZURhdGEuZ2V0KCkp
OwotfQotCi1SZWZQdHI8V2ViQ29yZTo6Q1NTUnVsZVNvdXJjZURhdGE+IFBhcnNlZFN0eWxlU2hl
ZXQ6OnJ1bGVTb3VyY2VEYXRhQXQodW5zaWduZWQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKCFo
YXNTb3VyY2VEYXRhKCkgfHwgaW5kZXggPj0gbV9zb3VyY2VEYXRhLT5zaXplKCkpCi0gICAgICAg
IHJldHVybiBudWxscHRyOwotCi0gICAgcmV0dXJuIG1fc291cmNlRGF0YS0+YXQoaW5kZXgpOwot
fQotCi11c2luZyBuYW1lc3BhY2UgSW5zcGVjdG9yOwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0K
LWVudW0gY2xhc3MgTWVkaWFMaXN0U291cmNlIHsKLSAgICBMaW5rZWRTaGVldCwKLSAgICBJbmxp
bmVTaGVldCwKLSAgICBNZWRpYVJ1bGUsCi0gICAgSW1wb3J0UnVsZQotfTsKLQotSW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luIHN0eWxlc2hlZXRPcmlnaW5Ub1Byb3Rv
Y29sRW51bShTdHlsZVNoZWV0T3JpZ2luIG9yaWdpbikKLXsKLSAgICBzd2l0Y2ggKG9yaWdpbikg
ewotICAgIGNhc2UgU3R5bGVTaGVldE9yaWdpbjo6SW5zcGVjdG9yOgotICAgICAgICByZXR1cm4g
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luOjpJbnNwZWN0b3I7Ci0g
ICAgY2FzZSBTdHlsZVNoZWV0T3JpZ2luOjpVc2VyQWdlbnQ6Ci0gICAgICAgIHJldHVybiBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlVzZXJBZ2VudDsKLSAgICBj
YXNlIFN0eWxlU2hlZXRPcmlnaW46OlVzZXI6Ci0gICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlBy
b3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlVzZXI7Ci0gICAgY2FzZSBTdHlsZVNoZWV0
T3JpZ2luOjpBdXRob3I6Ci0gICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OlN0eWxlU2hlZXRPcmlnaW46OlJlZ3VsYXI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OlN0eWxlU2hlZXRPcmlnaW46OlJlZ3VsYXI7Ci0gICAgfQotfQotCi1zdGF0aWMgUmVmUHRyPElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U291cmNlUmFuZ2U+IGJ1aWxkU291cmNlUmFuZ2VPYmpl
Y3QoY29uc3QgU291cmNlUmFuZ2UmIHJhbmdlLCBWZWN0b3I8c2l6ZV90PiogbGluZUVuZGluZ3Mp
Ci17Ci0gICAgaWYgKCFsaW5lRW5kaW5ncykKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAg
VGV4dFBvc2l0aW9uIHN0YXJ0ID0gQ29udGVudFNlYXJjaFV0aWxpdGllczo6dGV4dFBvc2l0aW9u
RnJvbU9mZnNldChyYW5nZS5zdGFydCwgKmxpbmVFbmRpbmdzKTsKLSAgICBUZXh0UG9zaXRpb24g
ZW5kID0gQ29udGVudFNlYXJjaFV0aWxpdGllczo6dGV4dFBvc2l0aW9uRnJvbU9mZnNldChyYW5n
ZS5lbmQsICpsaW5lRW5kaW5ncyk7Ci0KLSAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6
Q1NTOjpTb3VyY2VSYW5nZTo6Y3JlYXRlKCkKLSAgICAgICAgLnNldFN0YXJ0TGluZShzdGFydC5t
X2xpbmUuemVyb0Jhc2VkSW50KCkpCi0gICAgICAgIC5zZXRTdGFydENvbHVtbihzdGFydC5tX2Nv
bHVtbi56ZXJvQmFzZWRJbnQoKSkKLSAgICAgICAgLnNldEVuZExpbmUoZW5kLm1fbGluZS56ZXJv
QmFzZWRJbnQoKSkKLSAgICAgICAgLnNldEVuZENvbHVtbihlbmQubV9jb2x1bW4uemVyb0Jhc2Vk
SW50KCkpCi0gICAgICAgIC5yZWxlYXNlKCk7Ci19Ci0KLXN0YXRpYyBSZWY8SW5zcGVjdG9yOjpQ
cm90b2NvbDo6Q1NTOjpDU1NNZWRpYT4gYnVpbGRNZWRpYU9iamVjdChjb25zdCBNZWRpYUxpc3Qq
IG1lZGlhLCBNZWRpYUxpc3RTb3VyY2UgbWVkaWFMaXN0U291cmNlLCBjb25zdCBTdHJpbmcmIHNv
dXJjZVVSTCkKLXsKLSAgICAvLyBNYWtlIGNlcnRhaW4gY29tcGlsZXJzIGhhcHB5IGJ5IGluaXRp
YWxpemluZyB8c291cmNlfCB1cC1mcm9udC4KLSAgICBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU01lZGlhOjpTb3VyY2Ugc291cmNlID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NN
ZWRpYTo6U291cmNlOjpJbmxpbmVTaGVldDsKLSAgICBzd2l0Y2ggKG1lZGlhTGlzdFNvdXJjZSkg
ewotICAgIGNhc2UgTWVkaWFMaXN0U291cmNlOjpNZWRpYVJ1bGU6Ci0gICAgICAgIHNvdXJjZSA9
IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE6OlNvdXJjZTo6TWVkaWFSdWxlOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIE1lZGlhTGlzdFNvdXJjZTo6SW1wb3J0UnVsZToKLSAg
ICAgICAgc291cmNlID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6U291cmNl
OjpJbXBvcnRSdWxlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1lZGlhTGlzdFNvdXJjZTo6
TGlua2VkU2hlZXQ6Ci0gICAgICAgIHNvdXJjZSA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6
Q1NTTWVkaWE6OlNvdXJjZTo6TGlua2VkU2hlZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Ug
TWVkaWFMaXN0U291cmNlOjpJbmxpbmVTaGVldDoKLSAgICAgICAgc291cmNlID0gSW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlOjpJbmxpbmVTaGVldDsKLSAgICAgICAg
YnJlYWs7Ci0gICAgfQotCi0gICAgYXV0byBtZWRpYU9iamVjdCA9IEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6Q1NTTWVkaWE6OmNyZWF0ZSgpCi0gICAgICAgIC5zZXRUZXh0KG1lZGlhLT5tZWRp
YVRleHQoKSkKLSAgICAgICAgLnNldFNvdXJjZShzb3VyY2UpCi0gICAgICAgIC5yZWxlYXNlKCk7
Ci0KLSAgICBpZiAoIXNvdXJjZVVSTC5pc0VtcHR5KCkpIHsKLSAgICAgICAgbWVkaWFPYmplY3Qt
PnNldFNvdXJjZVVSTChzb3VyY2VVUkwpOwotICAgICAgICBtZWRpYU9iamVjdC0+c2V0U291cmNl
TGluZShtZWRpYS0+cXVlcmllcygpLT5sYXN0TGluZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFdU
Rjo6bW92ZShtZWRpYU9iamVjdCk7Ci19Ci0KLXN0YXRpYyBSZWZQdHI8Q1NTUnVsZUxpc3Q+IGFz
Q1NTUnVsZUxpc3QoQ1NTU3R5bGVTaGVldCogc3R5bGVTaGVldCkKLXsKLSAgICBpZiAoIXN0eWxl
U2hlZXQpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgUmVmUHRyPFN0YXRpY0NTU1J1
bGVMaXN0PiBsaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIFZlY3RvcjxS
ZWZQdHI8Q1NTUnVsZT4+JiBsaXN0UnVsZXMgPSBsaXN0LT5ydWxlcygpOwotICAgIGZvciAodW5z
aWduZWQgaSA9IDAsIHNpemUgPSBzdHlsZVNoZWV0LT5sZW5ndGgoKTsgaSA8IHNpemU7ICsraSkg
ewotICAgICAgICBDU1NSdWxlKiBpdGVtID0gc3R5bGVTaGVldC0+aXRlbShpKTsKLSAgICAgICAg
aWYgKGl0ZW0tPnR5cGUoKSA9PSBDU1NSdWxlOjpDSEFSU0VUX1JVTEUpCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgbGlzdFJ1bGVzLmFwcGVuZChpdGVtKTsKLSAgICB9Ci0gICAgcmV0
dXJuIFdURjo6bW92ZShsaXN0KTsKLX0KLQotc3RhdGljIFJlZlB0cjxDU1NSdWxlTGlzdD4gYXND
U1NSdWxlTGlzdChDU1NSdWxlKiBydWxlKQotewotICAgIGlmICghcnVsZSkKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0KLSAgICBpZiAoaXM8Q1NTTWVkaWFSdWxlPigqcnVsZSkpCi0gICAgICAg
IHJldHVybiAmZG93bmNhc3Q8Q1NTTWVkaWFSdWxlPigqcnVsZSkuY3NzUnVsZXMoKTsKLQotICAg
IGlmIChpczxDU1NLZXlmcmFtZXNSdWxlPigqcnVsZSkpCi0gICAgICAgIHJldHVybiAmZG93bmNh
c3Q8Q1NTS2V5ZnJhbWVzUnVsZT4oKnJ1bGUpLmNzc1J1bGVzKCk7Ci0KLSAgICBpZiAoaXM8Q1NT
U3VwcG9ydHNSdWxlPigqcnVsZSkpCi0gICAgICAgIHJldHVybiAmZG93bmNhc3Q8Q1NTU3VwcG9y
dHNSdWxlPigqcnVsZSkuY3NzUnVsZXMoKTsKLQotICAgIHJldHVybiBudWxscHRyOwotfQotCi1z
dGF0aWMgdm9pZCBmaWxsTWVkaWFMaXN0Q2hhaW4oQ1NTUnVsZSogcnVsZSwgQXJyYXk8SW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYT4mIG1lZGlhQXJyYXkpCi17Ci0gICAgTWVkaWFM
aXN0KiBtZWRpYUxpc3Q7Ci0gICAgQ1NTUnVsZSogcGFyZW50UnVsZSA9IHJ1bGU7Ci0gICAgU3Ry
aW5nIHNvdXJjZVVSTDsKLSAgICB3aGlsZSAocGFyZW50UnVsZSkgewotICAgICAgICBDU1NTdHls
ZVNoZWV0KiBwYXJlbnRTdHlsZVNoZWV0ID0gbnVsbHB0cjsKLSAgICAgICAgYm9vbCBpc01lZGlh
UnVsZSA9IHRydWU7Ci0gICAgICAgIGlmIChpczxDU1NNZWRpYVJ1bGU+KCpwYXJlbnRSdWxlKSkg
ewotICAgICAgICAgICAgQ1NTTWVkaWFSdWxlJiBtZWRpYVJ1bGUgPSBkb3duY2FzdDxDU1NNZWRp
YVJ1bGU+KCpwYXJlbnRSdWxlKTsKLSAgICAgICAgICAgIG1lZGlhTGlzdCA9IG1lZGlhUnVsZS5t
ZWRpYSgpOwotICAgICAgICAgICAgcGFyZW50U3R5bGVTaGVldCA9IG1lZGlhUnVsZS5wYXJlbnRT
dHlsZVNoZWV0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXM8Q1NTSW1wb3J0UnVsZT4oKnBhcmVu
dFJ1bGUpKSB7Ci0gICAgICAgICAgICBDU1NJbXBvcnRSdWxlJiBpbXBvcnRSdWxlID0gZG93bmNh
c3Q8Q1NTSW1wb3J0UnVsZT4oKnBhcmVudFJ1bGUpOwotICAgICAgICAgICAgbWVkaWFMaXN0ID0g
JmltcG9ydFJ1bGUubWVkaWEoKTsKLSAgICAgICAgICAgIHBhcmVudFN0eWxlU2hlZXQgPSBpbXBv
cnRSdWxlLnBhcmVudFN0eWxlU2hlZXQoKTsKLSAgICAgICAgICAgIGlzTWVkaWFSdWxlID0gZmFs
c2U7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbWVkaWFMaXN0ID0gbnVsbHB0cjsKLQot
ICAgICAgICBpZiAocGFyZW50U3R5bGVTaGVldCkgewotICAgICAgICAgICAgc291cmNlVVJMID0g
cGFyZW50U3R5bGVTaGVldC0+Y29udGVudHMoKS5iYXNlVVJMKCk7Ci0gICAgICAgICAgICBpZiAo
c291cmNlVVJMLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBJbnNwZWN0
b3JET01BZ2VudDo6ZG9jdW1lbnRVUkxTdHJpbmcocGFyZW50U3R5bGVTaGVldC0+b3duZXJEb2N1
bWVudCgpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzb3VyY2VVUkwgPSAiIjsKLQot
ICAgICAgICBpZiAobWVkaWFMaXN0ICYmIG1lZGlhTGlzdC0+bGVuZ3RoKCkpCi0gICAgICAgICAg
ICBtZWRpYUFycmF5LmFkZEl0ZW0oYnVpbGRNZWRpYU9iamVjdChtZWRpYUxpc3QsIGlzTWVkaWFS
dWxlID8gTWVkaWFMaXN0U291cmNlOjpNZWRpYVJ1bGUgOiBNZWRpYUxpc3RTb3VyY2U6OkltcG9y
dFJ1bGUsIHNvdXJjZVVSTCkpOwotCi0gICAgICAgIGlmIChwYXJlbnRSdWxlLT5wYXJlbnRSdWxl
KCkpCi0gICAgICAgICAgICBwYXJlbnRSdWxlID0gcGFyZW50UnVsZS0+cGFyZW50UnVsZSgpOwot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENTU1N0eWxlU2hlZXQqIHN0eWxlU2hlZXQgPSBw
YXJlbnRSdWxlLT5wYXJlbnRTdHlsZVNoZWV0KCk7Ci0gICAgICAgICAgICB3aGlsZSAoc3R5bGVT
aGVldCkgewotICAgICAgICAgICAgICAgIG1lZGlhTGlzdCA9IHN0eWxlU2hlZXQtPm1lZGlhKCk7
Ci0gICAgICAgICAgICAgICAgaWYgKG1lZGlhTGlzdCAmJiBtZWRpYUxpc3QtPmxlbmd0aCgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50KiBkb2MgPSBzdHlsZVNoZWV0LT5vd25lckRv
Y3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb2MpCi0gICAgICAgICAgICAgICAg
ICAgICAgICBzb3VyY2VVUkwgPSBkb2MtPnVybCgpOwotICAgICAgICAgICAgICAgICAgICBlbHNl
IGlmICghc3R5bGVTaGVldC0+Y29udGVudHMoKS5iYXNlVVJMKCkuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgc291cmNlVVJMID0gc3R5bGVTaGVldC0+Y29udGVudHMoKS5iYXNl
VVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAg
IHNvdXJjZVVSTCA9ICIiOwotICAgICAgICAgICAgICAgICAgICBtZWRpYUFycmF5LmFkZEl0ZW0o
YnVpbGRNZWRpYU9iamVjdChtZWRpYUxpc3QsIHN0eWxlU2hlZXQtPm93bmVyTm9kZSgpID8gTWVk
aWFMaXN0U291cmNlOjpMaW5rZWRTaGVldCA6IE1lZGlhTGlzdFNvdXJjZTo6SW5saW5lU2hlZXQs
IHNvdXJjZVVSTCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXJlbnRS
dWxlID0gc3R5bGVTaGVldC0+b3duZXJSdWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVu
dFJ1bGUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHN0eWxl
U2hlZXQgPSBzdHlsZVNoZWV0LT5wYXJlbnRTdHlsZVNoZWV0KCk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1NTUGFyc2VyPiBj
cmVhdGVDU1NQYXJzZXIoRG9jdW1lbnQqIGRvY3VtZW50KQotewotICAgIHJldHVybiBzdGQ6Om1h
a2VfdW5pcXVlPENTU1BhcnNlcj4oZG9jdW1lbnQgPyBDU1NQYXJzZXJDb250ZXh0KCpkb2N1bWVu
dCkgOiBzdHJpY3RDU1NQYXJzZXJDb250ZXh0KCkpOwotfQotCi1SZWY8SW5zcGVjdG9yU3R5bGU+
IEluc3BlY3RvclN0eWxlOjpjcmVhdGUoY29uc3QgSW5zcGVjdG9yQ1NTSWQmIHN0eWxlSWQsIFJl
ZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiYmIHN0eWxlLCBJbnNwZWN0b3JTdHlsZVNoZWV0KiBw
YXJlbnRTdHlsZVNoZWV0KQotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEluc3BlY3RvclN0
eWxlKHN0eWxlSWQsIFdURjo6bW92ZShzdHlsZSksIHBhcmVudFN0eWxlU2hlZXQpKTsKLX0KLQot
SW5zcGVjdG9yU3R5bGU6Okluc3BlY3RvclN0eWxlKGNvbnN0IEluc3BlY3RvckNTU0lkJiBzdHls
ZUlkLCBSZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4mJiBzdHlsZSwgSW5zcGVjdG9yU3R5bGVT
aGVldCogcGFyZW50U3R5bGVTaGVldCkKLSAgICA6IG1fc3R5bGVJZChzdHlsZUlkKQotICAgICwg
bV9zdHlsZShzdHlsZSkKLSAgICAsIG1fcGFyZW50U3R5bGVTaGVldChwYXJlbnRTdHlsZVNoZWV0
KQotewotICAgIEFTU0VSVChtX3N0eWxlKTsKLX0KLQotSW5zcGVjdG9yU3R5bGU6On5JbnNwZWN0
b3JTdHlsZSgpCi17Ci19Ci0KLVJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0
eWxlPiBJbnNwZWN0b3JTdHlsZTo6YnVpbGRPYmplY3RGb3JTdHlsZSgpIGNvbnN0Ci17Ci0gICAg
UmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IHJlc3VsdCA9IHN0eWxlV2l0
aFByb3BlcnRpZXMoKTsKLSAgICBpZiAoIW1fc3R5bGVJZC5pc0VtcHR5KCkpCi0gICAgICAgIHJl
c3VsdC0+c2V0U3R5bGVJZChtX3N0eWxlSWQuYXNQcm90b2NvbFZhbHVlPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU3R5bGVJZD4oKSk7Ci0KLSAgICByZXN1bHQtPnNldFdpZHRoKG1fc3R5
bGUtPmdldFByb3BlcnR5VmFsdWUoIndpZHRoIikpOwotICAgIHJlc3VsdC0+c2V0SGVpZ2h0KG1f
c3R5bGUtPmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpKTsKLQotICAgIFJlZlB0cjxDU1NSdWxl
U291cmNlRGF0YT4gc291cmNlRGF0YSA9IGV4dHJhY3RTb3VyY2VEYXRhKCk7Ci0gICAgaWYgKHNv
dXJjZURhdGEpCi0gICAgICAgIHJlc3VsdC0+c2V0UmFuZ2UoYnVpbGRTb3VyY2VSYW5nZU9iamVj
dChzb3VyY2VEYXRhLT5ydWxlQm9keVJhbmdlLCBtX3BhcmVudFN0eWxlU2hlZXQtPmxpbmVFbmRp
bmdzKCkuZ2V0KCkpKTsKLQotICAgIHJldHVybiBXVEY6Om1vdmUocmVzdWx0KTsKLX0KLQotUmVm
PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
Q29tcHV0ZWRTdHlsZVByb3BlcnR5Pj4gSW5zcGVjdG9yU3R5bGU6OmJ1aWxkQXJyYXlGb3JDb21w
dXRlZFN0eWxlKCkgY29uc3QKLXsKLSAgICBhdXRvIHJlc3VsdCA9IEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTQ29tcHV0ZWRTdHlsZVByb3Bl
cnR5Pjo6Y3JlYXRlKCk7Ci0gICAgVmVjdG9yPEluc3BlY3RvclN0eWxlUHJvcGVydHk+IHByb3Bl
cnRpZXM7Ci0gICAgcG9wdWxhdGVBbGxQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzKTsKLQotICAgIGZv
ciAoVmVjdG9yPEluc3BlY3RvclN0eWxlUHJvcGVydHk+OjppdGVyYXRvciBpdCA9IHByb3BlcnRp
ZXMuYmVnaW4oKSwgaXRFbmQgPSBwcm9wZXJ0aWVzLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCkg
ewotICAgICAgICBjb25zdCBDU1NQcm9wZXJ0eVNvdXJjZURhdGEmIHByb3BlcnR5RW50cnkgPSBp
dC0+c291cmNlRGF0YTsKLSAgICAgICAgYXV0byBlbnRyeSA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5OjpjcmVhdGUoKQotICAgICAgICAgICAgLnNl
dE5hbWUocHJvcGVydHlFbnRyeS5uYW1lKQotICAgICAgICAgICAgLnNldFZhbHVlKHByb3BlcnR5
RW50cnkudmFsdWUpCi0gICAgICAgICAgICAucmVsZWFzZSgpOwotICAgICAgICByZXN1bHQtPmFk
ZEl0ZW0oV1RGOjptb3ZlKGVudHJ5KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFdURjo6bW92ZShy
ZXN1bHQpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlOjpnZXRUZXh0KFN0cmluZyogcmVzdWx0
KSBjb25zdAotewotICAgIC8vIFByZWNvbmRpdGlvbjogbV9wYXJlbnRTdHlsZVNoZWV0LT5lbnN1
cmVQYXJzZWREYXRhUmVhZHkoKSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgotICAgIFJl
ZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0YSA9IGV4dHJhY3RTb3VyY2VEYXRhKCk7
Ci0gICAgaWYgKCFzb3VyY2VEYXRhKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJp
bmcgc3R5bGVTaGVldFRleHQ7Ci0gICAgYm9vbCBzdWNjZXNzID0gbV9wYXJlbnRTdHlsZVNoZWV0
LT5nZXRUZXh0KCZzdHlsZVNoZWV0VGV4dCk7Ci0gICAgaWYgKCFzdWNjZXNzKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBTb3VyY2VSYW5nZSYgYm9keVJhbmdlID0gc291cmNlRGF0YS0+
cnVsZUJvZHlSYW5nZTsKLSAgICAqcmVzdWx0ID0gc3R5bGVTaGVldFRleHQuc3Vic3RyaW5nKGJv
ZHlSYW5nZS5zdGFydCwgYm9keVJhbmdlLmVuZCAtIGJvZHlSYW5nZS5zdGFydCk7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGU6OnBvcHVsYXRlQWxsUHJvcGVydGll
cyhWZWN0b3I8SW5zcGVjdG9yU3R5bGVQcm9wZXJ0eT4qIHJlc3VsdCkgY29uc3QKLXsKLSAgICBI
YXNoU2V0PFN0cmluZz4gc291cmNlUHJvcGVydHlOYW1lczsKLQotICAgIFJlZlB0cjxDU1NSdWxl
U291cmNlRGF0YT4gc291cmNlRGF0YSA9IGV4dHJhY3RTb3VyY2VEYXRhKCk7Ci0gICAgVmVjdG9y
PENTU1Byb3BlcnR5U291cmNlRGF0YT4qIHNvdXJjZVByb3BlcnR5RGF0YSA9IHNvdXJjZURhdGEg
PyAmKHNvdXJjZURhdGEtPnN0eWxlU291cmNlRGF0YS0+cHJvcGVydHlEYXRhKSA6IG51bGxwdHI7
Ci0gICAgaWYgKHNvdXJjZVByb3BlcnR5RGF0YSkgewotICAgICAgICBTdHJpbmcgc3R5bGVEZWNs
YXJhdGlvbjsKLSAgICAgICAgYm9vbCBpc1N0eWxlVGV4dEtub3duID0gc3R5bGVUZXh0KCZzdHls
ZURlY2xhcmF0aW9uKTsKLSAgICAgICAgQVNTRVJUX1VOVVNFRChpc1N0eWxlVGV4dEtub3duLCBp
c1N0eWxlVGV4dEtub3duKTsKLSAgICAgICAgZm9yIChWZWN0b3I8Q1NTUHJvcGVydHlTb3VyY2VE
YXRhPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzb3VyY2VQcm9wZXJ0eURhdGEtPmJlZ2luKCk7IGl0
ICE9IHNvdXJjZVByb3BlcnR5RGF0YS0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIEluc3Bl
Y3RvclN0eWxlUHJvcGVydHkgcCgqaXQsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIHAuc2V0
UmF3VGV4dEZyb21TdHlsZURlY2xhcmF0aW9uKHN0eWxlRGVjbGFyYXRpb24pOwotICAgICAgICAg
ICAgcmVzdWx0LT5hcHBlbmQocCk7Ci0gICAgICAgICAgICBzb3VyY2VQcm9wZXJ0eU5hbWVzLmFk
ZChpdC0+bmFtZS5sb3dlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IGkg
PSAwLCBzaXplID0gbV9zdHlsZS0+bGVuZ3RoKCk7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAg
U3RyaW5nIG5hbWUgPSBtX3N0eWxlLT5pdGVtKGkpOwotICAgICAgICBpZiAoc291cmNlUHJvcGVy
dHlOYW1lcy5jb250YWlucyhuYW1lLmxvd2VyKCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgc291cmNlUHJvcGVydHlOYW1lcy5hZGQobmFtZS5sb3dlcigpKTsKLSAgICAgICAg
cmVzdWx0LT5hcHBlbmQoSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eVNvdXJjZURh
dGEobmFtZSwgbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShuYW1lKSwgIW1fc3R5bGUtPmdldFBy
b3BlcnR5UHJpb3JpdHkobmFtZSkuaXNFbXB0eSgpLCB0cnVlLCBTb3VyY2VSYW5nZSgpKSwgZmFs
c2UsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVJlZjxJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlPiBJbnNwZWN0b3JTdHlsZTo6c3R5bGVXaXRoUHJv
cGVydGllcygpIGNvbnN0Ci17Ci0gICAgVmVjdG9yPEluc3BlY3RvclN0eWxlUHJvcGVydHk+IHBy
b3BlcnRpZXM7Ci0gICAgcG9wdWxhdGVBbGxQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzKTsKLQotICAg
IGF1dG8gcHJvcGVydGllc09iamVjdCA9IEFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6
Q1NTUHJvcGVydHk+OjpjcmVhdGUoKTsKLSAgICBhdXRvIHNob3J0aGFuZEVudHJpZXMgPSBBcnJh
eTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNob3J0aGFuZEVudHJ5Pjo6Y3JlYXRlKCk7Ci0g
ICAgSGFzaE1hcDxTdHJpbmcsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1By
b3BlcnR5Pj4gcHJvcGVydHlOYW1lVG9QcmV2aW91c0FjdGl2ZVByb3BlcnR5OwotICAgIEhhc2hT
ZXQ8U3RyaW5nPiBmb3VuZFNob3J0aGFuZHM7Ci0gICAgU3RyaW5nIHByZXZpb3VzUHJpb3JpdHk7
Ci0gICAgU3RyaW5nIHByZXZpb3VzU3RhdHVzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxWZWN0b3I8
c2l6ZV90Pj4gbGluZUVuZGluZ3MobV9wYXJlbnRTdHlsZVNoZWV0ID8gbV9wYXJlbnRTdHlsZVNo
ZWV0LT5saW5lRW5kaW5ncygpIDogbnVsbHB0cik7Ci0gICAgUmVmUHRyPENTU1J1bGVTb3VyY2VE
YXRhPiBzb3VyY2VEYXRhID0gZXh0cmFjdFNvdXJjZURhdGEoKTsKLSAgICB1bnNpZ25lZCBydWxl
Qm9keVJhbmdlU3RhcnQgPSBzb3VyY2VEYXRhID8gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5z
dGFydCA6IDA7Ci0KLSAgICBmb3IgKFZlY3RvcjxJbnNwZWN0b3JTdHlsZVByb3BlcnR5Pjo6aXRl
cmF0b3IgaXQgPSBwcm9wZXJ0aWVzLmJlZ2luKCksIGl0RW5kID0gcHJvcGVydGllcy5lbmQoKTsg
aXQgIT0gaXRFbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgQ1NTUHJvcGVydHlTb3VyY2VEYXRh
JiBwcm9wZXJ0eUVudHJ5ID0gaXQtPnNvdXJjZURhdGE7Ci0gICAgICAgIGNvbnN0IFN0cmluZyYg
bmFtZSA9IHByb3BlcnR5RW50cnkubmFtZTsKLQotICAgICAgICAvLyBWaXN1YWwgU3R1ZGlvIGRp
c2FncmVlcyB3aXRoIG90aGVyIGNvbXBpbGVycyBhcyB0byB3aGV0aGVyICdjbGFzcycgaXMgbmVl
ZGVkIGhlcmUuCi0jaWYgQ09NUElMRVIoTVNWQykKLSAgICAgICAgZW51bSBjbGFzcyBQcm90b2Nv
bDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1cyBzdGF0dXM7Ci0jZWxzZQotICAgICAgICBlbnVtIElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXMgc3RhdHVzOwotI2VuZGlm
Ci0gICAgICAgIHN0YXR1cyA9IGl0LT5kaXNhYmxlZCA/IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6Q1NTUHJvcGVydHlTdGF0dXM6OkRpc2FibGVkIDogSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpDU1NQcm9wZXJ0eVN0YXR1czo6QWN0aXZlOwotCi0gICAgICAgIFJlZlB0cjxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5PiBwcm9wZXJ0eSA9IEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6Q1NTUHJvcGVydHk6OmNyZWF0ZSgpCi0gICAgICAgICAgICAuc2V0TmFtZShuYW1l
Lmxvd2VyKCkpCi0gICAgICAgICAgICAuc2V0VmFsdWUocHJvcGVydHlFbnRyeS52YWx1ZSkKLSAg
ICAgICAgICAgIC5yZWxlYXNlKCk7Ci0KLSAgICAgICAgcHJvcGVydGllc09iamVjdC0+YWRkSXRl
bShwcm9wZXJ0eS5jb3B5UmVmKCkpOwotCi0gICAgICAgIC8vIERlZmF1bHQgInBhcnNlZE9rIiA9
PSB0cnVlLgotICAgICAgICBpZiAoIXByb3BlcnR5RW50cnkucGFyc2VkT2spCi0gICAgICAgICAg
ICBwcm9wZXJ0eS0+c2V0UGFyc2VkT2soZmFsc2UpOwotICAgICAgICBpZiAoaXQtPmhhc1Jhd1Rl
eHQoKSkKLSAgICAgICAgICAgIHByb3BlcnR5LT5zZXRUZXh0KGl0LT5yYXdUZXh0KTsKLQotICAg
ICAgICAvLyBEZWZhdWx0ICJwcmlvcml0eSIgPT0gIiIuCi0gICAgICAgIGlmIChwcm9wZXJ0eUVu
dHJ5LmltcG9ydGFudCkKLSAgICAgICAgICAgIHByb3BlcnR5LT5zZXRQcmlvcml0eSgiaW1wb3J0
YW50Iik7Ci0gICAgICAgIGlmICghaXQtPmRpc2FibGVkKSB7Ci0gICAgICAgICAgICBpZiAoaXQt
Pmhhc1NvdXJjZSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChzb3VyY2VEYXRhKTsKLSAgICAg
ICAgICAgICAgICBwcm9wZXJ0eS0+c2V0SW1wbGljaXQoZmFsc2UpOwotICAgICAgICAgICAgICAg
IC8vIFRoZSBwcm9wZXJ0eSByYW5nZSBpcyByZWxhdGl2ZSB0byB0aGUgc3R5bGUgYm9keSBzdGFy
dC4KLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgY29udmVydGVkIGludG8gYW4gYWJzb2x1
dGUgcmFuZ2UgKHJlbGF0aXZlIHRvIHRoZSBzdHlsZXNoZWV0IHN0YXJ0KQotICAgICAgICAgICAg
ICAgIC8vIGZvciB0aGUgcHJvcGVyIGNvbnZlcnNpb24gaW50byBsaW5lOmNvbHVtbi4KLSAgICAg
ICAgICAgICAgICBTb3VyY2VSYW5nZSBhYnNvbHV0ZVByb3BlcnR5UmFuZ2UgPSBwcm9wZXJ0eUVu
dHJ5LnJhbmdlOwotICAgICAgICAgICAgICAgIGFic29sdXRlUHJvcGVydHlSYW5nZS5zdGFydCAr
PSBydWxlQm9keVJhbmdlU3RhcnQ7Ci0gICAgICAgICAgICAgICAgYWJzb2x1dGVQcm9wZXJ0eVJh
bmdlLmVuZCArPSBydWxlQm9keVJhbmdlU3RhcnQ7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHkt
PnNldFJhbmdlKGJ1aWxkU291cmNlUmFuZ2VPYmplY3QoYWJzb2x1dGVQcm9wZXJ0eVJhbmdlLCBs
aW5lRW5kaW5ncy5nZXQoKSkpOwotCi0gICAgICAgICAgICAgICAgLy8gUGFyc2VkIHByb3BlcnR5
IG92ZXJyaWRlcyBhbnkgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lLiBOb24tcGFyc2VkIHBy
b3BlcnR5IG92ZXJyaWRlcwotICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIG5vbi1wYXJzZWQg
cHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIChpZiBhbnkpLgotICAgICAgICAgICAgICAgIGJv
b2wgc2hvdWxkSW5hY3RpdmF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIENTU1Byb3BlcnR5
SUQgcHJvcGVydHlJZCA9IGNzc1Byb3BlcnR5SUQobmFtZSk7Ci0gICAgICAgICAgICAgICAgLy8g
Q2Fub25pY2FsaXplIHByb3BlcnR5IG5hbWVzIHRvIHRyZWF0IG5vbi1wcmVmaXhlZCBhbmQgdmVu
ZG9yLXByZWZpeGVkIHByb3BlcnR5IG5hbWVzIHRoZSBzYW1lIChvcGFjaXR5IHZzLiAtd2Via2l0
LW9wYWNpdHkpLgotICAgICAgICAgICAgICAgIFN0cmluZyBjYW5vbmljYWxQcm9wZXJ0eU5hbWUg
PSBwcm9wZXJ0eUlkID8gZ2V0UHJvcGVydHlOYW1lU3RyaW5nKHByb3BlcnR5SWQpIDogbmFtZTsK
LSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6Q1NTUHJvcGVydHk+Pjo6aXRlcmF0b3IgYWN0aXZlSXQgPSBwcm9wZXJ0eU5hbWVU
b1ByZXZpb3VzQWN0aXZlUHJvcGVydHkuZmluZChjYW5vbmljYWxQcm9wZXJ0eU5hbWUpOwotICAg
ICAgICAgICAgICAgIGlmIChhY3RpdmVJdCAhPSBwcm9wZXJ0eU5hbWVUb1ByZXZpb3VzQWN0aXZl
UHJvcGVydHkuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RW50cnku
cGFyc2VkT2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzc1ByaW9yaXR5
ID0gYWN0aXZlSXQtPnZhbHVlLT5nZXRTdHJpbmcoSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpD
U1NQcm9wZXJ0eTo6UHJpb3JpdHksIHByZXZpb3VzUHJpb3JpdHkpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vbCBzdWNjZXNzU3RhdHVzID0gYWN0aXZlSXQtPnZhbHVlLT5nZXRTdHJpbmco
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eTo6U3RhdHVzLCBwcmV2aW91c1N0
YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc1N0YXR1cyAmJiBwcmV2
aW91c1N0YXR1cyAhPSAiaW5hY3RpdmUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHByb3BlcnR5RW50cnkuaW1wb3J0YW50IHx8ICFzdWNjZXNzUHJpb3JpdHkpIC8vIFByaW9y
aXR5IG5vdCBzZXQgPT0gIm5vdCBpbXBvcnRhbnQiLgotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzaG91bGRJbmFjdGl2YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBlbHNlIGlmIChzdGF0dXMgPT0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9w
ZXJ0eVN0YXR1czo6QWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IEluYWN0aXZhdGUgYSBub24taW1wb3J0YW50IHByb3BlcnR5IGZvbGxvd2luZyB0aGUgc2FtZS1u
YW1lZCBpbXBvcnRhbnQgcHJvcGVydHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXR1cyA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXM6Oklu
YWN0aXZlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJvb2wgcHJldmlvdXNQYXJzZWRPazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgc3VjY2VzcyA9IGFjdGl2ZUl0LT52YWx1ZS0+Z2V0Qm9vbGVhbihJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OkNTU1Byb3BlcnR5OjpQYXJzZWRPaywgcHJldmlvdXNQYXJzZWRPayk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiAhcHJldmlvdXNQYXJzZWRPaykKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmFjdGl2YXRlID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAg
ICAgICBwcm9wZXJ0eU5hbWVUb1ByZXZpb3VzQWN0aXZlUHJvcGVydHkuc2V0KGNhbm9uaWNhbFBy
b3BlcnR5TmFtZSwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEluYWN0
aXZhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlSXQtPnZhbHVlLT5zZXRTdGF0dXMo
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1czo6SW5hY3RpdmUpOwot
ICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVUb1ByZXZpb3VzQWN0aXZlUHJvcGVydHku
c2V0KGNhbm9uaWNhbFByb3BlcnR5TmFtZSwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpbXBsaWNpdCA9IG1f
c3R5bGUtPmlzUHJvcGVydHlJbXBsaWNpdChuYW1lKTsKLSAgICAgICAgICAgICAgICAvLyBEZWZh
dWx0ICJpbXBsaWNpdCIgPT0gZmFsc2UuCi0gICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0KQot
ICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+c2V0SW1wbGljaXQodHJ1ZSk7Ci0gICAgICAg
ICAgICAgICAgc3RhdHVzID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0
YXR1czo6U3R5bGU7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRoYW5kID0gbV9zdHls
ZS0+Z2V0UHJvcGVydHlTaG9ydGhhbmQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzaG9y
dGhhbmQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRTaG9ydGhh
bmRzLmNvbnRhaW5zKHNob3J0aGFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5k
U2hvcnRoYW5kcy5hZGQoc2hvcnRoYW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8g
ZW50cnkgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNob3J0aGFuZEVudHJ5OjpjcmVhdGUo
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKHNob3J0aGFuZCkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUoc2hvcnRoYW5kVmFsdWUoc2hvcnRoYW5k
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVsZWFzZSgpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgc2hvcnRoYW5kRW50cmllcy0+YWRkSXRlbShXVEY6Om1vdmUoZW50cnkpKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotCi0gICAgICAgIC8vIERlZmF1bHQgInN0YXR1cyIgPT0gInN0eWxlIi4KLSAg
ICAgICAgaWYgKHN0YXR1cyAhPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5
U3RhdHVzOjpTdHlsZSkKLSAgICAgICAgICAgIHByb3BlcnR5LT5zZXRTdGF0dXMoc3RhdHVzKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZTo6
Y3JlYXRlKCkKLSAgICAgICAgLnNldENzc1Byb3BlcnRpZXMoV1RGOjptb3ZlKHByb3BlcnRpZXNP
YmplY3QpKQotICAgICAgICAuc2V0U2hvcnRoYW5kRW50cmllcyhXVEY6Om1vdmUoc2hvcnRoYW5k
RW50cmllcykpCi0gICAgICAgIC5yZWxlYXNlKCk7Ci19Ci0KLVJlZlB0cjxDU1NSdWxlU291cmNl
RGF0YT4gSW5zcGVjdG9yU3R5bGU6OmV4dHJhY3RTb3VyY2VEYXRhKCkgY29uc3QKLXsKLSAgICBp
ZiAoIW1fcGFyZW50U3R5bGVTaGVldCB8fCAhbV9wYXJlbnRTdHlsZVNoZWV0LT5lbnN1cmVQYXJz
ZWREYXRhUmVhZHkoKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuIG1fcGFy
ZW50U3R5bGVTaGVldC0+cnVsZVNvdXJjZURhdGFGb3IobV9zdHlsZS5nZXQoKSk7Ci19Ci0KLWJv
b2wgSW5zcGVjdG9yU3R5bGU6OnNldFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0LCBFeGNlcHRpb25D
b2RlJiBlYykKLXsKLSAgICByZXR1cm4gbV9wYXJlbnRTdHlsZVNoZWV0LT5zZXRTdHlsZVRleHQo
bV9zdHlsZS5nZXQoKSwgdGV4dCwgZWMpOwotfQotCi1TdHJpbmcgSW5zcGVjdG9yU3R5bGU6OnNo
b3J0aGFuZFZhbHVlKGNvbnN0IFN0cmluZyYgc2hvcnRoYW5kUHJvcGVydHkpIGNvbnN0Ci17Ci0g
ICAgU3RyaW5nIHZhbHVlID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShzaG9ydGhhbmRQcm9w
ZXJ0eSk7Ci0gICAgaWYgKCF2YWx1ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB2YWx1ZTsK
LSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1fc3R5bGUtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nIGluZGl2aWR1YWxQcm9w
ZXJ0eSA9IG1fc3R5bGUtPml0ZW0oaSk7Ci0gICAgICAgIGlmIChtX3N0eWxlLT5nZXRQcm9wZXJ0
eVNob3J0aGFuZChpbmRpdmlkdWFsUHJvcGVydHkpICE9IHNob3J0aGFuZFByb3BlcnR5KQotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChtX3N0eWxlLT5pc1Byb3BlcnR5SW1wbGlj
aXQoaW5kaXZpZHVhbFByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBT
dHJpbmcgaW5kaXZpZHVhbFZhbHVlID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShpbmRpdmlk
dWFsUHJvcGVydHkpOwotICAgICAgICBpZiAoaW5kaXZpZHVhbFZhbHVlID09ICJpbml0aWFsIikK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoIWJ1aWxkZXIuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQo
aW5kaXZpZHVhbFZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsK
LX0KLQotU3RyaW5nIEluc3BlY3RvclN0eWxlOjpzaG9ydGhhbmRQcmlvcml0eShjb25zdCBTdHJp
bmcmIHNob3J0aGFuZFByb3BlcnR5KSBjb25zdAotewotICAgIFN0cmluZyBwcmlvcml0eSA9IG1f
c3R5bGUtPmdldFByb3BlcnR5UHJpb3JpdHkoc2hvcnRoYW5kUHJvcGVydHkpOwotICAgIGlmIChw
cmlvcml0eS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1f
c3R5bGUtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBpbmRpdmlkdWFsUHJv
cGVydHkgPSBtX3N0eWxlLT5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG1fc3R5bGUtPmdldFBy
b3BlcnR5U2hvcnRoYW5kKGluZGl2aWR1YWxQcm9wZXJ0eSkgIT0gc2hvcnRoYW5kUHJvcGVydHkp
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwcmlvcml0eSA9IG1fc3R5
bGUtPmdldFByb3BlcnR5UHJpb3JpdHkoaW5kaXZpZHVhbFByb3BlcnR5KTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcmlvcml0eTsKLX0KLQotVmVj
dG9yPFN0cmluZz4gSW5zcGVjdG9yU3R5bGU6OmxvbmdoYW5kUHJvcGVydGllcyhjb25zdCBTdHJp
bmcmIHNob3J0aGFuZFByb3BlcnR5KSBjb25zdAotewotICAgIFZlY3RvcjxTdHJpbmc+IHByb3Bl
cnRpZXM7Ci0gICAgSGFzaFNldDxTdHJpbmc+IGZvdW5kUHJvcGVydGllczsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbV9zdHlsZS0+bGVuZ3RoKCk7ICsraSkgewotICAgICAgICBTdHJp
bmcgaW5kaXZpZHVhbFByb3BlcnR5ID0gbV9zdHlsZS0+aXRlbShpKTsKLSAgICAgICAgaWYgKGZv
dW5kUHJvcGVydGllcy5jb250YWlucyhpbmRpdmlkdWFsUHJvcGVydHkpIHx8IG1fc3R5bGUtPmdl
dFByb3BlcnR5U2hvcnRoYW5kKGluZGl2aWR1YWxQcm9wZXJ0eSkgIT0gc2hvcnRoYW5kUHJvcGVy
dHkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmb3VuZFByb3BlcnRpZXMuYWRk
KGluZGl2aWR1YWxQcm9wZXJ0eSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYXBwZW5kKGluZGl2aWR1
YWxQcm9wZXJ0eSk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotfQotCi1SZWY8SW5z
cGVjdG9yU3R5bGVTaGVldD4gSW5zcGVjdG9yU3R5bGVTaGVldDo6Y3JlYXRlKGNvbnN0IFN0cmlu
ZyYgaWQsIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiYmIHBhZ2VTdHlsZVNoZWV0LCBTdHlsZVNoZWV0
T3JpZ2luIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCwgTGlzdGVuZXIqIGxpc3Rl
bmVyKQotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEluc3BlY3RvclN0eWxlU2hlZXQoaWQs
IFdURjo6bW92ZShwYWdlU3R5bGVTaGVldCksIG9yaWdpbiwgZG9jdW1lbnRVUkwsIGxpc3RlbmVy
KSk7Ci19Ci0KLS8vIHN0YXRpYwotU3RyaW5nIEluc3BlY3RvclN0eWxlU2hlZXQ6OnN0eWxlU2hl
ZXRVUkwoQ1NTU3R5bGVTaGVldCogcGFnZVN0eWxlU2hlZXQpCi17Ci0gICAgaWYgKHBhZ2VTdHls
ZVNoZWV0ICYmICFwYWdlU3R5bGVTaGVldC0+Y29udGVudHMoKS5iYXNlVVJMKCkuaXNFbXB0eSgp
KQotICAgICAgICByZXR1cm4gcGFnZVN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFzZVVSTCgpLnN0
cmluZygpOwotICAgIHJldHVybiBlbXB0eVN0cmluZygpOwotfQotCi1JbnNwZWN0b3JTdHlsZVNo
ZWV0OjpJbnNwZWN0b3JTdHlsZVNoZWV0KGNvbnN0IFN0cmluZyYgaWQsIFJlZlB0cjxDU1NTdHls
ZVNoZWV0PiYmIHBhZ2VTdHlsZVNoZWV0LCBTdHlsZVNoZWV0T3JpZ2luIG9yaWdpbiwgY29uc3Qg
U3RyaW5nJiBkb2N1bWVudFVSTCwgTGlzdGVuZXIqIGxpc3RlbmVyKQotICAgIDogbV9pZChpZCkK
LSAgICAsIG1fcGFnZVN0eWxlU2hlZXQoV1RGOjptb3ZlKHBhZ2VTdHlsZVNoZWV0KSkKLSAgICAs
IG1fb3JpZ2luKG9yaWdpbikKLSAgICAsIG1fZG9jdW1lbnRVUkwoZG9jdW1lbnRVUkwpCi0gICAg
LCBtX3BhcnNlZFN0eWxlU2hlZXQoc3RkOjptYWtlX3VuaXF1ZTxQYXJzZWRTdHlsZVNoZWV0Pigp
KQotICAgICwgbV9saXN0ZW5lcihsaXN0ZW5lcikKLXsKLX0KLQotSW5zcGVjdG9yU3R5bGVTaGVl
dDo6fkluc3BlY3RvclN0eWxlU2hlZXQoKQotewotfQotCi1TdHJpbmcgSW5zcGVjdG9yU3R5bGVT
aGVldDo6ZmluYWxVUkwoKSBjb25zdAotewotICAgIFN0cmluZyB1cmwgPSBzdHlsZVNoZWV0VVJM
KG1fcGFnZVN0eWxlU2hlZXQuZ2V0KCkpOwotICAgIHJldHVybiB1cmwuaXNFbXB0eSgpID8gbV9k
b2N1bWVudFVSTCA6IHVybDsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0Ojppc0VuYWJs
ZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX3BhZ2VTdHlsZVNoZWV0ICYmICFtX3BhZ2VTdHls
ZVNoZWV0LT5kaXNhYmxlZCgpOwotfQotCi1TdHJpbmcgSW5zcGVjdG9yU3R5bGVTaGVldDo6dGl0
bGUoKSBjb25zdAotewotICAgIHJldHVybiBtX3BhZ2VTdHlsZVNoZWV0ID8gbV9wYWdlU3R5bGVT
aGVldC0+dGl0bGUoKSA6IEFTQ0lJTGl0ZXJhbCgiKFVua25vd24pIik7Ci19Ci0KLXZvaWQgSW5z
cGVjdG9yU3R5bGVTaGVldDo6cmVwYXJzZVN0eWxlU2hlZXQoY29uc3QgU3RyaW5nJiB0ZXh0KQot
ewotICAgIHsKLSAgICAgICAgLy8gSGF2ZSBhIHNlcGFyYXRlIHNjb3BlIGZvciBjbGVhclJ1bGVz
KCkgKGJ1ZyA5NTMyNCkuCi0gICAgICAgIENTU1N0eWxlU2hlZXQ6OlJ1bGVNdXRhdGlvblNjb3Bl
IG11dGF0aW9uU2NvcGUobV9wYWdlU3R5bGVTaGVldC5nZXQoKSk7Ci0gICAgICAgIG1fcGFnZVN0
eWxlU2hlZXQtPmNvbnRlbnRzKCkuY2xlYXJSdWxlcygpOwotICAgIH0KLSAgICB7Ci0gICAgICAg
IENTU1N0eWxlU2hlZXQ6OlJ1bGVNdXRhdGlvblNjb3BlIG11dGF0aW9uU2NvcGUobV9wYWdlU3R5
bGVTaGVldC5nZXQoKSk7Ci0gICAgICAgIG1fcGFnZVN0eWxlU2hlZXQtPmNvbnRlbnRzKCkucGFy
c2VTdHJpbmcodGV4dCk7Ci0gICAgICAgIG1fcGFnZVN0eWxlU2hlZXQtPmNsZWFyQ2hpbGRSdWxl
Q1NTT01XcmFwcGVycygpOwotICAgICAgICBmaXJlU3R5bGVTaGVldENoYW5nZWQoKTsKLSAgICB9
Ci0KLSAgICAvLyBXZSBqdXN0IHdpcGVkIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHN0eWxl
c2hlZXQuIENsZWFyIHRoZSBtdXRhdGlvbiBmbGFnLgotICAgIG1fcGFnZVN0eWxlU2hlZXQtPmNs
ZWFySGFkUnVsZXNNdXRhdGlvbigpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6OnNl
dFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAo
IWNoZWNrUGFnZVN0eWxlU2hlZXQoZWMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYg
KCFtX3BhcnNlZFN0eWxlU2hlZXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG1fcGFy
c2VkU3R5bGVTaGVldC0+c2V0VGV4dCh0ZXh0KTsKLSAgICBtX2ZsYXRSdWxlcy5jbGVhcigpOwot
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVN0cmluZyBJbnNwZWN0b3JTdHlsZVNoZWV0OjpydWxl
U2VsZWN0b3IoY29uc3QgSW5zcGVjdG9yQ1NTSWQmIGlkLCBFeGNlcHRpb25Db2RlJiBlYykKLXsK
LSAgICBDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRm9ySWQoaWQpOwotICAgIGlmICghcnVsZSkg
ewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9
Ci0gICAgcmV0dXJuIHJ1bGUtPnNlbGVjdG9yVGV4dCgpOwotfQotCi1ib29sIEluc3BlY3RvclN0
eWxlU2hlZXQ6OnNldFJ1bGVTZWxlY3Rvcihjb25zdCBJbnNwZWN0b3JDU1NJZCYgaWQsIGNvbnN0
IFN0cmluZyYgc2VsZWN0b3IsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghY2hlY2tQ
YWdlU3R5bGVTaGVldChlYykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBDU1NTdHlsZVJ1
bGUqIHJ1bGUgPSBydWxlRm9ySWQoaWQpOwotICAgIGlmICghcnVsZSkgewotICAgICAgICBlYyA9
IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgQ1NTU3R5
bGVTaGVldCogc3R5bGVTaGVldCA9IHJ1bGUtPnBhcmVudFN0eWxlU2hlZXQoKTsKLSAgICBpZiAo
IXN0eWxlU2hlZXQgfHwgIWVuc3VyZVBhcnNlZERhdGFSZWFkeSgpKSB7Ci0gICAgICAgIGVjID0g
Tk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJ1bGUt
PnNldFNlbGVjdG9yVGV4dChzZWxlY3Rvcik7Ci0gICAgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRh
PiBzb3VyY2VEYXRhID0gcnVsZVNvdXJjZURhdGFGb3IoJnJ1bGUtPnN0eWxlKCkpOwotICAgIGlm
ICghc291cmNlRGF0YSkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgc2hlZXRUZXh0ID0gbV9wYXJzZWRTdHls
ZVNoZWV0LT50ZXh0KCk7Ci0gICAgc2hlZXRUZXh0LnJlcGxhY2Uoc291cmNlRGF0YS0+cnVsZUhl
YWRlclJhbmdlLnN0YXJ0LCBzb3VyY2VEYXRhLT5ydWxlSGVhZGVyUmFuZ2UubGVuZ3RoKCksIHNl
bGVjdG9yKTsKLSAgICBtX3BhcnNlZFN0eWxlU2hlZXQtPnNldFRleHQoc2hlZXRUZXh0KTsKLSAg
ICBmaXJlU3R5bGVTaGVldENoYW5nZWQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGlj
IGJvb2wgY2hlY2tTdHlsZVJ1bGVTZWxlY3RvcihEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IFN0
cmluZyYgc2VsZWN0b3IpCi17Ci0gICAgQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdDsKLSAg
ICBjcmVhdGVDU1NQYXJzZXIoZG9jdW1lbnQpLT5wYXJzZVNlbGVjdG9yKHNlbGVjdG9yLCBzZWxl
Y3Rvckxpc3QpOwotICAgIHJldHVybiBzZWxlY3Rvckxpc3QuaXNWYWxpZCgpOwotfQotCi1DU1NT
dHlsZVJ1bGUqIEluc3BlY3RvclN0eWxlU2hlZXQ6OmFkZFJ1bGUoY29uc3QgU3RyaW5nJiBzZWxl
Y3RvciwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFjaGVja1BhZ2VTdHlsZVNoZWV0
KGVjKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgaWYgKCFjaGVja1N0eWxlUnVsZVNl
bGVjdG9yKG1fcGFnZVN0eWxlU2hlZXQtPm93bmVyRG9jdW1lbnQoKSwgc2VsZWN0b3IpKSB7Ci0g
ICAgICAgIGVjID0gU1lOVEFYX0VSUjsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQot
Ci0gICAgU3RyaW5nIHRleHQ7Ci0gICAgYm9vbCBzdWNjZXNzID0gZ2V0VGV4dCgmdGV4dCk7Ci0g
ICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAg
cmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIFN0cmluZ0J1aWxkZXIgc3R5bGVTaGVldFRleHQ7
Ci0gICAgc3R5bGVTaGVldFRleHQuYXBwZW5kKHRleHQpOwotCi0gICAgbV9wYWdlU3R5bGVTaGVl
dC0+YWRkUnVsZShzZWxlY3RvciwgIiIsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVy
biBudWxscHRyOwotICAgIEFTU0VSVChtX3BhZ2VTdHlsZVNoZWV0LT5sZW5ndGgoKSk7Ci0gICAg
dW5zaWduZWQgbGFzdFJ1bGVJbmRleCA9IG1fcGFnZVN0eWxlU2hlZXQtPmxlbmd0aCgpIC0gMTsK
LSAgICBDU1NSdWxlKiBydWxlID0gbV9wYWdlU3R5bGVTaGVldC0+aXRlbShsYXN0UnVsZUluZGV4
KTsKLSAgICBBU1NFUlQocnVsZSk7Ci0KLSAgICBDU1NTdHlsZVJ1bGUqIHN0eWxlUnVsZSA9IElu
c3BlY3RvckNTU0FnZW50Ojphc0NTU1N0eWxlUnVsZSgqcnVsZSk7Ci0gICAgaWYgKCFzdHlsZVJ1
bGUpIHsKLSAgICAgICAgLy8gV2hhdCB3ZSBqdXN0IGFkZGVkIGhhcyB0byBiZSBhIENTU1N0eWxl
UnVsZSAtIHdlIGNhbm5vdCBoYW5kbGUgb3RoZXIgdHlwZXMgb2YgcnVsZXMgeWV0LgotICAgICAg
ICAvLyBJZiBpdCBpcyBub3QgYSBzdHlsZSBydWxlLCBwcmV0ZW5kIHdlIG5ldmVyIHRvdWNoZWQg
dGhlIHN0eWxlc2hlZXQuCi0gICAgICAgIG1fcGFnZVN0eWxlU2hlZXQtPmRlbGV0ZVJ1bGUobGFz
dFJ1bGVJbmRleCwgQVNTRVJUX05PX0VYQ0VQVElPTik7Ci0gICAgICAgIGVjID0gU1lOVEFYX0VS
UjsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgaWYgKCFzdHlsZVNoZWV0
VGV4dC5pc0VtcHR5KCkpCi0gICAgICAgIHN0eWxlU2hlZXRUZXh0LmFwcGVuZCgnXG4nKTsKLQot
ICAgIHN0eWxlU2hlZXRUZXh0LmFwcGVuZChzZWxlY3Rvcik7Ci0gICAgc3R5bGVTaGVldFRleHQu
YXBwZW5kTGl0ZXJhbCgiIHt9Iik7Ci0gICAgLy8gVXNpbmcgc2V0VGV4dCgpIGFzIHRoaXMgb3Bl
cmF0aW9uIGNoYW5nZXMgdGhlIHN0eWxlIHNoZWV0IHJ1bGUgc2V0LgotICAgIHNldFRleHQoc3R5
bGVTaGVldFRleHQudG9TdHJpbmcoKSwgQVNTRVJUX05PX0VYQ0VQVElPTik7Ci0KLSAgICBmaXJl
U3R5bGVTaGVldENoYW5nZWQoKTsKLQotICAgIHJldHVybiBzdHlsZVJ1bGU7Ci19Ci0KLWJvb2wg
SW5zcGVjdG9yU3R5bGVTaGVldDo6ZGVsZXRlUnVsZShjb25zdCBJbnNwZWN0b3JDU1NJZCYgaWQs
IEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghY2hlY2tQYWdlU3R5bGVTaGVldChlYykp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBSZWZQdHI8Q1NTU3R5bGVSdWxlPiBydWxlID0g
cnVsZUZvcklkKGlkKTsKLSAgICBpZiAoIXJ1bGUpIHsKLSAgICAgICAgZWMgPSBOT1RfRk9VTkRf
RVJSOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIENTU1N0eWxlU2hlZXQqIHN0
eWxlU2hlZXQgPSBydWxlLT5wYXJlbnRTdHlsZVNoZWV0KCk7Ci0gICAgaWYgKCFzdHlsZVNoZWV0
IHx8ICFlbnN1cmVQYXJzZWREYXRhUmVhZHkoKSkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9F
UlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBSZWZQdHI8Q1NTUnVsZVNv
dXJjZURhdGE+IHNvdXJjZURhdGEgPSBydWxlU291cmNlRGF0YUZvcigmcnVsZS0+c3R5bGUoKSk7
Ci0gICAgaWYgKCFzb3VyY2VEYXRhKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0eWxlU2hlZXQtPmRlbGV0ZVJ1bGUo
aWQub3JkaW5hbCgpLCBlYyk7Ci0gICAgLy8gfHJ1bGV8IE1BWSBOT1QgYmUgYWRkcmVzc2VkIGFm
dGVyIHRoaXMgbGluZSEKLQotICAgIGlmIChlYykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgU3RyaW5nIHNoZWV0VGV4dCA9IG1fcGFyc2VkU3R5bGVTaGVldC0+dGV4dCgpOwotICAgIHNo
ZWV0VGV4dC5yZW1vdmUoc291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdlLnN0YXJ0LCBzb3VyY2VE
YXRhLT5ydWxlQm9keVJhbmdlLmVuZCAtIHNvdXJjZURhdGEtPnJ1bGVIZWFkZXJSYW5nZS5zdGFy
dCArIDEpOwotICAgIHNldFRleHQoc2hlZXRUZXh0LCBBU1NFUlRfTk9fRVhDRVBUSU9OKTsKLSAg
ICBmaXJlU3R5bGVTaGVldENoYW5nZWQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotQ1NTU3R5
bGVSdWxlKiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpydWxlRm9ySWQoY29uc3QgSW5zcGVjdG9yQ1NT
SWQmIGlkKSBjb25zdAotewotICAgIGlmICghbV9wYWdlU3R5bGVTaGVldCkKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0KLSAgICBBU1NFUlQoIWlkLmlzRW1wdHkoKSk7Ci0gICAgZW5zdXJlRmxh
dFJ1bGVzKCk7Ci0gICAgcmV0dXJuIGlkLm9yZGluYWwoKSA+PSBtX2ZsYXRSdWxlcy5zaXplKCkg
PyBudWxscHRyIDogbV9mbGF0UnVsZXMuYXQoaWQub3JkaW5hbCgpKS5nZXQoKTsKLX0KLQotCi0g
ICAgCi1SZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keT4g
SW5zcGVjdG9yU3R5bGVTaGVldDo6YnVpbGRPYmplY3RGb3JTdHlsZVNoZWV0KCkKLXsKLSAgICBD
U1NTdHlsZVNoZWV0KiBzdHlsZVNoZWV0ID0gcGFnZVN0eWxlU2hlZXQoKTsKLSAgICBpZiAoIXN0
eWxlU2hlZXQpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgUmVmUHRyPENTU1J1bGVM
aXN0PiBjc3NSdWxlTGlzdCA9IGFzQ1NTUnVsZUxpc3Qoc3R5bGVTaGVldCk7Ci0KLSAgICBhdXRv
IHJlc3VsdCA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEJvZHk6OmNy
ZWF0ZSgpCi0gICAgICAgIC5zZXRTdHlsZVNoZWV0SWQoaWQoKSkKLSAgICAgICAgLnNldFJ1bGVz
KGJ1aWxkQXJyYXlGb3JSdWxlTGlzdChjc3NSdWxlTGlzdC5nZXQoKSkpCi0gICAgICAgIC5yZWxl
YXNlKCk7Ci0KLSAgICBTdHJpbmcgc3R5bGVTaGVldFRleHQ7Ci0gICAgYm9vbCBzdWNjZXNzID0g
Z2V0VGV4dCgmc3R5bGVTaGVldFRleHQpOwotICAgIGlmIChzdWNjZXNzKQotICAgICAgICByZXN1
bHQtPnNldFRleHQoc3R5bGVTaGVldFRleHQpOwotCi0gICAgcmV0dXJuIFdURjo6bW92ZShyZXN1
bHQpOwotfQotCi1zdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU2VsZWN0
b3I+IGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3ImIHNlbGVjdG9yLCBF
bGVtZW50KiBlbGVtZW50KTsKLXN0YXRpYyBSZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpD
U1NTZWxlY3Rvcj4gYnVpbGRPYmplY3RGb3JTZWxlY3RvclRleHQoY29uc3QgU3RyaW5nJiBzZWxl
Y3RvclRleHQsIGNvbnN0IENTU1NlbGVjdG9yJiBzZWxlY3RvciwgRWxlbWVudCogZWxlbWVudCk7
Ci0gICAgCi1zdGF0aWMgYm9vbCBoYXNEeW5hbWljU3BlY2lmaWNpdHkoY29uc3QgQ1NTU2VsZWN0
b3ImIHNpbXBsZVNlbGVjdG9yKQotewotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlc2Ug
Y2FuIGhhdmUgYSBzdGF0aWMgc3BlY2lmaWNpdHkgaWYgZWFjaCBzZWxlY3RvciBpbiB0aGUgbGlz
dCBoYXMKLSAgICAvLyBlcXVhbCBzcGVjaWZpY2l0eSwgYnV0IGxldHMgYWx3YXlzIHJlcG9ydCB0
aGF0IHRoZXkgY2FuIGJlIGR5bmFtaWMuCi0gICAgZm9yIChjb25zdCBDU1NTZWxlY3Rvciogc2Vs
ZWN0b3IgPSAmc2ltcGxlU2VsZWN0b3I7IHNlbGVjdG9yOyBzZWxlY3RvciA9IHNlbGVjdG9yLT50
YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yLT5tYXRjaCgpID09IENTU1NlbGVj
dG9yOjpQc2V1ZG9DbGFzcykgewotICAgICAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNz
VHlwZSBwc2V1ZG9DbGFzc1R5cGUgPSBzZWxlY3Rvci0+cHNldWRvQ2xhc3NUeXBlKCk7Ci0gICAg
ICAgICAgICBpZiAocHNldWRvQ2xhc3NUeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzc01h
dGNoZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAocHNl
dWRvQ2xhc3NUeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzc050aENoaWxkIHx8IHBzZXVk
b0NsYXNzVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3NOdGhMYXN0Q2hpbGQpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoc2VsZWN0b3ItPnNlbGVjdG9yTGlzdCgpKQotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0
YXRpYyBSZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcj4gYnVpbGRPYmpl
Y3RGb3JTZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciYgc2VsZWN0b3IsIEVsZW1lbnQqIGVsZW1l
bnQpCi17Ci0gICAgcmV0dXJuIGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JUZXh0KHNlbGVjdG9yLnNl
bGVjdG9yVGV4dCgpLCBzZWxlY3RvciwgZWxlbWVudCk7Ci19Ci0KLXN0YXRpYyBSZWY8SW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcj4gYnVpbGRPYmplY3RGb3JTZWxlY3RvclRl
eHQoY29uc3QgU3RyaW5nJiBzZWxlY3RvclRleHQsIGNvbnN0IENTU1NlbGVjdG9yJiBzZWxlY3Rv
ciwgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBhdXRvIGluc3BlY3RvclNlbGVjdG9yID0gSW5z
cGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcjo6Y3JlYXRlKCkKLSAgICAgICAgLnNl
dFRleHQoc2VsZWN0b3JUZXh0KQotICAgICAgICAucmVsZWFzZSgpOwotCi0gICAgaWYgKGVsZW1l
bnQpIHsKLSAgICAgICAgYm9vbCBkeW5hbWljID0gaGFzRHluYW1pY1NwZWNpZmljaXR5KHNlbGVj
dG9yKTsKLSAgICAgICAgaWYgKGR5bmFtaWMpCi0gICAgICAgICAgICBpbnNwZWN0b3JTZWxlY3Rv
ci0+c2V0RHluYW1pYyh0cnVlKTsKLQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6OkNoZWNraW5n
Q29udGV4dCBjb250ZXh0KFNlbGVjdG9yQ2hlY2tlcjo6TW9kZTo6Q29sbGVjdGluZ1J1bGVzKTsK
LSAgICAgICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihlbGVtZW50LT5kb2N1bWVu
dCgpKTsKLQotICAgICAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTsKLSAgICAgICAgYm9vbCBva2F5
ID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKCZzZWxlY3RvciwgZWxlbWVudCwgY29udGV4dCwgc3Bl
Y2lmaWNpdHkpOwotICAgICAgICBpZiAoIW9rYXkpCi0gICAgICAgICAgICBzcGVjaWZpY2l0eSA9
IHNlbGVjdG9yLnN0YXRpY1NwZWNpZmljaXR5KG9rYXkpOwotCi0gICAgICAgIGlmIChva2F5KSB7
Ci0gICAgICAgICAgICBhdXRvIHR1cGxlID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8aW50
Pjo6Y3JlYXRlKCk7Ci0gICAgICAgICAgICB0dXBsZS0+YWRkSXRlbShzdGF0aWNfY2FzdDxpbnQ+
KChzcGVjaWZpY2l0eSAmIENTU1NlbGVjdG9yOjppZE1hc2spID4+IDE2KSk7Ci0gICAgICAgICAg
ICB0dXBsZS0+YWRkSXRlbShzdGF0aWNfY2FzdDxpbnQ+KChzcGVjaWZpY2l0eSAmIENTU1NlbGVj
dG9yOjpjbGFzc01hc2spID4+IDgpKTsKLSAgICAgICAgICAgIHR1cGxlLT5hZGRJdGVtKHN0YXRp
Y19jYXN0PGludD4oc3BlY2lmaWNpdHkgJiBDU1NTZWxlY3Rvcjo6ZWxlbWVudE1hc2spKTsKLSAg
ICAgICAgICAgIGluc3BlY3RvclNlbGVjdG9yLT5zZXRTcGVjaWZpY2l0eShXVEY6Om1vdmUodHVw
bGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBXVEY6Om1vdmUoaW5zcGVjdG9y
U2VsZWN0b3IpOwotfQotCi1zdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU2VsZWN0b3I+PiBzZWxlY3RvcnNGcm9tU291cmNl
KGNvbnN0IENTU1J1bGVTb3VyY2VEYXRhKiBzb3VyY2VEYXRhLCBjb25zdCBTdHJpbmcmIHNoZWV0
VGV4dCwgY29uc3QgQ1NTU2VsZWN0b3JMaXN0JiBzZWxlY3Rvckxpc3QsIEVsZW1lbnQqIGVsZW1l
bnQpCi17Ci0gICAgTmV2ZXJEZXN0cm95ZWQ8SlNDOjpZYXJyOjpSZWd1bGFyRXhwcmVzc2lvbj4g
Y29tbWVudCgiL1xcKlteXSo/XFwqLyIsIFRleHRDYXNlU2Vuc2l0aXZlLCBKU0M6OllhcnI6Ok11
bHRpbGluZUVuYWJsZWQpOwotCi0gICAgYXV0byByZXN1bHQgPSBJbnNwZWN0b3I6OlByb3RvY29s
OjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9yPjo6Y3JlYXRlKCk7
Ci0gICAgY29uc3QgU2VsZWN0b3JSYW5nZUxpc3QmIHJhbmdlcyA9IHNvdXJjZURhdGEtPnNlbGVj
dG9yUmFuZ2VzOwotICAgIGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IHNlbGVjdG9yTGlz
dC5maXJzdCgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBzaXplID0gcmFuZ2VzLnNpemUoKTsg
aSA8IHNpemU7ICsraSkgewotICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgc2VsZWN0b3Is
IHRoYXQgbWVhbnMgdGhlIFNvdXJjZURhdGEgZm9yIHRoaXMgQ1NTU3R5bGVTaGVldAotICAgICAg
ICAvLyBubyBsb25nZXIgbWF0Y2hlcyB1cCB3aXRoIHRoZSBhY3R1YWwgcnVsZXMgaW4gdGhlIENT
U1N0eWxlU2hlZXQuCi0gICAgICAgIEFTU0VSVChzZWxlY3Rvcik7Ci0gICAgICAgIGlmICghc2Vs
ZWN0b3IpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSYg
cmFuZ2UgPSByYW5nZXMuYXQoaSk7Ci0gICAgICAgIFN0cmluZyBzZWxlY3RvclRleHQgPSBzaGVl
dFRleHQuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LCByYW5nZS5sZW5ndGgoKSk7Ci0KLSAgICAgICAg
Ly8gV2UgZG9uJ3Qgd2FudCB0byBzZWUgYW55IGNvbW1lbnRzIGluIHRoZSBzZWxlY3RvciBjb21w
b25lbnRzLCBvbmx5IHRoZSBtZWFuaW5nZnVsIHBhcnRzLgotICAgICAgICByZXBsYWNlKHNlbGVj
dG9yVGV4dCwgY29tbWVudCwgU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQtPmFkZEl0ZW0oYnVp
bGRPYmplY3RGb3JTZWxlY3RvclRleHQoc2VsZWN0b3JUZXh0LnN0cmlwV2hpdGVTcGFjZSgpLCAq
c2VsZWN0b3IsIGVsZW1lbnQpKTsKLQotICAgICAgICBzZWxlY3RvciA9IENTU1NlbGVjdG9yTGlz
dDo6bmV4dChzZWxlY3Rvcik7Ci0gICAgfQotICAgIHJldHVybiBXVEY6Om1vdmUocmVzdWx0KTsK
LX0KLQotUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U2VsZWN0b3JMaXN0PiBJbnNwZWN0
b3JTdHlsZVNoZWV0OjpidWlsZE9iamVjdEZvclNlbGVjdG9yTGlzdChDU1NTdHlsZVJ1bGUqIHJ1
bGUsIEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBz
b3VyY2VEYXRhOwotICAgIGlmIChlbnN1cmVQYXJzZWREYXRhUmVhZHkoKSkKLSAgICAgICAgc291
cmNlRGF0YSA9IHJ1bGVTb3VyY2VEYXRhRm9yKCZydWxlLT5zdHlsZSgpKTsKLSAgICBSZWZQdHI8
SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NT
ZWxlY3Rvcj4+IHNlbGVjdG9yczsKLQotICAgIC8vIFRoaXMgaW50ZW50aW9uYWxseSBkb2VzIG5v
dCByZWx5IG9uIHRoZSBzb3VyY2UgZGF0YSB0byBhdm9pZCBjYXRjaGluZyB0aGUgdHJhaWxpbmcg
Y29tbWVudHMgKGJlZm9yZSB0aGUgZGVjbGFyYXRpb24gc3RhcnRpbmcgJ3snKS4KLSAgICBTdHJp
bmcgc2VsZWN0b3JUZXh0ID0gcnVsZS0+c2VsZWN0b3JUZXh0KCk7Ci0KLSAgICBpZiAoc291cmNl
RGF0YSkKLSAgICAgICAgc2VsZWN0b3JzID0gc2VsZWN0b3JzRnJvbVNvdXJjZShzb3VyY2VEYXRh
LmdldCgpLCBtX3BhcnNlZFN0eWxlU2hlZXQtPnRleHQoKSwgcnVsZS0+c3R5bGVSdWxlKCkuc2Vs
ZWN0b3JMaXN0KCksIGVsZW1lbnQpOwotICAgIGVsc2UgewotICAgICAgICBzZWxlY3RvcnMgPSBJ
bnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Nl
bGVjdG9yPjo6Y3JlYXRlKCk7Ci0gICAgICAgIGNvbnN0IENTU1NlbGVjdG9yTGlzdCYgc2VsZWN0
b3JMaXN0ID0gcnVsZS0+c3R5bGVSdWxlKCkuc2VsZWN0b3JMaXN0KCk7Ci0gICAgICAgIGZvciAo
Y29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yID0gc2VsZWN0b3JMaXN0LmZpcnN0KCk7IHNlbGVj
dG9yOyBzZWxlY3RvciA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzZWxlY3RvcikpCi0gICAgICAg
ICAgICBpZiAoc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgc2VsZWN0b3JzLT5hZGRJdGVtKGJ1
aWxkT2JqZWN0Rm9yU2VsZWN0b3IoKnNlbGVjdG9yLCBlbGVtZW50KSk7Ci0gICAgfQotICAgIGF1
dG8gcmVzdWx0ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTZWxlY3Rvckxpc3Q6OmNyZWF0
ZSgpCi0gICAgICAgIC5zZXRTZWxlY3RvcnMoc2VsZWN0b3JzLnJlbGVhc2UoKSkKLSAgICAgICAg
LnNldFRleHQoc2VsZWN0b3JUZXh0KQotICAgICAgICAucmVsZWFzZSgpOwotICAgIGlmIChzb3Vy
Y2VEYXRhKQotICAgICAgICByZXN1bHQtPnNldFJhbmdlKGJ1aWxkU291cmNlUmFuZ2VPYmplY3Qo
c291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdlLCBsaW5lRW5kaW5ncygpLmdldCgpKSk7Ci0gICAg
cmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwotfQotCi1SZWZQdHI8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NSdWxlPiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpidWlsZE9iamVjdEZvclJ1bGUo
Q1NTU3R5bGVSdWxlKiBydWxlLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIENTU1N0eWxlU2hl
ZXQqIHN0eWxlU2hlZXQgPSBwYWdlU3R5bGVTaGVldCgpOwotICAgIGlmICghc3R5bGVTaGVldCkK
LSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIHJlc3VsdCA9IEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZTo6Y3JlYXRlKCkKLSAgICAgICAgLnNldFNlbGVjdG9yTGlz
dChidWlsZE9iamVjdEZvclNlbGVjdG9yTGlzdChydWxlLCBlbGVtZW50KSkKLSAgICAgICAgLnNl
dFNvdXJjZUxpbmUocnVsZS0+c3R5bGVSdWxlKCkuc291cmNlTGluZSgpKQotICAgICAgICAuc2V0
T3JpZ2luKHN0eWxlc2hlZXRPcmlnaW5Ub1Byb3RvY29sRW51bShtX29yaWdpbikpCi0gICAgICAg
IC5zZXRTdHlsZShidWlsZE9iamVjdEZvclN0eWxlKCZydWxlLT5zdHlsZSgpKSkKLSAgICAgICAg
LnJlbGVhc2UoKTsKLQotICAgIC8vICJzb3VyY2VVUkwiIGlzIHByZXNlbnQgb25seSBmb3IgcmVn
dWxhciBydWxlcywgb3RoZXJ3aXNlICJvcmlnaW4iIHNob3VsZCBiZSB1c2VkIGluIHRoZSBmcm9u
dGVuZC4KLSAgICBpZiAobV9vcmlnaW4gPT0gU3R5bGVTaGVldE9yaWdpbjo6QXV0aG9yKQotICAg
ICAgICByZXN1bHQtPnNldFNvdXJjZVVSTChmaW5hbFVSTCgpKTsKLQotICAgIGlmIChjYW5CaW5k
KCkpIHsKLSAgICAgICAgSW5zcGVjdG9yQ1NTSWQgaWQocnVsZUlkKHJ1bGUpKTsKLSAgICAgICAg
aWYgKCFpZC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXN1bHQtPnNldFJ1bGVJZChpZC5hc1By
b3RvY29sVmFsdWU8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlSWQ+KCkpOwotICAg
IH0KLQotICAgIGF1dG8gbWVkaWFBcnJheSA9IEFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6Q1NTTWVkaWE+OjpjcmVhdGUoKTsKLQotICAgIGZpbGxNZWRpYUxpc3RDaGFpbihydWxlLCBt
ZWRpYUFycmF5LmdldCgpKTsKLSAgICBpZiAobWVkaWFBcnJheS0+bGVuZ3RoKCkpCi0gICAgICAg
IHJlc3VsdC0+c2V0TWVkaWEoV1RGOjptb3ZlKG1lZGlhQXJyYXkpKTsKLQotICAgIHJldHVybiBX
VEY6Om1vdmUocmVzdWx0KTsKLX0KLQotUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6
Q1NTU3R5bGU+IEluc3BlY3RvclN0eWxlU2hlZXQ6OmJ1aWxkT2JqZWN0Rm9yU3R5bGUoQ1NTU3R5
bGVEZWNsYXJhdGlvbiogc3R5bGUpCi17Ci0gICAgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBz
b3VyY2VEYXRhOwotICAgIGlmIChlbnN1cmVQYXJzZWREYXRhUmVhZHkoKSkKLSAgICAgICAgc291
cmNlRGF0YSA9IHJ1bGVTb3VyY2VEYXRhRm9yKHN0eWxlKTsKLQotICAgIEluc3BlY3RvckNTU0lk
IGlkID0gcnVsZU9yU3R5bGVJZChzdHlsZSk7Ci0gICAgaWYgKGlkLmlzRW1wdHkoKSkgewotICAg
ICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZTo6Y3JlYXRlKCkK
LSAgICAgICAgICAgIC5zZXRDc3NQcm9wZXJ0aWVzKEFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTUHJvcGVydHk+OjpjcmVhdGUoKSkKLSAgICAgICAgICAgIC5zZXRTaG9ydGhhbmRF
bnRyaWVzKEFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U2hvcnRoYW5kRW50cnk+Ojpj
cmVhdGUoKSkKLSAgICAgICAgICAgIC5yZWxlYXNlKCk7Ci0gICAgfQotICAgIFJlZlB0cjxJbnNw
ZWN0b3JTdHlsZT4gaW5zcGVjdG9yU3R5bGUgPSBpbnNwZWN0b3JTdHlsZUZvcklkKGlkKTsKLSAg
ICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4gcmVzdWx0ID0gaW5z
cGVjdG9yU3R5bGUtPmJ1aWxkT2JqZWN0Rm9yU3R5bGUoKTsKLQotICAgIC8vIFN0eWxlIHRleHQg
Y2Fubm90IGJlIHJldHJpZXZlZCB3aXRob3V0IHN0eWxlc2hlZXQsIHNvIHNldCBjc3NUZXh0IGhl
cmUuCi0gICAgaWYgKHNvdXJjZURhdGEpIHsKLSAgICAgICAgU3RyaW5nIHNoZWV0VGV4dDsKLSAg
ICAgICAgYm9vbCBzdWNjZXNzID0gZ2V0VGV4dCgmc2hlZXRUZXh0KTsKLSAgICAgICAgaWYgKHN1
Y2Nlc3MpIHsKLSAgICAgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlJiBib2R5UmFuZ2UgPSBzb3Vy
Y2VEYXRhLT5ydWxlQm9keVJhbmdlOwotICAgICAgICAgICAgcmVzdWx0LT5zZXRDc3NUZXh0KHNo
ZWV0VGV4dC5zdWJzdHJpbmcoYm9keVJhbmdlLnN0YXJ0LCBib2R5UmFuZ2UuZW5kIC0gYm9keVJh
bmdlLnN0YXJ0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gV1RGOjptb3ZlKHJl
c3VsdCk7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldDo6c2V0U3R5bGVUZXh0KGNvbnN0
IEluc3BlY3RvckNTU0lkJiBpZCwgY29uc3QgU3RyaW5nJiB0ZXh0LCBTdHJpbmcqIG9sZFRleHQs
IEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIFJlZlB0cjxJbnNwZWN0b3JTdHlsZT4gaW5zcGVj
dG9yU3R5bGUgPSBpbnNwZWN0b3JTdHlsZUZvcklkKGlkKTsKLSAgICBpZiAoIWluc3BlY3RvclN0
eWxlKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIGlmIChvbGRUZXh0ICYmICFpbnNwZWN0b3JTdHlsZS0+Z2V0VGV4dChv
bGRUZXh0KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBzdWNjZXNzID0gaW5z
cGVjdG9yU3R5bGUtPnNldFRleHQodGV4dCwgZWMpOwotICAgIGlmIChzdWNjZXNzKQotICAgICAg
ICBmaXJlU3R5bGVTaGVldENoYW5nZWQoKTsKLSAgICByZXR1cm4gc3VjY2VzczsKLX0KLQotYm9v
bCBJbnNwZWN0b3JTdHlsZVNoZWV0OjpnZXRUZXh0KFN0cmluZyogcmVzdWx0KSBjb25zdAotewot
ICAgIGlmICghZW5zdXJlVGV4dCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgKnJlc3Vs
dCA9IG1fcGFyc2VkU3R5bGVTaGVldC0+dGV4dCgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1D
U1NTdHlsZURlY2xhcmF0aW9uKiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpzdHlsZUZvcklkKGNvbnN0
IEluc3BlY3RvckNTU0lkJiBpZCkgY29uc3QKLXsKLSAgICBDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBy
dWxlRm9ySWQoaWQpOwotICAgIGlmICghcnVsZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0K
LSAgICByZXR1cm4gJnJ1bGUtPnN0eWxlKCk7Ci19Ci0KLXZvaWQgSW5zcGVjdG9yU3R5bGVTaGVl
dDo6ZmlyZVN0eWxlU2hlZXRDaGFuZ2VkKCkKLXsKLSAgICBpZiAobV9saXN0ZW5lcikKLSAgICAg
ICAgbV9saXN0ZW5lci0+c3R5bGVTaGVldENoYW5nZWQoKnRoaXMpOwotfQotCi1SZWZQdHI8SW5z
cGVjdG9yU3R5bGU+IEluc3BlY3RvclN0eWxlU2hlZXQ6Omluc3BlY3RvclN0eWxlRm9ySWQoY29u
c3QgSW5zcGVjdG9yQ1NTSWQmIGlkKQotewotICAgIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxl
ID0gc3R5bGVGb3JJZChpZCk7Ci0gICAgaWYgKCFzdHlsZSkKLSAgICAgICAgcmV0dXJuIG51bGxw
dHI7Ci0KLSAgICByZXR1cm4gSW5zcGVjdG9yU3R5bGU6OmNyZWF0ZShpZCwgc3R5bGUsIHRoaXMp
OwotfQotCi1JbnNwZWN0b3JDU1NJZCBJbnNwZWN0b3JTdHlsZVNoZWV0OjpydWxlT3JTdHlsZUlk
KENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKSBjb25zdAotewotICAgIHVuc2lnbmVkIGluZGV4
ID0gcnVsZUluZGV4QnlTdHlsZShzdHlsZSk7Ci0gICAgaWYgKGluZGV4ICE9IFVJTlRfTUFYKQot
ICAgICAgICByZXR1cm4gSW5zcGVjdG9yQ1NTSWQoaWQoKSwgaW5kZXgpOwotICAgIHJldHVybiBJ
bnNwZWN0b3JDU1NJZCgpOwotfQotCi1Eb2N1bWVudCogSW5zcGVjdG9yU3R5bGVTaGVldDo6b3du
ZXJEb2N1bWVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGFnZVN0eWxlU2hlZXQtPm93bmVy
RG9jdW1lbnQoKTsKLX0KLQotUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBJbnNwZWN0b3JTdHls
ZVNoZWV0OjpydWxlU291cmNlRGF0YUZvcihDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9wYXJzZWRTdHlsZVNoZWV0LT5ydWxlU291cmNlRGF0YUF0KHJ1
bGVJbmRleEJ5U3R5bGUoc3R5bGUpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPFZlY3RvcjxzaXpl
X3Q+PiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpsaW5lRW5kaW5ncygpIGNvbnN0Ci17Ci0gICAgaWYg
KCFtX3BhcnNlZFN0eWxlU2hlZXQtPmhhc1RleHQoKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7
Ci0gICAgcmV0dXJuIENvbnRlbnRTZWFyY2hVdGlsaXRpZXM6OmxpbmVFbmRpbmdzKG1fcGFyc2Vk
U3R5bGVTaGVldC0+dGV4dCgpKTsKLX0KLQotdW5zaWduZWQgSW5zcGVjdG9yU3R5bGVTaGVldDo6
cnVsZUluZGV4QnlTdHlsZShDU1NTdHlsZURlY2xhcmF0aW9uKiBwYWdlU3R5bGUpIGNvbnN0Ci17
Ci0gICAgZW5zdXJlRmxhdFJ1bGVzKCk7Ci0gICAgdW5zaWduZWQgaW5kZXggPSAwOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDAsIHNpemUgPSBtX2ZsYXRSdWxlcy5zaXplKCk7IGkgPCBzaXplOyAr
K2kpIHsKLSAgICAgICAgaWYgKCZtX2ZsYXRSdWxlcy5hdChpKS0+c3R5bGUoKSA9PSBwYWdlU3R5
bGUpCi0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICAgICAgKytpbmRleDsKLSAgICB9
Ci0gICAgcmV0dXJuIFVJTlRfTUFYOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6OmNo
ZWNrUGFnZVN0eWxlU2hlZXQoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0Ci17Ci0gICAgaWYgKCFt
X3BhZ2VTdHlsZVNoZWV0KSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSW5z
cGVjdG9yU3R5bGVTaGVldDo6c3R5bGVTaGVldE11dGF0ZWQoKSBjb25zdAotewotICAgIHJldHVy
biBtX3BhZ2VTdHlsZVNoZWV0ICYmIG1fcGFnZVN0eWxlU2hlZXQtPmhhZFJ1bGVzTXV0YXRpb24o
KTsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0OjplbnN1cmVQYXJzZWREYXRhUmVhZHko
KQotewotICAgIHJldHVybiAhc3R5bGVTaGVldE11dGF0ZWQoKSAmJiBlbnN1cmVUZXh0KCkgJiYg
ZW5zdXJlU291cmNlRGF0YSgpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6OmVuc3Vy
ZVRleHQoKSBjb25zdAotewotICAgIGlmICghbV9wYXJzZWRTdHlsZVNoZWV0KQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgaWYgKG1fcGFyc2VkU3R5bGVTaGVldC0+aGFzVGV4dCgpKQotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZyB0ZXh0OwotICAgIGJvb2wgc3VjY2VzcyA9
IG9yaWdpbmFsU3R5bGVTaGVldFRleHQoJnRleHQpOwotICAgIGlmIChzdWNjZXNzKQotICAgICAg
ICBtX3BhcnNlZFN0eWxlU2hlZXQtPnNldFRleHQodGV4dCk7Ci0gICAgLy8gTm8gbmVlZCB0byBj
bGVhciBtX2ZsYXRSdWxlcyBoZXJlIC0gaXQncyBlbXB0eS4KLQotICAgIHJldHVybiBzdWNjZXNz
OwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6OmVuc3VyZVNvdXJjZURhdGEoKQotewot
ICAgIGlmIChtX3BhcnNlZFN0eWxlU2hlZXQtPmhhc1NvdXJjZURhdGEoKSkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICBpZiAoIW1fcGFyc2VkU3R5bGVTaGVldC0+aGFzVGV4dCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiBuZXdT
dHlsZVNoZWV0ID0gU3R5bGVTaGVldENvbnRlbnRzOjpjcmVhdGUoKTsKLSAgICBhdXRvIHJ1bGVT
b3VyY2VEYXRhUmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxSdWxlU291cmNlRGF0YUxpc3Q+KCk7
Ci0gICAgY3JlYXRlQ1NTUGFyc2VyKG1fcGFnZVN0eWxlU2hlZXQtPm93bmVyRG9jdW1lbnQoKSkt
PnBhcnNlU2hlZXQobmV3U3R5bGVTaGVldC5nZXQoKSwgbV9wYXJzZWRTdHlsZVNoZWV0LT50ZXh0
KCksIDAsIHJ1bGVTb3VyY2VEYXRhUmVzdWx0LmdldCgpKTsKLSAgICBtX3BhcnNlZFN0eWxlU2hl
ZXQtPnNldFNvdXJjZURhdGEoV1RGOjptb3ZlKHJ1bGVTb3VyY2VEYXRhUmVzdWx0KSk7Ci0gICAg
cmV0dXJuIG1fcGFyc2VkU3R5bGVTaGVldC0+aGFzU291cmNlRGF0YSgpOwotfQotCi12b2lkIElu
c3BlY3RvclN0eWxlU2hlZXQ6OmVuc3VyZUZsYXRSdWxlcygpIGNvbnN0Ci17Ci0gICAgLy8gV2Ug
YXJlIGZpbmUgd2l0aCByZWRvaW5nIHRoaXMgZm9yIGVtcHR5IHN0eWxlc2hlZXRzIGFzIHRoaXMg
d2lsbCBydW4gZmFzdC4KLSAgICBpZiAobV9mbGF0UnVsZXMuaXNFbXB0eSgpKQotICAgICAgICBj
b2xsZWN0RmxhdFJ1bGVzKGFzQ1NTUnVsZUxpc3QocGFnZVN0eWxlU2hlZXQoKSksICZtX2ZsYXRS
dWxlcyk7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldDo6c2V0U3R5bGVUZXh0KENTU1N0
eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBjb25zdCBTdHJpbmcmIHRleHQsIEV4Y2VwdGlvbkNvZGUm
IGVjKQotewotICAgIGlmICghbV9wYWdlU3R5bGVTaGVldCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIGlmICghZW5zdXJlUGFyc2VkRGF0YVJlYWR5KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIFN0cmluZyBwYXRjaGVkU3R5bGVTaGVldFRleHQ7Ci0gICAgYm9vbCBzdWNjZXNz
ID0gc3R5bGVTaGVldFRleHRXaXRoQ2hhbmdlZFN0eWxlKHN0eWxlLCB0ZXh0LCAmcGF0Y2hlZFN0
eWxlU2hlZXRUZXh0KTsKLSAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIEluc3BlY3RvckNTU0lkIGlkID0gcnVsZU9yU3R5bGVJZChzdHlsZSk7Ci0gICAgaWYg
KGlkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3R5bGUtPnNldENz
c1RleHQodGV4dCwgZWMpOwotICAgIGlmICghZWMpCi0gICAgICAgIG1fcGFyc2VkU3R5bGVTaGVl
dC0+c2V0VGV4dChwYXRjaGVkU3R5bGVTaGVldFRleHQpOwotCi0gICAgcmV0dXJuICFlYzsKLX0K
LQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0OjpzdHlsZVNoZWV0VGV4dFdpdGhDaGFuZ2VkU3R5
bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUsIGNvbnN0IFN0cmluZyYgbmV3U3R5bGVUZXh0
LCBTdHJpbmcqIHJlc3VsdCkKLXsKLSAgICBpZiAoIXN0eWxlKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAoIWVuc3VyZVBhcnNlZERhdGFSZWFkeSgpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHNvdXJjZURhdGEgPSBydWxl
U291cmNlRGF0YUZvcihzdHlsZSk7Ci0gICAgdW5zaWduZWQgYm9keVN0YXJ0ID0gc291cmNlRGF0
YS0+cnVsZUJvZHlSYW5nZS5zdGFydDsKLSAgICB1bnNpZ25lZCBib2R5RW5kID0gc291cmNlRGF0
YS0+cnVsZUJvZHlSYW5nZS5lbmQ7Ci0gICAgQVNTRVJUKGJvZHlTdGFydCA8PSBib2R5RW5kKTsK
LQotICAgIFN0cmluZyB0ZXh0ID0gbV9wYXJzZWRTdHlsZVNoZWV0LT50ZXh0KCk7Ci0gICAgQVNT
RVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oYm9keUVuZCA8PSB0ZXh0Lmxlbmd0aCgpKTsg
Ly8gYm9keUVuZCBpcyBleGNsdXNpdmUKLQotICAgIHRleHQucmVwbGFjZShib2R5U3RhcnQsIGJv
ZHlFbmQgLSBib2R5U3RhcnQsIG5ld1N0eWxlVGV4dCk7Ci0gICAgKnJlc3VsdCA9IHRleHQ7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLUluc3BlY3RvckNTU0lkIEluc3BlY3RvclN0eWxlU2hlZXQ6
OnJ1bGVJZChDU1NTdHlsZVJ1bGUqIHJ1bGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJ1bGVPclN0
eWxlSWQoJnJ1bGUtPnN0eWxlKCkpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6Om9y
aWdpbmFsU3R5bGVTaGVldFRleHQoU3RyaW5nKiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgYm9vbCBz
dWNjZXNzID0gaW5saW5lU3R5bGVTaGVldFRleHQocmVzdWx0KTsKLSAgICBpZiAoIXN1Y2Nlc3Mp
Ci0gICAgICAgIHN1Y2Nlc3MgPSByZXNvdXJjZVN0eWxlU2hlZXRUZXh0KHJlc3VsdCk7Ci0gICAg
cmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldDo6cmVzb3VyY2VT
dHlsZVNoZWV0VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAobV9vcmlnaW4g
PT0gU3R5bGVTaGVldE9yaWdpbjo6VXNlciB8fCBtX29yaWdpbiA9PSBTdHlsZVNoZWV0T3JpZ2lu
OjpVc2VyQWdlbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghbV9wYWdlU3R5
bGVTaGVldCB8fCAhb3duZXJEb2N1bWVudCgpIHx8ICFvd25lckRvY3VtZW50KCktPmZyYW1lKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBlcnJvcjsKLSAgICBib29sIGJh
c2U2NEVuY29kZWQ7Ci0gICAgSW5zcGVjdG9yUGFnZUFnZW50OjpyZXNvdXJjZUNvbnRlbnQoZXJy
b3IsIG93bmVyRG9jdW1lbnQoKS0+ZnJhbWUoKSwgVVJMKFBhcnNlZFVSTFN0cmluZywgbV9wYWdl
U3R5bGVTaGVldC0+aHJlZigpKSwgcmVzdWx0LCAmYmFzZTY0RW5jb2RlZCk7Ci0gICAgcmV0dXJu
IGVycm9yLmlzRW1wdHkoKSAmJiAhYmFzZTY0RW5jb2RlZDsKLX0KLQotYm9vbCBJbnNwZWN0b3JT
dHlsZVNoZWV0OjppbmxpbmVTdHlsZVNoZWV0VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3QKLXsK
LSAgICBpZiAoIW1fcGFnZVN0eWxlU2hlZXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IE5vZGUqIG93bmVyTm9kZSA9IG1fcGFnZVN0eWxlU2hlZXQtPm93bmVyTm9kZSgpOwotICAgIGlm
ICghaXM8RWxlbWVudD4ob3duZXJOb2RlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEVs
ZW1lbnQmIG93bmVyRWxlbWVudCA9IGRvd25jYXN0PEVsZW1lbnQ+KCpvd25lck5vZGUpOwotCi0g
ICAgaWYgKCFpczxIVE1MU3R5bGVFbGVtZW50Pihvd25lckVsZW1lbnQpICYmICFpczxTVkdTdHls
ZUVsZW1lbnQ+KG93bmVyRWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAqcmVz
dWx0ID0gb3duZXJFbGVtZW50LnRleHRDb250ZW50KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LVJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU1J1bGU+PiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpidWlsZEFycmF5Rm9yUnVsZUxpc3QoQ1NT
UnVsZUxpc3QqIHJ1bGVMaXN0KQotewotICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVjdG9yOjpQcm90
b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPjo6Y3JlYXRlKCk7
Ci0gICAgaWYgKCFydWxlTGlzdCkKLSAgICAgICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwot
Ci0gICAgUmVmUHRyPENTU1J1bGVMaXN0PiByZWZSdWxlTGlzdCA9IHJ1bGVMaXN0OwotICAgIENT
U1N0eWxlUnVsZVZlY3RvciBydWxlczsKLSAgICBjb2xsZWN0RmxhdFJ1bGVzKFdURjo6bW92ZShy
ZWZSdWxlTGlzdCksICZydWxlcyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBzaXplID0g
cnVsZXMuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKQotICAgICAgICByZXN1bHQtPmFkZEl0ZW0oYnVp
bGRPYmplY3RGb3JSdWxlKHJ1bGVzLmF0KGkpLmdldCgpLCBudWxscHRyKSk7Ci0KLSAgICByZXR1
cm4gV1RGOjptb3ZlKHJlc3VsdCk7Ci19Ci0KLXZvaWQgSW5zcGVjdG9yU3R5bGVTaGVldDo6Y29s
bGVjdEZsYXRSdWxlcyhSZWZQdHI8Q1NTUnVsZUxpc3Q+JiYgcnVsZUxpc3QsIENTU1N0eWxlUnVs
ZVZlY3RvciogcmVzdWx0KQotewotICAgIGlmICghcnVsZUxpc3QpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIHNpemUgPSBydWxlTGlzdC0+bGVuZ3RoKCk7IGkg
PCBzaXplOyArK2kpIHsKLSAgICAgICAgQ1NTUnVsZSogcnVsZSA9IHJ1bGVMaXN0LT5pdGVtKGkp
OwotICAgICAgICBDU1NTdHlsZVJ1bGUqIHN0eWxlUnVsZSA9IEluc3BlY3RvckNTU0FnZW50Ojph
c0NTU1N0eWxlUnVsZSgqcnVsZSk7Ci0gICAgICAgIGlmIChzdHlsZVJ1bGUpCi0gICAgICAgICAg
ICByZXN1bHQtPmFwcGVuZChzdHlsZVJ1bGUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
IFJlZlB0cjxDU1NSdWxlTGlzdD4gY2hpbGRSdWxlTGlzdCA9IGFzQ1NTUnVsZUxpc3QocnVsZSk7
Ci0gICAgICAgICAgICBpZiAoY2hpbGRSdWxlTGlzdCkKLSAgICAgICAgICAgICAgICBjb2xsZWN0
RmxhdFJ1bGVzKFdURjo6bW92ZShjaGlsZFJ1bGVMaXN0KSwgcmVzdWx0KTsKLSAgICAgICAgfQot
ICAgIH0KLX0KLQotUmVmPEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZT4gSW5zcGVj
dG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlOjpjcmVhdGUoY29uc3QgU3RyaW5nJiBpZCwgUmVm
UHRyPEVsZW1lbnQ+JiYgZWxlbWVudCwgU3R5bGVTaGVldE9yaWdpbiBvcmlnaW4sIExpc3RlbmVy
KiBsaXN0ZW5lcikKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBJbnNwZWN0b3JTdHlsZVNo
ZWV0Rm9ySW5saW5lU3R5bGUoaWQsIFdURjo6bW92ZShlbGVtZW50KSwgb3JpZ2luLCBsaXN0ZW5l
cikpOwotfQotCi1JbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU6Okluc3BlY3RvclN0
eWxlU2hlZXRGb3JJbmxpbmVTdHlsZShjb25zdCBTdHJpbmcmIGlkLCBSZWZQdHI8RWxlbWVudD4m
JiBlbGVtZW50LCBTdHlsZVNoZWV0T3JpZ2luIG9yaWdpbiwgTGlzdGVuZXIqIGxpc3RlbmVyKQot
ICAgIDogSW5zcGVjdG9yU3R5bGVTaGVldChpZCwgbnVsbHB0ciwgb3JpZ2luLCBTdHJpbmcoKSwg
bGlzdGVuZXIpCi0gICAgLCBtX2VsZW1lbnQoV1RGOjptb3ZlKGVsZW1lbnQpKQotICAgICwgbV9y
dWxlU291cmNlRGF0YShudWxscHRyKQotICAgICwgbV9pc1N0eWxlVGV4dFZhbGlkKGZhbHNlKQot
ewotICAgIEFTU0VSVChtX2VsZW1lbnQpOwotICAgIG1faW5zcGVjdG9yU3R5bGUgPSBJbnNwZWN0
b3JTdHlsZTo6Y3JlYXRlKEluc3BlY3RvckNTU0lkKGlkLCAwKSwgaW5saW5lU3R5bGUoKSwgdGhp
cyk7Ci0gICAgbV9zdHlsZVRleHQgPSBtX2VsZW1lbnQtPmlzU3R5bGVkRWxlbWVudCgpID8gbV9l
bGVtZW50LT5nZXRBdHRyaWJ1dGUoInN0eWxlIikuc3RyaW5nKCkgOiBTdHJpbmcoKTsKLX0KLQot
dm9pZCBJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU6OmRpZE1vZGlmeUVsZW1lbnRB
dHRyaWJ1dGUoKQotewotICAgIG1faXNTdHlsZVRleHRWYWxpZCA9IGZhbHNlOwotICAgIGlmICht
X2VsZW1lbnQtPmlzU3R5bGVkRWxlbWVudCgpICYmIG1fZWxlbWVudC0+c3R5bGUoKSAhPSBtX2lu
c3BlY3RvclN0eWxlLT5jc3NTdHlsZSgpKQotICAgICAgICBtX2luc3BlY3RvclN0eWxlID0gSW5z
cGVjdG9yU3R5bGU6OmNyZWF0ZShJbnNwZWN0b3JDU1NJZChpZCgpLCAwKSwgaW5saW5lU3R5bGUo
KSwgdGhpcyk7Ci0gICAgbV9ydWxlU291cmNlRGF0YS5jbGVhcigpOwotfQotCi1ib29sIEluc3Bl
Y3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6Z2V0VGV4dChTdHJpbmcqIHJlc3VsdCkgY29u
c3QKLXsKLSAgICBpZiAoIW1faXNTdHlsZVRleHRWYWxpZCkgewotICAgICAgICBtX3N0eWxlVGV4
dCA9IGVsZW1lbnRTdHlsZVRleHQoKTsKLSAgICAgICAgbV9pc1N0eWxlVGV4dFZhbGlkID0gdHJ1
ZTsKLSAgICB9Ci0gICAgKnJlc3VsdCA9IG1fc3R5bGVUZXh0OwotICAgIHJldHVybiB0cnVlOwot
fQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6c2V0U3R5bGVUZXh0
KENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBjb25zdCBTdHJpbmcmIHRleHQsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIEFTU0VSVF9VTlVTRUQoc3R5bGUsIHN0eWxlID09IGlubGluZVN0
eWxlKCkpOwotCi0gICAgewotICAgICAgICBJbnNwZWN0b3JDU1NBZ2VudDo6SW5saW5lU3R5bGVP
dmVycmlkZVNjb3BlIG92ZXJyaWRlU2NvcGUoJm1fZWxlbWVudC0+ZG9jdW1lbnQoKSk7Ci0gICAg
ICAgIG1fZWxlbWVudC0+c2V0QXR0cmlidXRlKCJzdHlsZSIsIHRleHQsIGVjKTsKLSAgICB9Ci0K
LSAgICBtX3N0eWxlVGV4dCA9IHRleHQ7Ci0gICAgbV9pc1N0eWxlVGV4dFZhbGlkID0gdHJ1ZTsK
LSAgICBtX3J1bGVTb3VyY2VEYXRhLmNsZWFyKCk7Ci0gICAgcmV0dXJuICFlYzsKLX0KLQotc3Rk
Ojp1bmlxdWVfcHRyPFZlY3RvcjxzaXplX3Q+PiBJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5l
U3R5bGU6OmxpbmVFbmRpbmdzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ29udGVudFNlYXJjaFV0
aWxpdGllczo6bGluZUVuZGluZ3MoZWxlbWVudFN0eWxlVGV4dCgpKTsKLX0KLQotRG9jdW1lbnQq
IEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6b3duZXJEb2N1bWVudCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuICZtX2VsZW1lbnQtPmRvY3VtZW50KCk7Ci19Ci0KLWJvb2wgSW5zcGVj
dG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlOjplbnN1cmVQYXJzZWREYXRhUmVhZHkoKQotewot
ICAgIC8vIFRoZSAic3R5bGUiIHByb3BlcnR5IHZhbHVlIGNhbiBnZXQgY2hhbmdlZCBpbmRpcmVj
dGx5LCBlLmcuIHZpYSBlbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoID0gIjJweCIuCi0gICAgY29u
c3QgU3RyaW5nJiBjdXJyZW50U3R5bGVUZXh0ID0gZWxlbWVudFN0eWxlVGV4dCgpOwotICAgIGlm
IChtX3N0eWxlVGV4dCAhPSBjdXJyZW50U3R5bGVUZXh0KSB7Ci0gICAgICAgIG1fcnVsZVNvdXJj
ZURhdGEuY2xlYXIoKTsKLSAgICAgICAgbV9zdHlsZVRleHQgPSBjdXJyZW50U3R5bGVUZXh0Owot
ICAgICAgICBtX2lzU3R5bGVUZXh0VmFsaWQgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3J1
bGVTb3VyY2VEYXRhKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIG1fcnVsZVNvdXJjZURh
dGEgPSBDU1NSdWxlU291cmNlRGF0YTo6Y3JlYXRlKENTU1J1bGVTb3VyY2VEYXRhOjpTVFlMRV9S
VUxFKTsKLSAgICBib29sIHN1Y2Nlc3MgPSBnZXRTdHlsZUF0dHJpYnV0ZVJhbmdlcyhtX3J1bGVT
b3VyY2VEYXRhLmdldCgpKTsKLSAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1SZWZQdHI8SW5zcGVjdG9yU3R5bGU+IEluc3Bl
Y3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6aW5zcGVjdG9yU3R5bGVGb3JJZChjb25zdCBJ
bnNwZWN0b3JDU1NJZCYgaWQpCi17Ci0gICAgQVNTRVJUX1VOVVNFRChpZCwgIWlkLm9yZGluYWwo
KSk7Ci0gICAgcmV0dXJuIG1faW5zcGVjdG9yU3R5bGUuY29weVJlZigpOwotfQotCi1DU1NTdHls
ZURlY2xhcmF0aW9uKiBJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU6OmlubGluZVN0
eWxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9lbGVtZW50LT5zdHlsZSgpOwotfQotCi1jb25z
dCBTdHJpbmcmIEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6ZWxlbWVudFN0eWxl
VGV4dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZWxlbWVudC0+Z2V0QXR0cmlidXRlKCJzdHls
ZSIpLnN0cmluZygpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHls
ZTo6Z2V0U3R5bGVBdHRyaWJ1dGVSYW5nZXMoQ1NTUnVsZVNvdXJjZURhdGEqIHJlc3VsdCkgY29u
c3QKLXsKLSAgICBpZiAoIW1fZWxlbWVudC0+aXNTdHlsZWRFbGVtZW50KCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIGlmIChtX3N0eWxlVGV4dC5pc0VtcHR5KCkpIHsKLSAgICAgICAg
cmVzdWx0LT5ydWxlQm9keVJhbmdlLnN0YXJ0ID0gMDsKLSAgICAgICAgcmVzdWx0LT5ydWxlQm9k
eVJhbmdlLmVuZCA9IDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFJlZlB0
cjxNdXRhYmxlU3R5bGVQcm9wZXJ0aWVzPiB0ZW1wRGVjbGFyYXRpb24gPSBNdXRhYmxlU3R5bGVQ
cm9wZXJ0aWVzOjpjcmVhdGUoKTsKLSAgICBjcmVhdGVDU1NQYXJzZXIoJm1fZWxlbWVudC0+ZG9j
dW1lbnQoKSktPnBhcnNlRGVjbGFyYXRpb24odGVtcERlY2xhcmF0aW9uLmdldCgpLCBtX3N0eWxl
VGV4dCwgcmVzdWx0LCAmbV9lbGVtZW50LT5kb2N1bWVudCgpLmVsZW1lbnRTaGVldCgpLmNvbnRl
bnRzKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVTaGVldC5o
IGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlU2hlZXQuaApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxOWRjYi4uMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVTaGVldC5oCisrKyAvZGV2L251bGwKQEAgLTEs
Mjk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBB
TlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
LSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIEluc3BlY3RvclN0eWxlU2hlZXRf
aAotI2RlZmluZSBJbnNwZWN0b3JTdHlsZVNoZWV0X2gKLQotI2luY2x1ZGUgIkNTU1Byb3BlcnR5
U291cmNlRGF0YS5oIgotI2luY2x1ZGUgIkNTU1N0eWxlRGVjbGFyYXRpb24uaCIKLSNpbmNsdWRl
ICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSA8aW5zcGVjdG9yL0luc3BlY3RvclByb3RvY29s
T2JqZWN0cy5oPgotI2luY2x1ZGUgPGluc3BlY3Rvci9JbnNwZWN0b3JWYWx1ZXMuaD4KLSNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+Ci0jaW5jbHVkZSA8
d3RmL1JlZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KLQotY2xhc3MgUGFyc2VkU3R5bGVTaGVldDsKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotCi1jbGFzcyBDU1NSdWxlTGlzdDsKLWNsYXNzIENTU1NlbGVjdG9yOwotY2xhc3Mg
Q1NTU3R5bGVEZWNsYXJhdGlvbjsKLWNsYXNzIENTU1N0eWxlUnVsZTsKLWNsYXNzIENTU1N0eWxl
U2hlZXQ7Ci1jbGFzcyBEb2N1bWVudDsKLWNsYXNzIEVsZW1lbnQ7Ci1jbGFzcyBJbnNwZWN0b3JQ
YWdlQWdlbnQ7Ci1jbGFzcyBJbnNwZWN0b3JTdHlsZVNoZWV0OwotCi10eXBlZGVmIFN0cmluZyBF
cnJvclN0cmluZzsKLQotY2xhc3MgSW5zcGVjdG9yQ1NTSWQgewotcHVibGljOgotICAgIEluc3Bl
Y3RvckNTU0lkKCkgeyB9Ci0KLSAgICBleHBsaWNpdCBJbnNwZWN0b3JDU1NJZChjb25zdCBSZWZQ
dHI8SW5zcGVjdG9yOjpJbnNwZWN0b3JPYmplY3Q+JiYgdmFsdWUpCi0gICAgewotICAgICAgICBp
ZiAoIXZhbHVlLT5nZXRTdHJpbmcoQVNDSUlMaXRlcmFsKCJzdHlsZVNoZWV0SWQiKSwgbV9zdHls
ZVNoZWV0SWQpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmICghdmFsdWUtPmdl
dEludGVnZXIoQVNDSUlMaXRlcmFsKCJvcmRpbmFsIiksIG1fb3JkaW5hbCkpCi0gICAgICAgICAg
ICBtX3N0eWxlU2hlZXRJZCA9IFN0cmluZygpOwotICAgIH0KLQotICAgIEluc3BlY3RvckNTU0lk
KGNvbnN0IFN0cmluZyYgc3R5bGVTaGVldElkLCB1bnNpZ25lZCBvcmRpbmFsKQotICAgICAgICA6
IG1fc3R5bGVTaGVldElkKHN0eWxlU2hlZXRJZCkKLSAgICAgICAgLCBtX29yZGluYWwob3JkaW5h
bCkKLSAgICB7Ci0gICAgfQotCi0gICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9z
dHlsZVNoZWV0SWQuaXNFbXB0eSgpOyB9Ci0KLSAgICBjb25zdCBTdHJpbmcmIHN0eWxlU2hlZXRJ
ZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVTaGVldElkOyB9Ci0gICAgdW5zaWduZWQgb3JkaW5h
bCgpIGNvbnN0IHsgcmV0dXJuIG1fb3JkaW5hbDsgfQotCi0gICAgLy8gSUQgdHlwZSBpcyBlaXRo
ZXIgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZUlkIG9yIEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTUnVsZUlkLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIElEPgotICAgIFJl
ZlB0cjxJRD4gYXNQcm90b2NvbFZhbHVlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpc0Vt
cHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgICAgICByZXR1cm4gSUQ6
OmNyZWF0ZSgpCi0gICAgICAgICAgICAuc2V0U3R5bGVTaGVldElkKG1fc3R5bGVTaGVldElkKQot
ICAgICAgICAgICAgLnNldE9yZGluYWwobV9vcmRpbmFsKQotICAgICAgICAgICAgLnJlbGVhc2Uo
KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fc3R5bGVTaGVldElkOwotICAgIHVu
c2lnbmVkIG1fb3JkaW5hbCA9IHswfTsKLX07Ci0KLXN0cnVjdCBJbnNwZWN0b3JTdHlsZVByb3Bl
cnR5IHsKLSAgICBJbnNwZWN0b3JTdHlsZVByb3BlcnR5KCkKLSAgICAgICAgOiBoYXNTb3VyY2Uo
ZmFsc2UpCi0gICAgICAgICwgZGlzYWJsZWQoZmFsc2UpCi0gICAgewotICAgIH0KLQotICAgIElu
c3BlY3RvclN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlTb3VyY2VEYXRhIHNvdXJjZURhdGEsIGJv
b2wgaGFzU291cmNlLCBib29sIGRpc2FibGVkKQotICAgICAgICA6IHNvdXJjZURhdGEoc291cmNl
RGF0YSkKLSAgICAgICAgLCBoYXNTb3VyY2UoaGFzU291cmNlKQotICAgICAgICAsIGRpc2FibGVk
KGRpc2FibGVkKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFJhd1RleHRGcm9tU3R5bGVE
ZWNsYXJhdGlvbihjb25zdCBTdHJpbmcmIHN0eWxlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAg
ICB1bnNpZ25lZCBzdGFydCA9IHNvdXJjZURhdGEucmFuZ2Uuc3RhcnQ7Ci0gICAgICAgIHVuc2ln
bmVkIGVuZCA9IHNvdXJjZURhdGEucmFuZ2UuZW5kOwotICAgICAgICBBU1NFUlRfV0lUSF9TRUNV
UklUWV9JTVBMSUNBVElPTihzdGFydCA8IGVuZCk7Ci0gICAgICAgIEFTU0VSVChlbmQgPD0gc3R5
bGVEZWNsYXJhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgIHJhd1RleHQgPSBzdHlsZURlY2xhcmF0
aW9uLnN1YnN0cmluZyhzdGFydCwgZW5kIC0gc3RhcnQpOwotICAgIH0KLQotICAgIGJvb2wgaGFz
UmF3VGV4dCgpIGNvbnN0IHsgcmV0dXJuICFyYXdUZXh0LmlzRW1wdHkoKTsgfQotCi0gICAgQ1NT
UHJvcGVydHlTb3VyY2VEYXRhIHNvdXJjZURhdGE7Ci0gICAgYm9vbCBoYXNTb3VyY2U7Ci0gICAg
Ym9vbCBkaXNhYmxlZDsKLSAgICBTdHJpbmcgcmF3VGV4dDsKLX07Ci0KLWNsYXNzIEluc3BlY3Rv
clN0eWxlIGZpbmFsIDogcHVibGljIFJlZkNvdW50ZWQ8SW5zcGVjdG9yU3R5bGU+IHsKLXB1Ymxp
YzoKLSAgICBzdGF0aWMgUmVmPEluc3BlY3RvclN0eWxlPiBjcmVhdGUoY29uc3QgSW5zcGVjdG9y
Q1NTSWQmIHN0eWxlSWQsIFJlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiYmLCBJbnNwZWN0b3JT
dHlsZVNoZWV0KiBwYXJlbnRTdHlsZVNoZWV0KTsKLSAgICB+SW5zcGVjdG9yU3R5bGUoKTsKLQot
ICAgIENTU1N0eWxlRGVjbGFyYXRpb24qIGNzc1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHls
ZS5nZXQoKTsgfQotICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxl
PiBidWlsZE9iamVjdEZvclN0eWxlKCkgY29uc3Q7Ci0gICAgUmVmPEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTQ29tcHV0ZWRTdHlsZVByb3Bl
cnR5Pj4gYnVpbGRBcnJheUZvckNvbXB1dGVkU3R5bGUoKSBjb25zdDsKLQotICAgIGJvb2wgZ2V0
VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3Q7Ci0gICAgYm9vbCBzZXRUZXh0KGNvbnN0IFN0cmlu
ZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLQotcHJpdmF0ZToKLSAgICBJbnNwZWN0b3JTdHlsZShjb25z
dCBJbnNwZWN0b3JDU1NJZCYgc3R5bGVJZCwgUmVmUHRyPENTU1N0eWxlRGVjbGFyYXRpb24+JiYs
IEluc3BlY3RvclN0eWxlU2hlZXQqIHBhcmVudFN0eWxlU2hlZXQpOwotCi0gICAgLy8gRklYTUU6
IFJlbW92ZSB0aGVzZSBhbGlhc2VzIGFuZCB1cGRhdGUgYWxsIHRoZSBjdXJyZW50IGNhbGwgc2l0
ZXMgdG8gdXNlIHRoZSBuZXcgcHVibGljIG1ldGhvZHMuCi0gICAgYm9vbCBzdHlsZVRleHQoU3Ry
aW5nKiByZXN1bHQpIGNvbnN0IHsgcmV0dXJuIGdldFRleHQocmVzdWx0KTsgfQotICAgIGJvb2wg
YXBwbHlTdHlsZVRleHQoY29uc3QgU3RyaW5nJiB0ZXh0KSB7IEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OyByZXR1cm4gc2V0VGV4dCh0ZXh0LCBlYyk7IH0KLQotICAgIGJvb2wgcG9wdWxhdGVBbGxQcm9w
ZXJ0aWVzKFZlY3RvcjxJbnNwZWN0b3JTdHlsZVByb3BlcnR5PiogcmVzdWx0KSBjb25zdDsKLSAg
ICBSZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4gc3R5bGVXaXRoUHJvcGVy
dGllcygpIGNvbnN0OwotICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gZXh0cmFjdFNvdXJj
ZURhdGEoKSBjb25zdDsKLSAgICBTdHJpbmcgc2hvcnRoYW5kVmFsdWUoY29uc3QgU3RyaW5nJiBz
aG9ydGhhbmRQcm9wZXJ0eSkgY29uc3Q7Ci0gICAgU3RyaW5nIHNob3J0aGFuZFByaW9yaXR5KGNv
bnN0IFN0cmluZyYgc2hvcnRoYW5kUHJvcGVydHkpIGNvbnN0OwotICAgIFZlY3RvcjxTdHJpbmc+
IGxvbmdoYW5kUHJvcGVydGllcyhjb25zdCBTdHJpbmcmIHNob3J0aGFuZFByb3BlcnR5KSBjb25z
dDsKLQotICAgIEluc3BlY3RvckNTU0lkIG1fc3R5bGVJZDsKLSAgICBSZWZQdHI8Q1NTU3R5bGVE
ZWNsYXJhdGlvbj4gbV9zdHlsZTsKLSAgICBJbnNwZWN0b3JTdHlsZVNoZWV0KiBtX3BhcmVudFN0
eWxlU2hlZXQ7Ci19OwotCi1lbnVtIGNsYXNzIFN0eWxlU2hlZXRPcmlnaW4gewotICAgIEluc3Bl
Y3RvciwKLSAgICBVc2VyQWdlbnQsCi0gICAgVXNlciwKLSAgICBBdXRob3IKLX07Ci0KLWNsYXNz
IEluc3BlY3RvclN0eWxlU2hlZXQgOiBwdWJsaWMgUmVmQ291bnRlZDxJbnNwZWN0b3JTdHlsZVNo
ZWV0PiB7Ci1wdWJsaWM6Ci0gICAgY2xhc3MgTGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAg
ICAgTGlzdGVuZXIoKSB7IH0KLSAgICAgICAgdmlydHVhbCB+TGlzdGVuZXIoKSB7IH0KLSAgICAg
ICAgdmlydHVhbCB2b2lkIHN0eWxlU2hlZXRDaGFuZ2VkKEluc3BlY3RvclN0eWxlU2hlZXQmKSA9
IDA7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBSZWY8SW5zcGVjdG9yU3R5bGVTaGVldD4gY3JlYXRl
KGNvbnN0IFN0cmluZyYgaWQsIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiYmIHBhZ2VTdHlsZVNoZWV0
LCBTdHlsZVNoZWV0T3JpZ2luLCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCBMaXN0ZW5lciop
OwotICAgIHN0YXRpYyBTdHJpbmcgc3R5bGVTaGVldFVSTChDU1NTdHlsZVNoZWV0KiBwYWdlU3R5
bGVTaGVldCk7Ci0KLSAgICB2aXJ0dWFsIH5JbnNwZWN0b3JTdHlsZVNoZWV0KCk7Ci0KLSAgICBT
dHJpbmcgaWQoKSBjb25zdCB7IHJldHVybiBtX2lkOyB9Ci0gICAgU3RyaW5nIGZpbmFsVVJMKCkg
Y29uc3Q7Ci0gICAgU3RyaW5nIHRpdGxlKCkgY29uc3Q7Ci0gICAgU3R5bGVTaGVldE9yaWdpbiBv
cmlnaW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQotICAgIGJvb2wgaXNFbmFibGVkKCkg
Y29uc3Q7Ci0KLSAgICBDU1NTdHlsZVNoZWV0KiBwYWdlU3R5bGVTaGVldCgpIGNvbnN0IHsgcmV0
dXJuIG1fcGFnZVN0eWxlU2hlZXQuZ2V0KCk7IH0KLSAgICB2aXJ0dWFsIERvY3VtZW50KiBvd25l
ckRvY3VtZW50KCkgY29uc3Q7Ci0KLSAgICBTdHJpbmcgcnVsZVNlbGVjdG9yKGNvbnN0IEluc3Bl
Y3RvckNTU0lkJiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIGJvb2wgc2V0UnVsZVNlbGVjdG9yKGNv
bnN0IEluc3BlY3RvckNTU0lkJiwgY29uc3QgU3RyaW5nJiBzZWxlY3RvciwgRXhjZXB0aW9uQ29k
ZSYpOwotCi0gICAgdmlydHVhbCBib29sIGdldFRleHQoU3RyaW5nKiByZXN1bHQpIGNvbnN0Owot
ICAgIGJvb2wgc2V0VGV4dChjb25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBD
U1NTdHlsZVJ1bGUqIGFkZFJ1bGUoY29uc3QgU3RyaW5nJiBzZWxlY3RvciwgRXhjZXB0aW9uQ29k
ZSYpOwotICAgIGJvb2wgZGVsZXRlUnVsZShjb25zdCBJbnNwZWN0b3JDU1NJZCYsIEV4Y2VwdGlv
bkNvZGUmKTsKLQotICAgIHZvaWQgcmVwYXJzZVN0eWxlU2hlZXQoY29uc3QgU3RyaW5nJik7Ci0g
ICAgYm9vbCBzZXRTdHlsZVRleHQoY29uc3QgSW5zcGVjdG9yQ1NTSWQmLCBjb25zdCBTdHJpbmcm
IHRleHQsIFN0cmluZyogb2xkVGV4dCwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgSW5zcGVjdG9y
Q1NTSWQgcnVsZUlkKENTU1N0eWxlUnVsZSopIGNvbnN0OwotICAgIENTU1N0eWxlUnVsZSogcnVs
ZUZvcklkKGNvbnN0IEluc3BlY3RvckNTU0lkJikgY29uc3Q7Ci0gICAgSW5zcGVjdG9yQ1NTSWQg
c3R5bGVJZChDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkgY29uc3QgeyByZXR1cm4gcnVsZU9y
U3R5bGVJZChzdHlsZSk7IH0KLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxl
Rm9ySWQoY29uc3QgSW5zcGVjdG9yQ1NTSWQmKSBjb25zdDsKLQotICAgIFJlZlB0cjxJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRCb2R5PiBidWlsZE9iamVjdEZvclN0eWxl
U2hlZXQoKTsKLSAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiBi
dWlsZE9iamVjdEZvclJ1bGUoQ1NTU3R5bGVSdWxlKiwgRWxlbWVudCopOwotICAgIFJlZlB0cjxJ
bnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlPiBidWlsZE9iamVjdEZvclN0eWxlKENT
U1N0eWxlRGVjbGFyYXRpb24qKTsKLQotICAgIHZvaWQgZmlyZVN0eWxlU2hlZXRDaGFuZ2VkKCk7
Ci0KLXByb3RlY3RlZDoKLSAgICBJbnNwZWN0b3JTdHlsZVNoZWV0KGNvbnN0IFN0cmluZyYgaWQs
IFJlZlB0cjxDU1NTdHlsZVNoZWV0PiYmIHBhZ2VTdHlsZVNoZWV0LCBTdHlsZVNoZWV0T3JpZ2lu
LCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCBMaXN0ZW5lciopOwotCi0gICAgYm9vbCBjYW5C
aW5kKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW4gIT0gU3R5bGVTaGVldE9yaWdpbjo6VXNlckFn
ZW50ICYmIG1fb3JpZ2luICE9IFN0eWxlU2hlZXRPcmlnaW46OlVzZXI7IH0KLSAgICBJbnNwZWN0
b3JDU1NJZCBydWxlT3JTdHlsZUlkKENTU1N0eWxlRGVjbGFyYXRpb24qKSBjb25zdDsKLSAgICB2
aXJ0dWFsIFJlZlB0cjxJbnNwZWN0b3JTdHlsZT4gaW5zcGVjdG9yU3R5bGVGb3JJZChjb25zdCBJ
bnNwZWN0b3JDU1NJZCYpOwotCi0gICAgdmlydHVhbCBSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+
IHJ1bGVTb3VyY2VEYXRhRm9yKENTU1N0eWxlRGVjbGFyYXRpb24qKSBjb25zdDsKLSAgICB2aXJ0
dWFsIHVuc2lnbmVkIHJ1bGVJbmRleEJ5U3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiopIGNvbnN0
OwotICAgIHZpcnR1YWwgYm9vbCBlbnN1cmVQYXJzZWREYXRhUmVhZHkoKTsKLQotICAgIC8vIEFs
c28gYWNjZXNzZWQgYnkgZnJpZW5kIGNsYXNzIEluc3BlY3RvclN0eWxlLgotICAgIHZpcnR1YWwg
Ym9vbCBzZXRTdHlsZVRleHQoQ1NTU3R5bGVEZWNsYXJhdGlvbiosIGNvbnN0IFN0cmluZyYsIEV4
Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxWZWN0b3I8c2l6ZV90
Pj4gbGluZUVuZGluZ3MoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB0eXBlZGVmIFZlY3RvcjxS
ZWZQdHI8Q1NTU3R5bGVSdWxlPj4gQ1NTU3R5bGVSdWxlVmVjdG9yOwotICAgIGZyaWVuZCBjbGFz
cyBJbnNwZWN0b3JTdHlsZTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbGxlY3RGbGF0UnVsZXMoUmVm
UHRyPENTU1J1bGVMaXN0PiYmLCBDU1NTdHlsZVJ1bGVWZWN0b3IqIHJlc3VsdCk7Ci0gICAgYm9v
bCBjaGVja1BhZ2VTdHlsZVNoZWV0KEV4Y2VwdGlvbkNvZGUmKSBjb25zdDsKLSAgICBib29sIHN0
eWxlU2hlZXRNdXRhdGVkKCkgY29uc3Q7Ci0gICAgYm9vbCBlbnN1cmVUZXh0KCkgY29uc3Q7Ci0g
ICAgYm9vbCBlbnN1cmVTb3VyY2VEYXRhKCk7Ci0gICAgdm9pZCBlbnN1cmVGbGF0UnVsZXMoKSBj
b25zdDsKLSAgICBib29sIHN0eWxlU2hlZXRUZXh0V2l0aENoYW5nZWRTdHlsZShDU1NTdHlsZURl
Y2xhcmF0aW9uKiwgY29uc3QgU3RyaW5nJiBuZXdTdHlsZVRleHQsIFN0cmluZyogcmVzdWx0KTsK
LSAgICBib29sIG9yaWdpbmFsU3R5bGVTaGVldFRleHQoU3RyaW5nKiByZXN1bHQpIGNvbnN0Owot
ICAgIGJvb2wgcmVzb3VyY2VTdHlsZVNoZWV0VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3Q7Ci0g
ICAgYm9vbCBpbmxpbmVTdHlsZVNoZWV0VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3Q7Ci0gICAg
UmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6
Q1NTUnVsZT4+IGJ1aWxkQXJyYXlGb3JSdWxlTGlzdChDU1NSdWxlTGlzdCopOwotICAgIFJlZjxJ
bnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNlbGVjdG9yTGlzdD4gYnVpbGRPYmplY3RGb3JTZWxl
Y3Rvckxpc3QoQ1NTU3R5bGVSdWxlKiwgRWxlbWVudCopOwotCi0gICAgU3RyaW5nIG1faWQ7Ci0g
ICAgUmVmUHRyPENTU1N0eWxlU2hlZXQ+IG1fcGFnZVN0eWxlU2hlZXQ7Ci0gICAgU3R5bGVTaGVl
dE9yaWdpbiBtX29yaWdpbjsKLSAgICBTdHJpbmcgbV9kb2N1bWVudFVSTDsKLSAgICBzdGQ6OnVu
aXF1ZV9wdHI8UGFyc2VkU3R5bGVTaGVldD4gbV9wYXJzZWRTdHlsZVNoZWV0OwotICAgIG11dGFi
bGUgQ1NTU3R5bGVSdWxlVmVjdG9yIG1fZmxhdFJ1bGVzOwotICAgIExpc3RlbmVyKiBtX2xpc3Rl
bmVyOwotfTsKLQotY2xhc3MgSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlIGZpbmFs
IDogcHVibGljIEluc3BlY3RvclN0eWxlU2hlZXQgewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8
SW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlPiBjcmVhdGUoY29uc3QgU3RyaW5nJiBp
ZCwgUmVmUHRyPEVsZW1lbnQ+JiYsIFN0eWxlU2hlZXRPcmlnaW4sIExpc3RlbmVyKik7Ci0KLSAg
ICB2aXJ0dWFsIERvY3VtZW50KiBvd25lckRvY3VtZW50KCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAg
ICB2b2lkIGRpZE1vZGlmeUVsZW1lbnRBdHRyaWJ1dGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgZ2V0
VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBDU1NTdHls
ZURlY2xhcmF0aW9uKiBzdHlsZUZvcklkKGNvbnN0IEluc3BlY3RvckNTU0lkJiBpZCkgY29uc3Qg
b3ZlcnJpZGUgeyBBU1NFUlRfVU5VU0VEKGlkLCAhaWQub3JkaW5hbCgpKTsgcmV0dXJuIGlubGlu
ZVN0eWxlKCk7IH0KLQotcHJvdGVjdGVkOgotICAgIEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxp
bmVTdHlsZShjb25zdCBTdHJpbmcmIGlkLCBSZWZQdHI8RWxlbWVudD4mJiwgU3R5bGVTaGVldE9y
aWdpbiwgTGlzdGVuZXIqKTsKLQotICAgIHZpcnR1YWwgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRh
PiBydWxlU291cmNlRGF0YUZvcihDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkgY29uc3Qgb3Zl
cnJpZGUgeyBBU1NFUlRfVU5VU0VEKHN0eWxlLCBzdHlsZSA9PSBpbmxpbmVTdHlsZSgpKTsgcmV0
dXJuIG1fcnVsZVNvdXJjZURhdGE7IH0KLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHJ1bGVJbmRleEJ5
U3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiopIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgZW5zdXJlUGFyc2VkRGF0YVJlYWR5KCkgb3ZlcnJpZGU7Ci0gICAg
dmlydHVhbCBSZWZQdHI8SW5zcGVjdG9yU3R5bGU+IGluc3BlY3RvclN0eWxlRm9ySWQoY29uc3Qg
SW5zcGVjdG9yQ1NTSWQmKSBvdmVycmlkZTsKLQotICAgIC8vIEFsc28gYWNjZXNzZWQgYnkgZnJp
ZW5kIGNsYXNzIEluc3BlY3RvclN0eWxlLgotICAgIHZpcnR1YWwgYm9vbCBzZXRTdHlsZVRleHQo
Q1NTU3R5bGVEZWNsYXJhdGlvbiosIGNvbnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKSBvdmVy
cmlkZTsKLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxWZWN0b3I8c2l6ZV90Pj4gbGluZUVu
ZGluZ3MoKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBDU1NTdHlsZURlY2xhcmF0
aW9uKiBpbmxpbmVTdHlsZSgpIGNvbnN0OwotICAgIGNvbnN0IFN0cmluZyYgZWxlbWVudFN0eWxl
VGV4dCgpIGNvbnN0OwotICAgIGJvb2wgZ2V0U3R5bGVBdHRyaWJ1dGVSYW5nZXMoQ1NTUnVsZVNv
dXJjZURhdGEqIHJlc3VsdCkgY29uc3Q7Ci0KLSAgICBSZWZQdHI8RWxlbWVudD4gbV9lbGVtZW50
OwotICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gbV9ydWxlU291cmNlRGF0YTsKLSAgICBS
ZWZQdHI8SW5zcGVjdG9yU3R5bGU+IG1faW5zcGVjdG9yU3R5bGU7Ci0KLSAgICAvLyBDb250YWlu
cyAic3R5bGUiIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICBtdXRhYmxlIFN0cmluZyBtX3N0eWxlVGV4
dDsKLSAgICBtdXRhYmxlIGJvb2wgbV9pc1N0eWxlVGV4dFZhbGlkOwotfTsKLQotLy8gRklYTUU6
IHRoaXMgd2lsbCBldmVudHVhbGx5IGJlbG9uZyBpbiBJbnNwZWN0b3JDU1NBZ2VudC5jcHAuCi1J
bnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW4gc3R5bGVzaGVldE9yaWdp
blRvUHJvdG9jb2xFbnVtKFN0eWxlU2hlZXRPcmlnaW4gb3JpZ2luKTsKLQotfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQotCi0jZW5kaWYgLy8gIWRlZmluZWQoSW5zcGVjdG9yU3R5bGVTaGVldF9oKQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRS
dWxlU2V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZXNoZWV0
UnVsZVNldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1YjJkOQot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHls
ZXNoZWV0UnVsZVNldC5jcHAKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmgiCisKKyNpbmNs
dWRlICJDU1NQYXJzZXIuaCIKKyNpbmNsdWRlICJDU1NQcm9wZXJ0eVNvdXJjZURhdGEuaCIKKyNp
bmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKKyNp
bmNsdWRlICJDU1NTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxTdHlsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NBZ2VudC5oIgorI2lu
Y2x1ZGUgIkluc3BlY3RvclBhZ2VBZ2VudC5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlUnVs
ZS5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgorI2luY2x1ZGUgIlN0eWxlUnVsZS5o
IgorI2luY2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2luY2x1ZGUgIlNWR1N0eWxlRWxl
bWVudC5oIgorI2luY2x1ZGUgPGluc3BlY3Rvci9Db250ZW50U2VhcmNoVXRpbGl0aWVzLmg+Cisj
aW5jbHVkZSA8eWFyci9SZWd1bGFyRXhwcmVzc2lvbi5oPgorI2luY2x1ZGUgPHd0Zi9OZXZlckRl
c3Ryb3llZC5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIEluc3Bl
Y3RvciB7CisKK1JlZjxTdHlsZXNoZWV0UnVsZVNldD4gU3R5bGVzaGVldFJ1bGVTZXQ6OmNyZWF0
ZShSZWY8Q1NTU3R5bGVTaGVldD4mJiBwYWdlU3R5bGVTaGVldCwgU3R5bGVTaGVldE9yaWdpbiBv
cmlnaW4sIGNvbnN0IFN0cmluZyYgZG9jdW1lbnRVUkwsIExpc3RlbmVyKiBsaXN0ZW5lcikKK3sK
KyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdHlsZXNoZWV0UnVsZVNldChXVEY6Om1vdmUocGFn
ZVN0eWxlU2hlZXQpLCBvcmlnaW4sIGRvY3VtZW50VVJMLCBsaXN0ZW5lcikpOworfQorCitTdHls
ZXNoZWV0UnVsZVNldDo6U3R5bGVzaGVldFJ1bGVTZXQoUmVmPENTU1N0eWxlU2hlZXQ+JiYgcGFn
ZVN0eWxlU2hlZXQsIFN0eWxlU2hlZXRPcmlnaW4gb3JpZ2luLCBjb25zdCBTdHJpbmcmIGRvY3Vt
ZW50VVJMLCBMaXN0ZW5lciogbGlzdGVuZXIpCisgICAgOiBTdHlsZVJ1bGVTZXQoKQorICAgICwg
bV9wYWdlU3R5bGVTaGVldChXVEY6Om1vdmUocGFnZVN0eWxlU2hlZXQpKQorICAgICwgbV9vcmln
aW4ob3JpZ2luKQorICAgICwgbV9kb2N1bWVudFVSTChkb2N1bWVudFVSTCkKKyAgICAsIG1fbGlz
dGVuZXIobGlzdGVuZXIpCit7Cit9CisKK1N0eWxlc2hlZXRSdWxlU2V0Ojp+U3R5bGVzaGVldFJ1
bGVTZXQoKQoreworfQorCitTdHJpbmcgU3R5bGVzaGVldFJ1bGVTZXQ6OmZpbmFsVVJMKCkgY29u
c3QKK3sKKyAgICBpZiAoIW1fcGFnZVN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFzZVVSTCgpLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIG1fcGFnZVN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFz
ZVVSTCgpLnN0cmluZygpOworCisgICAgcmV0dXJuIG1fZG9jdW1lbnRVUkw7Cit9CisKK2Jvb2wg
U3R5bGVzaGVldFJ1bGVTZXQ6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFtX3Bh
Z2VTdHlsZVNoZWV0LT5kaXNhYmxlZCgpOworfQorCitTdHJpbmcgU3R5bGVzaGVldFJ1bGVTZXQ6
OnRpdGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYWdlU3R5bGVTaGVldC0+dGl0bGUoKTsK
K30KKwordm9pZCBTdHlsZXNoZWV0UnVsZVNldDo6cGF0Y2hTdHlsZXNoZWV0VGV4dChjb25zdCBT
dHJpbmcmIHN0eWxlc2hlZXRUZXh0KQoreworICAgIGNvbW1pdFJ1bGVTZXRDaGFuZ2UoUGFyc2Vk
UnVsZVNldERhdGE6OmNyZWF0ZVdpdGhUZXh0KCp0aGlzLCBzdHlsZXNoZWV0VGV4dCkpOworfQor
Cit2b2lkIFN0eWxlc2hlZXRSdWxlU2V0OjpyZXBsYWNlVGV4dChjb25zdCBTdHJpbmcmIHN0eWxl
c2hlZXRUZXh0KQoreworICAgIHsKKyAgICAgICAgLy8gTXVzdCB1c2UgYSBzZXBhcmF0ZSBzY29w
ZSBmb3IgY2xlYXJSdWxlcygpLiBodHRwczovL3d3dy53ZWJraXQub3JnL2IvOTUzMjQvCisgICAg
ICAgIENTU1N0eWxlU2hlZXQ6OlJ1bGVNdXRhdGlvblNjb3BlIG11dGF0aW9uU2NvcGUoJm1fcGFn
ZVN0eWxlU2hlZXQuZ2V0KCkpOworICAgICAgICBtX3BhZ2VTdHlsZVNoZWV0LT5jb250ZW50cygp
LmNsZWFyUnVsZXMoKTsKKyAgICB9CisgICAgeworICAgICAgICBDU1NTdHlsZVNoZWV0OjpSdWxl
TXV0YXRpb25TY29wZSBtdXRhdGlvblNjb3BlKCZtX3BhZ2VTdHlsZVNoZWV0LmdldCgpKTsKKyAg
ICAgICAgbV9wYWdlU3R5bGVTaGVldC0+Y29udGVudHMoKS5wYXJzZVN0cmluZyhzdHlsZXNoZWV0
VGV4dCk7CisgICAgICAgIG1fcGFnZVN0eWxlU2hlZXQtPmNsZWFyQ2hpbGRSdWxlQ1NTT01XcmFw
cGVycygpOworICAgIH0KKworICAgIC8vIFdlIGp1c3Qgd2lwZWQgdGhlIGVudGlyZSBjb250ZW50
cyBvZiB0aGUgc3R5bGVzaGVldC4gQ2xlYXIgdGhlIG11dGF0aW9uIGZsYWcuCisgICAgbV9wYWdl
U3R5bGVTaGVldC0+Y2xlYXJIYWRSdWxlc011dGF0aW9uKCk7CisKKyAgICBjb21taXRSdWxlU2V0
Q2hhbmdlKFBhcnNlZFJ1bGVTZXREYXRhOjpjcmVhdGUoKnRoaXMpKTsKK30KKwordm9pZCBTdHls
ZXNoZWV0UnVsZVNldDo6bm90aWZ5UnVsZVNldENoYW5nZWQoKQoreworICAgIGlmIChtX2xpc3Rl
bmVyKQorICAgICAgICBtX2xpc3RlbmVyLT5zdHlsZVNoZWV0Q2hhbmdlZCgqdGhpcyk7Cit9CisK
K2Jvb2wgU3R5bGVzaGVldFJ1bGVTZXQ6OnNlbGVjdG9yVGV4dEZvclJ1bGUoY29uc3QgQ1NTSWQm
IGlkLCBTdHJpbmcmIHJlc3VsdCkKK3sKKyAgICBpZiAoQ1NTU3R5bGVSdWxlKiBydWxlID0gcnVs
ZUZvcklkKGlkKSkgeworICAgICAgICByZXN1bHQgPSBydWxlLT5zZWxlY3RvclRleHQoKTsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29s
IFN0eWxlc2hlZXRSdWxlU2V0OjpzZXRTZWxlY3RvclRleHRGb3JSdWxlKGNvbnN0IENTU0lkJiBp
ZCwgY29uc3QgU3RyaW5nJiBzZWxlY3RvclRleHQpCit7CisgICAgQ1NTU3R5bGVSdWxlKiBydWxl
ID0gcnVsZUZvcklkKGlkKTsKKyAgICBpZiAoIXJ1bGUpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIENTU1N0eWxlU2hlZXQqIHN0eWxlU2hlZXQgPSBydWxlLT5wYXJlbnRTdHlsZVNoZWV0
KCk7CisgICAgaWYgKCFzdHlsZVNoZWV0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
dWxlLT5zZXRTZWxlY3RvclRleHQoc2VsZWN0b3JUZXh0KTsKKyAgICBSZWZQdHI8Q1NTUnVsZVNv
dXJjZURhdGE+IHNvdXJjZURhdGEgPSBzb3VyY2VEYXRhRm9yUnVsZSgqcnVsZSk7CisgICAgaWYg
KCFzb3VyY2VEYXRhKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTdHJpbmcgc3R5bGVz
aGVldFRleHQgPSBwYXJzZWRSdWxlU2V0RGF0YSgpLnNvdXJjZVRleHQoKTsKKyAgICBzdHlsZXNo
ZWV0VGV4dC5yZXBsYWNlKHNvdXJjZURhdGEtPnJ1bGVIZWFkZXJSYW5nZS5zdGFydCwgc291cmNl
RGF0YS0+cnVsZUhlYWRlclJhbmdlLmxlbmd0aCgpLCBzZWxlY3RvclRleHQpOworICAgIHBhdGNo
U3R5bGVzaGVldFRleHQoc3R5bGVzaGVldFRleHQpOworICAgIHJldHVybiB0cnVlOworfQorICAK
K3N0YXRpYyBDU1NQYXJzZXJDb250ZXh0IHBhcnNlckNvbnRleHRGb3JEb2N1bWVudChEb2N1bWVu
dCogZG9jdW1lbnQpCit7CisgICAgcmV0dXJuIGRvY3VtZW50ID8gQ1NTUGFyc2VyQ29udGV4dCgq
ZG9jdW1lbnQpIDogc3RyaWN0Q1NTUGFyc2VyQ29udGV4dCgpOworfQorICAgIAorc3RhdGljIGJv
b2wgY2hlY2tTdHlsZVJ1bGVTZWxlY3RvcihEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IFN0cmlu
ZyYgc2VsZWN0b3IpCit7CisgICAgQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdDsKKyAgICBD
U1NQYXJzZXIgcGFyc2VyKHBhcnNlckNvbnRleHRGb3JEb2N1bWVudChkb2N1bWVudCkpOworICAg
IHBhcnNlci5wYXJzZVNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3Rvckxpc3QpOworICAgIHJldHVy
biBzZWxlY3Rvckxpc3QuaXNWYWxpZCgpOworfQorCitDU1NTdHlsZVJ1bGUqIFN0eWxlc2hlZXRS
dWxlU2V0OjphZGRSdWxlKGNvbnN0IFN0cmluZyYgc2VsZWN0b3JUZXh0LCBFeGNlcHRpb25Db2Rl
JiBlYykKK3sKKyAgICBpZiAoIWNoZWNrU3R5bGVSdWxlU2VsZWN0b3IobV9wYWdlU3R5bGVTaGVl
dC0+b3duZXJEb2N1bWVudCgpLCBzZWxlY3RvclRleHQpKSB7CisgICAgICAgIGVjID0gU1lOVEFY
X0VSUjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgU3RyaW5nIHN0eWxl
c2hlZXRUZXh0ID0gZ2V0VGV4dCgpOworCisgICAgbV9wYWdlU3R5bGVTaGVldC0+YWRkUnVsZShz
ZWxlY3RvclRleHQsICIiLCBlYyk7CisgICAgaWYgKGVjKQorICAgICAgICByZXR1cm4gbnVsbHB0
cjsKKyAgICBBU1NFUlQobV9wYWdlU3R5bGVTaGVldC0+bGVuZ3RoKCkpOworCisgICAgdW5zaWdu
ZWQgbGFzdFJ1bGVPcmRpbmFsID0gbV9wYWdlU3R5bGVTaGVldC0+bGVuZ3RoKCkgLSAxOworICAg
IENTU1J1bGUqIHJ1bGUgPSBtX3BhZ2VTdHlsZVNoZWV0LT5pdGVtKGxhc3RSdWxlT3JkaW5hbCk7
CisgICAgaWYgKCFpczxDU1NTdHlsZVJ1bGU+KHJ1bGUpKSB7CisgICAgICAgIC8vIFdoYXQgd2Ug
anVzdCBhZGRlZCBoYXMgdG8gYmUgYSBDU1NTdHlsZVJ1bGUgLSB3ZSBjYW5ub3QgaGFuZGxlIG90
aGVyIHR5cGVzIG9mIHJ1bGVzIHlldC4KKyAgICAgICAgLy8gSWYgaXQgaXMgbm90IGEgc3R5bGUg
cnVsZSwgcHJldGVuZCB3ZSBuZXZlciB0b3VjaGVkIHRoZSBzdHlsZXNoZWV0LgorICAgICAgICBt
X3BhZ2VTdHlsZVNoZWV0LT5kZWxldGVSdWxlKGxhc3RSdWxlT3JkaW5hbCwgQVNTRVJUX05PX0VY
Q0VQVElPTik7CisgICAgICAgIGVjID0gU1lOVEFYX0VSUjsKKyAgICAgICAgcmV0dXJuIG51bGxw
dHI7CisgICAgfQorCisgICAgU3RyaW5nQnVpbGRlciBwYXRjaGVkU3R5bGVzaGVldFRleHQ7Cisg
ICAgcGF0Y2hlZFN0eWxlc2hlZXRUZXh0LmFwcGVuZChzdHlsZXNoZWV0VGV4dCk7CisKKyAgICBp
ZiAoIXBhdGNoZWRTdHlsZXNoZWV0VGV4dC5pc0VtcHR5KCkpCisgICAgICAgIHBhdGNoZWRTdHls
ZXNoZWV0VGV4dC5hcHBlbmQoJ1xuJyk7CisKKyAgICBwYXRjaGVkU3R5bGVzaGVldFRleHQuYXBw
ZW5kKHNlbGVjdG9yVGV4dCk7CisgICAgcGF0Y2hlZFN0eWxlc2hlZXRUZXh0LmFwcGVuZExpdGVy
YWwoIiB7fSIpOworCisgICAgcGF0Y2hTdHlsZXNoZWV0VGV4dChwYXRjaGVkU3R5bGVzaGVldFRl
eHQudG9TdHJpbmcoKSk7CisKKyAgICByZXR1cm4gZG93bmNhc3Q8Q1NTU3R5bGVSdWxlPihydWxl
KTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6ZGVsZXRlUnVsZShjb25zdCBDU1NJZCYg
aWQsIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIFJlZlB0cjxDU1NTdHlsZVJ1bGU+IHJ1bGUg
PSBydWxlRm9ySWQoaWQpOworICAgIGlmICghcnVsZSkgeworICAgICAgICBlYyA9IE5PVF9GT1VO
RF9FUlI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUmVmUHRyPENTU1J1bGVT
b3VyY2VEYXRhPiBzb3VyY2VEYXRhID0gc291cmNlRGF0YUZvclJ1bGUoKnJ1bGUpOworICAgIGlm
ICghc291cmNlRGF0YSkgeworICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDU1NTdHlsZVNoZWV0KiBzdHlsZVNoZWV0ID0gcnVs
ZS0+cGFyZW50U3R5bGVTaGVldCgpOworICAgIHN0eWxlU2hlZXQtPmRlbGV0ZVJ1bGUoaWQucnVs
ZU9yZGluYWwoKSwgZWMpOworICAgIHJ1bGUgPSBudWxscHRyOyAvLyBUaGUgcnVsZSBpcyBubyBs
b25nZXIgdmFsaWQsIHNvIGRvbid0IGtlZXAgYSByZWZlcmVuY2UuCisKKyAgICBpZiAoZWMpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFN0cmluZyBzdHlsZXNoZWV0VGV4dCA9IHBhcnNl
ZFJ1bGVTZXREYXRhKCkuc291cmNlVGV4dCgpOworICAgIHN0eWxlc2hlZXRUZXh0LnJlbW92ZShz
b3VyY2VEYXRhLT5ydWxlSGVhZGVyUmFuZ2Uuc3RhcnQsIHNvdXJjZURhdGEtPnJ1bGVCb2R5UmFu
Z2UuZW5kIC0gc291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdlLnN0YXJ0ICsgMSk7CisKKyAgICBw
YXRjaFN0eWxlc2hlZXRUZXh0KHN0eWxlc2hlZXRUZXh0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworQ1NTU3R5bGVSdWxlKiBTdHlsZXNoZWV0UnVsZVNldDo6cnVsZUZvcklkKGNvbnN0IENTU0lk
JiBpZCkKK3sKKyAgICBQYXJzZWRSdWxlU2V0RGF0YSYgcGFyc2VkRGF0YSA9IHBhcnNlZFJ1bGVT
ZXREYXRhKCk7CisgICAgaWYgKGlkLnJ1bGVPcmRpbmFsKCkgPj0gcGFyc2VkRGF0YS5mbGF0dGVu
ZWRTdHlsZVJ1bGVzKCkuc2l6ZSgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJl
dHVybiBwYXJzZWREYXRhLmZsYXR0ZW5lZFN0eWxlUnVsZXMoKS5hdChpZC5ydWxlT3JkaW5hbCgp
KS5nZXQoKTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6c2V0VGV4dEZvclN0eWxlKGNv
bnN0IENTU0lkJiBpZCwgY29uc3QgU3RyaW5nJiB0ZXh0LCBTdHJpbmcmIG9sZFRleHQpCit7Cisg
ICAgUmVmUHRyPFN0eWxlUnVsZT4gc3R5bGVSdWxlID0gaW5zcGVjdG9yU3R5bGVGb3JJZChpZCk7
CisgICAgaWYgKCFzdHlsZVJ1bGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICgh
c3R5bGVSdWxlLT5nZXRTdHlsZVRleHQob2xkVGV4dCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmICghc3R5bGVSdWxlLT5zZXRTdHlsZVRleHQodGV4dCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitDU1NTdHlsZURlY2xhcmF0aW9uKiBT
dHlsZXNoZWV0UnVsZVNldDo6c3R5bGVGb3JJZChjb25zdCBDU1NJZCYgaWQpCit7CisgICAgaWYg
KENTU1N0eWxlUnVsZSogcnVsZSA9IHJ1bGVGb3JJZChpZCkpCisgICAgICAgIHJldHVybiAmcnVs
ZS0+c3R5bGUoKTsKKworICAgIHJldHVybiBudWxscHRyOworfQorCitSZWZQdHI8U3R5bGVSdWxl
PiBTdHlsZXNoZWV0UnVsZVNldDo6aW5zcGVjdG9yU3R5bGVGb3JJZChjb25zdCBDU1NJZCYgaWQp
Cit7CisgICAgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUgPSBzdHlsZUZvcklkKGlkKTsKKyAg
ICBpZiAoIXN0eWxlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBTdHls
ZVJ1bGU6OmNyZWF0ZShpZCwgKnN0eWxlLCB0aGlzKTsKK30KKworRG9jdW1lbnQqIFN0eWxlc2hl
ZXRSdWxlU2V0Ojpvd25lckRvY3VtZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYWdlU3R5
bGVTaGVldC0+b3duZXJEb2N1bWVudCgpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVs
ZVNldERhdGE+IFN0eWxlc2hlZXRSdWxlU2V0OjpvcmlnaW5hbFNvdXJjZURhdGEoKQoreworICAg
IHJldHVybiBQYXJzZWRSdWxlU2V0RGF0YTo6Y3JlYXRlKCp0aGlzKTsKK30KKworYm9vbCBTdHls
ZXNoZWV0UnVsZVNldDo6c3R5bGVTaGVldE11dGF0ZWQoKQoreworICAgIHJldHVybiBtX3BhZ2VT
dHlsZVNoZWV0LT5oYWRSdWxlc011dGF0aW9uKCk7Cit9CisKK2Jvb2wgU3R5bGVzaGVldFJ1bGVT
ZXQ6OnNldFRleHRGb3JTdHlsZShDU1NTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSwgY29uc3QgU3Ry
aW5nJiB0ZXh0KQoreworICAgIFN0cmluZyBwYXRjaGVkU3R5bGVTaGVldFRleHQ7CisgICAgaWYg
KCFnZXRUZXh0V2l0aFBhdGNoZWRTdHlsZShzdHlsZSwgdGV4dCwgcGF0Y2hlZFN0eWxlU2hlZXRU
ZXh0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHJ1bGVPclN0eWxlSWQoc3R5
bGUpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRXhjZXB0aW9uQ29k
ZSBlYzsKKyAgICBzdHlsZS5zZXRDc3NUZXh0KHRleHQsIGVjKTsKKyAgICBpZiAoZWMpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbW1pdFJ1bGVTZXRDaGFuZ2UoUGFyc2VkUnVsZVNl
dERhdGE6OmNyZWF0ZVdpdGhUZXh0KCp0aGlzLCBwYXRjaGVkU3R5bGVTaGVldFRleHQpKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6Z2V0VGV4dFdpdGhQ
YXRjaGVkU3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiYgc3R5bGUsIGNvbnN0IFN0cmluZyYgbmV3
U3R5bGVUZXh0LCBTdHJpbmcmIHJlc3VsdCkKK3sKKyAgICBSZWZQdHI8Q1NTUnVsZVNvdXJjZURh
dGE+IHNvdXJjZURhdGEgPSBzb3VyY2VEYXRhRm9yU3R5bGUoc3R5bGUpOworICAgIGlmICghc291
cmNlRGF0YSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgYm9keVN0YXJ0
ID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5zdGFydDsKKyAgICB1bnNpZ25lZCBib2R5RW5k
ID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5lbmQ7CisgICAgQVNTRVJUKGJvZHlTdGFydCA8
PSBib2R5RW5kKTsKKworICAgIFN0cmluZyBzb3VyY2VUZXh0ID0gcGFyc2VkUnVsZVNldERhdGEo
KS5zb3VyY2VUZXh0KCk7CisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oYm9k
eUVuZCA8PSBzb3VyY2VUZXh0Lmxlbmd0aCgpKTsgLy8gYm9keUVuZCBpcyBleGNsdXNpdmUKKwor
ICAgIHNvdXJjZVRleHQucmVwbGFjZShib2R5U3RhcnQsIGJvZHlFbmQgLSBib2R5U3RhcnQsIG5l
d1N0eWxlVGV4dCk7CisgICAgcmVzdWx0ID0gc291cmNlVGV4dDsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworQ1NTSWQgU3R5bGVzaGVldFJ1bGVTZXQ6OnJ1bGVJZChDU1NTdHlsZVJ1bGUmIHJ1bGUp
Cit7CisgICAgcmV0dXJuIHJ1bGVPclN0eWxlSWQocnVsZS5zdHlsZSgpKTsKK30KKworYm9vbCBT
dHlsZXNoZWV0UnVsZVNldDo6b3JpZ2luYWxTb3VyY2VUZXh0KFN0cmluZyYgcmVzdWx0KSBjb25z
dAoreworICAgIHJldHVybiBpbmxpbmVTdHlsZXNoZWV0VGV4dChyZXN1bHQpIHx8IHJlc291cmNl
U3R5bGVzaGVldFRleHQocmVzdWx0KTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6aW5s
aW5lU3R5bGVzaGVldFRleHQoU3RyaW5nJiByZXN1bHQpIGNvbnN0Cit7CisgICAgTm9kZSogb3du
ZXJOb2RlID0gbV9wYWdlU3R5bGVTaGVldC0+b3duZXJOb2RlKCk7CisgICAgaWYgKCFpczxFbGVt
ZW50Pihvd25lck5vZGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgRWxlbWVu
dCYgb3duZXJFbGVtZW50ID0gZG93bmNhc3Q8RWxlbWVudD4oKm93bmVyTm9kZSk7CisgICAgaWYg
KCFpczxIVE1MU3R5bGVFbGVtZW50Pihvd25lckVsZW1lbnQpICYmICFpczxTVkdTdHlsZUVsZW1l
bnQ+KG93bmVyRWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICByZXN1
bHQgPSBvd25lckVsZW1lbnQudGV4dENvbnRlbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyAg
ICAKK2Jvb2wgU3R5bGVzaGVldFJ1bGVTZXQ6OnJlc291cmNlU3R5bGVzaGVldFRleHQoU3RyaW5n
JiByZXN1bHQpIGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZ2luID09IFN0eWxlU2hlZXRPcmlnaW46
OlVzZXIgfHwgbV9vcmlnaW4gPT0gU3R5bGVTaGVldE9yaWdpbjo6VXNlckFnZW50KQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIW93bmVyRG9jdW1lbnQoKSB8fCAhb3duZXJEb2N1
bWVudCgpLT5mcmFtZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTdHJpbmcgZXJy
b3I7CisgICAgYm9vbCBiYXNlNjRFbmNvZGVkOworICAgIEluc3BlY3RvclBhZ2VBZ2VudDo6cmVz
b3VyY2VDb250ZW50KGVycm9yLCBvd25lckRvY3VtZW50KCktPmZyYW1lKCksIFVSTChQYXJzZWRV
UkxTdHJpbmcsIG1fcGFnZVN0eWxlU2hlZXQtPmhyZWYoKSksICZyZXN1bHQsICZiYXNlNjRFbmNv
ZGVkKTsKKyAgICByZXR1cm4gZXJyb3IuaXNFbXB0eSgpICYmICFiYXNlNjRFbmNvZGVkOworfQor
CisvLyBGSVhNRTogYWxsIHByb3RvY29sIG1ldGhvZHMgYmVsb3cgc2hvdWxkIGJlIG1vdmVkIHRv
IEluc3BlY3RvckNTU0FnZW50LmNwcAorc3RhdGljIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpD
U1M6OkNTU1NlbGVjdG9yPiBidWlsZE9iamVjdEZvclNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9y
JiBzZWxlY3RvciwgRWxlbWVudCogZWxlbWVudCk7CitzdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU2VsZWN0b3I+IGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JUZXh0KGNvbnN0
IFN0cmluZyYgc2VsZWN0b3JUZXh0LCBjb25zdCBDU1NTZWxlY3RvciYgc2VsZWN0b3IsIEVsZW1l
bnQqIGVsZW1lbnQpOworCitzdGF0aWMgYm9vbCBoYXNEeW5hbWljU3BlY2lmaWNpdHkoY29uc3Qg
Q1NTU2VsZWN0b3ImIHNpbXBsZVNlbGVjdG9yKQoreworICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRo
YXQgdGhlc2UgY2FuIGhhdmUgYSBzdGF0aWMgc3BlY2lmaWNpdHkgaWYgZWFjaCBzZWxlY3RvciBp
biB0aGUgbGlzdCBoYXMKKyAgICAvLyBlcXVhbCBzcGVjaWZpY2l0eSwgYnV0IGxldHMgYWx3YXlz
IHJlcG9ydCB0aGF0IHRoZXkgY2FuIGJlIGR5bmFtaWMuCisgICAgZm9yIChjb25zdCBDU1NTZWxl
Y3Rvciogc2VsZWN0b3IgPSAmc2ltcGxlU2VsZWN0b3I7IHNlbGVjdG9yOyBzZWxlY3RvciA9IHNl
bGVjdG9yLT50YWdIaXN0b3J5KCkpIHsKKyAgICAgICAgaWYgKHNlbGVjdG9yLT5tYXRjaCgpID09
IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzcykgeworICAgICAgICAgICAgQ1NTU2VsZWN0b3I6OlBz
ZXVkb0NsYXNzVHlwZSBwc2V1ZG9DbGFzc1R5cGUgPSBzZWxlY3Rvci0+cHNldWRvQ2xhc3NUeXBl
KCk7CisgICAgICAgICAgICBpZiAocHNldWRvQ2xhc3NUeXBlID09IENTU1NlbGVjdG9yOjpQc2V1
ZG9DbGFzc01hdGNoZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAg
ICBpZiAocHNldWRvQ2xhc3NUeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzc050aENoaWxk
IHx8IHBzZXVkb0NsYXNzVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3NOdGhMYXN0Q2hp
bGQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3ItPnNlbGVjdG9yTGlzdCgpKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGZh
bHNlOworfQorCitzdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU2VsZWN0
b3I+IGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3ImIHNlbGVjdG9yLCBF
bGVtZW50KiBlbGVtZW50KQoreworICAgIHJldHVybiBidWlsZE9iamVjdEZvclNlbGVjdG9yVGV4
dChzZWxlY3Rvci5zZWxlY3RvclRleHQoKSwgc2VsZWN0b3IsIGVsZW1lbnQpOworfQorCitzdGF0
aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU2VsZWN0b3I+IGJ1aWxkT2JqZWN0
Rm9yU2VsZWN0b3JUZXh0KGNvbnN0IFN0cmluZyYgc2VsZWN0b3JUZXh0LCBjb25zdCBDU1NTZWxl
Y3RvciYgc2VsZWN0b3IsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgYXV0byBpbnNwZWN0b3JT
ZWxlY3RvciA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU2VsZWN0b3I6OmNyZWF0ZSgp
CisgICAgLnNldFRleHQoc2VsZWN0b3JUZXh0KQorICAgIC5yZWxlYXNlKCk7CisgICAgCisgICAg
aWYgKGVsZW1lbnQpIHsKKyAgICAgICAgYm9vbCBkeW5hbWljID0gaGFzRHluYW1pY1NwZWNpZmlj
aXR5KHNlbGVjdG9yKTsKKyAgICAgICAgaWYgKGR5bmFtaWMpCisgICAgICAgICAgICBpbnNwZWN0
b3JTZWxlY3Rvci0+c2V0RHluYW1pYyh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIFNlbGVjdG9y
Q2hlY2tlcjo6Q2hlY2tpbmdDb250ZXh0IGNvbnRleHQoU2VsZWN0b3JDaGVja2VyOjpNb2RlOjpD
b2xsZWN0aW5nUnVsZXMpOworICAgICAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2Vy
KGVsZW1lbnQtPmRvY3VtZW50KCkpOworICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgc3BlY2lm
aWNpdHk7CisgICAgICAgIGJvb2wgb2theSA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaCgmc2VsZWN0
b3IsIGVsZW1lbnQsIGNvbnRleHQsIHNwZWNpZmljaXR5KTsKKyAgICAgICAgaWYgKCFva2F5KQor
ICAgICAgICAgICAgc3BlY2lmaWNpdHkgPSBzZWxlY3Rvci5zdGF0aWNTcGVjaWZpY2l0eShva2F5
KTsKKyAgICAgICAgCisgICAgICAgIGlmIChva2F5KSB7CisgICAgICAgICAgICBhdXRvIHR1cGxl
ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8aW50Pjo6Y3JlYXRlKCk7CisgICAgICAgICAg
ICB0dXBsZS0+YWRkSXRlbShzdGF0aWNfY2FzdDxpbnQ+KChzcGVjaWZpY2l0eSAmIENTU1NlbGVj
dG9yOjppZE1hc2spID4+IDE2KSk7CisgICAgICAgICAgICB0dXBsZS0+YWRkSXRlbShzdGF0aWNf
Y2FzdDxpbnQ+KChzcGVjaWZpY2l0eSAmIENTU1NlbGVjdG9yOjpjbGFzc01hc2spID4+IDgpKTsK
KyAgICAgICAgICAgIHR1cGxlLT5hZGRJdGVtKHN0YXRpY19jYXN0PGludD4oc3BlY2lmaWNpdHkg
JiBDU1NTZWxlY3Rvcjo6ZWxlbWVudE1hc2spKTsKKyAgICAgICAgICAgIGluc3BlY3RvclNlbGVj
dG9yLT5zZXRTcGVjaWZpY2l0eShXVEY6Om1vdmUodHVwbGUpKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICByZXR1cm4gV1RGOjptb3ZlKGluc3BlY3RvclNlbGVjdG9yKTsKK30KKworc3Rh
dGljIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpD
U1M6OkNTU1NlbGVjdG9yPj4gc2VsZWN0b3JzRnJvbVNvdXJjZURhdGEoY29uc3QgQ1NTUnVsZVNv
dXJjZURhdGEqIHNvdXJjZURhdGEsIGNvbnN0IFN0cmluZyYgc2hlZXRUZXh0LCBjb25zdCBDU1NT
ZWxlY3Rvckxpc3QmIHNlbGVjdG9yTGlzdCwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBOZXZl
ckRlc3Ryb3llZDxKU0M6OllhcnI6OlJlZ3VsYXJFeHByZXNzaW9uPiBjb21tZW50KCIvXFwqW15d
Kj9cXCovIiwgVGV4dENhc2VTZW5zaXRpdmUsIEpTQzo6WWFycjo6TXVsdGlsaW5lRW5hYmxlZCk7
CisgICAgCisgICAgYXV0byByZXN1bHQgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9yPjo6Y3JlYXRlKCk7CisgICAgY29uc3Qg
U2VsZWN0b3JSYW5nZUxpc3QmIHJhbmdlcyA9IHNvdXJjZURhdGEtPnNlbGVjdG9yUmFuZ2VzOwor
ICAgIGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IHNlbGVjdG9yTGlzdC5maXJzdCgpOwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwLCBzaXplID0gcmFuZ2VzLnNpemUoKTsgaSA8IHNpemU7ICsr
aSkgeworICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgc2VsZWN0b3IsIHRoYXQgbWVhbnMg
dGhlIFNvdXJjZURhdGEgZm9yIHRoaXMgQ1NTU3R5bGVTaGVldAorICAgICAgICAvLyBubyBsb25n
ZXIgbWF0Y2hlcyB1cCB3aXRoIHRoZSBhY3R1YWwgcnVsZXMgaW4gdGhlIENTU1N0eWxlU2hlZXQu
CisgICAgICAgIEFTU0VSVChzZWxlY3Rvcik7CisgICAgICAgIGlmICghc2VsZWN0b3IpCisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlJiByYW5n
ZSA9IHJhbmdlcy5hdChpKTsKKyAgICAgICAgU3RyaW5nIHNlbGVjdG9yVGV4dCA9IHNoZWV0VGV4
dC5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQsIHJhbmdlLmxlbmd0aCgpKTsKKyAgICAgICAgCisgICAg
ICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gc2VlIGFueSBjb21tZW50cyBpbiB0aGUgc2VsZWN0b3Ig
Y29tcG9uZW50cywgb25seSB0aGUgbWVhbmluZ2Z1bCBwYXJ0cy4KKyAgICAgICAgcmVwbGFjZShz
ZWxlY3RvclRleHQsIGNvbW1lbnQsIFN0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LT5hZGRJdGVt
KGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JUZXh0KHNlbGVjdG9yVGV4dC5zdHJpcFdoaXRlU3BhY2Uo
KSwgKnNlbGVjdG9yLCBlbGVtZW50KSk7CisgICAgICAgIAorICAgICAgICBzZWxlY3RvciA9IENT
U1NlbGVjdG9yTGlzdDo6bmV4dChzZWxlY3Rvcik7CisgICAgfQorICAgIHJldHVybiBXVEY6Om1v
dmUocmVzdWx0KTsKK30KKworUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U2VsZWN0b3JM
aXN0PiBTdHlsZXNoZWV0UnVsZVNldDo6YnVpbGRPYmplY3RGb3JTZWxlY3Rvckxpc3QoQ1NTU3R5
bGVSdWxlJiBydWxlLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIFJlZlB0cjxJbnNwZWN0b3I6
OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9yPj4g
c2VsZWN0b3JzOworICAgIAorICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0
YSA9IHNvdXJjZURhdGFGb3JSdWxlKHJ1bGUpOworICAgIGlmIChzb3VyY2VEYXRhKSB7CisgICAg
ICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9yc0Zyb21Tb3VyY2VEYXRhKHNvdXJjZURhdGEuZ2V0KCks
IHBhcnNlZFJ1bGVTZXREYXRhKCkuc291cmNlVGV4dCgpLCBydWxlLnN0eWxlUnVsZSgpLnNlbGVj
dG9yTGlzdCgpLCBlbGVtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWxlY3RvcnMgPSBJ
bnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Nl
bGVjdG9yPjo6Y3JlYXRlKCk7CisgICAgICAgIGNvbnN0IENTU1NlbGVjdG9yTGlzdCYgc2VsZWN0
b3JMaXN0ID0gcnVsZS5zdHlsZVJ1bGUoKS5zZWxlY3Rvckxpc3QoKTsKKyAgICAgICAgZm9yIChj
b25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IgPSBzZWxlY3Rvckxpc3QuZmlyc3QoKTsgc2VsZWN0
b3I7IHNlbGVjdG9yID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHNlbGVjdG9yKSkKKyAgICAgICAg
ICAgIGlmIChzZWxlY3RvcikKKyAgICAgICAgICAgICAgICBzZWxlY3RvcnMtPmFkZEl0ZW0oYnVp
bGRPYmplY3RGb3JTZWxlY3Rvcigqc2VsZWN0b3IsIGVsZW1lbnQpKTsKKyAgICB9CisgICAgCisg
ICAgLy8gVGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHJlbHkgb24gdGhlIHNvdXJjZSBkYXRh
IHRvIGF2b2lkIGNhdGNoaW5nIHRoZSB0cmFpbGluZyBjb21tZW50cworICAgIC8vIChiZWZvcmUg
dGhlIGRlY2xhcmF0aW9uIHN0YXJ0aW5nICd7JykuCisgICAgU3RyaW5nIHNlbGVjdG9yTGlzdFRl
eHQgPSBydWxlLnNlbGVjdG9yVGV4dCgpOworICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVjdG9yOjpQ
cm90b2NvbDo6Q1NTOjpTZWxlY3Rvckxpc3Q6OmNyZWF0ZSgpCisgICAgLnNldFNlbGVjdG9ycyhz
ZWxlY3RvcnMucmVsZWFzZSgpKQorICAgIC5zZXRUZXh0KHNlbGVjdG9yTGlzdFRleHQpCisgICAg
LnJlbGVhc2UoKTsKKyAgICBpZiAoc291cmNlRGF0YSkgeworICAgICAgICBhdXRvIGxpbmVFbmRp
bmdzID0gQ29udGVudFNlYXJjaFV0aWxpdGllczo6bGluZUVuZGluZ3MocGFyc2VkUnVsZVNldERh
dGEoKS5zb3VyY2VUZXh0KCkpOworICAgICAgICByZXN1bHQtPnNldFJhbmdlKGJ1aWxkU291cmNl
UmFuZ2VPYmplY3Qoc291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdlLCAqbGluZUVuZGluZ3MpKTsK
KyAgICB9CisgICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOworfQorCitSZWZQdHI8SW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keT4gU3R5bGVzaGVldFJ1bGVTZXQ6
OmJ1aWxkT2JqZWN0Rm9yU3R5bGVTaGVldCgpCit7CisgICAgYXV0byByZXN1bHQgPSBJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRCb2R5OjpjcmVhdGUoKQorICAgIC5zZXRT
dHlsZVNoZWV0SWQoaWRlbnRpZmllcigpKQorICAgIC5zZXRSdWxlcyhidWlsZEFycmF5Rm9yUnVs
ZUxpc3QocGFyc2VkUnVsZVNldERhdGEoKS5mbGF0dGVuZWRTdHlsZVJ1bGVzKCksICp0aGlzKSkK
KyAgICAucmVsZWFzZSgpOworICAgIAorICAgIFN0cmluZyBzdHlsZXNoZWV0VGV4dCA9IGdldFRl
eHQoKTsKKyAgICByZXN1bHQtPnNldFRleHQoc3R5bGVzaGVldFRleHQpOworICAgIAorICAgIHJl
dHVybiBXVEY6Om1vdmUocmVzdWx0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRSdWxl
U2V0LmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVT
ZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWJkMWIxCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRS
dWxlU2V0LmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEluc3Bl
Y3RvclN0eWxlc2hlZXRSdWxlU2V0X2gKKyNkZWZpbmUgSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVT
ZXRfaAorCisjaW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkV4Y2Vw
dGlvbkNvZGUuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NJZC5oIgorI2luY2x1ZGUgIkluc3Bl
Y3RvclN0eWxlUnVsZVNldC5oIgorI2luY2x1ZGUgPGluc3BlY3Rvci9JbnNwZWN0b3JQcm90b2Nv
bE9iamVjdHMuaD4KKyNpbmNsdWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yVmFsdWVzLmg+CisjaW5j
bHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVHlwZUNhc3RzLmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCitzdHJ1Y3QgUGFy
c2VkUnVsZVNldERhdGE7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIENTU1J1bGVMaXN0
OworY2xhc3MgQ1NTU2VsZWN0b3I7CitjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOworY2xhc3Mg
Q1NTU3R5bGVSdWxlOworY2xhc3MgQ1NTU3R5bGVTaGVldDsKK2NsYXNzIERvY3VtZW50OworY2xh
c3MgRWxlbWVudDsKK2NsYXNzIEluc3BlY3RvclBhZ2VBZ2VudDsKKworc3RydWN0IENTU1J1bGVT
b3VyY2VEYXRhOworfQorCituYW1lc3BhY2UgSW5zcGVjdG9yIHsKKworY2xhc3MgU3R5bGVSdWxl
U2V0OwordHlwZWRlZiBTdHJpbmcgRXJyb3JTdHJpbmc7CisKK2VudW0gY2xhc3MgU3R5bGVTaGVl
dE9yaWdpbiB7CisgICAgSW5zcGVjdG9yLAorICAgIFVzZXJBZ2VudCwKKyAgICBVc2VyLAorICAg
IEF1dGhvcgorfTsKKworZW51bSBjbGFzcyBNZWRpYUxpc3RTb3VyY2UgeworICAgIExpbmtlZFNo
ZWV0LAorICAgIElubGluZVNoZWV0LAorICAgIE1lZGlhUnVsZSwKKyAgICBJbXBvcnRSdWxlCit9
OworCitjbGFzcyBTdHlsZXNoZWV0UnVsZVNldCA6IHB1YmxpYyBTdHlsZVJ1bGVTZXQgeworcHVi
bGljOgorICAgIGNsYXNzIExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIExpc3RlbmVy
KCkgeyB9CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgeyB9CisgICAgICAgIHZpcnR1YWwg
dm9pZCBzdHlsZVNoZWV0Q2hhbmdlZChTdHlsZXNoZWV0UnVsZVNldCYpID0gMDsKKyAgICB9Owor
CisgICAgc3RhdGljIFJlZjxTdHlsZXNoZWV0UnVsZVNldD4gY3JlYXRlKFJlZjxXZWJDb3JlOjpD
U1NTdHlsZVNoZWV0PiYmLCBTdHlsZVNoZWV0T3JpZ2luLCBjb25zdCBTdHJpbmcmIGRvY3VtZW50
VVJMLCBMaXN0ZW5lciopOworICAgIHZpcnR1YWwgflN0eWxlc2hlZXRSdWxlU2V0KCk7CisKKyAg
ICAvLyBTdHlsZVJ1bGVTZXQgQVBJCisgICAgdmlydHVhbCBib29sIGlzU3R5bGVzaGVldCgpIGNv
bnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVRl
eHQoY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0
cjxQYXJzZWRSdWxlU2V0RGF0YT4gb3JpZ2luYWxTb3VyY2VEYXRhKCkgb3ZlcnJpZGU7CisgICAg
dmlydHVhbCBXZWJDb3JlOjpEb2N1bWVudCogb3duZXJEb2N1bWVudCgpIGNvbnN0IG92ZXJyaWRl
OworICAgIHZpcnR1YWwgYm9vbCBzZXRUZXh0Rm9yU3R5bGUoY29uc3QgQ1NTSWQmLCBjb25zdCBT
dHJpbmcmIHRleHQsIFN0cmluZyYgb2xkVGV4dCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZv
aWQgbm90aWZ5UnVsZVNldENoYW5nZWQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6
OkNTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlRm9ySWQoY29uc3QgQ1NTSWQmKSBvdmVycmlkZTsK
KworICAgIC8vIFN0eWxlc2hlZXRSdWxlU2V0IEFQSQorICAgIAorICAgIFN0cmluZyBmaW5hbFVS
TCgpIGNvbnN0OworICAgIFN0cmluZyB0aXRsZSgpIGNvbnN0OworICAgIFN0eWxlU2hlZXRPcmln
aW4gb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgICBib29sIGlzRW5hYmxl
ZCgpIGNvbnN0OworICAgIGJvb2wgb3JpZ2luYWxTb3VyY2VUZXh0KFN0cmluZyYgcmVzdWx0KSBj
b25zdDsKKyAgICBib29sIGNhbkJpbmQoKSBjb25zdCB7IHJldHVybiBtX29yaWdpbiAhPSBTdHls
ZVNoZWV0T3JpZ2luOjpVc2VyQWdlbnQgJiYgbV9vcmlnaW4gIT0gU3R5bGVTaGVldE9yaWdpbjo6
VXNlcjsgfQorCisgICAgYm9vbCBzZWxlY3RvclRleHRGb3JSdWxlKGNvbnN0IENTU0lkJiwgU3Ry
aW5nJiByZXN1bHQpOworICAgIGJvb2wgc2V0U2VsZWN0b3JUZXh0Rm9yUnVsZShjb25zdCBDU1NJ
ZCYsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3JUZXh0KTsKKworICAgIFdlYkNvcmU6OkNTU1N0eWxl
UnVsZSogYWRkUnVsZShjb25zdCBTdHJpbmcmIHNlbGVjdG9yLCBXZWJDb3JlOjpFeGNlcHRpb25D
b2RlJik7CisgICAgYm9vbCBkZWxldGVSdWxlKGNvbnN0IENTU0lkJiwgV2ViQ29yZTo6RXhjZXB0
aW9uQ29kZSYpOworCisgICAgLy8gRklYTUU6IHJlbW92ZS4KKyAgICBXZWJDb3JlOjpDU1NTdHls
ZVNoZWV0JiBwYWdlU3R5bGVTaGVldCgpIHsgcmV0dXJuIG1fcGFnZVN0eWxlU2hlZXQuZ2V0KCk7
IH0KKyAgICAKKyAgICBDU1NJZCBydWxlSWQoV2ViQ29yZTo6Q1NTU3R5bGVSdWxlJik7CisgICAg
V2ViQ29yZTo6Q1NTU3R5bGVSdWxlKiBydWxlRm9ySWQoY29uc3QgQ1NTSWQmKTsKKyAgICBDU1NJ
ZCBzdHlsZUlkKFdlYkNvcmU6OkNTU1N0eWxlRGVjbGFyYXRpb24mIHN0eWxlKSB7IHJldHVybiBy
dWxlT3JTdHlsZUlkKHN0eWxlKTsgfQorCisgICAgLy8gRklYTUU6IG1vdmUgdGhlc2UgdG8gQ1NT
QWdlbnQuCisgICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVl
dEJvZHk+IGJ1aWxkT2JqZWN0Rm9yU3R5bGVTaGVldCgpOworICAgIFJlZjxJbnNwZWN0b3I6OlBy
b3RvY29sOjpDU1M6OlNlbGVjdG9yTGlzdD4gYnVpbGRPYmplY3RGb3JTZWxlY3Rvckxpc3QoV2Vi
Q29yZTo6Q1NTU3R5bGVSdWxlJiwgV2ViQ29yZTo6RWxlbWVudCopOworCitwcm90ZWN0ZWQ6Cisg
ICAgU3R5bGVzaGVldFJ1bGVTZXQoUmVmPFdlYkNvcmU6OkNTU1N0eWxlU2hlZXQ+JiYgcGFnZVN0
eWxlU2hlZXQsIFN0eWxlU2hlZXRPcmlnaW4sIGNvbnN0IFN0cmluZyYgZG9jdW1lbnRVUkwsIExp
c3RlbmVyKik7CisKKyAgICB2aXJ0dWFsIFJlZlB0cjxTdHlsZVJ1bGU+IGluc3BlY3RvclN0eWxl
Rm9ySWQoY29uc3QgQ1NTSWQmKTsKKworICAgIC8vIEFsc28gYWNjZXNzZWQgYnkgZnJpZW5kIGNs
YXNzIEluc3BlY3RvclN0eWxlLgorICAgIHZpcnR1YWwgYm9vbCBzZXRUZXh0Rm9yU3R5bGUoV2Vi
Q29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiYsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBJbnNwZWN0b3JTdHlsZTsKKworICAgIGJvb2wgc3R5
bGVTaGVldE11dGF0ZWQoKTsKKyAgICBib29sIGdldFRleHRXaXRoUGF0Y2hlZFN0eWxlKFdlYkNv
cmU6OkNTU1N0eWxlRGVjbGFyYXRpb24mLCBjb25zdCBTdHJpbmcmIG5ld1N0eWxlVGV4dCwgU3Ry
aW5nJiByZXN1bHQpOworICAgIGJvb2wgcmVzb3VyY2VTdHlsZXNoZWV0VGV4dChTdHJpbmcmIHJl
c3VsdCkgY29uc3Q7CisgICAgYm9vbCBpbmxpbmVTdHlsZXNoZWV0VGV4dChTdHJpbmcmIHJlc3Vs
dCkgY29uc3Q7CisKKyAgICAvLyBPbmx5IHRvIGJlIHVzZWQgaW50ZXJuYWxseSB3aGVuIGEgcnVs
ZSBoYXMgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQuIElmIHRoZSBlbnRpcmUKKyAg
ICAvLyBzdHlsZXNoZWV0IGNvbnRlbnRzIGhhdmUgYmVlbiBjaGFuZ2VkLCB1c2UgcmVwbGFjZVRl
eHQoKSB3aGljaCByZWNyZWF0ZXMgYWxsIENTU09NIHdyYXBwZXJzCisgICAgLy8gYW5kIHVwZGF0
ZXMgdGhlIFN0eWxlU2hlZXRDb250ZW50cyBiYWNraW5nIHN0b3JlIHRvIGhvbGQgdGhlIG5ldyBz
dHlsZXNoZWV0IHRleHQuCisgICAgdm9pZCBwYXRjaFN0eWxlc2hlZXRUZXh0KGNvbnN0IFN0cmlu
ZyYpOworCisgICAgUmVmPFdlYkNvcmU6OkNTU1N0eWxlU2hlZXQ+IG1fcGFnZVN0eWxlU2hlZXQ7
CisgICAgU3R5bGVTaGVldE9yaWdpbiBtX29yaWdpbjsKKyAgICBTdHJpbmcgbV9kb2N1bWVudFVS
TDsKKyAgICBMaXN0ZW5lciogbV9saXN0ZW5lcjsKK307CisKK30gLy8gbmFtZXNwYWNlIEluc3Bl
Y3RvcgorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0JFR0lOKEluc3BlY3Rvcjo6U3R5bGVzaGVl
dFJ1bGVTZXQpCitzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgSW5zcGVjdG9yOjpTdHlsZVJ1bGVT
ZXQmIHJ1bGVTZXQpIHsgcmV0dXJuIHJ1bGVTZXQuaXNTdHlsZXNoZWV0KCk7IH0KK1NQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfRU5EKCkKKworI2VuZGlmIC8vIEluc3BlY3RvclN0eWxlc2hlZXRSdWxl
U2V0X2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247264</attachid>
            <date>2015-02-24 13:50:10 -0800</date>
            <delta_ts>2015-02-24 13:50:18 -0800</delta_ts>
            <desc>WIP 2</desc>
            <filename>cssagent.patch</filename>
            <type>text/plain</type>
            <size>232729</size>
            <attacher name="Brian Burg">burg</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvcHJvdG9jb2wvQ1NT
Lmpzb24gYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL3Byb3RvY29sL0NTUy5qc29u
CmluZGV4IGYwMjIxNmQuLjkxMzIwNmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9pbnNwZWN0b3IvcHJvdG9jb2wvQ1NTLmpzb24KKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3Jl
L2luc3BlY3Rvci9wcm90b2NvbC9DU1MuanNvbgpAQCAtNSw3ICs1LDcgQEAKICAgICAidHlwZXMi
OiBbCiAgICAgICAgIHsKICAgICAgICAgICAgICJpZCI6ICJTdHlsZVNoZWV0SWQiLAotICAgICAg
ICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAg
ICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgImlkIjogIkNTU1N0eWxlSWQiLApAQCAt
MTc2LDkgKzE3Niw5IEBACiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJpZCI6
ICJDU1NQcm9wZXJ0eVN0YXR1cyIsCi0JICAgICJ0eXBlIjogInN0cmluZyIsCi0gICAgICAgICAg
ICAiZW51bSI6IFsiYWN0aXZlIiwgImluYWN0aXZlIiwgImRpc2FibGVkIiwgInN0eWxlIl0sCi0g
ICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHByb3BlcnR5IHN0YXR1czogXCJhY3RpdmVc
IiBpZiB0aGUgcHJvcGVydHkgaXMgZWZmZWN0aXZlIGluIHRoZSBzdHlsZSwgXCJpbmFjdGl2ZVwi
IGlmIHRoZSBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuIGJ5IGEgc2FtZS1uYW1lZCBwcm9wZXJ0eSBp
biB0aGlzIHN0eWxlIGxhdGVyIG9uLCBcImRpc2FibGVkXCIgaWYgdGhlIHByb3BlcnR5IGlzIGRp
c2FibGVkIGJ5IHRoZSB1c2VyLCBcInN0eWxlXCIgKGltcGxpZWQgaWYgYWJzZW50KSBpZiB0aGUg
cHJvcGVydHkgaXMgcmVwb3J0ZWQgYnkgdGhlIGJyb3dzZXIgcmF0aGVyIHRoYW4gYnkgdGhlIENT
UyBzb3VyY2UgcGFyc2VyLiIKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAg
ICAgICAiZW51bSI6IFsiYWN0aXZlIiwgImluYWN0aXZlIiwgInN0eWxlIl0sCisgICAgICAgICAg
ICAiZGVzY3JpcHRpb24iOiAiVGhlIHByb3BlcnR5IHN0YXR1czogXCJhY3RpdmVcIiBpZiB0aGUg
cHJvcGVydHkgaXMgZWZmZWN0aXZlIGluIHRoZSBzdHlsZSwgXCJpbmFjdGl2ZVwiIGlmIHRoZSBw
cm9wZXJ0eSBpcyBvdmVycmlkZGVuIGJ5IGEgc2FtZS1uYW1lZCBwcm9wZXJ0eSBpbiB0aGlzIHN0
eWxlIGxhdGVyIG9uLCBcInN0eWxlXCIgKGltcGxpZWQgaWYgYWJzZW50KSBpZiB0aGUgcHJvcGVy
dHkgaXMgcmVwb3J0ZWQgYnkgdGhlIGJyb3dzZXIgcmF0aGVyIHRoYW4gYnkgdGhlIENTUyBzb3Vy
Y2UgcGFyc2VyLiIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgImlkIjogIkNT
U1Byb3BlcnR5IiwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagppbmRleCBiZTAxNGZkLi43ZDExY2IzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0yNTYwLDggKzI1NjAsNiBA
QAogCQk4MUY2NUZGNjEzNzg4RkFBMDBGRjZGMkQgLyogRHJhZ1N0YXRlLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MUY2NUZGNTEzNzg4RkFBMDBGRjZG
MkQgLyogRHJhZ1N0YXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJODJBQjE3NDMxMjRCOTlFQzAwQzUwNjlEIC8qIEluc3BlY3RvckNTU0FnZW50
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgyQUIx
NzQxMTI0Qjk5RUMwMEM1MDY5RCAvKiBJbnNwZWN0b3JDU1NBZ2VudC5jcHAgKi87IH07CiAJCTgy
QUIxNzQ0MTI0Qjk5RUMwMEM1MDY5RCAvKiBJbnNwZWN0b3JDU1NBZ2VudC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODJBQjE3NDIxMjRCOTlFQzAwQzUw
NjlEIC8qIEluc3BlY3RvckNTU0FnZW50LmggKi87IH07Ci0JCTgyQUIxNzczMTI1QzgyNjcwMEM1
MDY5RCAvKiBJbnNwZWN0b3JTdHlsZVNoZWV0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgyQUIxNzZGMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0
b3JTdHlsZVNoZWV0LmNwcCAqLzsgfTsKLQkJODJBQjE3NzQxMjVDODI2NzAwQzUwNjlEIC8qIElu
c3BlY3RvclN0eWxlU2hlZXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDgyQUIxNzcwMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JTdHlsZVNoZWV0
LmggKi87IH07CiAJCTgyQUIxNzc1MTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JSZXNvdXJj
ZUFnZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDgyQUIxNzcxMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JSZXNvdXJjZUFnZW50LmNwcCAq
LzsgfTsKIAkJODJBQjE3NzYxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclJlc291cmNlQWdl
bnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgyQUIx
NzcyMTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0b3JSZXNvdXJjZUFnZW50LmggKi87IH07CiAJ
CTgyRTNEOERFMTIyRUEwRDEwMDNBRTVCQyAvKiBDU1NQcm9wZXJ0eVNvdXJjZURhdGEuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODJFM0Q4REMxMjJF
QTBEMTAwM0FFNUJDIC8qIENTU1Byb3BlcnR5U291cmNlRGF0YS5jcHAgKi87IH07CkBAIC01NTcy
LDYgKzU1NzAsMjEgQEAKIAkJQzRENEY1MkMxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFibGVU
aW1lci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzRE
NEY1MjgxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFibGVUaW1lci5oICovOyBzZXR0aW5ncyA9
IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUM0RDRGNTJEMTk3NUM4OEIwMDNF
RjVCQyAvKiBSZXBsYXlhYmxlVGltZXJzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEM0RDRGNTI5MTk3NUM4OEIwMDNFRjVCQyAvKiBSZXBsYXlhYmxl
VGltZXJzLmNwcCAqLzsgfTsKIAkJQzRENEY1MkUxOTc1Qzg4QjAwM0VGNUJDIC8qIFJlcGxheWFi
bGVUaW1lcnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEM0RDRGNTJBMTk3NUM4OEIwMDNFRjVCQyAvKiBSZXBsYXlhYmxlVGltZXJzLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJQzRFNjU3RjIxQTk3RjdB
NzAwNDc5QzE1IC8qIEluc3BlY3RvckNTU0lkLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2NTdGMTFBOTdGN0E3MDA0NzlDMTUgLyogSW5zcGVjdG9y
Q1NTSWQuaCAqLzsgfTsKKwkJQzRFNjU3RkExQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3Rvcklu
bGluZVN0eWxlUnVsZVNldC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBDNEU2NTdGMzFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5
bGVSdWxlU2V0LmNwcCAqLzsgfTsKKwkJQzRFNjU3RkIxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3Bl
Y3RvcklubGluZVN0eWxlUnVsZVNldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQzRFNjU3RjQxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvcklubGlu
ZVN0eWxlUnVsZVNldC5oICovOyB9OworCQlDNEU2NTdGQzFBOTdGQkVEMDA0NzlDMTUgLyogSW5z
cGVjdG9yU3R5bGVSdWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBDNEU2NTdGNTFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlLmgg
Ki87IH07CisJCUM0RTY1N0ZEMUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVByb3Bl
cnR5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2
NTdGNjFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oICovOyB9Owor
CQlDNEU2NTdGRTFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2NTdGNzFBOTdG
QkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmggKi87IH07CisJCUM0RTY1N0ZG
MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2NTdGODFBOTdGQkVE
MDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuY3BwICovOyB9OworCQlDNEU2
NTgwMDFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1N0Y5MUE5N0ZC
RUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5oICovOyB9OworCQlDNEU2
NTgwMjFBOTgwMTY4MDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlLmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1ODAxMUE5ODAxNjgwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGUuY3BwICovOyB9OworCQlDNEU2NTgwNDFBOTg0QjUy
MDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM0RTY1ODAzMUE5ODRCNTIwMDQ3OUMxNSAvKiBJ
bnNwZWN0b3JTdHlsZVJ1bGVTZXQuY3BwICovOyB9OworCQlDNEU2NTgwOTFBOUNDRTZEMDA0NzlD
MTUgLyogSW5zcGVjdG9yU3R5bGVEZWNsYXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2NTgwNzFBOUNDRTZEMDA0NzlDMTUgLyogSW5z
cGVjdG9yU3R5bGVEZWNsYXJhdGlvbi5jcHAgKi87IH07CisJCUM0RTY1ODBBMUE5Q0NFNkQwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZURlY2xhcmF0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2NTgwODFBOUNDRTZEMDA0NzlDMTUgLyogSW5z
cGVjdG9yU3R5bGVEZWNsYXJhdGlvbi5oICovOyB9OworCQlDNEU2NTgwQzFBOUNDRUQ1MDA0NzlD
MTUgLyogSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNEU2NTgwQjFBOUNDRUQ1MDA0NzlDMTUgLyogSW5zcGVj
dG9yU3R5bGVQcm9wZXJ0eS5jcHAgKi87IH07CisJCUM0RTY1ODBGMUE5RDBENjkwMDQ3OUMxNSAv
KiBJbnNwZWN0b3JSdWxlU2VsZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQzRFNjU4MEQxQTlEMEQ2OTAwNDc5QzE1IC8qIEluc3BlY3RvclJ1
bGVTZWxlY3Rvci5jcHAgKi87IH07CisJCUM0RTY1ODEwMUE5RDBENjkwMDQ3OUMxNSAvKiBJbnNw
ZWN0b3JSdWxlU2VsZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEM0RTY1ODBFMUE5RDBENjkwMDQ3OUMxNSAvKiBJbnNwZWN0b3JSdWxlU2VsZWN0
b3IuaCAqLzsgfTsKIAkJQzUwRDBFODMwRkY0MjcyOTAwQUMyNjQ0IC8qIFN0b3JhZ2VOYW1lc3Bh
Y2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1MEQw
RTgxMEZGNDI3MjkwMEFDMjY0NCAvKiBTdG9yYWdlTmFtZXNwYWNlLmggKi87IHNldHRpbmdzID0g
e0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQzUxMzdDRjIxMUE1ODM3ODAwNEFE
Qjk5IC8qIEpTRE9NU3RyaW5nTGlzdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBDNTEzN0NGMDExQTU4Mzc4MDA0QURCOTkgLyogSlNET01TdHJpbmdM
aXN0LmNwcCAqLzsgfTsKIAkJQzUxMzdDRjMxMUE1ODM3ODAwNEFEQjk5IC8qIEpTRE9NU3RyaW5n
TGlzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzUx
MzdDRjExMUE1ODM3ODAwNEFEQjk5IC8qIEpTRE9NU3RyaW5nTGlzdC5oICovOyB9OwpAQCAtOTc3
Myw4ICs5Nzg2LDYgQEAKIAkJODIyNTQzMkNBOUQ0QjRDRjQ2MjhFQzdGIC8qIEpTQmVmb3JlVW5s
b2FkRXZlbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNCZWZv
cmVVbmxvYWRFdmVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgyQUIxNzQx
MTI0Qjk5RUMwMEM1MDY5RCAvKiBJbnNwZWN0b3JDU1NBZ2VudC5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JDU1NBZ2VudC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTgyQUIxNzQyMTI0Qjk5RUMwMEM1MDY5RCAvKiBJbnNwZWN0b3JD
U1NBZ2VudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbnNwZWN0b3JDU1NB
Z2VudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk4MkFCMTc2RjEyNUM4MjY3MDBD
NTA2OUQgLyogSW5zcGVjdG9yU3R5bGVTaGVldC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBJbnNwZWN0b3JTdHlsZVNoZWV0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKLQkJODJBQjE3NzAxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hl
ZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVTaGVl
dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MkFCMTc3MTEyNUM4MjY3MDBDNTA2
OUQgLyogSW5zcGVjdG9yUmVzb3VyY2VBZ2VudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBJbnNwZWN0b3JSZXNvdXJjZUFnZW50LmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJODJBQjE3NzIxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclJlc291
cmNlQWdlbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5zcGVjdG9yUmVz
b3VyY2VBZ2VudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MkUzRDhEQzEyMkVB
MEQxMDAzQUU1QkMgLyogQ1NTUHJvcGVydHlTb3VyY2VEYXRhLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU1Byb3BlcnR5U291cmNlRGF0YS5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMzAzNyw2ICsxMzA0OCwyMSBAQAogCQlDNEQ0RjUyODE5
NzVDODhCMDAzRUY1QkMgLyogUmVwbGF5YWJsZVRpbWVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFJlcGxheWFibGVUaW1lci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlDNEQ0RjUyOTE5NzVDODhCMDAzRUY1QkMgLyogUmVwbGF5YWJsZVRpbWVycy5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZXBsYXlhYmxlVGltZXJzLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzRENEY1MkExOTc1Qzg4QjAwM0VGNUJDIC8q
IFJlcGxheWFibGVUaW1lcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVw
bGF5YWJsZVRpbWVycy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2NTdGMTFB
OTdGN0E3MDA0NzlDMTUgLyogSW5zcGVjdG9yQ1NTSWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gSW5zcGVjdG9yQ1NTSWQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJQzRFNjU3RjMxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3BlY3RvcklubGluZVN0eWxlUnVsZVNl
dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JJbmxp
bmVTdHlsZVJ1bGVTZXQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2NTdG
NDFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEluc3BlY3RvcklubGluZVN0eWxlUnVsZVNldC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2NTdGNTFBOTdGQkVEMDA0NzlDMTUg
LyogSW5zcGVjdG9yU3R5bGVSdWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEluc3BlY3RvclN0eWxlUnVsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNEU2
NTdGNjFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbnNwZWN0b3JTdHlsZVByb3BlcnR5Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUM0RTY1N0Y3MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNw
ZWN0b3JTdHlsZVJ1bGVTZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5z
cGVjdG9yU3R5bGVSdWxlU2V0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUM0RTY1
N0Y4MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JTdHlsZXNoZWV0UnVs
ZVNldC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUM0RTY1N0Y5MUE5N0ZCRUQw
MDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQlDNEU2NTgwMTFBOTgwMTY4MDA0NzlDMTUgLyogSW5zcGVjdG9y
U3R5bGVSdWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEluc3Bl
Y3RvclN0eWxlUnVsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUM0RTY1ODAz
MUE5ODRCNTIwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGVTZXQuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzRFNjU4MDcxQTlDQ0U2RDAwNDc5QzE1IC8qIElu
c3BlY3RvclN0eWxlRGVjbGFyYXRpb24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gSW5zcGVjdG9yU3R5bGVEZWNsYXJhdGlvbi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCUM0RTY1ODA4MUE5Q0NFNkQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZURl
Y2xhcmF0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEluc3BlY3RvclN0
eWxlRGVjbGFyYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQzRFNjU4MEIx
QTlDQ0VENTAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlUHJvcGVydHkuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUM0RTY1ODBEMUE5RDBENjkwMDQ3OUMxNSAvKiBJ
bnNwZWN0b3JSdWxlU2VsZWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gSW5zcGVjdG9yUnVsZVNlbGVjdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQzRFNjU4MEUxQTlEMEQ2OTAwNDc5QzE1IC8qIEluc3BlY3RvclJ1bGVTZWxlY3Rvci5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbnNwZWN0b3JSdWxlU2VsZWN0b3Iu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzUwRDBFODEwRkY0MjcyOTAwQUMyNjQ0
IC8qIFN0b3JhZ2VOYW1lc3BhY2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
U3RvcmFnZU5hbWVzcGFjZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTEzN0NG
MDExQTU4Mzc4MDA0QURCOTkgLyogSlNET01TdHJpbmdMaXN0LmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTRE9NU3RyaW5nTGlzdC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCUM1MTM3Q0YxMTFBNTgzNzgwMDRBREI5OSAvKiBKU0RPTVN0cmluZ0xp
c3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNET01TdHJpbmdMaXN0Lmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNTI4Miw2ICsxNTMwOCw3IEBACiAJCQkJ
MUM4MUI5NTYwRTk3MzMwODAwMjY2RTA3IC8qIEluc3BlY3RvckNvbnRyb2xsZXIuaCAqLywKIAkJ
CQk4MkFCMTc0MTEyNEI5OUVDMDBDNTA2OUQgLyogSW5zcGVjdG9yQ1NTQWdlbnQuY3BwICovLAog
CQkJCTgyQUIxNzQyMTI0Qjk5RUMwMEM1MDY5RCAvKiBJbnNwZWN0b3JDU1NBZ2VudC5oICovLAor
CQkJCUM0RTY1N0YxMUE5N0Y3QTcwMDQ3OUMxNSAvKiBJbnNwZWN0b3JDU1NJZC5oICovLAogCQkJ
CTdBQjBCMUJFMTIxMUE2MjIwMEE3Njk0MCAvKiBJbnNwZWN0b3JEYXRhYmFzZUFnZW50LmNwcCAq
LywKIAkJCQk3QUIwQjFCRjEyMTFBNjIyMDBBNzY5NDAgLyogSW5zcGVjdG9yRGF0YWJhc2VBZ2Vu
dC5oICovLAogCQkJCUYzRjVDRjEyMTJFRDgxQjMwMDg0QzU2OSAvKiBJbnNwZWN0b3JEYXRhYmFz
ZUluc3RydW1lbnRhdGlvbi5oICovLApAQCAtMTUzMDYsNiArMTUzMzMsOCBAQAogCQkJCTdBNTQ4
NTdFMTRFMDJENTEwMDZBRTA1QSAvKiBJbnNwZWN0b3JIaXN0b3J5LmggKi8sCiAJCQkJN0FDRDg4
RDExNEMwOEJENjAwODRFREQyIC8qIEluc3BlY3RvckluZGV4ZWREQkFnZW50LmNwcCAqLywKIAkJ
CQk3QUNEODhEMjE0QzA4QkQ2MDA4NEVERDIgLyogSW5zcGVjdG9ySW5kZXhlZERCQWdlbnQuaCAq
LywKKwkJCQlDNEU2NTdGMzFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5lU3R5bGVS
dWxlU2V0LmNwcCAqLywKKwkJCQlDNEU2NTdGNDFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9y
SW5saW5lU3R5bGVSdWxlU2V0LmggKi8sCiAJCQkJMjBENjI5MjQxMjUzNjkwQjAwMDgxNTQzIC8q
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAgKi8sCiAJCQkJMjBENjI5MjUxMjUzNjkwQjAw
MDgxNTQzIC8qIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oICovLAogCQkJCUE1ODQwRTFBMTg3
Qjc0RDUwMDg0M0IxMCAvKiBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUuY3BwICovLApA
QCAtMTUzMjUsOCArMTUzNTQsMTggQEAKIAkJCQk5OUNDMEI2NTE4QkU5RjE1MDA2Q0VCQ0MgLyog
SW5zcGVjdG9yUmVwbGF5QWdlbnQuaCAqLywKIAkJCQk4MkFCMTc3MTEyNUM4MjY3MDBDNTA2OUQg
LyogSW5zcGVjdG9yUmVzb3VyY2VBZ2VudC5jcHAgKi8sCiAJCQkJODJBQjE3NzIxMjVDODI2NzAw
QzUwNjlEIC8qIEluc3BlY3RvclJlc291cmNlQWdlbnQuaCAqLywKLQkJCQk4MkFCMTc2RjEyNUM4
MjY3MDBDNTA2OUQgLyogSW5zcGVjdG9yU3R5bGVTaGVldC5jcHAgKi8sCi0JCQkJODJBQjE3NzAx
MjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hlZXQuaCAqLywKKwkJCQlDNEU2NTgw
RDFBOUQwRDY5MDA0NzlDMTUgLyogSW5zcGVjdG9yUnVsZVNlbGVjdG9yLmNwcCAqLywKKwkJCQlD
NEU2NTgwRTFBOUQwRDY5MDA0NzlDMTUgLyogSW5zcGVjdG9yUnVsZVNlbGVjdG9yLmggKi8sCisJ
CQkJQzRFNjU4MDcxQTlDQ0U2RDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlRGVjbGFyYXRpb24u
Y3BwICovLAorCQkJCUM0RTY1ODA4MUE5Q0NFNkQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZURl
Y2xhcmF0aW9uLmggKi8sCisJCQkJQzRFNjU4MDExQTk4MDE2ODAwNDc5QzE1IC8qIEluc3BlY3Rv
clN0eWxlUnVsZS5jcHAgKi8sCisJCQkJQzRFNjU3RjUxQTk3RkJFRDAwNDc5QzE1IC8qIEluc3Bl
Y3RvclN0eWxlUnVsZS5oICovLAorCQkJCUM0RTY1ODBCMUE5Q0NFRDUwMDQ3OUMxNSAvKiBJbnNw
ZWN0b3JTdHlsZVByb3BlcnR5LmNwcCAqLywKKwkJCQlDNEU2NTdGNjFBOTdGQkVEMDA0NzlDMTUg
LyogSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oICovLAorCQkJCUM0RTY1ODAzMUE5ODRCNTIwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGVTZXQuY3BwICovLAorCQkJCUM0RTY1N0Y3MUE5N0ZC
RUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGVTZXQuaCAqLywKKwkJCQlDNEU2NTdGODFB
OTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuY3BwICovLAorCQkJ
CUM0RTY1N0Y5MUE5N0ZCRUQwMDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldC5o
ICovLAogCQkJCTc1NDEzM0E5MTAyRTAwRjQwMDA3NUQwMCAvKiBJbnNwZWN0b3JUaW1lbGluZUFn
ZW50LmNwcCAqLywKIAkJCQk3NTQxMzNBNzEwMkUwMEU4MDAwNzVEMDAgLyogSW5zcGVjdG9yVGlt
ZWxpbmVBZ2VudC5oICovLAogCQkJCUE1OTNDRjhBMTg0MDUzNTIwMEJGQ0UyNyAvKiBJbnNwZWN0
b3JXZWJBZ2VudEJhc2UuaCAqLywKQEAgLTI0MDM1LDYgKzI0MDc0LDcgQEAKIAkJCQk4NTkwOUQy
QjBBQ0M3RDU1MDBERjAxRjEgLyogRE9NQ1NTVmFsdWVMaXN0SW50ZXJuYWwuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUUxMEI5Q0NDMEI3NDdBNDQwMDNFRDg5MCAvKiBET01DdXN0b21YUGF0aE5TUmVz
b2x2ZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTg1QUNBQkIwMEE5Q0FGODAwMDY3MUU5MCAvKiBE
T01Eb2N1bWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQzRFNjU3RkIxQTk3RkJFRDAwNDc5QzE1
IC8qIEluc3BlY3RvcklubGluZVN0eWxlUnVsZVNldC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJODUw
ODlDREIwQTk4QzQyODAwQTI3NUFBIC8qIERPTURvY3VtZW50RnJhZ21lbnQuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTQ0MzExRjgyMTJFNEU2NkMwMDBBOEQxOSAvKiBET01Eb2N1bWVudEZyYWdtZW50
SW50ZXJuYWwuaCBpbiBIZWFkZXJzICovLAogCQkJCTQ0MzExQ0Q2MTJFNEUyMkQwMDBBOEQxOSAv
KiBET01Eb2N1bWVudEZyYWdtZW50UHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCkBAIC0yNDU2Myw2
ICsyNDYwMyw3IEBACiAJCQkJOTMwN0YxRDgwQUYyRDU5MDAwREJBMzFBIC8qIEhpdFRlc3RSZXN1
bHQuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDM0JDMjlDMEU5MUFCMEYwMDgzNTU4OCAvKiBIb3N0
V2luZG93LmggaW4gSGVhZGVycyAqLywKIAkJCQlGRDMxNjA5OTEyQjAyNkY3MDBDMUEzNTkgLyog
SFJURkRhdGFiYXNlLmggaW4gSGVhZGVycyAqLywKKwkJCQlDNEU2NTdGRTFBOTdGQkVEMDA0NzlD
MTUgLyogSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmggaW4gSGVhZGVycyAqLywKIAkJCQlGRDMxNjA5
QjEyQjAyNkY3MDBDMUEzNTkgLyogSFJURkRhdGFiYXNlTG9hZGVyLmggaW4gSGVhZGVycyAqLywK
IAkJCQlGRDMxNjA5RDEyQjAyNkY3MDBDMUEzNTkgLyogSFJURkVsZXZhdGlvbi5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJRkQzMTYwOUYxMkIwMjZGNzAwQzFBMzU5IC8qIEhSVEZLZXJuZWwuaCBpbiBI
ZWFkZXJzICovLApAQCAtMjQ2MTMsNiArMjQ2NTQsNyBAQAogCQkJCUE4NzFERTJEMEExNTJBQzgw
MEIxMkE2OCAvKiBIVE1MSGVhZEVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4RUE3Q0I4
MEExOTJCOUMwMEE4RUY1RiAvKiBIVE1MSGVhZGluZ0VsZW1lbnQuaCBpbiBIZWFkZXJzICovLAog
CQkJCUE4RUE3Q0FGMEExOTJCOUMwMEE4RUY1RiAvKiBIVE1MSFJFbGVtZW50LmggaW4gSGVhZGVy
cyAqLywKKwkJCQlDNEU2NTgwQTFBOUNDRTZEMDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVEZWNs
YXJhdGlvbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTg3MURFMjcwQTE1MkFDODAwQjEyQTY4IC8q
IEhUTUxIdG1sRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTg3MURFMkEwQTE1MkFDODAw
QjEyQTY4IC8qIEhUTUxJRnJhbWVFbGVtZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQlBOEVBN0Qy
RDBBMTkzODU1MDBBOEVGNUYgLyogSFRNTEltYWdlRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCkBA
IC0yNDgxNSw3ICsyNDg1Nyw2IEBACiAJCQkJNEY2RkRENjUxMzQxREVERDAwMUY4RUUzIC8qIElu
c3BlY3RvclBhZ2VBZ2VudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTlDQzBCNjcxOEJFOUYxNTAw
NkNFQkNDIC8qIEluc3BlY3RvclJlcGxheUFnZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQk4MkFC
MTc3NjEyNUM4MjY3MDBDNTA2OUQgLyogSW5zcGVjdG9yUmVzb3VyY2VBZ2VudC5oIGluIEhlYWRl
cnMgKi8sCi0JCQkJODJBQjE3NzQxMjVDODI2NzAwQzUwNjlEIC8qIEluc3BlY3RvclN0eWxlU2hl
ZXQuaCBpbiBIZWFkZXJzICovLAogCQkJCTc1NDEzM0E4MTAyRTAwRTgwMDA3NUQwMCAvKiBJbnNw
ZWN0b3JUaW1lbGluZUFnZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQlBNTkzQ0Y4QjE4NDA1MzUy
MDBCRkNFMjcgLyogSW5zcGVjdG9yV2ViQWdlbnRCYXNlLmggaW4gSGVhZGVycyAqLywKIAkJCQlG
MzgxMEMxQzEzNjVBNDk2MDBFRDZFMzMgLyogSW5zcGVjdG9yV29ya2VyQWdlbnQuaCBpbiBIZWFk
ZXJzICovLApAQCAtMjQ5NzAsNiArMjUwMTEsNyBAQAogCQkJCTQwOUVCREMwMTZCN0YzOEUwMENC
QTNGQyAvKiBKU0ZvbnRMb2FkZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCUZEQTE1RUFDMTJCMDNF
RTEwMDNBNTgzQSAvKiBKU0dhaW5Ob2RlLmggaW4gSGVhZGVycyAqLywKIAkJCQk1MThGNTAwMjE5
NENBQzNBMDA4MUJBQUUgLyogSlNHYW1lcGFkLmggaW4gSGVhZGVycyAqLywKKwkJCQlDNEU2NTgx
MDFBOUQwRDY5MDA0NzlDMTUgLyogSW5zcGVjdG9yUnVsZVNlbGVjdG9yLmggaW4gSGVhZGVycyAq
LywKIAkJCQk1MThGNTAwNDE5NENBQzNBMDA4MUJBQUUgLyogSlNHYW1lcGFkQnV0dG9uLmggaW4g
SGVhZGVycyAqLywKIAkJCQlGRTgwREE2NDBFOUM0NzAzMDAwRDZGNzUgLyogSlNHZW9sb2NhdGlv
bi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRkU4MERBNjYwRTlDNDcwMzAwMEQ2Rjc1IC8qIEpTR2Vv
cG9zaXRpb24uaCBpbiBIZWFkZXJzICovLApAQCAtMjUzOTAsNiArMjU0MzIsNyBAQAogCQkJCTMx
MDYwMzc1MTQzMjgxOUMwMEFCRjRCQSAvKiBKU1dlYktpdENTU0ZpbHRlclZhbHVlLmggaW4gSGVh
ZGVycyAqLywKIAkJCQkzMTZGRTA3MjBFNkNDQkVFMDBCRjYwODggLyogSlNDU1NLZXlmcmFtZVJ1
bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTMxNkZFMDc0MEU2Q0NCRUUwMEJGNjA4OCAvKiBKU0NT
U0tleWZyYW1lc1J1bGUuaCBpbiBIZWFkZXJzICovLAorCQkJCUM0RTY1N0ZEMUE5N0ZCRUQwMDQ3
OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVByb3BlcnR5LmggaW4gSGVhZGVycyAqLywKIAkJCQk0OTgz
OTE0MDBGMUU3Njc1MDBDMjM3ODIgLyogSlNXZWJLaXRDU1NNYXRyaXguaCBpbiBIZWFkZXJzICov
LAogCQkJCThBRDBBNTk1MTRDODgzMzYwMDBEODNDNSAvKiBKU1dlYktpdENTU1JlZ2lvblJ1bGUu
aCBpbiBIZWFkZXJzICovLAogCQkJCTMxNjExRTVCMEUxQzRERTAwMEY2QTU3OSAvKiBKU1dlYktp
dENTU1RyYW5zZm9ybVZhbHVlLmggaW4gSGVhZGVycyAqLywKQEAgLTI1NDQ2LDYgKzI1NDg5LDcg
QEAKIAkJCQlFNEI2NUE1QzEzMkZBQ0IwMDA3MEU3QkUgLyogTGVnYWN5VGlsZUxheWVyLmggaW4g
SGVhZGVycyAqLywKIAkJCQlFNEUzOUFGQjEzMzBFRkE4MDAzQUIyNzQgLyogTGVnYWN5VGlsZUxh
eWVyUG9vbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNTEyREQ4RjUwRDkxRTZBRjAwMEY4OUVFIC8q
IExlZ2FjeVdlYkFyY2hpdmUuaCBpbiBIZWFkZXJzICovLAorCQkJCUM0RTY1N0ZDMUE5N0ZCRUQw
MDQ3OUMxNSAvKiBJbnNwZWN0b3JTdHlsZVJ1bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRTY1
QkVCMEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRkY2
NDkxMEVBRDE1QzIwMEMxRDZGNyAvKiBMZW5ndGhCb3guaCBpbiBIZWFkZXJzICovLAogCQkJCUU1
QkE3RDYzMTUxNDM3Q0EwMEZFMUUzRiAvKiBMZW5ndGhGdW5jdGlvbnMuaCBpbiBIZWFkZXJzICov
LApAQCAtMjY1MTgsNiArMjY1NjIsNyBAQAogCQkJCUIyMjI3QUE5MEQwMEJGMjIwMDcxQjc4MiAv
KiBTVkdTdG9wRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQjIyMjdBQUMwRDAwQkYyMjAw
NzFCNzgyIC8qIFNWR1N0cmluZ0xpc3QuaCBpbiBIZWFkZXJzICovLAogCQkJCUIyMjI3QUI4MEQw
MEJGMjIwMDcxQjc4MiAvKiBTVkdTdHlsZUVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUM0
RTY1N0YyMUE5N0Y3QTcwMDQ3OUMxNSAvKiBJbnNwZWN0b3JDU1NJZC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQjIyMjdBQkIwRDAwQkYyMjAwNzFCNzgyIC8qIFNWR1NWR0VsZW1lbnQuaCBpbiBIZWFk
ZXJzICovLAogCQkJCUQzRjNEMzY4MUE2OUIxQTUwMDU5RkMyQiAvKiBKU1dlYkdMUmVuZGVyaW5n
Q29udGV4dEJhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCUIyMjI3QUJFMEQwMEJGMjIwMDcxQjc4
MiAvKiBTVkdTd2l0Y2hFbGVtZW50LmggaW4gSGVhZGVycyAqLywKQEAgLTI2OTIxLDYgKzI2OTY2
LDcgQEAKIAkJCQkxQUNFNTNFQjBBOEQxOEU3MDAyMjk0N0QgLyogWE1MU2VyaWFsaXplci5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJNTkwNUFEQzAxMzAyRjNDRTAwRjExNkRGIC8qIFhNTFRyZWVWaWV3
ZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTFBQjdGQzY5MEE4QjkyRUMwMEQ5RDM3QiAvKiBYUGF0
aEV2YWx1YXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQzRFNjU4MDAxQTk3RkJFRDAwNDc5QzE1
IC8qIEluc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzYw
REE1QjBEMkEzMUY3MDBCOTkxOEYgLyogWFBhdGhFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAog
CQkJCTFBQjdGQzZDMEE4QjkyRUMwMEQ5RDM3QiAvKiBYUGF0aEV4cHJlc3Npb24uaCBpbiBIZWFk
ZXJzICovLAogCQkJCTFBQjdGQzZGMEE4QjkyRUMwMEQ5RDM3QiAvKiBYUGF0aEV4cHJlc3Npb25O
b2RlLmggaW4gSGVhZGVycyAqLywKQEAgLTI4MTM0LDYgKzI4MTgwLDcgQEAKIAkJCQlBOEVBNzlG
ODBBMTkxNkRGMDBBOEVGNUYgLyogSFRNTE1lbnVFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTJCRThFMkM5MTJBNThBMDEwMEZBRDU1MCAvKiBIVE1MTWV0YUNoYXJzZXRQYXJzZXIuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJQTg3MURDMjcwQTE1MjA1NzAwQjEyQTY4IC8qIEhUTUxNZXRh
RWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlDNEU2NTgwMjFBOTgwMTY4MDA0NzlDMTUg
LyogSW5zcGVjdG9yU3R5bGVSdWxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE0NTQ0MjRBMTE5
QjM2NjEwMDlCRTkxMiAvKiBIVE1MTWV0ZXJFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CUE4Q0ZGN0E5MEExNTY5NzgwMDBBNDIzNCAvKiBIVE1MTW9kRWxlbWVudC5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlBOERGM0ZENTA5N0ZBMEZDMDA1Mjk4MUIgLyogSFRNTE5hbWVDb2xsZWN0aW9u
LmNwcCBpbiBTb3VyY2VzICovLApAQCAtMjgyOTUsNyArMjgzNDIsNiBAQAogCQkJCTRGNkZERDY0
MTM0MURFREQwMDFGOEVFMyAvKiBJbnNwZWN0b3JQYWdlQWdlbnQuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJOTlDQzBCNjYxOEJFOUYxNTAwNkNFQkNDIC8qIEluc3BlY3RvclJlcGxheUFnZW50LmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTgyQUIxNzc1MTI1QzgyNjcwMEM1MDY5RCAvKiBJbnNwZWN0
b3JSZXNvdXJjZUFnZW50LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTgyQUIxNzczMTI1QzgyNjcw
MEM1MDY5RCAvKiBJbnNwZWN0b3JTdHlsZVNoZWV0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTc1
NDEzM0FBMTAyRTAwRjQwMDA3NUQwMCAvKiBJbnNwZWN0b3JUaW1lbGluZUFnZW50LmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUYzODEwQzFCMTM2NUE0OTYwMEVENkUzMyAvKiBJbnNwZWN0b3JXb3Jr
ZXJBZ2VudC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlGMzUwQjczNTEzRjEzNzdEMDA4ODBDNDMg
LyogSW5zdHJ1bWVudGluZ0FnZW50cy5jcHAgaW4gU291cmNlcyAqLywKQEAgLTI4NjExLDYgKzI4
NjU3LDcgQEAKIAkJCQk4RkFDNzc0RDExOTg3MkNCMDAxNUFFOTQgLyogSlNNYWluVGhyZWFkRXhl
Y1N0YXRlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUNEMjdGNkU1MTQ1NzY4NUEwMDc4MjA3RCAv
KiBKU01lZGlhQ29udHJvbGxlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlDREFCNkQyRDE3Qzgx
NEVFMDBDNjBCMzQgLyogSlNNZWRpYUNvbnRyb2xzSG9zdC5jcHAgaW4gU291cmNlcyAqLywKKwkJ
CQlDNEU2NTgwQzFBOUNDRUQ1MDA0NzlDMTUgLyogSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQlGRDIzQTEyNTEzRjVGQTU5MDBGNjcwMDEgLyogSlNNZWRpYUVs
ZW1lbnRBdWRpb1NvdXJjZU5vZGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJRTQ0NjE0MTgwQ0Q2
ODI2OTAwRkFEQTc1IC8qIEpTTWVkaWFFcnJvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlDREE5
OERBMzE2MDE0NjQxMDBGRUEzQjEgLyogSlNNZWRpYUtleUVycm9yLmNwcCBpbiBTb3VyY2VzICov
LApAQCAtMjg5ODAsNiArMjkwMjcsNyBAQAogCQkJCTMxNkZFMDcxMEU2Q0NCRUUwMEJGNjA4OCAv
KiBKU0NTU0tleWZyYW1lUnVsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkzMTZGRTA3MzBFNkND
QkVFMDBCRjYwODggLyogSlNDU1NLZXlmcmFtZXNSdWxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTQ5ODM5MTNGMEYxRTc2NzUwMEMyMzc4MiAvKiBKU1dlYktpdENTU01hdHJpeC5jcHAgaW4gU291
cmNlcyAqLywKKwkJCQlDNEU2NTdGQTFBOTdGQkVEMDA0NzlDMTUgLyogSW5zcGVjdG9ySW5saW5l
U3R5bGVSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCThBRDBBNTk0MTRDODgzMzYwMDBE
ODNDNSAvKiBKU1dlYktpdENTU1JlZ2lvblJ1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMzE2
MTFFNUEwRTFDNERFMDAwRjZBNTc5IC8qIEpTV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJM0YyQjMzRUUxNjVBRjE1NjAwRTM5ODdDIC8qIEpTV2ViS2l0Q1NT
Vmlld3BvcnRSdWxlLmNwcCBpbiBTb3VyY2VzICovLApAQCAtMjkzNjAsNiArMjk0MDgsNyBAQAog
CQkJCTUzQzgyOThEMTNEOEQ5MjcwMERFMkRFQiAvKiBSZW5kZXJGbGV4aWJsZUJveC5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQk1MDhDQ0E1MDEzQ0YxMDZCMDAzMTUxRjMgLyogUmVuZGVyRmxvd1Ro
cmVhZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODcxREVENDBBMTUzMEM3MDBCMTJBNjggLyog
UmVuZGVyRnJhbWUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQzRFNjU3RkYxQTk3RkJFRDAwNDc5
QzE1IC8qIEluc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTBGRDMwODBFMTE3Q0Y3RTcwMEE3OTFGNyAvKiBSZW5kZXJGcmFtZUJhc2UuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQTg3MURFRDIwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lU2V0LmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUNERUE3Qzg1MTI3NjIzMDQwMEI4NDZERCAvKiBSZW5kZXJG
dWxsU2NyZWVuLmNwcCBpbiBTb3VyY2VzICovLApAQCAtMjk1NTAsNiArMjk1OTksNyBAQAogCQkJ
CTBGNjA1QUVDMTVGOTQ4NDgwMDRERjBDMCAvKiBTY3JvbGxpbmdDb25zdHJhaW50cy5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQkxQUY2MkVFNzE0REEyMkE3MDA0MTU1NkMgLyogU2Nyb2xsaW5nQ29v
cmRpbmF0b3IuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZDNEU0MEUxODdGODJFMTAwNDU4ODJD
IC8qIFNjcm9sbGluZ0Nvb3JkaW5hdG9ySU9TLm1tIGluIFNvdXJjZXMgKi8sCisJCQkJQzRFNjU4
MEYxQTlEMEQ2OTAwNDc5QzE1IC8qIEluc3BlY3RvclJ1bGVTZWxlY3Rvci5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQkxQUY2MkVFNjE0REEyMkE3MDA0MTU1NkMgLyogU2Nyb2xsaW5nQ29vcmRpbmF0
b3JNYWMubW0gaW4gU291cmNlcyAqLywKIAkJCQk5M0MzOEJGRTE2NDQ3M0M3MDAwOTFFQjIgLyog
U2Nyb2xsaW5nU3RhdGVGaXhlZE5vZGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZFQTNFN0Mx
OTFCMkZDNTAwMEYxQjU1IC8qIFNjcm9sbGluZ1N0YXRlRnJhbWVTY3JvbGxpbmdOb2RlLmNwcCBp
biBTb3VyY2VzICovLApAQCAtMjk3MDEsNiArMjk3NTEsNyBAQAogCQkJCTBGRjUwMjcxMTAyQkE5
NkEwMDY2RjM5QSAvKiBTdHlsZU1lZGlhLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTdDNEVERDc0
MUE3QjYwNzgwMDE5OEM0RCAvKiBGb250Q29jb2EubW0gaW4gU291cmNlcyAqLywKIAkJCQlCQzVF
Qjc0RDBFODFFMDY3MDBCMjU5NjUgLyogU3R5bGVNdWx0aUNvbERhdGEuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJQzRFNjU4MDkxQTlDQ0U2RDAwNDc5QzE1IC8qIEluc3BlY3RvclN0eWxlRGVjbGFy
YXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZERkIwQTE5OTA2NzAwN0ZCOEM1IC8q
IFN0eWxlUHJvcGVydGllcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlFMUIyNTEwNjE1MkEwQkFG
MDA2OUI3NzkgLyogU3R5bGVQcm9wZXJ0eVNob3J0aGFuZC5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQlCQzIyNzJFMzBFODJFRTlCMDBFN0Y5NzUgLyogU3R5bGVSYXJlSW5oZXJpdGVkRGF0YS5jcHAg
aW4gU291cmNlcyAqLywKQEAgLTI5OTkyLDYgKzMwMDQzLDcgQEAKIAkJCQk0MTk4QkRGMDFBODEx
NDIyMDBCMjJGQjUgLyogUmVhZGFibGVTdHJlYW1KU1NvdXJjZS5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk0OTQ1QkZEMzEzQ0Y4MDkwMDBDQzNCMzggLyogVHJhbnNmb3JtU3RhdGUuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJRTE3QjQ5MTUxNkE5QjA5NDAwMUM4ODM5IC8qIFRyYW5zaXRpb25FdmVu
dC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlDNEU2NTgwNDFBOTg0QjUyMDA0NzlDMTUgLyogSW5z
cGVjdG9yU3R5bGVSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTQ5RTkxMUQxMEVGODZE
NDcwMDlEMENBRiAvKiBUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJODU0RkU3MzYwQTIyOTdCRTAwNThEN0FEIC8qIFRyYXZlcnNhbC5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkxNEQ2NEI1QzEzNEE1QjZCMDBFNThGREEgLyogVHJlZVNjb3BlLmNwcCBp
biBTb3VyY2VzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVk
U3R5bGVEZWNsYXJhdGlvbi5oIGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbi5oCmluZGV4IGVmZGMxNTcuLjQyZjI5MWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9jc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmgKQEAgLTg1LDkgKzg1LDkgQEAg
cHJpdmF0ZToKIAogY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uIGZpbmFsIDogcHVi
bGljIENTU1N0eWxlRGVjbGFyYXRpb24gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRy
PENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gY3JlYXRlKFBhc3NSZWZQdHI8Tm9kZT4gbm9k
ZSwgYm9vbCBhbGxvd1Zpc2l0ZWRTdHlsZSA9IGZhbHNlLCBjb25zdCBTdHJpbmcmIHBzZXVkb0Vs
ZW1lbnROYW1lID0gU3RyaW5nKCkpCisgICAgc3RhdGljIFJlZjxDU1NDb21wdXRlZFN0eWxlRGVj
bGFyYXRpb24+IGNyZWF0ZShQYXNzUmVmUHRyPE5vZGU+IG5vZGUsIGJvb2wgYWxsb3dWaXNpdGVk
U3R5bGUgPSBmYWxzZSwgY29uc3QgU3RyaW5nJiBwc2V1ZG9FbGVtZW50TmFtZSA9IFN0cmluZygp
KQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDU1NDb21wdXRlZFN0eWxlRGVj
bGFyYXRpb24obm9kZSwgYWxsb3dWaXNpdGVkU3R5bGUsIHBzZXVkb0VsZW1lbnROYW1lKSk7Cisg
ICAgICAgIHJldHVybiBhZG9wdFJlZigqbmV3IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbihu
b2RlLCBhbGxvd1Zpc2l0ZWRTdHlsZSwgcHNldWRvRWxlbWVudE5hbWUpKTsKICAgICB9CiAgICAg
dmlydHVhbCB+Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uKCk7CiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNoZWV0LmggYi9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NT
U3R5bGVTaGVldC5oCmluZGV4IGQzMTJlZWMuLjBkYWYyMWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2Nzcy9DU1NTdHlsZVNoZWV0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0
eWxlU2hlZXQuaApAQCAtMTE3LDYgKzExNyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHJlYXR0YWNo
Q2hpbGRSdWxlQ1NTT01XcmFwcGVycygpOwogCiAgICAgU3R5bGVTaGVldENvbnRlbnRzJiBjb250
ZW50cygpIHsgcmV0dXJuIG1fY29udGVudHM7IH0KKyAgICBjb25zdCBTdHlsZVNoZWV0Q29udGVu
dHMmIGNvbnRlbnRzKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50czsgfQogCiAgICAgdm9pZCBk
ZXRhY2hGcm9tRG9jdW1lbnQoKSB7IG1fb3duZXJOb2RlID0gbnVsbHB0cjsgfQogCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwIGIvU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAppbmRleCA4NTMyMWRk
Li44NGNlYTJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9y
Q1NTQWdlbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NB
Z2VudC5jcHAKQEAgLTI3LDYgKzI3LDggQEAKIAogI2luY2x1ZGUgIkNTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbi5oIgogI2luY2x1ZGUgIkNTU0ltcG9ydFJ1bGUuaCIKKyNpbmNsdWRlICJDU1NN
ZWRpYVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NQYXJzZXIuaCIKICNpbmNsdWRlICJDU1NQcm9wZXJ0
eU5hbWVzLmgiCiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlTb3VyY2VEYXRhLmgiCiAjaW5jbHVkZSAi
Q1NTUnVsZS5oIgpAQCAtMzksNyArNDEsMTIgQEAKICNpbmNsdWRlICJIVE1MSGVhZEVsZW1lbnQu
aCIKICNpbmNsdWRlICJIVE1MU3R5bGVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9yRE9N
QWdlbnQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JQYWdlQWdlbnQuaCIKICNpbmNsdWRlICJJbnNw
ZWN0b3JIaXN0b3J5LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0Lmgi
CisjaW5jbHVkZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiSW5zcGVj
dG9yU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oIgogI2lu
Y2x1ZGUgIkluc3RydW1lbnRpbmdBZ2VudHMuaCIKICNpbmNsdWRlICJOYW1lZEZsb3dDb2xsZWN0
aW9uLmgiCiAjaW5jbHVkZSAiTm9kZS5oIgpAQCAtNTIsMTMgKzU5LDE1IEBACiAjaW5jbHVkZSAi
U3R5bGVSZXNvbHZlci5oIgogI2luY2x1ZGUgIlN0eWxlUnVsZS5oIgogI2luY2x1ZGUgIlN0eWxl
U2hlZXRMaXN0LmgiCisjaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCiAjaW5jbHVkZSAi
V2ViS2l0TmFtZWRGbG93LmgiCisjaW5jbHVkZSA8aW5zcGVjdG9yL0NvbnRlbnRTZWFyY2hVdGls
aXRpZXMuaD4KICNpbmNsdWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yUHJvdG9jb2xPYmplY3RzLmg+
Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvUmVmLmg+CiAjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KICNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdDb25jYXRlbmF0ZS5oPgorI2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ry
b3llZC5oPgogCiB1c2luZyBuYW1lc3BhY2UgSW5zcGVjdG9yOwogCkBAIC0xMDEsNiArMTEwLDE5
IEBAIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlUHNldWRvQ2xhc3NNYXNrKEluc3BlY3RvckFycmF5
KiBwc2V1ZG9DbGFzc0FycmF5KQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW4gc3R5bGVzaGVldE9yaWdpblRv
UHJvdG9jb2xFbnVtKEluc3BlY3Rvcjo6U3R5bGVTaGVldE9yaWdpbiBvcmlnaW4pOworc3RhdGlj
IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE6OlNvdXJjZSBtZWRpYUxpc3RTb3Vy
Y2VUb1Byb3RvY29sRW51bShJbnNwZWN0b3I6Ok1lZGlhTGlzdFNvdXJjZSBzb3VyY2UpOworCitz
dGF0aWMgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEJvZHk+
IGJ1aWxkT2JqZWN0Rm9yU3R5bGVTaGVldChJbnNwZWN0b3I6OlN0eWxlc2hlZXRSdWxlU2V0Jik7
CitzdGF0aWMgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4gYnVpbGRP
YmplY3RGb3JTdHlsZVJ1bGUoSW5zcGVjdG9yOjpTdHlsZVJ1bGUmIHJ1bGUsIEVsZW1lbnQqIGVs
ZW1lbnQpOworc3RhdGljIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNlbGVjdG9yTGlz
dD4gYnVpbGRPYmplY3RGb3JTZWxlY3Rvckxpc3QoSW5zcGVjdG9yOjpTdHlsZVJ1bGUmLCBXZWJD
b3JlOjpFbGVtZW50Kik7CitzdGF0aWMgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6
Q1NTU3R5bGU+IGJ1aWxkT2JqZWN0Rm9yU3R5bGUoSW5zcGVjdG9yOjpTdHlsZURlY2xhcmF0aW9u
Jik7CitzdGF0aWMgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGJ1
aWxkT2JqZWN0Rm9yU3R5bGVXaXRoUHJvcGVydGllcyhJbnNwZWN0b3I6OlN0eWxlRGVjbGFyYXRp
b24mKTsKK3N0YXRpYyBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTb3VyY2VSYW5n
ZT4gYnVpbGRTb3VyY2VSYW5nZU9iamVjdChUZXh0UG9zaXRpb24mIHN0YXJ0LCBUZXh0UG9zaXRp
b24mIGVuZCk7CitzdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE+
IGJ1aWxkTWVkaWFPYmplY3QoY29uc3QgTWVkaWFMaXN0JiBtZWRpYSwgSW5zcGVjdG9yOjpNZWRp
YUxpc3RTb3VyY2UgbWVkaWFMaXN0U291cmNlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCk7Citz
dGF0aWMgdm9pZCBmaWxsTWVkaWFMaXN0Q2hhaW4oQ1NTUnVsZSYgcnVsZSwgSW5zcGVjdG9yOjpQ
cm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYT4mIG1lZGlh
QXJyYXkpOworCisKIGNsYXNzIENoYW5nZVJlZ2lvbk92ZXJzZXRUYXNrIHsKIHB1YmxpYzoKICAg
ICBDaGFuZ2VSZWdpb25PdmVyc2V0VGFzayhJbnNwZWN0b3JDU1NBZ2VudCopOwpAQCAtMTQ5LDU5
ICsxNzEsNTIgQEAgdm9pZCBDaGFuZ2VSZWdpb25PdmVyc2V0VGFzazo6dGltZXJGaXJlZCgpCiAg
ICAgbV9uYW1lZEZsb3dzLmNsZWFyKCk7CiB9CiAKLWNsYXNzIEluc3BlY3RvckNTU0FnZW50OjpT
dHlsZVNoZWV0QWN0aW9uIDogcHVibGljIEluc3BlY3Rvckhpc3Rvcnk6OkFjdGlvbiB7Ci0gICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoU3R5bGVTaGVldEFjdGlvbik7CitjbGFzcyBJbnNwZWN0b3JD
U1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0aW9uIDogcHVibGljIEluc3BlY3Rvckhpc3Rvcnk6OkFj
dGlvbiB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3R5bGVSdWxlU2V0QWN0aW9uKTsKIHB1
YmxpYzoKLSAgICBTdHlsZVNoZWV0QWN0aW9uKGNvbnN0IFN0cmluZyYgbmFtZSwgSW5zcGVjdG9y
U3R5bGVTaGVldCogc3R5bGVTaGVldCkKKyAgICBTdHlsZVJ1bGVTZXRBY3Rpb24oY29uc3QgU3Ry
aW5nJiBuYW1lLCBSZWY8U3R5bGVSdWxlU2V0PiYmIHJ1bGVTZXQpCiAgICAgICAgIDogSW5zcGVj
dG9ySGlzdG9yeTo6QWN0aW9uKG5hbWUpCi0gICAgICAgICwgbV9zdHlsZVNoZWV0KHN0eWxlU2hl
ZXQpCisgICAgICAgICwgbV9ydWxlU2V0KFdURjo6bW92ZShydWxlU2V0KSkKICAgICB7CiAgICAg
fQogCiBwcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPEluc3BlY3RvclN0eWxlU2hlZXQ+IG1fc3R5bGVT
aGVldDsKKyAgICBSZWY8U3R5bGVSdWxlU2V0PiBtX3J1bGVTZXQ7CiB9OwogCi1jbGFzcyBJbnNw
ZWN0b3JDU1NBZ2VudDo6U2V0U3R5bGVTaGVldFRleHRBY3Rpb24gZmluYWwgOiBwdWJsaWMgSW5z
cGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24geworY2xhc3MgSW5zcGVjdG9yQ1NTQWdl
bnQ6OlNldFN0eWxlU2hlZXRUZXh0QWN0aW9uIGZpbmFsIDogcHVibGljIEluc3BlY3RvckNTU0Fn
ZW50OjpTdHlsZVJ1bGVTZXRBY3Rpb24gewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFNldFN0
eWxlU2hlZXRUZXh0QWN0aW9uKTsKIHB1YmxpYzoKLSAgICBTZXRTdHlsZVNoZWV0VGV4dEFjdGlv
bihJbnNwZWN0b3JTdHlsZVNoZWV0KiBzdHlsZVNoZWV0LCBjb25zdCBTdHJpbmcmIHRleHQpCi0g
ICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24oQVNDSUlMaXRlcmFs
KCJTZXRTdHlsZVNoZWV0VGV4dCIpLCBzdHlsZVNoZWV0KQorICAgIFNldFN0eWxlU2hlZXRUZXh0
QWN0aW9uKFJlZjxTdHlsZVJ1bGVTZXQ+JiYgcnVsZVNldCwgY29uc3QgU3RyaW5nJiB0ZXh0KQor
ICAgICAgICA6IEluc3BlY3RvckNTU0FnZW50OjpTdHlsZVJ1bGVTZXRBY3Rpb24oQVNDSUlMaXRl
cmFsKCJTZXRTdHlsZVNoZWV0VGV4dCIpLCBXVEY6Om1vdmUocnVsZVNldCkpCiAgICAgICAgICwg
bV90ZXh0KHRleHQpCiAgICAgewogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCBwZXJmb3JtKEV4
Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgaWYgKCFtX3N0eWxlU2hl
ZXQtPmdldFRleHQoJm1fb2xkVGV4dCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIG1fb2xkVGV4dCA9IG1fcnVsZVNldC0+Z2V0VGV4dCgpOwogICAgICAgICByZXR1cm4gcmVk
byhlYyk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIHVuZG8oRXhjZXB0aW9uQ29kZSYgZWMp
IG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sIHVuZG8oRXhjZXB0aW9uQ29kZSYpIG92ZXJyaWRl
CiAgICAgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0LT5zZXRUZXh0KG1fb2xkVGV4dCwgZWMp
KSB7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXQtPnJlcGFyc2VTdHlsZVNoZWV0KG1fb2xkVGV4
dCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIG1fcnVsZVNldC0+cmVwbGFjZVRleHQobV9vbGRUZXh0KTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIHJlZG8oRXhjZXB0aW9u
Q29kZSYgZWMpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sIHJlZG8oRXhjZXB0aW9uQ29kZSYp
IG92ZXJyaWRlCiAgICAgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0LT5zZXRUZXh0KG1fdGV4
dCwgZWMpKSB7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXQtPnJlcGFyc2VTdHlsZVNoZWV0KG1f
dGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIG1fcnVsZVNldC0+cmVwbGFjZVRleHQobV90ZXh0KTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgdmlydHVhbCBTdHJpbmcgbWVyZ2VJZCgpIG92
ZXJyaWRlCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIlNldFN0eWxlU2hl
ZXRUZXh0ICVzIiwgbV9zdHlsZVNoZWV0LT5pZCgpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBy
ZXR1cm4gU3RyaW5nOjpmb3JtYXQoIlNldFN0eWxlU2hlZXRUZXh0ICUiIFBSSXU2NCwgbV9ydWxl
U2V0LT5pZGVudGlmaWVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBtZXJnZShzdGQ6
OnVuaXF1ZV9wdHI8QWN0aW9uPiBhY3Rpb24pIG92ZXJyaWRlCisgICAgdmlydHVhbCB2b2lkIG1l
cmdlKHN0ZDo6dW5pcXVlX3B0cjxJbnNwZWN0b3JIaXN0b3J5OjpBY3Rpb24+IGFjdGlvbikgb3Zl
cnJpZGUKICAgICB7CiAgICAgICAgIEFTU0VSVChhY3Rpb24tPm1lcmdlSWQoKSA9PSBtZXJnZUlk
KCkpOwogCkBAIC0yMTQsMTEgKzIyOSwxMSBAQCBwcml2YXRlOgogICAgIFN0cmluZyBtX29sZFRl
eHQ7CiB9OwogCi1jbGFzcyBJbnNwZWN0b3JDU1NBZ2VudDo6U2V0U3R5bGVUZXh0QWN0aW9uIGZp
bmFsIDogcHVibGljIEluc3BlY3RvckNTU0FnZW50OjpTdHlsZVNoZWV0QWN0aW9uIHsKK2NsYXNz
IEluc3BlY3RvckNTU0FnZW50OjpTZXRTdHlsZVRleHRBY3Rpb24gZmluYWwgOiBwdWJsaWMgSW5z
cGVjdG9yQ1NTQWdlbnQ6OlN0eWxlUnVsZVNldEFjdGlvbiB7CiAgICAgV1RGX01BS0VfTk9OQ09Q
WUFCTEUoU2V0U3R5bGVUZXh0QWN0aW9uKTsKIHB1YmxpYzoKLSAgICBTZXRTdHlsZVRleHRBY3Rp
b24oSW5zcGVjdG9yU3R5bGVTaGVldCogc3R5bGVTaGVldCwgY29uc3QgSW5zcGVjdG9yQ1NTSWQm
IGNzc0lkLCBjb25zdCBTdHJpbmcmIHRleHQpCi0gICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6
OlN0eWxlU2hlZXRBY3Rpb24oQVNDSUlMaXRlcmFsKCJTZXRTdHlsZVRleHQiKSwgc3R5bGVTaGVl
dCkKKyAgICBTZXRTdHlsZVRleHRBY3Rpb24oUmVmPFN0eWxlUnVsZVNldD4mJiBydWxlU2V0LCBj
b25zdCBDU1NJZCYgY3NzSWQsIGNvbnN0IFN0cmluZyYgdGV4dCkKKyAgICAgICAgOiBJbnNwZWN0
b3JDU1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0aW9uKEFTQ0lJTGl0ZXJhbCgiU2V0U3R5bGVUZXh0
IiksIFdURjo6bW92ZShydWxlU2V0KSkKICAgICAgICAgLCBtX2Nzc0lkKGNzc0lkKQogICAgICAg
ICAsIG1fdGV4dCh0ZXh0KQogICAgIHsKQEAgLTIyOSwyMCArMjQ0LDM5IEBAIHB1YmxpYzoKICAg
ICAgICAgcmV0dXJuIHJlZG8oZWMpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4
Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2VwdGlv
bkNvZGUmKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc3R5bGVTaGVldC0+c2V0
U3R5bGVUZXh0KG1fY3NzSWQsIG1fb2xkVGV4dCwgbnVsbHB0ciwgZWMpOworICAgICAgICBib29s
IHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICBhdXRvIGhhbmRsZXIgPSBbJl0gKFN0eWxlRGVjbGFy
YXRpb24mIHN0eWxlKSB7CisgICAgICAgICAgICBzdWNjZXNzICY9IHN0eWxlLnNldFN0eWxlVGV4
dChtX29sZFRleHQpOworICAgICAgICB9OworICAgICAgICBpZiAoaXM8U3R5bGVzaGVldFJ1bGVT
ZXQ+KG1fcnVsZVNldCkpCisgICAgICAgICAgICBkb3duY2FzdDxTdHlsZXNoZWV0UnVsZVNldD4o
bV9ydWxlU2V0LmdldCgpKS53aXRoU3R5bGVGb3JJZChtX2Nzc0lkLCBoYW5kbGVyKTsKKyAgICAg
ICAgaWYgKGlzPElubGluZVN0eWxlUnVsZVNldD4obV9ydWxlU2V0KSkKKyAgICAgICAgICAgIGRv
d25jYXN0PElubGluZVN0eWxlUnVsZVNldD4obV9ydWxlU2V0LmdldCgpKS53aXRoSW5saW5lU3R5
bGUoaGFuZGxlcik7CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQogCi0gICAgdmly
dHVhbCBib29sIHJlZG8oRXhjZXB0aW9uQ29kZSYgZWMpIG92ZXJyaWRlCisgICAgdmlydHVhbCBi
b29sIHJlZG8oRXhjZXB0aW9uQ29kZSYpIG92ZXJyaWRlCiAgICAgewotICAgICAgICByZXR1cm4g
bV9zdHlsZVNoZWV0LT5zZXRTdHlsZVRleHQobV9jc3NJZCwgbV90ZXh0LCAmbV9vbGRUZXh0LCBl
Yyk7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIGF1dG8gaGFuZGxlciA9
IFsmXSAoU3R5bGVEZWNsYXJhdGlvbiYgc3R5bGUpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgJj0g
c3R5bGUuZ2V0U3R5bGVUZXh0KG1fb2xkVGV4dCk7CisgICAgICAgICAgICBzdWNjZXNzICY9IHN0
eWxlLnNldFN0eWxlVGV4dChtX3RleHQpOworICAgICAgICB9OworICAgICAgICBpZiAoaXM8U3R5
bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNldCkpCisgICAgICAgICAgICBkb3duY2FzdDxTdHlsZXNo
ZWV0UnVsZVNldD4obV9ydWxlU2V0LmdldCgpKS53aXRoU3R5bGVGb3JJZChtX2Nzc0lkLCBoYW5k
bGVyKTsKKyAgICAgICAgaWYgKGlzPElubGluZVN0eWxlUnVsZVNldD4obV9ydWxlU2V0KSkKKyAg
ICAgICAgICAgIGRvd25jYXN0PElubGluZVN0eWxlUnVsZVNldD4obV9ydWxlU2V0LmdldCgpKS53
aXRoSW5saW5lU3R5bGUoaGFuZGxlcik7CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAg
fQogCiAgICAgdmlydHVhbCBTdHJpbmcgbWVyZ2VJZCgpIG92ZXJyaWRlCiAgICAgewotICAgICAg
ICBBU1NFUlQobV9zdHlsZVNoZWV0LT5pZCgpID09IG1fY3NzSWQuc3R5bGVTaGVldElkKCkpOwot
ICAgICAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIlNldFN0eWxlVGV4dCAlczoldSIsIG1fc3R5
bGVTaGVldC0+aWQoKS51dGY4KCkuZGF0YSgpLCBtX2Nzc0lkLm9yZGluYWwoKSk7CisgICAgICAg
IEFTU0VSVChtX3J1bGVTZXQtPmlkZW50aWZpZXIoKSA9PSBtX2Nzc0lkLnN0eWxlc2hlZXRJZCgp
KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCJTZXRTdHlsZVRleHQgJWxsdTolbGx1
IiwgbV9ydWxlU2V0LT5pZGVudGlmaWVyKCksIG1fY3NzSWQucnVsZU9yZGluYWwoKSk7CiAgICAg
fQogCiAgICAgdmlydHVhbCB2b2lkIG1lcmdlKHN0ZDo6dW5pcXVlX3B0cjxBY3Rpb24+IGFjdGlv
bikgb3ZlcnJpZGUKQEAgLTI1NCw1MCArMjg4LDU5IEBAIHB1YmxpYzoKICAgICB9CiAKIHByaXZh
dGU6Ci0gICAgSW5zcGVjdG9yQ1NTSWQgbV9jc3NJZDsKKyAgICBDU1NJZCBtX2Nzc0lkOwogICAg
IFN0cmluZyBtX3RleHQ7CiAgICAgU3RyaW5nIG1fb2xkVGV4dDsKIH07CiAKLWNsYXNzIEluc3Bl
Y3RvckNTU0FnZW50OjpTZXRSdWxlU2VsZWN0b3JBY3Rpb24gZmluYWwgOiBwdWJsaWMgSW5zcGVj
dG9yQ1NTQWdlbnQ6OlN0eWxlU2hlZXRBY3Rpb24geworY2xhc3MgSW5zcGVjdG9yQ1NTQWdlbnQ6
OlNldFJ1bGVTZWxlY3RvckFjdGlvbiBmaW5hbCA6IHB1YmxpYyBJbnNwZWN0b3JDU1NBZ2VudDo6
U3R5bGVSdWxlU2V0QWN0aW9uIHsKICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTZXRSdWxlU2Vs
ZWN0b3JBY3Rpb24pOwogcHVibGljOgotICAgIFNldFJ1bGVTZWxlY3RvckFjdGlvbihJbnNwZWN0
b3JTdHlsZVNoZWV0KiBzdHlsZVNoZWV0LCBjb25zdCBJbnNwZWN0b3JDU1NJZCYgY3NzSWQsIGNv
bnN0IFN0cmluZyYgc2VsZWN0b3IpCi0gICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxl
U2hlZXRBY3Rpb24oQVNDSUlMaXRlcmFsKCJTZXRSdWxlU2VsZWN0b3IiKSwgc3R5bGVTaGVldCkK
KyAgICBTZXRSdWxlU2VsZWN0b3JBY3Rpb24oUmVmPFN0eWxlUnVsZVNldD4mJiBydWxlU2V0LCBj
b25zdCBDU1NJZCYgY3NzSWQsIGNvbnN0IFN0cmluZyYgc2VsZWN0b3JUZXh0KQorICAgICAgICA6
IEluc3BlY3RvckNTU0FnZW50OjpTdHlsZVJ1bGVTZXRBY3Rpb24oQVNDSUlMaXRlcmFsKCJTZXRS
dWxlU2VsZWN0b3IiKSwgV1RGOjptb3ZlKHJ1bGVTZXQpKQogICAgICAgICAsIG1fY3NzSWQoY3Nz
SWQpCi0gICAgICAgICwgbV9zZWxlY3RvcihzZWxlY3RvcikKKyAgICAgICAgLCBtX3NlbGVjdG9y
VGV4dChzZWxlY3RvclRleHQpCiAgICAgewogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCBwZXJm
b3JtKEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgbV9vbGRTZWxl
Y3RvciA9IG1fc3R5bGVTaGVldC0+cnVsZVNlbGVjdG9yKG1fY3NzSWQsIGVjKTsKLSAgICAgICAg
aWYgKGVjKQorICAgICAgICBpZiAoIWlzPFN0eWxlc2hlZXRSdWxlU2V0PihtX3J1bGVTZXQpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghZG93bmNhc3Q8U3R5bGVz
aGVldFJ1bGVTZXQ+KG1fcnVsZVNldC5nZXQoKSkuc2VsZWN0b3JUZXh0Rm9yUnVsZShtX2Nzc0lk
LCBtX29sZFNlbGVjdG9yVGV4dCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICAg
ICAgcmV0dXJuIHJlZG8oZWMpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2Vw
dGlvbkNvZGUmIGVjKSBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2VwdGlvbkNv
ZGUmKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc3R5bGVTaGVldC0+c2V0UnVs
ZVNlbGVjdG9yKG1fY3NzSWQsIG1fb2xkU2VsZWN0b3IsIGVjKTsKKyAgICAgICAgaWYgKCFpczxT
dHlsZXNoZWV0UnVsZVNldD4obV9ydWxlU2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICByZXR1cm4gZG93bmNhc3Q8U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNldC5n
ZXQoKSkuc2V0U2VsZWN0b3JUZXh0Rm9yUnVsZShtX2Nzc0lkLCBtX29sZFNlbGVjdG9yVGV4dCk7
CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIHJlZG8oRXhjZXB0aW9uQ29kZSYgZWMpIG92ZXJy
aWRlCisgICAgdmlydHVhbCBib29sIHJlZG8oRXhjZXB0aW9uQ29kZSYpIG92ZXJyaWRlCiAgICAg
ewotICAgICAgICByZXR1cm4gbV9zdHlsZVNoZWV0LT5zZXRSdWxlU2VsZWN0b3IobV9jc3NJZCwg
bV9zZWxlY3RvciwgZWMpOworICAgICAgICBpZiAoIWlzPFN0eWxlc2hlZXRSdWxlU2V0PihtX3J1
bGVTZXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBkb3du
Y2FzdDxTdHlsZXNoZWV0UnVsZVNldD4obV9ydWxlU2V0LmdldCgpKS5zZXRTZWxlY3RvclRleHRG
b3JSdWxlKG1fY3NzSWQsIG1fc2VsZWN0b3JUZXh0KTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAg
SW5zcGVjdG9yQ1NTSWQgbV9jc3NJZDsKLSAgICBTdHJpbmcgbV9zZWxlY3RvcjsKLSAgICBTdHJp
bmcgbV9vbGRTZWxlY3RvcjsKKyAgICBDU1NJZCBtX2Nzc0lkOworICAgIFN0cmluZyBtX3NlbGVj
dG9yVGV4dDsKKyAgICBTdHJpbmcgbV9vbGRTZWxlY3RvclRleHQ7CiB9OwogCi1jbGFzcyBJbnNw
ZWN0b3JDU1NBZ2VudDo6QWRkUnVsZUFjdGlvbiBmaW5hbCA6IHB1YmxpYyBJbnNwZWN0b3JDU1NB
Z2VudDo6U3R5bGVTaGVldEFjdGlvbiB7CitjbGFzcyBJbnNwZWN0b3JDU1NBZ2VudDo6QWRkUnVs
ZUFjdGlvbiBmaW5hbCA6IHB1YmxpYyBJbnNwZWN0b3JDU1NBZ2VudDo6U3R5bGVSdWxlU2V0QWN0
aW9uIHsKICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShBZGRSdWxlQWN0aW9uKTsKIHB1YmxpYzoK
LSAgICBBZGRSdWxlQWN0aW9uKEluc3BlY3RvclN0eWxlU2hlZXQqIHN0eWxlU2hlZXQsIGNvbnN0
IFN0cmluZyYgc2VsZWN0b3IpCi0gICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlU2hl
ZXRBY3Rpb24oQVNDSUlMaXRlcmFsKCJBZGRSdWxlIiksIHN0eWxlU2hlZXQpCisgICAgQWRkUnVs
ZUFjdGlvbihSZWY8U3R5bGVSdWxlU2V0PiYmIHJ1bGVTZXQsIGNvbnN0IFN0cmluZyYgc2VsZWN0
b3IpCisgICAgICAgIDogSW5zcGVjdG9yQ1NTQWdlbnQ6OlN0eWxlUnVsZVNldEFjdGlvbihBU0NJ
SUxpdGVyYWwoIkFkZFJ1bGUiKSwgV1RGOjptb3ZlKHJ1bGVTZXQpKQogICAgICAgICAsIG1fc2Vs
ZWN0b3Ioc2VsZWN0b3IpCiAgICAgewogICAgIH0KQEAgLTMwOSwzOCArMzUyLDM2IEBAIHB1Ymxp
YzoKIAogICAgIHZpcnR1YWwgYm9vbCB1bmRvKEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQog
ICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc3R5bGVTaGVldC0+ZGVsZXRlUnVsZShtX25ld0lkLCBl
Yyk7CisgICAgICAgIGlmICghaXM8U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNldCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIGRvd25jYXN0PFN0eWxlc2hl
ZXRSdWxlU2V0PihtX3J1bGVTZXQuZ2V0KCkpLmRlbGV0ZVJ1bGUobV9uZXdJZCwgZWMpOwogICAg
IH0KIAogICAgIHZpcnR1YWwgYm9vbCByZWRvKEV4Y2VwdGlvbkNvZGUmIGVjKSBvdmVycmlkZQog
ICAgIHsKLSAgICAgICAgQ1NTU3R5bGVSdWxlKiBjc3NTdHlsZVJ1bGUgPSBtX3N0eWxlU2hlZXQt
PmFkZFJ1bGUobV9zZWxlY3RvciwgZWMpOwotICAgICAgICBpZiAoZWMpCisgICAgICAgIGlmICgh
aXM8U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgU3R5bGVzaGVldFJ1bGVTZXQmIHN0eWxlc2hlZXQgPSBkb3duY2FzdDxT
dHlsZXNoZWV0UnVsZVNldD4obV9ydWxlU2V0LmdldCgpKTsKKyAgICAgICAgQ1NTU3R5bGVSdWxl
KiBjc3NTdHlsZVJ1bGUgPSBzdHlsZXNoZWV0LmFkZFJ1bGUobV9zZWxlY3RvciwgZWMpOworICAg
ICAgICBpZiAoZWMgfHwgIWNzc1N0eWxlUnVsZSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgbV9uZXdJZCA9IG1fc3R5bGVTaGVldC0+cnVsZUlkKGNzc1N0eWxlUnVsZSk7Cisg
ICAgICAgIG1fbmV3SWQgPSBzdHlsZXNoZWV0LmlkRm9yU3R5bGUoY3NzU3R5bGVSdWxlLT5zdHls
ZSgpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgSW5zcGVjdG9yQ1NTSWQg
bmV3UnVsZUlkKCkgeyByZXR1cm4gbV9uZXdJZDsgfQorICAgIENTU0lkIG5ld1J1bGVJZCgpIHsg
cmV0dXJuIG1fbmV3SWQ7IH0KIAogcHJpdmF0ZToKLSAgICBJbnNwZWN0b3JDU1NJZCBtX25ld0lk
OworICAgIENTU0lkIG1fbmV3SWQ7CiAgICAgU3RyaW5nIG1fc2VsZWN0b3I7CiAgICAgU3RyaW5n
IG1fb2xkU2VsZWN0b3I7CiB9OwogCi0vLyBzdGF0aWMKLUNTU1N0eWxlUnVsZSogSW5zcGVjdG9y
Q1NTQWdlbnQ6OmFzQ1NTU3R5bGVSdWxlKENTU1J1bGUmIHJ1bGUpCi17Ci0gICAgaWYgKCFpczxD
U1NTdHlsZVJ1bGU+KHJ1bGUpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICByZXR1cm4g
ZG93bmNhc3Q8Q1NTU3R5bGVSdWxlPigmcnVsZSk7Ci19Ci0KIEluc3BlY3RvckNTU0FnZW50OjpJ
bnNwZWN0b3JDU1NBZ2VudChJbnN0cnVtZW50aW5nQWdlbnRzKiBpbnN0cnVtZW50aW5nQWdlbnRz
LCBJbnNwZWN0b3JET01BZ2VudCogZG9tQWdlbnQpCiAgICAgOiBJbnNwZWN0b3JBZ2VudEJhc2Uo
QVNDSUlMaXRlcmFsKCJDU1MiKSwgaW5zdHJ1bWVudGluZ0FnZW50cykKICAgICAsIG1fZG9tQWdl
bnQoZG9tQWdlbnQpCi0gICAgLCBtX2xhc3RTdHlsZVNoZWV0SWQoMSkKIHsKICAgICBtX2RvbUFn
ZW50LT5zZXRET01MaXN0ZW5lcih0aGlzKTsKIH0KQEAgLTM3MywxMCArNDE0LDEwIEBAIHZvaWQg
SW5zcGVjdG9yQ1NTQWdlbnQ6OmRpc2NhcmRBZ2VudCgpCiAKIHZvaWQgSW5zcGVjdG9yQ1NTQWdl
bnQ6OnJlc2V0KCkKIHsKLSAgICBtX2lkVG9JbnNwZWN0b3JTdHlsZVNoZWV0LmNsZWFyKCk7Ci0g
ICAgbV9jc3NTdHlsZVNoZWV0VG9JbnNwZWN0b3JTdHlsZVNoZWV0LmNsZWFyKCk7Ci0gICAgbV9u
b2RlVG9JbnNwZWN0b3JTdHlsZVNoZWV0LmNsZWFyKCk7Ci0gICAgbV9kb2N1bWVudFRvSW5zcGVj
dG9yU3R5bGVTaGVldC5jbGVhcigpOworICAgIG1faWRlbnRpZmllclRvUnVsZVNldE1hcC5jbGVh
cigpOworICAgIG1fY3NzU3R5bGVTaGVldFRvUnVsZVNldE1hcC5jbGVhcigpOworICAgIG1fbm9k
ZVRvSW5saW5lUnVsZVNldE1hcC5jbGVhcigpOworICAgIG1fZG9jdW1lbnRUb0luc3BlY3RvclJ1
bGVTZXRNYXAuY2xlYXIoKTsKICAgICByZXNldE5vblBlcnNpc3RlbnREYXRhKCk7CiB9CiAKQEAg
LTU0Miw5ICs1ODMsMTEgQEAgdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0TWF0Y2hlZFN0eWxl
c0Zvck5vZGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgbm8KICAgICAgICAgICAgICAg
ICAuc2V0TWF0Y2hlZENTU1J1bGVzKGJ1aWxkQXJyYXlGb3JNYXRjaGVkUnVsZUxpc3QocGFyZW50
TWF0Y2hlZFJ1bGVzLCBzdHlsZVJlc29sdmVyLCBwYXJlbnRFbGVtZW50KSkKICAgICAgICAgICAg
ICAgICAucmVsZWFzZSgpOwogICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQtPnN0eWxlKCkg
JiYgcGFyZW50RWxlbWVudC0+c3R5bGUoKS0+bGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBJ
bnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGUqIHN0eWxlU2hlZXQgPSBhc0luc3BlY3Rv
clN0eWxlU2hlZXQocGFyZW50RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlU2hl
ZXQpCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LT5zZXRJbmxpbmVTdHlsZShzdHlsZVNoZWV0
LT5idWlsZE9iamVjdEZvclN0eWxlKHN0eWxlU2hlZXQtPnN0eWxlRm9ySWQoSW5zcGVjdG9yQ1NT
SWQoc3R5bGVTaGVldC0+aWQoKSwgMCkpKSk7CisgICAgICAgICAgICAgICAgaWYgKElubGluZVN0
eWxlUnVsZVNldCogcnVsZVNldCA9IGFzSW5saW5lUnVsZVNldCgqcGFyZW50RWxlbWVudCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgcnVsZVNldC0+d2l0aElubGluZVN0eWxlKFsmXSAoSW5zcGVj
dG9yOjpTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ZW50cnktPnNldElubGluZVN0eWxlKGJ1aWxkT2JqZWN0Rm9yU3R5bGUoc3R5bGUpKTsKKyAgICAg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAg
ICAgICAgICAgICBlbnRyaWVzLT5hZGRJdGVtKFdURjo6bW92ZShlbnRyeSkpOwpAQCAtNTU1LDMw
ICs1OTgsNTcgQEAgdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0TWF0Y2hlZFN0eWxlc0Zvck5v
ZGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgbm8KICAgICB9CiB9CiAKLXZvaWQgSW5z
cGVjdG9yQ1NTQWdlbnQ6OmdldElubGluZVN0eWxlc0Zvck5vZGUoRXJyb3JTdHJpbmcmIGVycm9y
U3RyaW5nLCBpbnQgbm9kZUlkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NT
dHlsZT4mIGlubGluZVN0eWxlLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NT
dHlsZT4mIGF0dHJpYnV0ZXNTdHlsZSkKK3ZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmdldElubGlu
ZVN0eWxlc0Zvck5vZGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgbm9kZUlkLCBSZWZQ
dHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4mIGlubGluZVN0eWxlT2JqZWN0
LCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4mIGF0dHJpYnV0ZXNT
dHlsZU9iamVjdCkKIHsKICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZvcklkKGVycm9y
U3RyaW5nLCBub2RlSWQpOwogICAgIGlmICghZWxlbWVudCkKICAgICAgICAgcmV0dXJuOwogCi0g
ICAgSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlKiBzdHlsZVNoZWV0ID0gYXNJbnNw
ZWN0b3JTdHlsZVNoZWV0KGVsZW1lbnQpOwotICAgIGlmICghc3R5bGVTaGVldCkKLSAgICAgICAg
cmV0dXJuOworICAgIGlmIChJbmxpbmVTdHlsZVJ1bGVTZXQqIHJ1bGVTZXQgPSBhc0lubGluZVJ1
bGVTZXQoKmVsZW1lbnQpKSB7CisgICAgICAgIHJ1bGVTZXQtPndpdGhJbmxpbmVTdHlsZShbJl0g
KEluc3BlY3Rvcjo6U3R5bGVEZWNsYXJhdGlvbiYgc3R5bGUpIHsKKyAgICAgICAgICAgIGlubGlu
ZVN0eWxlT2JqZWN0ID0gYnVpbGRPYmplY3RGb3JTdHlsZShzdHlsZSk7CisgICAgICAgIH0pOwog
Ci0gICAgaW5saW5lU3R5bGUgPSBzdHlsZVNoZWV0LT5idWlsZE9iamVjdEZvclN0eWxlKGVsZW1l
bnQtPnN0eWxlKCkpOwotICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0
eWxlPiBhdHRyaWJ1dGVzID0gYnVpbGRPYmplY3RGb3JBdHRyaWJ1dGVzU3R5bGUoZWxlbWVudCk7
Ci0gICAgYXR0cmlidXRlc1N0eWxlID0gYXR0cmlidXRlcyA/IGF0dHJpYnV0ZXMucmVsZWFzZSgp
IDogbnVsbHB0cjsKKyAgICAgICAgcnVsZVNldC0+d2l0aEF0dHJpYnV0ZVN0eWxlKFsmXSAoSW5z
cGVjdG9yOjpTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSkgeworICAgICAgICAgICAgYXR0cmlidXRl
c1N0eWxlT2JqZWN0ID0gYnVpbGRPYmplY3RGb3JTdHlsZShzdHlsZSk7CisgICAgICAgIH0pOwor
ICAgIH0KIH0KIAotdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0Q29tcHV0ZWRTdHlsZUZvck5v
ZGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBpbnQgbm9kZUlkLCBSZWZQdHI8SW5zcGVjdG9y
OjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0
eWxlUHJvcGVydHk+PiYgc3R5bGUpCitzdHJ1Y3QgQ29sbGVjdENvbXB1dGVkU3R5bGVQcm9wZXJ0
aWVzRnVuY3RvciB7CisgICAgdHlwZWRlZiBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJy
YXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+PiBS
ZXR1cm5UeXBlOworCisgICAgQ29sbGVjdENvbXB1dGVkU3R5bGVQcm9wZXJ0aWVzRnVuY3Rvcigp
CisgICAgOiBtX3Byb3BlcnRpZXNBcnJheShJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT46OmNyZWF0ZSgp
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgU3R5bGVQcm9wZXJ0
eSYgcHJvcGVydHkpCisgICAgeworICAgICAgICBhdXRvIHByb3BlcnR5T2JqZWN0ID0gSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk6OmNyZWF0ZSgpCisg
ICAgICAgIC5zZXROYW1lKHByb3BlcnR5LnByb3BlcnR5TmFtZSgpKQorICAgICAgICAuc2V0VmFs
dWUocHJvcGVydHkucHJvcGVydHlWYWx1ZSgpKQorICAgICAgICAucmVsZWFzZSgpOworCisgICAg
ICAgIG1fcHJvcGVydGllc0FycmF5LT5hZGRJdGVtKFdURjo6bW92ZShwcm9wZXJ0eU9iamVjdCkp
OworICAgIH0KKworICAgIFJldHVyblR5cGUgcmV0dXJuVmFsdWUoKSB7IHJldHVybiBXVEY6Om1v
dmUobV9wcm9wZXJ0aWVzQXJyYXkpOyB9Citwcml2YXRlOgorICAgIFJlZlB0cjxJbnNwZWN0b3I6
OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU0NvbXB1dGVkU3R5
bGVQcm9wZXJ0eT4+IG1fcHJvcGVydGllc0FycmF5OworfTsKKwordm9pZCBJbnNwZWN0b3JDU1NB
Z2VudDo6Z2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBp
bnQgbm9kZUlkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQ
cm90b2NvbDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+PiYgcmVzdWx0KQogewogICAg
IEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVtZW50Rm9ySWQoZXJyb3JTdHJpbmcsIG5vZGVJZCk7CiAg
ICAgaWYgKCFlbGVtZW50KQogICAgICAgICByZXR1cm47CiAKLSAgICBSZWZQdHI8Q1NTQ29tcHV0
ZWRTdHlsZURlY2xhcmF0aW9uPiBjb21wdXRlZFN0eWxlSW5mbyA9IENTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbjo6Y3JlYXRlKGVsZW1lbnQsIHRydWUpOwotICAgIFJlZjxJbnNwZWN0b3JTdHls
ZT4gaW5zcGVjdG9yU3R5bGUgPSBJbnNwZWN0b3JTdHlsZTo6Y3JlYXRlKEluc3BlY3RvckNTU0lk
KCksIGNvbXB1dGVkU3R5bGVJbmZvLCBudWxscHRyKTsKLSAgICBzdHlsZSA9IGluc3BlY3RvclN0
eWxlLT5idWlsZEFycmF5Rm9yQ29tcHV0ZWRTdHlsZSgpOworICAgIFJlZjxDU1NDb21wdXRlZFN0
eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5bGUgPSBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRp
b246OmNyZWF0ZShlbGVtZW50LCB0cnVlKTsKKyAgICBJbnNwZWN0b3I6OlN0eWxlRGVjbGFyYXRp
b24gc3R5bGUoQ1NTSWQoKSwgY29tcHV0ZWRTdHlsZS5nZXQoKSwgbnVsbHB0cik7CisKKyAgICBD
b2xsZWN0Q29tcHV0ZWRTdHlsZVByb3BlcnRpZXNGdW5jdG9yIGNvbGxlY3RDb21wdXRlZFByb3Bl
cnRpZXM7CisgICAgcmVzdWx0ID0gc3R5bGUuZm9yRWFjaFByb3BlcnR5KGNvbGxlY3RDb21wdXRl
ZFByb3BlcnRpZXMpOwogfQogCiB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpnZXRBbGxTdHlsZVNo
ZWV0cyhFcnJvclN0cmluZyYsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRIZWFkZXI+PiYgc3R5bGVJbmZvcykK
QEAgLTU5MCw4NyArNjYwLDEwNSBAQCB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpnZXRBbGxTdHls
ZVNoZWV0cyhFcnJvclN0cmluZyYsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvYwogICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGgoKTsgKytpKSB7CiAgICAgICAgICAg
ICBTdHlsZVNoZWV0JiBzdHlsZVNoZWV0ID0gKmxpc3QuaXRlbShpKTsKICAgICAgICAgICAgIGlm
IChpczxDU1NTdHlsZVNoZWV0PihzdHlsZVNoZWV0KSkKLSAgICAgICAgICAgICAgICBjb2xsZWN0
U3R5bGVTaGVldHMoJmRvd25jYXN0PENTU1N0eWxlU2hlZXQ+KHN0eWxlU2hlZXQpLCBzdHlsZUlu
Zm9zLmdldCgpKTsKKyAgICAgICAgICAgICAgICBjb2xsZWN0U3R5bGVTaGVldHMoZG93bmNhc3Q8
Q1NTU3R5bGVTaGVldD4oc3R5bGVTaGVldCksICpzdHlsZUluZm9zKTsKICAgICAgICAgfQogICAg
IH0KIH0KIAotdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0U3R5bGVTaGVldChFcnJvclN0cmlu
ZyYgZXJyb3JTdHJpbmcsIGNvbnN0IFN0cmluZyYgc3R5bGVTaGVldElkLCBSZWZQdHI8SW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keT4mIHN0eWxlU2hlZXRPYmplY3Qp
Cit2b2lkIEluc3BlY3RvckNTU0FnZW50OjpnZXRTdHlsZVNoZWV0KEVycm9yU3RyaW5nJiBlcnJv
clN0cmluZywgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0SWQgc3R5bGVzaGVl
dElkLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keT4m
IHN0eWxlU2hlZXRPYmplY3QpCiB7Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9y
U3R5bGVTaGVldCA9IGFzc2VydFN0eWxlU2hlZXRGb3JJZChlcnJvclN0cmluZywgc3R5bGVTaGVl
dElkKTsKLSAgICBpZiAoIWluc3BlY3RvclN0eWxlU2hlZXQpCisgICAgU3R5bGVSdWxlU2V0KiBy
dWxlU2V0ID0gcnVsZVNldEZvclN0eWxlc2hlZXRJZChlcnJvclN0cmluZywgc3R5bGVzaGVldElk
KTsKKyAgICBpZiAoIWlzPFN0eWxlc2hlZXRSdWxlU2V0PihydWxlU2V0KSkKICAgICAgICAgcmV0
dXJuOwogCi0gICAgc3R5bGVTaGVldE9iamVjdCA9IGluc3BlY3RvclN0eWxlU2hlZXQtPmJ1aWxk
T2JqZWN0Rm9yU3R5bGVTaGVldCgpOworICAgIHN0eWxlU2hlZXRPYmplY3QgPSBidWlsZE9iamVj
dEZvclN0eWxlU2hlZXQoZG93bmNhc3Q8U3R5bGVzaGVldFJ1bGVTZXQ+KCpydWxlU2V0KSk7CiB9
CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmdldFN0eWxlU2hlZXRUZXh0KEVycm9yU3RyaW5n
JiBlcnJvclN0cmluZywgY29uc3QgU3RyaW5nJiBzdHlsZVNoZWV0SWQsIFN0cmluZyogcmVzdWx0
KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6Z2V0U3R5bGVTaGVldFRleHQoRXJyb3JTdHJpbmcm
IGVycm9yU3RyaW5nLCBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRJZCBzdHls
ZXNoZWV0SWQsIFN0cmluZyogcmVzdWx0KQogewotICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIGlu
c3BlY3RvclN0eWxlU2hlZXQgPSBhc3NlcnRTdHlsZVNoZWV0Rm9ySWQoZXJyb3JTdHJpbmcsIHN0
eWxlU2hlZXRJZCk7Ci0gICAgaWYgKCFpbnNwZWN0b3JTdHlsZVNoZWV0KQorICAgIFN0eWxlUnVs
ZVNldCogcnVsZVNldCA9IHJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoZXJyb3JTdHJpbmcsIHN0eWxl
c2hlZXRJZCk7CisgICAgaWYgKCFpczxTdHlsZXNoZWV0UnVsZVNldD4ocnVsZVNldCkpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIGluc3BlY3RvclN0eWxlU2hlZXQtPmdldFRleHQocmVzdWx0KTsK
KyAgICAqcmVzdWx0ID0gcnVsZVNldC0+Z2V0VGV4dCgpOwogfQogCi12b2lkIEluc3BlY3RvckNT
U0FnZW50OjpzZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0cmluZyYgZXJyb3JTdHJpbmcsIGNvbnN0
IFN0cmluZyYgc3R5bGVTaGVldElkLCBjb25zdCBTdHJpbmcmIHRleHQpCit2b2lkIEluc3BlY3Rv
ckNTU0FnZW50OjpzZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0cmluZyYgZXJyb3JTdHJpbmcsIElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldElkIHN0eWxlc2hlZXRJZCwgY29uc3Qg
U3RyaW5nJiB0ZXh0KQogewotICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIGluc3BlY3RvclN0eWxl
U2hlZXQgPSBhc3NlcnRTdHlsZVNoZWV0Rm9ySWQoZXJyb3JTdHJpbmcsIHN0eWxlU2hlZXRJZCk7
Ci0gICAgaWYgKCFpbnNwZWN0b3JTdHlsZVNoZWV0KQorICAgIFN0eWxlUnVsZVNldCogcnVsZVNl
dCA9IHJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoZXJyb3JTdHJpbmcsIHN0eWxlc2hlZXRJZCk7Cisg
ICAgaWYgKCFydWxlU2V0KQogICAgICAgICByZXR1cm47CiAKICAgICBFeGNlcHRpb25Db2RlIGVj
ID0gMDsKLSAgICBtX2RvbUFnZW50LT5oaXN0b3J5KCktPnBlcmZvcm0oc3RkOjptYWtlX3VuaXF1
ZTxTZXRTdHlsZVNoZWV0VGV4dEFjdGlvbj4oaW5zcGVjdG9yU3R5bGVTaGVldCwgdGV4dCksIGVj
KTsKKyAgICBtX2RvbUFnZW50LT5oaXN0b3J5KCktPnBlcmZvcm0oc3RkOjptYWtlX3VuaXF1ZTxT
ZXRTdHlsZVNoZWV0VGV4dEFjdGlvbj4oKnJ1bGVTZXQsIHRleHQpLCBlYyk7CiAgICAgZXJyb3JT
dHJpbmcgPSBJbnNwZWN0b3JET01BZ2VudDo6dG9FcnJvclN0cmluZyhlYyk7CiB9CiAKLXZvaWQg
SW5zcGVjdG9yQ1NTQWdlbnQ6OnNldFN0eWxlVGV4dChFcnJvclN0cmluZyYgZXJyb3JTdHJpbmcs
IGNvbnN0IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+JiYgZnVsbFN0eWxlSWQsIGNvbnN0IFN0cmlu
ZyYgdGV4dCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+JiByZXN1
bHQpCit2b2lkIEluc3BlY3RvckNTU0FnZW50OjpzZXRTdHlsZVRleHQoRXJyb3JTdHJpbmcmIGVy
cm9yU3RyaW5nLCBjb25zdCBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiYmIHN0eWxlSWRPYmplY3Qs
IGNvbnN0IFN0cmluZyYgdGV4dCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
U3R5bGU+JiByZXN1bHQpCiB7Ci0gICAgSW5zcGVjdG9yQ1NTSWQgY29tcG91bmRJZChmdWxsU3R5
bGVJZC5jb3B5UmVmKCkpOwotICAgIEFTU0VSVCghY29tcG91bmRJZC5pc0VtcHR5KCkpOworICAg
IENTU0lkIHN0eWxlSWQoc3R5bGVJZE9iamVjdC5jb3B5UmVmKCkpOworICAgIEFTU0VSVCghc3R5
bGVJZC5pc0VtcHR5KCkpOwogCi0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9yU3R5
bGVTaGVldCA9IGFzc2VydFN0eWxlU2hlZXRGb3JJZChlcnJvclN0cmluZywgY29tcG91bmRJZC5z
dHlsZVNoZWV0SWQoKSk7Ci0gICAgaWYgKCFpbnNwZWN0b3JTdHlsZVNoZWV0KQorICAgIFN0eWxl
UnVsZVNldCogcnVsZVNldCA9IHJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoZXJyb3JTdHJpbmcsIHN0
eWxlSWQuc3R5bGVzaGVldElkKCkpOworICAgIGlmICghcnVsZVNldCkKICAgICAgICAgcmV0dXJu
OwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgYm9vbCBzdWNjZXNzID0gbV9kb21B
Z2VudC0+aGlzdG9yeSgpLT5wZXJmb3JtKHN0ZDo6bWFrZV91bmlxdWU8U2V0U3R5bGVUZXh0QWN0
aW9uPihpbnNwZWN0b3JTdHlsZVNoZWV0LCBjb21wb3VuZElkLCB0ZXh0KSwgZWMpOwotICAgIGlm
IChzdWNjZXNzKQotICAgICAgICByZXN1bHQgPSBpbnNwZWN0b3JTdHlsZVNoZWV0LT5idWlsZE9i
amVjdEZvclN0eWxlKGluc3BlY3RvclN0eWxlU2hlZXQtPnN0eWxlRm9ySWQoY29tcG91bmRJZCkp
OwotICAgIGVycm9yU3RyaW5nID0gSW5zcGVjdG9yRE9NQWdlbnQ6OnRvRXJyb3JTdHJpbmcoZWMp
OworICAgIGJvb2wgc3VjY2VzcyA9IG1fZG9tQWdlbnQtPmhpc3RvcnkoKS0+cGVyZm9ybShzdGQ6
Om1ha2VfdW5pcXVlPFNldFN0eWxlVGV4dEFjdGlvbj4oKnJ1bGVTZXQsIHN0eWxlSWQsIHRleHQp
LCBlYyk7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGVycm9yU3RyaW5nID0gSW5zcGVj
dG9yRE9NQWdlbnQ6OnRvRXJyb3JTdHJpbmcoZWMpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGlmIChpczxTdHlsZXNoZWV0UnVsZVNldD4ocnVsZVNldCkpIHsKKyAgICAgICAgZG93bmNh
c3Q8U3R5bGVzaGVldFJ1bGVTZXQ+KHJ1bGVTZXQpLT53aXRoU3R5bGVGb3JJZChzdHlsZUlkLCBb
JnJlc3VsdF0gKFN0eWxlRGVjbGFyYXRpb24mIHN0eWxlKSB7CisgICAgICAgICAgICByZXN1bHQg
PSBidWlsZE9iamVjdEZvclN0eWxlKHN0eWxlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAg
aWYgKGlzPElubGluZVN0eWxlUnVsZVNldD4ocnVsZVNldCkpIHsKKyAgICAgICAgZG93bmNhc3Q8
SW5saW5lU3R5bGVSdWxlU2V0PihydWxlU2V0KS0+d2l0aElubGluZVN0eWxlKFsmcmVzdWx0XSAo
U3R5bGVEZWNsYXJhdGlvbiYgc3R5bGUpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1aWxkT2Jq
ZWN0Rm9yU3R5bGUoc3R5bGUpOworICAgICAgICB9KTsKKyAgICB9CiB9CiAKLXZvaWQgSW5zcGVj
dG9yQ1NTQWdlbnQ6OnNldFJ1bGVTZWxlY3RvcihFcnJvclN0cmluZyYgZXJyb3JTdHJpbmcsIGNv
bnN0IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+JiYgZnVsbFJ1bGVJZCwgY29uc3QgU3RyaW5nJiBz
ZWxlY3RvciwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4mIHJlc3Vs
dCkKK3ZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OnNldFJ1bGVTZWxlY3RvcihFcnJvclN0cmluZyYg
ZXJyb3JTdHJpbmcsIGNvbnN0IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+JiYgcnVsZUlkT2JqZWN0
LCBjb25zdCBTdHJpbmcmIHNlbGVjdG9yVGV4dCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTUnVsZT4mIHJlc3VsdCkKIHsKLSAgICBJbnNwZWN0b3JDU1NJZCBjb21wb3VuZElk
KGZ1bGxSdWxlSWQuY29weVJlZigpKTsKLSAgICBBU1NFUlQoIWNvbXBvdW5kSWQuaXNFbXB0eSgp
KTsKKyAgICBDU1NJZCBydWxlSWQocnVsZUlkT2JqZWN0LmNvcHlSZWYoKSk7CisgICAgQVNTRVJU
KCFydWxlSWQuaXNFbXB0eSgpKTsKIAotICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIGluc3BlY3Rv
clN0eWxlU2hlZXQgPSBhc3NlcnRTdHlsZVNoZWV0Rm9ySWQoZXJyb3JTdHJpbmcsIGNvbXBvdW5k
SWQuc3R5bGVTaGVldElkKCkpOwotICAgIGlmICghaW5zcGVjdG9yU3R5bGVTaGVldCkKKyAgICBT
dHlsZVJ1bGVTZXQqIHJ1bGVTZXQgPSBydWxlU2V0Rm9yU3R5bGVzaGVldElkKGVycm9yU3RyaW5n
LCBydWxlSWQuc3R5bGVzaGVldElkKCkpOworICAgIGlmICghaXM8U3R5bGVzaGVldFJ1bGVTZXQ+
KHJ1bGVTZXQpKQogICAgICAgICByZXR1cm47CiAKKyAgICBTdHlsZXNoZWV0UnVsZVNldCYgc3R5
bGVzaGVldCA9IGRvd25jYXN0PFN0eWxlc2hlZXRSdWxlU2V0PigqcnVsZVNldCk7CisKICAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBib29sIHN1Y2Nlc3MgPSBtX2RvbUFnZW50LT5oaXN0
b3J5KCktPnBlcmZvcm0oc3RkOjptYWtlX3VuaXF1ZTxTZXRSdWxlU2VsZWN0b3JBY3Rpb24+KGlu
c3BlY3RvclN0eWxlU2hlZXQsIGNvbXBvdW5kSWQsIHNlbGVjdG9yKSwgZWMpOworICAgIGJvb2wg
c3VjY2VzcyA9IG1fZG9tQWdlbnQtPmhpc3RvcnkoKS0+cGVyZm9ybShzdGQ6Om1ha2VfdW5pcXVl
PFNldFJ1bGVTZWxlY3RvckFjdGlvbj4oc3R5bGVzaGVldCwgcnVsZUlkLCBzZWxlY3RvclRleHQp
LCBlYyk7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGVycm9yU3RyaW5nID0gSW5zcGVj
dG9yRE9NQWdlbnQ6OnRvRXJyb3JTdHJpbmcoZWMpOworICAgICAgICByZXR1cm47CisgICAgfQog
Ci0gICAgaWYgKHN1Y2Nlc3MpCi0gICAgICAgIHJlc3VsdCA9IGluc3BlY3RvclN0eWxlU2hlZXQt
PmJ1aWxkT2JqZWN0Rm9yUnVsZShpbnNwZWN0b3JTdHlsZVNoZWV0LT5ydWxlRm9ySWQoY29tcG91
bmRJZCksIG51bGxwdHIpOwotICAgIGVycm9yU3RyaW5nID0gSW5zcGVjdG9yRE9NQWdlbnQ6OnRv
RXJyb3JTdHJpbmcoZWMpOworICAgIHN0eWxlc2hlZXQud2l0aFJ1bGVGb3JJZChydWxlSWQsIFsm
XSAoSW5zcGVjdG9yOjpTdHlsZVJ1bGUmIHJ1bGUpIHsKKyAgICAgICAgcmVzdWx0ID0gYnVpbGRP
YmplY3RGb3JTdHlsZVJ1bGUocnVsZSwgbnVsbHB0cik7CisgICAgfSk7CiB9CiAKLXZvaWQgSW5z
cGVjdG9yQ1NTQWdlbnQ6OmFkZFJ1bGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBjb25zdCBp
bnQgY29udGV4dE5vZGVJZCwgY29uc3QgU3RyaW5nJiBzZWxlY3RvciwgUmVmUHRyPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4mIHJlc3VsdCkKK3ZvaWQgSW5zcGVjdG9yQ1NTQWdl
bnQ6OmFkZFJ1bGUoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBjb25zdCBpbnQgY29udGV4dE5v
ZGVJZCwgY29uc3QgU3RyaW5nJiBzZWxlY3RvclRleHQsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OkNTU1J1bGU+JiByZXN1bHQpCiB7CiAgICAgTm9kZSogbm9kZSA9IG1fZG9tQWdl
bnQtPmFzc2VydE5vZGUoZXJyb3JTdHJpbmcsIGNvbnRleHROb2RlSWQpOwogICAgIGlmICghbm9k
ZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9y
U3R5bGVTaGVldCA9IHZpYUluc3BlY3RvclN0eWxlU2hlZXQoJm5vZGUtPmRvY3VtZW50KCksIHRy
dWUpOwotICAgIGlmICghaW5zcGVjdG9yU3R5bGVTaGVldCkgeworICAgIFN0eWxlc2hlZXRSdWxl
U2V0KiBzdHlsZXNoZWV0ID0gaW5zcGVjdG9yUnVsZVNldEZvckRvY3VtZW50KG5vZGUtPmRvY3Vt
ZW50KCksIHRydWUpOworICAgIGlmICghc3R5bGVzaGVldCkgewogICAgICAgICBlcnJvclN0cmlu
ZyA9IEFTQ0lJTGl0ZXJhbCgiTm8gdGFyZ2V0IHN0eWxlc2hlZXQgZm91bmQiKTsKICAgICAgICAg
cmV0dXJuOwogICAgIH0KIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGF1dG8gYWN0
aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxBZGRSdWxlQWN0aW9uPihpbnNwZWN0b3JTdHlsZVNoZWV0
LCBzZWxlY3Rvcik7CisgICAgYXV0byBhY3Rpb24gPSBzdGQ6Om1ha2VfdW5pcXVlPEFkZFJ1bGVB
Y3Rpb24+KCpzdHlsZXNoZWV0LCBzZWxlY3RvclRleHQpOwogICAgIEFkZFJ1bGVBY3Rpb24qIHJh
d0FjdGlvbiA9IGFjdGlvbi5nZXQoKTsKICAgICBib29sIHN1Y2Nlc3MgPSBtX2RvbUFnZW50LT5o
aXN0b3J5KCktPnBlcmZvcm0oV1RGOjptb3ZlKGFjdGlvbiksIGVjKTsKICAgICBpZiAoIXN1Y2Nl
c3MpIHsKQEAgLTY3OCw5ICs3NjYsOSBAQCB2b2lkIEluc3BlY3RvckNTU0FnZW50OjphZGRSdWxl
KEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgY29uc3QgaW50IGNvbnRleHROb2RlSQogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgSW5zcGVjdG9yQ1NTSWQgcnVsZUlkID0gcmF3QWN0aW9u
LT5uZXdSdWxlSWQoKTsKLSAgICBDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBpbnNwZWN0b3JTdHlsZVNo
ZWV0LT5ydWxlRm9ySWQocnVsZUlkKTsKLSAgICByZXN1bHQgPSBpbnNwZWN0b3JTdHlsZVNoZWV0
LT5idWlsZE9iamVjdEZvclJ1bGUocnVsZSwgbnVsbHB0cik7CisgICAgc3R5bGVzaGVldC0+d2l0
aFJ1bGVGb3JJZChyYXdBY3Rpb24tPm5ld1J1bGVJZCgpLCBbJl0gKEluc3BlY3Rvcjo6U3R5bGVS
dWxlJiBydWxlKSB7CisgICAgICAgIHJlc3VsdCA9IGJ1aWxkT2JqZWN0Rm9yU3R5bGVSdWxlKHJ1
bGUsIG51bGxwdHIpOworICAgIH0pOwogfQogCiB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpnZXRT
dXBwb3J0ZWRDU1NQcm9wZXJ0aWVzKEVycm9yU3RyaW5nJiwgUmVmUHRyPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlJbmZvPj4m
IGNzc1Byb3BlcnRpZXMpCkBAIC03NDUsMjIgKzgzMywxOSBAQCB2b2lkIEluc3BlY3RvckNTU0Fn
ZW50OjpnZXROYW1lZEZsb3dDb2xsZWN0aW9uKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgaW50
IGRvYwogICAgIHJlc3VsdCA9IFdURjo6bW92ZShuYW1lZEZsb3dzKTsKIH0KIAotSW5zcGVjdG9y
U3R5bGVTaGVldEZvcklubGluZVN0eWxlKiBJbnNwZWN0b3JDU1NBZ2VudDo6YXNJbnNwZWN0b3JT
dHlsZVNoZWV0KEVsZW1lbnQqIGVsZW1lbnQpCitJbmxpbmVTdHlsZVJ1bGVTZXQqIEluc3BlY3Rv
ckNTU0FnZW50Ojphc0lubGluZVJ1bGVTZXQoRWxlbWVudCYgZWxlbWVudCkKIHsKLSAgICBOb2Rl
VG9JbnNwZWN0b3JTdHlsZVNoZWV0OjppdGVyYXRvciBpdCA9IG1fbm9kZVRvSW5zcGVjdG9yU3R5
bGVTaGVldC5maW5kKGVsZW1lbnQpOwotICAgIGlmIChpdCA9PSBtX25vZGVUb0luc3BlY3RvclN0
eWxlU2hlZXQuZW5kKCkpIHsKLSAgICAgICAgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUgPSBl
bGVtZW50LT5pc1N0eWxlZEVsZW1lbnQoKSA/IGVsZW1lbnQtPnN0eWxlKCkgOiBudWxscHRyOwot
ICAgICAgICBpZiAoIXN0eWxlKQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgYXV0
byBmaW5kUmVzdWx0ID0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFwLmZpbmQoJmVsZW1lbnQpOwor
ICAgIGlmIChmaW5kUmVzdWx0ICE9IG1fbm9kZVRvSW5saW5lUnVsZVNldE1hcC5lbmQoKSkKKyAg
ICAgICAgcmV0dXJuIGZpbmRSZXN1bHQtPnZhbHVlLmdldCgpOwogCi0gICAgICAgIFN0cmluZyBu
ZXdTdHlsZVNoZWV0SWQgPSBTdHJpbmc6Om51bWJlcihtX2xhc3RTdHlsZVNoZWV0SWQrKyk7Ci0g
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU+IGluc3BlY3Rv
clN0eWxlU2hlZXQgPSBJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU6OmNyZWF0ZSht
X2RvbUFnZW50LT5wYWdlQWdlbnQoKSwgbmV3U3R5bGVTaGVldElkLCBlbGVtZW50LCBJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlJlZ3VsYXIsIHRoaXMpOwotICAg
ICAgICBtX2lkVG9JbnNwZWN0b3JTdHlsZVNoZWV0LnNldChuZXdTdHlsZVNoZWV0SWQsIGluc3Bl
Y3RvclN0eWxlU2hlZXQpOwotICAgICAgICBtX25vZGVUb0luc3BlY3RvclN0eWxlU2hlZXQuc2V0
KGVsZW1lbnQsIGluc3BlY3RvclN0eWxlU2hlZXQpOwotICAgICAgICByZXR1cm4gaW5zcGVjdG9y
U3R5bGVTaGVldC5nZXQoKTsKLSAgICB9CisgICAgaWYgKCFlbGVtZW50LmlzU3R5bGVkRWxlbWVu
dCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIHJldHVybiBpdC0+dmFsdWUuZ2V0
KCk7CisgICAgUmVmUHRyPElubGluZVN0eWxlUnVsZVNldD4gaW5saW5lU3R5bGUgPSBJbmxpbmVT
dHlsZVJ1bGVTZXQ6OmNyZWF0ZShlbGVtZW50KTsKKyAgICBtX2lkZW50aWZpZXJUb1J1bGVTZXRN
YXAuc2V0KGlubGluZVN0eWxlLT5pZGVudGlmaWVyKCksIGlubGluZVN0eWxlKTsKKyAgICBtX25v
ZGVUb0lubGluZVJ1bGVTZXRNYXAuc2V0KCZlbGVtZW50LCBpbmxpbmVTdHlsZSk7CisgICAgcmV0
dXJuIGlubGluZVN0eWxlLmdldCgpOwogfQogCiBFbGVtZW50KiBJbnNwZWN0b3JDU1NBZ2VudDo6
ZWxlbWVudEZvcklkKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgaW50IG5vZGVJZCkKQEAgLTc4
NiwxMzAgKzg3MSw0MzcgQEAgaW50IEluc3BlY3RvckNTU0FnZW50Ojpkb2N1bWVudE5vZGVXaXRo
UmVxdWVzdGVkRmxvd3NJZChEb2N1bWVudCogZG9jdW1lbnQpCiAgICAgcmV0dXJuIGRvY3VtZW50
Tm9kZUlkOwogfQogCi12b2lkIEluc3BlY3RvckNTU0FnZW50Ojpjb2xsZWN0U3R5bGVTaGVldHMo
Q1NTU3R5bGVTaGVldCogc3R5bGVTaGVldCwgSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5z
cGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0SGVhZGVyPiogcmVzdWx0KQorc3Rh
dGljIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRIZWFkZXI+IGJ1
aWxkT2JqZWN0Rm9yU3R5bGVTaGVldEluZm8oU3R5bGVzaGVldFJ1bGVTZXQmIHN0eWxlc2hlZXQp
CiB7Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogaW5zcGVjdG9yU3R5bGVTaGVldCA9IGJpbmRT
dHlsZVNoZWV0KHN0eWxlU2hlZXQpOwotICAgIHJlc3VsdC0+YWRkSXRlbShpbnNwZWN0b3JTdHls
ZVNoZWV0LT5idWlsZE9iamVjdEZvclN0eWxlU2hlZXRJbmZvKCkpOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDAsIHNpemUgPSBzdHlsZVNoZWV0LT5sZW5ndGgoKTsgaSA8IHNpemU7ICsraSkgewot
ICAgICAgICBDU1NSdWxlKiBydWxlID0gc3R5bGVTaGVldC0+aXRlbShpKTsKLSAgICAgICAgaWYg
KGlzPENTU0ltcG9ydFJ1bGU+KCpydWxlKSkgewotICAgICAgICAgICAgaWYgKENTU1N0eWxlU2hl
ZXQqIGltcG9ydGVkU3R5bGVTaGVldCA9IGRvd25jYXN0PENTU0ltcG9ydFJ1bGU+KCpydWxlKS5z
dHlsZVNoZWV0KCkpCi0gICAgICAgICAgICAgICAgY29sbGVjdFN0eWxlU2hlZXRzKGltcG9ydGVk
U3R5bGVTaGVldCwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KKyAgICBTdHJpbmcgZnJhbWVJ
ZCA9IEFTQ0lJTGl0ZXJhbCgiKFVua25vd24pIik7CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0g
c3R5bGVzaGVldC5vd25lckRvY3VtZW50KCk7CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQg
PyBkb2N1bWVudC0+ZnJhbWUoKSA6IG51bGxwdHI7CisgICAgaWYgKEluc3RydW1lbnRpbmdBZ2Vu
dHMqIGluc3RydW1lbnRpbmdBZ2VudHMgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246Omluc3Ry
dW1lbnRpbmdBZ2VudHNGb3JGcmFtZShmcmFtZSkpCisgICAgICAgIGlmIChJbnNwZWN0b3JQYWdl
QWdlbnQqIHBhZ2VBZ2VudCA9IGluc3RydW1lbnRpbmdBZ2VudHMtPmluc3BlY3RvclBhZ2VBZ2Vu
dCgpKQorICAgICAgICAgICAgZnJhbWVJZCA9IHBhZ2VBZ2VudC0+ZnJhbWVJZChmcmFtZSk7CisK
KyAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0SGVhZGVy
OjpjcmVhdGUoKQorICAgICAgICAuc2V0U3R5bGVTaGVldElkKHN0eWxlc2hlZXQuaWRlbnRpZmll
cigpKQorICAgICAgICAuc2V0T3JpZ2luKHN0eWxlc2hlZXRPcmlnaW5Ub1Byb3RvY29sRW51bShz
dHlsZXNoZWV0Lm9yaWdpbigpKSkKKyAgICAgICAgLnNldERpc2FibGVkKCFzdHlsZXNoZWV0Lmlz
RW5hYmxlZCgpKQorICAgICAgICAuc2V0U291cmNlVVJMKHN0eWxlc2hlZXQuZmluYWxVUkwoKSkK
KyAgICAgICAgLnNldFRpdGxlKHN0eWxlc2hlZXQudGl0bGUoKSkKKyAgICAgICAgLnNldEZyYW1l
SWQoZnJhbWVJZCkKKyAgICAgICAgLnJlbGVhc2UoKTsKIH0KIAotSW5zcGVjdG9yU3R5bGVTaGVl
dCogSW5zcGVjdG9yQ1NTQWdlbnQ6OmJpbmRTdHlsZVNoZWV0KENTU1N0eWxlU2hlZXQqIHN0eWxl
U2hlZXQpCit2b2lkIEluc3BlY3RvckNTU0FnZW50Ojpjb2xsZWN0U3R5bGVTaGVldHMoQ1NTU3R5
bGVTaGVldCYgc3R5bGVzaGVldCwgSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0SGVhZGVyPiYgcmVzdWx0KQogewotICAgIFJl
ZlB0cjxJbnNwZWN0b3JTdHlsZVNoZWV0PiBpbnNwZWN0b3JTdHlsZVNoZWV0ID0gbV9jc3NTdHls
ZVNoZWV0VG9JbnNwZWN0b3JTdHlsZVNoZWV0LmdldChzdHlsZVNoZWV0KTsKLSAgICBpZiAoIWlu
c3BlY3RvclN0eWxlU2hlZXQpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gU3RyaW5nOjpudW1iZXIo
bV9sYXN0U3R5bGVTaGVldElkKyspOwotICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBzdHls
ZVNoZWV0LT5vd25lckRvY3VtZW50KCk7Ci0gICAgICAgIGluc3BlY3RvclN0eWxlU2hlZXQgPSBJ
bnNwZWN0b3JTdHlsZVNoZWV0OjpjcmVhdGUobV9kb21BZ2VudC0+cGFnZUFnZW50KCksIGlkLCBz
dHlsZVNoZWV0LCBkZXRlY3RPcmlnaW4oc3R5bGVTaGVldCwgZG9jdW1lbnQpLCBJbnNwZWN0b3JE
T01BZ2VudDo6ZG9jdW1lbnRVUkxTdHJpbmcoZG9jdW1lbnQpLCB0aGlzKTsKLSAgICAgICAgbV9p
ZFRvSW5zcGVjdG9yU3R5bGVTaGVldC5zZXQoaWQsIGluc3BlY3RvclN0eWxlU2hlZXQpOwotICAg
ICAgICBtX2Nzc1N0eWxlU2hlZXRUb0luc3BlY3RvclN0eWxlU2hlZXQuc2V0KHN0eWxlU2hlZXQs
IGluc3BlY3RvclN0eWxlU2hlZXQpOworICAgIFN0eWxlc2hlZXRSdWxlU2V0JiBydWxlU2V0ID0g
YmluZFN0eWxlU2hlZXQoc3R5bGVzaGVldCk7CisgICAgcmVzdWx0LmFkZEl0ZW0oYnVpbGRPYmpl
Y3RGb3JTdHlsZVNoZWV0SW5mbyhydWxlU2V0KSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
LCBzaXplID0gc3R5bGVzaGVldC5sZW5ndGgoKTsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBD
U1NSdWxlKiBydWxlID0gc3R5bGVzaGVldC5pdGVtKGkpOworICAgICAgICBpZiAoIWlzPENTU0lt
cG9ydFJ1bGU+KHJ1bGUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKENT
U1N0eWxlU2hlZXQqIGltcG9ydGVkU3R5bGVzaGVldCA9IGRvd25jYXN0PENTU0ltcG9ydFJ1bGU+
KCpydWxlKS5zdHlsZVNoZWV0KCkpCisgICAgICAgICAgICBjb2xsZWN0U3R5bGVTaGVldHMoKmlt
cG9ydGVkU3R5bGVzaGVldCwgcmVzdWx0KTsKICAgICB9Ci0gICAgcmV0dXJuIGluc3BlY3RvclN0
eWxlU2hlZXQuZ2V0KCk7CiB9CiAKLUluc3BlY3RvclN0eWxlU2hlZXQqIEluc3BlY3RvckNTU0Fn
ZW50Ojp2aWFJbnNwZWN0b3JTdHlsZVNoZWV0KERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBjcmVh
dGVJZkFic2VudCkKK1N0eWxlc2hlZXRSdWxlU2V0JiBJbnNwZWN0b3JDU1NBZ2VudDo6YmluZFN0
eWxlU2hlZXQoQ1NTU3R5bGVTaGVldCYgc3R5bGVzaGVldCkKIHsKLSAgICBpZiAoIWRvY3VtZW50
KSB7Ci0gICAgICAgIEFTU0VSVCghY3JlYXRlSWZBYnNlbnQpOwotICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLSAgICB9CisgICAgYXV0byBmaW5kUmVzdWx0ID0gbV9jc3NTdHlsZVNoZWV0VG9SdWxl
U2V0TWFwLmZpbmQoJnN0eWxlc2hlZXQpOworICAgIGlmIChmaW5kUmVzdWx0ICE9IG1fY3NzU3R5
bGVTaGVldFRvUnVsZVNldE1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuICpmaW5kUmVzdWx0LT52
YWx1ZTsKKworICAgIFN0eWxlU2hlZXRPcmlnaW4gb3JpZ2luID0gU3R5bGVTaGVldE9yaWdpbjo6
QXV0aG9yOworICAgIE5vZGUqIG93bmVyTm9kZSA9IHN0eWxlc2hlZXQub3duZXJOb2RlKCk7Cisg
ICAgaWYgKCFvd25lck5vZGUgJiYgc3R5bGVzaGVldC5ocmVmKCkuaXNFbXB0eSgpKQorICAgICAg
ICBvcmlnaW4gPSBTdHlsZVNoZWV0T3JpZ2luOjpVc2VyQWdlbnQ7CiAKLSAgICBpZiAoIWRvY3Vt
ZW50LT5pc0hUTUxEb2N1bWVudCgpICYmICFkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpKQorICAg
IGlmIChvd25lck5vZGUgJiYgb3duZXJOb2RlLT5ub2RlTmFtZSgpID09ICIjZG9jdW1lbnQiKQor
ICAgICAgICBvcmlnaW4gPSBTdHlsZVNoZWV0T3JpZ2luOjpVc2VyOworCisgICAgUmVmUHRyPFN0
eWxlc2hlZXRSdWxlU2V0PiBydWxlU2V0ID0gU3R5bGVzaGVldFJ1bGVTZXQ6OmNyZWF0ZShzdHls
ZXNoZWV0LCBvcmlnaW4sIEluc3BlY3RvckRPTUFnZW50Ojpkb2N1bWVudFVSTFN0cmluZyhzdHls
ZXNoZWV0Lm93bmVyRG9jdW1lbnQoKSksIHRoaXMpOworICAgIG1faWRlbnRpZmllclRvUnVsZVNl
dE1hcC5zZXQocnVsZVNldC0+aWRlbnRpZmllcigpLCBydWxlU2V0KTsKKyAgICBtX2Nzc1N0eWxl
U2hlZXRUb1J1bGVTZXRNYXAuc2V0KCZzdHlsZXNoZWV0LCBydWxlU2V0KTsKKworICAgIHJldHVy
biAqcnVsZVNldDsKK30KKworU3R5bGVzaGVldFJ1bGVTZXQqIEluc3BlY3RvckNTU0FnZW50Ojpp
bnNwZWN0b3JSdWxlU2V0Rm9yRG9jdW1lbnQoRG9jdW1lbnQmIGRvY3VtZW50LCBib29sIGNyZWF0
ZUlmQWJzZW50KQoreworICAgIGlmICghZG9jdW1lbnQuaXNIVE1MRG9jdW1lbnQoKSAmJiAhZG9j
dW1lbnQuaXNTVkdEb2N1bWVudCgpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIFJl
ZlB0cjxJbnNwZWN0b3JTdHlsZVNoZWV0PiBpbnNwZWN0b3JTdHlsZVNoZWV0ID0gbV9kb2N1bWVu
dFRvSW5zcGVjdG9yU3R5bGVTaGVldC5nZXQoZG9jdW1lbnQpOwotICAgIGlmIChpbnNwZWN0b3JT
dHlsZVNoZWV0IHx8ICFjcmVhdGVJZkFic2VudCkKLSAgICAgICAgcmV0dXJuIGluc3BlY3RvclN0
eWxlU2hlZXQuZ2V0KCk7CisgICAgUmVmUHRyPFN0eWxlc2hlZXRSdWxlU2V0PiBydWxlU2V0ID0g
bV9kb2N1bWVudFRvSW5zcGVjdG9yUnVsZVNldE1hcC5nZXQoJmRvY3VtZW50KTsKKyAgICBpZiAo
cnVsZVNldCB8fCAhY3JlYXRlSWZBYnNlbnQpCisgICAgICAgIHJldHVybiBydWxlU2V0LmdldCgp
OwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgUmVmUHRyPEVsZW1lbnQ+IHN0eWxl
RWxlbWVudCA9IGRvY3VtZW50LT5jcmVhdGVFbGVtZW50KCJzdHlsZSIsIGVjKTsKKyAgICBSZWZQ
dHI8RWxlbWVudD4gc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUi
LCBlYyk7CiAgICAgaWYgKCFlYykKICAgICAgICAgc3R5bGVFbGVtZW50LT5zZXRBdHRyaWJ1dGUo
InR5cGUiLCAidGV4dC9jc3MiLCBlYyk7CiAgICAgaWYgKCFlYykgewogICAgICAgICBDb250YWlu
ZXJOb2RlKiB0YXJnZXROb2RlOwogICAgICAgICAvLyBIRUFEIGlzIGFic2VudCBpbiBJbWFnZURv
Y3VtZW50cywgZm9yIGV4YW1wbGUuCi0gICAgICAgIGlmIChhdXRvKiBoZWFkID0gZG9jdW1lbnQt
PmhlYWQoKSkKKyAgICAgICAgaWYgKGF1dG8qIGhlYWQgPSBkb2N1bWVudC5oZWFkKCkpCiAgICAg
ICAgICAgICB0YXJnZXROb2RlID0gaGVhZDsKLSAgICAgICAgZWxzZSBpZiAoYXV0byogYm9keSA9
IGRvY3VtZW50LT5ib2R5T3JGcmFtZXNldCgpKQorICAgICAgICBlbHNlIGlmIChhdXRvKiBib2R5
ID0gZG9jdW1lbnQuYm9keU9yRnJhbWVzZXQoKSkKICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBi
b2R5OwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgICAg
ICBJbmxpbmVTdHlsZU92ZXJyaWRlU2NvcGUgb3ZlcnJpZGVTY29wZShkb2N1bWVudCk7CisgICAg
ICAgIElubGluZVN0eWxlT3ZlcnJpZGVTY29wZSBvdmVycmlkZVNjb3BlKCZkb2N1bWVudCk7CiAg
ICAgICAgIHRhcmdldE5vZGUtPmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCwgZWMpOwogICAgIH0K
ICAgICBpZiAoZWMpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgQ1NTU3R5bGVTaGVl
dCogY3NzU3R5bGVTaGVldCA9IG51bGxwdHI7CisgICAgQ1NTU3R5bGVTaGVldCogc3R5bGVzaGVl
dCA9IG51bGxwdHI7CiAgICAgaWYgKHN0eWxlRWxlbWVudC0+aXNIVE1MRWxlbWVudCgpKQotICAg
ICAgICBjc3NTdHlsZVNoZWV0ID0gZG93bmNhc3Q8SFRNTFN0eWxlRWxlbWVudD4oKnN0eWxlRWxl
bWVudCkuc2hlZXQoKTsKKyAgICAgICAgc3R5bGVzaGVldCA9IGRvd25jYXN0PEhUTUxTdHlsZUVs
ZW1lbnQ+KCpzdHlsZUVsZW1lbnQpLnNoZWV0KCk7CiAgICAgZWxzZSBpZiAoc3R5bGVFbGVtZW50
LT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgY3NzU3R5bGVTaGVldCA9IGRvd25jYXN0PFNWR1N0
eWxlRWxlbWVudD4oKnN0eWxlRWxlbWVudCkuc2hlZXQoKTsKKyAgICAgICAgc3R5bGVzaGVldCA9
IGRvd25jYXN0PFNWR1N0eWxlRWxlbWVudD4oKnN0eWxlRWxlbWVudCkuc2hlZXQoKTsKIAotICAg
IGlmICghY3NzU3R5bGVTaGVldCkKKyAgICBpZiAoIXN0eWxlc2hlZXQpCiAgICAgICAgIHJldHVy
biBudWxscHRyOwogCi0gICAgU3RyaW5nIGlkID0gU3RyaW5nOjpudW1iZXIobV9sYXN0U3R5bGVT
aGVldElkKyspOwotICAgIGluc3BlY3RvclN0eWxlU2hlZXQgPSBJbnNwZWN0b3JTdHlsZVNoZWV0
OjpjcmVhdGUobV9kb21BZ2VudC0+cGFnZUFnZW50KCksIGlkLCBjc3NTdHlsZVNoZWV0LCBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46Okluc3BlY3RvciwgSW5zcGVj
dG9yRE9NQWdlbnQ6OmRvY3VtZW50VVJMU3RyaW5nKGRvY3VtZW50KSwgdGhpcyk7Ci0gICAgbV9p
ZFRvSW5zcGVjdG9yU3R5bGVTaGVldC5zZXQoaWQsIGluc3BlY3RvclN0eWxlU2hlZXQpOwotICAg
IG1fY3NzU3R5bGVTaGVldFRvSW5zcGVjdG9yU3R5bGVTaGVldC5zZXQoY3NzU3R5bGVTaGVldCwg
aW5zcGVjdG9yU3R5bGVTaGVldCk7Ci0gICAgbV9kb2N1bWVudFRvSW5zcGVjdG9yU3R5bGVTaGVl
dC5zZXQoZG9jdW1lbnQsIGluc3BlY3RvclN0eWxlU2hlZXQpOwotICAgIHJldHVybiBpbnNwZWN0
b3JTdHlsZVNoZWV0LmdldCgpOworICAgIFJlZlB0cjxTdHlsZXNoZWV0UnVsZVNldD4gbmV3UnVs
ZVNldCA9IFN0eWxlc2hlZXRSdWxlU2V0OjpjcmVhdGUoKnN0eWxlc2hlZXQsIFN0eWxlU2hlZXRP
cmlnaW46Okluc3BlY3RvciwgSW5zcGVjdG9yRE9NQWdlbnQ6OmRvY3VtZW50VVJMU3RyaW5nKCZk
b2N1bWVudCksIHRoaXMpOworICAgIG1faWRlbnRpZmllclRvUnVsZVNldE1hcC5zZXQobmV3UnVs
ZVNldC0+aWRlbnRpZmllcigpLCBuZXdSdWxlU2V0KTsKKyAgICBtX2Nzc1N0eWxlU2hlZXRUb1J1
bGVTZXRNYXAuc2V0KHN0eWxlc2hlZXQsIG5ld1J1bGVTZXQpOworICAgIG1fZG9jdW1lbnRUb0lu
c3BlY3RvclJ1bGVTZXRNYXAuc2V0KCZkb2N1bWVudCwgbmV3UnVsZVNldCk7CisgICAgcmV0dXJu
IG5ld1J1bGVTZXQuZ2V0KCk7CiB9CiAKLUluc3BlY3RvclN0eWxlU2hlZXQqIEluc3BlY3RvckNT
U0FnZW50Ojphc3NlcnRTdHlsZVNoZWV0Rm9ySWQoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBj
b25zdCBTdHJpbmcmIHN0eWxlU2hlZXRJZCkKK1N0eWxlUnVsZVNldCogSW5zcGVjdG9yQ1NTQWdl
bnQ6OnJ1bGVTZXRGb3JTdHlsZXNoZWV0SWQoRXJyb3JTdHJpbmcmIGVycm9yU3RyaW5nLCBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRJZCBzdHlsZXNoZWV0SWQpCiB7Ci0gICAg
SWRUb0luc3BlY3RvclN0eWxlU2hlZXQ6Oml0ZXJhdG9yIGl0ID0gbV9pZFRvSW5zcGVjdG9yU3R5
bGVTaGVldC5maW5kKHN0eWxlU2hlZXRJZCk7Ci0gICAgaWYgKGl0ID09IG1faWRUb0luc3BlY3Rv
clN0eWxlU2hlZXQuZW5kKCkpIHsKLSAgICAgICAgZXJyb3JTdHJpbmcgPSBBU0NJSUxpdGVyYWwo
Ik5vIHN0eWxlIHNoZWV0IHdpdGggZ2l2ZW4gaWQgZm91bmQiKTsKKyAgICBpZiAoc3R5bGVzaGVl
dElkIDw9IDApIHsKKyAgICAgICAgZXJyb3JTdHJpbmcgPSBBU0NJSUxpdGVyYWwoIkludmFsaWQg
aWRlbmlmaWVyIGZvciBzdHlsZXNoZWV0LiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAg
ICB9CisKKyAgICB1aW50NjRfdCBrZXkgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3R5bGVzaGVl
dElkKTsKKyAgICBhdXRvIGZpbmRSZXN1bHQgPSBtX2lkZW50aWZpZXJUb1J1bGVTZXRNYXAuZmlu
ZChrZXkpOworICAgIGlmIChmaW5kUmVzdWx0ID09IG1faWRlbnRpZmllclRvUnVsZVNldE1hcC5l
bmQoKSkgeworICAgICAgICBlcnJvclN0cmluZyA9IEFTQ0lJTGl0ZXJhbCgiTm8gc3R5bGVzaGVl
dCB3aXRoIGdpdmVuIGlkIGZvdW5kIik7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0K
LSAgICByZXR1cm4gaXQtPnZhbHVlLmdldCgpOworICAgIHJldHVybiBmaW5kUmVzdWx0LT52YWx1
ZS5nZXQoKTsKIH0KIAotSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2lu
IEluc3BlY3RvckNTU0FnZW50OjpkZXRlY3RPcmlnaW4oQ1NTU3R5bGVTaGVldCogcGFnZVN0eWxl
U2hlZXQsIERvY3VtZW50KiBvd25lckRvY3VtZW50KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6
ZGlkUmVtb3ZlRG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50KQogewotICAgIGF1dG8gb3JpZ2lu
ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luOjpSZWd1bGFyOwot
ICAgIGlmIChwYWdlU3R5bGVTaGVldCAmJiAhcGFnZVN0eWxlU2hlZXQtPm93bmVyTm9kZSgpICYm
IHBhZ2VTdHlsZVNoZWV0LT5ocmVmKCkuaXNFbXB0eSgpKQotICAgICAgICBvcmlnaW4gPSBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlVzZXJBZ2VudDsKLSAgICBl
bHNlIGlmIChwYWdlU3R5bGVTaGVldCAmJiBwYWdlU3R5bGVTaGVldC0+b3duZXJOb2RlKCkgJiYg
cGFnZVN0eWxlU2hlZXQtPm93bmVyTm9kZSgpLT5ub2RlTmFtZSgpID09ICIjZG9jdW1lbnQiKQot
ICAgICAgICBvcmlnaW4gPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmln
aW46OlVzZXI7Ci0gICAgZWxzZSB7Ci0gICAgICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIHZpYUlu
c3BlY3RvclN0eWxlU2hlZXRGb3JPd25lciA9IHZpYUluc3BlY3RvclN0eWxlU2hlZXQob3duZXJE
b2N1bWVudCwgZmFsc2UpOwotICAgICAgICBpZiAodmlhSW5zcGVjdG9yU3R5bGVTaGVldEZvck93
bmVyICYmIHBhZ2VTdHlsZVNoZWV0ID09IHZpYUluc3BlY3RvclN0eWxlU2hlZXRGb3JPd25lci0+
cGFnZVN0eWxlU2hlZXQoKSkKLSAgICAgICAgICAgIG9yaWdpbiA9IEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6U3R5bGVTaGVldE9yaWdpbjo6SW5zcGVjdG9yOworICAgIGlmIChkb2N1bWVudCkK
KyAgICAgICAgbV9kb2N1bWVudFRvSW5zcGVjdG9yUnVsZVNldE1hcC5yZW1vdmUoZG9jdW1lbnQp
OworfQorCit2b2lkIEluc3BlY3RvckNTU0FnZW50OjpkaWRSZW1vdmVET01Ob2RlKE5vZGUqIG5v
ZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgbm9kZUlk
ID0gbV9kb21BZ2VudC0+Ym91bmROb2RlSWQobm9kZSk7CisgICAgaWYgKG5vZGVJZCkKKyAgICAg
ICAgbV9ub2RlSWRUb0ZvcmNlZFBzZXVkb1N0YXRlLnJlbW92ZShub2RlSWQpOworCisgICAgUmVm
UHRyPElubGluZVN0eWxlUnVsZVNldD4gZm91bmRSdWxlU2V0ID0gbV9ub2RlVG9JbmxpbmVSdWxl
U2V0TWFwLnRha2Uobm9kZSk7CisgICAgaWYgKCFmb3VuZFJ1bGVTZXQpCisgICAgICAgIHJldHVy
bjsKKyAgICBtX2lkZW50aWZpZXJUb1J1bGVTZXRNYXAucmVtb3ZlKGZvdW5kUnVsZVNldC0+aWRl
bnRpZmllcigpKTsKK30KKwordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6ZGlkTW9kaWZ5RE9NQXR0
cihFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmICghZWxlbWVudCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYXV0byBmaW5kUmVzdWx0ID0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFwLmZpbmQo
ZWxlbWVudCk7CisgICAgaWYgKGZpbmRSZXN1bHQgPT0gbV9ub2RlVG9JbmxpbmVSdWxlU2V0TWFw
LmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmaW5kUmVzdWx0LT52YWx1ZS0+ZGlkTW9k
aWZ5RWxlbWVudEF0dHJpYnV0ZSgpOworfQorCit2b2lkIEluc3BlY3RvckNTU0FnZW50OjpzdHls
ZVNoZWV0Q2hhbmdlZChTdHlsZXNoZWV0UnVsZVNldCYgc3R5bGVzaGVldCkKK3sKKyAgICBpZiAo
bV9mcm9udGVuZERpc3BhdGNoZXIpCisgICAgICAgIG1fZnJvbnRlbmREaXNwYXRjaGVyLT5zdHls
ZVNoZWV0Q2hhbmdlZChzdHlsZXNoZWV0LmlkZW50aWZpZXIoKSk7Cit9CisKK3ZvaWQgSW5zcGVj
dG9yQ1NTQWdlbnQ6OnJlc2V0UHNldWRvU3RhdGVzKCkKK3sKKyAgICBIYXNoU2V0PERvY3VtZW50
Kj4gZG9jdW1lbnRzVG9DaGFuZ2U7CisgICAgZm9yIChhdXRvJiBub2RlSWQgOiBtX25vZGVJZFRv
Rm9yY2VkUHNldWRvU3RhdGUua2V5cygpKSB7CisgICAgICAgIE5vZGUqIG5vZGUgPSBtX2RvbUFn
ZW50LT5ub2RlRm9ySWQobm9kZUlkKTsKKyAgICAgICAgaWYgKGlzPEVsZW1lbnQ+KG5vZGUpKQor
ICAgICAgICAgICAgZG9jdW1lbnRzVG9DaGFuZ2UuYWRkKCZkb3duY2FzdDxFbGVtZW50Pihub2Rl
KS0+ZG9jdW1lbnQoKSk7CiAgICAgfQotICAgIHJldHVybiBvcmlnaW47CisKKyAgICBtX25vZGVJ
ZFRvRm9yY2VkUHNldWRvU3RhdGUuY2xlYXIoKTsKKyAgICBmb3IgKERvY3VtZW50KiBkb2N1bWVu
dCA6IGRvY3VtZW50c1RvQ2hhbmdlKQorICAgICAgICBkb2N1bWVudC0+c3R5bGVSZXNvbHZlckNo
YW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CiB9CiAKLVJlZlB0cjxJbnNwZWN0b3I6OlBy
b3RvY29sOjpDU1M6OkNTU1J1bGU+IEluc3BlY3RvckNTU0FnZW50OjpidWlsZE9iamVjdEZvclJ1
bGUoU3R5bGVSdWxlKiBzdHlsZVJ1bGUsIFN0eWxlUmVzb2x2ZXImIHN0eWxlUmVzb2x2ZXIsIEVs
ZW1lbnQqIGVsZW1lbnQpCisvLyBDb2RlIGZvciB0cmFuc2xhdGluZyBiZXR3ZWVuIGluc3BlY3Rv
ciBDU1Mgd3JhcHBlcnMgYW5kIGluc3BlY3RvciBwcm90b2NvbC4KKy8vIFRPRE86IGFsbW9zdCBh
bGwgb2YgdGhlIGJ1aWxkKk9iamVjdCBhbmQgKlRvUHJvdG9jb2xFbnVtIGZ1bmN0aW9ucyBzaG91
bGQgYmUgc3RhdGljLgorCitJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmln
aW4gc3R5bGVzaGVldE9yaWdpblRvUHJvdG9jb2xFbnVtKFN0eWxlU2hlZXRPcmlnaW4gb3JpZ2lu
KQogewotICAgIGlmICghc3R5bGVSdWxlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBz
d2l0Y2ggKG9yaWdpbikgeworICAgIGNhc2UgU3R5bGVTaGVldE9yaWdpbjo6SW5zcGVjdG9yOgor
ICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2lu
OjpJbnNwZWN0b3I7CisgICAgY2FzZSBTdHlsZVNoZWV0T3JpZ2luOjpVc2VyQWdlbnQ6CisgICAg
ICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlVz
ZXJBZ2VudDsKKyAgICBjYXNlIFN0eWxlU2hlZXRPcmlnaW46OlVzZXI6CisgICAgICAgIHJldHVy
biBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlVzZXI7CisgICAg
Y2FzZSBTdHlsZVNoZWV0T3JpZ2luOjpBdXRob3I6CisgICAgICAgIHJldHVybiBJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlJlZ3VsYXI7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW46OlJlZ3VsYXI7CisgICAgfQorfQogCi0g
ICAgLy8gU3R5bGVSdWxlcyByZXR1cm5lZCBieSBTdHlsZVJlc29sdmVyOjpzdHlsZVJ1bGVzRm9y
RWxlbWVudCBsYWNrIHBhcmVudCBwb2ludGVycyBzaW5jZSB0aGF0IGluZm9tYXRpb24gaXMgbm90
IGNoZWFwbHkgYXZhaWxhYmxlLgotICAgIC8vIFNpbmNlIHRoZSBpbnNwZWN0b3Igd2FudHMgdG8g
d2FsayB0aGUgcGFyZW50IGNoYWluLCB3ZSBjb25zdHJ1Y3QgdGhlIGZ1bGwgd3JhcHBlcnMgaGVy
ZS4KLSAgICBDU1NTdHlsZVJ1bGUqIGNzc29tV3JhcHBlciA9IHN0eWxlUmVzb2x2ZXIuaW5zcGVj
dG9yQ1NTT01XcmFwcGVycygpLmdldFdyYXBwZXJGb3JSdWxlSW5TaGVldHMoc3R5bGVSdWxlLCBz
dHlsZVJlc29sdmVyLmRvY3VtZW50KCkuc3R5bGVTaGVldENvbGxlY3Rpb24oKSk7Ci0gICAgaWYg
KCFjc3NvbVdyYXBwZXIpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIEluc3BlY3RvclN0
eWxlU2hlZXQqIGluc3BlY3RvclN0eWxlU2hlZXQgPSBiaW5kU3R5bGVTaGVldChjc3NvbVdyYXBw
ZXItPnBhcmVudFN0eWxlU2hlZXQoKSk7Ci0gICAgcmV0dXJuIGluc3BlY3RvclN0eWxlU2hlZXQg
PyBpbnNwZWN0b3JTdHlsZVNoZWV0LT5idWlsZE9iamVjdEZvclJ1bGUoY3Nzb21XcmFwcGVyLCBl
bGVtZW50KSA6IG51bGxwdHI7CitJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01lZGlhOjpT
b3VyY2UgbWVkaWFMaXN0U291cmNlVG9Qcm90b2NvbEVudW0oTWVkaWFMaXN0U291cmNlIHNvdXJj
ZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgIGNhc2UgTWVkaWFMaXN0U291cmNlOjpN
ZWRpYVJ1bGU6CisgICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01l
ZGlhOjpTb3VyY2U6Ok1lZGlhUnVsZTsKKyAgICBjYXNlIE1lZGlhTGlzdFNvdXJjZTo6SW1wb3J0
UnVsZToKKyAgICAgICAgcmV0dXJuIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE6
OlNvdXJjZTo6SW1wb3J0UnVsZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNZWRpYUxpc3RT
b3VyY2U6OkxpbmtlZFNoZWV0OgorICAgICAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6
Q1NTOjpDU1NNZWRpYTo6U291cmNlOjpMaW5rZWRTaGVldDsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBNZWRpYUxpc3RTb3VyY2U6OklubGluZVNoZWV0OgorICAgICAgICByZXR1cm4gSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlOjpJbmxpbmVTaGVldDsKKyAgICAg
ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01lZGlhOjpTb3VyY2U6
OklubGluZVNoZWV0OworICAgIH0KK30KKworc3RydWN0IENvbGxlY3RSdWxlU2VsZWN0b3JzRnVu
Y3RvciB7CisgICAgdHlwZWRlZiBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5z
cGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcj4+IFJldHVyblR5cGU7CisKKyAgICBD
b2xsZWN0UnVsZVNlbGVjdG9yc0Z1bmN0b3IoRWxlbWVudCogZWxlbWVudCkKKyAgICAgICAgOiBt
X3NlbGVjdG9yc0FycmF5KEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU2VsZWN0b3I+OjpjcmVhdGUoKSkKKyAgICAgICAgLCBtX2VsZW1lbnQo
ZWxlbWVudCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcigpKFJ1bGVTZWxlY3Rv
ciYgc2VsZWN0b3IpCisgICAgeworICAgICAgICBhdXRvIHNlbGVjdG9yT2JqZWN0ID0gSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcjo6Y3JlYXRlKCkKKyAgICAgICAgICAgIC5z
ZXRUZXh0KHNlbGVjdG9yLnNlbGVjdG9yVGV4dCgpKQorICAgICAgICAgICAgLnJlbGVhc2UoKTsK
KworICAgICAgICBzZWxlY3Rvck9iamVjdC0+c2V0RHluYW1pYyhzZWxlY3Rvci5oYXNEeW5hbWlj
U3BlY2lmaWNpdHkoKSk7CisgICAgICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5ID0gMDsKKyAgICAg
ICAgaWYgKG1fZWxlbWVudCkKKyAgICAgICAgICAgIHNwZWNpZmljaXR5ID0gc2VsZWN0b3IuZHlu
YW1pY1NwZWNpZmljaXR5KCptX2VsZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBz
cGVjaWZpY2l0eSA9IHNlbGVjdG9yLnN0YXRpY1NwZWNpZmljaXR5KCk7CisKKyAgICAgICAgYXV0
byB0dXBsZSA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PGludD46OmNyZWF0ZSgpOworICAg
ICAgICB0dXBsZS0+YWRkSXRlbShzdGF0aWNfY2FzdDxpbnQ+KChzcGVjaWZpY2l0eSAmIENTU1Nl
bGVjdG9yOjppZE1hc2spID4+IDE2KSk7CisgICAgICAgIHR1cGxlLT5hZGRJdGVtKHN0YXRpY19j
YXN0PGludD4oKHNwZWNpZmljaXR5ICYgQ1NTU2VsZWN0b3I6OmNsYXNzTWFzaykgPj4gOCkpOwor
ICAgICAgICB0dXBsZS0+YWRkSXRlbShzdGF0aWNfY2FzdDxpbnQ+KHNwZWNpZmljaXR5ICYgQ1NT
U2VsZWN0b3I6OmVsZW1lbnRNYXNrKSk7CisgICAgICAgIHNlbGVjdG9yT2JqZWN0LT5zZXRTcGVj
aWZpY2l0eShXVEY6Om1vdmUodHVwbGUpKTsKKyAgICAgICAgCisgICAgICAgIG1fc2VsZWN0b3Jz
QXJyYXktPmFkZEl0ZW0oV1RGOjptb3ZlKHNlbGVjdG9yT2JqZWN0KSk7CisgICAgfQorCisgICAg
UmV0dXJuVHlwZSByZXR1cm5WYWx1ZSgpIHsgcmV0dXJuIFdURjo6bW92ZShtX3NlbGVjdG9yc0Fy
cmF5KTsgfQorCitwcml2YXRlOgorICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJh
eTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9yPj4gbV9zZWxlY3RvcnNBcnJh
eTsKKyAgICBFbGVtZW50KiBtX2VsZW1lbnQ7Cit9OworCitSZWY8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpTZWxlY3Rvckxpc3Q+IGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JMaXN0KEluc3BlY3Rv
cjo6U3R5bGVSdWxlJiBydWxlLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIFRoaXMgaW50
ZW50aW9uYWxseSBkb2VzIG5vdCByZWx5IG9uIHRoZSBzb3VyY2UgZGF0YSB0byBhdm9pZCBjYXRj
aGluZyB0aGUgdHJhaWxpbmcgY29tbWVudHMKKyAgICAvLyAoYmVmb3JlIHRoZSBkZWNsYXJhdGlv
biBzdGFydGluZyAneycpLgorICAgIENvbGxlY3RSdWxlU2VsZWN0b3JzRnVuY3RvciBjb2xsZWN0
U2VsZWN0b3IoZWxlbWVudCk7CisgICAgYXV0byByZXN1bHQgPSBJbnNwZWN0b3I6OlByb3RvY29s
OjpDU1M6OlNlbGVjdG9yTGlzdDo6Y3JlYXRlKCkKKyAgICAgICAgLnNldFNlbGVjdG9ycyhydWxl
LmZvckVhY2hTZWxlY3Rvcihjb2xsZWN0U2VsZWN0b3IpKQorICAgICAgICAuc2V0VGV4dChydWxl
LnNlbGVjdG9yTGlzdFRleHQoKSkKKyAgICAgICAgLnJlbGVhc2UoKTsKKworICAgIGlmIChydWxl
LmlzRnJvbVNvdXJjZSgpKSB7CisgICAgICAgIFRleHRQb3NpdGlvbiBzdGFydCwgZW5kOworICAg
ICAgICBib29sIHN1Y2Nlc3MgPSBydWxlLmdldFNlbGVjdG9yTGlzdFRleHRSYW5nZShzdGFydCwg
ZW5kKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChzdWNjZXNzLCBzdWNjZXNzKTsKKyAgICAgICAg
cmVzdWx0LT5zZXRSYW5nZShidWlsZFNvdXJjZVJhbmdlT2JqZWN0KHN0YXJ0LCBlbmQpKTsKKyAg
ICB9CisgICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwogfQogCi1SZWZQdHI8SW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRPYmplY3RG
b3JSdWxlKENTU1N0eWxlUnVsZSogcnVsZSkKK3N0cnVjdCBDb2xsZWN0U3R5bGVzaGVldFJ1bGVz
RnVuY3RvciB7CisgICAgdHlwZWRlZiBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPj4gUmV0dXJuVHlwZTsKKworICAgIENv
bGxlY3RTdHlsZXNoZWV0UnVsZXNGdW5jdG9yKCkKKyAgICAgICAgOiBtX3J1bGVzQXJyYXkoSW5z
cGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxl
Pjo6Y3JlYXRlKCkpCisgICAgeworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IoKShJbnNwZWN0
b3I6OlN0eWxlUnVsZSYgcnVsZSkKKyAgICB7CisgICAgICAgIG1fcnVsZXNBcnJheS0+YWRkSXRl
bShidWlsZE9iamVjdEZvclN0eWxlUnVsZShydWxlLCBudWxscHRyKSk7CisgICAgfQorCisgICAg
UmV0dXJuVHlwZSByZXR1cm5WYWx1ZSgpIHsgcmV0dXJuIFdURjo6bW92ZShtX3J1bGVzQXJyYXkp
OyB9CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4+IG1fcnVsZXNBcnJheTsKK307CisKKwor
UmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEJvZHk+IGJ1aWxk
T2JqZWN0Rm9yU3R5bGVTaGVldChTdHlsZXNoZWV0UnVsZVNldCYgc3R5bGVzaGVldCkKIHsKLSAg
ICBpZiAoIXJ1bGUpCisgICAgQ29sbGVjdFN0eWxlc2hlZXRSdWxlc0Z1bmN0b3IgY29sbGVjdFJ1
bGVzOworCisgICAgYXV0byByZXN1bHQgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0
eWxlU2hlZXRCb2R5OjpjcmVhdGUoKQorICAgICAgICAuc2V0U3R5bGVTaGVldElkKHN0eWxlc2hl
ZXQuaWRlbnRpZmllcigpKQorICAgICAgICAuc2V0UnVsZXMoc3R5bGVzaGVldC5mb3JFYWNoUnVs
ZShjb2xsZWN0UnVsZXMpKQorICAgICAgICAucmVsZWFzZSgpOworCisgICAgcmVzdWx0LT5zZXRU
ZXh0KHN0eWxlc2hlZXQuZ2V0VGV4dCgpKTsKKworICAgIHJldHVybiBXVEY6Om1vdmUocmVzdWx0
KTsKK30KKworUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U291cmNlUmFuZ2U+IGJ1
aWxkU291cmNlUmFuZ2VPYmplY3QoVGV4dFBvc2l0aW9uJiBzdGFydCwgVGV4dFBvc2l0aW9uJiBl
bmQpCit7CisgICAgcmV0dXJuIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U291cmNlUmFuZ2U6
OmNyZWF0ZSgpCisgICAgICAgIC5zZXRTdGFydExpbmUoc3RhcnQubV9saW5lLnplcm9CYXNlZElu
dCgpKQorICAgICAgICAuc2V0U3RhcnRDb2x1bW4oc3RhcnQubV9jb2x1bW4uemVyb0Jhc2VkSW50
KCkpCisgICAgICAgIC5zZXRFbmRMaW5lKGVuZC5tX2xpbmUuemVyb0Jhc2VkSW50KCkpCisgICAg
ICAgIC5zZXRFbmRDb2x1bW4oZW5kLm1fY29sdW1uLnplcm9CYXNlZEludCgpKQorICAgICAgICAu
cmVsZWFzZSgpOworfQorCitSZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYT4g
YnVpbGRNZWRpYU9iamVjdChjb25zdCBNZWRpYUxpc3QmIG1lZGlhLCBNZWRpYUxpc3RTb3VyY2Ug
bWVkaWFMaXN0U291cmNlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCkKK3sKKyAgICBhdXRvIG1l
ZGlhT2JqZWN0ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6Y3JlYXRlKCkK
KyAgICAgICAgLnNldFRleHQobWVkaWEubWVkaWFUZXh0KCkpCisgICAgICAgIC5zZXRTb3VyY2Uo
bWVkaWFMaXN0U291cmNlVG9Qcm90b2NvbEVudW0obWVkaWFMaXN0U291cmNlKSkKKyAgICAgICAg
LnJlbGVhc2UoKTsKKworICAgIGlmICghc291cmNlVVJMLmlzRW1wdHkoKSkgeworICAgICAgICBt
ZWRpYU9iamVjdC0+c2V0U291cmNlVVJMKHNvdXJjZVVSTCk7CisgICAgICAgIG1lZGlhT2JqZWN0
LT5zZXRTb3VyY2VMaW5lKG1lZGlhLnF1ZXJpZXMoKS0+bGFzdExpbmUoKSk7CisgICAgfQorICAg
IHJldHVybiBXVEY6Om1vdmUobWVkaWFPYmplY3QpOworfQorCit2b2lkIGZpbGxNZWRpYUxpc3RD
aGFpbihDU1NSdWxlJiBydWxlLCBJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OkNTU01lZGlhPiYgbWVkaWFBcnJheSkKK3sKKyAgICBNZWRpYUxpc3Qq
IG1lZGlhTGlzdDsKKyAgICBDU1NSdWxlKiBwYXJlbnRSdWxlID0gJnJ1bGU7CisgICAgU3RyaW5n
IHNvdXJjZVVSTDsKKyAgICB3aGlsZSAocGFyZW50UnVsZSkgeworICAgICAgICBDU1NTdHlsZVNo
ZWV0KiBwYXJlbnRTdHlsZVNoZWV0ID0gbnVsbHB0cjsKKyAgICAgICAgYm9vbCBpc01lZGlhUnVs
ZSA9IHRydWU7CisgICAgICAgIGlmIChpczxDU1NNZWRpYVJ1bGU+KCpwYXJlbnRSdWxlKSkgewor
ICAgICAgICAgICAgQ1NTTWVkaWFSdWxlJiBtZWRpYVJ1bGUgPSBkb3duY2FzdDxDU1NNZWRpYVJ1
bGU+KCpwYXJlbnRSdWxlKTsKKyAgICAgICAgICAgIG1lZGlhTGlzdCA9IG1lZGlhUnVsZS5tZWRp
YSgpOworICAgICAgICAgICAgcGFyZW50U3R5bGVTaGVldCA9IG1lZGlhUnVsZS5wYXJlbnRTdHls
ZVNoZWV0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXM8Q1NTSW1wb3J0UnVsZT4oKnBhcmVudFJ1
bGUpKSB7CisgICAgICAgICAgICBDU1NJbXBvcnRSdWxlJiBpbXBvcnRSdWxlID0gZG93bmNhc3Q8
Q1NTSW1wb3J0UnVsZT4oKnBhcmVudFJ1bGUpOworICAgICAgICAgICAgbWVkaWFMaXN0ID0gJmlt
cG9ydFJ1bGUubWVkaWEoKTsKKyAgICAgICAgICAgIHBhcmVudFN0eWxlU2hlZXQgPSBpbXBvcnRS
dWxlLnBhcmVudFN0eWxlU2hlZXQoKTsKKyAgICAgICAgICAgIGlzTWVkaWFSdWxlID0gZmFsc2U7
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbWVkaWFMaXN0ID0gbnVsbHB0cjsKKworICAg
ICAgICBpZiAocGFyZW50U3R5bGVTaGVldCkgeworICAgICAgICAgICAgc291cmNlVVJMID0gcGFy
ZW50U3R5bGVTaGVldC0+Y29udGVudHMoKS5iYXNlVVJMKCk7CisgICAgICAgICAgICBpZiAoc291
cmNlVVJMLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBJbnNwZWN0b3JE
T01BZ2VudDo6ZG9jdW1lbnRVUkxTdHJpbmcocGFyZW50U3R5bGVTaGVldC0+b3duZXJEb2N1bWVu
dCgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzb3VyY2VVUkwgPSAiIjsKKworICAg
ICAgICBpZiAobWVkaWFMaXN0ICYmIG1lZGlhTGlzdC0+bGVuZ3RoKCkpCisgICAgICAgICAgICBt
ZWRpYUFycmF5LmFkZEl0ZW0oYnVpbGRNZWRpYU9iamVjdCgqbWVkaWFMaXN0LCBpc01lZGlhUnVs
ZSA/IE1lZGlhTGlzdFNvdXJjZTo6TWVkaWFSdWxlIDogTWVkaWFMaXN0U291cmNlOjpJbXBvcnRS
dWxlLCBzb3VyY2VVUkwpKTsKKworICAgICAgICBpZiAocGFyZW50UnVsZS0+cGFyZW50UnVsZSgp
KQorICAgICAgICAgICAgcGFyZW50UnVsZSA9IHBhcmVudFJ1bGUtPnBhcmVudFJ1bGUoKTsKKyAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICBDU1NTdHlsZVNoZWV0KiBzdHlsZVNoZWV0ID0gcGFy
ZW50UnVsZS0+cGFyZW50U3R5bGVTaGVldCgpOworICAgICAgICAgICAgd2hpbGUgKHN0eWxlU2hl
ZXQpIHsKKyAgICAgICAgICAgICAgICBtZWRpYUxpc3QgPSBzdHlsZVNoZWV0LT5tZWRpYSgpOwor
ICAgICAgICAgICAgICAgIGlmIChtZWRpYUxpc3QgJiYgbWVkaWFMaXN0LT5sZW5ndGgoKSkgewor
ICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCogZG9jID0gc3R5bGVTaGVldC0+b3duZXJEb2N1
bWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKQorICAgICAgICAgICAgICAgICAg
ICAgICAgc291cmNlVVJMID0gZG9jLT51cmwoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBp
ZiAoIXN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFzZVVSTCgpLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHNvdXJjZVVSTCA9IHN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFzZVVS
TCgpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBz
b3VyY2VVUkwgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFBcnJheS5hZGRJdGVtKGJ1
aWxkTWVkaWFPYmplY3QoKm1lZGlhTGlzdCwgc3R5bGVTaGVldC0+b3duZXJOb2RlKCkgPyBNZWRp
YUxpc3RTb3VyY2U6OkxpbmtlZFNoZWV0IDogTWVkaWFMaXN0U291cmNlOjpJbmxpbmVTaGVldCwg
c291cmNlVVJMKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmVudFJ1
bGUgPSBzdHlsZVNoZWV0LT5vd25lclJ1bGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50
UnVsZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc3R5bGVT
aGVldCA9IHN0eWxlU2hlZXQtPnBhcmVudFN0eWxlU2hlZXQoKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KK30KKworUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
UnVsZT4gYnVpbGRPYmplY3RGb3JTdHlsZVJ1bGUoSW5zcGVjdG9yOjpTdHlsZVJ1bGUmIHJ1bGUs
IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6Q1NTU3R5bGU+IHN0eWxlT2JqZWN0OworICAgIHJ1bGUud2l0aFN0eWxlKFsmc3R5bGVPYmpl
Y3RdIChTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSkgeworICAgICAgICBzdHlsZU9iamVjdCA9IGJ1
aWxkT2JqZWN0Rm9yU3R5bGUoc3R5bGUpOworICAgIH0pOworICAgIEFTU0VSVChzdHlsZU9iamVj
dCk7CisKKyAgICBTdHlsZXNoZWV0UnVsZVNldCogc3R5bGVzaGVldCA9IHJ1bGUuc3R5bGVzaGVl
dCgpOworICAgIEFTU0VSVChzdHlsZXNoZWV0KTsKKworICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlOjpjcmVhdGUoKQorICAgICAgICAuc2V0U2VsZWN0
b3JMaXN0KGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JMaXN0KHJ1bGUsIGVsZW1lbnQpKQorICAgICAg
ICAuc2V0U291cmNlTGluZShydWxlLnNvdXJjZUxpbmUoKSkKKyAgICAgICAgLnNldE9yaWdpbihz
dHlsZXNoZWV0T3JpZ2luVG9Qcm90b2NvbEVudW0oc3R5bGVzaGVldC0+b3JpZ2luKCkpKQorICAg
ICAgICAuc2V0U3R5bGUoV1RGOjptb3ZlKHN0eWxlT2JqZWN0KSkKKyAgICAgICAgLnJlbGVhc2Uo
KTsKKworICAgIC8vICJzb3VyY2VVUkwiIGlzIHByZXNlbnQgb25seSBmb3IgcmVndWxhciBydWxl
cywgb3RoZXJ3aXNlICJvcmlnaW4iIHNob3VsZCBiZSB1c2VkIGluIHRoZSBmcm9udGVuZC4KKyAg
ICBpZiAoc3R5bGVzaGVldC0+b3JpZ2luKCkgPT0gU3R5bGVTaGVldE9yaWdpbjo6QXV0aG9yKQor
ICAgICAgICByZXN1bHQtPnNldFNvdXJjZVVSTChzdHlsZXNoZWV0LT5maW5hbFVSTCgpKTsKKwor
ICAgIGlmIChzdHlsZXNoZWV0LT5jYW5CaW5kKCkpIHsKKyAgICAgICAgaWYgKCFydWxlLnJ1bGVJ
ZCgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJlc3VsdC0+c2V0UnVsZUlkKHJ1bGUucnVsZUlk
KCkuYXNQcm90b2NvbFZhbHVlPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZUlkPigp
KTsKKyAgICB9CisKKyAgICBhdXRvIG1lZGlhQXJyYXkgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpB
cnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01lZGlhPjo6Y3JlYXRlKCk7CisKKyAg
ICBmaWxsTWVkaWFMaXN0Q2hhaW4ocnVsZS5ydWxlKCksIG1lZGlhQXJyYXkuZ2V0KCkpOworICAg
IGlmIChtZWRpYUFycmF5LT5sZW5ndGgoKSkKKyAgICAgICAgcmVzdWx0LT5zZXRNZWRpYShXVEY6
Om1vdmUobWVkaWFBcnJheSkpOworCisgICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOworfQor
CitSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiBJbnNwZWN0b3JDU1NB
Z2VudDo6YnVpbGRPYmplY3RGb3JNYXRjaGVkUnVsZShXZWJDb3JlOjpTdHlsZVJ1bGUmIHN0eWxl
UnVsZSwgU3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgRWxlbWVudCogZWxlbWVudCkKK3sK
KyAgICAvLyBTdHlsZVJ1bGVzIHJldHVybmVkIGJ5IFN0eWxlUmVzb2x2ZXI6OnN0eWxlUnVsZXNG
b3JFbGVtZW50IGxhY2sgcGFyZW50IHBvaW50ZXJzIHNpbmNlIHRoYXQgaW5mb21hdGlvbiBpcyBu
b3QgY2hlYXBseSBhdmFpbGFibGUuCisgICAgLy8gU2luY2UgdGhlIGluc3BlY3RvciB3YW50cyB0
byB3YWxrIHRoZSBwYXJlbnQgY2hhaW4sIHdlIGNvbnN0cnVjdCB0aGUgZnVsbCB3cmFwcGVycyBo
ZXJlLgorICAgIENTU1N0eWxlUnVsZSogc3R5bGVSdWxlV3JhcHBlciA9IHN0eWxlUmVzb2x2ZXIu
aW5zcGVjdG9yQ1NTT01XcmFwcGVycygpLmdldFdyYXBwZXJGb3JSdWxlSW5TaGVldHMoJnN0eWxl
UnVsZSwgc3R5bGVSZXNvbHZlci5kb2N1bWVudCgpLnN0eWxlU2hlZXRDb2xsZWN0aW9uKCkpOwor
ICAgIGlmICghc3R5bGVSdWxlV3JhcHBlciB8fCAhc3R5bGVSdWxlV3JhcHBlci0+cGFyZW50U3R5
bGVTaGVldCgpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIEFTU0VSVChydWxlLT5w
YXJlbnRTdHlsZVNoZWV0KCkpOwotICAgIEluc3BlY3RvclN0eWxlU2hlZXQqIGluc3BlY3RvclN0
eWxlU2hlZXQgPSBiaW5kU3R5bGVTaGVldChydWxlLT5wYXJlbnRTdHlsZVNoZWV0KCkpOwotICAg
IHJldHVybiBpbnNwZWN0b3JTdHlsZVNoZWV0ID8gaW5zcGVjdG9yU3R5bGVTaGVldC0+YnVpbGRP
YmplY3RGb3JSdWxlKHJ1bGUsIG51bGxwdHIpIDogbnVsbHB0cjsKKyAgICBTdHlsZXNoZWV0UnVs
ZVNldCYgc3R5bGVzaGVldCA9IGJpbmRTdHlsZVNoZWV0KCpzdHlsZVJ1bGVXcmFwcGVyLT5wYXJl
bnRTdHlsZVNoZWV0KCkpOworICAgIENTU0lkIGlkZW50aWZpZXIgPSBzdHlsZXNoZWV0LmlkRm9y
U3R5bGUoc3R5bGVSdWxlV3JhcHBlci0+c3R5bGUoKSk7CisKKyAgICBSZWZQdHI8SW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiByZXN1bHQ7CisgICAgc3R5bGVzaGVldC53aXRoUnVs
ZUZvcklkKGlkZW50aWZpZXIsIFsmXSAoSW5zcGVjdG9yOjpTdHlsZVJ1bGUmIHJ1bGUpIHsKKyAg
ICAgICAgcmVzdWx0ID0gYnVpbGRPYmplY3RGb3JTdHlsZVJ1bGUocnVsZSwgZWxlbWVudCk7Cisg
ICAgfSk7CisgICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwogfQogCiBSZWZQdHI8SW5zcGVj
dG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpSdWxlTWF0Y2g+
PiBJbnNwZWN0b3JDU1NBZ2VudDo6YnVpbGRBcnJheUZvck1hdGNoZWRSdWxlTGlzdChjb25zdCBW
ZWN0b3I8UmVmUHRyPFN0eWxlUnVsZT4+JiBtYXRjaGVkUnVsZXMsIFN0eWxlUmVzb2x2ZXImIHN0
eWxlUmVzb2x2ZXIsIEVsZW1lbnQqIGVsZW1lbnQpCkBAIC05MjAsNyArMTMxMiwxMCBAQCBSZWZQ
dHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpS
dWxlTWF0Y2g+PiBJbnNwZWN0bwogICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIo
ZWxlbWVudC0+ZG9jdW1lbnQoKSk7CiAKICAgICBmb3IgKGF1dG8mIG1hdGNoZWRSdWxlIDogbWF0
Y2hlZFJ1bGVzKSB7Ci0gICAgICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNT
U1J1bGU+IHJ1bGVPYmplY3QgPSBidWlsZE9iamVjdEZvclJ1bGUobWF0Y2hlZFJ1bGUuZ2V0KCks
IHN0eWxlUmVzb2x2ZXIsIGVsZW1lbnQpOworICAgICAgICBpZiAoIW1hdGNoZWRSdWxlKQorICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6
OkNTUzo6Q1NTUnVsZT4gcnVsZU9iamVjdCA9IGJ1aWxkT2JqZWN0Rm9yTWF0Y2hlZFJ1bGUoKm1h
dGNoZWRSdWxlLCBzdHlsZVJlc29sdmVyLCBlbGVtZW50KTsKICAgICAgICAgaWYgKCFydWxlT2Jq
ZWN0KQogICAgICAgICAgICAgY29udGludWU7CiAKQEAgLTk0NSwyNCArMTM0MCw2IEBAIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlJ1
bGVNYXRjaD4+IEluc3BlY3RvCiAgICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwogfQogCi1S
ZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4gSW5zcGVjdG9yQ1NTQWdl
bnQ6OmJ1aWxkT2JqZWN0Rm9yQXR0cmlidXRlc1N0eWxlKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0g
ICAgQVNTRVJUKGVsZW1lbnQpOwotICAgIGlmICghaXM8U3R5bGVkRWxlbWVudD4oKmVsZW1lbnQp
KQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIC8vIEZJWE1FOiBVZ2xpbmVzcyBiZWxv
dy4KLSAgICBTdHlsZVByb3BlcnRpZXMqIGF0dHJpYnV0ZVN0eWxlID0gY29uc3RfY2FzdDxTdHls
ZVByb3BlcnRpZXMqPihkb3duY2FzdDxTdHlsZWRFbGVtZW50PihlbGVtZW50KS0+cHJlc2VudGF0
aW9uQXR0cmlidXRlU3R5bGUoKSk7Ci0gICAgaWYgKCFhdHRyaWJ1dGVTdHlsZSkKLSAgICAgICAg
cmV0dXJuIG51bGxwdHI7Ci0KLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihh
dHRyaWJ1dGVTdHlsZS0+aXNNdXRhYmxlKCkpOwotICAgIE11dGFibGVTdHlsZVByb3BlcnRpZXMq
IG11dGFibGVBdHRyaWJ1dGVTdHlsZSA9IHN0YXRpY19jYXN0PE11dGFibGVTdHlsZVByb3BlcnRp
ZXMqPihhdHRyaWJ1dGVTdHlsZSk7Ci0KLSAgICBSZWY8SW5zcGVjdG9yU3R5bGU+IGluc3BlY3Rv
clN0eWxlID0gSW5zcGVjdG9yU3R5bGU6OmNyZWF0ZShJbnNwZWN0b3JDU1NJZCgpLCBtdXRhYmxl
QXR0cmlidXRlU3R5bGUtPmVuc3VyZUNTU1N0eWxlRGVjbGFyYXRpb24oKSwgbnVsbHB0cik7Ci0g
ICAgcmV0dXJuIGluc3BlY3RvclN0eWxlLT5idWlsZE9iamVjdEZvclN0eWxlKCk7Ci19Ci0KIFJl
ZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OlJlZ2lvbj4+IEluc3BlY3RvckNTU0FnZW50OjpidWlsZEFycmF5Rm9yUmVnaW9ucyhFcnJvclN0
cmluZyYgZXJyb3JTdHJpbmcsIFJlZlB0cjxOb2RlTGlzdD4mJiByZWdpb25MaXN0LCBpbnQgZG9j
dW1lbnROb2RlSWQpCiB7CiAgICAgYXV0byByZWdpb25zID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6
QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpSZWdpb24+OjpjcmVhdGUoKTsKQEAgLTEw
MTgsNTggKzEzOTUsMTYyIEBAIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6Ok5hbWVk
Rmxvdz4gSW5zcGVjdG9yQ1NTQWdlbnQ6OmJ1aWxkT2JqZWN0Rm9yTmFtCiAgICAgICAgIC5yZWxl
YXNlKCk7CiB9CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmRpZFJlbW92ZURvY3VtZW50KERv
Y3VtZW50KiBkb2N1bWVudCkKK1JlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0
eWxlPiBidWlsZE9iamVjdEZvclN0eWxlKFN0eWxlRGVjbGFyYXRpb24mIHN0eWxlKQogewotICAg
IGlmIChkb2N1bWVudCkKLSAgICAgICAgbV9kb2N1bWVudFRvSW5zcGVjdG9yU3R5bGVTaGVldC5y
ZW1vdmUoZG9jdW1lbnQpOwotfQorICAgIGlmIChzdHlsZS5zdHlsZUlkKCkuaXNFbXB0eSgpKSB7
CisgICAgICAgIHJldHVybiBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlOjpjcmVh
dGUoKQorICAgICAgICAgICAgLnNldENzc1Byb3BlcnRpZXMoSW5zcGVjdG9yOjpQcm90b2NvbDo6
QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eT46OmNyZWF0ZSgpKQor
ICAgICAgICAgICAgLnNldFNob3J0aGFuZEVudHJpZXMoSW5zcGVjdG9yOjpQcm90b2NvbDo6QXJy
YXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTaG9ydGhhbmRFbnRyeT46OmNyZWF0ZSgpKQor
ICAgICAgICAgICAgLnJlbGVhc2UoKTsKKyAgICB9CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6
OmRpZFJlbW92ZURPTU5vZGUoTm9kZSogbm9kZSkKLXsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAg
IHJldHVybjsKKyAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZT4g
cmVzdWx0ID0gYnVpbGRPYmplY3RGb3JTdHlsZVdpdGhQcm9wZXJ0aWVzKHN0eWxlKTsKKyAgICBp
ZiAoIXN0eWxlLnN0eWxlSWQoKS5pc0VtcHR5KCkpCisgICAgICAgIHJlc3VsdC0+c2V0U3R5bGVJ
ZChzdHlsZS5zdHlsZUlkKCkuYXNQcm90b2NvbFZhbHVlPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6Q1NTU3R5bGVJZD4oKSk7CiAKLSAgICBpbnQgbm9kZUlkID0gbV9kb21BZ2VudC0+Ym91bmRO
b2RlSWQobm9kZSk7Ci0gICAgaWYgKG5vZGVJZCkKLSAgICAgICAgbV9ub2RlSWRUb0ZvcmNlZFBz
ZXVkb1N0YXRlLnJlbW92ZShub2RlSWQpOworICAgIHJlc3VsdC0+c2V0V2lkdGgoc3R5bGUuZGVj
bGFyYXRpb24oKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aWR0aCIpKTsKKyAgICByZXN1bHQtPnNldEhl
aWdodChzdHlsZS5kZWNsYXJhdGlvbigpLmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpKTsKIAot
ICAgIE5vZGVUb0luc3BlY3RvclN0eWxlU2hlZXQ6Oml0ZXJhdG9yIGl0ID0gbV9ub2RlVG9JbnNw
ZWN0b3JTdHlsZVNoZWV0LmZpbmQobm9kZSk7Ci0gICAgaWYgKGl0ID09IG1fbm9kZVRvSW5zcGVj
dG9yU3R5bGVTaGVldC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChzdHlsZS5pc0Zy
b21Tb3VyY2UoKSkgeworICAgICAgICBUZXh0UG9zaXRpb24gc3RhcnQsIGVuZDsKKyAgICAgICAg
Ym9vbCBzdWNjZXNzOworICAgICAgICBzdWNjZXNzID0gc3R5bGUuZ2V0U3R5bGVUZXh0UmFuZ2Uo
c3RhcnQsIGVuZCk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQoc3VjY2Vzcywgc3VjY2Vzcyk7Cisg
ICAgICAgIHJlc3VsdC0+c2V0UmFuZ2UoYnVpbGRTb3VyY2VSYW5nZU9iamVjdChzdGFydCwgZW5k
KSk7CisKKyAgICAgICAgU3RyaW5nIHN0eWxlVGV4dDsKKyAgICAgICAgc3VjY2VzcyA9IHN0eWxl
LmdldFN0eWxlVGV4dChzdHlsZVRleHQpOworICAgICAgICBBU1NFUlRfVU5VU0VEKHN1Y2Nlc3Ms
IHN1Y2Nlc3MpOworICAgICAgICByZXN1bHQtPnNldENzc1RleHQoc3R5bGVUZXh0KTsKKyAgICB9
CiAKLSAgICBtX2lkVG9JbnNwZWN0b3JTdHlsZVNoZWV0LnJlbW92ZShpdC0+dmFsdWUtPmlkKCkp
OwotICAgIG1fbm9kZVRvSW5zcGVjdG9yU3R5bGVTaGVldC5yZW1vdmUobm9kZSk7CisgICAgcmV0
dXJuIFdURjo6bW92ZShyZXN1bHQpOwogfQogCi12b2lkIEluc3BlY3RvckNTU0FnZW50OjpkaWRN
b2RpZnlET01BdHRyKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKCFlbGVtZW50KQotICAg
ICAgICByZXR1cm47CitzdHJ1Y3QgQ29sbGVjdFByb3BlcnR5U2hvcnRoYW5kc0Z1bmN0b3Igewor
ICAgIHR5cGVkZWYgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkNTUzo6U2hvcnRoYW5kRW50cnk+PiBSZXR1cm5UeXBlOwogCi0gICAgTm9kZVRv
SW5zcGVjdG9yU3R5bGVTaGVldDo6aXRlcmF0b3IgaXQgPSBtX25vZGVUb0luc3BlY3RvclN0eWxl
U2hlZXQuZmluZChlbGVtZW50KTsKLSAgICBpZiAoaXQgPT0gbV9ub2RlVG9JbnNwZWN0b3JTdHls
ZVNoZWV0LmVuZCgpKQotICAgICAgICByZXR1cm47CisgICAgQ29sbGVjdFByb3BlcnR5U2hvcnRo
YW5kc0Z1bmN0b3IoKQorICAgIDogbV9zaG9ydGhhbmRzQXJyYXkoSW5zcGVjdG9yOjpQcm90b2Nv
bDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTaG9ydGhhbmRFbnRyeT46OmNyZWF0
ZSgpKQorICAgIHsKKyAgICB9CiAKLSAgICBpdC0+dmFsdWUtPmRpZE1vZGlmeUVsZW1lbnRBdHRy
aWJ1dGUoKTsKLX0KKyAgICB2b2lkIG9wZXJhdG9yKCkoSW5zcGVjdG9yOjpTdHlsZVByb3BlcnR5
JiBwcm9wZXJ0eSkKKyAgICB7CisgICAgICAgIC8vIE9ubHkgY29sbGVjdCBzaG9ydGhhbmRzIGZv
ciBpbXBsaWNpdGx5IGRlZmluZWQgcHJvcGVydGllcy4KKyAgICAgICAgaWYgKHByb3BlcnR5Lmlz
RnJvbVNvdXJjZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZyBzaG9y
dGhhbmQgPSBwcm9wZXJ0eS5zaG9ydGhhbmRQcm9wZXJ0eU5hbWUoKTsKKyAgICAgICAgaWYgKCFz
aG9ydGhhbmQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoIW1fZm91bmRTaG9ydGhhbmRz
LmNvbnRhaW5zKHNob3J0aGFuZCkpIHsKKyAgICAgICAgICAgICAgICBtX2ZvdW5kU2hvcnRoYW5k
cy5hZGQoc2hvcnRoYW5kKTsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6U2hvcnRoYW5kRW50cnk6OmNyZWF0ZSgpCisgICAgICAgICAgICAg
ICAgICAgIC5zZXROYW1lKHNob3J0aGFuZCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVl
KHByb3BlcnR5LnNob3J0aGFuZFByb3BlcnR5VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAg
LnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtX3Nob3J0aGFuZHNBcnJheS0+YWRkSXRlbShX
VEY6Om1vdmUocmVzdWx0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLXZv
aWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OnN0eWxlU2hlZXRDaGFuZ2VkKEluc3BlY3RvclN0eWxlU2hl
ZXQqIHN0eWxlU2hlZXQpCi17Ci0gICAgaWYgKG1fZnJvbnRlbmREaXNwYXRjaGVyKQotICAgICAg
ICBtX2Zyb250ZW5kRGlzcGF0Y2hlci0+c3R5bGVTaGVldENoYW5nZWQoc3R5bGVTaGVldC0+aWQo
KSk7Ci19CisgICAgUmV0dXJuVHlwZSByZXR1cm5WYWx1ZSgpIHsgcmV0dXJuIFdURjo6bW92ZSht
X3Nob3J0aGFuZHNBcnJheSk7IH0KIAotdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6cmVzZXRQc2V1
ZG9TdGF0ZXMoKQotewotICAgIEhhc2hTZXQ8RG9jdW1lbnQqPiBkb2N1bWVudHNUb0NoYW5nZTsK
LSAgICBmb3IgKE5vZGVJZFRvRm9yY2VkUHNldWRvU3RhdGU6Oml0ZXJhdG9yIGl0ID0gbV9ub2Rl
SWRUb0ZvcmNlZFBzZXVkb1N0YXRlLmJlZ2luKCksIGVuZCA9IG1fbm9kZUlkVG9Gb3JjZWRQc2V1
ZG9TdGF0ZS5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGlmIChFbGVtZW50KiBl
bGVtZW50ID0gZG93bmNhc3Q8RWxlbWVudD4obV9kb21BZ2VudC0+bm9kZUZvcklkKGl0LT5rZXkp
KSkKLSAgICAgICAgICAgIGRvY3VtZW50c1RvQ2hhbmdlLmFkZCgmZWxlbWVudC0+ZG9jdW1lbnQo
KSk7Citwcml2YXRlOgorICAgIEhhc2hTZXQ8U3RyaW5nPiBtX2ZvdW5kU2hvcnRoYW5kczsKKyAg
ICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6
Q1NTOjpTaG9ydGhhbmRFbnRyeT4+IG1fc2hvcnRoYW5kc0FycmF5OworfTsKKworCitzdHJ1Y3Qg
Q29sbGVjdFByb3BlcnR5RGF0YUZ1bmN0b3IgeworICAgIHR5cGVkZWYgUmVmUHRyPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk+
PiBSZXR1cm5UeXBlOworCisgICAgQ29sbGVjdFByb3BlcnR5RGF0YUZ1bmN0b3IoKQorICAgICAg
ICA6IG1fcHJvcGVydGllc0FycmF5KEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk+OjpjcmVhdGUoKSkKKyAgICB7CiAgICAgfQog
Ci0gICAgbV9ub2RlSWRUb0ZvcmNlZFBzZXVkb1N0YXRlLmNsZWFyKCk7Ci0gICAgZm9yIChIYXNo
U2V0PERvY3VtZW50Kj46Oml0ZXJhdG9yIGl0ID0gZG9jdW1lbnRzVG9DaGFuZ2UuYmVnaW4oKSwg
ZW5kID0gZG9jdW1lbnRzVG9DaGFuZ2UuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAg
KCppdCktPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworICAg
IHZvaWQgb3BlcmF0b3IoKShTdHlsZVByb3BlcnR5JiBwcm9wZXJ0eSkKKyAgICB7CisgICAgICAg
IFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5PiBwcm9wZXJ0eU9i
amVjdCA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk6OmNyZWF0ZSgpCisg
ICAgICAgICAgICAuc2V0TmFtZShwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUoKS5sb3dlcigpKQorICAg
ICAgICAgICAgLnNldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5VmFsdWUoKSkKKyAgICAgICAgICAg
IC5yZWxlYXNlKCk7CisKKyAgICAgICAgcHJvcGVydHlPYmplY3QtPnNldFBhcnNlZE9rKHByb3Bl
cnR5LnBhcnNlZE9rKCkpOworICAgICAgICBwcm9wZXJ0eU9iamVjdC0+c2V0SW1wbGljaXQocHJv
cGVydHkuaXNJbXBsaWNpdCgpKTsKKworICAgICAgICAvLyBEZWZhdWx0ICJwcmlvcml0eSIgPT0g
IiIuCisgICAgICAgIGlmIChwcm9wZXJ0eS5pc0ltcG9ydGFudCgpKQorICAgICAgICAgICAgcHJv
cGVydHlPYmplY3QtPnNldFByaW9yaXR5KCJpbXBvcnRhbnQiKTsKKworICAgICAgICBhdXRvIHN0
YXR1cyA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXM6OkFjdGl2
ZTsKKyAgICAgICAgaWYgKCFwcm9wZXJ0eS5pc0Zyb21Tb3VyY2UoKSkKKyAgICAgICAgICAgIHN0
YXR1cyA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXM6OlN0eWxl
OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByb3BlcnR5T2JqZWN0LT5zZXRUZXh0KHBy
b3BlcnR5LnJhd1RleHQoKSk7CisKKyAgICAgICAgICAgIFRleHRQb3NpdGlvbiBzdGFydDsKKyAg
ICAgICAgICAgIFRleHRQb3NpdGlvbiBlbmQ7CisgICAgICAgICAgICBwcm9wZXJ0eS5nZXRUZXh0
UmFuZ2Uoc3RhcnQsIGVuZCk7CisgICAgICAgICAgICBwcm9wZXJ0eU9iamVjdC0+c2V0UmFuZ2Uo
YnVpbGRTb3VyY2VSYW5nZU9iamVjdChzdGFydCwgZW5kKSk7CisKKyAgICAgICAgICAgIC8vIFBh
cnNlZCBwcm9wZXJ0eSBvdmVycmlkZXMgYW55IHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZS4g
Tm9uLXBhcnNlZCBwcm9wZXJ0eSBvdmVycmlkZXMKKyAgICAgICAgICAgIC8vIHByZXZpb3VzIG5v
bi1wYXJzZWQgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIChpZiBhbnkpLgorICAgICAgICAg
ICAgYm9vbCBzaG91bGRJbmFjdGl2YXRlID0gZmFsc2U7CisgICAgICAgICAgICBDU1NQcm9wZXJ0
eUlEIHByb3BlcnR5SWQgPSBjc3NQcm9wZXJ0eUlEKHByb3BlcnR5LnByb3BlcnR5TmFtZSgpKTsK
KyAgICAgICAgICAgIC8vIENhbm9uaWNhbGl6ZSBwcm9wZXJ0eSBuYW1lcyB0byB0cmVhdCBub24t
cHJlZml4ZWQgYW5kIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBuYW1lcyB0aGUgc2FtZSAob3Bh
Y2l0eSB2cy4gLXdlYmtpdC1vcGFjaXR5KS4KKyAgICAgICAgICAgIFN0cmluZyBjYW5vbmljYWxQ
cm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUlkID8gZ2V0UHJvcGVydHlOYW1lU3RyaW5nKHByb3BlcnR5
SWQpIDogcHJvcGVydHkucHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICBhdXRvIGZpbmRSZXN1
bHQgPSBtX3Byb3BlcnR5TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eS5maW5kKGNhbm9uaWNh
bFByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBpZiAoZmluZFJlc3VsdCAhPSBtX3Byb3BlcnR5
TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eS5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlm
IChwcm9wZXJ0eS5wYXJzZWRPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vz
c1ByaW9yaXR5ID0gZmluZFJlc3VsdC0+dmFsdWUtPmdldFN0cmluZyhJbnNwZWN0b3I6OlByb3Rv
Y29sOjpDU1M6OkNTU1Byb3BlcnR5OjpQcmlvcml0eSwgbV9wcmV2aW91c1ByaW9yaXR5KTsKKyAg
ICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzU3RhdHVzID0gZmluZFJlc3VsdC0+dmFsdWUt
PmdldFN0cmluZyhJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5OjpTdGF0dXMs
IG1fcHJldmlvdXNTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc1N0YXR1
cyAmJiBtX3ByZXZpb3VzU3RhdHVzICE9ICJpbmFjdGl2ZSIpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChwcm9wZXJ0eS5pc0ltcG9ydGFudCgpIHx8ICFzdWNjZXNzUHJpb3JpdHkpIC8v
IFByaW9yaXR5IG5vdCBzZXQgPT0gIm5vdCBpbXBvcnRhbnQiLgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNob3VsZEluYWN0aXZhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZSBpZiAoc3RhdHVzID09IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVy
dHlTdGF0dXM6OkFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluYWN0
aXZhdGUgYSBub24taW1wb3J0YW50IHByb3BlcnR5IGZvbGxvd2luZyB0aGUgc2FtZS1uYW1lZCBp
bXBvcnRhbnQgcHJvcGVydHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0g
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1czo6SW5hY3RpdmU7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBib29sIHByZXZpb3VzUGFyc2Vk
T2s7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZpbmRSZXN1bHQtPnZhbHVl
LT5nZXRCb29sZWFuKEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk6OlBhcnNl
ZE9rLCBwcmV2aW91c1BhcnNlZE9rKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3Mg
JiYgIXByZXZpb3VzUGFyc2VkT2spCisgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmFj
dGl2YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgICAgICBtX3Byb3BlcnR5TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eS5zZXQo
Y2Fub25pY2FsUHJvcGVydHlOYW1lLCBwcm9wZXJ0eU9iamVjdC5nZXQoKSk7CisKKyAgICAgICAg
ICAgIGlmIChzaG91bGRJbmFjdGl2YXRlKSB7CisgICAgICAgICAgICAgICAgZmluZFJlc3VsdC0+
dmFsdWUtPnNldFN0YXR1cyhJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5U3Rh
dHVzOjpJbmFjdGl2ZSk7CisgICAgICAgICAgICAgICAgbV9wcm9wZXJ0eU5hbWVUb1ByZXZpb3Vz
QWN0aXZlUHJvcGVydHkuc2V0KGNhbm9uaWNhbFByb3BlcnR5TmFtZSwgcHJvcGVydHlPYmplY3Qu
Z2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydHlPYmpl
Y3QtPnNldFN0YXR1cyhzdGF0dXMpOworICAgICAgICBtX3Byb3BlcnRpZXNBcnJheS0+YWRkSXRl
bShXVEY6Om1vdmUocHJvcGVydHlPYmplY3QpKTsKKyAgICB9CisKKyAgICBSZXR1cm5UeXBlIHJl
dHVyblZhbHVlKCkgeyByZXR1cm4gV1RGOjptb3ZlKG1fcHJvcGVydGllc0FycmF5KTsgfQorCitw
cml2YXRlOgorICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5Pj4gbV9wcm9wZXJ0aWVzQXJyYXk7CisgICAgSGFz
aE1hcDxTdHJpbmcsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHkqPiBtX3By
b3BlcnR5TmFtZVRvUHJldmlvdXNBY3RpdmVQcm9wZXJ0eTsKKyAgICBTdHJpbmcgbV9wcmV2aW91
c1ByaW9yaXR5OworICAgIFN0cmluZyBtX3ByZXZpb3VzU3RhdHVzOworfTsKKworUmVmUHRyPElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGJ1aWxkT2JqZWN0Rm9yU3R5bGVXaXRo
UHJvcGVydGllcyhTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSkKK3sKKyAgICBDb2xsZWN0UHJvcGVy
dHlEYXRhRnVuY3RvciBjb2xsZWN0UHJvcGVydHlEYXRhOworICAgIENvbGxlY3RQcm9wZXJ0eVNo
b3J0aGFuZHNGdW5jdG9yIGNvbGxlY3RTaG9ydGhhbmRzOworCisgICAgcmV0dXJuIEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU6OmNyZWF0ZSgpCisgICAgICAgIC5zZXRDc3NQcm9w
ZXJ0aWVzKHN0eWxlLmZvckVhY2hQcm9wZXJ0eShjb2xsZWN0UHJvcGVydHlEYXRhKSkKKyAgICAg
ICAgLnNldFNob3J0aGFuZEVudHJpZXMoc3R5bGUuZm9yRWFjaFByb3BlcnR5KGNvbGxlY3RTaG9y
dGhhbmRzKSkKKyAgICAgICAgLnJlbGVhc2UoKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50
LmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaAppbmRleCBl
NGE2MDM3OS4uZGI2NWU2NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3RvckNTU0FnZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rv
ckNTU0FnZW50LmgKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgog
I2luY2x1ZGUgIkNvbnRlbnRTZWN1cml0eVBvbGljeS5oIgogI2luY2x1ZGUgIkluc3BlY3RvckRP
TUFnZW50LmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIklu
c3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9yV2ViQWdlbnRC
YXNlLmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlDb250ZXh0LmgiCiAjaW5jbHVkZSA8aW5zcGVjdG9y
L0luc3BlY3RvckJhY2tlbmREaXNwYXRjaGVycy5oPgpAQCAtNDAsNiArNDAsNyBAQAogCiBuYW1l
c3BhY2UgSW5zcGVjdG9yIHsKIGNsYXNzIENTU0Zyb250ZW5kRGlzcGF0Y2hlcjsKK2NsYXNzIElu
bGluZVN0eWxlUnVsZVNldDsKIH0KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNjUsNyArNjYs
NyBAQCBjbGFzcyBJbnNwZWN0b3JDU1NBZ2VudCBmaW5hbAogICAgIDogcHVibGljIEluc3BlY3Rv
ckFnZW50QmFzZQogICAgICwgcHVibGljIEluc3BlY3RvckRPTUFnZW50OjpET01MaXN0ZW5lcgog
ICAgICwgcHVibGljIEluc3BlY3Rvcjo6Q1NTQmFja2VuZERpc3BhdGNoZXJIYW5kbGVyCi0gICAg
LCBwdWJsaWMgSW5zcGVjdG9yU3R5bGVTaGVldDo6TGlzdGVuZXIgeworICAgICwgcHVibGljIElu
c3BlY3Rvcjo6U3R5bGVzaGVldFJ1bGVTZXQ6Okxpc3RlbmVyIHsKICAgICBXVEZfTUFLRV9OT05D
T1BZQUJMRShJbnNwZWN0b3JDU1NBZ2VudCk7CiAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
CiBwdWJsaWM6CkBAIC04OSw4ICs5MCw2IEBAIHB1YmxpYzoKICAgICBJbnNwZWN0b3JDU1NBZ2Vu
dChJbnN0cnVtZW50aW5nQWdlbnRzKiwgSW5zcGVjdG9yRE9NQWdlbnQqKTsKICAgICB2aXJ0dWFs
IH5JbnNwZWN0b3JDU1NBZ2VudCgpOwogCi0gICAgc3RhdGljIENTU1N0eWxlUnVsZSogYXNDU1NT
dHlsZVJ1bGUoQ1NTUnVsZSYpOwotCiAgICAgdmlydHVhbCB2b2lkIGRpZENyZWF0ZUZyb250ZW5k
QW5kQmFja2VuZChJbnNwZWN0b3I6OkZyb250ZW5kQ2hhbm5lbCosIEluc3BlY3Rvcjo6QmFja2Vu
ZERpc3BhdGNoZXIqKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgd2lsbERlc3Ryb3lGcm9u
dGVuZEFuZEJhY2tlbmQoSW5zcGVjdG9yOjpEaXNjb25uZWN0UmVhc29uKSBvdmVycmlkZTsKICAg
ICB2aXJ0dWFsIHZvaWQgZGlzY2FyZEFnZW50KCkgb3ZlcnJpZGU7CkBAIC0xMTIsOSArMTExLDkg
QEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBnZXRJbmxpbmVTdHlsZXNGb3JOb2RlKEVycm9y
U3RyaW5nJiwgaW50IG5vZGVJZCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
U3R5bGU+JiBpbmxpbmVTdHlsZSwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NT
U3R5bGU+JiBhdHRyaWJ1dGVzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgZ2V0TWF0Y2hl
ZFN0eWxlc0Zvck5vZGUoRXJyb3JTdHJpbmcmLCBpbnQgbm9kZUlkLCBjb25zdCBib29sKiBpbmNs
dWRlUHNldWRvLCBjb25zdCBib29sKiBpbmNsdWRlSW5oZXJpdGVkLCBSZWZQdHI8SW5zcGVjdG9y
OjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpSdWxlTWF0Y2g+PiYg
bWF0Y2hlZENTU1J1bGVzLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpQc2V1ZG9JZE1hdGNoZXM+PiYgcHNldWRvSWRNYXRjaGVzLCBS
ZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpJbmhlcml0ZWRTdHlsZUVudHJ5Pj4mIGluaGVyaXRlZEVudHJpZXMpIG92ZXJyaWRlOwogICAg
IHZpcnR1YWwgdm9pZCBnZXRBbGxTdHlsZVNoZWV0cyhFcnJvclN0cmluZyYsIFJlZlB0cjxJbnNw
ZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxl
U2hlZXRIZWFkZXI+PiYgc3R5bGVTaGVldEluZm9zKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHZv
aWQgZ2V0U3R5bGVTaGVldChFcnJvclN0cmluZyYsIGNvbnN0IFN0cmluZyYgc3R5bGVTaGVldElk
LCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keT4mIHJl
c3VsdCkgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCB2b2lkIGdldFN0eWxlU2hlZXRUZXh0KEVycm9y
U3RyaW5nJiwgY29uc3QgU3RyaW5nJiBzdHlsZVNoZWV0SWQsIFN0cmluZyogcmVzdWx0KSBvdmVy
cmlkZTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGVTaGVldFRleHQoRXJyb3JTdHJpbmcmLCBj
b25zdCBTdHJpbmcmIHN0eWxlU2hlZXRJZCwgY29uc3QgU3RyaW5nJiB0ZXh0KSBvdmVycmlkZTsK
KyAgICB2aXJ0dWFsIHZvaWQgZ2V0U3R5bGVTaGVldChFcnJvclN0cmluZyYsIEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldElkIHN0eWxlU2hlZXRJZCwgUmVmUHRyPEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEJvZHk+JiByZXN1bHQpIG92ZXJyaWRlOwor
ICAgIHZpcnR1YWwgdm9pZCBnZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0cmluZyYsIEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldElkIHN0eWxlU2hlZXRJZCwgU3RyaW5nKiByZXN1
bHQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0VGV4dChFcnJvclN0
cmluZyYsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldElkIHN0eWxlU2hlZXRJ
ZCwgY29uc3QgU3RyaW5nJiB0ZXh0KSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5
bGVUZXh0KEVycm9yU3RyaW5nJiwgY29uc3QgUmVmUHRyPEluc3BlY3Rvcjo6SW5zcGVjdG9yT2Jq
ZWN0PiYmIHN0eWxlSWQsIGNvbnN0IFN0cmluZyYgdGV4dCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU3R5bGU+JiByZXN1bHQpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9p
ZCBzZXRSdWxlU2VsZWN0b3IoRXJyb3JTdHJpbmcmLCBjb25zdCBSZWZQdHI8SW5zcGVjdG9yOjpJ
bnNwZWN0b3JPYmplY3Q+JiYgcnVsZUlkLCBjb25zdCBTdHJpbmcmIHNlbGVjdG9yLCBSZWZQdHI8
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiYgcmVzdWx0KSBvdmVycmlkZTsKICAg
ICB2aXJ0dWFsIHZvaWQgYWRkUnVsZShFcnJvclN0cmluZyYsIGludCBjb250ZXh0Tm9kZUlkLCBj
b25zdCBTdHJpbmcmIHNlbGVjdG9yLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpD
U1NSdWxlPiYgcmVzdWx0KSBvdmVycmlkZTsKQEAgLTEyMywzMyArMTIyLDMwIEBAIHB1YmxpYzoK
ICAgICB2aXJ0dWFsIHZvaWQgZ2V0TmFtZWRGbG93Q29sbGVjdGlvbihFcnJvclN0cmluZyYsIGlu
dCBkb2N1bWVudE5vZGVJZCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkNTUzo6TmFtZWRGbG93Pj4mIHJlc3VsdCkgb3ZlcnJpZGU7CiAKIHBy
aXZhdGU6Ci0gICAgY2xhc3MgU3R5bGVTaGVldEFjdGlvbjsKKyAgICBjbGFzcyBTdHlsZVJ1bGVT
ZXRBY3Rpb247CiAgICAgY2xhc3MgU2V0U3R5bGVTaGVldFRleHRBY3Rpb247CiAgICAgY2xhc3Mg
U2V0U3R5bGVUZXh0QWN0aW9uOwogICAgIGNsYXNzIFNldFJ1bGVTZWxlY3RvckFjdGlvbjsKICAg
ICBjbGFzcyBBZGRSdWxlQWN0aW9uOwogCi0gICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgUmVm
UHRyPEluc3BlY3RvclN0eWxlU2hlZXQ+PiBJZFRvSW5zcGVjdG9yU3R5bGVTaGVldDsKLSAgICB0
eXBlZGVmIEhhc2hNYXA8Q1NTU3R5bGVTaGVldCosIFJlZlB0cjxJbnNwZWN0b3JTdHlsZVNoZWV0
Pj4gQ1NTU3R5bGVTaGVldFRvSW5zcGVjdG9yU3R5bGVTaGVldDsKLSAgICB0eXBlZGVmIEhhc2hN
YXA8Tm9kZSosIFJlZlB0cjxJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU+PiBOb2Rl
VG9JbnNwZWN0b3JTdHlsZVNoZWV0OyAvLyBib2d1cyAic3R5bGVzaGVldHMiIHdpdGggZWxlbWVu
dHMnIGlubGluZSBzdHlsZXMKLSAgICB0eXBlZGVmIEhhc2hNYXA8UmVmUHRyPERvY3VtZW50Piwg
UmVmUHRyPEluc3BlY3RvclN0eWxlU2hlZXQ+PiBEb2N1bWVudFRvVmlhSW5zcGVjdG9yU3R5bGVT
aGVldDsgLy8gInZpYSBpbnNwZWN0b3IiIHN0eWxlc2hlZXRzCisgICAgdHlwZWRlZiBIYXNoTWFw
PHVpbnQ2NF90LCBSZWZQdHI8SW5zcGVjdG9yOjpTdHlsZVJ1bGVTZXQ+PiBJZGVudGlmaWVyVG9S
dWxlU2V0TWFwOworICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NTdHlsZVNoZWV0KiwgUmVmUHRyPElu
c3BlY3Rvcjo6U3R5bGVzaGVldFJ1bGVTZXQ+PiBDU1NTdHlsZVNoZWV0VG9SdWxlU2V0TWFwOwor
ICAgIHR5cGVkZWYgSGFzaE1hcDxOb2RlKiwgUmVmUHRyPEluc3BlY3Rvcjo6SW5saW5lU3R5bGVS
dWxlU2V0Pj4gTm9kZVRvSW5saW5lUnVsZVNldE1hcDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8UmVm
UHRyPERvY3VtZW50PiwgUmVmUHRyPEluc3BlY3Rvcjo6U3R5bGVzaGVldFJ1bGVTZXQ+PiBEb2N1
bWVudFRvSW5zcGVjdG9yUnVsZVNldE1hcDsgLy8gInZpYSBpbnNwZWN0b3IiIHN0eWxlc2hlZXRz
CiAgICAgdHlwZWRlZiBIYXNoTWFwPGludCwgdW5zaWduZWQ+IE5vZGVJZFRvRm9yY2VkUHNldWRv
U3RhdGU7CiAKICAgICB2b2lkIHJlc2V0Tm9uUGVyc2lzdGVudERhdGEoKTsKLSAgICBJbnNwZWN0
b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGUqIGFzSW5zcGVjdG9yU3R5bGVTaGVldChFbGVtZW50
KiBlbGVtZW50KTsKKyAgICBJbnNwZWN0b3I6OklubGluZVN0eWxlUnVsZVNldCogYXNJbmxpbmVS
dWxlU2V0KEVsZW1lbnQmIGVsZW1lbnQpOwogICAgIEVsZW1lbnQqIGVsZW1lbnRGb3JJZChFcnJv
clN0cmluZyYsIGludCBub2RlSWQpOwogICAgIGludCBkb2N1bWVudE5vZGVXaXRoUmVxdWVzdGVk
Rmxvd3NJZChEb2N1bWVudCopOwotICAgIHZvaWQgY29sbGVjdFN0eWxlU2hlZXRzKENTU1N0eWxl
U2hlZXQqLCBJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpD
U1M6OkNTU1N0eWxlU2hlZXRIZWFkZXI+Kik7CisgICAgdm9pZCBjb2xsZWN0U3R5bGVTaGVldHMo
Q1NTU3R5bGVTaGVldCYsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEhlYWRlcj4mKTsKIAotICAgIEluc3BlY3RvclN0eWxl
U2hlZXQqIGJpbmRTdHlsZVNoZWV0KENTU1N0eWxlU2hlZXQqKTsKLSAgICBJbnNwZWN0b3JTdHls
ZVNoZWV0KiB2aWFJbnNwZWN0b3JTdHlsZVNoZWV0KERvY3VtZW50KiwgYm9vbCBjcmVhdGVJZkFi
c2VudCk7Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldCogYXNzZXJ0U3R5bGVTaGVldEZvcklkKEVy
cm9yU3RyaW5nJiwgY29uc3QgU3RyaW5nJik7Ci0gICAgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpTdHlsZVNoZWV0T3JpZ2luIGRldGVjdE9yaWdpbihDU1NTdHlsZVNoZWV0KiBwYWdlU3R5bGVT
aGVldCwgRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpOworICAgIEluc3BlY3Rvcjo6U3R5bGVzaGVl
dFJ1bGVTZXQmIGJpbmRTdHlsZVNoZWV0KENTU1N0eWxlU2hlZXQmKTsKKyAgICBJbnNwZWN0b3I6
OlN0eWxlc2hlZXRSdWxlU2V0KiBpbnNwZWN0b3JSdWxlU2V0Rm9yRG9jdW1lbnQoRG9jdW1lbnQm
LCBib29sIGNyZWF0ZUlmQWJzZW50KTsKKyAgICBJbnNwZWN0b3I6OlN0eWxlUnVsZVNldCogcnVs
ZVNldEZvclN0eWxlc2hlZXRJZChFcnJvclN0cmluZyYsIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6U3R5bGVTaGVldElkKTsKIAotICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU1J1bGU+IGJ1aWxkT2JqZWN0Rm9yUnVsZShTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyJiwg
RWxlbWVudCopOwotICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1J1bGU+
IGJ1aWxkT2JqZWN0Rm9yUnVsZShDU1NTdHlsZVJ1bGUqKTsKKyAgICBSZWZQdHI8SW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiBidWlsZE9iamVjdEZvck1hdGNoZWRSdWxlKFN0eWxl
UnVsZSYsIFN0eWxlUmVzb2x2ZXImLCBFbGVtZW50Kik7CiAgICAgUmVmUHRyPEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6UnVsZU1hdGNoPj4gYnVp
bGRBcnJheUZvck1hdGNoZWRSdWxlTGlzdChjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlUnVsZT4+
JiwgU3R5bGVSZXNvbHZlciYsIEVsZW1lbnQqKTsKLSAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90
b2NvbDo6Q1NTOjpDU1NTdHlsZT4gYnVpbGRPYmplY3RGb3JBdHRyaWJ1dGVzU3R5bGUoRWxlbWVu
dCopOwogICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlBy
b3RvY29sOjpDU1M6OlJlZ2lvbj4+IGJ1aWxkQXJyYXlGb3JSZWdpb25zKEVycm9yU3RyaW5nJiwg
UmVmUHRyPE5vZGVMaXN0PiYmLCBpbnQgZG9jdW1lbnROb2RlSWQpOwogICAgIFJlZlB0cjxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6Ok5hbWVkRmxvdz4gYnVpbGRPYmplY3RGb3JOYW1lZEZsb3co
RXJyb3JTdHJpbmcmLCBXZWJLaXROYW1lZEZsb3cqLCBpbnQgZG9jdW1lbnROb2RlSWQpOwogCkBA
IC0xNTksNyArMTU1LDcgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgZGlkTW9kaWZ5RE9N
QXR0cihFbGVtZW50Kikgb3ZlcnJpZGU7CiAKICAgICAvLyBJbnNwZWN0b3JDU1NBZ2VudDo6TGlz
dGVuZXIgaW1wbGVtZW50YXRpb24KLSAgICB2aXJ0dWFsIHZvaWQgc3R5bGVTaGVldENoYW5nZWQo
SW5zcGVjdG9yU3R5bGVTaGVldCopIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzdHlsZVNo
ZWV0Q2hhbmdlZChJbnNwZWN0b3I6OlN0eWxlc2hlZXRSdWxlU2V0Jikgb3ZlcnJpZGU7CiAKICAg
ICB2b2lkIHJlc2V0UHNldWRvU3RhdGVzKCk7CiAKQEAgLTE2NywxNSArMTYzLDE0IEBAIHByaXZh
dGU6CiAgICAgUmVmUHRyPEluc3BlY3Rvcjo6Q1NTQmFja2VuZERpc3BhdGNoZXI+IG1fYmFja2Vu
ZERpc3BhdGNoZXI7CiAgICAgSW5zcGVjdG9yRE9NQWdlbnQqIG1fZG9tQWdlbnQ7CiAKLSAgICBJ
ZFRvSW5zcGVjdG9yU3R5bGVTaGVldCBtX2lkVG9JbnNwZWN0b3JTdHlsZVNoZWV0OwotICAgIENT
U1N0eWxlU2hlZXRUb0luc3BlY3RvclN0eWxlU2hlZXQgbV9jc3NTdHlsZVNoZWV0VG9JbnNwZWN0
b3JTdHlsZVNoZWV0OwotICAgIE5vZGVUb0luc3BlY3RvclN0eWxlU2hlZXQgbV9ub2RlVG9JbnNw
ZWN0b3JTdHlsZVNoZWV0OwotICAgIERvY3VtZW50VG9WaWFJbnNwZWN0b3JTdHlsZVNoZWV0IG1f
ZG9jdW1lbnRUb0luc3BlY3RvclN0eWxlU2hlZXQ7CisgICAgSWRlbnRpZmllclRvUnVsZVNldE1h
cCBtX2lkZW50aWZpZXJUb1J1bGVTZXRNYXA7CisgICAgQ1NTU3R5bGVTaGVldFRvUnVsZVNldE1h
cCBtX2Nzc1N0eWxlU2hlZXRUb1J1bGVTZXRNYXA7CisgICAgTm9kZVRvSW5saW5lUnVsZVNldE1h
cCBtX25vZGVUb0lubGluZVJ1bGVTZXRNYXA7CisgICAgRG9jdW1lbnRUb0luc3BlY3RvclJ1bGVT
ZXRNYXAgbV9kb2N1bWVudFRvSW5zcGVjdG9yUnVsZVNldE1hcDsKKwogICAgIE5vZGVJZFRvRm9y
Y2VkUHNldWRvU3RhdGUgbV9ub2RlSWRUb0ZvcmNlZFBzZXVkb1N0YXRlOwogICAgIEhhc2hTZXQ8
aW50PiBtX25hbWVkRmxvd0NvbGxlY3Rpb25zUmVxdWVzdGVkOwogICAgIHN0ZDo6dW5pcXVlX3B0
cjxDaGFuZ2VSZWdpb25PdmVyc2V0VGFzaz4gbV9jaGFuZ2VSZWdpb25PdmVyc2V0VGFzazsKLQot
ICAgIGludCBtX2xhc3RTdHlsZVNoZWV0SWQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTSWQuaCBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NJZC5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzRiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTSWQuaApAQCAtMCwwICsxLDc5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IFVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
CisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgSW5zcGVjdG9yQ1NTSWRfaAorI2RlZmluZSBJbnNwZWN0b3JDU1NJZF9oCisK
KyNpbmNsdWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNw
YWNlIEluc3BlY3RvciB7CisKK2NsYXNzIENTU0lkIHsKK3B1YmxpYzoKKyAgICBDU1NJZCgpIHsg
fQorCisgICAgZXhwbGljaXQgQ1NTSWQoY29uc3QgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4mJiB2
YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICghdmFsdWUtPmdldEludGVnZXIoQVNDSUlMaXRlcmFs
KCJzdHlsZVNoZWV0SWQiKSwgbV9zdHlsZXNoZWV0SWQpKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGlmICghdmFsdWUtPmdldEludGVnZXIoQVNDSUlMaXRlcmFsKCJvcmRpbmFsIiks
IG1fcnVsZU9yZGluYWwpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENTU0lk
KHVpbnQ2NF90IHN0eWxlc2hlZXRJZCwgdWludDY0X3QgcnVsZU9yZGluYWwpCisgICAgICAgIDog
bV9zdHlsZXNoZWV0SWQoc3R5bGVzaGVldElkKQorICAgICAgICAsIG1fcnVsZU9yZGluYWwocnVs
ZU9yZGluYWwpCisgICAgeworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0
dXJuICFtX3N0eWxlc2hlZXRJZDsgfQorCisgICAgdWludDY0X3Qgc3R5bGVzaGVldElkKCkgY29u
c3QgeyByZXR1cm4gbV9zdHlsZXNoZWV0SWQ7IH0KKyAgICB1aW50NjRfdCBydWxlT3JkaW5hbCgp
IGNvbnN0IHsgcmV0dXJuIG1fcnVsZU9yZGluYWw7IH0KKworICAgIC8vIFByb3RvY29sVHlwZSBp
cyBlaXRoZXIgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZUlkIG9yIEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZUlkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByb3Rv
Y29sVHlwZT4KKyAgICBSZWZQdHI8UHJvdG9jb2xUeXBlPiBhc1Byb3RvY29sVmFsdWUoKSBjb25z
dAorICAgIHsKKyAgICAgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxs
cHRyOworCisgICAgICAgIHJldHVybiBQcm90b2NvbFR5cGU6OmNyZWF0ZSgpCisgICAgICAgICAg
ICAuc2V0U3R5bGVTaGVldElkKG1fc3R5bGVzaGVldElkKQorICAgICAgICAgICAgLnNldE9yZGlu
YWwobV9ydWxlT3JkaW5hbCkKKyAgICAgICAgICAgIC5yZWxlYXNlKCk7CisgICAgfQorCitwcml2
YXRlOgorICAgIHVpbnQ2NF90IG1fc3R5bGVzaGVldElkIHswfTsKKyAgICB1aW50NjRfdCBtX3J1
bGVPcmRpbmFsIHswfTsKK307CisKK30gLy8gbmFtZXNwYWNlIEluc3BlY3RvcgorCisjZW5kaWYg
Ly8gSW5zcGVjdG9yQ1NTSWRfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3RvckRPTVRyYWNpbmdBZ2VudC5oIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3RvckRPTVRyYWNpbmdBZ2VudC5oCmluZGV4IDJkYTU2MjAuLmQ5MjFkOTggMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01UcmFjaW5nQWdlbnQuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRE9NVHJhY2luZ0FnZW50LmgK
QEAgLTEyNyw3ICsxMjcsNyBAQCBwcml2YXRlOgogICAgIC8vIGRpZFBhaW50KCkgaW5zdHJ1bWVu
dGF0aW9uIGZpcmVzIHVuZGVybmVhdGggdGhlIG5vZGUgc25hcHNob3R0aW5nIGNvZGUuCiAgICAg
Ym9vbCBtX2lzU25hcHNob3R0aW5nRWxlbWVudCB7ZmFsc2V9OwogfTsKLSAgICAKKwogfSAvLyBu
YW1lc3BhY2UgSW5zcGVjdG9yCiAKICNlbmRpZiAvLyAhZGVmaW5lZChJbnNwZWN0b3JET01UcmFj
aW5nQWdlbnRfaCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0
b3JJbmxpbmVTdHlsZVJ1bGVTZXQuY3BwIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3Bl
Y3RvcklubGluZVN0eWxlUnVsZVNldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uNTdkZGI1MwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9JbnNwZWN0b3JJbmxpbmVTdHlsZVJ1bGVTZXQuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IFVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
CisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JJbmxpbmVTdHlsZVJ1
bGVTZXQuaCIKKworI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkVsZW1lbnQu
aCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NBZ2VudC5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0
eWxlUnVsZS5oIgorI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlICJTdHlsZWRFbGVtZW50Lmgi
CisjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0aWVzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgSW5zcGVjdG9yIHsKKworUmVmPElubGluZVN0eWxlUnVsZVNldD4gSW5s
aW5lU3R5bGVSdWxlU2V0OjpjcmVhdGUoUmVmPEVsZW1lbnQ+JiYgZWxlbWVudCkKK3sKKyAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBJbmxpbmVTdHlsZVJ1bGVTZXQoV1RGOjptb3ZlKGVsZW1lbnQp
KSk7Cit9CisKK0lubGluZVN0eWxlUnVsZVNldDo6SW5saW5lU3R5bGVSdWxlU2V0KFJlZjxFbGVt
ZW50PiYmIGVsZW1lbnQpCisgICAgOiBTdHlsZVJ1bGVTZXQoKQorICAgICwgbV9lbGVtZW50KFdU
Rjo6bW92ZShlbGVtZW50KSkKK3sKK30KKworSW5saW5lU3R5bGVSdWxlU2V0Ojp+SW5saW5lU3R5
bGVSdWxlU2V0KCkgeyB9CisKK3ZvaWQgSW5saW5lU3R5bGVSdWxlU2V0OjpyZXBsYWNlVGV4dChj
b25zdCBTdHJpbmcmIHRleHQpCit7CisgICAgeworICAgICAgICBJbnNwZWN0b3JDU1NBZ2VudDo6
SW5saW5lU3R5bGVPdmVycmlkZVNjb3BlIG92ZXJyaWRlU2NvcGUoJm1fZWxlbWVudC0+ZG9jdW1l
bnQoKSk7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7CisgICAgICAgIG1fZWxlbWVudC0+c2V0
QXR0cmlidXRlKCJzdHlsZSIsIHRleHQsIGVjKTsKKyAgICB9CisKKyAgICBjb21taXRSdWxlU2V0
Q2hhbmdlKFBhcnNlZFJ1bGVTZXREYXRhOjpjcmVhdGUobV9lbGVtZW50KSk7Cit9CisKK2Jvb2wg
SW5saW5lU3R5bGVSdWxlU2V0OjpzZXRUZXh0Rm9yU3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiYg
c3R5bGUsIGNvbnN0IFN0cmluZyYgc3R5bGVUZXh0KQoreworICAgIEFTU0VSVF9VTlVTRUQoc3R5
bGUsICZzdHlsZSA9PSBpbmxpbmVTdHlsZSgpKTsKKworICAgIHJlcGxhY2VUZXh0KHN0eWxlVGV4
dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSW5saW5lU3R5bGVSdWxlU2V0OjpkaWRN
b2RpZnlFbGVtZW50QXR0cmlidXRlKCkKK3sKKyAgICAvLyBEcm9wIHN0YWxlIHBhcnNlZCBkYXRh
IHNpbmNlIGl0IGNhbiBiZSByZWdlbmVyYXRlZCB3aGVuIG5lZWRlZC4KKyAgICBjb21taXRSdWxl
U2V0Q2hhbmdlKG51bGxwdHIpOworfQorCitEb2N1bWVudCogSW5saW5lU3R5bGVSdWxlU2V0Ojpv
d25lckRvY3VtZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gJm1fZWxlbWVudC0+ZG9jdW1lbnQo
KTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRhPiBJbmxpbmVTdHlsZVJ1
bGVTZXQ6Om9yaWdpbmFsU291cmNlRGF0YSgpCit7CisgICAgcmV0dXJuIFBhcnNlZFJ1bGVTZXRE
YXRhOjpjcmVhdGUobV9lbGVtZW50LmdldCgpKTsKK30KKworQ1NTU3R5bGVEZWNsYXJhdGlvbiog
SW5saW5lU3R5bGVSdWxlU2V0OjppbmxpbmVTdHlsZSgpCit7CisgICAgcmV0dXJuIG1fZWxlbWVu
dC0+c3R5bGUoKTsKK30KKworQ1NTU3R5bGVEZWNsYXJhdGlvbiogSW5saW5lU3R5bGVSdWxlU2V0
OjphdHRyaWJ1dGVTdHlsZSgpCit7CisgICAgaWYgKCFpczxTdHlsZWRFbGVtZW50PihtX2VsZW1l
bnQpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGNvbnN0IFN0eWxlUHJvcGVydGll
cyogYXR0cmlidXRlU3R5bGUgPSBkb3duY2FzdDxTdHlsZWRFbGVtZW50PihtX2VsZW1lbnQuZ2V0
KCkpLnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCk7CisgICAgCisgICAgaWYgKCFpczxNdXRh
YmxlU3R5bGVQcm9wZXJ0aWVzPihhdHRyaWJ1dGVTdHlsZSkpCisgICAgICAgIHJldHVybiBudWxs
cHRyOworICAgIAorICAgIGNvbnN0IE11dGFibGVTdHlsZVByb3BlcnRpZXMqIG11dGFibGVBdHRy
aWJ1dGVTdHlsZSA9IGRvd25jYXN0PE11dGFibGVTdHlsZVByb3BlcnRpZXM+KGF0dHJpYnV0ZVN0
eWxlKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNdXRhYmxlU3R5bGVQcm9wZXJ0aWVzKj4obXV0
YWJsZUF0dHJpYnV0ZVN0eWxlKS0+ZW5zdXJlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvSW5zcGVjdG9ySW5saW5lU3R5bGVSdWxlU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMjQ4NGRiNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9JbnNwZWN0b3JJbmxpbmVTdHlsZVJ1bGVTZXQuaApAQCAtMCwwICsxLDk4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDE1IFVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpZm5kZWYgSW5saW5lU3R5bGVSdWxlU2V0X2gKKyNkZWZpbmUgSW5saW5lU3R5bGVS
dWxlU2V0X2gKKworI2luY2x1ZGUgIkluc3BlY3RvckNTU0lkLmgiCisjaW5jbHVkZSAiSW5zcGVj
dG9yU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmgiCisjaW5j
bHVkZSA8d3RmL1R5cGVDYXN0cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDU1NT
dHlsZURlY2xhcmF0aW9uOworY2xhc3MgRWxlbWVudDsKK3N0cnVjdCBDU1NSdWxlU291cmNlRGF0
YTsKK30KKworbmFtZXNwYWNlIEluc3BlY3RvciB7CisKK2NsYXNzIElubGluZVN0eWxlUnVsZVNl
dCBmaW5hbCA6IHB1YmxpYyBTdHlsZVJ1bGVTZXQgeworcHVibGljOgorICAgIHN0YXRpYyBSZWY8
SW5saW5lU3R5bGVSdWxlU2V0PiBjcmVhdGUoUmVmPFdlYkNvcmU6OkVsZW1lbnQ+JiYpOworICAg
IHZpcnR1YWwgfklubGluZVN0eWxlUnVsZVNldCgpOworCisgICAgLy8gU3R5bGVSdWxlU2V0IEFQ
SQorICAgIHZpcnR1YWwgYm9vbCBpc0lubGluZVN0eWxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1
cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgdm9pZCByZXBsYWNlVGV4dChjb25zdCBTdHJpbmcmKSBv
dmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRh
PiBvcmlnaW5hbFNvdXJjZURhdGEoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkRv
Y3VtZW50KiBvd25lckRvY3VtZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBJbmxpbmVT
dHlsZVJ1bGVTZXQgQVBJCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4gdm9pZCB3aXRo
SW5saW5lU3R5bGUoY29uc3QgRnVuY3RvciYpOworICAgIC8vIFRoaXMgcmV0dXJucyBhIFN0eWxl
UnVsZSByZXByZXNlbnRpbmcgQ1NTIHN0eWxlcyBpbmR1Y2VkIGJ5IHByZXNlbnRhdGlvbiBhdHRy
aWJ1dGVzLAorICAgIC8vIHN1Y2ggYXMgJ3dpZHRoJywgJ2FsaWduJywgYW5kIG90aGVyIGxlZ2Fj
eSB0YWcgYXR0cmlidXRlcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPiB2b2lkIHdp
dGhBdHRyaWJ1dGVTdHlsZShjb25zdCBGdW5jdG9yJik7CisKKyAgICAvLyBDYWxsZWQgZnJvbSBD
U1NBZ2VudCB0aHJvdWdoIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbi4KKyAgICB2b2lkIGRpZE1v
ZGlmeUVsZW1lbnRBdHRyaWJ1dGUoKTsKK3ByaXZhdGU6CisgICAgSW5saW5lU3R5bGVSdWxlU2V0
KFJlZjxXZWJDb3JlOjpFbGVtZW50PiYmKTsKKworICAgIFdlYkNvcmU6OkNTU1N0eWxlRGVjbGFy
YXRpb24qIGlubGluZVN0eWxlKCk7CisgICAgV2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiog
YXR0cmlidXRlU3R5bGUoKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRUZXh0Rm9yU3R5bGUoV2Vi
Q29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiYsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIFJlZjxXZWJDb3JlOjpFbGVtZW50PiBtX2VsZW1lbnQ7Cit9OworCit0ZW1w
bGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgoraW5saW5lIHZvaWQgSW5saW5lU3R5bGVSdWxlU2V0Ojp3
aXRoSW5saW5lU3R5bGUoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKK3sKKyAgICBTdHlsZURlY2xh
cmF0aW9uIHdyYXBwZXIoQ1NTSWQoaWRlbnRpZmllcigpLCAwKSwgKmlubGluZVN0eWxlKCksIHRo
aXMpOworICAgIGZ1bmN0b3Iod3JhcHBlcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0
b3I+CitpbmxpbmUgdm9pZCBJbmxpbmVTdHlsZVJ1bGVTZXQ6OndpdGhBdHRyaWJ1dGVTdHlsZShj
b25zdCBGdW5jdG9yJiBmdW5jdG9yKQoreworICAgIGF1dG8gc3R5bGUgPSBhdHRyaWJ1dGVTdHls
ZSgpOworICAgIGlmICghc3R5bGUpCisgICAgICAgIHJldHVybjsKKworICAgIFN0eWxlRGVjbGFy
YXRpb24gd3JhcHBlcihDU1NJZChpZGVudGlmaWVyKCksIDApLCAqc3R5bGUsIHRoaXMpOworICAg
IGZ1bmN0b3Iod3JhcHBlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIEluc3BlY3RvcgorCitTUEVD
SUFMSVpFX1RZUEVfVFJBSVRTX0JFR0lOKEluc3BlY3Rvcjo6SW5saW5lU3R5bGVSdWxlU2V0KQor
c3RhdGljIGJvb2wgaXNUeXBlKGNvbnN0IEluc3BlY3Rvcjo6U3R5bGVSdWxlU2V0JiBydWxlU2V0
KSB7IHJldHVybiBydWxlU2V0LmlzSW5saW5lU3R5bGUoKTsgfQorU1BFQ0lBTElaRV9UWVBFX1RS
QUlUU19FTkQoKQorCisjZW5kaWYgLy8gSW5saW5lU3R5bGVSdWxlU2V0X2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCBiL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaAppbmRleCAw
YjBhZDkzLi45ODY5MzcxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCkBAIC0yODMsNiArMjgzLDcgQEAgcHVibGljOgogICAg
IHN0YXRpYyBib29sIHJlcGxheUFnZW50RW5hYmxlZChTY3JpcHRFeGVjdXRpb25Db250ZXh0Kik7
CiAKICAgICBXRUJDT1JFX0VYUE9SVCBzdGF0aWMgSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1
bWVudGluZ0FnZW50c0ZvclBhZ2UoUGFnZSopOworICAgIHN0YXRpYyBJbnN0cnVtZW50aW5nQWdl
bnRzKiBpbnN0cnVtZW50aW5nQWdlbnRzRm9yRnJhbWUoRnJhbWUqKTsKIAogICAgIHN0YXRpYyB2
b2lkIHJlZ2lzdGVySW5zdHJ1bWVudGluZ0FnZW50cyhJbnN0cnVtZW50aW5nQWdlbnRzJik7CiAg
ICAgc3RhdGljIHZvaWQgdW5yZWdpc3Rlckluc3RydW1lbnRpbmdBZ2VudHMoSW5zdHJ1bWVudGlu
Z0FnZW50cyYpOwpAQCAtNDQ5LDcgKzQ1MCw2IEBAIHByaXZhdGU6CiAKICAgICBzdGF0aWMgSW5z
dHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50c0ZvclBhZ2UoUGFnZSYpOwogICAg
IHN0YXRpYyBJbnN0cnVtZW50aW5nQWdlbnRzKiBpbnN0cnVtZW50aW5nQWdlbnRzRm9yRnJhbWUo
RnJhbWUmKTsKLSAgICBzdGF0aWMgSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0Fn
ZW50c0ZvckZyYW1lKEZyYW1lKik7CiAgICAgc3RhdGljIEluc3RydW1lbnRpbmdBZ2VudHMqIGlu
c3RydW1lbnRpbmdBZ2VudHNGb3JDb250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqKTsKICAg
ICBzdGF0aWMgSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50c0ZvckRvY3Vt
ZW50KERvY3VtZW50Jik7CiAgICAgc3RhdGljIEluc3RydW1lbnRpbmdBZ2VudHMqIGluc3RydW1l
bnRpbmdBZ2VudHNGb3JEb2N1bWVudChEb2N1bWVudCopOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclJ1bGVTZWxlY3Rvci5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yUnVsZVNlbGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi4wODY0NmJmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL0luc3BlY3RvclJ1bGVTZWxlY3Rvci5jcHAKQEAgLTAsMCArMSw4MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24uCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yUnVsZVNlbGVj
dG9yLmgiCisKKyNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hl
Y2tlci5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIEluc3BlY3Rv
ciB7CisKK3Vuc2lnbmVkIFJ1bGVTZWxlY3Rvcjo6c3RhdGljU3BlY2lmaWNpdHkoKSBjb25zdAor
eworICAgIGJvb2wgc3VjY2VzczsKKyAgICB1bnNpZ25lZCByZXN1bHQgPSBtX3NlbGVjdG9yLnN0
YXRpY1NwZWNpZmljaXR5KHN1Y2Nlc3MpOworICAgIHJldHVybiBzdWNjZXNzID8gcmVzdWx0IDog
MDsKK30KKwordW5zaWduZWQgUnVsZVNlbGVjdG9yOjpkeW5hbWljU3BlY2lmaWNpdHkoRWxlbWVu
dCYgZWxlbWVudCkgY29uc3QKK3sKKyAgICBTZWxlY3RvckNoZWNrZXI6OkNoZWNraW5nQ29udGV4
dCBjb250ZXh0KFNlbGVjdG9yQ2hlY2tlcjo6TW9kZTo6Q29sbGVjdGluZ1J1bGVzKTsKKyAgICBT
ZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGVsZW1lbnQuZG9jdW1lbnQoKSk7CisKKyAg
ICB1bnNpZ25lZCBjb21wdXRlZFNwZWNpZmljaXR5OworICAgIGlmICghc2VsZWN0b3JDaGVja2Vy
Lm1hdGNoKCZtX3NlbGVjdG9yLCAmZWxlbWVudCwgY29udGV4dCwgY29tcHV0ZWRTcGVjaWZpY2l0
eSkpCisgICAgICAgIHJldHVybiBzdGF0aWNTcGVjaWZpY2l0eSgpOworCisgICAgcmV0dXJuIGNv
bXB1dGVkU3BlY2lmaWNpdHk7Cit9CisKK2Jvb2wgUnVsZVNlbGVjdG9yOjptYXRjaGVzRWxlbWVu
dChFbGVtZW50JiBlbGVtZW50KSBjb25zdAoreworICAgIFNlbGVjdG9yQ2hlY2tlcjo6Q2hlY2tp
bmdDb250ZXh0IGNvbnRleHQoU2VsZWN0b3JDaGVja2VyOjpNb2RlOjpDb2xsZWN0aW5nUnVsZXMp
OworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZWxlbWVudC5kb2N1bWVudCgp
KTsKKworICAgIHVuc2lnbmVkIGlnbm9yZWRTcGVjaWZpY2l0eTsKKyAgICByZXR1cm4gc2VsZWN0
b3JDaGVja2VyLm1hdGNoKCZtX3NlbGVjdG9yLCAmZWxlbWVudCwgY29udGV4dCwgaWdub3JlZFNw
ZWNpZmljaXR5KTsKK30KKworYm9vbCBSdWxlU2VsZWN0b3I6Omhhc0R5bmFtaWNTcGVjaWZpY2l0
eSgpIGNvbnN0Cit7CisgICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGVzZSBjYW4gaGF2ZSBh
IHN0YXRpYyBzcGVjaWZpY2l0eSBpZiBlYWNoIHNlbGVjdG9yIGluIHRoZSBsaXN0IGhhcworICAg
IC8vIGVxdWFsIHNwZWNpZmljaXR5LCBidXQgbGV0cyBhbHdheXMgcmVwb3J0IHRoYXQgdGhleSBj
YW4gYmUgZHluYW1pYy4KKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciA9ICZt
X3NlbGVjdG9yOyBzZWxlY3Rvcjsgc2VsZWN0b3IgPSBzZWxlY3Rvci0+dGFnSGlzdG9yeSgpKSB7
CisgICAgICAgIGlmIChzZWxlY3Rvci0+bWF0Y2goKSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xh
c3MpIHsKKyAgICAgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzc1R5cGUgcHNldWRvQ2xh
c3NUeXBlID0gc2VsZWN0b3ItPnBzZXVkb0NsYXNzVHlwZSgpOworICAgICAgICAgICAgaWYgKHBz
ZXVkb0NsYXNzVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3NNYXRjaGVzKQorICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKHBzZXVkb0NsYXNzVHlwZSA9
PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3NOdGhDaGlsZCB8fCBwc2V1ZG9DbGFzc1R5cGUgPT0g
Q1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzTnRoTGFzdENoaWxkKSB7CisgICAgICAgICAgICAgICAg
aWYgKHNlbGVjdG9yLT5zZWxlY3Rvckxpc3QoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBJ
bnNwZWN0b3IKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JS
dWxlU2VsZWN0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JSdWxlU2Vs
ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGRkYjI5Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclJ1bGVTZWxl
Y3Rvci5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVy
c2l0eSBvZiBXYXNoaW5ndG9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJbnNwZWN0b3JSdWxlU2Vs
ZWN0b3JfaAorI2RlZmluZSBJbnNwZWN0b3JSdWxlU2VsZWN0b3JfaAorCisjaW5jbHVkZSA8d3Rm
L3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIENTU1NlbGVj
dG9yOworY2xhc3MgRWxlbWVudDsKK30KKworbmFtZXNwYWNlIEluc3BlY3RvciB7CisKK2NsYXNz
IFN0eWxlUnVsZTsKKworY2xhc3MgUnVsZVNlbGVjdG9yIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShSdWxlU2VsZWN0b3IpOworcHVibGljOgorICAgIFJ1bGVTZWxlY3RvcihSdWxlU2VsZWN0
b3ImJikgPSBkZWZhdWx0OworICAgIFJ1bGVTZWxlY3Rvcihjb25zdCBXZWJDb3JlOjpDU1NTZWxl
Y3RvciYgc2VsZWN0b3IsIFN0cmluZyBzZWxlY3RvclRleHQpCisgICAgICAgIDogbV9zZWxlY3Rv
cihzZWxlY3RvcikKKyAgICAgICAgLCBtX3NlbGVjdG9yVGV4dChzZWxlY3RvclRleHQpCisgICAg
eworICAgIH0KKworICAgIFN0cmluZyBzZWxlY3RvclRleHQoKSBjb25zdCB7IHJldHVybiBtX3Nl
bGVjdG9yVGV4dDsgfQorCisgICAgLy8gSWYgaGFzRHluYW1pY1NwZWNpZmljaXR5KCksIHRoZW4g
c3BlY2lmaWNpdHkgbWF5IGNoYW5nZSBwZXItZWxlbWVudCBpZgorICAgIC8vIHRoZSBzZWxlY3Rv
ciBtdWx0aXBseS1tYXRjaGVzIHRoZSBlbGVtZW50ICh0aHJvdWdoIDptYXRjaGVzKS4KKyAgICBi
b29sIGhhc0R5bmFtaWNTcGVjaWZpY2l0eSgpIGNvbnN0OworICAgIHVuc2lnbmVkIHN0YXRpY1Nw
ZWNpZmljaXR5KCkgY29uc3Q7CisgICAgdW5zaWduZWQgZHluYW1pY1NwZWNpZmljaXR5KFdlYkNv
cmU6OkVsZW1lbnQmKSBjb25zdDsKKyAgICBib29sIG1hdGNoZXNFbGVtZW50KFdlYkNvcmU6OkVs
ZW1lbnQmKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBXZWJDb3JlOjpDU1NTZWxlY3Rv
ciYgbV9zZWxlY3RvcjsKKyAgICBTdHJpbmcgbV9zZWxlY3RvclRleHQ7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBJbnNwZWN0b3IKKworI2VuZGlmIC8vIEluc3BlY3RvclJ1bGVTZWxlY3Rvcl9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVEZWNsYXJh
dGlvbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVEZWNsYXJh
dGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlODQ1ZQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZURl
Y2xhcmF0aW9uLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
NSBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVSdWxlLmgiCisKKyNpbmNsdWRlICJDU1NQYXJz
ZXIuaCIKKyNpbmNsdWRlICJDU1NQcm9wZXJ0eVNvdXJjZURhdGEuaCIKKyNpbmNsdWRlICJDU1NT
dHlsZURlY2xhcmF0aW9uLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ1NTQWdlbnQuaCIKKyNpbmNs
dWRlICJJbnNwZWN0b3JTdHlsZVByb3BlcnR5LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVS
dWxlU2V0LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgPGluc3BlY3Rvci9Db250ZW50
U2VhcmNoVXRpbGl0aWVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3Bh
Y2UgSW5zcGVjdG9yIHsKKworU3R5bGVEZWNsYXJhdGlvbjo6U3R5bGVEZWNsYXJhdGlvbihjb25z
dCBDU1NJZCYgc3R5bGVJZCwgQ1NTU3R5bGVEZWNsYXJhdGlvbiYgZGVjbGFyYXRpb24sIFN0eWxl
UnVsZVNldCogcnVsZVNldCkKKyAgICA6IG1fc3R5bGVJZChzdHlsZUlkKQorICAgICwgbV9kZWNs
YXJhdGlvbihkZWNsYXJhdGlvbikKKyAgICAsIG1fcnVsZVNldChydWxlU2V0KQoreworfQorCitT
dHlsZURlY2xhcmF0aW9uOjp+U3R5bGVEZWNsYXJhdGlvbigpCit7Cit9CisKK3ZvaWQgU3R5bGVE
ZWNsYXJhdGlvbjo6cG9wdWxhdGVQcm9wZXJ0aWVzKFZlY3RvcjxTdHlsZVByb3BlcnR5PiYgcmVz
dWx0KQoreworICAgIEhhc2hTZXQ8U3RyaW5nPiBmb3VuZFByb3BlcnRpZXM7CisKKyAgICBpZiAo
UmVmUHRyPFdlYkNvcmU6OkNTU1J1bGVTb3VyY2VEYXRhPiBzb3VyY2VEYXRhID0gc3R5bGVTb3Vy
Y2VEYXRhKCkpIHsKKyAgICAgICAgVmVjdG9yPFdlYkNvcmU6OkNTU1Byb3BlcnR5U291cmNlRGF0
YT4mIHNvdXJjZVByb3BlcnR5RGF0YSA9IHNvdXJjZURhdGEtPnN0eWxlU291cmNlRGF0YS0+cHJv
cGVydHlEYXRhOworCisgICAgICAgIGZvciAoYXV0byYgZGF0YSA6IHNvdXJjZVByb3BlcnR5RGF0
YSkgeworICAgICAgICAgICAgZm91bmRQcm9wZXJ0aWVzLmFkZChkYXRhLm5hbWUubG93ZXIoKSk7
CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0eWxlUHJvcGVydHkoKnRoaXMsIGRhdGEsIHRy
dWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gbV9k
ZWNsYXJhdGlvbi5sZW5ndGgoKTsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBTdHJpbmcgbmFt
ZSA9IG1fZGVjbGFyYXRpb24uaXRlbShpKTsKKyAgICAgICAgaWYgKGZvdW5kUHJvcGVydGllcy5j
b250YWlucyhuYW1lLmxvd2VyKCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
Zm91bmRQcm9wZXJ0aWVzLmFkZChuYW1lLmxvd2VyKCkpOworICAgICAgICByZXN1bHQuYXBwZW5k
KFN0eWxlUHJvcGVydHkoKnRoaXMsIFdlYkNvcmU6OkNTU1Byb3BlcnR5U291cmNlRGF0YShuYW1l
LCBtX2RlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUobmFtZSksICFtX2RlY2xhcmF0aW9uLmdl
dFByb3BlcnR5UHJpb3JpdHkobmFtZSkuaXNFbXB0eSgpLCB0cnVlLCBXZWJDb3JlOjpTb3VyY2VS
YW5nZSgpKSwgZmFsc2UpKTsKKyAgICB9Cit9CisKK2Jvb2wgU3R5bGVEZWNsYXJhdGlvbjo6Z2V0
U3R5bGVUZXh0KFN0cmluZyYgcmVzdWx0KQoreworICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0
YT4gc291cmNlRGF0YSA9IHN0eWxlU291cmNlRGF0YSgpOworICAgIGlmICghc291cmNlRGF0YSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU3RyaW5nIHN0eWxlc2hlZXRUZXh0ID0gbV9y
dWxlU2V0LT5nZXRUZXh0KCk7CisgICAgU291cmNlUmFuZ2UmIGJvZHlSYW5nZSA9IHNvdXJjZURh
dGEtPnJ1bGVCb2R5UmFuZ2U7CisgICAgcmVzdWx0ID0gc3R5bGVzaGVldFRleHQuc3Vic3RyaW5n
KGJvZHlSYW5nZS5zdGFydCwgYm9keVJhbmdlLmVuZCAtIGJvZHlSYW5nZS5zdGFydCk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5bGVEZWNsYXJhdGlvbjo6Z2V0U3R5bGVUZXh0UmFu
Z2UoVGV4dFBvc2l0aW9uJiBzdGFydCwgVGV4dFBvc2l0aW9uJiBlbmQpCit7CisgICAgaWYgKCFp
c0Zyb21Tb3VyY2UoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byBzb3VyY2VE
YXRhID0gc3R5bGVTb3VyY2VEYXRhKCk7CisgICAgYXV0byBsaW5lRW5kaW5ncyA9IG1fcnVsZVNl
dC0+cGFyc2VkUnVsZVNldERhdGEoKS5saW5lRW5kaW5ncygpOworICAgIHN0YXJ0ID0gQ29udGVu
dFNlYXJjaFV0aWxpdGllczo6dGV4dFBvc2l0aW9uRnJvbU9mZnNldChzb3VyY2VEYXRhLT5ydWxl
Qm9keVJhbmdlLnN0YXJ0LCBsaW5lRW5kaW5ncyk7CisgICAgZW5kID0gQ29udGVudFNlYXJjaFV0
aWxpdGllczo6dGV4dFBvc2l0aW9uRnJvbU9mZnNldChzb3VyY2VEYXRhLT5ydWxlQm9keVJhbmdl
LmVuZCwgbGluZUVuZGluZ3MpOworICAgIHJldHVybiB0cnVlOworfQorCitSZWZQdHI8Q1NTUnVs
ZVNvdXJjZURhdGE+IFN0eWxlRGVjbGFyYXRpb246OnN0eWxlU291cmNlRGF0YSgpCit7CisgICAg
cmV0dXJuIG1fcnVsZVNldCA/IG1fcnVsZVNldC0+c291cmNlRGF0YUZvclN0eWxlKG1fZGVjbGFy
YXRpb24pIDogbnVsbHB0cjsKK30KKworYm9vbCBTdHlsZURlY2xhcmF0aW9uOjpzZXRTdHlsZVRl
eHQoY29uc3QgU3RyaW5nJiBzdHlsZVRleHQpCit7CisgICAgaWYgKCFtX3J1bGVTZXQpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBtX3J1bGVTZXQtPnNldFRleHRGb3JTdHls
ZShtX2RlY2xhcmF0aW9uLCBzdHlsZVRleHQpOworfQorCitTdHJpbmcgU3R5bGVEZWNsYXJhdGlv
bjo6c2hvcnRoYW5kVmFsdWUoY29uc3QgU3RyaW5nJiBzaG9ydGhhbmRQcm9wZXJ0eSkKK3sKKyAg
ICBTdHJpbmcgdmFsdWUgPSBtX2RlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoc2hvcnRoYW5k
UHJvcGVydHkpOworICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdmFs
dWU7CisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBtX2RlY2xhcmF0aW9uLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nIGluZGl2
aWR1YWxQcm9wZXJ0eSA9IG1fZGVjbGFyYXRpb24uaXRlbShpKTsKKyAgICAgICAgaWYgKG1fZGVj
bGFyYXRpb24uZ2V0UHJvcGVydHlTaG9ydGhhbmQoaW5kaXZpZHVhbFByb3BlcnR5KSAhPSBzaG9y
dGhhbmRQcm9wZXJ0eSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobV9kZWNs
YXJhdGlvbi5pc1Byb3BlcnR5SW1wbGljaXQoaW5kaXZpZHVhbFByb3BlcnR5KSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBTdHJpbmcgaW5kaXZpZHVhbFZhbHVlID0gbV9kZWNsYXJh
dGlvbi5nZXRQcm9wZXJ0eVZhbHVlKGluZGl2aWR1YWxQcm9wZXJ0eSk7CisgICAgICAgIGlmIChp
bmRpdmlkdWFsVmFsdWUgPT0gImluaXRpYWwiKQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIGlmICghYnVpbGRlci5pc0VtcHR5KCkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgn
ICcpOworICAgICAgICBidWlsZGVyLmFwcGVuZChpbmRpdmlkdWFsVmFsdWUpOworICAgIH0KKyAg
ICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVEZWNs
YXJhdGlvbi5oIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlRGVjbGFy
YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGUxYTVjCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlRGVj
bGFyYXRpb24uaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE1IFVu
aXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSW5zcGVjdG9yU3R5
bGVEZWNsYXJhdGlvbl9oCisjZGVmaW5lIEluc3BlY3RvclN0eWxlRGVjbGFyYXRpb25faAorCisj
aW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNTU0lk
LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oIgorI2luY2x1ZGUgPGluc3Bl
Y3Rvci9JbnNwZWN0b3JQcm90b2NvbE9iamVjdHMuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CitjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOworc3RydWN0IENTU1N0eWxlU291cmNlRGF0YTsK
K307CisKK25hbWVzcGFjZSBJbnNwZWN0b3IgeworCitjbGFzcyBTdHlsZVJ1bGVTZXQ7CitjbGFz
cyBTdHlsZVByb3BlcnR5OworCitjbGFzcyBTdHlsZURlY2xhcmF0aW9uIGZpbmFsIHsKK1dURl9N
QUtFX05PTkNPUFlBQkxFKFN0eWxlRGVjbGFyYXRpb24pOworcHVibGljOgorICAgIFN0eWxlRGVj
bGFyYXRpb24oU3R5bGVEZWNsYXJhdGlvbiYmKSA9IGRlZmF1bHQ7CisgICAgU3R5bGVEZWNsYXJh
dGlvbihjb25zdCBDU1NJZCYgc3R5bGVJZCwgV2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiYs
IFN0eWxlUnVsZVNldCogcnVsZVNldCk7CisgICAgflN0eWxlRGVjbGFyYXRpb24oKTsKKworICAg
IFdlYkNvcmU6OkNTU1N0eWxlRGVjbGFyYXRpb24mIGRlY2xhcmF0aW9uKCkgeyByZXR1cm4gbV9k
ZWNsYXJhdGlvbjsgfQorICAgIFJlZlB0cjxXZWJDb3JlOjpDU1NSdWxlU291cmNlRGF0YT4gc3R5
bGVTb3VyY2VEYXRhKCk7CisgICAgQ1NTSWQgc3R5bGVJZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5
bGVJZDsgfQorICAgIFN0eWxlUnVsZVNldCogc3R5bGVSdWxlU2V0KCkgY29uc3QgeyByZXR1cm4g
bV9ydWxlU2V0OyB9CisKKyAgICBib29sIGlzRnJvbVNvdXJjZSgpIHsgcmV0dXJuICEhc3R5bGVT
b3VyY2VEYXRhKCk7IH0KKworICAgIGJvb2wgZ2V0U3R5bGVUZXh0KFN0cmluZyYgcmVzdWx0KTsK
KyAgICBib29sIHNldFN0eWxlVGV4dChjb25zdCBTdHJpbmcmKTsKKworICAgIGJvb2wgZ2V0U3R5
bGVUZXh0UmFuZ2UoVGV4dFBvc2l0aW9uJiBzdGFydCwgVGV4dFBvc2l0aW9uJiBlbmQpOworCisg
ICAgLy8gU3R5bGVQcm9wZXJ0eSBvYmplY3RzIGFyZSBub3QgaGVhcC1hbGxvY2F0ZWQgdG8gYXZv
aWQgY3ljbGljIHJlZmVyZW5jZSBjb3VudGluZy4KKyAgICAvLyBUaHVzLCB0aGV5IGFyZSBub25j
b3B5YWJsZSBhbmQgb25seSBhdmFpbGFibGUgdGhyb3VnaCBhIGZ1bmN0b3IgY2FsbGJhY2suCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB0eXBlbmFtZSBGdW5jdG9yOjpSZXR1
cm5UeXBlIGZvckVhY2hQcm9wZXJ0eShGdW5jdG9yJik7CisKKyAgICAvLyBGSVhNRTogcmVtb3Zl
CisgICAgU3RyaW5nIHNob3J0aGFuZFZhbHVlKGNvbnN0IFN0cmluZyYgc2hvcnRoYW5kUHJvcGVy
dHkpOworCitwcml2YXRlOgorICAgIHZvaWQgcG9wdWxhdGVQcm9wZXJ0aWVzKFZlY3RvcjxTdHls
ZVByb3BlcnR5PiYpOworCisgICAgQ1NTSWQgbV9zdHlsZUlkOworICAgIFdlYkNvcmU6OkNTU1N0
eWxlRGVjbGFyYXRpb24mIG1fZGVjbGFyYXRpb247CisgICAgU3R5bGVSdWxlU2V0KiBtX3J1bGVT
ZXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgoraW5saW5lIHR5cGVuYW1lIEZ1
bmN0b3I6OlJldHVyblR5cGUgU3R5bGVEZWNsYXJhdGlvbjo6Zm9yRWFjaFByb3BlcnR5KEZ1bmN0
b3ImIGZ1bmN0b3IpCit7CisgICAgVmVjdG9yPFN0eWxlUHJvcGVydHk+IHByb3BlcnRpZXM7Cisg
ICAgcG9wdWxhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICAgIGZvciAoU3R5bGVQcm9wZXJ0
eSYgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKQorICAgICAgICBmdW5jdG9yKHByb3BlcnR5KTsKKwor
ICAgIHJldHVybiBmdW5jdG9yLnJldHVyblZhbHVlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIElu
c3BlY3RvcgorCisjZW5kaWYgLy8gSW5zcGVjdG9yU3R5bGVEZWNsYXJhdGlvbl9oCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmN2ZlNQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVByb3BlcnR5LmNwcApA
QCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBVbml2ZXJzaXR5IG9m
IFdhc2hpbmd0b24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
SW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oIgorCisjaW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJhdGlv
bi5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlRGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJJ
bnNwZWN0b3JTdHlsZVJ1bGVTZXQuaCIKKyNpbmNsdWRlIDxpbnNwZWN0b3IvQ29udGVudFNlYXJj
aFV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKwordXNp
bmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBJbnNwZWN0b3IgeworCitTdHJpbmcg
U3R5bGVQcm9wZXJ0eTo6cmF3VGV4dCgpIGNvbnN0Cit7CisgICAgU3RyaW5nIHN0eWxlVGV4dDsK
KyAgICBib29sIHN0eWxlVGV4dEZvdW5kID0gbV9zdHlsZS5nZXRTdHlsZVRleHQoc3R5bGVUZXh0
KTsKKyAgICBBU1NFUlRfVU5VU0VEKHN0eWxlVGV4dEZvdW5kLCBzdHlsZVRleHRGb3VuZCk7CisK
KyAgICB1bnNpZ25lZCBzdGFydCA9IG1fc291cmNlRGF0YS5yYW5nZS5zdGFydDsKKyAgICB1bnNp
Z25lZCBlbmQgPSBtX3NvdXJjZURhdGEucmFuZ2UuZW5kOworICAgIEFTU0VSVF9XSVRIX1NFQ1VS
SVRZX0lNUExJQ0FUSU9OKHN0YXJ0IDwgZW5kKTsKKyAgICBBU1NFUlQoZW5kIDw9IHN0eWxlVGV4
dC5sZW5ndGgoKSk7CisgICAgcmV0dXJuIHN0eWxlVGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCAt
IHN0YXJ0KTsKK30KKwordm9pZCBTdHlsZVByb3BlcnR5OjpnZXRUZXh0UmFuZ2UoVGV4dFBvc2l0
aW9uJiBzdGFydCwgVGV4dFBvc2l0aW9uJiBlbmQpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgc3Rh
cnRPZmZzZXQgPSBtX3N0eWxlLnN0eWxlU291cmNlRGF0YSgpLT5ydWxlQm9keVJhbmdlLnN0YXJ0
OworICAgIFNvdXJjZVJhbmdlIHByb3BlcnR5UmFuZ2UgPSBtX3NvdXJjZURhdGEucmFuZ2U7CisK
KyAgICAvLyBUaGUgcHJvcGVydHkgcmFuZ2UgaXMgcmVsYXRpdmUgdG8gdGhlIHN0eWxlIGJvZHkg
c3RhcnQuCisgICAgLy8gU2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGFuIGFic29sdXRlIHJhbmdl
IChyZWxhdGl2ZSB0byB0aGUgc3R5bGVzaGVldCBzdGFydCkKKyAgICAvLyBmb3IgdGhlIHByb3Bl
ciBjb252ZXJzaW9uIGludG8gbGluZTpjb2x1bW4uCisgICAgYXV0byBsaW5lRW5kaW5ncyA9IG1f
c3R5bGUuc3R5bGVSdWxlU2V0KCktPnBhcnNlZFJ1bGVTZXREYXRhKCkubGluZUVuZGluZ3MoKTsK
KyAgICBzdGFydCA9IENvbnRlbnRTZWFyY2hVdGlsaXRpZXM6OnRleHRQb3NpdGlvbkZyb21PZmZz
ZXQoc3RhcnRPZmZzZXQgKyBwcm9wZXJ0eVJhbmdlLnN0YXJ0LCBsaW5lRW5kaW5ncyk7CisgICAg
ZW5kID0gQ29udGVudFNlYXJjaFV0aWxpdGllczo6dGV4dFBvc2l0aW9uRnJvbU9mZnNldChzdGFy
dE9mZnNldCArIHByb3BlcnR5UmFuZ2UuZW5kLCBsaW5lRW5kaW5ncyk7Cit9CisKK2Jvb2wgU3R5
bGVQcm9wZXJ0eTo6aXNJbXBsaWNpdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFpc0Zyb21Tb3Vy
Y2UoKSAmJiBtX3N0eWxlLmRlY2xhcmF0aW9uKCkuaXNQcm9wZXJ0eUltcGxpY2l0KHByb3BlcnR5
TmFtZSgpKTsKK30KKworYm9vbCBTdHlsZVByb3BlcnR5Ojppc0ltcG9ydGFudCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fc291cmNlRGF0YS5pbXBvcnRhbnQ7Cit9CisKK2Jvb2wgU3R5bGVQcm9w
ZXJ0eTo6cGFyc2VkT2soKSBjb25zdAoreworICAgIHJldHVybiBtX3NvdXJjZURhdGEucGFyc2Vk
T2s7Cit9CisKK1N0cmluZyBTdHlsZVByb3BlcnR5Ojpwcm9wZXJ0eU5hbWUoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3NvdXJjZURhdGEubmFtZTsKK30KKworU3RyaW5nIFN0eWxlUHJvcGVydHk6
OnByb3BlcnR5VmFsdWUoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0eWxlLmRlY2xhcmF0aW9u
KCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUoKSk7Cit9CisKK1N0cmluZyBTdHlsZVBy
b3BlcnR5OjpzaG9ydGhhbmRQcm9wZXJ0eU5hbWUoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0
eWxlLmRlY2xhcmF0aW9uKCkuZ2V0UHJvcGVydHlTaG9ydGhhbmQocHJvcGVydHlOYW1lKCkpOwor
fQorCitTdHJpbmcgU3R5bGVQcm9wZXJ0eTo6c2hvcnRoYW5kUHJvcGVydHlWYWx1ZSgpIGNvbnN0
Cit7CisgICAgU3RyaW5nIGV4cGxpY2l0VmFsdWUgPSBwcm9wZXJ0eVZhbHVlKCk7CisgICAgaWYg
KCFleHBsaWNpdFZhbHVlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGV4cGxpY2l0VmFsdWU7
CisKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fc3R5bGUuZGVjbGFyYXRpb24oKS5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFN0cmlu
ZyBpbmRpdmlkdWFsUHJvcGVydHkgPSBtX3N0eWxlLmRlY2xhcmF0aW9uKCkuaXRlbShpKTsKKyAg
ICAgICAgaWYgKG1fc3R5bGUuZGVjbGFyYXRpb24oKS5nZXRQcm9wZXJ0eVNob3J0aGFuZChpbmRp
dmlkdWFsUHJvcGVydHkpICE9IHNob3J0aGFuZFByb3BlcnR5TmFtZSgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGlmIChtX3N0eWxlLmRlY2xhcmF0aW9uKCkuaXNQcm9wZXJ0eUlt
cGxpY2l0KGluZGl2aWR1YWxQcm9wZXJ0eSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgU3RyaW5nIGluZGl2aWR1YWxWYWx1ZSA9IG1fc3R5bGUuZGVjbGFyYXRpb24oKS5nZXRQcm9w
ZXJ0eVZhbHVlKGluZGl2aWR1YWxQcm9wZXJ0eSk7CisgICAgICAgIGlmIChpbmRpdmlkdWFsVmFs
dWUgPT0gImluaXRpYWwiKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghYnVp
bGRlci5pc0VtcHR5KCkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOworICAgICAg
ICBidWlsZGVyLmFwcGVuZChpbmRpdmlkdWFsVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gYnVp
bGRlci50b1N0cmluZygpOworfQorCit9IC8vIG5hbWVzcGFjZSBJbnNwZWN0b3IKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVByb3BlcnR5LmggYi9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2VhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eS5oCkBAIC0wLDAg
KzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVyc2l0eSBvZiBXYXNoaW5n
dG9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJbnNwZWN0b3JTdHlsZVByb3BlcnR5X2gKKyNkZWZp
bmUgSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eV9oCisKKyNpbmNsdWRlICJDU1NQcm9wZXJ0eVNvdXJj
ZURhdGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlv
bjsKK30KKworbmFtZXNwYWNlIEluc3BlY3RvciB7CisKK2NsYXNzIFN0eWxlRGVjbGFyYXRpb247
CisKK2NsYXNzIFN0eWxlUHJvcGVydHkgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0eWxl
UHJvcGVydHkpOworcHVibGljOgorICAgIFN0eWxlUHJvcGVydHkoU3R5bGVQcm9wZXJ0eSYmKSA9
IGRlZmF1bHQ7CisgICAgU3R5bGVQcm9wZXJ0eShTdHlsZURlY2xhcmF0aW9uJiBzdHlsZSwgV2Vi
Q29yZTo6Q1NTUHJvcGVydHlTb3VyY2VEYXRhIHNvdXJjZURhdGEsIGJvb2wgaXNGcm9tU291cmNl
KQorICAgICAgICA6IG1fc291cmNlRGF0YShzb3VyY2VEYXRhKQorICAgICAgICAsIG1fc3R5bGUo
c3R5bGUpCisgICAgICAgICwgbV9mcm9tU291cmNlKGlzRnJvbVNvdXJjZSkKKyAgICB7CisgICAg
fQorCisgICAgLy8gSWYgbm90IGZyb20gc291cmNlLCB0aGVuIGl0J3MgZnJvbSBhIHVzZXIgb3Ig
dXNlci1hZ2VudCBzdHlsZXNoZWV0CisgICAgLy8gb3IgaXMgYW4gaW1wbGljaXRseSBkZWZpbmVk
IGxvbmdoYW5kIHByb3BlcnR5IGNhdXNlZCBieSBhIHNob3J0aGFuZC4KKyAgICBib29sIGlzSW1w
bGljaXQoKSBjb25zdDsKKyAgICBib29sIGlzRnJvbVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZnJvbVNvdXJjZTsgfQorICAgIGJvb2wgaXNJbXBvcnRhbnQoKSBjb25zdDsKKyAgICBib29sIHBh
cnNlZE9rKCkgY29uc3Q7CisKKyAgICBTdHJpbmcgcmF3VGV4dCgpIGNvbnN0OworICAgIHZvaWQg
Z2V0VGV4dFJhbmdlKFRleHRQb3NpdGlvbiYgc3RhcnQsIFRleHRQb3NpdGlvbiYgZW5kKSBjb25z
dDsKKworICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUoKSBjb25zdDsKKyAgICBTdHJpbmcgcHJvcGVy
dHlWYWx1ZSgpIGNvbnN0OworICAgIFN0cmluZyBzaG9ydGhhbmRQcm9wZXJ0eU5hbWUoKSBjb25z
dDsKKyAgICBTdHJpbmcgc2hvcnRoYW5kUHJvcGVydHlWYWx1ZSgpIGNvbnN0OworcHJpdmF0ZToK
KyAgICBXZWJDb3JlOjpDU1NQcm9wZXJ0eVNvdXJjZURhdGEgbV9zb3VyY2VEYXRhOworICAgIFN0
eWxlRGVjbGFyYXRpb24mIG1fc3R5bGU7CisgICAgYm9vbCBtX2Zyb21Tb3VyY2U7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBJbnNwZWN0b3IKKworI2VuZGlmIC8vIEluc3BlY3RvclN0eWxlUHJvcGVy
dHlfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxl
UnVsZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVSdWxlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzU5OTNiCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlUnVsZS5jcHAK
QEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVyc2l0eSBv
ZiBXYXNoaW5ndG9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
Ikluc3BlY3RvclN0eWxlUnVsZS5oIgorCisjaW5jbHVkZSAiQ1NTUHJvcGVydHlTb3VyY2VEYXRh
LmgiCisjaW5jbHVkZSAiQ1NTU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVz
aGVldFJ1bGVTZXQuaCIKKyNpbmNsdWRlICJTdHlsZVJ1bGUuaCIKKyNpbmNsdWRlIDxpbnNwZWN0
b3IvQ29udGVudFNlYXJjaFV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ryb3ll
ZC5oPgorI2luY2x1ZGUgPHlhcnIvUmVndWxhckV4cHJlc3Npb24uaD4KKwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBJbnNwZWN0b3IgeworCitTdHlsZVJ1bGU6OlN0eWxl
UnVsZShjb25zdCBDU1NJZCYgc3R5bGVJZCwgQ1NTU3R5bGVSdWxlJiBydWxlLCBTdHlsZVJ1bGVT
ZXQqIHJ1bGVTZXQpCisgICAgOiBtX3J1bGVJZChzdHlsZUlkKQorICAgICwgbV9ydWxlKHJ1bGUp
CisgICAgLCBtX3J1bGVTZXQocnVsZVNldCkKK3sKKyAgICAvLyBXZSBjYW5ub3Qgc3RvcmUgdGhl
IHN1YmNsYXNzIGFzIGEgbWVtYmVyLCBiZWNhdXNlIGl0IGNhdXNlcyBjeWNsaWMgaGVhZGVyCisg
ICAgLy8gZGVwZW5kZW5jaWVzIGJldHdlZW4gU3R5bGVzaGVldFJ1bGVTZXQgYW5kIFN0eWxlUnVs
ZSB3aGVuIGRvd25jYXN0aW5nIGluCisgICAgLy8gdGhlIGlubGluZWQgaW1wbGVtZW50YXRpb24g
b2Ygd2l0aFJ1bGUoKS4KKyAgICBBU1NFUlQoaXM8U3R5bGVzaGVldFJ1bGVTZXQ+KG1fcnVsZVNl
dCkpOworfQorCitTdHlsZVJ1bGU6On5TdHlsZVJ1bGUoKQoreworfQorCitTdHlsZXNoZWV0UnVs
ZVNldCogU3R5bGVSdWxlOjpzdHlsZXNoZWV0KCkgY29uc3QKK3sKKyAgICBpZiAoIWlzPFN0eWxl
c2hlZXRSdWxlU2V0PihtX3J1bGVTZXQpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAg
IHJldHVybiBkb3duY2FzdDxTdHlsZXNoZWV0UnVsZVNldD4obV9ydWxlU2V0KTsKK30KKwordm9p
ZCBTdHlsZVJ1bGU6OnBvcHVsYXRlU2VsZWN0b3JzKFZlY3RvcjxSdWxlU2VsZWN0b3I+JiByZXN1
bHQpCit7CisgICAgY29uc3QgQ1NTU2VsZWN0b3JMaXN0JiBzZWxlY3Rvckxpc3QgPSBtX3J1bGUu
c3R5bGVSdWxlKCkuc2VsZWN0b3JMaXN0KCk7CisgICAgaWYgKFJlZlB0cjxDU1NSdWxlU291cmNl
RGF0YT4gc291cmNlRGF0YSA9IHJ1bGVTb3VyY2VEYXRhKCkpIHsKKyAgICAgICAgaWYgKCFzdHls
ZXNoZWV0KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHNoZWV0VGV4
dCA9IHN0eWxlc2hlZXQoKS0+Z2V0VGV4dCgpOworICAgICAgICBjb25zdCBTZWxlY3RvclJhbmdl
TGlzdCYgcmFuZ2VzID0gc291cmNlRGF0YS0+c2VsZWN0b3JSYW5nZXM7CisgICAgICAgIGNvbnN0
IENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IHNlbGVjdG9yTGlzdC5maXJzdCgpOworICAgICAgICBz
aXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoOyBzZWxlY3RvciAmJiBpIDwgcmFuZ2VzLnNpemUo
KTsgKytpLCBzZWxlY3RvciA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzZWxlY3RvcikpIHsKKyAg
ICAgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlJiByYW5nZSA9IHJhbmdlcy5hdChpKTsKKyAgICAg
ICAgICAgIFN0cmluZyBzZWxlY3RvclRleHQgPSBzaGVldFRleHQuc3Vic3RyaW5nKHJhbmdlLnN0
YXJ0LCByYW5nZS5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8g
c2VlIGFueSBjb21tZW50cyBpbiB0aGUgc2VsZWN0b3IgY29tcG9uZW50cywgb25seSB0aGUgbWVh
bmluZ2Z1bCBwYXJ0cy4KKyAgICAgICAgICAgIE5ldmVyRGVzdHJveWVkPEpTQzo6WWFycjo6UmVn
dWxhckV4cHJlc3Npb24+IGNvbW1lbnRSZWdleCgiL1xcKlteXSo/XFwqLyIsIFRleHRDYXNlU2Vu
c2l0aXZlLCBKU0M6OllhcnI6Ok11bHRpbGluZUVuYWJsZWQpOworICAgICAgICAgICAgcmVwbGFj
ZShzZWxlY3RvclRleHQsIGNvbW1lbnRSZWdleCwgU3RyaW5nKCkpOworICAgICAgICAgICAgcmVz
dWx0LmFwcGVuZChSdWxlU2VsZWN0b3IoKnNlbGVjdG9yLCBzZWxlY3RvclRleHQuc3RyaXBXaGl0
ZVNwYWNlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGkgPT0g
cmFuZ2VzLnNpemUoKSwgIkRpZG4ndCBwb3B1bGF0ZSBhbGwgc2VsZWN0b3JzIGJlY2F1c2Ugc291
cmNlRGF0YSBhbmQgYWN0dWFsIHJ1bGUgc2VsZWN0b3JzIGJlY2FtZSBkZXN5bmNlZC4iKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVj
dG9yID0gc2VsZWN0b3JMaXN0LmZpcnN0KCk7IHNlbGVjdG9yOyBzZWxlY3RvciA9IENTU1NlbGVj
dG9yTGlzdDo6bmV4dChzZWxlY3RvcikpCisgICAgICAgIHJlc3VsdC5hcHBlbmQoUnVsZVNlbGVj
dG9yKCpzZWxlY3Rvciwgc2VsZWN0b3ItPnNlbGVjdG9yVGV4dCgpKSk7Cit9CisKK1N0cmluZyBT
dHlsZVJ1bGU6OnNlbGVjdG9yTGlzdFRleHQoKQoreworICAgIHJldHVybiBtX3J1bGUuc2VsZWN0
b3JUZXh0KCk7Cit9CisKK2Jvb2wgU3R5bGVSdWxlOjpnZXRTZWxlY3Rvckxpc3RUZXh0UmFuZ2Uo
VGV4dFBvc2l0aW9uJiBzdGFydCwgVGV4dFBvc2l0aW9uJiBlbmQpCit7CisgICAgaWYgKCFpc0Zy
b21Tb3VyY2UoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byBzb3VyY2VEYXRh
ID0gcnVsZVNvdXJjZURhdGEoKTsKKyAgICBhdXRvIGxpbmVFbmRpbmdzID0gbV9ydWxlU2V0LT5w
YXJzZWRSdWxlU2V0RGF0YSgpLmxpbmVFbmRpbmdzKCk7CisgICAgc3RhcnQgPSBDb250ZW50U2Vh
cmNoVXRpbGl0aWVzOjp0ZXh0UG9zaXRpb25Gcm9tT2Zmc2V0KHNvdXJjZURhdGEtPnJ1bGVIZWFk
ZXJSYW5nZS5zdGFydCwgbGluZUVuZGluZ3MpOworICAgIGVuZCA9IENvbnRlbnRTZWFyY2hVdGls
aXRpZXM6OnRleHRQb3NpdGlvbkZyb21PZmZzZXQoc291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdl
LmVuZCwgbGluZUVuZGluZ3MpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUnVs
ZTo6aGFzU2VsZWN0b3JzKCkKK3sKKyAgICBhdXRvIHNvdXJjZURhdGEgPSBydWxlU291cmNlRGF0
YSgpOworICAgIHJldHVybiBzb3VyY2VEYXRhICYmIHNvdXJjZURhdGEtPnNlbGVjdG9yUmFuZ2Vz
LnNpemUoKSA+IDA7Cit9CisKK1JlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gU3R5bGVSdWxlOjpy
dWxlU291cmNlRGF0YSgpCit7CisgICAgcmV0dXJuIG1fcnVsZVNldCA/IG1fcnVsZVNldC0+c291
cmNlRGF0YUZvclJ1bGUobV9ydWxlKSA6IG51bGxwdHI7Cit9CisKK2ludCBTdHlsZVJ1bGU6OnNv
dXJjZUxpbmUoKSBjb25zdAoreworICAgIHJldHVybiBtX3J1bGUuc3R5bGVSdWxlKCkuc291cmNl
TGluZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVSdWxlLmggYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVSdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uZTQwOWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JTdHlsZVJ1bGUuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxNSBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24uCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZu
ZGVmIEluc3BlY3RvclN0eWxlUnVsZV9oCisjZGVmaW5lIEluc3BlY3RvclN0eWxlUnVsZV9oCisK
KyNpbmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NJZC5oIgor
I2luY2x1ZGUgIkluc3BlY3RvclJ1bGVTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0
eWxlRGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yUHJvdG9jb2xP
YmplY3RzLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKK3N0cnVjdCBDU1NSdWxlU291cmNlRGF0YTsKK3N0cnVjdCBDU1NTdHlsZVNvdXJj
ZURhdGE7Cit9OworCituYW1lc3BhY2UgSW5zcGVjdG9yIHsKKworY2xhc3MgUnVsZVNlbGVjdG9y
OworY2xhc3MgU3R5bGVQcm9wZXJ0eTsKK2NsYXNzIFN0eWxlUnVsZVNldDsKK2NsYXNzIFN0eWxl
c2hlZXRSdWxlU2V0OworCitjbGFzcyBTdHlsZVJ1bGUgZmluYWwgeworV1RGX01BS0VfTk9OQ09Q
WUFCTEUoU3R5bGVSdWxlKTsKK3B1YmxpYzoKKyAgICBTdHlsZVJ1bGUoU3R5bGVSdWxlJiYpID0g
ZGVmYXVsdDsKKyAgICBTdHlsZVJ1bGUoY29uc3QgQ1NTSWQmIHN0eWxlSWQsIFdlYkNvcmU6OkNT
U1N0eWxlUnVsZSYsIFN0eWxlUnVsZVNldCogcnVsZVNldCk7CisgICAgflN0eWxlUnVsZSgpOwor
CisgICAgV2ViQ29yZTo6Q1NTU3R5bGVSdWxlJiBydWxlKCkgeyByZXR1cm4gbV9ydWxlOyB9Cisg
ICAgUmVmUHRyPFdlYkNvcmU6OkNTU1J1bGVTb3VyY2VEYXRhPiBydWxlU291cmNlRGF0YSgpOwor
ICAgIENTU0lkIHJ1bGVJZCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZUlkOyB9CisgICAgU3R5bGVz
aGVldFJ1bGVTZXQqIHN0eWxlc2hlZXQoKSBjb25zdDsKKworICAgIGJvb2wgaGFzU2VsZWN0b3Jz
KCk7CisgICAgYm9vbCBpc0Zyb21Tb3VyY2UoKSB7IHJldHVybiAhIXJ1bGVTb3VyY2VEYXRhKCk7
IH0KKyAgICBpbnQgc291cmNlTGluZSgpIGNvbnN0OworCisgICAgU3RyaW5nIHNlbGVjdG9yTGlz
dFRleHQoKTsKKyAgICBib29sIGdldFNlbGVjdG9yTGlzdFRleHRSYW5nZShUZXh0UG9zaXRpb24m
IHN0YXJ0LCBUZXh0UG9zaXRpb24mIGVuZCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
dG9yPiB2b2lkIHdpdGhTdHlsZShjb25zdCBGdW5jdG9yJik7CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBGdW5jdG9yPgorICAgIHR5cGVuYW1lIEZ1bmN0b3I6OlJldHVyblR5cGUgZm9yRWFjaFNl
bGVjdG9yKEZ1bmN0b3ImKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHBvcHVsYXRlU2VsZWN0b3Jz
KFZlY3RvcjxSdWxlU2VsZWN0b3I+Jik7CisKKyAgICBDU1NJZCBtX3J1bGVJZDsKKyAgICBXZWJD
b3JlOjpDU1NTdHlsZVJ1bGUmIG1fcnVsZTsKKyAgICBTdHlsZVJ1bGVTZXQqIG1fcnVsZVNldDsK
K307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CitpbmxpbmUgdm9pZCBTdHlsZVJ1bGU6
OndpdGhTdHlsZShjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQoreworICAgIFN0eWxlRGVjbGFyYXRp
b24gc3R5bGUocnVsZUlkKCksIG1fcnVsZS5zdHlsZSgpLCBtX3J1bGVTZXQpOworICAgIGZ1bmN0
b3Ioc3R5bGUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgoraW5saW5lIHR5cGVu
YW1lIEZ1bmN0b3I6OlJldHVyblR5cGUgU3R5bGVSdWxlOjpmb3JFYWNoU2VsZWN0b3IoRnVuY3Rv
ciYgZnVuY3RvcikKK3sKKyAgICBWZWN0b3I8UnVsZVNlbGVjdG9yPiBzZWxlY3RvcnM7CisgICAg
cG9wdWxhdGVTZWxlY3RvcnMoc2VsZWN0b3JzKTsKKyAgICBmb3IgKFJ1bGVTZWxlY3RvciYgc2Vs
ZWN0b3IgOiBzZWxlY3RvcnMpCisgICAgICAgIGZ1bmN0b3Ioc2VsZWN0b3IpOworCisgICAgcmV0
dXJuIGZ1bmN0b3IucmV0dXJuVmFsdWUoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgSW5zcGVjdG9y
CisKKyNlbmRpZiAvLyBJbnNwZWN0b3JTdHlsZVJ1bGVfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlUnVsZVNldC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVSdWxlU2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi41OGJhYzUxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlUnVsZVNldC5jcHAKQEAgLTAsMCArMSwyMjMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlUnVs
ZVNldC5oIgorCisjaW5jbHVkZSAiQ1NTSW1wb3J0UnVsZS5oIgorI2luY2x1ZGUgIkNTU0tleWZy
YW1lc1J1bGUuaCIKKyNpbmNsdWRlICJDU1NNZWRpYVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NQYXJz
ZXIuaCIKKyNpbmNsdWRlICJDU1NSdWxlLmgiCisjaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKKyNp
bmNsdWRlICJDU1NTdXBwb3J0c1J1bGUuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVNoZWV0LmgiCisj
aW5jbHVkZSAiQ1NTU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUg
Ikluc3BlY3RvclN0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlc2hlZXRSdWxl
U2V0LmgiIC8vIEZvciBQYXJzZWRSdWxlU2V0RGF0YTo6Y3JlYXRlKCkuCisjaW5jbHVkZSAiU3R5
bGVTaGVldENvbnRlbnRzLmgiCisjaW5jbHVkZSA8aW5zcGVjdG9yL0NvbnRlbnRTZWFyY2hVdGls
aXRpZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBJbnNwZWN0
b3IgeworCitQYXJzZWRSdWxlU2V0RGF0YTo6UGFyc2VkUnVsZVNldERhdGEoU3RyaW5nIHNvdXJj
ZVRleHQsIHN0ZDo6dW5pcXVlX3B0cjxSdWxlU291cmNlRGF0YUxpc3Q+IHNvdXJjZURhdGEsIHN0
ZDo6dW5pcXVlX3B0cjxTdHlsZVJ1bGVMaXN0PiBzdHlsZVJ1bGVzKQorICAgIDogbV9zb3VyY2VU
ZXh0KHNvdXJjZVRleHQpCisgICAgLCBtX2ZsYXR0ZW5lZFNvdXJjZURhdGEoV1RGOjptb3ZlKHNv
dXJjZURhdGEpKQorICAgICwgbV9mbGF0dGVuZWRTdHlsZVJ1bGVzKFdURjo6bW92ZShzdHlsZVJ1
bGVzKSkKK3sKKyAgICBpZiAoIW1fc291cmNlVGV4dC5pc0VtcHR5KCkpCisgICAgICAgIG1fbGlu
ZUVuZGluZ3MgPSBDb250ZW50U2VhcmNoVXRpbGl0aWVzOjpsaW5lRW5kaW5ncyhtX3NvdXJjZVRl
eHQpOworfQorCitzdGF0aWMgQ1NTUGFyc2VyQ29udGV4dCBwYXJzZXJDb250ZXh0Rm9yRG9jdW1l
bnQoRG9jdW1lbnQqIGRvY3VtZW50KQoreworICAgIHJldHVybiBkb2N1bWVudCA/IENTU1BhcnNl
ckNvbnRleHQoKmRvY3VtZW50KSA6IHN0cmljdENTU1BhcnNlckNvbnRleHQoKTsKK30KKworc3Rh
dGljIHZvaWQgZmxhdHRlblNvdXJjZURhdGEoUnVsZVNvdXJjZURhdGFMaXN0JiBzb3VyY2VEYXRh
TGlzdCwgUnVsZVNvdXJjZURhdGFMaXN0JiBmbGF0dGVuZWREYXRhTGlzdCkKK3sKKyAgICBmb3Ig
KGF1dG8mIHNvdXJjZURhdGEgOiBzb3VyY2VEYXRhTGlzdCkgeworICAgICAgICBpZiAoc291cmNl
RGF0YS0+dHlwZSA9PSBDU1NSdWxlU291cmNlRGF0YTo6U1RZTEVfUlVMRSkKKyAgICAgICAgICAg
IGZsYXR0ZW5lZERhdGFMaXN0LmFwcGVuZChzb3VyY2VEYXRhKTsKKyAgICAgICAgZWxzZSBpZiAo
c291cmNlRGF0YS0+dHlwZSA9PSBDU1NSdWxlU291cmNlRGF0YTo6TUVESUFfUlVMRSkKKyAgICAg
ICAgICAgIGZsYXR0ZW5Tb3VyY2VEYXRhKHNvdXJjZURhdGEtPmNoaWxkUnVsZXMsIGZsYXR0ZW5l
ZERhdGFMaXN0KTsKKyAgICAgICAgZWxzZSBpZiAoc291cmNlRGF0YS0+dHlwZSA9PSBDU1NSdWxl
U291cmNlRGF0YTo6U1VQUE9SVFNfUlVMRSkKKyAgICAgICAgICAgIGZsYXR0ZW5Tb3VyY2VEYXRh
KHNvdXJjZURhdGEtPmNoaWxkUnVsZXMsIGZsYXR0ZW5lZERhdGFMaXN0KTsKKyAgICB9Cit9CisK
K3N0YXRpYyB2b2lkIGZsYXR0ZW5TdHlsZVJ1bGVzKENTU1J1bGVMaXN0JiBydWxlTGlzdCwgU3R5
bGVSdWxlTGlzdCYgcmVzdWx0KTsKKworc3RhdGljIHZvaWQgZmxhdHRlblN0eWxlUnVsZXMoUmVm
UHRyPENTU1J1bGU+JiYgcnVsZSwgU3R5bGVSdWxlTGlzdCYgcmVzdWx0KQoreworICAgIGlmICgh
cnVsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzPENTU1N0eWxlUnVsZT4oKnJ1bGUp
KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoJmRvd25jYXN0PENTU1N0eWxlUnVsZT4oKnJ1bGUp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpczxDU1NNZWRpYVJ1bGU+KCpy
dWxlKSkKKyAgICAgICAgZmxhdHRlblN0eWxlUnVsZXMoZG93bmNhc3Q8Q1NTTWVkaWFSdWxlPigq
cnVsZSkuY3NzUnVsZXMoKSwgcmVzdWx0KTsKKworICAgIGlmIChpczxDU1NLZXlmcmFtZXNSdWxl
PigqcnVsZSkpCisgICAgICAgIGZsYXR0ZW5TdHlsZVJ1bGVzKGRvd25jYXN0PENTU0tleWZyYW1l
c1J1bGU+KCpydWxlKS5jc3NSdWxlcygpLCByZXN1bHQpOworCisgICAgaWYgKGlzPENTU1N1cHBv
cnRzUnVsZT4oKnJ1bGUpKQorICAgICAgICBmbGF0dGVuU3R5bGVSdWxlcyhkb3duY2FzdDxDU1NT
dXBwb3J0c1J1bGU+KCpydWxlKS5jc3NSdWxlcygpLCByZXN1bHQpOworfQorCitzdGF0aWMgdm9p
ZCBmbGF0dGVuU3R5bGVSdWxlcyhDU1NSdWxlTGlzdCYgcnVsZUxpc3QsIFN0eWxlUnVsZUxpc3Qm
IHJlc3VsdCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZUxpc3QubGVuZ3Ro
KCk7ICsraSkKKyAgICAgICAgZmxhdHRlblN0eWxlUnVsZXMocnVsZUxpc3QuaXRlbShpKSwgcmVz
dWx0KTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRhPiBQYXJzZWRSdWxl
U2V0RGF0YTo6Y3JlYXRlKFN0eWxlc2hlZXRSdWxlU2V0JiBzdHlsZXNoZWV0KQoreworICAgIFN0
cmluZyBvcmlnaW5hbFN0eWxlc2hlZXRUZXh0OworICAgIGlmICghc3R5bGVzaGVldC5vcmlnaW5h
bFNvdXJjZVRleHQob3JpZ2luYWxTdHlsZXNoZWV0VGV4dCkpCisgICAgICAgIHJldHVybiBudWxs
cHRyOworCisgICAgcmV0dXJuIFBhcnNlZFJ1bGVTZXREYXRhOjpjcmVhdGVXaXRoVGV4dChzdHls
ZXNoZWV0LCBvcmlnaW5hbFN0eWxlc2hlZXRUZXh0KTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFBh
cnNlZFJ1bGVTZXREYXRhPiBQYXJzZWRSdWxlU2V0RGF0YTo6Y3JlYXRlRW1wdHkoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8UGFyc2VkUnVsZVNldERhdGE+KGVtcHR5
U3RyaW5nKCksIHN0ZDo6bWFrZV91bmlxdWU8UnVsZVNvdXJjZURhdGFMaXN0PigpLCBzdGQ6Om1h
a2VfdW5pcXVlPFN0eWxlUnVsZUxpc3Q+KCkpOworICAgIH0KKworc3RkOjp1bmlxdWVfcHRyPFBh
cnNlZFJ1bGVTZXREYXRhPiBQYXJzZWRSdWxlU2V0RGF0YTo6Y3JlYXRlV2l0aFRleHQoU3R5bGVz
aGVldFJ1bGVTZXQmIHN0eWxlc2hlZXQsIGNvbnN0IFN0cmluZyYgc3R5bGVzaGVldFRleHQpCit7
CisgICAgQ1NTUGFyc2VyIHBhcnNlcihwYXJzZXJDb250ZXh0Rm9yRG9jdW1lbnQoc3R5bGVzaGVl
dC5vd25lckRvY3VtZW50KCkpKTsKKworICAgIFJlZlB0cjxTdHlsZVNoZWV0Q29udGVudHM+IGNv
bnRlbnRzID0gU3R5bGVTaGVldENvbnRlbnRzOjpjcmVhdGUoKTsKKyAgICBpbnQgc3RhcnRMaW5l
ID0gMDsKKyAgICBhdXRvIHNvdXJjZURhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPFJ1bGVTb3VyY2VE
YXRhTGlzdD4oKTsKKyAgICBwYXJzZXIucGFyc2VTaGVldChjb250ZW50cy5nZXQoKSwgc3R5bGVz
aGVldFRleHQsIHN0YXJ0TGluZSwgc291cmNlRGF0YS5nZXQoKSk7CisKKyAgICAvLyBGSVhNRTog
VGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGZsYXQg
c291cmNlRGF0YSBzdHJ1Y3R1cmUKKyAgICAvLyBjb250YWluaW5nIG9ubHkgc3R5bGUgcnVsZXMs
IGV2ZW4gdGhvdWdoIENTU1BhcnNlciBub3cgcHJvdmlkZXMgdGhlIGZ1bGwgcnVsZSBzb3VyY2Ug
ZGF0YSB0cmVlLgorICAgIGF1dG8gZmxhdHRlbmVkU291cmNlRGF0YSA9IHN0ZDo6bWFrZV91bmlx
dWU8UnVsZVNvdXJjZURhdGFMaXN0PigpOworICAgIGZsYXR0ZW5Tb3VyY2VEYXRhKCpzb3VyY2VE
YXRhLCAqZmxhdHRlbmVkU291cmNlRGF0YSk7CisKKyAgICBhdXRvIGZsYXR0ZW5lZFJ1bGVzID0g
c3RkOjptYWtlX3VuaXF1ZTxTdHlsZVJ1bGVMaXN0PigpOworICAgIGF1dG8gcnVsZVRyZWUgPSBz
dHlsZXNoZWV0LnBhZ2VTdHlsZXNoZWV0KCkuY3NzUnVsZXMoKTsKKyAgICBmbGF0dGVuU3R5bGVS
dWxlcygqcnVsZVRyZWUsICpmbGF0dGVuZWRSdWxlcyk7CisKKyAgICByZXR1cm4gc3RkOjptYWtl
X3VuaXF1ZTxQYXJzZWRSdWxlU2V0RGF0YT4oc3R5bGVzaGVldFRleHQsIFdURjo6bW92ZShmbGF0
dGVuZWRTb3VyY2VEYXRhKSwgV1RGOjptb3ZlKGZsYXR0ZW5lZFJ1bGVzKSk7Cit9CisKK3N0ZDo6
dW5pcXVlX3B0cjxQYXJzZWRSdWxlU2V0RGF0YT4gUGFyc2VkUnVsZVNldERhdGE6OmNyZWF0ZShF
bGVtZW50JiBlbGVtZW50KQoreworICAgIFN0cmluZyBzb3VyY2VUZXh0ID0gZWxlbWVudC5pc1N0
eWxlZEVsZW1lbnQoKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpLnN0cmluZygpIDog
U3RyaW5nKCk7CisgICAgYXV0byBzb3VyY2VEYXRhID0gQ1NTUnVsZVNvdXJjZURhdGE6OmNyZWF0
ZShDU1NSdWxlU291cmNlRGF0YTo6U1RZTEVfUlVMRSk7CisKKyAgICBpZiAoc291cmNlVGV4dC5p
c0VtcHR5KCkpIHsKKyAgICAgICAgc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5zdGFydCA9IDA7
CisgICAgICAgIHNvdXJjZURhdGEtPnJ1bGVCb2R5UmFuZ2UuZW5kID0gMDsKKyAgICB9IGVsc2Ug
eworICAgICAgICBSZWZQdHI8TXV0YWJsZVN0eWxlUHJvcGVydGllcz4gZHVtbXlEZWNsYXJhdGlv
biA9IE11dGFibGVTdHlsZVByb3BlcnRpZXM6OmNyZWF0ZSgpOworICAgICAgICBDU1NQYXJzZXIg
cGFyc2VyKHBhcnNlckNvbnRleHRGb3JEb2N1bWVudCgmZWxlbWVudC5kb2N1bWVudCgpKSk7Cisg
ICAgICAgIHBhcnNlci5wYXJzZURlY2xhcmF0aW9uKGR1bW15RGVjbGFyYXRpb24uZ2V0KCksIHNv
dXJjZVRleHQsIHNvdXJjZURhdGEuZ2V0KCksICZlbGVtZW50LmRvY3VtZW50KCkuZWxlbWVudFNo
ZWV0KCkuY29udGVudHMoKSk7CisgICAgfQorCisgICAgYXV0byBzb3VyY2VEYXRhTGlzdCA9IHN0
ZDo6bWFrZV91bmlxdWU8UnVsZVNvdXJjZURhdGFMaXN0PigxKTsKKyAgICBzb3VyY2VEYXRhTGlz
dC0+YXBwZW5kKFdURjo6bW92ZShzb3VyY2VEYXRhKSk7CisKKyAgICBhdXRvIGZsYXR0ZW5lZFJ1
bGVzID0gc3RkOjptYWtlX3VuaXF1ZTxTdHlsZVJ1bGVMaXN0PigpOworICAgIHJldHVybiBzdGQ6
Om1ha2VfdW5pcXVlPFBhcnNlZFJ1bGVTZXREYXRhPihzb3VyY2VUZXh0LCBXVEY6Om1vdmUoc291
cmNlRGF0YUxpc3QpLCBXVEY6Om1vdmUoZmxhdHRlbmVkUnVsZXMpKTsKK30KKwordWludDY0X3Qg
U3R5bGVSdWxlU2V0OjpzX25leHRSdWxlU2V0SWQgPSAxOworCitTdHlsZVJ1bGVTZXQ6OlN0eWxl
UnVsZVNldCgpCisgICAgOiBtX2lkZW50aWZpZXIoc19uZXh0UnVsZVNldElkKyspCit7Cit9CisK
K1N0eWxlUnVsZVNldDo6flN0eWxlUnVsZVNldCgpIHsgfQorCit2b2lkIFN0eWxlUnVsZVNldDo6
Y29tbWl0UnVsZVNldENoYW5nZShzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+IHBh
cnNlZERhdGEpCit7CisgICAgbV9wYXJzZWRSdWxlU2V0RGF0YSA9IFdURjo6bW92ZShwYXJzZWRE
YXRhKTsKKyAgICBpZiAobV9wYXJzZWRSdWxlU2V0RGF0YSkgLy8gSWYgbnVsbHB0ciwgd2UgY2Fu
IGludmFsaWRhdGUgd2l0aG91dCBlYWdlcmx5IHJlcGFyc2luZy4KKyAgICAgICAgbm90aWZ5UnVs
ZVNldENoYW5nZWQoKTsKK30KKworUGFyc2VkUnVsZVNldERhdGEmIFN0eWxlUnVsZVNldDo6cGFy
c2VkUnVsZVNldERhdGEoKQoreworICAgIGlmICghbV9wYXJzZWRSdWxlU2V0RGF0YSkKKyAgICAg
ICAgbV9wYXJzZWRSdWxlU2V0RGF0YSA9IG9yaWdpbmFsU291cmNlRGF0YSgpOworCisgICAgaWYg
KCFtX3BhcnNlZFJ1bGVTZXREYXRhKQorICAgICAgICBtX3BhcnNlZFJ1bGVTZXREYXRhID0gUGFy
c2VkUnVsZVNldERhdGE6OmNyZWF0ZUVtcHR5KCk7CisKKyAgICBBU1NFUlQobV9wYXJzZWRSdWxl
U2V0RGF0YSk7CisgICAgcmV0dXJuICptX3BhcnNlZFJ1bGVTZXREYXRhOworfQorCitjb25zdCBT
dHJpbmcmIFN0eWxlUnVsZVNldDo6Z2V0VGV4dCgpCit7CisgICAgcmV0dXJuIHBhcnNlZFJ1bGVT
ZXREYXRhKCkuc291cmNlVGV4dCgpOworfQorCitzdGF0aWMgc2l6ZV90IHNvdXJjZURhdGFPcmRp
bmFsRm9yU3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiYgc3R5bGUsIFN0eWxlUnVsZUxpc3QmIGZs
YXR0ZW5lZFJ1bGVzKQoreworICAgIGZvciAoc2l6ZV90IHJ1bGVPcmRpbmFsID0gMDsgcnVsZU9y
ZGluYWwgPCBmbGF0dGVuZWRSdWxlcy5zaXplKCk7ICsrcnVsZU9yZGluYWwpCisgICAgICAgIGlm
ICgmZmxhdHRlbmVkUnVsZXMuYXQocnVsZU9yZGluYWwpLT5zdHlsZSgpID09ICZzdHlsZSkKKyAg
ICAgICAgICAgIHJldHVybiBydWxlT3JkaW5hbDsKKworICAgIHJldHVybiBub3RGb3VuZDsKK30K
KworQ1NTSWQgU3R5bGVSdWxlU2V0OjppZEZvclN0eWxlKENTU1N0eWxlRGVjbGFyYXRpb24mIHN0
eWxlKQoreworICAgIGF1dG8gcnVsZU9yZGluYWwgPSBzb3VyY2VEYXRhT3JkaW5hbEZvclN0eWxl
KHN0eWxlLCBwYXJzZWRSdWxlU2V0RGF0YSgpLmZsYXR0ZW5lZFN0eWxlUnVsZXMoKSk7CisgICAg
cmV0dXJuIChydWxlT3JkaW5hbCAhPSBub3RGb3VuZCkgPyBDU1NJZChpZGVudGlmaWVyKCksIHJ1
bGVPcmRpbmFsKSA6IENTU0lkKCk7Cit9CisKK1JlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gU3R5
bGVSdWxlU2V0Ojpzb3VyY2VEYXRhRm9yUnVsZShDU1NTdHlsZVJ1bGUmIHJ1bGUpCit7CisgICAg
YXV0byYgcnVsZXMgPSBwYXJzZWRSdWxlU2V0RGF0YSgpLmZsYXR0ZW5lZFN0eWxlUnVsZXMoKTsK
KyAgICBzaXplX3QgcnVsZU9yZGluYWwgPSBydWxlcy5maW5kKCZydWxlKTsKKyAgICBpZiAocnVs
ZU9yZGluYWwgPT0gbm90Rm91bmQpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgYXV0
byYgc291cmNlRGF0YSA9IHBhcnNlZFJ1bGVTZXREYXRhKCkuZmxhdHRlbmVkU291cmNlRGF0YSgp
OworICAgIHJldHVybiBzb3VyY2VEYXRhLmF0KHJ1bGVPcmRpbmFsKTsKK30KKworUmVmUHRyPENT
U1J1bGVTb3VyY2VEYXRhPiBTdHlsZVJ1bGVTZXQ6OnNvdXJjZURhdGFGb3JTdHlsZShDU1NTdHls
ZURlY2xhcmF0aW9uJiBzdHlsZSkKK3sKKyAgICBzaXplX3Qgb3JkaW5hbCA9IHNvdXJjZURhdGFP
cmRpbmFsRm9yU3R5bGUoc3R5bGUsIHBhcnNlZFJ1bGVTZXREYXRhKCkuZmxhdHRlbmVkU3R5bGVS
dWxlcygpKTsKKyAgICByZXR1cm4gKG9yZGluYWwgIT0gbm90Rm91bmQpID8gcGFyc2VkUnVsZVNl
dERhdGEoKS5mbGF0dGVuZWRTb3VyY2VEYXRhKCkuYXQob3JkaW5hbCkgOiBudWxscHRyOworfQor
Cit9IC8vIG5hbWVzcGFjZSBJbnNwZWN0b3IKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9JbnNwZWN0b3JTdHlsZVJ1bGVTZXQuaCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9JbnNwZWN0b3JTdHlsZVJ1bGVTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi4zODFhMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3RvclN0eWxlUnVsZVNldC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDE1IFVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgSW5zcGVjdG9yU3R5bGVSdWxlU2V0X2gKKyNkZWZpbmUgSW5zcGVjdG9yU3R5bGVSdWxlU2V0
X2gKKworI2luY2x1ZGUgIkNTU1Byb3BlcnR5U291cmNlRGF0YS5oIgorI2luY2x1ZGUgPHd0Zi9S
ZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1dURlN0cmluZy5oPgorCisvLyBGSVhNRTogcmVtb3ZlCisjaW5jbHVkZSA8aW5zcGVjdG9yL0lu
c3BlY3RvclByb3RvY29sT2JqZWN0cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBD
U1NTdHlsZURlY2xhcmF0aW9uOworY2xhc3MgQ1NTU3R5bGVSdWxlOworY2xhc3MgRG9jdW1lbnQ7
CitjbGFzcyBFbGVtZW50OworCit0eXBlZGVmIFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVSdWxlPj4g
U3R5bGVSdWxlTGlzdDsKK30KKworbmFtZXNwYWNlIEluc3BlY3RvciB7CisKK2NsYXNzIENTU0lk
OworY2xhc3MgU3R5bGVSdWxlOworY2xhc3MgU3R5bGVzaGVldFJ1bGVTZXQ7CisKK3N0cnVjdCBQ
YXJzZWRSdWxlU2V0RGF0YSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUGFyc2VkUnVsZVNl
dERhdGEpOworcHVibGljOgorICAgIFBhcnNlZFJ1bGVTZXREYXRhKFN0cmluZywgc3RkOjp1bmlx
dWVfcHRyPFdlYkNvcmU6OlJ1bGVTb3VyY2VEYXRhTGlzdD4sIHN0ZDo6dW5pcXVlX3B0cjxXZWJD
b3JlOjpTdHlsZVJ1bGVMaXN0Pik7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZWRS
dWxlU2V0RGF0YT4gY3JlYXRlKFN0eWxlc2hlZXRSdWxlU2V0Jik7CisgICAgc3RhdGljIHN0ZDo6
dW5pcXVlX3B0cjxQYXJzZWRSdWxlU2V0RGF0YT4gY3JlYXRlKFdlYkNvcmU6OkVsZW1lbnQmKTsK
KyAgICAvLyBUaGlzIGlzIHVzZWQgdG8gcGFyc2UgbW9kaWZpZWQgc3R5bGVzaGVldCB0ZXh0LiBU
aGUgb3JpZ2luYWwgU3R5bGVTaGVldENvbnRlbnRzIGlzCisgICAgLy8gaW1tdXRhYmxlIGFuZCB3
aWxsIG5vIGxvbmdlciBtYXRjaCB0aGUgc3R5bGVzaGVldCdzIHRleHQsIHJ1bGVzIGFuZCBkZWNs
YXJhdGlvbnMuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZWRSdWxlU2V0RGF0YT4g
Y3JlYXRlV2l0aFRleHQoU3R5bGVzaGVldFJ1bGVTZXQmLCBjb25zdCBTdHJpbmcmIHNvdXJjZVRl
eHQpOworICAgIC8vIEZvciB1c2VyIGFuZCB1c2VyIGFnZW50IHN0eWxlc2hlZXRzLgorICAgIHN0
YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VkUnVsZVNldERhdGE+IGNyZWF0ZUVtcHR5KCk7CisK
KyAgICBjb25zdCBTdHJpbmcmIHNvdXJjZVRleHQoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZVRl
eHQ7IH0KKyAgICBjb25zdCBWZWN0b3I8c2l6ZV90PiYgbGluZUVuZGluZ3MoKSBjb25zdAorICAg
IHsKKyAgICAgICAgQVNTRVJUKG1fbGluZUVuZGluZ3MpOworICAgICAgICByZXR1cm4gKm1fbGlu
ZUVuZGluZ3M7CisgICAgfQorICAgIFdlYkNvcmU6OlJ1bGVTb3VyY2VEYXRhTGlzdCYgZmxhdHRl
bmVkU291cmNlRGF0YSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9mbGF0dGVuZWRT
b3VyY2VEYXRhKTsKKyAgICAgICAgcmV0dXJuICptX2ZsYXR0ZW5lZFNvdXJjZURhdGE7CisgICAg
fQorICAgIFdlYkNvcmU6OlN0eWxlUnVsZUxpc3QmIGZsYXR0ZW5lZFN0eWxlUnVsZXMoKSBjb25z
dAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZmxhdHRlbmVkU3R5bGVSdWxlcyk7CisgICAgICAg
IHJldHVybiAqbV9mbGF0dGVuZWRTdHlsZVJ1bGVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBT
dHJpbmcgbV9zb3VyY2VUZXh0OworICAgIHN0ZDo6dW5pcXVlX3B0cjxWZWN0b3I8c2l6ZV90Pj4g
bV9saW5lRW5kaW5nczsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6UnVsZVNvdXJjZURh
dGFMaXN0PiBtX2ZsYXR0ZW5lZFNvdXJjZURhdGE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNv
cmU6OlN0eWxlUnVsZUxpc3Q+IG1fZmxhdHRlbmVkU3R5bGVSdWxlczsKK307CisKK2NsYXNzIFN0
eWxlUnVsZVNldCA6IHB1YmxpYyBSZWZDb3VudGVkPFN0eWxlUnVsZVNldD4geworcHVibGljOgor
ICAgIFN0eWxlUnVsZVNldCgpOworICAgIHZpcnR1YWwgflN0eWxlUnVsZVNldCgpOworCisgICAg
dWludDY0X3QgaWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1faWRlbnRpZmllcjsgfQorICAg
IHZpcnR1YWwgYm9vbCBpc1N0eWxlc2hlZXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAg
IHZpcnR1YWwgYm9vbCBpc0lubGluZVN0eWxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKwor
ICAgIGNvbnN0IFN0cmluZyYgZ2V0VGV4dCgpOworICAgIHZpcnR1YWwgdm9pZCByZXBsYWNlVGV4
dChjb25zdCBTdHJpbmcmKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxQYXJz
ZWRSdWxlU2V0RGF0YT4gb3JpZ2luYWxTb3VyY2VEYXRhKCkgPSAwOworCisgICAgdmlydHVhbCB2
b2lkIG5vdGlmeVJ1bGVTZXRDaGFuZ2VkKCkgeyB9CisKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkRv
Y3VtZW50KiBvd25lckRvY3VtZW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzZXRU
ZXh0Rm9yU3R5bGUoV2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlvbiYsIGNvbnN0IFN0cmluZyYp
ID0gMDsKKworICAgIC8vIFJldHVybiBydWxlIHNvdXJjZSBkYXRhIHNpbmNlIGl0IGNvbnRhaW5z
IHRoZSBzdHlsZSBkZWNsYXJhdGlvbiByYW5nZS4KKyAgICBSZWZQdHI8V2ViQ29yZTo6Q1NTUnVs
ZVNvdXJjZURhdGE+IHNvdXJjZURhdGFGb3JTdHlsZShXZWJDb3JlOjpDU1NTdHlsZURlY2xhcmF0
aW9uJiBzdHlsZSk7CisgICAgUmVmUHRyPFdlYkNvcmU6OkNTU1J1bGVTb3VyY2VEYXRhPiBzb3Vy
Y2VEYXRhRm9yUnVsZShXZWJDb3JlOjpDU1NTdHlsZVJ1bGUmIHJ1bGUpOworCisgICAgQ1NTSWQg
aWRGb3JTdHlsZShXZWJDb3JlOjpDU1NTdHlsZURlY2xhcmF0aW9uJik7CisKKyAgICAvLyBGSVhN
RTogbWFrZSBwcm90ZWN0ZWQgYWdhaW4gd2hlbiBwcm90b2NvbCBidWlsZGVycyB1c2UgU3R5bGVS
dWxlIGluc3RlYWQuCisgICAgUGFyc2VkUnVsZVNldERhdGEmIHBhcnNlZFJ1bGVTZXREYXRhKCk7
Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBjb21taXRSdWxlU2V0Q2hhbmdlKHN0ZDo6dW5pcXVlX3B0
cjxQYXJzZWRSdWxlU2V0RGF0YT4pOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxQ
YXJzZWRSdWxlU2V0RGF0YT4gbV9wYXJzZWRSdWxlU2V0RGF0YTsKKyAgICB1aW50NjRfdCBtX2lk
ZW50aWZpZXI7CisKKyAgICBzdGF0aWMgdWludDY0X3Qgc19uZXh0UnVsZVNldElkOworfTsKKwor
fSAvLyBuYW1lc3BhY2UgSW5zcGVjdG9yCisKKyNlbmRpZiAvLyBJbnNwZWN0b3JTdHlsZVJ1bGVT
ZXRfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxl
U2hlZXQuY3BwIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlU2hlZXQu
Y3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGJkYmVlLi4wMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHlsZVNoZWV0LmNwcAorKysgL2Rl
di9udWxsCkBAIC0xLDEzNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQot
ICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JTdHlsZVNoZWV0LmgiCi0KLSNpbmNsdWRlICJDU1NJ
bXBvcnRSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTS2V5ZnJhbWVzUnVsZS5oIgotI2luY2x1ZGUgIkNT
U01lZGlhUnVsZS5oIgotI2luY2x1ZGUgIkNTU1BhcnNlci5oIgotI2luY2x1ZGUgIkNTU1Byb3Bl
cnR5TmFtZXMuaCIKLSNpbmNsdWRlICJDU1NQcm9wZXJ0eVNvdXJjZURhdGEuaCIKLSNpbmNsdWRl
ICJDU1NSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKLSNpbmNsdWRlICJDU1NTdHls
ZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NTdHlsZVNoZWV0LmgiCi0jaW5jbHVkZSAiQ1NTU3VwcG9y
dHNSdWxlLmgiCi0jaW5jbHVkZSAiQ29udGVudFNlY3VyaXR5UG9saWN5LmgiCi0jaW5jbHVkZSAi
RG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTEhlYWRFbGVt
ZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFBhcnNlcklkaW9t
cy5oIgotI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JD
U1NBZ2VudC5oIgotI2luY2x1ZGUgIkluc3BlY3RvclBhZ2VBZ2VudC5oIgotI2luY2x1ZGUgIk5v
ZGUuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50LmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNp
bmNsdWRlICJTdHlsZVByb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCi0j
aW5jbHVkZSAiU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiU3R5bGVSdWxlSW1wb3J0LmgiCi0jaW5j
bHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIK
LSNpbmNsdWRlIDxpbnNwZWN0b3IvQ29udGVudFNlYXJjaFV0aWxpdGllcy5oPgotI2luY2x1ZGUg
PHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KLSNpbmNsdWRlIDx5YXJyL1JlZ3VsYXJFeHByZXNz
aW9uLmg+Ci0KLXVzaW5nIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5OwotdXNpbmcgV2ViQ29y
ZTo6UnVsZVNvdXJjZURhdGFMaXN0OwotdXNpbmcgV2ViQ29yZTo6Q1NTUnVsZVNvdXJjZURhdGE7
Ci0KLWNsYXNzIFBhcnNlZFN0eWxlU2hlZXQgewotICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OwotcHVibGljOgotICAgIFBhcnNlZFN0eWxlU2hlZXQoKTsKLQotICAgIGNvbnN0IFN0cmluZyYg
dGV4dCgpIGNvbnN0IHsgQVNTRVJUKG1faGFzVGV4dCk7IHJldHVybiBtX3RleHQ7IH0KLSAgICB2
b2lkIHNldFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0KTsKLSAgICBib29sIGhhc1RleHQoKSBjb25z
dCB7IHJldHVybiBtX2hhc1RleHQ7IH0KLSAgICBSdWxlU291cmNlRGF0YUxpc3QqIHNvdXJjZURh
dGEoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZURhdGEuZ2V0KCk7IH0KLSAgICB2b2lkIHNldFNv
dXJjZURhdGEoc3RkOjp1bmlxdWVfcHRyPFJ1bGVTb3VyY2VEYXRhTGlzdD4pOwotICAgIGJvb2wg
aGFzU291cmNlRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlRGF0YSAhPSBudWxscHRyOyB9
Ci0gICAgUmVmUHRyPFdlYkNvcmU6OkNTU1J1bGVTb3VyY2VEYXRhPiBydWxlU291cmNlRGF0YUF0
KHVuc2lnbmVkKSBjb25zdDsKLQotcHJpdmF0ZToKLQotICAgIFN0cmluZyBtX3RleHQ7Ci0gICAg
Ym9vbCBtX2hhc1RleHQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFJ1bGVTb3VyY2VEYXRhTGlzdD4g
bV9zb3VyY2VEYXRhOwotfTsKLQotUGFyc2VkU3R5bGVTaGVldDo6UGFyc2VkU3R5bGVTaGVldCgp
Ci0gICAgOiBtX2hhc1RleHQoZmFsc2UpCi17Ci19Ci0KLXZvaWQgUGFyc2VkU3R5bGVTaGVldDo6
c2V0VGV4dChjb25zdCBTdHJpbmcmIHRleHQpCi17Ci0gICAgbV9oYXNUZXh0ID0gdHJ1ZTsKLSAg
ICBtX3RleHQgPSB0ZXh0OwotICAgIHNldFNvdXJjZURhdGEobnVsbHB0cik7Ci19Ci0KLXN0YXRp
YyB2b2lkIGZsYXR0ZW5Tb3VyY2VEYXRhKFJ1bGVTb3VyY2VEYXRhTGlzdCogZGF0YUxpc3QsIFJ1
bGVTb3VyY2VEYXRhTGlzdCogdGFyZ2V0KQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
ZGF0YUxpc3QtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0
YT4mIGRhdGEgPSBkYXRhTGlzdC0+YXQoaSk7Ci0gICAgICAgIGlmIChkYXRhLT50eXBlID09IENT
U1J1bGVTb3VyY2VEYXRhOjpTVFlMRV9SVUxFKQotICAgICAgICAgICAgdGFyZ2V0LT5hcHBlbmQo
ZGF0YSk7Ci0gICAgICAgIGVsc2UgaWYgKGRhdGEtPnR5cGUgPT0gQ1NTUnVsZVNvdXJjZURhdGE6
Ok1FRElBX1JVTEUpCi0gICAgICAgICAgICBmbGF0dGVuU291cmNlRGF0YSgmZGF0YS0+Y2hpbGRS
dWxlcywgdGFyZ2V0KTsKLSAgICAgICAgZWxzZSBpZiAoZGF0YS0+dHlwZSA9PSBDU1NSdWxlU291
cmNlRGF0YTo6U1VQUE9SVFNfUlVMRSkKLSAgICAgICAgICAgIGZsYXR0ZW5Tb3VyY2VEYXRhKCZk
YXRhLT5jaGlsZFJ1bGVzLCB0YXJnZXQpOwotICAgIH0KLX0KLQotdm9pZCBQYXJzZWRTdHlsZVNo
ZWV0OjpzZXRTb3VyY2VEYXRhKHN0ZDo6dW5pcXVlX3B0cjxSdWxlU291cmNlRGF0YUxpc3Q+IHNv
dXJjZURhdGEpCi17Ci0gICAgaWYgKCFzb3VyY2VEYXRhKSB7Ci0gICAgICAgIG1fc291cmNlRGF0
YS5yZXNldCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9zb3VyY2VEYXRhID0g
c3RkOjptYWtlX3VuaXF1ZTxSdWxlU291cmNlRGF0YUxpc3Q+KCk7Ci0KLSAgICAvLyBGSVhNRTog
VGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGZsYXQg
c291cmNlRGF0YSBzdHJ1Y3R1cmUKLSAgICAvLyBjb250YWluaW5nIG9ubHkgc3R5bGUgcnVsZXMs
IGV2ZW4gdGhvdWdoIENTU1BhcnNlciBub3cgcHJvdmlkZXMgdGhlIGZ1bGwgcnVsZSBzb3VyY2Ug
ZGF0YSB0cmVlLgotICAgIC8vIE5vcm1hbGx5LCB3ZSBzaG91bGQganVzdCBhc3NpZ24gbV9zb3Vy
Y2VEYXRhID0gc291cmNlRGF0YTsKLSAgICBmbGF0dGVuU291cmNlRGF0YShzb3VyY2VEYXRhLmdl
dCgpLCBtX3NvdXJjZURhdGEuZ2V0KCkpOwotfQotCi1SZWZQdHI8V2ViQ29yZTo6Q1NTUnVsZVNv
dXJjZURhdGE+IFBhcnNlZFN0eWxlU2hlZXQ6OnJ1bGVTb3VyY2VEYXRhQXQodW5zaWduZWQgaW5k
ZXgpIGNvbnN0Ci17Ci0gICAgaWYgKCFoYXNTb3VyY2VEYXRhKCkgfHwgaW5kZXggPj0gbV9zb3Vy
Y2VEYXRhLT5zaXplKCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgcmV0dXJuIG1f
c291cmNlRGF0YS0+YXQoaW5kZXgpOwotfQotCi11c2luZyBuYW1lc3BhY2UgSW5zcGVjdG9yOwot
Ci1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWVudW0gTWVkaWFMaXN0U291cmNlIHsKLSAgICBNZWRp
YUxpc3RTb3VyY2VMaW5rZWRTaGVldCwKLSAgICBNZWRpYUxpc3RTb3VyY2VJbmxpbmVTaGVldCwK
LSAgICBNZWRpYUxpc3RTb3VyY2VNZWRpYVJ1bGUsCi0gICAgTWVkaWFMaXN0U291cmNlSW1wb3J0
UnVsZQotfTsKLQotc3RhdGljIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNvdXJj
ZVJhbmdlPiBidWlsZFNvdXJjZVJhbmdlT2JqZWN0KGNvbnN0IFNvdXJjZVJhbmdlJiByYW5nZSwg
VmVjdG9yPHNpemVfdD4qIGxpbmVFbmRpbmdzKQotewotICAgIGlmICghbGluZUVuZGluZ3MpCi0g
ICAgICAgIHJldHVybiBudWxscHRyOwotICAgIFRleHRQb3NpdGlvbiBzdGFydCA9IENvbnRlbnRT
ZWFyY2hVdGlsaXRpZXM6OnRleHRQb3NpdGlvbkZyb21PZmZzZXQocmFuZ2Uuc3RhcnQsICpsaW5l
RW5kaW5ncyk7Ci0gICAgVGV4dFBvc2l0aW9uIGVuZCA9IENvbnRlbnRTZWFyY2hVdGlsaXRpZXM6
OnRleHRQb3NpdGlvbkZyb21PZmZzZXQocmFuZ2UuZW5kLCAqbGluZUVuZGluZ3MpOwotCi0gICAg
cmV0dXJuIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U291cmNlUmFuZ2U6OmNyZWF0ZSgpCi0g
ICAgICAgIC5zZXRTdGFydExpbmUoc3RhcnQubV9saW5lLnplcm9CYXNlZEludCgpKQotICAgICAg
ICAuc2V0U3RhcnRDb2x1bW4oc3RhcnQubV9jb2x1bW4uemVyb0Jhc2VkSW50KCkpCi0gICAgICAg
IC5zZXRFbmRMaW5lKGVuZC5tX2xpbmUuemVyb0Jhc2VkSW50KCkpCi0gICAgICAgIC5zZXRFbmRD
b2x1bW4oZW5kLm1fY29sdW1uLnplcm9CYXNlZEludCgpKQotICAgICAgICAucmVsZWFzZSgpOwot
fQotCi1zdGF0aWMgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE+IGJ1aWxk
TWVkaWFPYmplY3QoY29uc3QgTWVkaWFMaXN0KiBtZWRpYSwgTWVkaWFMaXN0U291cmNlIG1lZGlh
TGlzdFNvdXJjZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwpCi17Ci0gICAgLy8gTWFrZSBjZXJ0
YWluIGNvbXBpbGVycyBoYXBweSBieSBpbml0aWFsaXppbmcgfHNvdXJjZXwgdXAtZnJvbnQuCi0g
ICAgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlIHNvdXJjZSA9IElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTTWVkaWE6OlNvdXJjZTo6SW5saW5lU2hlZXQ7Ci0g
ICAgc3dpdGNoIChtZWRpYUxpc3RTb3VyY2UpIHsKLSAgICBjYXNlIE1lZGlhTGlzdFNvdXJjZU1l
ZGlhUnVsZToKLSAgICAgICAgc291cmNlID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NN
ZWRpYTo6U291cmNlOjpNZWRpYVJ1bGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVkaWFM
aXN0U291cmNlSW1wb3J0UnVsZToKLSAgICAgICAgc291cmNlID0gSW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NNZWRpYTo6U291cmNlOjpJbXBvcnRSdWxlOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIE1lZGlhTGlzdFNvdXJjZUxpbmtlZFNoZWV0OgotICAgICAgICBzb3VyY2UgPSBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01lZGlhOjpTb3VyY2U6OkxpbmtlZFNoZWV0OwotICAg
ICAgICBicmVhazsKLSAgICBjYXNlIE1lZGlhTGlzdFNvdXJjZUlubGluZVNoZWV0OgotICAgICAg
ICBzb3VyY2UgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01lZGlhOjpTb3VyY2U6Oklu
bGluZVNoZWV0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBhdXRvIG1lZGlhT2JqZWN0
ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NNZWRpYTo6Y3JlYXRlKCkKLSAgICAgICAg
LnNldFRleHQobWVkaWEtPm1lZGlhVGV4dCgpKQotICAgICAgICAuc2V0U291cmNlKHNvdXJjZSkK
LSAgICAgICAgLnJlbGVhc2UoKTsKLQotICAgIGlmICghc291cmNlVVJMLmlzRW1wdHkoKSkgewot
ICAgICAgICBtZWRpYU9iamVjdC0+c2V0U291cmNlVVJMKHNvdXJjZVVSTCk7Ci0gICAgICAgIG1l
ZGlhT2JqZWN0LT5zZXRTb3VyY2VMaW5lKG1lZGlhLT5xdWVyaWVzKCktPmxhc3RMaW5lKCkpOwot
ICAgIH0KLSAgICByZXR1cm4gV1RGOjptb3ZlKG1lZGlhT2JqZWN0KTsKLX0KLQotc3RhdGljIFJl
ZlB0cjxDU1NSdWxlTGlzdD4gYXNDU1NSdWxlTGlzdChDU1NTdHlsZVNoZWV0KiBzdHlsZVNoZWV0
KQotewotICAgIGlmICghc3R5bGVTaGVldCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAg
ICBSZWZQdHI8U3RhdGljQ1NTUnVsZUxpc3Q+IGxpc3QgPSBTdGF0aWNDU1NSdWxlTGlzdDo6Y3Jl
YXRlKCk7Ci0gICAgVmVjdG9yPFJlZlB0cjxDU1NSdWxlPj4mIGxpc3RSdWxlcyA9IGxpc3QtPnJ1
bGVzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgc2l6ZSA9IHN0eWxlU2hlZXQtPmxlbmd0
aCgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIENTU1J1bGUqIGl0ZW0gPSBzdHlsZVNoZWV0
LT5pdGVtKGkpOwotICAgICAgICBpZiAoaXRlbS0+dHlwZSgpID09IENTU1J1bGU6OkNIQVJTRVRf
UlVMRSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBsaXN0UnVsZXMuYXBwZW5kKGl0
ZW0pOwotICAgIH0KLSAgICByZXR1cm4gV1RGOjptb3ZlKGxpc3QpOwotfQotCi1zdGF0aWMgUmVm
UHRyPENTU1J1bGVMaXN0PiBhc0NTU1J1bGVMaXN0KENTU1J1bGUqIHJ1bGUpCi17Ci0gICAgaWYg
KCFydWxlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGlmIChpczxDU1NNZWRpYVJ1
bGU+KCpydWxlKSkKLSAgICAgICAgcmV0dXJuICZkb3duY2FzdDxDU1NNZWRpYVJ1bGU+KCpydWxl
KS5jc3NSdWxlcygpOwotCi0gICAgaWYgKGlzPENTU0tleWZyYW1lc1J1bGU+KCpydWxlKSkKLSAg
ICAgICAgcmV0dXJuICZkb3duY2FzdDxDU1NLZXlmcmFtZXNSdWxlPigqcnVsZSkuY3NzUnVsZXMo
KTsKLQotICAgIGlmIChpczxDU1NTdXBwb3J0c1J1bGU+KCpydWxlKSkKLSAgICAgICAgcmV0dXJu
ICZkb3duY2FzdDxDU1NTdXBwb3J0c1J1bGU+KCpydWxlKS5jc3NSdWxlcygpOwotCi0gICAgcmV0
dXJuIG51bGxwdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbGxNZWRpYUxpc3RDaGFpbihDU1NSdWxl
KiBydWxlLCBBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU01lZGlhPiYgbWVkaWFB
cnJheSkKLXsKLSAgICBNZWRpYUxpc3QqIG1lZGlhTGlzdDsKLSAgICBDU1NSdWxlKiBwYXJlbnRS
dWxlID0gcnVsZTsKLSAgICBTdHJpbmcgc291cmNlVVJMOwotICAgIHdoaWxlIChwYXJlbnRSdWxl
KSB7Ci0gICAgICAgIENTU1N0eWxlU2hlZXQqIHBhcmVudFN0eWxlU2hlZXQgPSBudWxscHRyOwot
ICAgICAgICBib29sIGlzTWVkaWFSdWxlID0gdHJ1ZTsKLSAgICAgICAgaWYgKGlzPENTU01lZGlh
UnVsZT4oKnBhcmVudFJ1bGUpKSB7Ci0gICAgICAgICAgICBDU1NNZWRpYVJ1bGUmIG1lZGlhUnVs
ZSA9IGRvd25jYXN0PENTU01lZGlhUnVsZT4oKnBhcmVudFJ1bGUpOwotICAgICAgICAgICAgbWVk
aWFMaXN0ID0gbWVkaWFSdWxlLm1lZGlhKCk7Ci0gICAgICAgICAgICBwYXJlbnRTdHlsZVNoZWV0
ID0gbWVkaWFSdWxlLnBhcmVudFN0eWxlU2hlZXQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChpczxD
U1NJbXBvcnRSdWxlPigqcGFyZW50UnVsZSkpIHsKLSAgICAgICAgICAgIENTU0ltcG9ydFJ1bGUm
IGltcG9ydFJ1bGUgPSBkb3duY2FzdDxDU1NJbXBvcnRSdWxlPigqcGFyZW50UnVsZSk7Ci0gICAg
ICAgICAgICBtZWRpYUxpc3QgPSAmaW1wb3J0UnVsZS5tZWRpYSgpOwotICAgICAgICAgICAgcGFy
ZW50U3R5bGVTaGVldCA9IGltcG9ydFJ1bGUucGFyZW50U3R5bGVTaGVldCgpOwotICAgICAgICAg
ICAgaXNNZWRpYVJ1bGUgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtZWRp
YUxpc3QgPSBudWxscHRyOwotCi0gICAgICAgIGlmIChwYXJlbnRTdHlsZVNoZWV0KSB7Ci0gICAg
ICAgICAgICBzb3VyY2VVUkwgPSBwYXJlbnRTdHlsZVNoZWV0LT5jb250ZW50cygpLmJhc2VVUkwo
KTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VVUkwuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAg
IHNvdXJjZVVSTCA9IEluc3BlY3RvckRPTUFnZW50Ojpkb2N1bWVudFVSTFN0cmluZyhwYXJlbnRT
dHlsZVNoZWV0LT5vd25lckRvY3VtZW50KCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
IHNvdXJjZVVSTCA9ICIiOwotCi0gICAgICAgIGlmIChtZWRpYUxpc3QgJiYgbWVkaWFMaXN0LT5s
ZW5ndGgoKSkKLSAgICAgICAgICAgIG1lZGlhQXJyYXkuYWRkSXRlbShidWlsZE1lZGlhT2JqZWN0
KG1lZGlhTGlzdCwgaXNNZWRpYVJ1bGUgPyBNZWRpYUxpc3RTb3VyY2VNZWRpYVJ1bGUgOiBNZWRp
YUxpc3RTb3VyY2VJbXBvcnRSdWxlLCBzb3VyY2VVUkwpKTsKLQotICAgICAgICBpZiAocGFyZW50
UnVsZS0+cGFyZW50UnVsZSgpKQotICAgICAgICAgICAgcGFyZW50UnVsZSA9IHBhcmVudFJ1bGUt
PnBhcmVudFJ1bGUoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBDU1NTdHlsZVNoZWV0
KiBzdHlsZVNoZWV0ID0gcGFyZW50UnVsZS0+cGFyZW50U3R5bGVTaGVldCgpOwotICAgICAgICAg
ICAgd2hpbGUgKHN0eWxlU2hlZXQpIHsKLSAgICAgICAgICAgICAgICBtZWRpYUxpc3QgPSBzdHls
ZVNoZWV0LT5tZWRpYSgpOwotICAgICAgICAgICAgICAgIGlmIChtZWRpYUxpc3QgJiYgbWVkaWFM
aXN0LT5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCogZG9jID0gc3R5
bGVTaGVldC0+b3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKQot
ICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVVJMID0gZG9jLT51cmwoKTsKLSAgICAgICAg
ICAgICAgICAgICAgZWxzZSBpZiAoIXN0eWxlU2hlZXQtPmNvbnRlbnRzKCkuYmFzZVVSTCgpLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVVSTCA9IHN0eWxlU2hlZXQt
PmNvbnRlbnRzKCkuYmFzZVVSTCgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgbWVk
aWFBcnJheS5hZGRJdGVtKGJ1aWxkTWVkaWFPYmplY3QobWVkaWFMaXN0LCBzdHlsZVNoZWV0LT5v
d25lck5vZGUoKSA/IE1lZGlhTGlzdFNvdXJjZUxpbmtlZFNoZWV0IDogTWVkaWFMaXN0U291cmNl
SW5saW5lU2hlZXQsIHNvdXJjZVVSTCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICBwYXJlbnRSdWxlID0gc3R5bGVTaGVldC0+b3duZXJSdWxlKCk7Ci0gICAgICAgICAgICAg
ICAgaWYgKHBhcmVudFJ1bGUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIHN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0LT5wYXJlbnRTdHlsZVNoZWV0KCk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8
Q1NTUGFyc2VyPiBjcmVhdGVDU1NQYXJzZXIoRG9jdW1lbnQqIGRvY3VtZW50KQotewotICAgIHJl
dHVybiBzdGQ6Om1ha2VfdW5pcXVlPENTU1BhcnNlcj4oZG9jdW1lbnQgPyBDU1NQYXJzZXJDb250
ZXh0KCpkb2N1bWVudCkgOiBzdHJpY3RDU1NQYXJzZXJDb250ZXh0KCkpOwotfQotCi1SZWY8SW5z
cGVjdG9yU3R5bGU+IEluc3BlY3RvclN0eWxlOjpjcmVhdGUoY29uc3QgSW5zcGVjdG9yQ1NTSWQm
IHN0eWxlSWQsIFJlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiYmIHN0eWxlLCBJbnNwZWN0b3JT
dHlsZVNoZWV0KiBwYXJlbnRTdHlsZVNoZWV0KQotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3
IEluc3BlY3RvclN0eWxlKHN0eWxlSWQsIFdURjo6bW92ZShzdHlsZSksIHBhcmVudFN0eWxlU2hl
ZXQpKTsKLX0KLQotSW5zcGVjdG9yU3R5bGU6Okluc3BlY3RvclN0eWxlKGNvbnN0IEluc3BlY3Rv
ckNTU0lkJiBzdHlsZUlkLCBSZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4mJiBzdHlsZSwgSW5z
cGVjdG9yU3R5bGVTaGVldCogcGFyZW50U3R5bGVTaGVldCkKLSAgICA6IG1fc3R5bGVJZChzdHls
ZUlkKQotICAgICwgbV9zdHlsZShzdHlsZSkKLSAgICAsIG1fcGFyZW50U3R5bGVTaGVldChwYXJl
bnRTdHlsZVNoZWV0KQotewotICAgIEFTU0VSVChtX3N0eWxlKTsKLX0KLQotSW5zcGVjdG9yU3R5
bGU6On5JbnNwZWN0b3JTdHlsZSgpCi17Ci19Ci0KLVJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29s
OjpDU1M6OkNTU1N0eWxlPiBJbnNwZWN0b3JTdHlsZTo6YnVpbGRPYmplY3RGb3JTdHlsZSgpIGNv
bnN0Ci17Ci0gICAgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IHJlc3Vs
dCA9IHN0eWxlV2l0aFByb3BlcnRpZXMoKTsKLSAgICBpZiAoIW1fc3R5bGVJZC5pc0VtcHR5KCkp
Ci0gICAgICAgIHJlc3VsdC0+c2V0U3R5bGVJZChtX3N0eWxlSWQuYXNQcm90b2NvbFZhbHVlPElu
c3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGVJZD4oKSk7Ci0KLSAgICByZXN1bHQtPnNl
dFdpZHRoKG1fc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoIndpZHRoIikpOwotICAgIHJlc3VsdC0+
c2V0SGVpZ2h0KG1fc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpKTsKLQotICAgIFJl
ZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0YSA9IGV4dHJhY3RTb3VyY2VEYXRhKCk7
Ci0gICAgaWYgKHNvdXJjZURhdGEpCi0gICAgICAgIHJlc3VsdC0+c2V0UmFuZ2UoYnVpbGRTb3Vy
Y2VSYW5nZU9iamVjdChzb3VyY2VEYXRhLT5ydWxlQm9keVJhbmdlLCBtX3BhcmVudFN0eWxlU2hl
ZXQtPmxpbmVFbmRpbmdzKCkuZ2V0KCkpKTsKLQotICAgIHJldHVybiBXVEY6Om1vdmUocmVzdWx0
KTsKLX0KLQotUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5Pj4gSW5zcGVjdG9yU3R5bGU6OmJ1aWxk
QXJyYXlGb3JDb21wdXRlZFN0eWxlKCkgY29uc3QKLXsKLSAgICBhdXRvIHJlc3VsdCA9IEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTQ29tcHV0
ZWRTdHlsZVByb3BlcnR5Pjo6Y3JlYXRlKCk7Ci0gICAgVmVjdG9yPEluc3BlY3RvclN0eWxlUHJv
cGVydHk+IHByb3BlcnRpZXM7Ci0gICAgcG9wdWxhdGVBbGxQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVz
KTsKLQotICAgIGZvciAoVmVjdG9yPEluc3BlY3RvclN0eWxlUHJvcGVydHk+OjppdGVyYXRvciBp
dCA9IHByb3BlcnRpZXMuYmVnaW4oKSwgaXRFbmQgPSBwcm9wZXJ0aWVzLmVuZCgpOyBpdCAhPSBp
dEVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBDU1NQcm9wZXJ0eVNvdXJjZURhdGEmIHByb3Bl
cnR5RW50cnkgPSBpdC0+c291cmNlRGF0YTsKLSAgICAgICAgYXV0byBlbnRyeSA9IEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5OjpjcmVhdGUoKQotICAg
ICAgICAgICAgLnNldE5hbWUocHJvcGVydHlFbnRyeS5uYW1lKQotICAgICAgICAgICAgLnNldFZh
bHVlKHByb3BlcnR5RW50cnkudmFsdWUpCi0gICAgICAgICAgICAucmVsZWFzZSgpOwotICAgICAg
ICByZXN1bHQtPmFkZEl0ZW0oV1RGOjptb3ZlKGVudHJ5KSk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IFdURjo6bW92ZShyZXN1bHQpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlOjpnZXRUZXh0KFN0
cmluZyogcmVzdWx0KSBjb25zdAotewotICAgIC8vIFByZWNvbmRpdGlvbjogbV9wYXJlbnRTdHls
ZVNoZWV0LT5lbnN1cmVQYXJzZWREYXRhUmVhZHkoKSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1
bGx5LgotICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0YSA9IGV4dHJhY3RT
b3VyY2VEYXRhKCk7Ci0gICAgaWYgKCFzb3VyY2VEYXRhKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBTdHJpbmcgc3R5bGVTaGVldFRleHQ7Ci0gICAgYm9vbCBzdWNjZXNzID0gbV9wYXJl
bnRTdHlsZVNoZWV0LT5nZXRUZXh0KCZzdHlsZVNoZWV0VGV4dCk7Ci0gICAgaWYgKCFzdWNjZXNz
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTb3VyY2VSYW5nZSYgYm9keVJhbmdlID0g
c291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZTsKLSAgICAqcmVzdWx0ID0gc3R5bGVTaGVldFRleHQu
c3Vic3RyaW5nKGJvZHlSYW5nZS5zdGFydCwgYm9keVJhbmdlLmVuZCAtIGJvZHlSYW5nZS5zdGFy
dCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGU6OnBvcHVsYXRl
QWxsUHJvcGVydGllcyhWZWN0b3I8SW5zcGVjdG9yU3R5bGVQcm9wZXJ0eT4qIHJlc3VsdCkgY29u
c3QKLXsKLSAgICBIYXNoU2V0PFN0cmluZz4gc291cmNlUHJvcGVydHlOYW1lczsKLQotICAgIFJl
ZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0YSA9IGV4dHJhY3RTb3VyY2VEYXRhKCk7
Ci0gICAgVmVjdG9yPENTU1Byb3BlcnR5U291cmNlRGF0YT4qIHNvdXJjZVByb3BlcnR5RGF0YSA9
IHNvdXJjZURhdGEgPyAmKHNvdXJjZURhdGEtPnN0eWxlU291cmNlRGF0YS0+cHJvcGVydHlEYXRh
KSA6IG51bGxwdHI7Ci0gICAgaWYgKHNvdXJjZVByb3BlcnR5RGF0YSkgewotICAgICAgICBTdHJp
bmcgc3R5bGVEZWNsYXJhdGlvbjsKLSAgICAgICAgYm9vbCBpc1N0eWxlVGV4dEtub3duID0gc3R5
bGVUZXh0KCZzdHlsZURlY2xhcmF0aW9uKTsKLSAgICAgICAgQVNTRVJUX1VOVVNFRChpc1N0eWxl
VGV4dEtub3duLCBpc1N0eWxlVGV4dEtub3duKTsKLSAgICAgICAgZm9yIChWZWN0b3I8Q1NTUHJv
cGVydHlTb3VyY2VEYXRhPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzb3VyY2VQcm9wZXJ0eURhdGEt
PmJlZ2luKCk7IGl0ICE9IHNvdXJjZVByb3BlcnR5RGF0YS0+ZW5kKCk7ICsraXQpIHsKLSAgICAg
ICAgICAgIEluc3BlY3RvclN0eWxlUHJvcGVydHkgcCgqaXQsIHRydWUsIGZhbHNlKTsKLSAgICAg
ICAgICAgIHAuc2V0UmF3VGV4dEZyb21TdHlsZURlY2xhcmF0aW9uKHN0eWxlRGVjbGFyYXRpb24p
OwotICAgICAgICAgICAgcmVzdWx0LT5hcHBlbmQocCk7Ci0gICAgICAgICAgICBzb3VyY2VQcm9w
ZXJ0eU5hbWVzLmFkZChpdC0+bmFtZS5sb3dlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IGZvciAoaW50IGkgPSAwLCBzaXplID0gbV9zdHlsZS0+bGVuZ3RoKCk7IGkgPCBzaXplOyArK2kp
IHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBtX3N0eWxlLT5pdGVtKGkpOwotICAgICAgICBpZiAo
c291cmNlUHJvcGVydHlOYW1lcy5jb250YWlucyhuYW1lLmxvd2VyKCkpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgc291cmNlUHJvcGVydHlOYW1lcy5hZGQobmFtZS5sb3dlcigp
KTsKLSAgICAgICAgcmVzdWx0LT5hcHBlbmQoSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eShDU1NQcm9w
ZXJ0eVNvdXJjZURhdGEobmFtZSwgbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShuYW1lKSwgIW1f
c3R5bGUtPmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSkuaXNFbXB0eSgpLCB0cnVlLCBTb3VyY2VS
YW5nZSgpKSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LVJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlPiBJbnNwZWN0b3JTdHlsZTo6
c3R5bGVXaXRoUHJvcGVydGllcygpIGNvbnN0Ci17Ci0gICAgVmVjdG9yPEluc3BlY3RvclN0eWxl
UHJvcGVydHk+IHByb3BlcnRpZXM7Ci0gICAgcG9wdWxhdGVBbGxQcm9wZXJ0aWVzKCZwcm9wZXJ0
aWVzKTsKLQotICAgIGF1dG8gcHJvcGVydGllc09iamVjdCA9IEFycmF5PEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk+OjpjcmVhdGUoKTsKLSAgICBhdXRvIHNob3J0aGFuZEVu
dHJpZXMgPSBBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNob3J0aGFuZEVudHJ5Pjo6
Y3JlYXRlKCk7Ci0gICAgSGFzaE1hcDxTdHJpbmcsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29s
OjpDU1M6OkNTU1Byb3BlcnR5Pj4gcHJvcGVydHlOYW1lVG9QcmV2aW91c0FjdGl2ZVByb3BlcnR5
OwotICAgIEhhc2hTZXQ8U3RyaW5nPiBmb3VuZFNob3J0aGFuZHM7Ci0gICAgU3RyaW5nIHByZXZp
b3VzUHJpb3JpdHk7Ci0gICAgU3RyaW5nIHByZXZpb3VzU3RhdHVzOwotICAgIHN0ZDo6dW5pcXVl
X3B0cjxWZWN0b3I8c2l6ZV90Pj4gbGluZUVuZGluZ3MobV9wYXJlbnRTdHlsZVNoZWV0ID8gbV9w
YXJlbnRTdHlsZVNoZWV0LT5saW5lRW5kaW5ncygpIDogbnVsbHB0cik7Ci0gICAgUmVmUHRyPENT
U1J1bGVTb3VyY2VEYXRhPiBzb3VyY2VEYXRhID0gZXh0cmFjdFNvdXJjZURhdGEoKTsKLSAgICB1
bnNpZ25lZCBydWxlQm9keVJhbmdlU3RhcnQgPSBzb3VyY2VEYXRhID8gc291cmNlRGF0YS0+cnVs
ZUJvZHlSYW5nZS5zdGFydCA6IDA7Ci0KLSAgICBmb3IgKFZlY3RvcjxJbnNwZWN0b3JTdHlsZVBy
b3BlcnR5Pjo6aXRlcmF0b3IgaXQgPSBwcm9wZXJ0aWVzLmJlZ2luKCksIGl0RW5kID0gcHJvcGVy
dGllcy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgQ1NTUHJvcGVy
dHlTb3VyY2VEYXRhJiBwcm9wZXJ0eUVudHJ5ID0gaXQtPnNvdXJjZURhdGE7Ci0gICAgICAgIGNv
bnN0IFN0cmluZyYgbmFtZSA9IHByb3BlcnR5RW50cnkubmFtZTsKLQotICAgICAgICAvLyBWaXN1
YWwgU3R1ZGlvIGRpc2FncmVlcyB3aXRoIG90aGVyIGNvbXBpbGVycyBhcyB0byB3aGV0aGVyICdj
bGFzcycgaXMgbmVlZGVkIGhlcmUuCi0jaWYgQ09NUElMRVIoTVNWQykKLSAgICAgICAgZW51bSBj
bGFzcyBQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1cyBzdGF0dXM7Ci0jZWxzZQotICAg
ICAgICBlbnVtIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXMgc3Rh
dHVzOwotI2VuZGlmCi0gICAgICAgIHN0YXR1cyA9IGl0LT5kaXNhYmxlZCA/IEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHlTdGF0dXM6OkRpc2FibGVkIDogSW5zcGVjdG9yOjpQ
cm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1czo6QWN0aXZlOwotCi0gICAgICAgIFJlZlB0
cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5PiBwcm9wZXJ0eSA9IEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk6OmNyZWF0ZSgpCi0gICAgICAgICAgICAu
c2V0TmFtZShuYW1lLmxvd2VyKCkpCi0gICAgICAgICAgICAuc2V0VmFsdWUocHJvcGVydHlFbnRy
eS52YWx1ZSkKLSAgICAgICAgICAgIC5yZWxlYXNlKCk7Ci0KLSAgICAgICAgcHJvcGVydGllc09i
amVjdC0+YWRkSXRlbShwcm9wZXJ0eS5jb3B5UmVmKCkpOwotCi0gICAgICAgIC8vIERlZmF1bHQg
InBhcnNlZE9rIiA9PSB0cnVlLgotICAgICAgICBpZiAoIXByb3BlcnR5RW50cnkucGFyc2VkT2sp
Ci0gICAgICAgICAgICBwcm9wZXJ0eS0+c2V0UGFyc2VkT2soZmFsc2UpOwotICAgICAgICBpZiAo
aXQtPmhhc1Jhd1RleHQoKSkKLSAgICAgICAgICAgIHByb3BlcnR5LT5zZXRUZXh0KGl0LT5yYXdU
ZXh0KTsKLQotICAgICAgICAvLyBEZWZhdWx0ICJwcmlvcml0eSIgPT0gIiIuCi0gICAgICAgIGlm
IChwcm9wZXJ0eUVudHJ5LmltcG9ydGFudCkKLSAgICAgICAgICAgIHByb3BlcnR5LT5zZXRQcmlv
cml0eSgiaW1wb3J0YW50Iik7Ci0gICAgICAgIGlmICghaXQtPmRpc2FibGVkKSB7Ci0gICAgICAg
ICAgICBpZiAoaXQtPmhhc1NvdXJjZSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChzb3VyY2VE
YXRhKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+c2V0SW1wbGljaXQoZmFsc2UpOwotICAg
ICAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSByYW5nZSBpcyByZWxhdGl2ZSB0byB0aGUgc3R5
bGUgYm9keSBzdGFydC4KLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgY29udmVydGVkIGlu
dG8gYW4gYWJzb2x1dGUgcmFuZ2UgKHJlbGF0aXZlIHRvIHRoZSBzdHlsZXNoZWV0IHN0YXJ0KQot
ICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcHJvcGVyIGNvbnZlcnNpb24gaW50byBsaW5lOmNv
bHVtbi4KLSAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBhYnNvbHV0ZVByb3BlcnR5UmFuZ2Ug
PSBwcm9wZXJ0eUVudHJ5LnJhbmdlOwotICAgICAgICAgICAgICAgIGFic29sdXRlUHJvcGVydHlS
YW5nZS5zdGFydCArPSBydWxlQm9keVJhbmdlU3RhcnQ7Ci0gICAgICAgICAgICAgICAgYWJzb2x1
dGVQcm9wZXJ0eVJhbmdlLmVuZCArPSBydWxlQm9keVJhbmdlU3RhcnQ7Ci0gICAgICAgICAgICAg
ICAgcHJvcGVydHktPnNldFJhbmdlKGJ1aWxkU291cmNlUmFuZ2VPYmplY3QoYWJzb2x1dGVQcm9w
ZXJ0eVJhbmdlLCBsaW5lRW5kaW5ncy5nZXQoKSkpOwotCi0gICAgICAgICAgICAgICAgLy8gUGFy
c2VkIHByb3BlcnR5IG92ZXJyaWRlcyBhbnkgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lLiBO
b24tcGFyc2VkIHByb3BlcnR5IG92ZXJyaWRlcwotICAgICAgICAgICAgICAgIC8vIHByZXZpb3Vz
IG5vbi1wYXJzZWQgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIChpZiBhbnkpLgotICAgICAg
ICAgICAgICAgIGJvb2wgc2hvdWxkSW5hY3RpdmF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAg
IENTU1Byb3BlcnR5SUQgcHJvcGVydHlJZCA9IGNzc1Byb3BlcnR5SUQobmFtZSk7Ci0gICAgICAg
ICAgICAgICAgLy8gQ2Fub25pY2FsaXplIHByb3BlcnR5IG5hbWVzIHRvIHRyZWF0IG5vbi1wcmVm
aXhlZCBhbmQgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG5hbWVzIHRoZSBzYW1lIChvcGFjaXR5
IHZzLiAtd2Via2l0LW9wYWNpdHkpLgotICAgICAgICAgICAgICAgIFN0cmluZyBjYW5vbmljYWxQ
cm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUlkID8gZ2V0UHJvcGVydHlOYW1lU3RyaW5nKHByb3BlcnR5
SWQpIDogbmFtZTsKLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgUmVmUHRyPEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVydHk+Pjo6aXRlcmF0b3IgYWN0aXZlSXQgPSBw
cm9wZXJ0eU5hbWVUb1ByZXZpb3VzQWN0aXZlUHJvcGVydHkuZmluZChjYW5vbmljYWxQcm9wZXJ0
eU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJdCAhPSBwcm9wZXJ0eU5hbWVUb1By
ZXZpb3VzQWN0aXZlUHJvcGVydHkuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBy
b3BlcnR5RW50cnkucGFyc2VkT2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3Vj
Y2Vzc1ByaW9yaXR5ID0gYWN0aXZlSXQtPnZhbHVlLT5nZXRTdHJpbmcoSW5zcGVjdG9yOjpQcm90
b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eTo6UHJpb3JpdHksIHByZXZpb3VzUHJpb3JpdHkpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzU3RhdHVzID0gYWN0aXZlSXQtPnZhbHVl
LT5nZXRTdHJpbmcoSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eTo6U3RhdHVz
LCBwcmV2aW91c1N0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc1N0
YXR1cyAmJiBwcmV2aW91c1N0YXR1cyAhPSAiaW5hY3RpdmUiKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHByb3BlcnR5RW50cnkuaW1wb3J0YW50IHx8ICFzdWNjZXNzUHJpb3Jp
dHkpIC8vIFByaW9yaXR5IG5vdCBzZXQgPT0gIm5vdCBpbXBvcnRhbnQiLgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmFjdGl2YXRlID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMgPT0gSW5zcGVjdG9yOjpQcm90b2NvbDo6
Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1czo6QWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIEluYWN0aXZhdGUgYSBub24taW1wb3J0YW50IHByb3BlcnR5IGZvbGxvd2lu
ZyB0aGUgc2FtZS1uYW1lZCBpbXBvcnRhbnQgcHJvcGVydHkuCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXR1cyA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUHJvcGVy
dHlTdGF0dXM6OkluYWN0aXZlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGJvb2wgcHJldmlvdXNQYXJzZWRPazsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGFjdGl2ZUl0LT52YWx1ZS0+Z2V0Qm9vbGVhbihJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5OjpQYXJzZWRPaywgcHJldmlvdXNQYXJz
ZWRPayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiAhcHJldmlvdXNQ
YXJzZWRPaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmFjdGl2YXRlID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZQotICAg
ICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVUb1ByZXZpb3VzQWN0aXZlUHJvcGVydHkuc2V0
KGNhbm9uaWNhbFByb3BlcnR5TmFtZSwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICAgICAgaWYg
KHNob3VsZEluYWN0aXZhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlSXQtPnZhbHVl
LT5zZXRTdGF0dXMoSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NQcm9wZXJ0eVN0YXR1czo6
SW5hY3RpdmUpOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVUb1ByZXZpb3VzQWN0
aXZlUHJvcGVydHkuc2V0KGNhbm9uaWNhbFByb3BlcnR5TmFtZSwgcHJvcGVydHkpOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBp
bXBsaWNpdCA9IG1fc3R5bGUtPmlzUHJvcGVydHlJbXBsaWNpdChuYW1lKTsKLSAgICAgICAgICAg
ICAgICAvLyBEZWZhdWx0ICJpbXBsaWNpdCIgPT0gZmFsc2UuCi0gICAgICAgICAgICAgICAgaWYg
KGltcGxpY2l0KQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+c2V0SW1wbGljaXQodHJ1
ZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpD
U1NQcm9wZXJ0eVN0YXR1czo6U3R5bGU7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRo
YW5kID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlTaG9ydGhhbmQobmFtZSk7Ci0gICAgICAgICAgICAg
ICAgaWYgKCFzaG9ydGhhbmQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgh
Zm91bmRTaG9ydGhhbmRzLmNvbnRhaW5zKHNob3J0aGFuZCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGZvdW5kU2hvcnRoYW5kcy5hZGQoc2hvcnRoYW5kKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGF1dG8gZW50cnkgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNob3J0aGFuZEVu
dHJ5OjpjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKHNob3J0
aGFuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUoc2hvcnRoYW5kVmFs
dWUoc2hvcnRoYW5kKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVsZWFzZSgpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRoYW5kRW50cmllcy0+YWRkSXRlbShXVEY6Om1v
dmUoZW50cnkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERlZmF1bHQgInN0YXR1cyIgPT0g
InN0eWxlIi4KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU1Byb3BlcnR5U3RhdHVzOjpTdHlsZSkKLSAgICAgICAgICAgIHByb3BlcnR5LT5zZXRTdGF0
dXMoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpDU1NTdHlsZTo6Y3JlYXRlKCkKLSAgICAgICAgLnNldENzc1Byb3BlcnRpZXMoV1RGOjptb3Zl
KHByb3BlcnRpZXNPYmplY3QpKQotICAgICAgICAuc2V0U2hvcnRoYW5kRW50cmllcyhXVEY6Om1v
dmUoc2hvcnRoYW5kRW50cmllcykpCi0gICAgICAgIC5yZWxlYXNlKCk7Ci19Ci0KLVJlZlB0cjxD
U1NSdWxlU291cmNlRGF0YT4gSW5zcGVjdG9yU3R5bGU6OmV4dHJhY3RTb3VyY2VEYXRhKCkgY29u
c3QKLXsKLSAgICBpZiAoIW1fcGFyZW50U3R5bGVTaGVldCB8fCAhbV9wYXJlbnRTdHlsZVNoZWV0
LT5lbnN1cmVQYXJzZWREYXRhUmVhZHkoKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAg
cmV0dXJuIG1fcGFyZW50U3R5bGVTaGVldC0+cnVsZVNvdXJjZURhdGFGb3IobV9zdHlsZS5nZXQo
KSk7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGU6OnNldFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0
LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICByZXR1cm4gbV9wYXJlbnRTdHlsZVNoZWV0LT5z
ZXRTdHlsZVRleHQobV9zdHlsZS5nZXQoKSwgdGV4dCwgZWMpOwotfQotCi1TdHJpbmcgSW5zcGVj
dG9yU3R5bGU6OnNob3J0aGFuZFZhbHVlKGNvbnN0IFN0cmluZyYgc2hvcnRoYW5kUHJvcGVydHkp
IGNvbnN0Ci17Ci0gICAgU3RyaW5nIHZhbHVlID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShz
aG9ydGhhbmRQcm9wZXJ0eSk7Ci0gICAgaWYgKCF2YWx1ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybiB2YWx1ZTsKLSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1fc3R5bGUtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nIGlu
ZGl2aWR1YWxQcm9wZXJ0eSA9IG1fc3R5bGUtPml0ZW0oaSk7Ci0gICAgICAgIGlmIChtX3N0eWxl
LT5nZXRQcm9wZXJ0eVNob3J0aGFuZChpbmRpdmlkdWFsUHJvcGVydHkpICE9IHNob3J0aGFuZFBy
b3BlcnR5KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChtX3N0eWxlLT5pc1By
b3BlcnR5SW1wbGljaXQoaW5kaXZpZHVhbFByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICBTdHJpbmcgaW5kaXZpZHVhbFZhbHVlID0gbV9zdHlsZS0+Z2V0UHJvcGVydHlW
YWx1ZShpbmRpdmlkdWFsUHJvcGVydHkpOwotICAgICAgICBpZiAoaW5kaXZpZHVhbFZhbHVlID09
ICJpbml0aWFsIikKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoIWJ1aWxkZXIu
aXNFbXB0eSgpKQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgYnVp
bGRlci5hcHBlbmQoaW5kaXZpZHVhbFZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1aWxkZXIu
dG9TdHJpbmcoKTsKLX0KLQotU3RyaW5nIEluc3BlY3RvclN0eWxlOjpzaG9ydGhhbmRQcmlvcml0
eShjb25zdCBTdHJpbmcmIHNob3J0aGFuZFByb3BlcnR5KSBjb25zdAotewotICAgIFN0cmluZyBw
cmlvcml0eSA9IG1fc3R5bGUtPmdldFByb3BlcnR5UHJpb3JpdHkoc2hvcnRoYW5kUHJvcGVydHkp
OwotICAgIGlmIChwcmlvcml0eS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fc3R5bGUtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBp
bmRpdmlkdWFsUHJvcGVydHkgPSBtX3N0eWxlLT5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG1f
c3R5bGUtPmdldFByb3BlcnR5U2hvcnRoYW5kKGluZGl2aWR1YWxQcm9wZXJ0eSkgIT0gc2hvcnRo
YW5kUHJvcGVydHkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwcmlv
cml0eSA9IG1fc3R5bGUtPmdldFByb3BlcnR5UHJpb3JpdHkoaW5kaXZpZHVhbFByb3BlcnR5KTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcmlvcml0
eTsKLX0KLQotVmVjdG9yPFN0cmluZz4gSW5zcGVjdG9yU3R5bGU6OmxvbmdoYW5kUHJvcGVydGll
cyhjb25zdCBTdHJpbmcmIHNob3J0aGFuZFByb3BlcnR5KSBjb25zdAotewotICAgIFZlY3RvcjxT
dHJpbmc+IHByb3BlcnRpZXM7Ci0gICAgSGFzaFNldDxTdHJpbmc+IGZvdW5kUHJvcGVydGllczsK
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9zdHlsZS0+bGVuZ3RoKCk7ICsraSkgewot
ICAgICAgICBTdHJpbmcgaW5kaXZpZHVhbFByb3BlcnR5ID0gbV9zdHlsZS0+aXRlbShpKTsKLSAg
ICAgICAgaWYgKGZvdW5kUHJvcGVydGllcy5jb250YWlucyhpbmRpdmlkdWFsUHJvcGVydHkpIHx8
IG1fc3R5bGUtPmdldFByb3BlcnR5U2hvcnRoYW5kKGluZGl2aWR1YWxQcm9wZXJ0eSkgIT0gc2hv
cnRoYW5kUHJvcGVydHkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmb3VuZFBy
b3BlcnRpZXMuYWRkKGluZGl2aWR1YWxQcm9wZXJ0eSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYXBw
ZW5kKGluZGl2aWR1YWxQcm9wZXJ0eSk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwot
fQotCi1SZWY8SW5zcGVjdG9yU3R5bGVTaGVldD4gSW5zcGVjdG9yU3R5bGVTaGVldDo6Y3JlYXRl
KEluc3BlY3RvclBhZ2VBZ2VudCogcGFnZUFnZW50LCBjb25zdCBTdHJpbmcmIGlkLCBSZWZQdHI8
Q1NTU3R5bGVTaGVldD4mJiBwYWdlU3R5bGVTaGVldCwgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NT
OjpTdHlsZVNoZWV0T3JpZ2luIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCwgTGlz
dGVuZXIqIGxpc3RlbmVyKQotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEluc3BlY3RvclN0
eWxlU2hlZXQocGFnZUFnZW50LCBpZCwgV1RGOjptb3ZlKHBhZ2VTdHlsZVNoZWV0KSwgb3JpZ2lu
LCBkb2N1bWVudFVSTCwgbGlzdGVuZXIpKTsKLX0KLQotLy8gc3RhdGljCi1TdHJpbmcgSW5zcGVj
dG9yU3R5bGVTaGVldDo6c3R5bGVTaGVldFVSTChDU1NTdHlsZVNoZWV0KiBwYWdlU3R5bGVTaGVl
dCkKLXsKLSAgICBpZiAocGFnZVN0eWxlU2hlZXQgJiYgIXBhZ2VTdHlsZVNoZWV0LT5jb250ZW50
cygpLmJhc2VVUkwoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBwYWdlU3R5bGVTaGVldC0+
Y29udGVudHMoKS5iYXNlVVJMKCkuc3RyaW5nKCk7Ci0gICAgcmV0dXJuIGVtcHR5U3RyaW5nKCk7
Ci19Ci0KLUluc3BlY3RvclN0eWxlU2hlZXQ6Okluc3BlY3RvclN0eWxlU2hlZXQoSW5zcGVjdG9y
UGFnZUFnZW50KiBwYWdlQWdlbnQsIGNvbnN0IFN0cmluZyYgaWQsIFJlZlB0cjxDU1NTdHlsZVNo
ZWV0PiYmIHBhZ2VTdHlsZVNoZWV0LCBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hl
ZXRPcmlnaW4gb3JpZ2luLCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCBMaXN0ZW5lciogbGlz
dGVuZXIpCi0gICAgOiBtX3BhZ2VBZ2VudChwYWdlQWdlbnQpCi0gICAgLCBtX2lkKGlkKQotICAg
ICwgbV9wYWdlU3R5bGVTaGVldChXVEY6Om1vdmUocGFnZVN0eWxlU2hlZXQpKQotICAgICwgbV9v
cmlnaW4ob3JpZ2luKQotICAgICwgbV9kb2N1bWVudFVSTChkb2N1bWVudFVSTCkKLSAgICAsIG1f
bGlzdGVuZXIobGlzdGVuZXIpCi17Ci0gICAgbV9wYXJzZWRTdHlsZVNoZWV0ID0gbmV3IFBhcnNl
ZFN0eWxlU2hlZXQoKTsKLX0KLQotSW5zcGVjdG9yU3R5bGVTaGVldDo6fkluc3BlY3RvclN0eWxl
U2hlZXQoKQotewotICAgIGRlbGV0ZSBtX3BhcnNlZFN0eWxlU2hlZXQ7Ci19Ci0KLVN0cmluZyBJ
bnNwZWN0b3JTdHlsZVNoZWV0OjpmaW5hbFVSTCgpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHVybCA9
IHN0eWxlU2hlZXRVUkwobV9wYWdlU3R5bGVTaGVldC5nZXQoKSk7Ci0gICAgcmV0dXJuIHVybC5p
c0VtcHR5KCkgPyBtX2RvY3VtZW50VVJMIDogdXJsOwotfQotCi12b2lkIEluc3BlY3RvclN0eWxl
U2hlZXQ6OnJlcGFyc2VTdHlsZVNoZWV0KGNvbnN0IFN0cmluZyYgdGV4dCkKLXsKLSAgICB7Ci0g
ICAgICAgIC8vIEhhdmUgYSBzZXBhcmF0ZSBzY29wZSBmb3IgY2xlYXJSdWxlcygpIChidWcgOTUz
MjQpLgotICAgICAgICBDU1NTdHlsZVNoZWV0OjpSdWxlTXV0YXRpb25TY29wZSBtdXRhdGlvblNj
b3BlKG1fcGFnZVN0eWxlU2hlZXQuZ2V0KCkpOwotICAgICAgICBtX3BhZ2VTdHlsZVNoZWV0LT5j
b250ZW50cygpLmNsZWFyUnVsZXMoKTsKLSAgICB9Ci0gICAgewotICAgICAgICBDU1NTdHlsZVNo
ZWV0OjpSdWxlTXV0YXRpb25TY29wZSBtdXRhdGlvblNjb3BlKG1fcGFnZVN0eWxlU2hlZXQuZ2V0
KCkpOwotICAgICAgICBtX3BhZ2VTdHlsZVNoZWV0LT5jb250ZW50cygpLnBhcnNlU3RyaW5nKHRl
eHQpOwotICAgICAgICBtX3BhZ2VTdHlsZVNoZWV0LT5jbGVhckNoaWxkUnVsZUNTU09NV3JhcHBl
cnMoKTsKLSAgICAgICAgZmlyZVN0eWxlU2hlZXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgLy8g
V2UganVzdCB3aXBlZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBzdHlsZXNoZWV0LiBDbGVh
ciB0aGUgbXV0YXRpb24gZmxhZy4KLSAgICBtX3BhZ2VTdHlsZVNoZWV0LT5jbGVhckhhZFJ1bGVz
TXV0YXRpb24oKTsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0OjpzZXRUZXh0KGNvbnN0
IFN0cmluZyYgdGV4dCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFjaGVja1BhZ2VT
dHlsZVNoZWV0KGVjKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghbV9wYXJzZWRT
dHlsZVNoZWV0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBtX3BhcnNlZFN0eWxlU2hl
ZXQtPnNldFRleHQodGV4dCk7Ci0gICAgbV9mbGF0UnVsZXMuY2xlYXIoKTsKLQotICAgIHJldHVy
biB0cnVlOwotfQotCi1TdHJpbmcgSW5zcGVjdG9yU3R5bGVTaGVldDo6cnVsZVNlbGVjdG9yKGNv
bnN0IEluc3BlY3RvckNTU0lkJiBpZCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgQ1NTU3R5
bGVSdWxlKiBydWxlID0gcnVsZUZvcklkKGlkKTsKLSAgICBpZiAoIXJ1bGUpIHsKLSAgICAgICAg
ZWMgPSBOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIHJldHVy
biBydWxlLT5zZWxlY3RvclRleHQoKTsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0Ojpz
ZXRSdWxlU2VsZWN0b3IoY29uc3QgSW5zcGVjdG9yQ1NTSWQmIGlkLCBjb25zdCBTdHJpbmcmIHNl
bGVjdG9yLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIWNoZWNrUGFnZVN0eWxlU2hl
ZXQoZWMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ1NTU3R5bGVSdWxlKiBydWxlID0g
cnVsZUZvcklkKGlkKTsKLSAgICBpZiAoIXJ1bGUpIHsKLSAgICAgICAgZWMgPSBOT1RfRk9VTkRf
RVJSOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIENTU1N0eWxlU2hlZXQqIHN0
eWxlU2hlZXQgPSBydWxlLT5wYXJlbnRTdHlsZVNoZWV0KCk7Ci0gICAgaWYgKCFzdHlsZVNoZWV0
IHx8ICFlbnN1cmVQYXJzZWREYXRhUmVhZHkoKSkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9F
UlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBydWxlLT5zZXRTZWxlY3Rv
clRleHQoc2VsZWN0b3IpOwotICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0
YSA9IHJ1bGVTb3VyY2VEYXRhRm9yKCZydWxlLT5zdHlsZSgpKTsKLSAgICBpZiAoIXNvdXJjZURh
dGEpIHsKLSAgICAgICAgZWMgPSBOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgU3RyaW5nIHNoZWV0VGV4dCA9IG1fcGFyc2VkU3R5bGVTaGVldC0+dGV4
dCgpOwotICAgIHNoZWV0VGV4dC5yZXBsYWNlKHNvdXJjZURhdGEtPnJ1bGVIZWFkZXJSYW5nZS5z
dGFydCwgc291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdlLmxlbmd0aCgpLCBzZWxlY3Rvcik7Ci0g
ICAgbV9wYXJzZWRTdHlsZVNoZWV0LT5zZXRUZXh0KHNoZWV0VGV4dCk7Ci0gICAgZmlyZVN0eWxl
U2hlZXRDaGFuZ2VkKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNr
U3R5bGVSdWxlU2VsZWN0b3IoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmcmIHNlbGVj
dG9yKQotewotICAgIENTU1NlbGVjdG9yTGlzdCBzZWxlY3Rvckxpc3Q7Ci0gICAgY3JlYXRlQ1NT
UGFyc2VyKGRvY3VtZW50KS0+cGFyc2VTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0b3JMaXN0KTsK
LSAgICByZXR1cm4gc2VsZWN0b3JMaXN0LmlzVmFsaWQoKTsKLX0KLQotQ1NTU3R5bGVSdWxlKiBJ
bnNwZWN0b3JTdHlsZVNoZWV0OjphZGRSdWxlKGNvbnN0IFN0cmluZyYgc2VsZWN0b3IsIEV4Y2Vw
dGlvbkNvZGUmIGVjKQotewotICAgIGlmICghY2hlY2tQYWdlU3R5bGVTaGVldChlYykpCi0gICAg
ICAgIHJldHVybiBudWxscHRyOwotICAgIGlmICghY2hlY2tTdHlsZVJ1bGVTZWxlY3RvcihtX3Bh
Z2VTdHlsZVNoZWV0LT5vd25lckRvY3VtZW50KCksIHNlbGVjdG9yKSkgewotICAgICAgICBlYyA9
IFNZTlRBWF9FUlI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIFN0cmlu
ZyB0ZXh0OwotICAgIGJvb2wgc3VjY2VzcyA9IGdldFRleHQoJnRleHQpOwotICAgIGlmICghc3Vj
Y2VzcykgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiBudWxs
cHRyOwotICAgIH0KLSAgICBTdHJpbmdCdWlsZGVyIHN0eWxlU2hlZXRUZXh0OwotICAgIHN0eWxl
U2hlZXRUZXh0LmFwcGVuZCh0ZXh0KTsKLQotICAgIG1fcGFnZVN0eWxlU2hlZXQtPmFkZFJ1bGUo
c2VsZWN0b3IsICIiLCBlYyk7Ci0gICAgaWYgKGVjKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsK
LSAgICBBU1NFUlQobV9wYWdlU3R5bGVTaGVldC0+bGVuZ3RoKCkpOwotICAgIHVuc2lnbmVkIGxh
c3RSdWxlSW5kZXggPSBtX3BhZ2VTdHlsZVNoZWV0LT5sZW5ndGgoKSAtIDE7Ci0gICAgQ1NTUnVs
ZSogcnVsZSA9IG1fcGFnZVN0eWxlU2hlZXQtPml0ZW0obGFzdFJ1bGVJbmRleCk7Ci0gICAgQVNT
RVJUKHJ1bGUpOwotCi0gICAgQ1NTU3R5bGVSdWxlKiBzdHlsZVJ1bGUgPSBJbnNwZWN0b3JDU1NB
Z2VudDo6YXNDU1NTdHlsZVJ1bGUoKnJ1bGUpOwotICAgIGlmICghc3R5bGVSdWxlKSB7Ci0gICAg
ICAgIC8vIFdoYXQgd2UganVzdCBhZGRlZCBoYXMgdG8gYmUgYSBDU1NTdHlsZVJ1bGUgLSB3ZSBj
YW5ub3QgaGFuZGxlIG90aGVyIHR5cGVzIG9mIHJ1bGVzIHlldC4KLSAgICAgICAgLy8gSWYgaXQg
aXMgbm90IGEgc3R5bGUgcnVsZSwgcHJldGVuZCB3ZSBuZXZlciB0b3VjaGVkIHRoZSBzdHlsZXNo
ZWV0LgotICAgICAgICBtX3BhZ2VTdHlsZVNoZWV0LT5kZWxldGVSdWxlKGxhc3RSdWxlSW5kZXgs
IEFTU0VSVF9OT19FWENFUFRJT04pOwotICAgICAgICBlYyA9IFNZTlRBWF9FUlI7Ci0gICAgICAg
IHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGlmICghc3R5bGVTaGVldFRleHQuaXNFbXB0
eSgpKQotICAgICAgICBzdHlsZVNoZWV0VGV4dC5hcHBlbmQoJ1xuJyk7Ci0KLSAgICBzdHlsZVNo
ZWV0VGV4dC5hcHBlbmQoc2VsZWN0b3IpOwotICAgIHN0eWxlU2hlZXRUZXh0LmFwcGVuZExpdGVy
YWwoIiB7fSIpOwotICAgIC8vIFVzaW5nIHNldFRleHQoKSBhcyB0aGlzIG9wZXJhdGlvbiBjaGFu
Z2VzIHRoZSBzdHlsZSBzaGVldCBydWxlIHNldC4KLSAgICBzZXRUZXh0KHN0eWxlU2hlZXRUZXh0
LnRvU3RyaW5nKCksIEFTU0VSVF9OT19FWENFUFRJT04pOwotCi0gICAgZmlyZVN0eWxlU2hlZXRD
aGFuZ2VkKCk7Ci0KLSAgICByZXR1cm4gc3R5bGVSdWxlOwotfQotCi1ib29sIEluc3BlY3RvclN0
eWxlU2hlZXQ6OmRlbGV0ZVJ1bGUoY29uc3QgSW5zcGVjdG9yQ1NTSWQmIGlkLCBFeGNlcHRpb25D
b2RlJiBlYykKLXsKLSAgICBpZiAoIWNoZWNrUGFnZVN0eWxlU2hlZXQoZWMpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgUmVmUHRyPENTU1N0eWxlUnVsZT4gcnVsZSA9IHJ1bGVGb3JJZChp
ZCk7Ci0gICAgaWYgKCFydWxlKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBDU1NTdHlsZVNoZWV0KiBzdHlsZVNoZWV0ID0g
cnVsZS0+cGFyZW50U3R5bGVTaGVldCgpOwotICAgIGlmICghc3R5bGVTaGVldCB8fCAhZW5zdXJl
UGFyc2VkRGF0YVJlYWR5KCkpIHsKLSAgICAgICAgZWMgPSBOT1RfRk9VTkRfRVJSOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBz
b3VyY2VEYXRhID0gcnVsZVNvdXJjZURhdGFGb3IoJnJ1bGUtPnN0eWxlKCkpOwotICAgIGlmICgh
c291cmNlRGF0YSkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHlsZVNoZWV0LT5kZWxldGVSdWxlKGlkLm9yZGluYWwo
KSwgZWMpOwotICAgIC8vIHxydWxlfCBNQVkgTk9UIGJlIGFkZHJlc3NlZCBhZnRlciB0aGlzIGxp
bmUhCi0KLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBz
aGVldFRleHQgPSBtX3BhcnNlZFN0eWxlU2hlZXQtPnRleHQoKTsKLSAgICBzaGVldFRleHQucmVt
b3ZlKHNvdXJjZURhdGEtPnJ1bGVIZWFkZXJSYW5nZS5zdGFydCwgc291cmNlRGF0YS0+cnVsZUJv
ZHlSYW5nZS5lbmQgLSBzb3VyY2VEYXRhLT5ydWxlSGVhZGVyUmFuZ2Uuc3RhcnQgKyAxKTsKLSAg
ICBzZXRUZXh0KHNoZWV0VGV4dCwgQVNTRVJUX05PX0VYQ0VQVElPTik7Ci0gICAgZmlyZVN0eWxl
U2hlZXRDaGFuZ2VkKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUNTU1N0eWxlUnVsZSogSW5z
cGVjdG9yU3R5bGVTaGVldDo6cnVsZUZvcklkKGNvbnN0IEluc3BlY3RvckNTU0lkJiBpZCkgY29u
c3QKLXsKLSAgICBpZiAoIW1fcGFnZVN0eWxlU2hlZXQpCi0gICAgICAgIHJldHVybiBudWxscHRy
OwotCi0gICAgQVNTRVJUKCFpZC5pc0VtcHR5KCkpOwotICAgIGVuc3VyZUZsYXRSdWxlcygpOwot
ICAgIHJldHVybiBpZC5vcmRpbmFsKCkgPj0gbV9mbGF0UnVsZXMuc2l6ZSgpID8gbnVsbHB0ciA6
IG1fZmxhdFJ1bGVzLmF0KGlkLm9yZGluYWwoKSkuZ2V0KCk7Ci19Ci0KLVJlZlB0cjxJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRCb2R5PiBJbnNwZWN0b3JTdHlsZVNoZWV0
OjpidWlsZE9iamVjdEZvclN0eWxlU2hlZXQoKQotewotICAgIENTU1N0eWxlU2hlZXQqIHN0eWxl
U2hlZXQgPSBwYWdlU3R5bGVTaGVldCgpOwotICAgIGlmICghc3R5bGVTaGVldCkKLSAgICAgICAg
cmV0dXJuIG51bGxwdHI7Ci0KLSAgICBSZWZQdHI8Q1NTUnVsZUxpc3Q+IGNzc1J1bGVMaXN0ID0g
YXNDU1NSdWxlTGlzdChzdHlsZVNoZWV0KTsKLQotICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVjdG9y
OjpQcm90b2NvbDo6Q1NTOjpDU1NTdHlsZVNoZWV0Qm9keTo6Y3JlYXRlKCkKLSAgICAgICAgLnNl
dFN0eWxlU2hlZXRJZChpZCgpKQotICAgICAgICAuc2V0UnVsZXMoYnVpbGRBcnJheUZvclJ1bGVM
aXN0KGNzc1J1bGVMaXN0LmdldCgpKSkKLSAgICAgICAgLnJlbGVhc2UoKTsKLQotICAgIFN0cmlu
ZyBzdHlsZVNoZWV0VGV4dDsKLSAgICBib29sIHN1Y2Nlc3MgPSBnZXRUZXh0KCZzdHlsZVNoZWV0
VGV4dCk7Ci0gICAgaWYgKHN1Y2Nlc3MpCi0gICAgICAgIHJlc3VsdC0+c2V0VGV4dChzdHlsZVNo
ZWV0VGV4dCk7Ci0KLSAgICByZXR1cm4gV1RGOjptb3ZlKHJlc3VsdCk7Ci19Ci0KLVJlZlB0cjxJ
bnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRIZWFkZXI+IEluc3BlY3RvclN0
eWxlU2hlZXQ6OmJ1aWxkT2JqZWN0Rm9yU3R5bGVTaGVldEluZm8oKQotewotICAgIENTU1N0eWxl
U2hlZXQqIHN0eWxlU2hlZXQgPSBwYWdlU3R5bGVTaGVldCgpOwotICAgIGlmICghc3R5bGVTaGVl
dCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBz
dHlsZVNoZWV0LT5vd25lckRvY3VtZW50KCk7Ci0gICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQg
PyBkb2N1bWVudC0+ZnJhbWUoKSA6IG51bGxwdHI7Ci0gICAgcmV0dXJuIEluc3BlY3Rvcjo6UHJv
dG9jb2w6OkNTUzo6Q1NTU3R5bGVTaGVldEhlYWRlcjo6Y3JlYXRlKCkKLSAgICAgICAgLnNldFN0
eWxlU2hlZXRJZChpZCgpKQotICAgICAgICAuc2V0T3JpZ2luKG1fb3JpZ2luKQotICAgICAgICAu
c2V0RGlzYWJsZWQoc3R5bGVTaGVldC0+ZGlzYWJsZWQoKSkKLSAgICAgICAgLnNldFNvdXJjZVVS
TChmaW5hbFVSTCgpKQotICAgICAgICAuc2V0VGl0bGUoc3R5bGVTaGVldC0+dGl0bGUoKSkKLSAg
ICAgICAgLnNldEZyYW1lSWQobV9wYWdlQWdlbnQtPmZyYW1lSWQoZnJhbWUpKQotICAgICAgICAu
cmVsZWFzZSgpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNEeW5hbWljU3BlY2lmaWNpdHkoY29uc3Qg
Q1NTU2VsZWN0b3ImIHNpbXBsZVNlbGVjdG9yKQotewotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRo
YXQgdGhlc2UgY2FuIGhhdmUgYSBzdGF0aWMgc3BlY2lmaWNpdHkgaWYgZWFjaCBzZWxlY3RvciBp
biB0aGUgbGlzdCBoYXMKLSAgICAvLyBlcXVhbCBzcGVjaWZpY2l0eSwgYnV0IGxldHMgYWx3YXlz
IHJlcG9ydCB0aGF0IHRoZXkgY2FuIGJlIGR5bmFtaWMuCi0gICAgZm9yIChjb25zdCBDU1NTZWxl
Y3Rvciogc2VsZWN0b3IgPSAmc2ltcGxlU2VsZWN0b3I7IHNlbGVjdG9yOyBzZWxlY3RvciA9IHNl
bGVjdG9yLT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yLT5tYXRjaCgpID09
IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzcykgewotICAgICAgICAgICAgQ1NTU2VsZWN0b3I6OlBz
ZXVkb0NsYXNzVHlwZSBwc2V1ZG9DbGFzc1R5cGUgPSBzZWxlY3Rvci0+cHNldWRvQ2xhc3NUeXBl
KCk7Ci0gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3NUeXBlID09IENTU1NlbGVjdG9yOjpQc2V1
ZG9DbGFzc01hdGNoZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICBpZiAocHNldWRvQ2xhc3NUeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzc050aENoaWxk
IHx8IHBzZXVkb0NsYXNzVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3NOdGhMYXN0Q2hp
bGQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3ItPnNlbGVjdG9yTGlzdCgpKQotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLXN0YXRpYyBSZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcj4g
YnVpbGRPYmplY3RGb3JTZWxlY3RvckhlbHBlcihjb25zdCBTdHJpbmcmIHNlbGVjdG9yVGV4dCwg
Y29uc3QgQ1NTU2VsZWN0b3ImIHNlbGVjdG9yLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIGF1
dG8gaW5zcGVjdG9yU2VsZWN0b3IgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVj
dG9yOjpjcmVhdGUoKQotICAgICAgICAuc2V0VGV4dChzZWxlY3RvclRleHQpCi0gICAgICAgIC5y
ZWxlYXNlKCk7Ci0KLSAgICBpZiAoZWxlbWVudCkgewotICAgICAgICBib29sIGR5bmFtaWMgPSBo
YXNEeW5hbWljU3BlY2lmaWNpdHkoc2VsZWN0b3IpOwotICAgICAgICBpZiAoZHluYW1pYykKLSAg
ICAgICAgICAgIGluc3BlY3RvclNlbGVjdG9yLT5zZXREeW5hbWljKHRydWUpOwotCi0gICAgICAg
IFNlbGVjdG9yQ2hlY2tlcjo6Q2hlY2tpbmdDb250ZXh0IGNvbnRleHQoU2VsZWN0b3JDaGVja2Vy
OjpNb2RlOjpDb2xsZWN0aW5nUnVsZXMpOwotICAgICAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0
b3JDaGVja2VyKGVsZW1lbnQtPmRvY3VtZW50KCkpOwotCi0gICAgICAgIHVuc2lnbmVkIHNwZWNp
ZmljaXR5OwotICAgICAgICBib29sIG9rYXkgPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goJnNlbGVj
dG9yLCBlbGVtZW50LCBjb250ZXh0LCBzcGVjaWZpY2l0eSk7Ci0gICAgICAgIGlmICghb2theSkK
LSAgICAgICAgICAgIHNwZWNpZmljaXR5ID0gc2VsZWN0b3Iuc3RhdGljU3BlY2lmaWNpdHkob2th
eSk7Ci0KLSAgICAgICAgaWYgKG9rYXkpIHsKLSAgICAgICAgICAgIGF1dG8gdHVwbGUgPSBJbnNw
ZWN0b3I6OlByb3RvY29sOjpBcnJheTxpbnQ+OjpjcmVhdGUoKTsKLSAgICAgICAgICAgIHR1cGxl
LT5hZGRJdGVtKHN0YXRpY19jYXN0PGludD4oKHNwZWNpZmljaXR5ICYgQ1NTU2VsZWN0b3I6Omlk
TWFzaykgPj4gMTYpKTsKLSAgICAgICAgICAgIHR1cGxlLT5hZGRJdGVtKHN0YXRpY19jYXN0PGlu
dD4oKHNwZWNpZmljaXR5ICYgQ1NTU2VsZWN0b3I6OmNsYXNzTWFzaykgPj4gOCkpOwotICAgICAg
ICAgICAgdHVwbGUtPmFkZEl0ZW0oc3RhdGljX2Nhc3Q8aW50PihzcGVjaWZpY2l0eSAmIENTU1Nl
bGVjdG9yOjplbGVtZW50TWFzaykpOwotICAgICAgICAgICAgaW5zcGVjdG9yU2VsZWN0b3ItPnNl
dFNwZWNpZmljaXR5KFdURjo6bW92ZSh0dXBsZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
cmV0dXJuIFdURjo6bW92ZShpbnNwZWN0b3JTZWxlY3Rvcik7Ci19Ci0KLXN0YXRpYyBSZWY8SW5z
cGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxl
Y3Rvcj4+IHNlbGVjdG9yc0Zyb21Tb3VyY2UoY29uc3QgQ1NTUnVsZVNvdXJjZURhdGEqIHNvdXJj
ZURhdGEsIGNvbnN0IFN0cmluZyYgc2hlZXRUZXh0LCBjb25zdCBDU1NTZWxlY3Rvckxpc3QmIHNl
bGVjdG9yTGlzdCwgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBERVBSRUNBVEVEX0RFRklORV9T
VEFUSUNfTE9DQUwoSlNDOjpZYXJyOjpSZWd1bGFyRXhwcmVzc2lvbiwgY29tbWVudCwgKCIvXFwq
W15dKj9cXCovIiwgVGV4dENhc2VTZW5zaXRpdmUsIEpTQzo6WWFycjo6TXVsdGlsaW5lRW5hYmxl
ZCkpOwotCi0gICAgYXV0byByZXN1bHQgPSBJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9yPjo6Y3JlYXRlKCk7Ci0gICAgY29uc3Qg
U2VsZWN0b3JSYW5nZUxpc3QmIHJhbmdlcyA9IHNvdXJjZURhdGEtPnNlbGVjdG9yUmFuZ2VzOwot
ICAgIGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IHNlbGVjdG9yTGlzdC5maXJzdCgpOwot
ICAgIGZvciAoc2l6ZV90IGkgPSAwLCBzaXplID0gcmFuZ2VzLnNpemUoKTsgaSA8IHNpemU7ICsr
aSkgewotICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgc2VsZWN0b3IsIHRoYXQgbWVhbnMg
dGhlIFNvdXJjZURhdGEgZm9yIHRoaXMgQ1NTU3R5bGVTaGVldAotICAgICAgICAvLyBubyBsb25n
ZXIgbWF0Y2hlcyB1cCB3aXRoIHRoZSBhY3R1YWwgcnVsZXMgaW4gdGhlIENTU1N0eWxlU2hlZXQu
Ci0gICAgICAgIEFTU0VSVChzZWxlY3Rvcik7Ci0gICAgICAgIGlmICghc2VsZWN0b3IpCi0gICAg
ICAgICAgICBicmVhazsKLQotICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSYgcmFuZ2UgPSByYW5n
ZXMuYXQoaSk7Ci0gICAgICAgIFN0cmluZyBzZWxlY3RvclRleHQgPSBzaGVldFRleHQuc3Vic3Ry
aW5nKHJhbmdlLnN0YXJ0LCByYW5nZS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgLy8gV2UgZG9uJ3Qg
d2FudCB0byBzZWUgYW55IGNvbW1lbnRzIGluIHRoZSBzZWxlY3RvciBjb21wb25lbnRzLCBvbmx5
IHRoZSBtZWFuaW5nZnVsIHBhcnRzLgotICAgICAgICByZXBsYWNlKHNlbGVjdG9yVGV4dCwgY29t
bWVudCwgU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQtPmFkZEl0ZW0oYnVpbGRPYmplY3RGb3JT
ZWxlY3RvckhlbHBlcihzZWxlY3RvclRleHQuc3RyaXBXaGl0ZVNwYWNlKCksICpzZWxlY3Rvciwg
ZWxlbWVudCkpOwotCi0gICAgICAgIHNlbGVjdG9yID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHNl
bGVjdG9yKTsKLSAgICB9Ci0gICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwotfQotCi1SZWY8
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NTZWxlY3Rvcj4gSW5zcGVjdG9yU3R5bGVTaGVl
dDo6YnVpbGRPYmplY3RGb3JTZWxlY3Rvcihjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIEVs
ZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgcmV0dXJuIGJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JIZWxw
ZXIoc2VsZWN0b3ItPnNlbGVjdG9yVGV4dCgpLCAqc2VsZWN0b3IsIGVsZW1lbnQpOwotfQotCi1S
ZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTZWxlY3Rvckxpc3Q+IEluc3BlY3RvclN0eWxl
U2hlZXQ6OmJ1aWxkT2JqZWN0Rm9yU2VsZWN0b3JMaXN0KENTU1N0eWxlUnVsZSogcnVsZSwgRWxl
bWVudCogZWxlbWVudCkKLXsKLSAgICBSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHNvdXJjZURh
dGE7Ci0gICAgaWYgKGVuc3VyZVBhcnNlZERhdGFSZWFkeSgpKQotICAgICAgICBzb3VyY2VEYXRh
ID0gcnVsZVNvdXJjZURhdGFGb3IoJnJ1bGUtPnN0eWxlKCkpOwotICAgIFJlZlB0cjxJbnNwZWN0
b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9y
Pj4gc2VsZWN0b3JzOwotCi0gICAgLy8gVGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHJlbHkg
b24gdGhlIHNvdXJjZSBkYXRhIHRvIGF2b2lkIGNhdGNoaW5nIHRoZSB0cmFpbGluZyBjb21tZW50
cyAoYmVmb3JlIHRoZSBkZWNsYXJhdGlvbiBzdGFydGluZyAneycpLgotICAgIFN0cmluZyBzZWxl
Y3RvclRleHQgPSBydWxlLT5zZWxlY3RvclRleHQoKTsKLQotICAgIGlmIChzb3VyY2VEYXRhKQot
ICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnNGcm9tU291cmNlKHNvdXJjZURhdGEuZ2V0KCks
IG1fcGFyc2VkU3R5bGVTaGVldC0+dGV4dCgpLCBydWxlLT5zdHlsZVJ1bGUoKS5zZWxlY3Rvckxp
c3QoKSwgZWxlbWVudCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNlbGVjdG9ycyA9IEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU2VsZWN0b3I+
OjpjcmVhdGUoKTsKLSAgICAgICAgY29uc3QgQ1NTU2VsZWN0b3JMaXN0JiBzZWxlY3Rvckxpc3Qg
PSBydWxlLT5zdHlsZVJ1bGUoKS5zZWxlY3Rvckxpc3QoKTsKLSAgICAgICAgZm9yIChjb25zdCBD
U1NTZWxlY3Rvciogc2VsZWN0b3IgPSBzZWxlY3Rvckxpc3QuZmlyc3QoKTsgc2VsZWN0b3I7IHNl
bGVjdG9yID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHNlbGVjdG9yKSkKLSAgICAgICAgICAgIHNl
bGVjdG9ycy0+YWRkSXRlbShidWlsZE9iamVjdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBlbGVtZW50
KSk7Ci0gICAgfQotICAgIGF1dG8gcmVzdWx0ID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpT
ZWxlY3Rvckxpc3Q6OmNyZWF0ZSgpCi0gICAgICAgIC5zZXRTZWxlY3RvcnMoc2VsZWN0b3JzLnJl
bGVhc2UoKSkKLSAgICAgICAgLnNldFRleHQoc2VsZWN0b3JUZXh0KQotICAgICAgICAucmVsZWFz
ZSgpOwotICAgIGlmIChzb3VyY2VEYXRhKQotICAgICAgICByZXN1bHQtPnNldFJhbmdlKGJ1aWxk
U291cmNlUmFuZ2VPYmplY3Qoc291cmNlRGF0YS0+cnVsZUhlYWRlclJhbmdlLCBsaW5lRW5kaW5n
cygpLmdldCgpKSk7Ci0gICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwotfQotCi1SZWZQdHI8
SW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlPiBJbnNwZWN0b3JTdHlsZVNoZWV0Ojpi
dWlsZE9iamVjdEZvclJ1bGUoQ1NTU3R5bGVSdWxlKiBydWxlLCBFbGVtZW50KiBlbGVtZW50KQot
ewotICAgIENTU1N0eWxlU2hlZXQqIHN0eWxlU2hlZXQgPSBwYWdlU3R5bGVTaGVldCgpOwotICAg
IGlmICghc3R5bGVTaGVldCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIHJl
c3VsdCA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZTo6Y3JlYXRlKCkKLSAgICAg
ICAgLnNldFNlbGVjdG9yTGlzdChidWlsZE9iamVjdEZvclNlbGVjdG9yTGlzdChydWxlLCBlbGVt
ZW50KSkKLSAgICAgICAgLnNldFNvdXJjZUxpbmUocnVsZS0+c3R5bGVSdWxlKCkuc291cmNlTGlu
ZSgpKQotICAgICAgICAuc2V0T3JpZ2luKG1fb3JpZ2luKQotICAgICAgICAuc2V0U3R5bGUoYnVp
bGRPYmplY3RGb3JTdHlsZSgmcnVsZS0+c3R5bGUoKSkpCi0gICAgICAgIC5yZWxlYXNlKCk7Ci0K
LSAgICAvLyAic291cmNlVVJMIiBpcyBwcmVzZW50IG9ubHkgZm9yIHJlZ3VsYXIgcnVsZXMsIG90
aGVyd2lzZSAib3JpZ2luIiBzaG91bGQgYmUgdXNlZCBpbiB0aGUgZnJvbnRlbmQuCi0gICAgaWYg
KG1fb3JpZ2luID09IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldE9yaWdpbjo6
UmVndWxhcikKLSAgICAgICAgcmVzdWx0LT5zZXRTb3VyY2VVUkwoZmluYWxVUkwoKSk7Ci0KLSAg
ICBpZiAoY2FuQmluZCgpKSB7Ci0gICAgICAgIEluc3BlY3RvckNTU0lkIGlkKHJ1bGVJZChydWxl
KSk7Ci0gICAgICAgIGlmICghaWQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmVzdWx0LT5zZXRS
dWxlSWQoaWQuYXNQcm90b2NvbFZhbHVlPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVs
ZUlkPigpKTsKLSAgICB9Ci0KLSAgICBhdXRvIG1lZGlhQXJyYXkgPSBBcnJheTxJbnNwZWN0b3I6
OlByb3RvY29sOjpDU1M6OkNTU01lZGlhPjo6Y3JlYXRlKCk7Ci0KLSAgICBmaWxsTWVkaWFMaXN0
Q2hhaW4ocnVsZSwgbWVkaWFBcnJheS5nZXQoKSk7Ci0gICAgaWYgKG1lZGlhQXJyYXktPmxlbmd0
aCgpKQotICAgICAgICByZXN1bHQtPnNldE1lZGlhKFdURjo6bW92ZShtZWRpYUFycmF5KSk7Ci0K
LSAgICByZXR1cm4gV1RGOjptb3ZlKHJlc3VsdCk7Ci19Ci0KLVJlZlB0cjxJbnNwZWN0b3I6OlBy
b3RvY29sOjpDU1M6OkNTU1N0eWxlPiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpidWlsZE9iamVjdEZv
clN0eWxlKENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKQotewotICAgIFJlZlB0cjxDU1NSdWxl
U291cmNlRGF0YT4gc291cmNlRGF0YTsKLSAgICBpZiAoZW5zdXJlUGFyc2VkRGF0YVJlYWR5KCkp
Ci0gICAgICAgIHNvdXJjZURhdGEgPSBydWxlU291cmNlRGF0YUZvcihzdHlsZSk7Ci0KLSAgICBJ
bnNwZWN0b3JDU1NJZCBpZCA9IHJ1bGVPclN0eWxlSWQoc3R5bGUpOwotICAgIGlmIChpZC5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5
bGU6OmNyZWF0ZSgpCi0gICAgICAgICAgICAuc2V0Q3NzUHJvcGVydGllcyhBcnJheTxJbnNwZWN0
b3I6OlByb3RvY29sOjpDU1M6OkNTU1Byb3BlcnR5Pjo6Y3JlYXRlKCkpCi0gICAgICAgICAgICAu
c2V0U2hvcnRoYW5kRW50cmllcyhBcnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNob3J0
aGFuZEVudHJ5Pjo6Y3JlYXRlKCkpCi0gICAgICAgICAgICAucmVsZWFzZSgpOwotICAgIH0KLSAg
ICBSZWZQdHI8SW5zcGVjdG9yU3R5bGU+IGluc3BlY3RvclN0eWxlID0gaW5zcGVjdG9yU3R5bGVG
b3JJZChpZCk7Ci0gICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+
IHJlc3VsdCA9IGluc3BlY3RvclN0eWxlLT5idWlsZE9iamVjdEZvclN0eWxlKCk7Ci0KLSAgICAv
LyBTdHlsZSB0ZXh0IGNhbm5vdCBiZSByZXRyaWV2ZWQgd2l0aG91dCBzdHlsZXNoZWV0LCBzbyBz
ZXQgY3NzVGV4dCBoZXJlLgotICAgIGlmIChzb3VyY2VEYXRhKSB7Ci0gICAgICAgIFN0cmluZyBz
aGVldFRleHQ7Ci0gICAgICAgIGJvb2wgc3VjY2VzcyA9IGdldFRleHQoJnNoZWV0VGV4dCk7Ci0g
ICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSYgYm9k
eVJhbmdlID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZTsKLSAgICAgICAgICAgIHJlc3VsdC0+
c2V0Q3NzVGV4dChzaGVldFRleHQuc3Vic3RyaW5nKGJvZHlSYW5nZS5zdGFydCwgYm9keVJhbmdl
LmVuZCAtIGJvZHlSYW5nZS5zdGFydCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IFdURjo6bW92ZShyZXN1bHQpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6OnNldFN0
eWxlVGV4dChjb25zdCBJbnNwZWN0b3JDU1NJZCYgaWQsIGNvbnN0IFN0cmluZyYgdGV4dCwgU3Ry
aW5nKiBvbGRUZXh0LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQdHI8SW5zcGVjdG9y
U3R5bGU+IGluc3BlY3RvclN0eWxlID0gaW5zcGVjdG9yU3R5bGVGb3JJZChpZCk7Ci0gICAgaWYg
KCFpbnNwZWN0b3JTdHlsZSkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAob2xkVGV4dCAmJiAhaW5zcGVjdG9yU3R5
bGUtPmdldFRleHQob2xkVGV4dCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wg
c3VjY2VzcyA9IGluc3BlY3RvclN0eWxlLT5zZXRUZXh0KHRleHQsIGVjKTsKLSAgICBpZiAoc3Vj
Y2VzcykKLSAgICAgICAgZmlyZVN0eWxlU2hlZXRDaGFuZ2VkKCk7Ci0gICAgcmV0dXJuIHN1Y2Nl
c3M7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldDo6Z2V0VGV4dChTdHJpbmcqIHJlc3Vs
dCkgY29uc3QKLXsKLSAgICBpZiAoIWVuc3VyZVRleHQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICpyZXN1bHQgPSBtX3BhcnNlZFN0eWxlU2hlZXQtPnRleHQoKTsKLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotQ1NTU3R5bGVEZWNsYXJhdGlvbiogSW5zcGVjdG9yU3R5bGVTaGVldDo6c3R5
bGVGb3JJZChjb25zdCBJbnNwZWN0b3JDU1NJZCYgaWQpIGNvbnN0Ci17Ci0gICAgQ1NTU3R5bGVS
dWxlKiBydWxlID0gcnVsZUZvcklkKGlkKTsKLSAgICBpZiAoIXJ1bGUpCi0gICAgICAgIHJldHVy
biBudWxscHRyOwotCi0gICAgcmV0dXJuICZydWxlLT5zdHlsZSgpOwotfQotCi12b2lkIEluc3Bl
Y3RvclN0eWxlU2hlZXQ6OmZpcmVTdHlsZVNoZWV0Q2hhbmdlZCgpCi17Ci0gICAgaWYgKG1fbGlz
dGVuZXIpCi0gICAgICAgIG1fbGlzdGVuZXItPnN0eWxlU2hlZXRDaGFuZ2VkKHRoaXMpOwotfQot
Ci1SZWZQdHI8SW5zcGVjdG9yU3R5bGU+IEluc3BlY3RvclN0eWxlU2hlZXQ6Omluc3BlY3RvclN0
eWxlRm9ySWQoY29uc3QgSW5zcGVjdG9yQ1NTSWQmIGlkKQotewotICAgIENTU1N0eWxlRGVjbGFy
YXRpb24qIHN0eWxlID0gc3R5bGVGb3JJZChpZCk7Ci0gICAgaWYgKCFzdHlsZSkKLSAgICAgICAg
cmV0dXJuIG51bGxwdHI7Ci0KLSAgICByZXR1cm4gSW5zcGVjdG9yU3R5bGU6OmNyZWF0ZShpZCwg
c3R5bGUsIHRoaXMpOwotfQotCi1JbnNwZWN0b3JDU1NJZCBJbnNwZWN0b3JTdHlsZVNoZWV0Ojpy
dWxlT3JTdHlsZUlkKENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKSBjb25zdAotewotICAgIHVu
c2lnbmVkIGluZGV4ID0gcnVsZUluZGV4QnlTdHlsZShzdHlsZSk7Ci0gICAgaWYgKGluZGV4ICE9
IFVJTlRfTUFYKQotICAgICAgICByZXR1cm4gSW5zcGVjdG9yQ1NTSWQoaWQoKSwgaW5kZXgpOwot
ICAgIHJldHVybiBJbnNwZWN0b3JDU1NJZCgpOwotfQotCi1Eb2N1bWVudCogSW5zcGVjdG9yU3R5
bGVTaGVldDo6b3duZXJEb2N1bWVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGFnZVN0eWxl
U2hlZXQtPm93bmVyRG9jdW1lbnQoKTsKLX0KLQotUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBJ
bnNwZWN0b3JTdHlsZVNoZWV0OjpydWxlU291cmNlRGF0YUZvcihDU1NTdHlsZURlY2xhcmF0aW9u
KiBzdHlsZSkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wYXJzZWRTdHlsZVNoZWV0LT5ydWxlU291
cmNlRGF0YUF0KHJ1bGVJbmRleEJ5U3R5bGUoc3R5bGUpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRy
PFZlY3RvcjxzaXplX3Q+PiBJbnNwZWN0b3JTdHlsZVNoZWV0OjpsaW5lRW5kaW5ncygpIGNvbnN0
Ci17Ci0gICAgaWYgKCFtX3BhcnNlZFN0eWxlU2hlZXQtPmhhc1RleHQoKSkKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuIENvbnRlbnRTZWFyY2hVdGlsaXRpZXM6OmxpbmVFbmRp
bmdzKG1fcGFyc2VkU3R5bGVTaGVldC0+dGV4dCgpKTsKLX0KLQotdW5zaWduZWQgSW5zcGVjdG9y
U3R5bGVTaGVldDo6cnVsZUluZGV4QnlTdHlsZShDU1NTdHlsZURlY2xhcmF0aW9uKiBwYWdlU3R5
bGUpIGNvbnN0Ci17Ci0gICAgZW5zdXJlRmxhdFJ1bGVzKCk7Ci0gICAgdW5zaWduZWQgaW5kZXgg
PSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIHNpemUgPSBtX2ZsYXRSdWxlcy5zaXplKCk7
IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKCZtX2ZsYXRSdWxlcy5hdChpKS0+c3R5bGUo
KSA9PSBwYWdlU3R5bGUpCi0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICAgICAgKytp
bmRleDsKLSAgICB9Ci0gICAgcmV0dXJuIFVJTlRfTUFYOwotfQotCi1ib29sIEluc3BlY3RvclN0
eWxlU2hlZXQ6OmNoZWNrUGFnZVN0eWxlU2hlZXQoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0Ci17
Ci0gICAgaWYgKCFtX3BhZ2VTdHlsZVNoZWV0KSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRF
RF9FUlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldDo6c3R5bGVTaGVldE11dGF0ZWQoKSBjb25zdAot
ewotICAgIHJldHVybiBtX3BhZ2VTdHlsZVNoZWV0ICYmIG1fcGFnZVN0eWxlU2hlZXQtPmhhZFJ1
bGVzTXV0YXRpb24oKTsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0OjplbnN1cmVQYXJz
ZWREYXRhUmVhZHkoKQotewotICAgIHJldHVybiAhc3R5bGVTaGVldE11dGF0ZWQoKSAmJiBlbnN1
cmVUZXh0KCkgJiYgZW5zdXJlU291cmNlRGF0YSgpOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxl
U2hlZXQ6OmVuc3VyZVRleHQoKSBjb25zdAotewotICAgIGlmICghbV9wYXJzZWRTdHlsZVNoZWV0
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKG1fcGFyc2VkU3R5bGVTaGVldC0+aGFz
VGV4dCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZyB0ZXh0OwotICAgIGJv
b2wgc3VjY2VzcyA9IG9yaWdpbmFsU3R5bGVTaGVldFRleHQoJnRleHQpOwotICAgIGlmIChzdWNj
ZXNzKQotICAgICAgICBtX3BhcnNlZFN0eWxlU2hlZXQtPnNldFRleHQodGV4dCk7Ci0gICAgLy8g
Tm8gbmVlZCB0byBjbGVhciBtX2ZsYXRSdWxlcyBoZXJlIC0gaXQncyBlbXB0eS4KLQotICAgIHJl
dHVybiBzdWNjZXNzOwotfQotCi1ib29sIEluc3BlY3RvclN0eWxlU2hlZXQ6OmVuc3VyZVNvdXJj
ZURhdGEoKQotewotICAgIGlmIChtX3BhcnNlZFN0eWxlU2hlZXQtPmhhc1NvdXJjZURhdGEoKSkK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAoIW1fcGFyc2VkU3R5bGVTaGVldC0+aGFz
VGV4dCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBSZWZQdHI8U3R5bGVTaGVldENv
bnRlbnRzPiBuZXdTdHlsZVNoZWV0ID0gU3R5bGVTaGVldENvbnRlbnRzOjpjcmVhdGUoKTsKLSAg
ICBhdXRvIHJ1bGVTb3VyY2VEYXRhUmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxSdWxlU291cmNl
RGF0YUxpc3Q+KCk7Ci0gICAgY3JlYXRlQ1NTUGFyc2VyKG1fcGFnZVN0eWxlU2hlZXQtPm93bmVy
RG9jdW1lbnQoKSktPnBhcnNlU2hlZXQobmV3U3R5bGVTaGVldC5nZXQoKSwgbV9wYXJzZWRTdHls
ZVNoZWV0LT50ZXh0KCksIDAsIHJ1bGVTb3VyY2VEYXRhUmVzdWx0LmdldCgpKTsKLSAgICBtX3Bh
cnNlZFN0eWxlU2hlZXQtPnNldFNvdXJjZURhdGEoV1RGOjptb3ZlKHJ1bGVTb3VyY2VEYXRhUmVz
dWx0KSk7Ci0gICAgcmV0dXJuIG1fcGFyc2VkU3R5bGVTaGVldC0+aGFzU291cmNlRGF0YSgpOwot
fQotCi12b2lkIEluc3BlY3RvclN0eWxlU2hlZXQ6OmVuc3VyZUZsYXRSdWxlcygpIGNvbnN0Ci17
Ci0gICAgLy8gV2UgYXJlIGZpbmUgd2l0aCByZWRvaW5nIHRoaXMgZm9yIGVtcHR5IHN0eWxlc2hl
ZXRzIGFzIHRoaXMgd2lsbCBydW4gZmFzdC4KLSAgICBpZiAobV9mbGF0UnVsZXMuaXNFbXB0eSgp
KQotICAgICAgICBjb2xsZWN0RmxhdFJ1bGVzKGFzQ1NTUnVsZUxpc3QocGFnZVN0eWxlU2hlZXQo
KSksICZtX2ZsYXRSdWxlcyk7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldDo6c2V0U3R5
bGVUZXh0KENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBjb25zdCBTdHJpbmcmIHRleHQsIEV4
Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghbV9wYWdlU3R5bGVTaGVldCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGlmICghZW5zdXJlUGFyc2VkRGF0YVJlYWR5KCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBwYXRjaGVkU3R5bGVTaGVldFRleHQ7Ci0gICAg
Ym9vbCBzdWNjZXNzID0gc3R5bGVTaGVldFRleHRXaXRoQ2hhbmdlZFN0eWxlKHN0eWxlLCB0ZXh0
LCAmcGF0Y2hlZFN0eWxlU2hlZXRUZXh0KTsKLSAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIEluc3BlY3RvckNTU0lkIGlkID0gcnVsZU9yU3R5bGVJZChzdHls
ZSk7Ci0gICAgaWYgKGlkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
c3R5bGUtPnNldENzc1RleHQodGV4dCwgZWMpOwotICAgIGlmICghZWMpCi0gICAgICAgIG1fcGFy
c2VkU3R5bGVTaGVldC0+c2V0VGV4dChwYXRjaGVkU3R5bGVTaGVldFRleHQpOwotCi0gICAgcmV0
dXJuICFlYzsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0OjpzdHlsZVNoZWV0VGV4dFdp
dGhDaGFuZ2VkU3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUsIGNvbnN0IFN0cmluZyYg
bmV3U3R5bGVUZXh0LCBTdHJpbmcqIHJlc3VsdCkKLXsKLSAgICBpZiAoIXN0eWxlKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWVuc3VyZVBhcnNlZERhdGFSZWFkeSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHNvdXJj
ZURhdGEgPSBydWxlU291cmNlRGF0YUZvcihzdHlsZSk7Ci0gICAgdW5zaWduZWQgYm9keVN0YXJ0
ID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5zdGFydDsKLSAgICB1bnNpZ25lZCBib2R5RW5k
ID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5lbmQ7Ci0gICAgQVNTRVJUKGJvZHlTdGFydCA8
PSBib2R5RW5kKTsKLQotICAgIFN0cmluZyB0ZXh0ID0gbV9wYXJzZWRTdHlsZVNoZWV0LT50ZXh0
KCk7Ci0gICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oYm9keUVuZCA8PSB0ZXh0
Lmxlbmd0aCgpKTsgLy8gYm9keUVuZCBpcyBleGNsdXNpdmUKLQotICAgIHRleHQucmVwbGFjZShi
b2R5U3RhcnQsIGJvZHlFbmQgLSBib2R5U3RhcnQsIG5ld1N0eWxlVGV4dCk7Ci0gICAgKnJlc3Vs
dCA9IHRleHQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUluc3BlY3RvckNTU0lkIEluc3BlY3Rv
clN0eWxlU2hlZXQ6OnJ1bGVJZChDU1NTdHlsZVJ1bGUqIHJ1bGUpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIHJ1bGVPclN0eWxlSWQoJnJ1bGUtPnN0eWxlKCkpOwotfQotCi1ib29sIEluc3BlY3RvclN0
eWxlU2hlZXQ6Om9yaWdpbmFsU3R5bGVTaGVldFRleHQoU3RyaW5nKiByZXN1bHQpIGNvbnN0Ci17
Ci0gICAgYm9vbCBzdWNjZXNzID0gaW5saW5lU3R5bGVTaGVldFRleHQocmVzdWx0KTsKLSAgICBp
ZiAoIXN1Y2Nlc3MpCi0gICAgICAgIHN1Y2Nlc3MgPSByZXNvdXJjZVN0eWxlU2hlZXRUZXh0KHJl
c3VsdCk7Ci0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVl
dDo6cmVzb3VyY2VTdHlsZVNoZWV0VGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3QKLXsKLSAgICBp
ZiAobV9vcmlnaW4gPT0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2lu
OjpVc2VyIHx8IG1fb3JpZ2luID09IEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVl
dE9yaWdpbjo6VXNlckFnZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIW1f
cGFnZVN0eWxlU2hlZXQgfHwgIW93bmVyRG9jdW1lbnQoKSB8fCAhb3duZXJEb2N1bWVudCgpLT5m
cmFtZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmcgZXJyb3I7Ci0gICAg
Ym9vbCBiYXNlNjRFbmNvZGVkOwotICAgIEluc3BlY3RvclBhZ2VBZ2VudDo6cmVzb3VyY2VDb250
ZW50KGVycm9yLCBvd25lckRvY3VtZW50KCktPmZyYW1lKCksIFVSTChQYXJzZWRVUkxTdHJpbmcs
IG1fcGFnZVN0eWxlU2hlZXQtPmhyZWYoKSksIHJlc3VsdCwgJmJhc2U2NEVuY29kZWQpOwotICAg
IHJldHVybiBlcnJvci5pc0VtcHR5KCkgJiYgIWJhc2U2NEVuY29kZWQ7Ci19Ci0KLWJvb2wgSW5z
cGVjdG9yU3R5bGVTaGVldDo6aW5saW5lU3R5bGVTaGVldFRleHQoU3RyaW5nKiByZXN1bHQpIGNv
bnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2VTdHlsZVNoZWV0KQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBOb2RlKiBvd25lck5vZGUgPSBtX3BhZ2VTdHlsZVNoZWV0LT5vd25lck5vZGUoKTsK
LSAgICBpZiAoIWlzPEVsZW1lbnQ+KG93bmVyTm9kZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBFbGVtZW50JiBvd25lckVsZW1lbnQgPSBkb3duY2FzdDxFbGVtZW50Pigqb3duZXJOb2Rl
KTsKLQotICAgIGlmICghaXM8SFRNTFN0eWxlRWxlbWVudD4ob3duZXJFbGVtZW50KSAmJiAhaXM8
U1ZHU3R5bGVFbGVtZW50Pihvd25lckVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgKnJlc3VsdCA9IG93bmVyRWxlbWVudC50ZXh0Q29udGVudCgpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi1SZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NSdWxlPj4gSW5zcGVjdG9yU3R5bGVTaGVldDo6YnVpbGRBcnJheUZvclJ1bGVM
aXN0KENTU1J1bGVMaXN0KiBydWxlTGlzdCkKLXsKLSAgICBhdXRvIHJlc3VsdCA9IEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT46OmNy
ZWF0ZSgpOwotICAgIGlmICghcnVsZUxpc3QpCi0gICAgICAgIHJldHVybiBXVEY6Om1vdmUocmVz
dWx0KTsKLQotICAgIFJlZlB0cjxDU1NSdWxlTGlzdD4gcmVmUnVsZUxpc3QgPSBydWxlTGlzdDsK
LSAgICBDU1NTdHlsZVJ1bGVWZWN0b3IgcnVsZXM7Ci0gICAgY29sbGVjdEZsYXRSdWxlcyhXVEY6
Om1vdmUocmVmUnVsZUxpc3QpLCAmcnVsZXMpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwg
c2l6ZSA9IHJ1bGVzLnNpemUoKTsgaSA8IHNpemU7ICsraSkKLSAgICAgICAgcmVzdWx0LT5hZGRJ
dGVtKGJ1aWxkT2JqZWN0Rm9yUnVsZShydWxlcy5hdChpKS5nZXQoKSwgbnVsbHB0cikpOwotCi0g
ICAgcmV0dXJuIFdURjo6bW92ZShyZXN1bHQpOwotfQotCi12b2lkIEluc3BlY3RvclN0eWxlU2hl
ZXQ6OmNvbGxlY3RGbGF0UnVsZXMoUmVmUHRyPENTU1J1bGVMaXN0PiYmIHJ1bGVMaXN0LCBDU1NT
dHlsZVJ1bGVWZWN0b3IqIHJlc3VsdCkKLXsKLSAgICBpZiAoIXJ1bGVMaXN0KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBzaXplID0gcnVsZUxpc3QtPmxlbmd0
aCgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIENTU1J1bGUqIHJ1bGUgPSBydWxlTGlzdC0+
aXRlbShpKTsKLSAgICAgICAgQ1NTU3R5bGVSdWxlKiBzdHlsZVJ1bGUgPSBJbnNwZWN0b3JDU1NB
Z2VudDo6YXNDU1NTdHlsZVJ1bGUoKnJ1bGUpOwotICAgICAgICBpZiAoc3R5bGVSdWxlKQotICAg
ICAgICAgICAgcmVzdWx0LT5hcHBlbmQoc3R5bGVSdWxlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICBSZWZQdHI8Q1NTUnVsZUxpc3Q+IGNoaWxkUnVsZUxpc3QgPSBhc0NTU1J1bGVMaXN0
KHJ1bGUpOwotICAgICAgICAgICAgaWYgKGNoaWxkUnVsZUxpc3QpCi0gICAgICAgICAgICAgICAg
Y29sbGVjdEZsYXRSdWxlcyhXVEY6Om1vdmUoY2hpbGRSdWxlTGlzdCksIHJlc3VsdCk7Ci0gICAg
ICAgIH0KLSAgICB9Ci19Ci0KLVJlZjxJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU+
IEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6Y3JlYXRlKEluc3BlY3RvclBhZ2VB
Z2VudCogcGFnZUFnZW50LCBjb25zdCBTdHJpbmcmIGlkLCBSZWZQdHI8RWxlbWVudD4mJiBlbGVt
ZW50LCBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW4gb3JpZ2luLCBM
aXN0ZW5lciogbGlzdGVuZXIpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgSW5zcGVjdG9y
U3R5bGVTaGVldEZvcklubGluZVN0eWxlKHBhZ2VBZ2VudCwgaWQsIFdURjo6bW92ZShlbGVtZW50
KSwgb3JpZ2luLCBsaXN0ZW5lcikpOwotfQotCi1JbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5l
U3R5bGU6Okluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZShJbnNwZWN0b3JQYWdlQWdl
bnQqIHBhZ2VBZ2VudCwgY29uc3QgU3RyaW5nJiBpZCwgUmVmUHRyPEVsZW1lbnQ+JiYgZWxlbWVu
dCwgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luIG9yaWdpbiwgTGlz
dGVuZXIqIGxpc3RlbmVyKQotICAgIDogSW5zcGVjdG9yU3R5bGVTaGVldChwYWdlQWdlbnQsIGlk
LCBudWxscHRyLCBvcmlnaW4sIFN0cmluZygpLCBsaXN0ZW5lcikKLSAgICAsIG1fZWxlbWVudChX
VEY6Om1vdmUoZWxlbWVudCkpCi0gICAgLCBtX3J1bGVTb3VyY2VEYXRhKG51bGxwdHIpCi0gICAg
LCBtX2lzU3R5bGVUZXh0VmFsaWQoZmFsc2UpCi17Ci0gICAgQVNTRVJUKG1fZWxlbWVudCk7Ci0g
ICAgbV9pbnNwZWN0b3JTdHlsZSA9IEluc3BlY3RvclN0eWxlOjpjcmVhdGUoSW5zcGVjdG9yQ1NT
SWQoaWQsIDApLCBpbmxpbmVTdHlsZSgpLCB0aGlzKTsKLSAgICBtX3N0eWxlVGV4dCA9IG1fZWxl
bWVudC0+aXNTdHlsZWRFbGVtZW50KCkgPyBtX2VsZW1lbnQtPmdldEF0dHJpYnV0ZSgic3R5bGUi
KS5zdHJpbmcoKSA6IFN0cmluZygpOwotfQotCi12b2lkIEluc3BlY3RvclN0eWxlU2hlZXRGb3JJ
bmxpbmVTdHlsZTo6ZGlkTW9kaWZ5RWxlbWVudEF0dHJpYnV0ZSgpCi17Ci0gICAgbV9pc1N0eWxl
VGV4dFZhbGlkID0gZmFsc2U7Ci0gICAgaWYgKG1fZWxlbWVudC0+aXNTdHlsZWRFbGVtZW50KCkg
JiYgbV9lbGVtZW50LT5zdHlsZSgpICE9IG1faW5zcGVjdG9yU3R5bGUtPmNzc1N0eWxlKCkpCi0g
ICAgICAgIG1faW5zcGVjdG9yU3R5bGUgPSBJbnNwZWN0b3JTdHlsZTo6Y3JlYXRlKEluc3BlY3Rv
ckNTU0lkKGlkKCksIDApLCBpbmxpbmVTdHlsZSgpLCB0aGlzKTsKLSAgICBtX3J1bGVTb3VyY2VE
YXRhLmNsZWFyKCk7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxl
OjpnZXRUZXh0KFN0cmluZyogcmVzdWx0KSBjb25zdAotewotICAgIGlmICghbV9pc1N0eWxlVGV4
dFZhbGlkKSB7Ci0gICAgICAgIG1fc3R5bGVUZXh0ID0gZWxlbWVudFN0eWxlVGV4dCgpOwotICAg
ICAgICBtX2lzU3R5bGVUZXh0VmFsaWQgPSB0cnVlOwotICAgIH0KLSAgICAqcmVzdWx0ID0gbV9z
dHlsZVRleHQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yU3R5bGVTaGVl
dEZvcklubGluZVN0eWxlOjpzZXRTdHlsZVRleHQoQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUs
IGNvbnN0IFN0cmluZyYgdGV4dCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgQVNTRVJUX1VO
VVNFRChzdHlsZSwgc3R5bGUgPT0gaW5saW5lU3R5bGUoKSk7Ci0KLSAgICB7Ci0gICAgICAgIElu
c3BlY3RvckNTU0FnZW50OjpJbmxpbmVTdHlsZU92ZXJyaWRlU2NvcGUgb3ZlcnJpZGVTY29wZSgm
bV9lbGVtZW50LT5kb2N1bWVudCgpKTsKLSAgICAgICAgbV9lbGVtZW50LT5zZXRBdHRyaWJ1dGUo
InN0eWxlIiwgdGV4dCwgZWMpOwotICAgIH0KLQotICAgIG1fc3R5bGVUZXh0ID0gdGV4dDsKLSAg
ICBtX2lzU3R5bGVUZXh0VmFsaWQgPSB0cnVlOwotICAgIG1fcnVsZVNvdXJjZURhdGEuY2xlYXIo
KTsKLSAgICByZXR1cm4gIWVjOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8VmVjdG9yPHNpemVfdD4+
IEluc3BlY3RvclN0eWxlU2hlZXRGb3JJbmxpbmVTdHlsZTo6bGluZUVuZGluZ3MoKSBjb25zdAot
ewotICAgIHJldHVybiBDb250ZW50U2VhcmNoVXRpbGl0aWVzOjpsaW5lRW5kaW5ncyhlbGVtZW50
U3R5bGVUZXh0KCkpOwotfQotCi1Eb2N1bWVudCogSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGlu
ZVN0eWxlOjpvd25lckRvY3VtZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gJm1fZWxlbWVudC0+
ZG9jdW1lbnQoKTsKLX0KLQotYm9vbCBJbnNwZWN0b3JTdHlsZVNoZWV0Rm9ySW5saW5lU3R5bGU6
OmVuc3VyZVBhcnNlZERhdGFSZWFkeSgpCi17Ci0gICAgLy8gVGhlICJzdHlsZSIgcHJvcGVydHkg
dmFsdWUgY2FuIGdldCBjaGFuZ2VkIGluZGlyZWN0bHksIGUuZy4gdmlhIGVsZW1lbnQuc3R5bGUu
Ym9yZGVyV2lkdGggPSAiMnB4Ii4KLSAgICBjb25zdCBTdHJpbmcmIGN1cnJlbnRTdHlsZVRleHQg
PSBlbGVtZW50U3R5bGVUZXh0KCk7Ci0gICAgaWYgKG1fc3R5bGVUZXh0ICE9IGN1cnJlbnRTdHls
ZVRleHQpIHsKLSAgICAgICAgbV9ydWxlU291cmNlRGF0YS5jbGVhcigpOwotICAgICAgICBtX3N0
eWxlVGV4dCA9IGN1cnJlbnRTdHlsZVRleHQ7Ci0gICAgICAgIG1faXNTdHlsZVRleHRWYWxpZCA9
IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1fcnVsZVNvdXJjZURhdGEpCi0gICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgbV9ydWxlU291cmNlRGF0YSA9IENTU1J1bGVTb3VyY2VEYXRhOjpjcmVh
dGUoQ1NTUnVsZVNvdXJjZURhdGE6OlNUWUxFX1JVTEUpOwotICAgIGJvb2wgc3VjY2VzcyA9IGdl
dFN0eWxlQXR0cmlidXRlUmFuZ2VzKG1fcnVsZVNvdXJjZURhdGEuZ2V0KCkpOwotICAgIGlmICgh
c3VjY2VzcykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LVJlZlB0cjxJbnNwZWN0b3JTdHlsZT4gSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxl
OjppbnNwZWN0b3JTdHlsZUZvcklkKGNvbnN0IEluc3BlY3RvckNTU0lkJiBpZCkKLXsKLSAgICBB
U1NFUlRfVU5VU0VEKGlkLCAhaWQub3JkaW5hbCgpKTsKLSAgICByZXR1cm4gbV9pbnNwZWN0b3JT
dHlsZS5jb3B5UmVmKCk7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb24qIEluc3BlY3RvclN0eWxl
U2hlZXRGb3JJbmxpbmVTdHlsZTo6aW5saW5lU3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiBt
X2VsZW1lbnQtPnN0eWxlKCk7Ci19Ci0KLWNvbnN0IFN0cmluZyYgSW5zcGVjdG9yU3R5bGVTaGVl
dEZvcklubGluZVN0eWxlOjplbGVtZW50U3R5bGVUZXh0KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9lbGVtZW50LT5nZXRBdHRyaWJ1dGUoInN0eWxlIikuc3RyaW5nKCk7Ci19Ci0KLWJvb2wgSW5z
cGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlOjpnZXRTdHlsZUF0dHJpYnV0ZVJhbmdlcyhD
U1NSdWxlU291cmNlRGF0YSogcmVzdWx0KSBjb25zdAotewotICAgIGlmICghbV9lbGVtZW50LT5p
c1N0eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fc3R5
bGVUZXh0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQtPnJ1bGVCb2R5UmFuZ2Uuc3RhcnQg
PSAwOwotICAgICAgICByZXN1bHQtPnJ1bGVCb2R5UmFuZ2UuZW5kID0gMDsKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUmVmUHRyPE11dGFibGVTdHlsZVByb3BlcnRpZXM+IHRl
bXBEZWNsYXJhdGlvbiA9IE11dGFibGVTdHlsZVByb3BlcnRpZXM6OmNyZWF0ZSgpOwotICAgIGNy
ZWF0ZUNTU1BhcnNlcigmbV9lbGVtZW50LT5kb2N1bWVudCgpKS0+cGFyc2VEZWNsYXJhdGlvbih0
ZW1wRGVjbGFyYXRpb24uZ2V0KCksIG1fc3R5bGVUZXh0LCByZXN1bHQsICZtX2VsZW1lbnQtPmRv
Y3VtZW50KCkuZWxlbWVudFNoZWV0KCkuY29udGVudHMoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9JbnNwZWN0b3JTdHlsZVNoZWV0LmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
SW5zcGVjdG9yU3R5bGVTaGVldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTgy
MTg3Li4wMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JTdHls
ZVNoZWV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0g
KiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpZm5kZWYgSW5zcGVjdG9yU3R5bGVTaGVldF9oCi0jZGVmaW5lIEluc3BlY3RvclN0eWxlU2hl
ZXRfaAotCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlTb3VyY2VEYXRhLmgiCi0jaW5jbHVkZSAiQ1NT
U3R5bGVEZWNsYXJhdGlvbi5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKLSNpbmNsdWRl
IDxpbnNwZWN0b3IvSW5zcGVjdG9yUHJvdG9jb2xPYmplY3RzLmg+Ci0jaW5jbHVkZSA8aW5zcGVj
dG9yL0luc3BlY3RvclZhbHVlcy5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVk
ZSA8d3RmL0hhc2hTZXQuaD4KLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotCi1jbGFzcyBQYXJz
ZWRTdHlsZVNoZWV0OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIENTU1J1bGVMaXN0
OwotY2xhc3MgQ1NTU2VsZWN0b3I7Ci1jbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOwotY2xhc3Mg
Q1NTU3R5bGVSdWxlOwotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNsYXNzIERvY3VtZW50OwotY2xh
c3MgRWxlbWVudDsKLWNsYXNzIEluc3BlY3RvclBhZ2VBZ2VudDsKLWNsYXNzIEluc3BlY3RvclN0
eWxlU2hlZXQ7Ci0KLXR5cGVkZWYgU3RyaW5nIEVycm9yU3RyaW5nOwotCi1jbGFzcyBJbnNwZWN0
b3JDU1NJZCB7Ci1wdWJsaWM6Ci0gICAgSW5zcGVjdG9yQ1NTSWQoKSB7IH0KLQotICAgIGV4cGxp
Y2l0IEluc3BlY3RvckNTU0lkKGNvbnN0IFJlZlB0cjxJbnNwZWN0b3I6Okluc3BlY3Rvck9iamVj
dD4mJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICghdmFsdWUtPmdldFN0cmluZyhBU0NJSUxp
dGVyYWwoInN0eWxlU2hlZXRJZCIpLCBtX3N0eWxlU2hlZXRJZCkpCi0gICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+Z2V0SW50ZWdlcihBU0NJSUxpdGVyYWwoIm9yZGlu
YWwiKSwgbV9vcmRpbmFsKSkKLSAgICAgICAgICAgIG1fc3R5bGVTaGVldElkID0gU3RyaW5nKCk7
Ci0gICAgfQotCi0gICAgSW5zcGVjdG9yQ1NTSWQoY29uc3QgU3RyaW5nJiBzdHlsZVNoZWV0SWQs
IHVuc2lnbmVkIG9yZGluYWwpCi0gICAgICAgIDogbV9zdHlsZVNoZWV0SWQoc3R5bGVTaGVldElk
KQotICAgICAgICAsIG1fb3JkaW5hbChvcmRpbmFsKQotICAgIHsKLSAgICB9Ci0KLSAgICBib29s
IGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlU2hlZXRJZC5pc0VtcHR5KCk7IH0KLQot
ICAgIGNvbnN0IFN0cmluZyYgc3R5bGVTaGVldElkKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZVNo
ZWV0SWQ7IH0KLSAgICB1bnNpZ25lZCBvcmRpbmFsKCkgY29uc3QgeyByZXR1cm4gbV9vcmRpbmFs
OyB9Ci0KLSAgICAvLyBJRCB0eXBlIGlzIGVpdGhlciBJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6
OkNTU1N0eWxlSWQgb3IgSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpDU1NSdWxlSWQuCi0gICAg
dGVtcGxhdGU8dHlwZW5hbWUgSUQ+Ci0gICAgUmVmUHRyPElEPiBhc1Byb3RvY29sVmFsdWUoKSBj
b25zdAotICAgIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBu
dWxscHRyOwotCi0gICAgICAgIHJldHVybiBJRDo6Y3JlYXRlKCkKLSAgICAgICAgICAgIC5zZXRT
dHlsZVNoZWV0SWQobV9zdHlsZVNoZWV0SWQpCi0gICAgICAgICAgICAuc2V0T3JkaW5hbChtX29y
ZGluYWwpCi0gICAgICAgICAgICAucmVsZWFzZSgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBT
dHJpbmcgbV9zdHlsZVNoZWV0SWQ7Ci0gICAgdW5zaWduZWQgbV9vcmRpbmFsID0gezB9OwotfTsK
LQotc3RydWN0IEluc3BlY3RvclN0eWxlUHJvcGVydHkgewotICAgIEluc3BlY3RvclN0eWxlUHJv
cGVydHkoKQotICAgICAgICA6IGhhc1NvdXJjZShmYWxzZSkKLSAgICAgICAgLCBkaXNhYmxlZChm
YWxzZSkKLSAgICB7Ci0gICAgfQotCi0gICAgSW5zcGVjdG9yU3R5bGVQcm9wZXJ0eShDU1NQcm9w
ZXJ0eVNvdXJjZURhdGEgc291cmNlRGF0YSwgYm9vbCBoYXNTb3VyY2UsIGJvb2wgZGlzYWJsZWQp
Ci0gICAgICAgIDogc291cmNlRGF0YShzb3VyY2VEYXRhKQotICAgICAgICAsIGhhc1NvdXJjZSho
YXNTb3VyY2UpCi0gICAgICAgICwgZGlzYWJsZWQoZGlzYWJsZWQpCi0gICAgewotICAgIH0KLQot
ICAgIHZvaWQgc2V0UmF3VGV4dEZyb21TdHlsZURlY2xhcmF0aW9uKGNvbnN0IFN0cmluZyYgc3R5
bGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIHN0YXJ0ID0gc291cmNlRGF0
YS5yYW5nZS5zdGFydDsKLSAgICAgICAgdW5zaWduZWQgZW5kID0gc291cmNlRGF0YS5yYW5nZS5l
bmQ7Ci0gICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHN0YXJ0IDwgZW5k
KTsKLSAgICAgICAgQVNTRVJUKGVuZCA8PSBzdHlsZURlY2xhcmF0aW9uLmxlbmd0aCgpKTsKLSAg
ICAgICAgcmF3VGV4dCA9IHN0eWxlRGVjbGFyYXRpb24uc3Vic3RyaW5nKHN0YXJ0LCBlbmQgLSBz
dGFydCk7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNSYXdUZXh0KCkgY29uc3QgeyByZXR1cm4gIXJh
d1RleHQuaXNFbXB0eSgpOyB9Ci0KLSAgICBDU1NQcm9wZXJ0eVNvdXJjZURhdGEgc291cmNlRGF0
YTsKLSAgICBib29sIGhhc1NvdXJjZTsKLSAgICBib29sIGRpc2FibGVkOwotICAgIFN0cmluZyBy
YXdUZXh0OwotfTsKLQotY2xhc3MgSW5zcGVjdG9yU3R5bGUgZmluYWwgOiBwdWJsaWMgUmVmQ291
bnRlZDxJbnNwZWN0b3JTdHlsZT4gewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8SW5zcGVjdG9y
U3R5bGU+IGNyZWF0ZShjb25zdCBJbnNwZWN0b3JDU1NJZCYgc3R5bGVJZCwgUmVmUHRyPENTU1N0
eWxlRGVjbGFyYXRpb24+JiYsIEluc3BlY3RvclN0eWxlU2hlZXQqIHBhcmVudFN0eWxlU2hlZXQp
OwotICAgIH5JbnNwZWN0b3JTdHlsZSgpOwotCi0gICAgQ1NTU3R5bGVEZWNsYXJhdGlvbiogY3Nz
U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9Ci0gICAgUmVmUHRyPEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkNTUzo6Q1NTU3R5bGU+IGJ1aWxkT2JqZWN0Rm9yU3R5bGUoKSBjb25z
dDsKLSAgICBSZWY8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+PiBidWlsZEFycmF5Rm9yQ29tcHV0ZWRT
dHlsZSgpIGNvbnN0OwotCi0gICAgYm9vbCBnZXRUZXh0KFN0cmluZyogcmVzdWx0KSBjb25zdDsK
LSAgICBib29sIHNldFRleHQoY29uc3QgU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwotCi1wcml2
YXRlOgotICAgIEluc3BlY3RvclN0eWxlKGNvbnN0IEluc3BlY3RvckNTU0lkJiBzdHlsZUlkLCBS
ZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4mJiwgSW5zcGVjdG9yU3R5bGVTaGVldCogcGFyZW50
U3R5bGVTaGVldCk7Ci0KLSAgICAvLyBGSVhNRTogUmVtb3ZlIHRoZXNlIGFsaWFzZXMgYW5kIHVw
ZGF0ZSBhbGwgdGhlIGN1cnJlbnQgY2FsbCBzaXRlcyB0byB1c2UgdGhlIG5ldyBwdWJsaWMgbWV0
aG9kcy4KLSAgICBib29sIHN0eWxlVGV4dChTdHJpbmcqIHJlc3VsdCkgY29uc3QgeyByZXR1cm4g
Z2V0VGV4dChyZXN1bHQpOyB9Ci0gICAgYm9vbCBhcHBseVN0eWxlVGV4dChjb25zdCBTdHJpbmcm
IHRleHQpIHsgRXhjZXB0aW9uQ29kZSBlYyA9IDA7IHJldHVybiBzZXRUZXh0KHRleHQsIGVjKTsg
fQotCi0gICAgYm9vbCBwb3B1bGF0ZUFsbFByb3BlcnRpZXMoVmVjdG9yPEluc3BlY3RvclN0eWxl
UHJvcGVydHk+KiByZXN1bHQpIGNvbnN0OwotICAgIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpD
U1M6OkNTU1N0eWxlPiBzdHlsZVdpdGhQcm9wZXJ0aWVzKCkgY29uc3Q7Ci0gICAgUmVmUHRyPENT
U1J1bGVTb3VyY2VEYXRhPiBleHRyYWN0U291cmNlRGF0YSgpIGNvbnN0OwotICAgIFN0cmluZyBz
aG9ydGhhbmRWYWx1ZShjb25zdCBTdHJpbmcmIHNob3J0aGFuZFByb3BlcnR5KSBjb25zdDsKLSAg
ICBTdHJpbmcgc2hvcnRoYW5kUHJpb3JpdHkoY29uc3QgU3RyaW5nJiBzaG9ydGhhbmRQcm9wZXJ0
eSkgY29uc3Q7Ci0gICAgVmVjdG9yPFN0cmluZz4gbG9uZ2hhbmRQcm9wZXJ0aWVzKGNvbnN0IFN0
cmluZyYgc2hvcnRoYW5kUHJvcGVydHkpIGNvbnN0OwotCi0gICAgSW5zcGVjdG9yQ1NTSWQgbV9z
dHlsZUlkOwotICAgIFJlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiBtX3N0eWxlOwotICAgIElu
c3BlY3RvclN0eWxlU2hlZXQqIG1fcGFyZW50U3R5bGVTaGVldDsKLX07Ci0KLWNsYXNzIEluc3Bl
Y3RvclN0eWxlU2hlZXQgOiBwdWJsaWMgUmVmQ291bnRlZDxJbnNwZWN0b3JTdHlsZVNoZWV0PiB7
Ci1wdWJsaWM6Ci0gICAgY2xhc3MgTGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTGlz
dGVuZXIoKSB7IH0KLSAgICAgICAgdmlydHVhbCB+TGlzdGVuZXIoKSB7IH0KLSAgICAgICAgdmly
dHVhbCB2b2lkIHN0eWxlU2hlZXRDaGFuZ2VkKEluc3BlY3RvclN0eWxlU2hlZXQqKSA9IDA7Ci0g
ICAgfTsKLQotICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NTdHlsZURlY2xhcmF0aW9uKiwgUmVmUHRy
PEluc3BlY3RvclN0eWxlPj4gSW5zcGVjdG9yU3R5bGVNYXA7Ci0gICAgc3RhdGljIFJlZjxJbnNw
ZWN0b3JTdHlsZVNoZWV0PiBjcmVhdGUoSW5zcGVjdG9yUGFnZUFnZW50KiwgY29uc3QgU3RyaW5n
JiBpZCwgUmVmUHRyPENTU1N0eWxlU2hlZXQ+JiYgcGFnZVN0eWxlU2hlZXQsIEluc3BlY3Rvcjo6
UHJvdG9jb2w6OkNTUzo6U3R5bGVTaGVldE9yaWdpbiwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVS
TCwgTGlzdGVuZXIqKTsKLSAgICBzdGF0aWMgU3RyaW5nIHN0eWxlU2hlZXRVUkwoQ1NTU3R5bGVT
aGVldCogcGFnZVN0eWxlU2hlZXQpOwotCi0gICAgdmlydHVhbCB+SW5zcGVjdG9yU3R5bGVTaGVl
dCgpOwotCi0gICAgU3RyaW5nIGlkKCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQotICAgIFN0cmlu
ZyBmaW5hbFVSTCgpIGNvbnN0OwotICAgIENTU1N0eWxlU2hlZXQqIHBhZ2VTdHlsZVNoZWV0KCkg
Y29uc3QgeyByZXR1cm4gbV9wYWdlU3R5bGVTaGVldC5nZXQoKTsgfQotICAgIHZvaWQgcmVwYXJz
ZVN0eWxlU2hlZXQoY29uc3QgU3RyaW5nJik7Ci0gICAgYm9vbCBzZXRUZXh0KGNvbnN0IFN0cmlu
ZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICBTdHJpbmcgcnVsZVNlbGVjdG9yKGNvbnN0IEluc3Bl
Y3RvckNTU0lkJiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIGJvb2wgc2V0UnVsZVNlbGVjdG9yKGNv
bnN0IEluc3BlY3RvckNTU0lkJiwgY29uc3QgU3RyaW5nJiBzZWxlY3RvciwgRXhjZXB0aW9uQ29k
ZSYpOwotICAgIENTU1N0eWxlUnVsZSogYWRkUnVsZShjb25zdCBTdHJpbmcmIHNlbGVjdG9yLCBF
eGNlcHRpb25Db2RlJik7Ci0gICAgYm9vbCBkZWxldGVSdWxlKGNvbnN0IEluc3BlY3RvckNTU0lk
JiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIENTU1N0eWxlUnVsZSogcnVsZUZvcklkKGNvbnN0IElu
c3BlY3RvckNTU0lkJikgY29uc3Q7Ci0gICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkNT
Uzo6Q1NTU3R5bGVTaGVldEJvZHk+IGJ1aWxkT2JqZWN0Rm9yU3R5bGVTaGVldCgpOwotICAgIFJl
ZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlU2hlZXRIZWFkZXI+IGJ1aWxk
T2JqZWN0Rm9yU3R5bGVTaGVldEluZm8oKTsKLSAgICBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2Nv
bDo6Q1NTOjpDU1NSdWxlPiBidWlsZE9iamVjdEZvclJ1bGUoQ1NTU3R5bGVSdWxlKiwgRWxlbWVu
dCopOwotICAgIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1N0eWxlPiBidWls
ZE9iamVjdEZvclN0eWxlKENTU1N0eWxlRGVjbGFyYXRpb24qKTsKLSAgICBib29sIHNldFN0eWxl
VGV4dChjb25zdCBJbnNwZWN0b3JDU1NJZCYsIGNvbnN0IFN0cmluZyYgdGV4dCwgU3RyaW5nKiBv
bGRUZXh0LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0VGV4dChTdHJp
bmcqIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHls
ZUZvcklkKGNvbnN0IEluc3BlY3RvckNTU0lkJikgY29uc3Q7Ci0gICAgdm9pZCBmaXJlU3R5bGVT
aGVldENoYW5nZWQoKTsKLQotICAgIEluc3BlY3RvckNTU0lkIHJ1bGVJZChDU1NTdHlsZVJ1bGUq
KSBjb25zdDsKLSAgICBJbnNwZWN0b3JDU1NJZCBzdHlsZUlkKENTU1N0eWxlRGVjbGFyYXRpb24q
IHN0eWxlKSBjb25zdCB7IHJldHVybiBydWxlT3JTdHlsZUlkKHN0eWxlKTsgfQotCi1wcm90ZWN0
ZWQ6Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldChJbnNwZWN0b3JQYWdlQWdlbnQqLCBjb25zdCBT
dHJpbmcmIGlkLCBSZWZQdHI8Q1NTU3R5bGVTaGVldD4mJiBwYWdlU3R5bGVTaGVldCwgSW5zcGVj
dG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luLCBjb25zdCBTdHJpbmcmIGRvY3Vt
ZW50VVJMLCBMaXN0ZW5lciopOwotCi0gICAgYm9vbCBjYW5CaW5kKCkgY29uc3QgeyByZXR1cm4g
bV9vcmlnaW4gIT0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNoZWV0T3JpZ2luOjpV
c2VyQWdlbnQgJiYgbV9vcmlnaW4gIT0gSW5zcGVjdG9yOjpQcm90b2NvbDo6Q1NTOjpTdHlsZVNo
ZWV0T3JpZ2luOjpVc2VyOyB9Ci0gICAgSW5zcGVjdG9yQ1NTSWQgcnVsZU9yU3R5bGVJZChDU1NT
dHlsZURlY2xhcmF0aW9uKikgY29uc3Q7Ci0gICAgdmlydHVhbCBEb2N1bWVudCogb3duZXJEb2N1
bWVudCgpIGNvbnN0OwotICAgIHZpcnR1YWwgUmVmUHRyPENTU1J1bGVTb3VyY2VEYXRhPiBydWxl
U291cmNlRGF0YUZvcihDU1NTdHlsZURlY2xhcmF0aW9uKikgY29uc3Q7Ci0gICAgdmlydHVhbCB1
bnNpZ25lZCBydWxlSW5kZXhCeVN0eWxlKENTU1N0eWxlRGVjbGFyYXRpb24qKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGJvb2wgZW5zdXJlUGFyc2VkRGF0YVJlYWR5KCk7Ci0gICAgdmlydHVhbCBSZWZQ
dHI8SW5zcGVjdG9yU3R5bGU+IGluc3BlY3RvclN0eWxlRm9ySWQoY29uc3QgSW5zcGVjdG9yQ1NT
SWQmKTsKLQotICAgIC8vIEFsc28gYWNjZXNzZWQgYnkgZnJpZW5kIGNsYXNzIEluc3BlY3RvclN0
eWxlLgotICAgIHZpcnR1YWwgYm9vbCBzZXRTdHlsZVRleHQoQ1NTU3R5bGVEZWNsYXJhdGlvbios
IGNvbnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVl
X3B0cjxWZWN0b3I8c2l6ZV90Pj4gbGluZUVuZGluZ3MoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAg
ICB0eXBlZGVmIFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVSdWxlPj4gQ1NTU3R5bGVSdWxlVmVjdG9y
OwotICAgIGZyaWVuZCBjbGFzcyBJbnNwZWN0b3JTdHlsZTsKLQotICAgIHN0YXRpYyB2b2lkIGNv
bGxlY3RGbGF0UnVsZXMoUmVmUHRyPENTU1J1bGVMaXN0PiYmLCBDU1NTdHlsZVJ1bGVWZWN0b3Iq
IHJlc3VsdCk7Ci0gICAgYm9vbCBjaGVja1BhZ2VTdHlsZVNoZWV0KEV4Y2VwdGlvbkNvZGUmKSBj
b25zdDsKLSAgICBib29sIHN0eWxlU2hlZXRNdXRhdGVkKCkgY29uc3Q7Ci0gICAgYm9vbCBlbnN1
cmVUZXh0KCkgY29uc3Q7Ci0gICAgYm9vbCBlbnN1cmVTb3VyY2VEYXRhKCk7Ci0gICAgdm9pZCBl
bnN1cmVGbGF0UnVsZXMoKSBjb25zdDsKLSAgICBib29sIHN0eWxlU2hlZXRUZXh0V2l0aENoYW5n
ZWRTdHlsZShDU1NTdHlsZURlY2xhcmF0aW9uKiwgY29uc3QgU3RyaW5nJiBuZXdTdHlsZVRleHQs
IFN0cmluZyogcmVzdWx0KTsKLSAgICBib29sIG9yaWdpbmFsU3R5bGVTaGVldFRleHQoU3RyaW5n
KiByZXN1bHQpIGNvbnN0OwotICAgIGJvb2wgcmVzb3VyY2VTdHlsZVNoZWV0VGV4dChTdHJpbmcq
IHJlc3VsdCkgY29uc3Q7Ci0gICAgYm9vbCBpbmxpbmVTdHlsZVNoZWV0VGV4dChTdHJpbmcqIHJl
c3VsdCkgY29uc3Q7Ci0gICAgUmVmPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3BlY3Rv
cjo6UHJvdG9jb2w6OkNTUzo6Q1NTUnVsZT4+IGJ1aWxkQXJyYXlGb3JSdWxlTGlzdChDU1NSdWxl
TGlzdCopOwotICAgIFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OkNTU1NlbGVjdG9yPiBi
dWlsZE9iamVjdEZvclNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiwgRWxlbWVudCopOwotICAg
IFJlZjxJbnNwZWN0b3I6OlByb3RvY29sOjpDU1M6OlNlbGVjdG9yTGlzdD4gYnVpbGRPYmplY3RG
b3JTZWxlY3Rvckxpc3QoQ1NTU3R5bGVSdWxlKiwgRWxlbWVudCopOwotCi0gICAgSW5zcGVjdG9y
UGFnZUFnZW50KiBtX3BhZ2VBZ2VudDsKLSAgICBTdHJpbmcgbV9pZDsKLSAgICBSZWZQdHI8Q1NT
U3R5bGVTaGVldD4gbV9wYWdlU3R5bGVTaGVldDsKLSAgICBJbnNwZWN0b3I6OlByb3RvY29sOjpD
U1M6OlN0eWxlU2hlZXRPcmlnaW4gbV9vcmlnaW47Ci0gICAgU3RyaW5nIG1fZG9jdW1lbnRVUkw7
Ci0gICAgUGFyc2VkU3R5bGVTaGVldCogbV9wYXJzZWRTdHlsZVNoZWV0OwotICAgIG11dGFibGUg
Q1NTU3R5bGVSdWxlVmVjdG9yIG1fZmxhdFJ1bGVzOwotICAgIExpc3RlbmVyKiBtX2xpc3RlbmVy
OwotfTsKLQotY2xhc3MgSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlIGZpbmFsIDog
cHVibGljIEluc3BlY3RvclN0eWxlU2hlZXQgewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8SW5z
cGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlPiBjcmVhdGUoSW5zcGVjdG9yUGFnZUFnZW50
KiwgY29uc3QgU3RyaW5nJiBpZCwgUmVmUHRyPEVsZW1lbnQ+JiYsIEluc3BlY3Rvcjo6UHJvdG9j
b2w6OkNTUzo6U3R5bGVTaGVldE9yaWdpbiwgTGlzdGVuZXIqKTsKLQotICAgIHZvaWQgZGlkTW9k
aWZ5RWxlbWVudEF0dHJpYnV0ZSgpOwotICAgIHZpcnR1YWwgYm9vbCBnZXRUZXh0KFN0cmluZyog
cmVzdWx0KSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24q
IHN0eWxlRm9ySWQoY29uc3QgSW5zcGVjdG9yQ1NTSWQmIGlkKSBjb25zdCBvdmVycmlkZSB7IEFT
U0VSVF9VTlVTRUQoaWQsICFpZC5vcmRpbmFsKCkpOyByZXR1cm4gaW5saW5lU3R5bGUoKTsgfQot
Ci1wcm90ZWN0ZWQ6Ci0gICAgSW5zcGVjdG9yU3R5bGVTaGVldEZvcklubGluZVN0eWxlKEluc3Bl
Y3RvclBhZ2VBZ2VudCosIGNvbnN0IFN0cmluZyYgaWQsIFJlZlB0cjxFbGVtZW50PiYmLCBJbnNw
ZWN0b3I6OlByb3RvY29sOjpDU1M6OlN0eWxlU2hlZXRPcmlnaW4sIExpc3RlbmVyKik7Ci0KLSAg
ICB2aXJ0dWFsIERvY3VtZW50KiBvd25lckRvY3VtZW50KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAg
dmlydHVhbCBSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHJ1bGVTb3VyY2VEYXRhRm9yKENTU1N0
eWxlRGVjbGFyYXRpb24qIHN0eWxlKSBjb25zdCBvdmVycmlkZSB7IEFTU0VSVF9VTlVTRUQoc3R5
bGUsIHN0eWxlID09IGlubGluZVN0eWxlKCkpOyByZXR1cm4gbV9ydWxlU291cmNlRGF0YTsgfQot
ICAgIHZpcnR1YWwgdW5zaWduZWQgcnVsZUluZGV4QnlTdHlsZShDU1NTdHlsZURlY2xhcmF0aW9u
KikgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgYm9vbCBlbnN1cmVQ
YXJzZWREYXRhUmVhZHkoKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIFJlZlB0cjxJbnNwZWN0b3JT
dHlsZT4gaW5zcGVjdG9yU3R5bGVGb3JJZChjb25zdCBJbnNwZWN0b3JDU1NJZCYpIG92ZXJyaWRl
OwotCi0gICAgLy8gQWxzbyBhY2Nlc3NlZCBieSBmcmllbmQgY2xhc3MgSW5zcGVjdG9yU3R5bGUu
Ci0gICAgdmlydHVhbCBib29sIHNldFN0eWxlVGV4dChDU1NTdHlsZURlY2xhcmF0aW9uKiwgY29u
c3QgU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RkOjp1
bmlxdWVfcHRyPFZlY3RvcjxzaXplX3Q+PiBsaW5lRW5kaW5ncygpIGNvbnN0IG92ZXJyaWRlOwot
Ci1wcml2YXRlOgotICAgIENTU1N0eWxlRGVjbGFyYXRpb24qIGlubGluZVN0eWxlKCkgY29uc3Q7
Ci0gICAgY29uc3QgU3RyaW5nJiBlbGVtZW50U3R5bGVUZXh0KCkgY29uc3Q7Ci0gICAgYm9vbCBn
ZXRTdHlsZUF0dHJpYnV0ZVJhbmdlcyhDU1NSdWxlU291cmNlRGF0YSogcmVzdWx0KSBjb25zdDsK
LQotICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1lbnQ7Ci0gICAgUmVmUHRyPENTU1J1bGVTb3Vy
Y2VEYXRhPiBtX3J1bGVTb3VyY2VEYXRhOwotICAgIFJlZlB0cjxJbnNwZWN0b3JTdHlsZT4gbV9p
bnNwZWN0b3JTdHlsZTsKLQotICAgIC8vIENvbnRhaW5zICJzdHlsZSIgYXR0cmlidXRlIHZhbHVl
LgotICAgIG11dGFibGUgU3RyaW5nIG1fc3R5bGVUZXh0OwotICAgIG11dGFibGUgYm9vbCBtX2lz
U3R5bGVUZXh0VmFsaWQ7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNlbmRpZiAv
LyAhZGVmaW5lZChJbnNwZWN0b3JTdHlsZVNoZWV0X2gpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuY3BwIGIvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMyM2I1Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmNwcApAQCAt
MCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBVbml2ZXJzaXR5IG9mIFdh
c2hpbmd0b24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5z
cGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuaCIKKworI2luY2x1ZGUgIkNTU1BhcnNlci5oIgorI2lu
Y2x1ZGUgIkNTU1Byb3BlcnR5U291cmNlRGF0YS5oIgorI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlz
dC5oIgorI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1N0eWxlU2hlZXQu
aCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgor
I2luY2x1ZGUgIkluc3BlY3RvckNTU0FnZW50LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yUGFnZUFn
ZW50LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU2VsZWN0
b3JDaGVja2VyLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU3R5bGVTaGVl
dENvbnRlbnRzLmgiCisjaW5jbHVkZSAiU1ZHU3R5bGVFbGVtZW50LmgiCisjaW5jbHVkZSA8aW5z
cGVjdG9yL0NvbnRlbnRTZWFyY2hVdGlsaXRpZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBJbnNwZWN0b3IgeworCitSZWY8U3R5bGVzaGVldFJ1bGVTZXQ+IFN0
eWxlc2hlZXRSdWxlU2V0OjpjcmVhdGUoUmVmPENTU1N0eWxlU2hlZXQ+JiYgcGFnZVN0eWxlc2hl
ZXQsIFN0eWxlU2hlZXRPcmlnaW4gb3JpZ2luLCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCBM
aXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3R5bGVzaGVl
dFJ1bGVTZXQoV1RGOjptb3ZlKHBhZ2VTdHlsZXNoZWV0KSwgb3JpZ2luLCBkb2N1bWVudFVSTCwg
bGlzdGVuZXIpKTsKK30KKworU3R5bGVzaGVldFJ1bGVTZXQ6OlN0eWxlc2hlZXRSdWxlU2V0KFJl
ZjxDU1NTdHlsZVNoZWV0PiYmIHBhZ2VTdHlsZXNoZWV0LCBTdHlsZVNoZWV0T3JpZ2luIG9yaWdp
biwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCwgTGlzdGVuZXIqIGxpc3RlbmVyKQorICAgIDog
U3R5bGVSdWxlU2V0KCkKKyAgICAsIG1fc3R5bGVzaGVldChXVEY6Om1vdmUocGFnZVN0eWxlc2hl
ZXQpKQorICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICwgbV9kb2N1bWVudFVSTChkb2N1bWVu
dFVSTCkKKyAgICAsIG1fbGlzdGVuZXIobGlzdGVuZXIpCit7Cit9CisKK1N0eWxlc2hlZXRSdWxl
U2V0Ojp+U3R5bGVzaGVldFJ1bGVTZXQoKQoreworfQorCitTdHJpbmcgU3R5bGVzaGVldFJ1bGVT
ZXQ6OmZpbmFsVVJMKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc3R5bGVzaGVldC0+Y29udGVudHMo
KS5iYXNlVVJMKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gbV9zdHlsZXNoZWV0LT5jb250
ZW50cygpLmJhc2VVUkwoKS5zdHJpbmcoKTsKKworICAgIHJldHVybiBtX2RvY3VtZW50VVJMOwor
fQorCitib29sIFN0eWxlc2hlZXRSdWxlU2V0Ojppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJl
dHVybiAhbV9zdHlsZXNoZWV0LT5kaXNhYmxlZCgpOworfQorCitTdHJpbmcgU3R5bGVzaGVldFJ1
bGVTZXQ6OnRpdGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdHlsZXNoZWV0LT50aXRsZSgp
OworfQorCit2b2lkIFN0eWxlc2hlZXRSdWxlU2V0OjpwYXRjaFN0eWxlc2hlZXRUZXh0KGNvbnN0
IFN0cmluZyYgc3R5bGVzaGVldFRleHQpCit7CisgICAgY29tbWl0UnVsZVNldENoYW5nZShQYXJz
ZWRSdWxlU2V0RGF0YTo6Y3JlYXRlV2l0aFRleHQoKnRoaXMsIHN0eWxlc2hlZXRUZXh0KSk7Cit9
CisKK3ZvaWQgU3R5bGVzaGVldFJ1bGVTZXQ6OnJlcGxhY2VUZXh0KGNvbnN0IFN0cmluZyYgc3R5
bGVzaGVldFRleHQpCit7CisgICAgeworICAgICAgICAvLyBNdXN0IHVzZSBhIHNlcGFyYXRlIHNj
b3BlIGZvciBjbGVhclJ1bGVzKCkuIGh0dHBzOi8vd3d3LndlYmtpdC5vcmcvYi85NTMyNC8KKyAg
ICAgICAgQ1NTU3R5bGVTaGVldDo6UnVsZU11dGF0aW9uU2NvcGUgbXV0YXRpb25TY29wZSgmbV9z
dHlsZXNoZWV0LmdldCgpKTsKKyAgICAgICAgbV9zdHlsZXNoZWV0LT5jb250ZW50cygpLmNsZWFy
UnVsZXMoKTsKKyAgICB9CisgICAgeworICAgICAgICBDU1NTdHlsZVNoZWV0OjpSdWxlTXV0YXRp
b25TY29wZSBtdXRhdGlvblNjb3BlKCZtX3N0eWxlc2hlZXQuZ2V0KCkpOworICAgICAgICBtX3N0
eWxlc2hlZXQtPmNvbnRlbnRzKCkucGFyc2VTdHJpbmcoc3R5bGVzaGVldFRleHQpOworICAgICAg
ICBtX3N0eWxlc2hlZXQtPmNsZWFyQ2hpbGRSdWxlQ1NTT01XcmFwcGVycygpOworICAgIH0KKwor
ICAgIC8vIFdlIGp1c3Qgd2lwZWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgc3R5bGVzaGVl
dC4gQ2xlYXIgdGhlIG11dGF0aW9uIGZsYWcuCisgICAgbV9zdHlsZXNoZWV0LT5jbGVhckhhZFJ1
bGVzTXV0YXRpb24oKTsKKworICAgIGNvbW1pdFJ1bGVTZXRDaGFuZ2UoUGFyc2VkUnVsZVNldERh
dGE6OmNyZWF0ZSgqdGhpcykpOworfQorCit2b2lkIFN0eWxlc2hlZXRSdWxlU2V0Ojpub3RpZnlS
dWxlU2V0Q2hhbmdlZCgpCit7CisgICAgaWYgKG1fbGlzdGVuZXIpCisgICAgICAgIG1fbGlzdGVu
ZXItPnN0eWxlU2hlZXRDaGFuZ2VkKCp0aGlzKTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNl
dDo6c2VsZWN0b3JUZXh0Rm9yUnVsZShjb25zdCBDU1NJZCYgaWQsIFN0cmluZyYgcmVzdWx0KQor
eworICAgIGlmIChDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRm9ySWQoaWQpKSB7CisgICAgICAg
IHJlc3VsdCA9IHJ1bGUtPnNlbGVjdG9yVGV4dCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU3R5bGVzaGVldFJ1bGVTZXQ6OnNl
dFNlbGVjdG9yVGV4dEZvclJ1bGUoY29uc3QgQ1NTSWQmIGlkLCBjb25zdCBTdHJpbmcmIHNlbGVj
dG9yVGV4dCkKK3sKKyAgICBDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRm9ySWQoaWQpOworICAg
IGlmICghcnVsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ1NTU3R5bGVTaGVldCog
c3R5bGVTaGVldCA9IHJ1bGUtPnBhcmVudFN0eWxlU2hlZXQoKTsKKyAgICBpZiAoIXN0eWxlU2hl
ZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJ1bGUtPnNldFNlbGVjdG9yVGV4dChz
ZWxlY3RvclRleHQpOworICAgIFJlZlB0cjxDU1NSdWxlU291cmNlRGF0YT4gc291cmNlRGF0YSA9
IHNvdXJjZURhdGFGb3JSdWxlKCpydWxlKTsKKyAgICBpZiAoIXNvdXJjZURhdGEpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIFN0cmluZyBzdHlsZXNoZWV0VGV4dCA9IHBhcnNlZFJ1bGVT
ZXREYXRhKCkuc291cmNlVGV4dCgpOworICAgIHN0eWxlc2hlZXRUZXh0LnJlcGxhY2Uoc291cmNl
RGF0YS0+cnVsZUhlYWRlclJhbmdlLnN0YXJ0LCBzb3VyY2VEYXRhLT5ydWxlSGVhZGVyUmFuZ2Uu
bGVuZ3RoKCksIHNlbGVjdG9yVGV4dCk7CisgICAgcGF0Y2hTdHlsZXNoZWV0VGV4dChzdHlsZXNo
ZWV0VGV4dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBDU1NQYXJzZXJDb250ZXh0
IHBhcnNlckNvbnRleHRGb3JEb2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQpCit7CisgICAgcmV0
dXJuIGRvY3VtZW50ID8gQ1NTUGFyc2VyQ29udGV4dCgqZG9jdW1lbnQpIDogc3RyaWN0Q1NTUGFy
c2VyQ29udGV4dCgpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1N0eWxlUnVsZVNlbGVjdG9yKERv
Y3VtZW50KiBkb2N1bWVudCwgY29uc3QgU3RyaW5nJiBzZWxlY3RvcikKK3sKKyAgICBDU1NTZWxl
Y3Rvckxpc3Qgc2VsZWN0b3JMaXN0OworICAgIENTU1BhcnNlciBwYXJzZXIocGFyc2VyQ29udGV4
dEZvckRvY3VtZW50KGRvY3VtZW50KSk7CisgICAgcGFyc2VyLnBhcnNlU2VsZWN0b3Ioc2VsZWN0
b3IsIHNlbGVjdG9yTGlzdCk7CisgICAgcmV0dXJuIHNlbGVjdG9yTGlzdC5pc1ZhbGlkKCk7Cit9
CisKK0NTU1N0eWxlUnVsZSogU3R5bGVzaGVldFJ1bGVTZXQ6OmFkZFJ1bGUoY29uc3QgU3RyaW5n
JiBzZWxlY3RvclRleHQsIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghY2hlY2tTdHls
ZVJ1bGVTZWxlY3RvcihtX3N0eWxlc2hlZXQtPm93bmVyRG9jdW1lbnQoKSwgc2VsZWN0b3JUZXh0
KSkgeworICAgICAgICBlYyA9IFNZTlRBWF9FUlI7CisgICAgICAgIHJldHVybiBudWxscHRyOwor
ICAgIH0KKworICAgIFN0cmluZyBzdHlsZXNoZWV0VGV4dCA9IGdldFRleHQoKTsKKworICAgIG1f
c3R5bGVzaGVldC0+YWRkUnVsZShzZWxlY3RvclRleHQsICIiLCBlYyk7CisgICAgaWYgKGVjKQor
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBBU1NFUlQobV9zdHlsZXNoZWV0LT5sZW5ndGgo
KSk7CisKKyAgICB1bnNpZ25lZCBsYXN0UnVsZU9yZGluYWwgPSBtX3N0eWxlc2hlZXQtPmxlbmd0
aCgpIC0gMTsKKyAgICBDU1NSdWxlKiBydWxlID0gbV9zdHlsZXNoZWV0LT5pdGVtKGxhc3RSdWxl
T3JkaW5hbCk7CisgICAgaWYgKCFpczxDU1NTdHlsZVJ1bGU+KHJ1bGUpKSB7CisgICAgICAgIC8v
IFdoYXQgd2UganVzdCBhZGRlZCBoYXMgdG8gYmUgYSBDU1NTdHlsZVJ1bGUgLSB3ZSBjYW5ub3Qg
aGFuZGxlIG90aGVyIHR5cGVzIG9mIHJ1bGVzIHlldC4KKyAgICAgICAgLy8gSWYgaXQgaXMgbm90
IGEgc3R5bGUgcnVsZSwgcHJldGVuZCB3ZSBuZXZlciB0b3VjaGVkIHRoZSBzdHlsZXNoZWV0Lgor
ICAgICAgICBtX3N0eWxlc2hlZXQtPmRlbGV0ZVJ1bGUobGFzdFJ1bGVPcmRpbmFsLCBBU1NFUlRf
Tk9fRVhDRVBUSU9OKTsKKyAgICAgICAgZWMgPSBTWU5UQVhfRVJSOworICAgICAgICByZXR1cm4g
bnVsbHB0cjsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyIHBhdGNoZWRTdHlsZXNoZWV0VGV4
dDsKKyAgICBwYXRjaGVkU3R5bGVzaGVldFRleHQuYXBwZW5kKHN0eWxlc2hlZXRUZXh0KTsKKwor
ICAgIGlmICghcGF0Y2hlZFN0eWxlc2hlZXRUZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcGF0Y2hl
ZFN0eWxlc2hlZXRUZXh0LmFwcGVuZCgnXG4nKTsKKworICAgIHBhdGNoZWRTdHlsZXNoZWV0VGV4
dC5hcHBlbmQoc2VsZWN0b3JUZXh0KTsKKyAgICBwYXRjaGVkU3R5bGVzaGVldFRleHQuYXBwZW5k
TGl0ZXJhbCgiIHt9Iik7CisKKyAgICBwYXRjaFN0eWxlc2hlZXRUZXh0KHBhdGNoZWRTdHlsZXNo
ZWV0VGV4dC50b1N0cmluZygpKTsKKworICAgIHJldHVybiBkb3duY2FzdDxDU1NTdHlsZVJ1bGU+
KHJ1bGUpOworfQorCitib29sIFN0eWxlc2hlZXRSdWxlU2V0OjpkZWxldGVSdWxlKGNvbnN0IENT
U0lkJiBpZCwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgUmVmUHRyPENTU1N0eWxlUnVsZT4g
cnVsZSA9IHJ1bGVGb3JJZChpZCk7CisgICAgaWYgKCFydWxlKSB7CisgICAgICAgIGVjID0gTk9U
X0ZPVU5EX0VSUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBSZWZQdHI8Q1NT
UnVsZVNvdXJjZURhdGE+IHNvdXJjZURhdGEgPSBzb3VyY2VEYXRhRm9yUnVsZSgqcnVsZSk7Cisg
ICAgaWYgKCFzb3VyY2VEYXRhKSB7CisgICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENTU1N0eWxlU2hlZXQqIHN0eWxlU2hlZXQg
PSBydWxlLT5wYXJlbnRTdHlsZVNoZWV0KCk7CisgICAgc3R5bGVTaGVldC0+ZGVsZXRlUnVsZShp
ZC5ydWxlT3JkaW5hbCgpLCBlYyk7CisgICAgcnVsZSA9IG51bGxwdHI7IC8vIFRoZSBydWxlIGlz
IG5vIGxvbmdlciB2YWxpZCwgc28gZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZS4KKworICAgIGlmIChl
YykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU3RyaW5nIHN0eWxlc2hlZXRUZXh0ID0g
cGFyc2VkUnVsZVNldERhdGEoKS5zb3VyY2VUZXh0KCk7CisgICAgc3R5bGVzaGVldFRleHQucmVt
b3ZlKHNvdXJjZURhdGEtPnJ1bGVIZWFkZXJSYW5nZS5zdGFydCwgc291cmNlRGF0YS0+cnVsZUJv
ZHlSYW5nZS5lbmQgLSBzb3VyY2VEYXRhLT5ydWxlSGVhZGVyUmFuZ2Uuc3RhcnQgKyAxKTsKKwor
ICAgIHBhdGNoU3R5bGVzaGVldFRleHQoc3R5bGVzaGVldFRleHQpOworICAgIHJldHVybiB0cnVl
OworfQorCitDU1NTdHlsZVJ1bGUqIFN0eWxlc2hlZXRSdWxlU2V0OjpydWxlRm9ySWQoY29uc3Qg
Q1NTSWQmIGlkKQoreworICAgIFBhcnNlZFJ1bGVTZXREYXRhJiBwYXJzZWREYXRhID0gcGFyc2Vk
UnVsZVNldERhdGEoKTsKKyAgICBpZiAoaWQucnVsZU9yZGluYWwoKSA+PSBwYXJzZWREYXRhLmZs
YXR0ZW5lZFN0eWxlUnVsZXMoKS5zaXplKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisg
ICAgcmV0dXJuIHBhcnNlZERhdGEuZmxhdHRlbmVkU3R5bGVSdWxlcygpLmF0KGlkLnJ1bGVPcmRp
bmFsKCkpLmdldCgpOworfQorCitEb2N1bWVudCogU3R5bGVzaGVldFJ1bGVTZXQ6Om93bmVyRG9j
dW1lbnQoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0eWxlc2hlZXQtPm93bmVyRG9jdW1lbnQo
KTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFBhcnNlZFJ1bGVTZXREYXRhPiBTdHlsZXNoZWV0UnVs
ZVNldDo6b3JpZ2luYWxTb3VyY2VEYXRhKCkKK3sKKyAgICByZXR1cm4gUGFyc2VkUnVsZVNldERh
dGE6OmNyZWF0ZSgqdGhpcyk7Cit9CisKK2Jvb2wgU3R5bGVzaGVldFJ1bGVTZXQ6OnN0eWxlU2hl
ZXRNdXRhdGVkKCkKK3sKKyAgICByZXR1cm4gbV9zdHlsZXNoZWV0LT5oYWRSdWxlc011dGF0aW9u
KCk7Cit9CisKK2Jvb2wgU3R5bGVzaGVldFJ1bGVTZXQ6OnNldFRleHRGb3JTdHlsZShDU1NTdHls
ZURlY2xhcmF0aW9uJiBzdHlsZSwgY29uc3QgU3RyaW5nJiB0ZXh0KQoreworICAgIFN0cmluZyBw
YXRjaGVkU3R5bGVTaGVldFRleHQ7CisgICAgaWYgKCFnZXRUZXh0V2l0aFBhdGNoZWRTdHlsZShz
dHlsZSwgdGV4dCwgcGF0Y2hlZFN0eWxlU2hlZXRUZXh0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKGlkRm9yU3R5bGUoc3R5bGUpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAgICBzdHlsZS5zZXRDc3NUZXh0KHRl
eHQsIGVjKTsKKyAgICBpZiAoZWMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbW1p
dFJ1bGVTZXRDaGFuZ2UoUGFyc2VkUnVsZVNldERhdGE6OmNyZWF0ZVdpdGhUZXh0KCp0aGlzLCBw
YXRjaGVkU3R5bGVTaGVldFRleHQpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHls
ZXNoZWV0UnVsZVNldDo6Z2V0VGV4dFdpdGhQYXRjaGVkU3R5bGUoQ1NTU3R5bGVEZWNsYXJhdGlv
biYgc3R5bGUsIGNvbnN0IFN0cmluZyYgbmV3U3R5bGVUZXh0LCBTdHJpbmcmIHJlc3VsdCkKK3sK
KyAgICBSZWZQdHI8Q1NTUnVsZVNvdXJjZURhdGE+IHNvdXJjZURhdGEgPSBzb3VyY2VEYXRhRm9y
U3R5bGUoc3R5bGUpOworICAgIGlmICghc291cmNlRGF0YSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgdW5zaWduZWQgYm9keVN0YXJ0ID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5z
dGFydDsKKyAgICB1bnNpZ25lZCBib2R5RW5kID0gc291cmNlRGF0YS0+cnVsZUJvZHlSYW5nZS5l
bmQ7CisgICAgQVNTRVJUKGJvZHlTdGFydCA8PSBib2R5RW5kKTsKKworICAgIFN0cmluZyBzb3Vy
Y2VUZXh0ID0gcGFyc2VkUnVsZVNldERhdGEoKS5zb3VyY2VUZXh0KCk7CisgICAgQVNTRVJUX1dJ
VEhfU0VDVVJJVFlfSU1QTElDQVRJT04oYm9keUVuZCA8PSBzb3VyY2VUZXh0Lmxlbmd0aCgpKTsg
Ly8gYm9keUVuZCBpcyBleGNsdXNpdmUKKworICAgIHNvdXJjZVRleHQucmVwbGFjZShib2R5U3Rh
cnQsIGJvZHlFbmQgLSBib2R5U3RhcnQsIG5ld1N0eWxlVGV4dCk7CisgICAgcmVzdWx0ID0gc291
cmNlVGV4dDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6
b3JpZ2luYWxTb3VyY2VUZXh0KFN0cmluZyYgcmVzdWx0KSBjb25zdAoreworICAgIHJldHVybiBp
bmxpbmVTdHlsZXNoZWV0VGV4dChyZXN1bHQpIHx8IHJlc291cmNlU3R5bGVzaGVldFRleHQocmVz
dWx0KTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6aW5saW5lU3R5bGVzaGVldFRleHQo
U3RyaW5nJiByZXN1bHQpIGNvbnN0Cit7CisgICAgTm9kZSogb3duZXJOb2RlID0gbV9zdHlsZXNo
ZWV0LT5vd25lck5vZGUoKTsKKyAgICBpZiAoIWlzPEVsZW1lbnQ+KG93bmVyTm9kZSkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIEVsZW1lbnQmIG93bmVyRWxlbWVudCA9IGRvd25jYXN0
PEVsZW1lbnQ+KCpvd25lck5vZGUpOworICAgIGlmICghaXM8SFRNTFN0eWxlRWxlbWVudD4ob3du
ZXJFbGVtZW50KSAmJiAhaXM8U1ZHU3R5bGVFbGVtZW50Pihvd25lckVsZW1lbnQpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXN1bHQgPSBvd25lckVsZW1lbnQudGV4dENvbnRlbnQo
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZXNoZWV0UnVsZVNldDo6cmVzb3Vy
Y2VTdHlsZXNoZWV0VGV4dChTdHJpbmcmIHJlc3VsdCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmln
aW4gPT0gU3R5bGVTaGVldE9yaWdpbjo6VXNlciB8fCBtX29yaWdpbiA9PSBTdHlsZVNoZWV0T3Jp
Z2luOjpVc2VyQWdlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghb3duZXJE
b2N1bWVudCgpIHx8ICFvd25lckRvY3VtZW50KCktPmZyYW1lKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFN0cmluZyBlcnJvcjsKKyAgICBib29sIGJhc2U2NEVuY29kZWQ7CisgICAg
SW5zcGVjdG9yUGFnZUFnZW50OjpyZXNvdXJjZUNvbnRlbnQoZXJyb3IsIG93bmVyRG9jdW1lbnQo
KS0+ZnJhbWUoKSwgVVJMKFBhcnNlZFVSTFN0cmluZywgbV9zdHlsZXNoZWV0LT5ocmVmKCkpLCAm
cmVzdWx0LCAmYmFzZTY0RW5jb2RlZCk7CisgICAgcmV0dXJuIGVycm9yLmlzRW1wdHkoKSAmJiAh
YmFzZTY0RW5jb2RlZDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmggYi9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXQuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZkNjdjCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvclN0eWxlc2hlZXRSdWxlU2V0LmgK
QEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEluc3BlY3RvclN0eWxl
c2hlZXRSdWxlU2V0X2gKKyNkZWZpbmUgSW5zcGVjdG9yU3R5bGVzaGVldFJ1bGVTZXRfaAorCisj
aW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5o
IgorI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NJZC5o
IgorI2luY2x1ZGUgIkluc3BlY3RvclN0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkluc3BlY3RvclN0
eWxlUnVsZVNldC5oIgorI2luY2x1ZGUgPGluc3BlY3Rvci9JbnNwZWN0b3JQcm90b2NvbE9iamVj
dHMuaD4KKyNpbmNsdWRlIDxpbnNwZWN0b3IvSW5zcGVjdG9yVmFsdWVzLmg+CisjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9S
ZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVHlwZUNhc3RzLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCitzdHJ1Y3QgUGFyc2VkUnVs
ZVNldERhdGE7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIENTU1J1bGVMaXN0OworY2xh
c3MgQ1NTU2VsZWN0b3I7CitjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOworY2xhc3MgQ1NTU3R5
bGVSdWxlOworY2xhc3MgQ1NTU3R5bGVTaGVldDsKK2NsYXNzIERvY3VtZW50OworY2xhc3MgRWxl
bWVudDsKK2NsYXNzIEluc3BlY3RvclBhZ2VBZ2VudDsKKworc3RydWN0IENTU1J1bGVTb3VyY2VE
YXRhOworfQorCituYW1lc3BhY2UgSW5zcGVjdG9yIHsKKworY2xhc3MgU3R5bGVSdWxlOworY2xh
c3MgU3R5bGVSdWxlU2V0OwordHlwZWRlZiBTdHJpbmcgRXJyb3JTdHJpbmc7CisKK2VudW0gY2xh
c3MgU3R5bGVTaGVldE9yaWdpbiB7CisgICAgSW5zcGVjdG9yLAorICAgIFVzZXJBZ2VudCwKKyAg
ICBVc2VyLAorICAgIEF1dGhvcgorfTsKKworZW51bSBjbGFzcyBNZWRpYUxpc3RTb3VyY2Ugewor
ICAgIExpbmtlZFNoZWV0LAorICAgIElubGluZVNoZWV0LAorICAgIE1lZGlhUnVsZSwKKyAgICBJ
bXBvcnRSdWxlCit9OworCitjbGFzcyBTdHlsZXNoZWV0UnVsZVNldCA6IHB1YmxpYyBTdHlsZVJ1
bGVTZXQgeworcHVibGljOgorICAgIGNsYXNzIExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIExpc3RlbmVyKCkgeyB9CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgeyB9CisgICAg
ICAgIHZpcnR1YWwgdm9pZCBzdHlsZVNoZWV0Q2hhbmdlZChTdHlsZXNoZWV0UnVsZVNldCYpID0g
MDsKKyAgICB9OworCisgICAgc3RhdGljIFJlZjxTdHlsZXNoZWV0UnVsZVNldD4gY3JlYXRlKFJl
ZjxXZWJDb3JlOjpDU1NTdHlsZVNoZWV0PiYmLCBTdHlsZVNoZWV0T3JpZ2luLCBjb25zdCBTdHJp
bmcmIGRvY3VtZW50VVJMLCBMaXN0ZW5lciopOworICAgIHZpcnR1YWwgflN0eWxlc2hlZXRSdWxl
U2V0KCk7CisKKyAgICAvLyBTdHlsZVJ1bGVTZXQgQVBJCisgICAgdmlydHVhbCBib29sIGlzU3R5
bGVzaGVldCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIHZv
aWQgcmVwbGFjZVRleHQoY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0
ZDo6dW5pcXVlX3B0cjxQYXJzZWRSdWxlU2V0RGF0YT4gb3JpZ2luYWxTb3VyY2VEYXRhKCkgb3Zl
cnJpZGU7CisgICAgdmlydHVhbCBXZWJDb3JlOjpEb2N1bWVudCogb3duZXJEb2N1bWVudCgpIGNv
bnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJ1bGVTZXRDaGFuZ2VkKCkg
b3ZlcnJpZGU7CisKKyAgICAvLyBTdHlsZXNoZWV0UnVsZVNldCBBUEkKKyAgICBTdHJpbmcgZmlu
YWxVUkwoKSBjb25zdDsKKyAgICBTdHJpbmcgdGl0bGUoKSBjb25zdDsKKyAgICBTdHlsZVNoZWV0
T3JpZ2luIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9CisgICAgYm9vbCBpc0Vu
YWJsZWQoKSBjb25zdDsKKyAgICBib29sIG9yaWdpbmFsU291cmNlVGV4dChTdHJpbmcmIHJlc3Vs
dCkgY29uc3Q7CisgICAgYm9vbCBjYW5CaW5kKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW4gIT0g
U3R5bGVTaGVldE9yaWdpbjo6VXNlckFnZW50ICYmIG1fb3JpZ2luICE9IFN0eWxlU2hlZXRPcmln
aW46OlVzZXI7IH0KKworICAgIGJvb2wgc2VsZWN0b3JUZXh0Rm9yUnVsZShjb25zdCBDU1NJZCYs
IFN0cmluZyYgcmVzdWx0KTsKKyAgICBib29sIHNldFNlbGVjdG9yVGV4dEZvclJ1bGUoY29uc3Qg
Q1NTSWQmLCBjb25zdCBTdHJpbmcmIHNlbGVjdG9yVGV4dCk7CisKKyAgICBXZWJDb3JlOjpDU1NT
dHlsZVJ1bGUqIGFkZFJ1bGUoY29uc3QgU3RyaW5nJiBzZWxlY3RvciwgV2ViQ29yZTo6RXhjZXB0
aW9uQ29kZSYpOworICAgIGJvb2wgZGVsZXRlUnVsZShjb25zdCBDU1NJZCYsIFdlYkNvcmU6OkV4
Y2VwdGlvbkNvZGUmKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IGJvb2wgd2l0
aFN0eWxlRm9ySWQoY29uc3QgQ1NTSWQmLCBjb25zdCBGdW5jdG9yJik7CisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgRnVuY3Rvcj4gYm9vbCB3aXRoUnVsZUZvcklkKGNvbnN0IENTU0lkJiwgY29uc3Qg
RnVuY3RvciYpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IHR5cGVuYW1lIEZ1bmN0
b3I6OlJldHVyblR5cGUgZm9yRWFjaFN0eWxlKEZ1bmN0b3ImKTsKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBGdW5jdG9yPiB0eXBlbmFtZSBGdW5jdG9yOjpSZXR1cm5UeXBlIGZvckVhY2hSdWxlKEZ1
bmN0b3ImKTsKKworICAgIFdlYkNvcmU6OkNTU1N0eWxlUnVsZSogcnVsZUZvcklkKGNvbnN0IENT
U0lkJik7CisKK3Byb3RlY3RlZDoKKyAgICBTdHlsZXNoZWV0UnVsZVNldChSZWY8V2ViQ29yZTo6
Q1NTU3R5bGVTaGVldD4mJiBwYWdlU3R5bGVTaGVldCwgU3R5bGVTaGVldE9yaWdpbiwgY29uc3Qg
U3RyaW5nJiBkb2N1bWVudFVSTCwgTGlzdGVuZXIqKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgUGFy
c2VkUnVsZVNldERhdGE7CisgICAgV2ViQ29yZTo6Q1NTU3R5bGVTaGVldCYgcGFnZVN0eWxlc2hl
ZXQoKSB7IHJldHVybiBtX3N0eWxlc2hlZXQuZ2V0KCk7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2V0
VGV4dEZvclN0eWxlKFdlYkNvcmU6OkNTU1N0eWxlRGVjbGFyYXRpb24mLCBjb25zdCBTdHJpbmcm
KSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgYm9vbCBzdHlsZVNoZWV0TXV0YXRlZCgpOworICAg
IGJvb2wgZ2V0VGV4dFdpdGhQYXRjaGVkU3R5bGUoV2ViQ29yZTo6Q1NTU3R5bGVEZWNsYXJhdGlv
biYsIGNvbnN0IFN0cmluZyYgbmV3U3R5bGVUZXh0LCBTdHJpbmcmIHJlc3VsdCk7CisgICAgYm9v
bCByZXNvdXJjZVN0eWxlc2hlZXRUZXh0KFN0cmluZyYgcmVzdWx0KSBjb25zdDsKKyAgICBib29s
IGlubGluZVN0eWxlc2hlZXRUZXh0KFN0cmluZyYgcmVzdWx0KSBjb25zdDsKKworICAgIC8vIE9u
bHkgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IHdoZW4gYSBydWxlIGhhcyBiZWVuIGFkZGVkLCByZW1v
dmVkLCBvciBtb2RpZmllZC4gSWYgdGhlIGVudGlyZQorICAgIC8vIHN0eWxlc2hlZXQgY29udGVu
dHMgaGF2ZSBiZWVuIGNoYW5nZWQsIHVzZSByZXBsYWNlVGV4dCgpIHdoaWNoIHJlY3JlYXRlcyBh
bGwgQ1NTT00gd3JhcHBlcnMKKyAgICAvLyBhbmQgdXBkYXRlcyB0aGUgU3R5bGVTaGVldENvbnRl
bnRzIGJhY2tpbmcgc3RvcmUgdG8gaG9sZCB0aGUgbmV3IHN0eWxlc2hlZXQgdGV4dC4KKyAgICB2
b2lkIHBhdGNoU3R5bGVzaGVldFRleHQoY29uc3QgU3RyaW5nJik7CisKKyAgICBSZWY8V2ViQ29y
ZTo6Q1NTU3R5bGVTaGVldD4gbV9zdHlsZXNoZWV0OworICAgIFN0eWxlU2hlZXRPcmlnaW4gbV9v
cmlnaW47CisgICAgU3RyaW5nIG1fZG9jdW1lbnRVUkw7CisgICAgTGlzdGVuZXIqIG1fbGlzdGVu
ZXI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgoraW5saW5lIGJvb2wgU3R5bGVz
aGVldFJ1bGVTZXQ6OndpdGhTdHlsZUZvcklkKGNvbnN0IENTU0lkJiBpZGVudGlmaWVyLCBjb25z
dCBGdW5jdG9yJiBmdW5jdG9yKQoreworICAgIFdlYkNvcmU6OkNTU1N0eWxlUnVsZSogcnVsZSA9
IHJ1bGVGb3JJZChpZGVudGlmaWVyKTsKKyAgICBpZiAoIXJ1bGUpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFN0eWxlRGVjbGFyYXRpb24gc3R5bGUoaWRlbnRpZmllciwgcnVsZS0+c3R5
bGUoKSwgdGhpcyk7CisgICAgZnVuY3RvcihzdHlsZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CitpbmxpbmUgYm9vbCBTdHlsZXNoZWV0UnVsZVNl
dDo6d2l0aFJ1bGVGb3JJZChjb25zdCBDU1NJZCYgaWRlbnRpZmllciwgY29uc3QgRnVuY3RvciYg
ZnVuY3RvcikKK3sKKyAgICBXZWJDb3JlOjpDU1NTdHlsZVJ1bGUqIGNzc1J1bGUgPSBydWxlRm9y
SWQoaWRlbnRpZmllcik7CisgICAgaWYgKCFjc3NSdWxlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBJbnNwZWN0b3I6OlN0eWxlUnVsZSBydWxlKGlkZW50aWZpZXIsICpjc3NSdWxlLCB0
aGlzKTsKKyAgICBmdW5jdG9yKHJ1bGUpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0
ZTx0eXBlbmFtZSBGdW5jdG9yPgoraW5saW5lIHR5cGVuYW1lIEZ1bmN0b3I6OlJldHVyblR5cGUg
U3R5bGVzaGVldFJ1bGVTZXQ6OmZvckVhY2hTdHlsZShGdW5jdG9yJiBmdW5jdG9yKQoreworICAg
IGF1dG8gcnVsZUxpc3QgPSBwYXJzZWRSdWxlU2V0RGF0YSgpLmZsYXR0ZW5lZFN0eWxlUnVsZXMo
KTsKKyAgICBmb3IgKHNpemVfdCBvcmRpbmFsID0gMDsgb3JkaW5hbCA8IHJ1bGVMaXN0LnNpemUo
KTsgKytvcmRpbmFsKSB7CisgICAgICAgIFJlZlB0cjxXZWJDb3JlOjpDU1NTdHlsZVJ1bGU+IHJ1
bGUgPSBydWxlTGlzdC5hdChvcmRpbmFsKTsKKyAgICAgICAgU3R5bGVEZWNsYXJhdGlvbiBzdHls
ZShDU1NJZChpZGVudGlmaWVyKCksIG9yZGluYWwpLCBydWxlLT5zdHlsZSgpLCB0aGlzKTsKKyAg
ICAgICAgZnVuY3RvcihzdHlsZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0b3IucmV0dXJu
VmFsdWUoKTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgoraW5saW5lIHR5cGVu
YW1lIEZ1bmN0b3I6OlJldHVyblR5cGUgU3R5bGVzaGVldFJ1bGVTZXQ6OmZvckVhY2hSdWxlKEZ1
bmN0b3ImIGZ1bmN0b3IpCit7CisgICAgYXV0byBydWxlTGlzdCA9IHBhcnNlZFJ1bGVTZXREYXRh
KCkuZmxhdHRlbmVkU3R5bGVSdWxlcygpOworICAgIGZvciAoc2l6ZV90IG9yZGluYWwgPSAwOyBv
cmRpbmFsIDwgcnVsZUxpc3Quc2l6ZSgpOyArK29yZGluYWwpIHsKKyAgICAgICAgUmVmUHRyPFdl
YkNvcmU6OkNTU1N0eWxlUnVsZT4gY3NzUnVsZSA9IHJ1bGVMaXN0LmF0KG9yZGluYWwpOworICAg
ICAgICBpZiAoIWNzc1J1bGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBJbnNw
ZWN0b3I6OlN0eWxlUnVsZSBydWxlKENTU0lkKGlkZW50aWZpZXIoKSwgb3JkaW5hbCksICpjc3NS
dWxlLCB0aGlzKTsKKyAgICAgICAgZnVuY3RvcihydWxlKTsKKyAgICB9CisKKyAgICByZXR1cm4g
ZnVuY3Rvci5yZXR1cm5WYWx1ZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBJbnNwZWN0b3IKKwor
U1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihJbnNwZWN0b3I6OlN0eWxlc2hlZXRSdWxlU2V0
KQorc3RhdGljIGJvb2wgaXNUeXBlKGNvbnN0IEluc3BlY3Rvcjo6U3R5bGVSdWxlU2V0JiBydWxl
U2V0KSB7IHJldHVybiBydWxlU2V0LmlzU3R5bGVzaGVldCgpOyB9CitTUEVDSUFMSVpFX1RZUEVf
VFJBSVRTX0VORCgpCisKKyNlbmRpZiAvLyBJbnNwZWN0b3JTdHlsZXNoZWV0UnVsZVNldF9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>