<?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>126044</bug_id>
          
          <creation_ts>2013-12-19 20:37:17 -0800</creation_ts>
          <short_desc>Create a skeleton for CSS Selector code generation</short_desc>
          <delta_ts>2013-12-22 16:42:53 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Benjamin Poulain">benjamin</reporter>
          <assigned_to name="Benjamin Poulain">benjamin</assigned_to>
          <cc>barraclough</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eflews.bot</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ggaren</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kangil.han</cc>
    
    <cc>koivisto</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>961711</commentid>
    <comment_count>0</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-12-19 20:37:17 -0800</bug_when>
    <thetext>Create a skeleton for CSS Selector code generation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>961712</commentid>
    <comment_count>1</comment_count>
      <attachid>219722</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-12-19 20:41:14 -0800</bug_when>
    <thetext>Created attachment 219722
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>961714</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-12-19 20:43:11 -0800</bug_when>
    <thetext>Attachment 219722 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source/JavaScriptCore/assembler/LinkBuffer.h&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/cssjit/CSSSelectorCompiler.cpp&apos;, u&apos;Source/WebCore/cssjit/CSSSelectorCompiler.h&apos;, u&apos;Source/WebCore/dom/Element.cpp&apos;, u&apos;Source/WebCore/dom/Element.h&apos;, u&apos;Source/WebCore/dom/Node.h&apos;, u&apos;Source/WebCore/dom/QualifiedName.h&apos;, &apos;--commit-queue&apos;]&quot; exit_code: 1
ERROR: Source/JavaScriptCore/assembler/LinkBuffer.h:323:  Wrong number of spaces before statement. (expected: 9)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/assembler/LinkBuffer.h:326:  Wrong number of spaces before statement. (expected: 9)  [whitespace/indent] [4]
Total errors found: 2 in 10 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>961726</commentid>
    <comment_count>3</comment_count>
      <attachid>219722</attachid>
    <who name="EFL EWS Bot">eflews.bot</who>
    <bug_when>2013-12-19 21:23:59 -0800</bug_when>
    <thetext>Comment on attachment 219722
Patch

Attachment 219722 did not pass efl-wk2-ews (efl-wk2):
Output: http://webkit-queues.appspot.com/results/50208169</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>961760</commentid>
    <comment_count>4</comment_count>
      <attachid>219722</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2013-12-19 23:32:02 -0800</bug_when>
    <thetext>Comment on attachment 219722
Patch

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

Looks good, but I haven&apos;t reviewed the css logic well enough to r+, would probably be good if someone else looked over this too.  If you don&apos;t get any takers I&apos;ll give it a second pass.

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:659
&gt; +    m_assembler.jump().linkTo(m_indirectAdjacentEntryPoint, &amp;m_assembler);

-&gt;
    m_assembler.jump(m_indirectAdjacentEntryPoint);

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:668
&gt; +    m_assembler.jump().linkTo(m_descendantEntryPoint, &amp;m_assembler);

-&gt;
    m_assembler.jump(m_descendantEntryPoint);

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:731
&gt; +        failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, Assembler::Address(qualifiedNameImpl, QualifiedName::QualifiedNameImpl::namespaceMemoryOffset()), constantRegister));

I think you can do this in one line (get rid of the LocalRegister &amp; move) using:
    Jump branchPtr(RelationalCondition cond, Address left, TrustedImmPtr right)

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:739
&gt; +        failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, Assembler::Address(qualifiedNameImpl, QualifiedName::QualifiedNameImpl::localNameMemoryOffset()), constantRegister));

ditto

&gt; Source/WebCore/dom/Node.h:179
&gt; +#endif // ENABLE(CSS_SELECTOR_JIT)

Do we really need the compile guards for all these accessors? – I&apos;d remove them.
If you keep them, might be nice to merge these two #if/#endif blocks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>962050</commentid>
    <comment_count>5</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-12-20 14:19:56 -0800</bug_when>
    <thetext>Thanks for the review!

(In reply to comment #4)
&gt; &gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:731
&gt; &gt; +        failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, Assembler::Address(qualifiedNameImpl, QualifiedName::QualifiedNameImpl::namespaceMemoryOffset()), constantRegister));
&gt; 
&gt; I think you can do this in one line (get rid of the LocalRegister &amp; move) using:
&gt;     Jump branchPtr(RelationalCondition cond, Address left, TrustedImmPtr right)

This one was intentional.
    branchPtr(RelationalCondition cond, Address left, TrustedImmPtr right)
uses the scratch register of the MacroAssembler. Here all registers are handled through the register allocator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>962272</commentid>
    <comment_count>6</comment_count>
      <attachid>219722</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-12-21 14:23:09 -0800</bug_when>
    <thetext>Comment on attachment 219722
Patch

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

Looks great!

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:200
&gt; +    SelectorFragment fragment;

I like SelectorFragment. Maybe we should use the fragment terminology everywhere.

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:210
&gt; +        switch (selector-&gt;m_match) {
&gt; +        case CSSSelector::Tag:
&gt; +            ASSERT(!fragment.tagName);
&gt; +            fragment.tagName = &amp;(selector-&gt;tagQName());
&gt; +            break;
&gt; +        default:
&gt; +            goto CannotHandleSelector;
&gt; +        }

It would be better to list all match types instead of having a default.

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:235
&gt; +    return;
&gt; +
&gt; +CannotHandleSelector:
&gt; +    m_selectorFragments.clear();

I suspect this would read better if you factored the fragment initialisation to a function. You could avoid clumsy gotos.

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.cpp:693
&gt; +        m_stackAllocator.merge(std::move(successStack), std::move(adjacentTailStack), std::move(descendantTailStack));
&gt; +    } else if (fragment.backtrackingFlags &amp; BacktrackingFlag::DirectAdjacentTail) {

You could do early returns instead of else.

&gt; Source/WebCore/cssjit/CSSSelectorCompiler.h:67
&gt; +namespace CSSSelectorCompiler {

I would prefer SelectorCompiler. It is not ambiguous and we try to use CSS* prefix to refer to CSSOM types only. Same with CSSSelectorCompilationStatus.

&gt; Source/WebCore/dom/Element.h:377
&gt; +    static void setChildrenAffectedByDirectAdjacentRules(Element*);
&gt;      void setChildrenAffectedByDirectAdjacentRules() { setFlag(ChildrenAffectedByDirectAdjacentRulesFlag); }
&gt; -    void setChildrenAffectedByForwardPositionalRules();
&gt; +    static void setChildrenAffectedByForwardPositionalRules(Element*);
&gt; +    void setChildrenAffectedByForwardPositionalRules() { setChildrenAffectedByForwardPositionalRules(this); }

Should really eliminate the remaining side effects at some point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>962377</commentid>
    <comment_count>7</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-12-22 16:42:13 -0800</bug_when>
    <thetext>Committed r160983: &lt;http://trac.webkit.org/changeset/160983&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>962378</commentid>
    <comment_count>8</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-12-22 16:42:53 -0800</bug_when>
    <thetext>Landed :)
I left the gotos in because they will go away later when we handle more cases.

Thanks for the reviews!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>219722</attachid>
            <date>2013-12-19 20:41:14 -0800</date>
            <delta_ts>2013-12-21 14:23:09 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-126044-20131219204113.patch</filename>
            <type>text/plain</type>
            <size>57049</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTYwODkyCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBi
YmY1OWM5ZWQ5YjM1ZDdmMmY4ZjEwNjA5ZjdjOTFjZmExNTBkYzYwLi5kZmY4Yjc4NTRiNGQyODk2
MmViOGJlNTNmMDg0MjMzMTM1NjNlNTYxIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxNCBAQAorMjAxMy0xMi0xOSAgQmVuamFtaW4gUG91bGFpbiAgPGJlbmphbWluQHdlYmtp
dC5vcmc+CisKKyAgICAgICAgQ3JlYXRlIGEgc2tlbGV0b24gZm9yIENTUyBTZWxlY3RvciBjb2Rl
IGdlbmVyYXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTEyNjA0NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgICogYXNzZW1ibGVyL0xpbmtCdWZmZXIuaDoKKyAgICAgICAgQWRkIGEgbmV3IG93bmVyIFVJ
RCBmb3IgY29kZSBjb21waWxlZCBmb3IgQ1NTLgorICAgICAgICBFeHBvcnQgdGhlIHN5bWJvbHMg
bmVlZGVkIHRvIGxpbmsgY29kZSBmcm9tIFdlYkNvcmUuCisKIDIwMTMtMTItMTkgIEpvc2VwaCBQ
ZWNvcmFybyAgPHBlY29yYXJvQGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBB
ZGQgSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmRlYnVnZ2FibGVUeXBlIHRvIGxldCB0aGUgZnJvbnRl
bmQga25vdyBpdCdzIGJhY2tlbmQgaXMgSmF2YVNjcmlwdCBvciBXZWIKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA2
NWVhMmYwZDcxZmRlMGVlOTEwZjk0NDc5ZjFmNjZlNTJhMDAyODAyLi43NWNiNjBjMDJjMzY1Mjg3
NzlhN2YyNGQ0MWY1MTMwMzA4ZTJjNjFhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFu
Z2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsODggQEAKKzIw
MTMtMTItMTkgIEJlbmphbWluIFBvdWxhaW4gIDxicG91bGFpbkBhcHBsZS5jb20+CisKKyAgICAg
ICAgQ3JlYXRlIGEgc2tlbGV0b24gZm9yIENTUyBTZWxlY3RvciBjb2RlIGdlbmVyYXRpb24KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjA0NAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBDU1NDb21w
aWxlciwgd2hpY2ggcHJvdmlkZXMgdGhlIGJhc2ljIGluZnJhc3RydWN0dXJlIHRvIGNvbXBpbGUK
KyAgICAgICAgQ1NTIFNlbGVjdG9ycyBvbiB4ODZfNjQuCisKKyAgICAgICAgQ29tcGlsYXRpb24g
aGFwcGVucyBpbiB0d28gcGhhc2VzLgorICAgICAgICAxKSBUaGUgdmFyaW91cyBtYXRjaGluZyBh
bmQgcmVsYXRpb24gb2YgZWFjaCBDU1NTZWxlY3RvciBpcyBhZ2dyZWdhdGVkIGludG8gdW5pdHMK
KyAgICAgICAgICAgbWF0Y2hpbmcgYSBzaW5nbGUgZWxlbWVudDogU2VsZWN0b3JGcmFnbWVudC4K
KyAgICAgICAgICAgU2VsZWN0b3JGcmFnbWVudCBhbHNvIGtub3dzIGFib3V0IHRoZSByZWxhdGlv
bnMgYmV0d2VlbiBkaWZmZXJlbnQgZnJhZ21lbnRzLAorICAgICAgICAgICBhbmQgY29udGFpbnMg
YWxsIHRoZSBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFy
IGVsZW1lbnQuCisgICAgICAgIDIpIFRoZSBjb21waWxlciB0aGVuIGdvZXMgb3ZlciB0aGUgZnJh
Z21lbnRzLCBhbmQgZ2VuZXJhdGUgY29kZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KKyAgICAg
ICAgICAgb2YgZWFjaCBmcmFnbWVudC4KKworICAgICAgICBJdCB0aGUgY3VycmVudCBzdGF0ZSwg
U2VsZWN0b3JDb21waWxlciBvbmx5IGNvbXBpbGVzIHRoZSB0YWcgbWF0Y2hpbmcgc2VsZWN0b3Jz
IGFuZAorICAgICAgICBhbnkgb2YgdGhlIHJlbGF0aW9uIGJldHdlZW4gc2VsZWN0b3JzLgorCisg
ICAgICAgIERlcGVuZGluZyBvbiB0aGUgcmVsYXRpb24gYW5kIHBvc2l0aW9uIG9mIGEgZnJhZ21l
bnQsIGZhaWx1cmUgb24gdHJhdmVyc2FsIG9yIG1hdGNoaW5nCisgICAgICAgIGRvZXMgbm90IG5l
Y2Vzc2FyaWx5IGNhdXNlcyB0aGUgY29tcGxldGUgc2VsZWN0b3IuIEEgZmFpbHVyZSBjYW4gY2F1
c2UgbWF0Y2hpbmcgdG8KKyAgICAgICAgcmVzdW1lIGZyb20gdGhlIHBhcmVudCBvciB0aGUgc2li
bGluZyBvZiBhIHByZXZpb3VzbHkgdmlzaXN0ZWQgbm9kZS4KKyAgICAgICAgVGhlIGltcGxlbWVu
dGF0aW9uIG9mIHRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBCYWNrdHJhY2tpbmdBY3Rpb24uIElu
IGNhc2Ugb2YgZmFpbHVyZSwKKyAgICAgICAgdGhlIG5leHQgc3RhcnRpbmcgc3RhdGUgaXMgc2V0
dXAgYW5kIHRoZSBwcm9ncmFtIGNvdW50ZXIganVtcHMgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUK
KyAgICAgICAgc3RhcnRpbmcgcG9pbnQuCisKKyAgICAgICAgV2hlbiBiYWNrdHJhY2tpbmcsIHRo
ZSBtZXRob2QgdXNlZCB0byBzYXZlIHRoZSBzdGFydGluZyBwb2ludCBkZXBlbmRzIG9uIHRoZSB0
eXBlCisgICAgICAgIG9mIGJhY2t0cmFja2luZy4KKyAgICAgICAgVGhlIGNoaWxkL3BhcmVudCBy
ZWxhdGlvbiAoIj4iKSBpcyB2ZXJ5IGNvbW1vbiBzbyBpdCB1c2VzIGFuIGFkZGl0aW9uYWwgcmVn
aXN0ZXIgdG8ga2VlcAorICAgICAgICB0aGUgbmV4dCBzdGFydGluZyBwb2ludCAobV9kZXNjZW5k
YW50QmFja3RyYWNraW5nU3RhcnQpLgorICAgICAgICBUaGUgaW5kaXJlY3Qgc2libGluZyByZWxh
dGlvbiAoIn4iKSBpcyBtdWNoIGxlc3MgY29tbW9uIGFuZCB1c2VzIHRoZSBzdGFjayB0byBzYXZl
CisgICAgICAgIHRoZSBuZXh0IHN0YXJ0aW5nIHBvaW50LgorCisgICAgICAgICogV2ViQ29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNzc2ppdC9DU1NTZWxlY3RvckNv
bXBpbGVyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3RvckNvbXBpbGVy
OjpTZWxlY3RvckZyYWdtZW50OjpTZWxlY3RvckZyYWdtZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkNTU1NlbGVjdG9yQ29tcGlsZXI6OmNvbXBpbGVTZWxlY3Rvcik6CisgICAgICAgIChXZWJDb3Jl
OjpDU1NTZWxlY3RvckNvbXBpbGVyOjpmcmFnbWVudFJlbGF0aW9uRm9yU2VsZWN0b3JSZWxhdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3RvckNvbXBpbGVyOjpDU1NTZWxlY3RvckNv
ZGVHZW5lcmF0b3I6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcik6CisgICAgICAgIChXZWJDb3Jl
OjpDU1NTZWxlY3RvckNvbXBpbGVyOjpDU1NTZWxlY3RvckNvZGVHZW5lcmF0b3I6OmNvbXBpbGUp
OgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JDb21waWxlcjo6dXBkYXRlQ2hhaW5TdGF0
ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JDb21waWxlcjo6aXNGaXJzdEFuY2Vz
dG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OmlzRmlyc3RBZGph
Y2VudCk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3RvckNvbXBpbGVyOjppc0FmdGVyQ2hp
bGRSZWxhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3RvckNvbXBpbGVyOjpzb2x2
ZUJhY2t0cmFja2luZ0FjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3RvckNvbXBp
bGVyOjpyZXF1aXJlc0FkamFjZW50VGFpbCk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rv
ckNvbXBpbGVyOjpyZXF1aXJlc0Rlc2NlbmRhbnRUYWlsKToKKyAgICAgICAgKFdlYkNvcmU6OkNT
U1NlbGVjdG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Y29tcHV0ZUJhY2t0
cmFja2luZ0luZm9ybWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGls
ZXI6OnRlc3RJc0VsZW1lbnRGbGFnT25Ob2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVj
dG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVXYWxrVG9QYXJl
bnRFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OkNTU1Nl
bGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVQYXJlbnRFbGVtZW50VHJlZVdhbGtlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3RvckNvbXBpbGVyOjpDU1NTZWxlY3RvckNvZGVHZW5l
cmF0b3I6OmdlbmVyYXRlQW5jZXN0b3JUcmVlV2Fsa2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNT
U1NlbGVjdG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVXYWxr
VG9QcmV2aW91c0FkamFjZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGls
ZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVEaXJlY3RBZGphY2VudFRyZWVX
YWxrZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JDb21waWxlcjo6Q1NTU2VsZWN0
b3JDb2RlR2VuZXJhdG9yOjpnZW5lcmF0ZUluZGlyZWN0QWRqYWNlbnRUcmVlV2Fsa2VyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVy
YXRvcjo6bWFya1BhcmVudEVsZW1lbnRJZlJlc29sdmluZ1N0eWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6bGlua0Zh
aWx1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OkNTU1NlbGVj
dG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVBZGphY2VudEJhY2t0cmFja2luZ1RhaWwpOgorICAg
ICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JDb21waWxlcjo6Q1NTU2VsZWN0b3JDb2RlR2VuZXJh
dG9yOjpnZW5lcmF0ZURlc2NlbmRhbnRCYWNrdHJhY2tpbmdUYWlsKToKKyAgICAgICAgKFdlYkNv
cmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJh
dGVCYWNrdHJhY2tpbmdUYWlsc0lmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVj
dG9yQ29tcGlsZXI6OkNTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVFbGVtZW50TWF0
Y2hpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JDb21waWxlcjo6Q1NTU2VsZWN0
b3JDb2RlR2VuZXJhdG9yOjpnZW5lcmF0ZUVsZW1lbnRIYXNUYWdOYW1lKToKKyAgICAgICAgKiBj
c3NqaXQvQ1NTU2VsZWN0b3JDb21waWxlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNT
U1NlbGVjdG9yQ29tcGlsYXRpb25TdGF0dXM6OkNTU1NlbGVjdG9yQ29tcGlsYXRpb25TdGF0dXMp
OgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JDb21waWxhdGlvblN0YXR1czo6b3BlcmF0
b3IgU3RhdHVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yQ29tcGlsZXI6OnNpbXBs
ZVNlbGVjdG9yQ2hlY2tlckZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9y
Q29tcGlsZXI6OnNlbGVjdG9yQ2hlY2tlckZ1bmN0aW9uV2l0aENoZWNraW5nQ29udGV4dCk6Cisg
ICAgICAgICogZG9tL0VsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0
Q2hpbGRyZW5BZmZlY3RlZEJ5RGlyZWN0QWRqYWNlbnRSdWxlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50OjpzZXRDaGlsZHJlbkFmZmVjdGVkQnlGb3J3YXJkUG9zaXRpb25hbFJ1bGVzKToK
KyAgICAgICAgKiBkb20vRWxlbWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6dGFn
UU5hbWVNZW1vcnlPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0Q2hpbGRy
ZW5BZmZlY3RlZEJ5Rm9yd2FyZFBvc2l0aW9uYWxSdWxlcyk6CisgICAgICAgICogZG9tL05vZGUu
aDoKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OnBhcmVudE5vZGVNZW1vcnlPZmZzZXQpOgorICAg
ICAgICAoV2ViQ29yZTo6Tm9kZTo6cHJldmlvdXNTaWJsaW5nTWVtb3J5T2Zmc2V0KToKKyAgICAg
ICAgKFdlYkNvcmU6Ok5vZGU6Om5vZGVGbGFnc01lbW9yeU9mZnNldCk6CisgICAgICAgIChXZWJD
b3JlOjpOb2RlOjpmbGFnSXNFbGVtZW50KToKKyAgICAgICAgKiBkb20vUXVhbGlmaWVkTmFtZS5o
OgorICAgICAgICAoV2ViQ29yZTo6UXVhbGlmaWVkTmFtZTo6UXVhbGlmaWVkTmFtZUltcGw6Omxv
Y2FsTmFtZU1lbW9yeU9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWROYW1lOjpR
dWFsaWZpZWROYW1lSW1wbDo6bmFtZXNwYWNlTWVtb3J5T2Zmc2V0KToKKyAgICAgICAgKFdlYkNv
cmU6OlF1YWxpZmllZE5hbWU6OmltcGxNZW1vcnlPZmZzZXQpOgorCiAyMDEzLTEyLTE5ICBKb3Nl
cGggUGVjb3Jhcm8gIDxwZWNvcmFyb0BhcHBsZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3Rv
cjogQWRkIEluc3BlY3RvckZyb250ZW5kSG9zdC5kZWJ1Z2dhYmxlVHlwZSB0byBsZXQgdGhlIGZy
b250ZW5kIGtub3cgaXQncyBiYWNrZW5kIGlzIEphdmFTY3JpcHQgb3IgV2ViCmRpZmYgLS1naXQg
YS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL0xpbmtCdWZmZXIuaCBiL1NvdXJjZS9K
YXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTGlua0J1ZmZlci5oCmluZGV4IDBlMjMwNWVlNGVlN2U4
Zjk2MzRhMGJkN2Q4ZTNkNTA3YjE2NDUwM2UuLjhkNGNlNTIxZjI4NGU1ZGUzNDY5Y2VkODk2NGM5
ZWNjMDhlZjM1NzYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIv
TGlua0J1ZmZlci5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTGlua0J1
ZmZlci5oCkBAIC0zMyw2ICszMyw3IEBACiAKICNkZWZpbmUgR0xPQkFMX1RIVU5LX0lEIHJlaW50
ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PigtMSkpCiAjZGVmaW5lIFJF
R0VYUF9DT0RFX0lEIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90
PigtMikpCisjZGVmaW5lIENTU19DT0RFX0lEIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRp
Y19jYXN0PGludHB0cl90PigtMykpCiAKICNpbmNsdWRlICJKSVRDb21waWxhdGlvbkVmZm9ydC5o
IgogI2luY2x1ZGUgIk1hY3JvQXNzZW1ibGVyLmgiCkBAIC0yMzEsOCArMjMyLDggQEAgcHVibGlj
OgogICAgIC8vIGZpbmFsaXplQ29kZVdpdGhvdXREaXNhc3NlbWJseSgpIGRpcmVjdGx5IGlmIHlv
dSBoYXZlIHlvdXIgb3duIHdheSBvZgogICAgIC8vIGRpc3BsYXlpbmcgZGlzYXNzZW1ibHkuCiAg
ICAgCi0gICAgQ29kZVJlZiBmaW5hbGl6ZUNvZGVXaXRob3V0RGlzYXNzZW1ibHkoKTsKLSAgICBD
b2RlUmVmIGZpbmFsaXplQ29kZVdpdGhEaXNhc3NlbWJseShjb25zdCBjaGFyKiBmb3JtYXQsIC4u
LikgV1RGX0FUVFJJQlVURV9QUklOVEYoMiwgMyk7CisgICAgSlNfRVhQT1JUX1BSSVZBVEUgQ29k
ZVJlZiBmaW5hbGl6ZUNvZGVXaXRob3V0RGlzYXNzZW1ibHkoKTsKKyAgICBKU19FWFBPUlRfUFJJ
VkFURSBDb2RlUmVmIGZpbmFsaXplQ29kZVdpdGhEaXNhc3NlbWJseShjb25zdCBjaGFyKiBmb3Jt
YXQsIC4uLikgV1RGX0FUVFJJQlVURV9QUklOVEYoMiwgMyk7CiAKICAgICBDb2RlUHRyIHRyYW1w
b2xpbmVBdChMYWJlbCBsYWJlbCkKICAgICB7CkBAIC0yNjcsNyArMjY4LDcgQEAgcHJpdmF0ZToK
ICAgICB2b2lkIGFsbG9jYXRlKHNpemVfdCBpbml0aWFsU2l6ZSwgdm9pZCogb3duZXJVSUQsIEpJ
VENvbXBpbGF0aW9uRWZmb3J0KTsKICAgICB2b2lkIHNocmluayhzaXplX3QgbmV3U2l6ZSk7CiAK
LSAgICB2b2lkIGxpbmtDb2RlKHZvaWQqIG93bmVyVUlELCBKSVRDb21waWxhdGlvbkVmZm9ydCk7
CisgICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBsaW5rQ29kZSh2b2lkKiBvd25lclVJRCwgSklU
Q29tcGlsYXRpb25FZmZvcnQpOwogI2lmIEVOQUJMRShCUkFOQ0hfQ09NUEFDVElPTikKICAgICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgSW5zdHJ1Y3Rpb25UeXBlPgogICAgIHZvaWQgY29weUNvbXBhY3RB
bmRMaW5rQ29kZSh2b2lkKiBvd25lclVJRCwgSklUQ29tcGlsYXRpb25FZmZvcnQpOwpAQCAtMzE5
LDEwICszMjAsMTAgQEAgcHJpdmF0ZToKIC8vIGlzIHRydWUsIHNvIHlvdSBjYW4gaGlkZSBleHBl
bnNpdmUgZGlzYXNzZW1ibHktb25seSBjb21wdXRhdGlvbnMgaW5zaWRlIHRoZXJlLgogCiAjZGVm
aW5lIEZJTkFMSVpFX0NPREUobGlua0J1ZmZlclJlZmVyZW5jZSwgZGF0YUxvZ0ZBcmd1bWVudHNG
b3JIZWFkaW5nKSAgXAotICAgIEZJTkFMSVpFX0NPREVfSUYoT3B0aW9uczo6c2hvd0Rpc2Fzc2Vt
Ymx5KCksIGxpbmtCdWZmZXJSZWZlcmVuY2UsIGRhdGFMb2dGQXJndW1lbnRzRm9ySGVhZGluZykK
KyAgICBGSU5BTElaRV9DT0RFX0lGKEpTQzo6T3B0aW9uczo6c2hvd0Rpc2Fzc2VtYmx5KCksIGxp
bmtCdWZmZXJSZWZlcmVuY2UsIGRhdGFMb2dGQXJndW1lbnRzRm9ySGVhZGluZykKIAogI2RlZmlu
ZSBGSU5BTElaRV9ERkdfQ09ERShsaW5rQnVmZmVyUmVmZXJlbmNlLCBkYXRhTG9nRkFyZ3VtZW50
c0ZvckhlYWRpbmcpICBcCi0gICAgRklOQUxJWkVfQ09ERV9JRigoT3B0aW9uczo6c2hvd0Rpc2Fz
c2VtYmx5KCkgfHwgT3B0aW9uczo6c2hvd0RGR0Rpc2Fzc2VtYmx5KCkpLCBsaW5rQnVmZmVyUmVm
ZXJlbmNlLCBkYXRhTG9nRkFyZ3VtZW50c0ZvckhlYWRpbmcpCisgICAgRklOQUxJWkVfQ09ERV9J
RigoSlNDOjpPcHRpb25zOjpzaG93RGlzYXNzZW1ibHkoKSB8fCBPcHRpb25zOjpzaG93REZHRGlz
YXNzZW1ibHkoKSksIGxpbmtCdWZmZXJSZWZlcmVuY2UsIGRhdGFMb2dGQXJndW1lbnRzRm9ySGVh
ZGluZykKIAogfSAvLyBuYW1lc3BhY2UgSlNDCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCA0Y2M1NDE4NjYzOTFmYjM2MDRlMmRl
ZTEwZjJkMzAzNGUxZjFmYzZjLi4wMDliMzJmODM1MDY3ZmFlY2IyMGIzMWNkZjA3ZmU1M2EwOTli
ZjI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCkBAIC05MTIsNiArOTEyLDggQEAKIAkJMjZCOTk5OEYxODAzQUU3MjAwRDAxMTIxIC8q
IFJlZ2lzdGVyQWxsb2NhdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAyNkI5OTk4RTE4MDNBRTcyMDBEMDExMjEgLyogUmVnaXN0ZXJBbGxvY2F0b3Iu
aCAqLzsgfTsKIAkJMjZCOTk5OTExODAzQjNDOTAwRDAxMTIxIC8qIFN0YWNrQWxsb2NhdG9yLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNkI5OTk5MDE4
MDNCM0M5MDBEMDExMjEgLyogU3RhY2tBbGxvY2F0b3IuaCAqLzsgfTsKIAkJMjZCOTk5OTMxODAz
QjlEOTAwRDAxMTIxIC8qIEZ1bmN0aW9uQ2FsbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMjZCOTk5OTIxODAzQjlEOTAwRDAxMTIxIC8qIEZ1bmN0aW9u
Q2FsbC5oICovOyB9OworCQkyNkI5OTk5NjE4MDRENTQyMDBEMDExMjEgLyogQ1NTU2VsZWN0b3JD
b21waWxlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAyNkI5OTk5NDE4MDRENTQyMDBEMDExMjEgLyogQ1NTU2VsZWN0b3JDb21waWxlci5jcHAgKi87
IH07CisJCTI2Qjk5OTk3MTgwNEQ1NDIwMEQwMTEyMSAvKiBDU1NTZWxlY3RvckNvbXBpbGVyLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNkI5OTk5NTE4
MDRENTQyMDBEMDExMjEgLyogQ1NTU2VsZWN0b3JDb21waWxlci5oICovOyB9OwogCQkyNkMxNUNG
NjE4NTdFMTVEMDBGMTVDMDMgLyogUmVzb3VyY2VIYW5kbGVDRlVSTENvbm5lY3Rpb25EZWxlZ2F0
ZVdpdGhPcGVyYXRpb25RdWV1ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAyNkMxNUNGNDE4NTdFMTVEMDBGMTVDMDMgLyogUmVzb3VyY2VIYW5kbGVD
RlVSTENvbm5lY3Rpb25EZWxlZ2F0ZVdpdGhPcGVyYXRpb25RdWV1ZS5jcHAgKi87IH07CiAJCTI2
QzE1Q0Y3MTg1N0UxNUUwMEYxNUMwMyAvKiBSZXNvdXJjZUhhbmRsZUNGVVJMQ29ubmVjdGlvbkRl
bGVnYXRlV2l0aE9wZXJhdGlvblF1ZXVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAyNkMxNUNGNTE4NTdFMTVEMDBGMTVDMDMgLyogUmVzb3VyY2VIYW5k
bGVDRlVSTENvbm5lY3Rpb25EZWxlZ2F0ZVdpdGhPcGVyYXRpb25RdWV1ZS5oICovOyB9OwogCQky
NkMxN0EzRTE0OTFEMkQ0MDBEMTJCQTIgLyogRmlsZVN5c3RlbUlPUy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjZDMTdBM0MxNDkxRDJENDAwRDEyQkEy
IC8qIEZpbGVTeXN0ZW1JT1MuaCAqLzsgfTsKQEAgLTc1NjgsNiArNzU3MCw4IEBACiAJCTI2Qjk5
OThFMTgwM0FFNzIwMEQwMTEyMSAvKiBSZWdpc3RlckFsbG9jYXRvci5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IG5hbWUgPSBSZWdpc3RlckFsbG9jYXRvci5oOyBwYXRoID0gY3Nzaml0L1Jl
Z2lzdGVyQWxsb2NhdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTI2Qjk5OTkw
MTgwM0IzQzkwMEQwMTEyMSAvKiBTdGFja0FsbG9jYXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IG5hbWUgPSBTdGFja0FsbG9jYXRvci5oOyBwYXRoID0gY3Nzaml0L1N0YWNrQWxsb2Nh
dG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTI2Qjk5OTkyMTgwM0I5RDkwMEQw
MTEyMSAvKiBGdW5jdGlvbkNhbGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0g
RnVuY3Rpb25DYWxsLmg7IHBhdGggPSBjc3NqaXQvRnVuY3Rpb25DYWxsLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCTI2Qjk5OTk0MTgwNEQ1NDIwMEQwMTEyMSAvKiBDU1NTZWxlY3Rv
ckNvbXBpbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IENTU1Nl
bGVjdG9yQ29tcGlsZXIuY3BwOyBwYXRoID0gY3Nzaml0L0NTU1NlbGVjdG9yQ29tcGlsZXIuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyNkI5OTk5NTE4MDRENTQyMDBEMDExMjEg
LyogQ1NTU2VsZWN0b3JDb21waWxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUg
PSBDU1NTZWxlY3RvckNvbXBpbGVyLmg7IHBhdGggPSBjc3NqaXQvQ1NTU2VsZWN0b3JDb21waWxl
ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNkMxNUNGNDE4NTdFMTVEMDBGMTVD
MDMgLyogUmVzb3VyY2VIYW5kbGVDRlVSTENvbm5lY3Rpb25EZWxlZ2F0ZVdpdGhPcGVyYXRpb25R
dWV1ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZXNvdXJjZUhh
bmRsZUNGVVJMQ29ubmVjdGlvbkRlbGVnYXRlV2l0aE9wZXJhdGlvblF1ZXVlLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjZDMTVDRjUxODU3RTE1RDAwRjE1QzAzIC8qIFJlc291
cmNlSGFuZGxlQ0ZVUkxDb25uZWN0aW9uRGVsZWdhdGVXaXRoT3BlcmF0aW9uUXVldWUuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVzb3VyY2VIYW5kbGVDRlVSTENvbm5lY3Rp
b25EZWxlZ2F0ZVdpdGhPcGVyYXRpb25RdWV1ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkyNkMxN0EzQzE0OTFEMkQ0MDBEMTJCQTIgLyogRmlsZVN5c3RlbUlPUy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBGaWxlU3lzdGVtSU9TLmg7IHBhdGggPSBpb3MvRmls
ZVN5c3RlbUlPUy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQ2NTUsNiArMTQ2
NTksOCBAQAogCQkyNkI5OTk4RDE4MDNBREZBMDBEMDExMjEgLyogY3Nzaml0ICovID0gewogCQkJ
aXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKKwkJCQkyNkI5OTk5NDE4MDRENTQyMDBE
MDExMjEgLyogQ1NTU2VsZWN0b3JDb21waWxlci5jcHAgKi8sCisJCQkJMjZCOTk5OTUxODA0RDU0
MjAwRDAxMTIxIC8qIENTU1NlbGVjdG9yQ29tcGlsZXIuaCAqLywKIAkJCQkyNkI5OTk5MjE4MDNC
OUQ5MDBEMDExMjEgLyogRnVuY3Rpb25DYWxsLmggKi8sCiAJCQkJMjZCOTk5OEUxODAzQUU3MjAw
RDAxMTIxIC8qIFJlZ2lzdGVyQWxsb2NhdG9yLmggKi8sCiAJCQkJMjZCOTk5OTAxODAzQjNDOTAw
RDAxMTIxIC8qIFN0YWNrQWxsb2NhdG9yLmggKi8sCkBAIC0yMjQ4Niw2ICsyMjQ5Miw3IEBACiAJ
CQkJMDcwRjU0OTgxN0YxMkY2QjAwMTY5RTA0IC8qIE1lZGlhU3RyZWFtQ29uc3RyYWludHNWYWxp
ZGF0aW9uQ2xpZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQkzNzFGNTFBMTBEMjYyRkEwMDBFQ0Uw
RDUgLyogQ1NTU2VnbWVudGVkRm9udEZhY2UuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4MEU3MzUy
MEExOTlDNzcwMDdGQjhDNSAvKiBDU1NTZWxlY3Rvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMjZC
OTk5OTcxODA0RDU0MjAwRDAxMTIxIC8qIENTU1NlbGVjdG9yQ29tcGlsZXIuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUU0QzE3ODlCMEVFNjkwMzgwMDgyNEQ2OSAvKiBDU1NTZWxlY3Rvckxpc3QuaCBp
biBIZWFkZXJzICovLAogCQkJCUE4MEU2Q0U4MEExOTg5Q0EwMDdGQjhDNSAvKiBDU1NTaGFkb3dW
YWx1ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTgwRTZFMEYwQTE5OTExQzAwN0ZCOEM1IC8qIENT
U1N0eWxlRGVjbGFyYXRpb24uaCBpbiBIZWFkZXJzICovLApAQCAtMjYwMDcsNiArMjYwMTQsNyBA
QAogCQkJCUE4MEU2RDA5MEExOTg5Q0EwMDdGQjhDNSAvKiBDU1NSdWxlTGlzdC5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkzNzFGNTFBMjBEMjYyRkEwMDBFQ0UwRDUgLyogQ1NTU2VnbWVudGVkRm9u
dEZhY2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTczNEYwQTE5OUM3NzAwN0ZCOEM1IC8q
IENTU1NlbGVjdG9yLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTI2Qjk5OTk2MTgwNEQ1NDIwMEQw
MTEyMSAvKiBDU1NTZWxlY3RvckNvbXBpbGVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUU0QzE3
ODlBMEVFNjkwMzgwMDgyNEQ2OSAvKiBDU1NTZWxlY3Rvckxpc3QuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJQTgwRTZDRjQwQTE5ODlDQTAwN0ZCOEM1IC8qIENTU1NoYWRvd1ZhbHVlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUE4MEU2Q0VGMEExOTg5Q0EwMDdGQjhDNSAvKiBDU1NTdHlsZVJ1bGUu
Y3BwIGluIFNvdXJjZXMgKi8sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3NqaXQvQ1NT
U2VsZWN0b3JDb21waWxlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9jc3NqaXQvQ1NTU2VsZWN0b3JD
b21waWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNmQ4ZjVlZjM0MzJlMTNlM2EwNjY2MmEwZjUwOTI2ZmJh
MzQ2N2ZlYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzc2ppdC9DU1NTZWxl
Y3RvckNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDc0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3RvckNvbXBpbGVyLmgiCisKKyNpZiBFTkFC
TEUoQ1NTX1NFTEVDVE9SX0pJVCkKKworI2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCisjaW5jbHVk
ZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkZ1bmN0aW9uQ2FsbC5oIgorI2luY2x1ZGUgIk5vZGVS
ZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKKyNpbmNsdWRlICJSZWdp
c3RlckFsbG9jYXRvci5oIgorI2luY2x1ZGUgIlJlbmRlckVsZW1lbnQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlN0YWNrQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8SmF2
YVNjcmlwdENvcmUvTGlua0J1ZmZlci5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL01hY3Jv
QXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvVk0uaD4KKyNpbmNsdWRlIDx3
dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIENTU1NlbGVjdG9yQ29tcGlsZXIgeworCisjZGVmaW5lIENTU19TRUxF
Q1RPUl9KSVRfREVCVUdHSU5HIDAKKworZW51bSBjbGFzcyBCYWNrdHJhY2tpbmdBY3Rpb24gewor
ICAgIE5vQmFja3RyYWNraW5nLAorICAgIEp1bXBUb0Rlc2NlbmRhbnRFbnRyeVBvaW50LAorICAg
IEp1bXBUb0luZGlyZWN0QWRqYWNlbnRFbnRyeVBvaW50LAorICAgIEp1bXBUb0Rlc2NlbmRhbnRU
cmVlV2Fsa2VyRW50cnlQb2ludCwKKyAgICBKdW1wVG9EZXNjZW5kYW50VGFpbCwKKyAgICBKdW1w
VG9DbGVhckFkamFjZW50RGVzY2VuZGFudFRhaWwsCisgICAgSnVtcFRvRGlyZWN0QWRqYWNlbnRU
YWlsCit9OworCitzdHJ1Y3QgQmFja3RyYWNraW5nRmxhZyB7CisgICAgZW51bSB7CisgICAgICAg
IERlc2NlbmRhbnRFbnRyeVBvaW50ID0gMSwKKyAgICAgICAgSW5kaXJlY3RBZGphY2VudEVudHJ5
UG9pbnQgPSAxIDw8IDEsCisgICAgICAgIFNhdmVEZXNjZW5kYW50QmFja3RyYWNraW5nU3RhcnQg
PSAxIDw8IDIsCisgICAgICAgIFNhdmVBZGphY2VudEJhY2t0cmFja2luZ1N0YXJ0ID0gMSA8PCAz
LAorICAgICAgICBEaXJlY3RBZGphY2VudFRhaWwgPSAxIDw8IDQsCisgICAgICAgIERlc2NlbmRh
bnRUYWlsID0gMSA8PCA1LAorICAgIH07Cit9OworCitlbnVtIGNsYXNzIEZyYWdtZW50UmVsYXRp
b24geworICAgIFJpZ2h0bW9zdCwKKyAgICBEZXNjZW5kYW50LAorICAgIENoaWxkLAorICAgIERp
cmVjdEFkamFjZW50LAorICAgIEluZGlyZWN0QWRqYWNlbnQKK307CisKK2VudW0gY2xhc3MgRnVu
Y3Rpb25UeXBlIHsKKyAgICBTaW1wbGVTZWxlY3RvckNoZWNrZXIsCisgICAgU2VsZWN0b3JDaGVj
a2VyV2l0aENoZWNraW5nQ29udGV4dAorfTsKKworc3RydWN0IFNlbGVjdG9yRnJhZ21lbnQgewor
ICAgIFNlbGVjdG9yRnJhZ21lbnQoKQorICAgICAgICA6IHRyYXZlcnNhbEJhY2t0cmFja2luZ0Fj
dGlvbihCYWNrdHJhY2tpbmdBY3Rpb246Ok5vQmFja3RyYWNraW5nKQorICAgICAgICAsIG1hdGNo
aW5nQmFja3RyYWNraW5nQWN0aW9uKEJhY2t0cmFja2luZ0FjdGlvbjo6Tm9CYWNrdHJhY2tpbmcp
CisgICAgICAgICwgYmFja3RyYWNraW5nRmxhZ3MoMCkKKyAgICAgICAgLCB0YWdOYW1lKDApCisg
ICAgeworICAgIH0KKyAgICBGcmFnbWVudFJlbGF0aW9uIHJlbGF0aW9uVG9MZWZ0RnJhZ21lbnQ7
CisgICAgRnJhZ21lbnRSZWxhdGlvbiByZWxhdGlvblRvUmlnaHRGcmFnbWVudDsKKworICAgIEJh
Y2t0cmFja2luZ0FjdGlvbiB0cmF2ZXJzYWxCYWNrdHJhY2tpbmdBY3Rpb247CisgICAgQmFja3Ry
YWNraW5nQWN0aW9uIG1hdGNoaW5nQmFja3RyYWNraW5nQWN0aW9uOworICAgIHVuc2lnbmVkIGNo
YXIgYmFja3RyYWNraW5nRmxhZ3M7CisKKyAgICBjb25zdCBRdWFsaWZpZWROYW1lKiB0YWdOYW1l
OworfTsKKwordHlwZWRlZiBKU0M6Ok1hY3JvQXNzZW1ibGVyIEFzc2VtYmxlcjsKKworY2xhc3Mg
Q1NTU2VsZWN0b3JDb2RlR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBDU1NTZWxlY3RvckNvZGVH
ZW5lcmF0b3IoY29uc3QgQ1NTU2VsZWN0b3IqKTsKKyAgICBDU1NTZWxlY3RvckNvbXBpbGF0aW9u
U3RhdHVzIGNvbXBpbGUoSlNDOjpWTSosIEpTQzo6TWFjcm9Bc3NlbWJsZXJDb2RlUmVmJik7CisK
K3ByaXZhdGU6CisjaWYgQ1BVKFg4Nl82NCkKKyAgICBzdGF0aWMgY29uc3QgQXNzZW1ibGVyOjpS
ZWdpc3RlcklEIGRlYWxsb2NhdGVSZWdpc3RlciA9IEpTQzo6WDg2UmVnaXN0ZXJzOjplYXg7Cisg
ICAgc3RhdGljIGNvbnN0IEFzc2VtYmxlcjo6UmVnaXN0ZXJJRCBlbGVtZW50QWRkcmVzc1JlZ2lz
dGVyID0gSlNDOjpYODZSZWdpc3RlcnM6OmVkaTsKKyAgICBzdGF0aWMgY29uc3QgQXNzZW1ibGVy
OjpSZWdpc3RlcklEIGNoZWNraW5nQ29udGV4dFJlZ2lzdGVyID0gSlNDOjpYODZSZWdpc3RlcnM6
OmVzaTsKKyNlbmRpZgorCisgICAgdm9pZCBjb21wdXRlQmFja3RyYWNraW5nSW5mb3JtYXRpb24o
KTsKKworICAgIC8vIEVsZW1lbnQgcmVsYXRpb25zIHRyZWUgd2Fsa2VyLgorICAgIHZvaWQgZ2Vu
ZXJhdGVXYWxrVG9QYXJlbnRFbGVtZW50KEFzc2VtYmxlcjo6SnVtcExpc3QmIGZhaWx1cmVDYXNl
cywgQXNzZW1ibGVyOjpSZWdpc3RlcklEIHRhcmdldFJlZ2lzdGVyKTsKKyAgICB2b2lkIGdlbmVy
YXRlUGFyZW50RWxlbWVudFRyZWVXYWxrZXIoQXNzZW1ibGVyOjpKdW1wTGlzdCYgZmFpbHVyZUNh
c2VzLCBjb25zdCBTZWxlY3RvckZyYWdtZW50Jik7CisgICAgdm9pZCBnZW5lcmF0ZUFuY2VzdG9y
VHJlZVdhbGtlcihBc3NlbWJsZXI6Okp1bXBMaXN0JiBmYWlsdXJlQ2FzZXMsIGNvbnN0IFNlbGVj
dG9yRnJhZ21lbnQmKTsKKworICAgIHZvaWQgZ2VuZXJhdGVXYWxrVG9QcmV2aW91c0FkamFjZW50
KEFzc2VtYmxlcjo6SnVtcExpc3QmIGZhaWx1cmVDYXNlcywgY29uc3QgU2VsZWN0b3JGcmFnbWVu
dCYpOworICAgIHZvaWQgZ2VuZXJhdGVEaXJlY3RBZGphY2VudFRyZWVXYWxrZXIoQXNzZW1ibGVy
OjpKdW1wTGlzdCYgZmFpbHVyZUNhc2VzLCBjb25zdCBTZWxlY3RvckZyYWdtZW50Jik7CisgICAg
dm9pZCBnZW5lcmF0ZUluZGlyZWN0QWRqYWNlbnRUcmVlV2Fsa2VyKEFzc2VtYmxlcjo6SnVtcExp
c3QmIGZhaWx1cmVDYXNlcywgY29uc3QgU2VsZWN0b3JGcmFnbWVudCYpOworICAgIHZvaWQgbWFy
a1BhcmVudEVsZW1lbnRJZlJlc29sdmluZ1N0eWxlKEpTQzo6RnVuY3Rpb25QdHIpOworCisgICAg
dm9pZCBsaW5rRmFpbHVyZXMoQXNzZW1ibGVyOjpKdW1wTGlzdCYgZ2xvYmFsRmFpbHVyZUNhc2Vz
LCBCYWNrdHJhY2tpbmdBY3Rpb24sIEFzc2VtYmxlcjo6SnVtcExpc3QmIGxvY2FsRmFpbHVyZUNh
c2VzKTsKKyAgICB2b2lkIGdlbmVyYXRlQWRqYWNlbnRCYWNrdHJhY2tpbmdUYWlsKFN0YWNrQWxs
b2NhdG9yJiBhZGphY2VudFRhaWxTdGFjayk7CisgICAgdm9pZCBnZW5lcmF0ZURlc2NlbmRhbnRC
YWNrdHJhY2tpbmdUYWlsKCk7CisgICAgdm9pZCBnZW5lcmF0ZUJhY2t0cmFja2luZ1RhaWxzSWZO
ZWVkZWQoY29uc3QgU2VsZWN0b3JGcmFnbWVudCYpOworCisgICAgLy8gRWxlbWVudCBwcm9wZXJ0
aWVzIG1hdGNoZXJzLgorICAgIHZvaWQgZ2VuZXJhdGVFbGVtZW50TWF0Y2hpbmcoQXNzZW1ibGVy
OjpKdW1wTGlzdCYgZmFpbHVyZUNhc2VzLCBjb25zdCBTZWxlY3RvckZyYWdtZW50Jik7CisgICAg
dm9pZCBnZW5lcmF0ZUVsZW1lbnRIYXNUYWdOYW1lKEFzc2VtYmxlcjo6SnVtcExpc3QmIGZhaWx1
cmVDYXNlcywgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZVRvTWF0Y2gpOworCisgICAgQXNzZW1i
bGVyIG1fYXNzZW1ibGVyOworICAgIFJlZ2lzdGVyQWxsb2NhdG9yIG1fcmVnaXN0ZXJBbGxvY2F0
b3I7CisgICAgU3RhY2tBbGxvY2F0b3IgbV9zdGFja0FsbG9jYXRvcjsKKyAgICBWZWN0b3I8c3Rk
OjpwYWlyPEFzc2VtYmxlcjo6Q2FsbCwgSlNDOjpGdW5jdGlvblB0cj4+IG1fZnVuY3Rpb25DYWxs
czsKKworICAgIEZ1bmN0aW9uVHlwZSBtX2Z1bmN0aW9uVHlwZTsKKyAgICBWZWN0b3I8U2VsZWN0
b3JGcmFnbWVudCwgOD4gbV9zZWxlY3RvckZyYWdtZW50czsKKworICAgIFN0YWNrQWxsb2NhdG9y
OjpTdGFja1JlZmVyZW5jZSBtX2NoZWNraW5nQ29udGV4dFN0YWNrUmVmZXJlbmNlOworCisgICAg
QXNzZW1ibGVyOjpMYWJlbCBtX2Rlc2NlbmRhbnRFbnRyeVBvaW50OworICAgIEFzc2VtYmxlcjo6
TGFiZWwgbV9pbmRpcmVjdEFkamFjZW50RW50cnlQb2ludDsKKyAgICBBc3NlbWJsZXI6OkxhYmVs
IG1fZGVzY2VuZGFudFRyZWVXYWxrZXJCYWNrdHJhY2tpbmdQb2ludDsKKyAgICBBc3NlbWJsZXI6
OlJlZ2lzdGVySUQgbV9kZXNjZW5kYW50QmFja3RyYWNraW5nU3RhcnQ7CisgICAgQXNzZW1ibGVy
OjpKdW1wTGlzdCBtX2Rlc2NlbmRhbnRCYWNrdHJhY2tpbmdGYWlsdXJlQ2FzZXM7CisgICAgU3Rh
Y2tBbGxvY2F0b3I6OlN0YWNrUmVmZXJlbmNlIG1fYWRqYWNlbnRCYWNrdHJhY2tpbmdTdGFydDsK
KyAgICBBc3NlbWJsZXI6Okp1bXBMaXN0IG1fYWRqYWNlbnRCYWNrdHJhY2tpbmdGYWlsdXJlQ2Fz
ZXM7CisgICAgQXNzZW1ibGVyOjpKdW1wTGlzdCBtX2NsZWFyQWRqYWNlbnRFbnRyeVBvaW50RGVz
Y2VuZGFudEZhaWx1cmVDYXNlczsKKworI2lmIENTU19TRUxFQ1RPUl9KSVRfREVCVUdHSU5HCisg
ICAgY29uc3QgQ1NTU2VsZWN0b3IqIG1fb3JpZ2luYWxTZWxlY3RvcjsKKyNlbmRpZgorfTsKKwor
Q1NTU2VsZWN0b3JDb21waWxhdGlvblN0YXR1cyBjb21waWxlU2VsZWN0b3IoY29uc3QgQ1NTU2Vs
ZWN0b3IqIGxhc3RTZWxlY3RvciwgSlNDOjpWTSogdm0sIEpTQzo6TWFjcm9Bc3NlbWJsZXJDb2Rl
UmVmJiBjb2RlUmVmKQoreworICAgIGlmICghdm0tPmNhblVzZUpJVCgpKQorICAgICAgICByZXR1
cm4gQ1NTU2VsZWN0b3JDb21waWxhdGlvblN0YXR1czo6Q2Fubm90Q29tcGlsZTsKKyAgICBDU1NT
ZWxlY3RvckNvZGVHZW5lcmF0b3IgY29kZUdlbmVyYXRvcihsYXN0U2VsZWN0b3IpOworICAgIHJl
dHVybiBjb2RlR2VuZXJhdG9yLmNvbXBpbGUodm0sIGNvZGVSZWYpOworfQorCitzdGF0aWMgaW5s
aW5lIEZyYWdtZW50UmVsYXRpb24gZnJhZ21lbnRSZWxhdGlvbkZvclNlbGVjdG9yUmVsYXRpb24o
Q1NTU2VsZWN0b3I6OlJlbGF0aW9uIHJlbGF0aW9uKQoreworICAgIHN3aXRjaCAocmVsYXRpb24p
IHsKKyAgICBjYXNlIENTU1NlbGVjdG9yOjpEZXNjZW5kYW50OgorICAgICAgICByZXR1cm4gRnJh
Z21lbnRSZWxhdGlvbjo6RGVzY2VuZGFudDsKKyAgICBjYXNlIENTU1NlbGVjdG9yOjpDaGlsZDoK
KyAgICAgICAgcmV0dXJuIEZyYWdtZW50UmVsYXRpb246OkNoaWxkOworICAgIGNhc2UgQ1NTU2Vs
ZWN0b3I6OkRpcmVjdEFkamFjZW50OgorICAgICAgICByZXR1cm4gRnJhZ21lbnRSZWxhdGlvbjo6
RGlyZWN0QWRqYWNlbnQ7CisgICAgY2FzZSBDU1NTZWxlY3Rvcjo6SW5kaXJlY3RBZGphY2VudDoK
KyAgICAgICAgcmV0dXJuIEZyYWdtZW50UmVsYXRpb246OkluZGlyZWN0QWRqYWNlbnQ7CisgICAg
Y2FzZSBDU1NTZWxlY3Rvcjo6U3ViU2VsZWN0b3I6CisgICAgY2FzZSBDU1NTZWxlY3Rvcjo6U2hh
ZG93RGVzY2VuZGFudDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBGcmFnbWVudFJlbGF0aW9uOjpEZXNj
ZW5kYW50OworfQorCitpbmxpbmUgQ1NTU2VsZWN0b3JDb2RlR2VuZXJhdG9yOjpDU1NTZWxlY3Rv
ckNvZGVHZW5lcmF0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJvb3RTZWxlY3RvcikKKyAgICA6IG1f
c3RhY2tBbGxvY2F0b3IobV9hc3NlbWJsZXIpCisgICAgLCBtX2Z1bmN0aW9uVHlwZShGdW5jdGlv
blR5cGU6OlNpbXBsZVNlbGVjdG9yQ2hlY2tlcikKKyNpZiBDU1NfU0VMRUNUT1JfSklUX0RFQlVH
R0lORworICAgICwgbV9vcmlnaW5hbFNlbGVjdG9yKHJvb3RTZWxlY3RvcikKKyNlbmRpZgorewor
I2lmIENTU19TRUxFQ1RPUl9KSVRfREVCVUdHSU5HCisgICAgZGF0YUxvZ0YoIkNvbXBpbGluZyBc
IiVzXCJcbiIsIG1fb3JpZ2luYWxTZWxlY3Rvci0+c2VsZWN0b3JUZXh0KCkudXRmOCgpLmRhdGEo
KSk7CisjZW5kaWYKKworICAgIFNlbGVjdG9yRnJhZ21lbnQgZnJhZ21lbnQ7CisgICAgRnJhZ21l
bnRSZWxhdGlvbiByZWxhdGlvblRvUHJldmlvdXNGcmFnbWVudCA9IEZyYWdtZW50UmVsYXRpb246
OlJpZ2h0bW9zdDsKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IHJvb3RT
ZWxlY3Rvcjsgc2VsZWN0b3I7IHNlbGVjdG9yID0gc2VsZWN0b3ItPnRhZ0hpc3RvcnkoKSkgewor
ICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yLT5tX21hdGNoKSB7CisgICAgICAgIGNhc2UgQ1NTU2Vs
ZWN0b3I6OlRhZzoKKyAgICAgICAgICAgIEFTU0VSVCghZnJhZ21lbnQudGFnTmFtZSk7CisgICAg
ICAgICAgICBmcmFnbWVudC50YWdOYW1lID0gJihzZWxlY3Rvci0+dGFnUU5hbWUoKSk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gQ2Fubm90
SGFuZGxlU2VsZWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBDU1NTZWxlY3Rvcjo6UmVsYXRp
b24gcmVsYXRpb24gPSBzZWxlY3Rvci0+cmVsYXRpb24oKTsKKyAgICAgICAgaWYgKHJlbGF0aW9u
ID09IENTU1NlbGVjdG9yOjpTdWJTZWxlY3RvcikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGlmIChyZWxhdGlvbiA9PSBDU1NTZWxlY3Rvcjo6U2hhZG93RGVzY2VuZGFudCAmJiAh
c2VsZWN0b3ItPmlzTGFzdEluVGFnSGlzdG9yeSgpKQorICAgICAgICAgICAgZ290byBDYW5ub3RI
YW5kbGVTZWxlY3RvcjsKKworICAgICAgICBpZiAocmVsYXRpb24gPT0gQ1NTU2VsZWN0b3I6OkRp
cmVjdEFkamFjZW50IHx8IHJlbGF0aW9uID09IENTU1NlbGVjdG9yOjpJbmRpcmVjdEFkamFjZW50
KQorICAgICAgICAgICAgbV9mdW5jdGlvblR5cGUgPSBzdGQ6Om1heChtX2Z1bmN0aW9uVHlwZSwg
RnVuY3Rpb25UeXBlOjpTZWxlY3RvckNoZWNrZXJXaXRoQ2hlY2tpbmdDb250ZXh0KTsKKworICAg
ICAgICBmcmFnbWVudC5yZWxhdGlvblRvTGVmdEZyYWdtZW50ID0gZnJhZ21lbnRSZWxhdGlvbkZv
clNlbGVjdG9yUmVsYXRpb24ocmVsYXRpb24pOworICAgICAgICBmcmFnbWVudC5yZWxhdGlvblRv
UmlnaHRGcmFnbWVudCA9IHJlbGF0aW9uVG9QcmV2aW91c0ZyYWdtZW50OworICAgICAgICByZWxh
dGlvblRvUHJldmlvdXNGcmFnbWVudCA9IGZyYWdtZW50LnJlbGF0aW9uVG9MZWZ0RnJhZ21lbnQ7
CisKKyAgICAgICAgbV9zZWxlY3RvckZyYWdtZW50cy5hcHBlbmQoZnJhZ21lbnQpOworICAgICAg
ICBmcmFnbWVudCA9IFNlbGVjdG9yRnJhZ21lbnQoKTsKKyAgICB9CisKKyAgICBjb21wdXRlQmFj
a3RyYWNraW5nSW5mb3JtYXRpb24oKTsKKworICAgIHJldHVybjsKKworQ2Fubm90SGFuZGxlU2Vs
ZWN0b3I6CisgICAgbV9zZWxlY3RvckZyYWdtZW50cy5jbGVhcigpOworfQorCitpbmxpbmUgQ1NT
U2VsZWN0b3JDb21waWxhdGlvblN0YXR1cyBDU1NTZWxlY3RvckNvZGVHZW5lcmF0b3I6OmNvbXBp
bGUoSlNDOjpWTSogdm0sIEpTQzo6TWFjcm9Bc3NlbWJsZXJDb2RlUmVmJiBjb2RlUmVmKQorewor
ICAgIGlmIChtX3NlbGVjdG9yRnJhZ21lbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIENT
U1NlbGVjdG9yQ29tcGlsYXRpb25TdGF0dXM6OkNhbm5vdENvbXBpbGU7CisKKyAgICBtX3JlZ2lz
dGVyQWxsb2NhdG9yLmFsbG9jYXRlUmVnaXN0ZXIoZWxlbWVudEFkZHJlc3NSZWdpc3Rlcik7CisK
KyAgICBpZiAobV9mdW5jdGlvblR5cGUgPT0gRnVuY3Rpb25UeXBlOjpTZWxlY3RvckNoZWNrZXJX
aXRoQ2hlY2tpbmdDb250ZXh0KQorICAgICAgICBtX2NoZWNraW5nQ29udGV4dFN0YWNrUmVmZXJl
bmNlID0gbV9zdGFja0FsbG9jYXRvci5wdXNoKGNoZWNraW5nQ29udGV4dFJlZ2lzdGVyKTsKKwor
ICAgIEFzc2VtYmxlcjo6SnVtcExpc3QgZmFpbHVyZUNhc2VzOworCisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1fc2VsZWN0b3JGcmFnbWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAg
Y29uc3QgU2VsZWN0b3JGcmFnbWVudCYgZnJhZ21lbnQgPSBtX3NlbGVjdG9yRnJhZ21lbnRzW2ld
OworICAgICAgICBzd2l0Y2ggKGZyYWdtZW50LnJlbGF0aW9uVG9SaWdodEZyYWdtZW50KSB7Cisg
ICAgICAgIGNhc2UgRnJhZ21lbnRSZWxhdGlvbjo6UmlnaHRtb3N0OgorICAgICAgICAgICAgZ2Vu
ZXJhdGVFbGVtZW50TWF0Y2hpbmcoZmFpbHVyZUNhc2VzLCBmcmFnbWVudCk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBGcmFnbWVudFJlbGF0aW9uOjpEZXNjZW5kYW50OgorICAg
ICAgICAgICAgZ2VuZXJhdGVBbmNlc3RvclRyZWVXYWxrZXIoZmFpbHVyZUNhc2VzLCBmcmFnbWVu
dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGcmFnbWVudFJlbGF0aW9uOjpD
aGlsZDoKKyAgICAgICAgICAgIGdlbmVyYXRlUGFyZW50RWxlbWVudFRyZWVXYWxrZXIoZmFpbHVy
ZUNhc2VzLCBmcmFnbWVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGcmFn
bWVudFJlbGF0aW9uOjpEaXJlY3RBZGphY2VudDoKKyAgICAgICAgICAgIGdlbmVyYXRlRGlyZWN0
QWRqYWNlbnRUcmVlV2Fsa2VyKGZhaWx1cmVDYXNlcywgZnJhZ21lbnQpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgRnJhZ21lbnRSZWxhdGlvbjo6SW5kaXJlY3RBZGphY2VudDoK
KyAgICAgICAgICAgIGdlbmVyYXRlSW5kaXJlY3RBZGphY2VudFRyZWVXYWxrZXIoZmFpbHVyZUNh
c2VzLCBmcmFnbWVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBn
ZW5lcmF0ZUJhY2t0cmFja2luZ1RhaWxzSWZOZWVkZWQoZnJhZ21lbnQpOworICAgIH0KKworICAg
IG1fcmVnaXN0ZXJBbGxvY2F0b3IuZGVhbGxvY2F0ZVJlZ2lzdGVyKGVsZW1lbnRBZGRyZXNzUmVn
aXN0ZXIpOworCisgICAgaWYgKG1fZnVuY3Rpb25UeXBlID09IEZ1bmN0aW9uVHlwZTo6U2ltcGxl
U2VsZWN0b3JDaGVja2VyKSB7CisgICAgICAgIC8vIFN1Y2Nlc3MuCisgICAgICAgIG1fYXNzZW1i
bGVyLm1vdmUoQXNzZW1ibGVyOjpUcnVzdGVkSW1tMzIoMSksIGRlYWxsb2NhdGVSZWdpc3Rlcik7
CisgICAgICAgIG1fYXNzZW1ibGVyLnJldCgpOworCisgICAgICAgIC8vIEZhaWx1cmUuCisgICAg
ICAgIGlmICghZmFpbHVyZUNhc2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZhaWx1cmVDYXNl
cy5saW5rKCZtX2Fzc2VtYmxlcik7CisgICAgICAgICAgICBtX2Fzc2VtYmxlci5tb3ZlKEFzc2Vt
Ymxlcjo6VHJ1c3RlZEltbTMyKDApLCBkZWFsbG9jYXRlUmVnaXN0ZXIpOworICAgICAgICAgICAg
bV9hc3NlbWJsZXIucmV0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBU1NF
UlQobV9mdW5jdGlvblR5cGUgPT0gRnVuY3Rpb25UeXBlOjpTZWxlY3RvckNoZWNrZXJXaXRoQ2hl
Y2tpbmdDb250ZXh0KTsKKworICAgICAgICAvLyBTdWNjZXNzLgorICAgICAgICBtX2Fzc2VtYmxl
ci5tb3ZlKEFzc2VtYmxlcjo6VHJ1c3RlZEltbTMyKDEpLCBkZWFsbG9jYXRlUmVnaXN0ZXIpOwor
CisgICAgICAgIFN0YWNrQWxsb2NhdG9yIHN1Y2Nlc3NTdGFjayA9IG1fc3RhY2tBbGxvY2F0b3I7
CisgICAgICAgIFN0YWNrQWxsb2NhdG9yIGZhaWx1cmVTdGFjayA9IG1fc3RhY2tBbGxvY2F0b3I7
CisKKyAgICAgICAgTG9jYWxSZWdpc3RlciBjaGVja2luZ0NvbnRleHRSZWdpc3RlcihtX3JlZ2lz
dGVyQWxsb2NhdG9yKTsKKyAgICAgICAgc3VjY2Vzc1N0YWNrLnBvcChtX2NoZWNraW5nQ29udGV4
dFN0YWNrUmVmZXJlbmNlLCBjaGVja2luZ0NvbnRleHRSZWdpc3Rlcik7CisKKyAgICAgICAgLy8g
RmFpbHVyZS4KKyAgICAgICAgaWYgKCFmYWlsdXJlQ2FzZXMuZW1wdHkoKSkgeworICAgICAgICAg
ICAgQXNzZW1ibGVyOjpKdW1wIGp1bXBUb1JldHVybiA9IG1fYXNzZW1ibGVyLmp1bXAoKTsKKwor
ICAgICAgICAgICAgZmFpbHVyZUNhc2VzLmxpbmsoJm1fYXNzZW1ibGVyKTsKKyAgICAgICAgICAg
IGZhaWx1cmVTdGFjay5kaXNjYXJkKCk7CisgICAgICAgICAgICBtX2Fzc2VtYmxlci5tb3ZlKEFz
c2VtYmxlcjo6VHJ1c3RlZEltbTMyKDApLCBkZWFsbG9jYXRlUmVnaXN0ZXIpOworCisgICAgICAg
ICAgICBqdW1wVG9SZXR1cm4ubGluaygmbV9hc3NlbWJsZXIpOworICAgICAgICB9CisKKyAgICAg
ICAgbV9zdGFja0FsbG9jYXRvci5tZXJnZShzdGQ6Om1vdmUoc3VjY2Vzc1N0YWNrKSwgc3RkOjpt
b3ZlKGZhaWx1cmVTdGFjaykpOworCisgICAgICAgIG1fYXNzZW1ibGVyLnJldCgpOworICAgIH0K
KworICAgIEpTQzo6TGlua0J1ZmZlciBsaW5rQnVmZmVyKCp2bSwgJm1fYXNzZW1ibGVyLCBDU1Nf
Q09ERV9JRCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZnVuY3Rpb25DYWxscy5z
aXplKCk7IGkrKykKKyAgICAgICAgbGlua0J1ZmZlci5saW5rKG1fZnVuY3Rpb25DYWxsc1tpXS5m
aXJzdCwgbV9mdW5jdGlvbkNhbGxzW2ldLnNlY29uZCk7CisKKyNpZiBDU1NfU0VMRUNUT1JfSklU
X0RFQlVHR0lORyAmJiBBU1NFUlRfRElTQUJMRUQKKyAgICBjb2RlUmVmID0gbGlua0J1ZmZlci5m
aW5hbGl6ZUNvZGVXaXRoRGlzYXNzZW1ibHkoIkNTUyBTZWxlY3RvciBKSVQgZm9yIFwiJXNcIiIs
IG1fb3JpZ2luYWxTZWxlY3Rvci0+c2VsZWN0b3JUZXh0KCkudXRmOCgpLmRhdGEoKSk7CisjZWxz
ZQorICAgIGNvZGVSZWYgPSBGSU5BTElaRV9DT0RFKGxpbmtCdWZmZXIsICgiQ1NTIFNlbGVjdG9y
IEpJVCIpKTsKKyNlbmRpZgorCisgICAgaWYgKG1fZnVuY3Rpb25UeXBlID09IEZ1bmN0aW9uVHlw
ZTo6U2ltcGxlU2VsZWN0b3JDaGVja2VyKQorICAgICAgICByZXR1cm4gQ1NTU2VsZWN0b3JDb21w
aWxhdGlvblN0YXR1czo6U2ltcGxlU2VsZWN0b3JDaGVja2VyOworICAgIHJldHVybiBDU1NTZWxl
Y3RvckNvbXBpbGF0aW9uU3RhdHVzOjpTZWxlY3RvckNoZWNrZXJXaXRoQ2hlY2tpbmdDb250ZXh0
OworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVDaGFpblN0YXRlcyhjb25zdCBTZWxl
Y3RvckZyYWdtZW50JiBmcmFnbWVudCwgYm9vbCYgaGFzRGVzY2VuZGFudFJlbGF0aW9uT25UaGVS
aWdodCwgdW5zaWduZWQmIGFuY2VzdG9yUG9zaXRpb25TaW5jZURlc2NlbmRhbnRSZWxhdGlvbiwg
Ym9vbCYgaGFzSW5kaXJlY3RBZGphY2VudFJlbGF0aW9uT25UaGVSaWdodE9mRGlyZWN0QWRqYWNl
bnRDaGFpbiwgdW5zaWduZWQmIGFkamFjZW50UG9zaXRpb25TaW5jZUluZGlyZWN0QWRqYWNlbnRU
cmVlV2FsaykKK3sKKyAgICBzd2l0Y2ggKGZyYWdtZW50LnJlbGF0aW9uVG9SaWdodEZyYWdtZW50
KSB7CisgICAgY2FzZSBGcmFnbWVudFJlbGF0aW9uOjpSaWdodG1vc3Q6CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgRnJhZ21lbnRSZWxhdGlvbjo6RGVzY2VuZGFudDoKKyAgICAgICAgaGFzRGVz
Y2VuZGFudFJlbGF0aW9uT25UaGVSaWdodCA9IHRydWU7CisgICAgICAgIGFuY2VzdG9yUG9zaXRp
b25TaW5jZURlc2NlbmRhbnRSZWxhdGlvbiA9IDA7CisgICAgICAgIGhhc0luZGlyZWN0QWRqYWNl
bnRSZWxhdGlvbk9uVGhlUmlnaHRPZkRpcmVjdEFkamFjZW50Q2hhaW4gPSBmYWxzZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBGcmFnbWVudFJlbGF0aW9uOjpDaGlsZDoKKyAgICAgICAgKyth
bmNlc3RvclBvc2l0aW9uU2luY2VEZXNjZW5kYW50UmVsYXRpb247CisgICAgICAgIGhhc0luZGly
ZWN0QWRqYWNlbnRSZWxhdGlvbk9uVGhlUmlnaHRPZkRpcmVjdEFkamFjZW50Q2hhaW4gPSBmYWxz
ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGcmFnbWVudFJlbGF0aW9uOjpEaXJlY3RBZGph
Y2VudDoKKyAgICAgICAgaWYgKGhhc0luZGlyZWN0QWRqYWNlbnRSZWxhdGlvbk9uVGhlUmlnaHRP
ZkRpcmVjdEFkamFjZW50Q2hhaW4pCisgICAgICAgICAgICArK2FkamFjZW50UG9zaXRpb25TaW5j
ZUluZGlyZWN0QWRqYWNlbnRUcmVlV2FsazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGcmFn
bWVudFJlbGF0aW9uOjpJbmRpcmVjdEFkamFjZW50OgorICAgICAgICBoYXNJbmRpcmVjdEFkamFj
ZW50UmVsYXRpb25PblRoZVJpZ2h0T2ZEaXJlY3RBZGphY2VudENoYWluID0gdHJ1ZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNGaXJzdEFuY2VzdG9y
KHVuc2lnbmVkIGFuY2VzdG9yUG9zaXRpb25TaW5jZURlc2NlbmRhbnRSZWxhdGlvbikKK3sKKyAg
ICByZXR1cm4gYW5jZXN0b3JQb3NpdGlvblNpbmNlRGVzY2VuZGFudFJlbGF0aW9uID09IDE7Cit9
CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0ZpcnN0QWRqYWNlbnQodW5zaWduZWQgYW5jZXN0b3JQ
b3NpdGlvblNpbmNlRGVzY2VuZGFudFJlbGF0aW9uKQoreworICAgIHJldHVybiBhbmNlc3RvclBv
c2l0aW9uU2luY2VEZXNjZW5kYW50UmVsYXRpb24gPT0gMTsKK30KKworc3RhdGljIGlubGluZSBi
b29sIGlzQWZ0ZXJDaGlsZFJlbGF0aW9uKHVuc2lnbmVkIGFuY2VzdG9yUG9zaXRpb25TaW5jZURl
c2NlbmRhbnRSZWxhdGlvbikKK3sKKyAgICByZXR1cm4gYW5jZXN0b3JQb3NpdGlvblNpbmNlRGVz
Y2VuZGFudFJlbGF0aW9uID4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvbHZlQmFja3Ry
YWNraW5nQWN0aW9uKFNlbGVjdG9yRnJhZ21lbnQmIGZyYWdtZW50LCBib29sIGhhc0Rlc2NlbmRh
bnRSZWxhdGlvbk9uVGhlUmlnaHQsIHVuc2lnbmVkIGFuY2VzdG9yUG9zaXRpb25TaW5jZURlc2Nl
bmRhbnRSZWxhdGlvbiwgYm9vbCBoYXNJbmRpcmVjdEFkamFjZW50UmVsYXRpb25PblRoZVJpZ2h0
T2ZEaXJlY3RBZGphY2VudENoYWluLCB1bnNpZ25lZCBhZGphY2VudFBvc2l0aW9uU2luY2VJbmRp
cmVjdEFkamFjZW50VHJlZVdhbGspCit7CisgICAgc3dpdGNoIChmcmFnbWVudC5yZWxhdGlvblRv
UmlnaHRGcmFnbWVudCkgeworICAgIGNhc2UgRnJhZ21lbnRSZWxhdGlvbjo6UmlnaHRtb3N0Ogor
ICAgIGNhc2UgRnJhZ21lbnRSZWxhdGlvbjo6RGVzY2VuZGFudDoKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBGcmFnbWVudFJlbGF0aW9uOjpDaGlsZDoKKyAgICAgICAgLy8gRmFpbHVyZSB0byBt
YXRjaCB0aGUgZWxlbWVudCBzaG91bGQgcmVzdW1lIG1hdGNoaW5nIGF0IHRoZSBuZWFyZXN0IGFu
Y2VzdG9yL2Rlc2NlbmRhbnQgZW50cnkgcG9pbnQuCisgICAgICAgIGlmIChoYXNEZXNjZW5kYW50
UmVsYXRpb25PblRoZVJpZ2h0KSB7CisgICAgICAgICAgICBpZiAoaXNGaXJzdEFuY2VzdG9yKGFu
Y2VzdG9yUG9zaXRpb25TaW5jZURlc2NlbmRhbnRSZWxhdGlvbikpCisgICAgICAgICAgICAgICAg
ZnJhZ21lbnQubWF0Y2hpbmdCYWNrdHJhY2tpbmdBY3Rpb24gPSBCYWNrdHJhY2tpbmdBY3Rpb246
Okp1bXBUb0Rlc2NlbmRhbnRFbnRyeVBvaW50OworICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgIGZyYWdtZW50Lm1hdGNoaW5nQmFja3RyYWNraW5nQWN0aW9uID0gQmFja3RyYWNraW5n
QWN0aW9uOjpKdW1wVG9EZXNjZW5kYW50VGFpbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsK
KyAgICBjYXNlIEZyYWdtZW50UmVsYXRpb246OkRpcmVjdEFkamFjZW50OgorICAgICAgICAvLyBG
YWlsdXJlIG9uIHRyYXZlcnNhbCBpbXBsaWVzIG5vIG90aGVyIHNpYmxpbmcgdHJhdmVyc2FsIGNh
biBtYXRjaC4gTWF0Y2hpbmcgc2hvdWxkIHJlc3VtZSBhdCB0aGUKKyAgICAgICAgLy8gbmVhcmVz
dCBhbmNlc3Rvci9kZXNjZW5kYW50IHRyYXZlcnNhbC4KKyAgICAgICAgaWYgKGhhc0Rlc2NlbmRh
bnRSZWxhdGlvbk9uVGhlUmlnaHQpIHsKKyAgICAgICAgICAgIGlmICghaXNBZnRlckNoaWxkUmVs
YXRpb24oYW5jZXN0b3JQb3NpdGlvblNpbmNlRGVzY2VuZGFudFJlbGF0aW9uKSkKKyAgICAgICAg
ICAgICAgICBmcmFnbWVudC50cmF2ZXJzYWxCYWNrdHJhY2tpbmdBY3Rpb24gPSBCYWNrdHJhY2tp
bmdBY3Rpb246Okp1bXBUb0Rlc2NlbmRhbnRUcmVlV2Fsa2VyRW50cnlQb2ludDsKKyAgICAgICAg
ICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghaGFzSW5kaXJlY3RBZGphY2VudFJlbGF0
aW9uT25UaGVSaWdodE9mRGlyZWN0QWRqYWNlbnRDaGFpbiB8fCBpc0ZpcnN0QWRqYWNlbnQoYWRq
YWNlbnRQb3NpdGlvblNpbmNlSW5kaXJlY3RBZGphY2VudFRyZWVXYWxrKSkKKyAgICAgICAgICAg
ICAgICAgICAgZnJhZ21lbnQudHJhdmVyc2FsQmFja3RyYWNraW5nQWN0aW9uID0gQmFja3RyYWNr
aW5nQWN0aW9uOjpKdW1wVG9EZXNjZW5kYW50VGFpbDsKKyAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LnRyYXZlcnNhbEJhY2t0cmFja2luZ0FjdGlvbiA9
IEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRvQ2xlYXJBZGphY2VudERlc2NlbmRhbnRUYWlsOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHJpZ2h0bW9zdCBy
ZWxhdGlvbiBpcyBhIGluZGlyZWN0IGFkamFjZW50LCBtYXRjaGluZyBzb3VsZCByZXN1bWUgZnJv
bSB0aGVyZS4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSByZXN1bWUgZnJvbSB0aGUgbGF0ZXN0
IGFuY2VzdG9yL2Rlc2NlbmRhbnQgaWYgYW55LgorICAgICAgICBpZiAoaGFzSW5kaXJlY3RBZGph
Y2VudFJlbGF0aW9uT25UaGVSaWdodE9mRGlyZWN0QWRqYWNlbnRDaGFpbikgeworICAgICAgICAg
ICAgaWYgKGlzRmlyc3RBZGphY2VudChhZGphY2VudFBvc2l0aW9uU2luY2VJbmRpcmVjdEFkamFj
ZW50VHJlZVdhbGspKQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1hdGNoaW5nQmFja3RyYWNr
aW5nQWN0aW9uID0gQmFja3RyYWNraW5nQWN0aW9uOjpKdW1wVG9JbmRpcmVjdEFkamFjZW50RW50
cnlQb2ludDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tYXRj
aGluZ0JhY2t0cmFja2luZ0FjdGlvbiA9IEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRvRGlyZWN0
QWRqYWNlbnRUYWlsOworICAgICAgICB9IGVsc2UgaWYgKGhhc0Rlc2NlbmRhbnRSZWxhdGlvbk9u
VGhlUmlnaHQpIHsKKyAgICAgICAgICAgIGlmIChpc0FmdGVyQ2hpbGRSZWxhdGlvbihhbmNlc3Rv
clBvc2l0aW9uU2luY2VEZXNjZW5kYW50UmVsYXRpb24pKQorICAgICAgICAgICAgICAgIGZyYWdt
ZW50Lm1hdGNoaW5nQmFja3RyYWNraW5nQWN0aW9uID0gQmFja3RyYWNraW5nQWN0aW9uOjpKdW1w
VG9EZXNjZW5kYW50VGFpbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGhhc0Rlc2NlbmRhbnRSZWxh
dGlvbk9uVGhlUmlnaHQpCisgICAgICAgICAgICAgICAgZnJhZ21lbnQubWF0Y2hpbmdCYWNrdHJh
Y2tpbmdBY3Rpb24gPSBCYWNrdHJhY2tpbmdBY3Rpb246Okp1bXBUb0Rlc2NlbmRhbnRUcmVlV2Fs
a2VyRW50cnlQb2ludDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZyYWdt
ZW50UmVsYXRpb246OkluZGlyZWN0QWRqYWNlbnQ6CisgICAgICAgIC8vIEZhaWx1cmUgb24gdHJh
dmVyc2FsIGltcGxpZXMgbm8gb3RoZXIgc2libGluZyBtYXRjaGluZyB3aWxsIHN1Y2NlZWQuIE1h
dGNoaW5nIGNhbiByZXN1bWUKKyAgICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IGFuY2VzdG9yL2Rl
c2NlbmRhbnQuCisgICAgICAgIGlmIChoYXNEZXNjZW5kYW50UmVsYXRpb25PblRoZVJpZ2h0KSB7
CisgICAgICAgICAgICBpZiAoaXNBZnRlckNoaWxkUmVsYXRpb24oYW5jZXN0b3JQb3NpdGlvblNp
bmNlRGVzY2VuZGFudFJlbGF0aW9uKSkKKyAgICAgICAgICAgICAgICBmcmFnbWVudC50cmF2ZXJz
YWxCYWNrdHJhY2tpbmdBY3Rpb24gPSBCYWNrdHJhY2tpbmdBY3Rpb246Okp1bXBUb0Rlc2NlbmRh
bnRUYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYWdtZW50LnRyYXZl
cnNhbEJhY2t0cmFja2luZ0FjdGlvbiA9IEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRvRGVzY2Vu
ZGFudFRyZWVXYWxrZXJFbnRyeVBvaW50OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAg
IH0KK30KKworc3RhdGljIGJvb2wgcmVxdWlyZXNBZGphY2VudFRhaWwoY29uc3QgU2VsZWN0b3JG
cmFnbWVudCYgZnJhZ21lbnQpCit7CisgICAgQVNTRVJUKGZyYWdtZW50LnRyYXZlcnNhbEJhY2t0
cmFja2luZ0FjdGlvbiAhPSBCYWNrdHJhY2tpbmdBY3Rpb246Okp1bXBUb0RpcmVjdEFkamFjZW50
VGFpbCk7CisgICAgcmV0dXJuIGZyYWdtZW50Lm1hdGNoaW5nQmFja3RyYWNraW5nQWN0aW9uID09
IEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRvRGlyZWN0QWRqYWNlbnRUYWlsOworfQorCitzdGF0
aWMgYm9vbCByZXF1aXJlc0Rlc2NlbmRhbnRUYWlsKGNvbnN0IFNlbGVjdG9yRnJhZ21lbnQmIGZy
YWdtZW50KQoreworICAgIHJldHVybiBmcmFnbWVudC5tYXRjaGluZ0JhY2t0cmFja2luZ0FjdGlv
biA9PSBCYWNrdHJhY2tpbmdBY3Rpb246Okp1bXBUb0Rlc2NlbmRhbnRUYWlsIHx8IGZyYWdtZW50
LnRyYXZlcnNhbEJhY2t0cmFja2luZ0FjdGlvbiA9PSBCYWNrdHJhY2tpbmdBY3Rpb246Okp1bXBU
b0Rlc2NlbmRhbnRUYWlsOworfQorCit2b2lkIENTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Y29t
cHV0ZUJhY2t0cmFja2luZ0luZm9ybWF0aW9uKCkKK3sKKyAgICBib29sIGhhc0Rlc2NlbmRhbnRS
ZWxhdGlvbk9uVGhlUmlnaHQgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBhbmNlc3RvclBvc2l0aW9u
U2luY2VEZXNjZW5kYW50UmVsYXRpb24gPSAwOworICAgIGJvb2wgaGFzSW5kaXJlY3RBZGphY2Vu
dFJlbGF0aW9uT25UaGVSaWdodE9mRGlyZWN0QWRqYWNlbnRDaGFpbiA9IGZhbHNlOworICAgIHVu
c2lnbmVkIGFkamFjZW50UG9zaXRpb25TaW5jZUluZGlyZWN0QWRqYWNlbnRUcmVlV2FsayA9IDA7
CisKKyAgICBib29sIG5lZWRzQWRqYWNlbnRUYWlsID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc0Rl
c2NlbmRhbnRUYWlsID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9z
ZWxlY3RvckZyYWdtZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBTZWxlY3RvckZyYWdtZW50
JiBmcmFnbWVudCA9IG1fc2VsZWN0b3JGcmFnbWVudHNbaV07CisKKyAgICAgICAgdXBkYXRlQ2hh
aW5TdGF0ZXMoZnJhZ21lbnQsIGhhc0Rlc2NlbmRhbnRSZWxhdGlvbk9uVGhlUmlnaHQsIGFuY2Vz
dG9yUG9zaXRpb25TaW5jZURlc2NlbmRhbnRSZWxhdGlvbiwgaGFzSW5kaXJlY3RBZGphY2VudFJl
bGF0aW9uT25UaGVSaWdodE9mRGlyZWN0QWRqYWNlbnRDaGFpbiwgYWRqYWNlbnRQb3NpdGlvblNp
bmNlSW5kaXJlY3RBZGphY2VudFRyZWVXYWxrKTsKKworICAgICAgICBzb2x2ZUJhY2t0cmFja2lu
Z0FjdGlvbihmcmFnbWVudCwgaGFzRGVzY2VuZGFudFJlbGF0aW9uT25UaGVSaWdodCwgYW5jZXN0
b3JQb3NpdGlvblNpbmNlRGVzY2VuZGFudFJlbGF0aW9uLCBoYXNJbmRpcmVjdEFkamFjZW50UmVs
YXRpb25PblRoZVJpZ2h0T2ZEaXJlY3RBZGphY2VudENoYWluLCBhZGphY2VudFBvc2l0aW9uU2lu
Y2VJbmRpcmVjdEFkamFjZW50VHJlZVdhbGspOworCisgICAgICAgIG5lZWRzQWRqYWNlbnRUYWls
IHw9IHJlcXVpcmVzQWRqYWNlbnRUYWlsKGZyYWdtZW50KTsKKyAgICAgICAgbmVlZHNEZXNjZW5k
YW50VGFpbCB8PSByZXF1aXJlc0Rlc2NlbmRhbnRUYWlsKGZyYWdtZW50KTsKKworICAgICAgICAv
LyBBZGQgY29kZSBnZW5lcmF0aW9uIGZsYWdzLgorICAgICAgICBpZiAoZnJhZ21lbnQucmVsYXRp
b25Ub0xlZnRGcmFnbWVudCAhPSBGcmFnbWVudFJlbGF0aW9uOjpEZXNjZW5kYW50ICYmIGZyYWdt
ZW50LnJlbGF0aW9uVG9SaWdodEZyYWdtZW50ID09IEZyYWdtZW50UmVsYXRpb246OkRlc2NlbmRh
bnQpCisgICAgICAgICAgICBmcmFnbWVudC5iYWNrdHJhY2tpbmdGbGFncyB8PSBCYWNrdHJhY2tp
bmdGbGFnOjpEZXNjZW5kYW50RW50cnlQb2ludDsKKyAgICAgICAgaWYgKGZyYWdtZW50LnJlbGF0
aW9uVG9MZWZ0RnJhZ21lbnQgPT0gRnJhZ21lbnRSZWxhdGlvbjo6RGlyZWN0QWRqYWNlbnQgJiYg
ZnJhZ21lbnQucmVsYXRpb25Ub1JpZ2h0RnJhZ21lbnQgPT0gRnJhZ21lbnRSZWxhdGlvbjo6SW5k
aXJlY3RBZGphY2VudCkKKyAgICAgICAgICAgIGZyYWdtZW50LmJhY2t0cmFja2luZ0ZsYWdzIHw9
IEJhY2t0cmFja2luZ0ZsYWc6OkluZGlyZWN0QWRqYWNlbnRFbnRyeVBvaW50OworICAgICAgICBp
ZiAoZnJhZ21lbnQucmVsYXRpb25Ub0xlZnRGcmFnbWVudCAhPSBGcmFnbWVudFJlbGF0aW9uOjpE
ZXNjZW5kYW50ICYmIGZyYWdtZW50LnJlbGF0aW9uVG9SaWdodEZyYWdtZW50ID09IEZyYWdtZW50
UmVsYXRpb246OkNoaWxkICYmIGlzRmlyc3RBbmNlc3RvcihhbmNlc3RvclBvc2l0aW9uU2luY2VE
ZXNjZW5kYW50UmVsYXRpb24pKQorICAgICAgICAgICAgZnJhZ21lbnQuYmFja3RyYWNraW5nRmxh
Z3MgfD0gQmFja3RyYWNraW5nRmxhZzo6U2F2ZURlc2NlbmRhbnRCYWNrdHJhY2tpbmdTdGFydDsK
KyAgICAgICAgaWYgKGZyYWdtZW50LnJlbGF0aW9uVG9MZWZ0RnJhZ21lbnQgPT0gRnJhZ21lbnRS
ZWxhdGlvbjo6RGlyZWN0QWRqYWNlbnQgJiYgZnJhZ21lbnQucmVsYXRpb25Ub1JpZ2h0RnJhZ21l
bnQgPT0gRnJhZ21lbnRSZWxhdGlvbjo6RGlyZWN0QWRqYWNlbnQgJiYgaXNGaXJzdEFkamFjZW50
KGFkamFjZW50UG9zaXRpb25TaW5jZUluZGlyZWN0QWRqYWNlbnRUcmVlV2FsaykpCisgICAgICAg
ICAgICBmcmFnbWVudC5iYWNrdHJhY2tpbmdGbGFncyB8PSBCYWNrdHJhY2tpbmdGbGFnOjpTYXZl
QWRqYWNlbnRCYWNrdHJhY2tpbmdTdGFydDsKKyAgICAgICAgaWYgKGZyYWdtZW50LnJlbGF0aW9u
VG9MZWZ0RnJhZ21lbnQgIT0gRnJhZ21lbnRSZWxhdGlvbjo6RGlyZWN0QWRqYWNlbnQgJiYgbmVl
ZHNBZGphY2VudFRhaWwpIHsKKyAgICAgICAgICAgIEFTU0VSVChmcmFnbWVudC5yZWxhdGlvblRv
UmlnaHRGcmFnbWVudCA9PSBGcmFnbWVudFJlbGF0aW9uOjpEaXJlY3RBZGphY2VudCk7CisgICAg
ICAgICAgICBmcmFnbWVudC5iYWNrdHJhY2tpbmdGbGFncyB8PSBCYWNrdHJhY2tpbmdGbGFnOjpE
aXJlY3RBZGphY2VudFRhaWw7CisgICAgICAgICAgICBuZWVkc0FkamFjZW50VGFpbCA9IGZhbHNl
OworICAgICAgICB9CisgICAgICAgIGlmIChmcmFnbWVudC5yZWxhdGlvblRvTGVmdEZyYWdtZW50
ID09IEZyYWdtZW50UmVsYXRpb246OkRlc2NlbmRhbnQgJiYgbmVlZHNEZXNjZW5kYW50VGFpbCkg
eworICAgICAgICAgICAgZnJhZ21lbnQuYmFja3RyYWNraW5nRmxhZ3MgfD0gQmFja3RyYWNraW5n
RmxhZzo6RGVzY2VuZGFudFRhaWw7CisgICAgICAgICAgICBuZWVkc0Rlc2NlbmRhbnRUYWlsID0g
ZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgQXNzZW1ibGVyOjpK
dW1wIHRlc3RJc0VsZW1lbnRGbGFnT25Ob2RlKEFzc2VtYmxlcjo6UmVzdWx0Q29uZGl0aW9uIGNv
bmRpdGlvbiwgQXNzZW1ibGVyJiBhc3NlbWJsZXIsIEFzc2VtYmxlcjo6UmVnaXN0ZXJJRCBub2Rl
QWRkcmVzcykKK3sKKyAgICByZXR1cm4gYXNzZW1ibGVyLmJyYW5jaFRlc3QzMihjb25kaXRpb24s
IEFzc2VtYmxlcjo6QWRkcmVzcyhub2RlQWRkcmVzcywgTm9kZTo6bm9kZUZsYWdzTWVtb3J5T2Zm
c2V0KCkpLCBBc3NlbWJsZXI6OlRydXN0ZWRJbW0zMihOb2RlOjpmbGFnSXNFbGVtZW50KCkpKTsK
K30KKwordm9pZCBDU1NTZWxlY3RvckNvZGVHZW5lcmF0b3I6OmdlbmVyYXRlV2Fsa1RvUGFyZW50
RWxlbWVudChBc3NlbWJsZXI6Okp1bXBMaXN0JiBmYWlsdXJlQ2FzZXMsIEFzc2VtYmxlcjo6UmVn
aXN0ZXJJRCB0YXJnZXRSZWdpc3RlcikKK3sKKyAgICAvLyAgICBDb250YWluZXJOb2RlKiBwYXJl
bnQgPSBwYXJlbnROb2RlKCkKKyAgICAvLyAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc0Vs
ZW1lbnROb2RlKCkpCisgICAgLy8gICAgICAgICBmYWlsdXJlCisgICAgbV9hc3NlbWJsZXIubG9h
ZFB0cihBc3NlbWJsZXI6OkFkZHJlc3MoZWxlbWVudEFkZHJlc3NSZWdpc3RlciwgTm9kZTo6cGFy
ZW50Tm9kZU1lbW9yeU9mZnNldCgpKSwgdGFyZ2V0UmVnaXN0ZXIpOworICAgIGZhaWx1cmVDYXNl
cy5hcHBlbmQobV9hc3NlbWJsZXIuYnJhbmNoVGVzdFB0cihBc3NlbWJsZXI6Olplcm8sIHRhcmdl
dFJlZ2lzdGVyKSk7CisgICAgZmFpbHVyZUNhc2VzLmFwcGVuZCh0ZXN0SXNFbGVtZW50RmxhZ09u
Tm9kZShBc3NlbWJsZXI6Olplcm8sIG1fYXNzZW1ibGVyLCB0YXJnZXRSZWdpc3RlcikpOworfQor
Cit2b2lkIENTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVQYXJlbnRFbGVtZW50VHJl
ZVdhbGtlcihBc3NlbWJsZXI6Okp1bXBMaXN0JiBmYWlsdXJlQ2FzZXMsIGNvbnN0IFNlbGVjdG9y
RnJhZ21lbnQmIGZyYWdtZW50KQoreworICAgIEFzc2VtYmxlcjo6SnVtcExpc3QgdHJhdmVyc2Fs
RmFpbHVyZUNhc2VzOworICAgIGdlbmVyYXRlV2Fsa1RvUGFyZW50RWxlbWVudCh0cmF2ZXJzYWxG
YWlsdXJlQ2FzZXMsIGVsZW1lbnRBZGRyZXNzUmVnaXN0ZXIpOworICAgIGxpbmtGYWlsdXJlcyhm
YWlsdXJlQ2FzZXMsIGZyYWdtZW50LnRyYXZlcnNhbEJhY2t0cmFja2luZ0FjdGlvbiwgdHJhdmVy
c2FsRmFpbHVyZUNhc2VzKTsKKworICAgIEFzc2VtYmxlcjo6SnVtcExpc3QgbWF0Y2hpbmdGYWls
dXJlQ2FzZXM7CisgICAgZ2VuZXJhdGVFbGVtZW50TWF0Y2hpbmcobWF0Y2hpbmdGYWlsdXJlQ2Fz
ZXMsIGZyYWdtZW50KTsKKyAgICBsaW5rRmFpbHVyZXMoZmFpbHVyZUNhc2VzLCBmcmFnbWVudC5t
YXRjaGluZ0JhY2t0cmFja2luZ0FjdGlvbiwgbWF0Y2hpbmdGYWlsdXJlQ2FzZXMpOworCisgICAg
aWYgKGZyYWdtZW50LmJhY2t0cmFja2luZ0ZsYWdzICYgQmFja3RyYWNraW5nRmxhZzo6U2F2ZURl
c2NlbmRhbnRCYWNrdHJhY2tpbmdTdGFydCkgeworICAgICAgICBtX2Rlc2NlbmRhbnRCYWNrdHJh
Y2tpbmdTdGFydCA9IG1fcmVnaXN0ZXJBbGxvY2F0b3IuYWxsb2NhdGVSZWdpc3RlcigpOworICAg
ICAgICBtX2Fzc2VtYmxlci5tb3ZlKGVsZW1lbnRBZGRyZXNzUmVnaXN0ZXIsIG1fZGVzY2VuZGFu
dEJhY2t0cmFja2luZ1N0YXJ0KTsKKyAgICB9Cit9CisKK3ZvaWQgQ1NTU2VsZWN0b3JDb2RlR2Vu
ZXJhdG9yOjpnZW5lcmF0ZUFuY2VzdG9yVHJlZVdhbGtlcihBc3NlbWJsZXI6Okp1bXBMaXN0JiBm
YWlsdXJlQ2FzZXMsIGNvbnN0IFNlbGVjdG9yRnJhZ21lbnQmIGZyYWdtZW50KQoreworICAgIC8v
IExvb3Agb3ZlciB0aGUgYW5jZXN0b3JzIHVudGlsIG9uZSBvZiB0aGVtIG1hdGNoZXMgdGhlIGZy
YWdtZW50LgorICAgIEFzc2VtYmxlcjo6TGFiZWwgbG9vcFN0YXJ0KG1fYXNzZW1ibGVyLmxhYmVs
KCkpOworCisgICAgaWYgKGZyYWdtZW50LmJhY2t0cmFja2luZ0ZsYWdzICYgQmFja3RyYWNraW5n
RmxhZzo6RGVzY2VuZGFudEVudHJ5UG9pbnQpCisgICAgICAgIG1fZGVzY2VuZGFudFRyZWVXYWxr
ZXJCYWNrdHJhY2tpbmdQb2ludCA9IG1fYXNzZW1ibGVyLmxhYmVsKCk7CisKKyAgICBnZW5lcmF0
ZVdhbGtUb1BhcmVudEVsZW1lbnQoZmFpbHVyZUNhc2VzLCBlbGVtZW50QWRkcmVzc1JlZ2lzdGVy
KTsKKworICAgIGlmIChmcmFnbWVudC5iYWNrdHJhY2tpbmdGbGFncyAmIEJhY2t0cmFja2luZ0Zs
YWc6OkRlc2NlbmRhbnRFbnRyeVBvaW50KQorICAgICAgICBtX2Rlc2NlbmRhbnRFbnRyeVBvaW50
ID0gbV9hc3NlbWJsZXIubGFiZWwoKTsKKworICAgIEFzc2VtYmxlcjo6SnVtcExpc3QgdGFnTWF0
Y2hpbmdMb2NhbEZhaWx1cmVDYXNlczsKKyAgICBnZW5lcmF0ZUVsZW1lbnRNYXRjaGluZyh0YWdN
YXRjaGluZ0xvY2FsRmFpbHVyZUNhc2VzLCBmcmFnbWVudCk7CisgICAgdGFnTWF0Y2hpbmdMb2Nh
bEZhaWx1cmVDYXNlcy5saW5rVG8obG9vcFN0YXJ0LCAmbV9hc3NlbWJsZXIpOworfQorCit2b2lk
IENTU1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVXYWxrVG9QcmV2aW91c0FkamFjZW50
KEFzc2VtYmxlcjo6SnVtcExpc3QmIGZhaWx1cmVDYXNlcywgY29uc3QgU2VsZWN0b3JGcmFnbWVu
dCYgZnJhZ21lbnQpCit7CisgICAgLy8gICAgZG8geworICAgIC8vICAgICAgICBwcmV2aW91c1Np
YmxpbmcgPSBwcmV2aW91c1NpYmxpbmctPnByZXZpb3VzU2libGluZygpOworICAgIC8vICAgICAg
ICBpZiAoIXByZXZpb3VzU2libGluZykKKyAgICAvLyAgICAgICAgICAgIGZhaWx1cmUhCisgICAg
Ly8gICAgd2hpbGUgKCFwcmV2aW91c1NpYmxpbmctPmlzRWxlbWVudCgpKTsKKyAgICBBc3NlbWJs
ZXI6OlJlZ2lzdGVySUQgcHJldmlvdXNTaWJsaW5nOworICAgIGJvb2wgdXNlVGFpbE9uVHJhdmVy
c2FsRmFpbHVyZSA9IGZyYWdtZW50LnRyYXZlcnNhbEJhY2t0cmFja2luZ0FjdGlvbiA+PSBCYWNr
dHJhY2tpbmdBY3Rpb246Okp1bXBUb0Rlc2NlbmRhbnRUYWlsOworICAgIGlmICghdXNlVGFpbE9u
VHJhdmVyc2FsRmFpbHVyZSkgeworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBmcmFnbWVudCBp
cyBub3QgZGVwZW5kYW50IG9uIGEgcHJldmlvdXNseSBzYXZlZCBlbGVtZW50QWRkcmVzc1JlZ2lz
dGVyLCBhIGZhc3QgcmVjb3ZlcgorICAgICAgICAvLyBmcm9tIGEgZmFpbHVyZSB3b3VsZCByZXN1
bWUgd2l0aCBlbGVtZW50QWRkcmVzc1JlZ2lzdGVyLgorICAgICAgICAvLyBXaGVuIHdhbGtpbmcg
dG8gdGhlIHByZXZpb3VzIHNpYmxpbmcsIHRoZSBmYWlsdXJlIGNhbiBiZSB0aGF0IHByZXZpb3Vz
U2libGluZyBpcyBudWxsLiBXZSBjYW5ub3QgYmFja3RyYWNrCisgICAgICAgIC8vIHdpdGggYSBu
dWxsIGVsZW1lbnRBZGRyZXNzUmVnaXN0ZXIgc28gd2UgZG8gdGhlIHRyYXZlcnNhbCBvbiBhIGNv
cHkuCisgICAgICAgIHByZXZpb3VzU2libGluZyA9IG1fcmVnaXN0ZXJBbGxvY2F0b3IuYWxsb2Nh
dGVSZWdpc3RlcigpOworICAgICAgICBtX2Fzc2VtYmxlci5tb3ZlKGVsZW1lbnRBZGRyZXNzUmVn
aXN0ZXIsIHByZXZpb3VzU2libGluZyk7CisgICAgfSBlbHNlCisgICAgICAgIHByZXZpb3VzU2li
bGluZyA9IGVsZW1lbnRBZGRyZXNzUmVnaXN0ZXI7CisKKyAgICBBc3NlbWJsZXI6OkxhYmVsIGxv
b3BTdGFydCA9IG1fYXNzZW1ibGVyLmxhYmVsKCk7CisgICAgbV9hc3NlbWJsZXIubG9hZFB0cihB
c3NlbWJsZXI6OkFkZHJlc3MocHJldmlvdXNTaWJsaW5nLCBOb2RlOjpwcmV2aW91c1NpYmxpbmdN
ZW1vcnlPZmZzZXQoKSksIHByZXZpb3VzU2libGluZyk7CisgICAgZmFpbHVyZUNhc2VzLmFwcGVu
ZChtX2Fzc2VtYmxlci5icmFuY2hUZXN0UHRyKEFzc2VtYmxlcjo6WmVybywgcHJldmlvdXNTaWJs
aW5nKSk7CisgICAgdGVzdElzRWxlbWVudEZsYWdPbk5vZGUoQXNzZW1ibGVyOjpaZXJvLCBtX2Fz
c2VtYmxlciwgcHJldmlvdXNTaWJsaW5nKS5saW5rVG8obG9vcFN0YXJ0LCAmbV9hc3NlbWJsZXIp
OworCisgICAgLy8gT24gc3VjY2VzcywgbW92ZSBwcmV2aW91c1NpYmxpbmcgb3ZlciB0byBlbGVt
ZW50QWRkcmVzc1JlZ2lzdGVyIGlmIHdlIGNvdWxkIG5vdCB3b3JrIG9uIGVsZW1lbnRBZGRyZXNz
UmVnaXN0ZXIgZGlyZWN0bHkuCisgICAgaWYgKCF1c2VUYWlsT25UcmF2ZXJzYWxGYWlsdXJlKSB7
CisgICAgICAgIG1fYXNzZW1ibGVyLm1vdmUocHJldmlvdXNTaWJsaW5nLCBlbGVtZW50QWRkcmVz
c1JlZ2lzdGVyKTsKKyAgICAgICAgbV9yZWdpc3RlckFsbG9jYXRvci5kZWFsbG9jYXRlUmVnaXN0
ZXIocHJldmlvdXNTaWJsaW5nKTsKKyAgICB9Cit9CisKK3ZvaWQgQ1NTU2VsZWN0b3JDb2RlR2Vu
ZXJhdG9yOjpnZW5lcmF0ZURpcmVjdEFkamFjZW50VHJlZVdhbGtlcihBc3NlbWJsZXI6Okp1bXBM
aXN0JiBmYWlsdXJlQ2FzZXMsIGNvbnN0IFNlbGVjdG9yRnJhZ21lbnQmIGZyYWdtZW50KQorewor
ICAgIG1hcmtQYXJlbnRFbGVtZW50SWZSZXNvbHZpbmdTdHlsZShFbGVtZW50OjpzZXRDaGlsZHJl
bkFmZmVjdGVkQnlEaXJlY3RBZGphY2VudFJ1bGVzKTsKKworICAgIEFzc2VtYmxlcjo6SnVtcExp
c3QgdHJhdmVyc2FsRmFpbHVyZUNhc2VzOworICAgIGdlbmVyYXRlV2Fsa1RvUHJldmlvdXNBZGph
Y2VudCh0cmF2ZXJzYWxGYWlsdXJlQ2FzZXMsIGZyYWdtZW50KTsKKyAgICBsaW5rRmFpbHVyZXMo
ZmFpbHVyZUNhc2VzLCBmcmFnbWVudC50cmF2ZXJzYWxCYWNrdHJhY2tpbmdBY3Rpb24sIHRyYXZl
cnNhbEZhaWx1cmVDYXNlcyk7CisKKyAgICBBc3NlbWJsZXI6Okp1bXBMaXN0IG1hdGNoaW5nRmFp
bHVyZUNhc2VzOworICAgIGdlbmVyYXRlRWxlbWVudE1hdGNoaW5nKG1hdGNoaW5nRmFpbHVyZUNh
c2VzLCBmcmFnbWVudCk7CisgICAgbGlua0ZhaWx1cmVzKGZhaWx1cmVDYXNlcywgZnJhZ21lbnQu
bWF0Y2hpbmdCYWNrdHJhY2tpbmdBY3Rpb24sIG1hdGNoaW5nRmFpbHVyZUNhc2VzKTsKKworICAg
IGlmIChmcmFnbWVudC5iYWNrdHJhY2tpbmdGbGFncyAmIEJhY2t0cmFja2luZ0ZsYWc6OlNhdmVB
ZGphY2VudEJhY2t0cmFja2luZ1N0YXJ0KQorICAgICAgICBtX2FkamFjZW50QmFja3RyYWNraW5n
U3RhcnQgPSBtX3N0YWNrQWxsb2NhdG9yLnB1c2goZWxlbWVudEFkZHJlc3NSZWdpc3Rlcik7Cit9
CisKK3ZvaWQgQ1NTU2VsZWN0b3JDb2RlR2VuZXJhdG9yOjpnZW5lcmF0ZUluZGlyZWN0QWRqYWNl
bnRUcmVlV2Fsa2VyKEFzc2VtYmxlcjo6SnVtcExpc3QmIGZhaWx1cmVDYXNlcywgY29uc3QgU2Vs
ZWN0b3JGcmFnbWVudCYgZnJhZ21lbnQpCit7CisgICAgbWFya1BhcmVudEVsZW1lbnRJZlJlc29s
dmluZ1N0eWxlKEVsZW1lbnQ6OnNldENoaWxkcmVuQWZmZWN0ZWRCeUZvcndhcmRQb3NpdGlvbmFs
UnVsZXMpOworCisgICAgQXNzZW1ibGVyOjpMYWJlbCBsb29wU3RhcnQobV9hc3NlbWJsZXIubGFi
ZWwoKSk7CisKKyAgICBBc3NlbWJsZXI6Okp1bXBMaXN0IHRyYXZlcnNhbEZhaWx1cmVDYXNlczsK
KyAgICBnZW5lcmF0ZVdhbGtUb1ByZXZpb3VzQWRqYWNlbnQodHJhdmVyc2FsRmFpbHVyZUNhc2Vz
LCBmcmFnbWVudCk7CisgICAgbGlua0ZhaWx1cmVzKGZhaWx1cmVDYXNlcywgZnJhZ21lbnQudHJh
dmVyc2FsQmFja3RyYWNraW5nQWN0aW9uLCB0cmF2ZXJzYWxGYWlsdXJlQ2FzZXMpOworCisgICAg
aWYgKGZyYWdtZW50LmJhY2t0cmFja2luZ0ZsYWdzICYgQmFja3RyYWNraW5nRmxhZzo6SW5kaXJl
Y3RBZGphY2VudEVudHJ5UG9pbnQpCisgICAgICAgIG1faW5kaXJlY3RBZGphY2VudEVudHJ5UG9p
bnQgPSBtX2Fzc2VtYmxlci5sYWJlbCgpOworCisgICAgQXNzZW1ibGVyOjpKdW1wTGlzdCBsb2Nh
bEZhaWx1cmVDYXNlczsKKyAgICBnZW5lcmF0ZUVsZW1lbnRNYXRjaGluZyhsb2NhbEZhaWx1cmVD
YXNlcywgZnJhZ21lbnQpOworICAgIGxvY2FsRmFpbHVyZUNhc2VzLmxpbmtUbyhsb29wU3RhcnQs
ICZtX2Fzc2VtYmxlcik7Cit9CisKK3ZvaWQgQ1NTU2VsZWN0b3JDb2RlR2VuZXJhdG9yOjptYXJr
UGFyZW50RWxlbWVudElmUmVzb2x2aW5nU3R5bGUoSlNDOjpGdW5jdGlvblB0ciBtYXJraW5nRnVu
Y3Rpb24pCit7CisgICAgLy8gICAgIGlmIChjaGVja2luZ0NvbnRleHQucmVzb2x2aW5nTW9kZSA9
PSBSZXNvbHZpbmdTdHlsZSkgeworICAgIC8vICAgICAgICAgRWxlbWVudCogcGFyZW50ID0gZWxl
bWVudC0+cGFyZW50Tm9kZSgpOworICAgIC8vICAgICAgICAgbWFya2luZ0Z1bmN0aW9uKHBhcmVu
dCk7CisgICAgLy8gICAgIH0KKyAgICBBc3NlbWJsZXI6Okp1bXBMaXN0IGZhaWxlZFRvR2V0UGFy
ZW50OworICAgIEFzc2VtYmxlcjo6SnVtcCBub3RSZXNvbHZpbmdTdHlsZTsKKyAgICB7CisgICAg
ICAgIC8vIEdldCB0aGUgY2hlY2tpbmcgY29udGV4dC4KKyAgICAgICAgdW5zaWduZWQgb2Zmc2V0
VG9DaGVja2luZ0NvbnRleHQgPSBtX3N0YWNrQWxsb2NhdG9yLm9mZnNldFRvU3RhY2tSZWZlcmVu
Y2UobV9jaGVja2luZ0NvbnRleHRTdGFja1JlZmVyZW5jZSk7CisgICAgICAgIExvY2FsUmVnaXN0
ZXIgY2hlY2tpbmdDb250ZXh0KG1fcmVnaXN0ZXJBbGxvY2F0b3IpOworICAgICAgICBtX2Fzc2Vt
Ymxlci5sb2FkUHRyKEFzc2VtYmxlcjo6QWRkcmVzcyhBc3NlbWJsZXI6OnN0YWNrUG9pbnRlclJl
Z2lzdGVyLCBvZmZzZXRUb0NoZWNraW5nQ29udGV4dCksIGNoZWNraW5nQ29udGV4dCk7CisKKyAg
ICAgICAgLy8gSWYgd2Ugbm90IHJlc29sdmluZyBzdHlsZSwgc2tpcCB0aGUgd2hvbGUgbWFya2lu
Zy4KKyAgICAgICAgbm90UmVzb2x2aW5nU3R5bGUgPSBtX2Fzc2VtYmxlci5icmFuY2g4KEFzc2Vt
Ymxlcjo6Tm90RXF1YWwsIEFzc2VtYmxlcjo6QWRkcmVzcyhjaGVja2luZ0NvbnRleHQsIE9CSkVD
VF9PRkZTRVRPRihDaGVja2luZ0NvbnRleHQsIHJlc29sdmluZ01vZGUpKSwgQXNzZW1ibGVyOjpU
cnVzdGVkSW1tMzIoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkpOworICAgIH0KKwor
ICAgIC8vIEdldCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuCisg
ICAgQXNzZW1ibGVyOjpSZWdpc3RlcklEIHBhcmVudEVsZW1lbnQgPSBtX3JlZ2lzdGVyQWxsb2Nh
dG9yLmFsbG9jYXRlUmVnaXN0ZXIoKTsKKyAgICBnZW5lcmF0ZVdhbGtUb1BhcmVudEVsZW1lbnQo
ZmFpbGVkVG9HZXRQYXJlbnQsIHBhcmVudEVsZW1lbnQpOworCisgICAgLy8gUmV0dXJuIHRoZSBy
ZWdpc3RlciBwYXJlbnRFbGVtZW50IGp1c3QgYmVmb3JlIHRoZSBmdW5jdGlvbiBjYWxsIHNpbmNl
IHdlIGRvbid0IG5lZWQgaXQgdG8gYmUgcHJlc2VydmVkCisgICAgLy8gb24gdGhlIHN0YWNrLgor
ICAgIG1fcmVnaXN0ZXJBbGxvY2F0b3IuZGVhbGxvY2F0ZVJlZ2lzdGVyKHBhcmVudEVsZW1lbnQp
OworCisgICAgLy8gSW52b2tlIHRoZSBtYXJraW5nIGZ1bmN0aW9uIG9uIHRoZSBwYXJlbnQgZWxl
bWVudC4KKyAgICBGdW5jdGlvbkNhbGwgZnVuY3Rpb25DYWxsKG1fYXNzZW1ibGVyLCBtX3JlZ2lz
dGVyQWxsb2NhdG9yLCBtX3N0YWNrQWxsb2NhdG9yLCBtX2Z1bmN0aW9uQ2FsbHMpOworICAgIGZ1
bmN0aW9uQ2FsbC5zZXRGdW5jdGlvbkFkZHJlc3MobWFya2luZ0Z1bmN0aW9uKTsKKyAgICBmdW5j
dGlvbkNhbGwuc2V0Rmlyc3RBcmd1bWVudChwYXJlbnRFbGVtZW50KTsKKyAgICBmdW5jdGlvbkNh
bGwuY2FsbCgpOworCisgICAgbm90UmVzb2x2aW5nU3R5bGUubGluaygmbV9hc3NlbWJsZXIpOwor
ICAgIGZhaWxlZFRvR2V0UGFyZW50LmxpbmsoJm1fYXNzZW1ibGVyKTsKK30KKworCit2b2lkIENT
U1NlbGVjdG9yQ29kZUdlbmVyYXRvcjo6bGlua0ZhaWx1cmVzKEFzc2VtYmxlcjo6SnVtcExpc3Qm
IGdsb2JhbEZhaWx1cmVDYXNlcywgQmFja3RyYWNraW5nQWN0aW9uIGJhY2t0cmFja2luZ0FjdGlv
biwgQXNzZW1ibGVyOjpKdW1wTGlzdCYgbG9jYWxGYWlsdXJlQ2FzZXMpCit7CisgICAgc3dpdGNo
IChiYWNrdHJhY2tpbmdBY3Rpb24pIHsKKyAgICBjYXNlIEJhY2t0cmFja2luZ0FjdGlvbjo6Tm9C
YWNrdHJhY2tpbmc6CisgICAgICAgIGdsb2JhbEZhaWx1cmVDYXNlcy5hcHBlbmQobG9jYWxGYWls
dXJlQ2FzZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJhY2t0cmFja2luZ0FjdGlvbjo6
SnVtcFRvRGVzY2VuZGFudEVudHJ5UG9pbnQ6CisgICAgICAgIGxvY2FsRmFpbHVyZUNhc2VzLmxp
bmtUbyhtX2Rlc2NlbmRhbnRFbnRyeVBvaW50LCAmbV9hc3NlbWJsZXIpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRvRGVzY2VuZGFudFRyZWVXYWxr
ZXJFbnRyeVBvaW50OgorICAgICAgICBsb2NhbEZhaWx1cmVDYXNlcy5saW5rVG8obV9kZXNjZW5k
YW50VHJlZVdhbGtlckJhY2t0cmFja2luZ1BvaW50LCAmbV9hc3NlbWJsZXIpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRvRGVzY2VuZGFudFRhaWw6
CisgICAgICAgIG1fZGVzY2VuZGFudEJhY2t0cmFja2luZ0ZhaWx1cmVDYXNlcy5hcHBlbmQobG9j
YWxGYWlsdXJlQ2FzZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJhY2t0cmFja2luZ0Fj
dGlvbjo6SnVtcFRvSW5kaXJlY3RBZGphY2VudEVudHJ5UG9pbnQ6CisgICAgICAgIGxvY2FsRmFp
bHVyZUNhc2VzLmxpbmtUbyhtX2luZGlyZWN0QWRqYWNlbnRFbnRyeVBvaW50LCAmbV9hc3NlbWJs
ZXIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJhY2t0cmFja2luZ0FjdGlvbjo6SnVtcFRv
RGlyZWN0QWRqYWNlbnRUYWlsOgorICAgICAgICBtX2FkamFjZW50QmFja3RyYWNraW5nRmFpbHVy
ZUNhc2VzLmFwcGVuZChsb2NhbEZhaWx1cmVDYXNlcyk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgQmFja3RyYWNraW5nQWN0aW9uOjpKdW1wVG9DbGVhckFkamFjZW50RGVzY2VuZGFudFRhaWw6
CisgICAgICAgIG1fY2xlYXJBZGphY2VudEVudHJ5UG9pbnREZXNjZW5kYW50RmFpbHVyZUNhc2Vz
LmFwcGVuZChsb2NhbEZhaWx1cmVDYXNlcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwor
dm9pZCBDU1NTZWxlY3RvckNvZGVHZW5lcmF0b3I6OmdlbmVyYXRlQWRqYWNlbnRCYWNrdHJhY2tp
bmdUYWlsKFN0YWNrQWxsb2NhdG9yJiBhZGphY2VudFRhaWxTdGFjaykKK3sKKyAgICBtX2FkamFj
ZW50QmFja3RyYWNraW5nRmFpbHVyZUNhc2VzLmxpbmsoJm1fYXNzZW1ibGVyKTsKKyAgICBtX2Fk
amFjZW50QmFja3RyYWNraW5nRmFpbHVyZUNhc2VzLmNsZWFyKCk7CisgICAgYWRqYWNlbnRUYWls
U3RhY2sucG9wKG1fYWRqYWNlbnRCYWNrdHJhY2tpbmdTdGFydCwgZWxlbWVudEFkZHJlc3NSZWdp
c3Rlcik7CisgICAgbV9hc3NlbWJsZXIuanVtcCgpLmxpbmtUbyhtX2luZGlyZWN0QWRqYWNlbnRF
bnRyeVBvaW50LCAmbV9hc3NlbWJsZXIpOworfQorCit2b2lkIENTU1NlbGVjdG9yQ29kZUdlbmVy
YXRvcjo6Z2VuZXJhdGVEZXNjZW5kYW50QmFja3RyYWNraW5nVGFpbCgpCit7CisgICAgbV9kZXNj
ZW5kYW50QmFja3RyYWNraW5nRmFpbHVyZUNhc2VzLmxpbmsoJm1fYXNzZW1ibGVyKTsKKyAgICBt
X2Rlc2NlbmRhbnRCYWNrdHJhY2tpbmdGYWlsdXJlQ2FzZXMuY2xlYXIoKTsKKyAgICBtX2Fzc2Vt
Ymxlci5tb3ZlKG1fZGVzY2VuZGFudEJhY2t0cmFja2luZ1N0YXJ0LCBlbGVtZW50QWRkcmVzc1Jl
Z2lzdGVyKTsKKyAgICBtX3JlZ2lzdGVyQWxsb2NhdG9yLmRlYWxsb2NhdGVSZWdpc3RlcihtX2Rl
c2NlbmRhbnRCYWNrdHJhY2tpbmdTdGFydCk7CisgICAgbV9hc3NlbWJsZXIuanVtcCgpLmxpbmtU
byhtX2Rlc2NlbmRhbnRFbnRyeVBvaW50LCAmbV9hc3NlbWJsZXIpOworfQorCit2b2lkIENTU1Nl
bGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVCYWNrdHJhY2tpbmdUYWlsc0lmTmVlZGVkKGNv
bnN0IFNlbGVjdG9yRnJhZ21lbnQmIGZyYWdtZW50KQoreworICAgIGlmIChmcmFnbWVudC5iYWNr
dHJhY2tpbmdGbGFncyAmIEJhY2t0cmFja2luZ0ZsYWc6OkRpcmVjdEFkamFjZW50VGFpbCAmJiBm
cmFnbWVudC5iYWNrdHJhY2tpbmdGbGFncyAmIEJhY2t0cmFja2luZ0ZsYWc6OkRlc2NlbmRhbnRU
YWlsKSB7CisgICAgICAgIFN0YWNrQWxsb2NhdG9yIHN1Y2Nlc3NTdGFjayA9IG1fc3RhY2tBbGxv
Y2F0b3I7CisgICAgICAgIFN0YWNrQWxsb2NhdG9yIGFkamFjZW50VGFpbFN0YWNrID0gbV9zdGFj
a0FsbG9jYXRvcjsKKyAgICAgICAgU3RhY2tBbGxvY2F0b3IgZGVzY2VuZGFudFRhaWxTdGFjayA9
IG1fc3RhY2tBbGxvY2F0b3I7CisKKyAgICAgICAgc3VjY2Vzc1N0YWNrLnBvcEFuZERpc2NhcmQo
bV9hZGphY2VudEJhY2t0cmFja2luZ1N0YXJ0KTsKKworICAgICAgICBBc3NlbWJsZXI6Okp1bXAg
bm9ybWFsQ2FzZSA9IG1fYXNzZW1ibGVyLmp1bXAoKTsKKworICAgICAgICBnZW5lcmF0ZUFkamFj
ZW50QmFja3RyYWNraW5nVGFpbChhZGphY2VudFRhaWxTdGFjayk7CisKKyAgICAgICAgbV9jbGVh
ckFkamFjZW50RW50cnlQb2ludERlc2NlbmRhbnRGYWlsdXJlQ2FzZXMubGluaygmbV9hc3NlbWJs
ZXIpOworICAgICAgICBtX2NsZWFyQWRqYWNlbnRFbnRyeVBvaW50RGVzY2VuZGFudEZhaWx1cmVD
YXNlcy5jbGVhcigpOworICAgICAgICBkZXNjZW5kYW50VGFpbFN0YWNrLnBvcEFuZERpc2NhcmQo
bV9hZGphY2VudEJhY2t0cmFja2luZ1N0YXJ0KTsKKworICAgICAgICBnZW5lcmF0ZURlc2NlbmRh
bnRCYWNrdHJhY2tpbmdUYWlsKCk7CisKKyAgICAgICAgbm9ybWFsQ2FzZS5saW5rKCZtX2Fzc2Vt
Ymxlcik7CisKKyAgICAgICAgbV9zdGFja0FsbG9jYXRvci5tZXJnZShzdGQ6Om1vdmUoc3VjY2Vz
c1N0YWNrKSwgc3RkOjptb3ZlKGFkamFjZW50VGFpbFN0YWNrKSwgc3RkOjptb3ZlKGRlc2NlbmRh
bnRUYWlsU3RhY2spKTsKKyAgICB9IGVsc2UgaWYgKGZyYWdtZW50LmJhY2t0cmFja2luZ0ZsYWdz
ICYgQmFja3RyYWNraW5nRmxhZzo6RGlyZWN0QWRqYWNlbnRUYWlsKSB7CisgICAgICAgIFN0YWNr
QWxsb2NhdG9yIHN1Y2Nlc3NTdGFjayA9IG1fc3RhY2tBbGxvY2F0b3I7CisgICAgICAgIFN0YWNr
QWxsb2NhdG9yIGFkamFjZW50VGFpbFN0YWNrID0gbV9zdGFja0FsbG9jYXRvcjsKKworICAgICAg
ICBzdWNjZXNzU3RhY2sucG9wQW5kRGlzY2FyZChtX2FkamFjZW50QmFja3RyYWNraW5nU3RhcnQp
OworCisgICAgICAgIEFzc2VtYmxlcjo6SnVtcCBub3JtYWxDYXNlID0gbV9hc3NlbWJsZXIuanVt
cCgpOworICAgICAgICBnZW5lcmF0ZUFkamFjZW50QmFja3RyYWNraW5nVGFpbChhZGphY2VudFRh
aWxTdGFjayk7CisgICAgICAgIG5vcm1hbENhc2UubGluaygmbV9hc3NlbWJsZXIpOworCisgICAg
ICAgIG1fc3RhY2tBbGxvY2F0b3IubWVyZ2Uoc3RkOjptb3ZlKHN1Y2Nlc3NTdGFjayksIHN0ZDo6
bW92ZShhZGphY2VudFRhaWxTdGFjaykpOworICAgIH0gZWxzZSBpZiAoZnJhZ21lbnQuYmFja3Ry
YWNraW5nRmxhZ3MgJiBCYWNrdHJhY2tpbmdGbGFnOjpEZXNjZW5kYW50VGFpbCkgeworICAgICAg
ICBBc3NlbWJsZXI6Okp1bXAgbm9ybWFsQ2FzZSA9IG1fYXNzZW1ibGVyLmp1bXAoKTsKKyAgICAg
ICAgZ2VuZXJhdGVEZXNjZW5kYW50QmFja3RyYWNraW5nVGFpbCgpOworICAgICAgICBub3JtYWxD
YXNlLmxpbmsoJm1fYXNzZW1ibGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgQ1NTU2VsZWN0b3JDb2Rl
R2VuZXJhdG9yOjpnZW5lcmF0ZUVsZW1lbnRNYXRjaGluZyhBc3NlbWJsZXI6Okp1bXBMaXN0JiBm
YWlsdXJlQ2FzZXMsIGNvbnN0IFNlbGVjdG9yRnJhZ21lbnQmIGZyYWdtZW50KQoreworICAgIGlm
IChmcmFnbWVudC50YWdOYW1lKQorICAgICAgICBnZW5lcmF0ZUVsZW1lbnRIYXNUYWdOYW1lKGZh
aWx1cmVDYXNlcywgKihmcmFnbWVudC50YWdOYW1lKSk7Cit9CisKK2lubGluZSB2b2lkIENTU1Nl
bGVjdG9yQ29kZUdlbmVyYXRvcjo6Z2VuZXJhdGVFbGVtZW50SGFzVGFnTmFtZShBc3NlbWJsZXI6
Okp1bXBMaXN0JiBmYWlsdXJlQ2FzZXMsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWVUb01hdGNo
KQoreworICAgIGlmIChuYW1lVG9NYXRjaCA9PSBhbnlRTmFtZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBMb2FkIHRoZSBRdWFsaWZpZWROYW1lSW1wbCBmcm9tIHRoZSBpbnB1dC4KKyAg
ICBMb2NhbFJlZ2lzdGVyIHF1YWxpZmllZE5hbWVJbXBsKG1fcmVnaXN0ZXJBbGxvY2F0b3IpOwor
ICAgIG1fYXNzZW1ibGVyLmxvYWRQdHIoQXNzZW1ibGVyOjpBZGRyZXNzKGVsZW1lbnRBZGRyZXNz
UmVnaXN0ZXIsIEVsZW1lbnQ6OnRhZ1FOYW1lTWVtb3J5T2Zmc2V0KCkgKyBRdWFsaWZpZWROYW1l
OjppbXBsTWVtb3J5T2Zmc2V0KCkpLCBxdWFsaWZpZWROYW1lSW1wbCk7CisKKyAgICBjb25zdCBB
dG9taWNTdHJpbmcmIHNlbGVjdG9yTmFtZXNwYWNlVVJJID0gbmFtZVRvTWF0Y2gubmFtZXNwYWNl
VVJJKCk7CisgICAgaWYgKHNlbGVjdG9yTmFtZXNwYWNlVVJJICE9IHN0YXJBdG9tKSB7CisgICAg
ICAgIC8vIEdlbmVyYXRlIG5hbWVzcGFjZVVSSSA9PSBlbGVtZW50LT5uYW1lc3BhY2VVUkkoKS4K
KyAgICAgICAgTG9jYWxSZWdpc3RlciBjb25zdGFudFJlZ2lzdGVyKG1fcmVnaXN0ZXJBbGxvY2F0
b3IpOworICAgICAgICBtX2Fzc2VtYmxlci5tb3ZlKEFzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihz
ZWxlY3Rvck5hbWVzcGFjZVVSSS5pbXBsKCkpLCBjb25zdGFudFJlZ2lzdGVyKTsKKyAgICAgICAg
ZmFpbHVyZUNhc2VzLmFwcGVuZChtX2Fzc2VtYmxlci5icmFuY2hQdHIoQXNzZW1ibGVyOjpOb3RF
cXVhbCwgQXNzZW1ibGVyOjpBZGRyZXNzKHF1YWxpZmllZE5hbWVJbXBsLCBRdWFsaWZpZWROYW1l
OjpRdWFsaWZpZWROYW1lSW1wbDo6bmFtZXNwYWNlTWVtb3J5T2Zmc2V0KCkpLCBjb25zdGFudFJl
Z2lzdGVyKSk7CisgICAgfQorCisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBzZWxlY3RvckxvY2Fs
TmFtZSA9IG5hbWVUb01hdGNoLmxvY2FsTmFtZSgpOworICAgIGlmIChzZWxlY3RvckxvY2FsTmFt
ZSAhPSBzdGFyQXRvbSkgeworICAgICAgICAvLyBHZW5lcmF0ZSBsb2NhbE5hbWUgPT0gZWxlbWVu
dC0+bG9jYWxOYW1lKCkuCisgICAgICAgIExvY2FsUmVnaXN0ZXIgY29uc3RhbnRSZWdpc3Rlciht
X3JlZ2lzdGVyQWxsb2NhdG9yKTsKKyAgICAgICAgbV9hc3NlbWJsZXIubW92ZShBc3NlbWJsZXI6
OlRydXN0ZWRJbW1QdHIoc2VsZWN0b3JMb2NhbE5hbWUuaW1wbCgpKSwgY29uc3RhbnRSZWdpc3Rl
cik7CisgICAgICAgIGZhaWx1cmVDYXNlcy5hcHBlbmQobV9hc3NlbWJsZXIuYnJhbmNoUHRyKEFz
c2VtYmxlcjo6Tm90RXF1YWwsIEFzc2VtYmxlcjo6QWRkcmVzcyhxdWFsaWZpZWROYW1lSW1wbCwg
UXVhbGlmaWVkTmFtZTo6UXVhbGlmaWVkTmFtZUltcGw6OmxvY2FsTmFtZU1lbW9yeU9mZnNldCgp
KSwgY29uc3RhbnRSZWdpc3RlcikpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIENTU1Nl
bGVjdG9yQ29tcGlsZXIuCit9OyAvLyBuYW1lc3BhY2UgV2ViQ29yZS4KKworI2VuZGlmIC8vIEVO
QUJMRShDU1NfU0VMRUNUT1JfSklUKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3Nzaml0
L0NTU1NlbGVjdG9yQ29tcGlsZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2Nzc2ppdC9DU1NTZWxlY3Rv
ckNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjUxNDZkM2M5ZTdkYjc5ZTYyNDQ3ZTIzOTcxMTJiMmQ3
YTgzZTIxZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzc2ppdC9DU1NTZWxl
Y3RvckNvbXBpbGVyLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ1NT
U2VsZWN0b3JDb21waWxlcl9oCisjZGVmaW5lIENTU1NlbGVjdG9yQ29tcGlsZXJfaAorCisjaWYg
RU5BQkxFKENTU19TRUxFQ1RPUl9KSVQpCisKKyNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIK
KworbmFtZXNwYWNlIEpTQyB7CitjbGFzcyBNYWNyb0Fzc2VtYmxlckNvZGVSZWY7CitjbGFzcyBW
TTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBDU1NTZWxlY3RvcjsKK2NsYXNz
IEVsZW1lbnQ7CitjbGFzcyBSZW5kZXJTdHlsZTsKKworY2xhc3MgQ1NTU2VsZWN0b3JDb21waWxh
dGlvblN0YXR1cyB7CitwdWJsaWM6CisgICAgZW51bSBTdGF0dXMgeworICAgICAgICBOb3RDb21w
aWxlZCwKKyAgICAgICAgQ2Fubm90Q29tcGlsZSwKKyAgICAgICAgU2ltcGxlU2VsZWN0b3JDaGVj
a2VyLAorICAgICAgICBTZWxlY3RvckNoZWNrZXJXaXRoQ2hlY2tpbmdDb250ZXh0CisgICAgfTsK
KworICAgIENTU1NlbGVjdG9yQ29tcGlsYXRpb25TdGF0dXMoKQorICAgICAgICA6IG1fc3RhdHVz
KE5vdENvbXBpbGVkKQorICAgIHsgfQorCisgICAgQ1NTU2VsZWN0b3JDb21waWxhdGlvblN0YXR1
cyhTdGF0dXMgc3RhdHVzKQorICAgICAgICA6IG1fc3RhdHVzKHN0YXR1cykKKyAgICB7IH0KKwor
ICAgIG9wZXJhdG9yIFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9CisKK3ByaXZh
dGU6CisgICAgU3RhdHVzIG1fc3RhdHVzOworfTsKKworbmFtZXNwYWNlIENTU1NlbGVjdG9yQ29t
cGlsZXIgeworCitzdHJ1Y3QgQ2hlY2tpbmdDb250ZXh0IHsKKyAgICBTZWxlY3RvckNoZWNrZXI6
Ok1vZGUgcmVzb2x2aW5nTW9kZTsKKyAgICBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlOworfTsK
KwordHlwZWRlZiB1bnNpZ25lZCAoKlNpbXBsZVNlbGVjdG9yQ2hlY2tlcikoRWxlbWVudCopOwor
dHlwZWRlZiB1bnNpZ25lZCAoKlNlbGVjdG9yQ2hlY2tlcldpdGhDaGVja2luZ0NvbnRleHQpKEVs
ZW1lbnQqLCBjb25zdCBDaGVja2luZ0NvbnRleHQqKTsKK0NTU1NlbGVjdG9yQ29tcGlsYXRpb25T
dGF0dXMgY29tcGlsZVNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiwgSlNDOjpWTSosIEpTQzo6
TWFjcm9Bc3NlbWJsZXJDb2RlUmVmJiBvdXRwdXRDb2RlUmVmKTsKKworaW5saW5lIFNpbXBsZVNl
bGVjdG9yQ2hlY2tlciBzaW1wbGVTZWxlY3RvckNoZWNrZXJGdW5jdGlvbih2b2lkKiBleGVjdXRh
YmxlQWRkcmVzcywgQ1NTU2VsZWN0b3JDb21waWxhdGlvblN0YXR1cyBjb21waWxhdGlvblN0YXR1
cykKK3sKKyAgICBBU1NFUlRfVU5VU0VEKGNvbXBpbGF0aW9uU3RhdHVzLCBjb21waWxhdGlvblN0
YXR1cyA9PSBDU1NTZWxlY3RvckNvbXBpbGF0aW9uU3RhdHVzOjpTaW1wbGVTZWxlY3RvckNoZWNr
ZXIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNpbXBsZVNlbGVjdG9yQ2hlY2tlcj4o
ZXhlY3V0YWJsZUFkZHJlc3MpOworfQorCitpbmxpbmUgU2VsZWN0b3JDaGVja2VyV2l0aENoZWNr
aW5nQ29udGV4dCBzZWxlY3RvckNoZWNrZXJGdW5jdGlvbldpdGhDaGVja2luZ0NvbnRleHQodm9p
ZCogZXhlY3V0YWJsZUFkZHJlc3MsIENTU1NlbGVjdG9yQ29tcGlsYXRpb25TdGF0dXMgY29tcGls
YXRpb25TdGF0dXMpCit7CisgICAgQVNTRVJUX1VOVVNFRChjb21waWxhdGlvblN0YXR1cywgY29t
cGlsYXRpb25TdGF0dXMgPT0gQ1NTU2VsZWN0b3JDb21waWxhdGlvblN0YXR1czo6U2VsZWN0b3JD
aGVja2VyV2l0aENoZWNraW5nQ29udGV4dCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
U2VsZWN0b3JDaGVja2VyV2l0aENoZWNraW5nQ29udGV4dD4oZXhlY3V0YWJsZUFkZHJlc3MpOwor
fQorCisKK30gLy8gbmFtZXNwYWNlIENTU1NlbGVjdG9yQ29tcGlsZXIKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShDU1NfU0VMRUNUT1JfSklUKQorCisjZW5kaWYg
Ly8gQ1NTU2VsZWN0b3JDb21waWxlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20v
RWxlbWVudC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKaW5kZXggNzlmNGUw
NDE5MjU3OTNjZjEzMmNkYWM4ZTgzNGY3MjljZjNkOTVmYy4uM2JmNzU5NmU5NDNmYTI2OThhNTc3
NTg5YjkyMzgzYWEzMzBiOTFjOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1l
bnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcApAQCAtMjIwMCw5ICsy
MjAwLDE0IEBAIHZvaWQgRWxlbWVudDo6c2V0Q2hpbGRyZW5BZmZlY3RlZEJ5RHJhZyhib29sIHZh
bHVlKQogICAgICAgICBlbnN1cmVFbGVtZW50UmFyZURhdGEoKS5zZXRDaGlsZHJlbkFmZmVjdGVk
QnlEcmFnKHZhbHVlKTsKIH0KIAotdm9pZCBFbGVtZW50OjpzZXRDaGlsZHJlbkFmZmVjdGVkQnlG
b3J3YXJkUG9zaXRpb25hbFJ1bGVzKCkKK3ZvaWQgRWxlbWVudDo6c2V0Q2hpbGRyZW5BZmZlY3Rl
ZEJ5RGlyZWN0QWRqYWNlbnRSdWxlcyhFbGVtZW50KiBlbGVtZW50KQogewotICAgIGVuc3VyZUVs
ZW1lbnRSYXJlRGF0YSgpLnNldENoaWxkcmVuQWZmZWN0ZWRCeUZvcndhcmRQb3NpdGlvbmFsUnVs
ZXModHJ1ZSk7CisgICAgZWxlbWVudC0+c2V0Q2hpbGRyZW5BZmZlY3RlZEJ5RGlyZWN0QWRqYWNl
bnRSdWxlcygpOworfQorCit2b2lkIEVsZW1lbnQ6OnNldENoaWxkcmVuQWZmZWN0ZWRCeUZvcndh
cmRQb3NpdGlvbmFsUnVsZXMoRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBlbGVtZW50LT5lbnN1
cmVFbGVtZW50UmFyZURhdGEoKS5zZXRDaGlsZHJlbkFmZmVjdGVkQnlGb3J3YXJkUG9zaXRpb25h
bFJ1bGVzKHRydWUpOwogfQogCiB2b2lkIEVsZW1lbnQ6OnNldENoaWxkcmVuQWZmZWN0ZWRCeUJh
Y2t3YXJkUG9zaXRpb25hbFJ1bGVzKCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9F
bGVtZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCmluZGV4IDBmYTlhNjExNmVk
OTg0YzZhNDI5Y2NkY2Q4ZWM4NzQzOTkzYWZmOGYuLjUxNTJlYmJjMjBhMjBhODgwMTg2YmVhMDll
NzUyMTBhZDIxYzk3NWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmgK
KysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaApAQCAtMjQ4LDYgKzI0OCw5IEBAIHB1
YmxpYzoKICAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKCk7CiAKICAgICBj
b25zdCBRdWFsaWZpZWROYW1lJiB0YWdRTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZTsg
fQorI2lmIEVOQUJMRShDU1NfU0VMRUNUT1JfSklUKQorICAgIHN0YXRpYyBwdHJkaWZmX3QgdGFn
UU5hbWVNZW1vcnlPZmZzZXQoKSB7IHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRWxlbWVudCwgbV90
YWdOYW1lKTsgfQorI2VuZGlmIC8vIEVOQUJMRShDU1NfU0VMRUNUT1JfSklUKQogICAgIFN0cmlu
ZyB0YWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbm9kZU5hbWUoKTsgfQogICAgIGJvb2wgaGFzVGFn
TmFtZShjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKSBjb25zdCB7IHJldHVybiBtX3RhZ05h
bWUubWF0Y2hlcyh0YWdOYW1lKTsgfQogICAgIApAQCAtMzY4LDggKzM3MSwxMCBAQCBwdWJsaWM6
CiAgICAgdm9pZCBzZXRDaGlsZHJlbkFmZmVjdGVkQnlEcmFnKGJvb2wpOwogICAgIHZvaWQgc2V0
Q2hpbGRyZW5BZmZlY3RlZEJ5Rmlyc3RDaGlsZFJ1bGVzKCkgeyBzZXRGbGFnKENoaWxkcmVuQWZm
ZWN0ZWRCeUZpcnN0Q2hpbGRSdWxlc0ZsYWcpOyB9CiAgICAgdm9pZCBzZXRDaGlsZHJlbkFmZmVj
dGVkQnlMYXN0Q2hpbGRSdWxlcygpIHsgc2V0RmxhZyhDaGlsZHJlbkFmZmVjdGVkQnlMYXN0Q2hp
bGRSdWxlc0ZsYWcpOyB9CisgICAgc3RhdGljIHZvaWQgc2V0Q2hpbGRyZW5BZmZlY3RlZEJ5RGly
ZWN0QWRqYWNlbnRSdWxlcyhFbGVtZW50Kik7CiAgICAgdm9pZCBzZXRDaGlsZHJlbkFmZmVjdGVk
QnlEaXJlY3RBZGphY2VudFJ1bGVzKCkgeyBzZXRGbGFnKENoaWxkcmVuQWZmZWN0ZWRCeURpcmVj
dEFkamFjZW50UnVsZXNGbGFnKTsgfQotICAgIHZvaWQgc2V0Q2hpbGRyZW5BZmZlY3RlZEJ5Rm9y
d2FyZFBvc2l0aW9uYWxSdWxlcygpOworICAgIHN0YXRpYyB2b2lkIHNldENoaWxkcmVuQWZmZWN0
ZWRCeUZvcndhcmRQb3NpdGlvbmFsUnVsZXMoRWxlbWVudCopOworICAgIHZvaWQgc2V0Q2hpbGRy
ZW5BZmZlY3RlZEJ5Rm9yd2FyZFBvc2l0aW9uYWxSdWxlcygpIHsgc2V0Q2hpbGRyZW5BZmZlY3Rl
ZEJ5Rm9yd2FyZFBvc2l0aW9uYWxSdWxlcyh0aGlzKTsgfQogICAgIHZvaWQgc2V0Q2hpbGRyZW5B
ZmZlY3RlZEJ5QmFja3dhcmRQb3NpdGlvbmFsUnVsZXMoKTsKICAgICB2b2lkIHNldENoaWxkSW5k
ZXgodW5zaWduZWQpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oIGIv
U291cmNlL1dlYkNvcmUvZG9tL05vZGUuaAppbmRleCBlN2E0YTE1NmMwOTM5M2JmYTg4OWQ5NTcz
OTM1NDQ3N2ZkMTBjMjg4Li4zOTUyM2M2NTJiNzIxNjA3NjdjODE1ZTI2NzVlNzEyOTBiMjdmMzFm
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2RvbS9Ob2RlLmgKQEAgLTE2OSw4ICsxNjksMTQgQEAgcHVibGljOgogICAgIHZpcnR1YWwg
dm9pZCBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwogICAgIHZp
cnR1YWwgTm9kZVR5cGUgbm9kZVR5cGUoKSBjb25zdCA9IDA7CiAgICAgQ29udGFpbmVyTm9kZSog
cGFyZW50Tm9kZSgpIGNvbnN0OworI2lmIEVOQUJMRShDU1NfU0VMRUNUT1JfSklUKQorICAgIHN0
YXRpYyBwdHJkaWZmX3QgcGFyZW50Tm9kZU1lbW9yeU9mZnNldCgpIHsgcmV0dXJuIE9CSkVDVF9P
RkZTRVRPRihOb2RlLCBtX3BhcmVudE5vZGUpOyB9CisjZW5kaWYgLy8gRU5BQkxFKENTU19TRUxF
Q1RPUl9KSVQpCiAgICAgRWxlbWVudCogcGFyZW50RWxlbWVudCgpIGNvbnN0OwogICAgIE5vZGUq
IHByZXZpb3VzU2libGluZygpIGNvbnN0IHsgcmV0dXJuIG1fcHJldmlvdXM7IH0KKyNpZiBFTkFC
TEUoQ1NTX1NFTEVDVE9SX0pJVCkKKyAgICBzdGF0aWMgcHRyZGlmZl90IHByZXZpb3VzU2libGlu
Z01lbW9yeU9mZnNldCgpIHsgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOb2RlLCBtX3ByZXZpb3Vz
KTsgfQorI2VuZGlmIC8vIEVOQUJMRShDU1NfU0VMRUNUT1JfSklUKQogICAgIE5vZGUqIG5leHRT
aWJsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9uZXh0OyB9CiAgICAgUGFzc1JlZlB0cjxOb2RlTGlz
dD4gY2hpbGROb2RlcygpOwogICAgIE5vZGUqIGZpcnN0Q2hpbGQoKSBjb25zdDsKQEAgLTU2NCw2
ICs1NzAsMTEgQEAgcHVibGljOgogCiAgICAgdm9pZCBtYXJrQW5jZXN0b3JzV2l0aENoaWxkTmVl
ZHNTdHlsZVJlY2FsYygpOwogCisjaWYgRU5BQkxFKENTU19TRUxFQ1RPUl9KSVQpCisgICAgc3Rh
dGljIHB0cmRpZmZfdCBub2RlRmxhZ3NNZW1vcnlPZmZzZXQoKSB7IHJldHVybiBPQkpFQ1RfT0ZG
U0VUT0YoTm9kZSwgbV9ub2RlRmxhZ3MpOyB9CisgICAgc3RhdGljIHVpbnQ4X3QgZmxhZ0lzRWxl
bWVudCgpIHsgcmV0dXJuIElzRWxlbWVudEZsYWc7IH0KKyNlbmRpZiAvLyBFTkFCTEUoQ1NTX1NF
TEVDVE9SX0pJVCkKKwogcHJvdGVjdGVkOgogICAgIGVudW0gTm9kZUZsYWdzIHsKICAgICAgICAg
SXNUZXh0RmxhZyA9IDEsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vUXVhbGlmaWVk
TmFtZS5oIGIvU291cmNlL1dlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuaAppbmRleCA3OGYxM2Nm
MjY4YjU1MGU0ZWYxOGZmZDExYjAzNmMwMTkwZjlhM2JlLi5jNjRhYzJkZDE5OTUwZGEyZWQ0YjJi
MGU5N2ZkODZlMmUwZDU1MTY0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vUXVhbGlm
aWVkTmFtZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmgKQEAgLTU0
LDYgKzU0LDExIEBAIHB1YmxpYzoKICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nIG1fbmFtZXNw
YWNlOwogICAgICAgICBtdXRhYmxlIEF0b21pY1N0cmluZyBtX2xvY2FsTmFtZVVwcGVyOwogCisj
aWYgRU5BQkxFKENTU19TRUxFQ1RPUl9KSVQpCisgICAgICAgIHN0YXRpYyBwdHJkaWZmX3QgbG9j
YWxOYW1lTWVtb3J5T2Zmc2V0KCkgeyByZXR1cm4gT0JKRUNUX09GRlNFVE9GKFF1YWxpZmllZE5h
bWVJbXBsLCBtX2xvY2FsTmFtZSk7IH0KKyAgICAgICAgc3RhdGljIHB0cmRpZmZfdCBuYW1lc3Bh
Y2VNZW1vcnlPZmZzZXQoKSB7IHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoUXVhbGlmaWVkTmFtZUlt
cGwsIG1fbmFtZXNwYWNlKTsgfQorI2VuZGlmIC8vIEVOQUJMRShDU1NfU0VMRUNUT1JfSklUKQor
CiAgICAgcHJpdmF0ZToKICAgICAgICAgUXVhbGlmaWVkTmFtZUltcGwoY29uc3QgQXRvbWljU3Ry
aW5nJiBwcmVmaXgsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lLCBjb25zdCBBdG9taWNT
dHJpbmcmIG5hbWVzcGFjZVVSSSkKICAgICAgICAgICAgIDogbV9leGlzdGluZ0hhc2goMCkKQEAg
LTk2LDYgKzEwMSw5IEBAIHB1YmxpYzoKICAgICBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKIAog
ICAgIFF1YWxpZmllZE5hbWVJbXBsKiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9Cisj
aWYgRU5BQkxFKENTU19TRUxFQ1RPUl9KSVQpCisgICAgc3RhdGljIHB0cmRpZmZfdCBpbXBsTWVt
b3J5T2Zmc2V0KCkgeyByZXR1cm4gT0JKRUNUX09GRlNFVE9GKFF1YWxpZmllZE5hbWUsIG1faW1w
bCk7IH0KKyNlbmRpZiAvLyBFTkFCTEUoQ1NTX1NFTEVDVE9SX0pJVCkKICAgICAKICAgICAvLyBJ
bml0IHJvdXRpbmUgZm9yIGdsb2JhbHMKICAgICBzdGF0aWMgdm9pZCBpbml0KCk7Cg==
</data>
<flag name="review"
          id="243390"
          type_id="1"
          status="+"
          setter="koivisto"
    />
    <flag name="commit-queue"
          id="243392"
          type_id="3"
          status="-"
          setter="eflews.bot"
    />
          </attachment>
      

    </bug>

</bugzilla>