<?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>26249</bug_id>
          
          <creation_ts>2009-06-07 21:53:01 -0700</creation_ts>
          <short_desc>Support JSON.stringify</short_desc>
          <delta_ts>2009-06-22 22:12:03 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>26640</dependson>
          <blocked>20031</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Oliver Hunt">oliver</reporter>
          <assigned_to name="Oliver Hunt">oliver</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>124722</commentid>
    <comment_count>0</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-07 21:53:01 -0700</bug_when>
    <thetext>Bug for tracking the stringify portion of bug# 20031</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124727</commentid>
    <comment_count>1</comment_count>
      <attachid>31039</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-07 22:48:55 -0700</bug_when>
    <thetext>Created attachment 31039
First pass at JSON.stringify</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124890</commentid>
    <comment_count>2</comment_count>
      <attachid>31039</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-06-08 22:00:48 -0700</bug_when>
    <thetext>Comment on attachment 31039
First pass at JSON.stringify

The code looks good, but I think it could use a little sprucing up in the way of whitespace/paragraphing.  If you would, please go through and add some whitespace to make it more in line with the rest of the code.  A few specifics inline.

&gt; +
&gt; +class Stringifier {
&gt; +    typedef UString StringBuilder;
&gt; +    // Basically the maximum nesting accepted by firefox.

Perhaps given the complexity of this Stringifier class, we should put it in its own header file.

&gt; +    }
&gt; +    class StringKeyGenerator {
&gt; +    public:
&gt; +        StringKeyGenerator(const Identifier&amp; property) : m_property(property) {}
&gt; +        JSValue getKey(ExecState* exec) { if (!m_key) m_key = jsString(exec, m_property.ustring()); return m_key;  }
&gt; +    private:
&gt; +        Identifier m_property;
&gt; +        JSValue m_key;
&gt; +    };
&gt; +    class IntKeyGenerator {
&gt; +    public:
&gt; +        IntKeyGenerator(uint32_t property) : m_property(property) {}
&gt; +        JSValue getKey(ExecState* exec) { if (!m_key) m_key = jsNumber(exec, m_property); return m_key;  }
&gt; +    private:
&gt; +        uint32_t m_property;
&gt; +        JSValue m_key;
&gt; +    };

A little whitespace in and around these classes could help paragraph them a little better.

&gt; +            return jsValue;
&gt; +
&gt; +        JSValue list[] = { jsKey.getKey(m_exec) };        
&gt; +        ArgList args(list, sizeof(list) / sizeof(JSValue));
&gt; +        return call(m_exec, object,callType, callData, jsValue, args);
Missing space after object,.


&gt; +        return true;
&gt; +    }
&gt; +    bool stringifyObject(StringBuilder&amp; builder, JSObject* object) {

{ on the wrong line.  Please put whitespace between functions as well.

&gt; +
&gt; +// ECMA-262 v5 15.12.3
&gt; +JSValue JSC_HOST_CALL JSONProtoFuncStringify(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&amp; args)
&gt; +{
&gt; +    UNUSED_PARAM(thisValue);

I believe you can just elide the name thisValue in the prototype and avoid the need for this UNUSED_PARAM

r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124898</commentid>
    <comment_count>3</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-08 23:04:45 -0700</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	JavaScriptCore/ChangeLog
	M	JavaScriptCore/DerivedSources.make
	M	JavaScriptCore/GNUmakefile.am
	M	JavaScriptCore/JavaScriptCore.pri
	M	JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
	M	JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
	M	JavaScriptCore/interpreter/CallFrame.h
	M	JavaScriptCore/runtime/CommonIdentifiers.h
	M	JavaScriptCore/runtime/JSGlobalData.cpp
	M	JavaScriptCore/runtime/JSGlobalData.h
	M	JavaScriptCore/runtime/JSGlobalObject.cpp
	A	JavaScriptCore/runtime/JSONObject.cpp
	A	JavaScriptCore/runtime/JSONObject.h
	M	LayoutTests/ChangeLog
	A	LayoutTests/fast/js/JSON-stringify-expected.txt
	A	LayoutTests/fast/js/JSON-stringify.html
	A	LayoutTests/fast/js/resources/JSON-stringify.js
	A	LayoutTests/fast/js/resources/json2-es5-compat.js
Committed r44521</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125054</commentid>
    <comment_count>4</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-09 17:37:48 -0700</bug_when>
    <thetext>Recommitting following rollout.  Should now work on windows, etc

Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	JavaScriptCore/ChangeLog
	M	JavaScriptCore/DerivedSources.make
	M	JavaScriptCore/GNUmakefile.am
	M	JavaScriptCore/JavaScriptCore.pri
	M	JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
	M	JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
	M	JavaScriptCore/interpreter/CallFrame.h
	M	JavaScriptCore/runtime/CommonIdentifiers.h
	M	JavaScriptCore/runtime/JSGlobalData.cpp
	M	JavaScriptCore/runtime/JSGlobalData.h
	M	JavaScriptCore/runtime/JSGlobalObject.cpp
	A	JavaScriptCore/runtime/JSONObject.cpp
	A	JavaScriptCore/runtime/JSONObject.h
	M	LayoutTests/ChangeLog
	A	LayoutTests/fast/js/JSON-stringify-expected.txt
	A	LayoutTests/fast/js/JSON-stringify.html
	A	LayoutTests/fast/js/resources/JSON-stringify.js
	A	LayoutTests/fast/js/resources/json2-es5-compat.js
Committed r44550</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31039</attachid>
            <date>2009-06-07 22:48:55 -0700</date>
            <delta_ts>2009-06-08 22:00:48 -0700</delta_ts>
            <desc>First pass at JSON.stringify</desc>
            <filename>stringify.patch</filename>
            <type>text/plain</type>
            <size>78470</size>
            <attacher name="Oliver Hunt">oliver</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCBiMGMxMGU0Li5hMzQyNzAyIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjAg
QEAKKzIwMDktMDYtMDcgIE9saXZlciBIdW50ICA8b2xpdmVyQGFwcGxlLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBCdWcgMjYyNDk6IFN1cHBv
cnQgSlNPTi5zdHJpbmdpZnkKKyAgICAgICAgPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNjI0OT4KKyAgICAgICAgCisgICAgICAgIEltcGxlbWVudCBKU09OLnN0cmlu
Z2lmeS4gIFRoaXMgcGF0Y2ggaGFuZGxlcyBhbGwgdGhlIHNlbWFudGljcyBvZiB0aGUgRVM1Cisg
ICAgICAgIEpTT04uc3RyaW5naWZ5IGZ1bmN0aW9uLCBpbmNsdWRpbmcgcmVwbGFjZXIgZnVuY3Rp
b25zIGFuZCBhcnJheXMgYW5kIGJvdGgKKyAgICAgICAgc3RyaW5nIGFuZCBudW1lcmljIGdhcCBh
cmd1bWVudHMuCisgICAgICAgIAorICAgICAgICBDdXJyZW50bHkgdXNlcyBhIGNsYW1wZWQgcmVj
dXJzaXZlIGFsZ29yaXRobSBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvIHRoZSBzcGVjCisgICAgICAg
IGRlc2NyaXB0aW9uIGJ1dCB3aXRoIGEgZmV3IG1pbm9yIHR3ZWFrcyBmb3IgcGVyZm9ybWFuY2Ug
YW5kIGNvcnJlY3RlZCBzZW1hbnRpY3MKKyAgICAgICAgZGlzY3Vzc2VkIGluIHRoZSBlcy1kaXNj
dXNzIG1haWxpbmcgbGlzdC4KKworICAgICAgICAqIERlcml2ZWRTb3VyY2VzLm1ha2U6CisgICAg
ICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogSmF2YVNjcmlwdENvcmUucHJpOgorICAg
ICAgICAqIEphdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS52Y3Byb2o6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvajoKKyAgICAgICAgKiBpbnRlcnByZXRlci9DYWxsRnJhbWUuaDoKKyAgICAgICAgKEpTQzo6
RXhlY1N0YXRlOjpqc29uVGFibGUpOgorICAgICAgICAqIHJ1bnRpbWUvQ29tbW9uSWRlbnRpZmll
cnMuaDoKKyAgICAgICAgICAgYWRkIHRvSlNPTiB0byB0aGUgbGlzdCBvZiBjb21tb24gaWRlbnRp
ZmllcnMKKworICAgICAgICAqIHJ1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcDoKKyAgICAgICAgKEpT
Qzo6SlNHbG9iYWxEYXRhOjpKU0dsb2JhbERhdGEpOgorICAgICAgICAoSlNDOjpKU0dsb2JhbERh
dGE6On5KU0dsb2JhbERhdGEpOgorICAgICAgICAqIHJ1bnRpbWUvSlNHbG9iYWxEYXRhLmg6Cisg
ICAgICAgICogcnVudGltZS9KU0dsb2JhbE9iamVjdC5jcHA6CisgICAgICAgIChKU0M6OkpTR2xv
YmFsT2JqZWN0OjpyZXNldCk6CisgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgdGhlIEpTT04g
b2JqZWN0IGxvb2t1cCB0YWJsZQorCisgICAgICAgICogcnVudGltZS9KU09OT2JqZWN0LmNwcDog
QWRkZWQuCisgICAgICAgIChKU0M6Oik6CisgICAgICAgIChKU0M6OkpTT05PYmplY3Q6OmdldE93
blByb3BlcnR5U2xvdCk6CisgICAgICAgIChKU0M6OlN0cmluZ2lmaWVyOjopOgorICAgICAgICAo
SlNDOjpTdHJpbmdpZmllcjo6U3RyaW5naWZpZXIpOgorICAgICAgICAoSlNDOjpTdHJpbmdpZmll
cjo6c3RyaW5naWZ5KToKKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OmFwcGVuZFN0cmluZyk6
CisKKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OlN0cmluZ0tleUdlbmVyYXRvcjo6U3RyaW5n
S2V5R2VuZXJhdG9yKToKKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OlN0cmluZ0tleUdlbmVy
YXRvcjo6Z2V0S2V5KToKKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OkludEtleUdlbmVyYXRv
cjo6SW50S2V5R2VuZXJhdG9yKToKKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OkludEtleUdl
bmVyYXRvcjo6Z2V0S2V5KToKKyAgICAgICAgICAgIFRoZXNlIEtleUdlbmVyYXRvciBjbGFzc2Vz
IGFyZSB1c2VkIHRvIGFic3RyYWN0IGF3YXkgdGhlIGxhenkgZXZhbHVhdGlvbiBvZiBrZXlzIGZv
cgorICAgICAgICAgICAgdG9KU09OIGFuZCByZXBsYWNlciBmdW5jdGlvbnMuCisKKyAgICAgICAg
KEpTQzo6U3RyaW5naWZpZXI6OnRvSlNPTlZhbHVlKToKKyAgICAgICAgKEpTQzo6U3RyaW5naWZp
ZXI6OnN0cmluZ2lmeUFycmF5KToKKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OnN0cmluZ2lm
eU9iamVjdCk6CisgICAgICAgIChKU0M6OkpTT05Qcm90b0Z1bmNTdHJpbmdpZnkpOgorICAgICAg
ICAqIHJ1bnRpbWUvSlNPTk9iamVjdC5oOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6SlNPTk9iamVj
dDo6OkpTT2JqZWN0KToKKyAgICAgICAgKEpTQzo6SlNPTk9iamVjdDo6Y2xhc3NJbmZvKToKKyAg
ICAgICAgKEpTQzo6SlNPTk9iamVjdDo6Y3JlYXRlU3RydWN0dXJlKToKKwogMjAwOS0wNi0wNCAg
T2xpdmVyIEh1bnQgIDxvbGl2ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEdh
dmluIEJhcnJhY2xvdWdoLgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvRGVyaXZlZFNvdXJj
ZXMubWFrZSBiL0phdmFTY3JpcHRDb3JlL0Rlcml2ZWRTb3VyY2VzLm1ha2UKaW5kZXggNGIzMzY4
Mi4uOWVhY2NhYiAxMDA2NDQKLS0tIGEvSmF2YVNjcmlwdENvcmUvRGVyaXZlZFNvdXJjZXMubWFr
ZQorKysgYi9KYXZhU2NyaXB0Q29yZS9EZXJpdmVkU291cmNlcy5tYWtlCkBAIC00MCw2ICs0MCw3
IEBAIGFsbCA6IFwKICAgICBjaGFydGFibGVzLmMgXAogICAgIERhdGVQcm90b3R5cGUubHV0Lmgg
XAogICAgIEdyYW1tYXIuY3BwIFwKKyAgICBKU09OT2JqZWN0Lmx1dC5oIFwKICAgICBMZXhlci5s
dXQuaCBcCiAgICAgTWF0aE9iamVjdC5sdXQuaCBcCiAgICAgTnVtYmVyQ29uc3RydWN0b3IubHV0
LmggXApkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvR05VbWFrZWZpbGUuYW0gYi9KYXZhU2Ny
aXB0Q29yZS9HTlVtYWtlZmlsZS5hbQppbmRleCBkZmI2OGFkLi5mNDMxNWYwIDEwMDY0NAotLS0g
YS9KYXZhU2NyaXB0Q29yZS9HTlVtYWtlZmlsZS5hbQorKysgYi9KYXZhU2NyaXB0Q29yZS9HTlVt
YWtlZmlsZS5hbQpAQCAtMzUsNiArMzUsNyBAQCBqYXZhc2NyaXB0Y29yZV9idWlsdF9ub3NvdXJj
ZXMgKz0gXAogCURlcml2ZWRTb3VyY2VzL0xleGVyLmx1dC5oIFwKIAlKYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0FycmF5UHJvdG90eXBlLmx1dC5oIFwKIAlKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Rh
dGVQcm90b3R5cGUubHV0LmggXAorCUphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5s
dXQuaCBcCiAJSmF2YVNjcmlwdENvcmUvcnVudGltZS9NYXRoT2JqZWN0Lmx1dC5oIFwKIAlKYXZh
U2NyaXB0Q29yZS9ydW50aW1lL051bWJlckNvbnN0cnVjdG9yLmx1dC5oIFwKIAlKYXZhU2NyaXB0
Q29yZS9ydW50aW1lL1JlZ0V4cENvbnN0cnVjdG9yLmx1dC5oIFwKQEAgLTE4Miw2ICsxODMsOCBA
QCBqYXZhc2NyaXB0Y29yZV9zb3VyY2VzICs9IFwKIAlKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pT
R2xvYmFsRGF0YS5oIFwKIAlKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTm90QW5PYmplY3QuY3Bw
IFwKIAlKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTm90QW5PYmplY3QuaCBcCisJSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcCBcCisJSmF2YVNjcmlwdENvcmUvcnVudGltZS9K
U09OT2JqZWN0LmggXAogCUphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNQcm9wZXJ0eU5hbWVJdGVy
YXRvci5jcHAgXAogCUphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNQcm9wZXJ0eU5hbWVJdGVyYXRv
ci5oIFwKIAlKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0xpdGVyYWxQYXJzZXIuY3BwIFwKQEAgLTU4
OCw2ICs1OTEsNyBAQCBqYXZhc2NyaXB0Y29yZV9kaXN0ICs9IFwKIENMRUFORklMRVMgKz0gXAog
CUphdmFTY3JpcHRDb3JlL3J1bnRpbWUvQXJyYXlQcm90b3R5cGUubHV0LmggXAogCUphdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvRGF0ZVByb3RvdHlwZS5sdXQuaCBcCisJSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU09OT2JqZWN0Lmx1dC5oIFwKIAlKYXZhU2NyaXB0Q29yZS9ydW50aW1lL01hdGhPYmpl
Y3QubHV0LmggXAogCUphdmFTY3JpcHRDb3JlL3J1bnRpbWUvTnVtYmVyQ29uc3RydWN0b3IubHV0
LmggXAogCUphdmFTY3JpcHRDb3JlL3J1bnRpbWUvUmVnRXhwQ29uc3RydWN0b3IubHV0LmggXApk
aWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpIGIvSmF2YVNjcmlw
dENvcmUvSmF2YVNjcmlwdENvcmUucHJpCmluZGV4IDkyMzQxODcuLjczNzBiNzEgMTAwNjQ0Ci0t
LSBhL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQorKysgYi9KYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS5wcmkKQEAgLTExMSw2ICsxMTEsNyBAQCBTT1VSQ0VTICs9IFwKICAg
ICBydW50aW1lL0pTVmFyaWFibGVPYmplY3QuY3BwIFwKICAgICBydW50aW1lL0pTQWN0aXZhdGlv
bi5jcHAgXAogICAgIHJ1bnRpbWUvSlNOb3RBbk9iamVjdC5jcHAgXAorICAgIHJ1bnRpbWUvSlNP
Tk9iamVjdC5jcHAgXAogICAgIHJ1bnRpbWUvTGl0ZXJhbFBhcnNlci5jcHAgXAogICAgIHJ1bnRp
bWUvVGltZW91dENoZWNrZXIuY3BwIFwKICAgICBieXRlY29kZS9Db2RlQmxvY2suY3BwIFwKZGlm
ZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ogYi9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qCmluZGV4IDdiYzM0
YTguLmRiYzU0YzUgMTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZj
cHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2oKKysrIGIvSmF2YVNjcmlw
dENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
LnZjcHJvagpAQCAtNzk0LDYgKzc5NCwxMyBAQAogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXC4uXHJ1bnRpbWVcSlNOdW1iZXJDZWxsLmgiCiAJCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXC4uXHJ1bnRpbWVcSlNPTk9iamVjdC5jcHAiCisJCQkJPgorCQkJPC9GaWxl
PgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHJ1bnRpbWVcSlNPTk9iamVjdC5o
IgorCQkJCT4KIAkJCTwvRmlsZT4KIAkJCTxGaWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxy
dW50aW1lXEpTT2JqZWN0LmNwcCIKZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0phdmFTY3Jp
cHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDQ5NzEyNmIuLjFiNjIxYjcg
MTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKKysrIGIvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagpAQCAtMTk0LDYgKzE5NCw5IEBACiAJCUE3QjQ4RjQ5MEVFODkzNkYw
MERDQkRCNiAvKiBFeGVjdXRhYmxlQWxsb2NhdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3QjQ4REI2MEVFNzRDRkMwMERDQkRCNiAvKiBFeGVj
dXRhYmxlQWxsb2NhdG9yLmNwcCAqLzsgfTsKIAkJQTdFMkVBNkIwRkI0NjBDRjAwNjAxRjA2IC8q
IExpdGVyYWxQYXJzZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEE3RTJFQTY5MEZCNDYwQ0YwMDYwMUYwNiAvKiBMaXRlcmFsUGFyc2VyLmggKi87IH07
CiAJCUE3RTJFQTZDMEZCNDYwQ0YwMDYwMUYwNiAvKiBMaXRlcmFsUGFyc2VyLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3RTJFQTZBMEZCNDYwQ0Yw
MDYwMUYwNiAvKiBMaXRlcmFsUGFyc2VyLmNwcCAqLzsgfTsKKwkJQTdGOTkzNUYwRkQ3MzI1MTAw
QTBCMkQwIC8qIEpTT05PYmplY3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEE3Rjk5MzVEMEZENzMyNTEwMEEwQjJEMCAvKiBKU09OT2JqZWN0LmggKi87
IH07CisJCUE3Rjk5MzYwMEZENzMyNTEwMEEwQjJEMCAvKiBKU09OT2JqZWN0LmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3Rjk5MzVFMEZENzMyNTEw
MEEwQjJEMCAvKiBKU09OT2JqZWN0LmNwcCAqLzsgfTsKKwkJQTdGOTk0OUIwRkQ3NDZBMzAwQTBC
MkQwIC8qIEpTT05PYmplY3QubHV0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBN0Y5OTQ5QTBGRDc0NkEzMDBBMEIyRDAgLyogSlNPTk9iamVjdC5sdXQu
aCAqLzsgfTsKIAkJQkMwMkU5MEQwRTE4MzlEQjAwMEY5Mjk3IC8qIEVycm9yQ29uc3RydWN0b3Iu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDMDJFOTA1
MEUxODM5REIwMDBGOTI5NyAvKiBFcnJvckNvbnN0cnVjdG9yLmggKi87IH07CiAJCUJDMDJFOTBG
MEUxODM5REIwMDBGOTI5NyAvKiBFcnJvclByb3RvdHlwZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkMwMkU5MDcwRTE4MzlEQjAwMEY5Mjk3IC8qIEVy
cm9yUHJvdG90eXBlLmggKi87IH07CiAJCUJDMDJFOTExMEUxODM5REIwMDBGOTI5NyAvKiBOYXRp
dmVFcnJvckNvbnN0cnVjdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBCQzAyRTkwOTBFMTgzOURCMDAwRjkyOTcgLyogTmF0aXZlRXJyb3JDb25zdHJ1
Y3Rvci5oICovOyB9OwpAQCAtNzI4LDYgKzczMSw5IEBACiAJCUE3RTQyQzE5MEUzOTM4ODMwMDY1
QTU0NCAvKiBKU1N0YXRpY1Njb3BlT2JqZWN0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IEpTU3RhdGljU2NvcGVPYmplY3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlBN0Y4NjkwRTBGOTU4NEExMDA1NTg2OTcgLyogQ2FjaGVkQ2FsbC5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDYWNoZWRDYWxsLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCUE3Rjg2OUVDMEY5NUMyRUMwMDU1ODY5NyAvKiBDYWxsRnJhbWVDbG9z
dXJlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENhbGxGcmFtZUNsb3N1cmUu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTdGOTkzNUQwRkQ3MzI1MTAwQTBCMkQw
IC8qIEpTT05PYmplY3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNPTk9i
amVjdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBN0Y5OTM1RTBGRDczMjUxMDBB
MEIyRDAgLyogSlNPTk9iamVjdC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBKU09OT2JqZWN0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTdGOTk0
OUEwRkQ3NDZBMzAwQTBCMkQwIC8qIEpTT05PYmplY3QubHV0LmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgbmFtZSA9IEpTT05PYmplY3QubHV0Lmg7IHBhdGggPSAvVXNlcnMvb2xpdmVyL2J1
aWxkcy9EZWJ1Zy9EZXJpdmVkU291cmNlcy9KYXZhU2NyaXB0Q29yZS9KU09OT2JqZWN0Lmx1dC5o
OyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OwogCQlBOEU4OTQzMTBDRDA2MDI0MDAzNjcx
NzkgLyogSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUE4RTg5NDMzMENEMDYwM0YwMDM2NzE3OSAvKiBKU0dsb2JhbE9iamVjdC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU0dsb2JhbE9iamVjdC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQzAyRTkwNDBFMTgzOURCMDAwRjkyOTcgLyogRXJy
b3JDb25zdHJ1Y3Rvci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBF
cnJvckNvbnN0cnVjdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTExMzgs
NiArMTE0NCw3IEBACiAJCQljaGlsZHJlbiA9ICgKIAkJCQlCQzE4QzUyMzBFMTZGQzhBMDBCMzQ0
NjAgLyogQXJyYXlQcm90b3R5cGUubHV0LmggKi8sCiAJCQkJQkNEMjAzRTcwRTE3MThGNDAwMkM3
RTgyIC8qIERhdGVQcm90b3R5cGUubHV0LmggKi8sCisJCQkJQTdGOTk0OUEwRkQ3NDZBMzAwQTBC
MkQwIC8qIEpTT05PYmplY3QubHV0LmggKi8sCiAJCQkJQkMxOEM1MjkwRTE2RkNDMjAwQjM0NDYw
IC8qIE1hdGhPYmplY3QubHV0LmggKi8sCiAJCQkJQkMyNjgwRTYwRTE2RDUyMzAwQTA2RTkyIC8q
IE51bWJlckNvbnN0cnVjdG9yLmx1dC5oICovLAogCQkJCUJDRDIwMkQ1MEUxNzA3MDgwMDJDN0U4
MiAvKiBSZWdFeHBDb25zdHJ1Y3Rvci5sdXQuaCAqLywKQEAgLTE0NTYsNiArMTQ2Myw4IEBACiAJ
CQkJNjUwN0QyOTcwRTg3MUU0QTAwRDdEODk2IC8qIFR5cGVJbmZvLmggKi8sCiAJCQkJRjY5MkE4
ODUwMjU1NTk3RDAxRkY2MEY3IC8qIFVTdHJpbmcuY3BwICovLAogCQkJCUY2OTJBODg2MDI1NTU5
N0QwMUZGNjBGNyAvKiBVU3RyaW5nLmggKi8sCisJCQkJQTdGOTkzNUQwRkQ3MzI1MTAwQTBCMkQw
IC8qIEpTT05PYmplY3QuaCAqLywKKwkJCQlBN0Y5OTM1RTBGRDczMjUxMDBBMEIyRDAgLyogSlNP
Tk9iamVjdC5jcHAgKi8sCiAJCQkpOwogCQkJcGF0aCA9IHJ1bnRpbWU7CiAJCQlzb3VyY2VUcmVl
ID0gIjxncm91cD4iOwpAQCAtMTgzNyw2ICsxODQ2LDggQEAKIAkJCQk5NjA2MjY5NjBGQjhFQzAy
MDA5Nzk4QUIgLyogSklUU3R1YkNhbGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTBCREZGQUUwMEZD
NjE5MjkwMEQ2OUVGNCAvKiBDcm9zc1RocmVhZFJlZkNvdW50ZWQuaCBpbiBIZWFkZXJzICovLAog
CQkJCTBCREZGQUUxMEZDNjE5MzEwMEQ2OUVGNCAvKiBPd25GYXN0TWFsbG9jUHRyLmggaW4gSGVh
ZGVycyAqLywKKwkJCQlBN0Y5OTM1RjBGRDczMjUxMDBBMEIyRDAgLyogSlNPTk9iamVjdC5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJQTdGOTk0OUIwRkQ3NDZBMzAwQTBCMkQwIC8qIEpTT05PYmplY3Qu
bHV0LmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rw
cm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTIxOTcsNiArMjIwOCw3IEBACiAJCQkJQTdFMkVBNkMw
RkI0NjBDRjAwNjAxRjA2IC8qIExpdGVyYWxQYXJzZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
OTMwNTJDMzQwRkI3OTIxOTAwNDhGREMzIC8qIFBhcnNlckFyZW5hLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCUJDREQ1MUVCMEZCOERGNzQwMDRBOEJEQyAvKiBKSVRPcGNvZGVzLmNwcCBpbiBTb3Vy
Y2VzICovLAorCQkJCUE3Rjk5MzYwMEZENzMyNTEwMEEwQjJEMCAvKiBKU09OT2JqZWN0LmNwcCBp
biBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Np
bmcgPSAwOwogCQl9OwpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvQ2Fs
bEZyYW1lLmggYi9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9DYWxsRnJhbWUuaAppbmRleCBh
NjFlMTQzLi4wYjBlNWZlIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9D
YWxsRnJhbWUuaAorKysgYi9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9DYWxsRnJhbWUuaApA
QCAtODksNiArODksNyBAQCBuYW1lc3BhY2UgSlNDICB7CiAjZW5kaWYKICAgICAgICAgc3RhdGlj
IGNvbnN0IEhhc2hUYWJsZSogYXJyYXlUYWJsZShDYWxsRnJhbWUqIGNhbGxGcmFtZSkgeyByZXR1
cm4gY2FsbEZyYW1lLT5nbG9iYWxEYXRhKCkuYXJyYXlUYWJsZTsgfQogICAgICAgICBzdGF0aWMg
Y29uc3QgSGFzaFRhYmxlKiBkYXRlVGFibGUoQ2FsbEZyYW1lKiBjYWxsRnJhbWUpIHsgcmV0dXJu
IGNhbGxGcmFtZS0+Z2xvYmFsRGF0YSgpLmRhdGVUYWJsZTsgfQorICAgICAgICBzdGF0aWMgY29u
c3QgSGFzaFRhYmxlKiBqc29uVGFibGUoQ2FsbEZyYW1lKiBjYWxsRnJhbWUpIHsgcmV0dXJuIGNh
bGxGcmFtZS0+Z2xvYmFsRGF0YSgpLmpzb25UYWJsZTsgfQogICAgICAgICBzdGF0aWMgY29uc3Qg
SGFzaFRhYmxlKiBtYXRoVGFibGUoQ2FsbEZyYW1lKiBjYWxsRnJhbWUpIHsgcmV0dXJuIGNhbGxG
cmFtZS0+Z2xvYmFsRGF0YSgpLm1hdGhUYWJsZTsgfQogICAgICAgICBzdGF0aWMgY29uc3QgSGFz
aFRhYmxlKiBudW1iZXJUYWJsZShDYWxsRnJhbWUqIGNhbGxGcmFtZSkgeyByZXR1cm4gY2FsbEZy
YW1lLT5nbG9iYWxEYXRhKCkubnVtYmVyVGFibGU7IH0KICAgICAgICAgc3RhdGljIGNvbnN0IEhh
c2hUYWJsZSogcmVnRXhwVGFibGUoQ2FsbEZyYW1lKiBjYWxsRnJhbWUpIHsgcmV0dXJuIGNhbGxG
cmFtZS0+Z2xvYmFsRGF0YSgpLnJlZ0V4cFRhYmxlOyB9CmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmggYi9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0NvbW1vbklkZW50aWZpZXJzLmgKaW5kZXggZDRjNWQ1Mi4uOWIyYTRmYSAxMDA2NDQKLS0tIGEv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5oCisrKyBiL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuaApAQCAtNTksNiArNTksNyBAQAogICAg
IG1hY3JvKHRlc3QpIFwKICAgICBtYWNybyh0b0V4cG9uZW50aWFsKSBcCiAgICAgbWFjcm8odG9G
aXhlZCkgXAorICAgIG1hY3JvKHRvSlNPTikgXAogICAgIG1hY3JvKHRvTG9jYWxlU3RyaW5nKSBc
CiAgICAgbWFjcm8odG9QcmVjaXNpb24pIFwKICAgICBtYWNybyh0b1N0cmluZykgXApkaWZmIC0t
Z2l0IGEvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbERhdGEuY3BwIGIvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU0dsb2JhbERhdGEuY3BwCmluZGV4IDE1OTQ4NDguLjQ1ZjMwMDUgMTAw
NjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcAorKysgYi9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5jcHAKQEAgLTYwLDYgKzYwLDcgQEAg
dXNpbmcgbmFtZXNwYWNlIFdURjsKIG5hbWVzcGFjZSBKU0MgewogCiBleHRlcm4gY29uc3QgSGFz
aFRhYmxlIGFycmF5VGFibGU7CitleHRlcm4gY29uc3QgSGFzaFRhYmxlIGpzb25UYWJsZTsKIGV4
dGVybiBjb25zdCBIYXNoVGFibGUgZGF0ZVRhYmxlOwogZXh0ZXJuIGNvbnN0IEhhc2hUYWJsZSBt
YXRoVGFibGU7CiBleHRlcm4gY29uc3QgSGFzaFRhYmxlIG51bWJlclRhYmxlOwpAQCAtMTA1LDYg
KzEwNiw3IEBAIEpTR2xvYmFsRGF0YTo6SlNHbG9iYWxEYXRhKGJvb2wgaXNTaGFyZWQsIGNvbnN0
IFZQdHJTZXQmIHZwdHJTZXQpCiAgICAgLCBjbGllbnREYXRhKDApCiAgICAgLCBhcnJheVRhYmxl
KGZhc3ROZXc8SGFzaFRhYmxlPihKU0M6OmFycmF5VGFibGUpKQogICAgICwgZGF0ZVRhYmxlKGZh
c3ROZXc8SGFzaFRhYmxlPihKU0M6OmRhdGVUYWJsZSkpCisgICAgLCBqc29uVGFibGUoZmFzdE5l
dzxIYXNoVGFibGU+KEpTQzo6anNvblRhYmxlKSkKICAgICAsIG1hdGhUYWJsZShmYXN0TmV3PEhh
c2hUYWJsZT4oSlNDOjptYXRoVGFibGUpKQogICAgICwgbnVtYmVyVGFibGUoZmFzdE5ldzxIYXNo
VGFibGU+KEpTQzo6bnVtYmVyVGFibGUpKQogICAgICwgcmVnRXhwVGFibGUoZmFzdE5ldzxIYXNo
VGFibGU+KEpTQzo6cmVnRXhwVGFibGUpKQpAQCAtMTU1LDYgKzE1Nyw3IEBAIEpTR2xvYmFsRGF0
YTo6fkpTR2xvYmFsRGF0YSgpCiAKICAgICBhcnJheVRhYmxlLT5kZWxldGVUYWJsZSgpOwogICAg
IGRhdGVUYWJsZS0+ZGVsZXRlVGFibGUoKTsKKyAgICBqc29uVGFibGUtPmRlbGV0ZVRhYmxlKCk7
CiAgICAgbWF0aFRhYmxlLT5kZWxldGVUYWJsZSgpOwogICAgIG51bWJlclRhYmxlLT5kZWxldGVU
YWJsZSgpOwogICAgIHJlZ0V4cFRhYmxlLT5kZWxldGVUYWJsZSgpOwpAQCAtMTY2LDYgKzE2OSw3
IEBAIEpTR2xvYmFsRGF0YTo6fkpTR2xvYmFsRGF0YSgpCiAKICAgICBmYXN0RGVsZXRlKGNvbnN0
X2Nhc3Q8SGFzaFRhYmxlKj4oYXJyYXlUYWJsZSkpOwogICAgIGZhc3REZWxldGUoY29uc3RfY2Fz
dDxIYXNoVGFibGUqPihkYXRlVGFibGUpKTsKKyAgICBmYXN0RGVsZXRlKGNvbnN0X2Nhc3Q8SGFz
aFRhYmxlKj4oanNvblRhYmxlKSk7CiAgICAgZmFzdERlbGV0ZShjb25zdF9jYXN0PEhhc2hUYWJs
ZSo+KG1hdGhUYWJsZSkpOwogICAgIGZhc3REZWxldGUoY29uc3RfY2FzdDxIYXNoVGFibGUqPihu
dW1iZXJUYWJsZSkpOwogICAgIGZhc3REZWxldGUoY29uc3RfY2FzdDxIYXNoVGFibGUqPihyZWdF
eHBUYWJsZSkpOwpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbERh
dGEuaCBiL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxEYXRhLmgKaW5kZXggZTUzNzQ2
Yi4uMDlhNGM2MSAxMDA2NDQKLS0tIGEvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbERh
dGEuaAorKysgYi9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5oCkBAIC04Miw2
ICs4Miw3IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIGNvbnN0IEhhc2hUYWJsZSogYXJy
YXlUYWJsZTsKICAgICAgICAgY29uc3QgSGFzaFRhYmxlKiBkYXRlVGFibGU7CisgICAgICAgIGNv
bnN0IEhhc2hUYWJsZSoganNvblRhYmxlOwogICAgICAgICBjb25zdCBIYXNoVGFibGUqIG1hdGhU
YWJsZTsKICAgICAgICAgY29uc3QgSGFzaFRhYmxlKiBudW1iZXJUYWJsZTsKICAgICAgICAgY29u
c3QgSGFzaFRhYmxlKiByZWdFeHBUYWJsZTsKZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSlNHbG9iYWxPYmplY3QuY3BwIGIvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2Jh
bE9iamVjdC5jcHAKaW5kZXggMWU5ZjY3MC4uYzU2Yjg0YiAxMDA2NDQKLS0tIGEvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU0dsb2JhbE9iamVjdC5jcHAKKysrIGIvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU0dsb2JhbE9iamVjdC5jcHAKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlICJKU0Z1
bmN0aW9uLmgiCiAjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3RGdW5jdGlvbnMuaCIKICNpbmNsdWRl
ICJKU0xvY2suaCIKKyNpbmNsdWRlICJKU09OT2JqZWN0LmgiCiAjaW5jbHVkZSAiSW50ZXJwcmV0
ZXIuaCIKICNpbmNsdWRlICJNYXRoT2JqZWN0LmgiCiAjaW5jbHVkZSAiTmF0aXZlRXJyb3JDb25z
dHJ1Y3Rvci5oIgpAQCAtMzE4LDcgKzMxOSw4IEBAIHZvaWQgSlNHbG9iYWxPYmplY3Q6OnJlc2V0
KEpTVmFsdWUgcHJvdG90eXBlKQogICAgICAgICBHbG9iYWxQcm9wZXJ0eUluZm8oSWRlbnRpZmll
cihleGVjLCAiTWF0aCIpLCBuZXcgKGV4ZWMpIE1hdGhPYmplY3QoZXhlYywgTWF0aE9iamVjdDo6
Y3JlYXRlU3RydWN0dXJlKGQoKS0+b2JqZWN0UHJvdG90eXBlKSksIERvbnRFbnVtIHwgRG9udERl
bGV0ZSksCiAgICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyhJZGVudGlmaWVyKGV4ZWMsICJOYU4i
KSwganNOYU4oZXhlYyksIERvbnRFbnVtIHwgRG9udERlbGV0ZSksCiAgICAgICAgIEdsb2JhbFBy
b3BlcnR5SW5mbyhJZGVudGlmaWVyKGV4ZWMsICJJbmZpbml0eSIpLCBqc051bWJlcihleGVjLCBJ
bmYpLCBEb250RW51bSB8IERvbnREZWxldGUpLAotICAgICAgICBHbG9iYWxQcm9wZXJ0eUluZm8o
SWRlbnRpZmllcihleGVjLCAidW5kZWZpbmVkIiksIGpzVW5kZWZpbmVkKCksIERvbnRFbnVtIHwg
RG9udERlbGV0ZSkKKyAgICAgICAgR2xvYmFsUHJvcGVydHlJbmZvKElkZW50aWZpZXIoZXhlYywg
InVuZGVmaW5lZCIpLCBqc1VuZGVmaW5lZCgpLCBEb250RW51bSB8IERvbnREZWxldGUpLAorICAg
ICAgICBHbG9iYWxQcm9wZXJ0eUluZm8oSWRlbnRpZmllcihleGVjLCAiSlNPTiIpLCBuZXcgKGV4
ZWMpIEpTT05PYmplY3QoSlNPTk9iamVjdDo6Y3JlYXRlU3RydWN0dXJlKGQoKS0+b2JqZWN0UHJv
dG90eXBlKSksIERvbnRFbnVtIHwgRG9udERlbGV0ZSkKICAgICB9OwogCiAgICAgYWRkU3RhdGlj
R2xvYmFscyhzdGF0aWNHbG9iYWxzLCBzaXplb2Yoc3RhdGljR2xvYmFscykgLyBzaXplb2YoR2xv
YmFsUHJvcGVydHlJbmZvKSk7CmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pT
T05PYmplY3QuY3BwIGIvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmMxYWZmCi0tLSAvZGV2L251bGwKKysr
IGIvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcApAQCAtMCwwICsxLDQ1NyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSlNPTk9iamVjdC5oIgorCisjaW5jbHVkZSAiRXhjZXB0
aW9uSGVscGVycy5oIgorI2luY2x1ZGUgIkpTQXJyYXkuaCIKKyNpbmNsdWRlICJKU0Z1bmN0aW9u
LmgiCisjaW5jbHVkZSAiTGl0ZXJhbFBhcnNlci5oIgorI2luY2x1ZGUgIk5vZGVzLmgiCisjaW5j
bHVkZSAiUHJvcGVydHlOYW1lQXJyYXkuaCIKKworI2luY2x1ZGUgIk9iamVjdFByb3RvdHlwZS5o
IgorI2luY2x1ZGUgIk9wZXJhdGlvbnMuaCIKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8
d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisKK25hbWVz
cGFjZSBKU0MgeworCitBU1NFUlRfQ0xBU1NfRklUU19JTl9DRUxMKEpTT05PYmplY3QpOworCitz
dGF0aWMgSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIEpTT05Qcm90b0Z1bmNTdHJpbmdpZnkoRXhlY1N0
YXRlKiwgSlNPYmplY3QqLCBKU1ZhbHVlLCBjb25zdCBBcmdMaXN0Jik7CisKK30KKworI2luY2x1
ZGUgIkpTT05PYmplY3QubHV0LmgiCisKK25hbWVzcGFjZSBKU0MgeworCisvLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gSlNPTk9iamVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQorCitjb25zdCBDbGFzc0luZm8gSlNPTk9iamVjdDo6aW5mbyA9IHsgIkpTT04iLCAw
LCAwLCBFeGVjU3RhdGU6Ompzb25UYWJsZSB9OworCisvKiBTb3VyY2UgZm9yIEpTT05PYmplY3Qu
bHV0LmgKK0BiZWdpbiBqc29uVGFibGUKKyAgc3RyaW5naWZ5ICAgICBKU09OUHJvdG9GdW5jU3Ry
aW5naWZ5ICAgICAgICAgRG9udEVudW18RnVuY3Rpb24gMQorQGVuZAorKi8KKworLy8gRUNNQSAx
NS44CisKK2Jvb2wgSlNPTk9iamVjdDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhl
YywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QgJnNsb3QpCit7
CisgICAgY29uc3QgSGFzaEVudHJ5KiBlbnRyeSA9IEV4ZWNTdGF0ZTo6anNvblRhYmxlKGV4ZWMp
LT5lbnRyeShleGVjLCBwcm9wZXJ0eU5hbWUpOworCisgICAgaWYgKCFlbnRyeSkKKyAgICAgICAg
cmV0dXJuIEpTT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBz
bG90KTsKKworICAgIEFTU0VSVChlbnRyeS0+YXR0cmlidXRlcygpICYgRnVuY3Rpb24pOworICAg
IHNldFVwU3RhdGljRnVuY3Rpb25TbG90KGV4ZWMsIGVudHJ5LCB0aGlzLCBwcm9wZXJ0eU5hbWUs
IHNsb3QpOworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBTdHJpbmdpZmllciB7CisgICAg
dHlwZWRlZiBVU3RyaW5nIFN0cmluZ0J1aWxkZXI7CisgICAgLy8gQmFzaWNhbGx5IHRoZSBtYXhp
bXVtIG5lc3RpbmcgYWNjZXB0ZWQgYnkgZmlyZWZveC4KKyAgICAvLyBXZSBjYW4gZ28gbXVjaCBt
dWNoIGhpZ2hlciB3aXRob3V0IHVzaW5nIGFsbCBvZiB0aGUgc3RhY2ssIGJ1dAorICAgIC8vIHRo
aXMgcHJvdmlkZXMgdXMgd2l0aCBhIHJlYXNvbmFibGUgbGVld2F5IGFzIHRvIGhvdyBkZWVwIHRo
ZQorICAgIC8vIHN0YWNrIGlzIHdoZW4gd2Ugc3RhcnQuCisgICAgZW51bSB7IE1heE9iamVjdERl
cHRoID0gMTc5MiB9OworcHVibGljOgorICAgIFN0cmluZ2lmaWVyKEV4ZWNTdGF0ZSogZXhlYywg
SlNWYWx1ZSByZXBsYWNlciwgY29uc3QgVVN0cmluZyYgZ2FwKQorICAgICAgICA6IG1fZXhlYyhl
eGVjKQorICAgICAgICAsIG1fcmVwbGFjZXIocmVwbGFjZXIpCisgICAgICAgICwgbV9nYXAoZ2Fw
KQorICAgICAgICAsIG1fYXJyYXlSZXBsYWNlclByb3BlcnR5TmFtZXMoZXhlYykKKyAgICAgICAg
LCBtX3VzaW5nQXJyYXlSZXBsYWNlcihmYWxzZSkKKyAgICAgICAgLCBtX3JlcGxhY2VyQ2FsbFR5
cGUoQ2FsbFR5cGVOb25lKQorICAgIHsKKyAgICAgICAgaWYgKG1fcmVwbGFjZXIuaXNPYmplY3Qo
KSkgeworICAgICAgICAgICAgaWYgKGFzT2JqZWN0KG1fcmVwbGFjZXIpLT5pbmhlcml0cygmSlNB
cnJheTo6aW5mbykpIHsKKyAgICAgICAgICAgICAgICBKU09iamVjdCogYXJyYXkgPSBhc09iamVj
dChtX3JlcGxhY2VyKTsKKyAgICAgICAgICAgICAgICBib29sIGlzUmVhbEpTQXJyYXkgPSBpc0pT
QXJyYXkoJm1fZXhlYy0+Z2xvYmFsRGF0YSgpLCBtX3JlcGxhY2VyKTsKKyAgICAgICAgICAgICAg
ICB1bnNpZ25lZCBsZW5ndGggPSBhcnJheS0+Z2V0KG1fZXhlYywgbV9leGVjLT5nbG9iYWxEYXRh
KCkucHJvcGVydHlOYW1lcy0+bGVuZ3RoKS50b1VJbnQzMihtX2V4ZWMpOworICAgICAgICAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAg
ICAgICAgICBKU1ZhbHVlIG5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlYWxKU0Fy
cmF5ICYmIGFzQXJyYXkoYXJyYXkpLT5jYW5HZXRJbmRleChpKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIG5hbWUgPSBhc0FycmF5KGFycmF5KS0+Z2V0SW5kZXgoaSk7CisgICAgICAgICAgICAg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFycmF5LT5nZXQo
bV9leGVjLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaXNTdHJpbmcoKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBVU3RyaW5n
IHByb3BlcnR5TmFtZSA9IG5hbWUudG9TdHJpbmcobV9leGVjKTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgICAgICAgICBtX2FycmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzLmFk
ZChJZGVudGlmaWVyKG1fZXhlYywgcHJvcGVydHlOYW1lKSk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIG1fdXNpbmdBcnJheVJlcGxhY2VyID0gdHJ1ZTsKKyAgICAgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgICAgIG1fcmVwbGFjZXJDYWxsVHlwZSA9IGFzT2JqZWN0KG1f
cmVwbGFjZXIpLT5nZXRDYWxsRGF0YShtX3JlcGxhY2VyQ2FsbERhdGEpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgSlNWYWx1ZSBzdHJpbmdpZnkoSlNWYWx1ZSB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIEpTT2JqZWN0KiBvYmogPSBjb25zdHJ1Y3RFbXB0eU9iamVjdChtX2V4ZWMpOworICAgICAg
ICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBqc051bGwo
KTsKKyAgICAgICAgSWRlbnRpZmllciBlbXB0eUlkZW50KG1fZXhlYywgIiIpOworICAgICAgICBv
YmotPnB1dERpcmVjdChlbXB0eUlkZW50LCB2YWx1ZSk7CisgICAgICAgIFN0cmluZ0tleUdlbmVy
YXRvciBrZXkoZW1wdHlJZGVudCk7CisgICAgICAgIHZhbHVlID0gdG9KU09OVmFsdWUoa2V5LCB2
YWx1ZSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICAgICAgaWYgKCFzdHJp
bmdpZnkoYnVpbGRlciwgb2JqLCBrZXksIHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBqc1Vu
ZGVmaW5lZCgpOworICAgICAgICByZXR1cm4gKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpPyBtX2V4
ZWMtPmV4Y2VwdGlvbigpIDoganNTdHJpbmcobV9leGVjLCBidWlsZGVyKTsKKyAgICB9Citwcml2
YXRlOgorICAgIHZvaWQgYXBwZW5kU3RyaW5nKFN0cmluZ0J1aWxkZXImIGJ1aWxkZXIsIGNvbnN0
IFVTdHJpbmcmIHZhbHVlKQorICAgIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLnNpemUo
KTsKKyAgICAgICAgY29uc3QgVUNoYXIqIGRhdGEgPSB2YWx1ZS5kYXRhKCk7CisgICAgICAgIGJ1
aWxkZXIucmVzZXJ2ZUNhcGFjaXR5KGJ1aWxkZXIuc2l6ZSgpICsgbGVuZ3RoICsgMiArIDgpOyAv
LyArMiBmb3IgIidzICs4IGZvciBhIGJ1ZmZlcgorICAgICAgICBidWlsZGVyLmFwcGVuZCgnXCIn
KTsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3Ro
KSB7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKKyAgICAgICAgICAgIHdoaWxlIChp
bmRleCA8IGxlbmd0aCAmJiAoZGF0YVtpbmRleF0gPiAweDFmICYmIGRhdGFbaW5kZXhdICE9ICci
JyAmJiBkYXRhW2luZGV4XSAhPSAnXFwnKSkKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAg
ICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGF0YSArIHN0YXJ0LCBpbmRleCAtIHN0YXJ0KTsKKyAg
ICAgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIHN3aXRjaChk
YXRhW2luZGV4XSl7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzogeworICAgICAgICAg
ICAgICAgICAgICAgICAgVUNoYXIgdGFiW10gPSB7J1xcJywndCd9OworICAgICAgICAgICAgICAg
ICAgICAgICAgYnVpbGRlci5hcHBlbmQodGFiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2Ug
J1xyJzogeworICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgY3JbXSA9IHsnXFwnLCdyJ307
CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjciwgMik7CisgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICBjYXNlICdcbic6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIG5s
W10gPSB7J1xcJywnbid9OworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
bmwsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXGYnOiB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBVQ2hhciB0YWJbXSA9IHsnXFwnLCdmJ307IAorICAgICAgICAgICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQodGFiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xiJzog
eworICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYnNbXSA9IHsnXFwnLCdiJ307CisgICAg
ICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChicywgMik7CisgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICBjYXNlICdcIic6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIHF1b3RlW10g
PSB7J1xcJywnIid9OworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocXVv
dGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOiB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBVQ2hhciBzbGFzaFtdID0geydcXCcsICdcXCd9OworICAgICAgICAgICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoc2xhc2gsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCA9IChpbnQpZGF0YVtpbmRleF07Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogaGV4U3RyID0gIjAxMjM0
NTY3ODlhYmNkZWYiOworICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgb2N0W10gPSB7J1xc
JywgJ3UnLCBoZXhTdHJbKGNoID4+IDEyKSAmIDE1XSwgaGV4U3RyWyhjaCA+PiA4KSAmIDE1XSwg
aGV4U3RyWyhjaCA+PiA0KSAmIDE1XSwgaGV4U3RyWyhjaCA+PiAwKSAmIDE1XX07CisgICAgICAg
ICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChvY3QsIHNpemVvZihvY3QpIC8gc2l6ZW9m
KFVDaGFyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBidWlsZGVyLmFwcGVuZCgnXCInKTsKKyAgICB9CisgICAgY2xhc3MgU3RyaW5nS2V5
R2VuZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFN0cmluZ0tleUdlbmVyYXRvcihjb25z
dCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkgOiBtX3Byb3BlcnR5KHByb3BlcnR5KSB7fQorICAgICAg
ICBKU1ZhbHVlIGdldEtleShFeGVjU3RhdGUqIGV4ZWMpIHsgaWYgKCFtX2tleSkgbV9rZXkgPSBq
c1N0cmluZyhleGVjLCBtX3Byb3BlcnR5LnVzdHJpbmcoKSk7IHJldHVybiBtX2tleTsgIH0KKyAg
ICBwcml2YXRlOgorICAgICAgICBJZGVudGlmaWVyIG1fcHJvcGVydHk7CisgICAgICAgIEpTVmFs
dWUgbV9rZXk7CisgICAgfTsKKyAgICBjbGFzcyBJbnRLZXlHZW5lcmF0b3IgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgSW50S2V5R2VuZXJhdG9yKHVpbnQzMl90IHByb3BlcnR5KSA6IG1fcHJvcGVy
dHkocHJvcGVydHkpIHt9CisgICAgICAgIEpTVmFsdWUgZ2V0S2V5KEV4ZWNTdGF0ZSogZXhlYykg
eyBpZiAoIW1fa2V5KSBtX2tleSA9IGpzTnVtYmVyKGV4ZWMsIG1fcHJvcGVydHkpOyByZXR1cm4g
bV9rZXk7ICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdWludDMyX3QgbV9wcm9wZXJ0eTsKKyAg
ICAgICAgSlNWYWx1ZSBtX2tleTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtl
eUdlbmVyYXRvcj4gSlNWYWx1ZSB0b0pTT05WYWx1ZShLZXlHZW5lcmF0b3ImIGpzS2V5LCBKU1Zh
bHVlIGpzVmFsdWUpCisgICAgeworICAgICAgICBpZiAoIWpzVmFsdWUuaXNPYmplY3QoKSB8fCAh
YXNPYmplY3QoanNWYWx1ZSktPmhhc1Byb3BlcnR5KG1fZXhlYywgbV9leGVjLT5nbG9iYWxEYXRh
KCkucHJvcGVydHlOYW1lcy0+dG9KU09OKSkKKyAgICAgICAgICAgIHJldHVybiBqc1ZhbHVlOwor
CisgICAgICAgIEpTVmFsdWUganNUb0pTT04gPSBhc09iamVjdChqc1ZhbHVlKS0+Z2V0KG1fZXhl
YywgbV9leGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+dG9KU09OKTsKKworICAgICAg
ICBpZiAoIWpzVG9KU09OLmlzT2JqZWN0KCkpCisgICAgICAgICAgICByZXR1cm4ganNWYWx1ZTsK
KworICAgICAgICBKU09iamVjdCogb2JqZWN0ID0gYXNPYmplY3QoanNUb0pTT04pOworICAgICAg
ICBDYWxsRGF0YSBjYWxsRGF0YTsKKyAgICAgICAgQ2FsbFR5cGUgY2FsbFR5cGUgPSBvYmplY3Qt
PmdldENhbGxEYXRhKGNhbGxEYXRhKTsKKworICAgICAgICBpZiAoY2FsbFR5cGUgPT0gQ2FsbFR5
cGVOb25lKQorICAgICAgICAgICAgcmV0dXJuIGpzVmFsdWU7CisKKyAgICAgICAgSlNWYWx1ZSBs
aXN0W10gPSB7IGpzS2V5LmdldEtleShtX2V4ZWMpIH07ICAgICAgICAKKyAgICAgICAgQXJnTGlz
dCBhcmdzKGxpc3QsIHNpemVvZihsaXN0KSAvIHNpemVvZihKU1ZhbHVlKSk7CisgICAgICAgIHJl
dHVybiBjYWxsKG1fZXhlYywgb2JqZWN0LGNhbGxUeXBlLCBjYWxsRGF0YSwganNWYWx1ZSwgYXJn
cyk7CisgICAgfQorCisgICAgYm9vbCBzdHJpbmdpZnlBcnJheShTdHJpbmdCdWlsZGVyJiBidWls
ZGVyLCBKU0FycmF5KiBhcnJheSkKKyAgICB7CisgICAgICAgIGlmIChtX29iamVjdFN0YWNrLmNv
bnRhaW5zKGFycmF5KSkgeworICAgICAgICAgICAgdGhyb3dFcnJvcihtX2V4ZWMsIFR5cGVFcnJv
cik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1f
b2JqZWN0U3RhY2suc2l6ZSgpID4gTWF4T2JqZWN0RGVwdGgpIHsKKyAgICAgICAgICAgIG1fZXhl
Yy0+c2V0RXhjZXB0aW9uKGNyZWF0ZVN0YWNrT3ZlcmZsb3dFcnJvcihtX2V4ZWMpKTsKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtX29iamVjdFN0YWNrLmFk
ZChhcnJheSk7CisgICAgICAgIFVTdHJpbmcgc3RlcEJhY2sgPSBtX2luZGVudDsKKyAgICAgICAg
bV9pbmRlbnQuYXBwZW5kKG1fZ2FwKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZ0J1aWxkZXIsIDE2
PiBwYXJ0aWFsOworICAgICAgICB1bnNpZ25lZCBsZW4gPSBhcnJheS0+Z2V0KG1fZXhlYywgbV9l
eGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+bGVuZ3RoKS50b1VJbnQzMihtX2V4ZWMp
OworICAgICAgICBib29sIGlzUmVhbEpTQXJyYXkgPSBpc0pTQXJyYXkoJm1fZXhlYy0+Z2xvYmFs
RGF0YSgpLCBhcnJheSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkr
KykgeworICAgICAgICAgICAgSlNWYWx1ZSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChpc1JlYWxK
U0FycmF5ICYmIGFycmF5LT5jYW5HZXRJbmRleChpKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9
IGFycmF5LT5nZXRJbmRleChpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAg
IHZhbHVlID0gYXJyYXktPmdldChtX2V4ZWMsIGkpOworICAgICAgICAgICAgICAgIGlmIChtX2V4
ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdDsKKyAgICAgICAg
ICAgIEludEtleUdlbmVyYXRvciBrZXkoaSk7CisgICAgICAgICAgICB2YWx1ZSA9IHRvSlNPTlZh
bHVlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKHBhcnRpYWwuc2l6ZSgpICYmIG1fZ2Fw
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBwYXJ0aWFsLmxhc3QoKS5hcHBlbmQoJywnKTsK
KyAgICAgICAgICAgIGlmICghc3RyaW5naWZ5KHJlc3VsdCwgYXJyYXksIGtleSwgdmFsdWUpICYm
ICFtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQo
Im51bGwiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcGFydGlhbC5hcHBlbmQo
cmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnRpYWwuaXNFbXB0
eSgpKQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIltdIik7CisgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgaWYgKG1fZ2FwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHBhcnRpYWwuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KHBhcnRpYWxbaV0pOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCddJyk7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVTdHJpbmcgc2VwYXJhdG9yKCIsXG4i
KTsKKyAgICAgICAgICAgICAgICBzZXBhcmF0b3IuYXBwZW5kKG1faW5kZW50KTsKKyAgICAgICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZCgiW1xuIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQobV9pbmRlbnQpOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBwYXJ0aWFsLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBw
ZW5kKHBhcnRpYWxbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHBhcnRpYWwuc2l6
ZSgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHNlcGFyYXRv
cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdc
bicpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHN0ZXBCYWNrKTsKKyAgICAgICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZCgnXScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgbV9pbmRlbnQgPSBzdGVwQmFjazsKKyAgICAgICAgbV9vYmplY3RTdGFjay5yZW1v
dmUoYXJyYXkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBzdHJpbmdp
ZnlPYmplY3QoU3RyaW5nQnVpbGRlciYgYnVpbGRlciwgSlNPYmplY3QqIG9iamVjdCkgeworICAg
ICAgICBpZiAobV9vYmplY3RTdGFjay5jb250YWlucyhvYmplY3QpKSB7CisgICAgICAgICAgICB0
aHJvd0Vycm9yKG1fZXhlYywgVHlwZUVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgICAgICBpZiAobV9vYmplY3RTdGFjay5zaXplKCkgPiBNYXhPYmplY3RE
ZXB0aCkgeworICAgICAgICAgICAgbV9leGVjLT5zZXRFeGNlcHRpb24oY3JlYXRlU3RhY2tPdmVy
Zmxvd0Vycm9yKG1fZXhlYykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIG1fb2JqZWN0U3RhY2suYWRkKG9iamVjdCk7CisgICAgICAgIFVTdHJpbmcgc3Rl
cEJhY2sgPSBtX2luZGVudDsKKyAgICAgICAgbV9pbmRlbnQuYXBwZW5kKG1fZ2FwKTsKKyAgICAg
ICAgVmVjdG9yPFN0cmluZ0J1aWxkZXIsIDE2PiBwYXJ0aWFsOworCisgICAgICAgIFByb3BlcnR5
TmFtZUFycmF5IG9iamVjdFByb3BlcnR5TmFtZXMobV9leGVjKTsKKyAgICAgICAgUHJvcGVydHlO
YW1lQXJyYXkmIHNvdXJjZVByb3BlcnR5TmFtZXMobV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1l
cyk7CisgICAgICAgIGlmICghbV91c2luZ0FycmF5UmVwbGFjZXIpIHsKKyAgICAgICAgICAgIG9i
amVjdC0+Z2V0UHJvcGVydHlOYW1lcyhtX2V4ZWMsIG9iamVjdFByb3BlcnR5TmFtZXMpOworICAg
ICAgICAgICAgc291cmNlUHJvcGVydHlOYW1lcyA9IG9iamVjdFByb3BlcnR5TmFtZXM7CisgICAg
ICAgIH0KKyAgICAgICAgUHJvcGVydHlOYW1lQXJyYXk6OmNvbnN0X2l0ZXJhdG9yIHByb3BFbmQg
PSBzb3VyY2VQcm9wZXJ0eU5hbWVzLmVuZCgpOworICAgICAgICBmb3IgKFByb3BlcnR5TmFtZUFy
cmF5Ojpjb25zdF9pdGVyYXRvciBwcm9wSXRlciA9IHNvdXJjZVByb3BlcnR5TmFtZXMuYmVnaW4o
KTsgcHJvcEl0ZXIgIT0gcHJvcEVuZDsgcHJvcEl0ZXIrKykgeworICAgICAgICAgICAgaWYgKCFv
YmplY3QtPmhhc093blByb3BlcnR5KG1fZXhlYywgKnByb3BJdGVyKSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIEpTVmFsdWUgdmFsdWUgPSBvYmplY3QtPmdldChtX2V4
ZWMsICpwcm9wSXRlcik7CisgICAgICAgICAgICBpZiAodmFsdWUuaXNVbmRlZmluZWQoKSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0
OworICAgICAgICAgICAgYXBwZW5kU3RyaW5nKHJlc3VsdCxwcm9wSXRlci0+dXN0cmluZygpKTsK
KyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgIGlmICghbV9nYXAu
aXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAnKTsKKyAgICAgICAg
ICAgIFN0cmluZ0tleUdlbmVyYXRvciBrZXkoKnByb3BJdGVyKTsKKyAgICAgICAgICAgIHZhbHVl
ID0gdG9KU09OVmFsdWUoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAodmFsdWUuaXNVbmRl
ZmluZWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHN0cmluZ2lm
eShyZXN1bHQsIG9iamVjdCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBwYXJ0aWFsLmFwcGVu
ZChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJ0aWFsLmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ7fSIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgIGlmIChtX2dhcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVu
ZCgneycpOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYXJ0aWFs
LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAg
IGJ1aWxkZXIuYXBwZW5kKHBhcnRpYWxbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZCgnfScpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBVU3RyaW5nIHNlcGFyYXRvcigiLFxuIik7CisgICAgICAgICAgICAgICAgc2Vw
YXJhdG9yLmFwcGVuZChtX2luZGVudCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
IntcbiIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1faW5kZW50KTsKKyAgICAg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGFydGlhbC5zaXplKCk7IGkrKykg
eworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJ0aWFsW2ldKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJ0aWFsLnNpemUoKSAtIDEpCisgICAgICAgICAgICAg
ICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgICAgICBi
dWlsZGVyLmFwcGVuZChzdGVwQmFjayk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
J30nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgbV9pbmRlbnQgPSBz
dGVwQmFjazsKKyAgICAgICAgbV9vYmplY3RTdGFjay5yZW1vdmUob2JqZWN0KTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlHZW5l
cmF0b3I+IGJvb2wgc3RyaW5naWZ5KFN0cmluZ0J1aWxkZXImIGJ1aWxkZXIsIEpTVmFsdWUgaG9s
ZGVyLCBLZXlHZW5lcmF0b3Iga2V5LCBKU1ZhbHVlIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYg
KG1fcmVwbGFjZXJDYWxsVHlwZSAhPSBDYWxsVHlwZU5vbmUpIHsKKyAgICAgICAgICAgIEpTVmFs
dWUgbGlzdFtdID0ge2tleS5nZXRLZXkobV9leGVjKSwgdmFsdWV9OworICAgICAgICAgICAgQXJn
TGlzdCBhcmdzKGxpc3QsIHNpemVvZihsaXN0KSAvIHNpemVvZihKU1ZhbHVlKSk7CisgICAgICAg
ICAgICB2YWx1ZSA9IGNhbGwobV9leGVjLCBtX3JlcGxhY2VyLCBtX3JlcGxhY2VyQ2FsbFR5cGUs
IG1fcmVwbGFjZXJDYWxsRGF0YSwgaG9sZGVyLCBhcmdzKTsKKyAgICAgICAgICAgIGlmIChtX2V4
ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAodmFsdWUuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCJudWxsIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAodmFsdWUuaXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KHZhbHVlLmdldEJvb2xlYW4oKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLmlzT2JqZWN0KCkpIHsKKyAg
ICAgICAgICAgIGlmIChhc09iamVjdCh2YWx1ZSktPmluaGVyaXRzKCZOdW1iZXJPYmplY3Q6Omlu
Zm8pIHx8IGFzT2JqZWN0KHZhbHVlKS0+aW5oZXJpdHMoJlN0cmluZ09iamVjdDo6aW5mbykpCisg
ICAgICAgICAgICAgICAgdmFsdWUgPSBzdGF0aWNfY2FzdDxKU1dyYXBwZXJPYmplY3QqPihhc09i
amVjdCh2YWx1ZSkpLT5pbnRlcm5hbFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZh
bHVlLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgICAgIGFwcGVuZFN0cmluZyhidWlsZGVyLCB2YWx1
ZS50b1N0cmluZyhtX2V4ZWMpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9
CisgICAgICAgIGlmICh2YWx1ZS5pc051bWJlcigpKSB7CisgICAgICAgICAgICBkb3VibGUgdiA9
IHZhbHVlLnRvTnVtYmVyKG1fZXhlYyk7CisgICAgICAgICAgICBpZiAoIWlzZmluaXRlKHYpKQor
ICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJudWxsIik7CisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVVN0cmluZzo6ZnJvbSh2KSk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUuaXNPYmpl
Y3QoKSkgeworICAgICAgICAgICAgaWYgKGFzT2JqZWN0KHZhbHVlKS0+aW5oZXJpdHMoJkpTQXJy
YXk6OmluZm8pKQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnlBcnJheShidWlsZGVy
LCBhc0FycmF5KHZhbHVlKSk7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KGJ1
aWxkZXIsIGFzT2JqZWN0KHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKyAgICBFeGVjU3RhdGUqIG1fZXhlYzsKKyAgICBKU1ZhbHVlIG1fcmVwbGFjZXI7
CisgICAgVVN0cmluZyBtX2dhcDsKKyAgICBVU3RyaW5nIG1faW5kZW50OworICAgIEhhc2hTZXQ8
SlNPYmplY3QqPiBtX29iamVjdFN0YWNrOworICAgIFByb3BlcnR5TmFtZUFycmF5IG1fYXJyYXlS
ZXBsYWNlclByb3BlcnR5TmFtZXM7CisgICAgYm9vbCBtX3VzaW5nQXJyYXlSZXBsYWNlcjsKKyAg
ICBDYWxsVHlwZSBtX3JlcGxhY2VyQ2FsbFR5cGU7CisgICAgQ2FsbERhdGEgbV9yZXBsYWNlckNh
bGxEYXRhOworfTsKKworLy8gRUNNQS0yNjIgdjUgMTUuMTIuMworSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIEpTT05Qcm90b0Z1bmNTdHJpbmdpZnkoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIEpT
VmFsdWUgdGhpc1ZhbHVlLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoreworICAgIFVOVVNFRF9QQVJB
TSh0aGlzVmFsdWUpOworCisgICAgaWYgKGFyZ3MuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
dGhyb3dFcnJvcihleGVjLCBHZW5lcmFsRXJyb3IsICJObyBpbnB1dCB0byBzdHJpbmdpZnkiKTsK
KworICAgIEpTVmFsdWUgdmFsdWUgPSBhcmdzLmF0KDApOworICAgIEpTVmFsdWUgcmVwbGFjZXIg
PSBhcmdzLmF0KDEpOworICAgIEpTVmFsdWUgc3BhY2UgPSBhcmdzLmF0KDIpOworCisgICAgVVN0
cmluZyBnYXA7CisgICAgaWYgKHNwYWNlLmlzT2JqZWN0KCkpIHsKKyAgICAgICAgaWYgKGFzT2Jq
ZWN0KHNwYWNlKS0+aW5oZXJpdHMoJk51bWJlck9iamVjdDo6aW5mbykgfHwgYXNPYmplY3Qoc3Bh
Y2UpLT5pbmhlcml0cygmU3RyaW5nT2JqZWN0OjppbmZvKSkKKyAgICAgICAgICAgIHNwYWNlID0g
c3RhdGljX2Nhc3Q8SlNXcmFwcGVyT2JqZWN0Kj4oYXNPYmplY3Qoc3BhY2UpKS0+aW50ZXJuYWxW
YWx1ZSgpOworICAgIH0KKyAgICBpZiAoc3BhY2UuaXNOdW1iZXIoKSkgeworICAgICAgICBkb3Vi
bGUgdiA9IHNwYWNlLnRvTnVtYmVyKGV4ZWMpOworICAgICAgICBpZiAodiA+IDEwMCkKKyAgICAg
ICAgICAgIHYgPSAxMDA7CisgICAgICAgIGlmICghKHYgPiAwKSkKKyAgICAgICAgICAgIHYgPSAw
OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHY7IGkrKykKKyAgICAgICAgICAgIGdhcC5h
cHBlbmQoJyAnKTsKKyAgICB9IGVsc2UgaWYgKHNwYWNlLmlzU3RyaW5nKCkpCisgICAgICAgIGdh
cCA9IHNwYWNlLnRvU3RyaW5nKGV4ZWMpOworCisgICAgU3RyaW5naWZpZXIgc3RyaW5naWZpZXIo
ZXhlYywgYXJncy5hdCgxKSwgZ2FwKTsKKyAgICByZXR1cm4gc3RyaW5naWZpZXIuc3RyaW5naWZ5
KHZhbHVlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgSlNDCmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0pTT05PYmplY3QuaCBiL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9i
amVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjU3MGIKLS0tIC9k
ZXYvbnVsbAorKysgYi9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT05PYmplY3QuaApAQCAtMCww
ICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgSlNPTk9iamVjdF9oCisjZGVmaW5lIEpTT05PYmplY3RfaAorCisjaW5jbHVkZSAi
SlNPYmplY3QuaCIKKworbmFtZXNwYWNlIEpTQyB7CisKKyAgICBjbGFzcyBKU09OT2JqZWN0IDog
cHVibGljIEpTT2JqZWN0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEpTT05PYmplY3QoUGFzc1Jl
ZlB0cjxTdHJ1Y3R1cmU+IHN0cnVjdHVyZSkKKyAgICAgICAgICAgIDpKU09iamVjdChzdHJ1Y3R1
cmUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBnZXRPd25Q
cm9wZXJ0eVNsb3QoRXhlY1N0YXRlKiwgY29uc3QgSWRlbnRpZmllciYsIFByb3BlcnR5U2xvdCYp
OworCisgICAgICAgIHZpcnR1YWwgY29uc3QgQ2xhc3NJbmZvKiBjbGFzc0luZm8oKSBjb25zdCB7
IHJldHVybiAmaW5mbzsgfQorICAgICAgICBzdGF0aWMgY29uc3QgQ2xhc3NJbmZvIGluZm87CisK
KyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RydWN0dXJlPiBjcmVhdGVTdHJ1Y3R1cmUoSlNW
YWx1ZSBwcm90b3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6
OmNyZWF0ZShwcm90b3R5cGUsIFR5cGVJbmZvKE9iamVjdFR5cGUpKTsKKyAgICAgICAgfQorICAg
IH07CisKK30gLy8gbmFtZXNwYWNlIEpTQworCisjZW5kaWYgLy8gSlNPTk9iamVjdF9oCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5k
ZXggNzM4NWFiYy4uNGI1ZGUwNiAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisr
KyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIyIEBACisyMDA5LTA2LTA3ICBP
bGl2ZXIgSHVudCAgPG9saXZlckBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgQnVnIDI2MjQ5OiBTdXBwb3J0IEpTT04uc3RyaW5naWZ5
CisgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNDk+
CisgICAgICAgIAorICAgICAgICBBZGQgdGVzdCBjb3ZlcmFnZSBmb3IgSlNPTi5zdHJpbmdpZnkg
LS0gY292ZXJzIHVzZSBvZiByZXBsYWNlciBmdW5jdGlvbiwKKyAgICAgICAgcmVwbGFjZXIgYXJy
YXksIG5vIHJlcGxhY2VyLCBudW1lcmljIGFuZCBzdHJpbmcgZ2Fwcy4gIEFsc28gdGVzdHMgY2Fs
bAorICAgICAgICBzZXF1ZW5jaW5nICh0b0pTT04sIHRvU3RyaW5nLCByZXBsYWNlciBmdW5jdGlv
bnMsIGFuZCBnZXR0ZXJzKS4KKworICAgICAgICAqIGZhc3QvanMvSlNPTi1zdHJpbmdpZnktZXhw
ZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L2pzL0pTT04tc3RyaW5naWZ5Lmh0bWw6
IEFkZGVkLgorICAgICAgICAqIGZhc3QvanMvcmVzb3VyY2VzL0pTT04tc3RyaW5naWZ5LmpzOiBB
ZGRlZC4KKyAgICAgICAgKiBmYXN0L2pzL3Jlc291cmNlcy9qc29uMi1lczUtY29tcGF0LmpzOiBB
ZGRlZC4KKyAgICAgICAgICAgTW9kaWZpZWQgdmVyc2lvbiBvZiBqc29uMi5qcyB0byBmb3JjZSBz
dHJpY3QgZXM1IHNlbWFudGljcyBvbiBzdHJpbmdpZnkKKyAgICAgICAgICAgdG8gYWxsb3cgdXMg
dG8gY29tcGFyZSBvdXIgcmVzdWx0cyB0byB0aGUgZXhwZWN0ZWQgd2l0aG91dCBoYXZpbmcgdG8g
CisgICAgICAgICAgIHN0dWZmIGxhcmdlIGFyYml0cmFyeSBzdHJpbmdzIGludG8gdGhlIHRlc3Rj
YXNlCisKIDIwMDktMDYtMDQgIE9saXZlciBIdW50ICA8b2xpdmVyQGFwcGxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBHYXZpbiBCYXJyYWNsb3VnaC4KZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL2Zhc3QvanMvSlNPTi1zdHJpbmdpZnktZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvZmFz
dC9qcy9KU09OLXN0cmluZ2lmeS1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMjcyYzc4NAotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3Qv
anMvSlNPTi1zdHJpbmdpZnktZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMjk3IEBACitmdW5jdGlv
biAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe2dl
dCBGb28oKSB7IHJldHVybiAiYmFyIjsgfX0pOworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZl
SlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAg
IHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh7Z2V0IEZvbygpIHsgdGhpcy5mb289IndpYmJs
ZSI7IHJldHVybiAiYmFyIjsgfX0pOworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikg
aXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHZhciBj
b3VudCA9IDA7CisgICAgICAgIGpzb25PYmplY3Quc3RyaW5naWZ5KHtnZXQgRm9vKCkgeyBjb3Vu
dCsrOyByZXR1cm4gImJhciI7IH19KTsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK1BB
U1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29u
T2JqZWN0KSB7CisgICAgICAgIHZhciBjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBqc29uT2Jq
ZWN0LnN0cmluZ2lmeSh7Z2V0IEZvbygpIHsgY291bnQrKzsgZGVsZXRlIHRoaXMuYmFyOyByZXR1
cm4gImJhciI7IH0sIGJhcjogIndpYmJsZSJ9KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2
ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAg
ICB2YXIgY291bnQgPSAwOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6
IjEiLCBiOiIyIiwgYzoiMyIsIDU6NCwgNDo1LCAyOjYsIDE6N30pOworICAgIH0KK1BBU1MgdGVz
dHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0
KSB7CisgICAgICAgIHZhciBhbGxTdHJpbmcgPSB0cnVlOworICAgICAgICBqc29uT2JqZWN0LnN0
cmluZ2lmeSh7YToiMSIsIGI6IjIiLCBjOiIzIiwgNTo0LCA0OjUsIDI6NiwgMTo3fSwgZnVuY3Rp
b24oayx2KXthbGxTdHJpbmcgPSBhbGxTdHJpbmcgJiYgKHR5cGVvZiBrID09ICJzdHJpbmciKTsg
cmV0dXJuIHZ9KTsKKyAgICAgICAgcmV0dXJuIGFsbFN0cmluZzsKKyAgICB9CitQQVNTIHRlc3Rz
W2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkg
eworICAgICAgICB2YXIgYWxsU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAganNvbk9iamVjdC5zdHJp
bmdpZnkoWzEsMiwzLDQsNV0sIGZ1bmN0aW9uKGssdil7YWxsU3RyaW5nID0gYWxsU3RyaW5nICYm
ICh0eXBlb2YgayA9PSAic3RyaW5nIik7IHJldHVybiB2fSk7CisgICAgICAgIHJldHVybiBhbGxT
dHJpbmc7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09O
KQorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAgICAgdmFyIGFsbFN0cmluZyA9IHRydWU7
CisgICAgICAgIHZhciBhcnJheSA9IFtdOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJp
bmdpZnkoe2E6IjEiLCBiOiIyIiwgYzoiMyIsIDU6NCwgNDo1LCAyOjYsIDE6N30sIGFycmF5KTsK
KyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5j
dGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICB2YXIgYWxsU3RyaW5nID0gdHJ1ZTsKKyAgICAg
ICAgdmFyIGFycmF5ID0gWyJhIl07CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lm
eSh7Z2V0IGEoKXtyZXR1cm4gMTthcnJheVsxXT0iYiI7YXJyYXlbMl09ImMifSwgYjoiMiIsIGM6
IjMifSwgYXJyYXkpOworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNb
aV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHZhciBhbGxTdHJpbmcg
PSB0cnVlOworICAgICAgICB2YXIgYXJyYXkgPSBbe3RvU3RyaW5nOmZ1bmN0aW9uKCl7YXJyYXlb
MF09J2EnOyBhcnJheVsxXT0nYyc7IGFycmF5WzJdPSdiJzsgcmV0dXJuICdhJ319XTsKKyAgICAg
ICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHNpbXBsZU9iamVjdCwgYXJyYXkpOworICAg
IH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9u
IChqc29uT2JqZWN0KSB7CisgICAgICAgIHZhciBhbGxTdHJpbmcgPSB0cnVlOworICAgICAgICB2
YXIgYXJyYXkgPSBbMSwyLDNdOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnko
ezE6J2EnLCAyOidiJywgMzonYyd9LCBhcnJheSk7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRp
dmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAg
ICAgdmFyIGFsbFN0cmluZyA9IHRydWU7CisgICAgICAgIHZhciBhcnJheSA9IFsiMSIsIjIiLCIz
Il07CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh7MTonYScsIDI6J2InLCAz
OidjJ30sIGFycmF5KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3Rz
W2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICB2YXIgYWxsU3RyaW5n
ID0gdHJ1ZTsKKyAgICAgICAgdmFyIGFycmF5ID0gWyIxIiwiMiIsIjMiXTsKKyAgICAgICAgcmV0
dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHNpbXBsZUFycmF5LCBhcnJheSk7CisgICAgfQorUEFT
UyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25P
YmplY3QpIHsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHNpbXBsZUFycmF5
LCBudWxsLCAiICAiKTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3Rz
W2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9i
amVjdC5zdHJpbmdpZnkoc2ltcGxlQXJyYXksIG51bGwsIDQpOworICAgIH0KK1BBU1MgdGVzdHNb
aV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShzaW1wbGVBcnJheSwgbnVsbCwg
ImFiIik7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09O
KQorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3Ry
aW5naWZ5KHNpbXBsZUFycmF5LCBudWxsLCA0KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2
ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAg
ICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoc2ltcGxlT2JqZWN0LCBudWxsLCAiICAiKTsK
KyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5j
dGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnko
c2ltcGxlT2JqZWN0LCBudWxsLCA0KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04p
IGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1
cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoc2ltcGxlT2JqZWN0LCBudWxsLCAiYWIiKTsKKyAgICB9
CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAo
anNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoc2ltcGxl
T2JqZWN0LCBudWxsLCA0KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRl
c3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNv
bk9iamVjdC5zdHJpbmdpZnkoY29tcGxleEFycmF5LCBudWxsLCAiICAiKTsKKyAgICB9CitQQVNT
IHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9i
amVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoY29tcGxleEFycmF5
LCBudWxsLCA0KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ld
KEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVj
dC5zdHJpbmdpZnkoY29tcGxleEFycmF5LCBudWxsLCAiYWIiKTsKKyAgICB9CitQQVNTIHRlc3Rz
W2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkg
eworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoY29tcGxleEFycmF5LCBudWxs
LCA0KTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04p
CitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJp
bmdpZnkoY29tcGxleE9iamVjdCwgbnVsbCwgIiAgIik7CisgICAgfQorUEFTUyB0ZXN0c1tpXShu
YXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAg
ICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KGNvbXBsZXhPYmplY3QsIG51bGwsIDQp
OworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1
bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lm
eShjb21wbGV4T2JqZWN0LCBudWxsLCAiYWIiKTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2
ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAg
ICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoY29tcGxleE9iamVjdCwgbnVsbCwgNCk7Cisg
ICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rp
b24gKGpzb25PYmplY3QpIHsKKyAgICAgICAgcmVwbGFjZVRyYWNrZXIgPSAiIjsKKyAgICAgICAg
anNvbk9iamVjdC5zdHJpbmdpZnkoWzEsMiwzLCwsLDQsNSw2XSwgcmVwbGFjZUZ1bmMpOworICAg
ICAgICByZXR1cm4gcmVwbGFjZVRyYWNrZXI7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVK
U09OKSBpcyB0ZXN0c1tpXS5leHBlY3RlZAorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAg
ICAgcmVwbGFjZVRyYWNrZXIgPSAiIjsKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6
ImEiLCBiOiJiIiwgYzoiYyIsIDM6ICJkIiwgMjogImUiLCAxOiAiZiJ9LCByZXBsYWNlRnVuYyk7
CisgICAgICAgIHJldHVybiByZXBsYWNlVHJhY2tlcjsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5h
dGl2ZUpTT04pIGlzIHRlc3RzW2ldLmV4cGVjdGVkCitmdW5jdGlvbiAoanNvbk9iamVjdCkgewor
ICAgICAgICB2YXIgY291bnQgPSAwOworICAgICAgICB2YXIgYXJyYXkgPSBbe3RvU3RyaW5nOmZ1
bmN0aW9uKCl7Y291bnQrKzsgYXJyYXlbMF09J2EnOyBhcnJheVsxXT0nYyc7IGFycmF5WzJdPSdi
JzsgcmV0dXJuICdhJ319XTsKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmdpZnkoc2ltcGxlT2Jq
ZWN0LCBhcnJheSk7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CitQQVNTIHRlc3RzW2ld
KG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgewor
ICAgICAgICB2YXIgYWxsU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgdmFyIGFycmF5ID0gW3t0b1N0
cmluZzpmdW5jdGlvbigpe2FycmF5WzBdPSdhJzsgYXJyYXlbMV09J2MnOyBhcnJheVsyXT0nYic7
IHJldHVybiAnYSd9fSwgJ2InLCAnYyddOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJp
bmdpZnkoc2ltcGxlT2JqZWN0LCBhcnJheSk7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVK
U09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAgICAg
dmFyIGNvdW50ID0gMDsKKyAgICAgICAgdmFyIGFycmF5ID0gW3t0b1N0cmluZzpmdW5jdGlvbigp
e2NvdW50Kys7IGFycmF5WzBdPSdhJzsgYXJyYXlbMV09J2MnOyBhcnJheVsyXT0nYic7IHJldHVy
biAnYSd9fSwgJ2InLCAnYyddOworICAgICAgICBqc29uT2JqZWN0LnN0cmluZ2lmeShzaW1wbGVP
YmplY3QsIGFycmF5KTsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK1BBU1MgdGVzdHNb
aV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh7YToiMSIsIGdldCBiKCkgeyB0
aGlzLmE9ImZvbyI7IHJldHVybiAiZ2V0dGVyIjsgfSwgYzoiMyJ9KTsKKyAgICB9CitQQVNTIHRl
c3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9iamVj
dCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6IjEiLCBnZXQgYigp
IHsgdGhpcy5jPSJmb28iOyByZXR1cm4gImdldHRlciI7IH0sIGM6IjMifSk7CisgICAgfQorUEFT
UyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25P
YmplY3QpIHsKKyAgICAgICAgdmFyIHNldHRlckNhbGxlZCA9IGZhbHNlOworICAgICAgICBqc29u
T2JqZWN0LnN0cmluZ2lmeSh7YToiMSIsIHNldCBiKHMpIHsgc2V0dGVyQ2FsbGVkID0gdHJ1ZTsg
cmV0dXJuICJzZXR0ZXIiOyB9LCBjOiIzIn0pOworICAgICAgICByZXR1cm4gc2V0dGVyQ2FsbGVk
OworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1
bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lm
eSh7YToiMSIsIGdldCBiKCl7IHJldHVybiAiZ2V0dGVyIjsgfSwgc2V0IGIocykgeyByZXR1cm4g
InNldHRlciI7IH0sIGM6IjMifSk7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBp
cyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAgICAgcmV0dXJu
IGpzb25PYmplY3Quc3RyaW5naWZ5KG5ldyBBcnJheSgxMCkpOworICAgIH0KK1BBU1MgdGVzdHNb
aV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShbdW5kZWZpbmVkLCxudWxsLDAs
ZmFsc2VdKTsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpT
T04pCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5z
dHJpbmdpZnkoe3AxOnVuZGVmaW5lZCxwMjpudWxsLHAzOjAscDQ6ZmFsc2V9KTsKKyAgICB9CitQ
QVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNv
bk9iamVjdCkgeworICAgICAgICBjeWNsZVRyYWNrZXIgPSAiIjsKKyAgICAgICAgcmV0dXJuIGpz
b25PYmplY3Quc3RyaW5naWZ5KGN5Y2xpY09iamVjdCk7CisgICAgfQorUEFTUyB0ZXN0c1tpXShu
YXRpdmVKU09OKSB0aHJldyBleGNlcHRpb24gVHlwZUVycm9yOiBUeXBlIGVycm9yLgorZnVuY3Rp
b24gKGpzb25PYmplY3QpIHsKKyAgICAgICAgY3ljbGVUcmFja2VyID0gIiI7CisgICAgICAgIHRy
eSB7IGpzb25PYmplY3Quc3RyaW5naWZ5KGN5Y2xpY09iamVjdCk7IH0gY2F0Y2goZSkgeyBjeWNs
ZVRyYWNrZXIgKz0gIiAtPiBleGNlcHRpb24iIH0KKyAgICAgICAgcmV0dXJuIGN5Y2xlVHJhY2tl
cjsKKyAgICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldLmV4cGVjdGVk
CitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICBjeWNsZVRyYWNrZXIgPSAiIjsKKyAg
ICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KGN5Y2xpY0FycmF5KTsKKyAgICB9CitQ
QVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IFR5cGUg
ZXJyb3IuCitmdW5jdGlvbiAoanNvbk9iamVjdCkgeworICAgICAgICBjeWNsZVRyYWNrZXIgPSAi
IjsKKyAgICAgICAgdHJ5IHsganNvbk9iamVjdC5zdHJpbmdpZnkoY3ljbGljQXJyYXkpOyB9IGNh
dGNoKGUpIHsgY3ljbGVUcmFja2VyICs9ICIgLT4gZXhjZXB0aW9uIiB9CisgICAgICAgIHJldHVy
biBjeWNsZVRyYWNrZXI7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0
c1tpXS5leHBlY3RlZAorZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKKyAgICAgICAgZ2V0dGVyQ2Fs
bHMgPSAwOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkobWFnaWNPYmplY3Qp
ICsgIiA6OiBnZXR0ZXIgY2FsbHMgPSAiICsgZ2V0dGVyQ2FsbHM7CisgICAgfQorUEFTUyB0ZXN0
c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25PYmplY3Qp
IHsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHVuZGVmaW5lZCk7CisgICAg
fQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24g
KGpzb25PYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KG51bGwp
OworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1
bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lm
eSh7dG9KU09OOmZ1bmN0aW9uKCl7IHJldHVybiB1bmRlZmluZWQ7IH19KTsKKyAgICB9CitQQVNT
IHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNvbk9i
amVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe3RvSlNPTjpmdW5j
dGlvbigpeyByZXR1cm4gbnVsbDsgfX0pOworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNP
TikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHJl
dHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShbe3RvSlNPTjpmdW5jdGlvbigpeyByZXR1cm4gdW5k
ZWZpbmVkOyB9fV0pOworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNb
aV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAgIHJldHVybiBqc29uT2Jq
ZWN0LnN0cmluZ2lmeShbe3RvSlNPTjpmdW5jdGlvbigpeyByZXR1cm4gbnVsbDsgfX1dKTsKKyAg
ICB9CitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlv
biAoanNvbk9iamVjdCkgeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6
e3RvSlNPTjpmdW5jdGlvbigpeyByZXR1cm4gdW5kZWZpbmVkOyB9fX0pOworICAgIH0KK1BBU1Mg
dGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2Jq
ZWN0KSB7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh7YTp7dG9KU09OOmZ1
bmN0aW9uKCl7IHJldHVybiBudWxsOyB9fX0pOworICAgIH0KK1BBU1MgdGVzdHNbaV0obmF0aXZl
SlNPTikgaXMgdGVzdHNbaV0oSlNPTikKK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7CisgICAgICAg
IHZhciBkZWVwT2JqZWN0ID0ge307CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTYwMDsg
aSsrKQorICAgICAgICAgICAgZGVlcE9iamVjdCA9IHtuZXh0OmRlZXBPYmplY3R9OworICAgICAg
ICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoZGVlcE9iamVjdCk7CisgICAgfQorUEFTUyB0
ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorZnVuY3Rpb24gKGpzb25PYmpl
Y3QpIHsKKyAgICAgICAgdmFyIGRlZXBBcnJheSA9IFtdOworICAgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IDE2MDA7IGkrKykKKyAgICAgICAgICAgIGRlZXBBcnJheSA9IFtkZWVwQXJyYXldOwor
ICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoZGVlcEFycmF5KTsKKyAgICB9CitQ
QVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCitmdW5jdGlvbiAoanNv
bk9iamVjdCkgeworICAgICAgICBmdW5jdGlvbiB0b0luZmluaXRlSlNPTk9iamVjdCgpIHsKKyAg
ICAgICAgICAgIHZhciByID0ge307CisgICAgICAgICAgICByLnRvSlNPTiA9IHRvSW5maW5pdGVK
U09OT2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIHtyZWN1cnNlOiByfTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkodG9JbmZpbml0ZUpTT05PYmplY3Qo
KSk7CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSB0aHJldyBleGNlcHRpb24gUmFu
Z2VFcnJvcjogTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWQuLgorZnVuY3Rpb24gKGpz
b25PYmplY3QpIHsKKyAgICAgICAgZnVuY3Rpb24gdG9JbmZpbml0ZUpTT05BcnJheSgpIHsKKyAg
ICAgICAgICAgIHZhciByID0gW107CisgICAgICAgICAgICByLnRvSlNPTiA9IHRvSW5maW5pdGVK
U09OQXJyYXk7CisgICAgICAgICAgICByZXR1cm4gW3JdOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh0b0luZmluaXRlSlNPTkFycmF5KCkpOworICAgIH0K
K1BBU1MgdGVzdHNbaV0obmF0aXZlSlNPTikgdGhyZXcgZXhjZXB0aW9uIFJhbmdlRXJyb3I6IE1h
eGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkLi4KK2Z1bmN0aW9uIChqc29uT2JqZWN0KSB7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShmdWxsQ2hhcnNldFN0cmluZyk7
CisgICAgfQorUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09OKQorUEFT
UyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKZGlmZiAtLWdp
dCBhL0xheW91dFRlc3RzL2Zhc3QvanMvSlNPTi1zdHJpbmdpZnkuaHRtbCBiL0xheW91dFRlc3Rz
L2Zhc3QvanMvSlNPTi1zdHJpbmdpZnkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi4wYjhhYzYwCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9qcy9K
U09OLXN0cmluZ2lmeS5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJ
QyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0
eWxlc2hlZXQiIGhyZWY9InJlc291cmNlcy9qcy10ZXN0LXN0eWxlLmNzcyI+Cis8c2NyaXB0IHNy
Yz0icmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5Pgor
PHAgaWQ9ImRlc2NyaXB0aW9uIj48L3A+Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKzxzY3Jp
cHQ+Cit2YXIgbmF0aXZlSlNPTiA9IHRoaXMuSlNPTjsKK3RoaXMuSlNPTiA9IG51bGw7Cis8L3Nj
cmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvanNvbjItZXM1LWNvbXBhdC5qcyI+PC9zY3Jp
cHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL0pTT04tc3RyaW5naWZ5LmpzIj48L3NjcmlwdD4K
KzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9k
eT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3QvanMvcmVzb3VyY2VzL0pT
T04tc3RyaW5naWZ5LmpzIGIvTGF5b3V0VGVzdHMvZmFzdC9qcy9yZXNvdXJjZXMvSlNPTi1zdHJp
bmdpZnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkYzNiZgotLS0g
L2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3QvanMvcmVzb3VyY2VzL0pTT04tc3RyaW5n
aWZ5LmpzCkBAIC0wLDAgKzEsMjkyIEBACisKK2Z1bmN0aW9uIGNyZWF0ZVRlc3RzKCkgeworICAg
IHZhciBzaW1wbGVBcnJheSA9IFsnYScsICdiJywgJ2MnXTsKKyAgICB2YXIgc2ltcGxlT2JqZWN0
ID0ge2E6IjEiLCBiOiIyIiwgYzoiMyJ9OworICAgIHZhciBjb21wbGV4QXJyYXkgPSBbJ2EnLCAn
YicsICdjJywsLHNpbXBsZU9iamVjdCwgc2ltcGxlQXJyYXksIFtzaW1wbGVPYmplY3Qsc2ltcGxl
QXJyYXldXTsKKyAgICB2YXIgY29tcGxleE9iamVjdCA9IHthOiIxIiwgYjoiMiIsIGM6IjMiLCBk
OnVuZGVmaW5lZCwgZTpudWxsLCAiIjoxMiwgZ2V0IGYoKXsgcmV0dXJuIHNpbXBsZUFycmF5OyB9
LCBhcnJheTogY29tcGxleEFycmF5fTsKKyAgICB2YXIgcmVzdWx0ID0gW107CisgICAgcmVzdWx0
LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0
cmluZ2lmeSh7Z2V0IEZvbygpIHsgcmV0dXJuICJiYXIiOyB9fSk7CisgICAgfSk7CisgICAgcmVz
dWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0
LnN0cmluZ2lmeSh7Z2V0IEZvbygpIHsgdGhpcy5mb289IndpYmJsZSI7IHJldHVybiAiYmFyIjsg
fX0pOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAg
ICAgICB2YXIgY291bnQgPSAwOworICAgICAgICBqc29uT2JqZWN0LnN0cmluZ2lmeSh7Z2V0IEZv
bygpIHsgY291bnQrKzsgcmV0dXJuICJiYXIiOyB9fSk7CisgICAgICAgIHJldHVybiBjb3VudDsK
KyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAg
dmFyIGNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHtnZXQg
Rm9vKCkgeyBjb3VudCsrOyBkZWxldGUgdGhpcy5iYXI7IHJldHVybiAiYmFyIjsgfSwgYmFyOiAi
d2liYmxlIn0pOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3Qp
eworICAgICAgICB2YXIgY291bnQgPSAwOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJp
bmdpZnkoe2E6IjEiLCBiOiIyIiwgYzoiMyIsIDU6NCwgNDo1LCAyOjYsIDE6N30pOworICAgIH0p
OworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAgICAgICB2YXIgYWxs
U3RyaW5nID0gdHJ1ZTsKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6IjEiLCBiOiIy
IiwgYzoiMyIsIDU6NCwgNDo1LCAyOjYsIDE6N30sIGZ1bmN0aW9uKGssdil7YWxsU3RyaW5nID0g
YWxsU3RyaW5nICYmICh0eXBlb2YgayA9PSAic3RyaW5nIik7IHJldHVybiB2fSk7CisgICAgICAg
IHJldHVybiBhbGxTdHJpbmc7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNv
bk9iamVjdCl7CisgICAgICAgIHZhciBhbGxTdHJpbmcgPSB0cnVlOworICAgICAgICBqc29uT2Jq
ZWN0LnN0cmluZ2lmeShbMSwyLDMsNCw1XSwgZnVuY3Rpb24oayx2KXthbGxTdHJpbmcgPSBhbGxT
dHJpbmcgJiYgKHR5cGVvZiBrID09ICJzdHJpbmciKTsgcmV0dXJuIHZ9KTsKKyAgICAgICAgcmV0
dXJuIGFsbFN0cmluZzsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2Jq
ZWN0KXsKKyAgICAgICAgdmFyIGFsbFN0cmluZyA9IHRydWU7CisgICAgICAgIHZhciBhcnJheSA9
IFtdOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6IjEiLCBiOiIyIiwg
YzoiMyIsIDU6NCwgNDo1LCAyOjYsIDE6N30sIGFycmF5KTsKKyAgICB9KTsKKyAgICByZXN1bHQu
cHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgdmFyIGFsbFN0cmluZyA9IHRydWU7
CisgICAgICAgIHZhciBhcnJheSA9IFsiYSJdOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5z
dHJpbmdpZnkoe2dldCBhKCl7cmV0dXJuIDE7YXJyYXlbMV09ImIiO2FycmF5WzJdPSJjIn0sIGI6
IjIiLCBjOiIzIn0sIGFycmF5KTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihq
c29uT2JqZWN0KXsKKyAgICAgICAgdmFyIGFsbFN0cmluZyA9IHRydWU7CisgICAgICAgIHZhciBh
cnJheSA9IFt7dG9TdHJpbmc6ZnVuY3Rpb24oKXthcnJheVswXT0nYSc7IGFycmF5WzFdPSdjJzsg
YXJyYXlbMl09J2InOyByZXR1cm4gJ2EnfX1dOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5z
dHJpbmdpZnkoc2ltcGxlT2JqZWN0LCBhcnJheSk7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2go
ZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHZhciBhbGxTdHJpbmcgPSB0cnVlOworICAg
ICAgICB2YXIgYXJyYXkgPSBbMSwyLDNdOworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJp
bmdpZnkoezE6J2EnLCAyOidiJywgMzonYyd9LCBhcnJheSk7CisgICAgfSk7CisgICAgcmVzdWx0
LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHZhciBhbGxTdHJpbmcgPSB0cnVl
OworICAgICAgICB2YXIgYXJyYXkgPSBbIjEiLCIyIiwiMyJdOworICAgICAgICByZXR1cm4ganNv
bk9iamVjdC5zdHJpbmdpZnkoezE6J2EnLCAyOidiJywgMzonYyd9LCBhcnJheSk7CisgICAgfSk7
CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHZhciBhbGxT
dHJpbmcgPSB0cnVlOworICAgICAgICB2YXIgYXJyYXkgPSBbIjEiLCIyIiwiMyJdOworICAgICAg
ICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoc2ltcGxlQXJyYXksIGFycmF5KTsKKyAgICB9
KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJu
IGpzb25PYmplY3Quc3RyaW5naWZ5KHNpbXBsZUFycmF5LCBudWxsLCAiICAiKTsKKyAgICB9KTsK
KyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpz
b25PYmplY3Quc3RyaW5naWZ5KHNpbXBsZUFycmF5LCBudWxsLCA0KTsKKyAgICB9KTsKKyAgICBy
ZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmpl
Y3Quc3RyaW5naWZ5KHNpbXBsZUFycmF5LCBudWxsLCAiYWIiKTsKKyAgICB9KTsKKyAgICByZXN1
bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Qu
c3RyaW5naWZ5KHNpbXBsZUFycmF5LCBudWxsLCA0KTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVz
aChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5n
aWZ5KHNpbXBsZU9iamVjdCwgbnVsbCwgIiAgIik7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2go
ZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lm
eShzaW1wbGVPYmplY3QsIG51bGwsIDQpOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0
aW9uKGpzb25PYmplY3QpeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoc2lt
cGxlT2JqZWN0LCBudWxsLCAiYWIiKTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlv
bihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHNpbXBs
ZU9iamVjdCwgbnVsbCwgNCk7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNv
bk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShjb21wbGV4QXJy
YXksIG51bGwsICIgICIpOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25P
YmplY3QpeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoY29tcGxleEFycmF5
LCBudWxsLCA0KTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0
KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KGNvbXBsZXhBcnJheSwgbnVs
bCwgImFiIik7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShjb21wbGV4QXJyYXksIG51bGws
IDQpOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAg
ICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoY29tcGxleE9iamVjdCwgbnVsbCwgIiAg
Iik7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAg
ICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShjb21wbGV4T2JqZWN0LCBudWxsLCA0KTsK
KyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAg
cmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KGNvbXBsZXhPYmplY3QsIG51bGwsICJhYiIpOwor
ICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAgICAgICBy
ZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoY29tcGxleE9iamVjdCwgbnVsbCwgNCk7CisgICAg
fSk7CisgICAgdmFyIHJlcGxhY2VUcmFja2VyOworICAgIGZ1bmN0aW9uIHJlcGxhY2VGdW5jKGtl
eSwgdmFsdWUpIHsKKyAgICAgICAgcmVwbGFjZVRyYWNrZXIgKz0ga2V5ICsgIigiKyh0eXBlb2Yg
a2V5KSsiKSIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAiOyI7CisgICAgICAgIHJldHVybiB2
YWx1ZTsKKyAgICB9CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAg
ICAgIHJlcGxhY2VUcmFja2VyID0gIiI7CisgICAgICAgIGpzb25PYmplY3Quc3RyaW5naWZ5KFsx
LDIsMywsLCw0LDUsNl0sIHJlcGxhY2VGdW5jKTsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2VUcmFj
a2VyOworICAgIH0pOworICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0uZXhwZWN0ZWQgPSAn
KHN0cmluZylbMSwyLDMsbnVsbCxudWxsLG51bGwsNCw1LDZdOzAobnVtYmVyKTE7MShudW1iZXIp
MjsyKG51bWJlcikzOzMobnVtYmVyKXVuZGVmaW5lZDs0KG51bWJlcil1bmRlZmluZWQ7NShudW1i
ZXIpdW5kZWZpbmVkOzYobnVtYmVyKTQ7NyhudW1iZXIpNTs4KG51bWJlcik2OycKKyAgICByZXN1
bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmVwbGFjZVRyYWNrZXIgPSAi
IjsKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmdpZnkoe2E6ImEiLCBiOiJiIiwgYzoiYyIsIDM6
ICJkIiwgMjogImUiLCAxOiAiZiJ9LCByZXBsYWNlRnVuYyk7CisgICAgICAgIHJldHVybiByZXBs
YWNlVHJhY2tlcjsKKyAgICB9KTsKKyAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLmV4cGVj
dGVkID0gJyhzdHJpbmcpeyJhIjoiYSIsImIiOiJiIiwiYyI6ImMiLCIzIjoiZCIsIjIiOiJlIiwi
MSI6ImYifTthKHN0cmluZykiYSI7YihzdHJpbmcpImIiO2Moc3RyaW5nKSJjIjszKHN0cmluZyki
ZCI7MihzdHJpbmcpImUiOzEoc3RyaW5nKSJmIjsnOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9u
KGpzb25PYmplY3QpeworICAgICAgICB2YXIgY291bnQgPSAwOworICAgICAgICB2YXIgYXJyYXkg
PSBbe3RvU3RyaW5nOmZ1bmN0aW9uKCl7Y291bnQrKzsgYXJyYXlbMF09J2EnOyBhcnJheVsxXT0n
Yyc7IGFycmF5WzJdPSdiJzsgcmV0dXJuICdhJ319XTsKKyAgICAgICAganNvbk9iamVjdC5zdHJp
bmdpZnkoc2ltcGxlT2JqZWN0LCBhcnJheSk7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9
KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgdmFyIGFs
bFN0cmluZyA9IHRydWU7CisgICAgICAgIHZhciBhcnJheSA9IFt7dG9TdHJpbmc6ZnVuY3Rpb24o
KXthcnJheVswXT0nYSc7IGFycmF5WzFdPSdjJzsgYXJyYXlbMl09J2InOyByZXR1cm4gJ2EnfX0s
ICdiJywgJ2MnXTsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHNpbXBsZU9i
amVjdCwgYXJyYXkpOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmpl
Y3QpeworICAgICAgICB2YXIgY291bnQgPSAwOworICAgICAgICB2YXIgYXJyYXkgPSBbe3RvU3Ry
aW5nOmZ1bmN0aW9uKCl7Y291bnQrKzsgYXJyYXlbMF09J2EnOyBhcnJheVsxXT0nYyc7IGFycmF5
WzJdPSdiJzsgcmV0dXJuICdhJ319LCAnYicsICdjJ107CisgICAgICAgIGpzb25PYmplY3Quc3Ry
aW5naWZ5KHNpbXBsZU9iamVjdCwgYXJyYXkpOworICAgICAgICByZXR1cm4gY291bnQ7CisgICAg
fSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVy
biBqc29uT2JqZWN0LnN0cmluZ2lmeSh7YToiMSIsIGdldCBiKCkgeyB0aGlzLmE9ImZvbyI7IHJl
dHVybiAiZ2V0dGVyIjsgfSwgYzoiMyJ9KTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5j
dGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHth
OiIxIiwgZ2V0IGIoKSB7IHRoaXMuYz0iZm9vIjsgcmV0dXJuICJnZXR0ZXIiOyB9LCBjOiIzIn0p
OworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAgICAg
ICB2YXIgc2V0dGVyQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIGpzb25PYmplY3Quc3RyaW5naWZ5
KHthOiIxIiwgc2V0IGIocykgeyBzZXR0ZXJDYWxsZWQgPSB0cnVlOyByZXR1cm4gInNldHRlciI7
IH0sIGM6IjMifSk7CisgICAgICAgIHJldHVybiBzZXR0ZXJDYWxsZWQ7CisgICAgfSk7CisgICAg
cmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2Jq
ZWN0LnN0cmluZ2lmeSh7YToiMSIsIGdldCBiKCl7IHJldHVybiAiZ2V0dGVyIjsgfSwgc2V0IGIo
cykgeyByZXR1cm4gInNldHRlciI7IH0sIGM6IjMifSk7CisgICAgfSk7CisgICAgcmVzdWx0LnB1
c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmlu
Z2lmeShuZXcgQXJyYXkoMTApKTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihq
c29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KFt1bmRlZmlu
ZWQsLG51bGwsMCxmYWxzZV0pOworICAgIH0pOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpz
b25PYmplY3QpeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoe3AxOnVuZGVm
aW5lZCxwMjpudWxsLHAzOjAscDQ6ZmFsc2V9KTsKKyAgICB9KTsKKyAgICB2YXIgY3ljbGVUcmFj
a2VyID0gIiI7CisgICAgdmFyIGN5Y2xpY09iamVjdCA9IHsgZ2V0IHByZVNlbGYxKCkgeyBjeWNs
ZVRyYWNrZXIrPSJwcmVTZWxmMSwiOyByZXR1cm4gInByZVNlbGYxIjsgfSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcHJlU2VsZjI6IHt0b0pTT046ZnVuY3Rpb24oKXtjeWNsZVRyYWNr
ZXIrPSJwcmVTZWxmMiwiOyByZXR1cm4gInByZVNlbGYyIn19LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmOiBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgcG9zdFNl
bGYxKCkgeyBjeWNsZVRyYWNrZXIrPSJwb3N0U2VsZjEsIjsgcmV0dXJuICJwb3N0U2VsZjEiIH0s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RTZWxmMjoge3RvSlNPTjpmdW5jdGlv
bigpe2N5Y2xlVHJhY2tlcis9InBvc3RTZWxmMiwiOyByZXR1cm4gInBvc3RTZWxmMiJ9fSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9KU09OIDogZnVuY3Rpb24oa2V5KSB7IGN5Y2xl
VHJhY2tlciArPSBrZXkgKyAiKCIrKHR5cGVvZiBrZXkpKyIpOiIgKyB0aGlzOyByZXR1cm4gdGhp
czsgfQorICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIGN5Y2xpY09iamVjdC5zZWxmID0g
Y3ljbGljT2JqZWN0OworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAg
ICAgICBjeWNsZVRyYWNrZXIgPSAiIjsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5n
aWZ5KGN5Y2xpY09iamVjdCk7CisgICAgfSk7CisgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAx
XS50aHJvd3MgPSB0cnVlOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3Qpewor
ICAgICAgICBjeWNsZVRyYWNrZXIgPSAiIjsKKyAgICAgICAgdHJ5IHsganNvbk9iamVjdC5zdHJp
bmdpZnkoY3ljbGljT2JqZWN0KTsgfSBjYXRjaChlKSB7IGN5Y2xlVHJhY2tlciArPSAiIC0+IGV4
Y2VwdGlvbiIgfQorICAgICAgICByZXR1cm4gY3ljbGVUcmFja2VyOworICAgIH0pOworICAgIHJl
c3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0uZXhwZWN0ZWQgPSAiKHN0cmluZyk6W29iamVjdCBPYmpl
Y3RdcHJlU2VsZjEscHJlU2VsZjIsc2VsZihzdHJpbmcpOltvYmplY3QgT2JqZWN0XXBvc3RTZWxm
MiwgLT4gZXhjZXB0aW9uIgorICAgIHZhciBjeWNsaWNBcnJheSA9IFt7dG9KU09OIDogZnVuY3Rp
b24oa2V5LHZhbHVlKSB7IGN5Y2xlVHJhY2tlciArPSBrZXkgKyAiKCIrKHR5cGVvZiBrZXkpKyIp
OiIgKyB0aGlzOyBjeWNsZVRyYWNrZXIgKz0gImZpcnN0LCI7IHJldHVybiB0aGlzOyB9fSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgY3ljbGljQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAg
IHt0b0pTT04gOiBmdW5jdGlvbihrZXksdmFsdWUpIHsgY3ljbGVUcmFja2VyICs9IGtleSArICIo
IisodHlwZW9mIGtleSkrIik6IiArIHRoaXM7IGN5Y2xlVHJhY2tlciArPSAic2Vjb25kLCI7IHJl
dHVybiB0aGlzOyB9fV07CisgICAgY3ljbGljQXJyYXlbMV0gPSBjeWNsaWNBcnJheTsKKyAgICBy
ZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgY3ljbGVUcmFja2VyID0g
IiI7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShjeWNsaWNBcnJheSk7Cisg
ICAgfSk7CisgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS50aHJvd3MgPSB0cnVlOworICAg
IHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAgICAgICBjeWNsZVRyYWNrZXIg
PSAiIjsKKyAgICAgICAgdHJ5IHsganNvbk9iamVjdC5zdHJpbmdpZnkoY3ljbGljQXJyYXkpOyB9
IGNhdGNoKGUpIHsgY3ljbGVUcmFja2VyICs9ICIgLT4gZXhjZXB0aW9uIiB9CisgICAgICAgIHJl
dHVybiBjeWNsZVRyYWNrZXI7CisgICAgfSk7CisgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAx
XS5leHBlY3RlZCA9ICIwKG51bWJlcik6W29iamVjdCBPYmplY3RdZmlyc3QsIC0+IGV4Y2VwdGlv
biI7CisgICAgZnVuY3Rpb24gY3JlYXRlQXJyYXkobGVuLCBvKSB7IHZhciByID0gW107IGZvciAo
dmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHJbaV0gPSBvOyByZXR1cm4gcjsgfQorICAgIHZhciBn
ZXR0ZXJDYWxsczsKKyAgICB2YXIgbWFnaWNPYmplY3QgPSBjcmVhdGVBcnJheSgxMCwge2FiY2Rl
Zmc6IFsxLDIsNSwiYWIiLCBudWxsLCB1bmRlZmluZWQsIHRydWUsIGZhbHNlLCxdLCAKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBjYWxscygpIHtyZXR1cm4gKytn
ZXR0ZXJDYWxsczsgfSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi
MTIzIjpjcmVhdGVBcnJheSgxNSwgImZvbyIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICIiOnthOiJiIn19KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29u
T2JqZWN0KXsKKyAgICAgICAgZ2V0dGVyQ2FsbHMgPSAwOworICAgICAgICByZXR1cm4ganNvbk9i
amVjdC5zdHJpbmdpZnkobWFnaWNPYmplY3QpICsgIiA6OiBnZXR0ZXIgY2FsbHMgPSAiICsgZ2V0
dGVyQ2FsbHM7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh1bmRlZmluZWQpOworICAgIH0p
OworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmplY3QpeworICAgICAgICByZXR1cm4g
anNvbk9iamVjdC5zdHJpbmdpZnkobnVsbCk7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVu
Y3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh7
dG9KU09OOmZ1bmN0aW9uKCl7IHJldHVybiB1bmRlZmluZWQ7IH19KTsKKyAgICB9KTsKKyAgICBy
ZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmpl
Y3Quc3RyaW5naWZ5KHt0b0pTT046ZnVuY3Rpb24oKXsgcmV0dXJuIG51bGw7IH19KTsKKyAgICB9
KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJu
IGpzb25PYmplY3Quc3RyaW5naWZ5KFt7dG9KU09OOmZ1bmN0aW9uKCl7IHJldHVybiB1bmRlZmlu
ZWQ7IH19XSk7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7
CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShbe3RvSlNPTjpmdW5jdGlvbigp
eyByZXR1cm4gbnVsbDsgfX1dKTsKKyAgICB9KTsKKyAgICByZXN1bHQucHVzaChmdW5jdGlvbihq
c29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHthOnt0b0pT
T046ZnVuY3Rpb24oKXsgcmV0dXJuIHVuZGVmaW5lZDsgfX19KTsKKyAgICB9KTsKKyAgICByZXN1
bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Qu
c3RyaW5naWZ5KHthOnt0b0pTT046ZnVuY3Rpb24oKXsgcmV0dXJuIG51bGw7IH19fSk7CisgICAg
fSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHZhciBk
ZWVwT2JqZWN0ID0ge307CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTYwMDsgaSsrKQor
ICAgICAgICAgICAgZGVlcE9iamVjdCA9IHtuZXh0OmRlZXBPYmplY3R9OworICAgICAgICByZXR1
cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoZGVlcE9iamVjdCk7CisgICAgfSk7CisgICAgcmVzdWx0
LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIHZhciBkZWVwQXJyYXkgPSBbXTsK
KyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjAwOyBpKyspCisgICAgICAgICAgICBkZWVw
QXJyYXkgPSBbZGVlcEFycmF5XTsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5
KGRlZXBBcnJheSk7CisgICAgfSk7CisgICAgcmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVj
dCl7CisgICAgICAgIGZ1bmN0aW9uIHRvSW5maW5pdGVKU09OT2JqZWN0KCkgeworICAgICAgICAg
ICAgdmFyIHIgPSB7fTsKKyAgICAgICAgICAgIHIudG9KU09OID0gdG9JbmZpbml0ZUpTT05PYmpl
Y3Q7CisgICAgICAgICAgICByZXR1cm4ge3JlY3Vyc2U6IHJ9OworICAgICAgICB9CisgICAgICAg
IHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh0b0luZmluaXRlSlNPTk9iamVjdCgpKTsKKyAg
ICB9KTsKKyAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLnRocm93cyA9IHRydWU7CisgICAg
cmVzdWx0LnB1c2goZnVuY3Rpb24oanNvbk9iamVjdCl7CisgICAgICAgIGZ1bmN0aW9uIHRvSW5m
aW5pdGVKU09OQXJyYXkoKSB7CisgICAgICAgICAgICB2YXIgciA9IFtdOworICAgICAgICAgICAg
ci50b0pTT04gPSB0b0luZmluaXRlSlNPTkFycmF5OworICAgICAgICAgICAgcmV0dXJuIFtyXTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkodG9JbmZpbml0
ZUpTT05BcnJheSgpKTsKKyAgICB9KTsKKyAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLnRo
cm93cyA9IHRydWU7CisgICAgdmFyIGZ1bGxDaGFyc2V0U3RyaW5nID0gIiI7CisgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKQorICAgICAgICBmdWxsQ2hhcnNldFN0cmluZyArPSBT
dHJpbmcuZnJvbUNoYXJDb2RlKGkpOworICAgIHJlc3VsdC5wdXNoKGZ1bmN0aW9uKGpzb25PYmpl
Y3QpeworICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoZnVsbENoYXJzZXRTdHJp
bmcpOworICAgIH0pOyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQordmFyIHRlc3RzID0gY3Jl
YXRlVGVzdHMoKTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHsKKyAg
ICB0cnkgeworICAgICAgICBkZWJ1Zyh0ZXN0c1tpXSk7CisgICAgICAgIGlmICh0ZXN0c1tpXS50
aHJvd3MpCisgICAgICAgICAgICBzaG91bGRUaHJvdygndGVzdHNbaV0obmF0aXZlSlNPTiknKTsK
KyAgICAgICAgZWxzZSBpZiAodGVzdHNbaV0uZXhwZWN0ZWQpCisgICAgICAgICAgICBzaG91bGRC
ZSgndGVzdHNbaV0obmF0aXZlSlNPTiknLCAgJ3Rlc3RzW2ldLmV4cGVjdGVkJykKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgc2hvdWxkQmUoJ3Rlc3RzW2ldKG5hdGl2ZUpTT04pJywgICd0ZXN0
c1tpXShKU09OKScpOworICAgIH1jYXRjaChlKXt9Cit9CitzdWNjZXNzZnVsbHlQYXJzZWQgPSB0
cnVlOworCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L2pzL3Jlc291cmNlcy9qc29uMi1l
czUtY29tcGF0LmpzIGIvTGF5b3V0VGVzdHMvZmFzdC9qcy9yZXNvdXJjZXMvanNvbjItZXM1LWNv
bXBhdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI0NmM2Ci0tLSAv
ZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9qcy9yZXNvdXJjZXMvanNvbjItZXM1LWNv
bXBhdC5qcwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAgICBodHRwOi8vd3d3LkpTT04ub3JnL2pz
b24yLmpzCisgICAgMjAwOS0wNC0xNgorCisgICAgUHVibGljIERvbWFpbi4KKworICAgIE5PIFdB
UlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KKworICAg
IFNlZSBodHRwOi8vd3d3LkpTT04ub3JnL2pzLmh0bWwKKworICAgIFRoaXMgZmlsZSBjcmVhdGVz
IGEgZ2xvYmFsIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIG1ldGhvZHM6IHN0cmluZ2lmeQor
ICAgIGFuZCBwYXJzZS4KKworICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIs
IHNwYWNlKQorICAgICAgICAgICAgdmFsdWUgICAgICAgYW55IEphdmFTY3JpcHQgdmFsdWUsIHVz
dWFsbHkgYW4gb2JqZWN0IG9yIGFycmF5LgorCisgICAgICAgICAgICByZXBsYWNlciAgICBhbiBv
cHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBkZXRlcm1pbmVzIGhvdyBvYmplY3QKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHZhbHVlcyBhcmUgc3RyaW5naWZpZWQgZm9yIG9iamVjdHMuIEl0IGNhbiBi
ZSBhCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdHJp
bmdzLgorCisgICAgICAgICAgICBzcGFjZSAgICAgICBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhh
dCBzcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBvZiBu
ZXN0ZWQgc3RydWN0dXJlcy4gSWYgaXQgaXMgb21pdHRlZCwgdGhlIHRleHQgd2lsbAorICAgICAg
ICAgICAgICAgICAgICAgICAgYmUgcGFja2VkIHdpdGhvdXQgZXh0cmEgd2hpdGVzcGFjZS4gSWYg
aXQgaXMgYSBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIHNwZWNpZnkg
dGhlIG51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGF0IGVhY2gKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGxldmVsLiBJZiBpdCBpcyBhIHN0cmluZyAoc3VjaCBhcyAnXHQnIG9yICcmbmJzcDsn
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIHVz
ZWQgdG8gaW5kZW50IGF0IGVhY2ggbGV2ZWwuCisKKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIHBy
b2R1Y2VzIGEgSlNPTiB0ZXh0IGZyb20gYSBKYXZhU2NyaXB0IHZhbHVlLgorCisgICAgICAgICAg
ICBXaGVuIGFuIG9iamVjdCB2YWx1ZSBpcyBmb3VuZCwgaWYgdGhlIG9iamVjdCBjb250YWlucyBh
IHRvSlNPTgorICAgICAgICAgICAgbWV0aG9kLCBpdHMgdG9KU09OIG1ldGhvZCB3aWxsIGJlIGNh
bGxlZCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlCisgICAgICAgICAgICBzdHJpbmdpZmllZC4gQSB0
b0pTT04gbWV0aG9kIGRvZXMgbm90IHNlcmlhbGl6ZTogaXQgcmV0dXJucyB0aGUKKyAgICAgICAg
ICAgIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBuYW1lL3ZhbHVlIHBhaXIgdGhhdCBzaG91bGQg
YmUgc2VyaWFsaXplZCwKKyAgICAgICAgICAgIG9yIHVuZGVmaW5lZCBpZiBub3RoaW5nIHNob3Vs
ZCBiZSBzZXJpYWxpemVkLiBUaGUgdG9KU09OIG1ldGhvZAorICAgICAgICAgICAgd2lsbCBiZSBw
YXNzZWQgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlLCBhbmQgdGhpcyB3aWxsIGJl
CisgICAgICAgICAgICBib3VuZCB0byB0aGUgb2JqZWN0IGhvbGRpbmcgdGhlIGtleS4KKworICAg
ICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgc2VyaWFsaXplIERhdGVzIGFzIElTTyBz
dHJpbmdzLgorCisgICAgICAgICAgICAgICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rp
b24gKGtleSkgeworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKG4pIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBpbnRlZ2VycyB0byBoYXZlIGF0IGxlYXN0IHR3byBk
aWdpdHMuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6
IG47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dGhpcy5nZXRVVENGdWxsWWVhcigpICAgKyAnLScgKworICAgICAgICAgICAgICAgICAgICAgICAg
IGYodGhpcy5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKworICAgICAgICAgICAgICAgICAgICAg
ICAgIGYodGhpcy5nZXRVVENEYXRlKCkpICAgICAgKyAnVCcgKworICAgICAgICAgICAgICAgICAg
ICAgICAgIGYodGhpcy5nZXRVVENIb3VycygpKSAgICAgKyAnOicgKworICAgICAgICAgICAgICAg
ICAgICAgICAgIGYodGhpcy5nZXRVVENNaW51dGVzKCkpICAgKyAnOicgKworICAgICAgICAgICAg
ICAgICAgICAgICAgIGYodGhpcy5nZXRVVENTZWNvbmRzKCkpICAgKyAnWic7CisgICAgICAgICAg
ICAgICAgfTsKKworICAgICAgICAgICAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIHJlcGxh
Y2VyIG1ldGhvZC4gSXQgd2lsbCBiZSBwYXNzZWQgdGhlCisgICAgICAgICAgICBrZXkgYW5kIHZh
bHVlIG9mIGVhY2ggbWVtYmVyLCB3aXRoIHRoaXMgYm91bmQgdG8gdGhlIGNvbnRhaW5pbmcKKyAg
ICAgICAgICAgIG9iamVjdC4gVGhlIHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB5b3VyIG1l
dGhvZCB3aWxsIGJlCisgICAgICAgICAgICBzZXJpYWxpemVkLiBJZiB5b3VyIG1ldGhvZCByZXR1
cm5zIHVuZGVmaW5lZCwgdGhlbiB0aGUgbWVtYmVyIHdpbGwKKyAgICAgICAgICAgIGJlIGV4Y2x1
ZGVkIGZyb20gdGhlIHNlcmlhbGl6YXRpb24uCisKKyAgICAgICAgICAgIElmIHRoZSByZXBsYWNl
ciBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgdGhlbiBpdCB3aWxsIGJlCisgICAg
ICAgICAgICB1c2VkIHRvIHNlbGVjdCB0aGUgbWVtYmVycyB0byBiZSBzZXJpYWxpemVkLiBJdCBm
aWx0ZXJzIHRoZSByZXN1bHRzCisgICAgICAgICAgICBzdWNoIHRoYXQgb25seSBtZW1iZXJzIHdp
dGgga2V5cyBsaXN0ZWQgaW4gdGhlIHJlcGxhY2VyIGFycmF5IGFyZQorICAgICAgICAgICAgc3Ry
aW5naWZpZWQuCisKKyAgICAgICAgICAgIFZhbHVlcyB0aGF0IGRvIG5vdCBoYXZlIEpTT04gcmVw
cmVzZW50YXRpb25zLCBzdWNoIGFzIHVuZGVmaW5lZCBvcgorICAgICAgICAgICAgZnVuY3Rpb25z
LCB3aWxsIG5vdCBiZSBzZXJpYWxpemVkLiBTdWNoIHZhbHVlcyBpbiBvYmplY3RzIHdpbGwgYmUK
KyAgICAgICAgICAgIGRyb3BwZWQ7IGluIGFycmF5cyB0aGV5IHdpbGwgYmUgcmVwbGFjZWQgd2l0
aCBudWxsLiBZb3UgY2FuIHVzZQorICAgICAgICAgICAgYSByZXBsYWNlciBmdW5jdGlvbiB0byBy
ZXBsYWNlIHRob3NlIHdpdGggSlNPTiB2YWx1ZXMuCisgICAgICAgICAgICBKU09OLnN0cmluZ2lm
eSh1bmRlZmluZWQpIHJldHVybnMgdW5kZWZpbmVkLgorCisgICAgICAgICAgICBUaGUgb3B0aW9u
YWwgc3BhY2UgcGFyYW1ldGVyIHByb2R1Y2VzIGEgc3RyaW5naWZpY2F0aW9uIG9mIHRoZQorICAg
ICAgICAgICAgdmFsdWUgdGhhdCBpcyBmaWxsZWQgd2l0aCBsaW5lIGJyZWFrcyBhbmQgaW5kZW50
YXRpb24gdG8gbWFrZSBpdAorICAgICAgICAgICAgZWFzaWVyIHRvIHJlYWQuCisKKyAgICAgICAg
ICAgIElmIHRoZSBzcGFjZSBwYXJhbWV0ZXIgaXMgYSBub24tZW1wdHkgc3RyaW5nLCB0aGVuIHRo
YXQgc3RyaW5nIHdpbGwKKyAgICAgICAgICAgIGJlIHVzZWQgZm9yIGluZGVudGF0aW9uLiBJZiB0
aGUgc3BhY2UgcGFyYW1ldGVyIGlzIGEgbnVtYmVyLCB0aGVuCisgICAgICAgICAgICB0aGUgaW5k
ZW50YXRpb24gd2lsbCBiZSB0aGF0IG1hbnkgc3BhY2VzLgorCisgICAgICAgICAgICBFeGFtcGxl
OgorCisgICAgICAgICAgICB0ZXh0ID0gSlNPTi5zdHJpbmdpZnkoWydlJywge3BsdXJpYnVzOiAn
dW51bSd9XSk7CisgICAgICAgICAgICAvLyB0ZXh0IGlzICdbImUiLHsicGx1cmlidXMiOiJ1bnVt
In1dJworCisKKyAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShbJ2UnLCB7cGx1cmli
dXM6ICd1bnVtJ31dLCBudWxsLCAnXHQnKTsKKyAgICAgICAgICAgIC8vIHRleHQgaXMgJ1tcblx0
ImUiLFxuXHR7XG5cdFx0InBsdXJpYnVzIjogInVudW0iXG5cdH1cbl0nCisKKyAgICAgICAgICAg
IHRleHQgPSBKU09OLnN0cmluZ2lmeShbbmV3IERhdGUoKV0sIGZ1bmN0aW9uIChrZXksIHZhbHVl
KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba2V5XSBpbnN0YW5jZW9mIERhdGUgPwor
ICAgICAgICAgICAgICAgICAgICAnRGF0ZSgnICsgdGhpc1trZXldICsgJyknIDogdmFsdWU7Cisg
ICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIC8vIHRleHQgaXMgJ1siRGF0ZSgtLS1jdXJyZW50
IHRpbWUtLS0pIl0nCisKKworICAgICAgICBKU09OLnBhcnNlKHRleHQsIHJldml2ZXIpCisgICAg
ICAgICAgICBUaGlzIG1ldGhvZCBwYXJzZXMgYSBKU09OIHRleHQgdG8gcHJvZHVjZSBhbiBvYmpl
Y3Qgb3IgYXJyYXkuCisgICAgICAgICAgICBJdCBjYW4gdGhyb3cgYSBTeW50YXhFcnJvciBleGNl
cHRpb24uCisKKyAgICAgICAgICAgIFRoZSBvcHRpb25hbCByZXZpdmVyIHBhcmFtZXRlciBpcyBh
IGZ1bmN0aW9uIHRoYXQgY2FuIGZpbHRlciBhbmQKKyAgICAgICAgICAgIHRyYW5zZm9ybSB0aGUg
cmVzdWx0cy4gSXQgcmVjZWl2ZXMgZWFjaCBvZiB0aGUga2V5cyBhbmQgdmFsdWVzLAorICAgICAg
ICAgICAgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5h
bCB2YWx1ZS4KKyAgICAgICAgICAgIElmIGl0IHJldHVybnMgd2hhdCBpdCByZWNlaXZlZCwgdGhl
biB0aGUgc3RydWN0dXJlIGlzIG5vdCBtb2RpZmllZC4KKyAgICAgICAgICAgIElmIGl0IHJldHVy
bnMgdW5kZWZpbmVkIHRoZW4gdGhlIG1lbWJlciBpcyBkZWxldGVkLgorCisgICAgICAgICAgICBF
eGFtcGxlOgorCisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgdGV4dC4gVmFsdWVzIHRoYXQgbG9v
ayBsaWtlIElTTyBkYXRlIHN0cmluZ3Mgd2lsbAorICAgICAgICAgICAgLy8gYmUgY29udmVydGVk
IHRvIERhdGUgb2JqZWN0cy4KKworICAgICAgICAgICAgbXlEYXRhID0gSlNPTi5wYXJzZSh0ZXh0
LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHZhciBhOworICAgICAg
ICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAg
ICAgICAgIGEgPQorL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KVQoXGR7Mn0pOihcZHsyfSk6KFxk
ezJ9KD86XC5cZCopPylaJC8uZXhlYyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChh
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoK2Fb
MV0sICthWzJdIC0gMSwgK2FbM10sICthWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICthWzVdLCArYVs2XSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0pOworCisgICAg
ICAgICAgICBteURhdGEgPSBKU09OLnBhcnNlKCdbIkRhdGUoMDkvMDkvMjAwMSkiXScsIGZ1bmN0
aW9uIChrZXksIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgdmFyIGQ7CisgICAgICAgICAgICAg
ICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHZhbHVlLnNsaWNlKDAsIDUpID09PSAnRGF0ZSgnICYmCisgICAgICAgICAgICAgICAgICAg
ICAgICB2YWx1ZS5zbGljZSgtMSkgPT09ICcpJykgeworICAgICAgICAgICAgICAgICAgICBkID0g
bmV3IERhdGUodmFsdWUuc2xpY2UoNSwgLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAg
ICAgICAgICAgIH0pOworCisKKyAgICBUaGlzIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9u
LiBZb3UgYXJlIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBvcgorICAgIHJlZGlzdHJpYnV0ZS4KKwor
ICAgIFRoaXMgY29kZSBzaG91bGQgYmUgbWluaWZpZWQgYmVmb3JlIGRlcGxveW1lbnQuCisgICAg
U2VlIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vanNtaW4uaHRtbAorCisgICAgVVNF
IFlPVVIgT1dOIENPUFkuIElUIElTIEVYVFJFTUVMWSBVTldJU0UgVE8gTE9BRCBDT0RFIEZST00g
U0VSVkVSUyBZT1UgRE8KKyAgICBOT1QgQ09OVFJPTC4KKyovCisKKy8qanNsaW50IGV2aWw6IHRy
dWUgKi8KKworLypnbG9iYWwgSlNPTiAqLworCisvKm1lbWJlcnMgIiIsICJcYiIsICJcdCIsICJc
biIsICJcZiIsICJcciIsICJcIiIsIEpTT04sICJcXCIsIGFwcGx5LAorICAgIGNhbGwsIGNoYXJD
b2RlQXQsIGdldFVUQ0RhdGUsIGdldFVUQ0Z1bGxZZWFyLCBnZXRVVENIb3VycywKKyAgICBnZXRV
VENNaW51dGVzLCBnZXRVVENNb250aCwgZ2V0VVRDU2Vjb25kcywgaGFzT3duUHJvcGVydHksIGpv
aW4sCisgICAgbGFzdEluZGV4LCBsZW5ndGgsIHBhcnNlLCBwcm90b3R5cGUsIHB1c2gsIHJlcGxh
Y2UsIHNsaWNlLCBzdHJpbmdpZnksCisgICAgdGVzdCwgdG9KU09OLCB0b1N0cmluZywgdmFsdWVP
ZgorKi8KKworLy8gQ3JlYXRlIGEgSlNPTiBvYmplY3Qgb25seSBpZiBvbmUgZG9lcyBub3QgYWxy
ZWFkeSBleGlzdC4gV2UgY3JlYXRlIHRoZQorLy8gbWV0aG9kcyBpbiBhIGNsb3N1cmUgdG8gYXZv
aWQgY3JlYXRpbmcgZ2xvYmFsIHZhcmlhYmxlcy4KKworaWYgKCF0aGlzLkpTT04pIHsKKyAgICBK
U09OID0ge307Cit9CisoZnVuY3Rpb24gKCkgeworCisgICAgZnVuY3Rpb24gZihuKSB7CisgICAg
ICAgIC8vIEZvcm1hdCBpbnRlZ2VycyB0byBoYXZlIGF0IGxlYXN0IHR3byBkaWdpdHMuCisgICAg
ICAgIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsKKyAgICB9CisKKyAgICBpZiAodHlwZW9m
IERhdGUucHJvdG90eXBlLnRvSlNPTiAhPT0gJ2Z1bmN0aW9uJykgeworCisgICAgICAgIERhdGUu
cHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIChrZXkpIHsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXMuZ2V0VVRDRnVsbFllYXIoKSAgICsgJy0nICsKKyAgICAgICAgICAgICAgICAgZih0aGlz
LmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArCisgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRV
VENEYXRlKCkpICAgICAgKyAnVCcgKworICAgICAgICAgICAgICAgICBmKHRoaXMuZ2V0VVRDSG91
cnMoKSkgICAgICsgJzonICsKKyAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01pbnV0ZXMo
KSkgICArICc6JyArCisgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENTZWNvbmRzKCkpICAg
KyAnWic7CisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nLnByb3RvdHlwZS50b0pTT04gPQor
ICAgICAgICBOdW1iZXIucHJvdG90eXBlLnRvSlNPTiA9CisgICAgICAgIEJvb2xlYW4ucHJvdG90
eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnZh
bHVlT2YoKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICB2YXIgY3ggPSAvW1x1MDAwMFx1MDBh
ZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAy
Zlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLAorICAgICAgICBlc2NhcGFibGUg
PSAvW1xcXCJceDAwLVx4MWZdL2csCisgICAgICAgIGdhcCwKKyAgICAgICAgaW5kZW50LAorICAg
ICAgICBtZXRhID0geyAgICAvLyB0YWJsZSBvZiBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9ucworICAg
ICAgICAgICAgJ1xiJzogJ1xcYicsCisgICAgICAgICAgICAnXHQnOiAnXFx0JywKKyAgICAgICAg
ICAgICdcbic6ICdcXG4nLAorICAgICAgICAgICAgJ1xmJzogJ1xcZicsCisgICAgICAgICAgICAn
XHInOiAnXFxyJywKKyAgICAgICAgICAgICciJyA6ICdcXCInLAorICAgICAgICAgICAgJ1xcJzog
J1xcXFwnCisgICAgICAgIH0sCisgICAgICAgIHJlcDsKKworCisgICAgZnVuY3Rpb24gcXVvdGUo
c3RyaW5nKSB7CisKKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gY29udHJvbCBjaGFyYWN0
ZXJzLCBubyBxdW90ZSBjaGFyYWN0ZXJzLCBhbmQgbm8KKy8vIGJhY2tzbGFzaCBjaGFyYWN0ZXJz
LCB0aGVuIHdlIGNhbiBzYWZlbHkgc2xhcCBzb21lIHF1b3RlcyBhcm91bmQgaXQuCisvLyBPdGhl
cndpc2Ugd2UgbXVzdCBhbHNvIHJlcGxhY2UgdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXJzIHdpdGgg
c2FmZSBlc2NhcGUKKy8vIHNlcXVlbmNlcy4KKworICAgICAgICBlc2NhcGFibGUubGFzdEluZGV4
ID0gMDsKKyAgICAgICAgcmV0dXJuIGVzY2FwYWJsZS50ZXN0KHN0cmluZykgPworICAgICAgICAg
ICAgJyInICsgc3RyaW5nLnJlcGxhY2UoZXNjYXBhYmxlLCBmdW5jdGlvbiAoYSkgeworICAgICAg
ICAgICAgICAgIHZhciBjID0gbWV0YVthXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9m
IGMgPT09ICdzdHJpbmcnID8gYyA6CisgICAgICAgICAgICAgICAgICAgICdcXHUnICsgKCcwMDAw
JyArIGEuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsKKyAgICAgICAgICAg
IH0pICsgJyInIDoKKyAgICAgICAgICAgICciJyArIHN0cmluZyArICciJzsKKyAgICB9CisKKwor
ICAgIGZ1bmN0aW9uIHN0cihrZXksIGhvbGRlcikgeworCisvLyBQcm9kdWNlIGEgc3RyaW5nIGZy
b20gaG9sZGVyW2tleV0uCisKKyAgICAgICAgdmFyIGksICAgICAgICAgIC8vIFRoZSBsb29wIGNv
dW50ZXIuCisgICAgICAgICAgICBrLCAgICAgICAgICAvLyBUaGUgbWVtYmVyIGtleS4KKyAgICAg
ICAgICAgIHYsICAgICAgICAgIC8vIFRoZSBtZW1iZXIgdmFsdWUuCisgICAgICAgICAgICBsZW5n
dGgsCisgICAgICAgICAgICBtaW5kID0gZ2FwLAorICAgICAgICAgICAgcGFydGlhbCwKKyAgICAg
ICAgICAgIHZhbHVlID0gaG9sZGVyW2tleV07CisKKy8vIElmIHRoZSB2YWx1ZSBoYXMgYSB0b0pT
T04gbWV0aG9kLCBjYWxsIGl0IHRvIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLgorCisgICAg
ICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmCisgICAgICAgICAg
ICAgICAgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgICAg
dmFsdWUgPSB2YWx1ZS50b0pTT04oa2V5KTsKKyAgICAgICAgfQorCisvLyBJZiB3ZSB3ZXJlIGNh
bGxlZCB3aXRoIGEgcmVwbGFjZXIgZnVuY3Rpb24sIHRoZW4gY2FsbCB0aGUgcmVwbGFjZXIgdG8K
Ky8vIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLgorCisgICAgICAgIGlmICh0eXBlb2YgcmVw
ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlcC5jYWxsKGhvbGRlciwg
a2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKworLy8gV2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBv
biB0aGUgdmFsdWUncyB0eXBlLgorCisgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7Cisg
ICAgICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICAgICAgICByZXR1cm4gcXVvdGUodmFsdWUpOwor
CisgICAgICAgIGNhc2UgJ251bWJlcic6CisKKy8vIEpTT04gbnVtYmVycyBtdXN0IGJlIGZpbml0
ZS4gRW5jb2RlIG5vbi1maW5pdGUgbnVtYmVycyBhcyBudWxsLgorCisgICAgICAgICAgICByZXR1
cm4gaXNGaW5pdGUodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6ICdudWxsJzsKKworICAgICAgICBj
YXNlICdib29sZWFuJzoKKyAgICAgICAgY2FzZSAnbnVsbCc6CisKKy8vIElmIHRoZSB2YWx1ZSBp
cyBhIGJvb2xlYW4gb3IgbnVsbCwgY29udmVydCBpdCB0byBhIHN0cmluZy4gTm90ZToKKy8vIHR5
cGVvZiBudWxsIGRvZXMgbm90IHByb2R1Y2UgJ251bGwnLiBUaGUgY2FzZSBpcyBpbmNsdWRlZCBo
ZXJlIGluCisvLyB0aGUgcmVtb3RlIGNoYW5jZSB0aGF0IHRoaXMgZ2V0cyBmaXhlZCBzb21lZGF5
LgorCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsKKworLy8gSWYgdGhlIHR5cGUg
aXMgJ29iamVjdCcsIHdlIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aCBhbiBvYmplY3Qgb3IgYW4gYXJy
YXkgb3IKKy8vIG51bGwuCisKKyAgICAgICAgY2FzZSAnb2JqZWN0JzoKKworLy8gRHVlIHRvIGEg
c3BlY2lmaWNhdGlvbiBibHVuZGVyIGluIEVDTUFTY3JpcHQsIHR5cGVvZiBudWxsIGlzICdvYmpl
Y3QnLAorLy8gc28gd2F0Y2ggb3V0IGZvciB0aGF0IGNhc2UuCisKKyAgICAgICAgICAgIGlmICgh
dmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnOworICAgICAgICAgICAgfQor
CisvLyBNYWtlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHBhcnRpYWwgcmVzdWx0cyBvZiBzdHJpbmdp
ZnlpbmcgdGhpcyBvYmplY3QgdmFsdWUuCisKKyAgICAgICAgICAgIGdhcCArPSBpbmRlbnQ7Cisg
ICAgICAgICAgICBwYXJ0aWFsID0gW107CisKKy8vIElzIHRoZSB2YWx1ZSBhbiBhcnJheT8KKwor
ICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09
PSAnW29iamVjdCBBcnJheV0nKSB7CisKKy8vIFRoZSB2YWx1ZSBpcyBhbiBhcnJheS4gU3RyaW5n
aWZ5IGV2ZXJ5IGVsZW1lbnQuIFVzZSBudWxsIGFzIGEgcGxhY2Vob2xkZXIKKy8vIGZvciBub24t
SlNPTiB2YWx1ZXMuCisKKyAgICAgICAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7Cisg
ICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CisgICAgICAg
ICAgICAgICAgICAgIHBhcnRpYWxbaV0gPSBzdHIoaSwgdmFsdWUpIHx8ICdudWxsJzsKKyAgICAg
ICAgICAgICAgICB9CisKKy8vIEpvaW4gYWxsIG9mIHRoZSBlbGVtZW50cyB0b2dldGhlciwgc2Vw
YXJhdGVkIHdpdGggY29tbWFzLCBhbmQgd3JhcCB0aGVtIGluCisvLyBicmFja2V0cy4KKworICAg
ICAgICAgICAgICAgIHYgPSBwYXJ0aWFsLmxlbmd0aCA9PT0gMCA/ICdbXScgOgorICAgICAgICAg
ICAgICAgICAgICBnYXAgPyAnW1xuJyArIGdhcCArCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcGFydGlhbC5qb2luKCcsXG4nICsgZ2FwKSArICdcbicgKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtaW5kICsgJ10nIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1sn
ICsgcGFydGlhbC5qb2luKCcsJykgKyAnXSc7CisgICAgICAgICAgICAgICAgZ2FwID0gbWluZDsK
KyAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgIH0KKworLy8gSWYgdGhlIHJl
cGxhY2VyIGlzIGFuIGFycmF5LCB1c2UgaXQgdG8gc2VsZWN0IHRoZSBtZW1iZXJzIHRvIGJlIHN0
cmluZ2lmaWVkLgorCisgICAgICAgICAgICBpZiAocmVwICYmIHR5cGVvZiByZXAgPT09ICdvYmpl
Y3QnKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcmVwLmxlbmd0aDsKKyAgICAgICAgICAg
ICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICAg
ICAgayA9IHJlcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrID09PSAnc3Ry
aW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHN0cihrLCB2YWx1ZSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAodikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHBhcnRpYWwucHVzaChxdW90ZShrKSArIChnYXAgPyAnOiAnIDogJzonKSArIHYpOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKworLy8gT3RoZXJ3aXNlLCBpdGVyYXRlIHRocm91
Z2ggYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBvYmplY3QuCisKKyAgICAgICAgICAgICAgICBmb3Ig
KGsgaW4gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9w
ZXJ0eS5jYWxsKHZhbHVlLCBrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHN0cihr
LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHBhcnRpYWwucHVzaChxdW90ZShrKSArIChnYXAgPyAnOiAnIDogJzon
KSArIHYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisvLyBKb2luIGFsbCBvZiB0aGUg
bWVtYmVyIHRleHRzIHRvZ2V0aGVyLCBzZXBhcmF0ZWQgd2l0aCBjb21tYXMsCisvLyBhbmQgd3Jh
cCB0aGVtIGluIGJyYWNlcy4KKworICAgICAgICAgICAgdiA9IHBhcnRpYWwubGVuZ3RoID09PSAw
ID8gJ3t9JyA6CisgICAgICAgICAgICAgICAgZ2FwID8gJ3tcbicgKyBnYXAgKyBwYXJ0aWFsLmpv
aW4oJyxcbicgKyBnYXApICsgJ1xuJyArCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5kICsg
J30nIDogJ3snICsgcGFydGlhbC5qb2luKCcsJykgKyAnfSc7CisgICAgICAgICAgICBnYXAgPSBt
aW5kOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisKKy8vIElmIHRo
ZSBKU09OIG9iamVjdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHN0cmluZ2lmeSBtZXRob2QsIGdpdmUg
aXQgb25lLgorCisgICAgaWYgKHR5cGVvZiBKU09OLnN0cmluZ2lmeSAhPT0gJ2Z1bmN0aW9uJykg
eworICAgICAgICBKU09OLnN0cmluZ2lmeSA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwbGFjZXIsIHNw
YWNlKSB7CisKKy8vIFRoZSBzdHJpbmdpZnkgbWV0aG9kIHRha2VzIGEgdmFsdWUgYW5kIGFuIG9w
dGlvbmFsIHJlcGxhY2VyLCBhbmQgYW4gb3B0aW9uYWwKKy8vIHNwYWNlIHBhcmFtZXRlciwgYW5k
IHJldHVybnMgYSBKU09OIHRleHQuIFRoZSByZXBsYWNlciBjYW4gYmUgYSBmdW5jdGlvbgorLy8g
dGhhdCBjYW4gcmVwbGFjZSB2YWx1ZXMsIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCB3aWxs
IHNlbGVjdCB0aGUga2V5cy4KKy8vIEEgZGVmYXVsdCByZXBsYWNlciBtZXRob2QgY2FuIGJlIHBy
b3ZpZGVkLiBVc2Ugb2YgdGhlIHNwYWNlIHBhcmFtZXRlciBjYW4KKy8vIHByb2R1Y2UgdGV4dCB0
aGF0IGlzIG1vcmUgZWFzaWx5IHJlYWRhYmxlLgorCisgICAgICAgICAgICB2YXIgaTsKKyAgICAg
ICAgICAgIGdhcCA9ICcnOworICAgICAgICAgICAgaW5kZW50ID0gJyc7CisKKy8vIElmIHRoZSBz
cGFjZSBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIG1ha2UgYW4gaW5kZW50IHN0cmluZyBjb250YWlu
aW5nIHRoYXQKKy8vIG1hbnkgc3BhY2VzLgorCisgICAgICAgICAgICBpZiAodHlwZW9mIHNwYWNl
ID09PSAnbnVtYmVyJykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGFjZTsg
aSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAnICc7CisgICAgICAgICAg
ICAgICAgfQorCisvLyBJZiB0aGUgc3BhY2UgcGFyYW1ldGVyIGlzIGEgc3RyaW5nLCBpdCB3aWxs
IGJlIHVzZWQgYXMgdGhlIGluZGVudCBzdHJpbmcuCisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAo
dHlwZW9mIHNwYWNlID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgIGluZGVudCA9IHNw
YWNlOworICAgICAgICAgICAgfQorCisvLyBJZiB0aGVyZSBpcyBhIHJlcGxhY2VyLCBpdCBtdXN0
IGJlIGEgZnVuY3Rpb24gb3IgYW4gYXJyYXkuCisvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9y
LgorCisgICAgICAgICAgICByZXAgPSByZXBsYWNlcjsKKyAgICAgICAgICAgIGlmIChyZXBsYWNl
ciAmJiB0eXBlb2YgcmVwbGFjZXIgIT09ICdmdW5jdGlvbicgJiYKKyAgICAgICAgICAgICAgICAg
ICAgKHR5cGVvZiByZXBsYWNlciAhPT0gJ29iamVjdCcgfHwKKyAgICAgICAgICAgICAgICAgICAg
IHR5cGVvZiByZXBsYWNlci5sZW5ndGggIT09ICdudW1iZXInKSkgeworICAgICAgICAgICAgICAg
IHRocm93IG5ldyBFcnJvcignSlNPTi5zdHJpbmdpZnknKTsKKyAgICAgICAgICAgIH0KKworLy8g
TWFrZSBhIGZha2Ugcm9vdCBvYmplY3QgY29udGFpbmluZyBvdXIgdmFsdWUgdW5kZXIgdGhlIGtl
eSBvZiAnJy4KKy8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHN0cmluZ2lmeWluZyB0aGUgdmFsdWUu
CisKKyAgICAgICAgICAgIHJldHVybiBzdHIoJycsIHsnJzogdmFsdWV9KTsKKyAgICAgICAgfTsK
KyAgICB9CisKKworLy8gSWYgdGhlIEpTT04gb2JqZWN0IGRvZXMgbm90IHlldCBoYXZlIGEgcGFy
c2UgbWV0aG9kLCBnaXZlIGl0IG9uZS4KKworICAgIGlmICh0eXBlb2YgSlNPTi5wYXJzZSAhPT0g
J2Z1bmN0aW9uJykgeworICAgICAgICBKU09OLnBhcnNlID0gZnVuY3Rpb24gKHRleHQsIHJldml2
ZXIpIHsKKworLy8gVGhlIHBhcnNlIG1ldGhvZCB0YWtlcyBhIHRleHQgYW5kIGFuIG9wdGlvbmFs
IHJldml2ZXIgZnVuY3Rpb24sIGFuZCByZXR1cm5zCisvLyBhIEphdmFTY3JpcHQgdmFsdWUgaWYg
dGhlIHRleHQgaXMgYSB2YWxpZCBKU09OIHRleHQuCisKKyAgICAgICAgICAgIHZhciBqOworCisg
ICAgICAgICAgICBmdW5jdGlvbiB3YWxrKGhvbGRlciwga2V5KSB7CisKKy8vIFRoZSB3YWxrIG1l
dGhvZCBpcyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmUg
c28KKy8vIHRoYXQgbW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZS4KKworICAgICAgICAgICAgICAg
IHZhciBrLCB2LCB2YWx1ZSA9IGhvbGRlcltrZXldOworICAgICAgICAgICAgICAgIGlmICh2YWx1
ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7CisgICAgICAgICAgICAgICAgICAgIGZv
ciAoayBpbiB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNP
d25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHYgPSB3YWxrKHZhbHVlLCBrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAh
PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2td
ID0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWVba107CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXZpdmVyLmNh
bGwoaG9sZGVyLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworCisvLyBQYXJzaW5nIGhh
cHBlbnMgaW4gZm91ciBzdGFnZXMuIEluIHRoZSBmaXJzdCBzdGFnZSwgd2UgcmVwbGFjZSBjZXJ0
YWluCisvLyBVbmljb2RlIGNoYXJhY3RlcnMgd2l0aCBlc2NhcGUgc2VxdWVuY2VzLiBKYXZhU2Ny
aXB0IGhhbmRsZXMgbWFueSBjaGFyYWN0ZXJzCisvLyBpbmNvcnJlY3RseSwgZWl0aGVyIHNpbGVu
dGx5IGRlbGV0aW5nIHRoZW0sIG9yIHRyZWF0aW5nIHRoZW0gYXMgbGluZSBlbmRpbmdzLgorCisg
ICAgICAgICAgICBjeC5sYXN0SW5kZXggPSAwOworICAgICAgICAgICAgaWYgKGN4LnRlc3QodGV4
dCkpIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGN4LCBmdW5jdGlvbiAo
YSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1xcdScgKworICAgICAgICAgICAgICAg
ICAgICAgICAgKCcwMDAwJyArIGEuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00
KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworLy8gSW4gdGhlIHNlY29u
ZCBzdGFnZSwgd2UgcnVuIHRoZSB0ZXh0IGFnYWluc3QgcmVndWxhciBleHByZXNzaW9ucyB0aGF0
IGxvb2sKKy8vIGZvciBub24tSlNPTiBwYXR0ZXJucy4gV2UgYXJlIGVzcGVjaWFsbHkgY29uY2Vy
bmVkIHdpdGggJygpJyBhbmQgJ25ldycKKy8vIGJlY2F1c2UgdGhleSBjYW4gY2F1c2UgaW52b2Nh
dGlvbiwgYW5kICc9JyBiZWNhdXNlIGl0IGNhbiBjYXVzZSBtdXRhdGlvbi4KKy8vIEJ1dCBqdXN0
IHRvIGJlIHNhZmUsIHdlIHdhbnQgdG8gcmVqZWN0IGFsbCB1bmV4cGVjdGVkIGZvcm1zLgorCisv
LyBXZSBzcGxpdCB0aGUgc2Vjb25kIHN0YWdlIGludG8gNCByZWdleHAgb3BlcmF0aW9ucyBpbiBv
cmRlciB0byB3b3JrIGFyb3VuZAorLy8gY3JpcHBsaW5nIGluZWZmaWNpZW5jaWVzIGluIElFJ3Mg
YW5kIFNhZmFyaSdzIHJlZ2V4cCBlbmdpbmVzLiBGaXJzdCB3ZQorLy8gcmVwbGFjZSB0aGUgSlNP
TiBiYWNrc2xhc2ggcGFpcnMgd2l0aCAnQCcgKGEgbm9uLUpTT04gY2hhcmFjdGVyKS4gU2Vjb25k
LCB3ZQorLy8gcmVwbGFjZSBhbGwgc2ltcGxlIHZhbHVlIHRva2VucyB3aXRoICddJyBjaGFyYWN0
ZXJzLiBUaGlyZCwgd2UgZGVsZXRlIGFsbAorLy8gb3BlbiBicmFja2V0cyB0aGF0IGZvbGxvdyBh
IGNvbG9uIG9yIGNvbW1hIG9yIHRoYXQgYmVnaW4gdGhlIHRleHQuIEZpbmFsbHksCisvLyB3ZSBs
b29rIHRvIHNlZSB0aGF0IHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgb25seSB3aGl0ZXNw
YWNlIG9yICddJyBvcgorLy8gJywnIG9yICc6JyBvciAneycgb3IgJ30nLiBJZiB0aGF0IGlzIHNv
LCB0aGVuIHRoZSB0ZXh0IGlzIHNhZmUgZm9yIGV2YWwuCisKKyAgICAgICAgICAgIGlmICgvXltc
XSw6e31cc10qJC8uCit0ZXN0KHRleHQucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlh
LWZBLUZdezR9KS9nLCAnQCcpLgorcmVwbGFjZSgvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51
bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csICddJykuCityZXBsYWNlKC8o
PzpefDp8LCkoPzpccypcWykrL2csICcnKSkpIHsKKworLy8gSW4gdGhlIHRoaXJkIHN0YWdlIHdl
IHVzZSB0aGUgZXZhbCBmdW5jdGlvbiB0byBjb21waWxlIHRoZSB0ZXh0IGludG8gYQorLy8gSmF2
YVNjcmlwdCBzdHJ1Y3R1cmUuIFRoZSAneycgb3BlcmF0b3IgaXMgc3ViamVjdCB0byBhIHN5bnRh
Y3RpYyBhbWJpZ3VpdHkKKy8vIGluIEphdmFTY3JpcHQ6IGl0IGNhbiBiZWdpbiBhIGJsb2NrIG9y
IGFuIG9iamVjdCBsaXRlcmFsLiBXZSB3cmFwIHRoZSB0ZXh0CisvLyBpbiBwYXJlbnMgdG8gZWxp
bWluYXRlIHRoZSBhbWJpZ3VpdHkuCisKKyAgICAgICAgICAgICAgICBqID0gZXZhbCgnKCcgKyB0
ZXh0ICsgJyknKTsKKworLy8gSW4gdGhlIG9wdGlvbmFsIGZvdXJ0aCBzdGFnZSwgd2UgcmVjdXJz
aXZlbHkgd2FsayB0aGUgbmV3IHN0cnVjdHVyZSwgcGFzc2luZworLy8gZWFjaCBuYW1lL3ZhbHVl
IHBhaXIgdG8gYSByZXZpdmVyIGZ1bmN0aW9uIGZvciBwb3NzaWJsZSB0cmFuc2Zvcm1hdGlvbi4K
KworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcmV2aXZlciA9PT0gJ2Z1bmN0aW9uJyA/
CisgICAgICAgICAgICAgICAgICAgIHdhbGsoeycnOiBqfSwgJycpIDogajsKKyAgICAgICAgICAg
IH0KKworLy8gSWYgdGhlIHRleHQgaXMgbm90IEpTT04gcGFyc2VhYmxlLCB0aGVuIGEgU3ludGF4
RXJyb3IgaXMgdGhyb3duLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0pT
T04ucGFyc2UnKTsKKyAgICAgICAgfTsKKyAgICB9Cit9KCkpOwo=
</data>
<flag name="review"
          id="15801"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>