<?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>24086</bug_id>
          
          <creation_ts>2009-02-22 21:20:55 -0800</creation_ts>
          <short_desc>Regression (r40993): WebKit crashes after logging in to lists.zenbe.com</short_desc>
          <delta_ts>2009-02-25 23:05:12 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac (Intel)</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://lists.zenbe.com</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar, NeedsReduction, Regression</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kevin Ballard">kevin</reporter>
          <assigned_to name="Cameron Zwarich (cpst)">zwarich</assigned_to>
          <cc>barraclough</cc>
    
    <cc>ggaren</cc>
    
    <cc>zwarich</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>110531</commentid>
    <comment_count>0</comment_count>
    <who name="Kevin Ballard">kevin</who>
    <bug_when>2009-02-22 21:20:55 -0800</bug_when>
    <thetext>The latest WebKit nightly (r41128) crashes 100% of the time after logging in to lists.zenbe.com. Crash was confirmed by pewtermoose in #webkit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110532</commentid>
    <comment_count>1</comment_count>
    <who name="Matt Lilek">dev+webkit</who>
    <bug_when>2009-02-22 22:01:31 -0800</bug_when>
    <thetext>Confirmed with r41128 debug build, also crashes with same backtrace when adding a second item to a list:

Thread 0 Crashed:
0   ???                           	0000000000 0 + 0
1   com.apple.JavaScriptCore      	0x0056a126 JSC::JITCode::execute(JSC::RegisterFile*, JSC::ExecState*, JSC::JSGlobalData*, JSC::JSValuePtr*) + 58 (JITCode.h:86)
2   com.apple.JavaScriptCore      	0x00553dae JSC::Interpreter::execute(JSC::FunctionBodyNode*, JSC::ExecState*, JSC::JSFunction*, JSC::JSObject*, JSC::ArgList const&amp;, JSC::ScopeChainNode*, JSC::JSValuePtr*) + 888 (Interpreter.cpp:730)
3   com.apple.JavaScriptCore      	0x004a4589 JSC::JSFunction::call(JSC::ExecState*, JSC::JSValuePtr, JSC::ArgList const&amp;) + 139 (JSFunction.cpp:83)
4   com.apple.JavaScriptCore      	0x004a4642 JSC::call(JSC::ExecState*, JSC::JSValuePtr, JSC::CallType, JSC::CallData const&amp;, JSC::JSValuePtr, JSC::ArgList const&amp;) + 178 (CallData.cpp:39)
5   com.apple.JavaScriptCore      	0x004b3390 __ZN3JSCL22functionProtoFuncApplyEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE + 686 (FunctionPrototype.cpp:125)
6   com.apple.JavaScriptCore      	0x0058b042 JSC::JITStubs::cti_op_call_NotJSFunction(void*, ...) + 534 (JITStubs.cpp:957)
7   com.apple.JavaScriptCore      	0x0058515e jscGeneratedNativeCode + 0 (JITStubs.cpp:238)
8   com.apple.JavaScriptCore      	0x0056a126 JSC::JITCode::execute(JSC::RegisterFile*, JSC::ExecState*, JSC::JSGlobalData*, JSC::JSValuePtr*) + 58 (JITCode.h:86)
9   com.apple.JavaScriptCore      	0x00553dae JSC::Interpreter::execute(JSC::FunctionBodyNode*, JSC::ExecState*, JSC::JSFunction*, JSC::JSObject*, JSC::ArgList const&amp;, JSC::ScopeChainNode*, JSC::JSValuePtr*) + 888 (Interpreter.cpp:730)
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110774</commentid>
    <comment_count>2</comment_count>
    <who name="Kevin Ballard">kevin</who>
    <bug_when>2009-02-24 11:16:35 -0800</bug_when>
    <thetext>This bug has made it into the Safari 4 beta. Quite unfortunate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110779</commentid>
    <comment_count>3</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-24 11:23:16 -0800</bug_when>
    <thetext>That&apos;s too bad, Kevin. :-(

I&apos;ll try to reduce this today, so I can fix it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110834</commentid>
    <comment_count>4</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-24 15:13:47 -0800</bug_when>
    <thetext>I&apos;m in the middle of reducing the JS from the page. It&apos;s still about 10 000 lines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110885</commentid>
    <comment_count>5</comment_count>
      <attachid>27953</attachid>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-24 18:34:40 -0800</bug_when>
    <thetext>Created attachment 27953
Partial reduction

Here is a partial reduction of the crash. It is still about 5700 lines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110917</commentid>
    <comment_count>6</comment_count>
      <attachid>27960</attachid>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-24 23:38:09 -0800</bug_when>
    <thetext>Created attachment 27960
Further reduction</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111039</commentid>
    <comment_count>7</comment_count>
      <attachid>27985</attachid>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-25 14:29:26 -0800</bug_when>
    <thetext>Created attachment 27985
Further reduction</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111102</commentid>
    <comment_count>8</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-25 21:01:36 -0800</bug_when>
    <thetext>Here&apos;s a reduction that only works with commandline jsc, compiled with all extra JIT optimizations off:

function f()
{
}

[].sort(f);
f();

It doesn&apos;t crash with caching of calls turned on. This more complicated example crashes with caching of calls enabled:

function f() { } [].sort(f); function g() { } function h(x) { x(); } h(g); h(g); h(g); h(f);

This is caused by r40993:

http://trac.webkit.org/changeset/40993

This patch creates CodeBlocks with no JIT code, breaking an assumption in the function call logic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111106</commentid>
    <comment_count>9</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-25 21:13:34 -0800</bug_when>
    <thetext>Gavin and I talked about it a bit and we agree that the best fix is to simply generate JIT code whenever we optimize numeric sorts. The question is whether to add this as an ad-hoc thing at the end of isNumericCompareFunction() or to encapsulate it in FunctionBodyNode in some way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111110</commentid>
    <comment_count>10</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-02-25 22:48:54 -0800</bug_when>
    <thetext>&lt;rdar://problem/6625111&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111111</commentid>
    <comment_count>11</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-25 23:05:12 -0800</bug_when>
    <thetext>Fixed in r41243.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27953</attachid>
            <date>2009-02-24 18:34:40 -0800</date>
            <delta_ts>2009-02-24 23:38:09 -0800</delta_ts>
            <desc>Partial reduction</desc>
            <filename>reduction.html</filename>
            <type>text/html</type>
            <size>120881</size>
            <attacher name="Cameron Zwarich (cpst)">zwarich</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiPgp3aW5kb3cuYm9vdHN0cmFwRGF0YSA9IHsiaW5pdGlhbFVzZXJEYXRhIjp7InNjcm9sbE9y
aWVudGF0aW9uIjoiYm90dG9tVXAiLCJsYXN0TmFtZSI6Ilp3YXJpY2giLCJrbGFzcyI6Ikxpc3RV
c2VyIiwibG9naW4iOiJjd3p3YXJpY2giLCJzZWN1cml0eUtleSI6IkpxMUk4M2doT1hwNkV5c3ho
STBaemRYRW1JZDJhQlI1UE1LdnlKeHMiLCJ0aW1lWm9uZSI6IlVTXC9FYXN0ZXJuIiwiZmlyc3RO
YW1lIjoiQ2FtZXJvbiIsInplbnBhZ2VzTmFtZSI6ImN3endhcmljaCIsImlkIjoxMTI1NDZ9LCJs
aXN0cyI6W3sicHVibGljS2V5Ijoib29mZzYiLCJrbGFzcyI6IlRvZG9MaXN0Iiwic3VwZXJjb21w
b25lbnRJZHMiOltdLCJuYW1lIjoiQ2FtZXJvbiIsImRlbGV0ZWRBdCI6bnVsbCwic2VjdXJpdHlL
ZXkiOiIyZXlnQ3V2RkdhMXlYdG5QZHRoWHYyNkRSMUxJT0hZUkNPQXhad05PIiwic2hvd1F1aWNr
dmlldyI6dHJ1ZSwiZXhwYW5kZWQiOm51bGwsInVwZGF0ZWRBdCI6IjIwMDkvMDIvMjQgMjE6NTU6
MzcgKzAwMDAiLCJzdWJjb21wb25lbnRJZHMiOltdLCJjcmVhdGVkQXQiOiIyMDA5LzAyLzI0IDIx
OjU1OjM3ICswMDAwIiwiaWQiOjM4MzYyMCwiYXJjaGl2ZWQiOm51bGwsImF1dGhvcml6ZWRVc2Vy
cyI6W3sic2Nyb2xsT3JpZW50YXRpb24iOiJib3R0b21VcCIsImxhc3ROYW1lIjoiWndhcmljaCIs
ImtsYXNzIjoiTGlzdFVzZXIiLCJsb2dpbiI6ImN3endhcmljaCIsInNlY3VyaXR5S2V5IjoiSnEx
STgzZ2hPWHA2RXlzeGhJMFp6ZFhFbUlkMmFCUjVQTUt2eUp4cyIsInRpbWVab25lIjoiVVNcL0Vh
c3Rlcm4iLCJmaXJzdE5hbWUiOiJDYW1lcm9uIiwiemVucGFnZXNOYW1lIjoiY3d6d2FyaWNoIiwi
aWQiOjExMjU0Nn1dLCJ2ZXJzaW9uIjowLCJ1c2VySWQiOjExMjU0NiwidXBkYXRlZEJ5IjpudWxs
LCJwcm9kaWQiOm51bGwsIl9uZXciOnRydWUsIndpZGdldENvbGxhcHNlZCI6ZmFsc2UsIm93bmVy
Ijp0cnVlLCJwb3NpdGlvbiI6Miwic3RhckNvbG9yIjpudWxsfSx7InB1YmxpY0tleSI6ImVieXFs
Iiwia2xhc3MiOiJUb2RvTGlzdCIsInN1cGVyY29tcG9uZW50SWRzIjpbXSwibmFtZSI6IkJsYWgi
LCJkZWxldGVkQXQiOm51bGwsInNlY3VyaXR5S2V5IjoiZXBFc2JwOG9uZjdsR3VCTjV6REwzTGxu
SXkxdUhTRU1nc0J4NTV1QiIsInNob3dRdWlja3ZpZXciOnRydWUsImV4cGFuZGVkIjpudWxsLCJ1
cGRhdGVkQXQiOiIyMDA5LzAyLzI0IDIxOjU1OjQwICswMDAwIiwic3ViY29tcG9uZW50SWRzIjpb
XSwiY3JlYXRlZEF0IjoiMjAwOS8wMi8yNCAyMTo1NTo0MCArMDAwMCIsImlkIjozODM2MjEsImFy
Y2hpdmVkIjpudWxsLCJhdXRob3JpemVkVXNlcnMiOlt7InNjcm9sbE9yaWVudGF0aW9uIjoiYm90
dG9tVXAiLCJsYXN0TmFtZSI6Ilp3YXJpY2giLCJrbGFzcyI6Ikxpc3RVc2VyIiwibG9naW4iOiJj
d3p3YXJpY2giLCJzZWN1cml0eUtleSI6IkpxMUk4M2doT1hwNkV5c3hoSTBaemRYRW1JZDJhQlI1
UE1LdnlKeHMiLCJ0aW1lWm9uZSI6IlVTXC9FYXN0ZXJuIiwiZmlyc3ROYW1lIjoiQ2FtZXJvbiIs
InplbnBhZ2VzTmFtZSI6ImN3endhcmljaCIsImlkIjoxMTI1NDZ9XSwidmVyc2lvbiI6MCwidXNl
cklkIjoxMTI1NDYsInVwZGF0ZWRCeSI6bnVsbCwicHJvZGlkIjpudWxsLCJfbmV3Ijp0cnVlLCJ3
aWRnZXRDb2xsYXBzZWQiOmZhbHNlLCJvd25lciI6dHJ1ZSwicG9zaXRpb24iOjEsInN0YXJDb2xv
ciI6bnVsbH0seyJwdWJsaWNLZXkiOiJuYWpyZiIsImtsYXNzIjoiVG9kb0xpc3QiLCJzdXBlcmNv
bXBvbmVudElkcyI6W10sIm5hbWUiOiJUaGlzIiwiZGVsZXRlZEF0IjpudWxsLCJzZWN1cml0eUtl
eSI6Ikt3QzUwTEh4c0Z1eHZYaFpiSWRRM2xLQUlGRlU4U2l3TWJoWEtsQnoiLCJzaG93UXVpY2t2
aWV3Ijp0cnVlLCJleHBhbmRlZCI6bnVsbCwidXBkYXRlZEF0IjoiMjAwOS8wMi8yNCAyMTo1NTo0
MyArMDAwMCIsInN1YmNvbXBvbmVudElkcyI6W10sImNyZWF0ZWRBdCI6IjIwMDkvMDIvMjQgMjE6
NTU6NDMgKzAwMDAiLCJpZCI6MzgzNjIyLCJhcmNoaXZlZCI6bnVsbCwiYXV0aG9yaXplZFVzZXJz
IjpbeyJzY3JvbGxPcmllbnRhdGlvbiI6ImJvdHRvbVVwIiwibGFzdE5hbWUiOiJad2FyaWNoIiwi
a2xhc3MiOiJMaXN0VXNlciIsImxvZ2luIjoiY3d6d2FyaWNoIiwic2VjdXJpdHlLZXkiOiJKcTFJ
ODNnaE9YcDZFeXN4aEkwWnpkWEVtSWQyYUJSNVBNS3Z5SnhzIiwidGltZVpvbmUiOiJVU1wvRWFz
dGVybiIsImZpcnN0TmFtZSI6IkNhbWVyb24iLCJ6ZW5wYWdlc05hbWUiOiJjd3p3YXJpY2giLCJp
ZCI6MTEyNTQ2fV0sInZlcnNpb24iOjAsInVzZXJJZCI6MTEyNTQ2LCJ1cGRhdGVkQnkiOm51bGws
InByb2RpZCI6bnVsbCwiX25ldyI6dHJ1ZSwid2lkZ2V0Q29sbGFwc2VkIjpmYWxzZSwib3duZXIi
OnRydWUsInBvc2l0aW9uIjowLCJzdGFyQ29sb3IiOm51bGx9XX07Cgp2YXIgUHJvdG90eXBlPXsK
IFZlcnNpb246JzEuNi4wLjInLAoKIEJyb3dzZXI6ewogSUU6ISEod2luZG93LmF0dGFjaEV2ZW50
JiYhd2luZG93Lm9wZXJhKSwKIE9wZXJhOiEhd2luZG93Lm9wZXJhLAogV2ViS2l0Om5hdmlnYXRv
ci51c2VyQWdlbnQuaW5kZXhPZignQXBwbGVXZWJLaXQvJyk+LTEsCiBHZWNrbzpuYXZpZ2F0b3Iu
dXNlckFnZW50LmluZGV4T2YoJ0dlY2tvJyk+LTEmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhP
ZignS0hUTUwnKT09LTEsCiBNb2JpbGVTYWZhcmk6ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNo
KC9BcHBsZS4qTW9iaWxlLipTYWZhcmkvKQp9LAoKIEJyb3dzZXJGZWF0dXJlczp7CiBYUGF0aDoh
IWRvY3VtZW50LmV2YWx1YXRlLAogRWxlbWVudEV4dGVuc2lvbnM6ISF3aW5kb3cuSFRNTEVsZW1l
bnQsCiBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOgogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
ZGl2JykuX19wcm90b19fJiYKIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLl9fcHJvdG9f
XyE9PQogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpLl9fcHJvdG9fXwp9LAoKIFNjcmlw
dEZyYWdtZW50Oic8c2NyaXB0W14+XSo+KFtcXFNcXHNdKj8pPFwvc2NyaXB0PicsCiBKU09ORmls
dGVyOi9eXC9cKi1zZWN1cmUtKFtcc1xTXSopXCpcL1xzKiQvLAoKIGVtcHR5RnVuY3Rpb246ZnVu
Y3Rpb24oKXt9LAogSzpmdW5jdGlvbih4KXtyZXR1cm4geH0KfTsKCmlmKFByb3RvdHlwZS5Ccm93
c2VyLk1vYmlsZVNhZmFyaSkKIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNFbGVt
ZW50RXh0ZW5zaW9ucz1mYWxzZTsKCgoKdmFyIENsYXNzPXsKIGNyZWF0ZTpmdW5jdGlvbigpewog
dmFyIHBhcmVudD1udWxsLHByb3BlcnRpZXM9JEEoYXJndW1lbnRzKTsKIGlmKE9iamVjdC5pc0Z1
bmN0aW9uKHByb3BlcnRpZXNbMF0pKQogcGFyZW50PXByb3BlcnRpZXMuc2hpZnQoKTsKCiBmdW5j
dGlvbiBrbGFzcygpewogdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKfQoK
IE9iamVjdC5leHRlbmQoa2xhc3MsQ2xhc3MuTWV0aG9kcyk7CiBrbGFzcy5zdXBlcmNsYXNzPXBh
cmVudDsKIGtsYXNzLnN1YmNsYXNzZXM9W107CgogaWYocGFyZW50KXsKIHZhciBzdWJjbGFzcz1m
dW5jdGlvbigpe307CiBzdWJjbGFzcy5wcm90b3R5cGU9cGFyZW50LnByb3RvdHlwZTsKIGtsYXNz
LnByb3RvdHlwZT1uZXcgc3ViY2xhc3M7CiBwYXJlbnQuc3ViY2xhc3Nlcy5wdXNoKGtsYXNzKTsK
fQoKIGZvcih2YXIgaT0wO2k8cHJvcGVydGllcy5sZW5ndGg7aSsrKQoga2xhc3MuYWRkTWV0aG9k
cyhwcm9wZXJ0aWVzW2ldKTsKCiBpZigha2xhc3MucHJvdG90eXBlLmluaXRpYWxpemUpCiBrbGFz
cy5wcm90b3R5cGUuaW5pdGlhbGl6ZT1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKCiBrbGFzcy5w
cm90b3R5cGUuY29uc3RydWN0b3I9a2xhc3M7CgogcmV0dXJuIGtsYXNzOwp9Cn07CgpDbGFzcy5N
ZXRob2RzPXsKIGFkZE1ldGhvZHM6ZnVuY3Rpb24oc291cmNlKXsKIHZhciBhbmNlc3Rvcj10aGlz
LnN1cGVyY2xhc3MmJnRoaXMuc3VwZXJjbGFzcy5wcm90b3R5cGU7CiB2YXIgcHJvcGVydGllcz1P
YmplY3Qua2V5cyhzb3VyY2UpOwoKIGlmKCFPYmplY3Qua2V5cyh7dG9TdHJpbmc6dHJ1ZX0pLmxl
bmd0aCkKIHByb3BlcnRpZXMucHVzaCgidG9TdHJpbmciLCJ2YWx1ZU9mIik7CgogZm9yKHZhciBp
PTAsbGVuZ3RoPXByb3BlcnRpZXMubGVuZ3RoO2k8bGVuZ3RoO2krKyl7CiB2YXIgcHJvcGVydHk9
cHJvcGVydGllc1tpXSx2YWx1ZT1zb3VyY2VbcHJvcGVydHldOwogaWYoYW5jZXN0b3ImJk9iamVj
dC5pc0Z1bmN0aW9uKHZhbHVlKSYmCiB2YWx1ZS5hcmd1bWVudE5hbWVzKCkuZmlyc3QoKT09IiRz
dXBlciIpewogdmFyIG1ldGhvZD12YWx1ZSx2YWx1ZT1PYmplY3QuZXh0ZW5kKChmdW5jdGlvbiht
KXsKIHJldHVybiBmdW5jdGlvbigpe3JldHVybiBhbmNlc3RvclttXS5hcHBseSh0aGlzLGFyZ3Vt
ZW50cyl9Owp9KShwcm9wZXJ0eSkud3JhcChtZXRob2QpLHsKIHZhbHVlT2Y6ZnVuY3Rpb24oKXty
ZXR1cm4gbWV0aG9kfSwKIHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIG1ldGhvZC50b1N0cmlu
ZygpfQp9KTsKfQogdGhpcy5wcm90b3R5cGVbcHJvcGVydHldPXZhbHVlOwp9CgogcmV0dXJuIHRo
aXM7Cn0KfTsKCnZhciBBYnN0cmFjdD17fTsKCk9iamVjdC5leHRlbmQ9ZnVuY3Rpb24oZGVzdGlu
YXRpb24sc291cmNlKXsKIGZvcih2YXIgcHJvcGVydHkgaW4gc291cmNlKQogZGVzdGluYXRpb25b
cHJvcGVydHldPXNvdXJjZVtwcm9wZXJ0eV07CiByZXR1cm4gZGVzdGluYXRpb247Cn07CgpPYmpl
Y3QuZXh0ZW5kKE9iamVjdCx7CiBpbnNwZWN0OmZ1bmN0aW9uKG9iamVjdCl7CiB0cnl7CiBpZihP
YmplY3QuaXNVbmRlZmluZWQob2JqZWN0KSlyZXR1cm4ndW5kZWZpbmVkJzsKIGlmKG9iamVjdD09
PW51bGwpcmV0dXJuJ251bGwnOwogcmV0dXJuIG9iamVjdC5pbnNwZWN0P29iamVjdC5pbnNwZWN0
KCk6U3RyaW5nKG9iamVjdCk7Cn1jYXRjaChlKXsKIGlmKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9y
KXJldHVybicuLi4nOwogdGhyb3cgZTsKfQp9LAoKIHRvSlNPTjpmdW5jdGlvbihvYmplY3Qpewog
dmFyIHR5cGU9dHlwZW9mIG9iamVjdDsKIHN3aXRjaCh0eXBlKXsKIGNhc2UndW5kZWZpbmVkJzoK
IGNhc2UnZnVuY3Rpb24nOgogY2FzZSd1bmtub3duJzpyZXR1cm47CiBjYXNlJ2Jvb2xlYW4nOnJl
dHVybiBvYmplY3QudG9TdHJpbmcoKTsKfQoKIGlmKG9iamVjdD09PW51bGwpcmV0dXJuJ251bGwn
OwogaWYob2JqZWN0LnRvSlNPTilyZXR1cm4gb2JqZWN0LnRvSlNPTigpOwogaWYoT2JqZWN0Lmlz
RWxlbWVudChvYmplY3QpKXJldHVybjsKCiB2YXIgcmVzdWx0cz1bXTsKIGZvcih2YXIgcHJvcGVy
dHkgaW4gb2JqZWN0KXsKIHZhciB2YWx1ZT1PYmplY3QudG9KU09OKG9iamVjdFtwcm9wZXJ0eV0p
OwogaWYoIU9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpCiByZXN1bHRzLnB1c2gocHJvcGVydHku
dG9KU09OKCkrJzogJyt2YWx1ZSk7Cn0KCiByZXR1cm4neycrcmVzdWx0cy5qb2luKCcsICcpKyd9
JzsKfSwKCiB0b1F1ZXJ5U3RyaW5nOmZ1bmN0aW9uKG9iamVjdCl7CiByZXR1cm4gJEgob2JqZWN0
KS50b1F1ZXJ5U3RyaW5nKCk7Cn0sCgogdG9IVE1MOmZ1bmN0aW9uKG9iamVjdCl7CiByZXR1cm4g
b2JqZWN0JiZvYmplY3QudG9IVE1MP29iamVjdC50b0hUTUwoKTpTdHJpbmcuaW50ZXJwcmV0KG9i
amVjdCk7Cn0sCgoga2V5czpmdW5jdGlvbihvYmplY3QpewogdmFyIGtleXM9W107CiBmb3IodmFy
IHByb3BlcnR5IGluIG9iamVjdCkKIGtleXMucHVzaChwcm9wZXJ0eSk7CiByZXR1cm4ga2V5czsK
fSwKCiB2YWx1ZXM6ZnVuY3Rpb24ob2JqZWN0KXsKIHZhciB2YWx1ZXM9W107CiBmb3IodmFyIHBy
b3BlcnR5IGluIG9iamVjdCkKIHZhbHVlcy5wdXNoKG9iamVjdFtwcm9wZXJ0eV0pOwogcmV0dXJu
IHZhbHVlczsKfSwKCiBjbG9uZTpmdW5jdGlvbihvYmplY3QpewogcmV0dXJuIE9iamVjdC5leHRl
bmQoe30sb2JqZWN0KTsKfSwKCiBpc0VsZW1lbnQ6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiBv
YmplY3QmJm9iamVjdC5ub2RlVHlwZT09MTsKfSwKCiBpc0FycmF5OmZ1bmN0aW9uKG9iamVjdCl7
CiByZXR1cm4hIShvYmplY3QmJm9iamVjdC5qb2luJiZvYmplY3Quc3BsaWNlKTsKfSwKCiBpc0hh
c2g6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBIYXNoOwp9LAoK
IGlzRnVuY3Rpb246ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiB0eXBlb2Ygb2JqZWN0PT0iZnVu
Y3Rpb24iOwp9LAoKIGlzU3RyaW5nOmZ1bmN0aW9uKG9iamVjdCl7CiByZXR1cm4gdHlwZW9mIG9i
amVjdD09InN0cmluZyI7Cn0sCgogaXNOdW1iZXI6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiB0
eXBlb2Ygb2JqZWN0PT0ibnVtYmVyIjsKfSwKCiBpc1VuZGVmaW5lZDpmdW5jdGlvbihvYmplY3Qp
ewogcmV0dXJuIHR5cGVvZiBvYmplY3Q9PSJ1bmRlZmluZWQiOwp9Cn0pOwoKT2JqZWN0LmV4dGVu
ZChGdW5jdGlvbi5wcm90b3R5cGUsewogYXJndW1lbnROYW1lczpmdW5jdGlvbigpewogdmFyIG5h
bWVzPXRoaXMudG9TdHJpbmcoKS5tYXRjaCgvXltcc1woXSpmdW5jdGlvblteKF0qXCgoLio/KVwp
LylbMV0uc3BsaXQoIiwiKS5pbnZva2UoInN0cmlwIik7CiByZXR1cm4gbmFtZXMubGVuZ3RoPT0x
JiYhbmFtZXNbMF0/W106bmFtZXM7Cn0sCgogYmluZDpmdW5jdGlvbigpewogdmFyIF9fbWV0aG9k
PXRoaXMsb2JqZWN0PWFyZ3VtZW50c1swXTsKIGlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7CiByZXR1
cm4hb2JqZWN0P3RoaXM6ZnVuY3Rpb24oKXsKIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3Qs
YXJndW1lbnRzKTsKfQp9CiB2YXIgYXJncz0kQShhcmd1bWVudHMpOwogYXJncy5zaGlmdCgpOwog
cmV0dXJuIGZ1bmN0aW9uKCl7CiByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0LGFyZ3MuY29u
Y2F0KCRBKGFyZ3VtZW50cykpKTsKfQp9LAoKIGJpbmRBc0V2ZW50TGlzdGVuZXI6ZnVuY3Rpb24o
KXsKIHZhciBfX21ldGhvZD10aGlzLGFyZ3M9JEEoYXJndW1lbnRzKSxvYmplY3Q9YXJncy5zaGlm
dCgpOwogcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KXsKIHJldHVybiBfX21ldGhvZC5hcHBseShvYmpl
Y3QsW2V2ZW50fHx3aW5kb3cuZXZlbnRdLmNvbmNhdChhcmdzKSk7Cn0KfSwKCiBjdXJyeTpmdW5j
dGlvbigpewogaWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXM7CiB2YXIgX19tZXRob2Q9
dGhpcyxhcmdzPSRBKGFyZ3VtZW50cyk7CiByZXR1cm4gZnVuY3Rpb24oKXsKIHJldHVybiBfX21l
dGhvZC5hcHBseSh0aGlzLGFyZ3MuY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKfQp9LAoKIGRlbGF5
OmZ1bmN0aW9uKCl7CiB2YXIgX19tZXRob2Q9dGhpcyxhcmdzPSRBKGFyZ3VtZW50cyksdGltZW91
dD1hcmdzLnNoaWZ0KCkqMTAwMDsKIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigp
ewogcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0aG9kLGFyZ3MpOwp9LHRpbWVvdXQpOwp9LAoK
IHdyYXA6ZnVuY3Rpb24od3JhcHBlcil7CiB2YXIgX19tZXRob2Q9dGhpczsKIHJldHVybiBmdW5j
dGlvbigpewogcmV0dXJuIHdyYXBwZXIuYXBwbHkodGhpcyxbX19tZXRob2QuYmluZCh0aGlzKV0u
Y29uY2F0KCRBKGFyZ3VtZW50cykpKTsKfQp9LAoKIG1ldGhvZGl6ZTpmdW5jdGlvbigpewogaWYo
dGhpcy5fbWV0aG9kaXplZClyZXR1cm4gdGhpcy5fbWV0aG9kaXplZDsKIHZhciBfX21ldGhvZD10
aGlzOwogcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQ9ZnVuY3Rpb24oKXsKIHJldHVybiBfX21ldGhv
ZC5hcHBseShudWxsLFt0aGlzXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwp9Owp9Cn0pOwoKRnVu
Y3Rpb24ucHJvdG90eXBlLmRlZmVyPUZ1bmN0aW9uLnByb3RvdHlwZS5kZWxheS5jdXJyeSgwLjAx
KTsKCkRhdGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpewogcmV0dXJuJyInK3RoaXMuZ2V0
VVRDRnVsbFllYXIoKSsnLScrCih0aGlzLmdldFVUQ01vbnRoKCkrMSkudG9QYWRkZWRTdHJpbmco
MikrJy0nKwogdGhpcy5nZXRVVENEYXRlKCkudG9QYWRkZWRTdHJpbmcoMikrJ1QnKwogdGhpcy5n
ZXRVVENIb3VycygpLnRvUGFkZGVkU3RyaW5nKDIpKyc6JysKIHRoaXMuZ2V0VVRDTWludXRlcygp
LnRvUGFkZGVkU3RyaW5nKDIpKyc6JysKIHRoaXMuZ2V0VVRDU2Vjb25kcygpLnRvUGFkZGVkU3Ry
aW5nKDIpKydaIic7Cn07Cgp2YXIgVHJ5PXsKIHRoZXNlOmZ1bmN0aW9uKCl7CiB2YXIgcmV0dXJu
VmFsdWU7CgogZm9yKHZhciBpPTAsbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW5ndGg7aSsr
KXsKIHZhciBsYW1iZGE9YXJndW1lbnRzW2ldOwogdHJ5ewogcmV0dXJuVmFsdWU9bGFtYmRhKCk7
CiBicmVhazsKfWNhdGNoKGUpe30KfQoKIHJldHVybiByZXR1cm5WYWx1ZTsKfQp9OwoKUmVnRXhw
LnByb3RvdHlwZS5tYXRjaD1SZWdFeHAucHJvdG90eXBlLnRlc3Q7CgpSZWdFeHAuZXNjYXBlPWZ1
bmN0aW9uKHN0cil7CiByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgp
fFtcXVwvXFxdKS9nLCdcXCQxJyk7Cn07CgoKCnZhciBQZXJpb2RpY2FsRXhlY3V0ZXI9Q2xhc3Mu
Y3JlYXRlKHsKIGluaXRpYWxpemU6ZnVuY3Rpb24oY2FsbGJhY2ssZnJlcXVlbmN5KXsKIHRoaXMu
Y2FsbGJhY2s9Y2FsbGJhY2s7CiB0aGlzLmZyZXF1ZW5jeT1mcmVxdWVuY3k7CiB0aGlzLmN1cnJl
bnRseUV4ZWN1dGluZz1mYWxzZTsKCiB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsKfSwKCiByZWdp
c3RlckNhbGxiYWNrOmZ1bmN0aW9uKCl7CiB0aGlzLnRpbWVyPXNldEludGVydmFsKHRoaXMub25U
aW1lckV2ZW50LmJpbmQodGhpcyksdGhpcy5mcmVxdWVuY3kqMTAwMCk7Cn0sCgogZXhlY3V0ZTpm
dW5jdGlvbigpewogdGhpcy5jYWxsYmFjayh0aGlzKTsKfSwKCiBzdG9wOmZ1bmN0aW9uKCl7CiBp
ZighdGhpcy50aW1lcilyZXR1cm47CiBjbGVhckludGVydmFsKHRoaXMudGltZXIpOwogdGhpcy50
aW1lcj1udWxsOwp9LAoKIG9uVGltZXJFdmVudDpmdW5jdGlvbigpewogaWYoIXRoaXMuY3VycmVu
dGx5RXhlY3V0aW5nKXsKIHRyeXsKIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nPXRydWU7CiB0aGlz
LmV4ZWN1dGUoKTsKfWZpbmFsbHl7CiB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZz1mYWxzZTsKfQp9
Cn0KfSk7Ck9iamVjdC5leHRlbmQoU3RyaW5nLHsKIGludGVycHJldDpmdW5jdGlvbih2YWx1ZSl7
CiByZXR1cm4gdmFsdWU9PW51bGw/Jyc6U3RyaW5nKHZhbHVlKTsKfSwKIHNwZWNpYWxDaGFyOnsK
J1xiJzonXFxiJywKJ1x0JzonXFx0JywKJ1xuJzonXFxuJywKJ1xmJzonXFxmJywKJ1xyJzonXFxy
JywKJ1xcJzonXFxcXCcKfQp9KTsKCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSx7CiBn
c3ViOmZ1bmN0aW9uKHBhdHRlcm4scmVwbGFjZW1lbnQpewogdmFyIHJlc3VsdD0nJyxzb3VyY2U9
dGhpcyxtYXRjaDsKIHJlcGxhY2VtZW50PWFyZ3VtZW50cy5jYWxsZWUucHJlcGFyZVJlcGxhY2Vt
ZW50KHJlcGxhY2VtZW50KTsKCiB3aGlsZShzb3VyY2UubGVuZ3RoPjApewogaWYobWF0Y2g9c291
cmNlLm1hdGNoKHBhdHRlcm4pKXsKIHJlc3VsdCs9c291cmNlLnNsaWNlKDAsbWF0Y2guaW5kZXgp
OwogcmVzdWx0Kz1TdHJpbmcuaW50ZXJwcmV0KHJlcGxhY2VtZW50KG1hdGNoKSk7CiBzb3VyY2U9
c291cmNlLnNsaWNlKG1hdGNoLmluZGV4K21hdGNoWzBdLmxlbmd0aCk7Cn1lbHNlewogcmVzdWx0
Kz1zb3VyY2Usc291cmNlPScnOwp9Cn0KIHJldHVybiByZXN1bHQ7Cn0sCgogc3ViOmZ1bmN0aW9u
KHBhdHRlcm4scmVwbGFjZW1lbnQsY291bnQpewogcmVwbGFjZW1lbnQ9dGhpcy5nc3ViLnByZXBh
cmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7CiBjb3VudD1PYmplY3QuaXNVbmRlZmluZWQoY291
bnQpPzE6Y291bnQ7CgogcmV0dXJuIHRoaXMuZ3N1YihwYXR0ZXJuLGZ1bmN0aW9uKG1hdGNoKXsK
IGlmKC0tY291bnQ8MClyZXR1cm4gbWF0Y2hbMF07CiByZXR1cm4gcmVwbGFjZW1lbnQobWF0Y2gp
Owp9KTsKfSwKCiBzY2FuOmZ1bmN0aW9uKHBhdHRlcm4saXRlcmF0b3IpewogdGhpcy5nc3ViKHBh
dHRlcm4saXRlcmF0b3IpOwogcmV0dXJuIFN0cmluZyh0aGlzKTsKfSwKCiB0cnVuY2F0ZTpmdW5j
dGlvbihsZW5ndGgsdHJ1bmNhdGlvbil7CiBsZW5ndGg9bGVuZ3RofHwzMDsKIHRydW5jYXRpb249
T2JqZWN0LmlzVW5kZWZpbmVkKHRydW5jYXRpb24pPycuLi4nOnRydW5jYXRpb247CiByZXR1cm4g
dGhpcy5sZW5ndGg+bGVuZ3RoPwogdGhpcy5zbGljZSgwLGxlbmd0aC10cnVuY2F0aW9uLmxlbmd0
aCkrdHJ1bmNhdGlvbjpTdHJpbmcodGhpcyk7Cn0sCgogc3RyaXA6ZnVuY3Rpb24oKXsKIHJldHVy
biB0aGlzLnJlcGxhY2UoL15ccysvLCcnKS5yZXBsYWNlKC9ccyskLywnJyk7Cn0sCgogc3RyaXBU
YWdzOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5yZXBsYWNlKC88XC8/W14+XSs+L2dpLCcnKTsK
fSwKCiBzdHJpcFNjcmlwdHM6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLnJlcGxhY2UobmV3IFJl
Z0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsJ2ltZycpLCcnKTsKfSwKCiBleHRyYWN0U2Ny
aXB0czpmdW5jdGlvbigpewogdmFyIG1hdGNoQWxsPW5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlw
dEZyYWdtZW50LCdpbWcnKTsKIHZhciBtYXRjaE9uZT1uZXcgUmVnRXhwKFByb3RvdHlwZS5TY3Jp
cHRGcmFnbWVudCwnaW0nKTsKIHJldHVybih0aGlzLm1hdGNoKG1hdGNoQWxsKXx8W10pLm1hcChm
dW5jdGlvbihzY3JpcHRUYWcpewogcmV0dXJuKHNjcmlwdFRhZy5tYXRjaChtYXRjaE9uZSl8fFsn
JywnJ10pWzFdOwp9KTsKfSwKCiBldmFsU2NyaXB0czpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMu
ZXh0cmFjdFNjcmlwdHMoKS5tYXAoZnVuY3Rpb24oc2NyaXB0KXtyZXR1cm4gZXZhbChzY3JpcHQp
fSk7Cn0sCgogZXNjYXBlSFRNTDpmdW5jdGlvbigpewogdmFyIHNlbGY9YXJndW1lbnRzLmNhbGxl
ZTsKIHNlbGYudGV4dC5kYXRhPXRoaXM7CiByZXR1cm4gc2VsZi5kaXYuaW5uZXJIVE1MOwp9LAoK
IHRvQXJyYXk6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLnNwbGl0KCcnKTsKfSwKCiBzdWNjOmZ1
bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5zbGljZSgwLHRoaXMubGVuZ3RoLTEpKwogU3RyaW5nLmZy
b21DaGFyQ29kZSh0aGlzLmNoYXJDb2RlQXQodGhpcy5sZW5ndGgtMSkrMSk7Cn0sCgogdGltZXM6
ZnVuY3Rpb24oY291bnQpewogcmV0dXJuIGNvdW50PDE/Jyc6bmV3IEFycmF5KGNvdW50KzEpLmpv
aW4odGhpcyk7Cn0sCgogY2FtZWxpemU6ZnVuY3Rpb24oKXsKIHZhciBwYXJ0cz10aGlzLnNwbGl0
KCctJyksbGVuPXBhcnRzLmxlbmd0aDsKIGlmKGxlbj09MSlyZXR1cm4gcGFydHNbMF07CgogdmFy
IGNhbWVsaXplZD10aGlzLmNoYXJBdCgwKT09Jy0nCj9wYXJ0c1swXS5jaGFyQXQoMCkudG9VcHBl
ckNhc2UoKStwYXJ0c1swXS5zdWJzdHJpbmcoMSkKOnBhcnRzWzBdOwoKIGZvcih2YXIgaT0xO2k8
bGVuO2krKykKIGNhbWVsaXplZCs9cGFydHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrcGFy
dHNbaV0uc3Vic3RyaW5nKDEpOwoKIHJldHVybiBjYW1lbGl6ZWQ7Cn0sCgogY2FwaXRhbGl6ZTpm
dW5jdGlvbigpewogcmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdGhpcy5zdWJz
dHJpbmcoMSkudG9Mb3dlckNhc2UoKTsKfSwKCiB1bmRlcnNjb3JlOmZ1bmN0aW9uKCl7CiByZXR1
cm4gdGhpcy5nc3ViKC86Oi8sJy8nKS5nc3ViKC8oW0EtWl0rKShbQS1aXVthLXpdKS8sJyN7MX1f
I3syfScpLmdzdWIoLyhbYS16XGRdKShbQS1aXSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8tLywnXycp
LnRvTG93ZXJDYXNlKCk7Cn0sCgogZGFzaGVyaXplOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5n
c3ViKC9fLywnLScpOwp9LAoKIGluc3BlY3Q6ZnVuY3Rpb24odXNlRG91YmxlUXVvdGVzKXsKIHZh
ciBlc2NhcGVkU3RyaW5nPXRoaXMuZ3N1YigvW1x4MDAtXHgxZlxcXS8sZnVuY3Rpb24obWF0Y2gp
ewogdmFyIGNoYXJhY3Rlcj1TdHJpbmcuc3BlY2lhbENoYXJbbWF0Y2hbMF1dOwogcmV0dXJuIGNo
YXJhY3Rlcj9jaGFyYWN0ZXI6J1xcdTAwJyttYXRjaFswXS5jaGFyQ29kZUF0KCkudG9QYWRkZWRT
dHJpbmcoMiwxNik7Cn0pOwogaWYodXNlRG91YmxlUXVvdGVzKXJldHVybiciJytlc2NhcGVkU3Ry
aW5nLnJlcGxhY2UoLyIvZywnXFwiJykrJyInOwogcmV0dXJuIiciK2VzY2FwZWRTdHJpbmcucmVw
bGFjZSgvJy9nLCdcXFwnJykrIiciOwp9LAoKIHRvSlNPTjpmdW5jdGlvbigpewogcmV0dXJuIHRo
aXMuaW5zcGVjdCh0cnVlKTsKfSwKCiB1bmZpbHRlckpTT046ZnVuY3Rpb24oZmlsdGVyKXsKIHJl
dHVybiB0aGlzLnN1YihmaWx0ZXJ8fFByb3RvdHlwZS5KU09ORmlsdGVyLCcjezF9Jyk7Cn0sCgog
aXNKU09OOmZ1bmN0aW9uKCl7CiB2YXIgc3RyPXRoaXM7CiBpZihzdHIuYmxhbmsoKSlyZXR1cm4g
ZmFsc2U7CiBzdHI9dGhpcy5yZXBsYWNlKC9cXC4vZywnQCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJd
KiIvZywnJyk7CiByZXR1cm4oL15bLDp7fVxbXF0wLTkuXC0rRWFlZmxuci11IFxuXHJcdF0qJC8p
LnRlc3Qoc3RyKTsKfSwKCiBldmFsSlNPTjpmdW5jdGlvbihzYW5pdGl6ZSl7CiB2YXIganNvbj10
aGlzLnVuZmlsdGVySlNPTigpOwogdHJ5ewogaWYoIXNhbml0aXplfHxqc29uLmlzSlNPTigpKXJl
dHVybiBldmFsKCcoJytqc29uKycpJyk7Cn1jYXRjaChlKXt9CiB0aHJvdyBuZXcgU3ludGF4RXJy
b3IoJ0JhZGx5IGZvcm1lZCBKU09OIHN0cmluZzogJyt0aGlzLmluc3BlY3QoKSk7Cn0sCgogaW5j
bHVkZTpmdW5jdGlvbihwYXR0ZXJuKXsKIHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybik+LTE7
Cn0sCgogc3RhcnRzV2l0aDpmdW5jdGlvbihwYXR0ZXJuKXsKIHJldHVybiB0aGlzLmluZGV4T2Yo
cGF0dGVybik9PT0wOwp9LAoKIGVuZHNXaXRoOmZ1bmN0aW9uKHBhdHRlcm4pewogdmFyIGQ9dGhp
cy5sZW5ndGgtcGF0dGVybi5sZW5ndGg7CiByZXR1cm4gZD49MCYmdGhpcy5sYXN0SW5kZXhPZihw
YXR0ZXJuKT09PWQ7Cn0sCgogZW1wdHk6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzPT0nJzsKfSwK
CiBibGFuazpmdW5jdGlvbigpewogcmV0dXJuL15ccyokLy50ZXN0KHRoaXMpOwp9LAoKIGludGVy
cG9sYXRlOmZ1bmN0aW9uKG9iamVjdCxwYXR0ZXJuKXsKIHJldHVybiBuZXcgVGVtcGxhdGUodGhp
cyxwYXR0ZXJuKS5ldmFsdWF0ZShvYmplY3QpOwp9Cn0pOwoKaWYoUHJvdG90eXBlLkJyb3dzZXIu
V2ViS2l0fHxQcm90b3R5cGUuQnJvd3Nlci5JRSlPYmplY3QuZXh0ZW5kKFN0cmluZy5wcm90b3R5
cGUsewogZXNjYXBlSFRNTDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMucmVwbGFjZSgvJi9nLCcm
YW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoLz4vZywnJmd0OycpOwp9LAogdW5l
c2NhcGVIVE1MOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5yZXBsYWNlKC8mYW1wOy9nLCcmJyku
cmVwbGFjZSgvJmx0Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+Jyk7Cn0KfSk7CgpTdHJpbmcu
cHJvdG90eXBlLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50PWZ1bmN0aW9uKHJlcGxhY2VtZW50KXsK
IGlmKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSlyZXR1cm4gcmVwbGFjZW1lbnQ7CiB2
YXIgdGVtcGxhdGU9bmV3IFRlbXBsYXRlKHJlcGxhY2VtZW50KTsKIHJldHVybiBmdW5jdGlvbiht
YXRjaCl7cmV0dXJuIHRlbXBsYXRlLmV2YWx1YXRlKG1hdGNoKX07Cn07CgpTdHJpbmcucHJvdG90
eXBlLnBhcnNlUXVlcnk9U3RyaW5nLnByb3RvdHlwZS50b1F1ZXJ5UGFyYW1zOwoKT2JqZWN0LmV4
dGVuZChTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUwsewogZGl2OmRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoJ2RpdicpLAogdGV4dDpkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykKfSk7Cgp3aXRo
KFN0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTClkaXYuYXBwZW5kQ2hpbGQodGV4dCk7Cgp2YXIg
VGVtcGxhdGU9Q2xhc3MuY3JlYXRlKHsKIGluaXRpYWxpemU6ZnVuY3Rpb24odGVtcGxhdGUscGF0
dGVybil7CiB0aGlzLnRlbXBsYXRlPXRlbXBsYXRlLnRvU3RyaW5nKCk7CiB0aGlzLnBhdHRlcm49
cGF0dGVybnx8VGVtcGxhdGUuUGF0dGVybjsKfSwKCiBldmFsdWF0ZTpmdW5jdGlvbihvYmplY3Qp
ewogaWYoT2JqZWN0LmlzRnVuY3Rpb24ob2JqZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVudHMpKQog
b2JqZWN0PW9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKCk7CgogcmV0dXJuIHRoaXMudGVt
cGxhdGUuZ3N1Yih0aGlzLnBhdHRlcm4sZnVuY3Rpb24obWF0Y2gpewogaWYob2JqZWN0PT1udWxs
KXJldHVybicnOwoKIHZhciBiZWZvcmU9bWF0Y2hbMV18fCcnOwogaWYoYmVmb3JlPT0nXFwnKXJl
dHVybiBtYXRjaFsyXTsKCiB2YXIgY3R4PW9iamVjdCxleHByPW1hdGNoWzNdOwogdmFyIHBhdHRl
cm49L14oW14uW10rfFxbKCg/Oi4qP1teXFxdKT8pXF0pKFwufFxbfCQpLzsKIG1hdGNoPXBhdHRl
cm4uZXhlYyhleHByKTsKIGlmKG1hdGNoPT1udWxsKXJldHVybiBiZWZvcmU7Cgogd2hpbGUobWF0
Y2ghPW51bGwpewogdmFyIGNvbXA9bWF0Y2hbMV0uc3RhcnRzV2l0aCgnWycpP21hdGNoWzJdLmdz
dWIoJ1xcXFxdJywnXScpOm1hdGNoWzFdOwogY3R4PWN0eFtjb21wXTsKIGlmKG51bGw9PWN0eHx8
Jyc9PW1hdGNoWzNdKWJyZWFrOwogZXhwcj1leHByLnN1YnN0cmluZygnWyc9PW1hdGNoWzNdP21h
dGNoWzFdLmxlbmd0aDptYXRjaFswXS5sZW5ndGgpOwogbWF0Y2g9cGF0dGVybi5leGVjKGV4cHIp
Owp9CgogcmV0dXJuIGJlZm9yZStTdHJpbmcuaW50ZXJwcmV0KGN0eCk7Cn0pOwp9Cn0pOwpUZW1w
bGF0ZS5QYXR0ZXJuPS8oXnwufFxyfFxuKSgjXHsoLio/KVx9KS87Cgp2YXIgJGJyZWFrPXt9OwoK
dmFyIEVudW1lcmFibGU9ewogZWFjaDpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKIHZhciBp
bmRleD0wOwogaXRlcmF0b3I9aXRlcmF0b3IuYmluZChjb250ZXh0KTsKIHRyeXsKIHRoaXMuX2Vh
Y2goZnVuY3Rpb24odmFsdWUpewogaXRlcmF0b3IodmFsdWUsaW5kZXgrKyk7Cn0pOwp9Y2F0Y2go
ZSl7CiBpZihlIT0kYnJlYWspdGhyb3cgZTsKfQogcmV0dXJuIHRoaXM7Cn0sCgogZWFjaFNsaWNl
OmZ1bmN0aW9uKG51bWJlcixpdGVyYXRvcixjb250ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJhdG9yP2l0
ZXJhdG9yLmJpbmQoY29udGV4dCk6UHJvdG90eXBlLks7CiB2YXIgaW5kZXg9LW51bWJlcixzbGlj
ZXM9W10sYXJyYXk9dGhpcy50b0FycmF5KCk7CiB3aGlsZSgoaW5kZXgrPW51bWJlcik8YXJyYXku
bGVuZ3RoKQogc2xpY2VzLnB1c2goYXJyYXkuc2xpY2UoaW5kZXgsaW5kZXgrbnVtYmVyKSk7CiBy
ZXR1cm4gc2xpY2VzLmNvbGxlY3QoaXRlcmF0b3IsY29udGV4dCk7Cn0sCgogYWxsOmZ1bmN0aW9u
KGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0b3I9aXRlcmF0b3I/aXRlcmF0b3IuYmluZChjb250
ZXh0KTpQcm90b3R5cGUuSzsKIHZhciByZXN1bHQ9dHJ1ZTsKIHRoaXMuZWFjaChmdW5jdGlvbih2
YWx1ZSxpbmRleCl7CiByZXN1bHQ9cmVzdWx0JiYhIWl0ZXJhdG9yKHZhbHVlLGluZGV4KTsKIGlm
KCFyZXN1bHQpdGhyb3cgJGJyZWFrOwp9KTsKIHJldHVybiByZXN1bHQ7Cn0sCgogYW55OmZ1bmN0
aW9uKGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0b3I9aXRlcmF0b3I/aXRlcmF0b3IuYmluZChj
b250ZXh0KTpQcm90b3R5cGUuSzsKIHZhciByZXN1bHQ9ZmFsc2U7CiB0aGlzLmVhY2goZnVuY3Rp
b24odmFsdWUsaW5kZXgpewogaWYocmVzdWx0PSEhaXRlcmF0b3IodmFsdWUsaW5kZXgpKQogdGhy
b3cgJGJyZWFrOwp9KTsKIHJldHVybiByZXN1bHQ7Cn0sCgogY29sbGVjdDpmdW5jdGlvbihpdGVy
YXRvcixjb250ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJhdG9yP2l0ZXJhdG9yLmJpbmQoY29udGV4dCk6
UHJvdG90eXBlLks7CiB2YXIgcmVzdWx0cz1bXTsKIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxp
bmRleCl7CiByZXN1bHRzLnB1c2goaXRlcmF0b3IodmFsdWUsaW5kZXgpKTsKfSk7CiByZXR1cm4g
cmVzdWx0czsKfSwKCiBkZXRlY3Q6ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7CiBpdGVyYXRv
cj1pdGVyYXRvci5iaW5kKGNvbnRleHQpOwogdmFyIHJlc3VsdDsKIHRoaXMuZWFjaChmdW5jdGlv
bih2YWx1ZSxpbmRleCl7CiBpZihpdGVyYXRvcih2YWx1ZSxpbmRleCkpewogcmVzdWx0PXZhbHVl
OwogdGhyb3cgJGJyZWFrOwp9Cn0pOwogcmV0dXJuIHJlc3VsdDsKfSwKCiBmaW5kQWxsOmZ1bmN0
aW9uKGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0b3I9aXRlcmF0b3IuYmluZChjb250ZXh0KTsK
IHZhciByZXN1bHRzPVtdOwogdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXsKIGlmKGl0
ZXJhdG9yKHZhbHVlLGluZGV4KSkKIHJlc3VsdHMucHVzaCh2YWx1ZSk7Cn0pOwogcmV0dXJuIHJl
c3VsdHM7Cn0sCgogZ3JlcDpmdW5jdGlvbihmaWx0ZXIsaXRlcmF0b3IsY29udGV4dCl7CiBpdGVy
YXRvcj1pdGVyYXRvcj9pdGVyYXRvci5iaW5kKGNvbnRleHQpOlByb3RvdHlwZS5LOwogdmFyIHJl
c3VsdHM9W107CgogaWYoT2JqZWN0LmlzU3RyaW5nKGZpbHRlcikpCiBmaWx0ZXI9bmV3IFJlZ0V4
cChmaWx0ZXIpOwoKIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiBpZihmaWx0ZXIu
bWF0Y2godmFsdWUpKQogcmVzdWx0cy5wdXNoKGl0ZXJhdG9yKHZhbHVlLGluZGV4KSk7Cn0pOwog
cmV0dXJuIHJlc3VsdHM7Cn0sCgogaW5jbHVkZTpmdW5jdGlvbihvYmplY3QpewogaWYoT2JqZWN0
LmlzRnVuY3Rpb24odGhpcy5pbmRleE9mKSkKIGlmKHRoaXMuaW5kZXhPZihvYmplY3QpIT0tMSly
ZXR1cm4gdHJ1ZTsKCiB2YXIgZm91bmQ9ZmFsc2U7CiB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUp
ewogaWYodmFsdWU9PW9iamVjdCl7CiBmb3VuZD10cnVlOwogdGhyb3cgJGJyZWFrOwp9Cn0pOwog
cmV0dXJuIGZvdW5kOwp9LAoKIGluR3JvdXBzT2Y6ZnVuY3Rpb24obnVtYmVyLGZpbGxXaXRoKXsK
fSwKCiBpbmplY3Q6ZnVuY3Rpb24obWVtbyxpdGVyYXRvcixjb250ZXh0KXsKfSwKCiBpbnZva2U6
ZnVuY3Rpb24obWV0aG9kKXsKIHZhciBhcmdzPSRBKGFyZ3VtZW50cykuc2xpY2UoMSk7CiByZXR1
cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpewogcmV0dXJuIHZhbHVlW21ldGhvZF0uYXBwbHko
dmFsdWUsYXJncyk7Cn0pOwp9LAoKIG1heDpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKIGl0
ZXJhdG9yPWl0ZXJhdG9yP2l0ZXJhdG9yLmJpbmQoY29udGV4dCk6UHJvdG90eXBlLks7CiB2YXIg
cmVzdWx0OwogdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXsKIHZhbHVlPWl0ZXJhdG9y
KHZhbHVlLGluZGV4KTsKIGlmKHJlc3VsdD09bnVsbHx8dmFsdWU+PXJlc3VsdCkKIHJlc3VsdD12
YWx1ZTsKfSk7CiByZXR1cm4gcmVzdWx0Owp9LAoKIG1pbjpmdW5jdGlvbihpdGVyYXRvcixjb250
ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJhdG9yP2l0ZXJhdG9yLmJpbmQoY29udGV4dCk6UHJvdG90eXBl
Lks7CiB2YXIgcmVzdWx0OwogdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXsKIHZhbHVl
PWl0ZXJhdG9yKHZhbHVlLGluZGV4KTsKIGlmKHJlc3VsdD09bnVsbHx8dmFsdWU8cmVzdWx0KQog
cmVzdWx0PXZhbHVlOwp9KTsKIHJldHVybiByZXN1bHQ7Cn0sCgogcGFydGl0aW9uOmZ1bmN0aW9u
KGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0b3I9aXRlcmF0b3I/aXRlcmF0b3IuYmluZChjb250
ZXh0KTpQcm90b3R5cGUuSzsKIHZhciB0cnVlcz1bXSxmYWxzZXM9W107CiB0aGlzLmVhY2goZnVu
Y3Rpb24odmFsdWUsaW5kZXgpewooaXRlcmF0b3IodmFsdWUsaW5kZXgpPwogdHJ1ZXM6ZmFsc2Vz
KS5wdXNoKHZhbHVlKTsKfSk7CiByZXR1cm5bdHJ1ZXMsZmFsc2VzXTsKfSwKCiBwbHVjazpmdW5j
dGlvbihwcm9wZXJ0eSl7CiB2YXIgcmVzdWx0cz1bXTsKIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1
ZSl7CiByZXN1bHRzLnB1c2godmFsdWVbcHJvcGVydHldKTsKfSk7CiByZXR1cm4gcmVzdWx0czsK
fSwKCiByZWplY3Q6ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7CiBpdGVyYXRvcj1pdGVyYXRv
ci5iaW5kKGNvbnRleHQpOwogdmFyIHJlc3VsdHM9W107CiB0aGlzLmVhY2goZnVuY3Rpb24odmFs
dWUsaW5kZXgpewogaWYoIWl0ZXJhdG9yKHZhbHVlLGluZGV4KSkKIHJlc3VsdHMucHVzaCh2YWx1
ZSk7Cn0pOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgogc29ydEJ5OmZ1bmN0aW9uKGl0ZXJhdG9yLGNv
bnRleHQpewogaXRlcmF0b3I9aXRlcmF0b3IuYmluZChjb250ZXh0KTsKIHJldHVybiB0aGlzLm1h
cChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiByZXR1cm57dmFsdWU6dmFsdWUsY3JpdGVyaWE6aXRl
cmF0b3IodmFsdWUsaW5kZXgpfTsKfSkuc29ydChmdW5jdGlvbihsZWZ0LHJpZ2h0KXsKIHZhciBh
PWxlZnQuY3JpdGVyaWEsYj1yaWdodC5jcml0ZXJpYTsKIHJldHVybiBhPGI/LTE6YT5iPzE6MDsK
fSkucGx1Y2soJ3ZhbHVlJyk7Cn0sCgogdG9BcnJheTpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMu
bWFwKCk7Cn0sCgogemlwOmZ1bmN0aW9uKCl7CiB2YXIgaXRlcmF0b3I9UHJvdG90eXBlLkssYXJn
cz0kQShhcmd1bWVudHMpOwogaWYoT2JqZWN0LmlzRnVuY3Rpb24oYXJncy5sYXN0KCkpKQogaXRl
cmF0b3I9YXJncy5wb3AoKTsKCiB2YXIgY29sbGVjdGlvbnM9W3RoaXNdLmNvbmNhdChhcmdzKS5t
YXAoJEEpOwogcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXsKIHJldHVybiBp
dGVyYXRvcihjb2xsZWN0aW9ucy5wbHVjayhpbmRleCkpOwp9KTsKfSwKCiBzaXplOmZ1bmN0aW9u
KCl7CiByZXR1cm4gdGhpcy50b0FycmF5KCkubGVuZ3RoOwp9LAoKIGluc3BlY3Q6ZnVuY3Rpb24o
KXsKIHJldHVybicjPEVudW1lcmFibGU6Jyt0aGlzLnRvQXJyYXkoKS5pbnNwZWN0KCkrJz4nOwp9
Cn07CgpPYmplY3QuZXh0ZW5kKEVudW1lcmFibGUsewogbWFwOkVudW1lcmFibGUuY29sbGVjdCwK
IGZpbmQ6RW51bWVyYWJsZS5kZXRlY3QsCiBzZWxlY3Q6RW51bWVyYWJsZS5maW5kQWxsLAogZmls
dGVyOkVudW1lcmFibGUuZmluZEFsbCwKIG1lbWJlcjpFbnVtZXJhYmxlLmluY2x1ZGUsCiBlbnRy
aWVzOkVudW1lcmFibGUudG9BcnJheSwKIGV2ZXJ5OkVudW1lcmFibGUuYWxsLAogc29tZTpFbnVt
ZXJhYmxlLmFueQp9KTsKZnVuY3Rpb24gJEEoaXRlcmFibGUpewogaWYoIWl0ZXJhYmxlKXJldHVy
bltdOwogaWYoaXRlcmFibGUudG9BcnJheSlyZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOwogdmFy
IGxlbmd0aD1pdGVyYWJsZS5sZW5ndGh8fDAscmVzdWx0cz1uZXcgQXJyYXkobGVuZ3RoKTsKIHdo
aWxlKGxlbmd0aC0tKXJlc3VsdHNbbGVuZ3RoXT1pdGVyYWJsZVtsZW5ndGhdOwogcmV0dXJuIHJl
c3VsdHM7Cn0KCmlmKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCl7CiAkQT1mdW5jdGlvbihpdGVy
YWJsZSl7CiBpZighaXRlcmFibGUpcmV0dXJuW107CiBpZighKE9iamVjdC5pc0Z1bmN0aW9uKGl0
ZXJhYmxlKSYmaXRlcmFibGU9PSdbb2JqZWN0IE5vZGVMaXN0XScpJiYKIGl0ZXJhYmxlLnRvQXJy
YXkpcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKIHZhciBsZW5ndGg9aXRlcmFibGUubGVuZ3Ro
fHwwLHJlc3VsdHM9bmV3IEFycmF5KGxlbmd0aCk7CiB3aGlsZShsZW5ndGgtLSlyZXN1bHRzW2xl
bmd0aF09aXRlcmFibGVbbGVuZ3RoXTsKIHJldHVybiByZXN1bHRzOwp9Owp9CgpBcnJheS5mcm9t
PSRBOwoKT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUsRW51bWVyYWJsZSk7CgppZighQXJy
YXkucHJvdG90eXBlLl9yZXZlcnNlKUFycmF5LnByb3RvdHlwZS5fcmV2ZXJzZT1BcnJheS5wcm90
b3R5cGUucmV2ZXJzZTsKCk9iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLHsKIF9lYWNoOmZ1
bmN0aW9uKGl0ZXJhdG9yKXsKIGZvcih2YXIgaT0wLGxlbmd0aD10aGlzLmxlbmd0aDtpPGxlbmd0
aDtpKyspCiBpdGVyYXRvcih0aGlzW2ldKTsKfSwKCiBjbGVhcjpmdW5jdGlvbigpewogdGhpcy5s
ZW5ndGg9MDsKIHJldHVybiB0aGlzOwp9LAoKIGZpcnN0OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhp
c1swXTsKfSwKCiBsYXN0OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aC0xXTsK
fSwKCiBjb21wYWN0OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFs
dWUpewogcmV0dXJuIHZhbHVlIT1udWxsOwp9KTsKfSwKCiBmbGF0dGVuOmZ1bmN0aW9uKCl7CiBy
ZXR1cm4gdGhpcy5pbmplY3QoW10sZnVuY3Rpb24oYXJyYXksdmFsdWUpewogcmV0dXJuIGFycmF5
LmNvbmNhdChPYmplY3QuaXNBcnJheSh2YWx1ZSk/CiB2YWx1ZS5mbGF0dGVuKCk6W3ZhbHVlXSk7
Cn0pOwp9LAoKIHdpdGhvdXQ6ZnVuY3Rpb24oKXsKIHZhciB2YWx1ZXM9JEEoYXJndW1lbnRzKTsK
IHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSl7CiByZXR1cm4hdmFsdWVzLmluY2x1
ZGUodmFsdWUpOwp9KTsKfSwKCiBjbG9uZTpmdW5jdGlvbigpewogcmV0dXJuW10uY29uY2F0KHRo
aXMpOwp9LAoKIHNpemU6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLmxlbmd0aDsKfSwKCiBpbnNw
ZWN0OmZ1bmN0aW9uKCl7CiByZXR1cm4nWycrdGhpcy5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4o
JywgJykrJ10nOwp9LAoKIHRvSlNPTjpmdW5jdGlvbigpewogdmFyIHJlc3VsdHM9W107CiB0aGlz
LmVhY2goZnVuY3Rpb24ob2JqZWN0KXsKIHZhciB2YWx1ZT1PYmplY3QudG9KU09OKG9iamVjdCk7
CiBpZighT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSlyZXN1bHRzLnB1c2godmFsdWUpOwp9KTsK
IHJldHVybidbJytyZXN1bHRzLmpvaW4oJywgJykrJ10nOwp9Cn0pOwoKCmlmKE9iamVjdC5pc0Z1
bmN0aW9uKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSkKIEFycmF5LnByb3RvdHlwZS5fZWFjaD1B
cnJheS5wcm90b3R5cGUuZm9yRWFjaDsKCmlmKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZilBcnJh
eS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihpdGVtLGkpewogaXx8KGk9MCk7CiB2YXIgbGVu
Z3RoPXRoaXMubGVuZ3RoOwogaWYoaTwwKWk9bGVuZ3RoK2k7CiBmb3IoO2k8bGVuZ3RoO2krKykK
IGlmKHRoaXNbaV09PT1pdGVtKXJldHVybiBpOwogcmV0dXJuLTE7Cn07CgppZighQXJyYXkucHJv
dG90eXBlLmxhc3RJbmRleE9mKUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihp
dGVtLGkpewogaT1pc05hTihpKT90aGlzLmxlbmd0aDooaTwwP3RoaXMubGVuZ3RoK2k6aSkrMTsK
IHZhciBuPXRoaXMuc2xpY2UoMCxpKS5yZXZlcnNlKCkuaW5kZXhPZihpdGVtKTsKIHJldHVybihu
PDApP246aS1uLTE7Cn07CgpBcnJheS5wcm90b3R5cGUudG9BcnJheT1BcnJheS5wcm90b3R5cGUu
Y2xvbmU7CgpmdW5jdGlvbiAkdyhzdHJpbmcpewogaWYoIU9iamVjdC5pc1N0cmluZyhzdHJpbmcp
KXJldHVybltdOwogc3RyaW5nPXN0cmluZy5zdHJpcCgpOwogcmV0dXJuIHN0cmluZz9zdHJpbmcu
c3BsaXQoL1xzKy8pOltdOwp9CgppZihQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSl7CiBBcnJheS5w
cm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKCl7CiB2YXIgYXJyYXk9W107CiBmb3IodmFyIGk9MCxs
ZW5ndGg9dGhpcy5sZW5ndGg7aTxsZW5ndGg7aSsrKWFycmF5LnB1c2godGhpc1tpXSk7CiBmb3Io
dmFyIGk9MCxsZW5ndGg9YXJndW1lbnRzLmxlbmd0aDtpPGxlbmd0aDtpKyspewogaWYoT2JqZWN0
LmlzQXJyYXkoYXJndW1lbnRzW2ldKSl7CiBmb3IodmFyIGo9MCxhcnJheUxlbmd0aD1hcmd1bWVu
dHNbaV0ubGVuZ3RoO2o8YXJyYXlMZW5ndGg7aisrKQogYXJyYXkucHVzaChhcmd1bWVudHNbaV1b
al0pOwp9ZWxzZXsKIGFycmF5LnB1c2goYXJndW1lbnRzW2ldKTsKfQp9CiByZXR1cm4gYXJyYXk7
Cn07Cn0KT2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLHsKIHRvQ29sb3JQYXJ0OmZ1bmN0
aW9uKCl7CiByZXR1cm4gdGhpcy50b1BhZGRlZFN0cmluZygyLDE2KTsKfSwKCiBzdWNjOmZ1bmN0
aW9uKCl7CiByZXR1cm4gdGhpcysxOwp9LAoKIHRpbWVzOmZ1bmN0aW9uKGl0ZXJhdG9yKXsKICRS
KDAsdGhpcyx0cnVlKS5lYWNoKGl0ZXJhdG9yKTsKIHJldHVybiB0aGlzOwp9LAoKIHRvUGFkZGVk
U3RyaW5nOmZ1bmN0aW9uKGxlbmd0aCxyYWRpeCl7CiB2YXIgc3RyaW5nPXRoaXMudG9TdHJpbmco
cmFkaXh8fDEwKTsKIHJldHVybicwJy50aW1lcyhsZW5ndGgtc3RyaW5nLmxlbmd0aCkrc3RyaW5n
Owp9LAoKIHRvSlNPTjpmdW5jdGlvbigpewogcmV0dXJuIGlzRmluaXRlKHRoaXMpP3RoaXMudG9T
dHJpbmcoKTonbnVsbCc7Cn0KfSk7CgokdygnYWJzIHJvdW5kIGNlaWwgZmxvb3InKS5lYWNoKGZ1
bmN0aW9uKG1ldGhvZCl7CiBOdW1iZXIucHJvdG90eXBlW21ldGhvZF09TWF0aFttZXRob2RdLm1l
dGhvZGl6ZSgpOwp9KTsKZnVuY3Rpb24gJEgob2JqZWN0KXsKIHJldHVybiBuZXcgSGFzaChvYmpl
Y3QpOwp9OwoKdmFyIEhhc2g9Q2xhc3MuY3JlYXRlKEVudW1lcmFibGUsKGZ1bmN0aW9uKCl7Cgog
ZnVuY3Rpb24gdG9RdWVyeVBhaXIoa2V5LHZhbHVlKXsKIGlmKE9iamVjdC5pc1VuZGVmaW5lZCh2
YWx1ZSkpcmV0dXJuIGtleTsKIHJldHVybiBrZXkrJz0nK2VuY29kZVVSSUNvbXBvbmVudChTdHJp
bmcuaW50ZXJwcmV0KHZhbHVlKSk7Cn0KCiByZXR1cm57CiBpbml0aWFsaXplOmZ1bmN0aW9uKG9i
amVjdCl7CiB0aGlzLl9vYmplY3Q9T2JqZWN0LmlzSGFzaChvYmplY3QpP29iamVjdC50b09iamVj
dCgpOk9iamVjdC5jbG9uZShvYmplY3QpOwp9LAoKIF9lYWNoOmZ1bmN0aW9uKGl0ZXJhdG9yKXsK
IGZvcih2YXIga2V5IGluIHRoaXMuX29iamVjdCl7CiB2YXIgdmFsdWU9dGhpcy5fb2JqZWN0W2tl
eV0scGFpcj1ba2V5LHZhbHVlXTsKIHBhaXIua2V5PWtleTsKIHBhaXIudmFsdWU9dmFsdWU7CiBp
dGVyYXRvcihwYWlyKTsKfQp9LAoKIHNldDpmdW5jdGlvbihrZXksdmFsdWUpewogcmV0dXJuIHRo
aXMuX29iamVjdFtrZXldPXZhbHVlOwp9LAoKIGdldDpmdW5jdGlvbihrZXkpewogcmV0dXJuIHRo
aXMuX29iamVjdFtrZXldOwp9LAoKIHVuc2V0OmZ1bmN0aW9uKGtleSl7CiB2YXIgdmFsdWU9dGhp
cy5fb2JqZWN0W2tleV07CiBkZWxldGUgdGhpcy5fb2JqZWN0W2tleV07CiByZXR1cm4gdmFsdWU7
Cn0sCgogdG9PYmplY3Q6ZnVuY3Rpb24oKXsKIHJldHVybiBPYmplY3QuY2xvbmUodGhpcy5fb2Jq
ZWN0KTsKfSwKCiBrZXlzOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5wbHVjaygna2V5Jyk7Cn0s
CgogdmFsdWVzOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5wbHVjaygndmFsdWUnKTsKfSwKCiBp
bmRleDpmdW5jdGlvbih2YWx1ZSl7CiB2YXIgbWF0Y2g9dGhpcy5kZXRlY3QoZnVuY3Rpb24ocGFp
cil7CiByZXR1cm4gcGFpci52YWx1ZT09PXZhbHVlOwp9KTsKIHJldHVybiBtYXRjaCYmbWF0Y2gu
a2V5Owp9LAoKIG1lcmdlOmZ1bmN0aW9uKG9iamVjdCl7CiByZXR1cm4gdGhpcy5jbG9uZSgpLnVw
ZGF0ZShvYmplY3QpOwp9LAoKIHVwZGF0ZTpmdW5jdGlvbihvYmplY3QpewogcmV0dXJuIG5ldyBI
YXNoKG9iamVjdCkuaW5qZWN0KHRoaXMsZnVuY3Rpb24ocmVzdWx0LHBhaXIpewogcmVzdWx0LnNl
dChwYWlyLmtleSxwYWlyLnZhbHVlKTsKIHJldHVybiByZXN1bHQ7Cn0pOwp9LAoKIHRvUXVlcnlT
dHJpbmc6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbihwYWlyKXsKIHZhciBr
ZXk9ZW5jb2RlVVJJQ29tcG9uZW50KHBhaXIua2V5KSx2YWx1ZXM9cGFpci52YWx1ZTsKCiBpZih2
YWx1ZXMmJnR5cGVvZiB2YWx1ZXM9PSdvYmplY3QnKXsKIGlmKE9iamVjdC5pc0FycmF5KHZhbHVl
cykpCiByZXR1cm4gdmFsdWVzLm1hcCh0b1F1ZXJ5UGFpci5jdXJyeShrZXkpKS5qb2luKCcmJyk7
Cn0KIHJldHVybiB0b1F1ZXJ5UGFpcihrZXksdmFsdWVzKTsKfSkuam9pbignJicpOwp9LAoKIGlu
c3BlY3Q6ZnVuY3Rpb24oKXsKIHJldHVybicjPEhhc2g6eycrdGhpcy5tYXAoZnVuY3Rpb24ocGFp
cil7CiByZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJzogJyk7Cn0pLmpvaW4o
JywgJykrJ30+JzsKfSwKCiB0b0pTT046ZnVuY3Rpb24oKXsKIHJldHVybiBPYmplY3QudG9KU09O
KHRoaXMudG9PYmplY3QoKSk7Cn0sCgogY2xvbmU6ZnVuY3Rpb24oKXsKIHJldHVybiBuZXcgSGFz
aCh0aGlzKTsKfQp9Cn0pKCkpOwoKSGFzaC5wcm90b3R5cGUudG9UZW1wbGF0ZVJlcGxhY2VtZW50
cz1IYXNoLnByb3RvdHlwZS50b09iamVjdDsKSGFzaC5mcm9tPSRIOwp2YXIgT2JqZWN0UmFuZ2U9
Q2xhc3MuY3JlYXRlKEVudW1lcmFibGUsewogaW5pdGlhbGl6ZTpmdW5jdGlvbihzdGFydCxlbmQs
ZXhjbHVzaXZlKXsKIHRoaXMuc3RhcnQ9c3RhcnQ7CiB0aGlzLmVuZD1lbmQ7CiB0aGlzLmV4Y2x1
c2l2ZT1leGNsdXNpdmU7Cn0sCgogX2VhY2g6ZnVuY3Rpb24oaXRlcmF0b3IpewogdmFyIHZhbHVl
PXRoaXMuc3RhcnQ7CiB3aGlsZSh0aGlzLmluY2x1ZGUodmFsdWUpKXsKIGl0ZXJhdG9yKHZhbHVl
KTsKIHZhbHVlPXZhbHVlLnN1Y2MoKTsKfQp9LAoKIGluY2x1ZGU6ZnVuY3Rpb24odmFsdWUpewog
aWYodmFsdWU8dGhpcy5zdGFydCkKIHJldHVybiBmYWxzZTsKIGlmKHRoaXMuZXhjbHVzaXZlKQog
cmV0dXJuIHZhbHVlPHRoaXMuZW5kOwogcmV0dXJuIHZhbHVlPD10aGlzLmVuZDsKfQp9KTsKCnZh
ciAkUj1mdW5jdGlvbihzdGFydCxlbmQsZXhjbHVzaXZlKXsKIHJldHVybiBuZXcgT2JqZWN0UmFu
Z2Uoc3RhcnQsZW5kLGV4Y2x1c2l2ZSk7Cn07Cgp2YXIgQWpheD17CiBnZXRUcmFuc3BvcnQ6ZnVu
Y3Rpb24oKXsKIHJldHVybiBUcnkudGhlc2UoCiBmdW5jdGlvbigpe3JldHVybiBuZXcgWE1MSHR0
cFJlcXVlc3QoKX0sCiBmdW5jdGlvbigpe3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwy
LlhNTEhUVFAnKX0sCiBmdW5jdGlvbigpe3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9z
b2Z0LlhNTEhUVFAnKX0KKXx8ZmFsc2U7Cn0sCgogYWN0aXZlUmVxdWVzdENvdW50OjAKfTsKCkFq
YXguUmVzcG9uZGVycz17CiByZXNwb25kZXJzOltdLAoKIF9lYWNoOmZ1bmN0aW9uKGl0ZXJhdG9y
KXsKIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRvcik7Cn0sCgogcmVnaXN0ZXI6ZnVuY3Rp
b24ocmVzcG9uZGVyKXsKIGlmKCF0aGlzLmluY2x1ZGUocmVzcG9uZGVyKSkKIHRoaXMucmVzcG9u
ZGVycy5wdXNoKHJlc3BvbmRlcik7Cn0sCgogdW5yZWdpc3RlcjpmdW5jdGlvbihyZXNwb25kZXIp
ewogdGhpcy5yZXNwb25kZXJzPXRoaXMucmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcik7Cn0s
CgogZGlzcGF0Y2g6ZnVuY3Rpb24oY2FsbGJhY2sscmVxdWVzdCx0cmFuc3BvcnQsanNvbil7CiB0
aGlzLmVhY2goZnVuY3Rpb24ocmVzcG9uZGVyKXsKIGlmKE9iamVjdC5pc0Z1bmN0aW9uKHJlc3Bv
bmRlcltjYWxsYmFja10pKXsKIHRyeXsKIHJlc3BvbmRlcltjYWxsYmFja10uYXBwbHkocmVzcG9u
ZGVyLFtyZXF1ZXN0LHRyYW5zcG9ydCxqc29uXSk7Cn1jYXRjaChlKXt9Cn0KfSk7Cn0KfTsKCk9i
amVjdC5leHRlbmQoQWpheC5SZXNwb25kZXJzLEVudW1lcmFibGUpOwoKQWpheC5SZXNwb25kZXJz
LnJlZ2lzdGVyKHsKIG9uQ3JlYXRlOmZ1bmN0aW9uKCl7QWpheC5hY3RpdmVSZXF1ZXN0Q291bnQr
K30sCiBvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7QWpheC5hY3RpdmVSZXF1ZXN0Q291bnQtLX0KfSk7
CgpBamF4LkJhc2U9Q2xhc3MuY3JlYXRlKHsKfSk7CgpBamF4LlJlcXVlc3Q9Q2xhc3MuY3JlYXRl
KEFqYXguQmFzZSx7CiBfY29tcGxldGU6ZmFsc2UsCgogaW5pdGlhbGl6ZTpmdW5jdGlvbigkc3Vw
ZXIsdXJsLG9wdGlvbnMpewogJHN1cGVyKG9wdGlvbnMpOwogdGhpcy50cmFuc3BvcnQ9QWpheC5n
ZXRUcmFuc3BvcnQoKTsKIHRoaXMucmVxdWVzdCh1cmwpOwp9LAoKIHJlcXVlc3Q6ZnVuY3Rpb24o
dXJsKXsKIHRoaXMudXJsPXVybDsKIHRoaXMubWV0aG9kPXRoaXMub3B0aW9ucy5tZXRob2Q7CiB2
YXIgcGFyYW1zPU9iamVjdC5jbG9uZSh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk7CgogaWYoIVsn
Z2V0JywncG9zdCddLmluY2x1ZGUodGhpcy5tZXRob2QpKXsKCiBwYXJhbXNbJ19tZXRob2QnXT10
aGlzLm1ldGhvZDsKIHRoaXMubWV0aG9kPSdwb3N0JzsKfQoKIHRoaXMucGFyYW1ldGVycz1wYXJh
bXM7CgogaWYocGFyYW1zPU9iamVjdC50b1F1ZXJ5U3RyaW5nKHBhcmFtcykpewoKIGlmKHRoaXMu
bWV0aG9kPT0nZ2V0JykKIHRoaXMudXJsKz0odGhpcy51cmwuaW5jbHVkZSgnPycpPycmJzonPycp
K3BhcmFtczsKIGVsc2UgaWYoL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvLnRlc3QobmF2aWdhdG9y
LnVzZXJBZ2VudCkpCiBwYXJhbXMrPScmXz0nOwp9CgogdHJ5ewogdmFyIHJlc3BvbnNlPW5ldyBB
amF4LlJlc3BvbnNlKHRoaXMpOwogaWYodGhpcy5vcHRpb25zLm9uQ3JlYXRlKXRoaXMub3B0aW9u
cy5vbkNyZWF0ZShyZXNwb25zZSk7CiBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uQ3JlYXRl
Jyx0aGlzLHJlc3BvbnNlKTsKCiB0aGlzLnRyYW5zcG9ydC5vcGVuKHRoaXMubWV0aG9kLnRvVXBw
ZXJDYXNlKCksdGhpcy51cmwsCiB0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKTsKCiBpZih0aGlz
Lm9wdGlvbnMuYXN5bmNocm9ub3VzKXRoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZS5iaW5kKHRoaXMp
LmRlZmVyKDEpOwoKIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZT10aGlzLm9uU3Rh
dGVDaGFuZ2UuYmluZCh0aGlzKTsKIHRoaXMuc2V0UmVxdWVzdEhlYWRlcnMoKTsKCiB0aGlzLmJv
ZHk9dGhpcy5tZXRob2Q9PSdwb3N0Jz8odGhpcy5vcHRpb25zLnBvc3RCb2R5fHxwYXJhbXMpOm51
bGw7CiB0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMuYm9keSk7CgoKIGlmKCF0aGlzLm9wdGlvbnMu
YXN5bmNocm9ub3VzJiZ0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlKQogdGhpcy5vblN0
YXRlQ2hhbmdlKCk7Cgp9CiBjYXRjaChlKXsKIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7Cn0K
fSwKCiBvblN0YXRlQ2hhbmdlOmZ1bmN0aW9uKCl7CiB2YXIgcmVhZHlTdGF0ZT10aGlzLnRyYW5z
cG9ydC5yZWFkeVN0YXRlOwogaWYocmVhZHlTdGF0ZT4xJiYhKChyZWFkeVN0YXRlPT00KSYmdGhp
cy5fY29tcGxldGUpKQogdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJl
YWR5U3RhdGUpOwp9LAoKIHNldFJlcXVlc3RIZWFkZXJzOmZ1bmN0aW9uKCl7CiB2YXIgaGVhZGVy
cz17CidYLVJlcXVlc3RlZC1XaXRoJzonWE1MSHR0cFJlcXVlc3QnLAonWC1Qcm90b3R5cGUtVmVy
c2lvbic6UHJvdG90eXBlLlZlcnNpb24sCidBY2NlcHQnOid0ZXh0L2phdmFzY3JpcHQsIHRleHQv
aHRtbCwgYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qJwp9OwoKIGlmKHRoaXMubWV0aG9k
PT0ncG9zdCcpewogaGVhZGVyc1snQ29udGVudC10eXBlJ109dGhpcy5vcHRpb25zLmNvbnRlbnRU
eXBlKwoodGhpcy5vcHRpb25zLmVuY29kaW5nPyc7IGNoYXJzZXQ9Jyt0aGlzLm9wdGlvbnMuZW5j
b2Rpbmc6JycpOwoKCiBpZih0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlJiYKKG5hdmln
YXRvci51c2VyQWdlbnQubWF0Y2goL0dlY2tvXC8oXGR7NH0pLyl8fFswLDIwMDVdKVsxXTwyMDA1
KQogaGVhZGVyc1snQ29ubmVjdGlvbiddPSdjbG9zZSc7Cn0KCgogaWYodHlwZW9mIHRoaXMub3B0
aW9ucy5yZXF1ZXN0SGVhZGVycz09J29iamVjdCcpewogdmFyIGV4dHJhcz10aGlzLm9wdGlvbnMu
cmVxdWVzdEhlYWRlcnM7CgogaWYoT2JqZWN0LmlzRnVuY3Rpb24oZXh0cmFzLnB1c2gpKQogZm9y
KHZhciBpPTAsbGVuZ3RoPWV4dHJhcy5sZW5ndGg7aTxsZW5ndGg7aSs9MikKIGhlYWRlcnNbZXh0
cmFzW2ldXT1leHRyYXNbaSsxXTsKIGVsc2UKICRIKGV4dHJhcykuZWFjaChmdW5jdGlvbihwYWly
KXtoZWFkZXJzW3BhaXIua2V5XT1wYWlyLnZhbHVlfSk7Cn0KCiBmb3IodmFyIG5hbWUgaW4gaGVh
ZGVycykKIHRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIobmFtZSxoZWFkZXJzW25hbWVd
KTsKfSwKCiBzdWNjZXNzOmZ1bmN0aW9uKCl7CiB2YXIgc3RhdHVzPXRoaXMuZ2V0U3RhdHVzKCk7
CiByZXR1cm4hc3RhdHVzfHwoc3RhdHVzPj0yMDAmJnN0YXR1czwzMDApOwp9LAoKIGdldFN0YXR1
czpmdW5jdGlvbigpewogdHJ5ewoKCgogcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1cz09MTIy
Mz8yMDQ6dGhpcy50cmFuc3BvcnQuc3RhdHVzfHwwOwp9Y2F0Y2goZSl7cmV0dXJuIDB9Cn0sCgog
cmVzcG9uZFRvUmVhZHlTdGF0ZTpmdW5jdGlvbihyZWFkeVN0YXRlKXsKIHZhciBzdGF0ZT1BamF4
LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdLHJlc3BvbnNlPW5ldyBBamF4LlJlc3BvbnNlKHRo
aXMpOwoKIGlmKHN0YXRlPT0nQ29tcGxldGUnKXsKIHZhciBzdGFydEF0PW5ldyBEYXRlKCk7CiB0
cnl7CiB0aGlzLl9jb21wbGV0ZT10cnVlOwoodGhpcy5vcHRpb25zWydvbicrcmVzcG9uc2Uuc3Rh
dHVzXQp8fHRoaXMub3B0aW9uc1snb24nKyh0aGlzLnN1Y2Nlc3MoKT8nU3VjY2Vzcyc6J0ZhaWx1
cmUnKV0KfHxQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikocmVzcG9uc2UscmVzcG9uc2UuaGVhZGVy
SlNPTik7Cn1jYXRjaChlKXsKIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7Cn1maW5hbGx5ewoK
IHZhciBwcm9jZXNzVGltZT0obmV3IERhdGUoKS1zdGFydEF0KS8xMDAwOwogaWYocHJvY2Vzc1Rp
bWU+LjUpewogdmFyIGR1cmw9dGhpcy51cmwucmVwbGFjZSgvLipcLyhbXi8/XSopLiovLCckMScp
OwogY29uc29sZS53YXJuKCdXYXJuaW5nISAnK2R1cmwrJyB0b29rICcrcHJvY2Vzc1RpbWUrJyBz
ZWNvbmRzIHRvIHByb2Nlc3MgLSB0aGlzIG1heSBiZSBhZmZlY3RpbmcgdXNlYWJpbGl0eS4nKTsK
fQp9CgogdmFyIGNvbnRlbnRUeXBlPXJlc3BvbnNlLmdldEhlYWRlcignQ29udGVudC10eXBlJyk7
CiBpZih0aGlzLm9wdGlvbnMuZXZhbEpTPT0nZm9yY2UnCnx8KHRoaXMub3B0aW9ucy5ldmFsSlMm
JnRoaXMuaXNTYW1lT3JpZ2luKCkmJmNvbnRlbnRUeXBlCiYmY29udGVudFR5cGUubWF0Y2goL15c
cyoodGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4qKT9ccyokL2kp
KSkKIHRoaXMuZXZhbFJlc3BvbnNlKCk7Cn0KCiB0cnl7Cih0aGlzLm9wdGlvbnNbJ29uJytzdGF0
ZV18fFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSxyZXNwb25zZS5oZWFkZXJKU09O
KTsKIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb24nK3N0YXRlLHRoaXMscmVzcG9uc2UscmVz
cG9uc2UuaGVhZGVySlNPTik7Cn1jYXRjaChlKXsKIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7
Cn0KCiBpZihzdGF0ZT09J0NvbXBsZXRlJyl7CgogdGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRl
Y2hhbmdlPVByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwp9Cn0sCgogaXNTYW1lT3JpZ2luOmZ1bmN0
aW9uKCl7CiB2YXIgbT10aGlzLnVybC5tYXRjaCgvXlxzKmh0dHBzPzpcL1wvW15cL10qLyk7CiBy
ZXR1cm4hbXx8KG1bMF09PScje3Byb3RvY29sfS8vI3tkb21haW59I3twb3J0fScuaW50ZXJwb2xh
dGUoewogcHJvdG9jb2w6bG9jYXRpb24ucHJvdG9jb2wsCiBkb21haW46ZG9jdW1lbnQuZG9tYWlu
LAogcG9ydDpsb2NhdGlvbi5wb3J0Pyc6Jytsb2NhdGlvbi5wb3J0OicnCn0pKTsKfSwKCiBnZXRI
ZWFkZXI6ZnVuY3Rpb24obmFtZSl7CiB0cnl7CiByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVz
cG9uc2VIZWFkZXIobmFtZSl8fG51bGw7Cn1jYXRjaChlKXtyZXR1cm4gbnVsbH0KfSwKCiBldmFs
UmVzcG9uc2U6ZnVuY3Rpb24oKXsKIHRyeXsKIHJldHVybiBldmFsKCh0aGlzLnRyYW5zcG9ydC5y
ZXNwb25zZVRleHR8fCcnKS51bmZpbHRlckpTT04oKSk7Cn1jYXRjaChlKXsKIHRoaXMuZGlzcGF0
Y2hFeGNlcHRpb24oZSk7Cn0KfSwKCiBkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihleGNlcHRp
b24pewoodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9ufHxQcm90b3R5cGUuZW1wdHlGdW5jdGlvbiko
dGhpcyxleGNlcHRpb24pOwogQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkV4Y2VwdGlvbics
dGhpcyxleGNlcHRpb24pOwp9Cn0pOwoKQWpheC5SZXNwb25zZT1DbGFzcy5jcmVhdGUoewp9KTsK
CkFqYXguVXBkYXRlcj1DbGFzcy5jcmVhdGUoQWpheC5SZXF1ZXN0LHsKfSk7CgpBamF4LlBlcmlv
ZGljYWxVcGRhdGVyPUNsYXNzLmNyZWF0ZShBamF4LkJhc2Usewp9KTsKCmZ1bmN0aW9uICQoZWxl
bWVudCl7CiBpZihhcmd1bWVudHMubGVuZ3RoPjEpewogZm9yKHZhciBpPTAsZWxlbWVudHM9W10s
bGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW5ndGg7aSsrKQogZWxlbWVudHMucHVzaCgkKGFy
Z3VtZW50c1tpXSkpOwogcmV0dXJuIGVsZW1lbnRzOwp9CiBpZihPYmplY3QuaXNTdHJpbmcoZWxl
bWVudCkpCiBlbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOwogcmV0dXJu
IEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOwp9CgppZighd2luZG93Lk5vZGUpdmFyIE5vZGU9e307
CgooZnVuY3Rpb24oKXsKIHZhciBlbGVtZW50PXRoaXMuRWxlbWVudDsKIHRoaXMuRWxlbWVudD1m
dW5jdGlvbih0YWdOYW1lLGF0dHJpYnV0ZXMpewogYXR0cmlidXRlcz1hdHRyaWJ1dGVzfHx7fTsK
IHRhZ05hbWU9dGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogdmFyIGNhY2hlPUVsZW1lbnQuY2FjaGU7
CiBpZihQcm90b3R5cGUuQnJvd3Nlci5JRSYmYXR0cmlidXRlcy5uYW1lKXsKIHRhZ05hbWU9Jzwn
K3RhZ05hbWUrJyBuYW1lPSInK2F0dHJpYnV0ZXMubmFtZSsnIj4nOwogZGVsZXRlIGF0dHJpYnV0
ZXMubmFtZTsKIHJldHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQodGFnTmFtZSksYXR0cmlidXRlcyk7Cn0KIGlmKCFjYWNoZVt0YWdOYW1lXSljYWNoZVt0
YWdOYW1lXT1FbGVtZW50LmV4dGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTsK
IHJldHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGNhY2hlW3RhZ05hbWVdLmNsb25lTm9kZShm
YWxzZSksYXR0cmlidXRlcyk7Cn07CiBPYmplY3QuZXh0ZW5kKHRoaXMuRWxlbWVudCxlbGVtZW50
fHx7fSk7Cn0pLmNhbGwod2luZG93KTsKCkVsZW1lbnQuY2FjaGU9e307CgpFbGVtZW50Lk1ldGhv
ZHM9ewogaWRlbnRpZnk6ZnVuY3Rpb24oZWxlbWVudCl7CiBlbGVtZW50PSQoZWxlbWVudCk7CiB2
YXIgaWQ9ZWxlbWVudC5yZWFkQXR0cmlidXRlKCdpZCcpLHNlbGY9YXJndW1lbnRzLmNhbGxlZTsK
IGlmKGlkKXJldHVybiBpZDsKIGRve2lkPSdhbm9ueW1vdXNfZWxlbWVudF8nK3NlbGYuY291bnRl
cisrfXdoaWxlKCQoaWQpKTsKIGVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoJ2lkJyxpZCk7CiByZXR1
cm4gaWQ7Cn0sCn07CgpFbGVtZW50Ll9yZXR1cm5PZmZzZXQ9ZnVuY3Rpb24obCx0KXsKIHZhciBy
ZXN1bHQ9W2wsdF07CiByZXN1bHQubGVmdD1sOwogcmVzdWx0LnRvcD10OwogcmV0dXJuIHJlc3Vs
dDsKfTsKCkVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudD1mdW5jdGlvbih0
YWdOYW1lLGh0bWwpewogdmFyIGRpdj1uZXcgRWxlbWVudCgnZGl2JyksdD1FbGVtZW50Ll9pbnNl
cnRpb25UcmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXTsKIGlmKHQpewogZGl2LmlubmVySFRNTD10
WzBdK2h0bWwrdFsxXTsKIHRbMl0udGltZXMoZnVuY3Rpb24oKXtkaXY9ZGl2LmZpcnN0Q2hpbGR9
KTsKfWVsc2UgZGl2LmlubmVySFRNTD1odG1sOwogcmV0dXJuICRBKGRpdi5jaGlsZE5vZGVzKTsK
fTsKCkVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucz17CiBiZWZvcmU6ZnVuY3Rpb24oZWxl
bWVudCxub2RlKXsKIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSxlbGVtZW50
KTsKfSwKIHRvcDpmdW5jdGlvbihlbGVtZW50LG5vZGUpewogZWxlbWVudC5pbnNlcnRCZWZvcmUo
bm9kZSxlbGVtZW50LmZpcnN0Q2hpbGQpOwp9LAogYm90dG9tOmZ1bmN0aW9uKGVsZW1lbnQsbm9k
ZSl7CiBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpOwp9LAogYWZ0ZXI6ZnVuY3Rpb24oZWxlbWVu
dCxub2RlKXsKIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSxlbGVtZW50Lm5l
eHRTaWJsaW5nKTsKfSwKIHRhZ3M6ewogVEFCTEU6Wyc8dGFibGU+JywnPC90YWJsZT4nLDFdLAog
VEJPRFk6Wyc8dGFibGU+PHRib2R5PicsJzwvdGJvZHk+PC90YWJsZT4nLDJdLAogVFI6Wyc8dGFi
bGU+PHRib2R5Pjx0cj4nLCc8L3RyPjwvdGJvZHk+PC90YWJsZT4nLDNdLAogVEQ6Wyc8dGFibGU+
PHRib2R5Pjx0cj48dGQ+JywnPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nLDRdLAogU0VMRUNU
OlsnPHNlbGVjdD4nLCc8L3NlbGVjdD4nLDFdCn0KfTsKCihmdW5jdGlvbigpewogT2JqZWN0LmV4
dGVuZCh0aGlzLnRhZ3MsewogVEhFQUQ6dGhpcy50YWdzLlRCT0RZLAogVEZPT1Q6dGhpcy50YWdz
LlRCT0RZLAogVEg6dGhpcy50YWdzLlRECn0pOwp9KS5jYWxsKEVsZW1lbnQuX2luc2VydGlvblRy
YW5zbGF0aW9ucyk7CgpFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkPXsKIGhhc0F0dHJpYnV0ZTpm
dW5jdGlvbihlbGVtZW50LGF0dHJpYnV0ZSl7CiBhdHRyaWJ1dGU9RWxlbWVudC5fYXR0cmlidXRl
VHJhbnNsYXRpb25zLmhhc1thdHRyaWJ1dGVdfHxhdHRyaWJ1dGU7CiB2YXIgbm9kZT0kKGVsZW1l
bnQpLmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKIHJldHVybiBub2RlJiZub2RlLnNwZWNp
ZmllZDsKfQp9OwoKRWxlbWVudC5NZXRob2RzLkJ5VGFnPXt9OwoKT2JqZWN0LmV4dGVuZChFbGVt
ZW50LEVsZW1lbnQuTWV0aG9kcyk7CgppZighUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVt
ZW50RXh0ZW5zaW9ucyYmCiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5fX3Byb3RvX18p
ewogd2luZG93LkhUTUxFbGVtZW50PXt9Owogd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZT1k
b2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5fX3Byb3RvX187CiBQcm90b3R5cGUuQnJvd3Nl
ckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zPXRydWU7Cn0KCkVsZW1lbnQuZXh0ZW5kPShmdW5j
dGlvbigpewogaWYoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRl
bnNpb25zKQogcmV0dXJuIFByb3RvdHlwZS5LOwoKIHZhciBNZXRob2RzPXt9LEJ5VGFnPUVsZW1l
bnQuTWV0aG9kcy5CeVRhZzsKCiB2YXIgZXh0ZW5kPU9iamVjdC5leHRlbmQoZnVuY3Rpb24oZWxl
bWVudCl7CiBpZighZWxlbWVudHx8ZWxlbWVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZXx8CiBlbGVt
ZW50Lm5vZGVUeXBlIT0xfHxlbGVtZW50PT13aW5kb3cpcmV0dXJuIGVsZW1lbnQ7CgogdmFyIG1l
dGhvZHM9T2JqZWN0LmNsb25lKE1ldGhvZHMpLAogdGFnTmFtZT1lbGVtZW50LnRhZ05hbWUscHJv
cGVydHksdmFsdWU7CgoKIGlmKEJ5VGFnW3RhZ05hbWVdKU9iamVjdC5leHRlbmQobWV0aG9kcyxC
eVRhZ1t0YWdOYW1lXSk7CgogZm9yKHByb3BlcnR5IGluIG1ldGhvZHMpewogdmFsdWU9bWV0aG9k
c1twcm9wZXJ0eV07CiBpZihPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkmJiEocHJvcGVydHkgaW4g
ZWxlbWVudCkpCiBlbGVtZW50W3Byb3BlcnR5XT12YWx1ZS5tZXRob2RpemUoKTsKfQoKIGVsZW1l
bnQuX2V4dGVuZGVkQnlQcm90b3R5cGU9UHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CiByZXR1cm4g
ZWxlbWVudDsKCn0sewogcmVmcmVzaDpmdW5jdGlvbigpewoKIGlmKCFQcm90b3R5cGUuQnJvd3Nl
ckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zKXsKIE9iamVjdC5leHRlbmQoTWV0aG9kcyxFbGVt
ZW50Lk1ldGhvZHMpOwogT2JqZWN0LmV4dGVuZChNZXRob2RzLEVsZW1lbnQuTWV0aG9kcy5TaW11
bGF0ZWQpOwp9Cn0KfSk7CgogZXh0ZW5kLnJlZnJlc2goKTsKIHJldHVybiBleHRlbmQ7Cn0pKCk7
CgpFbGVtZW50Lmhhc0F0dHJpYnV0ZT1mdW5jdGlvbihlbGVtZW50LGF0dHJpYnV0ZSl7CiBpZihl
bGVtZW50Lmhhc0F0dHJpYnV0ZSlyZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRl
KTsKIHJldHVybiBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLmhhc0F0dHJpYnV0ZShlbGVtZW50
LGF0dHJpYnV0ZSk7Cn07CgpFbGVtZW50LmFkZE1ldGhvZHM9ZnVuY3Rpb24obWV0aG9kcyl7CiB2
YXIgRj1Qcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLFQ9RWxlbWVudC5NZXRob2RzLkJ5VGFnOwoK
IGlmKCFtZXRob2RzKXsKIE9iamVjdC5leHRlbmQoRm9ybSxGb3JtLk1ldGhvZHMpOwogT2JqZWN0
LmV4dGVuZChGb3JtLkVsZW1lbnQsRm9ybS5FbGVtZW50Lk1ldGhvZHMpOwogT2JqZWN0LmV4dGVu
ZChFbGVtZW50Lk1ldGhvZHMuQnlUYWcsewoiRk9STSI6T2JqZWN0LmNsb25lKEZvcm0uTWV0aG9k
cyksCiJJTlBVVCI6T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKIlNFTEVDVCI6
T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKIlRFWFRBUkVBIjpPYmplY3QuY2xv
bmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpCn0pOwp9CgogaWYoYXJndW1lbnRzLmxlbmd0aD09Mil7
CiB2YXIgdGFnTmFtZT1tZXRob2RzOwogbWV0aG9kcz1hcmd1bWVudHNbMV07Cn0KCiBpZighdGFn
TmFtZSlPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcyxtZXRob2RzfHx7fSk7CiBlbHNlewog
aWYoT2JqZWN0LmlzQXJyYXkodGFnTmFtZSkpdGFnTmFtZS5lYWNoKGV4dGVuZCk7CiBlbHNlIGV4
dGVuZCh0YWdOYW1lKTsKfQoKIGZ1bmN0aW9uIGV4dGVuZCh0YWdOYW1lKXsKIHRhZ05hbWU9dGFn
TmFtZS50b1VwcGVyQ2FzZSgpOwogaWYoIUVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSkK
IEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXT17fTsKIE9iamVjdC5leHRlbmQoRWxlbWVu
dC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdLG1ldGhvZHMpOwp9CgogZnVuY3Rpb24gY29weShtZXRo
b2RzLGRlc3RpbmF0aW9uLG9ubHlJZkFic2VudCl7CiBvbmx5SWZBYnNlbnQ9b25seUlmQWJzZW50
fHxmYWxzZTsKIGZvcih2YXIgcHJvcGVydHkgaW4gbWV0aG9kcyl7CiB2YXIgdmFsdWU9bWV0aG9k
c1twcm9wZXJ0eV07CiBpZighT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpKWNvbnRpbnVlOwogaWYo
IW9ubHlJZkFic2VudHx8IShwcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbikpCiBkZXN0aW5hdGlvbltw
cm9wZXJ0eV09dmFsdWUubWV0aG9kaXplKCk7Cn0KfQoKIGZ1bmN0aW9uIGZpbmRET01DbGFzcyh0
YWdOYW1lKXsKIHZhciBrbGFzczsKIHZhciB0cmFucz17CiJPUFRHUk9VUCI6Ik9wdEdyb3VwIiwi
VEVYVEFSRUEiOiJUZXh0QXJlYSIsIlAiOiJQYXJhZ3JhcGgiLAoiRklFTERTRVQiOiJGaWVsZFNl
dCIsIlVMIjoiVUxpc3QiLCJPTCI6Ik9MaXN0IiwiREwiOiJETGlzdCIsCiJESVIiOiJEaXJlY3Rv
cnkiLCJIMSI6IkhlYWRpbmciLCJIMiI6IkhlYWRpbmciLCJIMyI6IkhlYWRpbmciLAoiSDQiOiJI
ZWFkaW5nIiwiSDUiOiJIZWFkaW5nIiwiSDYiOiJIZWFkaW5nIiwiUSI6IlF1b3RlIiwKIklOUyI6
Ik1vZCIsIkRFTCI6Ik1vZCIsIkEiOiJBbmNob3IiLCJJTUciOiJJbWFnZSIsIkNBUFRJT04iOgoi
VGFibGVDYXB0aW9uIiwiQ09MIjoiVGFibGVDb2wiLCJDT0xHUk9VUCI6IlRhYmxlQ29sIiwiVEhF
QUQiOgoiVGFibGVTZWN0aW9uIiwiVEZPT1QiOiJUYWJsZVNlY3Rpb24iLCJUQk9EWSI6IlRhYmxl
U2VjdGlvbiIsIlRSIjoKIlRhYmxlUm93IiwiVEgiOiJUYWJsZUNlbGwiLCJURCI6IlRhYmxlQ2Vs
bCIsIkZSQU1FU0VUIjoKIkZyYW1lU2V0IiwiSUZSQU1FIjoiSUZyYW1lIgp9OwogaWYodHJhbnNb
dGFnTmFtZV0pa2xhc3M9J0hUTUwnK3RyYW5zW3RhZ05hbWVdKydFbGVtZW50JzsKIGlmKHdpbmRv
d1trbGFzc10pcmV0dXJuIHdpbmRvd1trbGFzc107CiBrbGFzcz0nSFRNTCcrdGFnTmFtZSsnRWxl
bWVudCc7CiBpZih3aW5kb3dba2xhc3NdKXJldHVybiB3aW5kb3dba2xhc3NdOwoga2xhc3M9J0hU
TUwnK3RhZ05hbWUuY2FwaXRhbGl6ZSgpKydFbGVtZW50JzsKIGlmKHdpbmRvd1trbGFzc10pcmV0
dXJuIHdpbmRvd1trbGFzc107Cgogd2luZG93W2tsYXNzXT17fTsKIHdpbmRvd1trbGFzc10ucHJv
dG90eXBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkuX19wcm90b19fOwogcmV0dXJu
IHdpbmRvd1trbGFzc107Cn0KCiBpZihGLkVsZW1lbnRFeHRlbnNpb25zKXsKIGNvcHkoRWxlbWVu
dC5NZXRob2RzLEhUTUxFbGVtZW50LnByb3RvdHlwZSk7CiBjb3B5KEVsZW1lbnQuTWV0aG9kcy5T
aW11bGF0ZWQsSFRNTEVsZW1lbnQucHJvdG90eXBlLHRydWUpOwp9CgogaWYoRi5TcGVjaWZpY0Vs
ZW1lbnRFeHRlbnNpb25zKXsKIGZvcih2YXIgdGFnIGluIEVsZW1lbnQuTWV0aG9kcy5CeVRhZyl7
CiB2YXIga2xhc3M9ZmluZERPTUNsYXNzKHRhZyk7CiBpZihPYmplY3QuaXNVbmRlZmluZWQoa2xh
c3MpKWNvbnRpbnVlOwogY29weShUW3RhZ10sa2xhc3MucHJvdG90eXBlKTsKfQp9CgogT2JqZWN0
LmV4dGVuZChFbGVtZW50LEVsZW1lbnQuTWV0aG9kcyk7CiBkZWxldGUgRWxlbWVudC5CeVRhZzsK
CiBpZihFbGVtZW50LmV4dGVuZC5yZWZyZXNoKUVsZW1lbnQuZXh0ZW5kLnJlZnJlc2goKTsKIEVs
ZW1lbnQuY2FjaGU9e307Cn07Cgpkb2N1bWVudC52aWV3cG9ydD17CiBnZXREaW1lbnNpb25zOmZ1
bmN0aW9uKCl7CiB2YXIgZGltZW5zaW9ucz17fTsKIHZhciBCPVByb3RvdHlwZS5Ccm93c2VyOwog
JHcoJ3dpZHRoIGhlaWdodCcpLmVhY2goZnVuY3Rpb24oZCl7CiB2YXIgRD1kLmNhcGl0YWxpemUo
KTsKIGRpbWVuc2lvbnNbZF09KEIuV2ViS2l0JiYhZG9jdW1lbnQuZXZhbHVhdGUpP3NlbGZbJ2lu
bmVyJytEXToKKEIuT3BlcmEpP2RvY3VtZW50LmJvZHlbJ2NsaWVudCcrRF06ZG9jdW1lbnQuZG9j
dW1lbnRFbGVtZW50WydjbGllbnQnK0RdOwp9KTsKIHJldHVybiBkaW1lbnNpb25zOwp9LAoKIGdl
dFdpZHRoOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkud2lkdGg7Cn0s
CgogZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkuaGVp
Z2h0Owp9LAoKfTsKCgp2YXIgU2VsZWN0b3I9Q2xhc3MuY3JlYXRlKHsKIGluaXRpYWxpemU6ZnVu
Y3Rpb24oZXhwcmVzc2lvbil7CiB0aGlzLmV4cHJlc3Npb249ZXhwcmVzc2lvbi5zdHJpcCgpOwog
dGhpcy5jb21waWxlTWF0Y2hlcigpOwp9LAoKIHNob3VsZFVzZVhQYXRoOmZ1bmN0aW9uKCl7CiBp
ZighUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aClyZXR1cm4gZmFsc2U7CgogdmFyIGU9
dGhpcy5leHByZXNzaW9uOwoKCiBpZihQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQmJgooZS5pbmNs
dWRlKCItb2YtdHlwZSIpfHxlLmluY2x1ZGUoIjplbXB0eSIpKSkKIHJldHVybiBmYWxzZTsKCgoK
IGlmKCgvKFxbW1x3LV0qPzp8OmNoZWNrZWQpLykudGVzdCh0aGlzLmV4cHJlc3Npb24pKQogcmV0
dXJuIGZhbHNlOwoKIHJldHVybiB0cnVlOwp9LAoKIGNvbXBpbGVNYXRjaGVyOmZ1bmN0aW9uKCl7
CiBpZih0aGlzLnNob3VsZFVzZVhQYXRoKCkpCiByZXR1cm4gdGhpcy5jb21waWxlWFBhdGhNYXRj
aGVyKCk7CgogdmFyIGU9dGhpcy5leHByZXNzaW9uLHBzPVNlbGVjdG9yLnBhdHRlcm5zLGg9U2Vs
ZWN0b3IuaGFuZGxlcnMsCiBjPVNlbGVjdG9yLmNyaXRlcmlhLGxlLHAsbTsKCiBpZihTZWxlY3Rv
ci5fY2FjaGVbZV0pewogdGhpcy5tYXRjaGVyPVNlbGVjdG9yLl9jYWNoZVtlXTsKIHJldHVybjsK
fQoKIHRoaXMubWF0Y2hlcj1bInRoaXMubWF0Y2hlciA9IGZ1bmN0aW9uKHJvb3QpIHsiLAoidmFy
IHIgPSByb290LCBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIGMgPSBmYWxzZSwgbjsiXTsKCiB3aGls
ZShlJiZsZSE9ZSYmKC9cUy8pLnRlc3QoZSkpewogbGU9ZTsKIGZvcih2YXIgaSBpbiBwcyl7CiBw
PXBzW2ldOwogaWYobT1lLm1hdGNoKHApKXsKIHRoaXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1
bmN0aW9uKGNbaV0pP2NbaV0obSk6CiBuZXcgVGVtcGxhdGUoY1tpXSkuZXZhbHVhdGUobSkpOwog
ZT1lLnJlcGxhY2UobVswXSwnJyk7CiBicmVhazsKfQp9Cn0KCiB0aGlzLm1hdGNoZXIucHVzaCgi
cmV0dXJuIGgudW5pcXVlKG4pO1xufSIpOwogZXZhbCh0aGlzLm1hdGNoZXIuam9pbignXG4nKSk7
CiBTZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9uXT10aGlzLm1hdGNoZXI7Cn0sCgogY29t
cGlsZVhQYXRoTWF0Y2hlcjpmdW5jdGlvbigpewogdmFyIGU9dGhpcy5leHByZXNzaW9uLHBzPVNl
bGVjdG9yLnBhdHRlcm5zLAogeD1TZWxlY3Rvci54cGF0aCxsZSxtOwoKIGlmKFNlbGVjdG9yLl9j
YWNoZVtlXSl7CiB0aGlzLnhwYXRoPVNlbGVjdG9yLl9jYWNoZVtlXTtyZXR1cm47Cn0KCiB0aGlz
Lm1hdGNoZXI9WycuLy8qJ107CiB3aGlsZShlJiZsZSE9ZSYmKC9cUy8pLnRlc3QoZSkpewogbGU9
ZTsKIGZvcih2YXIgaSBpbiBwcyl7CiBpZihtPWUubWF0Y2gocHNbaV0pKXsKIHRoaXMubWF0Y2hl
ci5wdXNoKE9iamVjdC5pc0Z1bmN0aW9uKHhbaV0pP3hbaV0obSk6CiBuZXcgVGVtcGxhdGUoeFtp
XSkuZXZhbHVhdGUobSkpOwogZT1lLnJlcGxhY2UobVswXSwnJyk7CiBicmVhazsKfQp9Cn0KCiB0
aGlzLnhwYXRoPXRoaXMubWF0Y2hlci5qb2luKCcnKTsKIFNlbGVjdG9yLl9jYWNoZVt0aGlzLmV4
cHJlc3Npb25dPXRoaXMueHBhdGg7Cn0sCgogZmluZEVsZW1lbnRzOmZ1bmN0aW9uKHJvb3Qpewog
cm9vdD1yb290fHxkb2N1bWVudDsKIGlmKHRoaXMueHBhdGgpcmV0dXJuIGRvY3VtZW50Ll9nZXRF
bGVtZW50c0J5WFBhdGgodGhpcy54cGF0aCxyb290KTsKIHJldHVybiB0aGlzLm1hdGNoZXIocm9v
dCk7Cn0sCgogbWF0Y2g6ZnVuY3Rpb24oZWxlbWVudCl7CiB0aGlzLnRva2Vucz1bXTsKCiB2YXIg
ZT10aGlzLmV4cHJlc3Npb24scHM9U2VsZWN0b3IucGF0dGVybnMsYXM9U2VsZWN0b3IuYXNzZXJ0
aW9uczsKIHZhciBsZSxwLG07Cgogd2hpbGUoZSYmbGUhPT1lJiYoL1xTLykudGVzdChlKSl7CiBs
ZT1lOwogZm9yKHZhciBpIGluIHBzKXsKIHA9cHNbaV07CiBpZihtPWUubWF0Y2gocCkpewoKCiBp
Zihhc1tpXSl7CiB0aGlzLnRva2Vucy5wdXNoKFtpLE9iamVjdC5jbG9uZShtKV0pOwogZT1lLnJl
cGxhY2UobVswXSwnJyk7Cn1lbHNlewoKCiByZXR1cm4gdGhpcy5maW5kRWxlbWVudHMoZG9jdW1l
bnQpLmluY2x1ZGUoZWxlbWVudCk7Cn0KfQp9Cn0KCiB2YXIgbWF0Y2g9dHJ1ZSxuYW1lLG1hdGNo
ZXM7CiBmb3IodmFyIGk9MCx0b2tlbjt0b2tlbj10aGlzLnRva2Vuc1tpXTtpKyspewogbmFtZT10
b2tlblswXSxtYXRjaGVzPXRva2VuWzFdOwogaWYoIVNlbGVjdG9yLmFzc2VydGlvbnNbbmFtZV0o
ZWxlbWVudCxtYXRjaGVzKSl7CiBtYXRjaD1mYWxzZTticmVhazsKfQp9CgogcmV0dXJuIG1hdGNo
Owp9LAoKIHRvU3RyaW5nOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5leHByZXNzaW9uOwp9LAoK
IGluc3BlY3Q6ZnVuY3Rpb24oKXsKIHJldHVybiIjPFNlbGVjdG9yOiIrdGhpcy5leHByZXNzaW9u
Lmluc3BlY3QoKSsiPiI7Cn0KfSk7CgpPYmplY3QuZXh0ZW5kKFNlbGVjdG9yLHsKIF9jYWNoZTp7
fSwKCiB4cGF0aDp7CiBkZXNjZW5kYW50OiIvLyoiLAogY2hpbGQ6Ii8qIiwKIGFkamFjZW50OiIv
Zm9sbG93aW5nLXNpYmxpbmc6OipbMV0iLAogbGF0ZXJTaWJsaW5nOicvZm9sbG93aW5nLXNpYmxp
bmc6OionLAogdGFnTmFtZTpmdW5jdGlvbihtKXsKIGlmKG1bMV09PScqJylyZXR1cm4nJzsKIHJl
dHVybiJbbG9jYWwtbmFtZSgpPSciK21bMV0udG9Mb3dlckNhc2UoKSsKIicgb3IgbG9jYWwtbmFt
ZSgpPSciK21bMV0udG9VcHBlckNhc2UoKSsiJ10iOwp9LAogY2xhc3NOYW1lOiJbY29udGFpbnMo
Y29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICN7MX0gJyldIiwKIGlkOiJbQGlkPScjezF9J10i
LAogYXR0clByZXNlbmNlOmZ1bmN0aW9uKG0pewogbVsxXT1tWzFdLnRvTG93ZXJDYXNlKCk7CiBy
ZXR1cm4gbmV3IFRlbXBsYXRlKCJbQCN7MX1dIikuZXZhbHVhdGUobSk7Cn0sCiBhdHRyOmZ1bmN0
aW9uKG0pewogbVsxXT1tWzFdLnRvTG93ZXJDYXNlKCk7CiBtWzNdPW1bNV18fG1bNl07CiByZXR1
cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLm9wZXJhdG9yc1ttWzJdXSkuZXZhbHVhdGUo
bSk7Cn0sCiBwc2V1ZG86ZnVuY3Rpb24obSl7CiB2YXIgaD1TZWxlY3Rvci54cGF0aC5wc2V1ZG9z
W21bMV1dOwogaWYoIWgpcmV0dXJuJyc7CiBpZihPYmplY3QuaXNGdW5jdGlvbihoKSlyZXR1cm4g
aChtKTsKIHJldHVybiBuZXcgVGVtcGxhdGUoU2VsZWN0b3IueHBhdGgucHNldWRvc1ttWzFdXSku
ZXZhbHVhdGUobSk7Cn0sCiBvcGVyYXRvcnM6ewonPSc6IltAI3sxfT0nI3szfSddIiwKJyE9Jzoi
W0AjezF9IT0nI3szfSddIiwKJ149JzoiW3N0YXJ0cy13aXRoKEAjezF9LCAnI3szfScpXSIsCick
PSc6IltzdWJzdHJpbmcoQCN7MX0sIChzdHJpbmctbGVuZ3RoKEAjezF9KSAtIHN0cmluZy1sZW5n
dGgoJyN7M30nKSArIDEpKT0nI3szfSddIiwKJyo9JzoiW2NvbnRhaW5zKEAjezF9LCAnI3szfScp
XSIsCid+PSc6Iltjb250YWlucyhjb25jYXQoJyAnLCBAI3sxfSwgJyAnKSwgJyAjezN9ICcpXSIs
Cid8PSc6Iltjb250YWlucyhjb25jYXQoJy0nLCBAI3sxfSwgJy0nKSwgJy0jezN9LScpXSIKfSwK
IHBzZXVkb3M6ewonZmlyc3QtY2hpbGQnOidbbm90KHByZWNlZGluZy1zaWJsaW5nOjoqKV0nLAon
bGFzdC1jaGlsZCc6J1tub3QoZm9sbG93aW5nLXNpYmxpbmc6OiopXScsCidvbmx5LWNoaWxkJzon
W25vdChwcmVjZWRpbmctc2libGluZzo6KiBvciBmb2xsb3dpbmctc2libGluZzo6KildJywKJ2Vt
cHR5JzoiW2NvdW50KCopID0gMCBhbmQgKGNvdW50KHRleHQoKSkgPSAwIG9yIHRyYW5zbGF0ZSh0
ZXh0KCksICcgXHRcclxuJywgJycpID0gJycpXSIsCidjaGVja2VkJzoiW0BjaGVja2VkXSIsCidk
aXNhYmxlZCc6IltAZGlzYWJsZWRdIiwKJ2VuYWJsZWQnOiJbbm90KEBkaXNhYmxlZCldIiwKJ25v
dCc6ZnVuY3Rpb24obSl7CiB2YXIgZT1tWzZdLHA9U2VsZWN0b3IucGF0dGVybnMsCiB4PVNlbGVj
dG9yLnhwYXRoLGxlLHY7CgogdmFyIGV4Y2x1c2lvbj1bXTsKIHdoaWxlKGUmJmxlIT1lJiYoL1xT
LykudGVzdChlKSl7CiBsZT1lOwogZm9yKHZhciBpIGluIHApewogaWYobT1lLm1hdGNoKHBbaV0p
KXsKIHY9T2JqZWN0LmlzRnVuY3Rpb24oeFtpXSk/eFtpXShtKTpuZXcgVGVtcGxhdGUoeFtpXSku
ZXZhbHVhdGUobSk7CiBleGNsdXNpb24ucHVzaCgiKCIrdi5zdWJzdHJpbmcoMSx2Lmxlbmd0aC0x
KSsiKSIpOwogZT1lLnJlcGxhY2UobVswXSwnJyk7CiBicmVhazsKfQp9Cn0KIHJldHVybiJbbm90
KCIrZXhjbHVzaW9uLmpvaW4oIiBhbmQgIikrIildIjsKfSwKJ250aC1jaGlsZCc6ZnVuY3Rpb24o
bSl7CiByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihjb3VudCguL3ByZWNlZGlu
Zy1zaWJsaW5nOjoqKSArIDEpICIsbSk7Cn0sCidudGgtbGFzdC1jaGlsZCc6ZnVuY3Rpb24obSl7
CiByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihjb3VudCguL2ZvbGxvd2luZy1z
aWJsaW5nOjoqKSArIDEpICIsbSk7Cn0sCidudGgtb2YtdHlwZSc6ZnVuY3Rpb24obSl7CiByZXR1
cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoInBvc2l0aW9uKCkgIixtKTsKfSwKJ250aC1s
YXN0LW9mLXR5cGUnOmZ1bmN0aW9uKG0pewogcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3Mu
bnRoKCIobGFzdCgpICsgMSAtIHBvc2l0aW9uKCkpICIsbSk7Cn0sCidmaXJzdC1vZi10eXBlJzpm
dW5jdGlvbihtKXsKIG1bNl09IjEiO3JldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgt
b2YtdHlwZSddKG0pOwp9LAonbGFzdC1vZi10eXBlJzpmdW5jdGlvbihtKXsKIG1bNl09IjEiO3Jl
dHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgtbGFzdC1vZi10eXBlJ10obSk7Cn0sCidv
bmx5LW9mLXR5cGUnOmZ1bmN0aW9uKG0pewogdmFyIHA9U2VsZWN0b3IueHBhdGgucHNldWRvczty
ZXR1cm4gcFsnZmlyc3Qtb2YtdHlwZSddKG0pK3BbJ2xhc3Qtb2YtdHlwZSddKG0pOwp9LAogbnRo
OmZ1bmN0aW9uKGZyYWdtZW50LG0pewogdmFyIG1tLGZvcm11bGE9bVs2XSxwcmVkaWNhdGU7CiBp
Zihmb3JtdWxhPT0nZXZlbicpZm9ybXVsYT0nMm4rMCc7CiBpZihmb3JtdWxhPT0nb2RkJylmb3Jt
dWxhPScybisxJzsKIGlmKG1tPWZvcm11bGEubWF0Y2goL14oXGQrKSQvKSkKIHJldHVybidbJytm
cmFnbWVudCsiPSAiK21tWzFdKyddJzsKIGlmKG1tPWZvcm11bGEubWF0Y2goL14oLT9cZCopP24o
KFsrLV0pKFxkKykpPy8pKXsKIGlmKG1tWzFdPT0iLSIpbW1bMV09LTE7CiB2YXIgYT1tbVsxXT9O
dW1iZXIobW1bMV0pOjE7CiB2YXIgYj1tbVsyXT9OdW1iZXIobW1bMl0pOjA7CiBwcmVkaWNhdGU9
IlsoKCN7ZnJhZ21lbnR9IC0gI3tifSkgbW9kICN7YX0gPSAwKSBhbmQgIisKIigoI3tmcmFnbWVu
dH0gLSAje2J9KSBkaXYgI3thfSA+PSAwKV0iOwogcmV0dXJuIG5ldyBUZW1wbGF0ZShwcmVkaWNh
dGUpLmV2YWx1YXRlKHsKIGZyYWdtZW50OmZyYWdtZW50LGE6YSxiOmJ9KTsKfQp9Cn0KfSwKCiBj
cml0ZXJpYTp7CiB0YWdOYW1lOiduID0gaC50YWdOYW1lKG4sIHIsICIjezF9IiwgYyk7ICAgICAg
YyA9IGZhbHNlOycsCiBjbGFzc05hbWU6J24gPSBoLmNsYXNzTmFtZShuLCByLCAiI3sxfSIsIGMp
OyAgICBjID0gZmFsc2U7JywKIGlkOiduID0gaC5pZChuLCByLCAiI3sxfSIsIGMpOyAgICAgICAg
ICAgYyA9IGZhbHNlOycsCiBhdHRyUHJlc2VuY2U6J24gPSBoLmF0dHJQcmVzZW5jZShuLCByLCAi
I3sxfSIsIGMpOyBjID0gZmFsc2U7JywKIGF0dHI6ZnVuY3Rpb24obSl7CiBtWzNdPShtWzVdfHxt
WzZdKTsKIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLmF0dHIobiwgciwgIiN7MX0iLCAiI3sz
fSIsICIjezJ9IiwgYyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKfSwKIHBzZXVkbzpmdW5j
dGlvbihtKXsKIGlmKG1bNl0pbVs2XT1tWzZdLnJlcGxhY2UoLyIvZywnXFwiJyk7CiByZXR1cm4g
bmV3IFRlbXBsYXRlKCduID0gaC5wc2V1ZG8obiwgIiN7MX0iLCAiI3s2fSIsIHIsIGMpOyBjID0g
ZmFsc2U7JykuZXZhbHVhdGUobSk7Cn0sCiBkZXNjZW5kYW50OidjID0gImRlc2NlbmRhbnQiOycs
CiBjaGlsZDonYyA9ICJjaGlsZCI7JywKIGFkamFjZW50OidjID0gImFkamFjZW50IjsnLAogbGF0
ZXJTaWJsaW5nOidjID0gImxhdGVyU2libGluZyI7Jwp9LAoKIHBhdHRlcm5zOnsKCgogbGF0ZXJT
aWJsaW5nOi9eXHMqflxzKi8sCiBjaGlsZDovXlxzKj5ccyovLAogYWRqYWNlbnQ6L15ccypcK1xz
Ki8sCiBkZXNjZW5kYW50Oi9eXHMvLAoKCiB0YWdOYW1lOi9eXHMqKFwqfFtcd1wtXSspKFxifCQp
Py8sCiBpZDovXiMoW1x3XC1cKl0rKShcYnwkKS8sCiBjbGFzc05hbWU6L15cLihbXHdcLVwqXSsp
KFxifCQpLywKIHBzZXVkbzoKL146KChmaXJzdHxsYXN0fG50aHxudGgtbGFzdHxvbmx5KSgtY2hp
bGR8LW9mLXR5cGUpfGVtcHR5fGNoZWNrZWR8KGVufGRpcylhYmxlZHxub3QpKFwoKC4qPylcKSk/
KFxifCR8KD89XHN8Wzorfj5dKSkvLAogYXR0clByZXNlbmNlOi9eXFsoW1x3XSspXF0vLAogYXR0
cjovXFsoKD86W1x3LV0qOik/W1x3LV0rKVxzKig/OihbIV4kKn58XT89KVxzKigoWyciXSkoW15c
NF0qPylcNHwoW14nIl1bXlxdXSo/KSkpP1xdLwp9LAoKCiBhc3NlcnRpb25zOnsKIHRhZ05hbWU6
ZnVuY3Rpb24oZWxlbWVudCxtYXRjaGVzKXsKIHJldHVybiBtYXRjaGVzWzFdLnRvVXBwZXJDYXNl
KCk9PWVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOwp9LAoKIGNsYXNzTmFtZTpmdW5jdGlv
bihlbGVtZW50LG1hdGNoZXMpewogcmV0dXJuIEVsZW1lbnQuaGFzQ2xhc3NOYW1lKGVsZW1lbnQs
bWF0Y2hlc1sxXSk7Cn0sCgogaWQ6ZnVuY3Rpb24oZWxlbWVudCxtYXRjaGVzKXsKIHJldHVybiBl
bGVtZW50LmlkPT09bWF0Y2hlc1sxXTsKfSwKCiBhdHRyUHJlc2VuY2U6ZnVuY3Rpb24oZWxlbWVu
dCxtYXRjaGVzKXsKIHJldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShlbGVtZW50LG1hdGNoZXNb
MV0pOwp9LAoKIGF0dHI6ZnVuY3Rpb24oZWxlbWVudCxtYXRjaGVzKXsKIHZhciBub2RlVmFsdWU9
RWxlbWVudC5yZWFkQXR0cmlidXRlKGVsZW1lbnQsbWF0Y2hlc1sxXSk7CiByZXR1cm4gbm9kZVZh
bHVlJiZTZWxlY3Rvci5vcGVyYXRvcnNbbWF0Y2hlc1syXV0obm9kZVZhbHVlLG1hdGNoZXNbNV18
fG1hdGNoZXNbNl0pOwp9Cn0sCgogaGFuZGxlcnM6ewoKCiBjb25jYXQ6ZnVuY3Rpb24oYSxiKXsK
IGZvcih2YXIgaT0wLG5vZGU7bm9kZT1iW2ldO2krKykKIGEucHVzaChub2RlKTsKIHJldHVybiBh
Owp9LAoKCiBtYXJrOmZ1bmN0aW9uKG5vZGVzKXsKIHZhciBfdHJ1ZT1Qcm90b3R5cGUuZW1wdHlG
dW5jdGlvbjsKIGZvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspCiBub2RlLl9jb3Vu
dGVkQnlQcm90b3R5cGU9X3RydWU7CiByZXR1cm4gbm9kZXM7Cn0sCgogdW5tYXJrOmZ1bmN0aW9u
KG5vZGVzKXsKIGZvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspCiBub2RlLl9jb3Vu
dGVkQnlQcm90b3R5cGU9dW5kZWZpbmVkOwogcmV0dXJuIG5vZGVzOwp9LAoKCgoKIGluZGV4OmZ1
bmN0aW9uKHBhcmVudE5vZGUscmV2ZXJzZSxvZlR5cGUpewogcGFyZW50Tm9kZS5fY291bnRlZEJ5
UHJvdG90eXBlPVByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwogaWYocmV2ZXJzZSl7CiBmb3IodmFy
IG5vZGVzPXBhcmVudE5vZGUuY2hpbGROb2RlcyxpPW5vZGVzLmxlbmd0aC0xLGo9MTtpPj0wO2kt
LSl7CiB2YXIgbm9kZT1ub2Rlc1tpXTsKIGlmKG5vZGUubm9kZVR5cGU9PTEmJighb2ZUeXBlfHxu
b2RlLl9jb3VudGVkQnlQcm90b3R5cGUpKW5vZGUubm9kZUluZGV4PWorKzsKfQp9ZWxzZXsKIGZv
cih2YXIgaT0wLGo9MSxub2Rlcz1wYXJlbnROb2RlLmNoaWxkTm9kZXM7bm9kZT1ub2Rlc1tpXTtp
KyspCiBpZihub2RlLm5vZGVUeXBlPT0xJiYoIW9mVHlwZXx8bm9kZS5fY291bnRlZEJ5UHJvdG90
eXBlKSlub2RlLm5vZGVJbmRleD1qKys7Cn0KfSwKCgogdW5pcXVlOmZ1bmN0aW9uKG5vZGVzKXsK
IGlmKG5vZGVzLmxlbmd0aD09MClyZXR1cm4gbm9kZXM7CiB2YXIgcmVzdWx0cz1bXSxuOwogZm9y
KHZhciBpPTAsbD1ub2Rlcy5sZW5ndGg7aTxsO2krKykKIGlmKCEobj1ub2Rlc1tpXSkuX2NvdW50
ZWRCeVByb3RvdHlwZSl7CiBuLl9jb3VudGVkQnlQcm90b3R5cGU9UHJvdG90eXBlLmVtcHR5RnVu
Y3Rpb247CiByZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQobikpOwp9CiByZXR1cm4gU2VsZWN0
b3IuaGFuZGxlcnMudW5tYXJrKHJlc3VsdHMpOwp9LAoKCiBkZXNjZW5kYW50OmZ1bmN0aW9uKG5v
ZGVzKXsKIHZhciBoPVNlbGVjdG9yLmhhbmRsZXJzOwogZm9yKHZhciBpPTAscmVzdWx0cz1bXSxu
b2RlO25vZGU9bm9kZXNbaV07aSsrKQogaC5jb25jYXQocmVzdWx0cyxub2RlLmdldEVsZW1lbnRz
QnlUYWdOYW1lKCcqJykpOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgogY2hpbGQ6ZnVuY3Rpb24obm9k
ZXMpewogdmFyIGg9U2VsZWN0b3IuaGFuZGxlcnM7CiBmb3IodmFyIGk9MCxyZXN1bHRzPVtdLG5v
ZGU7bm9kZT1ub2Rlc1tpXTtpKyspewogZm9yKHZhciBqPTAsY2hpbGQ7Y2hpbGQ9bm9kZS5jaGls
ZE5vZGVzW2pdO2orKykKIGlmKGNoaWxkLm5vZGVUeXBlPT0xJiZjaGlsZC50YWdOYW1lIT0nIScp
cmVzdWx0cy5wdXNoKGNoaWxkKTsKfQogcmV0dXJuIHJlc3VsdHM7Cn0sCgogYWRqYWNlbnQ6ZnVu
Y3Rpb24obm9kZXMpewogZm9yKHZhciBpPTAscmVzdWx0cz1bXSxub2RlO25vZGU9bm9kZXNbaV07
aSsrKXsKIHZhciBuZXh0PXRoaXMubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpOwogaWYobmV4dCly
ZXN1bHRzLnB1c2gobmV4dCk7Cn0KIHJldHVybiByZXN1bHRzOwp9LAoKIGxhdGVyU2libGluZzpm
dW5jdGlvbihub2Rlcyl7CiB2YXIgaD1TZWxlY3Rvci5oYW5kbGVyczsKIGZvcih2YXIgaT0wLHJl
c3VsdHM9W10sbm9kZTtub2RlPW5vZGVzW2ldO2krKykKIGguY29uY2F0KHJlc3VsdHMsRWxlbWVu
dC5uZXh0U2libGluZ3Mobm9kZSkpOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgogbmV4dEVsZW1lbnRT
aWJsaW5nOmZ1bmN0aW9uKG5vZGUpewogd2hpbGUobm9kZT1ub2RlLm5leHRTaWJsaW5nKQogaWYo
bm9kZS5ub2RlVHlwZT09MSlyZXR1cm4gbm9kZTsKIHJldHVybiBudWxsOwp9LAoKIHByZXZpb3Vz
RWxlbWVudFNpYmxpbmc6ZnVuY3Rpb24obm9kZSl7CiB3aGlsZShub2RlPW5vZGUucHJldmlvdXNT
aWJsaW5nKQogaWYobm9kZS5ub2RlVHlwZT09MSlyZXR1cm4gbm9kZTsKIHJldHVybiBudWxsOwp9
LAoKCiB0YWdOYW1lOmZ1bmN0aW9uKG5vZGVzLHJvb3QsdGFnTmFtZSxjb21iaW5hdG9yKXsKIHZh
ciB1VGFnTmFtZT10YWdOYW1lLnRvVXBwZXJDYXNlKCk7CiB2YXIgcmVzdWx0cz1bXSxoPVNlbGVj
dG9yLmhhbmRsZXJzOwogaWYobm9kZXMpewogaWYoY29tYmluYXRvcil7CgogaWYoY29tYmluYXRv
cj09ImRlc2NlbmRhbnQiKXsKIGZvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspCiBo
LmNvbmNhdChyZXN1bHRzLG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpOwogcmV0
dXJuIHJlc3VsdHM7Cn1lbHNlIG5vZGVzPXRoaXNbY29tYmluYXRvcl0obm9kZXMpOwogaWYodGFn
TmFtZT09IioiKXJldHVybiBub2RlczsKfQogZm9yKHZhciBpPTAsbm9kZTtub2RlPW5vZGVzW2ld
O2krKykKIGlmKG5vZGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpPT09dVRhZ05hbWUpcmVzdWx0cy5w
dXNoKG5vZGUpOwogcmV0dXJuIHJlc3VsdHM7Cn1lbHNlIHJldHVybiByb290LmdldEVsZW1lbnRz
QnlUYWdOYW1lKHRhZ05hbWUpOwp9LAoKIGlkOmZ1bmN0aW9uKG5vZGVzLHJvb3QsaWQsY29tYmlu
YXRvcil7CiB2YXIgdGFyZ2V0Tm9kZT0kKGlkKSxoPVNlbGVjdG9yLmhhbmRsZXJzOwogaWYoIXRh
cmdldE5vZGUpcmV0dXJuW107CiBpZighbm9kZXMmJnJvb3Q9PWRvY3VtZW50KXJldHVyblt0YXJn
ZXROb2RlXTsKIGlmKG5vZGVzKXsKIGlmKGNvbWJpbmF0b3IpewogaWYoY29tYmluYXRvcj09J2No
aWxkJyl7CiBmb3IodmFyIGk9MCxub2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYodGFyZ2V0Tm9k
ZS5wYXJlbnROb2RlPT1ub2RlKXJldHVyblt0YXJnZXROb2RlXTsKfWVsc2UgaWYoY29tYmluYXRv
cj09J2Rlc2NlbmRhbnQnKXsKIGZvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspCiBp
ZihFbGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXROb2RlLG5vZGUpKXJldHVyblt0YXJnZXROb2Rl
XTsKfWVsc2UgaWYoY29tYmluYXRvcj09J2FkamFjZW50Jyl7CiBmb3IodmFyIGk9MCxub2RlO25v
ZGU9bm9kZXNbaV07aSsrKQogaWYoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2li
bGluZyh0YXJnZXROb2RlKT09bm9kZSkKIHJldHVyblt0YXJnZXROb2RlXTsKfWVsc2Ugbm9kZXM9
aFtjb21iaW5hdG9yXShub2Rlcyk7Cn0KIGZvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtp
KyspCiBpZihub2RlPT10YXJnZXROb2RlKXJldHVyblt0YXJnZXROb2RlXTsKIHJldHVybltdOwp9
CiByZXR1cm4odGFyZ2V0Tm9kZSYmRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSxyb290
KSk/W3RhcmdldE5vZGVdOltdOwp9LAoKIGNsYXNzTmFtZTpmdW5jdGlvbihub2Rlcyxyb290LGNs
YXNzTmFtZSxjb21iaW5hdG9yKXsKIGlmKG5vZGVzJiZjb21iaW5hdG9yKW5vZGVzPXRoaXNbY29t
YmluYXRvcl0obm9kZXMpOwogcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJzLmJ5Q2xhc3NOYW1lKG5v
ZGVzLHJvb3QsY2xhc3NOYW1lKTsKfSwKCiBieUNsYXNzTmFtZTpmdW5jdGlvbihub2Rlcyxyb290
LGNsYXNzTmFtZSl7CiBpZighbm9kZXMpbm9kZXM9U2VsZWN0b3IuaGFuZGxlcnMuZGVzY2VuZGFu
dChbcm9vdF0pOwogdmFyIG5lZWRsZT0nICcrY2xhc3NOYW1lKycgJzsKIGZvcih2YXIgaT0wLHJl
c3VsdHM9W10sbm9kZSxub2RlQ2xhc3NOYW1lO25vZGU9bm9kZXNbaV07aSsrKXsKIG5vZGVDbGFz
c05hbWU9bm9kZS5jbGFzc05hbWU7CiBpZihub2RlQ2xhc3NOYW1lLmxlbmd0aD09MCljb250aW51
ZTsKIGlmKG5vZGVDbGFzc05hbWU9PWNsYXNzTmFtZXx8KCcgJytub2RlQ2xhc3NOYW1lKycgJyku
aW5jbHVkZShuZWVkbGUpKQogcmVzdWx0cy5wdXNoKG5vZGUpOwp9CiByZXR1cm4gcmVzdWx0czsK
fSwKCiBhdHRyUHJlc2VuY2U6ZnVuY3Rpb24obm9kZXMscm9vdCxhdHRyLGNvbWJpbmF0b3Ipewog
aWYoIW5vZGVzKW5vZGVzPXJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKIGlmKG5vZGVz
JiZjb21iaW5hdG9yKW5vZGVzPXRoaXNbY29tYmluYXRvcl0obm9kZXMpOwogdmFyIHJlc3VsdHM9
W107CiBmb3IodmFyIGk9MCxub2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYoRWxlbWVudC5oYXNB
dHRyaWJ1dGUobm9kZSxhdHRyKSlyZXN1bHRzLnB1c2gobm9kZSk7CiByZXR1cm4gcmVzdWx0czsK
fSwKCiBhdHRyOmZ1bmN0aW9uKG5vZGVzLHJvb3QsYXR0cix2YWx1ZSxvcGVyYXRvcixjb21iaW5h
dG9yKXsKIGlmKCFub2Rlcylub2Rlcz1yb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CiBp
Zihub2RlcyYmY29tYmluYXRvcilub2Rlcz10aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKIHZhciBo
YW5kbGVyPVNlbGVjdG9yLm9wZXJhdG9yc1tvcGVyYXRvcl0scmVzdWx0cz1bXTsKIGZvcih2YXIg
aT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspewogdmFyIG5vZGVWYWx1ZT1FbGVtZW50LnJlYWRB
dHRyaWJ1dGUobm9kZSxhdHRyKTsKIGlmKG5vZGVWYWx1ZT09PW51bGwpY29udGludWU7CiBpZiho
YW5kbGVyKG5vZGVWYWx1ZSx2YWx1ZSkpcmVzdWx0cy5wdXNoKG5vZGUpOwp9CiByZXR1cm4gcmVz
dWx0czsKfSwKCiBwc2V1ZG86ZnVuY3Rpb24obm9kZXMsbmFtZSx2YWx1ZSxyb290LGNvbWJpbmF0
b3IpewogaWYobm9kZXMmJmNvbWJpbmF0b3Ipbm9kZXM9dGhpc1tjb21iaW5hdG9yXShub2Rlcyk7
CiBpZighbm9kZXMpbm9kZXM9cm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwogcmV0dXJu
IFNlbGVjdG9yLnBzZXVkb3NbbmFtZV0obm9kZXMsdmFsdWUscm9vdCk7Cn0KfSwKCiBwc2V1ZG9z
OnsKJ2ZpcnN0LWNoaWxkJzpmdW5jdGlvbihub2Rlcyx2YWx1ZSxyb290KXsKIGZvcih2YXIgaT0w
LHJlc3VsdHM9W10sbm9kZTtub2RlPW5vZGVzW2ldO2krKyl7CiBpZihTZWxlY3Rvci5oYW5kbGVy
cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKG5vZGUpKWNvbnRpbnVlOwogcmVzdWx0cy5wdXNoKG5v
ZGUpOwp9CiByZXR1cm4gcmVzdWx0czsKfSwKJ2xhc3QtY2hpbGQnOmZ1bmN0aW9uKG5vZGVzLHZh
bHVlLHJvb3QpewogZm9yKHZhciBpPTAscmVzdWx0cz1bXSxub2RlO25vZGU9bm9kZXNbaV07aSsr
KXsKIGlmKFNlbGVjdG9yLmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhub2RlKSljb250aW51
ZTsKIHJlc3VsdHMucHVzaChub2RlKTsKfQogcmV0dXJuIHJlc3VsdHM7Cn0sCidvbmx5LWNoaWxk
JzpmdW5jdGlvbihub2Rlcyx2YWx1ZSxyb290KXsKIHZhciBoPVNlbGVjdG9yLmhhbmRsZXJzOwog
Zm9yKHZhciBpPTAscmVzdWx0cz1bXSxub2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYoIWgucHJl
dmlvdXNFbGVtZW50U2libGluZyhub2RlKSYmIWgubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpKQog
cmVzdWx0cy5wdXNoKG5vZGUpOwogcmV0dXJuIHJlc3VsdHM7Cn0sCidudGgtY2hpbGQnOmZ1bmN0
aW9uKG5vZGVzLGZvcm11bGEscm9vdCl7CiByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9k
ZXMsZm9ybXVsYSxyb290KTsKfSwKJ250aC1sYXN0LWNoaWxkJzpmdW5jdGlvbihub2Rlcyxmb3Jt
dWxhLHJvb3QpewogcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLGZvcm11bGEscm9v
dCx0cnVlKTsKfSwKJ250aC1vZi10eXBlJzpmdW5jdGlvbihub2Rlcyxmb3JtdWxhLHJvb3Qpewog
cmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLGZvcm11bGEscm9vdCxmYWxzZSx0cnVl
KTsKfSwKJ250aC1sYXN0LW9mLXR5cGUnOmZ1bmN0aW9uKG5vZGVzLGZvcm11bGEscm9vdCl7CiBy
ZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsZm9ybXVsYSxyb290LHRydWUsdHJ1ZSk7
Cn0sCidmaXJzdC1vZi10eXBlJzpmdW5jdGlvbihub2Rlcyxmb3JtdWxhLHJvb3QpewogcmV0dXJu
IFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCIxIixyb290LGZhbHNlLHRydWUpOwp9LAonbGFz
dC1vZi10eXBlJzpmdW5jdGlvbihub2Rlcyxmb3JtdWxhLHJvb3QpewogcmV0dXJuIFNlbGVjdG9y
LnBzZXVkb3MubnRoKG5vZGVzLCIxIixyb290LHRydWUsdHJ1ZSk7Cn0sCidvbmx5LW9mLXR5cGUn
OmZ1bmN0aW9uKG5vZGVzLGZvcm11bGEscm9vdCl7CiB2YXIgcD1TZWxlY3Rvci5wc2V1ZG9zOwog
cmV0dXJuIHBbJ2xhc3Qtb2YtdHlwZSddKHBbJ2ZpcnN0LW9mLXR5cGUnXShub2Rlcyxmb3JtdWxh
LHJvb3QpLGZvcm11bGEscm9vdCk7Cn0sCgoKIGdldEluZGljZXM6ZnVuY3Rpb24oYSxiLHRvdGFs
KXsKIGlmKGE9PTApcmV0dXJuIGI+MD9bYl06W107CiByZXR1cm4gJFIoMSx0b3RhbCkuaW5qZWN0
KFtdLGZ1bmN0aW9uKG1lbW8saSl7CiBpZigwPT0oaS1iKSVhJiYoaS1iKS9hPj0wKW1lbW8ucHVz
aChpKTsKIHJldHVybiBtZW1vOwp9KTsKfSwKCgogbnRoOmZ1bmN0aW9uKG5vZGVzLGZvcm11bGEs
cm9vdCxyZXZlcnNlLG9mVHlwZSl7CiBpZihub2Rlcy5sZW5ndGg9PTApcmV0dXJuW107CiBpZihm
b3JtdWxhPT0nZXZlbicpZm9ybXVsYT0nMm4rMCc7CiBpZihmb3JtdWxhPT0nb2RkJylmb3JtdWxh
PScybisxJzsKIHZhciBoPVNlbGVjdG9yLmhhbmRsZXJzLHJlc3VsdHM9W10saW5kZXhlZD1bXSxt
OwogaC5tYXJrKG5vZGVzKTsKIGZvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspewog
aWYoIW5vZGUucGFyZW50Tm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKXsKIGguaW5kZXgobm9kZS5w
YXJlbnROb2RlLHJldmVyc2Usb2ZUeXBlKTsKIGluZGV4ZWQucHVzaChub2RlLnBhcmVudE5vZGUp
Owp9Cn0KIGlmKGZvcm11bGEubWF0Y2goL15cZCskLykpewogZm9ybXVsYT1OdW1iZXIoZm9ybXVs
YSk7CiBmb3IodmFyIGk9MCxub2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYobm9kZS5ub2RlSW5k
ZXg9PWZvcm11bGEpcmVzdWx0cy5wdXNoKG5vZGUpOwp9ZWxzZSBpZihtPWZvcm11bGEubWF0Y2go
L14oLT9cZCopP24oKFsrLV0pKFxkKykpPy8pKXsKIGlmKG1bMV09PSItIiltWzFdPS0xOwogdmFy
IGE9bVsxXT9OdW1iZXIobVsxXSk6MTsKIHZhciBiPW1bMl0/TnVtYmVyKG1bMl0pOjA7CiB2YXIg
aW5kaWNlcz1TZWxlY3Rvci5wc2V1ZG9zLmdldEluZGljZXMoYSxiLG5vZGVzLmxlbmd0aCk7CiBm
b3IodmFyIGk9MCxub2RlLGw9aW5kaWNlcy5sZW5ndGg7bm9kZT1ub2Rlc1tpXTtpKyspewogZm9y
KHZhciBqPTA7ajxsO2orKykKIGlmKG5vZGUubm9kZUluZGV4PT1pbmRpY2VzW2pdKXJlc3VsdHMu
cHVzaChub2RlKTsKfQp9CiBoLnVubWFyayhub2Rlcyk7CiBoLnVubWFyayhpbmRleGVkKTsKIHJl
dHVybiByZXN1bHRzOwp9LAoKJ2VtcHR5JzpmdW5jdGlvbihub2Rlcyx2YWx1ZSxyb290KXsKIGZv
cih2YXIgaT0wLHJlc3VsdHM9W10sbm9kZTtub2RlPW5vZGVzW2ldO2krKyl7CgogaWYobm9kZS50
YWdOYW1lPT0nISd8fChub2RlLmZpcnN0Q2hpbGQmJiFub2RlLmlubmVySFRNTC5tYXRjaCgvXlxz
KiQvKSkpY29udGludWU7CiByZXN1bHRzLnB1c2gobm9kZSk7Cn0KIHJldHVybiByZXN1bHRzOwp9
LAoKJ25vdCc6ZnVuY3Rpb24obm9kZXMsc2VsZWN0b3Iscm9vdCl7CiB2YXIgaD1TZWxlY3Rvci5o
YW5kbGVycyxzZWxlY3RvclR5cGUsbTsKIHZhciBleGNsdXNpb25zPW5ldyBTZWxlY3RvcihzZWxl
Y3RvcikuZmluZEVsZW1lbnRzKHJvb3QpOwogaC5tYXJrKGV4Y2x1c2lvbnMpOwogZm9yKHZhciBp
PTAscmVzdWx0cz1bXSxub2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYoIW5vZGUuX2NvdW50ZWRC
eVByb3RvdHlwZSlyZXN1bHRzLnB1c2gobm9kZSk7CiBoLnVubWFyayhleGNsdXNpb25zKTsKIHJl
dHVybiByZXN1bHRzOwp9LAoKJ2VuYWJsZWQnOmZ1bmN0aW9uKG5vZGVzLHZhbHVlLHJvb3Qpewog
Zm9yKHZhciBpPTAscmVzdWx0cz1bXSxub2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYoIW5vZGUu
ZGlzYWJsZWQpcmVzdWx0cy5wdXNoKG5vZGUpOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgonZGlzYWJs
ZWQnOmZ1bmN0aW9uKG5vZGVzLHZhbHVlLHJvb3QpewogZm9yKHZhciBpPTAscmVzdWx0cz1bXSxu
b2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYobm9kZS5kaXNhYmxlZClyZXN1bHRzLnB1c2gobm9k
ZSk7CiByZXR1cm4gcmVzdWx0czsKfSwKCidjaGVja2VkJzpmdW5jdGlvbihub2Rlcyx2YWx1ZSxy
b290KXsKIGZvcih2YXIgaT0wLHJlc3VsdHM9W10sbm9kZTtub2RlPW5vZGVzW2ldO2krKykKIGlm
KG5vZGUuY2hlY2tlZClyZXN1bHRzLnB1c2gobm9kZSk7CiByZXR1cm4gcmVzdWx0czsKfQp9LAoK
IG9wZXJhdG9yczp7Cic9JzpmdW5jdGlvbihudix2KXtyZXR1cm4gbnY9PXY7fSwKJyE9JzpmdW5j
dGlvbihudix2KXtyZXR1cm4gbnYhPXY7fSwKJ149JzpmdW5jdGlvbihudix2KXtyZXR1cm4gbnYu
c3RhcnRzV2l0aCh2KTt9LAonJD0nOmZ1bmN0aW9uKG52LHYpe3JldHVybiBudi5lbmRzV2l0aCh2
KTt9LAonKj0nOmZ1bmN0aW9uKG52LHYpe3JldHVybiBudi5pbmNsdWRlKHYpO30sCid+PSc6ZnVu
Y3Rpb24obnYsdil7cmV0dXJuKCcgJytudisnICcpLmluY2x1ZGUoJyAnK3YrJyAnKTt9LAonfD0n
OmZ1bmN0aW9uKG52LHYpe3JldHVybignLScrbnYudG9VcHBlckNhc2UoKSsnLScpLmluY2x1ZGUo
Jy0nK3YudG9VcHBlckNhc2UoKSsnLScpO30KfSwKCiBzcGxpdDpmdW5jdGlvbihleHByZXNzaW9u
KXsKIHZhciBleHByZXNzaW9ucz1bXTsKIGV4cHJlc3Npb24uc2NhbigvKChbXHcjOi5+PisoKVxz
LV0rfFwqfFxbLio/XF0pKylccyooLHwkKS8sZnVuY3Rpb24obSl7CiBleHByZXNzaW9ucy5wdXNo
KG1bMV0uc3RyaXAoKSk7Cn0pOwogcmV0dXJuIGV4cHJlc3Npb25zOwp9LAoKIG1hdGNoRWxlbWVu
dHM6ZnVuY3Rpb24oZWxlbWVudHMsZXhwcmVzc2lvbil7CiB2YXIgbWF0Y2hlcz0kJChleHByZXNz
aW9uKSxoPVNlbGVjdG9yLmhhbmRsZXJzOwogaC5tYXJrKG1hdGNoZXMpOwogZm9yKHZhciBpPTAs
cmVzdWx0cz1bXSxlbGVtZW50O2VsZW1lbnQ9ZWxlbWVudHNbaV07aSsrKQogaWYoZWxlbWVudC5f
Y291bnRlZEJ5UHJvdG90eXBlKXJlc3VsdHMucHVzaChlbGVtZW50KTsKIGgudW5tYXJrKG1hdGNo
ZXMpOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgogZmluZEVsZW1lbnQ6ZnVuY3Rpb24oZWxlbWVudHMs
ZXhwcmVzc2lvbixpbmRleCl7CiBpZihPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikpewogaW5k
ZXg9ZXhwcmVzc2lvbjtleHByZXNzaW9uPWZhbHNlOwp9CiByZXR1cm4gU2VsZWN0b3IubWF0Y2hF
bGVtZW50cyhlbGVtZW50cyxleHByZXNzaW9ufHwnKicpW2luZGV4fHwwXTsKfSwKCiBmaW5kQ2hp
bGRFbGVtZW50czpmdW5jdGlvbihlbGVtZW50LGV4cHJlc3Npb25zKXsKIGV4cHJlc3Npb25zPVNl
bGVjdG9yLnNwbGl0KGV4cHJlc3Npb25zLmpvaW4oJywnKSk7CiB2YXIgcmVzdWx0cz1bXSxoPVNl
bGVjdG9yLmhhbmRsZXJzOwogZm9yKHZhciBpPTAsbD1leHByZXNzaW9ucy5sZW5ndGgsc2VsZWN0
b3I7aTxsO2krKyl7CiBzZWxlY3Rvcj1uZXcgU2VsZWN0b3IoZXhwcmVzc2lvbnNbaV0uc3RyaXAo
KSk7CiBoLmNvbmNhdChyZXN1bHRzLHNlbGVjdG9yLmZpbmRFbGVtZW50cyhlbGVtZW50KSk7Cn0K
IHJldHVybihsPjEpP2gudW5pcXVlKHJlc3VsdHMpOnJlc3VsdHM7Cn0KfSk7CgpmdW5jdGlvbiAk
JCgpewogcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGRvY3VtZW50LCRBKGFyZ3Vt
ZW50cykpOwp9CnZhciBGb3JtPXsKIHJlc2V0OmZ1bmN0aW9uKGZvcm0pewogJChmb3JtKS5yZXNl
dCgpOwogcmV0dXJuIGZvcm07Cn0sCn07CgpGb3JtLk1ldGhvZHM9ewogc2VyaWFsaXplOmZ1bmN0
aW9uKGZvcm0sb3B0aW9ucyl7CiByZXR1cm4gRm9ybS5zZXJpYWxpemVFbGVtZW50cyhGb3JtLmdl
dEVsZW1lbnRzKGZvcm0pLG9wdGlvbnMpOwp9LAoKIGdldEVsZW1lbnRzOmZ1bmN0aW9uKGZvcm0p
ewogcmV0dXJuICRBKCQoZm9ybSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSkuaW5qZWN0KFtd
LAogZnVuY3Rpb24oZWxlbWVudHMsY2hpbGQpewogaWYoRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJz
W2NoaWxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pCiBlbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0
ZW5kKGNoaWxkKSk7CiByZXR1cm4gZWxlbWVudHM7Cn0KKTsKfSwKCiBnZXRJbnB1dHM6ZnVuY3Rp
b24oZm9ybSx0eXBlTmFtZSxuYW1lKXsKIGZvcm09JChmb3JtKTsKIHZhciBpbnB1dHM9Zm9ybS5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTsKCiBpZighdHlwZU5hbWUmJiFuYW1lKXJldHVy
biAkQShpbnB1dHMpLm1hcChFbGVtZW50LmV4dGVuZCk7CgogZm9yKHZhciBpPTAsbWF0Y2hpbmdJ
bnB1dHM9W10sbGVuZ3RoPWlucHV0cy5sZW5ndGg7aTxsZW5ndGg7aSsrKXsKIHZhciBpbnB1dD1p
bnB1dHNbaV07CiBpZigodHlwZU5hbWUmJmlucHV0LnR5cGUhPXR5cGVOYW1lKXx8KG5hbWUmJmlu
cHV0Lm5hbWUhPW5hbWUpKQogY29udGludWU7CiBtYXRjaGluZ0lucHV0cy5wdXNoKEVsZW1lbnQu
ZXh0ZW5kKGlucHV0KSk7Cn0KCiByZXR1cm4gbWF0Y2hpbmdJbnB1dHM7Cn0sCgogZGlzYWJsZTpm
dW5jdGlvbihmb3JtKXsKIGZvcm09JChmb3JtKTsKIEZvcm0uZ2V0RWxlbWVudHMoZm9ybSkuaW52
b2tlKCdkaXNhYmxlJyk7CiByZXR1cm4gZm9ybTsKfSwKCiBlbmFibGU6ZnVuY3Rpb24oZm9ybSl7
CiBmb3JtPSQoZm9ybSk7CiBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZW5hYmxlJyk7
CiByZXR1cm4gZm9ybTsKfSwKCiBmaW5kRmlyc3RFbGVtZW50OmZ1bmN0aW9uKGZvcm0pewogdmFy
IGVsZW1lbnRzPSQoZm9ybSkuZ2V0RWxlbWVudHMoKS5maW5kQWxsKGZ1bmN0aW9uKGVsZW1lbnQp
ewogcmV0dXJuJ2hpZGRlbichPWVsZW1lbnQudHlwZSYmIWVsZW1lbnQuZGlzYWJsZWQ7Cn0pOwog
dmFyIGZpcnN0QnlJbmRleD1lbGVtZW50cy5maW5kQWxsKGZ1bmN0aW9uKGVsZW1lbnQpewogcmV0
dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0YWJJbmRleCcpJiZlbGVtZW50LnRhYkluZGV4Pj0w
Owp9KS5zb3J0QnkoZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGVsZW1lbnQudGFiSW5kZXh9KS5m
aXJzdCgpOwoKIHJldHVybiBmaXJzdEJ5SW5kZXg/Zmlyc3RCeUluZGV4OmVsZW1lbnRzLmZpbmQo
ZnVuY3Rpb24oZWxlbWVudCl7CiByZXR1cm5bJ2lucHV0Jywnc2VsZWN0JywndGV4dGFyZWEnXS5p
bmNsdWRlKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKfSk7Cn0sCgogZm9jdXNGaXJz
dEVsZW1lbnQ6ZnVuY3Rpb24oZm9ybSl7CiBmb3JtPSQoZm9ybSk7CiBmb3JtLmZpbmRGaXJzdEVs
ZW1lbnQoKS5hY3RpdmF0ZSgpOwogcmV0dXJuIGZvcm07Cn0sCgogcmVxdWVzdDpmdW5jdGlvbihm
b3JtLG9wdGlvbnMpewogZm9ybT0kKGZvcm0pLG9wdGlvbnM9T2JqZWN0LmNsb25lKG9wdGlvbnN8
fHt9KTsKCiB2YXIgcGFyYW1zPW9wdGlvbnMucGFyYW1ldGVycyxhY3Rpb249Zm9ybS5yZWFkQXR0
cmlidXRlKCdhY3Rpb24nKXx8Jyc7CiBpZihhY3Rpb24uYmxhbmsoKSlhY3Rpb249d2luZG93Lmxv
Y2F0aW9uLmhyZWY7CiBvcHRpb25zLnBhcmFtZXRlcnM9Zm9ybS5zZXJpYWxpemUodHJ1ZSk7Cgog
aWYocGFyYW1zKXsKIGlmKE9iamVjdC5pc1N0cmluZyhwYXJhbXMpKXBhcmFtcz1wYXJhbXMudG9R
dWVyeVBhcmFtcygpOwogT2JqZWN0LmV4dGVuZChvcHRpb25zLnBhcmFtZXRlcnMscGFyYW1zKTsK
fQoKIGlmKGZvcm0uaGFzQXR0cmlidXRlKCdtZXRob2QnKSYmIW9wdGlvbnMubWV0aG9kKQogb3B0
aW9ucy5tZXRob2Q9Zm9ybS5tZXRob2Q7CgogcmV0dXJuIG5ldyBBamF4LlJlcXVlc3QoYWN0aW9u
LG9wdGlvbnMpOwp9Cn07CgoKCkZvcm0uRWxlbWVudD17CiBmb2N1czpmdW5jdGlvbihlbGVtZW50
KXsKICQoZWxlbWVudCkuZm9jdXMoKTsKIHJldHVybiBlbGVtZW50Owp9LAoKIHNlbGVjdDpmdW5j
dGlvbihlbGVtZW50KXsKICQoZWxlbWVudCkuc2VsZWN0KCk7CiByZXR1cm4gZWxlbWVudDsKfQp9
OwoKRm9ybS5FbGVtZW50Lk1ldGhvZHM9ewp9OwoKdmFyIEZpZWxkPUZvcm0uRWxlbWVudDsKdmFy
ICRGPUZvcm0uRWxlbWVudC5NZXRob2RzLmdldFZhbHVlOwoKQWJzdHJhY3QuVGltZWRPYnNlcnZl
cj1DbGFzcy5jcmVhdGUoUGVyaW9kaWNhbEV4ZWN1dGVyLHsKIGluaXRpYWxpemU6ZnVuY3Rpb24o
JHN1cGVyLGVsZW1lbnQsZnJlcXVlbmN5LGNhbGxiYWNrKXsKICRzdXBlcihjYWxsYmFjayxmcmVx
dWVuY3kpOwogdGhpcy5lbGVtZW50PSQoZWxlbWVudCk7CiB0aGlzLmxhc3RWYWx1ZT10aGlzLmdl
dFZhbHVlKCk7Cn0sCgogZXhlY3V0ZTpmdW5jdGlvbigpewogdmFyIHZhbHVlPXRoaXMuZ2V0VmFs
dWUoKTsKIGlmKE9iamVjdC5pc1N0cmluZyh0aGlzLmxhc3RWYWx1ZSkmJk9iamVjdC5pc1N0cmlu
Zyh2YWx1ZSk/CiB0aGlzLmxhc3RWYWx1ZSE9dmFsdWU6U3RyaW5nKHRoaXMubGFzdFZhbHVlKSE9
U3RyaW5nKHZhbHVlKSl7CiB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCx2YWx1ZSk7CiB0aGlz
Lmxhc3RWYWx1ZT12YWx1ZTsKfQp9Cn0pOwoKQWJzdHJhY3QuRXZlbnRPYnNlcnZlcj1DbGFzcy5j
cmVhdGUoewogaW5pdGlhbGl6ZTpmdW5jdGlvbihlbGVtZW50LGNhbGxiYWNrKXsKIHRoaXMuZWxl
bWVudD0kKGVsZW1lbnQpOwogdGhpcy5jYWxsYmFjaz1jYWxsYmFjazsKCiB0aGlzLmxhc3RWYWx1
ZT10aGlzLmdldFZhbHVlKCk7CiBpZih0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgp
PT0nZm9ybScpCiB0aGlzLnJlZ2lzdGVyRm9ybUNhbGxiYWNrcygpOwogZWxzZQogdGhpcy5yZWdp
c3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCk7Cn0sCgogb25FbGVtZW50RXZlbnQ6ZnVuY3Rpb24o
KXsKIHZhciB2YWx1ZT10aGlzLmdldFZhbHVlKCk7CiBpZih0aGlzLmxhc3RWYWx1ZSE9dmFsdWUp
ewogdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsdmFsdWUpOwogdGhpcy5sYXN0VmFsdWU9dmFs
dWU7Cn0KfSwKCiByZWdpc3RlckZvcm1DYWxsYmFja3M6ZnVuY3Rpb24oKXsKIEZvcm0uZ2V0RWxl
bWVudHModGhpcy5lbGVtZW50KS5lYWNoKHRoaXMucmVnaXN0ZXJDYWxsYmFjayx0aGlzKTsKfSwK
CiByZWdpc3RlckNhbGxiYWNrOmZ1bmN0aW9uKGVsZW1lbnQpewogaWYoZWxlbWVudC50eXBlKXsK
IHN3aXRjaChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSl7CiBjYXNlJ2NoZWNrYm94JzoKIGNh
c2UncmFkaW8nOgogRXZlbnQub2JzZXJ2ZShlbGVtZW50LCdjbGljaycsdGhpcy5vbkVsZW1lbnRF
dmVudC5iaW5kKHRoaXMpKTsKIGJyZWFrOwogZGVmYXVsdDoKIEV2ZW50Lm9ic2VydmUoZWxlbWVu
dCwnY2hhbmdlJyx0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpOwogYnJlYWs7Cn0KfQp9
Cn0pOwoKRm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXI9Q2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2
ZW50T2JzZXJ2ZXIsewogZ2V0VmFsdWU6ZnVuY3Rpb24oKXsKIHJldHVybiBGb3JtLkVsZW1lbnQu
Z2V0VmFsdWUodGhpcy5lbGVtZW50KTsKfQp9KTsKCkZvcm0uRXZlbnRPYnNlcnZlcj1DbGFzcy5j
cmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlcix7CiBnZXRWYWx1ZTpmdW5jdGlvbigpewogcmV0
dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7Cn0KfSk7CmlmKCF3aW5kb3cuRXZlbnQp
dmFyIEV2ZW50PXt9OwoKT2JqZWN0LmV4dGVuZChFdmVudCx7CiBLRVlfQkFDS1NQQUNFOjgsCiBL
RVlfVEFCOjksCiBLRVlfUkVUVVJOOjEzLAogS0VZX0VTQzoyNywKIEtFWV9MRUZUOjM3LAogS0VZ
X1VQOjM4LAogS0VZX1JJR0hUOjM5LAogS0VZX0RPV046NDAsCiBLRVlfREVMRVRFOjQ2LAogS0VZ
X0hPTUU6MzYsCiBLRVlfRU5EOjM1LAogS0VZX1BBR0VVUDozMywKIEtFWV9QQUdFRE9XTjozNCwK
IEtFWV9JTlNFUlQ6NDUsCgogY2FjaGU6e30sCgogcmVsYXRlZFRhcmdldDpmdW5jdGlvbihldmVu
dCl7CiB2YXIgZWxlbWVudDsKIHN3aXRjaChldmVudC50eXBlKXsKIGNhc2UnbW91c2VvdmVyJzpl
bGVtZW50PWV2ZW50LmZyb21FbGVtZW50O2JyZWFrOwogY2FzZSdtb3VzZW91dCc6ZWxlbWVudD1l
dmVudC50b0VsZW1lbnQ7YnJlYWs7CiBkZWZhdWx0OnJldHVybiBudWxsOwp9CiByZXR1cm4gRWxl
bWVudC5leHRlbmQoZWxlbWVudCk7Cn0KfSk7CgpFdmVudC5NZXRob2RzPShmdW5jdGlvbigpewog
dmFyIGlzQnV0dG9uOwoKaWYoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KXsKIGlzQnV0dG9uPWZ1
bmN0aW9uKGV2ZW50LGNvZGUpewogc3dpdGNoKGNvZGUpewogY2FzZSAwOnJldHVybiBldmVudC53
aGljaD09MSYmIWV2ZW50Lm1ldGFLZXk7CiBjYXNlIDE6cmV0dXJuIGV2ZW50LndoaWNoPT0xJiZl
dmVudC5tZXRhS2V5OwogZGVmYXVsdDpyZXR1cm4gZmFsc2U7Cn0KfTsKCn1lbHNlewogaXNCdXR0
b249ZnVuY3Rpb24oZXZlbnQsY29kZSl7CiByZXR1cm4gZXZlbnQud2hpY2g/KGV2ZW50LndoaWNo
PT09Y29kZSsxKTooZXZlbnQuYnV0dG9uPT09Y29kZSk7Cn07Cn0KCiByZXR1cm57CiBpc0xlZnRD
bGljazpmdW5jdGlvbihldmVudCl7cmV0dXJuIGlzQnV0dG9uKGV2ZW50LDApfSwKIGlzTWlkZGxl
Q2xpY2s6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiBpc0J1dHRvbihldmVudCwxKX0sCiBpc1JpZ2h0
Q2xpY2s6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiBpc0J1dHRvbihldmVudCwyKX0sCgogZWxlbWVu
dDpmdW5jdGlvbihldmVudCl7CiB2YXIgbm9kZT1FdmVudC5leHRlbmQoZXZlbnQpLnRhcmdldDsK
IHJldHVybiBFbGVtZW50LmV4dGVuZChub2RlLm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERT9ub2Rl
LnBhcmVudE5vZGU6bm9kZSk7Cn0sCgogZmluZEVsZW1lbnQ6ZnVuY3Rpb24oZXZlbnQsZXhwcmVz
c2lvbil7CiB2YXIgZWxlbWVudD1FdmVudC5lbGVtZW50KGV2ZW50KTsKIGlmKCFleHByZXNzaW9u
KXJldHVybiBlbGVtZW50OwogdmFyIGVsZW1lbnRzPVtlbGVtZW50XS5jb25jYXQoZWxlbWVudC5h
bmNlc3RvcnMoKSk7CiByZXR1cm4gU2VsZWN0b3IuZmluZEVsZW1lbnQoZWxlbWVudHMsZXhwcmVz
c2lvbiwwKTsKfSwKCiBwb2ludGVyOmZ1bmN0aW9uKGV2ZW50KXsKIHJldHVybnsKIHg6ZXZlbnQu
cGFnZVh8fChldmVudC5jbGllbnRYKwooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExl
ZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkpLAogeTpldmVudC5wYWdlWXx8KGV2ZW50LmNs
aWVudFkrCihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2N1bWVudC5ib2R5
LnNjcm9sbFRvcCkpCn07Cn0sCgogcG9pbnRlclg6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiBFdmVu
dC5wb2ludGVyKGV2ZW50KS54fSwKIHBvaW50ZXJZOmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gRXZl
bnQucG9pbnRlcihldmVudCkueX0sCgogc3RvcDpmdW5jdGlvbihldmVudCl7CiBFdmVudC5leHRl
bmQoZXZlbnQpOwogZXZlbnQucHJldmVudERlZmF1bHQoKTsKIGV2ZW50LnN0b3BQcm9wYWdhdGlv
bigpOwogZXZlbnQuc3RvcHBlZD10cnVlOwp9Cn07Cn0pKCk7CgpFdmVudC5leHRlbmQ9KGZ1bmN0
aW9uKCl7CiB2YXIgbWV0aG9kcz1PYmplY3Qua2V5cyhFdmVudC5NZXRob2RzKS5pbmplY3Qoe30s
ZnVuY3Rpb24obSxuYW1lKXsKIG1bbmFtZV09RXZlbnQuTWV0aG9kc1tuYW1lXS5tZXRob2RpemUo
KTsKIHJldHVybiBtOwp9KTsKCiBFdmVudC5wcm90b3R5cGU9RXZlbnQucHJvdG90eXBlfHxkb2N1
bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpLl9fcHJvdG9fXzsKIE9iamVjdC5leHRlbmQo
RXZlbnQucHJvdG90eXBlLG1ldGhvZHMpOwogcmV0dXJuIFByb3RvdHlwZS5LOwp9KSgpOwoKT2Jq
ZWN0LmV4dGVuZChFdmVudCwoZnVuY3Rpb24oKXsKIHZhciBjYWNoZT1FdmVudC5jYWNoZTsKCiBm
dW5jdGlvbiBnZXRFdmVudElEKGVsZW1lbnQpewogaWYoZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJ
RClyZXR1cm4gZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRFswXTsKIGFyZ3VtZW50cy5jYWxsZWUu
aWQ9YXJndW1lbnRzLmNhbGxlZS5pZHx8MTsKIHJldHVybiBlbGVtZW50Ll9wcm90b3R5cGVFdmVu
dElEPVsrK2FyZ3VtZW50cy5jYWxsZWUuaWRdOwp9CgogZnVuY3Rpb24gZ2V0RE9NRXZlbnROYW1l
KGV2ZW50TmFtZSl7CiBpZihldmVudE5hbWUmJmV2ZW50TmFtZS5pbmNsdWRlKCc6JykpcmV0dXJu
ImRhdGFhdmFpbGFibGUiOwogaWYoIVByb3RvdHlwZS5Ccm93c2VyLklFKWV2ZW50TmFtZT17bW91
c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9W2V2ZW50TmFtZV18fGV2
ZW50TmFtZTsKIHJldHVybiBldmVudE5hbWU7Cn0KCiBmdW5jdGlvbiBnZXRDYWNoZUZvcklEKGlk
KXsKIHJldHVybiBjYWNoZVtpZF09Y2FjaGVbaWRdfHx7fTsKfQoKIGZ1bmN0aW9uIGdldFdyYXBw
ZXJzRm9yRXZlbnROYW1lKGlkLGV2ZW50TmFtZSl7CiB2YXIgYz1nZXRDYWNoZUZvcklEKGlkKTsK
IHJldHVybiBjW2V2ZW50TmFtZV09Y1tldmVudE5hbWVdfHxbXTsKfQoKIGZ1bmN0aW9uIGNyZWF0
ZVdyYXBwZXIoZWxlbWVudCxldmVudE5hbWUsaGFuZGxlcil7CiB2YXIgaWQ9Z2V0RXZlbnRJRChl
bGVtZW50KTsKIHZhciBjPWdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLGV2ZW50TmFtZSk7CiBp
ZihjLnBsdWNrKCJoYW5kbGVyIikuaW5jbHVkZShoYW5kbGVyKSlyZXR1cm4gZmFsc2U7CgogdmFy
IHdyYXBwZXI9ZnVuY3Rpb24oZXZlbnQpewogaWYoIUV2ZW50fHwhRXZlbnQuZXh0ZW5kfHwKKGV2
ZW50LmV2ZW50TmFtZSYmZXZlbnQuZXZlbnROYW1lIT1ldmVudE5hbWUpKQogcmV0dXJuIGZhbHNl
OwoKIEV2ZW50LmV4dGVuZChldmVudCk7CiBoYW5kbGVyLmNhbGwoZWxlbWVudCxldmVudCk7Cn07
CgogaWYoIShQcm90b3R5cGUuQnJvd3Nlci5JRSkmJlsnbW91c2VlbnRlcicsJ21vdXNlbGVhdmUn
XS5pbmNsdWRlKGV2ZW50TmFtZSkpewogd3JhcHBlcj13cmFwcGVyLndyYXAoZnVuY3Rpb24ocHJv
Y2VlZCxldmVudCl7CiB2YXIgcmVsPWV2ZW50LnJlbGF0ZWRUYXJnZXQsY3VyPWV2ZW50LmN1cnJl
bnRUYXJnZXQ7CiBpZihyZWwmJnJlbC5ub2RlVHlwZT09Tm9kZS5URVhUX05PREUpcmVsPXJlbC5w
YXJlbnROb2RlOwogaWYocmVsJiZyZWwhPWN1ciYmIXJlbC5kZXNjZW5kYW50T2YoY3VyKSkKIHJl
dHVybiBwcm9jZWVkKGV2ZW50KTsKfSk7Cn0KCiB3cmFwcGVyLmhhbmRsZXI9aGFuZGxlcjsKIGMu
cHVzaCh3cmFwcGVyKTsKIHJldHVybiB3cmFwcGVyOwp9CgogZnVuY3Rpb24gZGVzdHJveUNhY2hl
KCl7CiBmb3IodmFyIGlkIGluIGNhY2hlKQogZm9yKHZhciBldmVudE5hbWUgaW4gY2FjaGVbaWRd
KQogY2FjaGVbaWRdW2V2ZW50TmFtZV09bnVsbDsKfQoKIGlmKHdpbmRvdy5hdHRhY2hFdmVudCl7
CiB3aW5kb3cuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkZXN0cm95Q2FjaGUpOwp9CgogcmV0dXJu
ewogb2JzZXJ2ZTpmdW5jdGlvbihlbGVtZW50LGV2ZW50TmFtZSxoYW5kbGVyKXsKIGVsZW1lbnQ9
JChlbGVtZW50KTsKIHZhciBuYW1lPWdldERPTUV2ZW50TmFtZShldmVudE5hbWUpOwoKIHZhciB3
cmFwcGVyPWNyZWF0ZVdyYXBwZXIoZWxlbWVudCxldmVudE5hbWUsaGFuZGxlcik7CiBpZighd3Jh
cHBlcilyZXR1cm4gZWxlbWVudDsKCiBpZihlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpewogZWxl
bWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsd3JhcHBlcixmYWxzZSk7Cn1lbHNlewogZWxlbWVu
dC5hdHRhY2hFdmVudCgib24iK25hbWUsd3JhcHBlcik7Cn0KCiByZXR1cm4gZWxlbWVudDsKfSwK
CiBzdG9wT2JzZXJ2aW5nOmZ1bmN0aW9uKGVsZW1lbnQsZXZlbnROYW1lLGhhbmRsZXIpewogZWxl
bWVudD0kKGVsZW1lbnQpOwogdmFyIGlkPWdldEV2ZW50SUQoZWxlbWVudCksbmFtZT1nZXRET01F
dmVudE5hbWUoZXZlbnROYW1lKTsKCiBpZighaGFuZGxlciYmZXZlbnROYW1lKXsKIGdldFdyYXBw
ZXJzRm9yRXZlbnROYW1lKGlkLGV2ZW50TmFtZSkuZWFjaChmdW5jdGlvbih3cmFwcGVyKXsKIGVs
ZW1lbnQuc3RvcE9ic2VydmluZyhldmVudE5hbWUsd3JhcHBlci5oYW5kbGVyKTsKfSk7CiByZXR1
cm4gZWxlbWVudDsKCn1lbHNlIGlmKCFldmVudE5hbWUpewogT2JqZWN0LmtleXMoZ2V0Q2FjaGVG
b3JJRChpZCkpLmVhY2goZnVuY3Rpb24oZXZlbnROYW1lKXsKIGVsZW1lbnQuc3RvcE9ic2Vydmlu
ZyhldmVudE5hbWUpOwp9KTsKIHJldHVybiBlbGVtZW50Owp9CgogdmFyIHdyYXBwZXI9ZmluZFdy
YXBwZXIoaWQsZXZlbnROYW1lLGhhbmRsZXIpOwogaWYoIXdyYXBwZXIpcmV0dXJuIGVsZW1lbnQ7
CgogaWYoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKXsKIGVsZW1lbnQucmVtb3ZlRXZlbnRM
aXN0ZW5lcihuYW1lLHdyYXBwZXIsZmFsc2UpOwp9ZWxzZXsKIGVsZW1lbnQuZGV0YWNoRXZlbnQo
Im9uIituYW1lLHdyYXBwZXIpOwp9CgogZGVzdHJveVdyYXBwZXIoaWQsZXZlbnROYW1lLGhhbmRs
ZXIpOwoKIHJldHVybiBlbGVtZW50Owp9LAoKIGZpcmU6ZnVuY3Rpb24oZWxlbWVudCxldmVudE5h
bWUsbWVtbyl7CiBlbGVtZW50PSQoZWxlbWVudCk7CiBpZihlbGVtZW50PT1kb2N1bWVudCYmZG9j
dW1lbnQuY3JlYXRlRXZlbnQmJiFlbGVtZW50LmRpc3BhdGNoRXZlbnQpCiBlbGVtZW50PWRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudDsKCiB2YXIgZXZlbnQ7CiBpZihkb2N1bWVudC5jcmVhdGVFdmVu
dCl7CiBldmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpOwogZXZlbnQuaW5p
dEV2ZW50KCJkYXRhYXZhaWxhYmxlIix0cnVlLHRydWUpOwp9ZWxzZXsKIGV2ZW50PWRvY3VtZW50
LmNyZWF0ZUV2ZW50T2JqZWN0KCk7CiBldmVudC5ldmVudFR5cGU9Im9uZGF0YWF2YWlsYWJsZSI7
Cn0KCiBldmVudC5ldmVudE5hbWU9ZXZlbnROYW1lOwogZXZlbnQubWVtbz1tZW1vfHx7fTsKCiBp
Zihkb2N1bWVudC5jcmVhdGVFdmVudCl7CiBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwp9
ZWxzZXsKIGVsZW1lbnQuZmlyZUV2ZW50KGV2ZW50LmV2ZW50VHlwZSxldmVudCk7Cn0KCiByZXR1
cm4gRXZlbnQuZXh0ZW5kKGV2ZW50KTsKfQp9Owp9KSgpKTsKCk9iamVjdC5leHRlbmQoRXZlbnQs
RXZlbnQuTWV0aG9kcyk7CgpFbGVtZW50LmFkZE1ldGhvZHMoewogZmlyZTpFdmVudC5maXJlLAog
b2JzZXJ2ZTpFdmVudC5vYnNlcnZlLAogc3RvcE9ic2VydmluZzpFdmVudC5zdG9wT2JzZXJ2aW5n
Cn0pOwoKT2JqZWN0LmV4dGVuZChkb2N1bWVudCx7CiBmaXJlOkVsZW1lbnQuTWV0aG9kcy5maXJl
Lm1ldGhvZGl6ZSgpLAogb2JzZXJ2ZTpFbGVtZW50Lk1ldGhvZHMub2JzZXJ2ZS5tZXRob2RpemUo
KSwKIHN0b3BPYnNlcnZpbmc6RWxlbWVudC5NZXRob2RzLnN0b3BPYnNlcnZpbmcubWV0aG9kaXpl
KCksCiBsb2FkZWQ6ZmFsc2UKfSk7CgpIYXNoLnRvUXVlcnlTdHJpbmc9T2JqZWN0LnRvUXVlcnlT
dHJpbmc7Cgp2YXIgVG9nZ2xlPXtkaXNwbGF5OkVsZW1lbnQudG9nZ2xlfTsKCkVsZW1lbnQuTWV0
aG9kcy5jaGlsZE9mPUVsZW1lbnQuTWV0aG9kcy5kZXNjZW5kYW50T2Y7Cgp2YXIgSW5zZXJ0aW9u
PXsKIEJlZm9yZTpmdW5jdGlvbihlbGVtZW50LGNvbnRlbnQpewogcmV0dXJuIEVsZW1lbnQuaW5z
ZXJ0KGVsZW1lbnQse2JlZm9yZTpjb250ZW50fSk7Cn0sCgogVG9wOmZ1bmN0aW9uKGVsZW1lbnQs
Y29udGVudCl7CiByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCx7dG9wOmNvbnRlbnR9KTsK
fSwKCiBCb3R0b206ZnVuY3Rpb24oZWxlbWVudCxjb250ZW50KXsKIHJldHVybiBFbGVtZW50Lmlu
c2VydChlbGVtZW50LHtib3R0b206Y29udGVudH0pOwp9LAoKIEFmdGVyOmZ1bmN0aW9uKGVsZW1l
bnQsY29udGVudCl7CiByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCx7YWZ0ZXI6Y29udGVu
dH0pOwp9Cn07Cgp2YXIgJGNvbnRpbnVlPW5ldyBFcnJvcignInRocm93ICRjb250aW51ZSIgaXMg
ZGVwcmVjYXRlZCwgdXNlICJyZXR1cm4iIGluc3RlYWQnKTsKCgoKdmFyIFBvc2l0aW9uPXsKCgoK
IGluY2x1ZGVTY3JvbGxPZmZzZXRzOmZhbHNlLAoKIGN1bXVsYXRpdmVPZmZzZXQ6RWxlbWVudC5N
ZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQsCgogcG9zaXRpb25lZE9mZnNldDpFbGVtZW50Lk1ldGhv
ZHMucG9zaXRpb25lZE9mZnNldCwKCiByZWFsT2Zmc2V0OkVsZW1lbnQuTWV0aG9kcy5jdW11bGF0
aXZlU2Nyb2xsT2Zmc2V0LAoKIG9mZnNldFBhcmVudDpFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zmc2V0
UGFyZW50LAoKIHBhZ2U6RWxlbWVudC5NZXRob2RzLnZpZXdwb3J0T2Zmc2V0LAoKIGNsb25lOmZ1
bmN0aW9uKHNvdXJjZSx0YXJnZXQsb3B0aW9ucyl7CiBvcHRpb25zPW9wdGlvbnN8fHt9OwogcmV0
dXJuIEVsZW1lbnQuY2xvbmVQb3NpdGlvbih0YXJnZXQsc291cmNlLG9wdGlvbnMpOwp9Cn07CgoK
CmlmKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKWRvY3VtZW50LmdldEVsZW1lbnRz
QnlDbGFzc05hbWU9ZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzKXsKIGZ1bmN0aW9uIGl0ZXIobmFt
ZSl7CiByZXR1cm4gbmFtZS5ibGFuaygpP251bGw6Iltjb250YWlucyhjb25jYXQoJyAnLCBAY2xh
c3MsICcgJyksICcgIituYW1lKyIgJyldIjsKfQoKIGluc3RhbmNlTWV0aG9kcy5nZXRFbGVtZW50
c0J5Q2xhc3NOYW1lPVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGg/CiBmdW5jdGlvbihl
bGVtZW50LGNsYXNzTmFtZSl7CiBjbGFzc05hbWU9Y2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAo
KTsKIHZhciBjb25kPS9ccy8udGVzdChjbGFzc05hbWUpPyR3KGNsYXNzTmFtZSkubWFwKGl0ZXIp
LmpvaW4oJycpOml0ZXIoY2xhc3NOYW1lKTsKIHJldHVybiBjb25kP2RvY3VtZW50Ll9nZXRFbGVt
ZW50c0J5WFBhdGgoJy4vLyonK2NvbmQsZWxlbWVudCk6W107Cn06ZnVuY3Rpb24oZWxlbWVudCxj
bGFzc05hbWUpewogY2xhc3NOYW1lPWNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7CiB2YXIg
ZWxlbWVudHM9W10sY2xhc3NOYW1lcz0oL1xzLy50ZXN0KGNsYXNzTmFtZSk/JHcoY2xhc3NOYW1l
KTpudWxsKTsKIGlmKCFjbGFzc05hbWVzJiYhY2xhc3NOYW1lKXJldHVybiBlbGVtZW50czsKCiB2
YXIgbm9kZXM9JChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOwogY2xhc3NOYW1l
PScgJytjbGFzc05hbWUrJyAnOwoKIGZvcih2YXIgaT0wLGNoaWxkLGNuO2NoaWxkPW5vZGVzW2ld
O2krKyl7CiBpZihjaGlsZC5jbGFzc05hbWUmJihjbj0nICcrY2hpbGQuY2xhc3NOYW1lKycgJykm
Jihjbi5pbmNsdWRlKGNsYXNzTmFtZSl8fAooY2xhc3NOYW1lcyYmY2xhc3NOYW1lcy5hbGwoZnVu
Y3Rpb24obmFtZSl7CiByZXR1cm4hbmFtZS50b1N0cmluZygpLmJsYW5rKCkmJmNuLmluY2x1ZGUo
JyAnK25hbWUrJyAnKTsKfSkpKSkKIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQp
KTsKfQogcmV0dXJuIGVsZW1lbnRzOwp9OwoKIHJldHVybiBmdW5jdGlvbihjbGFzc05hbWUscGFy
ZW50RWxlbWVudCl7CiByZXR1cm4gJChwYXJlbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5KS5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7Cn07Cn0oRWxlbWVudC5NZXRob2RzKTsKCgoK
RWxlbWVudC5DbGFzc05hbWVzPUNsYXNzLmNyZWF0ZSgpOwpFbGVtZW50LkNsYXNzTmFtZXMucHJv
dG90eXBlPXsKIGluaXRpYWxpemU6ZnVuY3Rpb24oZWxlbWVudCl7CiB0aGlzLmVsZW1lbnQ9JChl
bGVtZW50KTsKfSwKCiBfZWFjaDpmdW5jdGlvbihpdGVyYXRvcil7CiB0aGlzLmVsZW1lbnQuY2xh
c3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSl7CiByZXR1cm4gbmFtZS5s
ZW5ndGg+MDsKfSkuX2VhY2goaXRlcmF0b3IpOwp9LAoKIHNldDpmdW5jdGlvbihjbGFzc05hbWUp
ewogdGhpcy5lbGVtZW50LmNsYXNzTmFtZT1jbGFzc05hbWU7Cn0sCgogYWRkOmZ1bmN0aW9uKGNs
YXNzTmFtZVRvQWRkKXsKIGlmKHRoaXMuaW5jbHVkZShjbGFzc05hbWVUb0FkZCkpcmV0dXJuOwog
dGhpcy5zZXQoJEEodGhpcykuY29uY2F0KGNsYXNzTmFtZVRvQWRkKS5qb2luKCcgJykpOwp9LAoK
IHJlbW92ZTpmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSl7CiBpZighdGhpcy5pbmNsdWRlKGNs
YXNzTmFtZVRvUmVtb3ZlKSlyZXR1cm47CiB0aGlzLnNldCgkQSh0aGlzKS53aXRob3V0KGNsYXNz
TmFtZVRvUmVtb3ZlKS5qb2luKCcgJykpOwp9LAoKIHRvU3RyaW5nOmZ1bmN0aW9uKCl7CiByZXR1
cm4gJEEodGhpcykuam9pbignICcpOwp9Cn07CgpPYmplY3QuZXh0ZW5kKEVsZW1lbnQuQ2xhc3NO
YW1lcy5wcm90b3R5cGUsRW51bWVyYWJsZSk7CgpFbGVtZW50LmdldElubGluZU9wYWNpdHk9ZnVu
Y3Rpb24oZWxlbWVudCl7CiByZXR1cm4gJChlbGVtZW50KS5zdHlsZS5vcGFjaXR5fHwnJzsKfTsK
CkVsZW1lbnQuZm9yY2VSZXJlbmRlcmluZz1mdW5jdGlvbihlbGVtZW50KXsKIHRyeXsKIGVsZW1l
bnQ9JChlbGVtZW50KTsKIHZhciBuPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7CiBlbGVt
ZW50LmFwcGVuZENoaWxkKG4pOwogZWxlbWVudC5yZW1vdmVDaGlsZChuKTsKfWNhdGNoKGUpe30K
fTsKCgoKdmFyIEVmZmVjdD17CiBfZWxlbWVudERvZXNOb3RFeGlzdEVycm9yOnsKIG5hbWU6J0Vs
ZW1lbnREb2VzTm90RXhpc3RFcnJvcicsCiBtZXNzYWdlOidUaGUgc3BlY2lmaWVkIERPTSBlbGVt
ZW50IGRvZXMgbm90IGV4aXN0LCBidXQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZWZmZWN0IHRvIG9w
ZXJhdGUnCn0sCiBUcmFuc2l0aW9uczp7CiBsaW5lYXI6UHJvdG90eXBlLkssCiBzaW5vaWRhbDpm
dW5jdGlvbihwb3MpewogcmV0dXJuKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvMikrMC41Owp9LAog
cmV2ZXJzZTpmdW5jdGlvbihwb3MpewogcmV0dXJuIDEtcG9zOwp9LAogZmxpY2tlcjpmdW5jdGlv
bihwb3MpewogdmFyIHBvcz0oKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvNCkrMC43NSkrTWF0aC5y
YW5kb20oKS80OwogcmV0dXJuIHBvcz4xPzE6cG9zOwp9LAogd29iYmxlOmZ1bmN0aW9uKHBvcyl7
CiByZXR1cm4oLU1hdGguY29zKHBvcypNYXRoLlBJKig5KnBvcykpLzIpKzAuNTsKfSwKIHB1bHNl
OmZ1bmN0aW9uKHBvcyxwdWxzZXMpewogcHVsc2VzPXB1bHNlc3x8NTsKIHJldHVybigKKChwb3Ml
KDEvcHVsc2VzKSkqcHVsc2VzKS5yb3VuZCgpPT0wPwooKHBvcypwdWxzZXMqMiktKHBvcypwdWxz
ZXMqMikuZmxvb3IoKSk6CiAxLSgocG9zKnB1bHNlcyoyKS0ocG9zKnB1bHNlcyoyKS5mbG9vcigp
KQopOwp9LAogc3ByaW5nOmZ1bmN0aW9uKHBvcyl7CiByZXR1cm4gMS0oTWF0aC5jb3MocG9zKjQu
NSpNYXRoLlBJKSpNYXRoLmV4cCgtcG9zKjYpKTsKfSwKIG5vbmU6ZnVuY3Rpb24ocG9zKXsKIHJl
dHVybiAwOwp9LAogZnVsbDpmdW5jdGlvbihwb3MpewogcmV0dXJuIDE7Cn0KfSwKIERlZmF1bHRP
cHRpb25zOnsKIGR1cmF0aW9uOjEuMCwKIGZwczoxMDAsCiBzeW5jOmZhbHNlLAogZnJvbTowLjAs
CiB0bzoxLjAsCiBkZWxheTowLjAsCiBxdWV1ZToncGFyYWxsZWwnCn0sCiBQQUlSUzp7CidzbGlk
ZSc6WydTbGlkZURvd24nLCdTbGlkZVVwJ10sCidibGluZCc6WydCbGluZERvd24nLCdCbGluZFVw
J10sCidhcHBlYXInOlsnQXBwZWFyJywnRmFkZSddCn0sCiB0b2dnbGU6ZnVuY3Rpb24oZWxlbWVu
dCxlZmZlY3QpewogZWxlbWVudD0kKGVsZW1lbnQpOwogZWZmZWN0PShlZmZlY3R8fCdhcHBlYXIn
KS50b0xvd2VyQ2FzZSgpOwogdmFyIG9wdGlvbnM9T2JqZWN0LmV4dGVuZCh7CiBxdWV1ZTp7cG9z
aXRpb246J2VuZCcsc2NvcGU6KGVsZW1lbnQuaWR8fCdnbG9iYWwnKSxsaW1pdDoxfQp9LGFyZ3Vt
ZW50c1syXXx8e30pOwogRWZmZWN0W2VsZW1lbnQudmlzaWJsZSgpPwogRWZmZWN0LlBBSVJTW2Vm
ZmVjdF1bMV06RWZmZWN0LlBBSVJTW2VmZmVjdF1bMF1dKGVsZW1lbnQsb3B0aW9ucyk7Cn0KfTsK
CkVmZmVjdC5EZWZhdWx0T3B0aW9ucy50cmFuc2l0aW9uPUVmZmVjdC5UcmFuc2l0aW9ucy5zaW5v
aWRhbDsKCgoKRWZmZWN0LlNjb3BlZFF1ZXVlPUNsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLHsKIGlu
aXRpYWxpemU6ZnVuY3Rpb24oKXsKIHRoaXMuZWZmZWN0cz1bXTsKIHRoaXMuaW50ZXJ2YWw9bnVs
bDsKfSwKfSk7CgpFZmZlY3QuUXVldWVzPXsKIGluc3RhbmNlczokSCgpLAogZ2V0OmZ1bmN0aW9u
KHF1ZXVlTmFtZSl7CiBpZighT2JqZWN0LmlzU3RyaW5nKHF1ZXVlTmFtZSkpcmV0dXJuIHF1ZXVl
TmFtZTsKCiByZXR1cm4gdGhpcy5pbnN0YW5jZXMuZ2V0KHF1ZXVlTmFtZSl8fAogdGhpcy5pbnN0
YW5jZXMuc2V0KHF1ZXVlTmFtZSxuZXcgRWZmZWN0LlNjb3BlZFF1ZXVlKCkpOwp9Cn07CkVmZmVj
dC5RdWV1ZT1FZmZlY3QuUXVldWVzLmdldCgnZ2xvYmFsJyk7CgpFZmZlY3QuQmFzZT1DbGFzcy5j
cmVhdGUoewogcG9zaXRpb246bnVsbCwKfSk7CgpFZmZlY3QuRXZlbnQ9Q2xhc3MuY3JlYXRlKEVm
ZmVjdC5CYXNlLHsKIGluaXRpYWxpemU6ZnVuY3Rpb24oKXsKIHRoaXMuc3RhcnQoT2JqZWN0LmV4
dGVuZCh7ZHVyYXRpb246MH0sYXJndW1lbnRzWzBdfHx7fSkpOwp9LAogdXBkYXRlOlByb3RvdHlw
ZS5lbXB0eUZ1bmN0aW9uCn0pOwoKRWZmZWN0Lk9wYWNpdHk9Q2xhc3MuY3JlYXRlKEVmZmVjdC5C
YXNlLHsKIGluaXRpYWxpemU6ZnVuY3Rpb24oZWxlbWVudCl7CiB0aGlzLmVsZW1lbnQ9JChlbGVt
ZW50KTsKIGlmKCF0aGlzLmVsZW1lbnQpdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0
RXJyb3IpOwoKIGlmKFByb3RvdHlwZS5Ccm93c2VyLklFJiYoIXRoaXMuZWxlbWVudC5jdXJyZW50
U3R5bGUuaGFzTGF5b3V0KSkKIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7em9vbToxfSk7CiB2YXIg
b3B0aW9ucz1PYmplY3QuZXh0ZW5kKHsKIGZyb206dGhpcy5lbGVtZW50LmdldE9wYWNpdHkoKXx8
MC4wLAogdG86MS4wCn0sYXJndW1lbnRzWzFdfHx7fSk7CiB0aGlzLnN0YXJ0KG9wdGlvbnMpOwp9
LAogdXBkYXRlOmZ1bmN0aW9uKHBvc2l0aW9uKXsKIHRoaXMuZWxlbWVudC5zZXRPcGFjaXR5KHBv
c2l0aW9uKTsKfQp9KTsKCkVmZmVjdC5Nb3ZlPUNsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSx7CiBp
bml0aWFsaXplOmZ1bmN0aW9uKGVsZW1lbnQpewogdGhpcy5lbGVtZW50PSQoZWxlbWVudCk7CiBp
ZighdGhpcy5lbGVtZW50KXRocm93KEVmZmVjdC5fZWxlbWVudERvZXNOb3RFeGlzdEVycm9yKTsK
IHZhciBvcHRpb25zPU9iamVjdC5leHRlbmQoewogeDowLAogeTowLAogbW9kZToncmVsYXRpdmUn
Cn0sYXJndW1lbnRzWzFdfHx7fSk7CiB0aGlzLnN0YXJ0KG9wdGlvbnMpOwp9LAogc2V0dXA6ZnVu
Y3Rpb24oKXsKIHRoaXMuZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpOwogdGhpcy5vcmlnaW5hbExl
ZnQ9cGFyc2VGbG9hdCh0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ2xlZnQnKXx8JzAnKTsKIHRoaXMu
b3JpZ2luYWxUb3A9cGFyc2VGbG9hdCh0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ3RvcCcpfHwnMCcp
OwogaWYodGhpcy5vcHRpb25zLm1vZGU9PSdhYnNvbHV0ZScpewogdGhpcy5vcHRpb25zLng9dGhp
cy5vcHRpb25zLngtdGhpcy5vcmlnaW5hbExlZnQ7CiB0aGlzLm9wdGlvbnMueT10aGlzLm9wdGlv
bnMueS10aGlzLm9yaWdpbmFsVG9wOwp9Cn0sCiB1cGRhdGU6ZnVuY3Rpb24ocG9zaXRpb24pewog
dGhpcy5lbGVtZW50LnNldFN0eWxlKHsKIGxlZnQ6KHRoaXMub3B0aW9ucy54KnBvc2l0aW9uK3Ro
aXMub3JpZ2luYWxMZWZ0KS5yb3VuZCgpKydweCcsCiB0b3A6KHRoaXMub3B0aW9ucy55KnBvc2l0
aW9uK3RoaXMub3JpZ2luYWxUb3ApLnJvdW5kKCkrJ3B4Jwp9KTsKfQp9KTsKCkVsZW1lbnQuQ1NT
X1BST1BFUlRJRVM9JHcoCidiYWNrZ3JvdW5kQ29sb3IgYmFja2dyb3VuZFBvc2l0aW9uIGJvcmRl
ckJvdHRvbUNvbG9yIGJvcmRlckJvdHRvbVN0eWxlICcrCidib3JkZXJCb3R0b21XaWR0aCBib3Jk
ZXJMZWZ0Q29sb3IgYm9yZGVyTGVmdFN0eWxlIGJvcmRlckxlZnRXaWR0aCAnKwonYm9yZGVyUmln
aHRDb2xvciBib3JkZXJSaWdodFN0eWxlIGJvcmRlclJpZ2h0V2lkdGggYm9yZGVyU3BhY2luZyAn
KwonYm9yZGVyVG9wQ29sb3IgYm9yZGVyVG9wU3R5bGUgYm9yZGVyVG9wV2lkdGggYm90dG9tIGNs
aXAgY29sb3IgJysKJ2ZvbnRTaXplIGZvbnRXZWlnaHQgaGVpZ2h0IGxlZnQgbGV0dGVyU3BhY2lu
ZyBsaW5lSGVpZ2h0ICcrCidtYXJnaW5Cb3R0b20gbWFyZ2luTGVmdCBtYXJnaW5SaWdodCBtYXJn
aW5Ub3AgbWFya2VyT2Zmc2V0IG1heEhlaWdodCAnKwonbWF4V2lkdGggbWluSGVpZ2h0IG1pbldp
ZHRoIG9wYWNpdHkgb3V0bGluZUNvbG9yIG91dGxpbmVPZmZzZXQgJysKJ291dGxpbmVXaWR0aCBw
YWRkaW5nQm90dG9tIHBhZGRpbmdMZWZ0IHBhZGRpbmdSaWdodCBwYWRkaW5nVG9wICcrCidyaWdo
dCB0ZXh0SW5kZW50IHRvcCB3aWR0aCB3b3JkU3BhY2luZyB6SW5kZXgnKTsKCkVsZW1lbnQuQ1NT
X0xFTkdUSD0vXigoW1wrXC1dP1swLTlcLl0rKShlbXxleHxweHxpbnxjbXxtbXxwdHxwY3xcJSkp
fDAkLzsKClN0cmluZy5fX3BhcnNlU3R5bGVFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
J2RpdicpOwpTdHJpbmcucHJvdG90eXBlLnBhcnNlU3R5bGU9ZnVuY3Rpb24oKXsKIHZhciBzdHls
ZSxzdHlsZVJ1bGVzPSRIKCk7CiBpZihQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpCiBzdHlsZT1u
ZXcgRWxlbWVudCgnZGl2Jyx7c3R5bGU6dGhpc30pLnN0eWxlOwogZWxzZXsKIFN0cmluZy5fX3Bh
cnNlU3R5bGVFbGVtZW50LmlubmVySFRNTD0nPGRpdiBzdHlsZT0iJyt0aGlzKyciPjwvZGl2Pic7
CiBzdHlsZT1TdHJpbmcuX19wYXJzZVN0eWxlRWxlbWVudC5jaGlsZE5vZGVzWzBdLnN0eWxlOwp9
CgogRWxlbWVudC5DU1NfUFJPUEVSVElFUy5lYWNoKGZ1bmN0aW9uKHByb3BlcnR5KXsKIGlmKHN0
eWxlW3Byb3BlcnR5XSlzdHlsZVJ1bGVzLnNldChwcm9wZXJ0eSxzdHlsZVtwcm9wZXJ0eV0pOwp9
KTsKCiBpZihQcm90b3R5cGUuQnJvd3Nlci5JRSYmdGhpcy5pbmNsdWRlKCdvcGFjaXR5JykpCiBz
dHlsZVJ1bGVzLnNldCgnb3BhY2l0eScsdGhpcy5tYXRjaCgvb3BhY2l0eTpccyooKD86MHwxKT8o
PzpcLlxkKik/KS8pWzFdKTsKCiByZXR1cm4gc3R5bGVSdWxlczsKfTsKCmlmKGRvY3VtZW50LmRl
ZmF1bHRWaWV3JiZkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKXsKIEVsZW1l
bnQuZ2V0U3R5bGVzPWZ1bmN0aW9uKGVsZW1lbnQpewogdmFyIGNzcz1kb2N1bWVudC5kZWZhdWx0
Vmlldy5nZXRDb21wdXRlZFN0eWxlKCQoZWxlbWVudCksbnVsbCk7CiByZXR1cm4gRWxlbWVudC5D
U1NfUFJPUEVSVElFUy5pbmplY3Qoe30sZnVuY3Rpb24oc3R5bGVzLHByb3BlcnR5KXsKIHN0eWxl
c1twcm9wZXJ0eV09Y3NzW3Byb3BlcnR5XTsKIHJldHVybiBzdHlsZXM7Cn0pOwp9Owp9ZWxzZXsK
IEVsZW1lbnQuZ2V0U3R5bGVzPWZ1bmN0aW9uKGVsZW1lbnQpewogZWxlbWVudD0kKGVsZW1lbnQp
OwogdmFyIGNzcz1lbGVtZW50LmN1cnJlbnRTdHlsZSxzdHlsZXM7CiBzdHlsZXM9RWxlbWVudC5D
U1NfUFJPUEVSVElFUy5pbmplY3Qoe30sZnVuY3Rpb24oaGFzaCxwcm9wZXJ0eSl7CiBoYXNoLnNl
dChwcm9wZXJ0eSxjc3NbcHJvcGVydHldKTsKIHJldHVybiBoYXNoOwp9KTsKIGlmKCFzdHlsZXMu
b3BhY2l0eSlzdHlsZXMuc2V0KCdvcGFjaXR5JyxlbGVtZW50LmdldE9wYWNpdHkoKSk7CiByZXR1
cm4gc3R5bGVzOwp9Owp9OwoKRWZmZWN0Lk1ldGhvZHM9ewogbW9ycGg6ZnVuY3Rpb24oZWxlbWVu
dCxzdHlsZSl7CiBlbGVtZW50PSQoZWxlbWVudCk7CiBuZXcgRWZmZWN0Lk1vcnBoKGVsZW1lbnQs
T2JqZWN0LmV4dGVuZCh7c3R5bGU6c3R5bGV9LGFyZ3VtZW50c1syXXx8e30pKTsKIHJldHVybiBl
bGVtZW50Owp9LAp9OwoKJHcoJ2ZhZGUgYXBwZWFyIGdyb3cgc2hyaW5rIGZvbGQgYmxpbmRVcCBi
bGluZERvd24gc2xpZGVVcCBzbGlkZURvd24gJysKJ3B1bHNhdGUgc2hha2UgcHVmZiBzcXVpc2gg
c3dpdGNoT2ZmIGRyb3BPdXQnKS5lYWNoKAogZnVuY3Rpb24oZWZmZWN0KXsKIEVmZmVjdC5NZXRo
b2RzW2VmZmVjdF09ZnVuY3Rpb24oZWxlbWVudCxvcHRpb25zKXsKIGVsZW1lbnQ9JChlbGVtZW50
KTsKIEVmZmVjdFtlZmZlY3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZWZmZWN0LnN1YnN0cmlu
ZygxKV0oZWxlbWVudCxvcHRpb25zKTsKIHJldHVybiBlbGVtZW50Owp9Cn0KKTsKCiR3KCdnZXRJ
bmxpbmVPcGFjaXR5IGZvcmNlUmVyZW5kZXJpbmcgc2V0Q29udGVudFpvb20gY29sbGVjdFRleHRO
b2RlcyBjb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3MgZ2V0U3R5bGVzJykuZWFjaCgKIGZ1bmN0
aW9uKGYpe0VmZmVjdC5NZXRob2RzW2ZdPUVsZW1lbnRbZl07fQopOwoKRWxlbWVudC5hZGRNZXRo
b2RzKEVmZmVjdC5NZXRob2RzKTsKCgoKCgoKCgoKaWYoT2JqZWN0LmlzVW5kZWZpbmVkKEVmZmVj
dCkpCiB0aHJvdygiZHJhZ2Ryb3AuanMgcmVxdWlyZXMgaW5jbHVkaW5nIHNjcmlwdC5hY3Vsby51
cycgZWZmZWN0cy5qcyBsaWJyYXJ5Iik7Cgp2YXIgRHJvcHBhYmxlcz17CiBkcm9wczpbXSwKCiBy
ZW1vdmU6ZnVuY3Rpb24oZWxlbWVudCl7CiB0aGlzLmRyb3BzPXRoaXMuZHJvcHMucmVqZWN0KGZ1
bmN0aW9uKGQpe3JldHVybiBkLmVsZW1lbnQ9PSQoZWxlbWVudCl9KTsKfSwKCiBhZGQ6ZnVuY3Rp
b24oZWxlbWVudCl7CiBlbGVtZW50PSQoZWxlbWVudCk7CiB2YXIgb3B0aW9ucz1PYmplY3QuZXh0
ZW5kKHsKIGdyZWVkeTp0cnVlLAogaG92ZXJjbGFzczpudWxsLAogdHJlZTpmYWxzZQp9LGFyZ3Vt
ZW50c1sxXXx8e30pOwoKCiBpZihvcHRpb25zLmNvbnRhaW5tZW50KXsKIG9wdGlvbnMuX2NvbnRh
aW5lcnM9W107CiB2YXIgY29udGFpbm1lbnQ9b3B0aW9ucy5jb250YWlubWVudDsKIGlmKE9iamVj
dC5pc0FycmF5KGNvbnRhaW5tZW50KSl7CiBjb250YWlubWVudC5lYWNoKGZ1bmN0aW9uKGMpe29w
dGlvbnMuX2NvbnRhaW5lcnMucHVzaCgkKGMpKX0pOwp9ZWxzZXsKIG9wdGlvbnMuX2NvbnRhaW5l
cnMucHVzaCgkKGNvbnRhaW5tZW50KSk7Cn0KfQoKIGlmKG9wdGlvbnMuYWNjZXB0KW9wdGlvbnMu
YWNjZXB0PVtvcHRpb25zLmFjY2VwdF0uZmxhdHRlbigpOwoKIEVsZW1lbnQubWFrZVBvc2l0aW9u
ZWQoZWxlbWVudCk7CiBvcHRpb25zLmVsZW1lbnQ9ZWxlbWVudDsKCiB0aGlzLmRyb3BzLnB1c2go
b3B0aW9ucyk7Cn0sCgogZmluZERlZXBlc3RDaGlsZDpmdW5jdGlvbihkcm9wcyl7CiBkZWVwZXN0
PWRyb3BzWzBdOwoKIGZvcihpPTE7aTxkcm9wcy5sZW5ndGg7KytpKQogaWYoRWxlbWVudC5pc1Bh
cmVudChkcm9wc1tpXS5lbGVtZW50LGRlZXBlc3QuZWxlbWVudCkpCiBkZWVwZXN0PWRyb3BzW2ld
OwoKIHJldHVybiBkZWVwZXN0Owp9LAoKIGlzQ29udGFpbmVkOmZ1bmN0aW9uKGVsZW1lbnQsZHJv
cCl7CiB2YXIgY29udGFpbm1lbnROb2RlOwogaWYoZHJvcC50cmVlKXsKIGNvbnRhaW5tZW50Tm9k
ZT1lbGVtZW50LnRyZWVOb2RlOwp9ZWxzZXsKIGNvbnRhaW5tZW50Tm9kZT1lbGVtZW50LnBhcmVu
dE5vZGU7Cn0KIHJldHVybiBkcm9wLl9jb250YWluZXJzLmRldGVjdChmdW5jdGlvbihjKXtyZXR1
cm4gY29udGFpbm1lbnROb2RlPT1jfSk7Cn0sCgogZGVhY3RpdmF0ZTpmdW5jdGlvbihkcm9wKXsK
IGlmKGRyb3AuaG92ZXJjbGFzcykKIEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKGRyb3AuZWxlbWVu
dCxkcm9wLmhvdmVyY2xhc3MpOwogdGhpcy5sYXN0X2FjdGl2ZT1udWxsOwp9LAoKIGFjdGl2YXRl
OmZ1bmN0aW9uKGRyb3ApewogaWYoZHJvcC5ob3ZlcmNsYXNzKQogRWxlbWVudC5hZGRDbGFzc05h
bWUoZHJvcC5lbGVtZW50LGRyb3AuaG92ZXJjbGFzcyk7CiB0aGlzLmxhc3RfYWN0aXZlPWRyb3A7
Cn0sCgogcmVzZXQ6ZnVuY3Rpb24oKXsKIGlmKHRoaXMubGFzdF9hY3RpdmUpCiB0aGlzLmRlYWN0
aXZhdGUodGhpcy5sYXN0X2FjdGl2ZSk7Cn0KfQoKdmFyIERyYWdnYWJsZXM9ewogZHJhZ3M6W10s
CiBvYnNlcnZlcnM6W10sCgogZGVhY3RpdmF0ZTpmdW5jdGlvbigpewogdGhpcy5hY3RpdmVEcmFn
Z2FibGU9bnVsbDsKfSwKCiBhZGRPYnNlcnZlcjpmdW5jdGlvbihvYnNlcnZlcil7CiB0aGlzLm9i
c2VydmVycy5wdXNoKG9ic2VydmVyKTsKIHRoaXMuX2NhY2hlT2JzZXJ2ZXJDYWxsYmFja3MoKTsK
fSwKCiByZW1vdmVPYnNlcnZlcjpmdW5jdGlvbihlbGVtZW50KXsKIHRoaXMub2JzZXJ2ZXJzPXRo
aXMub2JzZXJ2ZXJzLnJlamVjdChmdW5jdGlvbihvKXtyZXR1cm4gby5lbGVtZW50PT1lbGVtZW50
fSk7CiB0aGlzLl9jYWNoZU9ic2VydmVyQ2FsbGJhY2tzKCk7Cn0sCgogX2NhY2hlT2JzZXJ2ZXJD
YWxsYmFja3M6ZnVuY3Rpb24oKXsKWydvblN0YXJ0Jywnb25FbmQnLCdvbkRyYWcnXS5lYWNoKGZ1
bmN0aW9uKGV2ZW50TmFtZSl7CiBEcmFnZ2FibGVzW2V2ZW50TmFtZSsnQ291bnQnXT1EcmFnZ2Fi
bGVzLm9ic2VydmVycy5zZWxlY3QoCiBmdW5jdGlvbihvKXtyZXR1cm4gb1tldmVudE5hbWVdO30K
KS5sZW5ndGg7Cn0pOwp9Cn0KCnZhciBEcmFnZ2FibGU9Q2xhc3MuY3JlYXRlKHsKIGluaXRpYWxp
emU6ZnVuY3Rpb24oZWxlbWVudCl7CiB2YXIgZGVmYXVsdHM9ewogaGFuZGxlOmZhbHNlLAogcmV2
ZXJ0ZWZmZWN0OmZ1bmN0aW9uKGVsZW1lbnQsdG9wX29mZnNldCxsZWZ0X29mZnNldCl7CiB2YXIg
ZHVyPU1hdGguc3FydChNYXRoLmFicyh0b3Bfb2Zmc2V0XjIpK01hdGguYWJzKGxlZnRfb2Zmc2V0
XjIpKSowLjAyOwogbmV3IEVmZmVjdC5Nb3ZlKGVsZW1lbnQse3g6LWxlZnRfb2Zmc2V0LHk6LXRv
cF9vZmZzZXQsZHVyYXRpb246ZHVyLAogcXVldWU6e3Njb3BlOidfZHJhZ2dhYmxlJyxwb3NpdGlv
bjonZW5kJ30KfSk7Cn0sCiBlbmRlZmZlY3Q6ZnVuY3Rpb24oZWxlbWVudCl7CiB2YXIgdG9PcGFj
aXR5PU9iamVjdC5pc051bWJlcihlbGVtZW50Ll9vcGFjaXR5KT9lbGVtZW50Ll9vcGFjaXR5OjEu
MDsKIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LHtkdXJhdGlvbjowLjIsZnJvbTowLjcsdG86
dG9PcGFjaXR5LAogcXVldWU6e3Njb3BlOidfZHJhZ2dhYmxlJyxwb3NpdGlvbjonZW5kJ30sCiBh
ZnRlckZpbmlzaDpmdW5jdGlvbigpewogRHJhZ2dhYmxlLl9kcmFnZ2luZ1tlbGVtZW50XT1mYWxz
ZQp9Cn0pOwp9LAogemluZGV4OjEwMDAsCiByZXZlcnQ6ZmFsc2UsCiBxdWlldDpmYWxzZSwKIHNj
cm9sbDpmYWxzZSwKIHNjcm9sbFNlbnNpdGl2aXR5OjIwLAogc2Nyb2xsU3BlZWQ6MTUsCiBzbmFw
OmZhbHNlLAogZGVsYXk6MAp9OwoKIGlmKCFhcmd1bWVudHNbMV18fE9iamVjdC5pc1VuZGVmaW5l
ZChhcmd1bWVudHNbMV0uZW5kZWZmZWN0KSkKIE9iamVjdC5leHRlbmQoZGVmYXVsdHMsewogc3Rh
cnRlZmZlY3Q6ZnVuY3Rpb24oZWxlbWVudCl7CiBlbGVtZW50Ll9vcGFjaXR5PUVsZW1lbnQuZ2V0
T3BhY2l0eShlbGVtZW50KTsKIERyYWdnYWJsZS5fZHJhZ2dpbmdbZWxlbWVudF09dHJ1ZTsKIG5l
dyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LHtkdXJhdGlvbjowLjIsZnJvbTplbGVtZW50Ll9vcGFj
aXR5LHRvOjAuN30pOwp9Cn0pOwoKIHZhciBvcHRpb25zPU9iamVjdC5leHRlbmQoZGVmYXVsdHMs
YXJndW1lbnRzWzFdfHx7fSk7CgogdGhpcy5lbGVtZW50PSQoZWxlbWVudCk7CgogaWYob3B0aW9u
cy5oYW5kbGUmJk9iamVjdC5pc1N0cmluZyhvcHRpb25zLmhhbmRsZSkpCiB0aGlzLmhhbmRsZT10
aGlzLmVsZW1lbnQuZG93bignLicrb3B0aW9ucy5oYW5kbGUsMCk7CgogaWYoIXRoaXMuaGFuZGxl
KXRoaXMuaGFuZGxlPSQob3B0aW9ucy5oYW5kbGUpOwogaWYoIXRoaXMuaGFuZGxlKXRoaXMuaGFu
ZGxlPXRoaXMuZWxlbWVudDsKCiBpZihvcHRpb25zLnNjcm9sbCYmIW9wdGlvbnMuc2Nyb2xsLnNj
cm9sbFRvJiYhb3B0aW9ucy5zY3JvbGwub3V0ZXJIVE1MKXsKIG9wdGlvbnMuc2Nyb2xsPSQob3B0
aW9ucy5zY3JvbGwpOwogdGhpcy5faXNTY3JvbGxDaGlsZD1FbGVtZW50LmNoaWxkT2YodGhpcy5l
bGVtZW50LG9wdGlvbnMuc2Nyb2xsKTsKfQoKIEVsZW1lbnQubWFrZVBvc2l0aW9uZWQodGhpcy5l
bGVtZW50KTsKCiB0aGlzLm9wdGlvbnM9b3B0aW9uczsKIHRoaXMuZHJhZ2dpbmc9ZmFsc2U7Cgog
dGhpcy5ldmVudE1vdXNlRG93bj10aGlzLmluaXREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhp
cyk7CiBFdmVudC5vYnNlcnZlKHRoaXMuaGFuZGxlLCJtb3VzZWRvd24iLHRoaXMuZXZlbnRNb3Vz
ZURvd24pOwoKIERyYWdnYWJsZXMucmVnaXN0ZXIodGhpcyk7Cn0sCgogZGVzdHJveTpmdW5jdGlv
bigpewogRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLmhhbmRsZSwibW91c2Vkb3duIix0aGlzLmV2
ZW50TW91c2VEb3duKTsKIERyYWdnYWJsZXMudW5yZWdpc3Rlcih0aGlzKTsKfSwKfSk7CgpEcmFn
Z2FibGUuX2RyYWdnaW5nPXt9OwoKdmFyIENvbnRyb2wgPSB7IH07CgooZnVuY3Rpb24oKXsKIHdp
bmRvdy56ZW49ewoKIGFwaTpmdW5jdGlvbihwYXRoLG9iaix2ZXJiYXRpbSl7CiB2YXIgd3JhcHBl
cnM9emVuLmFwaS5fd3JhcHBlcnM9emVuLmFwaS5fd3JhcHBlcnN8fHt9Owogb2JqPW9ianx8e307
CgogaWYoIXdyYXBwZXJzW3BhdGhdKXsKIHZhciB3cmFwcGVyPW9iajsKIGlmKHR5cGVvZihvYmop
IT0nZnVuY3Rpb24nfHxvYmouc3ViY2xhc3Nlcyl7CgoKIHdyYXBwZXI9ZnVuY3Rpb24oKXsKIHZh
ciBwYXJ0cz1wYXRoLnNwbGl0KCcuJyk7CiB2YXIgYXBpPXBhcnRzLnBvcCgpOwogdmFyIGxvYz16
ZW4ucmVzb2x2ZShwYXJ0cyk7CiBpZighbG9jKXJldHVybiBjb25zb2xlLmVycm9yVHJhY2UoJ3pl
bi5hcGk6IENhblwndCBjcmVhdGUgIicrcGF0aCsnIicpCiBsb2NbYXBpXT1vYmo7Cn0KfQogd3Jh
cHBlcnNbcGF0aF09d3JhcHBlcjsKfWVsc2V7CiByZXR1cm4gY29uc29sZS5lcnJvclRyYWNlKCd6
ZW4uYXBpKCk6ICInK3BhdGgrJyIgYWxyZWFkeSBkZWZpbmVkJyk7Cn0KfSwKCgogcmVxdWlyZTpm
dW5jdGlvbigpewogdmFyIHN0YWNrPXplbi5hcGkuX3N0YWNrPXplbi5hcGkuX3N0YWNrfHxbXTsK
ICRBKGFyZ3VtZW50cykuZWFjaChmdW5jdGlvbihhcGkpewogc3RhY2sucHVzaChhcGkpOwogdHJ5
ewoKIHZhciBmPXplbi5hcGkuX3dyYXBwZXJzJiZ6ZW4uYXBpLl93cmFwcGVyc1thcGldOwogaWYo
IWYpdGhyb3cgbmV3IEVycm9yKCciJythcGkrJyIgaXMgbm90IGEgZGVmaW5lZCBBUEknKTsKIHpl
bi5hcGkuX3dyYXBwZXJzW2FwaV09UHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CiBmKCk7Cn1jYXRj
aChlKXsKIHplbi5sb2dFeGNlcHRpb24oZSwnemVuLnJlcXVpcmUoKSBleGNlcHRpb24uIHN0YWNr
ID0gJytzdGFjay5qb2luKCcgPiAnKSk7Cn0KIHplbi5hcGkuX3dyYXBwZXJzW2FwaV09UHJvdG90
eXBlLmVtcHR5RnVuY3Rpb247CiBzdGFjay5wb3AoKTsKfSk7Cn0sCgoKIHJlc29sdmU6ZnVuY3Rp
b24ocGF0aCxwYXJlbnQpewogcGFyZW50PXBhcmVudHx8d2luZG93OwogaWYocGF0aC5zcGxpdClw
YXRoPXBhdGguc3BsaXQoJy4nKTsKIGZvcih2YXIgaT0wO2k8cGF0aC5sZW5ndGg7aSsrKXsKIGlm
KCFwYXJlbnQpdGhyb3cgbmV3IEVycm9yKCd6ZW4ucmVzb2x2ZSgpOiAiJytwYXRoW2ktMV0rJyIg
aW4gJysKIHBhdGguam9pbignLicpKycgaXMgbm90IGRlZmluZWQnKTsKIHBhcmVudD1wYXJlbnRb
cGF0aFtpXV07Cn0KIHJldHVybiBwYXJlbnQ7Cn0sCgoKIHByb3h5OmZ1bmN0aW9uKHJlbW90ZU5h
bWUsbG9jYWxOYW1lKXsKIGxvY2FsTmFtZT1sb2NhbE5hbWV8fHJlbW90ZU5hbWU7CiBpZighd2lu
ZG93W2xvY2FsTmFtZV0pewogdmFyIG9iaj10aGlzLmxvY2F0ZShyZW1vdGVOYW1lKTsKIGlmKG9i
ail7CiBpZihvYmouX25vcHJveHkpewogY29uc29sZS5lcnJvcignemVuLnByb3h5OiAnK3JlbW90
ZU5hbWUrJyBzaG91bGQgbm90IGJlIHByb3hpZWQuJyk7Cn0KIHdpbmRvd1tsb2NhbE5hbWVdPW9i
ajsKfWVsc2V7CiBjb25zb2xlLmVycm9yKCd6ZW4ucHJveHk6IFVuYWJsZSB0byB6ZW4ubG9jYXRl
ICInK3JlbW90ZU5hbWUrJyInKTsKfQp9Cn0sCgoKIGxvY2F0ZTpmdW5jdGlvbihuYW1lLHcpewog
dz13fHxwYXJlbnQ7CiB0cnl7CiB3aGlsZSh3KXsKIGlmKHdbbmFtZV0pcmV0dXJuIHdbbmFtZV07
CiB3PSh3LnBhcmVudCE9PXcpP3cucGFyZW50Oncub3BlbmVyOwp9Cn1jYXRjaChlKXsKCgp9CiBy
ZXR1cm4gbnVsbDsKfSwKCgogZGVwcmVjYXRlOmZ1bmN0aW9uKGEsYil7CiB2YXIgYz1hcmd1bWVu
dHMuY2FsbGVlOwogaWYoY1tiXSlyZXR1cm47CiBjW2JdPXRydWU7CgogaWYoYS5pbmRleE9mKCch
Jyk9PTApewogY29uc29sZS5lcnJvcignRGVwcmVjYXRpb246ICcrYS5zdWJzdHIoMSkrKGI/JyAt
LT4gJytiOicnKSk7Cn1lbHNlewogY29uc29sZS53YXJuKCdEZXByZWNhdGlvbjogJythKyhiPycg
LS0+ICcrYjonJykpOwp9Cn0sCgoKIGxvZ0V4Y2VwdGlvbjpmdW5jdGlvbihlLG1zZyl7CiB2YXIg
bXNnPW1zZz9tc2crJyAoJytlKycpJzplOwogY29uc29sZS5ncm91cCgpOwogY29uc29sZS5lcnJv
cignWycremVuLmdldFdpbmRvd05hbWUoKSsnXSAnK21zZyk7CiBjb25zb2xlLmRpcihlKTsKIGNv
bnNvbGUuZ3JvdXBFbmQoKTsKIHJldHVybiBlOwp9LAoKCiBnZXRXaW5kb3dOYW1lOmZ1bmN0aW9u
KCl7CiByZXR1cm4gd2luZG93Lm5hbWV8fCh3aW5kb3c9PXRvcD8ndG9wJzonbm8gbmFtZScpOwp9
LAoKCiBiaW5kOmZ1bmN0aW9uKCl7CiB2YXIgYT0kQShhcmd1bWVudHMpLG89YS5zaGlmdCgpLGs7
CiB3aGlsZShrPWEuc2hpZnQoKSl7CiB2YXIgYXNFdmVudD1rLmluZGV4T2YoJyMnKT09MDsKIGs9
YXNFdmVudD9rLnN1YnN0cigxKTprOwogaWYoIW9ba10pdGhyb3cgbmV3IEVycm9yKCdiaW5kOiAi
JytrKyciIGlzIG5vdCBkZWZpbmVkJyk7CiBvW2tdPWFzRXZlbnQ/b1trXS5iaW5kQXNFdmVudExp
c3RlbmVyKG8pOm9ba10uYmluZChvKTsKfQp9LAp9OwoKCiBFdmVudC5vYnNlcnZlKHdpbmRvdywn
bG9hZCcsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHplbi5fc3Vid2luTm90aWZ5LDApfSk7CgoKIHpl
bi5jb29raWU9ewoKIGdldDpmdW5jdGlvbihuYW1lKXsKIHZhciBuYW1lRVE9bmFtZSsiPSI7CiB2
YXIgY2E9ZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiBmb3IodmFyIGk9MDtpPGNhLmxlbmd0
aDtpKyspewogdmFyIGM9Y2FbaV07CiB3aGlsZShjLmNoYXJBdCgwKT09JyAnKWM9Yy5zdWJzdHJp
bmcoMSxjLmxlbmd0aCk7CiBpZihjLmluZGV4T2YobmFtZUVRKT09MClyZXR1cm4gYy5zdWJzdHJp
bmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7Cn0KIHJldHVybiBudWxsOwp9LAoKIHNldDpmdW5j
dGlvbihuYW1lLHZhbHVlLGtlZXApewogdmFyIGV4cGlyZXM9a2VlcD9uZXcgRGF0ZSgpOm51bGw7
CiBpZihleHBpcmVzKWV4cGlyZXMuc2V0WWVhcihleHBpcmVzLmdldEZ1bGxZZWFyKCkrNSk7CiBk
b2N1bWVudC5jb29raWU9bmFtZSsiPSIrdmFsdWUrIjsgcGF0aD0vIisKKCFleHBpcmVzPycnOiI7
IGV4cGlyZXM9IitleHBpcmVzLnRvR01UU3RyaW5nKCkpOwp9Cn07CgoKIE9iamVjdC5leHRlbmQo
d2luZG93LHsKCiAkdW5pcXVlOmZ1bmN0aW9uKHBhdHRlcm4pewogdmFyIGM9YXJndW1lbnRzLmNh
bGxlZTsKIGMuX2k9KGMuX2l8fDApKzE7CiByZXR1cm4gcGF0dGVybj9wYXR0ZXJuLnJlcGxhY2Uo
LyMvZyxjLl9pKTpjLl9pOwp9LAoKCiAkdG9fYTpmdW5jdGlvbihvYmopewogcmV0dXJuIE9iamVj
dC5pc0FycmF5KG9iaik/b2JqOltvYmpdOwp9LAoKCiAkcHg6ZnVuY3Rpb24obyl7CiByZXR1cm4g
cGFyc2VJbnQobykrJ3B4JzsKfSwKCgoKICRjaWQ6ZnVuY3Rpb24oZWxlbWVudElkKXsKIHZhciBt
YXRjaD1lbGVtZW50SWQubWF0Y2goLyhjXGQqKS8pOwogcmV0dXJuIG1hdGNoP21hdGNoWzBdOmZh
bHNlOwp9Cgp9KTsKCgoKCgoKCgogdmFyIG1ha2VXcmFwcGVyPWZ1bmN0aW9uKHMpewogdmFyIGY9
Y29uc29sZVtzXTsKIGNvbnNvbGVbc109ZnVuY3Rpb24oKXsKIHZhciBhPWFyZ3VtZW50czsKIGFb
MF09dHlwZW9mKGFbMF0pPT0nc3RyaW5nJz8nWycremVuLmdldFdpbmRvd05hbWUoKSsnXSAnK2Fb
MF06YVswXTsKIGYuYXBwbHkoY29uc29sZSxhcmd1bWVudHMpOwp9OwogY29uc29sZVtzKydUcmFj
ZSddPWZ1bmN0aW9uKCl7CiBjb25zb2xlLmdyb3VwKCk7CiB2YXIgYT1hcmd1bWVudHM7CiBhWzBd
PXR5cGVvZihhWzBdKT09J3N0cmluZyc/J1snK3plbi5nZXRXaW5kb3dOYW1lKCkrJ10gJythWzBd
OmFbMF07CiBmLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKTsKIGNvbnNvbGUudHJhY2UoKTsKIGNv
bnNvbGUuZ3JvdXBFbmQoKTsKfQp9OwpbJ2RlYnVnJywnZXJyb3InLCdpbmZvJywnbG9nJywnd2Fy
biddLmVhY2goZnVuY3Rpb24obyl7CiBtYWtlV3JhcHBlcihvKTsKfSk7CgoKIGlmKCFQcm90b3R5
cGUuQnJvd3Nlci5JRSl7CiBpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dW5kZWZpbmVkKXsK
IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywKIGZ1bmN0aW9uKGUpe2RvY3VtZW50
LmFjdGl2ZUVsZW1lbnQ9ZS50YXJnZXQ7fSx0cnVlKTsKIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVu
ZXIoJ2JsdXInLAogZnVuY3Rpb24oZSl7ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD1udWxsO30sdHJ1
ZSk7Cn07Cn07CgoKCgogRXZlbnQub2JzZXJ2ZShkb2N1bWVudCwnY2xpY2snLGZ1bmN0aW9uKGUp
ewogdmFyIGVsPUV2ZW50LmVsZW1lbnQoZT1lfHxldmVudCk7CiB3aGlsZShlbCl7CiBpZihlbC5u
b2RlTmFtZT09J0EnKXsKCgoKIHZhciBocmVmPShlbC5ocmVmKycnKS5yZXBsYWNlKC8jJC8sJycp
OwogdmFyIGxvYz0od2luZG93LmxvY2F0aW9uLmhyZWYrJycpLnJlcGxhY2UoLyMkLywnJyk7CiBp
ZihocmVmPT09Jyd8fGhyZWY9PWxvYylFdmVudC5zdG9wKGUpOwp9CiBlbD1lbC5wYXJlbnROb2Rl
Owp9Cn0pOwoKIEFqYXguUmVzcG9uZGVycy5yZWdpc3Rlcih7Cgogb25DcmVhdGU6ZnVuY3Rpb24o
cmVxdWVzdCx4bWxIdHRwKXsKIHZhciBpbmRpY2F0b3I9cmVxdWVzdC5vcHRpb25zLmluZGljYXRv
cjsKIGlmKCFpbmRpY2F0b3IpcmV0dXJuOwogaWYodHlwZW9mKGluZGljYXRvcik9PSdmdW5jdGlv
bicpcmV0dXJuIGluZGljYXRvcih0cnVlKTsKCiB0cnl7CiBpbmRpY2F0b3I9JChpbmRpY2F0b3Ip
OwogY29uc29sZS5hc3NlcnQoaW5kaWNhdG9yJiZpbmRpY2F0b3Iubm9kZU5hbWUsJ2luZGljYXRv
ciBtdXN0IGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGFuIGVsZW1lbnQuJyk7CiBpZihpbmRpY2F0
b3IpewogdmFyIHQ9cmVxdWVzdC5vcHRpb25zLmluZGljYXRvclRleHQ7CiBpZih0KWluZGljYXRv
ci51cGRhdGUodCk7CgoKCihpbmRpY2F0b3IudXAoJy53YWl0X2luZGljYXRvcl9jb250YWluZXIn
KXx8aW5kaWNhdG9yKS5zaG93KCk7Cn0KfWNhdGNoKGUpewogemVuLmxvZ0V4Y2VwdGlvbihlKTsK
fQp9LAoKCiBvbkNvbXBsZXRlOmZ1bmN0aW9uKHJlcXVlc3QseG1sSHR0cCl7CiB2YXIgaW5kaWNh
dG9yPXJlcXVlc3Qub3B0aW9ucy5pbmRpY2F0b3I7CiBpZighaW5kaWNhdG9yKXJldHVybjsKIGlm
KHR5cGVvZihpbmRpY2F0b3IpPT0nZnVuY3Rpb24nKXJldHVybiBpbmRpY2F0b3IoZmFsc2UpOwoK
IHRyeXsKIGluZGljYXRvcj0kKGluZGljYXRvcik7CiBpZighaW5kaWNhdG9yfHwhaW5kaWNhdG9y
Lm5vZGVOYW1lKXsKIGNvbnNvbGUuZXJyb3JUcmFjZSgnaW5kaWNhdG9yIGZvciAnK3JlcXVlc3Qu
dXJsKycgbXVzdCBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBlbGVtZW50LicpOwp9CihpbmRp
Y2F0b3IudXAoJy53YWl0X2luZGljYXRvcl9jb250YWluZXInKXx8aW5kaWNhdG9yKS5oaWRlKCk7
Cn1jYXRjaChlKXsKIHplbi5sb2dFeGNlcHRpb24oZSk7Cn0KfSwKCgogb25FeGNlcHRpb246ZnVu
Y3Rpb24ocmVxdWVzdCxlKXsKIHplbi5sb2dFeGNlcHRpb24oZSwnRXhjZXB0aW9uIGR1cmluZyAn
K3JlcXVlc3QubWV0aG9kKycgdG8gJworcmVxdWVzdC51cmwrJz8nCit1bmVzY2FwZShPYmplY3Qu
dG9RdWVyeVN0cmluZyhyZXF1ZXN0Lm9wdGlvbnMucGFyYW1ldGVycykpKTsKfQp9KTsKCgpbCntr
ZXk6J2JpbmQnfSwKe2tleTonZXNjYXBlSFRNTCd9LAp7a2V5Oidpc0FjY2Vzc2libGUnfSwKe2tl
eTonbG9jYXRlJ30sCntrZXk6J2xvZ0V4Y2VwdGlvbid9LAp7a2V5OidvcGVuX2Rvd25sb2FkJyx2
YWx1ZTonb3BlbkRvd25sb2FkJ30sCntrZXk6J3ByZWxvYWQnfSwKe2tleToncHJveHknfSwKe2tl
eToncmVhZENvb2tpZScsdmFsdWU6J2Nvb2tpZS5nZXQnfSwKe2tleTondGl0bGUnLHZhbHVlOidz
ZXRUaXRsZSd9LAp7a2V5Oid3aW5kb3dfbmFtZScsdmFsdWU6J2dldFdpbmRvd05hbWUnfSwKe2tl
eTond3JpdGVDb29raWUnLHZhbHVlOidjb29raWUuc2V0J30KXS5lYWNoKGZ1bmN0aW9uKHBhaXIp
ewogcGFpci52YWx1ZT1wYWlyLnZhbHVlfHxwYWlyLmtleTsKIHZhciB0bXBsPSJ6ZW4uZGVwcmVj
YXRlKCckI3trZXl9KCknLCAnemVuLiN7dmFsdWV9KCknKTsgcmV0dXJuIHplbi4je3ZhbHVlfS5h
cHBseSh6ZW4sIGFyZ3VtZW50cyk7Igogd2luZG93WyckJytwYWlyLmtleV09bmV3IEZ1bmN0aW9u
KHRtcGwuaW50ZXJwb2xhdGUocGFpcikpOwp9KTsKCiB3aW5kb3cuUmVhZHlTdGF0ZT17CiBvYnNl
cnZlOmZ1bmN0aW9uKCl7CiB6ZW4uZGVwcmVjYXRlKCdSZWFkeVN0YXRlLm9ic2VydmUnLCd6ZW4u
b2JzZXJ2ZVN1YndpbmRvd0xvYWQnKTsKIHJldHVybiB6ZW4ub2JzZXJ2ZVN1YndpbmRvd0xvYWQu
YXBwbHkoemVuLGFyZ3VtZW50cyk7Cn0KfQoKfSkoKTsKCmZ1bmN0aW9uIGlzSUU2T3JMZXNzKCl7
CiB2YXIgcnY9ZmFsc2U7CiBpZihuYXZpZ2F0b3IuYXBwTmFtZT09J01pY3Jvc29mdCBJbnRlcm5l
dCBFeHBsb3JlcicpewogdmFyIHVhPW5hdmlnYXRvci51c2VyQWdlbnQ7CiB2YXIgcmU9bmV3IFJl
Z0V4cCgiTVNJRSAoWzAtOV17MSx9W1wuMC05XXswLH0pIik7CiBpZihyZS5leGVjKHVhKSE9bnVs
bClydj1wYXJzZUZsb2F0KFJlZ0V4cC4kMSk7Cn0KIHJldHVybihydiYmcnY8Nyk7Cn0KCnplbi5h
cGkoJ3hOYXRpdmUnLGZ1bmN0aW9uKCl7CgogT2JqZWN0LmV4dGVuZChPYmplY3QsewoKIGVhY2g6
ZnVuY3Rpb24obyxmKXsKIHZhciBwYWlycz1bXTsKIGZvcih2YXIgayBpbiBvKXBhaXJzLnB1c2go
e2tleTprLHZhbHVlOm9ba119KTsKIGZvcih2YXIgaT0wO2k8cGFpcnMubGVuZ3RoO2krKylmKHBh
aXJzW2ldKTsKfSwKCgogZWFjaEtleTpmdW5jdGlvbihvLGYpewogaWYobylPYmplY3Qua2V5cyhv
KS5lYWNoKGYpOwp9LAoKCiBlYWNoVmFsdWU6ZnVuY3Rpb24obyxmKXsKIGlmKG8pT2JqZWN0LnZh
bHVlcyhvKS5lYWNoKGYpOwp9LAoKCiBpc0VtcHR5OmZ1bmN0aW9uKG8pewogZm9yKHZhciBrIGlu
IG8pcmV0dXJuIGZhbHNlOwogcmV0dXJuIHRydWU7Cn0sCgoKIGV4dGVuZE9wdGlvbnM6ZnVuY3Rp
b24oZHN0LHNyYyl7CiBkc3Q9ZHN0fHx7fTsKIGZvcih2YXIga2V5IGluIHNyYyl7CiBpZigvXm9u
W0EtWl0vLnRlc3Qoa2V5KSYmZHN0W2tleV0pewoKIGRzdFtrZXldPWRzdFtrZXldLmJlZm9yZShz
cmNba2V5XSk7Cn1lbHNlIGlmKGtleT09J3BhcmFtZXRlcnMnKXsKCiBpZihkc3Rba2V5XXx8c3Jj
W2tleV0pewogZHN0W2tleV09T2JqZWN0LmV4dGVuZChkc3Rba2V5XXx8e30sc3JjW2tleV18fHt9
KTsKfQp9ZWxzZXsKCiBkc3Rba2V5XT1zcmNba2V5XTsKfQp9CiByZXR1cm4gZHN0Owp9LAoKCiBp
c0VxdWFsQ29udGVudHM6ZnVuY3Rpb24oYSxiKXsKIHZhciBrMD1PYmplY3Qua2V5cyhhKSxrMT1P
YmplY3Qua2V5cyhiKTsKIGlmKGswLmxlbmd0aCE9azEubGVuZ3RoKXJldHVybiBmYWxzZTsKIGZv
cih2YXIgayBpbiBhKWlmKCFPYmplY3QuaXNFcXVhbChhW2tdLGJba10pKXJldHVybiBmYWxzZTsK
IHJldHVybiB0cnVlOwp9LAoKCiBpc0VxdWFsOmZ1bmN0aW9uKGEsYil7CgogaWYoYT09PWIpcmV0
dXJuIHRydWU7CgoKIHZhciBhdD10eXBlb2YoYSksYnQ9dHlwZW9mKGIpOwogaWYoYXQhPWJ0KXJl
dHVybiBmYWxzZTsKCgogaWYoYT09YilyZXR1cm4gdHJ1ZTsKCgogaWYoIWF8fCFiKXJldHVybiBm
YWxzZTsKCgogaWYoYS5pc0VxdWFsJiZhLmlzRXF1YWwoYikpcmV0dXJuIHRydWU7CgoKIHJldHVy
biBhdD09PSdvYmplY3QnJiZPYmplY3QuaXNFcXVhbENvbnRlbnRzKGEsYik7Cn0sCgoKIGNsb25l
RGVlcDpmdW5jdGlvbihvYmosc2NvcGUpewogY29uc29sZS5hc3NlcnQoc2NvcGUsJ2Nsb25lRGVl
cDogc2NvcGUgbXVzdCBiZSBkZWZpbmVkJyk7CgogdmFyIHJ2PW9iajsKIGlmKG9iail7CiBpZihv
YmouY29uc3RydWN0b3I9PXNjb3BlLk9iamVjdCl7CgogcnY9e307CiBmb3IodmFyIGsgaW4gb2Jq
KXsKIHJ2W2tdPU9iamVjdC5jbG9uZURlZXAob2JqW2tdLHNjb3BlKTsKfQp9ZWxzZSBpZihPYmpl
Y3QuaXNBcnJheShvYmopKXsKCiBydj1bXTsKIGZvcih2YXIgaT0wO2k8b2JqLmxlbmd0aDtpKysp
ewogcnZbaV09T2JqZWN0LmNsb25lRGVlcChvYmpbaV0sc2NvcGUpOwp9Cn0KfQoKIHJldHVybiBy
djsKfSwKCiByZWRpcmVjdDpmdW5jdGlvbihmcm9tLGZyb21NZXRob2QsdG8sdG9NZXRob2Qpewog
ZnJvbVtmcm9tTWV0aG9kXT1mdW5jdGlvbigpewogcmV0dXJuIHRvW3RvTWV0aG9kfHxmcm9tTWV0
aG9kXS5hcHBseSh0byxhcmd1bWVudHMpOwp9Owp9Cn0pCgoKCiBPYmplY3QuZXh0ZW5kKEFycmF5
LnByb3RvdHlwZSx7CgogaXNFcXVhbDpmdW5jdGlvbihhKXsKIGlmKHRoaXMubGVuZ3RoIT1hLmxl
bmd0aClyZXR1cm4gZmFsc2U7CiBmb3IodmFyIGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSl7CiBp
ZighT2JqZWN0LmlzRXF1YWwodGhpc1tpXSxhW2ldKSlyZXR1cm4gZmFsc2U7Cn0KIHJldHVybiB0
cnVlOwp9LAoKCiB0aGluOmZ1bmN0aW9uKCl7CiB2YXIgbD10aGlzLmxlbmd0aDsKIGZvcih2YXIg
aT0wLGo9MDtpPGw7aSsrKWlmKHRoaXNbaV0pdGhpc1tqKytdPXRoaXNbaV07CiB3aGlsZShsPj1q
KWRlbGV0ZSB0aGlzW2wtLV07CiB0aGlzLmxlbmd0aD1qOwogcmV0dXJuIHRoaXM7Cn0sCgoKIHRy
aW06ZnVuY3Rpb24oKXsKIGZvcih2YXIgaT10aGlzLmxlbmd0aDtpPj0wJiYhdGhpc1tpXTtpLS0p
OwogdGhpcy5sZW5ndGg9aSsxOwogcmV0dXJuIHRoaXM7Cn0sCgoKIGZpcnN0RW1wdHk6ZnVuY3Rp
b24oKXsKIGZvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKWlmKCF0aGlzW2ldKWJyZWFrOwog
cmV0dXJuIGk7Cn0sCgoKIG1vdmU6ZnVuY3Rpb24oeCx5KXsKIHZhciBsPXRoaXMubGVuZ3RoOwog
aWYoeD49MCYmeDxsJiZ5Pj0wJiZ5PGwpewogaWYoeCE9eSl7CiB2YXIgbz10aGlzW3hdLGRpPXg8
eT8xOi0xOwogZm9yKHZhciBpPXg7aSE9eTspdGhpc1tpXT10aGlzW2k9aStkaV07CiB0aGlzW3ld
PW87Cn0KfWVsc2V7CiB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXJyYXkjbW92ZSgnK3grJywgJyt5
KycpOiBpbmRleCBvdXQgb2YgYm91bmRzJyk7Cn0KIHJldHVybiB0aGlzOwp9LAoKCiBpbnNlcnQ6
ZnVuY3Rpb24obyx4KXsKIHRoaXNbdGhpcy5sZW5ndGhdPW87CiByZXR1cm4gdGhpcy5tb3ZlKHRo
aXMubGVuZ3RoLTEseHx8MCk7Cn0sCgoKIHJlbW92ZUluZGV4OmZ1bmN0aW9uKHgpewogdGhpcy5t
b3ZlKHgsdGhpcy5sZW5ndGgtMSk7CiByZXR1cm4gdGhpcy5wb3AoKTsKfSwKCgogcmVtb3ZlOmZ1
bmN0aW9uKG8pewogdmFyIGw9dGhpcy5sZW5ndGg7CiBmb3IodmFyIGk9MCxqPTA7aTxsO2krKyl7
CiBpZih0aGlzW2ldPT1vKWNvbnRpbnVlOwogdGhpc1tqXT10aGlzW2ldOwogaisrOwp9CiB3aGls
ZShpPmopZGVsZXRlIHRoaXNbaS0tXTsKIHRoaXMubGVuZ3RoPWo7CiByZXR1cm4gdGhpcy5sZW5n
dGg9PWw/bnVsbDpvOwp9LAoKCiBydW5NdXRhdGU6ZnVuY3Rpb24oZHN0LGNhbGxiYWNrcyl7CiB2
YXIgc3JjPVtdLmNvbmNhdCh0aGlzKTsKCgogdGhpcy5zdWJ0cmFjdChkc3QpLmVhY2goZnVuY3Rp
b24obyxpKXsKIHZhciBpPXNyYy5pbmRleE9mKG8pOwogdHJ5ewogY2FsbGJhY2tzLnJlbW92ZShp
KTsKfWNhdGNoKGUpewogemVuLmxvZ0V4Y2VwdGlvbihlKTsKfQogc3JjLnJlbW92ZUluZGV4KGkp
Owp9KTsKCgogZHN0LnN1YnRyYWN0KHNyYykuZWFjaChmdW5jdGlvbihvKXsKIHZhciBpPWRzdC5p
bmRleE9mKG8pOwogdmFyIHNpPU1hdGgubWluKHNyYy5sZW5ndGgsaSk7CiB0cnl7CiBjYWxsYmFj
a3MuaW5zZXJ0KGksc2kpOwp9Y2F0Y2goZSl7CiB6ZW4ubG9nRXhjZXB0aW9uKGUpOwp9CiBzcmMu
aW5zZXJ0KG8sc2kpOwp9KTsKCgogZm9yKHZhciBpPTA7aTxkc3QubGVuZ3RoO2krKyl7CiBpZihk
c3RbaV0hPXNyY1tpXSl7CiB2YXIgc2k9c3JjLmluZGV4T2YoZHN0W2ldKTsKIHRyeXsKIGNhbGxi
YWNrcy5tb3ZlKHNpLGkpOwp9Y2F0Y2goZSl7CiB6ZW4ubG9nRXhjZXB0aW9uKGUpOwp9CiBzcmMu
bW92ZShzaSxpKTsKIGktLTsKfQp9Cn0sCgoKIHN1YnRyYWN0OmZ1bmN0aW9uKGFycil7CiB2YXIg
YT1bXTsKIGZvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXsKIGlmKGFyci5pbmRleE9mKHRo
aXNbaV0pPDApYS5wdXNoKHRoaXNbaV0pOwp9CiByZXR1cm4gYTsKfSwKCgoKIHRocmVhZGVkSXRl
cmF0b3I6ZnVuY3Rpb24oaXRlcmF0b3IsbGltaXQsY2FsbGJhY2spewogdmFyIGxlbmd0aD10aGlz
Lmxlbmd0aDsKIGlmKGxlbmd0aD49bGltaXQpewogdmFyIHJxPXRoaXMuY2xvbmUoKTsKIGl0ZXJh
dG9yLndyYXAoZnVuY3Rpb24oZnVuYyl7CiB2YXIgaT1ycS5wb3AoKTsKIGZ1bmMoaSk7CiBpZihy
cS5sZW5ndGg+MCl7CiByZXR1cm4gdHJ1ZTsKfWVsc2V7CiBpZihjYWxsYmFjayYmdHlwZW9mKGNh
bGxiYWNrKT09J2Z1bmN0aW9uJyljYWxsYmFjaygpOwogcmV0dXJuIGZhbHNlOwp9Owp9KS5ydW4o
KTsKfWVsc2V7CiBmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspewogaXRlcmF0b3IodGhpc1tpXSk7
Cn07CiBpZihjYWxsYmFjayYmdHlwZW9mKGNhbGxiYWNrKT09J2Z1bmN0aW9uJyljYWxsYmFjaygp
Owp9Cgp9Cgp9KTsKCiBPYmplY3QuZXh0ZW5kKEFycmF5LHsKCiBjcmVhdGVDb21wYXJhdG9yOmZ1
bmN0aW9uKHRtcGwscil7CiB2YXIgc3JjPSdhID0gJyt0bXBsLnJlcGxhY2UoLyNce29iamVjdFx9
L2csJ2EnKSsKJzsgYiA9ICcrdG1wbC5yZXBsYWNlKC8jXHtvYmplY3RcfS9nLCdiJykrCic7IHJl
dHVybiBhIDwgYiA/IC0xIDogKGIgPCBhID8gMSA6IDApOyc7CiByZXR1cm4gbmV3IEZ1bmN0aW9u
KHI/J2InOidhJyxyPydhJzonYicsc3JjKTsKfSwKCgogc29ydGVkSW5kZXg6ZnVuY3Rpb24oYXJy
LGYsdGFyZ2V0KXsKIHZhciBsb3c9MDsKIHZhciBoaWdoPWFyci5sZW5ndGg7CiB3aGlsZShsb3c8
aGlnaCl7CiB2YXIgbWlkPShsb3craGlnaCk+PjE7CiBpZihmKGFyclttaWRdLHRhcmdldCk8MCl7
CiBsb3c9bWlkKzE7Cn1lbHNlewogaGlnaD1taWQ7Cn0KfQogcmV0dXJuIGxvdzsKfSwKCgogc29y
dGVkSW5kZXhPZjpmdW5jdGlvbihhcnIsZix0YXJnZXQpewogdmFyIGk9QXJyYXkuc29ydGVkSW5k
ZXgoYXJyLGYsdGFyZ2V0KTsKIGRvewogaWYoYXJyW2ldPT09dGFyZ2V0KXJldHVybiBpOwogaSsr
Owp9d2hpbGUoaTxhcnIubGVuZ3RoJiZmKGFycltpXSx0YXJnZXQpPT0wKTsKCiByZXR1cm4tMTsK
fQp9KTsKCiBPYmplY3QuZXh0ZW5kKFN0cmluZyx7CgogY29tcGFyZUNhc2VsZXNzOmZ1bmN0aW9u
KGEsYil7CiBhPWEudG9Mb3dlckNhc2UoKTsKIGI9Yi50b0xvd2VyQ2FzZSgpOwogcmV0dXJuIGE8
Yj8tMTooYT5iPzE6MCk7Cn0KfSk7CgogdmFyIE1ldGhvZHM9ewoKIGNvbXBhcmVDYXNlbGVzczpm
dW5jdGlvbihzKXsKIHJldHVybiBTdHJpbmcuY29tcGFyZUNhc2VsZXNzKHRoaXMscyk7Cn0sCgoK
IGlzRXF1YWxDYXNlbGVzczpmdW5jdGlvbihzKXsKIHJldHVybiBTdHJpbmcuY29tcGFyZUNhc2Vs
ZXNzKHRoaXMscyk9PTA7Cn0sCgoKIGluZGV4T2ZDYXNlbGVzczpmdW5jdGlvbihzKXsKIHJldHVy
biB0aGlzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzLnRvTG93ZXJDYXNlKCkpOwp9LAoKCiBoYXNo
OmZ1bmN0aW9uKCl7CiBmb3IodmFyIGk9MCxoPTUzODE7aTx0aGlzLmxlbmd0aDtpKyspewogaD0o
KGgqMzMpXnRoaXMuY2hhckNvZGVBdChpKSk7Cn0KIHJldHVybiBoJjB4N2ZmZmZmZmY7Cn0sCgoK
IHRvSWRTdHJpbmc6ZnVuY3Rpb24ocHJlZml4KXsKIHZhciBzPXRoaXMucmVwbGFjZSgvXFcvZywn
XycpLnRvTG93ZXJDYXNlKCk7CiByZXR1cm4gcHJlZml4P3ByZWZpeCtzOnM7Cn0sCgoKIGlkVG9J
bnQ6ZnVuY3Rpb24oKXsKIHJldHVybiBwYXJzZUludCh0aGlzLnJlcGxhY2UoL1xEL2csJycpLDEw
KTsKfSwKCiBpc0VtYWlsQWRkcmVzczpmdW5jdGlvbihhKXsKIHJldHVybiB0aGlzLm1hdGNoKC9e
KFtcd1wuXC1cK10rKUAoKD86Wy1hLXowLTldK1wuKStbYS16XXsyLH0pJC9pKT90cnVlOmZhbHNl
Owp9Cn0KIE9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSxNZXRob2RzKTsKCiBPYmplY3Qu
ZXh0ZW5kKEZ1bmN0aW9uLnByb3RvdHlwZSx7CgogcnVuOmZ1bmN0aW9uKGFOYW1lKXsKIGlmKCF0
aGlzLl9ydW5uZXIpewogdmFyIHJ1bm5hYmxlPXRoaXM7CiB0aGlzLl9ydW5OYW1lPWFOYW1lfHwn
YW5vbnltb3VzIHRocmVhZCBmdW5jdGlvbic7CiB0aGlzLl9ydW5uZXI9ZnVuY3Rpb24oKXsKCiB2
YXIgYWdhaW49IXJ1bm5hYmxlLl9ydW5UaW1lcjsKIHRyeXsKCiBhZ2Fpbj1hZ2Fpbnx8cnVubmFi
bGUoKTsKfWNhdGNoKGUpewogemVuLmxvZ0V4Y2VwdGlvbihlLHRoaXMuX3J1bk5hbWUpOwp9Zmlu
YWxseXsKIHJ1bm5hYmxlLl9ydW5uaW5nPSEhYWdhaW47Cn0KCiBpZihhZ2Fpbil7CgogcnVubmFi
bGUuX3J1blRpbWVyPXNldFRpbWVvdXQocnVubmFibGUuX3J1bm5lciwwKTsKfWVsc2V7CgogcnVu
bmFibGUuc3RvcFJ1bm5pbmcoKTsKCgogaWYocnVubmFibGUub25TdG9wKXJ1bm5hYmxlLm9uU3Rv
cCgpOwp9Cn0KfQoKCiBpZighdGhpcy5fcnVuVGltZXIpewogY29uc29sZS5sb2coJ3J1bigpOiBT
dGFydGluZyAnK3RoaXMuX3J1bk5hbWUpOwogdGhpcy5fcnVubmVyKCk7Cn0KfSwKCgogc3RvcFJ1
bm5pbmc6ZnVuY3Rpb24oKXsKIGlmKHRoaXMuX3J1blRpbWVyKXsKIGNvbnNvbGUubG9nKCdydW4o
KTogU3RvcHBpbmcgJyt0aGlzLl9ydW5OYW1lKTsKIGNsZWFyVGltZW91dCh0aGlzLl9ydW5UaW1l
cik7CiBkZWxldGUgdGhpcy5fcnVuVGltZXI7Cn0KfSwKCgogc2V0TGF6eTpmdW5jdGlvbihtcyxw
ZXJpb2RpYyl7CiB0aGlzLl9sek1zPW1zOwogdGhpcy5fbHpQZXJpb2RpYz1wZXJpb2RpYzsKCgog
aWYodGhpcy5fbHopewogY2xlYXJUaW1lb3V0KHRoaXMuX2x6KTsKIGRlbGV0ZSB0aGlzLl9segp9
CgoKIHRoaXMuX2x6RnVuY3Rpb249dGhpcy5fbHpGdW5jdGlvbnx8ZnVuY3Rpb24oKXsKIHRyeXsK
CiB0aGlzKCk7Cn1jYXRjaChlKXsKIHplbi5sb2dFeGNlcHRpb24oZSk7Cn1maW5hbGx5ewogZGVs
ZXRlIHRoaXMuX2x6OwoKCiBpZih0aGlzLl9selBlcmlvZGljKXsKIHRoaXMuc2V0TGF6eSh0aGlz
Ll9sek1zLHRydWUpOwp9ZWxzZXsKCiB0aGlzLmNsZWFyTGF6eSgpOwp9Cn0KfS5iaW5kKHRoaXMp
OwoKIHRoaXMuX2x6PXNldFRpbWVvdXQodGhpcy5fbHpGdW5jdGlvbix0aGlzLl9sek1zfHwwKTsK
CiByZXR1cm4gdGhpczsKfSwKCgogY2xlYXJMYXp5OmZ1bmN0aW9uKCl7CiBpZih0aGlzLl9seil7
CiBjbGVhclRpbWVvdXQodGhpcy5fbHopOwp9CiBkZWxldGUgdGhpcy5fbHo7CiBkZWxldGUgdGhp
cy5fbHpGdW5jdGlvbjsKIGRlbGV0ZSB0aGlzLl9selBlcmlvZGljOwogZGVsZXRlIHRoaXMuX2x6
TXM7CiByZXR1cm4gdGhpczsKfSwKCgogaXNMYXp5OmZ1bmN0aW9uKCl7CiByZXR1cm4hIXRoaXMu
X2x6Owp9LAoKCiBsYXp5OmZ1bmN0aW9uKG1zKXsKIHJldHVybnsKIHNldDp0aGlzLnNldExhenku
YmluZCh0aGlzLG1zKSwKIGNsZWFyOnRoaXMuY2xlYXJMYXp5LmJpbmQodGhpcykKfQp9LAoKCiBi
aW5kU2hpZnQ6ZnVuY3Rpb24oY29udGV4dCxuKXsKIHZhciBmPXRoaXM7CiByZXR1cm4gZnVuY3Rp
b24oKXtmLmFwcGx5KGNvbnRleHQsJEEoYXJndW1lbnRzKS5zcGxpY2Uobnx8MSkpO307Cn0sCgoK
IGFmdGVyOmZ1bmN0aW9uKGJlZm9yZSl7CiB2YXIgYWZ0ZXI9dGhpczsKIHJldHVybiBiZWZvcmU/
ZnVuY3Rpb24oKXsKIGJlZm9yZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CiBhZnRlci5hcHBseSh0
aGlzLGFyZ3VtZW50cyk7Cn06dGhpczsKfSwKCgogYmVmb3JlOmZ1bmN0aW9uKGFmdGVyKXsKIHZh
ciBiZWZvcmU9dGhpczsKIHJldHVybiBhZnRlcj9mdW5jdGlvbigpewogYmVmb3JlLmFwcGx5KHRo
aXMsYXJndW1lbnRzKTsKIGFmdGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKfTp0aGlzOwp9LAoK
CiBwaXBlOmZ1bmN0aW9uKGRzdCl7CiB2YXIgc3JjPXRoaXM7CiByZXR1cm4gZnVuY3Rpb24oeCl7
CiByZXR1cm4gZHN0KHNyYy5hcHBseSh0aGlzLGFyZ3VtZW50cykpOwp9Cn0KfSk7CgoKIENsYXNz
LmtyZWF0ZT1mdW5jdGlvbigpewogdmFyIGtsYXNzPUNsYXNzLmNyZWF0ZS5hcHBseSh0aGlzLGFy
Z3VtZW50cyk7Cgoga2xhc3MuYWRkTWV0aG9kcyh7CiByZWRpcmVjdDpmdW5jdGlvbihmcm9tTWV0
aG9kLHRvLHRvTWV0aG9kKXsKIHplbi5kZXByZWNhdGUoJ3JlZGlyZWN0KCknLCdUQkQnKTsKIGNv
bnNvbGUuYXNzZXJ0KHRvLCdyZWRpcmVjdDogdG8gbXVzdCBiZSBkZWZpbmVkJyk7CiB0aGlzW2Zy
b21NZXRob2RdPWZ1bmN0aW9uKCl7CiBpZih0eXBlb2YgdG89PSdzdHJpbmcnKQogdG89dGhpc1t0
b107CiByZXR1cm4gdG9bdG9NZXRob2R8fGZyb21NZXRob2RdLmFwcGx5KHRvLGFyZ3VtZW50cyk7
Cn0KfQp9KTsKIHJldHVybiBrbGFzczsKfQoKCgogSGFzaC5hZGRNZXRob2RzKHsKCiBoYXNLZXk6
ZnVuY3Rpb24oayl7cmV0dXJuIGsgaW4gdGhpcy5fb2JqZWN0O30KfSk7Cn0pOwoKemVuLmFwaSgn
T2JzZXJ2YWJsZScsZnVuY3Rpb24oKXsKIHplbi5yZXF1aXJlKCd4TmF0aXZlJyk7CgoKIHdpbmRv
dy5PYnNlcnZlSGVscGVyPUNsYXNzLmNyZWF0ZSh7CgogaW5pdGlhbGl6ZTpmdW5jdGlvbihvYnNl
cnZhYmxlLHNjb3BlLG1zZyl7CiB0aGlzLl9vPW9ic2VydmFibGU7CiB0aGlzLl9zPXNjb3BlOwog
dGhpcy5fbT1tc2c7Cn0sCgoKIHNldE9ic2VydmFibGU6ZnVuY3Rpb24ob2JzZXJ2YWJsZSl7CiB0
aGlzLl9vPW9ic2VydmFibGU7Cn0sCgoKIG9ic2VydmU6ZnVuY3Rpb24oZSxvYnNlcnZlcixhU2Nv
cGUsYU1zZyl7CiB0aGlzLl9vLm9ic2VydmUoZSxvYnNlcnZlcixhU2NvcGV8fHRoaXMuX3MsYU1z
Z3x8dGhpcy5fbSk7Cn0KfSk7CgoKIHdpbmRvdy5PYnNlcnZhYmxlPXsKCgoKIFNUT1BfT0JTRVJW
SU5HOjB4REVDRUE1RUQsCgoKIEFMTF9FVkVOVFM6J19hbGxfZXZlbnRzXycsCgoKIGV4dGVuZDpm
dW5jdGlvbihvKXsKIHJldHVybiBPYmplY3QuZXh0ZW5kKG8sT2JzZXJ2YWJsZS5NZXRob2RzKTsK
fSwKCgogTWV0aG9kczp7Cgogb2JzZXJ2ZTpmdW5jdGlvbihlLG9ic2VydmVyLHNjb3BlLG1zZyl7
CiBpZighZSlyZXR1cm4gY29uc29sZS5lcnJvclRyYWNlKCdVbmRlZmluZWQgT2JzZXJ2YWJsZSBl
dmVudCcpOwogaWYoIW9ic2VydmVyKXJldHVybiBjb25zb2xlLmVycm9yVHJhY2UoJ1VuZGVmaW5l
ZCBPYnNlcnZhYmxlIG9ic2VydmVyJyk7Cgogc2NvcGU9c2NvcGV8fHdpbmRvdzsKIHZhciBvPXRo
aXMuX19vYnNlcnZlcnN8fCh0aGlzLl9fb2JzZXJ2ZXJzPVtdKTsKIG8ucHVzaCh7CiBlOmUsCiBv
YnNlcnZlcjpvYnNlcnZlciwKIHNjb3BlOnNjb3BlLAogbXNnOm1zZwp9KTsKfSwKCgogc3RvcE9i
c2VydmluZzpmdW5jdGlvbihlLG9ic2VydmVyLHNjb3BlKXsKIHZhciBvYnM9dGhpcy5fX29ic2Vy
dmVyczsKIGlmKCFvYnMpcmV0dXJuOwogZm9yKHZhciBpPTA7aTxvYnMubGVuZ3RoO2krKyl7CiB2
YXIgbz1vYnNbaV07CiBpZihvJiYoIWV8fGU9PW8uZSkmJgooIW9ic2VydmVyfHxvYnNlcnZlcj09
by5vYnNlcnZlcikmJgooc2NvcGU9PW8uc2NvcGUpKW9ic1tpXT1udWxsOwp9Cn0sCgoKIGNsZWFy
T2JzZXJ2ZXJzOmZ1bmN0aW9uKCl7CiBkZWxldGUgdGhpcy5fX29ic2VydmVyczsKfSwKCgogbm90
aWZ5OmZ1bmN0aW9uKGUpewogaWYoIWUpcmV0dXJuIGNvbnNvbGUuZXJyb3JUcmFjZSgnSW52YWxp
ZCBldmVudDogJytlKTsKCiB2YXIgb2JzPXRoaXMuX19vYnNlcnZlcnM7CiBpZighb2JzKXJldHVy
bjsKCgoKIHZhciB0aGluPWZhbHNlLG9ic2xlbj1vYnMubGVuZ3RoOwogdmFyIG5vYnM9MDsKIGZv
cih2YXIgaT0wO2k8b2JzbGVuO2krKyl7CiB2YXIgbz1vYnNbaV07CiBpZighbyl0aGluPXRydWU7
CiBpZighb3x8KG8uZSE9ZSYmby5lIT1PYnNlcnZhYmxlLkFMTF9FVkVOVFMpKWNvbnRpbnVlOwog
bm9icysrOwoKIHRyeXsKIG8ub2JzZXJ2ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp9Y2F0Y2go
ZXgpewogaWYoZXg9PU9ic2VydmFibGUuU1RPUF9PQlNFUlZJTkcpewoKIG9ic1tpXT1udWxsOwp9
ZWxzZXsKIGNvbnNvbGUuZ3JvdXAoJ0V4Y2VwdGlvbiBkdXJpbmcgbm90aWZ5KCcrZSsnKTonKTsK
IGNvbnNvbGUuZGlyKGV4KTsKIGNvbnNvbGUudHJhY2UoKTsKIGNvbnNvbGUuZ3JvdXBFbmQoKTsK
fQp9Cn0KCgoKCiBpZihub2JzPjYpewogY29uc29sZS53YXJuKCdub3RpZnkoKTogIicrZSsnIiBo
YXMgJytub2JzKycgb2JzZXJ2ZXJzIC4uLiBwb3NzaWJsZSBvYnNlcnZlciBsZWFrPycpOwp9CiBp
Zih0aGluKW9icy50aGluKCk7Cn0KfQp9Owp9KTsKCnplbi5hcGkoJ1plbkl0ZW0nLGZ1bmN0aW9u
KCl7CiB6ZW4ucmVxdWlyZSgnT2JzZXJ2YWJsZScsJ3hOYXRpdmUnKTsKCgogd2luZG93Llplbkl0
ZW09Q2xhc3MuY3JlYXRlKEhhc2gpOwogWmVuSXRlbS5hZGRNZXRob2RzKE9ic2VydmFibGUuTWV0
aG9kcyk7CgogT2JqZWN0LmV4dGVuZChaZW5JdGVtLHsKCiBSRUxFQVNFRDoncmVsZWFzZWQoaXRl
bSknLAoKCiBSRU1PVkU6J3JlbW92ZShpdGVtLCBxdWlldCknLAoKCiBDSEFOR0VEOidjaGFuZ2Vk
KGl0ZW0pJywKCgogQ0hBTkdFRF9JRDonY2hhbmdlZF9pZChpdGVtLCBvbGRJZCwgbmV3SWQpJywK
CgoKIEpTVVBfS0VZUzpuZXcgUmVnRXhwKCdfbmV3fF9kZWxldGV8X3VwZGF0ZScpLAoKCgogY29t
cGFyZUlkOkFycmF5LmNyZWF0ZUNvbXBhcmF0b3IoJyN7b2JqZWN0fS5pZCcpCn0pOwoKIFplbkl0
ZW0uYWRkTWV0aG9kcyh7CgogRklMVEVSUzp7fSwKCgogX3ByZXZpb3VzU3RhdGU6bnVsbCwKCgog
X2NoYW5nZWQ6ZmFsc2UsCgoKIGluaXRpYWxpemU6ZnVuY3Rpb24oJHN1cGVyLG9iail7CiAkc3Vw
ZXIoKTsKCiB0aGlzLl9yZWZzPTA7Cgogb2JqPW9ianx8e307CiBvYmouaWQ9b2JqLmlkOwogdGhp
cy5zZXRBbGwob2JqLHRydWUpOwogdGhpcy5jaWQ9JHVuaXF1ZSgnYyMnKTsKCgogdGhpcy5fY2hh
bmdlZD1mYWxzZTsKIHRoaXMuX3ByZXZpb3VzU3RhdGU9dGhpcy50b09iamVjdCgpOwp9LAoKCiBj
bG9uZTpmdW5jdGlvbigpewogcmV0dXJuIG5ldyh0aGlzLmNvbnN0cnVjdG9yKSh0aGlzLnRvT2Jq
ZWN0KCkpOwp9LAoKIGlzRXF1YWw6ZnVuY3Rpb24oaXRlbSl7CiByZXR1cm4gaXRlbSYmT2JqZWN0
LmlzRXF1YWwodGhpcy5fb2JqZWN0LGl0ZW0uX29iamVjdCk7Cn0sCgoKIG5vdGlmeUNoYW5nZWQ6
ZnVuY3Rpb24oKXsKIHRoaXMubm90aWZ5KFplbkl0ZW0uQ0hBTkdFRCx0aGlzKTsKIHRoaXMuX3By
ZXZpb3VzU3RhdGU9dGhpcy50b09iamVjdCgpOwogdGhpcy5fY2hhbmdlZD1mYWxzZTsKIHRoaXMu
X2NoYW5nZWRQcm9wZXJ0aWVzPWZhbHNlOwp9LAoKCiBub3RpZnlSZW1vdmU6ZnVuY3Rpb24ocXVp
ZXQpewogdGhpcy5ub3RpZnkoWmVuSXRlbS5SRU1PVkUsdGhpcyxxdWlldCk7CiBjb25zb2xlLmFz
c2VydCh0aGlzLl9yZWZzPT0wLCdub3RpZnlSZW1vdmU6IEl0ZW0gbm90IGNvbXBsZXRlbHkgcmVt
b3ZlZD8nKTsKfSwKCgogaXNDaGFuZ2VkOmZ1bmN0aW9uKGspewogcmV0dXJuIGs/dGhpcy5fcHJl
dmlvdXNTdGF0ZVtrXSE9dGhpcy5fb2JqZWN0W2tdOnRoaXMuX2NoYW5nZWQ7Cn0sCgogaGFzSWQ6
ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLmlkJiZ0aGlzLmlkPjA7Cn0sCgoKIGNsZWFyOmZ1bmN0
aW9uKCl7CiB0aGlzLl9vYmplY3Q9ewogaWQ6dGhpcy5pZAp9OwogcmV0dXJuIHRoaXM7Cn0sCgoK
IHNldEFsbDpmdW5jdGlvbihvYmoscXVpZXQpewogaWYoIW9iailyZXR1cm47CiBvYmo9b2JqLl9v
YmplY3R8fG9iajsKCiBmb3IodmFyIGsgaW4gb2JqKXsKIGlmKCFaZW5JdGVtLkpTVVBfS0VZUy50
ZXN0KGspKXRoaXMuc2V0KGssb2JqW2tdLHF1aWV0KTsKfQogcmV0dXJuIHRoaXM7Cn0sCgogc2V0
T2JqZWN0OmZ1bmN0aW9uKG9iaixxdWlldCl7CiB6ZW4uZGVwcmVjYXRlKCdaZW5JdGVtLnNldE9i
amVjdCcsJ1plbkl0ZW0uc2V0QWxsJyk7CiByZXR1cm4gdGhpcy5zZXRBbGwob2JqLHF1aWV0KTsK
fSwKCgogc2V0OmZ1bmN0aW9uKGssdixxdWlldCl7CgogdmFyIGY9dGhpcy5GSUxURVJTW2tdOwog
dj1mP2Yodik6djsKCiBpZihrPT0naWQnJiYoIXZ8fHYhPXRoaXMuaWQpKXsKIHZhciBvbGRJZD10
aGlzLmlkOwoKIHY9dnx8JHVuaXF1ZSgpKi0xOwogaWYodiE9b2xkSWQpewogdGhpcy5pZD12Owog
aWYoIXF1aWV0KXRoaXMubm90aWZ5KFplbkl0ZW0uQ0hBTkdFRF9JRCx0aGlzLG9sZElkLHYpOwp9
Cn0KIHJldHVybiB0aGlzLl9vYmplY3Rba109djsKfSwKCgogdW5zZXQ6ZnVuY3Rpb24oJHN1cGVy
LGspewogaWYoaz09J2lkJylyZXR1cm4gY29uc29sZS53YXJuKCdaZW5JdGVtOiAiaWQiIGNhbm5v
dCBiZSB1bnNldC4nKTsKIHJldHVybiAkc3VwZXIoayk7Cn0sCgogcmV0YWluOmZ1bmN0aW9uKCl7
CiB0aGlzLl9yZWZzKys7CgoKCgogaWYodGhpcy5fcmVmcz41KXsKIGNvbnNvbGUud2FybignVW5l
eHBlY3RlZGx5IGhpZ2ggcmVmZXJlbmNlIGNvdW50ICgnK3RoaXMuX3JlZnMrJykgZm9yICcrdGhp
cyk7Cn0KfSwKCgogcmVsZWFzZTpmdW5jdGlvbigpewogdGhpcy5fcmVmcy0tOwogaWYodGhpcy5f
cmVmczwwKXsKIGNvbnNvbGUud2FybignUmVmZXJlbmNlIGNvdW50IDwgMCBmb3IgJyt0aGlzKTsK
fQogaWYodGhpcy5fcmVmczw9MCl7CiB0aGlzLm5vdGlmeShaZW5JdGVtLlJFTEVBU0VELHRoaXMp
Owp9Cn0sCgogdG9TdHJpbmc6ZnVuY3Rpb24oKXsKIHJldHVybidJdGVtICcrdGhpcy5pZDsKfQp9
KTsKCiBaZW5JdGVtLl9ub3Byb3h5PXRydWU7Cn0pOwoKemVuLmFwaSgnWmVuU2V0JyxmdW5jdGlv
bigpewogemVuLnJlcXVpcmUoJ3hOYXRpdmUnLCdaZW5JdGVtJyk7CgoKIHdpbmRvdy5aZW5TZXQ9
Q2xhc3MuY3JlYXRlKCk7CiBaZW5TZXQuYWRkTWV0aG9kcyhFbnVtZXJhYmxlKTsKIFplblNldC5h
ZGRNZXRob2RzKE9ic2VydmFibGUuTWV0aG9kcyk7CgogT2JqZWN0LmV4dGVuZChaZW5TZXQsewoK
IElURU1fQ0hBTkdFRDonaXRlbUNoYW5nZWQoc2V0LCBpdGVtKScsCgoKIElURU1fQ0hBTkdFRF9J
RDonaXRlbUNoYW5nZWRJZChzZXQsIGl0ZW0sIG9sZElkLCBuZXdJZCknLAoKCiBJVEVNX0FEREVE
OidpdGVtQWRkZWQoc2V0LCBpdGVtKScsCgoKIElURU1fUkVNT1ZFRDonaXRlbVJlbW92ZWQoc2V0
LCBpdGVtKScsCgoKIFVQREFURUQ6J3VwZGF0ZWQoc2V0KScKfSk7CgogWmVuU2V0LmFkZE1ldGhv
ZHMoewoKIGluaXRpYWxpemU6ZnVuY3Rpb24ocmV0YWluSXRlbXMpewogY29uc29sZS5hc3NlcnQo
dHlwZW9mKHJldGFpbkl0ZW1zKT09J2Jvb2xlYW4nLCdaZW5TZXQ6IHJldGFpbkl0ZW1zIG11c3Qg
YmUgZWl0aGVyIHRydWUgb3IgZmFsc2UnKTsKCiB6ZW4uYmluZCh0aGlzLCdoYW5kbGVJdGVtRXZl
bnQnLCdfZGV0YWNoJyk7CgogdGhpcy5fcmV0YWluSXRlbXM9cmV0YWluSXRlbXMhPT1mYWxzZTsK
IHRoaXMuX2luaXQoKTsKCiB0aGlzLnNldEZpbHRlcih0aGlzLl9maWx0ZXIpOwp9LAoKCiBfaW5p
dDpmdW5jdGlvbigpewogT2JqZWN0LmVhY2hWYWx1ZSh0aGlzLl9ieUlkLHRoaXMuX2RldGFjaCk7
CiB0aGlzLl9zaXplPTA7CiB0aGlzLl9ieUlkPXt9OwogdGhpcy5fYnlDaWQ9e307Cn0sCgoKIGRl
c3Ryb3k6ZnVuY3Rpb24oKXsKIHRoaXMucmVtb3ZlQWxsKCk7Cn0sCgoKIF9lYWNoOmZ1bmN0aW9u
KGYpewogT2JqZWN0LnZhbHVlcyh0aGlzLl9ieUlkKS5fZWFjaChmKTsKfSwKCgogc2V0RmlsdGVy
OmZ1bmN0aW9uKGZpbHRlcixxdWlldCl7CiB0aGlzLl9maWx0ZXI9ZmlsdGVyfHxQcm90b3R5cGUu
SzsKIHRoaXMuZmlsdGVyKHF1aWV0KTsKfSwKCgogZmlsdGVyOmZ1bmN0aW9uKHF1aWV0KXsKIHRo
aXMucmVwbGFjZSh0aGlzLmZpbmRBbGwodGhpcy5fZmlsdGVyKSxxdWlldCk7Cn0sCgoKIGhhbmRs
ZUl0ZW1FdmVudDpmdW5jdGlvbihlLGl0ZW0sYSxiKXsKIHN3aXRjaChlKXsKIGNhc2UgWmVuSXRl
bS5DSEFOR0VEOgogdGhpcy5ub3RpZnkoWmVuU2V0LklURU1fQ0hBTkdFRCx0aGlzLGl0ZW0pOwog
YnJlYWs7CiBjYXNlIFplbkl0ZW0uQ0hBTkdFRF9JRDoKCiBpZih0aGlzLl9ieUlkW2FdKXsKIGRl
bGV0ZSB0aGlzLl9ieUlkW2FdOwogdGhpcy5fYnlJZFtiXT1pdGVtOwp9CiB0aGlzLm5vdGlmeSha
ZW5TZXQuSVRFTV9DSEFOR0VEX0lELHRoaXMsaXRlbSk7CiBicmVhazsKIGNhc2UgWmVuSXRlbS5S
RUxFQVNFRDoKIGE9dHJ1ZTsKIGNhc2UgWmVuSXRlbS5SRU1PVkU6CgogdGhpcy5yZW1vdmUoaXRl
bSxhKTsKIGJyZWFrOwp9Cn0sCgoKIG5vdGlmeUl0ZW1BZGRlZDpmdW5jdGlvbihpdGVtKXsKIHRo
aXMubm90aWZ5KFplblNldC5JVEVNX0FEREVELHRoaXMsaXRlbSk7Cn0sCgoKIG5vdGlmeUl0ZW1S
ZW1vdmVkOmZ1bmN0aW9uKGl0ZW0pewogdGhpcy5ub3RpZnkoWmVuU2V0LklURU1fUkVNT1ZFRCx0
aGlzLGl0ZW0pOwp9LAoKCiBub3RpZnlVcGRhdGVkOmZ1bmN0aW9uKCl7CiB0aGlzLm5vdGlmeSha
ZW5TZXQuVVBEQVRFRCx0aGlzKTsKfSwKCgogZ2V0OmZ1bmN0aW9uKGlkKXsKIHJldHVybiBpZCE9
dW5kZWZpbmVkJiZ0aGlzLl9ieUlkW2lkLmlkfHxpZF07Cn0sCgoKIGdldEJ5Q2lkOmZ1bmN0aW9u
KGlkKXsKIHJldHVybiBpZCE9dW5kZWZpbmVkJiZ0aGlzLl9ieUNpZFtpZC5pZHx8aWRdOwp9LAoK
CgogZ2V0SWRzOmZ1bmN0aW9uKCl7CiByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fYnlJZCk7Cn0s
CgoKCiBnZXRDaWRzOmZ1bmN0aW9uKCl7CiByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fYnlDaWQp
Owp9LAoKCgogc2l6ZTpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuX3NpemU7Cn0sCgoKIGNvbnRh
aW5zOmZ1bmN0aW9uKGl0ZW0pewogcmV0dXJuISF0aGlzLl9ieUlkW2l0ZW0uaWRdOwp9LAoKCiBf
YXR0YWNoOmZ1bmN0aW9uKGl0ZW0pewogaXRlbS5vYnNlcnZlKE9ic2VydmFibGUuQUxMX0VWRU5U
Uyx0aGlzLmhhbmRsZUl0ZW1FdmVudCx0aGlzKTsKIGlmKHRoaXMuX3JldGFpbkl0ZW1zKWl0ZW0u
cmV0YWluKCk7Cn0sCgoKIF9kZXRhY2g6ZnVuY3Rpb24oaXRlbSl7CiBpdGVtLnN0b3BPYnNlcnZp
bmcobnVsbCxudWxsLHRoaXMpOwogaWYodGhpcy5fcmV0YWluSXRlbXMpaXRlbS5yZWxlYXNlKCk7
Cn0sCgoKIGFkZDpmdW5jdGlvbihpdGVtLHF1aWV0KXsKIHZhciBjdXJyZW50PXRoaXMuZ2V0KGl0
ZW0pOwogaWYoIWN1cnJlbnQpewogaWYoIXRoaXMuX2ZpbHRlcihpdGVtKSlyZXR1cm4gbnVsbDsK
IHRoaXMuX2J5SWRbaXRlbS5pZF09aXRlbTsKIHRoaXMuX2J5Q2lkW2l0ZW0uY2lkXT1pdGVtOwog
dGhpcy5fYXR0YWNoKGl0ZW0pOwogdGhpcy5fc2l6ZSsrOwoKIGlmKHRoaXMuX2FmdGVyQWRkKXRo
aXMuX2FmdGVyQWRkKGl0ZW0scXVpZXQpOwogaWYoIXF1aWV0KXRoaXMubm90aWZ5SXRlbUFkZGVk
KGl0ZW0pOwogcmV0dXJuIGl0ZW07Cn1lbHNlIGlmKGN1cnJlbnQhPT1pdGVtKXsKIGNvbnNvbGUu
d2FybignWmVuU2V0OiBXYXJuaW5nIC0gRm91bmQgdHdvIGl0ZW1zIHdpdGggdGhlIHNhbWUgaWQo
ISEhKScpOwp9CiByZXR1cm4gbnVsbDsKfSwKCgogYWRkQWxsOmZ1bmN0aW9uKGl0ZW1zLHF1aWV0
KXsKIGl0ZW1zPU9iamVjdC5pc0FycmF5KGl0ZW1zKT9pdGVtczooaXRlbXMudmFsdWVzP2l0ZW1z
LnZhbHVlcygpOk9iamVjdC52YWx1ZXMoaXRlbXMpKTsKIGZvcih2YXIgaT0wO2k8aXRlbXMubGVu
Z3RoO2krKyl0aGlzLmFkZChpdGVtc1tpXSxxdWlldCk7Cn0sCgoKIHJlbW92ZTpmdW5jdGlvbihp
dGVtLHF1aWV0KXsKIGl0ZW09dGhpcy5nZXQoaXRlbSk7CiBpZihpdGVtKXsKIGRlbGV0ZSB0aGlz
Ll9ieUlkW2l0ZW0uaWRdOwogZGVsZXRlIHRoaXMuX2J5Q2lkW2l0ZW0uY2lkXTsKIHRoaXMuX2Rl
dGFjaChpdGVtKTsKIHRoaXMuX3NpemUtLTsKCiBpZih0aGlzLl9hZnRlclJlbW92ZSl0aGlzLl9h
ZnRlclJlbW92ZShpdGVtLHF1aWV0KTsKIGlmKCFxdWlldCl0aGlzLm5vdGlmeUl0ZW1SZW1vdmVk
KGl0ZW0pOwp9CgogcmV0dXJuIGl0ZW07Cn0sCgoKIHJlbW92ZUJ5SWRzOmZ1bmN0aW9uKGlkcyxx
dWlldCl7CiBpZHMuZWFjaChmdW5jdGlvbihpZCl7CiB0aGlzLnJlbW92ZShpZCxxdWlldCk7Cn0u
YmluZCh0aGlzKSk7Cn0sCgoKIHJlbW92ZUFsbDpmdW5jdGlvbihxdWlldCl7CiB0aGlzLnJlcGxh
Y2UobnVsbCxxdWlldCk7Cn0sCgoKIHJlcGxhY2U6ZnVuY3Rpb24oaXRlbXMscXVpZXQpewogaXRl
bXM9aXRlbXN8fFtdOwogaXRlbXMuaW52b2tlKCdyZXRhaW4nKTsKIHRoaXMuX2luaXQoKTsKIHRo
aXMuYWRkQWxsKGl0ZW1zLHRydWUpOwogaXRlbXMuaW52b2tlKCdyZWxlYXNlJyk7CgogaWYoIXF1
aWV0KXRoaXMubm90aWZ5VXBkYXRlZCgpOwogaWYodGhpcy5fYWZ0ZXJVcGRhdGUpdGhpcy5fYWZ0
ZXJVcGRhdGUocXVpZXQpOwp9Cn0pOwoKIFplblNldC5fbm9wcm94eT10cnVlOwp9KTsKemVuLmFw
aSgnWmVuU29ydGVkU2V0JyxmdW5jdGlvbigpewogemVuLnJlcXVpcmUoJ3hOYXRpdmUnLCdaZW5T
ZXQnKTsKCgogd2luZG93LlplblNvcnRlZFNldD1DbGFzcy5jcmVhdGUoWmVuU2V0LHsKCiBpbml0
aWFsaXplOmZ1bmN0aW9uKCRzdXBlcixjb21wYXJhdG9yLHJldGFpbkl0ZW1zKXsKICRzdXBlcihy
ZXRhaW5JdGVtcyk7CiB0aGlzLnNldENvbXBhcmF0b3IoY29tcGFyYXRvcix0cnVlKTsKfSwKCgog
X2luaXQ6ZnVuY3Rpb24oJHN1cGVyKXsKICRzdXBlcigpOwogdGhpcy5fYnlJbmRleD1bXTsKfSwK
CgogX2VhY2g6ZnVuY3Rpb24oaXRlcmF0b3IpewogcmV0dXJuIHRoaXMuX2J5SW5kZXguX2VhY2go
aXRlcmF0b3IpOwp9LAoKCiBpbmRleE9mOmZ1bmN0aW9uKGl0ZW0pewogcmV0dXJuIEFycmF5LnNv
cnRlZEluZGV4T2YodGhpcy5fYnlJbmRleCx0aGlzLl9jb21wYXJhdG9yLGl0ZW0pOwp9LAoKCiBn
ZXRJdGVtQXQ6ZnVuY3Rpb24oaSl7CiByZXR1cm4gdGhpcy5fYnlJbmRleFtpXTsKfSwKCgogZmly
c3Q6ZnVuY3Rpb24oZil7CiByZXR1cm4hZj90aGlzLl9ieUluZGV4LmZpcnN0KCk6CiB0aGlzLmlu
amVjdChudWxsLGZ1bmN0aW9uKGFjYyx2YWx1ZSl7CiByZXR1cm4hYWNjP3ZhbHVlOmYoYWNjLHZh
bHVlKTwwP2FjYzp2YWx1ZTsKfSk7Cn0sCgoKIGxhc3Q6ZnVuY3Rpb24oZil7CiByZXR1cm4hZj90
aGlzLl9ieUluZGV4Lmxhc3QoKToKIHRoaXMuaW5qZWN0KG51bGwsZnVuY3Rpb24oYWNjLHZhbHVl
KXsKIHJldHVybiFhY2M/dmFsdWU6ZihhY2MsdmFsdWUpPjA/YWNjOnZhbHVlOwp9KTsKfSwKCgog
YmVmb3JlOmZ1bmN0aW9uKGl0ZW0pewogdmFyIGk9dGhpcy5pbmRleE9mKGl0ZW0pOwogcmV0dXJu
IGk+PTA/dGhpcy5fYnlJbmRleFtpLTFdOm51bGw7Cn0sCgoKIGFmdGVyOmZ1bmN0aW9uKGl0ZW0p
ewogdmFyIGk9dGhpcy5pbmRleE9mKGl0ZW0pOwogcmV0dXJuIGk+PTA/dGhpcy5fYnlJbmRleFtp
KzFdOm51bGw7Cn0sCgoKIHNldENvbXBhcmF0b3I6ZnVuY3Rpb24oY29tcGFyYXRvcixxdWlldCl7
CiBjb21wYXJhdG9yPWNvbXBhcmF0b3J8fFplbkl0ZW0uY29tcGFyZUlkOwogaWYodGhpcy5fY29t
cGFyYXRvcj09Y29tcGFyYXRvcilyZXR1cm47CiB0aGlzLl9jb21wYXJhdG9yPWNvbXBhcmF0b3I7
CiB0aGlzLnNvcnQocXVpZXQpOwp9LAoKCiBzb3J0OmZ1bmN0aW9uKHF1aWV0KXsKIHRoaXMuX2J5
SW5kZXguc29ydCh0aGlzLl9jb21wYXJhdG9yKTsKIGlmKHF1aWV0KXRoaXMubm90aWZ5VXBkYXRl
ZCgpOwp9LAoKCiBhZGQ6ZnVuY3Rpb24oJHN1cGVyLGl0ZW0scXVpZXQpewogaWYoaXRlbT0kc3Vw
ZXIoaXRlbSx0cnVlKSl7CiB2YXIgaT1BcnJheS5zb3J0ZWRJbmRleCh0aGlzLl9ieUluZGV4LHRo
aXMuX2NvbXBhcmF0b3IsaXRlbSk7CiB0aGlzLl9ieUluZGV4Lmluc2VydChpdGVtLGkpOwogaWYo
IXF1aWV0KXRoaXMubm90aWZ5SXRlbUFkZGVkKGl0ZW0pOwp9CiByZXR1cm4gaXRlbTsKfSwKCgog
cmVtb3ZlOmZ1bmN0aW9uKCRzdXBlcixpdGVtLHF1aWV0KXsKIGlmKGl0ZW09JHN1cGVyKGl0ZW0s
dHJ1ZSkpewogdGhpcy5fYnlJbmRleC5yZW1vdmUoaXRlbSk7CiBpZighcXVpZXQpdGhpcy5ub3Rp
ZnlJdGVtUmVtb3ZlZChpdGVtKTsKfQogcmV0dXJuIGl0ZW07Cn0KfSk7CgogWmVuU29ydGVkU2V0
Ll9ub3Byb3h5PXRydWU7Cn0pOwoKemVuLmFwaSgnWmVuU3Vic2V0JyxmdW5jdGlvbigpewoKIHdp
bmRvdy5aZW5TdWJzZXQ9ewogZXh0ZW5kOmZ1bmN0aW9uKHNldCl7Cgogc2V0Ll9zdWJzZXRfZGVz
dHJveT1zZXQuZGVzdHJveTsKIHNldC5fc3Vic2V0X2hhbmRsZUl0ZW1FdmVudD1zZXQuaGFuZGxl
SXRlbUV2ZW50OwoKCiBPYmplY3QuZXh0ZW5kKHNldCxaZW5TdWJzZXQuTWV0aG9kcyk7CiB6ZW4u
YmluZChzZXQsJ19oYW5kbGVTb3VyY2VFdmVudCcsJ2hhbmRsZUl0ZW1FdmVudCcpOwp9LAoKIE1l
dGhvZHM6ewoKIGRlc3Ryb3k6ZnVuY3Rpb24oKXsKIHRoaXMuc2V0U291cmNlKG51bGwpOwogdGhp
cy5fc3Vic2V0X2Rlc3Ryb3koKTsKfSwKCgogc2V0U291cmNlOmZ1bmN0aW9uKHNvdXJjZSxxdWll
dCl7CiBpZih0aGlzLl9zb3VyY2UpdGhpcy5fc291cmNlLnN0b3BPYnNlcnZpbmcoT2JzZXJ2YWJs
ZS5BTExfRVZFTlRTLAogdGhpcy5faGFuZGxlU291cmNlRXZlbnQpOwogaWYoc291cmNlKXNvdXJj
ZS5vYnNlcnZlKE9ic2VydmFibGUuQUxMX0VWRU5UUyx0aGlzLl9oYW5kbGVTb3VyY2VFdmVudCwK
IHRoaXMpOwogdGhpcy5fc291cmNlPXNvdXJjZTsKIHRoaXMuZmlsdGVyKHF1aWV0KTsKfSwKCgog
X2NoZWNrSXRlbTpmdW5jdGlvbihpdGVtKXsKIHZhciB3YXM9dGhpcy5nZXQoaXRlbSksd2lsbEJl
PXRoaXMuX2ZpbHRlcihpdGVtKTsKIGlmKHdhcyYmIXdpbGxCZSl7CiByZXR1cm4gdGhpcy5yZW1v
dmUoaXRlbSk7Cn1lbHNlIGlmKCF3YXMmJndpbGxCZSl7CiByZXR1cm4gdGhpcy5hZGQoaXRlbSk7
Cn0KIHJldHVybiBmYWxzZTsKfSwKCgogX2hhbmRsZVNvdXJjZUV2ZW50OmZ1bmN0aW9uKGUsc2V0
LGl0ZW0pewogc3dpdGNoKGUpewogY2FzZSBaZW5TZXQuSVRFTV9SRU1PVkVEOgogdGhpcy5yZW1v
dmUoaXRlbSk7YnJlYWs7CiBjYXNlIFplblNldC5JVEVNX0FEREVEOgogY2FzZSBaZW5TZXQuSVRF
TV9DSEFOR0VEOgogdGhpcy5fY2hlY2tJdGVtKGl0ZW0pO2JyZWFrOwogY2FzZSBaZW5TZXQuVVBE
QVRFRDoKIHRoaXMuZmlsdGVyKCk7YnJlYWs7Cn0KfSwKCgogaGFuZGxlSXRlbUV2ZW50OmZ1bmN0
aW9uKGUsaXRlbSxhLGIpewoKIGlmKGU9PVplbkl0ZW0uQ0hBTkdFRCYmdGhpcy5fY2hlY2tJdGVt
KGl0ZW0pKXJldHVybjsKCiByZXR1cm4gdGhpcy5fc3Vic2V0X2hhbmRsZUl0ZW1FdmVudC5hcHBs
eSh0aGlzLGFyZ3VtZW50cyk7Cn0sCgoKIGZpbHRlcjpmdW5jdGlvbihxdWlldCl7CiB2YXIgc3Jj
PXRoaXMuX3NvdXJjZXx8dGhpczsKIHRoaXMucmVwbGFjZShzcmMuZmluZEFsbCh0aGlzLl9maWx0
ZXIpLHF1aWV0KTsKfQp9Cn0KfSk7Cgp6ZW4uYXBpKCdEb20nLGZ1bmN0aW9uKCl7CiB6ZW4ucmVx
dWlyZSgnUmVjdCcpOwoKIHdpbmRvdy5Eb209ewogX3doZWVsTGlzdGVuZXJzOltdLAoKIF9oYW5k
bGVNb3VzZVdoZWVsOmZ1bmN0aW9uKGUpewogZT1lfHx3aW5kb3cuZXZlbnQ7CgoKIHZhciBkZWx0
YT1lLndoZWVsRGVsdGE/KGUud2hlZWxEZWx0YS8xMjAqKHdpbmRvdy5vcGVyYT8tMToxKSk6Cihl
LmRldGFpbD8tZS5kZXRhaWwvMzowKQoKCiB2YXIgdGFyZ2V0PSQoRXZlbnQuZWxlbWVudChlKSk7
CiBpZihkZWx0YSl7CiBEb20uX3doZWVsTGlzdGVuZXJzLmVhY2goZnVuY3Rpb24obyl7CgogaWYo
dGFyZ2V0JiYKKHRhcmdldD09by5lbGVtZW50fHxFbGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXQs
by5lbGVtZW50KSkpewogby5saXN0ZW5lcihkZWx0YSk7CiBFdmVudC5zdG9wKGUpOwp9Owp9KTsK
fQp9Cn0KfSk7Cgp6ZW4uYXBpKCdIVFRQJyxmdW5jdGlvbigpewoKIHdpbmRvdy5IVFRQQ2xhc3M9
Q2xhc3MuY3JlYXRlKHsKCiBHRVQ6J2dldCcsCgogUFVUOidwdXQnLAoKIFBPU1Q6J3Bvc3QnLAoK
IERFTEVURTonZGVsZXRlJywKCgogcmVxdWVzdDpmdW5jdGlvbih1cmwsdG9rZW5zLG8sbWV0aG9k
KXsKIGlmKHRva2Vucyl1cmw9dXJsLmludGVycG9sYXRlKHRva2Vucyk7CiBvPW98fHt9Owogby5t
ZXRob2Q9by5tZXRob2R8fG1ldGhvZHx8SFRUUC5HRVQ7CgogaWYoby5vbkVycm9yKXsKCiBvLm9u
RXhjZXB0aW9uPW8ub25GYWlsdXJlPW8ub25FcnJvcjsKIG8ub25FeGNlcHRpb249by5vbkZhaWx1
cmU9by5vbkVycm9yOwogZGVsZXRlIG8ub25FcnJvcjsKfQoKIHJldHVybiBuZXcgQWpheC5SZXF1
ZXN0KHVybCxvKTsKfSwKCgogZ2V0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5yZXF1ZXN0
KGEsYixjLHRoaXMuR0VUKX0sCgoKIHB1dDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucmVx
dWVzdChhLGIsYyx0aGlzLlBVVCl9LAoKCiBwb3N0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhp
cy5yZXF1ZXN0KGEsYixjLHRoaXMuUE9TVCl9LAoKCiBEZWxldGU6ZnVuY3Rpb24oYSxiLGMpe3Jl
dHVybiB0aGlzLnJlcXVlc3QoYSxiLGMsdGhpcy5ERUxFVEUpfQp9KTsKCiB3aW5kb3cuSFRUUD1u
ZXcgSFRUUENsYXNzKCk7Cn0pOwoKemVuLmFwaSgnSW5wdXRUZXh0JyxmdW5jdGlvbigpewogemVu
LnJlcXVpcmUoJ3hFbGVtZW50Jyk7CgoKIHdpbmRvdy5JbnB1dFRleHQ9T2JqZWN0LmV4dGVuZCh7
fSx7CgogREVGQVVMVF9BVFRSOidkZWZhdWx0X3ZhbHVlJywKCgogREVGQVVMVF9DTjonZGVmYXVs
dF92YWx1ZScsCgoKIGVuYWJsZUFsbDpmdW5jdGlvbigpewogJEEoZG9jdW1lbnQuZ2V0RWxlbWVu
dHNCeVRhZ05hbWUoJ2lucHV0JykpLmNvbmNhdCgKICRBKGRvY3VtZW50LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCd0ZXh0YXJlYScpKQopLmVhY2goZnVuY3Rpb24oZWwpe0lucHV0VGV4dC5lbmFibGUo
ZWwpO30pOwp9LAoKCiBlbmFibGU6ZnVuY3Rpb24oZWwsdmFsdWUsc2VsZWN0T25Gb2N1cyl7CiBl
bD0kKGVsKTsKCgogaWYoZWwuX2RlZmF1bHR8fCghZWwuZ2V0QXR0cmlidXRlKElucHV0VGV4dC5E
RUZBVUxUX0FUVFIpJiYhdmFsdWUpKXsKIHJldHVybjsKfQoKIGVsLl9kZWZhdWx0PXZhbHVlfHxl
bC5nZXRBdHRyaWJ1dGUoSW5wdXRUZXh0LkRFRkFVTFRfQVRUUik7CiBjb25zb2xlLmFzc2VydChl
bC5fZGVmYXVsdCwnSW5wdXQgZmllbGQgZXhwZWN0ZWQgdG8gaGF2ZSBhIGRlZmF1bHQgdmFsdWUn
KTsKCiBlbC5fc2VsZWN0T25Gb2N1cz1zZWxlY3RPbkZvY3VzOwogT2JqZWN0LmV4dGVuZChlbCxJ
bnB1dFRleHQubWV0aG9kcyk7CgoKCiBpZihlbC50eXBlPT0ncGFzc3dvcmQnKXsKIGlmKCFQcm90
b3R5cGUuQnJvd3Nlci5JRSl7CiB2YXIgZGVsPWVsLl9kZWZhdWx0RmllbGQ9ZWwuY2xvbmVOb2Rl
KGZhbHNlKTsKfWVsc2V7CgoKIGRlbD1lbC5fZGVmYXVsdEZpZWxkPSQoZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnaW5wdXQnKSk7CgogZm9yKGF0dHIgaW4gZWwuYXR0cmlidXRlcyl7CiB0cnl7CiBp
ZihkZWwuYXR0cmlidXRlc1thdHRyLmtleV0hPSd0eXBlJyYmYXR0ci52YWx1ZSE9PXVuZGVmaW5l
ZCkKewogZGVsLmF0dHJpYnV0ZXNbYXR0ci5rZXldPWF0dHIudmFsdWU7Cn0KfQogY2F0Y2goZSl7
CgogY29uc29sZS53YXJuKCJDb3VsZCBub3Qgd3JpdGUgYXR0cmlidXRlOiAiK2F0dHIua2V5KTsK
fQp9Owp9CgogZGVsLnJlbW92ZUF0dHJpYnV0ZShJbnB1dFRleHQuREVGQVVMVF9BVFRSKTsKIGRl
bC5pZD1lbC5pZCsiX3RleHQiOwogZGVsLm5hbWU9Jyc7CiBkZWwudHlwZT0ndGV4dCc7CiBkZWwu
dmFsdWU9ZWwuX2RlZmF1bHQ7CiBkZWwuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiBkZWwuYWRkQ2xh
c3NOYW1lKElucHV0VGV4dC5ERUZBVUxUX0NOKTsKIGRlbC5vbmZvY3VzPWZ1bmN0aW9uKCl7CiBl
bC5faXRVcGRhdGUodHJ1ZSk7Cn07CiBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkZWwsZWwu
bmV4dFNpYmxpbmcpOwp9CgogZWwuX2l0VXBkYXRlKGZhbHNlKTsKCiBlbC5vYnNlcnZlKCdmb2N1
cycsZnVuY3Rpb24oKXt0aGlzLl9pdFVwZGF0ZSh0cnVlKTt9LmJpbmQoZWwpKTsKIGVsLm9ic2Vy
dmUoJ2JsdXInLGZ1bmN0aW9uKCl7dGhpcy5faXRVcGRhdGUoZmFsc2UpO30uYmluZChlbCkpOwoK
IHJldHVybiBlbDsKfSwKCiBtZXRob2RzOnsKCiByZXNldDpmdW5jdGlvbigpewogdGhpcy52YWx1
ZT10aGlzLmhhc0ZvY3VzKCk/Jyc6dGhpcy5fZGVmYXVsdDsKIHRoaXMuc2V0Q2xhc3NOYW1lKElu
cHV0VGV4dC5ERUZBVUxUX0NOLCF0aGlzLmhhc0ZvY3VzKCkpOwp9LAoKCiBkZWZhdWx0U2VsZWN0
OmZ1bmN0aW9uKCl7CiB0aGlzLmZvY3VzKCk7CiB0aGlzLnZhbHVlPXRoaXMuX2RlZmF1bHQ7CiB0
aGlzLnNlbGVjdCgpOwp9Cn0KfSk7Cn0pOwoKemVuLmFwaSgnRHJhZ1Nlc3Npb24nLGZ1bmN0aW9u
KCl7CiB6ZW4ucmVxdWlyZSgneEVsZW1lbnQnKTsKCiB3aW5kb3cuRHJhZ1Nlc3Npb249Q2xhc3Mu
Y3JlYXRlKCk7CgogRHJhZ1Nlc3Npb24uYWRkTWV0aG9kcyh7Cgogb25DbGljazpQcm90b3R5cGUu
ZW1wdHlGdW5jdGlvbiwKCgogb25TdGFydDpQcm90b3R5cGUuZW1wdHlGdW5jdGlvbiwKCgogb25N
b3ZlOlByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uLAoKCiBvblN0b3A6UHJvdG90eXBlLmVtcHR5RnVu
Y3Rpb24sCgoKIG9uQWJvcnQ6UHJvdG90eXBlLmVtcHR5RnVuY3Rpb24sCgoKIG9uRG9uZTpQcm90
b3R5cGUuZW1wdHlGdW5jdGlvbiwKCgogaW5pdGlhbGl6ZTpmdW5jdGlvbihlLGRvYyx1c2VTaGll
bGQpewogemVuLmJpbmQodGhpcywnI19oYW5kbGVFdmVudCcpOwoKIGlmKERyYWdTZXNzaW9uLmN1
cnJlbnRTZXNzaW9uKXsKCgoKIERyYWdTZXNzaW9uLmN1cnJlbnRTZXNzaW9uLmFib3J0KCk7Cn0K
CiB0aGlzLl9kb2M9ZG9jfHxkb2N1bWVudDsKIHRoaXMuX3VzZVNoaWVsZD0hIXVzZVNoaWVsZDsK
CiB0aGlzLl9oYW5kbGVFdmVudChlKTsKCgogdGhpcy5fYWN0aXZhdGUodHJ1ZSk7CgogZS5zdG9w
KCk7CgoKIERyYWdTZXNzaW9uLmN1cnJlbnRTZXNzaW9uPXRoaXM7CgoKIGlmKHRoaXMuX3VzZVNo
aWVsZCl7CiB2YXIgc2hpZWxkPSQoJ2RzX3NoaWVsZCcpOwogaWYoIXNoaWVsZCl7CiAkKHRoaXMu
X2RvYy5ib2R5KS5pbnNlcnQoe2JvdHRvbTonPGRpdiBpZD0iZHNfc2hpZWxkIj48L2Rpdj4nfSk7
CiBzaGllbGQ9JCgnZHNfc2hpZWxkJyk7Cn0KIE9iamVjdC5leHRlbmQoc2hpZWxkLnN0eWxlLHsK
IHBvc2l0aW9uOidhYnNvbHV0ZScsekluZGV4Oic5OTk5JywKIHRvcDonMHB4JyxsZWZ0OicwcHgn
LAogd2lkdGg6JzEwMCUnLGhlaWdodDonMTAwJScKfSk7Cn0KCn0sCgogX3N0b3A6ZnVuY3Rpb24o
YWJvcnQpewogRHJhZ1Nlc3Npb24uY3VycmVudFNlc3Npb249bnVsbDsKIGlmKHRoaXMuX3VzZVNo
aWVsZCl7CiBPYmplY3QuZXh0ZW5kKCQoJ2RzX3NoaWVsZCcpLnN0eWxlLHsKIHRvcDonLTIwcHgn
LGxlZnQ6Jy0yMHB4Jyx3aWR0aDonMTBweCcsaGVpZ2h0OicxMHB4Jwp9KTsKfQoKCiB0aGlzLl9h
Y3RpdmF0ZShmYWxzZSk7CgogaWYodGhpcy5fZHJhZ2dpbmcpewogaWYoYWJvcnQpewogdGhpcy5v
bkFib3J0KHRoaXMpOwp9ZWxzZXsKIHRoaXMub25TdG9wKHRoaXMpOwp9CiB0aGlzLm9uRG9uZSh0
aGlzKTsKfQp9LAoKCiBzdG9wOmZ1bmN0aW9uKCl7CiB0aGlzLl9zdG9wKCk7Cn0sCgoKIGFib3J0
OmZ1bmN0aW9uKCl7CiB0aGlzLl9zdG9wKHRydWUpOwp9Cn0pOwp9KTsKCnplbi5hcGkoJ1NjYWxl
YWJsZScsZnVuY3Rpb24oKXsKIHplbi5yZXF1aXJlKCd4TmF0aXZlJywnRG9tJyk7CgoKIHdpbmRv
dy5TY2FsZWFibGU9ewoKIF9zY2FsZWFibGVzOltdLAoKCiBSRVNJWkU6J3Jlc2l6ZShlbCknLAoK
CiBjcmVhdGU6ZnVuY3Rpb24oZWwsb3B0aW9ucyl7CiBlbD0kKGVsKTsKCgogaWYoZWwuX3NjYWxl
YWJsZU9wdGlvbnMpcmV0dXJuOwoKCiBPYnNlcnZhYmxlLmV4dGVuZChlbCk7CgoKIGVsLl9zY2Fs
ZWFibGVPcHRpb25zPU9iamVjdC5leHRlbmQoewogcGFkZGluZzowLAogc2V0TWF4OmZhbHNlLAog
bWluSGVpZ2h0OjAKfSxvcHRpb25zfHx7fSk7CiBpZihlbC5fc2NhbGVhYmxlT3B0aW9ucy5jYWxs
YmFjayl7CiB6ZW4uZGVwcmVjYXRlKCdTY2FsZWFibGUgY2FsbGJhY2sgb3B0aW9uJywnU2NhbGVh
YmxlLlJFU0laRSBldmVudCcpOwogZWwub2JzZXJ2ZShTY2FsZWFibGUuUkVTSVpFLG9wdGlvbnMu
Y2FsbGJhY2spOwp9CgoKIE9iamVjdC5leHRlbmQoZWwsU2NhbGVhYmxlLl9tZXRob2RzKTsKCgog
U2NhbGVhYmxlLl9zY2FsZWFibGVzLnB1c2goZWwpOwogZWwucmVzY2FsZSgpOwoKIHJldHVybiBl
bDsKfSwKCgogZGVzdHJveTpmdW5jdGlvbihlbGVtZW50KXsKIFNjYWxlYWJsZS5fc2NhbGVhYmxl
cz1TY2FsZWFibGUuX3NjYWxlYWJsZXMud2l0aG91dCgkKGVsZW1lbnQpKTsKfSwKCgogX21ldGhv
ZHM6ewoKIHJlc2NhbGU6ZnVuY3Rpb24oZGVsdGEpewogaWYoIXRoaXMudmlzaWJsZSgpKXJldHVy
bjsKCgogdmFyIGhlaWdodD1Eb20uZ2V0Vmlld3BvcnQoKS5oOwogaWYoaGVpZ2h0PD0wKXJldHVy
bjsKCgogdmFyIG9wdGlvbnM9dGhpcy5fc2NhbGVhYmxlT3B0aW9uczsKIGhlaWdodC09b3B0aW9u
cy5wYWRkaW5nK1Bvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcykudG9wOwoKIHZhciBwcm9w
PW9wdGlvbnMuc2V0TWF4PydtYXhIZWlnaHQnOidoZWlnaHQnOwogdmFyIGFudGlQcm9wPW9wdGlv
bnMuc2V0TWF4PydoZWlnaHQnOidtYXhIZWlnaHQnOwogdmFyIGg9JHB4KGhlaWdodCk7CgoKIGlm
KG9wdGlvbnMubWluSGVpZ2h0IT0wJiZoZWlnaHQ8b3B0aW9ucy5taW5IZWlnaHQpewogaD0kcHgo
b3B0aW9ucy5taW5IZWlnaHQpOwp9CgogaWYoaGVpZ2h0PjAmJmghPXRoaXMuc3R5bGVbcHJvcF0p
ewogdGhpcy5zdHlsZVthbnRpUHJvcF09IiI7CiB0aGlzLnN0eWxlW3Byb3BdPWg7CiB0aGlzLm5v
dGlmeShTY2FsZWFibGUuUkVTSVpFKTsKfQp9LAoKCiBzZXRPcHRpb246ZnVuY3Rpb24ob3B0aW9u
LHZhbHVlKXsKIHRoaXMuX3NjYWxlYWJsZU9wdGlvbnNbb3B0aW9uXT12YWx1ZTsKfQp9Cn0KCiBT
Y2FsZWFibGUuX3Jlc2NhbGVyPWZ1bmN0aW9uKCl7U2NhbGVhYmxlLl9zY2FsZWFibGVzLmludm9r
ZSgncmVzY2FsZScpfTsKIFNjYWxlYWJsZS5fcmVzY2FsZXIuc2V0TGF6eSgyMDAsdHJ1ZSk7Cn0p
OwoKemVuLmFwaSgnU2Nyb2xsZXInLGZ1bmN0aW9uKCl7CiB6ZW4ucmVxdWlyZSgneEVsZW1lbnQn
LCdEb20nKTsKCgoKCgoKIGlmKHplbi5pc0FjY2Vzc2libGUod2luZG93LnRvcCkpewogdG9wLnpl
bi5yZXF1aXJlKCdEcmFnU2Vzc2lvbicpOwogemVuLnByb3h5KCdEcmFnU2Vzc2lvbicpOwp9ZWxz
ZXsKIHplbi5yZXF1aXJlKCdEcmFnU2Vzc2lvbicpOwp9CgoKIHdpbmRvdy5TY3JvbGxlcj1DbGFz
cy5jcmVhdGUoKTsKIE9iamVjdC5leHRlbmQoU2Nyb2xsZXIsewoKIFVQREFURV9JTlRFUlZBTDoz
MDAKfSk7CgogU2Nyb2xsZXIuYWRkTWV0aG9kcyh7CiBzY3JvbGxBbW91bnQ6MjAsCgogaW5pdGlh
bGl6ZTpmdW5jdGlvbihlbCl7CiB6ZW4uYmluZCh0aGlzLCdfdXBkYXRlS25vYicsJ19oYW5kbGVS
ZXNpemUnKTsKCiB0aGlzLmVsPSQoZWwpOwogdGhpcy5lbC5pbnNlcnQoe3RvcDonIFwKICAgICAg
ICA8ZGl2IGNsYXNzPSJzYl90cmF5Ij4gXAogICAgICAgICAgPGRpdiBjbGFzcz0ic2JfdXAiPjwv
ZGl2PiBcCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzYl9rbm9iIj48L2Rpdj4gXAogICAgICAgICAg
PGRpdiBjbGFzcz0ic2JfZG93biI+PC9kaXY+IFwKICAgICAgICA8L2Rpdj4gXAogICAgICAgIDxk
aXYgY2xhc3M9InNjcm9sbGVyX2NvbnRlbnRfd3JhcHBlciI+PC9kaXY+XAogICAgICAnfSk7CiB0
aGlzLnRyYXk9dGhpcy5lbC5maXJzdENsYXNzKCdzYl90cmF5Jyk7CiB0aGlzLmtub2I9dGhpcy50
cmF5LmZpcnN0Q2xhc3MoJ3NiX2tub2InKTsKIHRoaXMudXA9dGhpcy50cmF5LmZpcnN0Q2xhc3Mo
J3NiX3VwJyk7CiB0aGlzLmRvd249dGhpcy50cmF5LmZpcnN0Q2xhc3MoJ3NiX2Rvd24nKTsKIHRo
aXMuY29udGVudD10aGlzLmVsLmZpcnN0Q2xhc3MoJ3Njcm9sbGVyX2NvbnRlbnQnKTsKCgoKCiB0
aGlzLnNjcm9sbENvbnRlbnRXcmFwcGVyPXRoaXMuZWwuZmlyc3RDbGFzcygnc2Nyb2xsZXJfY29u
dGVudF93cmFwcGVyJyk7CiB0aGlzLnNjcm9sbENvbnRlbnRXcmFwcGVyLmluc2VydCh7dG9wOnRo
aXMuY29udGVudC5yZW1vdmUoKX0pOwoKCgoKCiB0aGlzLmVsLnRhYkluZGV4PS0xOwoKCiB0aGlz
Lmtub2Iuc2luZ2xlTGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5faGFuZGxlRHJhZy5iaW5kKHRo
aXMpKTsKCgogdGhpcy51cC5zaW5nbGVMaXN0ZW5lcignbW91c2Vkb3duJywKIHRoaXMuX2hhbmRs
ZUFycm93LmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyxFdmVudC5LRVlfVVApKTsKIHRoaXMuZG93
bi5zaW5nbGVMaXN0ZW5lcignbW91c2Vkb3duJywKIHRoaXMuX2hhbmRsZUFycm93LmJpbmRBc0V2
ZW50TGlzdGVuZXIodGhpcyxFdmVudC5LRVlfRE9XTikpOwoKCiB0aGlzLnRyYXkuc2luZ2xlTGlz
dGVuZXIoJ2NsaWNrJyx0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpKTsKCgogRG9tLm9ic2Vy
dmVNb3VzZVdoZWVsKHRoaXMuZWwsdGhpcy5faGFuZGxlTW91c2VXaGVlbC5iaW5kKHRoaXMpKTsK
CgoKIHRoaXMua2V5TGlzdGVuZXI9dGhpcy5faGFuZGxlS2V5LmJpbmQodGhpcyk7CiB0aGlzLmVs
Lm9ic2VydmUoUHJvdG90eXBlLkJyb3dzZXIuSUU/J2tleXVwJzona2V5cHJlc3MnLHRoaXMua2V5
TGlzdGVuZXIpOwoKCgogdGhpcy5faGFuZGxlUmVzaXplLnNldExhenkoU2Nyb2xsZXIuVVBEQVRF
X0lOVEVSVkFMLHRydWUpOwp9LAoKIF9oYW5kbGVLZXk6ZnVuY3Rpb24oZSl7CiB2YXIgc3RlcDsK
IGU9ZXx8ZXZlbnQ7CiBzd2l0Y2goZS5rZXlDb2RlKXsKIGNhc2UgRXZlbnQuS0VZX0RPV046CiB0
aGlzLnNjcm9sbEJ5KHRoaXMuc2Nyb2xsQW1vdW50KTticmVhazsKIGNhc2UgRXZlbnQuS0VZX1VQ
OgogdGhpcy5zY3JvbGxCeSgtdGhpcy5zY3JvbGxBbW91bnQpO2JyZWFrOwogY2FzZSBFdmVudC5L
RVlfUEFHRURPV046CiB0aGlzLnNjcm9sbEJ5KHRoaXMucGFnZUFtb3VudCk7YnJlYWs7CiBjYXNl
IEV2ZW50LktFWV9QQUdFVVA6CiB0aGlzLnNjcm9sbEJ5KC10aGlzLnBhZ2VBbW91bnQpO2JyZWFr
OwogY2FzZSBFdmVudC5LRVlfSE9NRToKIHRoaXMuc2V0U2Nyb2xsUmF0aW8oMCk7YnJlYWs7CiBj
YXNlIEV2ZW50LktFWV9FTkQ6CiB0aGlzLnNldFNjcm9sbFJhdGlvKDEpO2JyZWFrOwogZGVmYXVs
dDoKIHJldHVybjsKfQogRXZlbnQuc3RvcChlKTsKfQp9KTsKfSk7CgoKemVuLnJlcXVpcmUoJ3hO
YXRpdmUnKTsKCndpbmRvdy5Nb2RlbENsYXNzTWFwcGluZz1mdW5jdGlvbigpewogdmFyIF9tYXBX
aWRnZXQ9ZnVuY3Rpb24oKXsKfTsKCgoKIHZhciBfSmF2YXNjcmlwdE1vZGVsVG9Qb29sPXsKJ0xp
c3RNb2RlbCc6J0xpc3RQb29sJywKJ0xpc3RJdGVtTW9kZWwnOidMaXN0SXRlbVBvb2wnLAonTGlu
a0xpc3QnOidMaW5rTGlzdENvbGxlY3Rpb24nLAonQ2FsZW5kYXInOidDYWxlbmRhclBvb2wnLAon
Q2FsZW5kYXJFdmVudCc6J0NhbGVuZGFyRXZlbnRQb29sJywKJ0V2ZW50SW5zdGFuY2UnOidFdmVu
dEluc3RhbmNlUG9vbCcsCidBY3Rpdml0eUZlZWRNb2RlbCc6J0FjdGl2aXR5RmVlZFBvb2wnLAon
RGlzY3Vzc2lvbk1vZGVsJzonRGlzY3Vzc2lvblBvb2wnLAonTWVkaXVtVGFnTGlzdE1vZGVsJzon
VGFnTGlzdFBvb2wnLAonTWVzc2FnZVRhZ0xpc3RNb2RlbCc6J1RhZ0xpc3RQb29sJywKJ1dpZGdl
dE1vZGVsJzonV2lkZ2V0UG9vbCcsCidMaXN0TW9kZWwnOidMaXN0UG9vbCcKfTsKCgogdmFyIF9S
dWJ5VG9KYXZhc2NyaXB0PXsKJ1RvZG9MaXN0JzonTGlzdE1vZGVsJywKJ1RvZG8nOidMaXN0SXRl
bU1vZGVsJywKJ0xpbmtMaXN0JzonTGlua0xpc3QnLAonQ2FsZW5kYXInOidDYWxlbmRhcicsCidB
Y3Rpdml0eUZlZWQnOidBY3Rpdml0eUZlZWRNb2RlbCcsCidEaXNjdXNzaW9uJzonRGlzY3Vzc2lv
bk1vZGVsJywKJ01lZGl1bVRhZ0xpc3QnOidNZWRpdW1UYWdMaXN0TW9kZWwnLAonTWVzc2FnZVRh
Z0xpc3QnOidNZXNzYWdlVGFnTGlzdE1vZGVsJywKJ1dpZGdldCc6J1dpZGdldE1vZGVsJywKJ1pl
blBhZ2UnOidaZW5QYWdlTW9kZWwnLAonRXZlbnQnOidDYWxlbmRhckV2ZW50Jwp9OwoKCiB2YXIg
X0phdmFzY3JpcHRUb1J1Ynk9e307CiBPYmplY3QuZWFjaChfUnVieVRvSmF2YXNjcmlwdCxmdW5j
dGlvbihpdGVtKXsKIF9KYXZhc2NyaXB0VG9SdWJ5W2l0ZW0udmFsdWVdPWl0ZW0ua2V5Owp9KTsK
CiBfSmF2YXNjcmlwdFBvb2xUb01vZGVsPXt9OwogT2JqZWN0LmVhY2goX0phdmFzY3JpcHRNb2Rl
bFRvUG9vbCxmdW5jdGlvbihpdGVtKXsKIF9KYXZhc2NyaXB0UG9vbFRvTW9kZWxbaXRlbS52YWx1
ZV09aXRlbS5rZXk7Cn0pOwoKIHJldHVybnsKIEphdmFzY3JpcHRNb2RlbFRvUG9vbDpfSmF2YXNj
cmlwdE1vZGVsVG9Qb29sLAogSmF2YXNjcmlwdFBvb2xUb01vZGVsOl9KYXZhc2NyaXB0UG9vbFRv
TW9kZWwsCiBKYXZhc2NyaXB0VG9SdWJ5Ol9KYXZhc2NyaXB0VG9SdWJ5LAogUnVieVRvSmF2YXNj
cmlwdDpfUnVieVRvSmF2YXNjcmlwdCwKCgoKIGZpbmRPckNyZWF0ZUNvbXBvbmVudEJ5SWRlbnRp
ZmllcjpmdW5jdGlvbihpZGVudGlmaWVyKXsKIHZhciBpZGVudGlmaWVyUGFydHM9dGhpcy5zcGxp
dElkZW50aWZpZXIoaWRlbnRpZmllcik7CiB2YXIgcG9vbD10aGlzLmdldFBvb2xGcm9tTW9kZWxD
bGFzcyhpZGVudGlmaWVyUGFydHMua2xhc3MpOwogdmFyIG9iaj10aGlzLmZpbmRDb21wb25lbnRC
eUlkZW50aWZpZXIoaWRlbnRpZmllcik7CiBpZihvYmopewogcmV0dXJuIG9iajsKfQogZWxzZXsK
IHZhciBvYmo9ZXZhbCgnbmV3ICcraWRlbnRpZmllclBhcnRzLmtsYXNzKycoe2lkOicraWRlbnRp
ZmllclBhcnRzLm9iamVjdElkKycsIF90cmFuc2llbnQ6dHJ1ZX0pJyk7CiByZXR1cm4gb2JqOwp9
Cn0sCgogc3BsaXRJZGVudGlmaWVyOmZ1bmN0aW9uKGlkZW50aWZpZXIpewogdmFyIGg9e307CiB2
YXIgcGFydHM9aWRlbnRpZmllci5zcGxpdCgnX18nKTtoLmtsYXNzPXBhcnRzWzBdO2gub2JqZWN0
SWQ9cGFydHNbMV07CiByZXR1cm4gaDsKfQoKfTsKCn0oKTsKCnplbi5hcGkoJ0pTT04nLGZ1bmN0
aW9uKCl7CiB6ZW4ucmVxdWlyZSgneE5hdGl2ZScsJ0hUVFAnKTsKCgogd2luZG93LkpTT05DbGFz
cz1DbGFzcy5jcmVhdGUoSFRUUENsYXNzLHsKIGluaXRpYWxpemU6ZnVuY3Rpb24oKXsKCiB0aGlz
Ll9oYW5kbGVycz1bXTsKIHplbi5iaW5kKHRoaXMsJ3Byb2Nlc3NEYXRhJyk7Cn0sCgoKIHJlcXVl
c3Q6ZnVuY3Rpb24oJHN1cGVyLHVybCx0b2tlbnMsb3B0aW9ucyxtZXRob2Qpewogb3B0aW9ucz1P
YmplY3QuZXh0ZW5kT3B0aW9ucyh7b25TdWNjZXNzOmZ1bmN0aW9uKGRhdGEpewogdGhpcy5wcm9j
ZXNzRGF0YShkYXRhLG9wdGlvbnMuanJwT3B0aW9ucyk7Cn0uYmluZCh0aGlzKX0sb3B0aW9ucyk7
CiAkc3VwZXIodXJsLHRva2VucyxvcHRpb25zLG1ldGhvZCk7Cn0sCgoKIGFkZEhhbmRsZXI6ZnVu
Y3Rpb24oaGFuZGxlcixzKXsKIGlmKHRoaXMuX2hhbmRsZXJzLmluZGV4T2YoaGFuZGxlcik8MCl7
CiBoYW5kbGVyLl9oYW5kbGVyTmFtZT1zfHwnYW5vbnltb3VzJzsKIHRoaXMuX2hhbmRsZXJzLnB1
c2goaGFuZGxlcik7Cn1lbHNlewogY29uc29sZS53YXJuVHJhY2UoJ0hhbmRsZXIgIicrKHN8fGhh
bmRsZXIuX2hhbmRsZXJOYW1lKSsnIiBhbHJlYWR5IHJlZ2lzdGVyZWQnKTsKfQp9LAoKCiBwcm9j
ZXNzRGF0YTpmdW5jdGlvbihkYXRhLGpycE9wdGlvbnMpewoobmV3IEpTT04uUHJvY2Vzc29yKGRh
dGEsanJwT3B0aW9ucykpLl9wcm9jZXNzKCk7Cn0KfSk7CiB3aW5kb3cuSlNPTj1uZXcgSlNPTkNs
YXNzKCk7CgoKIEpTT04uUHJvY2Vzc29yPUNsYXNzLmNyZWF0ZSh7CgogaW5pdGlhbGl6ZTpmdW5j
dGlvbihkYXRhLGpycE9wdGlvbnMpewogdGhpcy5vcHRpb25zPWpycE9wdGlvbnN8fHt9OwogdGhp
cy5kYXRhPWRhdGEucmVzcG9uc2VKU09OfHxkYXRhOwp9LAoKCiBfcHJvY2VzczpmdW5jdGlvbigp
ewoKCiB0aGlzLl9oYW5kbGVycz1KU09OLl9oYW5kbGVycy5jbG9uZSgpOwoKCgogd2hpbGUodGhp
cy5faGFuZGxlcnMubGVuZ3RoKXRoaXMucHJvY2Vzcyh0aGlzLl9oYW5kbGVyc1swXSk7Cn0sCgoK
IHByb2Nlc3M6ZnVuY3Rpb24oaGFuZGxlcil7CgogdmFyIGg9dGhpcy5faGFuZGxlcnMucmVtb3Zl
KGhhbmRsZXIpOwoKCiBpZihoKXsKIHRyeXsKIGgodGhpcyk7Cn1jYXRjaChlKXsKIHplbi5sb2dF
eGNlcHRpb24oZSk7Cn0KfQp9Cn0pOwp9KTsKCnplbi5hcGkoJ1ZpZXdTdGF0ZU9ic2VydmVyJyxm
dW5jdGlvbigpewoKIHdpbmRvdy5WaWV3U3RhdGVPYnNlcnZlcj1DbGFzcy5jcmVhdGUoKTsKCiBP
YmplY3QuZXh0ZW5kKHdpbmRvdy5WaWV3U3RhdGVPYnNlcnZlcix7Cn0pOwoKIFZpZXdTdGF0ZU9i
c2VydmVyLmFkZE1ldGhvZHMoewogaW5pdGlhbGl6ZTpmdW5jdGlvbigpewp9LAoKCiBpbnNwZWN0
QXBwbGljYXRpb246ZnVuY3Rpb24oKXsKIHZhciBoYXNoPW5ldyBIYXNoKCk7CiBoYXNoLnNldCgi
dnNfX3Zpc2libGVfZnJhbWVzW10iLFtdKTsKIGlmKHdpbmRvdy56ZW5iZUluc3RhbmNlSWQpewog
aGFzaC5zZXQoJ3plbmJlSW5zdGFuY2VJZCcsemVuYmVJbnN0YW5jZUlkKTsKfQogcmV0dXJuICQk
KCdpZnJhbWUnKS5pbmplY3QoaGFzaCxmdW5jdGlvbihoYXNoLGlmcmFtZSl7CiBpZihpZnJhbWUu
dmlzaWJsZSgpKXsKIHRyeXsKIGhhc2guZ2V0KCJ2c19fdmlzaWJsZV9mcmFtZXNbXSIpLnB1c2go
aWZyYW1lLm5hbWUpOwogaWYodHlwZW9mKHdpbmRvd1tpZnJhbWUubmFtZV0uY3VycmVudFZpZXdT
dGF0ZSk9PSdmdW5jdGlvbicpewogd2luZG93W2lmcmFtZS5uYW1lXS5jdXJyZW50Vmlld1N0YXRl
KCkuZWFjaChmdW5jdGlvbihwYWlyKXsKIGhhc2guc2V0KCJ2c19fIitpZnJhbWUubmFtZSsiX18i
K3BhaXIua2V5LHBhaXIudmFsdWUpOwp9KTsKfQp9CiBjYXRjaChlKXsKCn07Cn0KIHJldHVybiBo
YXNoOwp9KTsKfQp9KTsKCiB3aW5kb3cudmlld1N0YXRlT2JzZXJ2ZXI9bmV3IFZpZXdTdGF0ZU9i
c2VydmVyKCk7Cn0pOwoKd2luZG93LldpZGdldFJlZ2lzdHJ5PUNsYXNzLmNyZWF0ZSgpOwoKd2lu
ZG93LldpZGdldEZhY3Rvcnk9Q2xhc3MuY3JlYXRlKCk7Ck9iamVjdC5leHRlbmQod2luZG93Lldp
ZGdldEZhY3RvcnksewogX2dlbmVyYXRlV2lkZ2V0TW9kZWw6ZnVuY3Rpb24ob2JqZWN0KXsKIHJl
dHVybiBlbWJlZE1vZGVsPW5ldyBXaWRnZXRNb2RlbChvYmplY3QpOwp9LAoKCiBjcmVhdGVXaWRn
ZXQ6ZnVuY3Rpb24od2lkZ2V0TmFtZSl7CgoKCgogaWYod2lkZ2V0TmFtZT09J0xpc3RNb2RlbCcp
cmV0dXJuIE1vZGVsQ2xhc3NNYXBwaW5nLmZpbmRPckNyZWF0ZUNvbXBvbmVudEJ5SWRlbnRpZmll
cigkdW5pcXVlKHdpZGdldE5hbWUrJ19fLSMnKSk7CiByZXR1cm4gdGhpcy5fZ2VuZXJhdGVXaWRn
ZXRNb2RlbCh7J2lkJzokdW5pcXVlKCctIycpLCd3aWRnZXROYW1lJzp3aWRnZXROYW1lfSk7Cn0K
fSk7Cgp6ZW4uYXBpKCdaZW5TZXRFeHRlbnNpb25zJyxmdW5jdGlvbigpewoKIEpTVVBQb29sPXsK
CiBleHRlbmQ6ZnVuY3Rpb24oc2V0KXsKIE9iamVjdC5leHRlbmQoc2V0LEpTVVBQb29sLk1ldGhv
ZHMpOwp9LAoKIE1ldGhvZHM6ewoKIGFzc2ltaWxhdGVKU1VQOmZ1bmN0aW9uKGRhdGEsa2xhc3Ms
bm90aWZ5Q2hhbmdlcyl7CiB2YXIgbT10aGlzLmdldChkYXRhLmlkKTsKIGlmKGRhdGEuX2RlbGV0
ZSl7CgogaWYobSl0aGlzLnJlbW92ZShtKTsKIHJldHVybiBudWxsOwp9ZWxzZXsKCiBpZihtKXsK
CiBpZighIWRhdGEuaWRfbmV3KXsKIGRhdGEuaWQ9ZGF0YS5pZF9uZXc7CiBkZWxldGUgZGF0YS5p
ZF9uZXc7Cn07CiBtLnNldEFsbChkYXRhKTsKIGlmKG5vdGlmeUNoYW5nZXMpbS5ub3RpZnlDaGFu
Z2VkKCk7CiBtLmNsZWFuKGRhdGEpOwp9ZWxzZXsKIHZhciBtPW5ldyB3aW5kb3dba2xhc3NdKGRh
dGEpOwogdGhpcy5hZGQobSk7CiBtLmNsZWFuKCk7Cn07CiByZXR1cm4gbTsKfTsKfSwKCiB0b0pT
VVBQYXJhbXM6ZnVuY3Rpb24oa2V5KXsKIHZhciBkaXJ0eUpTT05BcnJheT10aGlzLmdldERpcnR5
SXRlbXMoKS5jb2xsZWN0KGZ1bmN0aW9uKGl0ZW0pewogaWYoaXRlbS5fbmV3KXsKCiB2YXIgb2Jq
PWl0ZW0udG9PYmplY3QoKTsKIG9iai5fbmV3PXRydWU7Cn1lbHNlIGlmKGl0ZW0uX2RlbGV0ZSl7
CgogaWYoaXRlbS5fZGVsZXRlKW9iaj17ImlkIjppdGVtLmlkLCJfZGVsZXRlIjp0cnVlfTsKfWVs
c2V7CgogdmFyIG9iaj1pdGVtLmdldERpcnR5U3RhdGUoKTsKIG9iai5pZD1pdGVtLmdldCgnaWQn
KTsKIG9iai5fdXBkYXRlPXRydWU7Cn07CgoKIGlmKGl0ZW0uZ2V0KCdwdWJsaWNLZXknKSlvYmou
cHVibGljS2V5PWl0ZW0uZ2V0KCdwdWJsaWNLZXknKTsKCgogaXRlbS5jbGVhbigpOwoKCiBPYmpl
Y3QuZWFjaChvYmosZnVuY3Rpb24ocCl7CiBpZihwLmtleSYmcC52YWx1ZSl7CiBvYmpbcC5rZXld
PXAudmFsdWUudW5zYWZlP3AudmFsdWUudW5zYWZlKCk6cC52YWx1ZTsKfQp9KTsKCiByZXR1cm4g
T2JqZWN0LnRvSlNPTihvYmopOwp9KTsKIHJldHVybiciJytrZXkrJyInKycgOiBbJysoZGlydHlK
U09OQXJyYXkuam9pbignLCcpKyddJyk7Cn0KfQp9OwoKIHdpbmRvdy5JbmRleGFibGVQb29sPXsK
CiBCVUlMRElOR19JTkRJQ0VTOididWlsZGluZ0luZGljZXMoKScsCiBCVUlMRElOR19JTkRJQ0VT
X0NPTVBMRVRFOididWlsZGluZ0luZGljZXNDb21wbGV0ZSgpJywKIGluZGV4aW5nOmZhbHNlLAoK
CiBleHRlbmQ6ZnVuY3Rpb24oc2V0KXsKIHplbi5yZXF1aXJlKCdaZW5TZXRJbmRleCcpOwogT2Jq
ZWN0LmV4dGVuZChzZXQsSW5kZXhhYmxlUG9vbC5NZXRob2RzKTsKfSwKCiBNZXRob2RzOnsKCiBz
ZXRJbmRleGluZzpmdW5jdGlvbihiKXsKIGI9ISFiOwogaW5kZXhpbmc9YjsKIGI/dGhpcy5ub3Rp
ZnkodGhpcy5CVUlMRElOR19JTkRJQ0VTKTp0aGlzLm5vdGlmeSh0aGlzLkJVSUxESU5HX0lORElD
RVNfQ09NUExFVEUpOwp9LAoKIGFkZEluZGV4OmZ1bmN0aW9uKG5ld0luZGV4TmFtZSxidWlsZGVy
KXsKIHRoaXMuaW5kaWNlcz10aGlzLmluZGljZXN8fHt9OwogaWYodGhpcy5pbmRpY2VzW25ld0lu
ZGV4TmFtZV0pcmV0dXJuIGZhbHNlOwogdGhpcy5pbmRpY2VzW25ld0luZGV4TmFtZV09bmV3IFpl
blNldEluZGV4KG5ld0luZGV4TmFtZSx0aGlzLGJ1aWxkZXIse30pOwp9LAoKIHJlbW92ZUluZGV4
OmZ1bmN0aW9uKGluZGV4TmFtZSl7CiB2YXIgaW5kZXg9dGhpcy5pbmRpY2VzW25ld0luZGV4TmFt
ZV07CiBpZighaW5kZXgpcmV0dXJuIGZhbHNlOwogaW5kZXguZGVzdHJveSgpOwogZGVsZXRlIHRo
aXMuaW5kaWNlc1tpbmRleE5hbWVdOwp9Cn0KfTsKCiBMb2FkYWJsZVBvb2w9ewogZXh0ZW5kOmZ1
bmN0aW9uKHNldCl7CiBPYmplY3QuZXh0ZW5kKHNldCxMb2FkYWJsZVBvb2wuTWV0aG9kcyk7Cn0s
CgogTWV0aG9kczp7CiByZWFkeTpmYWxzZSwKCiBMT0FESU5HOidsb2FkaW5nKCknLAogUkVBRFk6
J3JlYWR5KCknLAoKCiBzZXRMb2FkZWQ6ZnVuY3Rpb24oKXsKIGNvbnNvbGUubG9nKCdOb3RpZnlp
bmcgUmVhZHknKTsKIHRoaXMucmVhZHk9dHJ1ZTsKIHRoaXMubm90aWZ5KHRoaXMuUkVBRFkpOwp9
LAoKCiBzZXRMb2FkaW5nOmZ1bmN0aW9uKCl7CiB0aGlzLnJlYWR5PWZhbHNlOwogdGhpcy5ub3Rp
ZnkodGhpcy5MT0FESU5HKTsKfQp9Cn07Cn0pOwp6ZW4uYXBpKCdaZW5JdGVtRXh0ZW5zaW9ucycs
ZnVuY3Rpb24oKXsKIEpTVVBFeHRlbnNpb25zPXsKCiBzZXQ6ZnVuY3Rpb24oJHN1cGVyLGssdixx
dWlldCl7CiB0aGlzLl91cGRhdGVEaXJ0eVN0YXRlKGssdik7CiAkc3VwZXIoayx2LHF1aWV0KTsK
fSwKCiBfdXBkYXRlRGlydHlTdGF0ZTpmdW5jdGlvbihrLHYpewogdGhpcy5fZGlydHlTdGF0ZT10
aGlzLl9kaXJ0eVN0YXRlfHx7fTsKCiBpZih0aGlzLl9uZXd8fHRoaXMuX2RlbGV0ZWQpcmV0dXJu
IHRoaXM7CiBpZih0aGlzLl9jbGVhblN0YXRlJiZ0aGlzLl9jbGVhblN0YXRlW2tdJiZ0aGlzLl9j
bGVhblN0YXRlW2tdPT12KXsKIGRlbGV0ZSB0aGlzLl9kaXJ0eVN0YXRlW2tdOwogcmV0dXJuIHRo
aXM7Cn07CgogdGhpcy5fZGlydHlTdGF0ZVtrXT12OwogcmV0dXJuIHRoaXM7Cn0sCgogZ2V0RGly
dHlTdGF0ZTpmdW5jdGlvbigpewogdGhpcy5fZGlydHlTdGF0ZT10aGlzLl9kaXJ0eVN0YXRlfHx7
fTsKCiBpZighdGhpcy5fY2xlYW5TdGF0ZXx8dGhpcy5fbmV3fHx0aGlzLl9kZWxldGVkKXsKIHJl
dHVybnt9Owp9OwoKCiBPYmplY3QuZWFjaCh0aGlzLl9jbGVhblN0YXRlLGZ1bmN0aW9uKHBhaXIp
ewogaWYodGhpcy5fZGlydHlTdGF0ZVtwYWlyLmtleV09PXBhaXIudmFsdWUpewogZGVsZXRlIHRo
aXMuX2RpcnR5U3RhdGVbcGFpci5rZXldOwp9Owp9LmJpbmQodGhpcykpOwoKIHJldHVybiB0aGlz
Ll9kaXJ0eVN0YXRlOwp9LAoKIGNsZWFuOmZ1bmN0aW9uKG9iail7CgogZGVsZXRlIHRoaXMuX2Rl
bGV0ZTsKIGRlbGV0ZSB0aGlzLl9uZXc7CgogaWYoIW9ianx8IXRoaXMuX2NsZWFuU3RhdGUpewoK
IGRlbGV0ZSB0aGlzLl9kaXJ0eVN0YXRlOwogdGhpcy5fY2xlYW5TdGF0ZT10aGlzLnRvT2JqZWN0
KCk7Cn1lbHNlewoKIE9iamVjdC5lYWNoKG9iaixmdW5jdGlvbihwYWlyKXsKIGRlbGV0ZSB0aGlz
Ll9kaXJ0eVN0YXRlW3BhaXIua2V5XTsKIHRoaXMuX2NsZWFuU3RhdGVbcGFpci5rZXldPXBhaXIu
dmFsdWU7Cn0uYmluZCh0aGlzKSkKfQp9Cn07Cgp9KTsKCnplbi5yZXF1aXJlKCdIVFRQJywneE5h
dGl2ZScsJ09ic2VydmFibGUnKTsKdmFyIFVzZXI9Q2xhc3MuY3JlYXRlKCk7CgpVc2VyLmFkZE1l
dGhvZHMoewoKIGluaXRpYWxpemU6ZnVuY3Rpb24oKXsKIHRoaXMuZGF0YT17fTsKIHRoaXMubG9h
ZEluaXRpYWxEYXRhKCk7CgogaWYoIXRoaXMuZGF0YS5zY3JvbGxPcmllbnRhdGlvbiYmISF0aGlz
LmRhdGEuaWQpewogdGhpcy5kYXRhLnNjcm9sbE9yaWVudGF0aW9uPSdib3R0b21VcCc7Cn07Cgp9
LAoKIGFkZE9ic2VydmVyczpmdW5jdGlvbigpewoKfSwKCiBsb2FkSW5pdGlhbERhdGE6ZnVuY3Rp
b24oKXsKIHRoaXMuZGF0YT1ib290c3RyYXBEYXRhLmluaXRpYWxVc2VyRGF0YXx8e307Cn0sCgoK
CiBmdWxsbmFtZTpmdW5jdGlvbigpewogaWYodGhpcy5kYXRhLmZpcnN0TmFtZXx8dGhpcy5kYXRh
Lmxhc3ROYW1lKXsKIHJldHVybih0aGlzLmRhdGEuZmlyc3ROYW1lKycgJyt0aGlzLmRhdGEubGFz
dE5hbWUpLnN0cmlwKCk7Cn1lbHNlewogcmV0dXJuIHRoaXMuZGF0YS5sb2dpbjsKfTsKfSwKCn0p
OwoKVXNlci5hZGRNZXRob2RzKE9ic2VydmFibGUuTWV0aG9kcyk7Cgp3aW5kb3cuY3VycmVudF91
c2VyPW5ldyBVc2VyKCk7CndpbmRvdy5jdXJyZW50VXNlcj13aW5kb3cuY3VycmVudF91c2VyOwp6
ZW4uYXBpKCdMaXN0SXRlbU1vZGVsJyxmdW5jdGlvbigpewogemVuLnJlcXVpcmUoJ1plbkl0ZW0n
LCdaZW5JdGVtRXh0ZW5zaW9ucycsJ0pTT04nKTsKCiB3aW5kb3cuTGlzdEl0ZW1Nb2RlbD1DbGFz
cy5jcmVhdGUoWmVuSXRlbSk7CgogT2JqZWN0LmV4dGVuZChMaXN0SXRlbU1vZGVsLHsKCiBjb21w
YXJhdG9yOmZ1bmN0aW9uKGEsYil7CiBhQz1hLmlkO2JDPWIuaWQ7CiByZXR1cm4gYUM8YkM/LTE6
KGFDPmJDPzE6MCk7Cn0sCgoKCiBwb3NpdGlvbkNvbXBhcmF0b3I6ZnVuY3Rpb24oYSxiKXsKIGFD
PWEuZ2V0KCdwb3NpdGlvbicpO2JDPWIuZ2V0KCdwb3NpdGlvbicpOwogcmV0dXJuIGFDPGJDPy0x
OihhQz5iQz8xOjApOwp9Cgp9KTsKCiBMaXN0SXRlbU1vZGVsLmFkZE1ldGhvZHMoSlNVUEV4dGVu
c2lvbnMpOwogTGlzdEl0ZW1Nb2RlbC5hZGRNZXRob2RzKEFjY2Vzc29ySGVscGVycyk7Cn0pOwoK
emVuLnJlcXVpcmUoJ1plblNvcnRlZFNldCcsJ0pTT04nKTsKemVuLnJlcXVpcmUoJ0xpc3RJdGVt
TW9kZWwnLCdaZW5TZXRFeHRlbnNpb25zJyk7Cgp3aW5kb3cuTGlzdEl0ZW1Qb29sPW5ldyBaZW5T
b3J0ZWRTZXQoTGlzdEl0ZW1Nb2RlbC5jb21wYXJhdG9yLHRydWUpOwoKSlNVUFBvb2wuZXh0ZW5k
KExpc3RJdGVtUG9vbCk7CkxvYWRhYmxlUG9vbC5leHRlbmQoTGlzdEl0ZW1Qb29sKTsKCk9iamVj
dC5leHRlbmQod2luZG93Lkxpc3RJdGVtUG9vbCx7CiB3cml0ZTpmdW5jdGlvbigpewogTGlzdFBv
b2wud3JpdGUuYmluZChMaXN0UG9vbCkuc2V0TGF6eSgyNTApOwp9LAoKIGRhdGFIYW5kbGVyOmZ1
bmN0aW9uKGpycCl7Cn0sCiBzZXR1cDpmdW5jdGlvbigpewogSlNPTi5hZGRIYW5kbGVyKHRoaXMu
ZGF0YUhhbmRsZXIuYmluZCh0aGlzKSk7Cn0sCgp9KTsKCkxpc3RJdGVtUG9vbC5zZXR1cCgpOwp6
ZW4uYXBpKCdMaXN0TW9kZWwnLGZ1bmN0aW9uKCl7CiB6ZW4ucmVxdWlyZSgnWmVuSXRlbScsJ1pl
bkl0ZW1FeHRlbnNpb25zJywnWmVuU3Vic2V0JywnWmVuU29ydGVkU2V0JywnSlNPTicpOwoKIHdp
bmRvdy5MaXN0TW9kZWw9Q2xhc3MuY3JlYXRlKFplbkl0ZW0pOwoKIE9iamVjdC5leHRlbmQoTGlz
dE1vZGVsLHsKCgogQ0hBUkNPQUw6J2NoYXJjb2FsJywKIFdISVRFOid3aGl0ZScsCiBJUEhPTkU6
J2lwaG9uZScsCiBSRVNPVVJDRV9VUkxfVEVNUExBVEU6bmV3IFRlbXBsYXRlKHdpbmRvdy5sb2Nh
dGlvbi5wcm90b2NvbCsnLy8nK3dpbmRvdy5sb2NhdGlvbi5ob3N0KycvbGlzdHMvI3tpZH0je2V4
dH0/a2V5PSN7a2V5fSN7cGFyYW1zfScpLAoKCiBpZENvbXBhcmF0b3I6ZnVuY3Rpb24oYSxiKXsK
IGFDPWEuaWQ7YkM9Yi5pZDsKIHJldHVybiBhQzxiQz8tMTooYUM+YkM/MTowKTsKfSwKCiBwb3Np
dGlvbkNvbXBhcmF0b3I6ZnVuY3Rpb24oYSxiKXsKIGFDPWEuZ2V0KCdwb3NpdGlvbicpO2JDPWIu
Z2V0KCdwb3NpdGlvbicpOwogcmV0dXJuIGFDPGJDPy0xOihhQz5iQz8xOjApOwp9LAoKIGFscGhh
Q29tcGFyYXRvcjpmdW5jdGlvbihhLGIpewogYUM9KGEuZ2V0KCduYW1lJyl8fCcnKS50b0xvd2Vy
Q2FzZSgpO2JDPShiLmdldCgnbmFtZScpfHwnJykudG9Mb3dlckNhc2UoKTsKIHJldHVybiBhQzxi
Qz8tMTooYUM+YkM/MTowKTsKfQp9KTsKCiBMaXN0TW9kZWwuYWRkTWV0aG9kcyhKU1VQRXh0ZW5z
aW9ucyk7CiBMaXN0TW9kZWwuYWRkTWV0aG9kcyhBY2Nlc3NvckhlbHBlcnMpOwp9KTsKCnplbi5y
ZXF1aXJlKCdaZW5Tb3J0ZWRTZXQnLCdKU09OJyk7Cnplbi5yZXF1aXJlKCdMaXN0TW9kZWwnLCdM
aXN0SXRlbU1vZGVsJywnWmVuU2V0RXh0ZW5zaW9ucycpOwp3aW5kb3cuTGlzdFBvb2w9bmV3IFpl
blNvcnRlZFNldChMaXN0TW9kZWwucG9zaXRpb25Db21wYXJhdG9yLHRydWUpOwoKCkpTVVBQb29s
LmV4dGVuZChMaXN0UG9vbCk7CkxvYWRhYmxlUG9vbC5leHRlbmQoTGlzdFBvb2wpOwoKT2JqZWN0
LmV4dGVuZChMaXN0UG9vbCx7CiBkYXRhSGFuZGxlcjpmdW5jdGlvbihqcnApewoKIGlmKCFqcnAu
ZGF0YS5saXN0c3x8anJwLmRhdGEubGlzdHMuc2l6ZSgpPT0wKXsKIHRoaXMuc2V0TG9hZGVkKCk7
CiByZXR1cm4gZmFsc2U7Cn07CgoKIHRoaXMuc2V0TG9hZGluZygpOwoKCiB2YXIgZD1qcnAuZGF0
YS5saXN0czsKCgoKIGQudGhyZWFkZWRJdGVyYXRvcihmdW5jdGlvbihpKXsKIHRoaXMuYXNzaW1p
bGF0ZUpTVVAoaSwnTGlzdE1vZGVsJyxqcnAub3B0aW9ucy5yZXF1ZXN0U2lnbmF0dXJlIT0iTGlz
dFBvb2wud3JpdGUiKTsKfS5iaW5kKHRoaXMpLDEwLHRoaXMuc2V0TG9hZGVkLmJpbmQodGhpcykp
Owp9LAoKCgogYm9vdHN0cmFwOmZ1bmN0aW9uKGRhdGEpewogSlNPTi5wcm9jZXNzRGF0YShkYXRh
KTsKIHdpbmRvdy5BbHBoYWJldGljYWxseVNvcnRlZExpc3RzLnNldFNvdXJjZSh0aGlzKTsKfSwK
CiBzZXR1cDpmdW5jdGlvbigpewoKIEpTT04uYWRkSGFuZGxlcih0aGlzLmRhdGFIYW5kbGVyLmJp
bmQodGhpcykpOwoKCiB3aW5kb3cuQWxwaGFiZXRpY2FsbHlTb3J0ZWRMaXN0cz1uZXcgWmVuU29y
dGVkU2V0KExpc3RNb2RlbC5hbHBoYUNvbXBhcmF0b3IsdHJ1ZSk7CiBaZW5TdWJzZXQuZXh0ZW5k
KHdpbmRvdy5BbHBoYWJldGljYWxseVNvcnRlZExpc3RzKTsKIHdpbmRvdy5BbHBoYWJldGljYWxs
eVNvcnRlZExpc3RzLnNldEZpbHRlcihmdW5jdGlvbihpdGVtKXtyZXR1cm4gdHJ1ZTt9KTsKCiB0
aGlzLmJvb3RzdHJhcCh7J2xpc3RzJzp3aW5kb3cuYm9vdHN0cmFwRGF0YVsnbGlzdHMnXSwnbGlz
dEl0ZW1zJzp3aW5kb3cuYm9vdHN0cmFwRGF0YVsnbGlzdEl0ZW1zJ119KTsKCn0sCn0pOwoKTGlz
dFBvb2wuc2V0dXAoKTsKPC9zY3JpcHQ+CjwvaGVhZD4KPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27960</attachid>
            <date>2009-02-24 23:38:09 -0800</date>
            <delta_ts>2009-02-25 14:29:26 -0800</delta_ts>
            <desc>Further reduction</desc>
            <filename>reduction.html</filename>
            <type>text/html</type>
            <size>79459</size>
            <attacher name="Cameron Zwarich (cpst)">zwarich</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiPgp3aW5kb3cuYm9vdHN0cmFwRGF0YSA9IHsiaW5pdGlhbFVzZXJEYXRhIjp7InNjcm9sbE9y
aWVudGF0aW9uIjoiYm90dG9tVXAiLCJsYXN0TmFtZSI6Ilp3YXJpY2giLCJrbGFzcyI6Ikxpc3RV
c2VyIiwibG9naW4iOiJjd3p3YXJpY2giLCJzZWN1cml0eUtleSI6IkpxMUk4M2doT1hwNkV5c3ho
STBaemRYRW1JZDJhQlI1UE1LdnlKeHMiLCJ0aW1lWm9uZSI6IlVTXC9FYXN0ZXJuIiwiZmlyc3RO
YW1lIjoiQ2FtZXJvbiIsInplbnBhZ2VzTmFtZSI6ImN3endhcmljaCIsImlkIjoxMTI1NDZ9LCJs
aXN0cyI6W3sicHVibGljS2V5Ijoib29mZzYiLCJrbGFzcyI6IlRvZG9MaXN0Iiwic3VwZXJjb21w
b25lbnRJZHMiOltdLCJuYW1lIjoiQ2FtZXJvbiIsImRlbGV0ZWRBdCI6bnVsbCwic2VjdXJpdHlL
ZXkiOiIyZXlnQ3V2RkdhMXlYdG5QZHRoWHYyNkRSMUxJT0hZUkNPQXhad05PIiwic2hvd1F1aWNr
dmlldyI6dHJ1ZSwiZXhwYW5kZWQiOm51bGwsInVwZGF0ZWRBdCI6IjIwMDkvMDIvMjQgMjE6NTU6
MzcgKzAwMDAiLCJzdWJjb21wb25lbnRJZHMiOltdLCJjcmVhdGVkQXQiOiIyMDA5LzAyLzI0IDIx
OjU1OjM3ICswMDAwIiwiaWQiOjM4MzYyMCwiYXJjaGl2ZWQiOm51bGwsImF1dGhvcml6ZWRVc2Vy
cyI6W3sic2Nyb2xsT3JpZW50YXRpb24iOiJib3R0b21VcCIsImxhc3ROYW1lIjoiWndhcmljaCIs
ImtsYXNzIjoiTGlzdFVzZXIiLCJsb2dpbiI6ImN3endhcmljaCIsInNlY3VyaXR5S2V5IjoiSnEx
STgzZ2hPWHA2RXlzeGhJMFp6ZFhFbUlkMmFCUjVQTUt2eUp4cyIsInRpbWVab25lIjoiVVNcL0Vh
c3Rlcm4iLCJmaXJzdE5hbWUiOiJDYW1lcm9uIiwiemVucGFnZXNOYW1lIjoiY3d6d2FyaWNoIiwi
aWQiOjExMjU0Nn1dLCJ2ZXJzaW9uIjowLCJ1c2VySWQiOjExMjU0NiwidXBkYXRlZEJ5IjpudWxs
LCJwcm9kaWQiOm51bGwsIl9uZXciOnRydWUsIndpZGdldENvbGxhcHNlZCI6ZmFsc2UsIm93bmVy
Ijp0cnVlLCJwb3NpdGlvbiI6Miwic3RhckNvbG9yIjpudWxsfSx7InB1YmxpY0tleSI6ImVieXFs
Iiwia2xhc3MiOiJUb2RvTGlzdCIsInN1cGVyY29tcG9uZW50SWRzIjpbXSwibmFtZSI6IkJsYWgi
LCJkZWxldGVkQXQiOm51bGwsInNlY3VyaXR5S2V5IjoiZXBFc2JwOG9uZjdsR3VCTjV6REwzTGxu
SXkxdUhTRU1nc0J4NTV1QiIsInNob3dRdWlja3ZpZXciOnRydWUsImV4cGFuZGVkIjpudWxsLCJ1
cGRhdGVkQXQiOiIyMDA5LzAyLzI0IDIxOjU1OjQwICswMDAwIiwic3ViY29tcG9uZW50SWRzIjpb
XSwiY3JlYXRlZEF0IjoiMjAwOS8wMi8yNCAyMTo1NTo0MCArMDAwMCIsImlkIjozODM2MjEsImFy
Y2hpdmVkIjpudWxsLCJhdXRob3JpemVkVXNlcnMiOlt7InNjcm9sbE9yaWVudGF0aW9uIjoiYm90
dG9tVXAiLCJsYXN0TmFtZSI6Ilp3YXJpY2giLCJrbGFzcyI6Ikxpc3RVc2VyIiwibG9naW4iOiJj
d3p3YXJpY2giLCJzZWN1cml0eUtleSI6IkpxMUk4M2doT1hwNkV5c3hoSTBaemRYRW1JZDJhQlI1
UE1LdnlKeHMiLCJ0aW1lWm9uZSI6IlVTXC9FYXN0ZXJuIiwiZmlyc3ROYW1lIjoiQ2FtZXJvbiIs
InplbnBhZ2VzTmFtZSI6ImN3endhcmljaCIsImlkIjoxMTI1NDZ9XSwidmVyc2lvbiI6MCwidXNl
cklkIjoxMTI1NDYsInVwZGF0ZWRCeSI6bnVsbCwicHJvZGlkIjpudWxsLCJfbmV3Ijp0cnVlLCJ3
aWRnZXRDb2xsYXBzZWQiOmZhbHNlLCJvd25lciI6dHJ1ZSwicG9zaXRpb24iOjEsInN0YXJDb2xv
ciI6bnVsbH0seyJwdWJsaWNLZXkiOiJuYWpyZiIsImtsYXNzIjoiVG9kb0xpc3QiLCJzdXBlcmNv
bXBvbmVudElkcyI6W10sIm5hbWUiOiJUaGlzIiwiZGVsZXRlZEF0IjpudWxsLCJzZWN1cml0eUtl
eSI6Ikt3QzUwTEh4c0Z1eHZYaFpiSWRRM2xLQUlGRlU4U2l3TWJoWEtsQnoiLCJzaG93UXVpY2t2
aWV3Ijp0cnVlLCJleHBhbmRlZCI6bnVsbCwidXBkYXRlZEF0IjoiMjAwOS8wMi8yNCAyMTo1NTo0
MyArMDAwMCIsInN1YmNvbXBvbmVudElkcyI6W10sImNyZWF0ZWRBdCI6IjIwMDkvMDIvMjQgMjE6
NTU6NDMgKzAwMDAiLCJpZCI6MzgzNjIyLCJhcmNoaXZlZCI6bnVsbCwiYXV0aG9yaXplZFVzZXJz
IjpbeyJzY3JvbGxPcmllbnRhdGlvbiI6ImJvdHRvbVVwIiwibGFzdE5hbWUiOiJad2FyaWNoIiwi
a2xhc3MiOiJMaXN0VXNlciIsImxvZ2luIjoiY3d6d2FyaWNoIiwic2VjdXJpdHlLZXkiOiJKcTFJ
ODNnaE9YcDZFeXN4aEkwWnpkWEVtSWQyYUJSNVBNS3Z5SnhzIiwidGltZVpvbmUiOiJVU1wvRWFz
dGVybiIsImZpcnN0TmFtZSI6IkNhbWVyb24iLCJ6ZW5wYWdlc05hbWUiOiJjd3p3YXJpY2giLCJp
ZCI6MTEyNTQ2fV0sInZlcnNpb24iOjAsInVzZXJJZCI6MTEyNTQ2LCJ1cGRhdGVkQnkiOm51bGws
InByb2RpZCI6bnVsbCwiX25ldyI6dHJ1ZSwid2lkZ2V0Q29sbGFwc2VkIjpmYWxzZSwib3duZXIi
OnRydWUsInBvc2l0aW9uIjowLCJzdGFyQ29sb3IiOm51bGx9XX07Cgp2YXIgUHJvdG90eXBlPXsK
IFZlcnNpb246JzEuNi4wLjInLAoKIEJyb3dzZXI6ewogSUU6ISEod2luZG93LmF0dGFjaEV2ZW50
JiYhd2luZG93Lm9wZXJhKSwKIE9wZXJhOiEhd2luZG93Lm9wZXJhLAogV2ViS2l0Om5hdmlnYXRv
ci51c2VyQWdlbnQuaW5kZXhPZignQXBwbGVXZWJLaXQvJyk+LTEsCiBHZWNrbzpuYXZpZ2F0b3Iu
dXNlckFnZW50LmluZGV4T2YoJ0dlY2tvJyk+LTEmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhP
ZignS0hUTUwnKT09LTEsCiBNb2JpbGVTYWZhcmk6ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNo
KC9BcHBsZS4qTW9iaWxlLipTYWZhcmkvKQp9LAoKIEJyb3dzZXJGZWF0dXJlczp7CiBYUGF0aDoh
IWRvY3VtZW50LmV2YWx1YXRlLAogRWxlbWVudEV4dGVuc2lvbnM6ISF3aW5kb3cuSFRNTEVsZW1l
bnQsCiBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOgogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
ZGl2JykuX19wcm90b19fJiYKIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLl9fcHJvdG9f
XyE9PQogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpLl9fcHJvdG9fXwp9LAoKIFNjcmlw
dEZyYWdtZW50Oic8c2NyaXB0W14+XSo+KFtcXFNcXHNdKj8pPFwvc2NyaXB0PicsCiBKU09ORmls
dGVyOi9eXC9cKi1zZWN1cmUtKFtcc1xTXSopXCpcL1xzKiQvLAoKIGVtcHR5RnVuY3Rpb246ZnVu
Y3Rpb24oKXt9LAogSzpmdW5jdGlvbih4KXtyZXR1cm4geH0KfTsKCnZhciBDbGFzcz17CiBjcmVh
dGU6ZnVuY3Rpb24oKXsKIHZhciBwYXJlbnQ9bnVsbCxwcm9wZXJ0aWVzPSRBKGFyZ3VtZW50cyk7
CiBpZihPYmplY3QuaXNGdW5jdGlvbihwcm9wZXJ0aWVzWzBdKSkKIHBhcmVudD1wcm9wZXJ0aWVz
LnNoaWZ0KCk7CgogZnVuY3Rpb24ga2xhc3MoKXsKIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlz
LGFyZ3VtZW50cyk7Cn0KCiBPYmplY3QuZXh0ZW5kKGtsYXNzLENsYXNzLk1ldGhvZHMpOwoga2xh
c3Muc3VwZXJjbGFzcz1wYXJlbnQ7CiBrbGFzcy5zdWJjbGFzc2VzPVtdOwoKIGlmKHBhcmVudCl7
CiB2YXIgc3ViY2xhc3M9ZnVuY3Rpb24oKXt9Owogc3ViY2xhc3MucHJvdG90eXBlPXBhcmVudC5w
cm90b3R5cGU7CiBrbGFzcy5wcm90b3R5cGU9bmV3IHN1YmNsYXNzOwogcGFyZW50LnN1YmNsYXNz
ZXMucHVzaChrbGFzcyk7Cn0KCiBmb3IodmFyIGk9MDtpPHByb3BlcnRpZXMubGVuZ3RoO2krKykK
IGtsYXNzLmFkZE1ldGhvZHMocHJvcGVydGllc1tpXSk7CgogaWYoIWtsYXNzLnByb3RvdHlwZS5p
bml0aWFsaXplKQoga2xhc3MucHJvdG90eXBlLmluaXRpYWxpemU9UHJvdG90eXBlLmVtcHR5RnVu
Y3Rpb247Cgoga2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yPWtsYXNzOwoKIHJldHVybiBrbGFz
czsKfQp9OwoKQ2xhc3MuTWV0aG9kcz17CiBhZGRNZXRob2RzOmZ1bmN0aW9uKHNvdXJjZSl7CiB2
YXIgYW5jZXN0b3I9dGhpcy5zdXBlcmNsYXNzJiZ0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlOwog
dmFyIHByb3BlcnRpZXM9T2JqZWN0LmtleXMoc291cmNlKTsKCiBpZighT2JqZWN0LmtleXMoe3Rv
U3RyaW5nOnRydWV9KS5sZW5ndGgpCiBwcm9wZXJ0aWVzLnB1c2goInRvU3RyaW5nIiwidmFsdWVP
ZiIpOwoKIGZvcih2YXIgaT0wLGxlbmd0aD1wcm9wZXJ0aWVzLmxlbmd0aDtpPGxlbmd0aDtpKysp
ewogdmFyIHByb3BlcnR5PXByb3BlcnRpZXNbaV0sdmFsdWU9c291cmNlW3Byb3BlcnR5XTsKIGlm
KGFuY2VzdG9yJiZPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkmJgogdmFsdWUuYXJndW1lbnROYW1l
cygpLmZpcnN0KCk9PSIkc3VwZXIiKXsKIHZhciBtZXRob2Q9dmFsdWUsdmFsdWU9T2JqZWN0LmV4
dGVuZCgoZnVuY3Rpb24obSl7CiByZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYW5jZXN0b3JbbV0u
YXBwbHkodGhpcyxhcmd1bWVudHMpfTsKfSkocHJvcGVydHkpLndyYXAobWV0aG9kKSx7CiB2YWx1
ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIG1ldGhvZH0sCiB0b1N0cmluZzpmdW5jdGlvbigpe3JldHVy
biBtZXRob2QudG9TdHJpbmcoKX0KfSk7Cn0KIHRoaXMucHJvdG90eXBlW3Byb3BlcnR5XT12YWx1
ZTsKfQoKIHJldHVybiB0aGlzOwp9Cn07Cgp2YXIgQWJzdHJhY3Q9e307CgpPYmplY3QuZXh0ZW5k
PWZ1bmN0aW9uKGRlc3RpbmF0aW9uLHNvdXJjZSl7CiBmb3IodmFyIHByb3BlcnR5IGluIHNvdXJj
ZSkKIGRlc3RpbmF0aW9uW3Byb3BlcnR5XT1zb3VyY2VbcHJvcGVydHldOwogcmV0dXJuIGRlc3Rp
bmF0aW9uOwp9OwoKT2JqZWN0LmV4dGVuZChPYmplY3QsewogaW5zcGVjdDpmdW5jdGlvbihvYmpl
Y3Qpewp9LAoKIHRvSlNPTjpmdW5jdGlvbihvYmplY3Qpewp9LAoKIHRvUXVlcnlTdHJpbmc6ZnVu
Y3Rpb24ob2JqZWN0KXsKIHJldHVybiAkSChvYmplY3QpLnRvUXVlcnlTdHJpbmcoKTsKfSwKCiB0
b0hUTUw6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiBvYmplY3QmJm9iamVjdC50b0hUTUw/b2Jq
ZWN0LnRvSFRNTCgpOlN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsKfSwKCiBrZXlzOmZ1bmN0aW9u
KG9iamVjdCl7CiB2YXIga2V5cz1bXTsKIGZvcih2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQoga2V5
cy5wdXNoKHByb3BlcnR5KTsKIHJldHVybiBrZXlzOwp9LAoKIHZhbHVlczpmdW5jdGlvbihvYmpl
Y3QpewogdmFyIHZhbHVlcz1bXTsKIGZvcih2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQogdmFsdWVz
LnB1c2gob2JqZWN0W3Byb3BlcnR5XSk7CiByZXR1cm4gdmFsdWVzOwp9LAoKIGNsb25lOmZ1bmN0
aW9uKG9iamVjdCl7CiByZXR1cm4gT2JqZWN0LmV4dGVuZCh7fSxvYmplY3QpOwp9LAoKIGlzRWxl
bWVudDpmdW5jdGlvbihvYmplY3QpewogcmV0dXJuIG9iamVjdCYmb2JqZWN0Lm5vZGVUeXBlPT0x
Owp9LAoKIGlzQXJyYXk6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiEhKG9iamVjdCYmb2JqZWN0
LmpvaW4mJm9iamVjdC5zcGxpY2UpOwp9LAoKIGlzSGFzaDpmdW5jdGlvbihvYmplY3QpewogcmV0
dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhhc2g7Cn0sCgogaXNGdW5jdGlvbjpmdW5jdGlvbihvYmpl
Y3QpewogcmV0dXJuIHR5cGVvZiBvYmplY3Q9PSJmdW5jdGlvbiI7Cn0sCgogaXNTdHJpbmc6ZnVu
Y3Rpb24ob2JqZWN0KXsKIHJldHVybiB0eXBlb2Ygb2JqZWN0PT0ic3RyaW5nIjsKfSwKCiBpc051
bWJlcjpmdW5jdGlvbihvYmplY3QpewogcmV0dXJuIHR5cGVvZiBvYmplY3Q9PSJudW1iZXIiOwp9
LAoKIGlzVW5kZWZpbmVkOmZ1bmN0aW9uKG9iamVjdCl7CiByZXR1cm4gdHlwZW9mIG9iamVjdD09
InVuZGVmaW5lZCI7Cn0KfSk7CgpPYmplY3QuZXh0ZW5kKEZ1bmN0aW9uLnByb3RvdHlwZSx7CiBh
cmd1bWVudE5hbWVzOmZ1bmN0aW9uKCl7CiB2YXIgbmFtZXM9dGhpcy50b1N0cmluZygpLm1hdGNo
KC9eW1xzXChdKmZ1bmN0aW9uW14oXSpcKCguKj8pXCkvKVsxXS5zcGxpdCgiLCIpLmludm9rZSgi
c3RyaXAiKTsKIHJldHVybiBuYW1lcy5sZW5ndGg9PTEmJiFuYW1lc1swXT9bXTpuYW1lczsKfSwK
CiBiaW5kOmZ1bmN0aW9uKCl7CiB2YXIgX19tZXRob2Q9dGhpcyxvYmplY3Q9YXJndW1lbnRzWzBd
OwogaWYoYXJndW1lbnRzLmxlbmd0aDwyKXsKIHJldHVybiFvYmplY3Q/dGhpczpmdW5jdGlvbigp
ewogcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9iamVjdCxhcmd1bWVudHMpOwp9Cn0KIHZhciBhcmdz
PSRBKGFyZ3VtZW50cyk7CiBhcmdzLnNoaWZ0KCk7CiByZXR1cm4gZnVuY3Rpb24oKXsKIHJldHVy
biBfX21ldGhvZC5hcHBseShvYmplY3QsYXJncy5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwp9Cn0s
CgogYmluZEFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbigpewp9LAoKIGN1cnJ5OmZ1bmN0aW9uKCl7
CiBpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpczsKIHZhciBfX21ldGhvZD10aGlzLGFy
Z3M9JEEoYXJndW1lbnRzKTsKIHJldHVybiBmdW5jdGlvbigpewogcmV0dXJuIF9fbWV0aG9kLmFw
cGx5KHRoaXMsYXJncy5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwp9Cn0sCgogZGVsYXk6ZnVuY3Rp
b24oKXsKfSwKCiB3cmFwOmZ1bmN0aW9uKHdyYXBwZXIpewogdmFyIF9fbWV0aG9kPXRoaXM7CiBy
ZXR1cm4gZnVuY3Rpb24oKXsKIHJldHVybiB3cmFwcGVyLmFwcGx5KHRoaXMsW19fbWV0aG9kLmJp
bmQodGhpcyldLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7Cn0KfSwKCiBtZXRob2RpemU6ZnVuY3Rp
b24oKXsKfQp9KTsKCnZhciBUcnk9ewogdGhlc2U6ZnVuY3Rpb24oKXsKIHZhciByZXR1cm5WYWx1
ZTsKCiBmb3IodmFyIGk9MCxsZW5ndGg9YXJndW1lbnRzLmxlbmd0aDtpPGxlbmd0aDtpKyspewog
dmFyIGxhbWJkYT1hcmd1bWVudHNbaV07CiB0cnl7CiByZXR1cm5WYWx1ZT1sYW1iZGEoKTsKIGJy
ZWFrOwp9Y2F0Y2goZSl7fQp9CgogcmV0dXJuIHJldHVyblZhbHVlOwp9Cn07CgpSZWdFeHAucHJv
dG90eXBlLm1hdGNoPVJlZ0V4cC5wcm90b3R5cGUudGVzdDsKClJlZ0V4cC5lc2NhcGU9ZnVuY3Rp
b24oc3RyKXsKIHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xd
XC9cXF0pL2csJ1xcJDEnKTsKfTsKCgoKdmFyIFBlcmlvZGljYWxFeGVjdXRlcj1DbGFzcy5jcmVh
dGUoewogc3RvcDpmdW5jdGlvbigpewogaWYoIXRoaXMudGltZXIpcmV0dXJuOwogY2xlYXJJbnRl
cnZhbCh0aGlzLnRpbWVyKTsKIHRoaXMudGltZXI9bnVsbDsKfSwKCiBvblRpbWVyRXZlbnQ6ZnVu
Y3Rpb24oKXsKIGlmKCF0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyl7CiB0cnl7CiB0aGlzLmN1cnJl
bnRseUV4ZWN1dGluZz10cnVlOwogdGhpcy5leGVjdXRlKCk7Cn1maW5hbGx5ewogdGhpcy5jdXJy
ZW50bHlFeGVjdXRpbmc9ZmFsc2U7Cn0KfQp9Cn0pOwpPYmplY3QuZXh0ZW5kKFN0cmluZyx7CiBp
bnRlcnByZXQ6ZnVuY3Rpb24odmFsdWUpewogcmV0dXJuIHZhbHVlPT1udWxsPycnOlN0cmluZyh2
YWx1ZSk7Cn0sCiBzcGVjaWFsQ2hhcjp7CidcYic6J1xcYicsCidcdCc6J1xcdCcsCidcbic6J1xc
bicsCidcZic6J1xcZicsCidccic6J1xccicsCidcXCc6J1xcXFwnCn0KfSk7CgpPYmplY3QuZXh0
ZW5kKFN0cmluZy5wcm90b3R5cGUsewogZ3N1YjpmdW5jdGlvbihwYXR0ZXJuLHJlcGxhY2VtZW50
KXsKIHZhciByZXN1bHQ9Jycsc291cmNlPXRoaXMsbWF0Y2g7CiByZXBsYWNlbWVudD1hcmd1bWVu
dHMuY2FsbGVlLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7Cgogd2hpbGUoc291cmNl
Lmxlbmd0aD4wKXsKIGlmKG1hdGNoPXNvdXJjZS5tYXRjaChwYXR0ZXJuKSl7CiByZXN1bHQrPXNv
dXJjZS5zbGljZSgwLG1hdGNoLmluZGV4KTsKIHJlc3VsdCs9U3RyaW5nLmludGVycHJldChyZXBs
YWNlbWVudChtYXRjaCkpOwogc291cmNlPXNvdXJjZS5zbGljZShtYXRjaC5pbmRleCttYXRjaFsw
XS5sZW5ndGgpOwp9ZWxzZXsKIHJlc3VsdCs9c291cmNlLHNvdXJjZT0nJzsKfQp9CiByZXR1cm4g
cmVzdWx0Owp9LAoKIHN1YjpmdW5jdGlvbihwYXR0ZXJuLHJlcGxhY2VtZW50LGNvdW50KXsKIHJl
cGxhY2VtZW50PXRoaXMuZ3N1Yi5wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpOwogY291
bnQ9T2JqZWN0LmlzVW5kZWZpbmVkKGNvdW50KT8xOmNvdW50OwoKIHJldHVybiB0aGlzLmdzdWIo
cGF0dGVybixmdW5jdGlvbihtYXRjaCl7CiBpZigtLWNvdW50PDApcmV0dXJuIG1hdGNoWzBdOwog
cmV0dXJuIHJlcGxhY2VtZW50KG1hdGNoKTsKfSk7Cn0sCgogc2NhbjpmdW5jdGlvbihwYXR0ZXJu
LGl0ZXJhdG9yKXsKIHRoaXMuZ3N1YihwYXR0ZXJuLGl0ZXJhdG9yKTsKIHJldHVybiBTdHJpbmco
dGhpcyk7Cn0sCgogdHJ1bmNhdGU6ZnVuY3Rpb24obGVuZ3RoLHRydW5jYXRpb24pewogbGVuZ3Ro
PWxlbmd0aHx8MzA7CiB0cnVuY2F0aW9uPU9iamVjdC5pc1VuZGVmaW5lZCh0cnVuY2F0aW9uKT8n
Li4uJzp0cnVuY2F0aW9uOwogcmV0dXJuIHRoaXMubGVuZ3RoPmxlbmd0aD8KIHRoaXMuc2xpY2Uo
MCxsZW5ndGgtdHJ1bmNhdGlvbi5sZW5ndGgpK3RydW5jYXRpb246U3RyaW5nKHRoaXMpOwp9LAoK
IHN0cmlwOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrLywnJykucmVwbGFj
ZSgvXHMrJC8sJycpOwp9LAoKIHN0cmlwVGFnczpmdW5jdGlvbigpewp9LAoKIHN0cmlwU2NyaXB0
czpmdW5jdGlvbigpewp9LAoKIGV4dHJhY3RTY3JpcHRzOmZ1bmN0aW9uKCl7Cn0sCgogZXZhbFNj
cmlwdHM6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGZ1bmN0
aW9uKHNjcmlwdCl7cmV0dXJuIGV2YWwoc2NyaXB0KX0pOwp9LAoKIGVzY2FwZUhUTUw6ZnVuY3Rp
b24oKXsKIHZhciBzZWxmPWFyZ3VtZW50cy5jYWxsZWU7CiBzZWxmLnRleHQuZGF0YT10aGlzOwog
cmV0dXJuIHNlbGYuZGl2LmlubmVySFRNTDsKfSwKCiB0b0FycmF5OmZ1bmN0aW9uKCl7CiByZXR1
cm4gdGhpcy5zcGxpdCgnJyk7Cn0sCgogc3VjYzpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuc2xp
Y2UoMCx0aGlzLmxlbmd0aC0xKSsKIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jaGFyQ29kZUF0
KHRoaXMubGVuZ3RoLTEpKzEpOwp9LAoKIHRpbWVzOmZ1bmN0aW9uKGNvdW50KXsKIHJldHVybiBj
b3VudDwxPycnOm5ldyBBcnJheShjb3VudCsxKS5qb2luKHRoaXMpOwp9LAoKIGNhbWVsaXplOmZ1
bmN0aW9uKCl7CiB2YXIgcGFydHM9dGhpcy5zcGxpdCgnLScpLGxlbj1wYXJ0cy5sZW5ndGg7CiBp
ZihsZW49PTEpcmV0dXJuIHBhcnRzWzBdOwoKIHZhciBjYW1lbGl6ZWQ9dGhpcy5jaGFyQXQoMCk9
PSctJwo/cGFydHNbMF0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrcGFydHNbMF0uc3Vic3RyaW5n
KDEpCjpwYXJ0c1swXTsKCiBmb3IodmFyIGk9MTtpPGxlbjtpKyspCiBjYW1lbGl6ZWQrPXBhcnRz
W2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3BhcnRzW2ldLnN1YnN0cmluZygxKTsKCiByZXR1
cm4gY2FtZWxpemVkOwp9LAoKIGNhcGl0YWxpemU6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLmNo
YXJBdCgwKS50b1VwcGVyQ2FzZSgpK3RoaXMuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7Cn0s
CgogdW5kZXJzY29yZTpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuZ3N1YigvOjovLCcvJykuZ3N1
YigvKFtBLVpdKykoW0EtWl1bYS16XSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8oW2EtelxkXSkoW0Et
Wl0pLywnI3sxfV8jezJ9JykuZ3N1YigvLS8sJ18nKS50b0xvd2VyQ2FzZSgpOwp9LAoKIGRhc2hl
cml6ZTpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuZ3N1YigvXy8sJy0nKTsKfSwKCiBpbnNwZWN0
OmZ1bmN0aW9uKHVzZURvdWJsZVF1b3Rlcyl7CiB2YXIgZXNjYXBlZFN0cmluZz10aGlzLmdzdWIo
L1tceDAwLVx4MWZcXF0vLGZ1bmN0aW9uKG1hdGNoKXsKIHZhciBjaGFyYWN0ZXI9U3RyaW5nLnNw
ZWNpYWxDaGFyW21hdGNoWzBdXTsKIHJldHVybiBjaGFyYWN0ZXI/Y2hhcmFjdGVyOidcXHUwMCcr
bWF0Y2hbMF0uY2hhckNvZGVBdCgpLnRvUGFkZGVkU3RyaW5nKDIsMTYpOwp9KTsKIGlmKHVzZURv
dWJsZVF1b3RlcylyZXR1cm4nIicrZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8iL2csJ1xcIicpKyci
JzsKIHJldHVybiInIitlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLycvZywnXFxcJycpKyInIjsKfSwK
CiB0b0pTT046ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLmluc3BlY3QodHJ1ZSk7Cn0sCgogdW5m
aWx0ZXJKU09OOmZ1bmN0aW9uKGZpbHRlcil7CiByZXR1cm4gdGhpcy5zdWIoZmlsdGVyfHxQcm90
b3R5cGUuSlNPTkZpbHRlciwnI3sxfScpOwp9LAoKIGlzSlNPTjpmdW5jdGlvbigpewogdmFyIHN0
cj10aGlzOwogaWYoc3RyLmJsYW5rKCkpcmV0dXJuIGZhbHNlOwogc3RyPXRoaXMucmVwbGFjZSgv
XFwuL2csJ0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoiL2csJycpOwogcmV0dXJuKC9eWyw6e31c
W1xdMC05LlwtK0VhZWZsbnItdSBcblxyXHRdKiQvKS50ZXN0KHN0cik7Cn0sCgogZXZhbEpTT046
ZnVuY3Rpb24oc2FuaXRpemUpewogdmFyIGpzb249dGhpcy51bmZpbHRlckpTT04oKTsKIHRyeXsK
IGlmKCFzYW5pdGl6ZXx8anNvbi5pc0pTT04oKSlyZXR1cm4gZXZhbCgnKCcranNvbisnKScpOwp9
Y2F0Y2goZSl7fQogdGhyb3cgbmV3IFN5bnRheEVycm9yKCdCYWRseSBmb3JtZWQgSlNPTiBzdHJp
bmc6ICcrdGhpcy5pbnNwZWN0KCkpOwp9LAoKIGluY2x1ZGU6ZnVuY3Rpb24ocGF0dGVybil7CiBy
ZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRlcm4pPi0xOwp9LAoKIHN0YXJ0c1dpdGg6ZnVuY3Rpb24o
cGF0dGVybil7CiByZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRlcm4pPT09MDsKfSwKCiBlbmRzV2l0
aDpmdW5jdGlvbihwYXR0ZXJuKXsKIHZhciBkPXRoaXMubGVuZ3RoLXBhdHRlcm4ubGVuZ3RoOwog
cmV0dXJuIGQ+PTAmJnRoaXMubGFzdEluZGV4T2YocGF0dGVybik9PT1kOwp9LAoKIGVtcHR5OmZ1
bmN0aW9uKCl7CiByZXR1cm4gdGhpcz09Jyc7Cn0sCgogYmxhbms6ZnVuY3Rpb24oKXsKIHJldHVy
bi9eXHMqJC8udGVzdCh0aGlzKTsKfSwKCiBpbnRlcnBvbGF0ZTpmdW5jdGlvbihvYmplY3QscGF0
dGVybil7CiByZXR1cm4gbmV3IFRlbXBsYXRlKHRoaXMscGF0dGVybikuZXZhbHVhdGUob2JqZWN0
KTsKfQp9KTsKCmlmKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdHx8UHJvdG90eXBlLkJyb3dzZXIu
SUUpT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLHsKIGVzY2FwZUhUTUw6ZnVuY3Rpb24o
KXsKIHJldHVybiB0aGlzLnJlcGxhY2UoLyYvZywnJmFtcDsnKS5yZXBsYWNlKC88L2csJyZsdDsn
KS5yZXBsYWNlKC8+L2csJyZndDsnKTsKfSwKIHVuZXNjYXBlSFRNTDpmdW5jdGlvbigpewogcmV0
dXJuIHRoaXMucmVwbGFjZSgvJmFtcDsvZywnJicpLnJlcGxhY2UoLyZsdDsvZywnPCcpLnJlcGxh
Y2UoLyZndDsvZywnPicpOwp9Cn0pOwoKU3RyaW5nLnByb3RvdHlwZS5nc3ViLnByZXBhcmVSZXBs
YWNlbWVudD1mdW5jdGlvbihyZXBsYWNlbWVudCl7CiBpZihPYmplY3QuaXNGdW5jdGlvbihyZXBs
YWNlbWVudCkpcmV0dXJuIHJlcGxhY2VtZW50OwogdmFyIHRlbXBsYXRlPW5ldyBUZW1wbGF0ZShy
ZXBsYWNlbWVudCk7CiByZXR1cm4gZnVuY3Rpb24obWF0Y2gpe3JldHVybiB0ZW1wbGF0ZS5ldmFs
dWF0ZShtYXRjaCl9Owp9OwoKU3RyaW5nLnByb3RvdHlwZS5wYXJzZVF1ZXJ5PVN0cmluZy5wcm90
b3R5cGUudG9RdWVyeVBhcmFtczsKCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZS5lc2Nh
cGVIVE1MLHsKIGRpdjpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKIHRleHQ6ZG9jdW1l
bnQuY3JlYXRlVGV4dE5vZGUoJycpCn0pOwoKd2l0aChTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhU
TUwpZGl2LmFwcGVuZENoaWxkKHRleHQpOwoKdmFyIFRlbXBsYXRlPUNsYXNzLmNyZWF0ZSh7CiBp
bml0aWFsaXplOmZ1bmN0aW9uKHRlbXBsYXRlLHBhdHRlcm4pewogdGhpcy50ZW1wbGF0ZT10ZW1w
bGF0ZS50b1N0cmluZygpOwogdGhpcy5wYXR0ZXJuPXBhdHRlcm58fFRlbXBsYXRlLlBhdHRlcm47
Cn0sCgogZXZhbHVhdGU6ZnVuY3Rpb24ob2JqZWN0KXsKIGlmKE9iamVjdC5pc0Z1bmN0aW9uKG9i
amVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKSkKIG9iamVjdD1vYmplY3QudG9UZW1wbGF0ZVJl
cGxhY2VtZW50cygpOwoKIHJldHVybiB0aGlzLnRlbXBsYXRlLmdzdWIodGhpcy5wYXR0ZXJuLGZ1
bmN0aW9uKG1hdGNoKXsKIGlmKG9iamVjdD09bnVsbClyZXR1cm4nJzsKCiB2YXIgYmVmb3JlPW1h
dGNoWzFdfHwnJzsKIGlmKGJlZm9yZT09J1xcJylyZXR1cm4gbWF0Y2hbMl07CgogdmFyIGN0eD1v
YmplY3QsZXhwcj1tYXRjaFszXTsKIHZhciBwYXR0ZXJuPS9eKFteLltdK3xcWygoPzouKj9bXlxc
XSk/KVxdKShcLnxcW3wkKS87CiBtYXRjaD1wYXR0ZXJuLmV4ZWMoZXhwcik7CiBpZihtYXRjaD09
bnVsbClyZXR1cm4gYmVmb3JlOwoKIHdoaWxlKG1hdGNoIT1udWxsKXsKIHZhciBjb21wPW1hdGNo
WzFdLnN0YXJ0c1dpdGgoJ1snKT9tYXRjaFsyXS5nc3ViKCdcXFxcXScsJ10nKTptYXRjaFsxXTsK
IGN0eD1jdHhbY29tcF07CiBpZihudWxsPT1jdHh8fCcnPT1tYXRjaFszXSlicmVhazsKIGV4cHI9
ZXhwci5zdWJzdHJpbmcoJ1snPT1tYXRjaFszXT9tYXRjaFsxXS5sZW5ndGg6bWF0Y2hbMF0ubGVu
Z3RoKTsKIG1hdGNoPXBhdHRlcm4uZXhlYyhleHByKTsKfQoKIHJldHVybiBiZWZvcmUrU3RyaW5n
LmludGVycHJldChjdHgpOwp9KTsKfQp9KTsKVGVtcGxhdGUuUGF0dGVybj0vKF58Lnxccnxcbiko
I1x7KC4qPylcfSkvOwoKdmFyICRicmVhaz17fTsKCnZhciBFbnVtZXJhYmxlPXsKIGVhY2g6ZnVu
Y3Rpb24oaXRlcmF0b3IsY29udGV4dCl7CiB2YXIgaW5kZXg9MDsKIGl0ZXJhdG9yPWl0ZXJhdG9y
LmJpbmQoY29udGV4dCk7CiB0cnl7CiB0aGlzLl9lYWNoKGZ1bmN0aW9uKHZhbHVlKXsKIGl0ZXJh
dG9yKHZhbHVlLGluZGV4KyspOwp9KTsKfWNhdGNoKGUpewogaWYoZSE9JGJyZWFrKXRocm93IGU7
Cn0KIHJldHVybiB0aGlzOwp9LAoKIGVhY2hTbGljZTpmdW5jdGlvbihudW1iZXIsaXRlcmF0b3Is
Y29udGV4dCl7Cn0sCgogYWxsOmZ1bmN0aW9uKGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0b3I9
aXRlcmF0b3I/aXRlcmF0b3IuYmluZChjb250ZXh0KTpQcm90b3R5cGUuSzsKIHZhciByZXN1bHQ9
dHJ1ZTsKIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiByZXN1bHQ9cmVzdWx0JiYh
IWl0ZXJhdG9yKHZhbHVlLGluZGV4KTsKIGlmKCFyZXN1bHQpdGhyb3cgJGJyZWFrOwp9KTsKIHJl
dHVybiByZXN1bHQ7Cn0sCgogYW55OmZ1bmN0aW9uKGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0
b3I9aXRlcmF0b3I/aXRlcmF0b3IuYmluZChjb250ZXh0KTpQcm90b3R5cGUuSzsKIHZhciByZXN1
bHQ9ZmFsc2U7CiB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpewogaWYocmVzdWx0PSEh
aXRlcmF0b3IodmFsdWUsaW5kZXgpKQogdGhyb3cgJGJyZWFrOwp9KTsKIHJldHVybiByZXN1bHQ7
Cn0sCgogY29sbGVjdDpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJh
dG9yP2l0ZXJhdG9yLmJpbmQoY29udGV4dCk6UHJvdG90eXBlLks7CiB2YXIgcmVzdWx0cz1bXTsK
IHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiByZXN1bHRzLnB1c2goaXRlcmF0b3Io
dmFsdWUsaW5kZXgpKTsKfSk7CiByZXR1cm4gcmVzdWx0czsKfSwKCiBkZXRlY3Q6ZnVuY3Rpb24o
aXRlcmF0b3IsY29udGV4dCl7CiBpdGVyYXRvcj1pdGVyYXRvci5iaW5kKGNvbnRleHQpOwogdmFy
IHJlc3VsdDsKIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiBpZihpdGVyYXRvcih2
YWx1ZSxpbmRleCkpewogcmVzdWx0PXZhbHVlOwogdGhyb3cgJGJyZWFrOwp9Cn0pOwogcmV0dXJu
IHJlc3VsdDsKfSwKCiBmaW5kQWxsOmZ1bmN0aW9uKGl0ZXJhdG9yLGNvbnRleHQpewogaXRlcmF0
b3I9aXRlcmF0b3IuYmluZChjb250ZXh0KTsKIHZhciByZXN1bHRzPVtdOwogdGhpcy5lYWNoKGZ1
bmN0aW9uKHZhbHVlLGluZGV4KXsKIGlmKGl0ZXJhdG9yKHZhbHVlLGluZGV4KSkKIHJlc3VsdHMu
cHVzaCh2YWx1ZSk7Cn0pOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgogZ3JlcDpmdW5jdGlvbihmaWx0
ZXIsaXRlcmF0b3IsY29udGV4dCl7Cn0sCgogaW5jbHVkZTpmdW5jdGlvbihvYmplY3QpewogaWYo
T2JqZWN0LmlzRnVuY3Rpb24odGhpcy5pbmRleE9mKSkKIGlmKHRoaXMuaW5kZXhPZihvYmplY3Qp
IT0tMSlyZXR1cm4gdHJ1ZTsKCiB2YXIgZm91bmQ9ZmFsc2U7CiB0aGlzLmVhY2goZnVuY3Rpb24o
dmFsdWUpewogaWYodmFsdWU9PW9iamVjdCl7CiBmb3VuZD10cnVlOwogdGhyb3cgJGJyZWFrOwp9
Cn0pOwogcmV0dXJuIGZvdW5kOwp9LAoKIGluR3JvdXBzT2Y6ZnVuY3Rpb24obnVtYmVyLGZpbGxX
aXRoKXsKfSwKCiBpbmplY3Q6ZnVuY3Rpb24obWVtbyxpdGVyYXRvcixjb250ZXh0KXsKfSwKCiBp
bnZva2U6ZnVuY3Rpb24obWV0aG9kKXsKIHZhciBhcmdzPSRBKGFyZ3VtZW50cykuc2xpY2UoMSk7
CiByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpewogcmV0dXJuIHZhbHVlW21ldGhvZF0u
YXBwbHkodmFsdWUsYXJncyk7Cn0pOwp9LAoKIG1heDpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0
KXsKfSwKCiBtaW46ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7Cn0sCgogcGFydGl0aW9uOmZ1
bmN0aW9uKGl0ZXJhdG9yLGNvbnRleHQpewp9LAoKIHBsdWNrOmZ1bmN0aW9uKHByb3BlcnR5KXsK
fSwKCiByZWplY3Q6ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7Cn0sCgogc29ydEJ5OmZ1bmN0
aW9uKGl0ZXJhdG9yLGNvbnRleHQpewp9LAoKIHRvQXJyYXk6ZnVuY3Rpb24oKXsKIHJldHVybiB0
aGlzLm1hcCgpOwp9LAoKIHppcDpmdW5jdGlvbigpewogdmFyIGl0ZXJhdG9yPVByb3RvdHlwZS5L
LGFyZ3M9JEEoYXJndW1lbnRzKTsKIGlmKE9iamVjdC5pc0Z1bmN0aW9uKGFyZ3MubGFzdCgpKSkK
IGl0ZXJhdG9yPWFyZ3MucG9wKCk7CgogdmFyIGNvbGxlY3Rpb25zPVt0aGlzXS5jb25jYXQoYXJn
cykubWFwKCRBKTsKIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiByZXR1
cm4gaXRlcmF0b3IoY29sbGVjdGlvbnMucGx1Y2soaW5kZXgpKTsKfSk7Cn0sCgogc2l6ZTpmdW5j
dGlvbigpewogcmV0dXJuIHRoaXMudG9BcnJheSgpLmxlbmd0aDsKfSwKCiBpbnNwZWN0OmZ1bmN0
aW9uKCl7CiByZXR1cm4nIzxFbnVtZXJhYmxlOicrdGhpcy50b0FycmF5KCkuaW5zcGVjdCgpKyc+
JzsKfQp9OwoKT2JqZWN0LmV4dGVuZChFbnVtZXJhYmxlLHsKIG1hcDpFbnVtZXJhYmxlLmNvbGxl
Y3QsCiBmaW5kOkVudW1lcmFibGUuZGV0ZWN0LAogc2VsZWN0OkVudW1lcmFibGUuZmluZEFsbCwK
IGZpbHRlcjpFbnVtZXJhYmxlLmZpbmRBbGwsCiBtZW1iZXI6RW51bWVyYWJsZS5pbmNsdWRlLAog
ZW50cmllczpFbnVtZXJhYmxlLnRvQXJyYXksCiBldmVyeTpFbnVtZXJhYmxlLmFsbCwKIHNvbWU6
RW51bWVyYWJsZS5hbnkKfSk7CmZ1bmN0aW9uICRBKGl0ZXJhYmxlKXsKIGlmKCFpdGVyYWJsZSly
ZXR1cm5bXTsKIGlmKGl0ZXJhYmxlLnRvQXJyYXkpcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsK
IHZhciBsZW5ndGg9aXRlcmFibGUubGVuZ3RofHwwLHJlc3VsdHM9bmV3IEFycmF5KGxlbmd0aCk7
CiB3aGlsZShsZW5ndGgtLSlyZXN1bHRzW2xlbmd0aF09aXRlcmFibGVbbGVuZ3RoXTsKIHJldHVy
biByZXN1bHRzOwp9CgppZihQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpewogJEE9ZnVuY3Rpb24o
aXRlcmFibGUpewogaWYoIWl0ZXJhYmxlKXJldHVybltdOwogaWYoIShPYmplY3QuaXNGdW5jdGlv
bihpdGVyYWJsZSkmJml0ZXJhYmxlPT0nW29iamVjdCBOb2RlTGlzdF0nKSYmCiBpdGVyYWJsZS50
b0FycmF5KXJldHVybiBpdGVyYWJsZS50b0FycmF5KCk7CiB2YXIgbGVuZ3RoPWl0ZXJhYmxlLmxl
bmd0aHx8MCxyZXN1bHRzPW5ldyBBcnJheShsZW5ndGgpOwogd2hpbGUobGVuZ3RoLS0pcmVzdWx0
c1tsZW5ndGhdPWl0ZXJhYmxlW2xlbmd0aF07CiByZXR1cm4gcmVzdWx0czsKfTsKfQoKQXJyYXku
ZnJvbT0kQTsKCk9iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLEVudW1lcmFibGUpOwoKaWYo
IUFycmF5LnByb3RvdHlwZS5fcmV2ZXJzZSlBcnJheS5wcm90b3R5cGUuX3JldmVyc2U9QXJyYXku
cHJvdG90eXBlLnJldmVyc2U7CgpPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSx7CiBfZWFj
aDpmdW5jdGlvbihpdGVyYXRvcil7CiBmb3IodmFyIGk9MCxsZW5ndGg9dGhpcy5sZW5ndGg7aTxs
ZW5ndGg7aSsrKQogaXRlcmF0b3IodGhpc1tpXSk7Cn0sCgogY2xlYXI6ZnVuY3Rpb24oKXsKIHRo
aXMubGVuZ3RoPTA7CiByZXR1cm4gdGhpczsKfSwKCiBmaXJzdDpmdW5jdGlvbigpewogcmV0dXJu
IHRoaXNbMF07Cn0sCgogbGFzdDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgt
MV07Cn0sCgogY29tcGFjdDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9u
KHZhbHVlKXsKIHJldHVybiB2YWx1ZSE9bnVsbDsKfSk7Cn0sCgogZmxhdHRlbjpmdW5jdGlvbigp
ewogcmV0dXJuIHRoaXMuaW5qZWN0KFtdLGZ1bmN0aW9uKGFycmF5LHZhbHVlKXsKIHJldHVybiBh
cnJheS5jb25jYXQoT2JqZWN0LmlzQXJyYXkodmFsdWUpPwogdmFsdWUuZmxhdHRlbigpOlt2YWx1
ZV0pOwp9KTsKfSwKCiB3aXRob3V0OmZ1bmN0aW9uKCl7CiB2YXIgdmFsdWVzPSRBKGFyZ3VtZW50
cyk7CiByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpewogcmV0dXJuIXZhbHVlcy5p
bmNsdWRlKHZhbHVlKTsKfSk7Cn0sCgogY2xvbmU6ZnVuY3Rpb24oKXsKIHJldHVybltdLmNvbmNh
dCh0aGlzKTsKfSwKCiBzaXplOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5sZW5ndGg7Cn0sCgog
aW5zcGVjdDpmdW5jdGlvbigpewogcmV0dXJuJ1snK3RoaXMubWFwKE9iamVjdC5pbnNwZWN0KS5q
b2luKCcsICcpKyddJzsKfSwKCiB0b0pTT046ZnVuY3Rpb24oKXsKIHZhciByZXN1bHRzPVtdOwog
dGhpcy5lYWNoKGZ1bmN0aW9uKG9iamVjdCl7CiB2YXIgdmFsdWU9T2JqZWN0LnRvSlNPTihvYmpl
Y3QpOwogaWYoIU9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpcmVzdWx0cy5wdXNoKHZhbHVlKTsK
fSk7CiByZXR1cm4nWycrcmVzdWx0cy5qb2luKCcsICcpKyddJzsKfQp9KTsKCgppZihPYmplY3Qu
aXNGdW5jdGlvbihBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkpCiBBcnJheS5wcm90b3R5cGUuX2Vh
Y2g9QXJyYXkucHJvdG90eXBlLmZvckVhY2g7CgppZighQXJyYXkucHJvdG90eXBlLmluZGV4T2Yp
QXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oaXRlbSxpKXsKIGl8fChpPTApOwogdmFy
IGxlbmd0aD10aGlzLmxlbmd0aDsKIGlmKGk8MClpPWxlbmd0aCtpOwogZm9yKDtpPGxlbmd0aDtp
KyspCiBpZih0aGlzW2ldPT09aXRlbSlyZXR1cm4gaTsKIHJldHVybi0xOwp9OwoKaWYoIUFycmF5
LnByb3RvdHlwZS5sYXN0SW5kZXhPZilBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rp
b24oaXRlbSxpKXsKIGk9aXNOYU4oaSk/dGhpcy5sZW5ndGg6KGk8MD90aGlzLmxlbmd0aCtpOmkp
KzE7CiB2YXIgbj10aGlzLnNsaWNlKDAsaSkucmV2ZXJzZSgpLmluZGV4T2YoaXRlbSk7CiByZXR1
cm4objwwKT9uOmktbi0xOwp9OwoKQXJyYXkucHJvdG90eXBlLnRvQXJyYXk9QXJyYXkucHJvdG90
eXBlLmNsb25lOwoKZnVuY3Rpb24gJHcoc3RyaW5nKXsKIGlmKCFPYmplY3QuaXNTdHJpbmcoc3Ry
aW5nKSlyZXR1cm5bXTsKIHN0cmluZz1zdHJpbmcuc3RyaXAoKTsKIHJldHVybiBzdHJpbmc/c3Ry
aW5nLnNwbGl0KC9ccysvKTpbXTsKfQoKaWYoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpewogQXJy
YXkucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbigpewogdmFyIGFycmF5PVtdOwogZm9yKHZhciBp
PTAsbGVuZ3RoPXRoaXMubGVuZ3RoO2k8bGVuZ3RoO2krKylhcnJheS5wdXNoKHRoaXNbaV0pOwog
Zm9yKHZhciBpPTAsbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW5ndGg7aSsrKXsKIGlmKE9i
amVjdC5pc0FycmF5KGFyZ3VtZW50c1tpXSkpewogZm9yKHZhciBqPTAsYXJyYXlMZW5ndGg9YXJn
dW1lbnRzW2ldLmxlbmd0aDtqPGFycmF5TGVuZ3RoO2orKykKIGFycmF5LnB1c2goYXJndW1lbnRz
W2ldW2pdKTsKfWVsc2V7CiBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXSk7Cn0KfQogcmV0dXJuIGFy
cmF5Owp9Owp9Ck9iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSx7CiB0b0NvbG9yUGFydDpm
dW5jdGlvbigpewogcmV0dXJuIHRoaXMudG9QYWRkZWRTdHJpbmcoMiwxNik7Cn0sCgogc3VjYzpm
dW5jdGlvbigpewogcmV0dXJuIHRoaXMrMTsKfSwKCiB0aW1lczpmdW5jdGlvbihpdGVyYXRvcil7
CiAkUigwLHRoaXMsdHJ1ZSkuZWFjaChpdGVyYXRvcik7CiByZXR1cm4gdGhpczsKfSwKCiB0b1Bh
ZGRlZFN0cmluZzpmdW5jdGlvbihsZW5ndGgscmFkaXgpewogdmFyIHN0cmluZz10aGlzLnRvU3Ry
aW5nKHJhZGl4fHwxMCk7CiByZXR1cm4nMCcudGltZXMobGVuZ3RoLXN0cmluZy5sZW5ndGgpK3N0
cmluZzsKfSwKCiB0b0pTT046ZnVuY3Rpb24oKXsKIHJldHVybiBpc0Zpbml0ZSh0aGlzKT90aGlz
LnRvU3RyaW5nKCk6J251bGwnOwp9Cn0pOwoKJHcoJ2FicyByb3VuZCBjZWlsIGZsb29yJykuZWFj
aChmdW5jdGlvbihtZXRob2QpewogTnVtYmVyLnByb3RvdHlwZVttZXRob2RdPU1hdGhbbWV0aG9k
XS5tZXRob2RpemUoKTsKfSk7CmZ1bmN0aW9uICRIKG9iamVjdCl7CiByZXR1cm4gbmV3IEhhc2go
b2JqZWN0KTsKfTsKCnZhciBIYXNoPUNsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLChmdW5jdGlvbigp
ewoKIGZ1bmN0aW9uIHRvUXVlcnlQYWlyKGtleSx2YWx1ZSl7CiBpZihPYmplY3QuaXNVbmRlZmlu
ZWQodmFsdWUpKXJldHVybiBrZXk7CiByZXR1cm4ga2V5Kyc9JytlbmNvZGVVUklDb21wb25lbnQo
U3RyaW5nLmludGVycHJldCh2YWx1ZSkpOwp9CgogcmV0dXJuewogaW5pdGlhbGl6ZTpmdW5jdGlv
bihvYmplY3QpewogdGhpcy5fb2JqZWN0PU9iamVjdC5pc0hhc2gob2JqZWN0KT9vYmplY3QudG9P
YmplY3QoKTpPYmplY3QuY2xvbmUob2JqZWN0KTsKfSwKCiBfZWFjaDpmdW5jdGlvbihpdGVyYXRv
cil7CiBmb3IodmFyIGtleSBpbiB0aGlzLl9vYmplY3QpewogdmFyIHZhbHVlPXRoaXMuX29iamVj
dFtrZXldLHBhaXI9W2tleSx2YWx1ZV07CiBwYWlyLmtleT1rZXk7CiBwYWlyLnZhbHVlPXZhbHVl
OwogaXRlcmF0b3IocGFpcik7Cn0KfSwKCiBzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVlKXsKIHJldHVy
biB0aGlzLl9vYmplY3Rba2V5XT12YWx1ZTsKfSwKCiBnZXQ6ZnVuY3Rpb24oa2V5KXsKIHJldHVy
biB0aGlzLl9vYmplY3Rba2V5XTsKfSwKCiB1bnNldDpmdW5jdGlvbihrZXkpewogdmFyIHZhbHVl
PXRoaXMuX29iamVjdFtrZXldOwogZGVsZXRlIHRoaXMuX29iamVjdFtrZXldOwogcmV0dXJuIHZh
bHVlOwp9LAoKIHRvT2JqZWN0OmZ1bmN0aW9uKCl7CiByZXR1cm4gT2JqZWN0LmNsb25lKHRoaXMu
X29iamVjdCk7Cn0sCgoga2V5czpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMucGx1Y2soJ2tleScp
Owp9LAoKIHZhbHVlczpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMucGx1Y2soJ3ZhbHVlJyk7Cn0s
CgogaW5kZXg6ZnVuY3Rpb24odmFsdWUpewogdmFyIG1hdGNoPXRoaXMuZGV0ZWN0KGZ1bmN0aW9u
KHBhaXIpewogcmV0dXJuIHBhaXIudmFsdWU9PT12YWx1ZTsKfSk7CiByZXR1cm4gbWF0Y2gmJm1h
dGNoLmtleTsKfSwKCiBtZXJnZTpmdW5jdGlvbihvYmplY3QpewogcmV0dXJuIHRoaXMuY2xvbmUo
KS51cGRhdGUob2JqZWN0KTsKfSwKCiB1cGRhdGU6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiBu
ZXcgSGFzaChvYmplY3QpLmluamVjdCh0aGlzLGZ1bmN0aW9uKHJlc3VsdCxwYWlyKXsKIHJlc3Vs
dC5zZXQocGFpci5rZXkscGFpci52YWx1ZSk7CiByZXR1cm4gcmVzdWx0Owp9KTsKfSwKCiB0b1F1
ZXJ5U3RyaW5nOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24ocGFpcil7CiB2
YXIga2V5PWVuY29kZVVSSUNvbXBvbmVudChwYWlyLmtleSksdmFsdWVzPXBhaXIudmFsdWU7Cgog
aWYodmFsdWVzJiZ0eXBlb2YgdmFsdWVzPT0nb2JqZWN0Jyl7CiBpZihPYmplY3QuaXNBcnJheSh2
YWx1ZXMpKQogcmV0dXJuIHZhbHVlcy5tYXAodG9RdWVyeVBhaXIuY3Vycnkoa2V5KSkuam9pbign
JicpOwp9CiByZXR1cm4gdG9RdWVyeVBhaXIoa2V5LHZhbHVlcyk7Cn0pLmpvaW4oJyYnKTsKfSwK
CiBpbnNwZWN0OmZ1bmN0aW9uKCl7CiByZXR1cm4nIzxIYXNoOnsnK3RoaXMubWFwKGZ1bmN0aW9u
KHBhaXIpewogcmV0dXJuIHBhaXIubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCc6ICcpOwp9KS5q
b2luKCcsICcpKyd9Pic7Cn0sCgogdG9KU09OOmZ1bmN0aW9uKCl7CiByZXR1cm4gT2JqZWN0LnRv
SlNPTih0aGlzLnRvT2JqZWN0KCkpOwp9LAoKIGNsb25lOmZ1bmN0aW9uKCl7CiByZXR1cm4gbmV3
IEhhc2godGhpcyk7Cn0KfQp9KSgpKTsKCkhhc2gucHJvdG90eXBlLnRvVGVtcGxhdGVSZXBsYWNl
bWVudHM9SGFzaC5wcm90b3R5cGUudG9PYmplY3Q7Ckhhc2guZnJvbT0kSDsKdmFyIE9iamVjdFJh
bmdlPUNsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLHsKIGluaXRpYWxpemU6ZnVuY3Rpb24oc3RhcnQs
ZW5kLGV4Y2x1c2l2ZSl7CiB0aGlzLnN0YXJ0PXN0YXJ0OwogdGhpcy5lbmQ9ZW5kOwogdGhpcy5l
eGNsdXNpdmU9ZXhjbHVzaXZlOwp9LAoKIF9lYWNoOmZ1bmN0aW9uKGl0ZXJhdG9yKXsKIHZhciB2
YWx1ZT10aGlzLnN0YXJ0Owogd2hpbGUodGhpcy5pbmNsdWRlKHZhbHVlKSl7CiBpdGVyYXRvcih2
YWx1ZSk7CiB2YWx1ZT12YWx1ZS5zdWNjKCk7Cn0KfSwKCiBpbmNsdWRlOmZ1bmN0aW9uKHZhbHVl
KXsKIGlmKHZhbHVlPHRoaXMuc3RhcnQpCiByZXR1cm4gZmFsc2U7CiBpZih0aGlzLmV4Y2x1c2l2
ZSkKIHJldHVybiB2YWx1ZTx0aGlzLmVuZDsKIHJldHVybiB2YWx1ZTw9dGhpcy5lbmQ7Cn0KfSk7
Cgp2YXIgJFI9ZnVuY3Rpb24oc3RhcnQsZW5kLGV4Y2x1c2l2ZSl7CiByZXR1cm4gbmV3IE9iamVj
dFJhbmdlKHN0YXJ0LGVuZCxleGNsdXNpdmUpOwp9OwoKdmFyIEFqYXg9ewogZ2V0VHJhbnNwb3J0
OmZ1bmN0aW9uKCl7CiByZXR1cm4gVHJ5LnRoZXNlKAogZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFhN
TEh0dHBSZXF1ZXN0KCl9LAogZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01z
eG1sMi5YTUxIVFRQJyl9LAogZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01p
Y3Jvc29mdC5YTUxIVFRQJyl9Cil8fGZhbHNlOwp9LAoKIGFjdGl2ZVJlcXVlc3RDb3VudDowCn07
CgpBamF4LlJlc3BvbmRlcnM9ewogcmVzcG9uZGVyczpbXSwKCiBfZWFjaDpmdW5jdGlvbihpdGVy
YXRvcil7CiB0aGlzLnJlc3BvbmRlcnMuX2VhY2goaXRlcmF0b3IpOwp9LAoKIHJlZ2lzdGVyOmZ1
bmN0aW9uKHJlc3BvbmRlcil7CiBpZighdGhpcy5pbmNsdWRlKHJlc3BvbmRlcikpCiB0aGlzLnJl
c3BvbmRlcnMucHVzaChyZXNwb25kZXIpOwp9LAoKIHVucmVnaXN0ZXI6ZnVuY3Rpb24ocmVzcG9u
ZGVyKXsKIHRoaXMucmVzcG9uZGVycz10aGlzLnJlc3BvbmRlcnMud2l0aG91dChyZXNwb25kZXIp
Owp9LAoKIGRpc3BhdGNoOmZ1bmN0aW9uKGNhbGxiYWNrLHJlcXVlc3QsdHJhbnNwb3J0LGpzb24p
ewogdGhpcy5lYWNoKGZ1bmN0aW9uKHJlc3BvbmRlcil7CiBpZihPYmplY3QuaXNGdW5jdGlvbihy
ZXNwb25kZXJbY2FsbGJhY2tdKSl7CiB0cnl7CiByZXNwb25kZXJbY2FsbGJhY2tdLmFwcGx5KHJl
c3BvbmRlcixbcmVxdWVzdCx0cmFuc3BvcnQsanNvbl0pOwp9Y2F0Y2goZSl7fQp9Cn0pOwp9Cn07
CgpPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycyxFbnVtZXJhYmxlKTsKCkFqYXguUmVzcG9u
ZGVycy5yZWdpc3Rlcih7CiBvbkNyZWF0ZTpmdW5jdGlvbigpe0FqYXguYWN0aXZlUmVxdWVzdENv
dW50Kyt9LAogb25Db21wbGV0ZTpmdW5jdGlvbigpe0FqYXguYWN0aXZlUmVxdWVzdENvdW50LS19
Cn0pOwoKQWpheC5CYXNlPUNsYXNzLmNyZWF0ZSh7Cn0pOwoKQWpheC5SZXF1ZXN0PUNsYXNzLmNy
ZWF0ZShBamF4LkJhc2UsewogX2NvbXBsZXRlOmZhbHNlLAoKIGluaXRpYWxpemU6ZnVuY3Rpb24o
JHN1cGVyLHVybCxvcHRpb25zKXsKICRzdXBlcihvcHRpb25zKTsKIHRoaXMudHJhbnNwb3J0PUFq
YXguZ2V0VHJhbnNwb3J0KCk7CiB0aGlzLnJlcXVlc3QodXJsKTsKfSwKCiByZXF1ZXN0OmZ1bmN0
aW9uKHVybCl7CiB0aGlzLnVybD11cmw7CiB0aGlzLm1ldGhvZD10aGlzLm9wdGlvbnMubWV0aG9k
OwogdmFyIHBhcmFtcz1PYmplY3QuY2xvbmUodGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpOwoKIGlm
KCFbJ2dldCcsJ3Bvc3QnXS5pbmNsdWRlKHRoaXMubWV0aG9kKSl7CgogcGFyYW1zWydfbWV0aG9k
J109dGhpcy5tZXRob2Q7CiB0aGlzLm1ldGhvZD0ncG9zdCc7Cn0KCiB0aGlzLnBhcmFtZXRlcnM9
cGFyYW1zOwoKIGlmKHBhcmFtcz1PYmplY3QudG9RdWVyeVN0cmluZyhwYXJhbXMpKXsKCiBpZih0
aGlzLm1ldGhvZD09J2dldCcpCiB0aGlzLnVybCs9KHRoaXMudXJsLmluY2x1ZGUoJz8nKT8nJic6
Jz8nKStwYXJhbXM7CiBlbHNlIGlmKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmln
YXRvci51c2VyQWdlbnQpKQogcGFyYW1zKz0nJl89JzsKfQoKIHRyeXsKIHZhciByZXNwb25zZT1u
ZXcgQWpheC5SZXNwb25zZSh0aGlzKTsKIGlmKHRoaXMub3B0aW9ucy5vbkNyZWF0ZSl0aGlzLm9w
dGlvbnMub25DcmVhdGUocmVzcG9uc2UpOwogQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkNy
ZWF0ZScsdGhpcyxyZXNwb25zZSk7CgogdGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm1ldGhvZC50
b1VwcGVyQ2FzZSgpLHRoaXMudXJsLAogdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyk7CgogaWYo
dGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyl0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUuYmluZCh0
aGlzKS5kZWZlcigxKTsKCiB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2U9dGhpcy5v
blN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7CiB0aGlzLnNldFJlcXVlc3RIZWFkZXJzKCk7CgogdGhp
cy5ib2R5PXRoaXMubWV0aG9kPT0ncG9zdCc/KHRoaXMub3B0aW9ucy5wb3N0Qm9keXx8cGFyYW1z
KTpudWxsOwogdGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLmJvZHkpOwoKCiBpZighdGhpcy5vcHRp
b25zLmFzeW5jaHJvbm91cyYmdGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSkKIHRoaXMu
b25TdGF0ZUNoYW5nZSgpOwoKfQogY2F0Y2goZSl7CiB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUp
Owp9Cn0sCgogb25TdGF0ZUNoYW5nZTpmdW5jdGlvbigpewogdmFyIHJlYWR5U3RhdGU9dGhpcy50
cmFuc3BvcnQucmVhZHlTdGF0ZTsKIGlmKHJlYWR5U3RhdGU+MSYmISgocmVhZHlTdGF0ZT09NCkm
JnRoaXMuX2NvbXBsZXRlKSkKIHRoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZSh0aGlzLnRyYW5zcG9y
dC5yZWFkeVN0YXRlKTsKfSwKCiBzZXRSZXF1ZXN0SGVhZGVyczpmdW5jdGlvbigpewogdmFyIGhl
YWRlcnM9ewonWC1SZXF1ZXN0ZWQtV2l0aCc6J1hNTEh0dHBSZXF1ZXN0JywKJ1gtUHJvdG90eXBl
LVZlcnNpb24nOlByb3RvdHlwZS5WZXJzaW9uLAonQWNjZXB0JzondGV4dC9qYXZhc2NyaXB0LCB0
ZXh0L2h0bWwsIGFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKicKfTsKCiBpZih0aGlzLm1l
dGhvZD09J3Bvc3QnKXsKIGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddPXRoaXMub3B0aW9ucy5jb250
ZW50VHlwZSsKKHRoaXMub3B0aW9ucy5lbmNvZGluZz8nOyBjaGFyc2V0PScrdGhpcy5vcHRpb25z
LmVuY29kaW5nOicnKTsKCgogaWYodGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSYmCihu
YXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9HZWNrb1wvKFxkezR9KS8pfHxbMCwyMDA1XSlbMV08
MjAwNSkKIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXT0nY2xvc2UnOwp9CgoKIGlmKHR5cGVvZiB0aGlz
Lm9wdGlvbnMucmVxdWVzdEhlYWRlcnM9PSdvYmplY3QnKXsKIHZhciBleHRyYXM9dGhpcy5vcHRp
b25zLnJlcXVlc3RIZWFkZXJzOwoKIGlmKE9iamVjdC5pc0Z1bmN0aW9uKGV4dHJhcy5wdXNoKSkK
IGZvcih2YXIgaT0wLGxlbmd0aD1leHRyYXMubGVuZ3RoO2k8bGVuZ3RoO2krPTIpCiBoZWFkZXJz
W2V4dHJhc1tpXV09ZXh0cmFzW2krMV07CiBlbHNlCiAkSChleHRyYXMpLmVhY2goZnVuY3Rpb24o
cGFpcil7aGVhZGVyc1twYWlyLmtleV09cGFpci52YWx1ZX0pOwp9CgogZm9yKHZhciBuYW1lIGlu
IGhlYWRlcnMpCiB0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsaGVhZGVyc1tu
YW1lXSk7Cn0sCgogc3VjY2VzczpmdW5jdGlvbigpewogdmFyIHN0YXR1cz10aGlzLmdldFN0YXR1
cygpOwogcmV0dXJuIXN0YXR1c3x8KHN0YXR1cz49MjAwJiZzdGF0dXM8MzAwKTsKfSwKCiBnZXRT
dGF0dXM6ZnVuY3Rpb24oKXsKIHRyeXsKCgoKIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdGF0dXM9
PTEyMjM/MjA0OnRoaXMudHJhbnNwb3J0LnN0YXR1c3x8MDsKfWNhdGNoKGUpe3JldHVybiAwfQp9
LAoKIHJlc3BvbmRUb1JlYWR5U3RhdGU6ZnVuY3Rpb24ocmVhZHlTdGF0ZSl7CiB2YXIgc3RhdGU9
QWpheC5SZXF1ZXN0LkV2ZW50c1tyZWFkeVN0YXRlXSxyZXNwb25zZT1uZXcgQWpheC5SZXNwb25z
ZSh0aGlzKTsKCiBpZihzdGF0ZT09J0NvbXBsZXRlJyl7CiB2YXIgc3RhcnRBdD1uZXcgRGF0ZSgp
OwogdHJ5ewogdGhpcy5fY29tcGxldGU9dHJ1ZTsKKHRoaXMub3B0aW9uc1snb24nK3Jlc3BvbnNl
LnN0YXR1c10KfHx0aGlzLm9wdGlvbnNbJ29uJysodGhpcy5zdWNjZXNzKCk/J1N1Y2Nlc3MnOidG
YWlsdXJlJyldCnx8UHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLHJlc3BvbnNlLmhl
YWRlckpTT04pOwp9Y2F0Y2goZSl7CiB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwp9ZmluYWxs
eXsKCiB2YXIgcHJvY2Vzc1RpbWU9KG5ldyBEYXRlKCktc3RhcnRBdCkvMTAwMDsKIGlmKHByb2Nl
c3NUaW1lPi41KXsKIHZhciBkdXJsPXRoaXMudXJsLnJlcGxhY2UoLy4qXC8oW14vP10qKS4qLywn
JDEnKTsKIGNvbnNvbGUud2FybignV2FybmluZyEgJytkdXJsKycgdG9vayAnK3Byb2Nlc3NUaW1l
Kycgc2Vjb25kcyB0byBwcm9jZXNzIC0gdGhpcyBtYXkgYmUgYWZmZWN0aW5nIHVzZWFiaWxpdHku
Jyk7Cn0KfQoKIHZhciBjb250ZW50VHlwZT1yZXNwb25zZS5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlw
ZScpOwogaWYodGhpcy5vcHRpb25zLmV2YWxKUz09J2ZvcmNlJwp8fCh0aGlzLm9wdGlvbnMuZXZh
bEpTJiZ0aGlzLmlzU2FtZU9yaWdpbigpJiZjb250ZW50VHlwZQomJmNvbnRlbnRUeXBlLm1hdGNo
KC9eXHMqKHRleHR8YXBwbGljYXRpb24pXC8oeC0pPyhqYXZhfGVjbWEpc2NyaXB0KDsuKik/XHMq
JC9pKSkpCiB0aGlzLmV2YWxSZXNwb25zZSgpOwp9CgogdHJ5ewoodGhpcy5vcHRpb25zWydvbicr
c3RhdGVdfHxQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikocmVzcG9uc2UscmVzcG9uc2UuaGVhZGVy
SlNPTik7CiBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uJytzdGF0ZSx0aGlzLHJlc3BvbnNl
LHJlc3BvbnNlLmhlYWRlckpTT04pOwp9Y2F0Y2goZSl7CiB0aGlzLmRpc3BhdGNoRXhjZXB0aW9u
KGUpOwp9CgogaWYoc3RhdGU9PSdDb21wbGV0ZScpewoKIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlz
dGF0ZWNoYW5nZT1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKfQp9LAoKIGlzU2FtZU9yaWdpbjpm
dW5jdGlvbigpewogdmFyIG09dGhpcy51cmwubWF0Y2goL15ccypodHRwcz86XC9cL1teXC9dKi8p
OwogcmV0dXJuIW18fChtWzBdPT0nI3twcm90b2NvbH0vLyN7ZG9tYWlufSN7cG9ydH0nLmludGVy
cG9sYXRlKHsKIHByb3RvY29sOmxvY2F0aW9uLnByb3RvY29sLAogZG9tYWluOmRvY3VtZW50LmRv
bWFpbiwKIHBvcnQ6bG9jYXRpb24ucG9ydD8nOicrbG9jYXRpb24ucG9ydDonJwp9KSk7Cn0sCgog
Z2V0SGVhZGVyOmZ1bmN0aW9uKG5hbWUpewogdHJ5ewogcmV0dXJuIHRoaXMudHJhbnNwb3J0Lmdl
dFJlc3BvbnNlSGVhZGVyKG5hbWUpfHxudWxsOwp9Y2F0Y2goZSl7cmV0dXJuIG51bGx9Cn0sCgog
ZXZhbFJlc3BvbnNlOmZ1bmN0aW9uKCl7CiB0cnl7CiByZXR1cm4gZXZhbCgodGhpcy50cmFuc3Bv
cnQucmVzcG9uc2VUZXh0fHwnJykudW5maWx0ZXJKU09OKCkpOwp9Y2F0Y2goZSl7CiB0aGlzLmRp
c3BhdGNoRXhjZXB0aW9uKGUpOwp9Cn0sCgogZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24oZXhj
ZXB0aW9uKXsKKHRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbnx8UHJvdG90eXBlLmVtcHR5RnVuY3Rp
b24pKHRoaXMsZXhjZXB0aW9uKTsKIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25FeGNlcHRp
b24nLHRoaXMsZXhjZXB0aW9uKTsKfQp9KTsKCkFqYXguUmVzcG9uc2U9Q2xhc3MuY3JlYXRlKHsK
fSk7CgpBamF4LlVwZGF0ZXI9Q2xhc3MuY3JlYXRlKEFqYXguUmVxdWVzdCx7Cn0pOwoKQWpheC5Q
ZXJpb2RpY2FsVXBkYXRlcj1DbGFzcy5jcmVhdGUoQWpheC5CYXNlLHsKfSk7CgpmdW5jdGlvbiAk
KGVsZW1lbnQpewogaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsKIGZvcih2YXIgaT0wLGVsZW1lbnRz
PVtdLGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoO2k8bGVuZ3RoO2krKykKIGVsZW1lbnRzLnB1c2go
JChhcmd1bWVudHNbaV0pKTsKIHJldHVybiBlbGVtZW50czsKfQogaWYoT2JqZWN0LmlzU3RyaW5n
KGVsZW1lbnQpKQogZWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsKIHJl
dHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KTsKfQoKaWYoIXdpbmRvdy5Ob2RlKXZhciBOb2Rl
PXt9OwoKKGZ1bmN0aW9uKCl7CiB2YXIgZWxlbWVudD10aGlzLkVsZW1lbnQ7CiB0aGlzLkVsZW1l
bnQ9ZnVuY3Rpb24odGFnTmFtZSxhdHRyaWJ1dGVzKXsKIGF0dHJpYnV0ZXM9YXR0cmlidXRlc3x8
e307CiB0YWdOYW1lPXRhZ05hbWUudG9Mb3dlckNhc2UoKTsKIHZhciBjYWNoZT1FbGVtZW50LmNh
Y2hlOwogaWYoUHJvdG90eXBlLkJyb3dzZXIuSUUmJmF0dHJpYnV0ZXMubmFtZSl7CiB0YWdOYW1l
PSc8Jyt0YWdOYW1lKycgbmFtZT0iJythdHRyaWJ1dGVzLm5hbWUrJyI+JzsKIGRlbGV0ZSBhdHRy
aWJ1dGVzLm5hbWU7CiByZXR1cm4gRWxlbWVudC53cml0ZUF0dHJpYnV0ZShkb2N1bWVudC5jcmVh
dGVFbGVtZW50KHRhZ05hbWUpLGF0dHJpYnV0ZXMpOwp9CiBpZighY2FjaGVbdGFnTmFtZV0pY2Fj
aGVbdGFnTmFtZV09RWxlbWVudC5leHRlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1l
KSk7CiByZXR1cm4gRWxlbWVudC53cml0ZUF0dHJpYnV0ZShjYWNoZVt0YWdOYW1lXS5jbG9uZU5v
ZGUoZmFsc2UpLGF0dHJpYnV0ZXMpOwp9OwogT2JqZWN0LmV4dGVuZCh0aGlzLkVsZW1lbnQsZWxl
bWVudHx8e30pOwp9KS5jYWxsKHdpbmRvdyk7CgpFbGVtZW50LmNhY2hlPXt9OwoKRWxlbWVudC5N
ZXRob2RzPXsKIGlkZW50aWZ5OmZ1bmN0aW9uKGVsZW1lbnQpewogZWxlbWVudD0kKGVsZW1lbnQp
OwogdmFyIGlkPWVsZW1lbnQucmVhZEF0dHJpYnV0ZSgnaWQnKSxzZWxmPWFyZ3VtZW50cy5jYWxs
ZWU7CiBpZihpZClyZXR1cm4gaWQ7CiBkb3tpZD0nYW5vbnltb3VzX2VsZW1lbnRfJytzZWxmLmNv
dW50ZXIrK313aGlsZSgkKGlkKSk7CiBlbGVtZW50LndyaXRlQXR0cmlidXRlKCdpZCcsaWQpOwog
cmV0dXJuIGlkOwp9LAp9OwoKRWxlbWVudC5fcmV0dXJuT2Zmc2V0PWZ1bmN0aW9uKGwsdCl7CiB2
YXIgcmVzdWx0PVtsLHRdOwogcmVzdWx0LmxlZnQ9bDsKIHJlc3VsdC50b3A9dDsKIHJldHVybiBy
ZXN1bHQ7Cn07CgpFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQ9ZnVuY3Rp
b24odGFnTmFtZSxodG1sKXsKIHZhciBkaXY9bmV3IEVsZW1lbnQoJ2RpdicpLHQ9RWxlbWVudC5f
aW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3NbdGFnTmFtZV07CiBpZih0KXsKIGRpdi5pbm5lckhU
TUw9dFswXStodG1sK3RbMV07CiB0WzJdLnRpbWVzKGZ1bmN0aW9uKCl7ZGl2PWRpdi5maXJzdENo
aWxkfSk7Cn1lbHNlIGRpdi5pbm5lckhUTUw9aHRtbDsKIHJldHVybiAkQShkaXYuY2hpbGROb2Rl
cyk7Cn07CgpFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnM9ewogYmVmb3JlOmZ1bmN0aW9u
KGVsZW1lbnQsbm9kZSl7CiBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsZWxl
bWVudCk7Cn0sCiB0b3A6ZnVuY3Rpb24oZWxlbWVudCxub2RlKXsKIGVsZW1lbnQuaW5zZXJ0QmVm
b3JlKG5vZGUsZWxlbWVudC5maXJzdENoaWxkKTsKfSwKIGJvdHRvbTpmdW5jdGlvbihlbGVtZW50
LG5vZGUpewogZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTsKfSwKIGFmdGVyOmZ1bmN0aW9uKGVs
ZW1lbnQsbm9kZSl7CiBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsZWxlbWVu
dC5uZXh0U2libGluZyk7Cn0sCiB0YWdzOnsKIFRBQkxFOlsnPHRhYmxlPicsJzwvdGFibGU+Jywx
XSwKIFRCT0RZOlsnPHRhYmxlPjx0Ym9keT4nLCc8L3Rib2R5PjwvdGFibGU+JywyXSwKIFRSOlsn
PHRhYmxlPjx0Ym9keT48dHI+JywnPC90cj48L3Rib2R5PjwvdGFibGU+JywzXSwKIFREOlsnPHRh
YmxlPjx0Ym9keT48dHI+PHRkPicsJzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+Jyw0XSwKIFNF
TEVDVDpbJzxzZWxlY3Q+JywnPC9zZWxlY3Q+JywxXQp9Cn07CgooZnVuY3Rpb24oKXsKIE9iamVj
dC5leHRlbmQodGhpcy50YWdzLHsKIFRIRUFEOnRoaXMudGFncy5UQk9EWSwKIFRGT09UOnRoaXMu
dGFncy5UQk9EWSwKIFRIOnRoaXMudGFncy5URAp9KTsKfSkuY2FsbChFbGVtZW50Ll9pbnNlcnRp
b25UcmFuc2xhdGlvbnMpOwoKRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZD17CiBoYXNBdHRyaWJ1
dGU6ZnVuY3Rpb24oZWxlbWVudCxhdHRyaWJ1dGUpewogYXR0cmlidXRlPUVsZW1lbnQuX2F0dHJp
YnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0cmlidXRlXXx8YXR0cmlidXRlOwogdmFyIG5vZGU9JChl
bGVtZW50KS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZSk7CiByZXR1cm4gbm9kZSYmbm9kZS5z
cGVjaWZpZWQ7Cn0KfTsKCkVsZW1lbnQuTWV0aG9kcy5CeVRhZz17fTsKCk9iamVjdC5leHRlbmQo
RWxlbWVudCxFbGVtZW50Lk1ldGhvZHMpOwoKaWYoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMu
RWxlbWVudEV4dGVuc2lvbnMmJgogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuX19wcm90
b19fKXsKIHdpbmRvdy5IVE1MRWxlbWVudD17fTsKIHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5
cGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuX19wcm90b19fOwogUHJvdG90eXBlLkJy
b3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucz10cnVlOwp9CgpFbGVtZW50LmV4dGVuZD0o
ZnVuY3Rpb24oKXsKIGlmKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50
RXh0ZW5zaW9ucykKIHJldHVybiBQcm90b3R5cGUuSzsKCiB2YXIgTWV0aG9kcz17fSxCeVRhZz1F
bGVtZW50Lk1ldGhvZHMuQnlUYWc7CgogdmFyIGV4dGVuZD1PYmplY3QuZXh0ZW5kKGZ1bmN0aW9u
KGVsZW1lbnQpewogaWYoIWVsZW1lbnR8fGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5cGV8fAog
ZWxlbWVudC5ub2RlVHlwZSE9MXx8ZWxlbWVudD09d2luZG93KXJldHVybiBlbGVtZW50OwoKIHZh
ciBtZXRob2RzPU9iamVjdC5jbG9uZShNZXRob2RzKSwKIHRhZ05hbWU9ZWxlbWVudC50YWdOYW1l
LHByb3BlcnR5LHZhbHVlOwoKCiBpZihCeVRhZ1t0YWdOYW1lXSlPYmplY3QuZXh0ZW5kKG1ldGhv
ZHMsQnlUYWdbdGFnTmFtZV0pOwoKIGZvcihwcm9wZXJ0eSBpbiBtZXRob2RzKXsKIHZhbHVlPW1l
dGhvZHNbcHJvcGVydHldOwogaWYoT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpJiYhKHByb3BlcnR5
IGluIGVsZW1lbnQpKQogZWxlbWVudFtwcm9wZXJ0eV09dmFsdWUubWV0aG9kaXplKCk7Cn0KCiBl
bGVtZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlPVByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwogcmV0
dXJuIGVsZW1lbnQ7Cgp9LHsKIHJlZnJlc2g6ZnVuY3Rpb24oKXsKCiBpZighUHJvdG90eXBlLkJy
b3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucyl7CiBPYmplY3QuZXh0ZW5kKE1ldGhvZHMs
RWxlbWVudC5NZXRob2RzKTsKIE9iamVjdC5leHRlbmQoTWV0aG9kcyxFbGVtZW50Lk1ldGhvZHMu
U2ltdWxhdGVkKTsKfQp9Cn0pOwoKIGV4dGVuZC5yZWZyZXNoKCk7CiByZXR1cm4gZXh0ZW5kOwp9
KSgpOwoKRWxlbWVudC5oYXNBdHRyaWJ1dGU9ZnVuY3Rpb24oZWxlbWVudCxhdHRyaWJ1dGUpewog
aWYoZWxlbWVudC5oYXNBdHRyaWJ1dGUpcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJp
YnV0ZSk7CiByZXR1cm4gRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZC5oYXNBdHRyaWJ1dGUoZWxl
bWVudCxhdHRyaWJ1dGUpOwp9OwoKRWxlbWVudC5hZGRNZXRob2RzPWZ1bmN0aW9uKG1ldGhvZHMp
ewogdmFyIEY9UHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcyxUPUVsZW1lbnQuTWV0aG9kcy5CeVRh
ZzsKCiBpZighbWV0aG9kcyl7CiBPYmplY3QuZXh0ZW5kKEZvcm0sRm9ybS5NZXRob2RzKTsKIE9i
amVjdC5leHRlbmQoRm9ybS5FbGVtZW50LEZvcm0uRWxlbWVudC5NZXRob2RzKTsKIE9iamVjdC5l
eHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnLHsKIkZPUk0iOk9iamVjdC5jbG9uZShGb3JtLk1l
dGhvZHMpLAoiSU5QVVQiOk9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksCiJTRUxF
Q1QiOk9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksCiJURVhUQVJFQSI6T2JqZWN0
LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKQp9KTsKfQoKIGlmKGFyZ3VtZW50cy5sZW5ndGg9
PTIpewogdmFyIHRhZ05hbWU9bWV0aG9kczsKIG1ldGhvZHM9YXJndW1lbnRzWzFdOwp9CgogaWYo
IXRhZ05hbWUpT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMsbWV0aG9kc3x8e30pOwogZWxz
ZXsKIGlmKE9iamVjdC5pc0FycmF5KHRhZ05hbWUpKXRhZ05hbWUuZWFjaChleHRlbmQpOwogZWxz
ZSBleHRlbmQodGFnTmFtZSk7Cn0KCiBmdW5jdGlvbiBleHRlbmQodGFnTmFtZSl7CiB0YWdOYW1l
PXRhZ05hbWUudG9VcHBlckNhc2UoKTsKIGlmKCFFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFt
ZV0pCiBFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV09e307CiBPYmplY3QuZXh0ZW5kKEVs
ZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSxtZXRob2RzKTsKfQoKIGZ1bmN0aW9uIGNvcHko
bWV0aG9kcyxkZXN0aW5hdGlvbixvbmx5SWZBYnNlbnQpewogb25seUlmQWJzZW50PW9ubHlJZkFi
c2VudHx8ZmFsc2U7CiBmb3IodmFyIHByb3BlcnR5IGluIG1ldGhvZHMpewogdmFyIHZhbHVlPW1l
dGhvZHNbcHJvcGVydHldOwogaWYoIU9iamVjdC5pc0Z1bmN0aW9uKHZhbHVlKSljb250aW51ZTsK
IGlmKCFvbmx5SWZBYnNlbnR8fCEocHJvcGVydHkgaW4gZGVzdGluYXRpb24pKQogZGVzdGluYXRp
b25bcHJvcGVydHldPXZhbHVlLm1ldGhvZGl6ZSgpOwp9Cn0KCiBmdW5jdGlvbiBmaW5kRE9NQ2xh
c3ModGFnTmFtZSl7CiB2YXIga2xhc3M7CiB2YXIgdHJhbnM9ewoiT1BUR1JPVVAiOiJPcHRHcm91
cCIsIlRFWFRBUkVBIjoiVGV4dEFyZWEiLCJQIjoiUGFyYWdyYXBoIiwKIkZJRUxEU0VUIjoiRmll
bGRTZXQiLCJVTCI6IlVMaXN0IiwiT0wiOiJPTGlzdCIsIkRMIjoiRExpc3QiLAoiRElSIjoiRGly
ZWN0b3J5IiwiSDEiOiJIZWFkaW5nIiwiSDIiOiJIZWFkaW5nIiwiSDMiOiJIZWFkaW5nIiwKIkg0
IjoiSGVhZGluZyIsIkg1IjoiSGVhZGluZyIsIkg2IjoiSGVhZGluZyIsIlEiOiJRdW90ZSIsCiJJ
TlMiOiJNb2QiLCJERUwiOiJNb2QiLCJBIjoiQW5jaG9yIiwiSU1HIjoiSW1hZ2UiLCJDQVBUSU9O
IjoKIlRhYmxlQ2FwdGlvbiIsIkNPTCI6IlRhYmxlQ29sIiwiQ09MR1JPVVAiOiJUYWJsZUNvbCIs
IlRIRUFEIjoKIlRhYmxlU2VjdGlvbiIsIlRGT09UIjoiVGFibGVTZWN0aW9uIiwiVEJPRFkiOiJU
YWJsZVNlY3Rpb24iLCJUUiI6CiJUYWJsZVJvdyIsIlRIIjoiVGFibGVDZWxsIiwiVEQiOiJUYWJs
ZUNlbGwiLCJGUkFNRVNFVCI6CiJGcmFtZVNldCIsIklGUkFNRSI6IklGcmFtZSIKfTsKIGlmKHRy
YW5zW3RhZ05hbWVdKWtsYXNzPSdIVE1MJyt0cmFuc1t0YWdOYW1lXSsnRWxlbWVudCc7CiBpZih3
aW5kb3dba2xhc3NdKXJldHVybiB3aW5kb3dba2xhc3NdOwoga2xhc3M9J0hUTUwnK3RhZ05hbWUr
J0VsZW1lbnQnOwogaWYod2luZG93W2tsYXNzXSlyZXR1cm4gd2luZG93W2tsYXNzXTsKIGtsYXNz
PSdIVE1MJyt0YWdOYW1lLmNhcGl0YWxpemUoKSsnRWxlbWVudCc7CiBpZih3aW5kb3dba2xhc3Nd
KXJldHVybiB3aW5kb3dba2xhc3NdOwoKIHdpbmRvd1trbGFzc109e307CiB3aW5kb3dba2xhc3Nd
LnByb3RvdHlwZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpLl9fcHJvdG9fXzsKIHJl
dHVybiB3aW5kb3dba2xhc3NdOwp9CgogaWYoRi5FbGVtZW50RXh0ZW5zaW9ucyl7CiBjb3B5KEVs
ZW1lbnQuTWV0aG9kcyxIVE1MRWxlbWVudC5wcm90b3R5cGUpOwogY29weShFbGVtZW50Lk1ldGhv
ZHMuU2ltdWxhdGVkLEhUTUxFbGVtZW50LnByb3RvdHlwZSx0cnVlKTsKfQoKIGlmKEYuU3BlY2lm
aWNFbGVtZW50RXh0ZW5zaW9ucyl7CiBmb3IodmFyIHRhZyBpbiBFbGVtZW50Lk1ldGhvZHMuQnlU
YWcpewogdmFyIGtsYXNzPWZpbmRET01DbGFzcyh0YWcpOwogaWYoT2JqZWN0LmlzVW5kZWZpbmVk
KGtsYXNzKSljb250aW51ZTsKIGNvcHkoVFt0YWddLGtsYXNzLnByb3RvdHlwZSk7Cn0KfQoKIE9i
amVjdC5leHRlbmQoRWxlbWVudCxFbGVtZW50Lk1ldGhvZHMpOwogZGVsZXRlIEVsZW1lbnQuQnlU
YWc7CgogaWYoRWxlbWVudC5leHRlbmQucmVmcmVzaClFbGVtZW50LmV4dGVuZC5yZWZyZXNoKCk7
CiBFbGVtZW50LmNhY2hlPXt9Owp9OwoKZG9jdW1lbnQudmlld3BvcnQ9ewogZ2V0RGltZW5zaW9u
czpmdW5jdGlvbigpewogdmFyIGRpbWVuc2lvbnM9e307CiB2YXIgQj1Qcm90b3R5cGUuQnJvd3Nl
cjsKICR3KCd3aWR0aCBoZWlnaHQnKS5lYWNoKGZ1bmN0aW9uKGQpewogdmFyIEQ9ZC5jYXBpdGFs
aXplKCk7CiBkaW1lbnNpb25zW2RdPShCLldlYktpdCYmIWRvY3VtZW50LmV2YWx1YXRlKT9zZWxm
Wydpbm5lcicrRF06CihCLk9wZXJhKT9kb2N1bWVudC5ib2R5WydjbGllbnQnK0RdOmRvY3VtZW50
LmRvY3VtZW50RWxlbWVudFsnY2xpZW50JytEXTsKfSk7CiByZXR1cm4gZGltZW5zaW9uczsKfSwK
CiBnZXRXaWR0aDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuZ2V0RGltZW5zaW9ucygpLndpZHRo
Owp9LAoKIGdldEhlaWdodDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuZ2V0RGltZW5zaW9ucygp
LmhlaWdodDsKfSwKCn07CgoKdmFyIFNlbGVjdG9yPUNsYXNzLmNyZWF0ZSh7CiBpbml0aWFsaXpl
OmZ1bmN0aW9uKGV4cHJlc3Npb24pewogdGhpcy5leHByZXNzaW9uPWV4cHJlc3Npb24uc3RyaXAo
KTsKIHRoaXMuY29tcGlsZU1hdGNoZXIoKTsKfSwKCiBzaG91bGRVc2VYUGF0aDpmdW5jdGlvbigp
ewogaWYoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgpcmV0dXJuIGZhbHNlOwoKIHZh
ciBlPXRoaXMuZXhwcmVzc2lvbjsKCgogaWYoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0JiYKKGUu
aW5jbHVkZSgiLW9mLXR5cGUiKXx8ZS5pbmNsdWRlKCI6ZW1wdHkiKSkpCiByZXR1cm4gZmFsc2U7
CgoKCiBpZigoLyhcW1tcdy1dKj86fDpjaGVja2VkKS8pLnRlc3QodGhpcy5leHByZXNzaW9uKSkK
IHJldHVybiBmYWxzZTsKCiByZXR1cm4gdHJ1ZTsKfSwKCiBjb21waWxlTWF0Y2hlcjpmdW5jdGlv
bigpewogaWYodGhpcy5zaG91bGRVc2VYUGF0aCgpKQogcmV0dXJuIHRoaXMuY29tcGlsZVhQYXRo
TWF0Y2hlcigpOwoKIHZhciBlPXRoaXMuZXhwcmVzc2lvbixwcz1TZWxlY3Rvci5wYXR0ZXJucyxo
PVNlbGVjdG9yLmhhbmRsZXJzLAogYz1TZWxlY3Rvci5jcml0ZXJpYSxsZSxwLG07CgogaWYoU2Vs
ZWN0b3IuX2NhY2hlW2VdKXsKIHRoaXMubWF0Y2hlcj1TZWxlY3Rvci5fY2FjaGVbZV07CiByZXR1
cm47Cn0KCiB0aGlzLm1hdGNoZXI9WyJ0aGlzLm1hdGNoZXIgPSBmdW5jdGlvbihyb290KSB7IiwK
InZhciByID0gcm9vdCwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBjID0gZmFsc2UsIG47Il07Cgog
d2hpbGUoZSYmbGUhPWUmJigvXFMvKS50ZXN0KGUpKXsKIGxlPWU7CiBmb3IodmFyIGkgaW4gcHMp
ewogcD1wc1tpXTsKIGlmKG09ZS5tYXRjaChwKSl7CiB0aGlzLm1hdGNoZXIucHVzaChPYmplY3Qu
aXNGdW5jdGlvbihjW2ldKT9jW2ldKG0pOgogbmV3IFRlbXBsYXRlKGNbaV0pLmV2YWx1YXRlKG0p
KTsKIGU9ZS5yZXBsYWNlKG1bMF0sJycpOwogYnJlYWs7Cn0KfQp9CgogdGhpcy5tYXRjaGVyLnB1
c2goInJldHVybiBoLnVuaXF1ZShuKTtcbn0iKTsKIGV2YWwodGhpcy5tYXRjaGVyLmpvaW4oJ1xu
JykpOwogU2VsZWN0b3IuX2NhY2hlW3RoaXMuZXhwcmVzc2lvbl09dGhpcy5tYXRjaGVyOwp9LAoK
IGNvbXBpbGVYUGF0aE1hdGNoZXI6ZnVuY3Rpb24oKXsKIHZhciBlPXRoaXMuZXhwcmVzc2lvbixw
cz1TZWxlY3Rvci5wYXR0ZXJucywKIHg9U2VsZWN0b3IueHBhdGgsbGUsbTsKCiBpZihTZWxlY3Rv
ci5fY2FjaGVbZV0pewogdGhpcy54cGF0aD1TZWxlY3Rvci5fY2FjaGVbZV07cmV0dXJuOwp9Cgog
dGhpcy5tYXRjaGVyPVsnLi8vKiddOwogd2hpbGUoZSYmbGUhPWUmJigvXFMvKS50ZXN0KGUpKXsK
IGxlPWU7CiBmb3IodmFyIGkgaW4gcHMpewogaWYobT1lLm1hdGNoKHBzW2ldKSl7CiB0aGlzLm1h
dGNoZXIucHVzaChPYmplY3QuaXNGdW5jdGlvbih4W2ldKT94W2ldKG0pOgogbmV3IFRlbXBsYXRl
KHhbaV0pLmV2YWx1YXRlKG0pKTsKIGU9ZS5yZXBsYWNlKG1bMF0sJycpOwogYnJlYWs7Cn0KfQp9
CgogdGhpcy54cGF0aD10aGlzLm1hdGNoZXIuam9pbignJyk7CiBTZWxlY3Rvci5fY2FjaGVbdGhp
cy5leHByZXNzaW9uXT10aGlzLnhwYXRoOwp9LAoKIGZpbmRFbGVtZW50czpmdW5jdGlvbihyb290
KXsKIHJvb3Q9cm9vdHx8ZG9jdW1lbnQ7CiBpZih0aGlzLnhwYXRoKXJldHVybiBkb2N1bWVudC5f
Z2V0RWxlbWVudHNCeVhQYXRoKHRoaXMueHBhdGgscm9vdCk7CiByZXR1cm4gdGhpcy5tYXRjaGVy
KHJvb3QpOwp9LAoKIG1hdGNoOmZ1bmN0aW9uKGVsZW1lbnQpewogdGhpcy50b2tlbnM9W107Cgog
dmFyIGU9dGhpcy5leHByZXNzaW9uLHBzPVNlbGVjdG9yLnBhdHRlcm5zLGFzPVNlbGVjdG9yLmFz
c2VydGlvbnM7CiB2YXIgbGUscCxtOwoKIHdoaWxlKGUmJmxlIT09ZSYmKC9cUy8pLnRlc3QoZSkp
ewogbGU9ZTsKIGZvcih2YXIgaSBpbiBwcyl7CiBwPXBzW2ldOwogaWYobT1lLm1hdGNoKHApKXsK
CgogaWYoYXNbaV0pewogdGhpcy50b2tlbnMucHVzaChbaSxPYmplY3QuY2xvbmUobSldKTsKIGU9
ZS5yZXBsYWNlKG1bMF0sJycpOwp9ZWxzZXsKCgogcmV0dXJuIHRoaXMuZmluZEVsZW1lbnRzKGRv
Y3VtZW50KS5pbmNsdWRlKGVsZW1lbnQpOwp9Cn0KfQp9CgogdmFyIG1hdGNoPXRydWUsbmFtZSxt
YXRjaGVzOwogZm9yKHZhciBpPTAsdG9rZW47dG9rZW49dGhpcy50b2tlbnNbaV07aSsrKXsKIG5h
bWU9dG9rZW5bMF0sbWF0Y2hlcz10b2tlblsxXTsKIGlmKCFTZWxlY3Rvci5hc3NlcnRpb25zW25h
bWVdKGVsZW1lbnQsbWF0Y2hlcykpewogbWF0Y2g9ZmFsc2U7YnJlYWs7Cn0KfQoKIHJldHVybiBt
YXRjaDsKfSwKCiB0b1N0cmluZzpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsK
fSwKCiBpbnNwZWN0OmZ1bmN0aW9uKCl7CiByZXR1cm4iIzxTZWxlY3RvcjoiK3RoaXMuZXhwcmVz
c2lvbi5pbnNwZWN0KCkrIj4iOwp9Cn0pOwoKT2JqZWN0LmV4dGVuZChTZWxlY3Rvcix7CiBfY2Fj
aGU6e30sCgogeHBhdGg6ewogZGVzY2VuZGFudDoiLy8qIiwKIGNoaWxkOiIvKiIsCiBhZGphY2Vu
dDoiL2ZvbGxvd2luZy1zaWJsaW5nOjoqWzFdIiwKIGxhdGVyU2libGluZzonL2ZvbGxvd2luZy1z
aWJsaW5nOjoqJywKIHRhZ05hbWU6ZnVuY3Rpb24obSl7CiBpZihtWzFdPT0nKicpcmV0dXJuJyc7
CiByZXR1cm4iW2xvY2FsLW5hbWUoKT0nIittWzFdLnRvTG93ZXJDYXNlKCkrCiInIG9yIGxvY2Fs
LW5hbWUoKT0nIittWzFdLnRvVXBwZXJDYXNlKCkrIiddIjsKfSwKIGNsYXNzTmFtZToiW2NvbnRh
aW5zKGNvbmNhdCgnICcsIEBjbGFzcywgJyAnKSwgJyAjezF9ICcpXSIsCiBpZDoiW0BpZD0nI3sx
fSddIiwKIGF0dHJQcmVzZW5jZTpmdW5jdGlvbihtKXsKIG1bMV09bVsxXS50b0xvd2VyQ2FzZSgp
OwogcmV0dXJuIG5ldyBUZW1wbGF0ZSgiW0AjezF9XSIpLmV2YWx1YXRlKG0pOwp9LAogYXR0cjpm
dW5jdGlvbihtKXsKIG1bMV09bVsxXS50b0xvd2VyQ2FzZSgpOwogbVszXT1tWzVdfHxtWzZdOwog
cmV0dXJuIG5ldyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5vcGVyYXRvcnNbbVsyXV0pLmV2YWx1
YXRlKG0pOwp9LAogcHNldWRvOmZ1bmN0aW9uKG0pewogdmFyIGg9U2VsZWN0b3IueHBhdGgucHNl
dWRvc1ttWzFdXTsKIGlmKCFoKXJldHVybicnOwogaWYoT2JqZWN0LmlzRnVuY3Rpb24oaCkpcmV0
dXJuIGgobSk7CiByZXR1cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbbVsx
XV0pLmV2YWx1YXRlKG0pOwp9LAogb3BlcmF0b3JzOnsKJz0nOiJbQCN7MX09JyN7M30nXSIsCich
PSc6IltAI3sxfSE9JyN7M30nXSIsCidePSc6IltzdGFydHMtd2l0aChAI3sxfSwgJyN7M30nKV0i
LAonJD0nOiJbc3Vic3RyaW5nKEAjezF9LCAoc3RyaW5nLWxlbmd0aChAI3sxfSkgLSBzdHJpbmct
bGVuZ3RoKCcjezN9JykgKyAxKSk9JyN7M30nXSIsCicqPSc6Iltjb250YWlucyhAI3sxfSwgJyN7
M30nKV0iLAonfj0nOiJbY29udGFpbnMoY29uY2F0KCcgJywgQCN7MX0sICcgJyksICcgI3szfSAn
KV0iLAonfD0nOiJbY29udGFpbnMoY29uY2F0KCctJywgQCN7MX0sICctJyksICctI3szfS0nKV0i
Cn0sCiBwc2V1ZG9zOnsKJ2ZpcnN0LWNoaWxkJzonW25vdChwcmVjZWRpbmctc2libGluZzo6Kild
JywKJ2xhc3QtY2hpbGQnOidbbm90KGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAonb25seS1jaGls
ZCc6J1tub3QocHJlY2VkaW5nLXNpYmxpbmc6Oiogb3IgZm9sbG93aW5nLXNpYmxpbmc6OiopXScs
CidlbXB0eSc6Iltjb3VudCgqKSA9IDAgYW5kIChjb3VudCh0ZXh0KCkpID0gMCBvciB0cmFuc2xh
dGUodGV4dCgpLCAnIFx0XHJcbicsICcnKSA9ICcnKV0iLAonY2hlY2tlZCc6IltAY2hlY2tlZF0i
LAonZGlzYWJsZWQnOiJbQGRpc2FibGVkXSIsCidlbmFibGVkJzoiW25vdChAZGlzYWJsZWQpXSIs
Cidub3QnOmZ1bmN0aW9uKG0pewogdmFyIGU9bVs2XSxwPVNlbGVjdG9yLnBhdHRlcm5zLAogeD1T
ZWxlY3Rvci54cGF0aCxsZSx2OwoKIHZhciBleGNsdXNpb249W107CiB3aGlsZShlJiZsZSE9ZSYm
KC9cUy8pLnRlc3QoZSkpewogbGU9ZTsKIGZvcih2YXIgaSBpbiBwKXsKIGlmKG09ZS5tYXRjaChw
W2ldKSl7CiB2PU9iamVjdC5pc0Z1bmN0aW9uKHhbaV0pP3hbaV0obSk6bmV3IFRlbXBsYXRlKHhb
aV0pLmV2YWx1YXRlKG0pOwogZXhjbHVzaW9uLnB1c2goIigiK3Yuc3Vic3RyaW5nKDEsdi5sZW5n
dGgtMSkrIikiKTsKIGU9ZS5yZXBsYWNlKG1bMF0sJycpOwogYnJlYWs7Cn0KfQp9CiByZXR1cm4i
W25vdCgiK2V4Y2x1c2lvbi5qb2luKCIgYW5kICIpKyIpXSI7Cn0sCidudGgtY2hpbGQnOmZ1bmN0
aW9uKG0pewogcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9wcmVj
ZWRpbmctc2libGluZzo6KikgKyAxKSAiLG0pOwp9LAonbnRoLWxhc3QtY2hpbGQnOmZ1bmN0aW9u
KG0pewogcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9mb2xsb3dp
bmctc2libGluZzo6KikgKyAxKSAiLG0pOwp9LAonbnRoLW9mLXR5cGUnOmZ1bmN0aW9uKG0pewog
cmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCJwb3NpdGlvbigpICIsbSk7Cn0sCidu
dGgtbGFzdC1vZi10eXBlJzpmdW5jdGlvbihtKXsKIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1
ZG9zLm50aCgiKGxhc3QoKSArIDEgLSBwb3NpdGlvbigpKSAiLG0pOwp9LAonZmlyc3Qtb2YtdHlw
ZSc6ZnVuY3Rpb24obSl7CiBtWzZdPSIxIjtyZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvc1sn
bnRoLW9mLXR5cGUnXShtKTsKfSwKJ2xhc3Qtb2YtdHlwZSc6ZnVuY3Rpb24obSl7CiBtWzZdPSIx
IjtyZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvc1snbnRoLWxhc3Qtb2YtdHlwZSddKG0pOwp9
LAonb25seS1vZi10eXBlJzpmdW5jdGlvbihtKXsKIHZhciBwPVNlbGVjdG9yLnhwYXRoLnBzZXVk
b3M7cmV0dXJuIHBbJ2ZpcnN0LW9mLXR5cGUnXShtKStwWydsYXN0LW9mLXR5cGUnXShtKTsKfSwK
IG50aDpmdW5jdGlvbihmcmFnbWVudCxtKXsKIHZhciBtbSxmb3JtdWxhPW1bNl0scHJlZGljYXRl
OwogaWYoZm9ybXVsYT09J2V2ZW4nKWZvcm11bGE9JzJuKzAnOwogaWYoZm9ybXVsYT09J29kZCcp
Zm9ybXVsYT0nMm4rMSc7CiBpZihtbT1mb3JtdWxhLm1hdGNoKC9eKFxkKykkLykpCiByZXR1cm4n
WycrZnJhZ21lbnQrIj0gIittbVsxXSsnXSc7CiBpZihtbT1mb3JtdWxhLm1hdGNoKC9eKC0/XGQq
KT9uKChbKy1dKShcZCspKT8vKSl7CiBpZihtbVsxXT09Ii0iKW1tWzFdPS0xOwogdmFyIGE9bW1b
MV0/TnVtYmVyKG1tWzFdKToxOwogdmFyIGI9bW1bMl0/TnVtYmVyKG1tWzJdKTowOwogcHJlZGlj
YXRlPSJbKCgje2ZyYWdtZW50fSAtICN7Yn0pIG1vZCAje2F9ID0gMCkgYW5kICIrCiIoKCN7ZnJh
Z21lbnR9IC0gI3tifSkgZGl2ICN7YX0gPj0gMCldIjsKIHJldHVybiBuZXcgVGVtcGxhdGUocHJl
ZGljYXRlKS5ldmFsdWF0ZSh7CiBmcmFnbWVudDpmcmFnbWVudCxhOmEsYjpifSk7Cn0KfQp9Cn0s
CgogY3JpdGVyaWE6ewogdGFnTmFtZTonbiA9IGgudGFnTmFtZShuLCByLCAiI3sxfSIsIGMpOyAg
ICAgIGMgPSBmYWxzZTsnLAogY2xhc3NOYW1lOiduID0gaC5jbGFzc05hbWUobiwgciwgIiN7MX0i
LCBjKTsgICAgYyA9IGZhbHNlOycsCiBpZDonbiA9IGguaWQobiwgciwgIiN7MX0iLCBjKTsgICAg
ICAgICAgIGMgPSBmYWxzZTsnLAogYXR0clByZXNlbmNlOiduID0gaC5hdHRyUHJlc2VuY2Uobiwg
ciwgIiN7MX0iLCBjKTsgYyA9IGZhbHNlOycsCiBhdHRyOmZ1bmN0aW9uKG0pewogbVszXT0obVs1
XXx8bVs2XSk7CiByZXR1cm4gbmV3IFRlbXBsYXRlKCduID0gaC5hdHRyKG4sIHIsICIjezF9Iiwg
IiN7M30iLCAiI3syfSIsIGMpOyBjID0gZmFsc2U7JykuZXZhbHVhdGUobSk7Cn0sCiBwc2V1ZG86
ZnVuY3Rpb24obSl7CiBpZihtWzZdKW1bNl09bVs2XS5yZXBsYWNlKC8iL2csJ1xcIicpOwogcmV0
dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGgucHNldWRvKG4sICIjezF9IiwgIiN7Nn0iLCByLCBjKTsg
YyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOwp9LAogZGVzY2VuZGFudDonYyA9ICJkZXNjZW5kYW50
IjsnLAogY2hpbGQ6J2MgPSAiY2hpbGQiOycsCiBhZGphY2VudDonYyA9ICJhZGphY2VudCI7JywK
IGxhdGVyU2libGluZzonYyA9ICJsYXRlclNpYmxpbmciOycKfSwKCiBwYXR0ZXJuczp7CgoKIGxh
dGVyU2libGluZzovXlxzKn5ccyovLAogY2hpbGQ6L15ccyo+XHMqLywKIGFkamFjZW50Oi9eXHMq
XCtccyovLAogZGVzY2VuZGFudDovXlxzLywKCgogdGFnTmFtZTovXlxzKihcKnxbXHdcLV0rKShc
YnwkKT8vLAogaWQ6L14jKFtcd1wtXCpdKykoXGJ8JCkvLAogY2xhc3NOYW1lOi9eXC4oW1x3XC1c
Kl0rKShcYnwkKS8sCiBwc2V1ZG86Ci9eOigoZmlyc3R8bGFzdHxudGh8bnRoLWxhc3R8b25seSko
LWNoaWxkfC1vZi10eXBlKXxlbXB0eXxjaGVja2VkfChlbnxkaXMpYWJsZWR8bm90KShcKCguKj8p
XCkpPyhcYnwkfCg/PVxzfFs6K34+XSkpLywKIGF0dHJQcmVzZW5jZTovXlxbKFtcd10rKVxdLywK
IGF0dHI6L1xbKCg/Oltcdy1dKjopP1tcdy1dKylccyooPzooWyFeJCp+fF0/PSlccyooKFsnIl0p
KFteXDRdKj8pXDR8KFteJyJdW15cXV0qPykpKT9cXS8KfSwKCgogYXNzZXJ0aW9uczp7CiB0YWdO
YW1lOmZ1bmN0aW9uKGVsZW1lbnQsbWF0Y2hlcyl7CiByZXR1cm4gbWF0Y2hlc1sxXS50b1VwcGVy
Q2FzZSgpPT1lbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKfSwKCiBjbGFzc05hbWU6ZnVu
Y3Rpb24oZWxlbWVudCxtYXRjaGVzKXsKIHJldHVybiBFbGVtZW50Lmhhc0NsYXNzTmFtZShlbGVt
ZW50LG1hdGNoZXNbMV0pOwp9LAoKIGlkOmZ1bmN0aW9uKGVsZW1lbnQsbWF0Y2hlcyl7CiByZXR1
cm4gZWxlbWVudC5pZD09PW1hdGNoZXNbMV07Cn0sCgogYXR0clByZXNlbmNlOmZ1bmN0aW9uKGVs
ZW1lbnQsbWF0Y2hlcyl7CiByZXR1cm4gRWxlbWVudC5oYXNBdHRyaWJ1dGUoZWxlbWVudCxtYXRj
aGVzWzFdKTsKfSwKCiBhdHRyOmZ1bmN0aW9uKGVsZW1lbnQsbWF0Y2hlcyl7CiB2YXIgbm9kZVZh
bHVlPUVsZW1lbnQucmVhZEF0dHJpYnV0ZShlbGVtZW50LG1hdGNoZXNbMV0pOwogcmV0dXJuIG5v
ZGVWYWx1ZSYmU2VsZWN0b3Iub3BlcmF0b3JzW21hdGNoZXNbMl1dKG5vZGVWYWx1ZSxtYXRjaGVz
WzVdfHxtYXRjaGVzWzZdKTsKfQp9LAoKIGhhbmRsZXJzOnsKCiBjb25jYXQ6ZnVuY3Rpb24oYSxi
KXsKfSwKCiBtYXJrOmZ1bmN0aW9uKG5vZGVzKXsKfSwKCiB1bm1hcms6ZnVuY3Rpb24obm9kZXMp
ewp9LAoKIGluZGV4OmZ1bmN0aW9uKHBhcmVudE5vZGUscmV2ZXJzZSxvZlR5cGUpewp9LAoKIHVu
aXF1ZTpmdW5jdGlvbihub2Rlcyl7Cn0sCgogZGVzY2VuZGFudDpmdW5jdGlvbihub2Rlcyl7Cn0s
CgogY2hpbGQ6ZnVuY3Rpb24obm9kZXMpewp9LAoKIGFkamFjZW50OmZ1bmN0aW9uKG5vZGVzKXsK
fSwKCiBsYXRlclNpYmxpbmc6ZnVuY3Rpb24obm9kZXMpewp9LAoKIG5leHRFbGVtZW50U2libGlu
ZzpmdW5jdGlvbihub2RlKXsKfSwKCiBwcmV2aW91c0VsZW1lbnRTaWJsaW5nOmZ1bmN0aW9uKG5v
ZGUpewp9LAoKIHRhZ05hbWU6ZnVuY3Rpb24obm9kZXMscm9vdCx0YWdOYW1lLGNvbWJpbmF0b3Ip
ewp9LAoKIGlkOmZ1bmN0aW9uKG5vZGVzLHJvb3QsaWQsY29tYmluYXRvcil7Cn0sCgogY2xhc3NO
YW1lOmZ1bmN0aW9uKG5vZGVzLHJvb3QsY2xhc3NOYW1lLGNvbWJpbmF0b3Ipewp9LAoKIGJ5Q2xh
c3NOYW1lOmZ1bmN0aW9uKG5vZGVzLHJvb3QsY2xhc3NOYW1lKXsKfSwKCiBhdHRyUHJlc2VuY2U6
ZnVuY3Rpb24obm9kZXMscm9vdCxhdHRyLGNvbWJpbmF0b3Ipewp9LAoKIGF0dHI6ZnVuY3Rpb24o
bm9kZXMscm9vdCxhdHRyLHZhbHVlLG9wZXJhdG9yLGNvbWJpbmF0b3Ipewp9LAoKIHBzZXVkbzpm
dW5jdGlvbihub2RlcyxuYW1lLHZhbHVlLHJvb3QsY29tYmluYXRvcil7Cn0KfSwKCiBwc2V1ZG9z
OnsKJ2ZpcnN0LWNoaWxkJzpmdW5jdGlvbihub2Rlcyx2YWx1ZSxyb290KXsKfSwKJ2xhc3QtY2hp
bGQnOmZ1bmN0aW9uKG5vZGVzLHZhbHVlLHJvb3Qpewp9LAonb25seS1jaGlsZCc6ZnVuY3Rpb24o
bm9kZXMsdmFsdWUscm9vdCl7Cn0sCidudGgtY2hpbGQnOmZ1bmN0aW9uKG5vZGVzLGZvcm11bGEs
cm9vdCl7Cn0sCidudGgtbGFzdC1jaGlsZCc6ZnVuY3Rpb24obm9kZXMsZm9ybXVsYSxyb290KXsK
fSwKJ250aC1vZi10eXBlJzpmdW5jdGlvbihub2Rlcyxmb3JtdWxhLHJvb3Qpewp9LAonbnRoLWxh
c3Qtb2YtdHlwZSc6ZnVuY3Rpb24obm9kZXMsZm9ybXVsYSxyb290KXsKfSwKJ2ZpcnN0LW9mLXR5
cGUnOmZ1bmN0aW9uKG5vZGVzLGZvcm11bGEscm9vdCl7Cn0sCidsYXN0LW9mLXR5cGUnOmZ1bmN0
aW9uKG5vZGVzLGZvcm11bGEscm9vdCl7Cn0sCidvbmx5LW9mLXR5cGUnOmZ1bmN0aW9uKG5vZGVz
LGZvcm11bGEscm9vdCl7Cn0sCgogZ2V0SW5kaWNlczpmdW5jdGlvbihhLGIsdG90YWwpewp9LAoK
IG50aDpmdW5jdGlvbihub2Rlcyxmb3JtdWxhLHJvb3QscmV2ZXJzZSxvZlR5cGUpewp9LAoKJ2Vt
cHR5JzpmdW5jdGlvbihub2Rlcyx2YWx1ZSxyb290KXsKIGZvcih2YXIgaT0wLHJlc3VsdHM9W10s
bm9kZTtub2RlPW5vZGVzW2ldO2krKyl7CgogaWYobm9kZS50YWdOYW1lPT0nISd8fChub2RlLmZp
cnN0Q2hpbGQmJiFub2RlLmlubmVySFRNTC5tYXRjaCgvXlxzKiQvKSkpY29udGludWU7CiByZXN1
bHRzLnB1c2gobm9kZSk7Cn0KIHJldHVybiByZXN1bHRzOwp9LAoKJ25vdCc6ZnVuY3Rpb24obm9k
ZXMsc2VsZWN0b3Iscm9vdCl7Cn0sCgonZW5hYmxlZCc6ZnVuY3Rpb24obm9kZXMsdmFsdWUscm9v
dCl7Cn0sCgonZGlzYWJsZWQnOmZ1bmN0aW9uKG5vZGVzLHZhbHVlLHJvb3Qpewp9LAoKJ2NoZWNr
ZWQnOmZ1bmN0aW9uKG5vZGVzLHZhbHVlLHJvb3QpewogZm9yKHZhciBpPTAscmVzdWx0cz1bXSxu
b2RlO25vZGU9bm9kZXNbaV07aSsrKQogaWYobm9kZS5jaGVja2VkKXJlc3VsdHMucHVzaChub2Rl
KTsKIHJldHVybiByZXN1bHRzOwp9Cn0sCgogb3BlcmF0b3JzOnsKfSwKCiBzcGxpdDpmdW5jdGlv
bihleHByZXNzaW9uKXsKfSwKCiBtYXRjaEVsZW1lbnRzOmZ1bmN0aW9uKGVsZW1lbnRzLGV4cHJl
c3Npb24pewp9LAoKIGZpbmRFbGVtZW50OmZ1bmN0aW9uKGVsZW1lbnRzLGV4cHJlc3Npb24saW5k
ZXgpewp9LAoKIGZpbmRDaGlsZEVsZW1lbnRzOmZ1bmN0aW9uKGVsZW1lbnQsZXhwcmVzc2lvbnMp
ewp9Cn0pOwoKZnVuY3Rpb24gJCQoKXsKIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50
cyhkb2N1bWVudCwkQShhcmd1bWVudHMpKTsKfQp2YXIgRm9ybT17CiByZXNldDpmdW5jdGlvbihm
b3JtKXsKICQoZm9ybSkucmVzZXQoKTsKIHJldHVybiBmb3JtOwp9LAp9OwoKRm9ybS5NZXRob2Rz
PXt9CgpGb3JtLkVsZW1lbnQ9ewogZm9jdXM6ZnVuY3Rpb24oZWxlbWVudCl7CiAkKGVsZW1lbnQp
LmZvY3VzKCk7CiByZXR1cm4gZWxlbWVudDsKfSwKCiBzZWxlY3Q6ZnVuY3Rpb24oZWxlbWVudCl7
CiAkKGVsZW1lbnQpLnNlbGVjdCgpOwogcmV0dXJuIGVsZW1lbnQ7Cn0KfTsKCkZvcm0uRWxlbWVu
dC5NZXRob2RzPXsKfTsKCnZhciBGaWVsZD1Gb3JtLkVsZW1lbnQ7CnZhciAkRj1Gb3JtLkVsZW1l
bnQuTWV0aG9kcy5nZXRWYWx1ZTsKCkFic3RyYWN0LlRpbWVkT2JzZXJ2ZXI9Q2xhc3MuY3JlYXRl
KFBlcmlvZGljYWxFeGVjdXRlcix7CiBpbml0aWFsaXplOmZ1bmN0aW9uKCRzdXBlcixlbGVtZW50
LGZyZXF1ZW5jeSxjYWxsYmFjayl7CiAkc3VwZXIoY2FsbGJhY2ssZnJlcXVlbmN5KTsKIHRoaXMu
ZWxlbWVudD0kKGVsZW1lbnQpOwogdGhpcy5sYXN0VmFsdWU9dGhpcy5nZXRWYWx1ZSgpOwp9LAoK
IGV4ZWN1dGU6ZnVuY3Rpb24oKXsKIHZhciB2YWx1ZT10aGlzLmdldFZhbHVlKCk7CiBpZihPYmpl
Y3QuaXNTdHJpbmcodGhpcy5sYXN0VmFsdWUpJiZPYmplY3QuaXNTdHJpbmcodmFsdWUpPwogdGhp
cy5sYXN0VmFsdWUhPXZhbHVlOlN0cmluZyh0aGlzLmxhc3RWYWx1ZSkhPVN0cmluZyh2YWx1ZSkp
ewogdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsdmFsdWUpOwogdGhpcy5sYXN0VmFsdWU9dmFs
dWU7Cn0KfQp9KTsKCkFic3RyYWN0LkV2ZW50T2JzZXJ2ZXI9Q2xhc3MuY3JlYXRlKHsKIGluaXRp
YWxpemU6ZnVuY3Rpb24oZWxlbWVudCxjYWxsYmFjayl7CiB0aGlzLmVsZW1lbnQ9JChlbGVtZW50
KTsKIHRoaXMuY2FsbGJhY2s9Y2FsbGJhY2s7CgogdGhpcy5sYXN0VmFsdWU9dGhpcy5nZXRWYWx1
ZSgpOwogaWYodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKT09J2Zvcm0nKQogdGhp
cy5yZWdpc3RlckZvcm1DYWxsYmFja3MoKTsKIGVsc2UKIHRoaXMucmVnaXN0ZXJDYWxsYmFjayh0
aGlzLmVsZW1lbnQpOwp9LAoKIG9uRWxlbWVudEV2ZW50OmZ1bmN0aW9uKCl7Cn0sCgogcmVnaXN0
ZXJGb3JtQ2FsbGJhY2tzOmZ1bmN0aW9uKCl7CiBGb3JtLmdldEVsZW1lbnRzKHRoaXMuZWxlbWVu
dCkuZWFjaCh0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssdGhpcyk7Cn0sCgogcmVnaXN0ZXJDYWxsYmFj
azpmdW5jdGlvbihlbGVtZW50KXsKIGlmKGVsZW1lbnQudHlwZSl7CiBzd2l0Y2goZWxlbWVudC50
eXBlLnRvTG93ZXJDYXNlKCkpewogY2FzZSdjaGVja2JveCc6CiBjYXNlJ3JhZGlvJzoKIEV2ZW50
Lm9ic2VydmUoZWxlbWVudCwnY2xpY2snLHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7
CiBicmVhazsKIGRlZmF1bHQ6CiBFdmVudC5vYnNlcnZlKGVsZW1lbnQsJ2NoYW5nZScsdGhpcy5v
bkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKIGJyZWFrOwp9Cn0KfQp9KTsKCkZvcm0uRWxlbWVu
dC5FdmVudE9ic2VydmVyPUNsYXNzLmNyZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVyLHsKIGdl
dFZhbHVlOmZ1bmN0aW9uKCl7CiByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxl
bWVudCk7Cn0KfSk7CgpGb3JtLkV2ZW50T2JzZXJ2ZXI9Q2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2
ZW50T2JzZXJ2ZXIsewogZ2V0VmFsdWU6ZnVuY3Rpb24oKXsKIHJldHVybiBGb3JtLnNlcmlhbGl6
ZSh0aGlzLmVsZW1lbnQpOwp9Cn0pOwppZighd2luZG93LkV2ZW50KXZhciBFdmVudD17fTsKCk9i
amVjdC5leHRlbmQoRXZlbnQsewogY2FjaGU6e30sCgogcmVsYXRlZFRhcmdldDpmdW5jdGlvbihl
dmVudCl7CiB2YXIgZWxlbWVudDsKIHN3aXRjaChldmVudC50eXBlKXsKIGNhc2UnbW91c2VvdmVy
JzplbGVtZW50PWV2ZW50LmZyb21FbGVtZW50O2JyZWFrOwogY2FzZSdtb3VzZW91dCc6ZWxlbWVu
dD1ldmVudC50b0VsZW1lbnQ7YnJlYWs7CiBkZWZhdWx0OnJldHVybiBudWxsOwp9CiByZXR1cm4g
RWxlbWVudC5leHRlbmQoZWxlbWVudCk7Cn0KfSk7CgpFdmVudC5NZXRob2RzPShmdW5jdGlvbigp
ewogdmFyIGlzQnV0dG9uOwoKaWYoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KXsKIGlzQnV0dG9u
PWZ1bmN0aW9uKGV2ZW50LGNvZGUpewogc3dpdGNoKGNvZGUpewogY2FzZSAwOnJldHVybiBldmVu
dC53aGljaD09MSYmIWV2ZW50Lm1ldGFLZXk7CiBjYXNlIDE6cmV0dXJuIGV2ZW50LndoaWNoPT0x
JiZldmVudC5tZXRhS2V5OwogZGVmYXVsdDpyZXR1cm4gZmFsc2U7Cn0KfTsKCn1lbHNlewogaXNC
dXR0b249ZnVuY3Rpb24oZXZlbnQsY29kZSl7CiByZXR1cm4gZXZlbnQud2hpY2g/KGV2ZW50Lndo
aWNoPT09Y29kZSsxKTooZXZlbnQuYnV0dG9uPT09Y29kZSk7Cn07Cn0KCiByZXR1cm57Cn07Cn0p
KCk7CgpFdmVudC5leHRlbmQ9KGZ1bmN0aW9uKCl7CiB2YXIgbWV0aG9kcz1PYmplY3Qua2V5cyhF
dmVudC5NZXRob2RzKS5pbmplY3Qoe30sZnVuY3Rpb24obSxuYW1lKXsKIG1bbmFtZV09RXZlbnQu
TWV0aG9kc1tuYW1lXS5tZXRob2RpemUoKTsKIHJldHVybiBtOwp9KTsKCiBFdmVudC5wcm90b3R5
cGU9RXZlbnQucHJvdG90eXBlfHxkb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpLl9f
cHJvdG9fXzsKIE9iamVjdC5leHRlbmQoRXZlbnQucHJvdG90eXBlLG1ldGhvZHMpOwogcmV0dXJu
IFByb3RvdHlwZS5LOwp9KSgpOwoKT2JqZWN0LmV4dGVuZChFdmVudCwoZnVuY3Rpb24oKXsKIHZh
ciBjYWNoZT1FdmVudC5jYWNoZTsKCiBmdW5jdGlvbiBnZXRFdmVudElEKGVsZW1lbnQpewogaWYo
ZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRClyZXR1cm4gZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJ
RFswXTsKIGFyZ3VtZW50cy5jYWxsZWUuaWQ9YXJndW1lbnRzLmNhbGxlZS5pZHx8MTsKIHJldHVy
biBlbGVtZW50Ll9wcm90b3R5cGVFdmVudElEPVsrK2FyZ3VtZW50cy5jYWxsZWUuaWRdOwp9Cgog
ZnVuY3Rpb24gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSl7CiBpZihldmVudE5hbWUmJmV2ZW50
TmFtZS5pbmNsdWRlKCc6JykpcmV0dXJuImRhdGFhdmFpbGFibGUiOwogaWYoIVByb3RvdHlwZS5C
cm93c2VyLklFKWV2ZW50TmFtZT17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJt
b3VzZW91dCJ9W2V2ZW50TmFtZV18fGV2ZW50TmFtZTsKIHJldHVybiBldmVudE5hbWU7Cn0KCiBm
dW5jdGlvbiBnZXRDYWNoZUZvcklEKGlkKXsKIHJldHVybiBjYWNoZVtpZF09Y2FjaGVbaWRdfHx7
fTsKfQoKIGZ1bmN0aW9uIGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLGV2ZW50TmFtZSl7CiB2
YXIgYz1nZXRDYWNoZUZvcklEKGlkKTsKIHJldHVybiBjW2V2ZW50TmFtZV09Y1tldmVudE5hbWVd
fHxbXTsKfQoKIGZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoZWxlbWVudCxldmVudE5hbWUsaGFuZGxl
cil7CiB2YXIgaWQ9Z2V0RXZlbnRJRChlbGVtZW50KTsKIHZhciBjPWdldFdyYXBwZXJzRm9yRXZl
bnROYW1lKGlkLGV2ZW50TmFtZSk7CiBpZihjLnBsdWNrKCJoYW5kbGVyIikuaW5jbHVkZShoYW5k
bGVyKSlyZXR1cm4gZmFsc2U7CgogdmFyIHdyYXBwZXI9ZnVuY3Rpb24oZXZlbnQpewogaWYoIUV2
ZW50fHwhRXZlbnQuZXh0ZW5kfHwKKGV2ZW50LmV2ZW50TmFtZSYmZXZlbnQuZXZlbnROYW1lIT1l
dmVudE5hbWUpKQogcmV0dXJuIGZhbHNlOwoKIEV2ZW50LmV4dGVuZChldmVudCk7CiBoYW5kbGVy
LmNhbGwoZWxlbWVudCxldmVudCk7Cn07CgogaWYoIShQcm90b3R5cGUuQnJvd3Nlci5JRSkmJlsn
bW91c2VlbnRlcicsJ21vdXNlbGVhdmUnXS5pbmNsdWRlKGV2ZW50TmFtZSkpewogd3JhcHBlcj13
cmFwcGVyLndyYXAoZnVuY3Rpb24ocHJvY2VlZCxldmVudCl7CiB2YXIgcmVsPWV2ZW50LnJlbGF0
ZWRUYXJnZXQsY3VyPWV2ZW50LmN1cnJlbnRUYXJnZXQ7CiBpZihyZWwmJnJlbC5ub2RlVHlwZT09
Tm9kZS5URVhUX05PREUpcmVsPXJlbC5wYXJlbnROb2RlOwogaWYocmVsJiZyZWwhPWN1ciYmIXJl
bC5kZXNjZW5kYW50T2YoY3VyKSkKIHJldHVybiBwcm9jZWVkKGV2ZW50KTsKfSk7Cn0KCiB3cmFw
cGVyLmhhbmRsZXI9aGFuZGxlcjsKIGMucHVzaCh3cmFwcGVyKTsKIHJldHVybiB3cmFwcGVyOwp9
CgogZnVuY3Rpb24gZGVzdHJveUNhY2hlKCl7CiBmb3IodmFyIGlkIGluIGNhY2hlKQogZm9yKHZh
ciBldmVudE5hbWUgaW4gY2FjaGVbaWRdKQogY2FjaGVbaWRdW2V2ZW50TmFtZV09bnVsbDsKfQoK
IGlmKHdpbmRvdy5hdHRhY2hFdmVudCl7CiB3aW5kb3cuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixk
ZXN0cm95Q2FjaGUpOwp9CgogcmV0dXJuewogb2JzZXJ2ZTpmdW5jdGlvbihlbGVtZW50LGV2ZW50
TmFtZSxoYW5kbGVyKXsKfSwKCiBzdG9wT2JzZXJ2aW5nOmZ1bmN0aW9uKGVsZW1lbnQsZXZlbnRO
YW1lLGhhbmRsZXIpewp9LAoKIGZpcmU6ZnVuY3Rpb24oZWxlbWVudCxldmVudE5hbWUsbWVtbyl7
CiBlbGVtZW50PSQoZWxlbWVudCk7CiBpZihlbGVtZW50PT1kb2N1bWVudCYmZG9jdW1lbnQuY3Jl
YXRlRXZlbnQmJiFlbGVtZW50LmRpc3BhdGNoRXZlbnQpCiBlbGVtZW50PWRvY3VtZW50LmRvY3Vt
ZW50RWxlbWVudDsKCiB2YXIgZXZlbnQ7CiBpZihkb2N1bWVudC5jcmVhdGVFdmVudCl7CiBldmVu
dD1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpOwogZXZlbnQuaW5pdEV2ZW50KCJk
YXRhYXZhaWxhYmxlIix0cnVlLHRydWUpOwp9ZWxzZXsKIGV2ZW50PWRvY3VtZW50LmNyZWF0ZUV2
ZW50T2JqZWN0KCk7CiBldmVudC5ldmVudFR5cGU9Im9uZGF0YWF2YWlsYWJsZSI7Cn0KCiBldmVu
dC5ldmVudE5hbWU9ZXZlbnROYW1lOwogZXZlbnQubWVtbz1tZW1vfHx7fTsKCiBpZihkb2N1bWVu
dC5jcmVhdGVFdmVudCl7CiBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwp9ZWxzZXsKIGVs
ZW1lbnQuZmlyZUV2ZW50KGV2ZW50LmV2ZW50VHlwZSxldmVudCk7Cn0KCiByZXR1cm4gRXZlbnQu
ZXh0ZW5kKGV2ZW50KTsKfQp9Owp9KSgpKTsKCkhhc2gudG9RdWVyeVN0cmluZz1PYmplY3QudG9R
dWVyeVN0cmluZzsKCnZhciBUb2dnbGU9e2Rpc3BsYXk6RWxlbWVudC50b2dnbGV9OwoKdmFyIFBv
c2l0aW9uPXt9OwoKdmFyIENvbnRyb2wgPSB7IH07CgooZnVuY3Rpb24oKXsKIHdpbmRvdy56ZW49
ewoKIGFwaTpmdW5jdGlvbihwYXRoLG9iaix2ZXJiYXRpbSl7CiB2YXIgd3JhcHBlcnM9emVuLmFw
aS5fd3JhcHBlcnM9emVuLmFwaS5fd3JhcHBlcnN8fHt9Owogb2JqPW9ianx8e307CgogaWYoIXdy
YXBwZXJzW3BhdGhdKXsKIHZhciB3cmFwcGVyPW9iajsKIGlmKHR5cGVvZihvYmopIT0nZnVuY3Rp
b24nfHxvYmouc3ViY2xhc3Nlcyl7CgoKIHdyYXBwZXI9ZnVuY3Rpb24oKXsKIHZhciBwYXJ0cz1w
YXRoLnNwbGl0KCcuJyk7CiB2YXIgYXBpPXBhcnRzLnBvcCgpOwogdmFyIGxvYz16ZW4ucmVzb2x2
ZShwYXJ0cyk7CiBpZighbG9jKXJldHVybiBjb25zb2xlLmVycm9yVHJhY2UoJ3plbi5hcGk6IENh
blwndCBjcmVhdGUgIicrcGF0aCsnIicpCiBsb2NbYXBpXT1vYmo7Cn0KfQogd3JhcHBlcnNbcGF0
aF09d3JhcHBlcjsKfWVsc2V7CiByZXR1cm4gY29uc29sZS5lcnJvclRyYWNlKCd6ZW4uYXBpKCk6
ICInK3BhdGgrJyIgYWxyZWFkeSBkZWZpbmVkJyk7Cn0KfSwKCiByZXF1aXJlOmZ1bmN0aW9uKCl7
CiB2YXIgc3RhY2s9emVuLmFwaS5fc3RhY2s9emVuLmFwaS5fc3RhY2t8fFtdOwogJEEoYXJndW1l
bnRzKS5lYWNoKGZ1bmN0aW9uKGFwaSl7CiBzdGFjay5wdXNoKGFwaSk7CiB0cnl7CgogdmFyIGY9
emVuLmFwaS5fd3JhcHBlcnMmJnplbi5hcGkuX3dyYXBwZXJzW2FwaV07CiBpZighZil0aHJvdyBu
ZXcgRXJyb3IoJyInK2FwaSsnIiBpcyBub3QgYSBkZWZpbmVkIEFQSScpOwogemVuLmFwaS5fd3Jh
cHBlcnNbYXBpXT1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKIGYoKTsKfWNhdGNoKGUpewogemVu
LmxvZ0V4Y2VwdGlvbihlLCd6ZW4ucmVxdWlyZSgpIGV4Y2VwdGlvbi4gc3RhY2sgPSAnK3N0YWNr
LmpvaW4oJyA+ICcpKTsKfQogemVuLmFwaS5fd3JhcHBlcnNbYXBpXT1Qcm90b3R5cGUuZW1wdHlG
dW5jdGlvbjsKIHN0YWNrLnBvcCgpOwp9KTsKfSwKCiByZXNvbHZlOmZ1bmN0aW9uKHBhdGgscGFy
ZW50KXsKfSwKCiBwcm94eTpmdW5jdGlvbihyZW1vdGVOYW1lLGxvY2FsTmFtZSl7Cn0sCgogbG9j
YXRlOmZ1bmN0aW9uKG5hbWUsdyl7CiB3PXd8fHBhcmVudDsKIHRyeXsKIHdoaWxlKHcpewogaWYo
d1tuYW1lXSlyZXR1cm4gd1tuYW1lXTsKIHc9KHcucGFyZW50IT09dyk/dy5wYXJlbnQ6dy5vcGVu
ZXI7Cn0KfWNhdGNoKGUpewoKCn0KIHJldHVybiBudWxsOwp9LAoKCiBkZXByZWNhdGU6ZnVuY3Rp
b24oYSxiKXsKIHZhciBjPWFyZ3VtZW50cy5jYWxsZWU7CiBpZihjW2JdKXJldHVybjsKIGNbYl09
dHJ1ZTsKCiBpZihhLmluZGV4T2YoJyEnKT09MCl7CiBjb25zb2xlLmVycm9yKCdEZXByZWNhdGlv
bjogJythLnN1YnN0cigxKSsoYj8nIC0tPiAnK2I6JycpKTsKfWVsc2V7CiBjb25zb2xlLndhcm4o
J0RlcHJlY2F0aW9uOiAnK2ErKGI/JyAtLT4gJytiOicnKSk7Cn0KfSwKCiBsb2dFeGNlcHRpb246
ZnVuY3Rpb24oZSxtc2cpewp9LAoKCiBnZXRXaW5kb3dOYW1lOmZ1bmN0aW9uKCl7CiByZXR1cm4g
d2luZG93Lm5hbWV8fCh3aW5kb3c9PXRvcD8ndG9wJzonbm8gbmFtZScpOwp9LAoKCiBiaW5kOmZ1
bmN0aW9uKCl7CiB2YXIgYT0kQShhcmd1bWVudHMpLG89YS5zaGlmdCgpLGs7CiB3aGlsZShrPWEu
c2hpZnQoKSl7CiB2YXIgYXNFdmVudD1rLmluZGV4T2YoJyMnKT09MDsKIGs9YXNFdmVudD9rLnN1
YnN0cigxKTprOwogaWYoIW9ba10pdGhyb3cgbmV3IEVycm9yKCdiaW5kOiAiJytrKyciIGlzIG5v
dCBkZWZpbmVkJyk7CiBvW2tdPWFzRXZlbnQ/b1trXS5iaW5kQXNFdmVudExpc3RlbmVyKG8pOm9b
a10uYmluZChvKTsKfQp9LAp9OwoKCiBFdmVudC5vYnNlcnZlKHdpbmRvdywnbG9hZCcsZnVuY3Rp
b24oKXtzZXRUaW1lb3V0KHplbi5fc3Vid2luTm90aWZ5LDApfSk7CgoKIHplbi5jb29raWU9ewoK
IGdldDpmdW5jdGlvbihuYW1lKXsKIHZhciBuYW1lRVE9bmFtZSsiPSI7CiB2YXIgY2E9ZG9jdW1l
bnQuY29va2llLnNwbGl0KCc7Jyk7CiBmb3IodmFyIGk9MDtpPGNhLmxlbmd0aDtpKyspewogdmFy
IGM9Y2FbaV07CiB3aGlsZShjLmNoYXJBdCgwKT09JyAnKWM9Yy5zdWJzdHJpbmcoMSxjLmxlbmd0
aCk7CiBpZihjLmluZGV4T2YobmFtZUVRKT09MClyZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxl
bmd0aCxjLmxlbmd0aCk7Cn0KIHJldHVybiBudWxsOwp9LAoKIHNldDpmdW5jdGlvbihuYW1lLHZh
bHVlLGtlZXApewogdmFyIGV4cGlyZXM9a2VlcD9uZXcgRGF0ZSgpOm51bGw7CiBpZihleHBpcmVz
KWV4cGlyZXMuc2V0WWVhcihleHBpcmVzLmdldEZ1bGxZZWFyKCkrNSk7CiBkb2N1bWVudC5jb29r
aWU9bmFtZSsiPSIrdmFsdWUrIjsgcGF0aD0vIisKKCFleHBpcmVzPycnOiI7IGV4cGlyZXM9Iitl
eHBpcmVzLnRvR01UU3RyaW5nKCkpOwp9Cn07CgoKIE9iamVjdC5leHRlbmQod2luZG93LHsKCiAk
dW5pcXVlOmZ1bmN0aW9uKHBhdHRlcm4pewogdmFyIGM9YXJndW1lbnRzLmNhbGxlZTsKIGMuX2k9
KGMuX2l8fDApKzE7CiByZXR1cm4gcGF0dGVybj9wYXR0ZXJuLnJlcGxhY2UoLyMvZyxjLl9pKTpj
Ll9pOwp9LAoKCiAkdG9fYTpmdW5jdGlvbihvYmopewogcmV0dXJuIE9iamVjdC5pc0FycmF5KG9i
aik/b2JqOltvYmpdOwp9LAoKCiAkcHg6ZnVuY3Rpb24obyl7CiByZXR1cm4gcGFyc2VJbnQobykr
J3B4JzsKfSwKCiAkY2lkOmZ1bmN0aW9uKGVsZW1lbnRJZCl7CiB2YXIgbWF0Y2g9ZWxlbWVudElk
Lm1hdGNoKC8oY1xkKikvKTsKIHJldHVybiBtYXRjaD9tYXRjaFswXTpmYWxzZTsKfQoKfSk7Cgog
dmFyIG1ha2VXcmFwcGVyPWZ1bmN0aW9uKHMpewogdmFyIGY9Y29uc29sZVtzXTsKIGNvbnNvbGVb
c109ZnVuY3Rpb24oKXsKIHZhciBhPWFyZ3VtZW50czsKIGFbMF09dHlwZW9mKGFbMF0pPT0nc3Ry
aW5nJz8nWycremVuLmdldFdpbmRvd05hbWUoKSsnXSAnK2FbMF06YVswXTsKIGYuYXBwbHkoY29u
c29sZSxhcmd1bWVudHMpOwp9OwogY29uc29sZVtzKydUcmFjZSddPWZ1bmN0aW9uKCl7CiBjb25z
b2xlLmdyb3VwKCk7CiB2YXIgYT1hcmd1bWVudHM7CiBhWzBdPXR5cGVvZihhWzBdKT09J3N0cmlu
Zyc/J1snK3plbi5nZXRXaW5kb3dOYW1lKCkrJ10gJythWzBdOmFbMF07CiBmLmFwcGx5KGNvbnNv
bGUsYXJndW1lbnRzKTsKIGNvbnNvbGUudHJhY2UoKTsKIGNvbnNvbGUuZ3JvdXBFbmQoKTsKfQp9
OwpbJ2RlYnVnJywnZXJyb3InLCdpbmZvJywnbG9nJywnd2FybiddLmVhY2goZnVuY3Rpb24obyl7
CiBtYWtlV3JhcHBlcihvKTsKfSk7CgoKIGlmKCFQcm90b3R5cGUuQnJvd3Nlci5JRSl7CiBpZihk
b2N1bWVudC5hY3RpdmVFbGVtZW50PT09dW5kZWZpbmVkKXsKIGRvY3VtZW50LmFkZEV2ZW50TGlz
dGVuZXIoJ2ZvY3VzJywKIGZ1bmN0aW9uKGUpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9ZS50YXJn
ZXQ7fSx0cnVlKTsKIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLAogZnVuY3Rpb24o
ZSl7ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD1udWxsO30sdHJ1ZSk7Cn07Cn07CgoKCgogRXZlbnQu
b2JzZXJ2ZShkb2N1bWVudCwnY2xpY2snLGZ1bmN0aW9uKGUpewogdmFyIGVsPUV2ZW50LmVsZW1l
bnQoZT1lfHxldmVudCk7CiB3aGlsZShlbCl7CiBpZihlbC5ub2RlTmFtZT09J0EnKXsKCgoKIHZh
ciBocmVmPShlbC5ocmVmKycnKS5yZXBsYWNlKC8jJC8sJycpOwogdmFyIGxvYz0od2luZG93Lmxv
Y2F0aW9uLmhyZWYrJycpLnJlcGxhY2UoLyMkLywnJyk7CiBpZihocmVmPT09Jyd8fGhyZWY9PWxv
YylFdmVudC5zdG9wKGUpOwp9CiBlbD1lbC5wYXJlbnROb2RlOwp9Cn0pOwoKIEFqYXguUmVzcG9u
ZGVycy5yZWdpc3Rlcih7Cgogb25DcmVhdGU6ZnVuY3Rpb24ocmVxdWVzdCx4bWxIdHRwKXsKIHZh
ciBpbmRpY2F0b3I9cmVxdWVzdC5vcHRpb25zLmluZGljYXRvcjsKIGlmKCFpbmRpY2F0b3IpcmV0
dXJuOwogaWYodHlwZW9mKGluZGljYXRvcik9PSdmdW5jdGlvbicpcmV0dXJuIGluZGljYXRvcih0
cnVlKTsKCiB0cnl7CiBpbmRpY2F0b3I9JChpbmRpY2F0b3IpOwogY29uc29sZS5hc3NlcnQoaW5k
aWNhdG9yJiZpbmRpY2F0b3Iubm9kZU5hbWUsJ2luZGljYXRvciBtdXN0IGJlIGVpdGhlciBhIGZ1
bmN0aW9uIG9yIGFuIGVsZW1lbnQuJyk7CiBpZihpbmRpY2F0b3IpewogdmFyIHQ9cmVxdWVzdC5v
cHRpb25zLmluZGljYXRvclRleHQ7CiBpZih0KWluZGljYXRvci51cGRhdGUodCk7CgoKCihpbmRp
Y2F0b3IudXAoJy53YWl0X2luZGljYXRvcl9jb250YWluZXInKXx8aW5kaWNhdG9yKS5zaG93KCk7
Cn0KfWNhdGNoKGUpewogemVuLmxvZ0V4Y2VwdGlvbihlKTsKfQp9LAoKCiBvbkNvbXBsZXRlOmZ1
bmN0aW9uKHJlcXVlc3QseG1sSHR0cCl7CiB2YXIgaW5kaWNhdG9yPXJlcXVlc3Qub3B0aW9ucy5p
bmRpY2F0b3I7CiBpZighaW5kaWNhdG9yKXJldHVybjsKIGlmKHR5cGVvZihpbmRpY2F0b3IpPT0n
ZnVuY3Rpb24nKXJldHVybiBpbmRpY2F0b3IoZmFsc2UpOwoKIHRyeXsKIGluZGljYXRvcj0kKGlu
ZGljYXRvcik7CiBpZighaW5kaWNhdG9yfHwhaW5kaWNhdG9yLm5vZGVOYW1lKXsKIGNvbnNvbGUu
ZXJyb3JUcmFjZSgnaW5kaWNhdG9yIGZvciAnK3JlcXVlc3QudXJsKycgbXVzdCBiZSBlaXRoZXIg
YSBmdW5jdGlvbiBvciBhbiBlbGVtZW50LicpOwp9CihpbmRpY2F0b3IudXAoJy53YWl0X2luZGlj
YXRvcl9jb250YWluZXInKXx8aW5kaWNhdG9yKS5oaWRlKCk7Cn1jYXRjaChlKXsKIHplbi5sb2dF
eGNlcHRpb24oZSk7Cn0KfSwKCgogb25FeGNlcHRpb246ZnVuY3Rpb24ocmVxdWVzdCxlKXsKIHpl
bi5sb2dFeGNlcHRpb24oZSwnRXhjZXB0aW9uIGR1cmluZyAnK3JlcXVlc3QubWV0aG9kKycgdG8g
JworcmVxdWVzdC51cmwrJz8nCit1bmVzY2FwZShPYmplY3QudG9RdWVyeVN0cmluZyhyZXF1ZXN0
Lm9wdGlvbnMucGFyYW1ldGVycykpKTsKfQp9KTsKCn0pKCk7Cgp6ZW4uYXBpKCd4TmF0aXZlJyxm
dW5jdGlvbigpewoKIE9iamVjdC5leHRlbmQoT2JqZWN0LHsKCiBlYWNoOmZ1bmN0aW9uKG8sZil7
CiB2YXIgcGFpcnM9W107CiBmb3IodmFyIGsgaW4gbylwYWlycy5wdXNoKHtrZXk6ayx2YWx1ZTpv
W2tdfSk7CiBmb3IodmFyIGk9MDtpPHBhaXJzLmxlbmd0aDtpKyspZihwYWlyc1tpXSk7Cn0sCgoK
IGVhY2hLZXk6ZnVuY3Rpb24obyxmKXsKIGlmKG8pT2JqZWN0LmtleXMobykuZWFjaChmKTsKfSwK
CgogZWFjaFZhbHVlOmZ1bmN0aW9uKG8sZil7CiBpZihvKU9iamVjdC52YWx1ZXMobykuZWFjaChm
KTsKfSwKCiBpc0VtcHR5OmZ1bmN0aW9uKG8pewogZm9yKHZhciBrIGluIG8pcmV0dXJuIGZhbHNl
OwogcmV0dXJuIHRydWU7Cn0sCgogZXh0ZW5kT3B0aW9uczpmdW5jdGlvbihkc3Qsc3JjKXsKfSwK
CiByZWRpcmVjdDpmdW5jdGlvbihmcm9tLGZyb21NZXRob2QsdG8sdG9NZXRob2QpewogZnJvbVtm
cm9tTWV0aG9kXT1mdW5jdGlvbigpewogcmV0dXJuIHRvW3RvTWV0aG9kfHxmcm9tTWV0aG9kXS5h
cHBseSh0byxhcmd1bWVudHMpOwp9Owp9Cn0pCgogT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5
cGUsewogbW92ZTpmdW5jdGlvbih4LHkpewp9LAoKIGluc2VydDpmdW5jdGlvbihvLHgpewogdGhp
c1t0aGlzLmxlbmd0aF09bzsKIHJldHVybiB0aGlzLm1vdmUodGhpcy5sZW5ndGgtMSx4fHwwKTsK
fSwKCiByZW1vdmVJbmRleDpmdW5jdGlvbih4KXsKIHRoaXMubW92ZSh4LHRoaXMubGVuZ3RoLTEp
OwogcmV0dXJuIHRoaXMucG9wKCk7Cn0sCgogcmVtb3ZlOmZ1bmN0aW9uKG8pewogdmFyIGw9dGhp
cy5sZW5ndGg7CiBmb3IodmFyIGk9MCxqPTA7aTxsO2krKyl7CiBpZih0aGlzW2ldPT1vKWNvbnRp
bnVlOwogdGhpc1tqXT10aGlzW2ldOwogaisrOwp9CiB3aGlsZShpPmopZGVsZXRlIHRoaXNbaS0t
XTsKIHRoaXMubGVuZ3RoPWo7CiByZXR1cm4gdGhpcy5sZW5ndGg9PWw/bnVsbDpvOwp9LAoKIHRo
cmVhZGVkSXRlcmF0b3I6ZnVuY3Rpb24oaXRlcmF0b3IsbGltaXQsY2FsbGJhY2spewogdmFyIGxl
bmd0aD10aGlzLmxlbmd0aDsKIGlmKGxlbmd0aD49bGltaXQpewogdmFyIHJxPXRoaXMuY2xvbmUo
KTsKIGl0ZXJhdG9yLndyYXAoZnVuY3Rpb24oZnVuYyl7CiB2YXIgaT1ycS5wb3AoKTsKIGZ1bmMo
aSk7CiBpZihycS5sZW5ndGg+MCl7CiByZXR1cm4gdHJ1ZTsKfWVsc2V7CiBpZihjYWxsYmFjayYm
dHlwZW9mKGNhbGxiYWNrKT09J2Z1bmN0aW9uJyljYWxsYmFjaygpOwogcmV0dXJuIGZhbHNlOwp9
Owp9KS5ydW4oKTsKfWVsc2V7CiBmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspewogaXRlcmF0b3Io
dGhpc1tpXSk7Cn07CiBpZihjYWxsYmFjayYmdHlwZW9mKGNhbGxiYWNrKT09J2Z1bmN0aW9uJylj
YWxsYmFjaygpOwp9Cgp9Cgp9KTsKCiBPYmplY3QuZXh0ZW5kKEFycmF5LHsKCiBjcmVhdGVDb21w
YXJhdG9yOmZ1bmN0aW9uKHRtcGwscil7Cn0sCgogc29ydGVkSW5kZXg6ZnVuY3Rpb24oYXJyLGYs
dGFyZ2V0KXsKIHZhciBsb3c9MDsKIHZhciBoaWdoPWFyci5sZW5ndGg7CiB3aGlsZShsb3c8aGln
aCl7CiB2YXIgbWlkPShsb3craGlnaCk+PjE7CiBpZihmKGFyclttaWRdLHRhcmdldCk8MCl7CiBs
b3c9bWlkKzE7Cn1lbHNlewogaGlnaD1taWQ7Cn0KfQogcmV0dXJuIGxvdzsKfSwKCiBzb3J0ZWRJ
bmRleE9mOmZ1bmN0aW9uKGFycixmLHRhcmdldCl7CiB2YXIgaT1BcnJheS5zb3J0ZWRJbmRleChh
cnIsZix0YXJnZXQpOwogZG97CiBpZihhcnJbaV09PT10YXJnZXQpcmV0dXJuIGk7CiBpKys7Cn13
aGlsZShpPGFyci5sZW5ndGgmJmYoYXJyW2ldLHRhcmdldCk9PTApOwoKIHJldHVybi0xOwp9Cn0p
OwoKIE9iamVjdC5leHRlbmQoU3RyaW5nLHsKCiBjb21wYXJlQ2FzZWxlc3M6ZnVuY3Rpb24oYSxi
KXsKIGE9YS50b0xvd2VyQ2FzZSgpOwogYj1iLnRvTG93ZXJDYXNlKCk7CiByZXR1cm4gYTxiPy0x
OihhPmI/MTowKTsKfQp9KTsKCiB2YXIgTWV0aG9kcz17CgogY29tcGFyZUNhc2VsZXNzOmZ1bmN0
aW9uKHMpewogcmV0dXJuIFN0cmluZy5jb21wYXJlQ2FzZWxlc3ModGhpcyxzKTsKfSwKCgogaXNF
cXVhbENhc2VsZXNzOmZ1bmN0aW9uKHMpewogcmV0dXJuIFN0cmluZy5jb21wYXJlQ2FzZWxlc3Mo
dGhpcyxzKT09MDsKfSwKCgogaW5kZXhPZkNhc2VsZXNzOmZ1bmN0aW9uKHMpewogcmV0dXJuIHRo
aXMudG9Mb3dlckNhc2UoKS5pbmRleE9mKHMudG9Mb3dlckNhc2UoKSk7Cn0sCgoKIGhhc2g6ZnVu
Y3Rpb24oKXsKIGZvcih2YXIgaT0wLGg9NTM4MTtpPHRoaXMubGVuZ3RoO2krKyl7CiBoPSgoaCoz
MyledGhpcy5jaGFyQ29kZUF0KGkpKTsKfQogcmV0dXJuIGgmMHg3ZmZmZmZmZjsKfSwKCiBpc0Vt
YWlsQWRkcmVzczpmdW5jdGlvbihhKXsKIHJldHVybiB0aGlzLm1hdGNoKC9eKFtcd1wuXC1cK10r
KUAoKD86Wy1hLXowLTldK1wuKStbYS16XXsyLH0pJC9pKT90cnVlOmZhbHNlOwp9Cn0KIE9iamVj
dC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSxNZXRob2RzKTsKCiBPYmplY3QuZXh0ZW5kKEZ1bmN0
aW9uLnByb3RvdHlwZSx7CgogcnVuOmZ1bmN0aW9uKGFOYW1lKXsKIGlmKCF0aGlzLl9ydW5uZXIp
ewogdmFyIHJ1bm5hYmxlPXRoaXM7CiB0aGlzLl9ydW5OYW1lPWFOYW1lfHwnYW5vbnltb3VzIHRo
cmVhZCBmdW5jdGlvbic7CiB0aGlzLl9ydW5uZXI9ZnVuY3Rpb24oKXsKCiB2YXIgYWdhaW49IXJ1
bm5hYmxlLl9ydW5UaW1lcjsKIHRyeXsKCiBhZ2Fpbj1hZ2Fpbnx8cnVubmFibGUoKTsKfWNhdGNo
KGUpewogemVuLmxvZ0V4Y2VwdGlvbihlLHRoaXMuX3J1bk5hbWUpOwp9ZmluYWxseXsKIHJ1bm5h
YmxlLl9ydW5uaW5nPSEhYWdhaW47Cn0KCiBpZihhZ2Fpbil7CgogcnVubmFibGUuX3J1blRpbWVy
PXNldFRpbWVvdXQocnVubmFibGUuX3J1bm5lciwwKTsKfWVsc2V7CgogcnVubmFibGUuc3RvcFJ1
bm5pbmcoKTsKCgogaWYocnVubmFibGUub25TdG9wKXJ1bm5hYmxlLm9uU3RvcCgpOwp9Cn0KfQoK
CiBpZighdGhpcy5fcnVuVGltZXIpewogY29uc29sZS5sb2coJ3J1bigpOiBTdGFydGluZyAnK3Ro
aXMuX3J1bk5hbWUpOwogdGhpcy5fcnVubmVyKCk7Cn0KfSwKCgogc3RvcFJ1bm5pbmc6ZnVuY3Rp
b24oKXsKIGlmKHRoaXMuX3J1blRpbWVyKXsKIGNvbnNvbGUubG9nKCdydW4oKTogU3RvcHBpbmcg
Jyt0aGlzLl9ydW5OYW1lKTsKIGNsZWFyVGltZW91dCh0aGlzLl9ydW5UaW1lcik7CiBkZWxldGUg
dGhpcy5fcnVuVGltZXI7Cn0KfSwKCgogc2V0TGF6eTpmdW5jdGlvbihtcyxwZXJpb2RpYyl7CiB0
aGlzLl9sek1zPW1zOwogdGhpcy5fbHpQZXJpb2RpYz1wZXJpb2RpYzsKCgogaWYodGhpcy5fbHop
ewogY2xlYXJUaW1lb3V0KHRoaXMuX2x6KTsKIGRlbGV0ZSB0aGlzLl9segp9CgoKIHRoaXMuX2x6
RnVuY3Rpb249dGhpcy5fbHpGdW5jdGlvbnx8ZnVuY3Rpb24oKXsKIHRyeXsKCiB0aGlzKCk7Cn1j
YXRjaChlKXsKIHplbi5sb2dFeGNlcHRpb24oZSk7Cn1maW5hbGx5ewogZGVsZXRlIHRoaXMuX2x6
OwoKCiBpZih0aGlzLl9selBlcmlvZGljKXsKIHRoaXMuc2V0TGF6eSh0aGlzLl9sek1zLHRydWUp
Owp9ZWxzZXsKCiB0aGlzLmNsZWFyTGF6eSgpOwp9Cn0KfS5iaW5kKHRoaXMpOwoKIHRoaXMuX2x6
PXNldFRpbWVvdXQodGhpcy5fbHpGdW5jdGlvbix0aGlzLl9sek1zfHwwKTsKCiByZXR1cm4gdGhp
czsKfSwKCiBjbGVhckxhenk6ZnVuY3Rpb24oKXsKfSwKCiBiaW5kU2hpZnQ6ZnVuY3Rpb24oY29u
dGV4dCxuKXsKIHZhciBmPXRoaXM7CiByZXR1cm4gZnVuY3Rpb24oKXtmLmFwcGx5KGNvbnRleHQs
JEEoYXJndW1lbnRzKS5zcGxpY2Uobnx8MSkpO307Cn0sCgoKIGFmdGVyOmZ1bmN0aW9uKGJlZm9y
ZSl7Cn0sCgogYmVmb3JlOmZ1bmN0aW9uKGFmdGVyKXsKfSwKCiBwaXBlOmZ1bmN0aW9uKGRzdCl7
Cn0KfSk7CgogSGFzaC5hZGRNZXRob2RzKHsKCiBoYXNLZXk6ZnVuY3Rpb24oayl7cmV0dXJuIGsg
aW4gdGhpcy5fb2JqZWN0O30KfSk7Cn0pOwoKemVuLmFwaSgnT2JzZXJ2YWJsZScsZnVuY3Rpb24o
KXsKIHplbi5yZXF1aXJlKCd4TmF0aXZlJyk7CgoKIHdpbmRvdy5PYnNlcnZlSGVscGVyPUNsYXNz
LmNyZWF0ZSh7Cn0pOwoKCiB3aW5kb3cuT2JzZXJ2YWJsZT17CgoKCiBTVE9QX09CU0VSVklORzow
eERFQ0VBNUVELAoKCiBBTExfRVZFTlRTOidfYWxsX2V2ZW50c18nLAoKCiBleHRlbmQ6ZnVuY3Rp
b24obyl7CiByZXR1cm4gT2JqZWN0LmV4dGVuZChvLE9ic2VydmFibGUuTWV0aG9kcyk7Cn0sCgoK
IE1ldGhvZHM6ewoKIG9ic2VydmU6ZnVuY3Rpb24oZSxvYnNlcnZlcixzY29wZSxtc2cpewp9LAoK
IG5vdGlmeTpmdW5jdGlvbihlKXsKIGlmKCFlKXJldHVybiBjb25zb2xlLmVycm9yVHJhY2UoJ0lu
dmFsaWQgZXZlbnQ6ICcrZSk7CgogdmFyIG9icz10aGlzLl9fb2JzZXJ2ZXJzOwogaWYoIW9icyly
ZXR1cm47CgoKCiB2YXIgdGhpbj1mYWxzZSxvYnNsZW49b2JzLmxlbmd0aDsKIHZhciBub2JzPTA7
CiBmb3IodmFyIGk9MDtpPG9ic2xlbjtpKyspewogdmFyIG89b2JzW2ldOwogaWYoIW8pdGhpbj10
cnVlOwogaWYoIW98fChvLmUhPWUmJm8uZSE9T2JzZXJ2YWJsZS5BTExfRVZFTlRTKSljb250aW51
ZTsKIG5vYnMrKzsKCiB0cnl7CiBvLm9ic2VydmVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKfWNh
dGNoKGV4KXsKIGlmKGV4PT1PYnNlcnZhYmxlLlNUT1BfT0JTRVJWSU5HKXsKCiBvYnNbaV09bnVs
bDsKfWVsc2V7CiBjb25zb2xlLmdyb3VwKCdFeGNlcHRpb24gZHVyaW5nIG5vdGlmeSgnK2UrJyk6
Jyk7CiBjb25zb2xlLmRpcihleCk7CiBjb25zb2xlLnRyYWNlKCk7CiBjb25zb2xlLmdyb3VwRW5k
KCk7Cn0KfQp9CgogaWYobm9icz42KXsKIGNvbnNvbGUud2Fybignbm90aWZ5KCk6ICInK2UrJyIg
aGFzICcrbm9icysnIG9ic2VydmVycyAuLi4gcG9zc2libGUgb2JzZXJ2ZXIgbGVhaz8nKTsKfQog
aWYodGhpbilvYnMudGhpbigpOwp9Cn0KfTsKfSk7Cgp6ZW4uYXBpKCdaZW5JdGVtJyxmdW5jdGlv
bigpewogemVuLnJlcXVpcmUoJ09ic2VydmFibGUnLCd4TmF0aXZlJyk7CgoKIHdpbmRvdy5aZW5J
dGVtPUNsYXNzLmNyZWF0ZShIYXNoKTsKIFplbkl0ZW0uYWRkTWV0aG9kcyhPYnNlcnZhYmxlLk1l
dGhvZHMpOwoKIE9iamVjdC5leHRlbmQoWmVuSXRlbSx7CgogUkVMRUFTRUQ6J3JlbGVhc2VkKGl0
ZW0pJywKCgogUkVNT1ZFOidyZW1vdmUoaXRlbSwgcXVpZXQpJywKCgogQ0hBTkdFRDonY2hhbmdl
ZChpdGVtKScsCgoKIENIQU5HRURfSUQ6J2NoYW5nZWRfaWQoaXRlbSwgb2xkSWQsIG5ld0lkKScs
CgoKCiBKU1VQX0tFWVM6bmV3IFJlZ0V4cCgnX25ld3xfZGVsZXRlfF91cGRhdGUnKSwKCgoKIGNv
bXBhcmVJZDpBcnJheS5jcmVhdGVDb21wYXJhdG9yKCcje29iamVjdH0uaWQnKQp9KTsKCiBaZW5J
dGVtLmFkZE1ldGhvZHMoewoKIEZJTFRFUlM6e30sCgoKIF9wcmV2aW91c1N0YXRlOm51bGwsCgoK
IF9jaGFuZ2VkOmZhbHNlLAoKCiBpbml0aWFsaXplOmZ1bmN0aW9uKCRzdXBlcixvYmopewogJHN1
cGVyKCk7CgogdGhpcy5fcmVmcz0wOwoKIG9iaj1vYmp8fHt9Owogb2JqLmlkPW9iai5pZDsKIHRo
aXMuc2V0QWxsKG9iaix0cnVlKTsKIHRoaXMuY2lkPSR1bmlxdWUoJ2MjJyk7CgoKIHRoaXMuX2No
YW5nZWQ9ZmFsc2U7CiB0aGlzLl9wcmV2aW91c1N0YXRlPXRoaXMudG9PYmplY3QoKTsKfSwKCgog
Y2xvbmU6ZnVuY3Rpb24oKXsKIHJldHVybiBuZXcodGhpcy5jb25zdHJ1Y3RvcikodGhpcy50b09i
amVjdCgpKTsKfSwKCiBpc0VxdWFsOmZ1bmN0aW9uKGl0ZW0pewogcmV0dXJuIGl0ZW0mJk9iamVj
dC5pc0VxdWFsKHRoaXMuX29iamVjdCxpdGVtLl9vYmplY3QpOwp9LAoKCiBub3RpZnlDaGFuZ2Vk
OmZ1bmN0aW9uKCl7CiB0aGlzLm5vdGlmeShaZW5JdGVtLkNIQU5HRUQsdGhpcyk7CiB0aGlzLl9w
cmV2aW91c1N0YXRlPXRoaXMudG9PYmplY3QoKTsKIHRoaXMuX2NoYW5nZWQ9ZmFsc2U7CiB0aGlz
Ll9jaGFuZ2VkUHJvcGVydGllcz1mYWxzZTsKfSwKCgogbm90aWZ5UmVtb3ZlOmZ1bmN0aW9uKHF1
aWV0KXsKIHRoaXMubm90aWZ5KFplbkl0ZW0uUkVNT1ZFLHRoaXMscXVpZXQpOwogY29uc29sZS5h
c3NlcnQodGhpcy5fcmVmcz09MCwnbm90aWZ5UmVtb3ZlOiBJdGVtIG5vdCBjb21wbGV0ZWx5IHJl
bW92ZWQ/Jyk7Cn0sCgoKIGlzQ2hhbmdlZDpmdW5jdGlvbihrKXsKIHJldHVybiBrP3RoaXMuX3By
ZXZpb3VzU3RhdGVba10hPXRoaXMuX29iamVjdFtrXTp0aGlzLl9jaGFuZ2VkOwp9LAoKIGhhc0lk
OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5pZCYmdGhpcy5pZD4wOwp9LAoKCiBjbGVhcjpmdW5j
dGlvbigpewogdGhpcy5fb2JqZWN0PXsKIGlkOnRoaXMuaWQKfTsKIHJldHVybiB0aGlzOwp9LAoK
CiBzZXRBbGw6ZnVuY3Rpb24ob2JqLHF1aWV0KXsKIGlmKCFvYmopcmV0dXJuOwogb2JqPW9iai5f
b2JqZWN0fHxvYmo7CgogZm9yKHZhciBrIGluIG9iail7CiBpZighWmVuSXRlbS5KU1VQX0tFWVMu
dGVzdChrKSl0aGlzLnNldChrLG9ialtrXSxxdWlldCk7Cn0KIHJldHVybiB0aGlzOwp9LAoKIHNl
dE9iamVjdDpmdW5jdGlvbihvYmoscXVpZXQpewogemVuLmRlcHJlY2F0ZSgnWmVuSXRlbS5zZXRP
YmplY3QnLCdaZW5JdGVtLnNldEFsbCcpOwogcmV0dXJuIHRoaXMuc2V0QWxsKG9iaixxdWlldCk7
Cn0sCgoKIHNldDpmdW5jdGlvbihrLHYscXVpZXQpewoKIHZhciBmPXRoaXMuRklMVEVSU1trXTsK
IHY9Zj9mKHYpOnY7CgogaWYoaz09J2lkJyYmKCF2fHx2IT10aGlzLmlkKSl7CiB2YXIgb2xkSWQ9
dGhpcy5pZDsKCiB2PXZ8fCR1bmlxdWUoKSotMTsKIGlmKHYhPW9sZElkKXsKIHRoaXMuaWQ9djsK
IGlmKCFxdWlldCl0aGlzLm5vdGlmeShaZW5JdGVtLkNIQU5HRURfSUQsdGhpcyxvbGRJZCx2KTsK
fQp9CiByZXR1cm4gdGhpcy5fb2JqZWN0W2tdPXY7Cn0sCgoKIHVuc2V0OmZ1bmN0aW9uKCRzdXBl
cixrKXsKIGlmKGs9PSdpZCcpcmV0dXJuIGNvbnNvbGUud2FybignWmVuSXRlbTogImlkIiBjYW5u
b3QgYmUgdW5zZXQuJyk7CiByZXR1cm4gJHN1cGVyKGspOwp9LAoKIHJldGFpbjpmdW5jdGlvbigp
ewogdGhpcy5fcmVmcysrOwoKCgoKIGlmKHRoaXMuX3JlZnM+NSl7CiBjb25zb2xlLndhcm4oJ1Vu
ZXhwZWN0ZWRseSBoaWdoIHJlZmVyZW5jZSBjb3VudCAoJyt0aGlzLl9yZWZzKycpIGZvciAnK3Ro
aXMpOwp9Cn0sCgoKIHJlbGVhc2U6ZnVuY3Rpb24oKXsKIHRoaXMuX3JlZnMtLTsKIGlmKHRoaXMu
X3JlZnM8MCl7CiBjb25zb2xlLndhcm4oJ1JlZmVyZW5jZSBjb3VudCA8IDAgZm9yICcrdGhpcyk7
Cn0KIGlmKHRoaXMuX3JlZnM8PTApewogdGhpcy5ub3RpZnkoWmVuSXRlbS5SRUxFQVNFRCx0aGlz
KTsKfQp9LAoKIHRvU3RyaW5nOmZ1bmN0aW9uKCl7CiByZXR1cm4nSXRlbSAnK3RoaXMuaWQ7Cn0K
fSk7CgogWmVuSXRlbS5fbm9wcm94eT10cnVlOwp9KTsKCnplbi5hcGkoJ1plblNldCcsZnVuY3Rp
b24oKXsKIHplbi5yZXF1aXJlKCd4TmF0aXZlJywnWmVuSXRlbScpOwoKCiB3aW5kb3cuWmVuU2V0
PUNsYXNzLmNyZWF0ZSgpOwogWmVuU2V0LmFkZE1ldGhvZHMoRW51bWVyYWJsZSk7CiBaZW5TZXQu
YWRkTWV0aG9kcyhPYnNlcnZhYmxlLk1ldGhvZHMpOwoKIE9iamVjdC5leHRlbmQoWmVuU2V0LHsK
CiBJVEVNX0NIQU5HRUQ6J2l0ZW1DaGFuZ2VkKHNldCwgaXRlbSknLAoKCiBJVEVNX0NIQU5HRURf
SUQ6J2l0ZW1DaGFuZ2VkSWQoc2V0LCBpdGVtLCBvbGRJZCwgbmV3SWQpJywKCgogSVRFTV9BRERF
RDonaXRlbUFkZGVkKHNldCwgaXRlbSknLAoKCiBJVEVNX1JFTU9WRUQ6J2l0ZW1SZW1vdmVkKHNl
dCwgaXRlbSknLAoKCiBVUERBVEVEOid1cGRhdGVkKHNldCknCn0pOwoKIFplblNldC5hZGRNZXRo
b2RzKHsKCiBpbml0aWFsaXplOmZ1bmN0aW9uKHJldGFpbkl0ZW1zKXsKIGNvbnNvbGUuYXNzZXJ0
KHR5cGVvZihyZXRhaW5JdGVtcyk9PSdib29sZWFuJywnWmVuU2V0OiByZXRhaW5JdGVtcyBtdXN0
IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlJyk7CgogemVuLmJpbmQodGhpcywnaGFuZGxlSXRlbUV2
ZW50JywnX2RldGFjaCcpOwoKIHRoaXMuX3JldGFpbkl0ZW1zPXJldGFpbkl0ZW1zIT09ZmFsc2U7
CiB0aGlzLl9pbml0KCk7CgogdGhpcy5zZXRGaWx0ZXIodGhpcy5fZmlsdGVyKTsKfSwKCgogX2lu
aXQ6ZnVuY3Rpb24oKXsKIE9iamVjdC5lYWNoVmFsdWUodGhpcy5fYnlJZCx0aGlzLl9kZXRhY2gp
OwogdGhpcy5fc2l6ZT0wOwogdGhpcy5fYnlJZD17fTsKIHRoaXMuX2J5Q2lkPXt9Owp9LAoKCiBk
ZXN0cm95OmZ1bmN0aW9uKCl7CiB0aGlzLnJlbW92ZUFsbCgpOwp9LAoKCiBfZWFjaDpmdW5jdGlv
bihmKXsKIE9iamVjdC52YWx1ZXModGhpcy5fYnlJZCkuX2VhY2goZik7Cn0sCgoKIHNldEZpbHRl
cjpmdW5jdGlvbihmaWx0ZXIscXVpZXQpewogdGhpcy5fZmlsdGVyPWZpbHRlcnx8UHJvdG90eXBl
Lks7CiB0aGlzLmZpbHRlcihxdWlldCk7Cn0sCgoKIGZpbHRlcjpmdW5jdGlvbihxdWlldCl7CiB0
aGlzLnJlcGxhY2UodGhpcy5maW5kQWxsKHRoaXMuX2ZpbHRlcikscXVpZXQpOwp9LAoKCiBoYW5k
bGVJdGVtRXZlbnQ6ZnVuY3Rpb24oZSxpdGVtLGEsYil7CiBzd2l0Y2goZSl7CiBjYXNlIFplbkl0
ZW0uQ0hBTkdFRDoKIHRoaXMubm90aWZ5KFplblNldC5JVEVNX0NIQU5HRUQsdGhpcyxpdGVtKTsK
IGJyZWFrOwogY2FzZSBaZW5JdGVtLkNIQU5HRURfSUQ6CgogaWYodGhpcy5fYnlJZFthXSl7CiBk
ZWxldGUgdGhpcy5fYnlJZFthXTsKIHRoaXMuX2J5SWRbYl09aXRlbTsKfQogdGhpcy5ub3RpZnko
WmVuU2V0LklURU1fQ0hBTkdFRF9JRCx0aGlzLGl0ZW0pOwogYnJlYWs7CiBjYXNlIFplbkl0ZW0u
UkVMRUFTRUQ6CiBhPXRydWU7CiBjYXNlIFplbkl0ZW0uUkVNT1ZFOgoKIHRoaXMucmVtb3ZlKGl0
ZW0sYSk7CiBicmVhazsKfQp9LAoKCiBub3RpZnlJdGVtQWRkZWQ6ZnVuY3Rpb24oaXRlbSl7CiB0
aGlzLm5vdGlmeShaZW5TZXQuSVRFTV9BRERFRCx0aGlzLGl0ZW0pOwp9LAoKCiBub3RpZnlJdGVt
UmVtb3ZlZDpmdW5jdGlvbihpdGVtKXsKIHRoaXMubm90aWZ5KFplblNldC5JVEVNX1JFTU9WRUQs
dGhpcyxpdGVtKTsKfSwKCgogbm90aWZ5VXBkYXRlZDpmdW5jdGlvbigpewogdGhpcy5ub3RpZnko
WmVuU2V0LlVQREFURUQsdGhpcyk7Cn0sCgoKIGdldDpmdW5jdGlvbihpZCl7CiByZXR1cm4gaWQh
PXVuZGVmaW5lZCYmdGhpcy5fYnlJZFtpZC5pZHx8aWRdOwp9LAoKCiBnZXRCeUNpZDpmdW5jdGlv
bihpZCl7CiByZXR1cm4gaWQhPXVuZGVmaW5lZCYmdGhpcy5fYnlDaWRbaWQuaWR8fGlkXTsKfSwK
CgoKIGdldElkczpmdW5jdGlvbigpewogcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2J5SWQpOwp9
LAoKCgogZ2V0Q2lkczpmdW5jdGlvbigpewogcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2J5Q2lk
KTsKfSwKCgoKIHNpemU6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLl9zaXplOwp9LAoKCiBjb250
YWluczpmdW5jdGlvbihpdGVtKXsKIHJldHVybiEhdGhpcy5fYnlJZFtpdGVtLmlkXTsKfSwKCgog
X2F0dGFjaDpmdW5jdGlvbihpdGVtKXsKIGl0ZW0ub2JzZXJ2ZShPYnNlcnZhYmxlLkFMTF9FVkVO
VFMsdGhpcy5oYW5kbGVJdGVtRXZlbnQsdGhpcyk7CiBpZih0aGlzLl9yZXRhaW5JdGVtcylpdGVt
LnJldGFpbigpOwp9LAoKCiBfZGV0YWNoOmZ1bmN0aW9uKGl0ZW0pewogaXRlbS5zdG9wT2JzZXJ2
aW5nKG51bGwsbnVsbCx0aGlzKTsKIGlmKHRoaXMuX3JldGFpbkl0ZW1zKWl0ZW0ucmVsZWFzZSgp
Owp9LAoKCiBhZGQ6ZnVuY3Rpb24oaXRlbSxxdWlldCl7CiB2YXIgY3VycmVudD10aGlzLmdldChp
dGVtKTsKIGlmKCFjdXJyZW50KXsKIGlmKCF0aGlzLl9maWx0ZXIoaXRlbSkpcmV0dXJuIG51bGw7
CiB0aGlzLl9ieUlkW2l0ZW0uaWRdPWl0ZW07CiB0aGlzLl9ieUNpZFtpdGVtLmNpZF09aXRlbTsK
IHRoaXMuX2F0dGFjaChpdGVtKTsKIHRoaXMuX3NpemUrKzsKCiBpZih0aGlzLl9hZnRlckFkZCl0
aGlzLl9hZnRlckFkZChpdGVtLHF1aWV0KTsKIGlmKCFxdWlldCl0aGlzLm5vdGlmeUl0ZW1BZGRl
ZChpdGVtKTsKIHJldHVybiBpdGVtOwp9ZWxzZSBpZihjdXJyZW50IT09aXRlbSl7CiBjb25zb2xl
Lndhcm4oJ1plblNldDogV2FybmluZyAtIEZvdW5kIHR3byBpdGVtcyB3aXRoIHRoZSBzYW1lIGlk
KCEhISknKTsKfQogcmV0dXJuIG51bGw7Cn0sCgoKIGFkZEFsbDpmdW5jdGlvbihpdGVtcyxxdWll
dCl7CiBpdGVtcz1PYmplY3QuaXNBcnJheShpdGVtcyk/aXRlbXM6KGl0ZW1zLnZhbHVlcz9pdGVt
cy52YWx1ZXMoKTpPYmplY3QudmFsdWVzKGl0ZW1zKSk7CiBmb3IodmFyIGk9MDtpPGl0ZW1zLmxl
bmd0aDtpKyspdGhpcy5hZGQoaXRlbXNbaV0scXVpZXQpOwp9LAoKCiByZW1vdmU6ZnVuY3Rpb24o
aXRlbSxxdWlldCl7Cn0sCgogcmVtb3ZlQnlJZHM6ZnVuY3Rpb24oaWRzLHF1aWV0KXsKIGlkcy5l
YWNoKGZ1bmN0aW9uKGlkKXsKIHRoaXMucmVtb3ZlKGlkLHF1aWV0KTsKfS5iaW5kKHRoaXMpKTsK
fSwKCgogcmVtb3ZlQWxsOmZ1bmN0aW9uKHF1aWV0KXsKIHRoaXMucmVwbGFjZShudWxsLHF1aWV0
KTsKfSwKCgogcmVwbGFjZTpmdW5jdGlvbihpdGVtcyxxdWlldCl7CiBpdGVtcz1pdGVtc3x8W107
CiBpdGVtcy5pbnZva2UoJ3JldGFpbicpOwogdGhpcy5faW5pdCgpOwogdGhpcy5hZGRBbGwoaXRl
bXMsdHJ1ZSk7CiBpdGVtcy5pbnZva2UoJ3JlbGVhc2UnKTsKCiBpZighcXVpZXQpdGhpcy5ub3Rp
ZnlVcGRhdGVkKCk7CiBpZih0aGlzLl9hZnRlclVwZGF0ZSl0aGlzLl9hZnRlclVwZGF0ZShxdWll
dCk7Cn0KfSk7CgogWmVuU2V0Ll9ub3Byb3h5PXRydWU7Cn0pOwp6ZW4uYXBpKCdaZW5Tb3J0ZWRT
ZXQnLGZ1bmN0aW9uKCl7CiB6ZW4ucmVxdWlyZSgneE5hdGl2ZScsJ1plblNldCcpOwoKCiB3aW5k
b3cuWmVuU29ydGVkU2V0PUNsYXNzLmNyZWF0ZShaZW5TZXQsewoKIGluaXRpYWxpemU6ZnVuY3Rp
b24oJHN1cGVyLGNvbXBhcmF0b3IscmV0YWluSXRlbXMpewogJHN1cGVyKHJldGFpbkl0ZW1zKTsK
IHRoaXMuc2V0Q29tcGFyYXRvcihjb21wYXJhdG9yLHRydWUpOwp9LAoKCiBfaW5pdDpmdW5jdGlv
bigkc3VwZXIpewogJHN1cGVyKCk7CiB0aGlzLl9ieUluZGV4PVtdOwp9LAoKCiBfZWFjaDpmdW5j
dGlvbihpdGVyYXRvcil7CiByZXR1cm4gdGhpcy5fYnlJbmRleC5fZWFjaChpdGVyYXRvcik7Cn0s
CgoKIGluZGV4T2Y6ZnVuY3Rpb24oaXRlbSl7CiByZXR1cm4gQXJyYXkuc29ydGVkSW5kZXhPZih0
aGlzLl9ieUluZGV4LHRoaXMuX2NvbXBhcmF0b3IsaXRlbSk7Cn0sCgoKIGdldEl0ZW1BdDpmdW5j
dGlvbihpKXsKIHJldHVybiB0aGlzLl9ieUluZGV4W2ldOwp9LAoKCiBmaXJzdDpmdW5jdGlvbihm
KXsKIHJldHVybiFmP3RoaXMuX2J5SW5kZXguZmlyc3QoKToKIHRoaXMuaW5qZWN0KG51bGwsZnVu
Y3Rpb24oYWNjLHZhbHVlKXsKIHJldHVybiFhY2M/dmFsdWU6ZihhY2MsdmFsdWUpPDA/YWNjOnZh
bHVlOwp9KTsKfSwKCgogbGFzdDpmdW5jdGlvbihmKXsKIHJldHVybiFmP3RoaXMuX2J5SW5kZXgu
bGFzdCgpOgogdGhpcy5pbmplY3QobnVsbCxmdW5jdGlvbihhY2MsdmFsdWUpewogcmV0dXJuIWFj
Yz92YWx1ZTpmKGFjYyx2YWx1ZSk+MD9hY2M6dmFsdWU7Cn0pOwp9LAoKCiBiZWZvcmU6ZnVuY3Rp
b24oaXRlbSl7CiB2YXIgaT10aGlzLmluZGV4T2YoaXRlbSk7CiByZXR1cm4gaT49MD90aGlzLl9i
eUluZGV4W2ktMV06bnVsbDsKfSwKCgogYWZ0ZXI6ZnVuY3Rpb24oaXRlbSl7CiB2YXIgaT10aGlz
LmluZGV4T2YoaXRlbSk7CiByZXR1cm4gaT49MD90aGlzLl9ieUluZGV4W2krMV06bnVsbDsKfSwK
Cgogc2V0Q29tcGFyYXRvcjpmdW5jdGlvbihjb21wYXJhdG9yLHF1aWV0KXsKIGNvbXBhcmF0b3I9
Y29tcGFyYXRvcnx8WmVuSXRlbS5jb21wYXJlSWQ7CiBpZih0aGlzLl9jb21wYXJhdG9yPT1jb21w
YXJhdG9yKXJldHVybjsKIHRoaXMuX2NvbXBhcmF0b3I9Y29tcGFyYXRvcjsKIHRoaXMuc29ydChx
dWlldCk7Cn0sCgoKIHNvcnQ6ZnVuY3Rpb24ocXVpZXQpewogdGhpcy5fYnlJbmRleC5zb3J0KHRo
aXMuX2NvbXBhcmF0b3IpOwogaWYocXVpZXQpdGhpcy5ub3RpZnlVcGRhdGVkKCk7Cn0sCgoKIGFk
ZDpmdW5jdGlvbigkc3VwZXIsaXRlbSxxdWlldCl7CiBpZihpdGVtPSRzdXBlcihpdGVtLHRydWUp
KXsKIHZhciBpPUFycmF5LnNvcnRlZEluZGV4KHRoaXMuX2J5SW5kZXgsdGhpcy5fY29tcGFyYXRv
cixpdGVtKTsKIHRoaXMuX2J5SW5kZXguaW5zZXJ0KGl0ZW0saSk7CiBpZighcXVpZXQpdGhpcy5u
b3RpZnlJdGVtQWRkZWQoaXRlbSk7Cn0KIHJldHVybiBpdGVtOwp9LAoKCiByZW1vdmU6ZnVuY3Rp
b24oJHN1cGVyLGl0ZW0scXVpZXQpewogaWYoaXRlbT0kc3VwZXIoaXRlbSx0cnVlKSl7CiB0aGlz
Ll9ieUluZGV4LnJlbW92ZShpdGVtKTsKIGlmKCFxdWlldCl0aGlzLm5vdGlmeUl0ZW1SZW1vdmVk
KGl0ZW0pOwp9CiByZXR1cm4gaXRlbTsKfQp9KTsKCiBaZW5Tb3J0ZWRTZXQuX25vcHJveHk9dHJ1
ZTsKfSk7Cgp6ZW4uYXBpKCdaZW5TdWJzZXQnLGZ1bmN0aW9uKCl7Cgogd2luZG93LlplblN1YnNl
dD17CiBleHRlbmQ6ZnVuY3Rpb24oc2V0KXsKCiBzZXQuX3N1YnNldF9kZXN0cm95PXNldC5kZXN0
cm95Owogc2V0Ll9zdWJzZXRfaGFuZGxlSXRlbUV2ZW50PXNldC5oYW5kbGVJdGVtRXZlbnQ7Cgog
T2JqZWN0LmV4dGVuZChzZXQsWmVuU3Vic2V0Lk1ldGhvZHMpOwogemVuLmJpbmQoc2V0LCdfaGFu
ZGxlU291cmNlRXZlbnQnLCdoYW5kbGVJdGVtRXZlbnQnKTsKfSwKCiBNZXRob2RzOnsKCiBkZXN0
cm95OmZ1bmN0aW9uKCl7CiB0aGlzLnNldFNvdXJjZShudWxsKTsKIHRoaXMuX3N1YnNldF9kZXN0
cm95KCk7Cn0sCgogc2V0U291cmNlOmZ1bmN0aW9uKHNvdXJjZSxxdWlldCl7CiBpZih0aGlzLl9z
b3VyY2UpdGhpcy5fc291cmNlLnN0b3BPYnNlcnZpbmcoT2JzZXJ2YWJsZS5BTExfRVZFTlRTLAog
dGhpcy5faGFuZGxlU291cmNlRXZlbnQpOwogaWYoc291cmNlKXNvdXJjZS5vYnNlcnZlKE9ic2Vy
dmFibGUuQUxMX0VWRU5UUyx0aGlzLl9oYW5kbGVTb3VyY2VFdmVudCwKIHRoaXMpOwogdGhpcy5f
c291cmNlPXNvdXJjZTsKIHRoaXMuZmlsdGVyKHF1aWV0KTsKfSwKCiBfaGFuZGxlU291cmNlRXZl
bnQ6ZnVuY3Rpb24oZSxzZXQsaXRlbSl7CiBzd2l0Y2goZSl7CiBjYXNlIFplblNldC5JVEVNX1JF
TU9WRUQ6CiB0aGlzLnJlbW92ZShpdGVtKTticmVhazsKIGNhc2UgWmVuU2V0LklURU1fQURERUQ6
CiBjYXNlIFplblNldC5JVEVNX0NIQU5HRUQ6CiB0aGlzLl9jaGVja0l0ZW0oaXRlbSk7YnJlYWs7
CiBjYXNlIFplblNldC5VUERBVEVEOgogdGhpcy5maWx0ZXIoKTticmVhazsKfQp9LAoKCiBoYW5k
bGVJdGVtRXZlbnQ6ZnVuY3Rpb24oZSxpdGVtLGEsYil7CgogaWYoZT09WmVuSXRlbS5DSEFOR0VE
JiZ0aGlzLl9jaGVja0l0ZW0oaXRlbSkpcmV0dXJuOwoKIHJldHVybiB0aGlzLl9zdWJzZXRfaGFu
ZGxlSXRlbUV2ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKfSwKCgogZmlsdGVyOmZ1bmN0aW9u
KHF1aWV0KXsKIHZhciBzcmM9dGhpcy5fc291cmNlfHx0aGlzOwogdGhpcy5yZXBsYWNlKHNyYy5m
aW5kQWxsKHRoaXMuX2ZpbHRlcikscXVpZXQpOwp9Cn0KfQp9KTsKCnplbi5hcGkoJ0hUVFAnLGZ1
bmN0aW9uKCl7Cgogd2luZG93LkhUVFBDbGFzcz1DbGFzcy5jcmVhdGUoewoKIEdFVDonZ2V0JywK
CiBQVVQ6J3B1dCcsCgogUE9TVDoncG9zdCcsCgogREVMRVRFOidkZWxldGUnLAoKCiBnZXQ6ZnVu
Y3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnJlcXVlc3QoYSxiLGMsdGhpcy5HRVQpfSwKCgogcHV0
OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGEsYixjLHRoaXMuUFVUKX0sCgoK
IHBvc3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnJlcXVlc3QoYSxiLGMsdGhpcy5QT1NU
KX0sCgoKIERlbGV0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucmVxdWVzdChhLGIsYyx0
aGlzLkRFTEVURSl9Cn0pOwoKIHdpbmRvdy5IVFRQPW5ldyBIVFRQQ2xhc3MoKTsKfSk7Cgp6ZW4u
YXBpKCdJbnB1dFRleHQnLGZ1bmN0aW9uKCl7CiB6ZW4ucmVxdWlyZSgneEVsZW1lbnQnKTsKCgog
d2luZG93LklucHV0VGV4dD1PYmplY3QuZXh0ZW5kKHt9LHsKCiBERUZBVUxUX0FUVFI6J2RlZmF1
bHRfdmFsdWUnLAoKCiBERUZBVUxUX0NOOidkZWZhdWx0X3ZhbHVlJywKCgogZW5hYmxlQWxsOmZ1
bmN0aW9uKCl7CiAkQShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKSkuY29u
Y2F0KAogJEEoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHRhcmVhJykpCikuZWFj
aChmdW5jdGlvbihlbCl7SW5wdXRUZXh0LmVuYWJsZShlbCk7fSk7Cn0sCgoKIGVuYWJsZTpmdW5j
dGlvbihlbCx2YWx1ZSxzZWxlY3RPbkZvY3VzKXsKIGVsPSQoZWwpOwoKCiBpZihlbC5fZGVmYXVs
dHx8KCFlbC5nZXRBdHRyaWJ1dGUoSW5wdXRUZXh0LkRFRkFVTFRfQVRUUikmJiF2YWx1ZSkpewog
cmV0dXJuOwp9CgogZWwuX2RlZmF1bHQ9dmFsdWV8fGVsLmdldEF0dHJpYnV0ZShJbnB1dFRleHQu
REVGQVVMVF9BVFRSKTsKIGNvbnNvbGUuYXNzZXJ0KGVsLl9kZWZhdWx0LCdJbnB1dCBmaWVsZCBl
eHBlY3RlZCB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZScpOwoKIGVsLl9zZWxlY3RPbkZvY3VzPXNl
bGVjdE9uRm9jdXM7CiBPYmplY3QuZXh0ZW5kKGVsLElucHV0VGV4dC5tZXRob2RzKTsKCgoKIGlm
KGVsLnR5cGU9PSdwYXNzd29yZCcpewogaWYoIVByb3RvdHlwZS5Ccm93c2VyLklFKXsKIHZhciBk
ZWw9ZWwuX2RlZmF1bHRGaWVsZD1lbC5jbG9uZU5vZGUoZmFsc2UpOwp9ZWxzZXsKCgogZGVsPWVs
Ll9kZWZhdWx0RmllbGQ9JChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpKTsKCiBmb3Io
YXR0ciBpbiBlbC5hdHRyaWJ1dGVzKXsKIHRyeXsKIGlmKGRlbC5hdHRyaWJ1dGVzW2F0dHIua2V5
XSE9J3R5cGUnJiZhdHRyLnZhbHVlIT09dW5kZWZpbmVkKQp7CiBkZWwuYXR0cmlidXRlc1thdHRy
LmtleV09YXR0ci52YWx1ZTsKfQp9CiBjYXRjaChlKXsKCiBjb25zb2xlLndhcm4oIkNvdWxkIG5v
dCB3cml0ZSBhdHRyaWJ1dGU6ICIrYXR0ci5rZXkpOwp9Cn07Cn0KCiBkZWwucmVtb3ZlQXR0cmli
dXRlKElucHV0VGV4dC5ERUZBVUxUX0FUVFIpOwogZGVsLmlkPWVsLmlkKyJfdGV4dCI7CiBkZWwu
bmFtZT0nJzsKIGRlbC50eXBlPSd0ZXh0JzsKIGRlbC52YWx1ZT1lbC5fZGVmYXVsdDsKIGRlbC5z
dHlsZS5kaXNwbGF5PSdub25lJzsKIGRlbC5hZGRDbGFzc05hbWUoSW5wdXRUZXh0LkRFRkFVTFRf
Q04pOwogZGVsLm9uZm9jdXM9ZnVuY3Rpb24oKXsKIGVsLl9pdFVwZGF0ZSh0cnVlKTsKfTsKIGVs
LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRlbCxlbC5uZXh0U2libGluZyk7Cn0KCiBlbC5faXRV
cGRhdGUoZmFsc2UpOwoKIGVsLm9ic2VydmUoJ2ZvY3VzJyxmdW5jdGlvbigpe3RoaXMuX2l0VXBk
YXRlKHRydWUpO30uYmluZChlbCkpOwogZWwub2JzZXJ2ZSgnYmx1cicsZnVuY3Rpb24oKXt0aGlz
Ll9pdFVwZGF0ZShmYWxzZSk7fS5iaW5kKGVsKSk7CgogcmV0dXJuIGVsOwp9LAoKIG1ldGhvZHM6
ewoKIHJlc2V0OmZ1bmN0aW9uKCl7CiB0aGlzLnZhbHVlPXRoaXMuaGFzRm9jdXMoKT8nJzp0aGlz
Ll9kZWZhdWx0OwogdGhpcy5zZXRDbGFzc05hbWUoSW5wdXRUZXh0LkRFRkFVTFRfQ04sIXRoaXMu
aGFzRm9jdXMoKSk7Cn0sCgoKIGRlZmF1bHRTZWxlY3Q6ZnVuY3Rpb24oKXsKIHRoaXMuZm9jdXMo
KTsKIHRoaXMudmFsdWU9dGhpcy5fZGVmYXVsdDsKIHRoaXMuc2VsZWN0KCk7Cn0KfQp9KTsKfSk7
Cgp6ZW4ucmVxdWlyZSgneE5hdGl2ZScpOwoKd2luZG93Lk1vZGVsQ2xhc3NNYXBwaW5nPWZ1bmN0
aW9uKCl7CiB2YXIgX21hcFdpZGdldD1mdW5jdGlvbigpewp9OwoKCgogdmFyIF9KYXZhc2NyaXB0
TW9kZWxUb1Bvb2w9ewonTGlzdE1vZGVsJzonTGlzdFBvb2wnLAonTGlzdEl0ZW1Nb2RlbCc6J0xp
c3RJdGVtUG9vbCcsCidMaW5rTGlzdCc6J0xpbmtMaXN0Q29sbGVjdGlvbicsCidDYWxlbmRhcic6
J0NhbGVuZGFyUG9vbCcsCidDYWxlbmRhckV2ZW50JzonQ2FsZW5kYXJFdmVudFBvb2wnLAonRXZl
bnRJbnN0YW5jZSc6J0V2ZW50SW5zdGFuY2VQb29sJywKJ0FjdGl2aXR5RmVlZE1vZGVsJzonQWN0
aXZpdHlGZWVkUG9vbCcsCidEaXNjdXNzaW9uTW9kZWwnOidEaXNjdXNzaW9uUG9vbCcsCidNZWRp
dW1UYWdMaXN0TW9kZWwnOidUYWdMaXN0UG9vbCcsCidNZXNzYWdlVGFnTGlzdE1vZGVsJzonVGFn
TGlzdFBvb2wnLAonV2lkZ2V0TW9kZWwnOidXaWRnZXRQb29sJywKJ0xpc3RNb2RlbCc6J0xpc3RQ
b29sJwp9OwoKCiB2YXIgX1J1YnlUb0phdmFzY3JpcHQ9ewonVG9kb0xpc3QnOidMaXN0TW9kZWwn
LAonVG9kbyc6J0xpc3RJdGVtTW9kZWwnLAonTGlua0xpc3QnOidMaW5rTGlzdCcsCidDYWxlbmRh
cic6J0NhbGVuZGFyJywKJ0FjdGl2aXR5RmVlZCc6J0FjdGl2aXR5RmVlZE1vZGVsJywKJ0Rpc2N1
c3Npb24nOidEaXNjdXNzaW9uTW9kZWwnLAonTWVkaXVtVGFnTGlzdCc6J01lZGl1bVRhZ0xpc3RN
b2RlbCcsCidNZXNzYWdlVGFnTGlzdCc6J01lc3NhZ2VUYWdMaXN0TW9kZWwnLAonV2lkZ2V0Jzon
V2lkZ2V0TW9kZWwnLAonWmVuUGFnZSc6J1plblBhZ2VNb2RlbCcsCidFdmVudCc6J0NhbGVuZGFy
RXZlbnQnCn07CgoKIHZhciBfSmF2YXNjcmlwdFRvUnVieT17fTsKIE9iamVjdC5lYWNoKF9SdWJ5
VG9KYXZhc2NyaXB0LGZ1bmN0aW9uKGl0ZW0pewogX0phdmFzY3JpcHRUb1J1YnlbaXRlbS52YWx1
ZV09aXRlbS5rZXk7Cn0pOwoKIF9KYXZhc2NyaXB0UG9vbFRvTW9kZWw9e307CiBPYmplY3QuZWFj
aChfSmF2YXNjcmlwdE1vZGVsVG9Qb29sLGZ1bmN0aW9uKGl0ZW0pewogX0phdmFzY3JpcHRQb29s
VG9Nb2RlbFtpdGVtLnZhbHVlXT1pdGVtLmtleTsKfSk7CgogcmV0dXJuewogSmF2YXNjcmlwdE1v
ZGVsVG9Qb29sOl9KYXZhc2NyaXB0TW9kZWxUb1Bvb2wsCiBKYXZhc2NyaXB0UG9vbFRvTW9kZWw6
X0phdmFzY3JpcHRQb29sVG9Nb2RlbCwKIEphdmFzY3JpcHRUb1J1Ynk6X0phdmFzY3JpcHRUb1J1
YnksCiBSdWJ5VG9KYXZhc2NyaXB0Ol9SdWJ5VG9KYXZhc2NyaXB0LAoKCgogZmluZE9yQ3JlYXRl
Q29tcG9uZW50QnlJZGVudGlmaWVyOmZ1bmN0aW9uKGlkZW50aWZpZXIpewogdmFyIGlkZW50aWZp
ZXJQYXJ0cz10aGlzLnNwbGl0SWRlbnRpZmllcihpZGVudGlmaWVyKTsKIHZhciBwb29sPXRoaXMu
Z2V0UG9vbEZyb21Nb2RlbENsYXNzKGlkZW50aWZpZXJQYXJ0cy5rbGFzcyk7CiB2YXIgb2JqPXRo
aXMuZmluZENvbXBvbmVudEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTsKIGlmKG9iail7CiByZXR1
cm4gb2JqOwp9CiBlbHNlewogdmFyIG9iaj1ldmFsKCduZXcgJytpZGVudGlmaWVyUGFydHMua2xh
c3MrJyh7aWQ6JytpZGVudGlmaWVyUGFydHMub2JqZWN0SWQrJywgX3RyYW5zaWVudDp0cnVlfSkn
KTsKIHJldHVybiBvYmo7Cn0KfSwKCiBzcGxpdElkZW50aWZpZXI6ZnVuY3Rpb24oaWRlbnRpZmll
cil7CiB2YXIgaD17fTsKIHZhciBwYXJ0cz1pZGVudGlmaWVyLnNwbGl0KCdfXycpO2gua2xhc3M9
cGFydHNbMF07aC5vYmplY3RJZD1wYXJ0c1sxXTsKIHJldHVybiBoOwp9Cgp9OwoKfSgpOwoKemVu
LmFwaSgnSlNPTicsZnVuY3Rpb24oKXsKIHplbi5yZXF1aXJlKCd4TmF0aXZlJywnSFRUUCcpOwoK
CiB3aW5kb3cuSlNPTkNsYXNzPUNsYXNzLmNyZWF0ZShIVFRQQ2xhc3MsewogaW5pdGlhbGl6ZTpm
dW5jdGlvbigpewoKIHRoaXMuX2hhbmRsZXJzPVtdOwogemVuLmJpbmQodGhpcywncHJvY2Vzc0Rh
dGEnKTsKfSwKCgogcmVxdWVzdDpmdW5jdGlvbigkc3VwZXIsdXJsLHRva2VucyxvcHRpb25zLG1l
dGhvZCl7CiBvcHRpb25zPU9iamVjdC5leHRlbmRPcHRpb25zKHtvblN1Y2Nlc3M6ZnVuY3Rpb24o
ZGF0YSl7CiB0aGlzLnByb2Nlc3NEYXRhKGRhdGEsb3B0aW9ucy5qcnBPcHRpb25zKTsKfS5iaW5k
KHRoaXMpfSxvcHRpb25zKTsKICRzdXBlcih1cmwsdG9rZW5zLG9wdGlvbnMsbWV0aG9kKTsKfSwK
CgogYWRkSGFuZGxlcjpmdW5jdGlvbihoYW5kbGVyLHMpewogaWYodGhpcy5faGFuZGxlcnMuaW5k
ZXhPZihoYW5kbGVyKTwwKXsKIGhhbmRsZXIuX2hhbmRsZXJOYW1lPXN8fCdhbm9ueW1vdXMnOwog
dGhpcy5faGFuZGxlcnMucHVzaChoYW5kbGVyKTsKfWVsc2V7CiBjb25zb2xlLndhcm5UcmFjZSgn
SGFuZGxlciAiJysoc3x8aGFuZGxlci5faGFuZGxlck5hbWUpKyciIGFscmVhZHkgcmVnaXN0ZXJl
ZCcpOwp9Cn0sCgoKIHByb2Nlc3NEYXRhOmZ1bmN0aW9uKGRhdGEsanJwT3B0aW9ucyl7CihuZXcg
SlNPTi5Qcm9jZXNzb3IoZGF0YSxqcnBPcHRpb25zKSkuX3Byb2Nlc3MoKTsKfQp9KTsKIHdpbmRv
dy5KU09OPW5ldyBKU09OQ2xhc3MoKTsKCgogSlNPTi5Qcm9jZXNzb3I9Q2xhc3MuY3JlYXRlKHsK
CiBpbml0aWFsaXplOmZ1bmN0aW9uKGRhdGEsanJwT3B0aW9ucyl7CiB0aGlzLm9wdGlvbnM9anJw
T3B0aW9uc3x8e307CiB0aGlzLmRhdGE9ZGF0YS5yZXNwb25zZUpTT058fGRhdGE7Cn0sCgoKIF9w
cm9jZXNzOmZ1bmN0aW9uKCl7CgoKIHRoaXMuX2hhbmRsZXJzPUpTT04uX2hhbmRsZXJzLmNsb25l
KCk7CgoKCiB3aGlsZSh0aGlzLl9oYW5kbGVycy5sZW5ndGgpdGhpcy5wcm9jZXNzKHRoaXMuX2hh
bmRsZXJzWzBdKTsKfSwKCgogcHJvY2VzczpmdW5jdGlvbihoYW5kbGVyKXsKCiB2YXIgaD10aGlz
Ll9oYW5kbGVycy5yZW1vdmUoaGFuZGxlcik7CgoKIGlmKGgpewogdHJ5ewogaCh0aGlzKTsKfWNh
dGNoKGUpewogemVuLmxvZ0V4Y2VwdGlvbihlKTsKfQp9Cn0KfSk7Cn0pOwoKemVuLmFwaSgnVmll
d1N0YXRlT2JzZXJ2ZXInLGZ1bmN0aW9uKCl7Cgogd2luZG93LlZpZXdTdGF0ZU9ic2VydmVyPUNs
YXNzLmNyZWF0ZSgpOwoKIE9iamVjdC5leHRlbmQod2luZG93LlZpZXdTdGF0ZU9ic2VydmVyLHsK
fSk7CgogVmlld1N0YXRlT2JzZXJ2ZXIuYWRkTWV0aG9kcyh7CiBpbml0aWFsaXplOmZ1bmN0aW9u
KCl7Cn0sCgoKIGluc3BlY3RBcHBsaWNhdGlvbjpmdW5jdGlvbigpewogdmFyIGhhc2g9bmV3IEhh
c2goKTsKIGhhc2guc2V0KCJ2c19fdmlzaWJsZV9mcmFtZXNbXSIsW10pOwogaWYod2luZG93Lnpl
bmJlSW5zdGFuY2VJZCl7CiBoYXNoLnNldCgnemVuYmVJbnN0YW5jZUlkJyx6ZW5iZUluc3RhbmNl
SWQpOwp9CiByZXR1cm4gJCQoJ2lmcmFtZScpLmluamVjdChoYXNoLGZ1bmN0aW9uKGhhc2gsaWZy
YW1lKXsKIGlmKGlmcmFtZS52aXNpYmxlKCkpewogdHJ5ewogaGFzaC5nZXQoInZzX192aXNpYmxl
X2ZyYW1lc1tdIikucHVzaChpZnJhbWUubmFtZSk7CiBpZih0eXBlb2Yod2luZG93W2lmcmFtZS5u
YW1lXS5jdXJyZW50Vmlld1N0YXRlKT09J2Z1bmN0aW9uJyl7CiB3aW5kb3dbaWZyYW1lLm5hbWVd
LmN1cnJlbnRWaWV3U3RhdGUoKS5lYWNoKGZ1bmN0aW9uKHBhaXIpewogaGFzaC5zZXQoInZzX18i
K2lmcmFtZS5uYW1lKyJfXyIrcGFpci5rZXkscGFpci52YWx1ZSk7Cn0pOwp9Cn0KIGNhdGNoKGUp
ewoKfTsKfQogcmV0dXJuIGhhc2g7Cn0pOwp9Cn0pOwoKIHdpbmRvdy52aWV3U3RhdGVPYnNlcnZl
cj1uZXcgVmlld1N0YXRlT2JzZXJ2ZXIoKTsKfSk7Cgp3aW5kb3cuV2lkZ2V0UmVnaXN0cnk9Q2xh
c3MuY3JlYXRlKCk7Cgp3aW5kb3cuV2lkZ2V0RmFjdG9yeT1DbGFzcy5jcmVhdGUoKTsKT2JqZWN0
LmV4dGVuZCh3aW5kb3cuV2lkZ2V0RmFjdG9yeSx7CiBfZ2VuZXJhdGVXaWRnZXRNb2RlbDpmdW5j
dGlvbihvYmplY3QpewogcmV0dXJuIGVtYmVkTW9kZWw9bmV3IFdpZGdldE1vZGVsKG9iamVjdCk7
Cn0sCgoKIGNyZWF0ZVdpZGdldDpmdW5jdGlvbih3aWRnZXROYW1lKXsKCgoKCiBpZih3aWRnZXRO
YW1lPT0nTGlzdE1vZGVsJylyZXR1cm4gTW9kZWxDbGFzc01hcHBpbmcuZmluZE9yQ3JlYXRlQ29t
cG9uZW50QnlJZGVudGlmaWVyKCR1bmlxdWUod2lkZ2V0TmFtZSsnX18tIycpKTsKIHJldHVybiB0
aGlzLl9nZW5lcmF0ZVdpZGdldE1vZGVsKHsnaWQnOiR1bmlxdWUoJy0jJyksJ3dpZGdldE5hbWUn
OndpZGdldE5hbWV9KTsKfQp9KTsKCnplbi5hcGkoJ1plblNldEV4dGVuc2lvbnMnLGZ1bmN0aW9u
KCl7CgogSlNVUFBvb2w9ewoKIGV4dGVuZDpmdW5jdGlvbihzZXQpewogT2JqZWN0LmV4dGVuZChz
ZXQsSlNVUFBvb2wuTWV0aG9kcyk7Cn0sCgogTWV0aG9kczp7CgogYXNzaW1pbGF0ZUpTVVA6ZnVu
Y3Rpb24oZGF0YSxrbGFzcyxub3RpZnlDaGFuZ2VzKXsKIHZhciBtPXRoaXMuZ2V0KGRhdGEuaWQp
OwogaWYoZGF0YS5fZGVsZXRlKXsKCiBpZihtKXRoaXMucmVtb3ZlKG0pOwogcmV0dXJuIG51bGw7
Cn1lbHNlewoKIGlmKG0pewoKIGlmKCEhZGF0YS5pZF9uZXcpewogZGF0YS5pZD1kYXRhLmlkX25l
dzsKIGRlbGV0ZSBkYXRhLmlkX25ldzsKfTsKIG0uc2V0QWxsKGRhdGEpOwogaWYobm90aWZ5Q2hh
bmdlcyltLm5vdGlmeUNoYW5nZWQoKTsKIG0uY2xlYW4oZGF0YSk7Cn1lbHNlewogdmFyIG09bmV3
IHdpbmRvd1trbGFzc10oZGF0YSk7CiB0aGlzLmFkZChtKTsKIG0uY2xlYW4oKTsKfTsKIHJldHVy
biBtOwp9Owp9LAoKIHRvSlNVUFBhcmFtczpmdW5jdGlvbihrZXkpewogdmFyIGRpcnR5SlNPTkFy
cmF5PXRoaXMuZ2V0RGlydHlJdGVtcygpLmNvbGxlY3QoZnVuY3Rpb24oaXRlbSl7CiBpZihpdGVt
Ll9uZXcpewoKIHZhciBvYmo9aXRlbS50b09iamVjdCgpOwogb2JqLl9uZXc9dHJ1ZTsKfWVsc2Ug
aWYoaXRlbS5fZGVsZXRlKXsKCiBpZihpdGVtLl9kZWxldGUpb2JqPXsiaWQiOml0ZW0uaWQsIl9k
ZWxldGUiOnRydWV9Owp9ZWxzZXsKCiB2YXIgb2JqPWl0ZW0uZ2V0RGlydHlTdGF0ZSgpOwogb2Jq
LmlkPWl0ZW0uZ2V0KCdpZCcpOwogb2JqLl91cGRhdGU9dHJ1ZTsKfTsKCgogaWYoaXRlbS5nZXQo
J3B1YmxpY0tleScpKW9iai5wdWJsaWNLZXk9aXRlbS5nZXQoJ3B1YmxpY0tleScpOwoKCiBpdGVt
LmNsZWFuKCk7CgoKIE9iamVjdC5lYWNoKG9iaixmdW5jdGlvbihwKXsKIGlmKHAua2V5JiZwLnZh
bHVlKXsKIG9ialtwLmtleV09cC52YWx1ZS51bnNhZmU/cC52YWx1ZS51bnNhZmUoKTpwLnZhbHVl
Owp9Cn0pOwoKIHJldHVybiBPYmplY3QudG9KU09OKG9iaik7Cn0pOwogcmV0dXJuJyInK2tleSsn
IicrJyA6IFsnKyhkaXJ0eUpTT05BcnJheS5qb2luKCcsJykrJ10nKTsKfQp9Cn07Cgogd2luZG93
LkluZGV4YWJsZVBvb2w9ewoKIEJVSUxESU5HX0lORElDRVM6J2J1aWxkaW5nSW5kaWNlcygpJywK
IEJVSUxESU5HX0lORElDRVNfQ09NUExFVEU6J2J1aWxkaW5nSW5kaWNlc0NvbXBsZXRlKCknLAog
aW5kZXhpbmc6ZmFsc2UsCgoKIGV4dGVuZDpmdW5jdGlvbihzZXQpewogemVuLnJlcXVpcmUoJ1pl
blNldEluZGV4Jyk7CiBPYmplY3QuZXh0ZW5kKHNldCxJbmRleGFibGVQb29sLk1ldGhvZHMpOwp9
LAoKIE1ldGhvZHM6ewoKIHNldEluZGV4aW5nOmZ1bmN0aW9uKGIpewogYj0hIWI7CiBpbmRleGlu
Zz1iOwogYj90aGlzLm5vdGlmeSh0aGlzLkJVSUxESU5HX0lORElDRVMpOnRoaXMubm90aWZ5KHRo
aXMuQlVJTERJTkdfSU5ESUNFU19DT01QTEVURSk7Cn0sCgogYWRkSW5kZXg6ZnVuY3Rpb24obmV3
SW5kZXhOYW1lLGJ1aWxkZXIpewogdGhpcy5pbmRpY2VzPXRoaXMuaW5kaWNlc3x8e307CiBpZih0
aGlzLmluZGljZXNbbmV3SW5kZXhOYW1lXSlyZXR1cm4gZmFsc2U7CiB0aGlzLmluZGljZXNbbmV3
SW5kZXhOYW1lXT1uZXcgWmVuU2V0SW5kZXgobmV3SW5kZXhOYW1lLHRoaXMsYnVpbGRlcix7fSk7
Cn0sCgogcmVtb3ZlSW5kZXg6ZnVuY3Rpb24oaW5kZXhOYW1lKXsKIHZhciBpbmRleD10aGlzLmlu
ZGljZXNbbmV3SW5kZXhOYW1lXTsKIGlmKCFpbmRleClyZXR1cm4gZmFsc2U7CiBpbmRleC5kZXN0
cm95KCk7CiBkZWxldGUgdGhpcy5pbmRpY2VzW2luZGV4TmFtZV07Cn0KfQp9OwoKIExvYWRhYmxl
UG9vbD17CiBleHRlbmQ6ZnVuY3Rpb24oc2V0KXsKIE9iamVjdC5leHRlbmQoc2V0LExvYWRhYmxl
UG9vbC5NZXRob2RzKTsKfSwKCiBNZXRob2RzOnsKIHJlYWR5OmZhbHNlLAoKIExPQURJTkc6J2xv
YWRpbmcoKScsCiBSRUFEWToncmVhZHkoKScsCgoKIHNldExvYWRlZDpmdW5jdGlvbigpewogY29u
c29sZS5sb2coJ05vdGlmeWluZyBSZWFkeScpOwogdGhpcy5yZWFkeT10cnVlOwogdGhpcy5ub3Rp
ZnkodGhpcy5SRUFEWSk7Cn0sCgoKIHNldExvYWRpbmc6ZnVuY3Rpb24oKXsKIHRoaXMucmVhZHk9
ZmFsc2U7CiB0aGlzLm5vdGlmeSh0aGlzLkxPQURJTkcpOwp9Cn0KfTsKfSk7Cnplbi5hcGkoJ1pl
bkl0ZW1FeHRlbnNpb25zJyxmdW5jdGlvbigpewogSlNVUEV4dGVuc2lvbnM9ewoKIHNldDpmdW5j
dGlvbigkc3VwZXIsayx2LHF1aWV0KXsKIHRoaXMuX3VwZGF0ZURpcnR5U3RhdGUoayx2KTsKICRz
dXBlcihrLHYscXVpZXQpOwp9LAoKIF91cGRhdGVEaXJ0eVN0YXRlOmZ1bmN0aW9uKGssdil7CiB0
aGlzLl9kaXJ0eVN0YXRlPXRoaXMuX2RpcnR5U3RhdGV8fHt9OwoKIGlmKHRoaXMuX25ld3x8dGhp
cy5fZGVsZXRlZClyZXR1cm4gdGhpczsKIGlmKHRoaXMuX2NsZWFuU3RhdGUmJnRoaXMuX2NsZWFu
U3RhdGVba10mJnRoaXMuX2NsZWFuU3RhdGVba109PXYpewogZGVsZXRlIHRoaXMuX2RpcnR5U3Rh
dGVba107CiByZXR1cm4gdGhpczsKfTsKCiB0aGlzLl9kaXJ0eVN0YXRlW2tdPXY7CiByZXR1cm4g
dGhpczsKfSwKCiBnZXREaXJ0eVN0YXRlOmZ1bmN0aW9uKCl7CiB0aGlzLl9kaXJ0eVN0YXRlPXRo
aXMuX2RpcnR5U3RhdGV8fHt9OwoKIGlmKCF0aGlzLl9jbGVhblN0YXRlfHx0aGlzLl9uZXd8fHRo
aXMuX2RlbGV0ZWQpewogcmV0dXJue307Cn07CgoKIE9iamVjdC5lYWNoKHRoaXMuX2NsZWFuU3Rh
dGUsZnVuY3Rpb24ocGFpcil7CiBpZih0aGlzLl9kaXJ0eVN0YXRlW3BhaXIua2V5XT09cGFpci52
YWx1ZSl7CiBkZWxldGUgdGhpcy5fZGlydHlTdGF0ZVtwYWlyLmtleV07Cn07Cn0uYmluZCh0aGlz
KSk7CgogcmV0dXJuIHRoaXMuX2RpcnR5U3RhdGU7Cn0sCgogY2xlYW46ZnVuY3Rpb24ob2JqKXsK
CiBkZWxldGUgdGhpcy5fZGVsZXRlOwogZGVsZXRlIHRoaXMuX25ldzsKCiBpZighb2JqfHwhdGhp
cy5fY2xlYW5TdGF0ZSl7CgogZGVsZXRlIHRoaXMuX2RpcnR5U3RhdGU7CiB0aGlzLl9jbGVhblN0
YXRlPXRoaXMudG9PYmplY3QoKTsKfWVsc2V7CgogT2JqZWN0LmVhY2gob2JqLGZ1bmN0aW9uKHBh
aXIpewogZGVsZXRlIHRoaXMuX2RpcnR5U3RhdGVbcGFpci5rZXldOwogdGhpcy5fY2xlYW5TdGF0
ZVtwYWlyLmtleV09cGFpci52YWx1ZTsKfS5iaW5kKHRoaXMpKQp9Cn0KfTsKCn0pOwoKemVuLnJl
cXVpcmUoJ0hUVFAnLCd4TmF0aXZlJywnT2JzZXJ2YWJsZScpOwp2YXIgVXNlcj1DbGFzcy5jcmVh
dGUoKTsKClVzZXIuYWRkTWV0aG9kcyh7CgogaW5pdGlhbGl6ZTpmdW5jdGlvbigpewogdGhpcy5k
YXRhPXt9OwogdGhpcy5sb2FkSW5pdGlhbERhdGEoKTsKCiBpZighdGhpcy5kYXRhLnNjcm9sbE9y
aWVudGF0aW9uJiYhIXRoaXMuZGF0YS5pZCl7CiB0aGlzLmRhdGEuc2Nyb2xsT3JpZW50YXRpb249
J2JvdHRvbVVwJzsKfTsKCn0sCgogYWRkT2JzZXJ2ZXJzOmZ1bmN0aW9uKCl7Cgp9LAoKIGxvYWRJ
bml0aWFsRGF0YTpmdW5jdGlvbigpewogdGhpcy5kYXRhPWJvb3RzdHJhcERhdGEuaW5pdGlhbFVz
ZXJEYXRhfHx7fTsKfSwKCgoKIGZ1bGxuYW1lOmZ1bmN0aW9uKCl7CiBpZih0aGlzLmRhdGEuZmly
c3ROYW1lfHx0aGlzLmRhdGEubGFzdE5hbWUpewogcmV0dXJuKHRoaXMuZGF0YS5maXJzdE5hbWUr
JyAnK3RoaXMuZGF0YS5sYXN0TmFtZSkuc3RyaXAoKTsKfWVsc2V7CiByZXR1cm4gdGhpcy5kYXRh
LmxvZ2luOwp9Owp9LAoKfSk7CgpVc2VyLmFkZE1ldGhvZHMoT2JzZXJ2YWJsZS5NZXRob2RzKTsK
CndpbmRvdy5jdXJyZW50X3VzZXI9bmV3IFVzZXIoKTsKd2luZG93LmN1cnJlbnRVc2VyPXdpbmRv
dy5jdXJyZW50X3VzZXI7Cnplbi5hcGkoJ0xpc3RJdGVtTW9kZWwnLGZ1bmN0aW9uKCl7CiB6ZW4u
cmVxdWlyZSgnWmVuSXRlbScsJ1plbkl0ZW1FeHRlbnNpb25zJywnSlNPTicpOwoKIHdpbmRvdy5M
aXN0SXRlbU1vZGVsPUNsYXNzLmNyZWF0ZShaZW5JdGVtKTsKCiBPYmplY3QuZXh0ZW5kKExpc3RJ
dGVtTW9kZWwsewoKIGNvbXBhcmF0b3I6ZnVuY3Rpb24oYSxiKXsKIGFDPWEuaWQ7YkM9Yi5pZDsK
IHJldHVybiBhQzxiQz8tMTooYUM+YkM/MTowKTsKfSwKCgoKIHBvc2l0aW9uQ29tcGFyYXRvcjpm
dW5jdGlvbihhLGIpewogYUM9YS5nZXQoJ3Bvc2l0aW9uJyk7YkM9Yi5nZXQoJ3Bvc2l0aW9uJyk7
CiByZXR1cm4gYUM8YkM/LTE6KGFDPmJDPzE6MCk7Cn0KCn0pOwoKIExpc3RJdGVtTW9kZWwuYWRk
TWV0aG9kcyhKU1VQRXh0ZW5zaW9ucyk7CiBMaXN0SXRlbU1vZGVsLmFkZE1ldGhvZHMoQWNjZXNz
b3JIZWxwZXJzKTsKfSk7Cgp6ZW4ucmVxdWlyZSgnWmVuU29ydGVkU2V0JywnSlNPTicpOwp6ZW4u
cmVxdWlyZSgnTGlzdEl0ZW1Nb2RlbCcsJ1plblNldEV4dGVuc2lvbnMnKTsKCndpbmRvdy5MaXN0
SXRlbVBvb2w9bmV3IFplblNvcnRlZFNldChMaXN0SXRlbU1vZGVsLmNvbXBhcmF0b3IsdHJ1ZSk7
CgpKU1VQUG9vbC5leHRlbmQoTGlzdEl0ZW1Qb29sKTsKTG9hZGFibGVQb29sLmV4dGVuZChMaXN0
SXRlbVBvb2wpOwoKT2JqZWN0LmV4dGVuZCh3aW5kb3cuTGlzdEl0ZW1Qb29sLHsKIHdyaXRlOmZ1
bmN0aW9uKCl7CiBMaXN0UG9vbC53cml0ZS5iaW5kKExpc3RQb29sKS5zZXRMYXp5KDI1MCk7Cn0s
CgogZGF0YUhhbmRsZXI6ZnVuY3Rpb24oanJwKXsKfSwKIHNldHVwOmZ1bmN0aW9uKCl7CiBKU09O
LmFkZEhhbmRsZXIodGhpcy5kYXRhSGFuZGxlci5iaW5kKHRoaXMpKTsKfSwKCn0pOwoKTGlzdEl0
ZW1Qb29sLnNldHVwKCk7Cnplbi5hcGkoJ0xpc3RNb2RlbCcsZnVuY3Rpb24oKXsKIHplbi5yZXF1
aXJlKCdaZW5JdGVtJywnWmVuSXRlbUV4dGVuc2lvbnMnLCdaZW5TdWJzZXQnLCdaZW5Tb3J0ZWRT
ZXQnLCdKU09OJyk7Cgogd2luZG93Lkxpc3RNb2RlbD1DbGFzcy5jcmVhdGUoWmVuSXRlbSk7Cgog
T2JqZWN0LmV4dGVuZChMaXN0TW9kZWwsewoKCiBDSEFSQ09BTDonY2hhcmNvYWwnLAogV0hJVEU6
J3doaXRlJywKIElQSE9ORTonaXBob25lJywKIFJFU09VUkNFX1VSTF9URU1QTEFURTpuZXcgVGVt
cGxhdGUod2luZG93LmxvY2F0aW9uLnByb3RvY29sKycvLycrd2luZG93LmxvY2F0aW9uLmhvc3Qr
Jy9saXN0cy8je2lkfSN7ZXh0fT9rZXk9I3trZXl9I3twYXJhbXN9JyksCgoKIGlkQ29tcGFyYXRv
cjpmdW5jdGlvbihhLGIpewogYUM9YS5pZDtiQz1iLmlkOwogcmV0dXJuIGFDPGJDPy0xOihhQz5i
Qz8xOjApOwp9LAoKIHBvc2l0aW9uQ29tcGFyYXRvcjpmdW5jdGlvbihhLGIpewogYUM9YS5nZXQo
J3Bvc2l0aW9uJyk7YkM9Yi5nZXQoJ3Bvc2l0aW9uJyk7CiByZXR1cm4gYUM8YkM/LTE6KGFDPmJD
PzE6MCk7Cn0sCgogYWxwaGFDb21wYXJhdG9yOmZ1bmN0aW9uKGEsYil7CiBhQz0oYS5nZXQoJ25h
bWUnKXx8JycpLnRvTG93ZXJDYXNlKCk7YkM9KGIuZ2V0KCduYW1lJyl8fCcnKS50b0xvd2VyQ2Fz
ZSgpOwogcmV0dXJuIGFDPGJDPy0xOihhQz5iQz8xOjApOwp9Cn0pOwoKIExpc3RNb2RlbC5hZGRN
ZXRob2RzKEpTVVBFeHRlbnNpb25zKTsKIExpc3RNb2RlbC5hZGRNZXRob2RzKEFjY2Vzc29ySGVs
cGVycyk7Cn0pOwoKemVuLnJlcXVpcmUoJ1plblNvcnRlZFNldCcsJ0pTT04nKTsKemVuLnJlcXVp
cmUoJ0xpc3RNb2RlbCcsJ0xpc3RJdGVtTW9kZWwnLCdaZW5TZXRFeHRlbnNpb25zJyk7CndpbmRv
dy5MaXN0UG9vbD1uZXcgWmVuU29ydGVkU2V0KExpc3RNb2RlbC5wb3NpdGlvbkNvbXBhcmF0b3Is
dHJ1ZSk7CgoKSlNVUFBvb2wuZXh0ZW5kKExpc3RQb29sKTsKTG9hZGFibGVQb29sLmV4dGVuZChM
aXN0UG9vbCk7CgpPYmplY3QuZXh0ZW5kKExpc3RQb29sLHsKIGRhdGFIYW5kbGVyOmZ1bmN0aW9u
KGpycCl7CgogaWYoIWpycC5kYXRhLmxpc3RzfHxqcnAuZGF0YS5saXN0cy5zaXplKCk9PTApewog
dGhpcy5zZXRMb2FkZWQoKTsKIHJldHVybiBmYWxzZTsKfTsKCgogdGhpcy5zZXRMb2FkaW5nKCk7
CgoKIHZhciBkPWpycC5kYXRhLmxpc3RzOwoKCgogZC50aHJlYWRlZEl0ZXJhdG9yKGZ1bmN0aW9u
KGkpewogdGhpcy5hc3NpbWlsYXRlSlNVUChpLCdMaXN0TW9kZWwnLGpycC5vcHRpb25zLnJlcXVl
c3RTaWduYXR1cmUhPSJMaXN0UG9vbC53cml0ZSIpOwp9LmJpbmQodGhpcyksMTAsdGhpcy5zZXRM
b2FkZWQuYmluZCh0aGlzKSk7Cn0sCgoKCiBib290c3RyYXA6ZnVuY3Rpb24oZGF0YSl7CiBKU09O
LnByb2Nlc3NEYXRhKGRhdGEpOwogd2luZG93LkFscGhhYmV0aWNhbGx5U29ydGVkTGlzdHMuc2V0
U291cmNlKHRoaXMpOwp9LAoKIHNldHVwOmZ1bmN0aW9uKCl7CgogSlNPTi5hZGRIYW5kbGVyKHRo
aXMuZGF0YUhhbmRsZXIuYmluZCh0aGlzKSk7CgoKIHdpbmRvdy5BbHBoYWJldGljYWxseVNvcnRl
ZExpc3RzPW5ldyBaZW5Tb3J0ZWRTZXQoTGlzdE1vZGVsLmFscGhhQ29tcGFyYXRvcix0cnVlKTsK
IFplblN1YnNldC5leHRlbmQod2luZG93LkFscGhhYmV0aWNhbGx5U29ydGVkTGlzdHMpOwogd2lu
ZG93LkFscGhhYmV0aWNhbGx5U29ydGVkTGlzdHMuc2V0RmlsdGVyKGZ1bmN0aW9uKGl0ZW0pe3Jl
dHVybiB0cnVlO30pOwoKIHRoaXMuYm9vdHN0cmFwKHsnbGlzdHMnOndpbmRvdy5ib290c3RyYXBE
YXRhWydsaXN0cyddLCdsaXN0SXRlbXMnOndpbmRvdy5ib290c3RyYXBEYXRhWydsaXN0SXRlbXMn
XX0pOwoKfSwKfSk7CgpMaXN0UG9vbC5zZXR1cCgpOwo8L3NjcmlwdD4KPC9oZWFkPgo8L2h0bWw+
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27985</attachid>
            <date>2009-02-25 14:29:26 -0800</date>
            <delta_ts>2009-02-25 14:29:26 -0800</delta_ts>
            <desc>Further reduction</desc>
            <filename>reduction.html</filename>
            <type>text/html</type>
            <size>42040</size>
            <attacher name="Cameron Zwarich (cpst)">zwarich</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiPgp3aW5kb3cuYm9vdHN0cmFwRGF0YSA9IHsiaW5pdGlhbFVzZXJEYXRhIjp7InNjcm9sbE9y
aWVudGF0aW9uIjoiYm90dG9tVXAiLCJsYXN0TmFtZSI6Ilp3YXJpY2giLCJrbGFzcyI6Ikxpc3RV
c2VyIiwibG9naW4iOiJjd3p3YXJpY2giLCJzZWN1cml0eUtleSI6IkpxMUk4M2doT1hwNkV5c3ho
STBaemRYRW1JZDJhQlI1UE1LdnlKeHMiLCJ0aW1lWm9uZSI6IlVTXC9FYXN0ZXJuIiwiZmlyc3RO
YW1lIjoiQ2FtZXJvbiIsInplbnBhZ2VzTmFtZSI6ImN3endhcmljaCIsImlkIjoxMTI1NDZ9LCJs
aXN0cyI6W3sicHVibGljS2V5Ijoib29mZzYiLCJrbGFzcyI6IlRvZG9MaXN0Iiwic3VwZXJjb21w
b25lbnRJZHMiOltdLCJuYW1lIjoiQ2FtZXJvbiIsImRlbGV0ZWRBdCI6bnVsbCwic2VjdXJpdHlL
ZXkiOiIyZXlnQ3V2RkdhMXlYdG5QZHRoWHYyNkRSMUxJT0hZUkNPQXhad05PIiwic2hvd1F1aWNr
dmlldyI6dHJ1ZSwiZXhwYW5kZWQiOm51bGwsInVwZGF0ZWRBdCI6IjIwMDkvMDIvMjQgMjE6NTU6
MzcgKzAwMDAiLCJzdWJjb21wb25lbnRJZHMiOltdLCJjcmVhdGVkQXQiOiIyMDA5LzAyLzI0IDIx
OjU1OjM3ICswMDAwIiwiaWQiOjM4MzYyMCwiYXJjaGl2ZWQiOm51bGwsImF1dGhvcml6ZWRVc2Vy
cyI6W3sic2Nyb2xsT3JpZW50YXRpb24iOiJib3R0b21VcCIsImxhc3ROYW1lIjoiWndhcmljaCIs
ImtsYXNzIjoiTGlzdFVzZXIiLCJsb2dpbiI6ImN3endhcmljaCIsInNlY3VyaXR5S2V5IjoiSnEx
STgzZ2hPWHA2RXlzeGhJMFp6ZFhFbUlkMmFCUjVQTUt2eUp4cyIsInRpbWVab25lIjoiVVNcL0Vh
c3Rlcm4iLCJmaXJzdE5hbWUiOiJDYW1lcm9uIiwiemVucGFnZXNOYW1lIjoiY3d6d2FyaWNoIiwi
aWQiOjExMjU0Nn1dLCJ2ZXJzaW9uIjowLCJ1c2VySWQiOjExMjU0NiwidXBkYXRlZEJ5IjpudWxs
LCJwcm9kaWQiOm51bGwsIl9uZXciOnRydWUsIndpZGdldENvbGxhcHNlZCI6ZmFsc2UsIm93bmVy
Ijp0cnVlLCJwb3NpdGlvbiI6Miwic3RhckNvbG9yIjpudWxsfSx7InB1YmxpY0tleSI6ImVieXFs
Iiwia2xhc3MiOiJUb2RvTGlzdCIsInN1cGVyY29tcG9uZW50SWRzIjpbXSwibmFtZSI6IkJsYWgi
LCJkZWxldGVkQXQiOm51bGwsInNlY3VyaXR5S2V5IjoiZXBFc2JwOG9uZjdsR3VCTjV6REwzTGxu
SXkxdUhTRU1nc0J4NTV1QiIsInNob3dRdWlja3ZpZXciOnRydWUsImV4cGFuZGVkIjpudWxsLCJ1
cGRhdGVkQXQiOiIyMDA5LzAyLzI0IDIxOjU1OjQwICswMDAwIiwic3ViY29tcG9uZW50SWRzIjpb
XSwiY3JlYXRlZEF0IjoiMjAwOS8wMi8yNCAyMTo1NTo0MCArMDAwMCIsImlkIjozODM2MjEsImFy
Y2hpdmVkIjpudWxsLCJhdXRob3JpemVkVXNlcnMiOlt7InNjcm9sbE9yaWVudGF0aW9uIjoiYm90
dG9tVXAiLCJsYXN0TmFtZSI6Ilp3YXJpY2giLCJrbGFzcyI6Ikxpc3RVc2VyIiwibG9naW4iOiJj
d3p3YXJpY2giLCJzZWN1cml0eUtleSI6IkpxMUk4M2doT1hwNkV5c3hoSTBaemRYRW1JZDJhQlI1
UE1LdnlKeHMiLCJ0aW1lWm9uZSI6IlVTXC9FYXN0ZXJuIiwiZmlyc3ROYW1lIjoiQ2FtZXJvbiIs
InplbnBhZ2VzTmFtZSI6ImN3endhcmljaCIsImlkIjoxMTI1NDZ9XSwidmVyc2lvbiI6MCwidXNl
cklkIjoxMTI1NDYsInVwZGF0ZWRCeSI6bnVsbCwicHJvZGlkIjpudWxsLCJfbmV3Ijp0cnVlLCJ3
aWRnZXRDb2xsYXBzZWQiOmZhbHNlLCJvd25lciI6dHJ1ZSwicG9zaXRpb24iOjEsInN0YXJDb2xv
ciI6bnVsbH0seyJwdWJsaWNLZXkiOiJuYWpyZiIsImtsYXNzIjoiVG9kb0xpc3QiLCJzdXBlcmNv
bXBvbmVudElkcyI6W10sIm5hbWUiOiJUaGlzIiwiZGVsZXRlZEF0IjpudWxsLCJzZWN1cml0eUtl
eSI6Ikt3QzUwTEh4c0Z1eHZYaFpiSWRRM2xLQUlGRlU4U2l3TWJoWEtsQnoiLCJzaG93UXVpY2t2
aWV3Ijp0cnVlLCJleHBhbmRlZCI6bnVsbCwidXBkYXRlZEF0IjoiMjAwOS8wMi8yNCAyMTo1NTo0
MyArMDAwMCIsInN1YmNvbXBvbmVudElkcyI6W10sImNyZWF0ZWRBdCI6IjIwMDkvMDIvMjQgMjE6
NTU6NDMgKzAwMDAiLCJpZCI6MzgzNjIyLCJhcmNoaXZlZCI6bnVsbCwiYXV0aG9yaXplZFVzZXJz
IjpbeyJzY3JvbGxPcmllbnRhdGlvbiI6ImJvdHRvbVVwIiwibGFzdE5hbWUiOiJad2FyaWNoIiwi
a2xhc3MiOiJMaXN0VXNlciIsImxvZ2luIjoiY3d6d2FyaWNoIiwic2VjdXJpdHlLZXkiOiJKcTFJ
ODNnaE9YcDZFeXN4aEkwWnpkWEVtSWQyYUJSNVBNS3Z5SnhzIiwidGltZVpvbmUiOiJVU1wvRWFz
dGVybiIsImZpcnN0TmFtZSI6IkNhbWVyb24iLCJ6ZW5wYWdlc05hbWUiOiJjd3p3YXJpY2giLCJp
ZCI6MTEyNTQ2fV0sInZlcnNpb24iOjAsInVzZXJJZCI6MTEyNTQ2LCJ1cGRhdGVkQnkiOm51bGws
InByb2RpZCI6bnVsbCwiX25ldyI6dHJ1ZSwid2lkZ2V0Q29sbGFwc2VkIjpmYWxzZSwib3duZXIi
OnRydWUsInBvc2l0aW9uIjowLCJzdGFyQ29sb3IiOm51bGx9XX07Cgp2YXIgUHJvdG90eXBlPXsK
IFZlcnNpb246JzEuNi4wLjInLAoKIEJyb3dzZXI6ewogSUU6ISEod2luZG93LmF0dGFjaEV2ZW50
JiYhd2luZG93Lm9wZXJhKSwKIE9wZXJhOiEhd2luZG93Lm9wZXJhLAogV2ViS2l0Om5hdmlnYXRv
ci51c2VyQWdlbnQuaW5kZXhPZignQXBwbGVXZWJLaXQvJyk+LTEsCiBHZWNrbzpuYXZpZ2F0b3Iu
dXNlckFnZW50LmluZGV4T2YoJ0dlY2tvJyk+LTEmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhP
ZignS0hUTUwnKT09LTEsCiBNb2JpbGVTYWZhcmk6ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNo
KC9BcHBsZS4qTW9iaWxlLipTYWZhcmkvKQp9LAoKIEJyb3dzZXJGZWF0dXJlczp7CiBYUGF0aDoh
IWRvY3VtZW50LmV2YWx1YXRlLAogRWxlbWVudEV4dGVuc2lvbnM6ISF3aW5kb3cuSFRNTEVsZW1l
bnQsCiBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOgogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
ZGl2JykuX19wcm90b19fJiYKIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLl9fcHJvdG9f
XyE9PQogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpLl9fcHJvdG9fXwp9LAoKIFNjcmlw
dEZyYWdtZW50Oic8c2NyaXB0W14+XSo+KFtcXFNcXHNdKj8pPFwvc2NyaXB0PicsCiBKU09ORmls
dGVyOi9eXC9cKi1zZWN1cmUtKFtcc1xTXSopXCpcL1xzKiQvLAoKIGVtcHR5RnVuY3Rpb246ZnVu
Y3Rpb24oKXt9LAogSzpmdW5jdGlvbih4KXtyZXR1cm4geH0KfTsKCnZhciBDbGFzcz17CiBjcmVh
dGU6ZnVuY3Rpb24oKXsKIHZhciBwYXJlbnQ9bnVsbCxwcm9wZXJ0aWVzPSRBKGFyZ3VtZW50cyk7
CiBpZihPYmplY3QuaXNGdW5jdGlvbihwcm9wZXJ0aWVzWzBdKSkKIHBhcmVudD1wcm9wZXJ0aWVz
LnNoaWZ0KCk7CgogZnVuY3Rpb24ga2xhc3MoKXsKIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlz
LGFyZ3VtZW50cyk7Cn0KCiBPYmplY3QuZXh0ZW5kKGtsYXNzLENsYXNzLk1ldGhvZHMpOwoga2xh
c3Muc3VwZXJjbGFzcz1wYXJlbnQ7CiBrbGFzcy5zdWJjbGFzc2VzPVtdOwoKIGlmKHBhcmVudCl7
CiB2YXIgc3ViY2xhc3M9ZnVuY3Rpb24oKXt9Owogc3ViY2xhc3MucHJvdG90eXBlPXBhcmVudC5w
cm90b3R5cGU7CiBrbGFzcy5wcm90b3R5cGU9bmV3IHN1YmNsYXNzOwogcGFyZW50LnN1YmNsYXNz
ZXMucHVzaChrbGFzcyk7Cn0KCiBmb3IodmFyIGk9MDtpPHByb3BlcnRpZXMubGVuZ3RoO2krKykK
IGtsYXNzLmFkZE1ldGhvZHMocHJvcGVydGllc1tpXSk7CgogaWYoIWtsYXNzLnByb3RvdHlwZS5p
bml0aWFsaXplKQoga2xhc3MucHJvdG90eXBlLmluaXRpYWxpemU9UHJvdG90eXBlLmVtcHR5RnVu
Y3Rpb247Cgoga2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yPWtsYXNzOwoKIHJldHVybiBrbGFz
czsKfQp9OwoKQ2xhc3MuTWV0aG9kcz17CiBhZGRNZXRob2RzOmZ1bmN0aW9uKHNvdXJjZSl7CiB2
YXIgYW5jZXN0b3I9dGhpcy5zdXBlcmNsYXNzJiZ0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlOwog
dmFyIHByb3BlcnRpZXM9T2JqZWN0LmtleXMoc291cmNlKTsKCiBpZighT2JqZWN0LmtleXMoe3Rv
U3RyaW5nOnRydWV9KS5sZW5ndGgpCiBwcm9wZXJ0aWVzLnB1c2goInRvU3RyaW5nIiwidmFsdWVP
ZiIpOwoKIGZvcih2YXIgaT0wLGxlbmd0aD1wcm9wZXJ0aWVzLmxlbmd0aDtpPGxlbmd0aDtpKysp
ewogdmFyIHByb3BlcnR5PXByb3BlcnRpZXNbaV0sdmFsdWU9c291cmNlW3Byb3BlcnR5XTsKIGlm
KGFuY2VzdG9yJiZPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkmJgogdmFsdWUuYXJndW1lbnROYW1l
cygpLmZpcnN0KCk9PSIkc3VwZXIiKXsKIHZhciBtZXRob2Q9dmFsdWUsdmFsdWU9T2JqZWN0LmV4
dGVuZCgoZnVuY3Rpb24obSl7CiByZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYW5jZXN0b3JbbV0u
YXBwbHkodGhpcyxhcmd1bWVudHMpfTsKfSkocHJvcGVydHkpLndyYXAobWV0aG9kKSx7CiB2YWx1
ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIG1ldGhvZH0sCiB0b1N0cmluZzpmdW5jdGlvbigpe3JldHVy
biBtZXRob2QudG9TdHJpbmcoKX0KfSk7Cn0KIHRoaXMucHJvdG90eXBlW3Byb3BlcnR5XT12YWx1
ZTsKfQoKIHJldHVybiB0aGlzOwp9Cn07Cgp2YXIgQWJzdHJhY3Q9e307CgpPYmplY3QuZXh0ZW5k
PWZ1bmN0aW9uKGRlc3RpbmF0aW9uLHNvdXJjZSl7CiBmb3IodmFyIHByb3BlcnR5IGluIHNvdXJj
ZSkKIGRlc3RpbmF0aW9uW3Byb3BlcnR5XT1zb3VyY2VbcHJvcGVydHldOwogcmV0dXJuIGRlc3Rp
bmF0aW9uOwp9OwoKT2JqZWN0LmV4dGVuZChPYmplY3Qsewoga2V5czpmdW5jdGlvbihvYmplY3Qp
ewogdmFyIGtleXM9W107CiBmb3IodmFyIHByb3BlcnR5IGluIG9iamVjdCkKIGtleXMucHVzaChw
cm9wZXJ0eSk7CiByZXR1cm4ga2V5czsKfSwKCiB2YWx1ZXM6ZnVuY3Rpb24ob2JqZWN0KXsKIHZh
ciB2YWx1ZXM9W107CiBmb3IodmFyIHByb3BlcnR5IGluIG9iamVjdCkKIHZhbHVlcy5wdXNoKG9i
amVjdFtwcm9wZXJ0eV0pOwogcmV0dXJuIHZhbHVlczsKfSwKCiBjbG9uZTpmdW5jdGlvbihvYmpl
Y3QpewogcmV0dXJuIE9iamVjdC5leHRlbmQoe30sb2JqZWN0KTsKfSwKCiBpc0VsZW1lbnQ6ZnVu
Y3Rpb24ob2JqZWN0KXsKIHJldHVybiBvYmplY3QmJm9iamVjdC5ub2RlVHlwZT09MTsKfSwKCiBp
c0FycmF5OmZ1bmN0aW9uKG9iamVjdCl7CiByZXR1cm4hIShvYmplY3QmJm9iamVjdC5qb2luJiZv
YmplY3Quc3BsaWNlKTsKfSwKCiBpc0hhc2g6ZnVuY3Rpb24ob2JqZWN0KXsKIHJldHVybiBvYmpl
Y3QgaW5zdGFuY2VvZiBIYXNoOwp9LAoKIGlzRnVuY3Rpb246ZnVuY3Rpb24ob2JqZWN0KXsKIHJl
dHVybiB0eXBlb2Ygb2JqZWN0PT0iZnVuY3Rpb24iOwp9LAoKIGlzU3RyaW5nOmZ1bmN0aW9uKG9i
amVjdCl7CiByZXR1cm4gdHlwZW9mIG9iamVjdD09InN0cmluZyI7Cn0sCgogaXNOdW1iZXI6ZnVu
Y3Rpb24ob2JqZWN0KXsKIHJldHVybiB0eXBlb2Ygb2JqZWN0PT0ibnVtYmVyIjsKfSwKCiBpc1Vu
ZGVmaW5lZDpmdW5jdGlvbihvYmplY3QpewogcmV0dXJuIHR5cGVvZiBvYmplY3Q9PSJ1bmRlZmlu
ZWQiOwp9Cn0pOwoKT2JqZWN0LmV4dGVuZChGdW5jdGlvbi5wcm90b3R5cGUsewogYXJndW1lbnRO
YW1lczpmdW5jdGlvbigpewogdmFyIG5hbWVzPXRoaXMudG9TdHJpbmcoKS5tYXRjaCgvXltcc1wo
XSpmdW5jdGlvblteKF0qXCgoLio/KVwpLylbMV0uc3BsaXQoIiwiKS5pbnZva2UoInN0cmlwIik7
CiByZXR1cm4gbmFtZXMubGVuZ3RoPT0xJiYhbmFtZXNbMF0/W106bmFtZXM7Cn0sCgogYmluZDpm
dW5jdGlvbigpewogdmFyIF9fbWV0aG9kPXRoaXMsb2JqZWN0PWFyZ3VtZW50c1swXTsKIGlmKGFy
Z3VtZW50cy5sZW5ndGg8Mil7CiByZXR1cm4hb2JqZWN0P3RoaXM6ZnVuY3Rpb24oKXsKIHJldHVy
biBfX21ldGhvZC5hcHBseShvYmplY3QsYXJndW1lbnRzKTsKfQp9CiB2YXIgYXJncz0kQShhcmd1
bWVudHMpOwogYXJncy5zaGlmdCgpOwogcmV0dXJuIGZ1bmN0aW9uKCl7CiByZXR1cm4gX19tZXRo
b2QuYXBwbHkob2JqZWN0LGFyZ3MuY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKfQp9LAoKIGJpbmRB
c0V2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oKXsKfSwKCiBjdXJyeTpmdW5jdGlvbigpewogaWYoIWFy
Z3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXM7CiB2YXIgX19tZXRob2Q9dGhpcyxhcmdzPSRBKGFy
Z3VtZW50cyk7CiByZXR1cm4gZnVuY3Rpb24oKXsKIHJldHVybiBfX21ldGhvZC5hcHBseSh0aGlz
LGFyZ3MuY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKfQp9LAoKIGRlbGF5OmZ1bmN0aW9uKCl7Cn0s
Cgogd3JhcDpmdW5jdGlvbih3cmFwcGVyKXsKIHZhciBfX21ldGhvZD10aGlzOwogcmV0dXJuIGZ1
bmN0aW9uKCl7CiByZXR1cm4gd3JhcHBlci5hcHBseSh0aGlzLFtfX21ldGhvZC5iaW5kKHRoaXMp
XS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwp9Cn0sCgogbWV0aG9kaXplOmZ1bmN0aW9uKCl7Cn0K
fSk7Cgp2YXIgVHJ5PXsKIHRoZXNlOmZ1bmN0aW9uKCl7CiB2YXIgcmV0dXJuVmFsdWU7CgogZm9y
KHZhciBpPTAsbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW5ndGg7aSsrKXsKIHZhciBsYW1i
ZGE9YXJndW1lbnRzW2ldOwogdHJ5ewogcmV0dXJuVmFsdWU9bGFtYmRhKCk7CiBicmVhazsKfWNh
dGNoKGUpe30KfQoKIHJldHVybiByZXR1cm5WYWx1ZTsKfQp9OwoKUmVnRXhwLnByb3RvdHlwZS5t
YXRjaD1SZWdFeHAucHJvdG90eXBlLnRlc3Q7CgpSZWdFeHAuZXNjYXBlPWZ1bmN0aW9uKHN0cil7
CiByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9n
LCdcXCQxJyk7Cn07CgoKCnZhciBQZXJpb2RpY2FsRXhlY3V0ZXI9Q2xhc3MuY3JlYXRlKHsKIHN0
b3A6ZnVuY3Rpb24oKXsKIGlmKCF0aGlzLnRpbWVyKXJldHVybjsKIGNsZWFySW50ZXJ2YWwodGhp
cy50aW1lcik7CiB0aGlzLnRpbWVyPW51bGw7Cn0sCgogb25UaW1lckV2ZW50OmZ1bmN0aW9uKCl7
CiBpZighdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcpewogdHJ5ewogdGhpcy5jdXJyZW50bHlFeGVj
dXRpbmc9dHJ1ZTsKIHRoaXMuZXhlY3V0ZSgpOwp9ZmluYWxseXsKIHRoaXMuY3VycmVudGx5RXhl
Y3V0aW5nPWZhbHNlOwp9Cn0KfQp9KTsKT2JqZWN0LmV4dGVuZChTdHJpbmcsewogaW50ZXJwcmV0
OmZ1bmN0aW9uKHZhbHVlKXsKIHJldHVybiB2YWx1ZT09bnVsbD8nJzpTdHJpbmcodmFsdWUpOwp9
LAogc3BlY2lhbENoYXI6ewonXGInOidcXGInLAonXHQnOidcXHQnLAonXG4nOidcXG4nLAonXGYn
OidcXGYnLAonXHInOidcXHInLAonXFwnOidcXFxcJwp9Cn0pOwoKT2JqZWN0LmV4dGVuZChTdHJp
bmcucHJvdG90eXBlLHsKIGdzdWI6ZnVuY3Rpb24ocGF0dGVybixyZXBsYWNlbWVudCl7CiB2YXIg
cmVzdWx0PScnLHNvdXJjZT10aGlzLG1hdGNoOwogcmVwbGFjZW1lbnQ9YXJndW1lbnRzLmNhbGxl
ZS5wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpOwoKIHdoaWxlKHNvdXJjZS5sZW5ndGg+
MCl7CiBpZihtYXRjaD1zb3VyY2UubWF0Y2gocGF0dGVybikpewogcmVzdWx0Kz1zb3VyY2Uuc2xp
Y2UoMCxtYXRjaC5pbmRleCk7CiByZXN1bHQrPVN0cmluZy5pbnRlcnByZXQocmVwbGFjZW1lbnQo
bWF0Y2gpKTsKIHNvdXJjZT1zb3VyY2Uuc2xpY2UobWF0Y2guaW5kZXgrbWF0Y2hbMF0ubGVuZ3Ro
KTsKfWVsc2V7CiByZXN1bHQrPXNvdXJjZSxzb3VyY2U9Jyc7Cn0KfQogcmV0dXJuIHJlc3VsdDsK
fSwKCiBzdWI6ZnVuY3Rpb24ocGF0dGVybixyZXBsYWNlbWVudCxjb3VudCl7CiByZXBsYWNlbWVu
dD10aGlzLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsKIGNvdW50PU9iamVj
dC5pc1VuZGVmaW5lZChjb3VudCk/MTpjb3VudDsKCiByZXR1cm4gdGhpcy5nc3ViKHBhdHRlcm4s
ZnVuY3Rpb24obWF0Y2gpewogaWYoLS1jb3VudDwwKXJldHVybiBtYXRjaFswXTsKIHJldHVybiBy
ZXBsYWNlbWVudChtYXRjaCk7Cn0pOwp9LAoKIHNjYW46ZnVuY3Rpb24ocGF0dGVybixpdGVyYXRv
cil7CiB0aGlzLmdzdWIocGF0dGVybixpdGVyYXRvcik7CiByZXR1cm4gU3RyaW5nKHRoaXMpOwp9
LAoKIHRydW5jYXRlOmZ1bmN0aW9uKGxlbmd0aCx0cnVuY2F0aW9uKXsKIGxlbmd0aD1sZW5ndGh8
fDMwOwogdHJ1bmNhdGlvbj1PYmplY3QuaXNVbmRlZmluZWQodHJ1bmNhdGlvbik/Jy4uLic6dHJ1
bmNhdGlvbjsKIHJldHVybiB0aGlzLmxlbmd0aD5sZW5ndGg/CiB0aGlzLnNsaWNlKDAsbGVuZ3Ro
LXRydW5jYXRpb24ubGVuZ3RoKSt0cnVuY2F0aW9uOlN0cmluZyh0aGlzKTsKfSwKCiBzdHJpcDpm
dW5jdGlvbigpewogcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzKy8sJycpLnJlcGxhY2UoL1xzKyQv
LCcnKTsKfSwKCiBzdHJpcFRhZ3M6ZnVuY3Rpb24oKXsKfSwKCiBzdHJpcFNjcmlwdHM6ZnVuY3Rp
b24oKXsKfSwKCiBleHRyYWN0U2NyaXB0czpmdW5jdGlvbigpewp9LAoKIGV2YWxTY3JpcHRzOmZ1
bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5leHRyYWN0U2NyaXB0cygpLm1hcChmdW5jdGlvbihzY3Jp
cHQpe3JldHVybiBldmFsKHNjcmlwdCl9KTsKfSwKCiBlc2NhcGVIVE1MOmZ1bmN0aW9uKCl7CiB2
YXIgc2VsZj1hcmd1bWVudHMuY2FsbGVlOwogc2VsZi50ZXh0LmRhdGE9dGhpczsKIHJldHVybiBz
ZWxmLmRpdi5pbm5lckhUTUw7Cn0sCgogdG9BcnJheTpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMu
c3BsaXQoJycpOwp9LAoKIHN1Y2M6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLnNsaWNlKDAsdGhp
cy5sZW5ndGgtMSkrCiBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxl
bmd0aC0xKSsxKTsKfSwKCiB0aW1lczpmdW5jdGlvbihjb3VudCl7CiByZXR1cm4gY291bnQ8MT8n
JzpuZXcgQXJyYXkoY291bnQrMSkuam9pbih0aGlzKTsKfSwKCiBjYW1lbGl6ZTpmdW5jdGlvbigp
ewogdmFyIHBhcnRzPXRoaXMuc3BsaXQoJy0nKSxsZW49cGFydHMubGVuZ3RoOwogaWYobGVuPT0x
KXJldHVybiBwYXJ0c1swXTsKCiB2YXIgY2FtZWxpemVkPXRoaXMuY2hhckF0KDApPT0nLScKP3Bh
cnRzWzBdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3BhcnRzWzBdLnN1YnN0cmluZygxKQo6cGFy
dHNbMF07CgogZm9yKHZhciBpPTE7aTxsZW47aSsrKQogY2FtZWxpemVkKz1wYXJ0c1tpXS5jaGFy
QXQoMCkudG9VcHBlckNhc2UoKStwYXJ0c1tpXS5zdWJzdHJpbmcoMSk7CgogcmV0dXJuIGNhbWVs
aXplZDsKfSwKCiBjYXBpdGFsaXplOmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5jaGFyQXQoMCku
dG9VcHBlckNhc2UoKSt0aGlzLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpOwp9LAoKIHVuZGVy
c2NvcmU6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLmdzdWIoLzo6LywnLycpLmdzdWIoLyhbQS1a
XSspKFtBLVpdW2Etel0pLywnI3sxfV8jezJ9JykuZ3N1YigvKFthLXpcZF0pKFtBLVpdKS8sJyN7
MX1fI3syfScpLmdzdWIoLy0vLCdfJykudG9Mb3dlckNhc2UoKTsKfSwKCiBkYXNoZXJpemU6ZnVu
Y3Rpb24oKXsKIHJldHVybiB0aGlzLmdzdWIoL18vLCctJyk7Cn0sCgogaW5zcGVjdDpmdW5jdGlv
bih1c2VEb3VibGVRdW90ZXMpewogdmFyIGVzY2FwZWRTdHJpbmc9dGhpcy5nc3ViKC9bXHgwMC1c
eDFmXFxdLyxmdW5jdGlvbihtYXRjaCl7CiB2YXIgY2hhcmFjdGVyPVN0cmluZy5zcGVjaWFsQ2hh
clttYXRjaFswXV07CiByZXR1cm4gY2hhcmFjdGVyP2NoYXJhY3RlcjonXFx1MDAnK21hdGNoWzBd
LmNoYXJDb2RlQXQoKS50b1BhZGRlZFN0cmluZygyLDE2KTsKfSk7CiBpZih1c2VEb3VibGVRdW90
ZXMpcmV0dXJuJyInK2VzY2FwZWRTdHJpbmcucmVwbGFjZSgvIi9nLCdcXCInKSsnIic7CiByZXR1
cm4iJyIrZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8nL2csJ1xcXCcnKSsiJyI7Cn0sCgogdG9KU09O
OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5pbnNwZWN0KHRydWUpOwp9LAoKIHVuZmlsdGVySlNP
TjpmdW5jdGlvbihmaWx0ZXIpewogcmV0dXJuIHRoaXMuc3ViKGZpbHRlcnx8UHJvdG90eXBlLkpT
T05GaWx0ZXIsJyN7MX0nKTsKfSwKCiBpc0pTT046ZnVuY3Rpb24oKXsKIHZhciBzdHI9dGhpczsK
IGlmKHN0ci5ibGFuaygpKXJldHVybiBmYWxzZTsKIHN0cj10aGlzLnJlcGxhY2UoL1xcLi9nLCdA
JykucmVwbGFjZSgvIlteIlxcXG5ccl0qIi9nLCcnKTsKIHJldHVybigvXlssOnt9XFtcXTAtOS5c
LStFYWVmbG5yLXUgXG5cclx0XSokLykudGVzdChzdHIpOwp9LAoKIGV2YWxKU09OOmZ1bmN0aW9u
KHNhbml0aXplKXsKIHZhciBqc29uPXRoaXMudW5maWx0ZXJKU09OKCk7CiB0cnl7CiBpZighc2Fu
aXRpemV8fGpzb24uaXNKU09OKCkpcmV0dXJuIGV2YWwoJygnK2pzb24rJyknKTsKfWNhdGNoKGUp
e30KIHRocm93IG5ldyBTeW50YXhFcnJvcignQmFkbHkgZm9ybWVkIEpTT04gc3RyaW5nOiAnK3Ro
aXMuaW5zcGVjdCgpKTsKfSwKCiBpbmNsdWRlOmZ1bmN0aW9uKHBhdHRlcm4pewogcmV0dXJuIHRo
aXMuaW5kZXhPZihwYXR0ZXJuKT4tMTsKfSwKCiBzdGFydHNXaXRoOmZ1bmN0aW9uKHBhdHRlcm4p
ewogcmV0dXJuIHRoaXMuaW5kZXhPZihwYXR0ZXJuKT09PTA7Cn0sCgogZW5kc1dpdGg6ZnVuY3Rp
b24ocGF0dGVybil7CiB2YXIgZD10aGlzLmxlbmd0aC1wYXR0ZXJuLmxlbmd0aDsKIHJldHVybiBk
Pj0wJiZ0aGlzLmxhc3RJbmRleE9mKHBhdHRlcm4pPT09ZDsKfSwKCiBlbXB0eTpmdW5jdGlvbigp
ewogcmV0dXJuIHRoaXM9PScnOwp9LAoKIGJsYW5rOmZ1bmN0aW9uKCl7CiByZXR1cm4vXlxzKiQv
LnRlc3QodGhpcyk7Cn0sCgogaW50ZXJwb2xhdGU6ZnVuY3Rpb24ob2JqZWN0LHBhdHRlcm4pewog
cmV0dXJuIG5ldyBUZW1wbGF0ZSh0aGlzLHBhdHRlcm4pLmV2YWx1YXRlKG9iamVjdCk7Cn0KfSk7
CgppZihQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXR8fFByb3RvdHlwZS5Ccm93c2VyLklFKU9iamVj
dC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSx7CiBlc2NhcGVIVE1MOmZ1bmN0aW9uKCl7CiByZXR1
cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFj
ZSgvPi9nLCcmZ3Q7Jyk7Cn0sCiB1bmVzY2FwZUhUTUw6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlz
LnJlcGxhY2UoLyZhbXA7L2csJyYnKS5yZXBsYWNlKC8mbHQ7L2csJzwnKS5yZXBsYWNlKC8mZ3Q7
L2csJz4nKTsKfQp9KTsKClN0cmluZy5wcm90b3R5cGUuZ3N1Yi5wcmVwYXJlUmVwbGFjZW1lbnQ9
ZnVuY3Rpb24ocmVwbGFjZW1lbnQpewogaWYoT2JqZWN0LmlzRnVuY3Rpb24ocmVwbGFjZW1lbnQp
KXJldHVybiByZXBsYWNlbWVudDsKIHZhciB0ZW1wbGF0ZT1uZXcgVGVtcGxhdGUocmVwbGFjZW1l
bnQpOwogcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gdGVtcGxhdGUuZXZhbHVhdGUobWF0
Y2gpfTsKfTsKClN0cmluZy5wcm90b3R5cGUucGFyc2VRdWVyeT1TdHJpbmcucHJvdG90eXBlLnRv
UXVlcnlQYXJhbXM7CgpPYmplY3QuZXh0ZW5kKFN0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTCx7
CiBkaXY6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCiB0ZXh0OmRvY3VtZW50LmNyZWF0
ZVRleHROb2RlKCcnKQp9KTsKCndpdGgoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MKWRpdi5h
cHBlbmRDaGlsZCh0ZXh0KTsKCnZhciBUZW1wbGF0ZT1DbGFzcy5jcmVhdGUoewogaW5pdGlhbGl6
ZTpmdW5jdGlvbih0ZW1wbGF0ZSxwYXR0ZXJuKXsKIHRoaXMudGVtcGxhdGU9dGVtcGxhdGUudG9T
dHJpbmcoKTsKIHRoaXMucGF0dGVybj1wYXR0ZXJufHxUZW1wbGF0ZS5QYXR0ZXJuOwp9LAoKIGV2
YWx1YXRlOmZ1bmN0aW9uKG9iamVjdCl7CiBpZihPYmplY3QuaXNGdW5jdGlvbihvYmplY3QudG9U
ZW1wbGF0ZVJlcGxhY2VtZW50cykpCiBvYmplY3Q9b2JqZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVu
dHMoKTsKCiByZXR1cm4gdGhpcy50ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybixmdW5jdGlvbiht
YXRjaCl7CiBpZihvYmplY3Q9PW51bGwpcmV0dXJuJyc7CgogdmFyIGJlZm9yZT1tYXRjaFsxXXx8
Jyc7CiBpZihiZWZvcmU9PSdcXCcpcmV0dXJuIG1hdGNoWzJdOwoKIHZhciBjdHg9b2JqZWN0LGV4
cHI9bWF0Y2hbM107CiB2YXIgcGF0dGVybj0vXihbXi5bXSt8XFsoKD86Lio/W15cXF0pPylcXSko
XC58XFt8JCkvOwogbWF0Y2g9cGF0dGVybi5leGVjKGV4cHIpOwogaWYobWF0Y2g9PW51bGwpcmV0
dXJuIGJlZm9yZTsKCiB3aGlsZShtYXRjaCE9bnVsbCl7CiB2YXIgY29tcD1tYXRjaFsxXS5zdGFy
dHNXaXRoKCdbJyk/bWF0Y2hbMl0uZ3N1YignXFxcXF0nLCddJyk6bWF0Y2hbMV07CiBjdHg9Y3R4
W2NvbXBdOwogaWYobnVsbD09Y3R4fHwnJz09bWF0Y2hbM10pYnJlYWs7CiBleHByPWV4cHIuc3Vi
c3RyaW5nKCdbJz09bWF0Y2hbM10/bWF0Y2hbMV0ubGVuZ3RoOm1hdGNoWzBdLmxlbmd0aCk7CiBt
YXRjaD1wYXR0ZXJuLmV4ZWMoZXhwcik7Cn0KCiByZXR1cm4gYmVmb3JlK1N0cmluZy5pbnRlcnBy
ZXQoY3R4KTsKfSk7Cn0KfSk7ClRlbXBsYXRlLlBhdHRlcm49LyhefC58XHJ8XG4pKCNceyguKj8p
XH0pLzsKCnZhciAkYnJlYWs9e307Cgp2YXIgRW51bWVyYWJsZT17CiBlYWNoOmZ1bmN0aW9uKGl0
ZXJhdG9yLGNvbnRleHQpewogdmFyIGluZGV4PTA7CiBpdGVyYXRvcj1pdGVyYXRvci5iaW5kKGNv
bnRleHQpOwogdHJ5ewogdGhpcy5fZWFjaChmdW5jdGlvbih2YWx1ZSl7CiBpdGVyYXRvcih2YWx1
ZSxpbmRleCsrKTsKfSk7Cn1jYXRjaChlKXsKIGlmKGUhPSRicmVhayl0aHJvdyBlOwp9CiByZXR1
cm4gdGhpczsKfSwKCiBlYWNoU2xpY2U6ZnVuY3Rpb24obnVtYmVyLGl0ZXJhdG9yLGNvbnRleHQp
ewp9LAoKIGFsbDpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJhdG9y
P2l0ZXJhdG9yLmJpbmQoY29udGV4dCk6UHJvdG90eXBlLks7CiB2YXIgcmVzdWx0PXRydWU7CiB0
aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpewogcmVzdWx0PXJlc3VsdCYmISFpdGVyYXRv
cih2YWx1ZSxpbmRleCk7CiBpZighcmVzdWx0KXRocm93ICRicmVhazsKfSk7CiByZXR1cm4gcmVz
dWx0Owp9LAoKIGFueTpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJh
dG9yP2l0ZXJhdG9yLmJpbmQoY29udGV4dCk6UHJvdG90eXBlLks7CiB2YXIgcmVzdWx0PWZhbHNl
OwogdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXsKIGlmKHJlc3VsdD0hIWl0ZXJhdG9y
KHZhbHVlLGluZGV4KSkKIHRocm93ICRicmVhazsKfSk7CiByZXR1cm4gcmVzdWx0Owp9LAoKIGNv
bGxlY3Q6ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7CiBpdGVyYXRvcj1pdGVyYXRvcj9pdGVy
YXRvci5iaW5kKGNvbnRleHQpOlByb3RvdHlwZS5LOwogdmFyIHJlc3VsdHM9W107CiB0aGlzLmVh
Y2goZnVuY3Rpb24odmFsdWUsaW5kZXgpewogcmVzdWx0cy5wdXNoKGl0ZXJhdG9yKHZhbHVlLGlu
ZGV4KSk7Cn0pOwogcmV0dXJuIHJlc3VsdHM7Cn0sCgogZmluZEFsbDpmdW5jdGlvbihpdGVyYXRv
cixjb250ZXh0KXsKIGl0ZXJhdG9yPWl0ZXJhdG9yLmJpbmQoY29udGV4dCk7CiB2YXIgcmVzdWx0
cz1bXTsKIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7CiBpZihpdGVyYXRvcih2YWx1
ZSxpbmRleCkpCiByZXN1bHRzLnB1c2godmFsdWUpOwp9KTsKIHJldHVybiByZXN1bHRzOwp9LAoK
IGdyZXA6ZnVuY3Rpb24oZmlsdGVyLGl0ZXJhdG9yLGNvbnRleHQpewp9LAoKIGluY2x1ZGU6ZnVu
Y3Rpb24ob2JqZWN0KXsKIGlmKE9iamVjdC5pc0Z1bmN0aW9uKHRoaXMuaW5kZXhPZikpCiBpZih0
aGlzLmluZGV4T2Yob2JqZWN0KSE9LTEpcmV0dXJuIHRydWU7CgogdmFyIGZvdW5kPWZhbHNlOwog
dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKXsKIGlmKHZhbHVlPT1vYmplY3QpewogZm91bmQ9dHJ1
ZTsKIHRocm93ICRicmVhazsKfQp9KTsKIHJldHVybiBmb3VuZDsKfSwKCiBpbkdyb3Vwc09mOmZ1
bmN0aW9uKG51bWJlcixmaWxsV2l0aCl7Cn0sCgogaW5qZWN0OmZ1bmN0aW9uKG1lbW8saXRlcmF0
b3IsY29udGV4dCl7Cn0sCgogaW52b2tlOmZ1bmN0aW9uKG1ldGhvZCl7CiB2YXIgYXJncz0kQShh
cmd1bWVudHMpLnNsaWNlKDEpOwogcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKXsKIHJl
dHVybiB2YWx1ZVttZXRob2RdLmFwcGx5KHZhbHVlLGFyZ3MpOwp9KTsKfSwKCiBtYXg6ZnVuY3Rp
b24oaXRlcmF0b3IsY29udGV4dCl7Cn0sCgogbWluOmZ1bmN0aW9uKGl0ZXJhdG9yLGNvbnRleHQp
ewp9LAoKIHBhcnRpdGlvbjpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKfSwKCiBwbHVjazpm
dW5jdGlvbihwcm9wZXJ0eSl7Cn0sCgogcmVqZWN0OmZ1bmN0aW9uKGl0ZXJhdG9yLGNvbnRleHQp
ewp9LAoKIHNvcnRCeTpmdW5jdGlvbihpdGVyYXRvcixjb250ZXh0KXsKfSwKCiB0b0FycmF5OmZ1
bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5tYXAoKTsKfSwKCiB6aXA6ZnVuY3Rpb24oKXsKIHZhciBp
dGVyYXRvcj1Qcm90b3R5cGUuSyxhcmdzPSRBKGFyZ3VtZW50cyk7CiBpZihPYmplY3QuaXNGdW5j
dGlvbihhcmdzLmxhc3QoKSkpCiBpdGVyYXRvcj1hcmdzLnBvcCgpOwoKIHZhciBjb2xsZWN0aW9u
cz1bdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7CiByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24o
dmFsdWUsaW5kZXgpewogcmV0dXJuIGl0ZXJhdG9yKGNvbGxlY3Rpb25zLnBsdWNrKGluZGV4KSk7
Cn0pOwp9LAoKIHNpemU6ZnVuY3Rpb24oKXsKIHJldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg7
Cn0sCgogaW5zcGVjdDpmdW5jdGlvbigpewogcmV0dXJuJyM8RW51bWVyYWJsZTonK3RoaXMudG9B
cnJheSgpLmluc3BlY3QoKSsnPic7Cn0KfTsKCk9iamVjdC5leHRlbmQoRW51bWVyYWJsZSx7CiBt
YXA6RW51bWVyYWJsZS5jb2xsZWN0LAogZmluZDpFbnVtZXJhYmxlLmRldGVjdCwKIHNlbGVjdDpF
bnVtZXJhYmxlLmZpbmRBbGwsCiBmaWx0ZXI6RW51bWVyYWJsZS5maW5kQWxsLAogbWVtYmVyOkVu
dW1lcmFibGUuaW5jbHVkZSwKIGVudHJpZXM6RW51bWVyYWJsZS50b0FycmF5LAogZXZlcnk6RW51
bWVyYWJsZS5hbGwsCiBzb21lOkVudW1lcmFibGUuYW55Cn0pOwpmdW5jdGlvbiAkQShpdGVyYWJs
ZSl7CiBpZighaXRlcmFibGUpcmV0dXJuW107CiBpZihpdGVyYWJsZS50b0FycmF5KXJldHVybiBp
dGVyYWJsZS50b0FycmF5KCk7CiB2YXIgbGVuZ3RoPWl0ZXJhYmxlLmxlbmd0aHx8MCxyZXN1bHRz
PW5ldyBBcnJheShsZW5ndGgpOwogd2hpbGUobGVuZ3RoLS0pcmVzdWx0c1tsZW5ndGhdPWl0ZXJh
YmxlW2xlbmd0aF07CiByZXR1cm4gcmVzdWx0czsKfQoKQXJyYXkuZnJvbT0kQTsKCk9iamVjdC5l
eHRlbmQoQXJyYXkucHJvdG90eXBlLEVudW1lcmFibGUpOwoKaWYoIUFycmF5LnByb3RvdHlwZS5f
cmV2ZXJzZSlBcnJheS5wcm90b3R5cGUuX3JldmVyc2U9QXJyYXkucHJvdG90eXBlLnJldmVyc2U7
CgpPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSx7CiBfZWFjaDpmdW5jdGlvbihpdGVyYXRv
cil7CiBmb3IodmFyIGk9MCxsZW5ndGg9dGhpcy5sZW5ndGg7aTxsZW5ndGg7aSsrKQogaXRlcmF0
b3IodGhpc1tpXSk7Cn0sCgogY2xlYXI6ZnVuY3Rpb24oKXsKIHRoaXMubGVuZ3RoPTA7CiByZXR1
cm4gdGhpczsKfSwKCiBmaXJzdDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXNbMF07Cn0sCgogbGFz
dDpmdW5jdGlvbigpewogcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV07Cn0sCgogY29tcGFjdDpm
dW5jdGlvbigpewogcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKXsKIHJldHVybiB2
YWx1ZSE9bnVsbDsKfSk7Cn0sCgogZmxhdHRlbjpmdW5jdGlvbigpewogcmV0dXJuIHRoaXMuaW5q
ZWN0KFtdLGZ1bmN0aW9uKGFycmF5LHZhbHVlKXsKIHJldHVybiBhcnJheS5jb25jYXQoT2JqZWN0
LmlzQXJyYXkodmFsdWUpPwogdmFsdWUuZmxhdHRlbigpOlt2YWx1ZV0pOwp9KTsKfSwKCiB3aXRo
b3V0OmZ1bmN0aW9uKCl7CiB2YXIgdmFsdWVzPSRBKGFyZ3VtZW50cyk7CiByZXR1cm4gdGhpcy5z
ZWxlY3QoZnVuY3Rpb24odmFsdWUpewogcmV0dXJuIXZhbHVlcy5pbmNsdWRlKHZhbHVlKTsKfSk7
Cn0sCgogY2xvbmU6ZnVuY3Rpb24oKXsKIHJldHVybltdLmNvbmNhdCh0aGlzKTsKfSwKCiBzaXpl
OmZ1bmN0aW9uKCl7CiByZXR1cm4gdGhpcy5sZW5ndGg7Cn0sCgogaW5zcGVjdDpmdW5jdGlvbigp
ewogcmV0dXJuJ1snK3RoaXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpKyddJzsKfSwK
CiB0b0pTT046ZnVuY3Rpb24oKXsKIHZhciByZXN1bHRzPVtdOwogdGhpcy5lYWNoKGZ1bmN0aW9u
KG9iamVjdCl7CiB2YXIgdmFsdWU9T2JqZWN0LnRvSlNPTihvYmplY3QpOwogaWYoIU9iamVjdC5p
c1VuZGVmaW5lZCh2YWx1ZSkpcmVzdWx0cy5wdXNoKHZhbHVlKTsKfSk7CiByZXR1cm4nWycrcmVz
dWx0cy5qb2luKCcsICcpKyddJzsKfQp9KTsKCgppZihPYmplY3QuaXNGdW5jdGlvbihBcnJheS5w
cm90b3R5cGUuZm9yRWFjaCkpCiBBcnJheS5wcm90b3R5cGUuX2VhY2g9QXJyYXkucHJvdG90eXBl
LmZvckVhY2g7CgppZighQXJyYXkucHJvdG90eXBlLmluZGV4T2YpQXJyYXkucHJvdG90eXBlLmlu
ZGV4T2Y9ZnVuY3Rpb24oaXRlbSxpKXsKIGl8fChpPTApOwogdmFyIGxlbmd0aD10aGlzLmxlbmd0
aDsKIGlmKGk8MClpPWxlbmd0aCtpOwogZm9yKDtpPGxlbmd0aDtpKyspCiBpZih0aGlzW2ldPT09
aXRlbSlyZXR1cm4gaTsKIHJldHVybi0xOwp9OwoKaWYoIUFycmF5LnByb3RvdHlwZS5sYXN0SW5k
ZXhPZilBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oaXRlbSxpKXsKIGk9aXNO
YU4oaSk/dGhpcy5sZW5ndGg6KGk8MD90aGlzLmxlbmd0aCtpOmkpKzE7CiB2YXIgbj10aGlzLnNs
aWNlKDAsaSkucmV2ZXJzZSgpLmluZGV4T2YoaXRlbSk7CiByZXR1cm4objwwKT9uOmktbi0xOwp9
OwoKQXJyYXkucHJvdG90eXBlLnRvQXJyYXk9QXJyYXkucHJvdG90eXBlLmNsb25lOwoKZnVuY3Rp
b24gJEgob2JqZWN0KXsKIHJldHVybiBuZXcgSGFzaChvYmplY3QpOwp9OwoKdmFyIEhhc2g9Q2xh
c3MuY3JlYXRlKEVudW1lcmFibGUsKGZ1bmN0aW9uKCl7CgogZnVuY3Rpb24gdG9RdWVyeVBhaXIo
a2V5LHZhbHVlKXsKIGlmKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpcmV0dXJuIGtleTsKIHJl
dHVybiBrZXkrJz0nK2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcuaW50ZXJwcmV0KHZhbHVlKSk7
Cn0KCiByZXR1cm57CiBpbml0aWFsaXplOmZ1bmN0aW9uKG9iamVjdCl7CiB0aGlzLl9vYmplY3Q9
T2JqZWN0LmlzSGFzaChvYmplY3QpP29iamVjdC50b09iamVjdCgpOk9iamVjdC5jbG9uZShvYmpl
Y3QpOwp9LAoKIF9lYWNoOmZ1bmN0aW9uKGl0ZXJhdG9yKXsKIGZvcih2YXIga2V5IGluIHRoaXMu
X29iamVjdCl7CiB2YXIgdmFsdWU9dGhpcy5fb2JqZWN0W2tleV0scGFpcj1ba2V5LHZhbHVlXTsK
IHBhaXIua2V5PWtleTsKIHBhaXIudmFsdWU9dmFsdWU7CiBpdGVyYXRvcihwYWlyKTsKfQp9LAoK
IHNldDpmdW5jdGlvbihrZXksdmFsdWUpewogcmV0dXJuIHRoaXMuX29iamVjdFtrZXldPXZhbHVl
Owp9LAoKIGdldDpmdW5jdGlvbihrZXkpewogcmV0dXJuIHRoaXMuX29iamVjdFtrZXldOwp9LAoK
IHVuc2V0OmZ1bmN0aW9uKGtleSl7CiB2YXIgdmFsdWU9dGhpcy5fb2JqZWN0W2tleV07CiBkZWxl
dGUgdGhpcy5fb2JqZWN0W2tleV07CiByZXR1cm4gdmFsdWU7Cn0sCgogdG9PYmplY3Q6ZnVuY3Rp
b24oKXsKIHJldHVybiBPYmplY3QuY2xvbmUodGhpcy5fb2JqZWN0KTsKfSwKCiBrZXlzOmZ1bmN0
aW9uKCl7CiByZXR1cm4gdGhpcy5wbHVjaygna2V5Jyk7Cn0sCgogdmFsdWVzOmZ1bmN0aW9uKCl7
CiByZXR1cm4gdGhpcy5wbHVjaygndmFsdWUnKTsKfSwKCiB1cGRhdGU6ZnVuY3Rpb24ob2JqZWN0
KXsKIHJldHVybiBuZXcgSGFzaChvYmplY3QpLmluamVjdCh0aGlzLGZ1bmN0aW9uKHJlc3VsdCxw
YWlyKXsKIHJlc3VsdC5zZXQocGFpci5rZXkscGFpci52YWx1ZSk7CiByZXR1cm4gcmVzdWx0Owp9
KTsKfSwKCiB0b0pTT046ZnVuY3Rpb24oKXsKIHJldHVybiBPYmplY3QudG9KU09OKHRoaXMudG9P
YmplY3QoKSk7Cn0sCgogY2xvbmU6ZnVuY3Rpb24oKXsKIHJldHVybiBuZXcgSGFzaCh0aGlzKTsK
fQp9Cn0pKCkpOwoKSGFzaC5wcm90b3R5cGUudG9UZW1wbGF0ZVJlcGxhY2VtZW50cz1IYXNoLnBy
b3RvdHlwZS50b09iamVjdDsKSGFzaC5mcm9tPSRIOwoKdmFyIE5vZGU9e307CgooZnVuY3Rpb24o
KXsKIHZhciBlbGVtZW50PXRoaXMuRWxlbWVudDsKIHRoaXMuRWxlbWVudD1mdW5jdGlvbih0YWdO
YW1lLGF0dHJpYnV0ZXMpewogYXR0cmlidXRlcz1hdHRyaWJ1dGVzfHx7fTsKIHRhZ05hbWU9dGFn
TmFtZS50b0xvd2VyQ2FzZSgpOwogdmFyIGNhY2hlPUVsZW1lbnQuY2FjaGU7CiBpZihQcm90b3R5
cGUuQnJvd3Nlci5JRSYmYXR0cmlidXRlcy5uYW1lKXsKIHRhZ05hbWU9JzwnK3RhZ05hbWUrJyBu
YW1lPSInK2F0dHJpYnV0ZXMubmFtZSsnIj4nOwogZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsKIHJl
dHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFt
ZSksYXR0cmlidXRlcyk7Cn0KIGlmKCFjYWNoZVt0YWdOYW1lXSljYWNoZVt0YWdOYW1lXT1FbGVt
ZW50LmV4dGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTsKIHJldHVybiBFbGVt
ZW50LndyaXRlQXR0cmlidXRlKGNhY2hlW3RhZ05hbWVdLmNsb25lTm9kZShmYWxzZSksYXR0cmli
dXRlcyk7Cn07CiBPYmplY3QuZXh0ZW5kKHRoaXMuRWxlbWVudCxlbGVtZW50fHx7fSk7Cn0pLmNh
bGwod2luZG93KTsKCkVsZW1lbnQuY2FjaGU9e307CgpFbGVtZW50Lk1ldGhvZHM9e307CgpFbGVt
ZW50Lk1ldGhvZHMuQnlUYWc9e307CgpPYmplY3QuZXh0ZW5kKEVsZW1lbnQsRWxlbWVudC5NZXRo
b2RzKTsKCkFic3RyYWN0LkV2ZW50T2JzZXJ2ZXI9Q2xhc3MuY3JlYXRlKHsKIGluaXRpYWxpemU6
ZnVuY3Rpb24oZWxlbWVudCxjYWxsYmFjayl7CiB0aGlzLmVsZW1lbnQ9JChlbGVtZW50KTsKIHRo
aXMuY2FsbGJhY2s9Y2FsbGJhY2s7CgogdGhpcy5sYXN0VmFsdWU9dGhpcy5nZXRWYWx1ZSgpOwog
aWYodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKT09J2Zvcm0nKQogdGhpcy5yZWdp
c3RlckZvcm1DYWxsYmFja3MoKTsKIGVsc2UKIHRoaXMucmVnaXN0ZXJDYWxsYmFjayh0aGlzLmVs
ZW1lbnQpOwp9LAoKIG9uRWxlbWVudEV2ZW50OmZ1bmN0aW9uKCl7Cn0sCgogcmVnaXN0ZXJGb3Jt
Q2FsbGJhY2tzOmZ1bmN0aW9uKCl7CiBGb3JtLmdldEVsZW1lbnRzKHRoaXMuZWxlbWVudCkuZWFj
aCh0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssdGhpcyk7Cn0sCgogcmVnaXN0ZXJDYWxsYmFjazpmdW5j
dGlvbihlbGVtZW50KXsKIGlmKGVsZW1lbnQudHlwZSl7CiBzd2l0Y2goZWxlbWVudC50eXBlLnRv
TG93ZXJDYXNlKCkpewogY2FzZSdjaGVja2JveCc6CiBjYXNlJ3JhZGlvJzoKIEV2ZW50Lm9ic2Vy
dmUoZWxlbWVudCwnY2xpY2snLHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7CiBicmVh
azsKIGRlZmF1bHQ6CiBFdmVudC5vYnNlcnZlKGVsZW1lbnQsJ2NoYW5nZScsdGhpcy5vbkVsZW1l
bnRFdmVudC5iaW5kKHRoaXMpKTsKIGJyZWFrOwp9Cn0KfQp9KTsKCkhhc2gudG9RdWVyeVN0cmlu
Zz1PYmplY3QudG9RdWVyeVN0cmluZzsKCnZhciBUb2dnbGU9e2Rpc3BsYXk6RWxlbWVudC50b2dn
bGV9OwoKdmFyIFBvc2l0aW9uPXt9OwoKdmFyIENvbnRyb2wgPSB7IH07CgooZnVuY3Rpb24oKXsK
IHdpbmRvdy56ZW49ewoKIGFwaTpmdW5jdGlvbihwYXRoLG9iaix2ZXJiYXRpbSl7CiB2YXIgd3Jh
cHBlcnM9emVuLmFwaS5fd3JhcHBlcnM9emVuLmFwaS5fd3JhcHBlcnN8fHt9Owogb2JqPW9ianx8
e307CgogaWYoIXdyYXBwZXJzW3BhdGhdKXsKIHZhciB3cmFwcGVyPW9iajsKIGlmKHR5cGVvZihv
YmopIT0nZnVuY3Rpb24nfHxvYmouc3ViY2xhc3Nlcyl7CgoKIHdyYXBwZXI9ZnVuY3Rpb24oKXsK
IHZhciBwYXJ0cz1wYXRoLnNwbGl0KCcuJyk7CiB2YXIgYXBpPXBhcnRzLnBvcCgpOwogdmFyIGxv
Yz16ZW4ucmVzb2x2ZShwYXJ0cyk7CiBpZighbG9jKXJldHVybiBjb25zb2xlLmVycm9yVHJhY2Uo
J3plbi5hcGk6IENhblwndCBjcmVhdGUgIicrcGF0aCsnIicpCiBsb2NbYXBpXT1vYmo7Cn0KfQog
d3JhcHBlcnNbcGF0aF09d3JhcHBlcjsKfWVsc2V7CiByZXR1cm4gY29uc29sZS5lcnJvclRyYWNl
KCd6ZW4uYXBpKCk6ICInK3BhdGgrJyIgYWxyZWFkeSBkZWZpbmVkJyk7Cn0KfSwKCiByZXF1aXJl
OmZ1bmN0aW9uKCl7CiB2YXIgc3RhY2s9emVuLmFwaS5fc3RhY2s9emVuLmFwaS5fc3RhY2t8fFtd
OwogJEEoYXJndW1lbnRzKS5lYWNoKGZ1bmN0aW9uKGFwaSl7CiBzdGFjay5wdXNoKGFwaSk7CiB0
cnl7CgogdmFyIGY9emVuLmFwaS5fd3JhcHBlcnMmJnplbi5hcGkuX3dyYXBwZXJzW2FwaV07CiBm
KCk7Cn1jYXRjaChlKXsKIHplbi5sb2dFeGNlcHRpb24oZSwnemVuLnJlcXVpcmUoKSBleGNlcHRp
b24uIHN0YWNrID0gJytzdGFjay5qb2luKCcgPiAnKSk7Cn0KIHplbi5hcGkuX3dyYXBwZXJzW2Fw
aV09UHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CiBzdGFjay5wb3AoKTsKfSk7Cn0sCgogcmVzb2x2
ZTpmdW5jdGlvbihwYXRoLHBhcmVudCl7Cn0sCgogcHJveHk6ZnVuY3Rpb24ocmVtb3RlTmFtZSxs
b2NhbE5hbWUpewp9LAoKIGxvY2F0ZTpmdW5jdGlvbihuYW1lLHcpewogdz13fHxwYXJlbnQ7CiB0
cnl7CiB3aGlsZSh3KXsKIGlmKHdbbmFtZV0pcmV0dXJuIHdbbmFtZV07CiB3PSh3LnBhcmVudCE9
PXcpP3cucGFyZW50Oncub3BlbmVyOwp9Cn1jYXRjaChlKXsKCgp9CiByZXR1cm4gbnVsbDsKfSwK
CgogZGVwcmVjYXRlOmZ1bmN0aW9uKGEsYil7CiB2YXIgYz1hcmd1bWVudHMuY2FsbGVlOwogaWYo
Y1tiXSlyZXR1cm47CiBjW2JdPXRydWU7CgogaWYoYS5pbmRleE9mKCchJyk9PTApewogY29uc29s
ZS5lcnJvcignRGVwcmVjYXRpb246ICcrYS5zdWJzdHIoMSkrKGI/JyAtLT4gJytiOicnKSk7Cn1l
bHNlewogY29uc29sZS53YXJuKCdEZXByZWNhdGlvbjogJythKyhiPycgLS0+ICcrYjonJykpOwp9
Cn0sCgogbG9nRXhjZXB0aW9uOmZ1bmN0aW9uKGUsbXNnKXsKfSwKCiBiaW5kOmZ1bmN0aW9uKCl7
CiB2YXIgYT0kQShhcmd1bWVudHMpLG89YS5zaGlmdCgpLGs7CiB3aGlsZShrPWEuc2hpZnQoKSl7
CiB2YXIgYXNFdmVudD1rLmluZGV4T2YoJyMnKT09MDsKIGs9YXNFdmVudD9rLnN1YnN0cigxKTpr
OwogaWYoIW9ba10pdGhyb3cgbmV3IEVycm9yKCdiaW5kOiAiJytrKyciIGlzIG5vdCBkZWZpbmVk
Jyk7CiBvW2tdPWFzRXZlbnQ/b1trXS5iaW5kQXNFdmVudExpc3RlbmVyKG8pOm9ba10uYmluZChv
KTsKfQp9LAp9OwoKIE9iamVjdC5leHRlbmQod2luZG93LHsKCiAkdW5pcXVlOmZ1bmN0aW9uKHBh
dHRlcm4pewogdmFyIGM9YXJndW1lbnRzLmNhbGxlZTsKIGMuX2k9KGMuX2l8fDApKzE7CiByZXR1
cm4gcGF0dGVybj9wYXR0ZXJuLnJlcGxhY2UoLyMvZyxjLl9pKTpjLl9pOwp9LAoKICRjaWQ6ZnVu
Y3Rpb24oZWxlbWVudElkKXsKIHZhciBtYXRjaD1lbGVtZW50SWQubWF0Y2goLyhjXGQqKS8pOwog
cmV0dXJuIG1hdGNoP21hdGNoWzBdOmZhbHNlOwp9Cgp9KTsKCn0pKCk7Cgp6ZW4uYXBpKCd4TmF0
aXZlJyxmdW5jdGlvbigpewogT2JqZWN0LmV4dGVuZChPYmplY3QsewoKIGVhY2g6ZnVuY3Rpb24o
byxmKXsKIHZhciBwYWlycz1bXTsKIGZvcih2YXIgayBpbiBvKXBhaXJzLnB1c2goe2tleTprLHZh
bHVlOm9ba119KTsKIGZvcih2YXIgaT0wO2k8cGFpcnMubGVuZ3RoO2krKylmKHBhaXJzW2ldKTsK
fSwKCiBlYWNoS2V5OmZ1bmN0aW9uKG8sZil7CiBpZihvKU9iamVjdC5rZXlzKG8pLmVhY2goZik7
Cn0sCgogZWFjaFZhbHVlOmZ1bmN0aW9uKG8sZil7CiBpZihvKU9iamVjdC52YWx1ZXMobykuZWFj
aChmKTsKfSwKCiBleHRlbmRPcHRpb25zOmZ1bmN0aW9uKGRzdCxzcmMpewp9LAp9KQoKIE9iamVj
dC5leHRlbmQoQXJyYXkucHJvdG90eXBlLHsKIG1vdmU6ZnVuY3Rpb24oeCx5KXsKfSwKCiBpbnNl
cnQ6ZnVuY3Rpb24obyx4KXsKIHRoaXNbdGhpcy5sZW5ndGhdPW87CiByZXR1cm4gdGhpcy5tb3Zl
KHRoaXMubGVuZ3RoLTEseHx8MCk7Cn0sCgogcmVtb3ZlSW5kZXg6ZnVuY3Rpb24oeCl7CiB0aGlz
Lm1vdmUoeCx0aGlzLmxlbmd0aC0xKTsKIHJldHVybiB0aGlzLnBvcCgpOwp9LAoKIHJlbW92ZTpm
dW5jdGlvbihvKXsKIHZhciBsPXRoaXMubGVuZ3RoOwogZm9yKHZhciBpPTAsaj0wO2k8bDtpKysp
ewogaWYodGhpc1tpXT09byljb250aW51ZTsKIHRoaXNbal09dGhpc1tpXTsKIGorKzsKfQogd2hp
bGUoaT5qKWRlbGV0ZSB0aGlzW2ktLV07CiB0aGlzLmxlbmd0aD1qOwogcmV0dXJuIHRoaXMubGVu
Z3RoPT1sP251bGw6bzsKfSwKCiB0aHJlYWRlZEl0ZXJhdG9yOmZ1bmN0aW9uKGl0ZXJhdG9yLGxp
bWl0LGNhbGxiYWNrKXsKIHZhciBsZW5ndGg9dGhpcy5sZW5ndGg7CiBpZihsZW5ndGg+PWxpbWl0
KXsKIHZhciBycT10aGlzLmNsb25lKCk7CiBpdGVyYXRvci53cmFwKGZ1bmN0aW9uKGZ1bmMpewog
dmFyIGk9cnEucG9wKCk7CiBmdW5jKGkpOwogaWYocnEubGVuZ3RoPjApewogcmV0dXJuIHRydWU7
Cn1lbHNlewogaWYoY2FsbGJhY2smJnR5cGVvZihjYWxsYmFjayk9PSdmdW5jdGlvbicpY2FsbGJh
Y2soKTsKIHJldHVybiBmYWxzZTsKfTsKfSkucnVuKCk7Cn1lbHNlewogZm9yKHZhciBpPTA7aTxs
ZW5ndGg7aSsrKXsKIGl0ZXJhdG9yKHRoaXNbaV0pOwp9OwogaWYoY2FsbGJhY2smJnR5cGVvZihj
YWxsYmFjayk9PSdmdW5jdGlvbicpY2FsbGJhY2soKTsKfQoKfQoKfSk7CgogT2JqZWN0LmV4dGVu
ZChBcnJheSx7CgogY3JlYXRlQ29tcGFyYXRvcjpmdW5jdGlvbih0bXBsLHIpewp9LAoKIHNvcnRl
ZEluZGV4OmZ1bmN0aW9uKGFycixmLHRhcmdldCl7CiB2YXIgbG93PTA7CiB2YXIgaGlnaD1hcnIu
bGVuZ3RoOwogd2hpbGUobG93PGhpZ2gpewogdmFyIG1pZD0obG93K2hpZ2gpPj4xOwogaWYoZihh
cnJbbWlkXSx0YXJnZXQpPDApewogbG93PW1pZCsxOwp9ZWxzZXsKIGhpZ2g9bWlkOwp9Cn0KIHJl
dHVybiBsb3c7Cn0sCgogc29ydGVkSW5kZXhPZjpmdW5jdGlvbihhcnIsZix0YXJnZXQpewogdmFy
IGk9QXJyYXkuc29ydGVkSW5kZXgoYXJyLGYsdGFyZ2V0KTsKIGRvewogaWYoYXJyW2ldPT09dGFy
Z2V0KXJldHVybiBpOwogaSsrOwp9d2hpbGUoaTxhcnIubGVuZ3RoJiZmKGFycltpXSx0YXJnZXQp
PT0wKTsKCiByZXR1cm4tMTsKfQp9KTsKCiBPYmplY3QuZXh0ZW5kKFN0cmluZyx7CgogY29tcGFy
ZUNhc2VsZXNzOmZ1bmN0aW9uKGEsYil7CiBhPWEudG9Mb3dlckNhc2UoKTsKIGI9Yi50b0xvd2Vy
Q2FzZSgpOwogcmV0dXJuIGE8Yj8tMTooYT5iPzE6MCk7Cn0KfSk7CgogdmFyIE1ldGhvZHM9ewoK
IGNvbXBhcmVDYXNlbGVzczpmdW5jdGlvbihzKXsKIHJldHVybiBTdHJpbmcuY29tcGFyZUNhc2Vs
ZXNzKHRoaXMscyk7Cn0sCgoKIGlzRXF1YWxDYXNlbGVzczpmdW5jdGlvbihzKXsKIHJldHVybiBT
dHJpbmcuY29tcGFyZUNhc2VsZXNzKHRoaXMscyk9PTA7Cn0sCgoKIGluZGV4T2ZDYXNlbGVzczpm
dW5jdGlvbihzKXsKIHJldHVybiB0aGlzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzLnRvTG93ZXJD
YXNlKCkpOwp9LAoKCiBoYXNoOmZ1bmN0aW9uKCl7CiBmb3IodmFyIGk9MCxoPTUzODE7aTx0aGlz
Lmxlbmd0aDtpKyspewogaD0oKGgqMzMpXnRoaXMuY2hhckNvZGVBdChpKSk7Cn0KIHJldHVybiBo
JjB4N2ZmZmZmZmY7Cn0sCgogaXNFbWFpbEFkZHJlc3M6ZnVuY3Rpb24oYSl7CiByZXR1cm4gdGhp
cy5tYXRjaCgvXihbXHdcLlwtXCtdKylAKCg/OlstYS16MC05XStcLikrW2Etel17Mix9KSQvaSk/
dHJ1ZTpmYWxzZTsKfQp9CiBPYmplY3QuZXh0ZW5kKFN0cmluZy5wcm90b3R5cGUsTWV0aG9kcyk7
CgogT2JqZWN0LmV4dGVuZChGdW5jdGlvbi5wcm90b3R5cGUsewoKIHJ1bjpmdW5jdGlvbihhTmFt
ZSl7CiBpZighdGhpcy5fcnVubmVyKXsKIHZhciBydW5uYWJsZT10aGlzOwogdGhpcy5fcnVuTmFt
ZT1hTmFtZXx8J2Fub255bW91cyB0aHJlYWQgZnVuY3Rpb24nOwogdGhpcy5fcnVubmVyPWZ1bmN0
aW9uKCl7CgogdmFyIGFnYWluPSFydW5uYWJsZS5fcnVuVGltZXI7CiB0cnl7CgogYWdhaW49YWdh
aW58fHJ1bm5hYmxlKCk7Cn1jYXRjaChlKXsKIHplbi5sb2dFeGNlcHRpb24oZSx0aGlzLl9ydW5O
YW1lKTsKfWZpbmFsbHl7CiBydW5uYWJsZS5fcnVubmluZz0hIWFnYWluOwp9CgogaWYoYWdhaW4p
ewoKIHJ1bm5hYmxlLl9ydW5UaW1lcj1zZXRUaW1lb3V0KHJ1bm5hYmxlLl9ydW5uZXIsMCk7Cn1l
bHNlewoKIHJ1bm5hYmxlLnN0b3BSdW5uaW5nKCk7CgoKIGlmKHJ1bm5hYmxlLm9uU3RvcClydW5u
YWJsZS5vblN0b3AoKTsKfQp9Cn0KCgogaWYoIXRoaXMuX3J1blRpbWVyKXsKIGNvbnNvbGUubG9n
KCdydW4oKTogU3RhcnRpbmcgJyt0aGlzLl9ydW5OYW1lKTsKIHRoaXMuX3J1bm5lcigpOwp9Cn0s
CgoKIHN0b3BSdW5uaW5nOmZ1bmN0aW9uKCl7CiBpZih0aGlzLl9ydW5UaW1lcil7CiBjb25zb2xl
LmxvZygncnVuKCk6IFN0b3BwaW5nICcrdGhpcy5fcnVuTmFtZSk7CiBjbGVhclRpbWVvdXQodGhp
cy5fcnVuVGltZXIpOwogZGVsZXRlIHRoaXMuX3J1blRpbWVyOwp9Cn0sCgoKIHNldExhenk6ZnVu
Y3Rpb24obXMscGVyaW9kaWMpewogdGhpcy5fbHpNcz1tczsKIHRoaXMuX2x6UGVyaW9kaWM9cGVy
aW9kaWM7CgoKIGlmKHRoaXMuX2x6KXsKIGNsZWFyVGltZW91dCh0aGlzLl9seik7CiBkZWxldGUg
dGhpcy5fbHoKfQoKCiB0aGlzLl9sekZ1bmN0aW9uPXRoaXMuX2x6RnVuY3Rpb258fGZ1bmN0aW9u
KCl7CiB0cnl7CgogdGhpcygpOwp9Y2F0Y2goZSl7CiB6ZW4ubG9nRXhjZXB0aW9uKGUpOwp9Zmlu
YWxseXsKIGRlbGV0ZSB0aGlzLl9sejsKCgogaWYodGhpcy5fbHpQZXJpb2RpYyl7CiB0aGlzLnNl
dExhenkodGhpcy5fbHpNcyx0cnVlKTsKfWVsc2V7CgogdGhpcy5jbGVhckxhenkoKTsKfQp9Cn0u
YmluZCh0aGlzKTsKCiB0aGlzLl9sej1zZXRUaW1lb3V0KHRoaXMuX2x6RnVuY3Rpb24sdGhpcy5f
bHpNc3x8MCk7CgogcmV0dXJuIHRoaXM7Cn0sCgogY2xlYXJMYXp5OmZ1bmN0aW9uKCl7Cn0sCgog
YmluZFNoaWZ0OmZ1bmN0aW9uKGNvbnRleHQsbil7Cn0sCgogYWZ0ZXI6ZnVuY3Rpb24oYmVmb3Jl
KXsKfSwKCiBiZWZvcmU6ZnVuY3Rpb24oYWZ0ZXIpewp9LAoKIHBpcGU6ZnVuY3Rpb24oZHN0KXsK
fQp9KTsKCiBIYXNoLmFkZE1ldGhvZHMoewoKIGhhc0tleTpmdW5jdGlvbihrKXtyZXR1cm4gayBp
biB0aGlzLl9vYmplY3Q7fQp9KTsKfSk7Cgp6ZW4uYXBpKCdPYnNlcnZhYmxlJyxmdW5jdGlvbigp
ewogemVuLnJlcXVpcmUoJ3hOYXRpdmUnKTsKCgogd2luZG93Lk9ic2VydmVIZWxwZXI9Q2xhc3Mu
Y3JlYXRlKHsKfSk7CgoKIHdpbmRvdy5PYnNlcnZhYmxlPXsKCgoKIFNUT1BfT0JTRVJWSU5HOjB4
REVDRUE1RUQsCgoKIEFMTF9FVkVOVFM6J19hbGxfZXZlbnRzXycsCgogTWV0aG9kczp7Cgogb2Jz
ZXJ2ZTpmdW5jdGlvbihlLG9ic2VydmVyLHNjb3BlLG1zZyl7Cn0sCgogbm90aWZ5OmZ1bmN0aW9u
KGUpewogaWYoIWUpcmV0dXJuIGNvbnNvbGUuZXJyb3JUcmFjZSgnSW52YWxpZCBldmVudDogJytl
KTsKCiB2YXIgb2JzPXRoaXMuX19vYnNlcnZlcnM7CiBpZighb2JzKXJldHVybjsKCgoKIHZhciB0
aGluPWZhbHNlLG9ic2xlbj1vYnMubGVuZ3RoOwogdmFyIG5vYnM9MDsKIGZvcih2YXIgaT0wO2k8
b2JzbGVuO2krKyl7CiB2YXIgbz1vYnNbaV07CiBpZighbyl0aGluPXRydWU7CiBpZighb3x8KG8u
ZSE9ZSYmby5lIT1PYnNlcnZhYmxlLkFMTF9FVkVOVFMpKWNvbnRpbnVlOwogbm9icysrOwoKIHRy
eXsKIG8ub2JzZXJ2ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp9Y2F0Y2goZXgpewogaWYoZXg9
PU9ic2VydmFibGUuU1RPUF9PQlNFUlZJTkcpewoKIG9ic1tpXT1udWxsOwp9ZWxzZXsKIGNvbnNv
bGUuZ3JvdXAoJ0V4Y2VwdGlvbiBkdXJpbmcgbm90aWZ5KCcrZSsnKTonKTsKIGNvbnNvbGUuZGly
KGV4KTsKIGNvbnNvbGUudHJhY2UoKTsKIGNvbnNvbGUuZ3JvdXBFbmQoKTsKfQp9Cn0KCiBpZihu
b2JzPjYpewogY29uc29sZS53YXJuKCdub3RpZnkoKTogIicrZSsnIiBoYXMgJytub2JzKycgb2Jz
ZXJ2ZXJzIC4uLiBwb3NzaWJsZSBvYnNlcnZlciBsZWFrPycpOwp9CiBpZih0aGluKW9icy50aGlu
KCk7Cn0KfQp9Owp9KTsKCnplbi5hcGkoJ1plbkl0ZW0nLGZ1bmN0aW9uKCl7CiB6ZW4ucmVxdWly
ZSgnT2JzZXJ2YWJsZScsJ3hOYXRpdmUnKTsKCgogd2luZG93Llplbkl0ZW09Q2xhc3MuY3JlYXRl
KEhhc2gpOwogWmVuSXRlbS5hZGRNZXRob2RzKE9ic2VydmFibGUuTWV0aG9kcyk7CgogT2JqZWN0
LmV4dGVuZChaZW5JdGVtLHsKCiBSRUxFQVNFRDoncmVsZWFzZWQoaXRlbSknLAoKCiBSRU1PVkU6
J3JlbW92ZShpdGVtLCBxdWlldCknLAoKCiBDSEFOR0VEOidjaGFuZ2VkKGl0ZW0pJywKCgogQ0hB
TkdFRF9JRDonY2hhbmdlZF9pZChpdGVtLCBvbGRJZCwgbmV3SWQpJywKCiBKU1VQX0tFWVM6bmV3
IFJlZ0V4cCgnX25ld3xfZGVsZXRlfF91cGRhdGUnKSwKCgoKIGNvbXBhcmVJZDpBcnJheS5jcmVh
dGVDb21wYXJhdG9yKCcje29iamVjdH0uaWQnKQp9KTsKCiBaZW5JdGVtLmFkZE1ldGhvZHMoewoK
IEZJTFRFUlM6e30sCgoKIF9wcmV2aW91c1N0YXRlOm51bGwsCgoKIF9jaGFuZ2VkOmZhbHNlLAoK
CiBpbml0aWFsaXplOmZ1bmN0aW9uKCRzdXBlcixvYmopewogJHN1cGVyKCk7CgogdGhpcy5fcmVm
cz0wOwoKIG9iaj1vYmp8fHt9Owogb2JqLmlkPW9iai5pZDsKIHRoaXMuc2V0QWxsKG9iaix0cnVl
KTsKIHRoaXMuY2lkPSR1bmlxdWUoJ2MjJyk7CgoKIHRoaXMuX2NoYW5nZWQ9ZmFsc2U7CiB0aGlz
Ll9wcmV2aW91c1N0YXRlPXRoaXMudG9PYmplY3QoKTsKfSwKCgogY2xvbmU6ZnVuY3Rpb24oKXsK
IHJldHVybiBuZXcodGhpcy5jb25zdHJ1Y3RvcikodGhpcy50b09iamVjdCgpKTsKfSwKCiBpc0Vx
dWFsOmZ1bmN0aW9uKGl0ZW0pewogcmV0dXJuIGl0ZW0mJk9iamVjdC5pc0VxdWFsKHRoaXMuX29i
amVjdCxpdGVtLl9vYmplY3QpOwp9LAoKCiBub3RpZnlDaGFuZ2VkOmZ1bmN0aW9uKCl7CiB0aGlz
Lm5vdGlmeShaZW5JdGVtLkNIQU5HRUQsdGhpcyk7CiB0aGlzLl9wcmV2aW91c1N0YXRlPXRoaXMu
dG9PYmplY3QoKTsKIHRoaXMuX2NoYW5nZWQ9ZmFsc2U7CiB0aGlzLl9jaGFuZ2VkUHJvcGVydGll
cz1mYWxzZTsKfSwKCgogbm90aWZ5UmVtb3ZlOmZ1bmN0aW9uKHF1aWV0KXsKIHRoaXMubm90aWZ5
KFplbkl0ZW0uUkVNT1ZFLHRoaXMscXVpZXQpOwogY29uc29sZS5hc3NlcnQodGhpcy5fcmVmcz09
MCwnbm90aWZ5UmVtb3ZlOiBJdGVtIG5vdCBjb21wbGV0ZWx5IHJlbW92ZWQ/Jyk7Cn0sCgoKIGlz
Q2hhbmdlZDpmdW5jdGlvbihrKXsKIHJldHVybiBrP3RoaXMuX3ByZXZpb3VzU3RhdGVba10hPXRo
aXMuX29iamVjdFtrXTp0aGlzLl9jaGFuZ2VkOwp9LAoKIGhhc0lkOmZ1bmN0aW9uKCl7CiByZXR1
cm4gdGhpcy5pZCYmdGhpcy5pZD4wOwp9LAoKCiBjbGVhcjpmdW5jdGlvbigpewogdGhpcy5fb2Jq
ZWN0PXsKIGlkOnRoaXMuaWQKfTsKIHJldHVybiB0aGlzOwp9LAoKCiBzZXRBbGw6ZnVuY3Rpb24o
b2JqLHF1aWV0KXsKIGlmKCFvYmopcmV0dXJuOwogb2JqPW9iai5fb2JqZWN0fHxvYmo7CgogZm9y
KHZhciBrIGluIG9iail7CiBpZighWmVuSXRlbS5KU1VQX0tFWVMudGVzdChrKSl0aGlzLnNldChr
LG9ialtrXSxxdWlldCk7Cn0KIHJldHVybiB0aGlzOwp9LAoKIHNldE9iamVjdDpmdW5jdGlvbihv
YmoscXVpZXQpewogemVuLmRlcHJlY2F0ZSgnWmVuSXRlbS5zZXRPYmplY3QnLCdaZW5JdGVtLnNl
dEFsbCcpOwogcmV0dXJuIHRoaXMuc2V0QWxsKG9iaixxdWlldCk7Cn0sCgoKIHNldDpmdW5jdGlv
bihrLHYscXVpZXQpewoKIHZhciBmPXRoaXMuRklMVEVSU1trXTsKIHY9Zj9mKHYpOnY7CgogaWYo
az09J2lkJyYmKCF2fHx2IT10aGlzLmlkKSl7CiB2YXIgb2xkSWQ9dGhpcy5pZDsKCiB2PXZ8fCR1
bmlxdWUoKSotMTsKIGlmKHYhPW9sZElkKXsKIHRoaXMuaWQ9djsKIGlmKCFxdWlldCl0aGlzLm5v
dGlmeShaZW5JdGVtLkNIQU5HRURfSUQsdGhpcyxvbGRJZCx2KTsKfQp9CiByZXR1cm4gdGhpcy5f
b2JqZWN0W2tdPXY7Cn0sCgoKIHVuc2V0OmZ1bmN0aW9uKCRzdXBlcixrKXsKIGlmKGs9PSdpZCcp
cmV0dXJuIGNvbnNvbGUud2FybignWmVuSXRlbTogImlkIiBjYW5ub3QgYmUgdW5zZXQuJyk7CiBy
ZXR1cm4gJHN1cGVyKGspOwp9LAoKIHJldGFpbjpmdW5jdGlvbigpewogdGhpcy5fcmVmcysrOwoK
CgoKIGlmKHRoaXMuX3JlZnM+NSl7CiBjb25zb2xlLndhcm4oJ1VuZXhwZWN0ZWRseSBoaWdoIHJl
ZmVyZW5jZSBjb3VudCAoJyt0aGlzLl9yZWZzKycpIGZvciAnK3RoaXMpOwp9Cn0sCgoKIHJlbGVh
c2U6ZnVuY3Rpb24oKXsKIHRoaXMuX3JlZnMtLTsKIGlmKHRoaXMuX3JlZnM8MCl7CiBjb25zb2xl
Lndhcm4oJ1JlZmVyZW5jZSBjb3VudCA8IDAgZm9yICcrdGhpcyk7Cn0KIGlmKHRoaXMuX3JlZnM8
PTApewogdGhpcy5ub3RpZnkoWmVuSXRlbS5SRUxFQVNFRCx0aGlzKTsKfQp9LAoKIHRvU3RyaW5n
OmZ1bmN0aW9uKCl7CiByZXR1cm4nSXRlbSAnK3RoaXMuaWQ7Cn0KfSk7CgogWmVuSXRlbS5fbm9w
cm94eT10cnVlOwp9KTsKCnplbi5hcGkoJ1plblNldCcsZnVuY3Rpb24oKXsKIHplbi5yZXF1aXJl
KCd4TmF0aXZlJywnWmVuSXRlbScpOwoKCiB3aW5kb3cuWmVuU2V0PUNsYXNzLmNyZWF0ZSgpOwog
WmVuU2V0LmFkZE1ldGhvZHMoRW51bWVyYWJsZSk7CiBaZW5TZXQuYWRkTWV0aG9kcyhPYnNlcnZh
YmxlLk1ldGhvZHMpOwoKIE9iamVjdC5leHRlbmQoWmVuU2V0LHsKCiBJVEVNX0NIQU5HRUQ6J2l0
ZW1DaGFuZ2VkKHNldCwgaXRlbSknLAoKCiBJVEVNX0NIQU5HRURfSUQ6J2l0ZW1DaGFuZ2VkSWQo
c2V0LCBpdGVtLCBvbGRJZCwgbmV3SWQpJywKCgogSVRFTV9BRERFRDonaXRlbUFkZGVkKHNldCwg
aXRlbSknLAoKCiBJVEVNX1JFTU9WRUQ6J2l0ZW1SZW1vdmVkKHNldCwgaXRlbSknLAoKCiBVUERB
VEVEOid1cGRhdGVkKHNldCknCn0pOwoKIFplblNldC5hZGRNZXRob2RzKHsKCiBpbml0aWFsaXpl
OmZ1bmN0aW9uKHJldGFpbkl0ZW1zKXsKIGNvbnNvbGUuYXNzZXJ0KHR5cGVvZihyZXRhaW5JdGVt
cyk9PSdib29sZWFuJywnWmVuU2V0OiByZXRhaW5JdGVtcyBtdXN0IGJlIGVpdGhlciB0cnVlIG9y
IGZhbHNlJyk7CgogemVuLmJpbmQodGhpcywnaGFuZGxlSXRlbUV2ZW50JywnX2RldGFjaCcpOwoK
IHRoaXMuX3JldGFpbkl0ZW1zPXJldGFpbkl0ZW1zIT09ZmFsc2U7CiB0aGlzLl9pbml0KCk7Cn0s
CgoKIF9pbml0OmZ1bmN0aW9uKCl7CiBPYmplY3QuZWFjaFZhbHVlKHRoaXMuX2J5SWQsdGhpcy5f
ZGV0YWNoKTsKIHRoaXMuX3NpemU9MDsKIHRoaXMuX2J5SWQ9e307CiB0aGlzLl9ieUNpZD17fTsK
fSwKCgogZGVzdHJveTpmdW5jdGlvbigpewogdGhpcy5yZW1vdmVBbGwoKTsKfSwKCgogX2VhY2g6
ZnVuY3Rpb24oZil7CiBPYmplY3QudmFsdWVzKHRoaXMuX2J5SWQpLl9lYWNoKGYpOwp9LAoKCiBz
ZXRGaWx0ZXI6ZnVuY3Rpb24oZmlsdGVyLHF1aWV0KXsKIHRoaXMuX2ZpbHRlcj1Qcm90b3R5cGUu
SzsKfSwKCiBmaWx0ZXI6ZnVuY3Rpb24ocXVpZXQpewogdGhpcy5yZXBsYWNlKHRoaXMuZmluZEFs
bChQcm90b3R5cGUuSykscXVpZXQpOwp9LAoKCiBoYW5kbGVJdGVtRXZlbnQ6ZnVuY3Rpb24oZSxp
dGVtLGEsYil7CiBzd2l0Y2goZSl7CiBjYXNlIFplbkl0ZW0uQ0hBTkdFRDoKIHRoaXMubm90aWZ5
KFplblNldC5JVEVNX0NIQU5HRUQsdGhpcyxpdGVtKTsKIGJyZWFrOwogY2FzZSBaZW5JdGVtLkNI
QU5HRURfSUQ6CgogaWYodGhpcy5fYnlJZFthXSl7CiBkZWxldGUgdGhpcy5fYnlJZFthXTsKIHRo
aXMuX2J5SWRbYl09aXRlbTsKfQogdGhpcy5ub3RpZnkoWmVuU2V0LklURU1fQ0hBTkdFRF9JRCx0
aGlzLGl0ZW0pOwogYnJlYWs7CiBjYXNlIFplbkl0ZW0uUkVMRUFTRUQ6CiBhPXRydWU7CiBjYXNl
IFplbkl0ZW0uUkVNT1ZFOgoKIHRoaXMucmVtb3ZlKGl0ZW0sYSk7CiBicmVhazsKfQp9LAoKCiBu
b3RpZnlJdGVtQWRkZWQ6ZnVuY3Rpb24oaXRlbSl7CiB0aGlzLm5vdGlmeShaZW5TZXQuSVRFTV9B
RERFRCx0aGlzLGl0ZW0pOwp9LAoKCiBub3RpZnlJdGVtUmVtb3ZlZDpmdW5jdGlvbihpdGVtKXsK
IHRoaXMubm90aWZ5KFplblNldC5JVEVNX1JFTU9WRUQsdGhpcyxpdGVtKTsKfSwKCgogbm90aWZ5
VXBkYXRlZDpmdW5jdGlvbigpewogdGhpcy5ub3RpZnkoWmVuU2V0LlVQREFURUQsdGhpcyk7Cn0s
CgoKIGdldDpmdW5jdGlvbihpZCl7CiByZXR1cm4gaWQhPXVuZGVmaW5lZCYmdGhpcy5fYnlJZFtp
ZC5pZHx8aWRdOwp9LAoKCiBnZXRCeUNpZDpmdW5jdGlvbihpZCl7CiByZXR1cm4gaWQhPXVuZGVm
aW5lZCYmdGhpcy5fYnlDaWRbaWQuaWR8fGlkXTsKfSwKCgoKIGdldElkczpmdW5jdGlvbigpewog
cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2J5SWQpOwp9LAoKCgogZ2V0Q2lkczpmdW5jdGlvbigp
ewogcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2J5Q2lkKTsKfSwKCgoKIHNpemU6ZnVuY3Rpb24o
KXsKIHJldHVybiB0aGlzLl9zaXplOwp9LAoKCiBjb250YWluczpmdW5jdGlvbihpdGVtKXsKIHJl
dHVybiEhdGhpcy5fYnlJZFtpdGVtLmlkXTsKfSwKCgogX2F0dGFjaDpmdW5jdGlvbihpdGVtKXsK
IGl0ZW0ub2JzZXJ2ZShPYnNlcnZhYmxlLkFMTF9FVkVOVFMsdGhpcy5oYW5kbGVJdGVtRXZlbnQs
dGhpcyk7CiBpZih0aGlzLl9yZXRhaW5JdGVtcylpdGVtLnJldGFpbigpOwp9LAoKCiBfZGV0YWNo
OmZ1bmN0aW9uKGl0ZW0pewogaXRlbS5zdG9wT2JzZXJ2aW5nKG51bGwsbnVsbCx0aGlzKTsKIGlm
KHRoaXMuX3JldGFpbkl0ZW1zKWl0ZW0ucmVsZWFzZSgpOwp9LAoKCiBhZGQ6ZnVuY3Rpb24oaXRl
bSxxdWlldCl7CiB2YXIgY3VycmVudD10aGlzLmdldChpdGVtKTsKIGlmKCFjdXJyZW50KXsKIGlm
KCFQcm90b3R5cGUuSyhpdGVtKSlyZXR1cm4gbnVsbDsKIHRoaXMuX2J5SWRbaXRlbS5pZF09aXRl
bTsKIHRoaXMuX2J5Q2lkW2l0ZW0uY2lkXT1pdGVtOwogdGhpcy5fYXR0YWNoKGl0ZW0pOwogdGhp
cy5fc2l6ZSsrOwoKIGlmKHRoaXMuX2FmdGVyQWRkKXRoaXMuX2FmdGVyQWRkKGl0ZW0scXVpZXQp
OwogaWYoIXF1aWV0KXRoaXMubm90aWZ5SXRlbUFkZGVkKGl0ZW0pOwogcmV0dXJuIGl0ZW07Cn1l
bHNlIGlmKGN1cnJlbnQhPT1pdGVtKXsKIGNvbnNvbGUud2FybignWmVuU2V0OiBXYXJuaW5nIC0g
Rm91bmQgdHdvIGl0ZW1zIHdpdGggdGhlIHNhbWUgaWQoISEhKScpOwp9CiByZXR1cm4gbnVsbDsK
fSwKCgogYWRkQWxsOmZ1bmN0aW9uKGl0ZW1zLHF1aWV0KXsKIGl0ZW1zPU9iamVjdC5pc0FycmF5
KGl0ZW1zKT9pdGVtczooaXRlbXMudmFsdWVzP2l0ZW1zLnZhbHVlcygpOk9iamVjdC52YWx1ZXMo
aXRlbXMpKTsKIGZvcih2YXIgaT0wO2k8aXRlbXMubGVuZ3RoO2krKyl0aGlzLmFkZChpdGVtc1tp
XSxxdWlldCk7Cn0sCgoKIHJlbW92ZTpmdW5jdGlvbihpdGVtLHF1aWV0KXsKfSwKCiByZW1vdmVC
eUlkczpmdW5jdGlvbihpZHMscXVpZXQpewogaWRzLmVhY2goZnVuY3Rpb24oaWQpewogdGhpcy5y
ZW1vdmUoaWQscXVpZXQpOwp9LmJpbmQodGhpcykpOwp9LAoKCiByZW1vdmVBbGw6ZnVuY3Rpb24o
cXVpZXQpewogdGhpcy5yZXBsYWNlKG51bGwscXVpZXQpOwp9LAoKCiByZXBsYWNlOmZ1bmN0aW9u
KGl0ZW1zLHF1aWV0KXsKIGl0ZW1zPWl0ZW1zfHxbXTsKIGl0ZW1zLmludm9rZSgncmV0YWluJyk7
CiB0aGlzLl9pbml0KCk7CiB0aGlzLmFkZEFsbChpdGVtcyx0cnVlKTsKIGl0ZW1zLmludm9rZSgn
cmVsZWFzZScpOwoKIGlmKCFxdWlldCl0aGlzLm5vdGlmeVVwZGF0ZWQoKTsKIGlmKHRoaXMuX2Fm
dGVyVXBkYXRlKXRoaXMuX2FmdGVyVXBkYXRlKHF1aWV0KTsKfQp9KTsKCiBaZW5TZXQuX25vcHJv
eHk9dHJ1ZTsKfSk7Cnplbi5hcGkoJ1plblNvcnRlZFNldCcsZnVuY3Rpb24oKXsKIHplbi5yZXF1
aXJlKCd4TmF0aXZlJywnWmVuU2V0Jyk7CgoKIHdpbmRvdy5aZW5Tb3J0ZWRTZXQ9Q2xhc3MuY3Jl
YXRlKFplblNldCx7CgogaW5pdGlhbGl6ZTpmdW5jdGlvbigkc3VwZXIsY29tcGFyYXRvcixyZXRh
aW5JdGVtcyl7CiAkc3VwZXIocmV0YWluSXRlbXMpOwogdGhpcy5zZXRDb21wYXJhdG9yKGNvbXBh
cmF0b3IsdHJ1ZSk7Cn0sCgoKIF9pbml0OmZ1bmN0aW9uKCRzdXBlcil7CiAkc3VwZXIoKTsKIHRo
aXMuX2J5SW5kZXg9W107Cn0sCgoKIF9lYWNoOmZ1bmN0aW9uKGl0ZXJhdG9yKXsKIHJldHVybiB0
aGlzLl9ieUluZGV4Ll9lYWNoKGl0ZXJhdG9yKTsKfSwKCgogaW5kZXhPZjpmdW5jdGlvbihpdGVt
KXsKIHJldHVybiBBcnJheS5zb3J0ZWRJbmRleE9mKHRoaXMuX2J5SW5kZXgsdGhpcy5fY29tcGFy
YXRvcixpdGVtKTsKfSwKCgogZ2V0SXRlbUF0OmZ1bmN0aW9uKGkpewogcmV0dXJuIHRoaXMuX2J5
SW5kZXhbaV07Cn0sCgoKIGZpcnN0OmZ1bmN0aW9uKGYpewogcmV0dXJuIWY/dGhpcy5fYnlJbmRl
eC5maXJzdCgpOgogdGhpcy5pbmplY3QobnVsbCxmdW5jdGlvbihhY2MsdmFsdWUpewogcmV0dXJu
IWFjYz92YWx1ZTpmKGFjYyx2YWx1ZSk8MD9hY2M6dmFsdWU7Cn0pOwp9LAoKCiBsYXN0OmZ1bmN0
aW9uKGYpewogcmV0dXJuIWY/dGhpcy5fYnlJbmRleC5sYXN0KCk6CiB0aGlzLmluamVjdChudWxs
LGZ1bmN0aW9uKGFjYyx2YWx1ZSl7CiByZXR1cm4hYWNjP3ZhbHVlOmYoYWNjLHZhbHVlKT4wP2Fj
Yzp2YWx1ZTsKfSk7Cn0sCgoKIGJlZm9yZTpmdW5jdGlvbihpdGVtKXsKIHZhciBpPXRoaXMuaW5k
ZXhPZihpdGVtKTsKIHJldHVybiBpPj0wP3RoaXMuX2J5SW5kZXhbaS0xXTpudWxsOwp9LAoKCiBh
ZnRlcjpmdW5jdGlvbihpdGVtKXsKIHZhciBpPXRoaXMuaW5kZXhPZihpdGVtKTsKIHJldHVybiBp
Pj0wP3RoaXMuX2J5SW5kZXhbaSsxXTpudWxsOwp9LAoKCiBzZXRDb21wYXJhdG9yOmZ1bmN0aW9u
KGNvbXBhcmF0b3IscXVpZXQpewogY29tcGFyYXRvcj1jb21wYXJhdG9yfHxaZW5JdGVtLmNvbXBh
cmVJZDsKIGlmKHRoaXMuX2NvbXBhcmF0b3I9PWNvbXBhcmF0b3IpcmV0dXJuOwogdGhpcy5fY29t
cGFyYXRvcj1jb21wYXJhdG9yOwogdGhpcy5zb3J0KHF1aWV0KTsKfSwKCgogc29ydDpmdW5jdGlv
bihxdWlldCl7CiB0aGlzLl9ieUluZGV4LnNvcnQodGhpcy5fY29tcGFyYXRvcik7CiBpZihxdWll
dCl0aGlzLm5vdGlmeVVwZGF0ZWQoKTsKfSwKCgogYWRkOmZ1bmN0aW9uKCRzdXBlcixpdGVtLHF1
aWV0KXsKIGlmKGl0ZW09JHN1cGVyKGl0ZW0sdHJ1ZSkpewogdmFyIGk9QXJyYXkuc29ydGVkSW5k
ZXgodGhpcy5fYnlJbmRleCx0aGlzLl9jb21wYXJhdG9yLGl0ZW0pOwogdGhpcy5fYnlJbmRleC5p
bnNlcnQoaXRlbSxpKTsKIGlmKCFxdWlldCl0aGlzLm5vdGlmeUl0ZW1BZGRlZChpdGVtKTsKfQog
cmV0dXJuIGl0ZW07Cn0sCgoKIHJlbW92ZTpmdW5jdGlvbigkc3VwZXIsaXRlbSxxdWlldCl7CiBp
ZihpdGVtPSRzdXBlcihpdGVtLHRydWUpKXsKIHRoaXMuX2J5SW5kZXgucmVtb3ZlKGl0ZW0pOwog
aWYoIXF1aWV0KXRoaXMubm90aWZ5SXRlbVJlbW92ZWQoaXRlbSk7Cn0KIHJldHVybiBpdGVtOwp9
Cn0pOwoKIFplblNvcnRlZFNldC5fbm9wcm94eT10cnVlOwp9KTsKCnplbi5hcGkoJ1plblN1YnNl
dCcsZnVuY3Rpb24oKXsKCiB3aW5kb3cuWmVuU3Vic2V0PXsKIGV4dGVuZDpmdW5jdGlvbihzZXQp
ewoKIHNldC5fc3Vic2V0X2Rlc3Ryb3k9c2V0LmRlc3Ryb3k7CiBzZXQuX3N1YnNldF9oYW5kbGVJ
dGVtRXZlbnQ9c2V0LmhhbmRsZUl0ZW1FdmVudDsKCiBPYmplY3QuZXh0ZW5kKHNldCxaZW5TdWJz
ZXQuTWV0aG9kcyk7CiB6ZW4uYmluZChzZXQsJ19oYW5kbGVTb3VyY2VFdmVudCcsJ2hhbmRsZUl0
ZW1FdmVudCcpOwp9LAoKIE1ldGhvZHM6ewoKIGRlc3Ryb3k6ZnVuY3Rpb24oKXsKIHRoaXMuc2V0
U291cmNlKG51bGwpOwogdGhpcy5fc3Vic2V0X2Rlc3Ryb3koKTsKfSwKCiBzZXRTb3VyY2U6ZnVu
Y3Rpb24oc291cmNlLHF1aWV0KXsKIGlmKHRoaXMuX3NvdXJjZSl0aGlzLl9zb3VyY2Uuc3RvcE9i
c2VydmluZyhPYnNlcnZhYmxlLkFMTF9FVkVOVFMsCiB0aGlzLl9oYW5kbGVTb3VyY2VFdmVudCk7
CiBpZihzb3VyY2Upc291cmNlLm9ic2VydmUoT2JzZXJ2YWJsZS5BTExfRVZFTlRTLHRoaXMuX2hh
bmRsZVNvdXJjZUV2ZW50LAogdGhpcyk7CiB0aGlzLl9zb3VyY2U9c291cmNlOwogdGhpcy5maWx0
ZXIocXVpZXQpOwp9LAoKIF9oYW5kbGVTb3VyY2VFdmVudDpmdW5jdGlvbihlLHNldCxpdGVtKXsK
fSwKCiBoYW5kbGVJdGVtRXZlbnQ6ZnVuY3Rpb24oZSxpdGVtLGEsYil7CgogaWYoZT09WmVuSXRl
bS5DSEFOR0VEJiZ0aGlzLl9jaGVja0l0ZW0oaXRlbSkpcmV0dXJuOwoKIHJldHVybiB0aGlzLl9z
dWJzZXRfaGFuZGxlSXRlbUV2ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKfSwKCgogZmlsdGVy
OmZ1bmN0aW9uKHF1aWV0KXsKIHZhciBzcmM9dGhpcy5fc291cmNlfHx0aGlzOwogdGhpcy5yZXBs
YWNlKHNyYy5maW5kQWxsKFByb3RvdHlwZS5LKSxxdWlldCk7Cn0KfQp9Cn0pOwoKemVuLmFwaSgn
SFRUUCcsZnVuY3Rpb24oKXsKCiB3aW5kb3cuSFRUUENsYXNzPUNsYXNzLmNyZWF0ZSh7Cn0pOwoK
IHdpbmRvdy5IVFRQPW5ldyBIVFRQQ2xhc3MoKTsKfSk7Cgp6ZW4uYXBpKCdJbnB1dFRleHQnLGZ1
bmN0aW9uKCl7CiB6ZW4ucmVxdWlyZSgneEVsZW1lbnQnKTsKCgogd2luZG93LklucHV0VGV4dD1P
YmplY3QuZXh0ZW5kKHt9LHsKCiBERUZBVUxUX0FUVFI6J2RlZmF1bHRfdmFsdWUnLAoKCiBERUZB
VUxUX0NOOidkZWZhdWx0X3ZhbHVlJywKCiBlbmFibGU6ZnVuY3Rpb24oZWwsdmFsdWUsc2VsZWN0
T25Gb2N1cyl7CiBlbD0kKGVsKTsKCgogaWYoZWwuX2RlZmF1bHR8fCghZWwuZ2V0QXR0cmlidXRl
KElucHV0VGV4dC5ERUZBVUxUX0FUVFIpJiYhdmFsdWUpKXsKIHJldHVybjsKfQoKIGVsLl9kZWZh
dWx0PXZhbHVlfHxlbC5nZXRBdHRyaWJ1dGUoSW5wdXRUZXh0LkRFRkFVTFRfQVRUUik7CiBjb25z
b2xlLmFzc2VydChlbC5fZGVmYXVsdCwnSW5wdXQgZmllbGQgZXhwZWN0ZWQgdG8gaGF2ZSBhIGRl
ZmF1bHQgdmFsdWUnKTsKCiBlbC5fc2VsZWN0T25Gb2N1cz1zZWxlY3RPbkZvY3VzOwogT2JqZWN0
LmV4dGVuZChlbCxJbnB1dFRleHQubWV0aG9kcyk7CgoKCiBpZihlbC50eXBlPT0ncGFzc3dvcmQn
KXsKIGlmKCFQcm90b3R5cGUuQnJvd3Nlci5JRSl7CiB2YXIgZGVsPWVsLl9kZWZhdWx0RmllbGQ9
ZWwuY2xvbmVOb2RlKGZhbHNlKTsKfWVsc2V7CgoKIGRlbD1lbC5fZGVmYXVsdEZpZWxkPSQoZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKSk7CgogZm9yKGF0dHIgaW4gZWwuYXR0cmlidXRl
cyl7CiB0cnl7CiBpZihkZWwuYXR0cmlidXRlc1thdHRyLmtleV0hPSd0eXBlJyYmYXR0ci52YWx1
ZSE9PXVuZGVmaW5lZCkKewogZGVsLmF0dHJpYnV0ZXNbYXR0ci5rZXldPWF0dHIudmFsdWU7Cn0K
fQogY2F0Y2goZSl7CgogY29uc29sZS53YXJuKCJDb3VsZCBub3Qgd3JpdGUgYXR0cmlidXRlOiAi
K2F0dHIua2V5KTsKfQp9Owp9CgogZGVsLnJlbW92ZUF0dHJpYnV0ZShJbnB1dFRleHQuREVGQVVM
VF9BVFRSKTsKIGRlbC5pZD1lbC5pZCsiX3RleHQiOwogZGVsLm5hbWU9Jyc7CiBkZWwudHlwZT0n
dGV4dCc7CiBkZWwudmFsdWU9ZWwuX2RlZmF1bHQ7CiBkZWwuc3R5bGUuZGlzcGxheT0nbm9uZSc7
CiBkZWwuYWRkQ2xhc3NOYW1lKElucHV0VGV4dC5ERUZBVUxUX0NOKTsKIGRlbC5vbmZvY3VzPWZ1
bmN0aW9uKCl7CiBlbC5faXRVcGRhdGUodHJ1ZSk7Cn07CiBlbC5wYXJlbnROb2RlLmluc2VydEJl
Zm9yZShkZWwsZWwubmV4dFNpYmxpbmcpOwp9CgogZWwuX2l0VXBkYXRlKGZhbHNlKTsKCiBlbC5v
YnNlcnZlKCdmb2N1cycsZnVuY3Rpb24oKXt0aGlzLl9pdFVwZGF0ZSh0cnVlKTt9LmJpbmQoZWwp
KTsKIGVsLm9ic2VydmUoJ2JsdXInLGZ1bmN0aW9uKCl7dGhpcy5faXRVcGRhdGUoZmFsc2UpO30u
YmluZChlbCkpOwoKIHJldHVybiBlbDsKfSwKfSk7Cn0pOwoKemVuLmFwaSgnSlNPTicsZnVuY3Rp
b24oKXsKIHplbi5yZXF1aXJlKCd4TmF0aXZlJywnSFRUUCcpOwoKIHdpbmRvdy5KU09OQ2xhc3M9
Q2xhc3MuY3JlYXRlKEhUVFBDbGFzcyx7CiBpbml0aWFsaXplOmZ1bmN0aW9uKCl7CgogdGhpcy5f
aGFuZGxlcnM9W107CiB6ZW4uYmluZCh0aGlzLCdwcm9jZXNzRGF0YScpOwp9LAoKIGFkZEhhbmRs
ZXI6ZnVuY3Rpb24oaGFuZGxlcixzKXsKIGlmKHRoaXMuX2hhbmRsZXJzLmluZGV4T2YoaGFuZGxl
cik8MCl7CiBoYW5kbGVyLl9oYW5kbGVyTmFtZT1zfHwnYW5vbnltb3VzJzsKIHRoaXMuX2hhbmRs
ZXJzLnB1c2goaGFuZGxlcik7Cn1lbHNlewogY29uc29sZS53YXJuVHJhY2UoJ0hhbmRsZXIgIicr
KHN8fGhhbmRsZXIuX2hhbmRsZXJOYW1lKSsnIiBhbHJlYWR5IHJlZ2lzdGVyZWQnKTsKfQp9LAoK
IHByb2Nlc3NEYXRhOmZ1bmN0aW9uKGRhdGEsanJwT3B0aW9ucyl7CihuZXcgSlNPTi5Qcm9jZXNz
b3IoZGF0YSxqcnBPcHRpb25zKSkuX3Byb2Nlc3MoKTsKfQp9KTsKIHdpbmRvdy5KU09OPW5ldyBK
U09OQ2xhc3MoKTsKCgogSlNPTi5Qcm9jZXNzb3I9Q2xhc3MuY3JlYXRlKHsKCiBpbml0aWFsaXpl
OmZ1bmN0aW9uKGRhdGEsanJwT3B0aW9ucyl7CiB0aGlzLm9wdGlvbnM9anJwT3B0aW9uc3x8e307
CiB0aGlzLmRhdGE9ZGF0YS5yZXNwb25zZUpTT058fGRhdGE7Cn0sCgoKIF9wcm9jZXNzOmZ1bmN0
aW9uKCl7CgoKIHRoaXMuX2hhbmRsZXJzPUpTT04uX2hhbmRsZXJzLmNsb25lKCk7CgoKCiB3aGls
ZSh0aGlzLl9oYW5kbGVycy5sZW5ndGgpdGhpcy5wcm9jZXNzKHRoaXMuX2hhbmRsZXJzWzBdKTsK
fSwKCgogcHJvY2VzczpmdW5jdGlvbihoYW5kbGVyKXsKCiB2YXIgaD10aGlzLl9oYW5kbGVycy5y
ZW1vdmUoaGFuZGxlcik7CgoKIGlmKGgpewogdHJ5ewogaCh0aGlzKTsKfWNhdGNoKGUpewogemVu
LmxvZ0V4Y2VwdGlvbihlKTsKfQp9Cn0KfSk7Cn0pOwoKemVuLmFwaSgnWmVuU2V0RXh0ZW5zaW9u
cycsZnVuY3Rpb24oKXsKCiBKU1VQUG9vbD17CgogZXh0ZW5kOmZ1bmN0aW9uKHNldCl7CiBPYmpl
Y3QuZXh0ZW5kKHNldCxKU1VQUG9vbC5NZXRob2RzKTsKfSwKCiBNZXRob2RzOnsKCiBhc3NpbWls
YXRlSlNVUDpmdW5jdGlvbihkYXRhLGtsYXNzLG5vdGlmeUNoYW5nZXMpewogdmFyIG09dGhpcy5n
ZXQoZGF0YS5pZCk7CiBpZihkYXRhLl9kZWxldGUpewoKfWVsc2V7CgogaWYobSl7CgogaWYoISFk
YXRhLmlkX25ldyl7CiBkYXRhLmlkPWRhdGEuaWRfbmV3OwogZGVsZXRlIGRhdGEuaWRfbmV3Owp9
OwogbS5zZXRBbGwoZGF0YSk7CiBpZihub3RpZnlDaGFuZ2VzKW0ubm90aWZ5Q2hhbmdlZCgpOwog
bS5jbGVhbihkYXRhKTsKfWVsc2V7CiB2YXIgbT1uZXcgd2luZG93W2tsYXNzXShkYXRhKTsKIHRo
aXMuYWRkKG0pOwogbS5jbGVhbigpOwp9OwogcmV0dXJuIG07Cn07Cn0sCgogdG9KU1VQUGFyYW1z
OmZ1bmN0aW9uKGtleSl7CiB2YXIgZGlydHlKU09OQXJyYXk9dGhpcy5nZXREaXJ0eUl0ZW1zKCku
Y29sbGVjdChmdW5jdGlvbihpdGVtKXsKIGlmKGl0ZW0uX25ldyl7CgogdmFyIG9iaj1pdGVtLnRv
T2JqZWN0KCk7CiBvYmouX25ldz10cnVlOwp9ZWxzZSBpZihpdGVtLl9kZWxldGUpewoKIGlmKGl0
ZW0uX2RlbGV0ZSlvYmo9eyJpZCI6aXRlbS5pZCwiX2RlbGV0ZSI6dHJ1ZX07Cn1lbHNlewoKIHZh
ciBvYmo9aXRlbS5nZXREaXJ0eVN0YXRlKCk7CiBvYmouaWQ9aXRlbS5nZXQoJ2lkJyk7CiBvYmou
X3VwZGF0ZT10cnVlOwp9OwoKIE9iamVjdC5lYWNoKG9iaixmdW5jdGlvbihwKXsKIGlmKHAua2V5
JiZwLnZhbHVlKXsKIG9ialtwLmtleV09cC52YWx1ZS51bnNhZmU/cC52YWx1ZS51bnNhZmUoKTpw
LnZhbHVlOwp9Cn0pOwoKIHJldHVybiBPYmplY3QudG9KU09OKG9iaik7Cn0pOwogcmV0dXJuJyIn
K2tleSsnIicrJyA6IFsnKyhkaXJ0eUpTT05BcnJheS5qb2luKCcsJykrJ10nKTsKfQp9Cn07Cgog
d2luZG93LkluZGV4YWJsZVBvb2w9ewoKIEJVSUxESU5HX0lORElDRVM6J2J1aWxkaW5nSW5kaWNl
cygpJywKIEJVSUxESU5HX0lORElDRVNfQ09NUExFVEU6J2J1aWxkaW5nSW5kaWNlc0NvbXBsZXRl
KCknLAogaW5kZXhpbmc6ZmFsc2UsCgogTWV0aG9kczp7Cgogc2V0SW5kZXhpbmc6ZnVuY3Rpb24o
Yil7CiBiPSEhYjsKIGluZGV4aW5nPWI7CiBiP3RoaXMubm90aWZ5KHRoaXMuQlVJTERJTkdfSU5E
SUNFUyk6dGhpcy5ub3RpZnkodGhpcy5CVUlMRElOR19JTkRJQ0VTX0NPTVBMRVRFKTsKfSwKCiBh
ZGRJbmRleDpmdW5jdGlvbihuZXdJbmRleE5hbWUsYnVpbGRlcil7CiB0aGlzLmluZGljZXM9dGhp
cy5pbmRpY2VzfHx7fTsKIGlmKHRoaXMuaW5kaWNlc1tuZXdJbmRleE5hbWVdKXJldHVybiBmYWxz
ZTsKIHRoaXMuaW5kaWNlc1tuZXdJbmRleE5hbWVdPW5ldyBaZW5TZXRJbmRleChuZXdJbmRleE5h
bWUsdGhpcyxidWlsZGVyLHt9KTsKfSwKCiByZW1vdmVJbmRleDpmdW5jdGlvbihpbmRleE5hbWUp
ewogdmFyIGluZGV4PXRoaXMuaW5kaWNlc1tuZXdJbmRleE5hbWVdOwogaWYoIWluZGV4KXJldHVy
biBmYWxzZTsKIGluZGV4LmRlc3Ryb3koKTsKIGRlbGV0ZSB0aGlzLmluZGljZXNbaW5kZXhOYW1l
XTsKfQp9Cn07CgogTG9hZGFibGVQb29sPXsKIGV4dGVuZDpmdW5jdGlvbihzZXQpewogT2JqZWN0
LmV4dGVuZChzZXQsTG9hZGFibGVQb29sLk1ldGhvZHMpOwp9LAoKIE1ldGhvZHM6ewp9Cn07Cn0p
Owp6ZW4uYXBpKCdaZW5JdGVtRXh0ZW5zaW9ucycsZnVuY3Rpb24oKXsKIEpTVVBFeHRlbnNpb25z
PXsKCiBzZXQ6ZnVuY3Rpb24oJHN1cGVyLGssdixxdWlldCl7CiB0aGlzLl91cGRhdGVEaXJ0eVN0
YXRlKGssdik7CiAkc3VwZXIoayx2LHF1aWV0KTsKfSwKCiBfdXBkYXRlRGlydHlTdGF0ZTpmdW5j
dGlvbihrLHYpewogdGhpcy5fZGlydHlTdGF0ZT10aGlzLl9kaXJ0eVN0YXRlfHx7fTsKCiBpZih0
aGlzLl9uZXd8fHRoaXMuX2RlbGV0ZWQpcmV0dXJuIHRoaXM7CiBpZih0aGlzLl9jbGVhblN0YXRl
JiZ0aGlzLl9jbGVhblN0YXRlW2tdJiZ0aGlzLl9jbGVhblN0YXRlW2tdPT12KXsKIGRlbGV0ZSB0
aGlzLl9kaXJ0eVN0YXRlW2tdOwogcmV0dXJuIHRoaXM7Cn07CgogdGhpcy5fZGlydHlTdGF0ZVtr
XT12OwogcmV0dXJuIHRoaXM7Cn0sCgogZ2V0RGlydHlTdGF0ZTpmdW5jdGlvbigpewogdGhpcy5f
ZGlydHlTdGF0ZT10aGlzLl9kaXJ0eVN0YXRlfHx7fTsKCiBpZighdGhpcy5fY2xlYW5TdGF0ZXx8
dGhpcy5fbmV3fHx0aGlzLl9kZWxldGVkKXsKIHJldHVybnt9Owp9OwoKCiBPYmplY3QuZWFjaCh0
aGlzLl9jbGVhblN0YXRlLGZ1bmN0aW9uKHBhaXIpewogaWYodGhpcy5fZGlydHlTdGF0ZVtwYWly
LmtleV09PXBhaXIudmFsdWUpewogZGVsZXRlIHRoaXMuX2RpcnR5U3RhdGVbcGFpci5rZXldOwp9
Owp9LmJpbmQodGhpcykpOwoKIHJldHVybiB0aGlzLl9kaXJ0eVN0YXRlOwp9LAoKIGNsZWFuOmZ1
bmN0aW9uKG9iail7CgogZGVsZXRlIHRoaXMuX2RlbGV0ZTsKIGRlbGV0ZSB0aGlzLl9uZXc7Cgog
aWYoIW9ianx8IXRoaXMuX2NsZWFuU3RhdGUpewoKIGRlbGV0ZSB0aGlzLl9kaXJ0eVN0YXRlOwog
dGhpcy5fY2xlYW5TdGF0ZT10aGlzLnRvT2JqZWN0KCk7Cn1lbHNlewoKIE9iamVjdC5lYWNoKG9i
aixmdW5jdGlvbihwYWlyKXsKIGRlbGV0ZSB0aGlzLl9kaXJ0eVN0YXRlW3BhaXIua2V5XTsKIHRo
aXMuX2NsZWFuU3RhdGVbcGFpci5rZXldPXBhaXIudmFsdWU7Cn0uYmluZCh0aGlzKSkKfQp9Cn07
Cgp9KTsKCnplbi5yZXF1aXJlKCdIVFRQJywneE5hdGl2ZScsJ09ic2VydmFibGUnKTsKdmFyIFVz
ZXI9Q2xhc3MuY3JlYXRlKCk7Cgp3aW5kb3cuY3VycmVudF91c2VyPW5ldyBVc2VyKCk7CndpbmRv
dy5jdXJyZW50VXNlcj13aW5kb3cuY3VycmVudF91c2VyOwp6ZW4uYXBpKCdMaXN0SXRlbU1vZGVs
JyxmdW5jdGlvbigpewogemVuLnJlcXVpcmUoJ1plbkl0ZW0nLCdaZW5JdGVtRXh0ZW5zaW9ucycs
J0pTT04nKTsKCiB3aW5kb3cuTGlzdEl0ZW1Nb2RlbD1DbGFzcy5jcmVhdGUoWmVuSXRlbSk7Cgog
T2JqZWN0LmV4dGVuZChMaXN0SXRlbU1vZGVsLHsKCiBwb3NpdGlvbkNvbXBhcmF0b3I6ZnVuY3Rp
b24oYSxiKXsKIGFDPWEuZ2V0KCdwb3NpdGlvbicpO2JDPWIuZ2V0KCdwb3NpdGlvbicpOwogcmV0
dXJuIGFDPGJDPy0xOihhQz5iQz8xOjApOwp9Cgp9KTsKCiBMaXN0SXRlbU1vZGVsLmFkZE1ldGhv
ZHMoSlNVUEV4dGVuc2lvbnMpOwogTGlzdEl0ZW1Nb2RlbC5hZGRNZXRob2RzKEFjY2Vzc29ySGVs
cGVycyk7Cn0pOwoKemVuLnJlcXVpcmUoJ1plblNvcnRlZFNldCcsJ0pTT04nKTsKemVuLnJlcXVp
cmUoJ0xpc3RJdGVtTW9kZWwnLCdaZW5TZXRFeHRlbnNpb25zJyk7Cgp3aW5kb3cuTGlzdEl0ZW1Q
b29sPW5ldyBaZW5Tb3J0ZWRTZXQoTGlzdEl0ZW1Nb2RlbC5jb21wYXJhdG9yLHRydWUpOwoKSlNV
UFBvb2wuZXh0ZW5kKExpc3RJdGVtUG9vbCk7CkxvYWRhYmxlUG9vbC5leHRlbmQoTGlzdEl0ZW1Q
b29sKTsKCk9iamVjdC5leHRlbmQod2luZG93Lkxpc3RJdGVtUG9vbCx7CiB3cml0ZTpmdW5jdGlv
bigpewogTGlzdFBvb2wud3JpdGUuYmluZChMaXN0UG9vbCkuc2V0TGF6eSgyNTApOwp9LAoKIGRh
dGFIYW5kbGVyOmZ1bmN0aW9uKGpycCl7Cn0sCiBzZXR1cDpmdW5jdGlvbigpewogSlNPTi5hZGRI
YW5kbGVyKHRoaXMuZGF0YUhhbmRsZXIuYmluZCh0aGlzKSk7Cn0sCgp9KTsKCkxpc3RJdGVtUG9v
bC5zZXR1cCgpOwp6ZW4uYXBpKCdMaXN0TW9kZWwnLGZ1bmN0aW9uKCl7CiB6ZW4ucmVxdWlyZSgn
WmVuSXRlbScsJ1plbkl0ZW1FeHRlbnNpb25zJywnWmVuU3Vic2V0JywnWmVuU29ydGVkU2V0Jywn
SlNPTicpOwoKIHdpbmRvdy5MaXN0TW9kZWw9Q2xhc3MuY3JlYXRlKFplbkl0ZW0pOwoKIE9iamVj
dC5leHRlbmQoTGlzdE1vZGVsLHsKCiBwb3NpdGlvbkNvbXBhcmF0b3I6ZnVuY3Rpb24oYSxiKXsK
IGFDPWEuZ2V0KCdwb3NpdGlvbicpO2JDPWIuZ2V0KCdwb3NpdGlvbicpOwogcmV0dXJuIGFDPGJD
Py0xOihhQz5iQz8xOjApOwp9LAoKIGFscGhhQ29tcGFyYXRvcjpmdW5jdGlvbihhLGIpewogYUM9
KGEuZ2V0KCduYW1lJyl8fCcnKS50b0xvd2VyQ2FzZSgpO2JDPShiLmdldCgnbmFtZScpfHwnJyku
dG9Mb3dlckNhc2UoKTsKIHJldHVybiBhQzxiQz8tMTooYUM+YkM/MTowKTsKfQp9KTsKCiBMaXN0
TW9kZWwuYWRkTWV0aG9kcyhKU1VQRXh0ZW5zaW9ucyk7CiBMaXN0TW9kZWwuYWRkTWV0aG9kcyhB
Y2Nlc3NvckhlbHBlcnMpOwp9KTsKCnplbi5yZXF1aXJlKCdaZW5Tb3J0ZWRTZXQnLCdKU09OJyk7
Cnplbi5yZXF1aXJlKCdMaXN0TW9kZWwnLCdMaXN0SXRlbU1vZGVsJywnWmVuU2V0RXh0ZW5zaW9u
cycpOwp3aW5kb3cuTGlzdFBvb2w9bmV3IFplblNvcnRlZFNldChMaXN0TW9kZWwucG9zaXRpb25D
b21wYXJhdG9yLHRydWUpOwoKSlNVUFBvb2wuZXh0ZW5kKExpc3RQb29sKTsKTG9hZGFibGVQb29s
LmV4dGVuZChMaXN0UG9vbCk7CgpPYmplY3QuZXh0ZW5kKExpc3RQb29sLHsKIGRhdGFIYW5kbGVy
OmZ1bmN0aW9uKGpycCl7CgogdmFyIGQ9anJwLmRhdGEubGlzdHM7CgogZC50aHJlYWRlZEl0ZXJh
dG9yKGZ1bmN0aW9uKGkpewogdGhpcy5hc3NpbWlsYXRlSlNVUChpLCdMaXN0TW9kZWwnLGpycC5v
cHRpb25zLnJlcXVlc3RTaWduYXR1cmUhPSJMaXN0UG9vbC53cml0ZSIpOwp9LmJpbmQodGhpcyks
MTApOwp9LAoKfSk7CgpKU09OLmFkZEhhbmRsZXIoTGlzdFBvb2wuZGF0YUhhbmRsZXIuYmluZChM
aXN0UG9vbCkpOwoKdmFyIEFscGhhYmV0aWNhbGx5U29ydGVkTGlzdHM9bmV3IFplblNvcnRlZFNl
dChMaXN0TW9kZWwuYWxwaGFDb21wYXJhdG9yLHRydWUpOwpaZW5TdWJzZXQuZXh0ZW5kKEFscGhh
YmV0aWNhbGx5U29ydGVkTGlzdHMpOwoKSlNPTi5wcm9jZXNzRGF0YSh7J2xpc3RzJzp3aW5kb3cu
Ym9vdHN0cmFwRGF0YVsnbGlzdHMnXSwnbGlzdEl0ZW1zJzp3aW5kb3cuYm9vdHN0cmFwRGF0YVsn
bGlzdEl0ZW1zJ119KTsKQWxwaGFiZXRpY2FsbHlTb3J0ZWRMaXN0cy5zZXRTb3VyY2UoTGlzdFBv
b2wpOwo8L3NjcmlwdD4KPC9oZWFkPgo8L2h0bWw+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>