<?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>74890</bug_id>
          
          <creation_ts>2011-12-19 15:02:12 -0800</creation_ts>
          <short_desc>Web Inspector: CodeGeneratorInspector.py: generate anonymous types.</short_desc>
          <delta_ts>2019-05-02 16:24:06 -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>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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>72861</dependson>
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Peter Rybin">peter.rybin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apavlov</cc>
    
    <cc>ap</cc>
    
    <cc>bweinstein</cc>
    
    <cc>claudiajhonson289</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>peter.rybin</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>ronaldthomas909</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>524209</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-19 15:02:12 -0800</bug_when>
    <thetext>Some types are anonymous in Inspector.JSON.
Provide type-safe API for them too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524214</commentid>
    <comment_count>1</comment_count>
      <attachid>119923</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-19 15:11:20 -0800</bug_when>
    <thetext>Created attachment 119923
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524215</commentid>
    <comment_count>2</comment_count>
      <attachid>119924</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-19 15:12:06 -0800</bug_when>
    <thetext>Created attachment 119924
Sample output</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524219</commentid>
    <comment_count>3</comment_count>
      <attachid>119926</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-19 15:13:23 -0800</bug_when>
    <thetext>Created attachment 119926
Sample output InspectorFrontend.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524501</commentid>
    <comment_count>4</comment_count>
      <attachid>119923</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-12-20 02:09:34 -0800</bug_when>
    <thetext>Comment on attachment 119923
Patch

Looks good. What does it do?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524744</commentid>
    <comment_count>5</comment_count>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-20 12:03:38 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 119923 [details])
&gt; Looks good. What does it do?

Let me describe it here a bit more.

In general it generates now C++ type for anonymous object types from JSON. It takes a name from the type declaration site, usually a parameter name. This all is explained comments in generated file. Also all generated types now refer to other generated types in setter methods — but this is commented out in generated code for now. All necessary forward declarations are also added. Anonymous enums are also generated, but they are in comments too, because we didn&apos;t have solution about form the enums should have in C++ API.

Internally:
The change reorganizes type bindings — a polymorphous &quot;code generator&quot; object is factored out from binding.
A helper class Writer is added to allow generating code with ajustable indentations and to support insertion points where additional code can be inserted retroactively.
ForwardListener class is used for preparing necessary forward declarations.
AdHocTypeContext conception is a speculative abstract class that is needed wherever anonymous type can emerge.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525176</commentid>
    <comment_count>6</comment_count>
    <who name="Yury Semikhatsky">yurys</who>
    <bug_when>2011-12-21 01:01:30 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; (From update of attachment 119923 [details] [details])
&gt; &gt; Looks good. What does it do?
&gt; 
&gt; Let me describe it here a bit more.
&gt; 
&gt; In general it generates now C++ type for anonymous object types from JSON. It takes a name from the type declaration site, usually a parameter name. This all is explained comments in generated file. Also all generated types now refer to other generated types in setter methods — but this is commented out in generated code for now. All necessary forward declarations are also added. Anonymous enums are also generated, but they are in comments too, because we didn&apos;t have solution about form the enums should have in C++ API.
&gt; 
&gt; Internally:
&gt; The change reorganizes type bindings — a polymorphous &quot;code generator&quot; object is factored out from binding.
&gt; A helper class Writer is added to allow generating code with ajustable indentations and to support insertion points where additional code can be inserted retroactively.
&gt; ForwardListener class is used for preparing necessary forward declarations.
&gt; AdHocTypeContext conception is a speculative abstract class that is needed wherever anonymous type can emerge.

This is a good message to be placed into the ChangeLog entry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525185</commentid>
    <comment_count>7</comment_count>
    <who name="Yury Semikhatsky">yurys</who>
    <bug_when>2011-12-21 01:19:02 -0800</bug_when>
    <thetext>What about typedef&apos;ed types such as BreakpointId and ScriptId? I see them declared but never used afterwards neither in comments nor in code. What prevents you from using them as corresponding parameter types e.g. in the following lines?

void scriptParsed(const String&amp; scriptId, const String&amp; url, int startLine, int startColumn, int endLine, int endColumn, const bool* const isContentScript)
void breakpointResolved(const String&amp; breakpointId, /*PassRefPtr&lt;TypeBuilder::Debugger::Location&gt;*/ PassRefPtr&lt;InspectorObject&gt; location);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525250</commentid>
    <comment_count>8</comment_count>
      <attachid>120175</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-21 06:43:43 -0800</bug_when>
    <thetext>Created attachment 120175
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525252</commentid>
    <comment_count>9</comment_count>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-21 06:48:22 -0800</bug_when>
    <thetext>Yury, you have a very sharp eye. Indeed this typedefs were intended for use as parameter types to make client code more consistent. The answer is that I just didn&apos;t have time to do it yet and that&apos;s in my TODO. I don&apos;t think it&apos;s a high-pri task right now.

(In reply to comment #7)
&gt; What about typedef&apos;ed types such as BreakpointId and ScriptId? I see them declared but never used afterwards neither in comments nor in code. What prevents you from using them as corresponding parameter types e.g. in the following lines?
&gt; 
&gt; void scriptParsed(const String&amp; scriptId, const String&amp; url, int startLine, int startColumn, int endLine, int endColumn, const bool* const isContentScript)
&gt; void breakpointResolved(const String&amp; breakpointId, /*PassRefPtr&lt;TypeBuilder::Debugger::Location&gt;*/ PassRefPtr&lt;InspectorObject&gt; location);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526092</commentid>
    <comment_count>10</comment_count>
      <attachid>120175</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-22 01:22:12 -0800</bug_when>
    <thetext>Comment on attachment 120175
Patch

Clearing flags on attachment: 120175

Committed r103503: &lt;http://trac.webkit.org/changeset/103503&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526093</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-22 01:22:17 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119923</attachid>
            <date>2011-12-19 15:11:20 -0800</date>
            <delta_ts>2011-12-21 06:43:15 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74890-20111220031118.patch</filename>
            <type>text/plain</type>
            <size>40016</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMjQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzVjNWI1NzM1MThmYzMz
NGJmYzM3NDMxYThkN2FlN2Q1MTcwY2FlOC4uODY4MzdkYjE2MDUyYWUyN2FjMDliNzRiMDdjOGVi
MmRmOTg0Y2FiYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkxIEBACisyMDExLTEyLTE5ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiBnZW5lcmF0ZSBhbm9ueW1vdXMgdHlwZXMuCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDg5MAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFub255bW91cyB0
eXBlcyBhcmUgZ2VuZXJhdGVkLiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBhcmUgZ2VuZXJhdGVkLgor
CisgICAgICAgICogaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHk6CisgICAgICAg
IChmaXhfdHlwZV9uYW1lLlJlc3VsdC5vdXRwdXRfY29tbWVudCk6CisgICAgICAgIChXcml0ZXIu
X19pbml0X18pOgorICAgICAgICAoV3JpdGVyLm5ld2xpbmUpOgorICAgICAgICAoV3JpdGVyLmFw
cGVuZCk6CisgICAgICAgIChXcml0ZXIubmV3bGluZV9tdWx0aWxpbmUpOgorICAgICAgICAoV3Jp
dGVyLmFwcGVuZF9tdWx0aWxpbmUpOgorICAgICAgICAoV3JpdGVyLmdldF9pbmRlbnRlZCk6Cisg
ICAgICAgIChXcml0ZXIpOgorICAgICAgICAoV3JpdGVyLmluc2VydF93cml0ZXIpOgorICAgICAg
ICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkhlbHBlci53cml0
ZV9kb2MpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9uYW1lZF90eXBlX2RlY2xhcmF0
aW9uLkhlbHBlcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX25hbWVkX3R5cGVfZGVj
bGFyYXRpb24uSGVscGVyLmFkZF90b19mb3J3YXJkX2xpc3RlbmVyKToKKyAgICAgICAgKFR5cGVC
aW5kaW5ncy5jcmVhdGVfbmFtZWRfdHlwZV9kZWNsYXJhdGlvbik6CisgICAgICAgIChUeXBlQmlu
ZGluZ3MuY3JlYXRlX2FkX2hvY190eXBlX2RlY2xhcmF0aW9uLkhlbHBlci53cml0ZV9kb2MpOgor
ICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9hZF9ob2NfdHlwZV9kZWNsYXJhdGlvbi5IZWxw
ZXIpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9hZF9ob2NfdHlwZV9kZWNsYXJhdGlv
bi5IZWxwZXIuYWRkX3RvX2ZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAoVHlwZUJpbmRpbmdz
LmNyZWF0ZV9hZF9ob2NfdHlwZV9kZWNsYXJhdGlvbik6CisgICAgICAgIChUeXBlQmluZGluZ3Mu
Y3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkVudW1CaW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvci5D
b2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChUeXBlQmluZGlu
Z3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkVudW1CaW5kaW5nLmdldF9jb2RlX2dlbmVyYXRv
ci5Db2RlR2VuZXJhdG9yKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNs
YXJhdGlvbl8uRW51bUJpbmRpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IucmVn
aXN0ZXJfdXNlKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlv
bl8uRW51bUJpbmRpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yKToKKyAgICAgICAgKFR5cGVCaW5kaW5n
cy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8uUGxhaW5TdHJpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9y
LkNvZGVHZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyLlN0cmluZyk6CisgICAgICAgIChU
eXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLlBsYWluU3RyaW5nLmdldF9jb2Rl
X2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAg
IChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLlBsYWluU3RyaW5nLmdldF9j
b2RlX2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVh
dGVfdHlwZV9kZWNsYXJhdGlvbl8uUGxhaW5TdHJpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yLkNvZGVH
ZW5lcmF0b3IucmVnaXN0ZXJfdXNlKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlw
ZV9kZWNsYXJhdGlvbl8uUGxhaW5TdHJpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yKToKKyAgICAgICAg
KFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8uUGxhaW5TdHJpbmcuZ2V0X2lu
X2NfdHlwZV90ZXh0Lm5hbWUpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2Rl
Y2xhcmF0aW9uXy5QbGFpblN0cmluZyk6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5
cGVfZGVjbGFyYXRpb25fKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNs
YXJhdGlvbl8uQ2xhc3NCaW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvcik6CisgICAgICAgIChUeXBl
QmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkNsYXNzQmluZGluZy5nZXRfY29kZV9n
ZW5lcmF0b3IuQ29kZUdlbmVyYXRvcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5
cGVfZGVjbGFyYXRpb25fLkNsYXNzQmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVy
YXRvci5nZW5lcmF0ZV90eXBlX2J1aWxkZXIpOgorICAgICAgICAoQWRIb2NUeXBlQ29udGV4dElt
cGwuX19pbml0X18pOgorICAgICAgICAoQWRIb2NUeXBlQ29udGV4dEltcGwuZ2V0X3R5cGVfbmFt
ZV9maXguTmFtZUZpeCk6CisgICAgICAgIChBZEhvY1R5cGVDb250ZXh0SW1wbC5nZXRfdHlwZV9u
YW1lX2ZpeC5OYW1lRml4Lm91dHB1dF9jb21tZW50KToKKyAgICAgICAgKEFkSG9jVHlwZUNvbnRl
eHRJbXBsLmdldF90eXBlX25hbWVfZml4KToKKyAgICAgICAgKEFkSG9jVHlwZUNvbnRleHRJbXBs
KToKKyAgICAgICAgKEFkSG9jVHlwZUNvbnRleHRJbXBsLmNhbGxfZ2VuZXJhdGVfdHlwZV9idWls
ZGVyKToKKyAgICAgICAgKGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24pOgorICAgICAgICAo
cmVnaXN0ZXJfdXNlKToKKyAgICAgICAgKGdldF9pbl9jX3R5cGVfdGV4dCk6CisgICAgICAgIChy
ZWR1Y2VfdG9fcmF3X3R5cGUpOgorICAgICAgICAoUGxhaW5PYmplY3RCaW5kaW5nLmdldF9jb2Rl
X2dlbmVyYXRvcik6CisgICAgICAgIChDb2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRl
ci5BZEhvY1R5cGVDb250ZXh0LmdldF90eXBlX25hbWVfZml4Lk5hbWVGaXgpOgorICAgICAgICAo
Q29kZUdlbmVyYXRvci5nZW5lcmF0ZV90eXBlX2J1aWxkZXIuQWRIb2NUeXBlQ29udGV4dC5nZXRf
dHlwZV9uYW1lX2ZpeC5OYW1lRml4Lm91dHB1dF9jb21tZW50KToKKyAgICAgICAgKENvZGVHZW5l
cmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyLkFkSG9jVHlwZUNvbnRleHQuZ2V0X3R5cGVfbmFt
ZV9maXgpOgorICAgICAgICAoQ29kZUdlbmVyYXRvci5nZW5lcmF0ZV90eXBlX2J1aWxkZXIuQWRI
b2NUeXBlQ29udGV4dCk6CisgICAgICAgIChDb2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVp
bGRlci5BZEhvY1R5cGVDb250ZXh0LmNhbGxfZ2VuZXJhdGVfdHlwZV9idWlsZGVyKToKKyAgICAg
ICAgKENvZGVHZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKToKKyAgICAgICAgKENvZGVH
ZW5lcmF0b3IpOgorICAgICAgICAoQ29kZUdlbmVyYXRvci5yZWdpc3Rlcl91c2UpOgorICAgICAg
ICAoUmF3VHlwZXNCaW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvcik6CisgICAgICAgIChSYXdUeXBl
c0JpbmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFJhd1R5cGVzQmluZGluZyk6
CisgICAgICAgIChSYXdUeXBlc0JpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAgICAg
KFR5cGVEYXRhLl9faW5pdF9fKToKKyAgICAgICAgKFR5cGVEYXRhLmdldF9qc29uX3R5cGUpOgor
ICAgICAgICAocmVzb2x2ZV9wYXJhbV90eXBlKToKKyAgICAgICAgKEdlbmVyYXRvci5nbyk6Cisg
ICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc19ldmVudC5Ob09wRm9yd2FyZExpc3RlbmVyKToKKyAg
ICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX2V2ZW50Lk5vT3BGb3J3YXJkTGlzdGVuZXIuYWRkX3R5
cGVfZGF0YSk6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc19ldmVudC5BZEhvY1R5cGVDb250
ZXh0LmdldF90eXBlX25hbWVfZml4Lk5hbWVGaXgpOgorICAgICAgICAoR2VuZXJhdG9yLnByb2Nl
c3NfZXZlbnQuQWRIb2NUeXBlQ29udGV4dC5nZXRfdHlwZV9uYW1lX2ZpeC5OYW1lRml4Lm91dHB1
dF9jb21tZW50KToKKyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX2V2ZW50LkFkSG9jVHlwZUNv
bnRleHQuZ2V0X3R5cGVfbmFtZV9maXgpOgorICAgICAgICAoR2VuZXJhdG9yLnByb2Nlc3NfZXZl
bnQuQWRIb2NUeXBlQ29udGV4dCk6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc19ldmVudC5B
ZEhvY1R5cGVDb250ZXh0LmNhbGxfZ2VuZXJhdGVfdHlwZV9idWlsZGVyKToKKyAgICAgICAgKEdl
bmVyYXRvci5wcm9jZXNzX2V2ZW50KToKKyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX3R5cGVz
LkZvcndhcmRMaXN0ZW5lcik6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc190eXBlcy5Gb3J3
YXJkTGlzdGVuZXIuYWRkX3R5cGVfZGF0YSk6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc190
eXBlcy5nZW5lcmF0ZV9hbGxfZG9tYWluc19jb2RlLm5hbWVzcGFjZV9sYXp5X2dlbmVyYXRvcik6
CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc190eXBlcy5nZW5lcmF0ZV9hbGxfZG9tYWluc19j
b2RlKToKKyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX3R5cGVzLmNhbGxfdHlwZV9idWlsZGVy
KToKKyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX3R5cGVzLmdlbmVyYXRlX2ZvcndhcmRfY2Fs
bGJhY2spOgorICAgICAgICAoR2VuZXJhdG9yKToKKyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNz
X3R5cGVzKToKKyAgICAgICAgKGZsYXR0ZW5fbGlzdC5maWxsX3JlY3Vyc2l2ZSk6CisgICAgICAg
IChmbGF0dGVuX2xpc3QpOgorCiAyMDExLTEyLTE5ICBKZXIgTm9ibGUgIDxqZXIubm9ibGVAYXBw
bGUuY29tPgogCiAgICAgICAgIE1lZGlhQ29udHJvbGxlcjogY2Fubm90IHNjcnViIHdoaWxlIHBs
YXlpbmcuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRv
ckluc3BlY3Rvci5weSBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5z
cGVjdG9yLnB5CmluZGV4IGRjZGIzMmQ1NTY0OWZhOTA1MTEzZDk5OTI0MTI0OTBkZTVhZjhhOTIu
LjkzM2QwMDk1ZDMxZjMzYTY5NGIzMTQwMDRiNzZhZDViMzVhOWEyOWIgMTAwNzU1Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CkBAIC00NTUs
NTUgKzQ1NSwxMzUgQEAgZGVmIGZpeF90eXBlX25hbWUoanNvbl9uYW1lKToKICAgICAgICAgICAg
IGNsYXNzX25hbWUgPSBmaXhlZAogCiAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAg
ICAgICBkZWYgb3V0cHV0X2NvbW1lbnQob3V0cHV0KToKLSAgICAgICAgICAgICAgICBvdXRwdXQu
YXBwZW5kKCIvLyBUeXBlIG9yaWdpbmFsbHkgd2FzIG5hbWVkICclcycuXG4iICUganNvbl9uYW1l
KQorICAgICAgICAgICAgZGVmIG91dHB1dF9jb21tZW50KHdyaXRlcik6CisgICAgICAgICAgICAg
ICAgd3JpdGVyLm5ld2xpbmUoIi8vIFR5cGUgb3JpZ2luYWxseSB3YXMgbmFtZWQgJyVzJy5cbiIg
JSBqc29uX25hbWUpCiAgICAgZWxzZToKIAogICAgICAgICBjbGFzcyBSZXN1bHQob2JqZWN0KToK
ICAgICAgICAgICAgIGNsYXNzX25hbWUgPSBqc29uX25hbWUKIAogICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAotICAgICAgICAgICAgZGVmIG91dHB1dF9jb21tZW50KG91dHB1dCk6CisgICAgICAg
ICAgICBkZWYgb3V0cHV0X2NvbW1lbnQod3JpdGVyKToKICAgICAgICAgICAgICAgICBwYXNzCiAK
ICAgICByZXR1cm4gUmVzdWx0CiAKIAorY2xhc3MgV3JpdGVyOgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBvdXRwdXQsIGluZGVudCk6CisgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0cHV0CisgICAg
ICAgIHNlbGYuaW5kZW50ID0gaW5kZW50CisKKyAgICBkZWYgbmV3bGluZShzZWxmLCBzdHIpOgor
ICAgICAgICBpZiAoc2VsZi5pbmRlbnQpOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQuYXBwZW5k
KHNlbGYuaW5kZW50KQorICAgICAgICBzZWxmLm91dHB1dC5hcHBlbmQoc3RyKQorCisgICAgZGVm
IGFwcGVuZChzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLm91dHB1dC5hcHBlbmQoc3RyKQorCisg
ICAgZGVmIG5ld2xpbmVfbXVsdGlsaW5lKHNlbGYsIHN0cik6CisgICAgICAgIHBhcnRzID0gc3Ry
LnNwbGl0KCdcbicpCisgICAgICAgIHNlbGYubmV3bGluZShwYXJ0c1swXSkKKyAgICAgICAgZm9y
IHAgaW4gcGFydHNbMTpdOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQuYXBwZW5kKCdcbicpCisg
ICAgICAgICAgICBpZiBwOgorICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZShwKQorCisgICAg
ZGVmIGFwcGVuZF9tdWx0aWxpbmUoc2VsZiwgc3RyKToKKyAgICAgICAgcGFydHMgPSBzdHIuc3Bs
aXQoJ1xuJykKKyAgICAgICAgc2VsZi5hcHBlbmQocGFydHNbMF0pCisgICAgICAgIGZvciBwIGlu
IHBhcnRzWzE6XToKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LmFwcGVuZCgnXG4nKQorICAgICAg
ICAgICAgaWYgcDoKKyAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmUocCkKKworICAgIGRlZiBn
ZXRfaW5kZW50ZWQoc2VsZiwgYWRkaXRpb25hbF9pbmRlbnQpOgorICAgICAgICByZXR1cm4gV3Jp
dGVyKHNlbGYub3V0cHV0LCBzZWxmLmluZGVudCArIGFkZGl0aW9uYWxfaW5kZW50KQorCisgICAg
ZGVmIGluc2VydF93cml0ZXIoc2VsZiwgYWRkaXRpb25hbF9pbmRlbnQpOgorICAgICAgICBuZXdf
b3V0cHV0ID0gW10KKyAgICAgICAgc2VsZi5vdXRwdXQuYXBwZW5kKG5ld19vdXRwdXQpCisgICAg
ICAgIHJldHVybiBXcml0ZXIobmV3X291dHB1dCwgc2VsZi5pbmRlbnQgKyBhZGRpdGlvbmFsX2lu
ZGVudCkKKwogCiBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgQHN0YXRpY21ldGhvZAotICAgIGRl
ZiBjcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24oanNvbl90eXBlLCBjb250ZXh0X2Rv
bWFpbl9uYW1lKToKKyAgICBkZWYgY3JlYXRlX25hbWVkX3R5cGVfZGVjbGFyYXRpb24oanNvbl90
eXBhYmxlLCBjb250ZXh0X2RvbWFpbl9uYW1lLCB0eXBlX2RhdGEpOgorICAgICAgICBqc29uX3R5
cGUgPSB0eXBlX2RhdGEuZ2V0X2pzb25fdHlwZSgpCisKKyAgICAgICAgY2xhc3MgSGVscGVyOgor
ICAgICAgICAgICAgaXNfYWRfaG9jID0gRmFsc2UKKworICAgICAgICAgICAgQHN0YXRpY21ldGhv
ZAorICAgICAgICAgICAgZGVmIHdyaXRlX2RvYyh3cml0ZXIpOgorICAgICAgICAgICAgICAgIGlm
ICJkZXNjcmlwdGlvbiIgaW4ganNvbl90eXBlOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIu
bmV3bGluZSgiLyogIikKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChqc29uX3R5
cGVbImRlc2NyaXB0aW9uIl0pCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiAq
L1xuIikKKworICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIGFkZF90
b19mb3J3YXJkX2xpc3RlbmVyKGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAgIGZv
cndhcmRfbGlzdGVuZXIuYWRkX3R5cGVfZGF0YSh0eXBlX2RhdGEpCisKKwogICAgICAgICBmaXhl
ZF90eXBlX25hbWUgPSBmaXhfdHlwZV9uYW1lKGpzb25fdHlwZVsiaWQiXSkKKyAgICAgICAgcmV0
dXJuIFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8oanNvbl90eXBhYmxlLCBj
b250ZXh0X2RvbWFpbl9uYW1lLCBmaXhlZF90eXBlX25hbWUsIEhlbHBlcikKIAotICAgICAgICBk
ZWYgd3JpdGVfZG9jKG91dHB1dCk6Ci0gICAgICAgICAgICBpZiAiZGVzY3JpcHRpb24iIGluIGpz
b25fdHlwZToKLSAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIvKiAiKQotICAgICAgICAg
ICAgICAgIG91dHB1dC5hcHBlbmQoanNvbl90eXBlWyJkZXNjcmlwdGlvbiJdKQotICAgICAgICAg
ICAgICAgIG91dHB1dC5hcHBlbmQoIiAqL1xuIikKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVm
IGNyZWF0ZV9hZF9ob2NfdHlwZV9kZWNsYXJhdGlvbihqc29uX3R5cGFibGUsIGNvbnRleHRfZG9t
YWluX25hbWUsIGFkX2hvY190eXBlX2NvbnRleHQpOgorICAgICAgICBjbGFzcyBIZWxwZXI6Cisg
ICAgICAgICAgICBpc19hZF9ob2MgPSBUcnVlCiAKLSAgICAgICAgaWYganNvbl90eXBlWyJ0eXBl
Il0gPT0gInN0cmluZyI6Ci0gICAgICAgICAgICBpZiAiZW51bSIgaW4ganNvbl90eXBlOgorICAg
ICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHdyaXRlX2RvYyh3cml0ZXIp
OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAg
ICAgICAgICAgZGVmIGFkZF90b19mb3J3YXJkX2xpc3RlbmVyKGZvcndhcmRfbGlzdGVuZXIpOgor
ICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZml4ZWRfdHlwZV9uYW1lID0gYWRfaG9jX3R5
cGVfY29udGV4dC5nZXRfdHlwZV9uYW1lX2ZpeCgpCisgICAgICAgIHJldHVybiBUeXBlQmluZGlu
Z3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fKGpzb25fdHlwYWJsZSwgY29udGV4dF9kb21haW5f
bmFtZSwgZml4ZWRfdHlwZV9uYW1lLCBIZWxwZXIpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAg
ZGVmIGNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXyhqc29uX3R5cGFibGUsIGNvbnRleHRfZG9tYWlu
X25hbWUsIGZpeGVkX3R5cGVfbmFtZSwgaGVscGVyKToKKyAgICAgICAgaWYganNvbl90eXBhYmxl
WyJ0eXBlIl0gPT0gInN0cmluZyI6CisgICAgICAgICAgICBpZiAiZW51bSIgaW4ganNvbl90eXBh
YmxlOgogCiAgICAgICAgICAgICAgICAgY2xhc3MgRW51bUJpbmRpbmc6CiAgICAgICAgICAgICAg
ICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3R5
cGVfYnVpbGRlcihvdXRwdXQsIGZvcndhcmRfbGlzdGVuZXIpOgotICAgICAgICAgICAgICAgICAg
ICAgICAgZW51bSA9IGpzb25fdHlwZVsiZW51bSJdCi0gICAgICAgICAgICAgICAgICAgICAgICB3
cml0ZV9kb2Mob3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW51bV9uYW1lID0gZml4
ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5
cGVfbmFtZS5vdXRwdXRfY29tbWVudChvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBv
dXRwdXQuYXBwZW5kKCJuYW1lc3BhY2UgIikKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoZW51bV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVu
ZCgiIHtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgZW51bV9pdGVtIGluIGVudW06
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9jX25hbWUgPSBlbnVtX2l0ZW0ucmVw
bGFjZSgnLScsICdfJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5k
KCJjb25zdCBjaGFyKiBjb25zdCAiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoQ2FwaXRhbGl6ZXIudXBwZXJfY2FtZWxfY2FzZV90b19sb3dlcihpdGVtX2NfbmFt
ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiID0gXCIiKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoZW51bV9pdGVtKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlwiO1xuIikKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIn0gLy8gbmFtZXNwYWNlICIpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGVudW1fbmFtZSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQorICAgICAgICAgICAgICAgICAgICBkZWYg
Z2V0X2NvZGVfZ2VuZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjRklYTUU6IGdl
bmVyYXRlIGFkLWhvYyBlbnVtcyB0b28gb25jZSB3ZSBmaWd1cmUgb3V0IGhvdyB0byBiZXR0ZXIg
aW1wbGVtZW50IHRoZW0gaW4gQysrLgorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9v
dXQgPSBoZWxwZXIuaXNfYWRfaG9jCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIENv
ZGVHZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBnZW5lcmF0ZV90eXBlX2J1aWxkZXIod3Jp
dGVyLCBmb3J3YXJkX2xpc3RlbmVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgY29tbWVudF9vdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0
ZXIgPSB3cml0ZXIuZ2V0X2luZGVudGVkKCIvLyAiKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBlbnVtID0ganNvbl90eXBhYmxlWyJlbnVtIl0KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaGVscGVyLndyaXRlX2RvYyh3cml0ZXIpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGVudW1fbmFtZSA9IGZpeGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5cGVfbmFtZS5vdXRwdXRfY29tbWVu
dCh3cml0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5l
KCJuYW1lc3BhY2UgIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFw
cGVuZChlbnVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5h
cHBlbmQoIiB7XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZW51bV9p
dGVtIGluIGVudW06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2Nf
bmFtZSA9IGVudW1faXRlbS5yZXBsYWNlKCctJywgJ18nKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoImNvbnN0IGNoYXIqIGNvbnN0ICIpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKENhcGl0YWxpemVy
LnVwcGVyX2NhbWVsX2Nhc2VfdG9fbG93ZXIoaXRlbV9jX25hbWUpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiID0gXCIiKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChlbnVtX2l0ZW0pCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCJcIjtcbiIpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCJ9IC8vIG5hbWVzcGFj
ZSAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGVudW1f
bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiXG5c
biIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGVmIHJlZ2lzdGVyX3VzZShmb3J3YXJkX2xpc3RlbmVyKToK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRvcgogCiAgICAgICAgICAgICAgICAgICAgIEBjbGFz
c21ldGhvZAogICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywg
b3B0aW9uYWwpOgpAQCAtNTE4LDEyICs1OTgsMjQgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogCiAg
ICAgICAgICAgICAgICAgY2xhc3MgUGxhaW5TdHJpbmc6CiAgICAgICAgICAgICAgICAgICAgIEBz
dGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3R5cGVfYnVpbGRl
cihvdXRwdXQsIGZvcndhcmRfbGlzdGVuZXIpOgotICAgICAgICAgICAgICAgICAgICAgICAgd3Jp
dGVfZG9jKG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5cGVfbmFtZS5v
dXRwdXRfY29tbWVudChvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBw
ZW5kKCJ0eXBlZGVmIFN0cmluZyAiKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFw
cGVuZChmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IG91dHB1dC5hcHBlbmQoIjtcblxuIikKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9jb2Rl
X2dlbmVyYXRvcigpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGVscGVyLmlzX2FkX2hv
YzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAg
ICAgICAgICAgY2xhc3MgQ29kZUdlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRl
X3R5cGVfYnVpbGRlcih3cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBoZWxwZXIud3JpdGVfZG9jKHdyaXRlcikKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZml4ZWRfdHlwZV9uYW1lLm91dHB1dF9jb21tZW50KHdyaXRlcikK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoInR5cGVkZWYg
U3RyaW5nICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQo
Zml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHdyaXRlci5hcHBlbmQoIjtcblxuIikKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgcmVnaXN0ZXJf
dXNlKGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
YXNzCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yCiAKICAg
ICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAgICAgICAgICAgICAgICAgICBkZWYg
cmVkdWNlX3RvX3Jhd190eXBlKCk6CkBAIC01MzEsNTMgKzYyMyw1NiBAQCBjbGFzcyBUeXBlQmlu
ZGluZ3M6CiAKICAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgICAgICAg
ICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CisgICAgICAgICAg
ICAgICAgICAgICAgICAjRklYTUU6IHJldHVybiBhIHR5cGVkZWYgbmFtZSBpbnN0ZWFkLgogICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRf
Y19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwgb3B0aW9uYWwpLmdldF90ZXh0KCkKIAogICAg
ICAgICAgICAgICAgIHJldHVybiBQbGFpblN0cmluZwogCi0gICAgICAgIGVsaWYganNvbl90eXBl
WyJ0eXBlIl0gPT0gIm9iamVjdCI6Ci0gICAgICAgICAgICBpZiAicHJvcGVydGllcyIgaW4ganNv
bl90eXBlOgorICAgICAgICBlbGlmIGpzb25fdHlwYWJsZVsidHlwZSJdID09ICJvYmplY3QiOgor
ICAgICAgICAgICAgaWYgInByb3BlcnRpZXMiIGluIGpzb25fdHlwYWJsZToKIAogICAgICAgICAg
ICAgICAgIGNsYXNzIENsYXNzQmluZGluZzoKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFt
ZV8gPSBqc29uX3R5cGVbImlkIl0KLQogICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
Ci0gICAgICAgICAgICAgICAgICAgIGRlZiBnZW5lcmF0ZV90eXBlX2J1aWxkZXIob3V0cHV0LCBm
b3J3YXJkX2xpc3RlbmVyKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2RvYyhvdXRw
dXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lID0gZml4ZWRfdHlwZV9uYW1l
LmNsYXNzX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5cGVfbmFtZS5vdXRw
dXRfY29tbWVudChvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5k
KCJjbGFzcyAiKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChjbGFzc19u
YW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7XG4iKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVu
ZCgicHVibGljOlxuIikKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IGpz
b25fdHlwZVsicHJvcGVydGllcyJdCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWluX3Byb3Bl
cnRpZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfcHJvcGVydGllcyA9
IFtdCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm9wZXJ0aWVzOgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICJvcHRpb25hbCIgaW4gcCBhbmQgcFsib3B0aW9uYWwi
XToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfcHJvcGVydGllcy5h
cHBlbmQocCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtYWluX3Byb3BlcnRpZXMuYXBwZW5kKHApCi0KLSAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIGRlZiBn
ZXRfY29kZV9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIENvZGVH
ZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3R5cGVfYnVpbGRlcihjbHMsIHdy
aXRlciwgZm9yd2FyZF9saXN0ZW5lcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGhlbHBlci53cml0ZV9kb2Mod3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjbGFzc19uYW1lID0gZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZml4ZWRfdHlwZV9uYW1lLm91dHB1dF9jb21tZW50KHdyaXRlcikK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoImNsYXNzICIp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoY2xhc3NfbmFt
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiIDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3cml0ZXIubmV3bGluZSgicHVibGljOlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYWRfaG9jX3R5cGVfd3JpdGVyID0gd3JpdGVyLmluc2VydF93cml0ZXIoIiAgICAiKQor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBqc29uX3R5cGFi
bGVbInByb3BlcnRpZXMiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX3By
b3BlcnRpZXMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9w
cm9wZXJ0aWVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4g
cHJvcGVydGllczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJvcHRp
b25hbCIgaW4gcCBhbmQgcFsib3B0aW9uYWwiXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvcHRpb25hbF9wcm9wZXJ0aWVzLmFwcGVuZChwKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtYWluX3Byb3BlcnRpZXMuYXBwZW5kKHApCisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmVfbXVsdGlsaW5lKAogIiIiICAgIGVudW0g
ewogICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICIiIikKIAotICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGVfZW51bV9pdGVtcyA9IFtdCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBs
ZW4obWFpbl9wcm9wZXJ0aWVzKSA+IDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9z
ID0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIG1haW5fcHJvcGVydGll
czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9uYW1lID0gQ2FwaXRhbGl6
ZXIuY2FtZWxfY2FzZV90b19jYXBpdGFsaXplZF93aXRoX3VuZGVyc2NvcmVzKHBbIm5hbWUiXSkg
KyAiX1NFVCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfZW51bV9pdGVt
cy5hcHBlbmQoaXRlbV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRw
dXQuYXBwZW5kKCIgICAgICAgICVzID0gMSA8PCAlcyxcbiIgJSAoaXRlbV9uYW1lLCBwb3MpKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVlID0gIigiICsgKCIgfCAiLmpvaW4oc3Rh
dGVfZW51bV9pdGVtcykpICsgIikiCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVlID0gIjAiCi0KLSAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRlX2VudW1faXRlbXMgPSBbXQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiBsZW4obWFpbl9wcm9wZXJ0aWVzKSA+IDA6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmb3IgcCBpbiBtYWluX3Byb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaXRlbV9uYW1lID0gQ2FwaXRhbGl6ZXIuY2FtZWxfY2FzZV90b19j
YXBpdGFsaXplZF93aXRoX3VuZGVyc2NvcmVzKHBbIm5hbWUiXSkgKyAiX1NFVCIKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9lbnVtX2l0ZW1zLmFwcGVuZChp
dGVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVy
Lm5ld2xpbmUoIiAgICAgICAgJXMgPSAxIDw8ICVzLFxuIiAlIChpdGVtX25hbWUsIHBvcykpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDEKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVlID0gIigiICsg
KCIgfCAiLmpvaW4oc3RhdGVfZW51bV9pdGVtcykpICsgIikiCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
bGxfZmllbGRzX3NldF92YWx1ZSA9ICIwIgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZSgKICIiIiAgICAgICAgQUxMX0ZJRUxEU19TRVQg
PSAlcwogICAgIH07CiAKQEAgLTYwMCwxMSArNjk1LDE3IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoK
ICAgICBwdWJsaWM6CiAiIiIgJSAoYWxsX2ZpZWxkc19zZXRfdmFsdWUsIGNsYXNzX25hbWUsIGNs
YXNzX25hbWUpKQogCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAwCi0gICAgICAgICAg
ICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBtYWluX3Byb3BlcnRpZXM6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcHJvcF9uYW1lID0gcHJvcFsibmFtZSJdCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUgPSByZXNvbHZlX3BhcmFtX3Jhd190eXBlKHByb3As
IGNvbnRleHRfZG9tYWluX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0
LmFwcGVuZCgiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gMAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBtYWluX3Byb3BlcnRpZXM6
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wX25hbWUgPSBwcm9wWyJu
YW1lIl0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfaG9jX3R5cGVf
Y29udGV4dCA9IGNscy5BZEhvY1R5cGVDb250ZXh0SW1wbChwcm9wX25hbWUsIGZpeGVkX3R5cGVf
bmFtZS5jbGFzc19uYW1lLCBhZF9ob2NfdHlwZV93cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpCisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZyA9
IHJlc29sdmVfcGFyYW1fdHlwZShwcm9wLCBjb250ZXh0X2RvbWFpbl9uYW1lLCBhZF9ob2NfdHlw
ZV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcmF3
X3R5cGUgPSBwYXJhbV90eXBlX2JpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRlZF90eXBlID0gZ2V0X2Fubm90YXRl
ZF90eXBlX3RleHQocGFyYW1fcmF3X3R5cGUuZ2V0X2NfcGFyYW1fdHlwZShQYXJhbVR5cGUuVFlQ
RV9CVUlMREVSX09VVFBVVCwgRmFsc2UpLmdldF90ZXh0KCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9iaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4
dChGYWxzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3
bGluZV9tdWx0aWxpbmUoIiIiCiAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCAlcz4mIHNldCVzKCVz
IHZhbHVlKQogICAgICAgICB7CiAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
JXMpLCBwcm9wZXJ0eV8lc19hbHJlYWR5X3NldCk7CkBAIC02MTIsMTUgKzcxMywxOSBAQCBjbGFz
cyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPCVzPigpOwogICAg
ICAgICB9CiAiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzdGF0ZV9lbnVtX2l0
ZW1zW3Bvc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwaXRhbGl6ZXIubG93
ZXJfY2FtZWxfY2FzZV90b191cHBlcihwcm9wX25hbWUpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHBhcmFtX3Jhd190eXBlLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLlRZUEVf
QlVJTERFUl9PVVRQVVQsIEZhbHNlKS5nZXRfdGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlX2VudW1faXRlbXNbcG9zXSwgcHJvcF9uYW1lLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcmFtX3Jhd190eXBlLmdldF9zZXR0ZXJfbmFtZSgpLCBwcm9w
X25hbWUsIHN0YXRlX2VudW1faXRlbXNbcG9zXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAlIChzdGF0ZV9lbnVtX2l0ZW1zW3Bvc10sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBDYXBpdGFsaXplci5sb3dlcl9jYW1lbF9jYXNlX3RvX3VwcGVy
KHByb3BfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5v
dGF0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRl
X2VudW1faXRlbXNbcG9zXSwgcHJvcF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUuZ2V0X3NldHRlcl9uYW1lKCksIHByb3BfbmFtZSwg
c3RhdGVfZW51bV9pdGVtc1twb3NdKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcG9zICs9IDEKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRvciA9IHBhcmFt
X3R5cGVfYmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgY29kZV9nZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29kZV9nZW5lcmF0b3IucmVnaXN0ZXJfdXNlKGZvcndhcmRfbGlz
dGVuZXIpCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiIiCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZSgiIiIK
ICAgICAgICAgb3BlcmF0b3IgUmVmUHRyPCVzPiYgKCkKICAgICAgICAgewogICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwpAQCAtNjM0LDUyICs3MzksOTIgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgIH07CiAK
ICIiIgotICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSwg
Y2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICUgKGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUpKQogCi0g
ICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIgICAgLypcbiIpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIgICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOlxuIikKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICAgKiBS
ZWZQdHI8JXM+IHJlc3VsdCA9ICVzOjpjcmVhdGUoKSIgJSAoY2xhc3NfbmFtZSwgY2xhc3NfbmFt
ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBtYWluX3Byb3BlcnRpZXM6
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiXG4gICAgICogICAg
IC5zZXQlcyguLi4pIiAlIENhcGl0YWxpemVyLmxvd2VyX2NhbWVsX2Nhc2VfdG9fdXBwZXIocHJv
cFsibmFtZSJdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIjtcbiAg
ICAgKi9cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5l
KCIgICAgLypcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXds
aW5lKCIgICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOlxuIikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICAgKiBSZWZQdHI8JXM+IHJlc3VsdCA9
ICVzOjpjcmVhdGUoKSIgJSAoY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZvciBwcm9wIGluIG1haW5fcHJvcGVydGllczoKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmRfbXVsdGlsaW5lKCJcbiAg
ICAgKiAgICAgLnNldCVzKC4uLikiICUgQ2FwaXRhbGl6ZXIubG93ZXJfY2FtZWxfY2FzZV90b191
cHBlcihwcm9wWyJuYW1lIl0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0
ZXIuYXBwZW5kX211bHRpbGluZSgiO1xuICAgICAqL1xuIikKIAotICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0cHV0LmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Jp
dGVyLm5ld2xpbmVfbXVsdGlsaW5lKAogIiIiICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VU
PihhZG9wdFJlZihuZXcgJXMoKSkpOwogICAgIH0KICIiIiAlIGNsYXNzX25hbWUpCiAKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGZvciBwcm9wIGluIG9wdGlvbmFsX3Byb3BlcnRpZXM6Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUgPSByZXNvbHZlX3BhcmFtX3Jh
d190eXBlKHByb3AsIGNvbnRleHRfZG9tYWluX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0dGVyX25hbWUgPSAic2V0JXMiICUgQ2FwaXRhbGl6ZXIubG93ZXJfY2FtZWxfY2Fz
ZV90b191cHBlcihwcm9wWyJuYW1lIl0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0
cHV0LmFwcGVuZCgiXG4gICAgdm9pZCAlcyIgJSBzZXR0ZXJfbmFtZSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIoJXMgdmFsdWUpXG4iICUgcGFyYW1fcmF3X3R5
cGUuZ2V0X2NfcGFyYW1fdHlwZShQYXJhbVR5cGUuVFlQRV9CVUlMREVSX09VVFBVVCwgRmFsc2Up
LmdldF90ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgi
ICAgIHtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiICAg
ICAgICB0aGlzLT5zZXQlcyhcIiVzXCIsIHZhbHVlKTtcbiIgJSAocGFyYW1fcmF3X3R5cGUuZ2V0
X3NldHRlcl9uYW1lKCksIHByb3BbIm5hbWUiXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgb3V0cHV0LmFwcGVuZCgiICAgIH1cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciBwcm9wIGluIG9wdGlvbmFsX3Byb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBwcm9wX25hbWUgPSBwcm9wWyJuYW1lIl0KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGFkX2hvY190eXBlX2NvbnRleHQgPSBjbHMuQWRIb2NUeXBl
Q29udGV4dEltcGwocHJvcF9uYW1lLCBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSwgYWRfaG9j
X3R5cGVfd3JpdGVyLCBmb3J3YXJkX2xpc3RlbmVyKQorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcgPSByZXNvbHZlX3BhcmFtX3R5cGUocHJv
cCwgY29udGV4dF9kb21haW5fbmFtZSwgYWRfaG9jX3R5cGVfY29udGV4dCkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcl9uYW1lID0gInNldCVzIiAlIENhcGl0YWxp
emVyLmxvd2VyX2NhbWVsX2Nhc2VfdG9fdXBwZXIocHJvcF9uYW1lKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZF9tdWx0aWxpbmUoIlxuICAgIHZvaWQg
JXMiICUgc2V0dGVyX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
bm5vdGF0ZWRfdHlwZSA9IGdldF9hbm5vdGF0ZWRfdHlwZV90ZXh0KHBhcmFtX3R5cGVfYmluZGlu
Zy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5UWVBFX0JV
SUxERVJfT1VUUFVULCBGYWxzZSkuZ2V0X3RleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KEZh
bHNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQo
IiglcyB2YWx1ZSlcbiIgJSBhbm5vdGF0ZWRfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAge1xuIikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgICAgIHRoaXMtPnNldCVzKFwi
JXNcIiwgdmFsdWUpO1xuIiAlIChwYXJhbV90eXBlX2JpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBl
KCkuZ2V0X3NldHRlcl9uYW1lKCksIHByb3BbIm5hbWUiXSkpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgIH1cbiIpCisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yID0gcGFyYW1fdHlwZV9iaW5k
aW5nLmdldF9jb2RlX2dlbmVyYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBjb2RlX2dlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb2RlX2dlbmVyYXRvci5yZWdpc3Rlcl91c2UoZm9yd2FyZF9saXN0ZW5lcikKIAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNldHRlcl9uYW1lIGluIElOU1BFQ1RPUl9P
QkpFQ1RfU0VUVEVSX05BTUVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRw
dXQuYXBwZW5kKCIgICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjolcztcblxuIiAlIHNldHRlcl9u
YW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2V0dGVyX25hbWUg
aW4gSU5TUEVDVE9SX09CSkVDVF9TRVRURVJfTkFNRVM6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICB1c2luZyBJbnNwZWN0b3JPYmpl
Y3Q6OiVzO1xuXG4iICUgc2V0dGVyX25hbWUpCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG91
dHB1dC5hcHBlbmQoIn07XG5cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdy
aXRlci5uZXdsaW5lKCJ9O1xuXG4iKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xh
c3MgQWRIb2NUeXBlQ29udGV4dEltcGw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBwcm9wZXJ0eV9uYW1lLCBjbGFzc19uYW1lLCB3cml0ZXIsIGZv
cndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vs
Zi5wcm9wZXJ0eV9uYW1lID0gcHJvcGVydHlfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2VsZi5jbGFzc19uYW1lID0gY2xhc3NfbmFtZQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZXIgPSB3cml0ZXIKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZF9saXN0ZW5lciA9IGZvcndhcmRfbGlz
dGVuZXIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3R5cGVfbmFt
ZV9maXgoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBO
YW1lRml4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25h
bWUgPSBDYXBpdGFsaXplci5sb3dlcl9jYW1lbF9jYXNlX3RvX3VwcGVyKHNlbGYucHJvcGVydHlf
bmFtZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNt
ZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgb3V0cHV0
X2NvbW1lbnQod3JpdGVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd3JpdGVyLm5ld2xpbmUoIi8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJyVzJyB3
aGlsZSBnZW5lcmF0aW5nICVzLlxuIiAlIChzZWxmLnByb3BlcnR5X25hbWUsIHNlbGYuY2xhc3Nf
bmFtZSkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYW1l
Rml4CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGNhbGxfZ2VuZXJhdGVf
dHlwZV9idWlsZGVyKHNlbGYsIGNvZGVfZ2VuZXJhdG9yKToKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRlcihzZWxm
LndyaXRlciwgc2VsZi5mb3J3YXJkX2xpc3RlbmVyKQorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBnZW5l
cmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHdyaXRlcik6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNsYXNzX25hbWUgPSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiY2xhc3MgIikKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChjbGFzc19uYW1lKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI7XG4iKQorCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRlZiByZWdpc3Rlcl91c2UoZm9yd2FyZF9saXN0ZW5lcik6CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci5hZGRfdG9fZm9yd2FyZF9saXN0ZW5lcihmb3J3
YXJkX2xpc3RlbmVyKQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZUdlbmVy
YXRvcgogCiAgICAgICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgICAgICAgICAg
ICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywgb3B0aW9uYWwpOgotICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuICJQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjoiICsgY29udGV4dF9k
b21haW5fbmFtZSArICI6OiIgKyBjbHMuY2xhc3NfbmFtZV8gKyAiPiIKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiAiUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6IiArIGNvbnRleHRfZG9t
YWluX25hbWUgKyAiOjoiICsgZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUgKyAiPiIKIAogICAg
ICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgICAgICAgICAgICAgIGRlZiBy
ZWR1Y2VfdG9fcmF3X3R5cGUoKToKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYXdU
eXBlcy5PYmplY3QKIAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgifTtc
blxuIikKICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3NCaW5kaW5nCiAgICAgICAgICAgICBl
bHNlOgogCiAgICAgICAgICAgICAgICAgY2xhc3MgUGxhaW5PYmplY3RCaW5kaW5nOgogICAgICAg
ICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgIGRlZiBnZW5l
cmF0ZV90eXBlX2J1aWxkZXIob3V0cHV0LCBmb3J3YXJkX2xpc3RlbmVyKToKLSAgICAgICAgICAg
ICAgICAgICAgICAgICMgTm8tb3AKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9jb2RlX2dl
bmVyYXRvcigpOgogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgICAgICAgICAg
ICAgICAgIEBjbGFzc21ldGhvZApAQCAtNjkxLDI0ICs4MzYsNTcgQEAgY2xhc3MgVHlwZUJpbmRp
bmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhd1R5cGVzLk9iamVjdAogCiAg
ICAgICAgICAgICAgICAgcmV0dXJuIFBsYWluT2JqZWN0QmluZGluZworICAgICAgICBlbGlmIGpz
b25fdHlwYWJsZVsidHlwZSJdID09ICJhcnJheSI6CisgICAgICAgICAgICBpZiAiaXRlbXMiIGlu
IGpzb25fdHlwYWJsZToKKworICAgICAgICAgICAgICAgIGNsYXNzIENvZGVHZW5lcmF0b3I6Cisg
ICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVm
IGdlbmVyYXRlX3R5cGVfYnVpbGRlcih3cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpOgorCisgICAg
ICAgICAgICAgICAgICAgICAgICBjbGFzcyBBZEhvY1R5cGVDb250ZXh0OgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBkZWYgZ2V0X3R5cGVfbmFtZV9maXgoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY2xhc3MgTmFtZUZpeDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNs
YXNzX25hbWUgPSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSArICJJdGVtIgorCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkZWYgb3V0cHV0X2NvbW1lbnQod3JpdGVyKToKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90eXBlX25hbWUub3V0cHV0
X2NvbW1lbnQod3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdyaXRlci5uZXdsaW5lKCIvLyBOYW1lZCBhcyBhbiBpdGVtIG9mIGFycmF5LlxuIikKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZUZpeAorCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRlZiBjYWxsX2dlbmVyYXRlX3R5cGVfYnVpbGRlcihjb2RlX2dlbmVyYXRvcik6CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVf
YnVpbGRlcih3cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3R5cGFibGVbIml0ZW1zIl0sIGNvbnRleHRfZG9t
YWluX25hbWUsIEFkSG9jVHlwZUNvbnRleHQpCisKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVnaXN0ZXJfdXNlKGZvcndhcmRfbGlz
dGVuZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAg
ZGVmYXVsdF9iaW5kaW5nX2NvZGVfZ2VuZXJhdG9yID0gQ29kZUdlbmVyYXRvcgorCiAgICAgICAg
IGVsc2U6Ci0gICAgICAgICAgICByYXdfdHlwZSA9IFJhd1R5cGVzLmdldChqc29uX3R5cGVbInR5
cGUiXSkKKyAgICAgICAgICAgIGRlZmF1bHRfYmluZGluZ19jb2RlX2dlbmVyYXRvciA9IE5vbmUK
IAotICAgICAgICAgICAgY2xhc3MgUmF3VHlwZXNCaW5kaW5nOgotICAgICAgICAgICAgICAgIEBz
dGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91
dHB1dCwgZm9yd2FyZF9saXN0ZW5lcik6Ci0gICAgICAgICAgICAgICAgICAgICMgTm8tb3AKLSAg
ICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByYXdfdHlwZSA9IFJhd1R5cGVzLmdldChq
c29uX3R5cGFibGVbInR5cGUiXSkKIAotICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAotICAg
ICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6Ci0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiBjbHMucmVkdWNlX3RvX3Jhd190eXBlKCkuZ2V0X2NfcGFy
YW1fdHlwZShQYXJhbVR5cGUuRVZFTlQsIG9wdGlvbmFsKS5nZXRfdGV4dCgpCisgICAgICAgIGNs
YXNzIFJhd1R5cGVzQmluZGluZzoKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAg
ICAgIGRlZiBnZXRfY29kZV9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVm
YXVsdF9iaW5kaW5nX2NvZGVfZ2VuZXJhdG9yCiAKLSAgICAgICAgICAgICAgICBAc3RhdGljbWV0
aG9kCi0gICAgICAgICAgICAgICAgZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gcmF3X3R5cGUKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAg
ICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToKKyAgICAgICAg
ICAgICAgICByZXR1cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3BhcmFtX3R5cGUo
UGFyYW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQogCi0gICAgICAgICAgICByZXR1
cm4gUmF3VHlwZXNCaW5kaW5nCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAg
ICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhd190
eXBlCisKKyAgICAgICAgcmV0dXJuIFJhd1R5cGVzQmluZGluZwogCiAKIGNsYXNzIFR5cGVEYXRh
KG9iamVjdCk6CkBAIC03MjMsNyArOTAxLDcgQEAgY2xhc3MgVHlwZURhdGEob2JqZWN0KToKICAg
ICAgICAganNvbl90eXBlX25hbWUgPSBqc29uX3R5cGVbInR5cGUiXQogICAgICAgICByYXdfdHlw
ZSA9IFJhd1R5cGVzLmdldChqc29uX3R5cGVfbmFtZSkKICAgICAgICAgc2VsZi5yYXdfdHlwZV8g
PSByYXdfdHlwZQotICAgICAgICBzZWxmLmJpbmRpbmdfID0gVHlwZUJpbmRpbmdzLmNyZWF0ZV9m
b3JfbmFtZWRfdHlwZV9kZWNsYXJhdGlvbihqc29uX3R5cGUsIGpzb25fZG9tYWluWyJkb21haW4i
XSkKKyAgICAgICAgc2VsZi5iaW5kaW5nXyA9IFR5cGVCaW5kaW5ncy5jcmVhdGVfbmFtZWRfdHlw
ZV9kZWNsYXJhdGlvbihqc29uX3R5cGUsIGpzb25fZG9tYWluWyJkb21haW4iXSwgc2VsZikKIAog
ICAgIGRlZiBnZXRfcmF3X3R5cGUoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLnJhd190eXBl
XwpAQCAtNzMxLDYgKzkwOSw5IEBAIGNsYXNzIFR5cGVEYXRhKG9iamVjdCk6CiAgICAgZGVmIGdl
dF9iaW5kaW5nKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5iaW5kaW5nXwogCisgICAgZGVm
IGdldF9qc29uX3R5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmpzb25fdHlwZV8KKwog
CiBjbGFzcyBEb21haW5EYXRhOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBqc29uX2RvbWFpbik6
CkBAIC03NzQsMjUgKzk1NSwxNyBAQCBjbGFzcyBUeXBlTWFwOgogICAgICAgICByZXR1cm4gc2Vs
Zi5tYXBfW2RvbWFpbl9uYW1lXVt0eXBlX25hbWVdCiAKIAotZGVmIHJlc29sdmVfcGFyYW1fdHlw
ZShqc29uX3BhcmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUpOgorZGVmIHJlc29sdmVfcGFyYW1f
dHlwZShqc29uX3BhcmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUsIGFkX2hvY190eXBlX2NvbnRl
eHQpOgogICAgIGlmICIkcmVmIiBpbiBqc29uX3BhcmFtZXRlcjoKICAgICAgICAganNvbl9yZWYg
PSBqc29uX3BhcmFtZXRlclsiJHJlZiJdCiAgICAgICAgIHR5cGVfZGF0YSA9IGdldF9yZWZfZGF0
YShqc29uX3JlZiwgc2NvcGVfZG9tYWluX25hbWUpCiAgICAgICAgIHJldHVybiB0eXBlX2RhdGEu
Z2V0X2JpbmRpbmcoKQogICAgIGVsaWYgInR5cGUiIGluIGpzb25fcGFyYW1ldGVyOgotICAgICAg
ICBqc29uX3R5cGUgPSBqc29uX3BhcmFtZXRlclsidHlwZSJdCi0gICAgICAgIHJhd190eXBlID0g
UmF3VHlwZXMuZ2V0KGpzb25fdHlwZSkKLQotICAgICAgICBjbGFzcyBSYXdUeXBlQmluZGluZzoK
LSAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3
X3R5cGUoKToKLSAgICAgICAgICAgICAgICByZXR1cm4gcmF3X3R5cGUKLQotICAgICAgICAgICAg
QHN0YXRpY21ldGhvZAotICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChvcHRpb25h
bCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJhd190eXBlLmdldF9jX3BhcmFtX3R5cGUoUGFy
YW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQotCi0gICAgICAgIHJldHVybiBSYXdU
eXBlQmluZGluZworICAgICAgICByZXN1bHQgPSBUeXBlQmluZGluZ3MuY3JlYXRlX2FkX2hvY190
eXBlX2RlY2xhcmF0aW9uKGpzb25fcGFyYW1ldGVyLCBzY29wZV9kb21haW5fbmFtZSwgYWRfaG9j
X3R5cGVfY29udGV4dCkKKyAgICAgICAgY29kZV9nZW5lcmF0b3IgPSByZXN1bHQuZ2V0X2NvZGVf
Z2VuZXJhdG9yKCkKKyAgICAgICAgaWYgY29kZV9nZW5lcmF0b3I6CisgICAgICAgICAgICBhZF9o
b2NfdHlwZV9jb250ZXh0LmNhbGxfZ2VuZXJhdGVfdHlwZV9idWlsZGVyKGNvZGVfZ2VuZXJhdG9y
KQorICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgRXhjZXB0
aW9uKCJVbmtub3duIHR5cGUiKQogCkBAIC05MTMsNiArMTA4Niw3IEBAIHR5cGVkZWYgU3RyaW5n
IEVycm9yU3RyaW5nOwogI2lmIEVOQUJMRShJTlNQRUNUT1IpCiAKIG5hbWVzcGFjZSBUeXBlQnVp
bGRlciB7Ciske2ZvcndhcmRzfQogJHt0eXBlQnVpbGRlcnN9CiB9IC8vIG5hbWVzcGFjZSBUeXBl
QnVpbGRlcgogCkBAIC0xNDAxLDYgKzE1NzUsNyBAQCBjbGFzcyBHZW5lcmF0b3I6CiAgICAgYmFj
a2VuZF9pbmNsdWRlX2xpc3QgPSBbXQogICAgIGZyb250ZW5kX2NvbnN0cnVjdG9yX2luaXRfbGlz
dCA9IFtdCiAgICAgdHlwZV9idWlsZGVyX2ZyYWdtZW50cyA9IFtdCisgICAgdHlwZV9idWlsZGVy
X2ZvcndhcmRzID0gW10KIAogICAgIEBzdGF0aWNtZXRob2QKICAgICBkZWYgZ28oKToKQEAgLTE0
NDcsNyArMTYyMiw3IEBAIGNsYXNzIEdlbmVyYXRvcjoKICAgICAgICAgICAgIEdlbmVyYXRvci5m
cm9udGVuZF9kb21haW5fY2xhc3NfbGluZXMuYXBwZW5kKFRlbXBsYXRlcy5mcm9udGVuZF9kb21h
aW5fY2xhc3Muc3Vic3RpdHV0ZShOb25lLAogICAgICAgICAgICAgICAgIGRvbWFpbkNsYXNzTmFt
ZT1kb21haW5fbmFtZSwKICAgICAgICAgICAgICAgICBkb21haW5GaWVsZE5hbWU9ZG9tYWluX25h
bWVfbG93ZXIsCi0gICAgICAgICAgICAgICAgZnJvbnRlbmREb21haW5NZXRob2REZWNsYXJhdGlv
bnM9am9pbihmcm9udGVuZF9tZXRob2RfZGVjbGFyYXRpb25fbGluZXMsICIiKSkpCisgICAgICAg
ICAgICAgICAgZnJvbnRlbmREb21haW5NZXRob2REZWNsYXJhdGlvbnM9am9pbihmbGF0dGVuX2xp
c3QoZnJvbnRlbmRfbWV0aG9kX2RlY2xhcmF0aW9uX2xpbmVzKSwgIiIpKSkKIAogICAgICAgICAg
ICAgaWYgImNvbW1hbmRzIiBpbiBqc29uX2RvbWFpbjoKICAgICAgICAgICAgICAgICBmb3IganNv
bl9jb21tYW5kIGluIGpzb25fZG9tYWluWyJjb21tYW5kcyJdOgpAQCAtMTQ5MiwxMCArMTY2Nywx
OCBAQCBjbGFzcyBHZW5lcmF0b3I6CiAKICAgICBAc3RhdGljbWV0aG9kCiAgICAgZGVmIHByb2Nl
c3NfZXZlbnQoanNvbl9ldmVudCwgZG9tYWluX25hbWUsIGZyb250ZW5kX21ldGhvZF9kZWNsYXJh
dGlvbl9saW5lcyk6CisgICAgICAgIGNsYXNzIE5vT3BGb3J3YXJkTGlzdGVuZXI6CisgICAgICAg
ICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgYWRkX3R5cGVfZGF0YSh0eXBlX2Rh
dGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKwogICAgICAgICBldmVudF9uYW1lID0ganNvbl9l
dmVudFsibmFtZSJdCiAgICAgICAgIHBhcmFtZXRlcl9saXN0ID0gW10KICAgICAgICAgbWV0aG9k
X2xpbmVfbGlzdCA9IFtdCiAgICAgICAgIGJhY2tlbmRfanNfZXZlbnRfcGFyYW1fbGlzdCA9IFtd
CisgICAgICAgIGFkX2hvY190eXBlX291dHB1dCA9IFtdCisgICAgICAgIGZyb250ZW5kX21ldGhv
ZF9kZWNsYXJhdGlvbl9saW5lcy5hcHBlbmQoYWRfaG9jX3R5cGVfb3V0cHV0KQorICAgICAgICBh
ZF9ob2NfdHlwZV93cml0ZXIgPSBXcml0ZXIoYWRfaG9jX3R5cGVfb3V0cHV0LCAiICAgICIpCiAg
ICAgICAgIGlmICJwYXJhbWV0ZXJzIiBpbiBqc29uX2V2ZW50OgogICAgICAgICAgICAgbWV0aG9k
X2xpbmVfbGlzdC5hcHBlbmQoIiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmpl
Y3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpO1xuIikKICAgICAgICAgICAgIGZvciBqc29u
X3BhcmFtZXRlciBpbiBqc29uX2V2ZW50WyJwYXJhbWV0ZXJzIl06CkBAIC0xNTEyLDcgKzE2OTUs
MjMgQEAgY2xhc3MgR2VuZXJhdG9yOgogCiAgICAgICAgICAgICAgICAgb3B0aW9uYWwgPSBvcHRp
b25hbF9tYXNrIGFuZCBqc29uX29wdGlvbmFsCiAKLSAgICAgICAgICAgICAgICBwYXJhbV90eXBl
X2JpbmRpbmcgPSByZXNvbHZlX3BhcmFtX3R5cGUoanNvbl9wYXJhbWV0ZXIsIGRvbWFpbl9uYW1l
KQorICAgICAgICAgICAgICAgIGNsYXNzIEFkSG9jVHlwZUNvbnRleHQ6CisgICAgICAgICAgICAg
ICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF90eXBlX25h
bWVfZml4KCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBOYW1lRml4OgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUgPSBDYXBpdGFsaXplci5sb3dlcl9jYW1l
bF9jYXNlX3RvX3VwcGVyKHBhcmFtZXRlcl9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBvdXRw
dXRfY29tbWVudCh3cml0ZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0
ZXIubmV3bGluZSgiLy8gTmFtZWQgYWZ0ZXIgcGFyYW1ldGVyIG5hbWUgJyVzJyB3aGlsZSBnZW5l
cmF0aW5nIGV2ZW50ICVzLlxuIiAlIChwYXJhbWV0ZXJfbmFtZSwgZXZlbnRfbmFtZSkpCisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYW1lRml4CisKKyAgICAgICAgICAgICAgICAg
ICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgY2FsbF9nZW5lcmF0ZV90
eXBlX2J1aWxkZXIoY29kZV9nZW5lcmF0b3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29k
ZV9nZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKGFkX2hvY190eXBlX3dyaXRlciwgTm9P
cEZvcndhcmRMaXN0ZW5lcikKKworICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZyA9
IHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgZG9tYWluX25hbWUsIEFkSG9jVHlw
ZUNvbnRleHQpCiAKICAgICAgICAgICAgICAgICBhbm5vdGF0ZWRfdHlwZSA9IGdldF9hbm5vdGF0
ZWRfdHlwZV90ZXh0KGNfdHlwZS5nZXRfdGV4dCgpLCBwYXJhbV90eXBlX2JpbmRpbmcuZ2V0X2lu
X2NfdHlwZV90ZXh0KGpzb25fb3B0aW9uYWwpKQogCkBAIC0xNjMzLDI4ICsxODMyLDc5IEBAIGNs
YXNzIEdlbmVyYXRvcjoKICAgICAgICAgb3V0cHV0ID0gR2VuZXJhdG9yLnR5cGVfYnVpbGRlcl9m
cmFnbWVudHMKIAogICAgICAgICBjbGFzcyBGb3J3YXJkTGlzdGVuZXI6Ci0gICAgICAgICAgICBw
YXNzCi0KLSAgICAgICAgZm9yIGRvbWFpbl9kYXRhIGluIHR5cGVfbWFwLmRvbWFpbnMoKToKLQot
ICAgICAgICAgICAgZG9tYWluX2ZpeGVzID0gRG9tYWluTmFtZUZpeGVzLmdldF9maXhlZF9kYXRh
KGRvbWFpbl9kYXRhLm5hbWUoKSkKLSAgICAgICAgICAgIGRvbWFpbl9ndWFyZCA9IGRvbWFpbl9m
aXhlcy5nZXRfZ3VhcmQoKQotCi0gICAgICAgICAgICBpZiBkb21haW5fZ3VhcmQ6Ci0gICAgICAg
ICAgICAgICAgZG9tYWluX2d1YXJkLmdlbmVyYXRlX29wZW4ob3V0cHV0KQotCi0gICAgICAgICAg
ICBvdXRwdXQuYXBwZW5kKCJuYW1lc3BhY2UgIikKLSAgICAgICAgICAgIG91dHB1dC5hcHBlbmQo
ZG9tYWluX2RhdGEubmFtZSgpKQotICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIHtcbiIpCi0g
ICAgICAgICAgICBmb3IgdHlwZV9kYXRhIGluIGRvbWFpbl9kYXRhLnR5cGVzKCk6Ci0gICAgICAg
ICAgICAgICAgdHlwZV9kYXRhLmdldF9iaW5kaW5nKCkuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91
dHB1dCwgRm9yd2FyZExpc3RlbmVyKQotCi0gICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJ9IC8v
ICIpCi0gICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGRvbWFpbl9kYXRhLm5hbWUoKSkKLSAgICAg
ICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQorICAgICAgICAgICAgdHlwZV9kYXRhX3NldCA9
IHNldCgpCisgICAgICAgICAgICBhbHJlYWR5X2RlY2xhcmVkX3NldCA9IHNldCgpCisKKyAgICAg
ICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIGFkZF90eXBlX2RhdGEoY2xzLCB0
eXBlX2RhdGEpOgorICAgICAgICAgICAgICAgIGlmIHR5cGVfZGF0YSBub3QgaW4gY2xzLmFscmVh
ZHlfZGVjbGFyZWRfc2V0OgorICAgICAgICAgICAgICAgICAgICBjbHMudHlwZV9kYXRhX3NldC5h
ZGQodHlwZV9kYXRhKQorCisgICAgICAgIGRlZiBnZW5lcmF0ZV9hbGxfZG9tYWluc19jb2RlKG91
dCwgdHlwZV9kYXRhX2NhbGxiYWNrKToKKyAgICAgICAgICAgIHdyaXRlciA9IFdyaXRlcihvdXQs
ICIiKQorICAgICAgICAgICAgZm9yIGRvbWFpbl9kYXRhIGluIHR5cGVfbWFwLmRvbWFpbnMoKToK
KyAgICAgICAgICAgICAgICBkb21haW5fZml4ZXMgPSBEb21haW5OYW1lRml4ZXMuZ2V0X2ZpeGVk
X2RhdGEoZG9tYWluX2RhdGEubmFtZSgpKQorICAgICAgICAgICAgICAgIGRvbWFpbl9ndWFyZCA9
IGRvbWFpbl9maXhlcy5nZXRfZ3VhcmQoKQorCisgICAgICAgICAgICAgICAgbmFtZXNwYWNlX2Rl
Y2xhcmVkID0gW10KKworICAgICAgICAgICAgICAgIGRlZiBuYW1lc3BhY2VfbGF6eV9nZW5lcmF0
b3IoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5hbWVzcGFjZV9kZWNsYXJlZDoKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIGRvbWFpbl9ndWFyZDoKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkb21haW5fZ3VhcmQuZ2VuZXJhdGVfb3BlbihvdXQpCisgICAgICAgICAgICAg
ICAgICAgICAgICB3cml0ZXIubmV3bGluZSgibmFtZXNwYWNlICIpCisgICAgICAgICAgICAgICAg
ICAgICAgICB3cml0ZXIuYXBwZW5kKGRvbWFpbl9kYXRhLm5hbWUoKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiB7XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAg
IyBXaGF0IGlzIGEgYmV0dGVyIHdheSB0byBjaGFuZ2UgdmFsdWUgZnJvbSBvdXRlciBzY29wZT8K
KyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZV9kZWNsYXJlZC5hcHBlbmQoVHJ1ZSkK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlcgorCisgICAgICAgICAgICAgICAgZm9y
IHR5cGVfZGF0YSBpbiBkb21haW5fZGF0YS50eXBlcygpOgorICAgICAgICAgICAgICAgICAgICB0
eXBlX2RhdGFfY2FsbGJhY2sodHlwZV9kYXRhLCBuYW1lc3BhY2VfbGF6eV9nZW5lcmF0b3IpCisK
KyAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2VfZGVjbGFyZWQ6CisgICAgICAgICAgICAgICAg
ICAgIHdyaXRlci5hcHBlbmQoIn0gLy8gIikKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFw
cGVuZChkb21haW5fZGF0YS5uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBl
bmQoIlxuXG4iKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGRvbWFpbl9ndWFyZDoKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGRvbWFpbl9ndWFyZC5nZW5lcmF0ZV9jbG9zZShvdXQpCisKKyAg
ICAgICAgZGVmIGNhbGxfdHlwZV9idWlsZGVyKHR5cGVfZGF0YSwgd3JpdGVyX2dldHRlcik6Cisg
ICAgICAgICAgICAjIERvIG5vdCBnZW5lcmF0ZSBmb3J3YXJkcyBmb3IgdGhpcyB0eXBlIGFueSBs
b25nZXIuCisgICAgICAgICAgICBGb3J3YXJkTGlzdGVuZXIuYWxyZWFkeV9kZWNsYXJlZF9zZXQu
YWRkKHR5cGVfZGF0YSkKKworICAgICAgICAgICAgY29kZV9nZW5lcmF0b3IgPSB0eXBlX2RhdGEu
Z2V0X2JpbmRpbmcoKS5nZXRfY29kZV9nZW5lcmF0b3IoKQorICAgICAgICAgICAgIyBDYWxsIGxh
enkgZ2V0dGVyIGV2ZW4gaWYgd2UgZG9uJ3QgZ2VuZXJhdCBhbnl0aGluZy4KKyAgICAgICAgICAg
IHdyaXRlciA9IHdyaXRlcl9nZXR0ZXIoKQorICAgICAgICAgICAgaWYgY29kZV9nZW5lcmF0b3I6
CisgICAgICAgICAgICAgICAgY29kZV9nZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKHdy
aXRlciwgRm9yd2FyZExpc3RlbmVyKQorCisgICAgICAgIGdlbmVyYXRlX2FsbF9kb21haW5zX2Nv
ZGUob3V0cHV0LCBjYWxsX3R5cGVfYnVpbGRlcikKKworICAgICAgICBHZW5lcmF0b3IudHlwZV9i
dWlsZGVyX2ZvcndhcmRzLmFwcGVuZCgiLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuXG4iKQorCisg
ICAgICAgIGRlZiBnZW5lcmF0ZV9mb3J3YXJkX2NhbGxiYWNrKHR5cGVfZGF0YSwgd3JpdGVyX2dl
dHRlcik6CisgICAgICAgICAgICBpZiB0eXBlX2RhdGEgaW4gRm9yd2FyZExpc3RlbmVyLnR5cGVf
ZGF0YV9zZXQ6CisgICAgICAgICAgICAgICAgYmluZGluZyA9IHR5cGVfZGF0YS5nZXRfYmluZGlu
ZygpCisgICAgICAgICAgICAgICAgYmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IoKS5nZW5lcmF0
ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHdyaXRlcl9nZXR0ZXIoKSkKKyAgICAgICAgZ2VuZXJhdGVf
YWxsX2RvbWFpbnNfY29kZShHZW5lcmF0b3IudHlwZV9idWlsZGVyX2ZvcndhcmRzLCBnZW5lcmF0
ZV9mb3J3YXJkX2NhbGxiYWNrKQorCisgICAgICAgIEdlbmVyYXRvci50eXBlX2J1aWxkZXJfZm9y
d2FyZHMuYXBwZW5kKCIvLyBFbmQgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuXG4iKQorCisKK2Rl
ZiBmbGF0dGVuX2xpc3QoaW5wdXQpOgorICAgIHJlcyA9IFtdCisKKyAgICBkZWYgZmlsbF9yZWN1
cnNpdmUobCk6CisgICAgICAgIGZvciBpdGVtIGluIGw6CisgICAgICAgICAgICBpZiBpc2luc3Rh
bmNlKGl0ZW0sIGxpc3QpOgorICAgICAgICAgICAgICAgIGZpbGxfcmVjdXJzaXZlKGl0ZW0pCisg
ICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoaXRlbSkKKyAgICBm
aWxsX3JlY3Vyc2l2ZShpbnB1dCkKKyAgICByZXR1cm4gcmVzCiAKLSAgICAgICAgICAgIGlmIGRv
bWFpbl9ndWFyZDoKLSAgICAgICAgICAgICAgICBkb21haW5fZ3VhcmQuZ2VuZXJhdGVfY2xvc2Uo
b3V0cHV0KQogCiBHZW5lcmF0b3IuZ28oKQogCkBAIC0xNjcwLDcgKzE5MjAsOCBAQCBiYWNrZW5k
X2pzX2ZpbGUgPSBvcGVuKG91dHB1dF9jcHBfZGlybmFtZSArICIvSW5zcGVjdG9yQmFja2VuZFN0
dWIuanMiLCAidyIpCiBmcm9udGVuZF9oX2ZpbGUud3JpdGUoVGVtcGxhdGVzLmZyb250ZW5kX2gu
c3Vic3RpdHV0ZShOb25lLAogICAgICAgICAgZmllbGREZWNsYXJhdGlvbnM9am9pbihHZW5lcmF0
b3IuZnJvbnRlbmRfY2xhc3NfZmllbGRfbGluZXMsICIiKSwKICAgICAgICAgIGRvbWFpbkNsYXNz
TGlzdD1qb2luKEdlbmVyYXRvci5mcm9udGVuZF9kb21haW5fY2xhc3NfbGluZXMsICIiKSwKLSAg
ICAgICAgIHR5cGVCdWlsZGVycz1qb2luKEdlbmVyYXRvci50eXBlX2J1aWxkZXJfZnJhZ21lbnRz
LCAiIikpKQorICAgICAgICAgdHlwZUJ1aWxkZXJzPWpvaW4oZmxhdHRlbl9saXN0KEdlbmVyYXRv
ci50eXBlX2J1aWxkZXJfZnJhZ21lbnRzKSwgIiIpLAorICAgICAgICAgZm9yd2FyZHM9am9pbihH
ZW5lcmF0b3IudHlwZV9idWlsZGVyX2ZvcndhcmRzLCAiIikpKQogCiBiYWNrZW5kX2hfZmlsZS53
cml0ZShUZW1wbGF0ZXMuYmFja2VuZF9oLnN1YnN0aXR1dGUoTm9uZSwKICAgICBjb25zdHJ1Y3Rv
ckluaXQ9am9pbihHZW5lcmF0b3IuYmFja2VuZF9jb25zdHJ1Y3Rvcl9pbml0X2xpc3QsICJcbiIp
LAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>119924</attachid>
            <date>2011-12-19 15:12:06 -0800</date>
            <delta_ts>2011-12-19 15:13:23 -0800</delta_ts>
            <desc>Sample output</desc>
            <filename>InspectorValues.h</filename>
            <type>text/plain</type>
            <size>10187</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiAqIG1ldDoKICoKICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgogKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiBkaXN0cmlidXRp
b24uCiAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAog
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
ICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQogKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCiNpZm5kZWYgSW5zcGVjdG9yVmFsdWVzX2gKI2RlZmlu
ZSBJbnNwZWN0b3JWYWx1ZXNfaAoKI2lmIEVOQUJMRShJTlNQRUNUT1IpCgojaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKCiNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgojaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CiNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CgpuYW1lc3BhY2UgV2ViQ29yZSB7
CgpjbGFzcyBJbnNwZWN0b3JBcnJheTsKY2xhc3MgSW5zcGVjdG9yT2JqZWN0OwoKY2xhc3MgSW5z
cGVjdG9yVmFsdWUgOiBwdWJsaWMgUmVmQ291bnRlZDxJbnNwZWN0b3JWYWx1ZT4gewpwdWJsaWM6
CiAgICBzdGF0aWMgY29uc3QgaW50IG1heERlcHRoID0gMTAwMDsKCiAgICBJbnNwZWN0b3JWYWx1
ZSgpIDogbV90eXBlKFR5cGVOdWxsKSB7IH0KICAgIHZpcnR1YWwgfkluc3BlY3RvclZhbHVlKCkg
eyB9CgogICAgc3RhdGljIFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IG51bGwoKQogICAgewog
ICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5zcGVjdG9yVmFsdWUoKSk7CiAgICB9CgogICAg
dHlwZWRlZiBlbnVtIHsKICAgICAgICBUeXBlTnVsbCA9IDAsCiAgICAgICAgVHlwZUJvb2xlYW4s
CiAgICAgICAgVHlwZU51bWJlciwKICAgICAgICBUeXBlU3RyaW5nLAogICAgICAgIFR5cGVPYmpl
Y3QsCiAgICAgICAgVHlwZUFycmF5CiAgICB9IFR5cGU7CgogICAgVHlwZSB0eXBlKCkgY29uc3Qg
eyByZXR1cm4gbV90eXBlOyB9CgogICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBtX3R5
cGUgPT0gVHlwZU51bGw7IH0KCiAgICB2aXJ0dWFsIGJvb2wgYXNCb29sZWFuKGJvb2wqIG91dHB1
dCkgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgYXNOdW1iZXIoZG91YmxlKiBvdXRwdXQpIGNvbnN0
OwogICAgdmlydHVhbCBib29sIGFzTnVtYmVyKGxvbmcqIG91dHB1dCkgY29uc3Q7CiAgICB2aXJ0
dWFsIGJvb2wgYXNOdW1iZXIoaW50KiBvdXRwdXQpIGNvbnN0OwogICAgdmlydHVhbCBib29sIGFz
TnVtYmVyKHVuc2lnbmVkIGxvbmcqIG91dHB1dCkgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgYXNO
dW1iZXIodW5zaWduZWQgaW50KiBvdXRwdXQpIGNvbnN0OwogICAgdmlydHVhbCBib29sIGFzU3Ry
aW5nKFN0cmluZyogb3V0cHV0KSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBhc1ZhbHVlKFJlZlB0
cjxJbnNwZWN0b3JWYWx1ZT4qIG91dHB1dCk7CiAgICB2aXJ0dWFsIGJvb2wgYXNPYmplY3QoUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4qIG91dHB1dCk7CiAgICB2aXJ0dWFsIGJvb2wgYXNBcnJheShS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+KiBvdXRwdXQpOwogICAgdmlydHVhbCBQYXNzUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gYXNPYmplY3QoKTsKICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJbnNwZWN0
b3JBcnJheT4gYXNBcnJheSgpOwoKICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVl
PiBwYXJzZUpTT04oY29uc3QgU3RyaW5nJiBqc29uKTsKCiAgICBTdHJpbmcgdG9KU09OU3RyaW5n
KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgd3JpdGVKU09OKFN0cmluZ0J1aWxkZXIqIG91dHB1
dCkgY29uc3Q7Cgpwcm90ZWN0ZWQ6CiAgICBleHBsaWNpdCBJbnNwZWN0b3JWYWx1ZShUeXBlIHR5
cGUpIDogbV90eXBlKHR5cGUpIHsgfQoKcHJpdmF0ZToKICAgIFR5cGUgbV90eXBlOwp9OwoKY2xh
c3MgSW5zcGVjdG9yQmFzaWNWYWx1ZSA6IHB1YmxpYyBJbnNwZWN0b3JWYWx1ZSB7CnB1YmxpYzoK
CiAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbnNwZWN0b3JCYXNpY1ZhbHVlPiBjcmVhdGUoYm9vbCB2
YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEluc3BlY3RvckJhc2ljVmFs
dWUodmFsdWUpKTsKICAgIH0KCiAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbnNwZWN0b3JCYXNpY1Zh
bHVlPiBjcmVhdGUoaW50IHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
SW5zcGVjdG9yQmFzaWNWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAgIHN0YXRpYyBQYXNzUmVmUHRy
PEluc3BlY3RvckJhc2ljVmFsdWU+IGNyZWF0ZShkb3VibGUgdmFsdWUpCiAgICB7CiAgICAgICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBJbnNwZWN0b3JCYXNpY1ZhbHVlKHZhbHVlKSk7CiAgICB9Cgog
ICAgdmlydHVhbCBib29sIGFzQm9vbGVhbihib29sKiBvdXRwdXQpIGNvbnN0OwogICAgdmlydHVh
bCBib29sIGFzTnVtYmVyKGRvdWJsZSogb3V0cHV0KSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBh
c051bWJlcihsb25nKiBvdXRwdXQpIGNvbnN0OwogICAgdmlydHVhbCBib29sIGFzTnVtYmVyKGlu
dCogb3V0cHV0KSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBhc051bWJlcih1bnNpZ25lZCBsb25n
KiBvdXRwdXQpIGNvbnN0OwogICAgdmlydHVhbCBib29sIGFzTnVtYmVyKHVuc2lnbmVkIGludCog
b3V0cHV0KSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgd3JpdGVKU09OKFN0cmluZ0J1aWxkZXIq
IG91dHB1dCkgY29uc3Q7Cgpwcml2YXRlOgogICAgZXhwbGljaXQgSW5zcGVjdG9yQmFzaWNWYWx1
ZShib29sIHZhbHVlKSA6IEluc3BlY3RvclZhbHVlKFR5cGVCb29sZWFuKSwgbV9ib29sVmFsdWUo
dmFsdWUpIHsgfQogICAgZXhwbGljaXQgSW5zcGVjdG9yQmFzaWNWYWx1ZShpbnQgdmFsdWUpIDog
SW5zcGVjdG9yVmFsdWUoVHlwZU51bWJlciksIG1fZG91YmxlVmFsdWUoKGRvdWJsZSl2YWx1ZSkg
eyB9CiAgICBleHBsaWNpdCBJbnNwZWN0b3JCYXNpY1ZhbHVlKGRvdWJsZSB2YWx1ZSkgOiBJbnNw
ZWN0b3JWYWx1ZShUeXBlTnVtYmVyKSwgbV9kb3VibGVWYWx1ZSh2YWx1ZSkgeyB9CgogICAgdW5p
b24gewogICAgICAgIGJvb2wgbV9ib29sVmFsdWU7CiAgICAgICAgZG91YmxlIG1fZG91YmxlVmFs
dWU7CiAgICB9Owp9OwoKY2xhc3MgSW5zcGVjdG9yU3RyaW5nIDogcHVibGljIEluc3BlY3RvclZh
bHVlIHsKcHVibGljOgogICAgc3RhdGljIFBhc3NSZWZQdHI8SW5zcGVjdG9yU3RyaW5nPiBjcmVh
dGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IEluc3BlY3RvclN0cmluZyh2YWx1ZSkpOwogICAgfQoKICAgIHN0YXRpYyBQYXNzUmVmUHRyPElu
c3BlY3RvclN0cmluZz4gY3JlYXRlKGNvbnN0IGNoYXIqIHZhbHVlKQogICAgewogICAgICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgSW5zcGVjdG9yU3RyaW5nKHZhbHVlKSk7CiAgICB9CgogICAgdmly
dHVhbCBib29sIGFzU3RyaW5nKFN0cmluZyogb3V0cHV0KSBjb25zdDsgICAgCgogICAgdmlydHVh
bCB2b2lkIHdyaXRlSlNPTihTdHJpbmdCdWlsZGVyKiBvdXRwdXQpIGNvbnN0OwoKcHJpdmF0ZToK
ICAgIGV4cGxpY2l0IEluc3BlY3RvclN0cmluZyhjb25zdCBTdHJpbmcmIHZhbHVlKSA6IEluc3Bl
Y3RvclZhbHVlKFR5cGVTdHJpbmcpLCBtX3N0cmluZ1ZhbHVlKHZhbHVlKSB7IH0KICAgIGV4cGxp
Y2l0IEluc3BlY3RvclN0cmluZyhjb25zdCBjaGFyKiB2YWx1ZSkgOiBJbnNwZWN0b3JWYWx1ZShU
eXBlU3RyaW5nKSwgbV9zdHJpbmdWYWx1ZSh2YWx1ZSkgeyB9CgogICAgU3RyaW5nIG1fc3RyaW5n
VmFsdWU7Cn07CgpjbGFzcyBJbnNwZWN0b3JPYmplY3QgOiBwdWJsaWMgSW5zcGVjdG9yVmFsdWUg
ewpwcml2YXRlOgogICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgUmVmUHRyPEluc3BlY3RvclZh
bHVlPiA+IERpY3Rpb25hcnk7CgpwdWJsaWM6CiAgICB0eXBlZGVmIERpY3Rpb25hcnk6Oml0ZXJh
dG9yIGl0ZXJhdG9yOwogICAgdHlwZWRlZiBEaWN0aW9uYXJ5Ojpjb25zdF9pdGVyYXRvciBjb25z
dF9pdGVyYXRvcjsKCiAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGNyZWF0
ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbnNwZWN0b3JPYmplY3QoKSk7
CiAgICB9CiAgICB+SW5zcGVjdG9yT2JqZWN0KCk7CgogICAgdmlydHVhbCBib29sIGFzT2JqZWN0
KFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+KiBvdXRwdXQpOwogICAgdmlydHVhbCBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gYXNPYmplY3QoKTsKCiAgICB2b2lkIHNldEJvb2xlYW4oY29uc3Qg
U3RyaW5nJiBuYW1lLCBib29sKTsKICAgIHZvaWQgc2V0TnVtYmVyKGNvbnN0IFN0cmluZyYgbmFt
ZSwgZG91YmxlKTsKICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJik7CiAgICB2b2lkIHNldFZhbHVlKGNvbnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JWYWx1ZT4pOwogICAgdm9pZCBzZXRPYmplY3QoY29uc3QgU3RyaW5nJiBuYW1l
LCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4pOwogICAgdm9pZCBzZXRBcnJheShjb25zdCBT
dHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+KTsKCiAgICBpdGVyYXRvciBm
aW5kKGNvbnN0IFN0cmluZyYgbmFtZSk7CiAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IFN0
cmluZyYgbmFtZSkgY29uc3Q7CiAgICBib29sIGdldEJvb2xlYW4oY29uc3QgU3RyaW5nJiBuYW1l
LCBib29sKiBvdXRwdXQpIGNvbnN0OwogICAgdGVtcGxhdGU8Y2xhc3MgVD4gYm9vbCBnZXROdW1i
ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBUKiBvdXRwdXQpIGNvbnN0CiAgICB7CiAgICAgICAgUmVm
UHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSA9IGdldChuYW1lKTsKICAgICAgICBpZiAoIXZhbHVl
KQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHZhbHVlLT5hc051bWJl
cihvdXRwdXQpOwogICAgfQogICAgYm9vbCBnZXRTdHJpbmcoY29uc3QgU3RyaW5nJiBuYW1lLCBT
dHJpbmcqIG91dHB1dCkgY29uc3Q7CiAgICBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZ2V0
T2JqZWN0KGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7CiAgICBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBnZXRBcnJheShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0OwogICAgUGFzc1JlZlB0
cjxJbnNwZWN0b3JWYWx1ZT4gZ2V0KGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7CgogICAgdm9p
ZCByZW1vdmUoY29uc3QgU3RyaW5nJiBuYW1lKTsKCiAgICB2aXJ0dWFsIHZvaWQgd3JpdGVKU09O
KFN0cmluZ0J1aWxkZXIqIG91dHB1dCkgY29uc3Q7CgogICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJl
dHVybiBtX2RhdGEuYmVnaW4oKTsgfQogICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbV9kYXRh
LmVuZCgpOyB9CiAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YS5iZWdpbigpOyB9CiAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX2Rh
dGEuZW5kKCk7IH0KCnByb3RlY3RlZDoKICAgIEluc3BlY3Rvck9iamVjdCgpOwoKcHJpdmF0ZToK
ICAgIERpY3Rpb25hcnkgbV9kYXRhOwogICAgVmVjdG9yPFN0cmluZz4gbV9vcmRlcjsKfTsKCmNs
YXNzIEluc3BlY3RvckFycmF5IDogcHVibGljIEluc3BlY3RvclZhbHVlIHsKcHVibGljOgogICAg
dHlwZWRlZiBWZWN0b3I8UmVmUHRyPEluc3BlY3RvclZhbHVlPiA+OjppdGVyYXRvciBpdGVyYXRv
cjsKICAgIHR5cGVkZWYgVmVjdG9yPFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gPjo6Y29uc3RfaXRl
cmF0b3IgY29uc3RfaXRlcmF0b3I7CgogICAgc3RhdGljIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJy
YXk+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbnNwZWN0b3JB
cnJheSgpKTsKICAgIH0KICAgIH5JbnNwZWN0b3JBcnJheSgpOwoKICAgIHZpcnR1YWwgYm9vbCBh
c0FycmF5KFJlZlB0cjxJbnNwZWN0b3JBcnJheT4qIG91dHB1dCk7CiAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGFzQXJyYXkoKTsKCiAgICB2b2lkIHB1c2hCb29sZWFuKGJv
b2wpOwogICAgdm9pZCBwdXNoTnVtYmVyKGRvdWJsZSk7CiAgICB2b2lkIHB1c2hTdHJpbmcoY29u
c3QgU3RyaW5nJik7CiAgICB2b2lkIHB1c2hWYWx1ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVl
Pik7CiAgICB2b2lkIHB1c2hPYmplY3QoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+KTsKICAg
IHZvaWQgcHVzaEFycmF5KFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+KTsKICAgIHVuc2lnbmVk
IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5zaXplKCk7IH0KCiAgICBQYXNzUmVmUHRy
PEluc3BlY3RvclZhbHVlPiBnZXQoc2l6ZV90IGluZGV4KTsKCiAgICB2aXJ0dWFsIHZvaWQgd3Jp
dGVKU09OKFN0cmluZ0J1aWxkZXIqIG91dHB1dCkgY29uc3Q7CgogICAgaXRlcmF0b3IgYmVnaW4o
KSB7IHJldHVybiBtX2RhdGEuYmVnaW4oKTsgfQogICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4g
bV9kYXRhLmVuZCgpOyB9CiAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YS5iZWdpbigpOyB9CiAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBtX2RhdGEuZW5kKCk7IH0KCnByaXZhdGU6CiAgICBJbnNwZWN0b3JBcnJheSgpOwogICAgVmVj
dG9yPFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gPiBtX2RhdGE7Cn07CgppbmxpbmUgSW5zcGVjdG9y
T2JqZWN0OjppdGVyYXRvciBJbnNwZWN0b3JPYmplY3Q6OmZpbmQoY29uc3QgU3RyaW5nJiBuYW1l
KQp7CiAgICByZXR1cm4gbV9kYXRhLmZpbmQobmFtZSk7Cn0KCmlubGluZSBJbnNwZWN0b3JPYmpl
Y3Q6OmNvbnN0X2l0ZXJhdG9yIEluc3BlY3Rvck9iamVjdDo6ZmluZChjb25zdCBTdHJpbmcmIG5h
bWUpIGNvbnN0CnsKICAgIHJldHVybiBtX2RhdGEuZmluZChuYW1lKTsKfQoKaW5saW5lIHZvaWQg
SW5zcGVjdG9yT2JqZWN0OjpzZXRCb29sZWFuKGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCB2YWx1
ZSkKewogICAgc2V0VmFsdWUobmFtZSwgSW5zcGVjdG9yQmFzaWNWYWx1ZTo6Y3JlYXRlKHZhbHVl
KSk7Cn0KCmlubGluZSB2b2lkIEluc3BlY3Rvck9iamVjdDo6c2V0TnVtYmVyKGNvbnN0IFN0cmlu
ZyYgbmFtZSwgZG91YmxlIHZhbHVlKQp7CiAgICBzZXRWYWx1ZShuYW1lLCBJbnNwZWN0b3JCYXNp
Y1ZhbHVlOjpjcmVhdGUodmFsdWUpKTsKfQoKaW5saW5lIHZvaWQgSW5zcGVjdG9yT2JqZWN0Ojpz
ZXRTdHJpbmcoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQp7CiAgICBz
ZXRWYWx1ZShuYW1lLCBJbnNwZWN0b3JTdHJpbmc6OmNyZWF0ZSh2YWx1ZSkpOwp9CgppbmxpbmUg
dm9pZCBJbnNwZWN0b3JPYmplY3Q6OnNldFZhbHVlKGNvbnN0IFN0cmluZyYgbmFtZSwgUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCnsKICAgIEFTU0VSVCh2YWx1ZSk7CiAgICBpZiAo
bV9kYXRhLnNldChuYW1lLCB2YWx1ZSkuc2Vjb25kKQogICAgICAgIG1fb3JkZXIuYXBwZW5kKG5h
bWUpOwp9CgppbmxpbmUgdm9pZCBJbnNwZWN0b3JPYmplY3Q6OnNldE9iamVjdChjb25zdCBTdHJp
bmcmIG5hbWUsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKewogICAgQVNTRVJU
KHZhbHVlKTsKICAgIGlmIChtX2RhdGEuc2V0KG5hbWUsIHZhbHVlKS5zZWNvbmQpCiAgICAgICAg
bV9vcmRlci5hcHBlbmQobmFtZSk7Cn0KCmlubGluZSB2b2lkIEluc3BlY3Rvck9iamVjdDo6c2V0
QXJyYXkoY29uc3QgU3RyaW5nJiBuYW1lLCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1
ZSkKewogICAgQVNTRVJUKHZhbHVlKTsKICAgIGlmIChtX2RhdGEuc2V0KG5hbWUsIHZhbHVlKS5z
ZWNvbmQpCiAgICAgICAgbV9vcmRlci5hcHBlbmQobmFtZSk7Cn0KCmlubGluZSB2b2lkIEluc3Bl
Y3RvckFycmF5OjpwdXNoQm9vbGVhbihib29sIHZhbHVlKQp7CiAgICBtX2RhdGEuYXBwZW5kKElu
c3BlY3RvckJhc2ljVmFsdWU6OmNyZWF0ZSh2YWx1ZSkpOwp9CgppbmxpbmUgdm9pZCBJbnNwZWN0
b3JBcnJheTo6cHVzaE51bWJlcihkb3VibGUgdmFsdWUpCnsKICAgIG1fZGF0YS5hcHBlbmQoSW5z
cGVjdG9yQmFzaWNWYWx1ZTo6Y3JlYXRlKHZhbHVlKSk7Cn0KCmlubGluZSB2b2lkIEluc3BlY3Rv
ckFycmF5OjpwdXNoU3RyaW5nKGNvbnN0IFN0cmluZyYgdmFsdWUpCnsKICAgIG1fZGF0YS5hcHBl
bmQoSW5zcGVjdG9yU3RyaW5nOjpjcmVhdGUodmFsdWUpKTsKfQoKaW5saW5lIHZvaWQgSW5zcGVj
dG9yQXJyYXk6OnB1c2hWYWx1ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKewog
ICAgQVNTRVJUKHZhbHVlKTsKICAgIG1fZGF0YS5hcHBlbmQodmFsdWUpOwp9CgppbmxpbmUgdm9p
ZCBJbnNwZWN0b3JBcnJheTo6cHVzaE9iamVjdChQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
dmFsdWUpCnsKICAgIEFTU0VSVCh2YWx1ZSk7CiAgICBtX2RhdGEuYXBwZW5kKHZhbHVlKTsKfQoK
aW5saW5lIHZvaWQgSW5zcGVjdG9yQXJyYXk6OnB1c2hBcnJheShQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiB2YWx1ZSkKewogICAgQVNTRVJUKHZhbHVlKTsKICAgIG1fZGF0YS5hcHBlbmQodmFs
dWUpOwp9Cgp9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCgojZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RP
UikKI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvclZhbHVlc19oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>119926</attachid>
            <date>2011-12-19 15:13:23 -0800</date>
            <delta_ts>2011-12-19 15:13:23 -0800</delta_ts>
            <desc>Sample output InspectorFrontend.h</desc>
            <filename>InspectorFrontend.h</filename>
            <type>text/plain</type>
            <size>142021</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgojaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gKI2RlZmluZSBJbnNw
ZWN0b3JGcm9udGVuZF9oCgojaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNsdWRlIDxQ
bGF0Zm9ybVN0cmluZy5oPgojaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KCm5hbWVzcGFjZSBX
ZWJDb3JlIHsKCmNsYXNzIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKCi8vIEJvdGggSW5zcGVj
dG9yT2JqZWN0IGFuZCBJbnNwZWN0b3JBcnJheSBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBh
dCB0aGlzIHBvaW50IGFzIGRlZmluZWQgYnkgRU5BQkxFRF9JTlNQRUNUT1IuCi8vIERvdWJsZS1j
aGVjayB3ZSBoYXZlIHRoZW0gYXQgbGVhc3QgYXMgZm9yd2FyZCBkZWNsYXJhdGlvbi4KY2xhc3Mg
SW5zcGVjdG9yQXJyYXk7CmNsYXNzIEluc3BlY3Rvck9iamVjdDsKCnR5cGVkZWYgU3RyaW5nIEVy
cm9yU3RyaW5nOwoKI2lmIEVOQUJMRShJTlNQRUNUT1IpCgpuYW1lc3BhY2UgVHlwZUJ1aWxkZXIg
ewovLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KbmFtZXNwYWNlIENTUyB7CmNsYXNzIFNvdXJjZVJh
bmdlOwpjbGFzcyBDU1NTdHlsZTsKfSAvLyBDU1MKCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJV
R0dFUikKbmFtZXNwYWNlIERlYnVnZ2VyIHsKY2xhc3MgTG9jYXRpb247Cn0gLy8gRGVidWdnZXIK
CiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKLy8gRW5kIG9mIGZvcndhcmQg
ZGVjbGFyYXRpb25zLgoKbmFtZXNwYWNlIE1lbW9yeSB7Ci8qIE51bWJlciBvZiBub2RlcyB3aXRo
IGdpdmVuIG5hbWUuICovCmNsYXNzIE5vZGVDb3VudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qg
ewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBO
T0RFX05BTUVfU0VUID0gMSA8PCAwLAogICAgICAgIENPVU5UX1NFVCA9IDEgPDwgMSwKICAgICAg
ICBBTExfRklFTERTX1NFVCA9IChOT0RFX05BTUVfU0VUIHwgQ09VTlRfU0VUKQogICAgfTsKCiAg
ICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRl
PGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+
Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Tm9kZUNvdW50
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19G
SUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIE5vZGVDb3Vu
dDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5PREVfTkFNRV9TRVQ+JiBz
ZXROb2RlTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIE5PREVfTkFNRV9TRVQpLCBwcm9wZXJ0eV9ub2RlTmFtZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5vZGVOYW1lIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5PREVfTkFNRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ09VTlRfU0VUPiYgc2V0Q291bnQoaW50
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENP
VU5UX1NFVCksIHByb3BlcnR5X2NvdW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldE51bWJlcigiY291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8Q09VTlRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPE5vZGVD
b3VudD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBB
TExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Tm9kZUNvdW50Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE5vZGVDb3VudD4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8Tm9kZUNvdW50PigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPE5v
ZGVDb3VudD4gcmVzdWx0ID0gTm9kZUNvdW50OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROb2Rl
TmFtZSguLi4pCiAgICAgKiAgICAgLnNldENvdW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IE5vZGVDb3VudCgpKSk7CiAgICB9Cn07Cgpj
bGFzcyBET01Hcm91cCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTSVpFX1NFVCA9IDEgPDwgMCwK
ICAgICAgICBUSVRMRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgTk9ERV9DT1VOVF9TRVQgPSAxIDw8
IDIsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoU0laRV9TRVQgfCBUSVRMRV9TRVQgfCBOT0RF
X0NPVU5UX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPERPTUdyb3VwPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIERPTUdyb3VwOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgU0laRV9TRVQ+JiBzZXRTaXplKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTSVpFX1NFVCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNJWkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFRJVExFX1NFVD4mIHNldFRpdGxlKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVElUTEVfU0VU
KSwgcHJvcGVydHlfdGl0bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ0aXRsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUSVRM
RV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9DT1VOVF9T
RVQ+JiBzZXROb2RlQ291bnQoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTk9ERV9DT1VOVF9TRVQp
LCBwcm9wZXJ0eV9ub2RlQ291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0QXJyYXkoIm5vZGVDb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxOT0RFX0NPVU5UX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxE
T01Hcm91cD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RE9NR3JvdXA+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RE9NR3JvdXA+ICgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gUmVmUHRyPERPTUdyb3VwPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPERP
TUdyb3VwPiByZXN1bHQgPSBET01Hcm91cDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2l6ZSgu
Li4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAqICAgICAuc2V0Tm9kZUNvdW50KC4u
Lik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IERP
TUdyb3VwKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldERvY3VtZW50VVJJKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVSSSIsIHZhbHVl
KTsKICAgIH0KfTsKCn0gLy8gTWVtb3J5CgpuYW1lc3BhY2UgUGFnZSB7Ci8qIFJlc291cmNlIHR5
cGUgYXMgaXQgd2FzIHBlcmNlaXZlZCBieSB0aGUgcmVuZGVyaW5nIGVuZ2luZS4gKi8KbmFtZXNw
YWNlIFJlc291cmNlVHlwZSB7CmNvbnN0IGNoYXIqIGNvbnN0IGRvY3VtZW50ID0gIkRvY3VtZW50
IjsKY29uc3QgY2hhciogY29uc3Qgc3R5bGVzaGVldCA9ICJTdHlsZXNoZWV0IjsKY29uc3QgY2hh
ciogY29uc3QgaW1hZ2UgPSAiSW1hZ2UiOwpjb25zdCBjaGFyKiBjb25zdCBmb250ID0gIkZvbnQi
Owpjb25zdCBjaGFyKiBjb25zdCBzY3JpcHQgPSAiU2NyaXB0IjsKY29uc3QgY2hhciogY29uc3Qg
eGhyID0gIlhIUiI7CmNvbnN0IGNoYXIqIGNvbnN0IHdlYlNvY2tldCA9ICJXZWJTb2NrZXQiOwpj
b25zdCBjaGFyKiBjb25zdCBvdGhlciA9ICJPdGhlciI7Cn0gLy8gbmFtZXNwYWNlIFJlc291cmNl
VHlwZQoKLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEZyYW1lIG9uIHRoZSBwYWdlLiAqLwpjbGFz
cyBGcmFtZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBJRF9TRVQgPSAxIDw8IDAsCiAgICAgICAg
TE9BREVSX0lEX1NFVCA9IDEgPDwgMSwKICAgICAgICBVUkxfU0VUID0gMSA8PCAyLAogICAgICAg
IE1JTUVfVFlQRV9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoSURfU0VU
IHwgTE9BREVSX0lEX1NFVCB8IFVSTF9TRVQgfCBNSU1FX1RZUEVfU0VUKQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RnJhbWU+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRnJhbWU7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJRF9TRVQ+JiBzZXRJZChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIElE
X1NFVCksIHByb3BlcnR5X2lkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygiaWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SURfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExPQURFUl9JRF9TRVQ+JiBz
ZXRMb2FkZXJJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIExPQURFUl9JRF9TRVQpLCBwcm9wZXJ0eV9sb2FkZXJJZF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImxvYWRlcklkIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExPQURFUl9JRF9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVJMX1NFVD4mIHNldFVybChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFVSTF9TRVQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VVJMX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNSU1FX1RZ
UEVfU0VUPiYgc2V0TWltZVR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNSU1FX1RZUEVfU0VUKSwgcHJvcGVydHlf
bWltZVR5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJt
aW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNSU1FX1RZUEVf
U0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEZyYW1lPiYgKCkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VU
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUGFzc1JlZlB0cjxGcmFtZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQ
dHI8RnJhbWU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0
aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8RnJhbWU+IHJlc3VsdCA9IEZyYW1lOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXRJZCguLi4pCiAgICAgKiAgICAgLnNldExvYWRlcklkKC4uLikK
ICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TWltZVR5cGUoLi4uKTsKICAg
ICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAg
ICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgRnJhbWUoKSkp
OwogICAgfQoKICAgIHZvaWQgc2V0UGFyZW50SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInBhcmVudElkIiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0
cmluZygibmFtZSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBG
cmFtZSBoaWVyYXJjaHkgYWxvbmcgd2l0aCB0aGVpciBjYWNoZWQgcmVzb3VyY2VzLiAqLwpjbGFz
cyBGcmFtZVJlc291cmNlVHJlZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAg
ICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdyZXNvdXJjZXMnIHdoaWxlIGdlbmVyYXRp
bmcgRnJhbWVSZXNvdXJjZVRyZWUuCiAgICAvLyBOYW1lZCBhcyBhbiBpdGVtIG9mIGFycmF5Lgog
ICAgY2xhc3MgUmVzb3VyY2VzSXRlbSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewogICAgcHVi
bGljOgogICAgICAgIGVudW0gewogICAgICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAg
ICAgICAgVVJMX1NFVCA9IDEgPDwgMCwKICAgICAgICAgICAgVFlQRV9TRVQgPSAxIDw8IDEsCiAg
ICAgICAgICAgIE1JTUVfVFlQRV9TRVQgPSAxIDw8IDIsCiAgICAgICAgICAgIEFMTF9GSUVMRFNf
U0VUID0gKFVSTF9TRVQgfCBUWVBFX1NFVCB8IE1JTUVfVFlQRV9TRVQpCiAgICAgICAgfTsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgICAgIGNsYXNzIEJ1aWxkZXIgewogICAgICAg
IHByaXZhdGU6CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgICAgICB9CgogICAg
ICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UmVzb3VyY2VzSXRlbT4gcHRyKQogICAgICAgICAg
ICB7CiAgICAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VU
LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJpZW5kIGNsYXNzIFJlc291
cmNlc0l0ZW07CiAgICAgICAgcHVibGljOgogICAgCiAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBVUkxfU0VUPiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgICAgIHsKICAg
ICAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwgcHJvcGVydHlf
dXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVy
bCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VVJMX1NFVD4oKTsK
ICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NFVD4m
IHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVydHlfdHlwZV9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFs
dWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAgICAg
ICAgICAgfQogICAgCiAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNSU1FX1RZUEVfU0VUPiYg
c2V0TWltZVR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1JTUVfVFlQRV9TRVQpLCBwcm9wZXJ0eV9t
aW1lVHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJtaW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUlN
RV9UWVBFX1NFVD4oKTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxSZXNvdXJjZXNJdGVtPiYgKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkp
OwogICAgICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXNvdXJj
ZXNJdGVtPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8UmVzb3VyY2VzSXRlbT4gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAg
ICAgcmV0dXJuIFJlZlB0cjxSZXNvdXJjZXNJdGVtPigqdGhpcyk7CiAgICAgICAgICAgIH0KICAg
ICAgICB9OwoKICAgICAgICAvKgogICAgICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAg
ICAgICAgKiBSZWZQdHI8UmVzb3VyY2VzSXRlbT4gcmVzdWx0ID0gUmVzb3VyY2VzSXRlbTo6Y3Jl
YXRlKCkKICAgICAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgICAgICogICAgIC5zZXRUeXBl
KC4uLikKICAgICAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4uLik7CiAgICAgICAgICovCiAgICAg
ICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBSZXNvdXJj
ZXNJdGVtKCkpKTsKICAgICAgICB9CiAgICB9OwoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxE
U19TRVQgPSAwLAogICAgICAgIEZSQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBSRVNPVVJDRVNf
U0VUID0gMSA8PCAxLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKEZSQU1FX1NFVCB8IFJFU09V
UkNFU19TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBGcmFtZVJlc291cmNlVHJlZTsKICAgIHB1YmxpYzoKCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IEZSQU1FX1NFVD4mIHNldEZyYW1lKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6UGFnZTo6RnJhbWU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZSQU1FX1NF
VCksIHByb3BlcnR5X2ZyYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dE9iamVjdCgiZnJhbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RlJB
TUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJFU09VUkNFU19T
RVQ+JiBzZXRSZXNvdXJjZXMoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUkVTT1VSQ0VTX1NFVCks
IHByb3BlcnR5X3Jlc291cmNlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRBcnJheSgicmVzb3VyY2VzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFJFU09VUkNFU19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJh
bWVSZXNvdXJjZVRyZWU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEZyYW1lUmVz
b3VyY2VUcmVlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxGcmFtZVJl
c291cmNlVHJlZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4gcmVzdWx0
ID0gRnJhbWVSZXNvdXJjZVRyZWU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEZyYW1lKC4uLikK
ICAgICAqICAgICAuc2V0UmVzb3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVy
PE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9f
RklFTERTX1NFVD4oYWRvcHRSZWYobmV3IEZyYW1lUmVzb3VyY2VUcmVlKCkpKTsKICAgIH0KCiAg
ICB2b2lkIHNldENoaWxkRnJhbWVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJjaGlsZEZyYW1lcyIsIHZhbHVlKTsKICAgIH0K
fTsKCi8qIFNlYXJjaCBtYXRjaCBmb3IgcmVzb3VyY2UuICovCmNsYXNzIFNlYXJjaE1hdGNoIDog
cHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJ
RUxEU19TRVQgPSAwLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9IDEgPDwgMCwKICAgICAgICBM
SU5FX0NPTlRFTlRfU0VUID0gMSA8PCAxLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKExJTkVf
TlVNQkVSX1NFVCB8IExJTkVfQ09OVEVOVF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTZWFyY2hNYXRjaDsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExJTkVfTlVNQkVSX1NFVD4mIHNldExpbmVOdW1i
ZXIoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIExJTkVfTlVNQkVSX1NFVCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfTlVNQkVSX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMSU5FX0NPTlRFTlRfU0VUPiYgc2V0TGluZUNvbnRl
bnQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBMSU5FX0NPTlRFTlRfU0VUKSwgcHJvcGVydHlfbGluZUNvbnRlbnRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJsaW5lQ29udGVudCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMSU5FX0NPTlRFTlRfU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlYXJjaE1hdGNoPiYgKCkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VU
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxTZWFyY2hNYXRjaD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8U2VhcmNoTWF0Y2g+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2VhcmNoTWF0
Y2g+IHJlc3VsdCA9IFNlYXJjaE1hdGNoOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRMaW5lTnVt
YmVyKC4uLikKICAgICAqICAgICAuc2V0TGluZUNvbnRlbnQoLi4uKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgU2VhcmNoTWF0Y2goKSkpOwogICAg
fQp9OwoKLyogU2VhcmNoIHJlc3VsdCBmb3IgcmVzb3VyY2UuICovCmNsYXNzIFNlYXJjaFJlc3Vs
dCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
T19GSUVMRFNfU0VUID0gMCwKICAgICAgICBVUkxfU0VUID0gMSA8PCAwLAogICAgICAgIEZSQU1F
X0lEX1NFVCA9IDEgPDwgMSwKICAgICAgICBNQVRDSEVTX0NPVU5UX1NFVCA9IDEgPDwgMiwKICAg
ICAgICBBTExfRklFTERTX1NFVCA9IChVUkxfU0VUIHwgRlJBTUVfSURfU0VUIHwgTUFUQ0hFU19D
T1VOVF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxTZWFyY2hSZXN1bHQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgU2VhcmNoUmVzdWx0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgVVJMX1NFVD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVSTF9TRVQpLCBwcm9wZXJ0eV91
cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VVJMX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGUkFNRV9JRF9TRVQ+JiBzZXRGcmFtZUlkKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgRlJBTUVfSURfU0VUKSwgcHJvcGVydHlfZnJhbWVJZF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZyYW1lSWQiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8RlJBTUVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE1BVENIRVNfQ09VTlRfU0VUPiYgc2V0TWF0Y2hlc0NvdW50KGRvdWJsZSB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNQVRD
SEVTX0NPVU5UX1NFVCksIHByb3BlcnR5X21hdGNoZXNDb3VudF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm1hdGNoZXNDb3VudCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNQVRDSEVTX0NPVU5UX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTZWFyY2hSZXN1bHQ+JiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19u
b3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNl
YXJjaFJlc3VsdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxTZWFyY2hSZXN1bHQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPFNlYXJjaFJlc3VsdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAq
IFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWFyY2hSZXN1bHQ+IHJlc3Vs
dCA9IFNlYXJjaFJlc3VsdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAq
ICAgICAuc2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1hdGNoZXNDb3VudCguLi4pOwog
ICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewog
ICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBTZWFyY2hS
ZXN1bHQoKSkpOwogICAgfQp9OwoKLyogQ29va2llIG9iamVjdCAqLwpjbGFzcyBDb29raWUgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklF
TERTX1NFVCA9IDAsCiAgICAgICAgTkFNRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgVkFMVUVfU0VU
ID0gMSA8PCAxLAogICAgICAgIERPTUFJTl9TRVQgPSAxIDw8IDIsCiAgICAgICAgUEFUSF9TRVQg
PSAxIDw8IDMsCiAgICAgICAgRVhQSVJFU19TRVQgPSAxIDw8IDQsCiAgICAgICAgU0laRV9TRVQg
PSAxIDw8IDUsCiAgICAgICAgSFRUUF9PTkxZX1NFVCA9IDEgPDwgNiwKICAgICAgICBTRUNVUkVf
U0VUID0gMSA8PCA3LAogICAgICAgIFNFU1NJT05fU0VUID0gMSA8PCA4LAogICAgICAgIEFMTF9G
SUVMRFNfU0VUID0gKE5BTUVfU0VUIHwgVkFMVUVfU0VUIHwgRE9NQUlOX1NFVCB8IFBBVEhfU0VU
IHwgRVhQSVJFU19TRVQgfCBTSVpFX1NFVCB8IEhUVFBfT05MWV9TRVQgfCBTRUNVUkVfU0VUIHwg
U0VTU0lPTl9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxDb29raWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgQ29va2llOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TkFNRV9TRVQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTkFNRV9TRVQpLCBwcm9wZXJ0eV9uYW1lX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOQU1FX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWQUxVRV9TRVQ+JiBzZXRWYWx1ZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZB
TFVFX1NFVCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VkFMVUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERPTUFJ
Tl9TRVQ+JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBET01BSU5fU0VUKSwgcHJvcGVydHlfZG9tYWlu
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiZG9tYWluIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERPTUFJTl9TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUEFUSF9TRVQ+JiBzZXRQYXRoKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgUEFUSF9TRVQpLCBwcm9wZXJ0eV9wYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygicGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxQQVRIX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFWFBJ
UkVTX1NFVD4mIHNldEV4cGlyZXMoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIEVYUElSRVNfU0VUKSwgcHJvcGVydHlfZXhwaXJlc19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImV4cGlyZXMiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RVhQSVJFU19TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0laRV9TRVQ+JiBzZXRTaXplKGludCB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTSVpFX1NFVCks
IHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNJWkVfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhUVFBfT05MWV9TRVQ+JiBz
ZXRIdHRwT25seShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIEhUVFBfT05MWV9TRVQpLCBwcm9wZXJ0eV9odHRwT25seV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJodHRwT25seSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIVFRQX09OTFlfU0VUPigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNFQ1VSRV9TRVQ+JiBzZXRTZWN1cmUoYm9vbCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTRUNVUkVf
U0VUKSwgcHJvcGVydHlfc2VjdXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldEJvb2xlYW4oInNlY3VyZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxTRUNVUkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNFU1NJ
T05fU0VUPiYgc2V0U2Vzc2lvbihib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFNFU1NJT05fU0VUKSwgcHJvcGVydHlfc2Vzc2lvbl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJzZXNzaW9uIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNFU1NJT05fU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENvb2tpZT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29v
a2llPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PENvb2tpZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q29va2llPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPENvb2tpZT4gcmVzdWx0ID0gQ29va2llOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4uKQogICAgICogICAg
IC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXRQYXRoKC4uLikKICAgICAqICAgICAuc2V0
RXhwaXJlcyguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRIdHRw
T25seSguLi4pCiAgICAgKiAgICAgLnNldFNlY3VyZSguLi4pCiAgICAgKiAgICAgLnNldFNlc3Np
b24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihu
ZXcgQ29va2llKCkpKTsKICAgIH0KfTsKCi8qIFVuaXF1ZSBzY3JpcHQgaWRlbnRpZmllci4gKi8K
dHlwZWRlZiBTdHJpbmcgU2NyaXB0SWRlbnRpZmllcjsKCn0gLy8gUGFnZQoKbmFtZXNwYWNlIFJ1
bnRpbWUgewovKiBVbmlxdWUgb2JqZWN0IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIFJl
bW90ZU9iamVjdElkOwoKLyogTWlycm9yIG9iamVjdCByZWZlcmVuY2luZyBvcmlnaW5hbCBKYXZh
U2NyaXB0IG9iamVjdC4gKi8KY2xhc3MgUmVtb3RlT2JqZWN0IDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIC8vIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUn
IHdoaWxlIGdlbmVyYXRpbmcgUmVtb3RlT2JqZWN0LgogICAgLy8gbmFtZXNwYWNlIFR5cGUgewog
ICAgLy8gY29uc3QgY2hhciogY29uc3Qgb2JqZWN0ID0gIm9iamVjdCI7CiAgICAvLyBjb25zdCBj
aGFyKiBjb25zdCBmdW5jdGlvbiA9ICJmdW5jdGlvbiI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25z
dCB1bmRlZmluZWQgPSAidW5kZWZpbmVkIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmlu
ZyA9ICJzdHJpbmciOwogICAgLy8gY29uc3QgY2hhciogY29uc3QgbnVtYmVyID0gIm51bWJlciI7
CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBib29sZWFuID0gImJvb2xlYW4iOwogICAgLy8gfSAv
LyBuYW1lc3BhY2UgVHlwZQoKICAgIC8vIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3N1
YnR5cGUnIHdoaWxlIGdlbmVyYXRpbmcgUmVtb3RlT2JqZWN0LgogICAgLy8gbmFtZXNwYWNlIFN1
YnR5cGUgewogICAgLy8gY29uc3QgY2hhciogY29uc3QgYXJyYXkgPSAiYXJyYXkiOwogICAgLy8g
Y29uc3QgY2hhciogY29uc3QgbnVsbCA9ICJudWxsIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0
IG5vZGUgPSAibm9kZSI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCByZWdleHAgPSAicmVnZXhw
IjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IGRhdGUgPSAiZGF0ZSI7CiAgICAvLyB9IC8vIG5h
bWVzcGFjZSBTdWJ0eXBlCgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgVFlQRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoVFlQRV9T
RVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewog
ICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRl
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1Jl
ZlB0cjxSZW1vdGVPYmplY3Q+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9z
dGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmll
bmQgY2xhc3MgUmVtb3RlT2JqZWN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgVFlQRV9TRVQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVFlQRV9TRVQpLCBwcm9wZXJ0eV90eXBl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZW1vdGVPYmplY3Q+JiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PFJlbW90ZU9iamVjdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxSZW1vdGVPYmplY3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
UmVmUHRyPFJlbW90ZU9iamVjdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZW1vdGVPYmplY3Q+IHJl
c3VsdCA9IFJlbW90ZU9iamVjdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSguLi4pOwog
ICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewog
ICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBSZW1vdGVP
YmplY3QoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3VidHlwZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3VidHlwZSIsIHZhbHVlKTsKICAgIH0K
CiAgICB2b2lkIHNldENsYXNzTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldFN0cmluZygiY2xhc3NOYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0
VmFsdWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0VmFsdWUoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2Jq
ZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiZGVzY3JpcHRpb24iLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRPYmplY3RJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldFN0cmluZygib2JqZWN0SWQiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBP
YmplY3QgcHJvcGVydHkgZGVzY3JpcHRvci4gKi8KY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yIDog
cHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJ
RUxEU19TRVQgPSAwLAogICAgICAgIE5BTUVfU0VUID0gMSA8PCAwLAogICAgICAgIFdSSVRBQkxF
X1NFVCA9IDEgPDwgMSwKICAgICAgICBDT05GSUdVUkFCTEVfU0VUID0gMSA8PCAyLAogICAgICAg
IEVOVU1FUkFCTEVfU0VUID0gMSA8PCAzLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKE5BTUVf
U0VUIHwgV1JJVEFCTEVfU0VUIHwgQ09ORklHVVJBQkxFX1NFVCB8IEVOVU1FUkFCTEVfU0VUKQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
UHJvcGVydHlEZXNjcmlwdG9yPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE5BTUVfU0VUPiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5BTUVfU0VUKSwgcHJvcGVy
dHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5h
bWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TkFNRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgV1JJVEFCTEVfU0VUPiYgc2V0V3JpdGFi
bGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBXUklUQUJMRV9TRVQpLCBwcm9wZXJ0eV93cml0YWJsZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJ3cml0YWJsZSIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxXUklUQUJMRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgQ09ORklHVVJBQkxFX1NFVD4mIHNldENvbmZpZ3VyYWJsZShib29sIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENPTkZJ
R1VSQUJMRV9TRVQpLCBwcm9wZXJ0eV9jb25maWd1cmFibGVfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiY29uZmlndXJhYmxlIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPENPTkZJR1VSQUJMRV9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgRU5VTUVSQUJMRV9TRVQ+JiBzZXRFbnVtZXJhYmxlKGJvb2wg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRU5V
TUVSQUJMRV9TRVQpLCBwcm9wZXJ0eV9lbnVtZXJhYmxlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImVudW1lcmFibGUiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8RU5VTUVSQUJMRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxQcm9w
ZXJ0eURlc2NyaXB0b3I+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPiAoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+KCp0aGlzKTsKICAgICAgICB9CiAgICB9
OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UHJv
cGVydHlEZXNjcmlwdG9yPiByZXN1bHQgPSBQcm9wZXJ0eURlc2NyaXB0b3I6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRXcml0YWJsZSguLi4pCiAgICAg
KiAgICAgLnNldENvbmZpZ3VyYWJsZSguLi4pCiAgICAgKiAgICAgLnNldEVudW1lcmFibGUoLi4u
KTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAg
IHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgUHJv
cGVydHlEZXNjcmlwdG9yKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFZhbHVlKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInZhbHVlIiwg
dmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAg
dm9pZCBzZXRHZXQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmpl
Y3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldE9iamVjdCgiZ2V0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2V0KC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInNl
dCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFdhc1Rocm93bihib29sIHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldEJvb2xlYW4oIndhc1Rocm93biIsIHZhbHVlKTsKICAgIH0KfTsK
Ci8qIFJlcHJlc2VudHMgZnVuY3Rpb24gY2FsbCBhcmd1bWVudC4gRWl0aGVyIHJlbW90ZSBvYmpl
Y3QgaWQgPGNvZGU+b2JqZWN0SWQ8L2NvZGU+IG9yIHByaW1pdGl2ZSA8Y29kZT52YWx1ZTwvY29k
ZT4gb3IgbmVpdGhlciBvZiAoZm9yIHVuZGVmaW5lZCkgdGhlbSBzaG91bGQgYmUgc3BlY2lmaWVk
LiAqLwpjbGFzcyBDYWxsQXJndW1lbnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgQUxMX0ZJRUxE
U19TRVQgPSAwCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxDYWxsQXJndW1lbnQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgQ2FsbEFyZ3VtZW50OwogICAgcHVibGljOgoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8Q2FsbEFyZ3VtZW50PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDYWxsQXJndW1lbnQ+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q2FsbEFy
Z3VtZW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDYWxsQXJndW1l
bnQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q2FsbEFyZ3VtZW50PiByZXN1bHQgPSBDYWxsQXJndW1l
bnQ6OmNyZWF0ZSgpOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBj
cmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0
UmVmKG5ldyBDYWxsQXJndW1lbnQoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0VmFsdWUo
InZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1
ZTsKCgogICAgdm9pZCBzZXRPYmplY3RJZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRp
bWU6OlJlbW90ZU9iamVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJvYmplY3RJZCIsIHZhbHVlKTsKICAgIH0KfTsK
Cn0gLy8gUnVudGltZQoKbmFtZXNwYWNlIENvbnNvbGUgewovKiBDb25zb2xlIG1lc3NhZ2UuICov
CmNsYXNzIENvbnNvbGVNZXNzYWdlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoK
ICAgIC8vIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3NvdXJjZScgd2hpbGUgZ2VuZXJh
dGluZyBDb25zb2xlTWVzc2FnZS4KICAgIC8vIG5hbWVzcGFjZSBTb3VyY2UgewogICAgLy8gY29u
c3QgY2hhciogY29uc3QgaHRtbCA9ICJodG1sIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IHdt
bCA9ICJ3bWwiOwogICAgLy8gY29uc3QgY2hhciogY29uc3QgeG1sID0gInhtbCI7CiAgICAvLyBj
b25zdCBjaGFyKiBjb25zdCBqYXZhc2NyaXB0ID0gImphdmFzY3JpcHQiOwogICAgLy8gY29uc3Qg
Y2hhciogY29uc3QgbmV0d29yayA9ICJuZXR3b3JrIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0
IGNvbnNvbGVfYXBpID0gImNvbnNvbGUtYXBpIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IG90
aGVyID0gIm90aGVyIjsKICAgIC8vIH0gLy8gbmFtZXNwYWNlIFNvdXJjZQoKICAgIC8vIC8vIE5h
bWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ2xldmVsJyB3aGlsZSBnZW5lcmF0aW5nIENvbnNvbGVN
ZXNzYWdlLgogICAgLy8gbmFtZXNwYWNlIExldmVsIHsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0
IHRpcCA9ICJ0aXAiOwogICAgLy8gY29uc3QgY2hhciogY29uc3QgbG9nID0gImxvZyI7CiAgICAv
LyBjb25zdCBjaGFyKiBjb25zdCB3YXJuaW5nID0gIndhcm5pbmciOwogICAgLy8gY29uc3QgY2hh
ciogY29uc3QgZXJyb3IgPSAiZXJyb3IiOwogICAgLy8gY29uc3QgY2hhciogY29uc3QgZGVidWcg
PSAiZGVidWciOwogICAgLy8gfSAvLyBuYW1lc3BhY2UgTGV2ZWwKCiAgICAvLyAvLyBOYW1lZCBh
ZnRlciBwcm9wZXJ0eSBuYW1lICd0eXBlJyB3aGlsZSBnZW5lcmF0aW5nIENvbnNvbGVNZXNzYWdl
LgogICAgLy8gbmFtZXNwYWNlIFR5cGUgewogICAgLy8gY29uc3QgY2hhciogY29uc3QgbG9nID0g
ImxvZyI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBkaXIgPSAiZGlyIjsKICAgIC8vIGNvbnN0
IGNoYXIqIGNvbnN0IGRpcnhtbCA9ICJkaXJ4bWwiOwogICAgLy8gY29uc3QgY2hhciogY29uc3Qg
dHJhY2UgPSAidHJhY2UiOwogICAgLy8gY29uc3QgY2hhciogY29uc3Qgc3RhcnRHcm91cCA9ICJz
dGFydEdyb3VwIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXJ0R3JvdXBDb2xsYXBzZWQg
PSAic3RhcnRHcm91cENvbGxhcHNlZCI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBlbmRHcm91
cCA9ICJlbmRHcm91cCI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBhc3NlcnQgPSAiYXNzZXJ0
IjsKICAgIC8vIH0gLy8gbmFtZXNwYWNlIFR5cGUKCiAgICBlbnVtIHsKICAgICAgICBOT19GSUVM
RFNfU0VUID0gMCwKICAgICAgICBTT1VSQ0VfU0VUID0gMSA8PCAwLAogICAgICAgIExFVkVMX1NF
VCA9IDEgPDwgMSwKICAgICAgICBURVhUX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERT
X1NFVCA9IChTT1VSQ0VfU0VUIHwgTEVWRUxfU0VUIHwgVEVYVF9TRVQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDb25zb2xlTWVzc2Fn
ZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9f
RklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDb25zb2xl
TWVzc2FnZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNPVVJDRV9TRVQ+
JiBzZXRTb3VyY2UoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTT1VSQ0VfU0VUKSwgcHJvcGVydHlfc291cmNlX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNPVVJDRV9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTEVWRUxfU0VUPiYgc2V0TGV2ZWwoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBM
RVZFTF9TRVQpLCBwcm9wZXJ0eV9sZXZlbF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoImxldmVsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPExFVkVMX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBURVhU
X1NFVD4mIHNldFRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBURVhUX1NFVCksIHByb3BlcnR5X3RleHRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRFWFRfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENvbnNvbGVNZXNzYWdlPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDb25z
b2xlTWVzc2FnZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxDb25zb2xlTWVzc2FnZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBS
ZWZQdHI8Q29uc29sZU1lc3NhZ2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q29uc29sZU1lc3NhZ2U+
IHJlc3VsdCA9IENvbnNvbGVNZXNzYWdlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTb3VyY2Uo
Li4uKQogICAgICogICAgIC5zZXRMZXZlbCguLi4pCiAgICAgKiAgICAgLnNldFRleHQoLi4uKTsK
ICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ29uc29s
ZU1lc3NhZ2UoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TGluZShpbnQgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJsaW5lIiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0UmVwZWF0Q291bnQoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51
bWJlcigicmVwZWF0Q291bnQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYXJhbWV0ZXJz
KFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dEFycmF5KCJwYXJhbWV0ZXJzIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhY2tUcmFj
ZShQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRBcnJheSgic3RhY2tUcmFjZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5ldHdvcmtS
ZXF1ZXN0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoIm5ldHdvcmtSZXF1ZXN0SWQiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBTdGFjayBlbnRyeSBm
b3IgY29uc29sZSBlcnJvcnMgYW5kIGFzc2VydGlvbnMuICovCmNsYXNzIENhbGxGcmFtZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVM
RFNfU0VUID0gMCwKICAgICAgICBGVU5DVElPTl9OQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBV
UkxfU0VUID0gMSA8PCAxLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9IDEgPDwgMiwKICAgICAg
ICBDT0xVTU5fTlVNQkVSX1NFVCA9IDEgPDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9IChG
VU5DVElPTl9OQU1FX1NFVCB8IFVSTF9TRVQgfCBMSU5FX05VTUJFUl9TRVQgfCBDT0xVTU5fTlVN
QkVSX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPENhbGxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBDYWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBGVU5DVElPTl9OQU1FX1NFVD4mIHNldEZ1bmN0aW9uTmFtZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZVTkNUSU9O
X05BTUVfU0VUKSwgcHJvcGVydHlfZnVuY3Rpb25OYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygiZnVuY3Rpb25OYW1lIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPEZVTkNUSU9OX05BTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFVSTF9TRVQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwg
cHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTElORV9OVU1CRVJfU0VUPiYgc2V0
TGluZU51bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgTElORV9OVU1CRVJfU0VUKSwgcHJvcGVydHlfbGluZU51bWJlcl9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TElORV9OVU1CRVJfU0VUPigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENPTFVNTl9OVU1CRVJfU0VUPiYgc2V0Q29s
dW1uTnVtYmVyKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBDT0xVTU5fTlVNQkVSX1NFVCksIHByb3BlcnR5X2NvbHVtbk51bWJlcl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvbHVtbk51bWJlciIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT0xVTU5fTlVNQkVSX1NFVD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDYWxsRnJhbWU+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPENhbGxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUGFzc1JlZlB0cjxDYWxsRnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gUmVmUHRyPENhbGxGcmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxsRnJhbWU+IHJlc3Vs
dCA9IENhbGxGcmFtZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnVuY3Rpb25OYW1lKC4uLikK
ICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TGluZU51bWJlciguLi4pCiAg
ICAgKiAgICAgLnNldENvbHVtbk51bWJlciguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwogICAgfQp9OwoKfSAvLyBD
b25zb2xlCgpuYW1lc3BhY2UgTmV0d29yayB7Ci8qIFVuaXF1ZSBsb2FkZXIgaWRlbnRpZmllci4g
Ki8KdHlwZWRlZiBTdHJpbmcgTG9hZGVySWQ7CgovKiBVbmlxdWUgZnJhbWUgaWRlbnRpZmllci4g
Ki8KdHlwZWRlZiBTdHJpbmcgRnJhbWVJZDsKCi8qIFVuaXF1ZSByZXF1ZXN0IGlkZW50aWZpZXIu
ICovCnR5cGVkZWYgU3RyaW5nIFJlcXVlc3RJZDsKCi8qIFRpbWluZyBpbmZvcm1hdGlvbiBmb3Ig
dGhlIHJlcXVlc3QuICovCmNsYXNzIFJlc291cmNlVGltaW5nIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAg
ICAgIFJFUVVFU1RfVElNRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgUFJPWFlfU1RBUlRfU0VUID0g
MSA8PCAxLAogICAgICAgIFBST1hZX0VORF9TRVQgPSAxIDw8IDIsCiAgICAgICAgRE5TX1NUQVJU
X1NFVCA9IDEgPDwgMywKICAgICAgICBETlNfRU5EX1NFVCA9IDEgPDwgNCwKICAgICAgICBDT05O
RUNUX1NUQVJUX1NFVCA9IDEgPDwgNSwKICAgICAgICBDT05ORUNUX0VORF9TRVQgPSAxIDw8IDYs
CiAgICAgICAgU1NMX1NUQVJUX1NFVCA9IDEgPDwgNywKICAgICAgICBTU0xfRU5EX1NFVCA9IDEg
PDwgOCwKICAgICAgICBTRU5EX1NUQVJUX1NFVCA9IDEgPDwgOSwKICAgICAgICBTRU5EX0VORF9T
RVQgPSAxIDw8IDEwLAogICAgICAgIFJFQ0VJVkVfSEVBREVSU19FTkRfU0VUID0gMSA8PCAxMSwK
ICAgICAgICBBTExfRklFTERTX1NFVCA9IChSRVFVRVNUX1RJTUVfU0VUIHwgUFJPWFlfU1RBUlRf
U0VUIHwgUFJPWFlfRU5EX1NFVCB8IEROU19TVEFSVF9TRVQgfCBETlNfRU5EX1NFVCB8IENPTk5F
Q1RfU1RBUlRfU0VUIHwgQ09OTkVDVF9FTkRfU0VUIHwgU1NMX1NUQVJUX1NFVCB8IFNTTF9FTkRf
U0VUIHwgU0VORF9TVEFSVF9TRVQgfCBTRU5EX0VORF9TRVQgfCBSRUNFSVZFX0hFQURFUlNfRU5E
X1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPFJlc291cmNlVGltaW5nPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIFJlc291cmNlVGltaW5nOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgUkVRVUVTVF9USU1FX1NFVD4mIHNldFJlcXVlc3RUaW1lKGRvdWJsZSB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSRVFVRVNUX1RJ
TUVfU0VUKSwgcHJvcGVydHlfcmVxdWVzdFRpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJyZXF1ZXN0VGltZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxSRVFVRVNUX1RJTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFBST1hZX1NUQVJUX1NFVD4mIHNldFByb3h5U3RhcnQoZG91YmxlIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFBST1hZX1NU
QVJUX1NFVCksIHByb3BlcnR5X3Byb3h5U3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJwcm94eVN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFBST1hZX1NUQVJUX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBQUk9YWV9FTkRfU0VUPiYgc2V0UHJveHlFbmQoZG91YmxlIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFBST1hZX0VORF9TRVQp
LCBwcm9wZXJ0eV9wcm94eUVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoInByb3h5RW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFBST1hZX0VORF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRE5T
X1NUQVJUX1NFVD4mIHNldERuc1N0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBETlNfU1RBUlRfU0VUKSwgcHJvcGVydHlfZG5z
U3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJkbnNT
dGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxETlNfU1RBUlRfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEROU19FTkRfU0VUPiYgc2V0
RG5zRW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBETlNfRU5EX1NFVCksIHByb3BlcnR5X2Ruc0VuZF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImRuc0VuZCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxETlNfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBDT05ORUNUX1NUQVJUX1NFVD4mIHNldENvbm5lY3RTdGFydChkb3VibGUg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ09O
TkVDVF9TVEFSVF9TRVQpLCBwcm9wZXJ0eV9jb25uZWN0U3RhcnRfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb25uZWN0U3RhcnQiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q09OTkVDVF9TVEFSVF9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ09OTkVDVF9FTkRfU0VUPiYgc2V0Q29ubmVjdEVuZChk
b3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgQ09OTkVDVF9FTkRfU0VUKSwgcHJvcGVydHlfY29ubmVjdEVuZF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvbm5lY3RFbmQiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q09OTkVDVF9FTkRfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFNTTF9TVEFSVF9TRVQ+JiBzZXRTc2xTdGFydChkb3VibGUg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1NM
X1NUQVJUX1NFVCksIHByb3BlcnR5X3NzbFN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE51bWJlcigic3NsU3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8U1NMX1NUQVJUX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBTU0xfRU5EX1NFVD4mIHNldFNzbEVuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1NMX0VORF9TRVQpLCBwcm9wZXJ0
eV9zc2xFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJz
c2xFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U1NMX0VORF9TRVQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0VORF9TVEFSVF9TRVQ+JiBz
ZXRTZW5kU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFNFTkRfU1RBUlRfU0VUKSwgcHJvcGVydHlfc2VuZFN0YXJ0X2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2VuZFN0YXJ0IiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNFTkRfU1RBUlRfU0VUPigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNFTkRfRU5EX1NFVD4mIHNldFNlbmRFbmQo
ZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFNFTkRfRU5EX1NFVCksIHByb3BlcnR5X3NlbmRFbmRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzZW5kRW5kIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNFTkRfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBSRUNFSVZFX0hFQURFUlNfRU5EX1NFVD4mIHNldFJlY2VpdmVIZWFkZXJzRW5k
KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBSRUNFSVZFX0hFQURFUlNfRU5EX1NFVCksIHByb3BlcnR5X3JlY2VpdmVIZWFkZXJzRW5k
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicmVjZWl2ZUhl
YWRlcnNFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UkVDRUlWRV9I
RUFERVJTX0VORF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVz
b3VyY2VUaW1pbmc+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJlc291cmNlVGltaW5nPio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFJlc291cmNlVGltaW5n
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZXNvdXJjZVRpbWluZz4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxSZXNvdXJjZVRpbWluZz4gcmVzdWx0ID0gUmVzb3VyY2VUaW1p
bmc6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFJlcXVlc3RUaW1lKC4uLikKICAgICAqICAgICAu
c2V0UHJveHlTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFByb3h5RW5kKC4uLikKICAgICAqICAg
ICAuc2V0RG5zU3RhcnQoLi4uKQogICAgICogICAgIC5zZXREbnNFbmQoLi4uKQogICAgICogICAg
IC5zZXRDb25uZWN0U3RhcnQoLi4uKQogICAgICogICAgIC5zZXRDb25uZWN0RW5kKC4uLikKICAg
ICAqICAgICAuc2V0U3NsU3RhcnQoLi4uKQogICAgICogICAgIC5zZXRTc2xFbmQoLi4uKQogICAg
ICogICAgIC5zZXRTZW5kU3RhcnQoLi4uKQogICAgICogICAgIC5zZXRTZW5kRW5kKC4uLikKICAg
ICAqICAgICAuc2V0UmVjZWl2ZUhlYWRlcnNFbmQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1
aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRl
cjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgUmVzb3VyY2VUaW1pbmcoKSkpOwogICAgfQp9
OwoKLyogSFRUUCByZXF1ZXN0IGRhdGEuICovCmNsYXNzIFJlcXVlc3QgOiBwdWJsaWMgSW5zcGVj
dG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAs
CiAgICAgICAgVVJMX1NFVCA9IDEgPDwgMCwKICAgICAgICBNRVRIT0RfU0VUID0gMSA8PCAxLAog
ICAgICAgIEhFQURFUlNfU0VUID0gMSA8PCAyLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFVS
TF9TRVQgfCBNRVRIT0RfU0VUIHwgSEVBREVSU19TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZXF1ZXN0PiBwdHIpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFJlcXVlc3Q7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVUkxfU0VUPiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVVJMX1NF
VCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRT
dHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVUkxfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1FVEhPRF9TRVQ+JiBzZXRN
ZXRob2QoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBNRVRIT0RfU0VUKSwgcHJvcGVydHlfbWV0aG9kX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWV0aG9kIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1FVEhPRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgSEVBREVSU19TRVQ+JiBzZXRIZWFkZXJzKFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBIRUFERVJTX1NFVCksIHByb3BlcnR5X2hlYWRlcnNfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJoZWFkZXJzIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPEhFQURFUlNfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPFJlcXVlc3Q+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJlcXVlc3Q+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVxdWVzdD4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UmVxdWVzdD4oKnRoaXMpOwog
ICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAg
ICAqIFJlZlB0cjxSZXF1ZXN0PiByZXN1bHQgPSBSZXF1ZXN0OjpjcmVhdGUoKQogICAgICogICAg
IC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRNZXRob2QoLi4uKQogICAgICogICAgIC5zZXRI
ZWFkZXJzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRS
ZWYobmV3IFJlcXVlc3QoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0UG9zdERhdGEoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInBvc3REYXRhIiwgdmFs
dWUpOwogICAgfQp9OwoKLyogSFRUUCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBSZXNwb25zZSA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19G
SUVMRFNfU0VUID0gMCwKICAgICAgICBVUkxfU0VUID0gMSA8PCAwLAogICAgICAgIFNUQVRVU19T
RVQgPSAxIDw8IDEsCiAgICAgICAgU1RBVFVTX1RFWFRfU0VUID0gMSA8PCAyLAogICAgICAgIEhF
QURFUlNfU0VUID0gMSA8PCAzLAogICAgICAgIE1JTUVfVFlQRV9TRVQgPSAxIDw8IDQsCiAgICAg
ICAgQ09OTkVDVElPTl9SRVVTRURfU0VUID0gMSA8PCA1LAogICAgICAgIENPTk5FQ1RJT05fSURf
U0VUID0gMSA8PCA2LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFVSTF9TRVQgfCBTVEFUVVNf
U0VUIHwgU1RBVFVTX1RFWFRfU0VUIHwgSEVBREVSU19TRVQgfCBNSU1FX1RZUEVfU0VUIHwgQ09O
TkVDVElPTl9SRVVTRURfU0VUIHwgQ09OTkVDVElPTl9JRF9TRVQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZXNwb25zZT4gcHRyKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NF
VCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1
bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZXNwb25zZTsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVSTF9TRVQ+JiBzZXRVcmwoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBVUkxfU0VUKSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFVSTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1RBVFVTX1NF
VD4mIHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgU1RBVFVTX1NFVCksIHByb3BlcnR5X3N0YXR1c19hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0YXR1cyIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVEFUVVNfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFNUQVRVU19URVhUX1NFVD4mIHNldFN0YXR1c1RleHQoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBTVEFUVVNfVEVYVF9TRVQpLCBwcm9wZXJ0eV9zdGF0dXNUZXh0X2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVzVGV4dCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVEFUVVNfVEVYVF9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSEVBREVSU19TRVQ+JiBzZXRIZWFkZXJzKFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBIRUFERVJTX1NFVCksIHByb3BlcnR5X2hlYWRlcnNfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJoZWFkZXJzIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhFQURFUlNfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IE1JTUVfVFlQRV9TRVQ+JiBzZXRNaW1lVHlwZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIE1JTUVfVFlQRV9TRVQpLCBwcm9wZXJ0eV9taW1lVHlwZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1pbWVUeXBlIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPE1JTUVfVFlQRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgQ09OTkVDVElPTl9SRVVTRURfU0VUPiYgc2V0Q29ubmVjdGlvblJldXNl
ZChib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIENPTk5FQ1RJT05fUkVVU0VEX1NFVCksIHByb3BlcnR5X2Nvbm5lY3Rpb25SZXVzZWRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiY29ubmVjdGlvblJl
dXNlZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT05ORUNUSU9OX1JF
VVNFRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ09OTkVDVElP
Tl9JRF9TRVQ+JiBzZXRDb25uZWN0aW9uSWQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENPTk5FQ1RJT05fSURfU0VUKSwgcHJvcGVy
dHlfY29ubmVjdGlvbklkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigiY29ubmVjdGlvbklkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PENPTk5FQ1RJT05fSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRy
PFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXNwb25zZT4qPigmbV9yZXN1bHQpOwogICAg
ICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZXNwb25zZT4gKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UmVzcG9uc2U+KCp0aGlzKTsKICAgICAgICB9CiAg
ICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8
UmVzcG9uc2U+IHJlc3VsdCA9IFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwo
Li4uKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXNUZXh0
KC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAgKiAgICAgLnNldE1pbWVUeXBl
KC4uLikKICAgICAqICAgICAuc2V0Q29ubmVjdGlvblJldXNlZCguLi4pCiAgICAgKiAgICAgLnNl
dENvbm5lY3Rpb25JZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNf
U0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+
KGFkb3B0UmVmKG5ldyBSZXNwb25zZSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRIZWFkZXJzVGV4
dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiaGVh
ZGVyc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRSZXF1ZXN0SGVhZGVycyhQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2Jq
ZWN0KCJyZXF1ZXN0SGVhZGVycyIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJlcXVlc3RI
ZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0
cmluZygicmVxdWVzdEhlYWRlcnNUZXh0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0RnJv
bURpc2tDYWNoZShib29sIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEJvb2xlYW4oImZy
b21EaXNrQ2FjaGUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRUaW1pbmcoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNvdXJjZVRpbWluZz4qLyBQYXNzUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJ0aW1p
bmciLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBXZWJTb2NrZXQgcmVxdWVzdCBkYXRhLiAqLwpjbGFz
cyBXZWJTb2NrZXRSZXF1ZXN0IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFJFUVVFU1RfS0VZM19T
RVQgPSAxIDw8IDAsCiAgICAgICAgSEVBREVSU19TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJ
RUxEU19TRVQgPSAoUkVRVUVTVF9LRVkzX1NFVCB8IEhFQURFUlNfU0VUKQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8V2ViU29ja2V0UmVx
dWVzdD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
Tk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBXZWJT
b2NrZXRSZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUkVRVUVT
VF9LRVkzX1NFVD4mIHNldFJlcXVlc3RLZXkzKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUkVRVUVTVF9LRVkzX1NFVCks
IHByb3BlcnR5X3JlcXVlc3RLZXkzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygicmVxdWVzdEtleTMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8UkVRVUVTVF9LRVkzX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBIRUFERVJTX1NFVD4mIHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhF
QURFUlNfU0VUKSwgcHJvcGVydHlfaGVhZGVyc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8SEVBREVSU19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8V2ViU29ja2V0UmVxdWVzdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJT
b2NrZXRSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxXZWJT
b2NrZXRSZXF1ZXN0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3lu
dGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFdlYlNvY2tldFJlcXVlc3Q+IHJlc3Vs
dCA9IFdlYlNvY2tldFJlcXVlc3Q6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFJlcXVlc3RLZXkz
KC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVy
PE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBXZWJTb2NrZXRSZXF1ZXN0KCkpKTsKICAgIH0K
fTsKCi8qIFdlYlNvY2tldCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXNwb25z
ZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
T19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTVEFUVVNfU0VUID0gMSA8PCAwLAogICAgICAgIFNU
QVRVU19URVhUX1NFVCA9IDEgPDwgMSwKICAgICAgICBIRUFERVJTX1NFVCA9IDEgPDwgMiwKICAg
ICAgICBDSEFMTEVOR0VfUkVTUE9OU0VfU0VUID0gMSA8PCAzLAogICAgICAgIEFMTF9GSUVMRFNf
U0VUID0gKFNUQVRVU19TRVQgfCBTVEFUVVNfVEVYVF9TRVQgfCBIRUFERVJTX1NFVCB8IENIQUxM
RU5HRV9SRVNQT05TRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAg
ICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRSZXNwb25zZTsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUQVRVU19TRVQ+JiBzZXRTdGF0dXMoZG91Ymxl
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNU
QVRVU19TRVQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8U1RBVFVTX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBT
VEFUVVNfVEVYVF9TRVQ+JiBzZXRTdGF0dXNUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RBVFVTX1RFWFRfU0VU
KSwgcHJvcGVydHlfc3RhdHVzVGV4dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInN0YXR1c1RleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8U1RBVFVTX1RFWFRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IEhFQURFUlNfU0VUPiYgc2V0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSEVB
REVSU19TRVQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxIRUFERVJTX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBDSEFMTEVOR0VfUkVTUE9OU0VfU0VUPiYgc2V0Q2hhbGxlbmdlUmVzcG9uc2UoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBDSEFMTEVOR0VfUkVTUE9OU0VfU0VUKSwgcHJvcGVydHlfY2hhbGxlbmdlUmVzcG9uc2VfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJjaGFsbGVuZ2VSZXNw
b25zZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDSEFMTEVOR0VfUkVT
UE9OU0VfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFdlYlNvY2tl
dFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4qPigmbV9yZXN1
bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXNw
b25zZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8V2ViU29ja2V0UmVz
cG9uc2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+IHJlc3VsdCA9IFdl
YlNvY2tldFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAg
ICogICAgIC5zZXRTdGF0dXNUZXh0KC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAg
ICAgKiAgICAgLnNldENoYWxsZW5nZVJlc3BvbnNlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFdlYlNvY2tldFJlc3BvbnNlKCkpKTsKICAg
IH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWNoZWQgcmVzb3VyY2UuICovCmNsYXNz
IENhY2hlZFJlc291cmNlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVu
dW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFVSTF9TRVQgPSAxIDw8IDAs
CiAgICAgICAgVFlQRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgUkVTUE9OU0VfU0VUID0gMSA8PCAy
LAogICAgICAgIEJPRFlfU0laRV9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQg
PSAoVVJMX1NFVCB8IFRZUEVfU0VUIHwgUkVTUE9OU0VfU0VUIHwgQk9EWV9TSVpFX1NFVCkKICAg
IH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2
YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0
ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENh
Y2hlZFJlc291cmNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIENhY2hlZFJlc291cmNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
VVJMX1NFVD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVSTF9TRVQpLCBwcm9wZXJ0eV91cmxfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VVJMX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NFVD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUWVBFX1NFVCks
IHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRZUEVfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJFU1BPTlNFX1NFVD4mIHNl
dFJlc3BvbnNlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVzcG9uc2U+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJFU1BPTlNFX1NFVCksIHByb3BlcnR5X3Jlc3BvbnNl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgicmVzcG9uc2Ui
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UkVTUE9OU0VfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEJPRFlfU0laRV9TRVQ+JiBzZXRCb2R5
U2l6ZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgQk9EWV9TSVpFX1NFVCksIHByb3BlcnR5X2JvZHlTaXplX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiYm9keVNpemUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8Qk9EWV9TSVpFX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxDYWNoZWRSZXNvdXJjZT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2Fj
aGVkUmVzb3VyY2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
UmVmUHRyPENhY2hlZFJlc291cmNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhY2hlZFJlc291cmNl
PiByZXN1bHQgPSBDYWNoZWRSZXNvdXJjZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4u
LikKICAgICAqICAgICAuc2V0VHlwZSguLi4pCiAgICAgKiAgICAgLnNldFJlc3BvbnNlKC4uLikK
ICAgICAqICAgICAuc2V0Qm9keVNpemUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19G
SUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ2FjaGVkUmVzb3VyY2UoKSkpOwogICAgfQp9OwoKLyog
SW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QgaW5pdGlhdG9yLiAqLwpjbGFzcyBJbml0aWF0
b3IgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gLy8gTmFtZWQgYWZ0
ZXIgcHJvcGVydHkgbmFtZSAndHlwZScgd2hpbGUgZ2VuZXJhdGluZyBJbml0aWF0b3IuCiAgICAv
LyBuYW1lc3BhY2UgVHlwZSB7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBwYXJzZXIgPSAicGFy
c2VyIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IHNjcmlwdCA9ICJzY3JpcHQiOwogICAgLy8g
Y29uc3QgY2hhciogY29uc3Qgb3RoZXIgPSAib3RoZXIiOwogICAgLy8gfSAvLyBuYW1lc3BhY2Ug
VHlwZQoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFRZUEVf
U0VUID0gMSA8PCAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRZUEVfU0VUKQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8SW5pdGlh
dG9yPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBO
T19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAg
ICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEluaXRp
YXRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRZUEVfU0VUPiYgc2V0
VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8VFlQRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8SW5pdGlhdG9yPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxJbml0aWF0b3I+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5pdGlhdG9yPiAo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxJbml0aWF0b3I+KCp0aGlzKTsK
ICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAg
ICAgKiBSZWZQdHI8SW5pdGlhdG9yPiByZXN1bHQgPSBJbml0aWF0b3I6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldFR5cGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERT
X1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VU
PihhZG9wdFJlZihuZXcgSW5pdGlhdG9yKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YWNrVHJh
Y2UoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0QXJyYXkoInN0YWNrVHJhY2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZh
bHVlKTsKICAgIH0KCiAgICB2b2lkIHNldExpbmVOdW1iZXIoZG91YmxlIHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgIH0KfTsKCn0g
Ly8gTmV0d29yawoKI2lmIEVOQUJMRShTUUxfREFUQUJBU0UpCm5hbWVzcGFjZSBEYXRhYmFzZSB7
Ci8qIERhdGFiYXNlIG9iamVjdC4gKi8KY2xhc3MgRGF0YWJhc2UgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgSURfU0VUID0gMSA8PCAwLAogICAgICAgIERPTUFJTl9TRVQgPSAxIDw8IDEsCiAgICAg
ICAgTkFNRV9TRVQgPSAxIDw8IDIsCiAgICAgICAgVkVSU0lPTl9TRVQgPSAxIDw8IDMsCiAgICAg
ICAgQUxMX0ZJRUxEU19TRVQgPSAoSURfU0VUIHwgRE9NQUlOX1NFVCB8IE5BTUVfU0VUIHwgVkVS
U0lPTl9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxEYXRhYmFzZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBEYXRhYmFzZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IElEX1NFVD4mIHNldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSURfU0VUKSwgcHJvcGVydHlfaWRfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgRE9NQUlOX1NFVD4mIHNldERvbWFpbihjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIERPTUFJTl9TRVQp
LCBwcm9wZXJ0eV9kb21haW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJkb21haW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RE9N
QUlOX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOQU1FX1NFVD4m
IHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBOQU1FX1NFVCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPE5BTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFZFUlNJT05fU0VUPiYgc2V0VmVyc2lvbihjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZFUlNJT05f
U0VUKSwgcHJvcGVydHlfdmVyc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInZlcnNpb24iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VkVSU0lPTl9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RGF0
YWJhc2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPERhdGFiYXNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPERhdGFiYXNlPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxEYXRhYmFzZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxEYXRh
YmFzZT4gcmVzdWx0ID0gRGF0YWJhc2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldElkKC4uLikK
ICAgICAqICAgICAuc2V0RG9tYWluKC4uLikKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAg
KiAgICAgLnNldFZlcnNpb24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklF
TERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNf
U0VUPihhZG9wdFJlZihuZXcgRGF0YWJhc2UoKSkpOwogICAgfQp9OwoKfSAvLyBEYXRhYmFzZQoK
I2VuZGlmIC8vIEVOQUJMRShTUUxfREFUQUJBU0UpCm5hbWVzcGFjZSBET01TdG9yYWdlIHsKLyog
RE9NIFN0b3JhZ2UgZW50cnkuICovCmNsYXNzIEVudHJ5IDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAg
IEhPU1RfU0VUID0gMSA8PCAwLAogICAgICAgIElTX0xPQ0FMX1NUT1JBR0VfU0VUID0gMSA8PCAx
LAogICAgICAgIElEX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChIT1NU
X1NFVCB8IElTX0xPQ0FMX1NUT1JBR0VfU0VUIHwgSURfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RW50cnk+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRW50cnk7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIT1NUX1NFVD4mIHNldEhvc3QoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIT1NU
X1NFVCksIHByb3BlcnR5X2hvc3RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJob3N0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhP
U1RfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IElTX0xPQ0FMX1NU
T1JBR0VfU0VUPiYgc2V0SXNMb2NhbFN0b3JhZ2UoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJU19MT0NBTF9TVE9SQUdFX1NFVCksIHBy
b3BlcnR5X2lzTG9jYWxTdG9yYWdlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldEJvb2xlYW4oImlzTG9jYWxTdG9yYWdlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPElTX0xPQ0FMX1NUT1JBR0VfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IElEX1NFVD4mIHNldElkKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJRF9TRVQpLCBwcm9wZXJ0eV9pZF9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImlkIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFJlZlB0cjxFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RW50cnk+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RW50cnk+ICgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEVudHJ5PigqdGhpcyk7CiAgICAgICAg
fQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVm
UHRyPEVudHJ5PiByZXN1bHQgPSBFbnRyeTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0SG9zdCgu
Li4pCiAgICAgKiAgICAgLnNldElzTG9jYWxTdG9yYWdlKC4uLikKICAgICAqICAgICAuc2V0SWQo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkK
ICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcg
RW50cnkoKSkpOwogICAgfQp9OwoKfSAvLyBET01TdG9yYWdlCgpuYW1lc3BhY2UgQXBwbGljYXRp
b25DYWNoZSB7Ci8qIERldGFpbGVkIGFwcGxpY2F0aW9uIGNhY2hlIHJlc291cmNlIGluZm9ybWF0
aW9uLiAqLwpjbGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgVVJMX1NFVCA9IDEgPDwgMCwKICAgICAgICBTSVpFX1NFVCA9IDEgPDwgMSwKICAgICAg
ICBUWVBFX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChVUkxfU0VUIHwg
U0laRV9TRVQgfCBUWVBFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVz
b3VyY2U7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVUkxfU0VUPiYgc2V0
VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgVVJMX1NFVCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxVUkxfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNJWkVfU0VUPiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0laRV9TRVQpLCBwcm9wZXJ0eV9zaXplX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTSVpFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NFVD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUWVBFX1NFVCks
IHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRZUEVfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVS
ZXNvdXJjZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEFwcGxpY2F0
aW9uQ2FjaGVSZXNvdXJjZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
QXBwbGljYXRpb25DYWNoZVJlc291cmNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEFwcGxpY2F0aW9u
Q2FjaGVSZXNvdXJjZT4gcmVzdWx0ID0gQXBwbGljYXRpb25DYWNoZVJlc291cmNlOjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRTaXplKC4uLikKICAgICAq
ICAgICAuc2V0VHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNf
U0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+
KGFkb3B0UmVmKG5ldyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UoKSkpOwogICAgfQp9OwoKLyog
RGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3JtYXRpb24uICovCmNsYXNzIEFwcGxpY2F0
aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAg
ICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgTUFOSUZFU1RfVV9SX0xfU0VUID0gMSA8
PCAwLAogICAgICAgIFNJWkVfU0VUID0gMSA8PCAxLAogICAgICAgIENSRUFUSU9OX1RJTUVfU0VU
ID0gMSA8PCAyLAogICAgICAgIFVQREFURV9USU1FX1NFVCA9IDEgPDwgMywKICAgICAgICBSRVNP
VVJDRVNfU0VUID0gMSA8PCA0LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKE1BTklGRVNUX1Vf
Ul9MX1NFVCB8IFNJWkVfU0VUIHwgQ1JFQVRJT05fVElNRV9TRVQgfCBVUERBVEVfVElNRV9TRVQg
fCBSRVNPVVJDRVNfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlvbkNhY2hlOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTUFOSUZFU1RfVV9SX0xfU0VUPiYgc2V0TWFuaWZlc3RV
UkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBNQU5JRkVTVF9VX1JfTF9TRVQpLCBwcm9wZXJ0eV9tYW5pZmVzdFVSTF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1hbmlmZXN0VVJM
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1BTklGRVNUX1VfUl9MX1NF
VD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTSVpFX1NFVD4mIHNldFNp
emUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFNJWkVfU0VUKSwgcHJvcGVydHlfc2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXROdW1iZXIoInNpemUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8U0laRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
Q1JFQVRJT05fVElNRV9TRVQ+JiBzZXRDcmVhdGlvblRpbWUoZG91YmxlIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENSRUFUSU9OX1RJTUVfU0VU
KSwgcHJvcGVydHlfY3JlYXRpb25UaW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldE51bWJlcigiY3JlYXRpb25UaW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPENSRUFUSU9OX1RJTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFVQREFURV9USU1FX1NFVD4mIHNldFVwZGF0ZVRpbWUoZG91YmxlIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVQREFURV9USU1F
X1NFVCksIHByb3BlcnR5X3VwZGF0ZVRpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0TnVtYmVyKCJ1cGRhdGVUaW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFVQREFURV9USU1FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBSRVNPVVJDRVNfU0VUPiYgc2V0UmVzb3VyY2VzKFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFJFU09VUkNFU19TRVQpLCBwcm9wZXJ0eV9yZXNvdXJjZXNfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInJlc291cmNlcyIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxSRVNPVVJDRVNfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+JiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEFwcGxp
Y2F0aW9uQ2FjaGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biBSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxBcHBsaWNhdGlv
bkNhY2hlPiByZXN1bHQgPSBBcHBsaWNhdGlvbkNhY2hlOjpjcmVhdGUoKQogICAgICogICAgIC5z
ZXRNYW5pZmVzdFVSTCguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5z
ZXRDcmVhdGlvblRpbWUoLi4uKQogICAgICogICAgIC5zZXRVcGRhdGVUaW1lKC4uLikKICAgICAq
ICAgICAuc2V0UmVzb3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJ
RUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERT
X1NFVD4oYWRvcHRSZWYobmV3IEFwcGxpY2F0aW9uQ2FjaGUoKSkpOwogICAgfQp9OwoKLyogRnJh
bWUgaWRlbnRpZmllciAtIG1hbmlmZXN0IFVSTCBwYWlyLiAqLwpjbGFzcyBGcmFtZVdpdGhNYW5p
ZmVzdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBGUkFNRV9JRF9TRVQgPSAxIDw8IDAsCiAgICAg
ICAgTUFOSUZFU1RfVV9SX0xfU0VUID0gMSA8PCAxLAogICAgICAgIFNUQVRVU19TRVQgPSAxIDw8
IDIsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoRlJBTUVfSURfU0VUIHwgTUFOSUZFU1RfVV9S
X0xfU0VUIHwgU1RBVFVTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiBwdHIpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lV2l0aE1hbmlmZXN0OwogICAgcHVi
bGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRlJBTUVfSURfU0VUPiYgc2V0RnJhbWVJZChj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIEZSQU1FX0lEX1NFVCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPEZSQU1FX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBNQU5JRkVTVF9VX1JfTF9TRVQ+JiBzZXRNYW5pZmVzdFVSTChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE1BTklGRVNUX1VfUl9MX1NFVCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUFOSUZFU1RfVV9SX0xfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUQVRVU19TRVQ+JiBzZXRTdGF0dXMo
aW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFNUQVRVU19TRVQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8U1RBVFVTX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxGcmFtZVdpdGhNYW5pZmVzdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+
Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RnJh
bWVXaXRoTWFuaWZlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZy
YW1lV2l0aE1hbmlmZXN0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiBy
ZXN1bHQgPSBGcmFtZVdpdGhNYW5pZmVzdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnJhbWVJ
ZCguLi4pCiAgICAgKiAgICAgLnNldE1hbmlmZXN0VVJMKC4uLikKICAgICAqICAgICAuc2V0U3Rh
dHVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0
ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYo
bmV3IEZyYW1lV2l0aE1hbmlmZXN0KCkpKTsKICAgIH0KfTsKCn0gLy8gQXBwbGljYXRpb25DYWNo
ZQoKbmFtZXNwYWNlIERPTSB7Ci8qIERPTSBpbnRlcmFjdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0
ZXJtcyBvZiBtaXJyb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgYWN0dWFsIERPTSBub2Rl
cy4gRE9NTm9kZSBpcyBhIGJhc2Ugbm9kZSBtaXJyb3IgdHlwZS4gKi8KY2xhc3MgTm9kZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVM
RFNfU0VUID0gMCwKICAgICAgICBOT0RFX0lEX1NFVCA9IDEgPDwgMCwKICAgICAgICBOT0RFX1RZ
UEVfU0VUID0gMSA8PCAxLAogICAgICAgIE5PREVfTkFNRV9TRVQgPSAxIDw8IDIsCiAgICAgICAg
TE9DQUxfTkFNRV9TRVQgPSAxIDw8IDMsCiAgICAgICAgTk9ERV9WQUxVRV9TRVQgPSAxIDw8IDQs
CiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTk9ERV9JRF9TRVQgfCBOT0RFX1RZUEVfU0VUIHwg
Tk9ERV9OQU1FX1NFVCB8IExPQ0FMX05BTUVfU0VUIHwgTk9ERV9WQUxVRV9TRVQpCiAgICB9OwoK
ICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToK
ICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxh
dGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RF
UD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxOb2RlPiBw
dHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVM
RFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIE5vZGU7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOT0RFX0lEX1NFVD4mIHNldE5vZGVJZChp
bnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
Tk9ERV9JRF9TRVQpLCBwcm9wZXJ0eV9ub2RlSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJub2RlSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8Tk9ERV9JRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgTk9ERV9UWVBFX1NFVD4mIHNldE5vZGVUeXBlKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOT0RFX1RZUEVfU0VUKSwgcHJvcGVydHlf
bm9kZVR5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJu
b2RlVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX1RZUEVf
U0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5PREVfTkFNRV9TRVQ+
JiBzZXROb2RlTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5PREVfTkFNRV9TRVQpLCBwcm9wZXJ0eV9ub2RlTmFt
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5vZGVOYW1l
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5PREVfTkFNRV9TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTE9DQUxfTkFNRV9TRVQ+JiBzZXRM
b2NhbE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBMT0NBTF9OQU1FX1NFVCksIHByb3BlcnR5X2xvY2FsTmFtZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImxvY2FsTmFtZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMT0NBTF9OQU1FX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOT0RFX1ZBTFVFX1NFVD4mIHNldE5v
ZGVWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIE5PREVfVkFMVUVfU0VUKSwgcHJvcGVydHlfbm9kZVZhbHVlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibm9kZVZhbHVlIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5PREVfVkFMVUVfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPE5vZGU+JiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PE5vZGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8Tm9kZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Tm9kZT4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxOb2RlPiByZXN1bHQgPSBOb2RlOjpjcmVhdGUoKQogICAgICogICAg
IC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXROb2RlVHlwZSguLi4pCiAgICAgKiAgICAg
LnNldE5vZGVOYW1lKC4uLikKICAgICAqICAgICAuc2V0TG9jYWxOYW1lKC4uLikKICAgICAqICAg
ICAuc2V0Tm9kZVZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxE
U19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4oYWRvcHRSZWYobmV3IE5vZGUoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0Q2hpbGROb2RlQ291
bnQoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigiY2hpbGROb2RlQ291
bnQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRDaGlsZHJlbihQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgiY2hpbGRyZW4i
LCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRBdHRyaWJ1dGVzKFBhc3NSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJhdHRyaWJ1dGVz
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0RG9jdW1lbnRVUkwoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImRvY3VtZW50VVJMIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0UHVibGljSWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInB1YmxpY0lkIiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0U3lzdGVtSWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRTdHJpbmcoInN5c3RlbUlkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0SW50ZXJuYWxT
dWJzZXQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmco
ImludGVybmFsU3Vic2V0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0WG1sVmVyc2lvbihj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygieG1sVmVy
c2lvbiIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJbnNwZWN0b3JPYmpl
Y3Q6OnNldFZhbHVlOwoKfTsKCi8qIERPTSBpbnRlcmFjdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0
ZXJtcyBvZiBtaXJyb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgYWN0dWFsIERPTSBub2Rl
cy4gRE9NTm9kZSBpcyBhIGJhc2Ugbm9kZSBtaXJyb3IgdHlwZS4gKi8KY2xhc3MgRXZlbnRMaXN0
ZW5lciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBUWVBFX1NFVCA9IDEgPDwgMCwKICAgICAgICBV
U0VfQ0FQVFVSRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgSVNfQVRUUklCVVRFX1NFVCA9IDEgPDwg
MiwKICAgICAgICBOT0RFX0lEX1NFVCA9IDEgPDwgMywKICAgICAgICBIQU5ETEVSX0JPRFlfU0VU
ID0gMSA8PCA0LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRZUEVfU0VUIHwgVVNFX0NBUFRV
UkVfU0VUIHwgSVNfQVRUUklCVVRFX1NFVCB8IE5PREVfSURfU0VUIHwgSEFORExFUl9CT0RZX1NF
VCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAg
ICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVm
UHRyPEV2ZW50TGlzdGVuZXI+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9z
dGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmll
bmQgY2xhc3MgRXZlbnRMaXN0ZW5lcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFRZUEVfU0VUPiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVydHlfdHlw
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VFlQRV9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVNFX0NBUFRVUkVfU0VUPiYgc2V0VXNlQ2FwdHVy
ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFVTRV9DQVBUVVJFX1NFVCksIHByb3BlcnR5X3VzZUNhcHR1cmVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigidXNlQ2FwdHVyZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVU0VfQ0FQVFVSRV9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSVNfQVRUUklCVVRFX1NFVD4mIHNldElzQXR0cmlidXRl
KGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgSVNfQVRUUklCVVRFX1NFVCksIHByb3BlcnR5X2lzQXR0cmlidXRlX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImlzQXR0cmlidXRlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElTX0FUVFJJQlVURV9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9JRF9TRVQ+JiBzZXROb2RlSWQoaW50IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5PREVf
SURfU0VUKSwgcHJvcGVydHlfbm9kZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldE51bWJlcigibm9kZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPE5PREVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhB
TkRMRVJfQk9EWV9TRVQ+JiBzZXRIYW5kbGVyQm9keShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhBTkRMRVJfQk9EWV9T
RVQpLCBwcm9wZXJ0eV9oYW5kbGVyQm9keV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoImhhbmRsZXJCb2R5IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEhBTkRMRVJfQk9EWV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RXZlbnRMaXN0ZW5lcj4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxFdmVu
dExpc3RlbmVyPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxFdmVudExp
c3RlbmVyPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEV2ZW50TGlzdGVuZXI+IHJlc3VsdCA9IEV2ZW50
TGlzdGVuZXI6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5z
ZXRVc2VDYXB0dXJlKC4uLikKICAgICAqICAgICAuc2V0SXNBdHRyaWJ1dGUoLi4uKQogICAgICog
ICAgIC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXRIYW5kbGVyQm9keSguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBFdmVudExpc3Rl
bmVyKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldExvY2F0aW9uKC8qUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6RGVidWdnZXI6OkxvY2F0aW9uPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImxvY2F0aW9uIiwgdmFsdWUpOwog
ICAgfQp9OwoKLyogQSBzdHJ1Y3R1cmUgaG9sZGluZyBhbiBSR0JBIGNvbG9yLiAqLwovLyBUeXBl
IG9yaWdpbmFsbHkgd2FzIG5hbWVkICdSR0JBJy4KY2xhc3MgUmdiYSA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwK
ICAgICAgICBSX1NFVCA9IDEgPDwgMCwKICAgICAgICBHX1NFVCA9IDEgPDwgMSwKICAgICAgICBC
X1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChSX1NFVCB8IEdfU0VUIHwg
Ql9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxSZ2JhPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIFJnYmE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSX1NFVD4mIHNl
dFIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFJfU0VUKSwgcHJvcGVydHlfcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoInIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Ul9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgR19TRVQ+JiBzZXRHKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBH
X1NFVCksIHByb3BlcnR5X2dfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
TnVtYmVyKCJnIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEdfU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEJfU0VUPiYgc2V0QihpbnQgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQl9TRVQp
LCBwcm9wZXJ0eV9iX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigiYiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxCX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZ2JhPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNf
bm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxS
Z2JhPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PFJnYmE+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJnYmE+KCp0aGlz
KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6
CiAgICAgKiBSZWZQdHI8UmdiYT4gcmVzdWx0ID0gUmdiYTo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0UiguLi4pCiAgICAgKiAgICAgLnNldEcoLi4uKQogICAgICogICAgIC5zZXRCKC4uLik7CiAg
ICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAg
ICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFJnYmEoKSkp
OwogICAgfQoKICAgIHZvaWQgc2V0QShkb3VibGUgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0TnVtYmVyKCJhIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ29uZmlndXJhdGlvbiBkYXRhIGZv
ciB0aGUgaGlnaGxpZ2h0aW5nIG9mIHBhZ2UgZWxlbWVudHMuICovCmNsYXNzIEhpZ2hsaWdodENv
bmZpZyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBBTExfRklFTERTX1NFVCA9IDAKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEhpZ2hsaWdo
dENvbmZpZz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBI
aWdobGlnaHRDb25maWc7CiAgICBwdWJsaWM6CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxIaWdo
bGlnaHRDb25maWc+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEhpZ2hsaWdodENvbmZpZz4qPigmbV9yZXN1
bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxIaWdobGlnaHRDb25m
aWc+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEhpZ2hsaWdodENvbmZp
Zz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxIaWdobGlnaHRDb25maWc+IHJlc3VsdCA9IEhpZ2hsaWdo
dENvbmZpZzo6Y3JlYXRlKCk7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4o
YWRvcHRSZWYobmV3IEhpZ2hsaWdodENvbmZpZygpKSk7CiAgICB9CgogICAgdm9pZCBzZXRTaG93
SW5mbyhib29sIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEJvb2xlYW4oInNob3dJbmZv
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Q29udGVudENvbG9yKC8qUGFzc1JlZlB0cjxU
eXBlQnVpbGRlcjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImNvbnRlbnRDb2xvciIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFBhZGRpbmdDb2xvcigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OkRPTTo6UmdiYT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0T2JqZWN0KCJwYWRkaW5nQ29sb3IiLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXRCb3JkZXJDb2xvcigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRPTTo6UmdiYT4q
LyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0T2JqZWN0KCJib3JkZXJDb2xvciIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE1hcmdp
bkNvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoIm1h
cmdpbkNvbG9yIiwgdmFsdWUpOwogICAgfQp9OwoKfSAvLyBET00KCm5hbWVzcGFjZSBDU1Mgewov
KiBUaGlzIG9iamVjdCBpZGVudGlmaWVzIGEgQ1NTIHN0eWxlIGluIGEgdW5pcXVlIHdheS4gKi8K
Y2xhc3MgQ1NTU3R5bGVJZCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTVFlMRV9TSEVFVF9JRF9T
RVQgPSAxIDw8IDAsCiAgICAgICAgT1JESU5BTF9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJ
RUxEU19TRVQgPSAoU1RZTEVfU0hFRVRfSURfU0VUIHwgT1JESU5BTF9TRVQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZUlk
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19G
SUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxl
SWQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTVFlMRV9TSEVFVF9JRF9T
RVQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVFlMRV9TSEVFVF9JRF9TRVQpLCBwcm9w
ZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U1RZTEVfU0hFRVRfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IE9SRElOQUxfU0VUPiYgc2V0T3JkaW5hbChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT1JESU5BTF9TRVQpLCBwcm9wZXJ0eV9vcmRp
bmFsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigib3JkaW5h
bCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPUkRJTkFMX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZUlkPiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCBy
ZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PFJlZlB0cjxDU1NTdHlsZUlkPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVy
YXRvciBQYXNzUmVmUHRyPENTU1N0eWxlSWQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gUmVmUHRyPENTU1N0eWxlSWQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGVJZD4gcmVz
dWx0ID0gQ1NTU3R5bGVJZDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElkKC4u
LikKICAgICAqICAgICAuc2V0T3JkaW5hbCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZUlkKCkpKTsKICAgIH0KfTsKCi8qIFRo
aXMgb2JqZWN0IGlkZW50aWZpZXMgYSBDU1MgcnVsZSBpbiBhIHVuaXF1ZSB3YXkuICovCmNsYXNz
IENTU1J1bGVJZCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTVFlMRV9TSEVFVF9JRF9TRVQgPSAx
IDw8IDAsCiAgICAgICAgT1JESU5BTF9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19T
RVQgPSAoU1RZTEVfU0hFRVRfSURfU0VUIHwgT1JESU5BTF9TRVQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NSdWxlSWQ+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTUnVsZUlkOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1RZTEVfU0hFRVRfSURfU0VUPiYgc2V0
U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RZTEVfU0hFRVRfSURfU0VUKSwgcHJvcGVydHlfc3R5
bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
c3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUWUxF
X1NIRUVUX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPUkRJ
TkFMX1NFVD4mIHNldE9yZGluYWwoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIE9SRElOQUxfU0VUKSwgcHJvcGVydHlfb3JkaW5hbF9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm9yZGluYWwiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T1JESU5BTF9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTUnVsZUlkPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNf
bm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxD
U1NSdWxlSWQ+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8Q1NTUnVsZUlkPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxD
U1NSdWxlSWQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0
aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTUnVsZUlkPiByZXN1bHQgPSBDU1NSdWxl
SWQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAg
LnNldE9yZGluYWwoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihh
ZG9wdFJlZihuZXcgQ1NTUnVsZUlkKCkpKTsKICAgIH0KfTsKCi8qIENTUyBydWxlIGNvbGxlY3Rp
b24gZm9yIGEgc2luZ2xlIHBzZXVkbyBzdHlsZS4gKi8KY2xhc3MgUHNldWRvSWRSdWxlcyA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVM
RFNfU0VUID0gMCwKICAgICAgICBQU0VVRE9fSURfU0VUID0gMSA8PCAwLAogICAgICAgIFJVTEVT
X1NFVCA9IDEgPDwgMSwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChQU0VVRE9fSURfU0VUIHwg
UlVMRVNfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8UHNldWRvSWRSdWxlcz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBQc2V1ZG9JZFJ1bGVzOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgUFNFVURPX0lEX1NFVD4mIHNldFBzZXVkb0lkKGludCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBQU0VVRE9fSURfU0VUKSwg
cHJvcGVydHlfcHNldWRvSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
TnVtYmVyKCJwc2V1ZG9JZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxQ
U0VVRE9fSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJVTEVT
X1NFVD4mIHNldFJ1bGVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJVTEVTX1NFVCksIHByb3Bl
cnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJy
dWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSVUxFU19TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UHNldWRvSWRSdWxlcz4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8UHNldWRvSWRSdWxlcz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxQc2V1ZG9JZFJ1bGVzPiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxQc2V1ZG9JZFJ1bGVzPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFBz
ZXVkb0lkUnVsZXM+IHJlc3VsdCA9IFBzZXVkb0lkUnVsZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldFBzZXVkb0lkKC4uLikKICAgICAqICAgICAuc2V0UnVsZXMoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgUHNldWRvSWRSdWxlcygpKSk7
CiAgICB9Cn07CgovKiBDU1MgcnVsZSBjb2xsZWN0aW9uIGZvciBhIHNpbmdsZSBwc2V1ZG8gc3R5
bGUuICovCmNsYXNzIEluaGVyaXRlZFN0eWxlRW50cnkgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAg
TUFUQ0hFRF9DU1NfUlVMRVNfU0VUID0gMSA8PCAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0g
KE1BVENIRURfQ1NTX1JVTEVTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgSW5oZXJpdGVkU3R5bGVFbnRyeTsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1BVENIRURfQ1NTX1JVTEVTX1NF
VD4mIHNldE1hdGNoZWRDU1NSdWxlcyhQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNQVRDSEVEX0NT
U19SVUxFU19TRVQpLCBwcm9wZXJ0eV9tYXRjaGVkQ1NTUnVsZXNfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm1hdGNoZWRDU1NSdWxlcyIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNQVRDSEVEX0NTU19SVUxFU19TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SW5oZXJpdGVkU3R5bGVFbnRyeT4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8SW5oZXJpdGVkU3R5bGVFbnRyeT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+IHJlc3VsdCA9IEluaGVyaXRlZFN0
eWxlRW50cnk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE1hdGNoZWRDU1NSdWxlcyguLi4pOwog
ICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewog
ICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBJbmhlcml0
ZWRTdHlsZUVudHJ5KCkpKTsKICAgIH0KCiAgICB2b2lkIHNldElubGluZVN0eWxlKC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpDU1NTdHlsZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJpbmxpbmVTdHlsZSIs
IHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZSBpbmZvcm1hdGlvbiBmb3IgYSBET00gc3R5
bGUgYXR0cmlidXRlLiAqLwpjbGFzcyBDU1NTdHlsZUF0dHJpYnV0ZSA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwK
ICAgICAgICBOQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBTVFlMRV9TRVQgPSAxIDw8IDEsCiAg
ICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTkFNRV9TRVQgfCBTVFlMRV9TRVQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZUF0
dHJpYnV0ZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBD
U1NTdHlsZUF0dHJpYnV0ZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5B
TUVfU0VUPiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5BTUVfU0VUKSwgcHJvcGVydHlfbmFtZV9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TkFNRV9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgU1RZTEVfU0VUPiYgc2V0U3R5bGUoLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpDU1M6OkNTU1N0eWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVFlM
RV9TRVQpLCBwcm9wZXJ0eV9zdHlsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRPYmplY3QoInN0eWxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFNUWUxFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHls
ZUF0dHJpYnV0ZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGVBdHRy
aWJ1dGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlQXR0
cmlidXRlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPiByZXN1bHQgPSBD
U1NTdHlsZUF0dHJpYnV0ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAg
KiAgICAgLnNldFN0eWxlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxE
U19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4oYWRvcHRSZWYobmV3IENTU1N0eWxlQXR0cmlidXRlKCkpKTsKICAgIH0KfTsKCi8qIENTUyBz
dHlsZXNoZWV0IG1ldGFpbmZvcm1hdGlvbi4gKi8KY2xhc3MgQ1NTU3R5bGVTaGVldEhlYWRlciA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19G
SUVMRFNfU0VUID0gMCwKICAgICAgICBTVFlMRV9TSEVFVF9JRF9TRVQgPSAxIDw8IDAsCiAgICAg
ICAgU09VUkNFX1VfUl9MX1NFVCA9IDEgPDwgMSwKICAgICAgICBUSVRMRV9TRVQgPSAxIDw8IDIs
CiAgICAgICAgRElTQUJMRURfU0VUID0gMSA8PCAzLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0g
KFNUWUxFX1NIRUVUX0lEX1NFVCB8IFNPVVJDRV9VX1JfTF9TRVQgfCBUSVRMRV9TRVQgfCBESVNB
QkxFRF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiBwdHIpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRf
aW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9
CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRIZWFkZXI7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTVFlMRV9TSEVFVF9JRF9TRVQ+JiBzZXRTdHlsZVNoZWV0
SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBTVFlMRV9TSEVFVF9JRF9TRVQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0
SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U1RZTEVfU0hFRVRfSURf
U0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNPVVJDRV9VX1JfTF9T
RVQ+JiBzZXRTb3VyY2VVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTT1VSQ0VfVV9SX0xfU0VUKSwgcHJvcGVydHlf
c291cmNlVVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
c291cmNlVVJMIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNPVVJDRV9V
X1JfTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVElUTEVfU0VU
PiYgc2V0VGl0bGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUSVRMRV9TRVQpLCBwcm9wZXJ0eV90aXRsZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInRpdGxlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRJVExFX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBESVNBQkxFRF9TRVQ+JiBzZXREaXNhYmxlZChib29sIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIERJU0FCTEVE
X1NFVCksIHByb3BlcnR5X2Rpc2FibGVkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldEJvb2xlYW4oImRpc2FibGVkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPERJU0FCTEVEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVh
ZGVyPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PENTU1N0eWxlU2hlZXRIZWFkZXI+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8q
CiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGVTaGVl
dEhlYWRlcj4gcmVzdWx0ID0gQ1NTU3R5bGVTaGVldEhlYWRlcjo6Y3JlYXRlKCkKICAgICAqICAg
ICAuc2V0U3R5bGVTaGVldElkKC4uLikKICAgICAqICAgICAuc2V0U291cmNlVVJMKC4uLikKICAg
ICAqICAgICAuc2V0VGl0bGUoLi4uKQogICAgICogICAgIC5zZXREaXNhYmxlZCguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZVNo
ZWV0SGVhZGVyKCkpKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZXNoZWV0IGNvbnRlbnRzLiAqLwpj
bGFzcyBDU1NTdHlsZVNoZWV0Qm9keSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTVFlMRV9TSEVF
VF9JRF9TRVQgPSAxIDw8IDAsCiAgICAgICAgUlVMRVNfU0VUID0gMSA8PCAxLAogICAgICAgIEFM
TF9GSUVMRFNfU0VUID0gKFNUWUxFX1NIRUVUX0lEX1NFVCB8IFJVTEVTX1NFVCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxl
U2hlZXRCb2R5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwog
ICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNz
IENTU1N0eWxlU2hlZXRCb2R5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
U1RZTEVfU0hFRVRfSURfU0VUPiYgc2V0U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RZTEVfU0hF
RVRfSURfU0VUKSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygic3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFNUWUxFX1NIRUVUX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBSVUxFU19TRVQ+JiBzZXRSdWxlcyhQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBSVUxFU19TRVQpLCBwcm9wZXJ0eV9ydWxlc19hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicnVsZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8UlVMRVNfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPENTU1N0eWxlU2hlZXRCb2R5PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9k
eT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxD
U1NTdHlsZVNoZWV0Qm9keT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
Q1NTU3R5bGVTaGVldEJvZHk+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAg
KiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+
IHJlc3VsdCA9IENTU1N0eWxlU2hlZXRCb2R5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdHls
ZVNoZWV0SWQoLi4uKQogICAgICogICAgIC5zZXRSdWxlcyguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZVNoZWV0Qm9keSgpKSk7
CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIHJ1bGUg
cmVwcmVzZW50YXRpb24uICovCmNsYXNzIENTU1J1bGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgLy8gLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnb3JpZ2luJyB3
aGlsZSBnZW5lcmF0aW5nIENTU1J1bGUuCiAgICAvLyBuYW1lc3BhY2UgT3JpZ2luIHsKICAgIC8v
IGNvbnN0IGNoYXIqIGNvbnN0IHVzZXIgPSAidXNlciI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25z
dCB1c2VyX2FnZW50ID0gInVzZXItYWdlbnQiOwogICAgLy8gY29uc3QgY2hhciogY29uc3QgaW5z
cGVjdG9yID0gImluc3BlY3RvciI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCAgPSAiIjsKICAg
IC8vIH0gLy8gbmFtZXNwYWNlIE9yaWdpbgoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19T
RVQgPSAwLAogICAgICAgIFNFTEVDVE9SX1RFWFRfU0VUID0gMSA8PCAwLAogICAgICAgIFNPVVJD
RV9MSU5FX1NFVCA9IDEgPDwgMSwKICAgICAgICBPUklHSU5fU0VUID0gMSA8PCAyLAogICAgICAg
IFNUWUxFX1NFVCA9IDEgPDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9IChTRUxFQ1RPUl9U
RVhUX1NFVCB8IFNPVVJDRV9MSU5FX1NFVCB8IE9SSUdJTl9TRVQgfCBTVFlMRV9TRVQpCiAgICB9
OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0
ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVt
cGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwg
U1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NS
dWxlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBO
T19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAg
ICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1J1
bGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTRUxFQ1RPUl9URVhUX1NF
VD4mIHNldFNlbGVjdG9yVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNFTEVDVE9SX1RFWFRfU0VUKSwgcHJvcGVy
dHlfc2VsZWN0b3JUZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygic2VsZWN0b3JUZXh0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFNFTEVDVE9SX1RFWFRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IFNPVVJDRV9MSU5FX1NFVD4mIHNldFNvdXJjZUxpbmUoaW50IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNPVVJDRV9MSU5FX1NFVCksIHByb3Bl
cnR5X3NvdXJjZUxpbmVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJzb3VyY2VMaW5lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNP
VVJDRV9MSU5FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPUklH
SU5fU0VUPiYgc2V0T3JpZ2luKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT1JJR0lOX1NFVCksIHByb3BlcnR5X29yaWdp
bl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPUklHSU5fU0VUPigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUWUxFX1NFVD4mIHNldFN0eWxlKC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpDU1NTdHlsZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgU1RZTEVfU0VUKSwgcHJvcGVydHlfc3R5bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJzdHlsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxTVFlMRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8Q1NTUnVsZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTUnVsZT4qPigmbV9yZXN1bHQpOwogICAg
ICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NSdWxlPiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NSdWxlPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENT
U1J1bGU+IHJlc3VsdCA9IENTU1J1bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlbGVjdG9y
VGV4dCguLi4pCiAgICAgKiAgICAgLnNldFNvdXJjZUxpbmUoLi4uKQogICAgICogICAgIC5zZXRP
cmlnaW4oLi4uKQogICAgICogICAgIC5zZXRTdHlsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMg
QnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NSdWxlKCkpKTsKICAgIH0KCiAgICB2
b2lkIHNldFJ1bGVJZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZUlkPiov
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRPYmplY3QoInJ1bGVJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNvdXJjZVVSTChj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic291cmNl
VVJMIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2VsZWN0b3JSYW5nZSgvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6OkNTUzo6U291cmNlUmFuZ2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgic2VsZWN0b3JSYW5n
ZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE1lZGlhKFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJtZWRpYSIsIHZhbHVl
KTsKICAgIH0KfTsKCi8qIFRleHQgcmFuZ2Ugd2l0aGluIGEgcmVzb3VyY2UuICovCmNsYXNzIFNv
dXJjZVJhbmdlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewog
ICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNUQVJUX1NFVCA9IDEgPDwgMCwKICAg
ICAgICBFTkRfU0VUID0gMSA8PCAxLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFNUQVJUX1NF
VCB8IEVORF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxTb3VyY2VSYW5nZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBTb3VyY2VSYW5nZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFNUQVJUX1NFVD4mIHNldFN0YXJ0KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFSVF9TRVQpLCBwcm9wZXJ0eV9zdGFy
dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0YXJ0Iiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUQVJUX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFTkRfU0VUPiYgc2V0RW5kKGludCB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFTkRfU0VUKSwg
cHJvcGVydHlfZW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigiZW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVORF9TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U291cmNlUmFuZ2U+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPFNvdXJjZVJhbmdlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiAoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjxTb3VyY2VSYW5nZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTb3VyY2VSYW5n
ZT4gcmVzdWx0ID0gU291cmNlUmFuZ2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0YXJ0KC4u
LikKICAgICAqICAgICAuc2V0RW5kKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklF
TERTX1NFVD4oYWRvcHRSZWYobmV3IFNvdXJjZVJhbmdlKCkpKTsKICAgIH0KfTsKCmNsYXNzIENT
U0NvbXB1dGVkU3R5bGVQcm9wZXJ0eSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBOQU1FX1NFVCA9
IDEgPDwgMCwKICAgICAgICBWQUxVRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19T
RVQgPSAoTkFNRV9TRVQgfCBWQUxVRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFU
RT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+IHB0
cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxE
U19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTQ29tcHV0ZWRT
dHlsZVByb3BlcnR5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTkFNRV9T
RVQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgTkFNRV9TRVQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOQU1FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBWQUxVRV9TRVQ+JiBzZXRWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZBTFVFX1NF
VCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VkFM
VUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU0NvbXB1dGVk
U3R5bGVQcm9wZXJ0eT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENT
U0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBS
ZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsK
CiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU0Nv
bXB1dGVkU3R5bGVQcm9wZXJ0eT4gcmVzdWx0ID0gQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5Ojpj
cmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4u
KTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAg
IHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ1NT
Q29tcHV0ZWRTdHlsZVByb3BlcnR5KCkpKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZSByZXByZXNl
bnRhdGlvbi4gKi8KY2xhc3MgQ1NTU3R5bGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgQ1NTX1BS
T1BFUlRJRVNfU0VUID0gMSA8PCAwLAogICAgICAgIFNIT1JUSEFORF9FTlRSSUVTX1NFVCA9IDEg
PDwgMSwKICAgICAgICBXSURUSF9TRVQgPSAxIDw8IDIsCiAgICAgICAgSEVJR0hUX1NFVCA9IDEg
PDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9IChDU1NfUFJPUEVSVElFU19TRVQgfCBTSE9S
VEhBTkRfRU5UUklFU19TRVQgfCBXSURUSF9TRVQgfCBIRUlHSFRfU0VUKQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGU+IHB0
cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxE
U19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGU7CiAg
ICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDU1NfUFJPUEVSVElFU19TRVQ+JiBz
ZXRDc3NQcm9wZXJ0aWVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENTU19QUk9QRVJUSUVTX1NF
VCksIHByb3BlcnR5X2Nzc1Byb3BlcnRpZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0QXJyYXkoImNzc1Byb3BlcnRpZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8Q1NTX1BST1BFUlRJRVNfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFNIT1JUSEFORF9FTlRSSUVTX1NFVD4mIHNldFNob3J0aGFuZEVudHJpZXMo
UGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0hPUlRIQU5EX0VOVFJJRVNfU0VUKSwgcHJvcGVydHlf
c2hvcnRoYW5kRW50cmllc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRB
cnJheSgic2hvcnRoYW5kRW50cmllcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxTSE9SVEhBTkRfRU5UUklFU19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgV0lEVEhfU0VUPiYgc2V0V2lkdGgoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBXSURUSF9TRVQpLCBwcm9w
ZXJ0eV93aWR0aF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
IndpZHRoIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFdJRFRIX1NFVD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIRUlHSFRfU0VUPiYgc2V0SGVp
Z2h0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgSEVJR0hUX1NFVCksIHByb3BlcnR5X2hlaWdodF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImhlaWdodCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIRUlHSFRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZT4qPigm
bV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHls
ZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGU+KCp0aGlz
KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6
CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGU+IHJlc3VsdCA9IENTU1N0eWxlOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXRDc3NQcm9wZXJ0aWVzKC4uLikKICAgICAqICAgICAuc2V0U2hvcnRoYW5kRW50
cmllcyguLi4pCiAgICAgKiAgICAgLnNldFdpZHRoKC4uLikKICAgICAqICAgICAuc2V0SGVpZ2h0
KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3
IENTU1N0eWxlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFN0eWxlSWQoLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpDU1M6OkNTU1N0eWxlSWQ+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgic3R5bGVJZCIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldENzc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRTdHJpbmcoImNzc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRSYW5nZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U291cmNlUmFuZ2U+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9i
amVjdCgicmFuZ2UiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBDU1Mgc3R5bGUgZWZmZWN0aXZlIHZp
c3VhbCBkaW1lbnNpb25zIGFuZCBzb3VyY2Ugb2Zmc2V0cy4gKi8KY2xhc3MgQ1NTUHJvcGVydHkg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gLy8gTmFtZWQgYWZ0ZXIg
cHJvcGVydHkgbmFtZSAnc3RhdHVzJyB3aGlsZSBnZW5lcmF0aW5nIENTU1Byb3BlcnR5LgogICAg
Ly8gbmFtZXNwYWNlIFN0YXR1cyB7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBhY3RpdmUgPSAi
YWN0aXZlIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IGluYWN0aXZlID0gImluYWN0aXZlIjsK
ICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IGRpc2FibGVkID0gImRpc2FibGVkIjsKICAgIC8vIGNv
bnN0IGNoYXIqIGNvbnN0IHN0eWxlID0gInN0eWxlIjsKICAgIC8vIH0gLy8gbmFtZXNwYWNlIFN0
YXR1cwoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIE5BTUVf
U0VUID0gMSA8PCAwLAogICAgICAgIFZBTFVFX1NFVCA9IDEgPDwgMSwKICAgICAgICBBTExfRklF
TERTX1NFVCA9IChOQU1FX1NFVCB8IFZBTFVFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50
IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVp
bGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1Byb3BlcnR5PiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1Byb3BlcnR5OwogICAgcHVi
bGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTkFNRV9TRVQ+JiBzZXROYW1lKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgTkFNRV9TRVQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxOQU1FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWQUxV
RV9TRVQ+JiBzZXRWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZBTFVFX1NFVCksIHByb3BlcnR5X3ZhbHVlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VkFMVUVfU0VUPigpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1Byb3BlcnR5PiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNf
bm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxD
U1NQcm9wZXJ0eT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxDU1NQcm9wZXJ0eT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQ
dHI8Q1NTUHJvcGVydHk+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBT
eW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTUHJvcGVydHk+IHJlc3VsdCA9
IENTU1Byb3BlcnR5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAg
ICAuc2V0VmFsdWUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihh
ZG9wdFJlZihuZXcgQ1NTUHJvcGVydHkoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0UHJpb3JpdHko
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInByaW9y
aXR5IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0SW1wbGljaXQoYm9vbCB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJpbXBsaWNpdCIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRTdHJpbmcoInRleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYXJzZWRPayhib29s
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEJvb2xlYW4oInBhcnNlZE9rIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0U3RhdHVzKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRTaG9ydGhhbmROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJzaG9ydGhhbmROYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmFu
Z2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNvdXJjZVJhbmdlPiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3Qo
InJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIG1lZGlhIHF1ZXJ5IGRlc2NyaXB0b3Iu
ICovCmNsYXNzIENTU01lZGlhIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IC8vIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3NvdXJjZScgd2hpbGUgZ2VuZXJhdGlu
ZyBDU1NNZWRpYS4KICAgIC8vIG5hbWVzcGFjZSBTb3VyY2UgewogICAgLy8gY29uc3QgY2hhciog
Y29uc3QgbWVkaWFSdWxlID0gIm1lZGlhUnVsZSI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCBp
bXBvcnRSdWxlID0gImltcG9ydFJ1bGUiOwogICAgLy8gY29uc3QgY2hhciogY29uc3Qgc3R5bGVz
aGVldCA9ICJzdHlsZXNoZWV0IjsKICAgIC8vIH0gLy8gbmFtZXNwYWNlIFNvdXJjZQoKICAgIGVu
dW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFRFWFRfU0VUID0gMSA8PCAw
LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRFWFRfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTTWVkaWE+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQs
IGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0
ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTTWVkaWE7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBURVhUX1NFVD4mIHNldFRleHQoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBURVhUX1NFVCksIHByb3BlcnR5X3RleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFRFWFRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU01l
ZGlhPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFM
TF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NNZWRpYT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NNZWRpYT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8Q1NTTWVkaWE+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTTWVk
aWE+IHJlc3VsdCA9IENTU01lZGlhOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRUZXh0KC4uLik7
CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7
CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IENTU01l
ZGlhKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFNvdXJjZShjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0U291cmNlVVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0U3RyaW5nKCJzb3VyY2VVUkwiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTb3Vy
Y2VMaW5lKGludCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoInNvdXJjZUxp
bmUiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBDU1Mgc2VsZWN0b3IgcHJvZmlsZSBlbnRyeS4gKi8K
Y2xhc3MgU2VsZWN0b3JQcm9maWxlRW50cnkgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgU0VMRUNU
T1JfU0VUID0gMSA8PCAwLAogICAgICAgIFRJTUVfU0VUID0gMSA8PCAxLAogICAgICAgIEhJVF9D
T1VOVF9TRVQgPSAxIDw8IDIsCiAgICAgICAgTUFUQ0hfQ09VTlRfU0VUID0gMSA8PCAzLAogICAg
ICAgIEFMTF9GSUVMRFNfU0VUID0gKFNFTEVDVE9SX1NFVCB8IFRJTUVfU0VUIHwgSElUX0NPVU5U
X1NFVCB8IE1BVENIX0NPVU5UX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlbGVjdG9yUHJvZmlsZUVudHJ5
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0VMRUNUT1JfU0VUPiYgc2V0
U2VsZWN0b3IoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBTRUxFQ1RPUl9TRVQpLCBwcm9wZXJ0eV9zZWxlY3Rvcl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNlbGVjdG9yIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNFTEVDVE9SX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUSU1FX1NFVD4mIHNldFRpbWUoZG91YmxlIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRJTUVf
U0VUKSwgcHJvcGVydHlfdGltZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoInRpbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VElN
RV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSElUX0NPVU5UX1NF
VD4mIHNldEhpdENvdW50KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBISVRfQ09VTlRfU0VUKSwgcHJvcGVydHlfaGl0Q291bnRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJoaXRDb3VudCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxISVRfQ09VTlRfU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1BVENIX0NPVU5UX1NFVD4mIHNldE1hdGNoQ291
bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIE1BVENIX0NPVU5UX1NFVCksIHByb3BlcnR5X21hdGNoQ291bnRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJtYXRjaENvdW50IiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1BVENIX0NPVU5UX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTZWxlY3RvclByb2ZpbGVFbnRyeT4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+ICgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PiByZXN1bHQgPSBTZWxlY3RvclByb2Zp
bGVFbnRyeTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2VsZWN0b3IoLi4uKQogICAgICogICAg
IC5zZXRUaW1lKC4uLikKICAgICAqICAgICAuc2V0SGl0Q291bnQoLi4uKQogICAgICogICAgIC5z
ZXRNYXRjaENvdW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4o
YWRvcHRSZWYobmV3IFNlbGVjdG9yUHJvZmlsZUVudHJ5KCkpKTsKICAgIH0KfTsKCmNsYXNzIFNl
bGVjdG9yUHJvZmlsZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBUT1RBTF9USU1FX1NFVCA9IDEg
PDwgMCwKICAgICAgICBEQVRBX1NFVCA9IDEgPDwgMSwKICAgICAgICBBTExfRklFTERTX1NFVCA9
IChUT1RBTF9USU1FX1NFVCB8IERBVEFfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9maWxlPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlbGVjdG9yUHJvZmlsZTsKICAg
IHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRPVEFMX1RJTUVfU0VUPiYgc2V0VG90
YWxUaW1lKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBUT1RBTF9USU1FX1NFVCksIHByb3BlcnR5X3RvdGFsVGltZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInRvdGFsVGltZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUT1RBTF9USU1FX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEQVRBX1NFVD4mIHNldERhdGEoUGFzc1JlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgREFUQV9TRVQpLCBwcm9wZXJ0eV9kYXRhX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJkYXRhIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPERBVEFfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFNlbGVjdG9yUHJvZmlsZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2VsZWN0b3JQcm9maWxlPio+
KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNlbGVj
dG9yUHJvZmlsZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8U2VsZWN0
b3JQcm9maWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4gcmVzdWx0ID0g
U2VsZWN0b3JQcm9maWxlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRUb3RhbFRpbWUoLi4uKQog
ICAgICogICAgIC5zZXREYXRhKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJ
RUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERT
X1NFVD4oYWRvcHRSZWYobmV3IFNlbGVjdG9yUHJvZmlsZSgpKSk7CiAgICB9Cn07Cgp9IC8vIENT
UwoKbmFtZXNwYWNlIFRpbWVsaW5lIHsKLyogVGltZWxpbmUgcmVjb3JkIGNvbnRhaW5zIGluZm9y
bWF0aW9uIGFib3V0IHRoZSByZWNvcmRlZCBhY3Rpdml0eS4gKi8KY2xhc3MgVGltZWxpbmVFdmVu
dCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
T19GSUVMRFNfU0VUID0gMCwKICAgICAgICBUWVBFX1NFVCA9IDEgPDwgMCwKICAgICAgICBEQVRB
X1NFVCA9IDEgPDwgMSwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChUWVBFX1NFVCB8IERBVEFf
U0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8VGltZWxpbmVFdmVudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBUaW1lbGluZUV2ZW50OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVFlQRV9TRVQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVFlQRV9TRVQpLCBwcm9wZXJ0eV90
eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEQVRBX1NFVD4mIHNldERhdGEoUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIERBVEFfU0VUKSwgcHJvcGVydHlfZGF0YV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImRhdGEiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8REFUQV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8VGltZWxpbmVFdmVudD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8VGltZWxpbmVFdmVudD4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxUaW1l
bGluZUV2ZW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxUaW1lbGlu
ZUV2ZW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHJlc3VsdCA9IFRpbWVs
aW5lRXZlbnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5z
ZXREYXRhKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRS
ZWYobmV3IFRpbWVsaW5lRXZlbnQoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0Q2hpbGRyZW4oUGFz
c1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJy
YXkoImNoaWxkcmVuIiwgdmFsdWUpOwogICAgfQp9OwoKfSAvLyBUaW1lbGluZQoKI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVidWdnZXIgewovKiBCcmVha3BvaW50
IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIEJyZWFrcG9pbnRJZDsKCi8qIFVuaXF1ZSBz
Y3JpcHQgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgU2NyaXB0SWQ7CgovKiBDYWxsIGZy
YW1lIGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIENhbGxGcmFtZUlkOwoKLyogTG9jYXRp
b24gaW4gdGhlIHNvdXJjZSBjb2RlLiAqLwpjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwK
ICAgICAgICBTQ1JJUFRfSURfU0VUID0gMSA8PCAwLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9
IDEgPDwgMSwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChTQ1JJUFRfSURfU0VUIHwgTElORV9O
VU1CRVJfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8TG9jYXRpb24+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgTG9jYXRpb247CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBTQ1JJUFRfSURfU0VUPiYgc2V0U2NyaXB0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTQ1JJUFRfSURfU0VUKSwg
cHJvcGVydHlfc2NyaXB0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJzY3JpcHRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxT
Q1JJUFRfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExJTkVf
TlVNQkVSX1NFVD4mIHNldExpbmVOdW1iZXIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExJTkVfTlVNQkVSX1NFVCksIHByb3BlcnR5X2xp
bmVOdW1iZXJfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJs
aW5lTnVtYmVyIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfTlVN
QkVSX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxMb2NhdGlvbj4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklF
TERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxSZWZQdHI8TG9jYXRpb24+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8TG9jYXRpb24+ICgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gUmVmUHRyPExvY2F0aW9uPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPExvY2F0aW9uPiBy
ZXN1bHQgPSBMb2NhdGlvbjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2NyaXB0SWQoLi4uKQog
ICAgICogICAgIC5zZXRMaW5lTnVtYmVyKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVy
PE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9f
RklFTERTX1NFVD4oYWRvcHRSZWYobmV3IExvY2F0aW9uKCkpKTsKICAgIH0KCiAgICB2b2lkIHNl
dENvbHVtbk51bWJlcihpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJj
b2x1bW5OdW1iZXIiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBKYXZhU2NyaXB0IGNhbGwgZnJhbWUu
IEFycmF5IG9mIGNhbGwgZnJhbWVzIGZvcm0gdGhlIGNhbGwgc3RhY2suICovCmNsYXNzIENhbGxG
cmFtZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBDQUxMX0ZSQU1FX0lEX1NFVCA9IDEgPDwgMCwK
ICAgICAgICBGVU5DVElPTl9OQU1FX1NFVCA9IDEgPDwgMSwKICAgICAgICBMT0NBVElPTl9TRVQg
PSAxIDw8IDIsCiAgICAgICAgU0NPUEVfQ0hBSU5fU0VUID0gMSA8PCAzLAogICAgICAgIFRISVNf
U0VUID0gMSA8PCA0LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKENBTExfRlJBTUVfSURfU0VU
IHwgRlVOQ1RJT05fTkFNRV9TRVQgfCBMT0NBVElPTl9TRVQgfCBTQ09QRV9DSEFJTl9TRVQgfCBU
SElTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPENhbGxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBDYWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBDQUxMX0ZSQU1FX0lEX1NFVD4mIHNldENhbGxGcmFtZUlkKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ0FMTF9GUkFN
RV9JRF9TRVQpLCBwcm9wZXJ0eV9jYWxsRnJhbWVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRTdHJpbmcoImNhbGxGcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPENBTExfRlJBTUVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IEZVTkNUSU9OX05BTUVfU0VUPiYgc2V0RnVuY3Rpb25OYW1lKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgRlVOQ1RJT05fTkFNRV9TRVQpLCBwcm9wZXJ0eV9mdW5jdGlvbk5hbWVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmdW5jdGlvbk5hbWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RlVOQ1RJT05fTkFNRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTE9DQVRJT05fU0VUPiYgc2V0TG9jYXRp
b24oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6TG9jYXRpb24+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIExPQ0FUSU9OX1NFVCksIHByb3BlcnR5X2xvY2F0aW9uX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgibG9jYXRpb24iLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TE9DQVRJT05fU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNDT1BFX0NIQUlOX1NFVD4mIHNldFNjb3BlQ2hh
aW4oUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0NPUEVfQ0hBSU5fU0VUKSwgcHJvcGVydHlfc2Nv
cGVDaGFpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgic2Nv
cGVDaGFpbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTQ09QRV9DSEFJ
Tl9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVEhJU19TRVQ+JiBz
ZXRUaGlzKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0Piov
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUSElTX1NFVCksIHByb3BlcnR5X3RoaXNfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJ0aGlzIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRISVNfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFk
eSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEZyYW1l
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENh
bGxGcmFtZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEZyYW1l
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1lOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXRDYWxsRnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldEZ1bmN0
aW9uTmFtZSguLi4pCiAgICAgKiAgICAgLnNldExvY2F0aW9uKC4uLikKICAgICAqICAgICAuc2V0
U2NvcGVDaGFpbiguLi4pCiAgICAgKiAgICAgLnNldFRoaXMoLi4uKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ2FsbEZyYW1lKCkpKTsKICAgIH0K
fTsKCi8qIFNjb3BlIGRlc2NyaXB0aW9uLiAqLwpjbGFzcyBTY29wZSA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICd0
eXBlJyB3aGlsZSBnZW5lcmF0aW5nIFNjb3BlLgogICAgLy8gbmFtZXNwYWNlIFR5cGUgewogICAg
Ly8gY29uc3QgY2hhciogY29uc3QgZ2xvYmFsID0gImdsb2JhbCI7CiAgICAvLyBjb25zdCBjaGFy
KiBjb25zdCBsb2NhbCA9ICJsb2NhbCI7CiAgICAvLyBjb25zdCBjaGFyKiBjb25zdCB3aXRoID0g
IndpdGgiOwogICAgLy8gY29uc3QgY2hhciogY29uc3QgY2xvc3VyZSA9ICJjbG9zdXJlIjsKICAg
IC8vIGNvbnN0IGNoYXIqIGNvbnN0IGNhdGNoID0gImNhdGNoIjsKICAgIC8vIH0gLy8gbmFtZXNw
YWNlIFR5cGUKCiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBU
WVBFX1NFVCA9IDEgPDwgMCwKICAgICAgICBPQkpFQ1RfU0VUID0gMSA8PCAxLAogICAgICAgIEFM
TF9GSUVMRFNfU0VUID0gKFRZUEVfU0VUIHwgT0JKRUNUX1NFVCkKICAgIH07CgogICAgdGVtcGxh
dGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RF
UD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNjb3BlPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNjb3BlOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVFlQRV9TRVQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVFlQ
RV9TRVQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxU
WVBFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPQkpFQ1RfU0VU
PiYgc2V0T2JqZWN0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2Jq
ZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPQkpFQ1RfU0VUKSwgcHJvcGVydHlfb2Jq
ZWN0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgib2JqZWN0
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9CSkVDVF9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2NvcGU+JiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PFNjb3BlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPFNjb3BlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTY29wZT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxTY29wZT4gcmVzdWx0ID0gU2NvcGU6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRPYmplY3QoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgU2NvcGUoKSkpOwogICAg
fQp9OwoKfSAvLyBEZWJ1Z2dlcgoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VS
KQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCm5hbWVzcGFjZSBET01EZWJ1Z2dlciB7
Ci8qIERPTSBicmVha3BvaW50IHR5cGUuICovCm5hbWVzcGFjZSBET01CcmVha3BvaW50VHlwZSB7
CmNvbnN0IGNoYXIqIGNvbnN0IHN1YnRyZWVfbW9kaWZpZWQgPSAic3VidHJlZS1tb2RpZmllZCI7
CmNvbnN0IGNoYXIqIGNvbnN0IGF0dHJpYnV0ZV9tb2RpZmllZCA9ICJhdHRyaWJ1dGUtbW9kaWZp
ZWQiOwpjb25zdCBjaGFyKiBjb25zdCBub2RlX3JlbW92ZWQgPSAibm9kZS1yZW1vdmVkIjsKfSAv
LyBuYW1lc3BhY2UgRE9NQnJlYWtwb2ludFR5cGUKCn0gLy8gRE9NRGVidWdnZXIKCiNlbmRpZiAv
LyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVH
R0VSKQpuYW1lc3BhY2UgUHJvZmlsZXIgewp9IC8vIFByb2ZpbGVyCgojZW5kaWYgLy8gRU5BQkxF
KEpBVkFTQ1JJUFRfREVCVUdHRVIpCgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgoKI2VuZGlm
IC8vIEVOQUJMRShJTlNQRUNUT1IpCgpjbGFzcyBJbnNwZWN0b3JGcm9udGVuZCB7CnB1YmxpYzoK
ICAgIEluc3BlY3RvckZyb250ZW5kKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCopOwoKCiAgICBj
bGFzcyBJbnNwZWN0b3IgewogICAgcHVibGljOgogICAgICAgIEluc3BlY3RvcihJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQg
ZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZChpbnQgdGVzdENhbGxJZCwgY29uc3QgU3RyaW5nJiBz
Y3JpcHQpOwogICAgICAgIHZvaWQgaW5zcGVjdCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1
bnRpbWU6OlJlbW90ZU9iamVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gb2JqZWN0
LCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gaGludHMpOwogICAgICAgIHZvaWQgZGlkQ3Jl
YXRlV29ya2VyKGludCBpZCwgY29uc3QgU3RyaW5nJiB1cmwsIGJvb2wgaXNTaGFyZWQpOwogICAg
ICAgIHZvaWQgZGlkRGVzdHJveVdvcmtlcihpbnQgaWQpOwogICAgICAgIHZvaWQgc2V0SW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBJbnNwZWN0b3IqIGluc3BlY3Rvcigp
IHsgcmV0dXJuICZtX2luc3BlY3RvcjsgfQoKICAgIGNsYXNzIE1lbW9yeSB7CiAgICBwdWJsaWM6
CiAgICAgICAgTWVtb3J5KEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAg
ICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgp
IHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAg
ICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
CiAgICB9OwoKICAgIE1lbW9yeSogbWVtb3J5KCkgeyByZXR1cm4gJm1fbWVtb3J5OyB9CgogICAg
Y2xhc3MgUGFnZSB7CiAgICBwdWJsaWM6CiAgICAgICAgUGFnZShJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgZG9tQ29udGVu
dEV2ZW50RmlyZWQoZG91YmxlIHRpbWVzdGFtcCk7CiAgICAgICAgdm9pZCBsb2FkRXZlbnRGaXJl
ZChkb3VibGUgdGltZXN0YW1wKTsKICAgICAgICB2b2lkIGZyYW1lTmF2aWdhdGVkKC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6UGFnZTo6RnJhbWU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IGZyYW1lKTsKICAgICAgICB2b2lkIGZyYW1lRGV0YWNoZWQoY29uc3QgU3RyaW5nJiBmcmFt
ZUlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1
cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07
CgogICAgUGFnZSogcGFnZSgpIHsgcmV0dXJuICZtX3BhZ2U7IH0KCiAgICBjbGFzcyBSdW50aW1l
IHsKICAgIHB1YmxpYzoKICAgICAgICBSdW50aW1lKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAg
ICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFJ1bnRpbWUqIHJ1bnRpbWUoKSB7IHJldHVybiAm
bV9ydW50aW1lOyB9CgogICAgY2xhc3MgQ29uc29sZSB7CiAgICBwdWJsaWM6CiAgICAgICAgQ29u
c29sZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkg
OiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
fQogICAgICAgIHZvaWQgbWVzc2FnZUFkZGVkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q29u
c29sZTo6Q29uc29sZU1lc3NhZ2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3Nh
Z2UpOwogICAgICAgIHZvaWQgbWVzc2FnZVJlcGVhdENvdW50VXBkYXRlZChpbnQgY291bnQpOwog
ICAgICAgIHZvaWQgbWVzc2FnZXNDbGVhcmVkKCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9
CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIENvbnNvbGUqIGNvbnNvbGUoKSB7IHJldHVy
biAmbV9jb25zb2xlOyB9CgogICAgY2xhc3MgTmV0d29yayB7CiAgICBwdWJsaWM6CiAgICAgICAg
TmV0d29yayhJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IHsgfQogICAgICAgIHZvaWQgcmVxdWVzdFdpbGxCZVNlbnQoY29uc3QgU3RyaW5nJiByZXF1ZXN0
SWQsIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwgY29uc3QgU3RyaW5nJiBsb2FkZXJJZCwgY29uc3Qg
U3RyaW5nJiBkb2N1bWVudFVSTCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpS
ZXF1ZXN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0LCBkb3VibGUgdGlt
ZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQ
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gaW5pdGlhdG9yLCBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBzdGFja1RyYWNlLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJl
c3BvbnNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZWRpcmVjdFJlc3BvbnNlKTsK
ICAgICAgICB2b2lkIHJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoY29uc3QgU3RyaW5nJiByZXF1ZXN0
SWQpOwogICAgICAgIHZvaWQgcmVzcG9uc2VSZWNlaXZlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJ
ZCwgY29uc3QgU3RyaW5nJiBmcmFtZUlkLCBjb25zdCBTdHJpbmcmIGxvYWRlcklkLCBkb3VibGUg
dGltZXN0YW1wLCBjb25zdCBTdHJpbmcmIHR5cGUsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
TmV0d29yazo6UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNl
KTsKICAgICAgICB2b2lkIGRhdGFSZWNlaXZlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91
YmxlIHRpbWVzdGFtcCwgaW50IGRhdGFMZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCk7CiAg
ICAgICAgdm9pZCBsb2FkaW5nRmluaXNoZWQoY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJs
ZSB0aW1lc3RhbXApOwogICAgICAgIHZvaWQgbG9hZGluZ0ZhaWxlZChjb25zdCBTdHJpbmcmIHJl
cXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgY29uc3QgU3RyaW5nJiBlcnJvclRleHQsIGNvbnN0
IGJvb2wqIGNvbnN0IGNhbmNlbGVkKTsKICAgICAgICB2b2lkIHJlcXVlc3RTZXJ2ZWRGcm9tTWVt
b3J5Q2FjaGUoY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwg
Y29uc3QgU3RyaW5nJiBsb2FkZXJJZCwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCwgZG91Ymxl
IHRpbWVzdGFtcCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpJbml0aWF0b3I+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGluaXRpYXRvciwgLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpOZXR3b3JrOjpDYWNoZWRSZXNvdXJjZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcmVzb3VyY2UpOwogICAgICAgIHZvaWQgd2ViU29ja2V0V2lsbFNlbmRIYW5kc2hh
a2VSZXF1ZXN0KGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCAvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OldlYlNvY2tldFJlcXVlc3Q+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QpOwogICAgICAgIHZvaWQgd2ViU29ja2V0SGFu
ZHNoYWtlUmVzcG9uc2VSZWNlaXZlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRp
bWVzdGFtcCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpXZWJTb2NrZXRSZXNw
b25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2UpOwogICAgICAgIHZv
aWQgd2ViU29ja2V0Q3JlYXRlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgY29uc3QgU3RyaW5n
JiB1cmwpOwogICAgICAgIHZvaWQgd2ViU29ja2V0Q2xvc2VkKGNvbnN0IFN0cmluZyYgcmVxdWVz
dElkLCBkb3VibGUgdGltZXN0YW1wKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHBy
aXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgTmV0d29yayogbmV0d29yaygpIHsgcmV0dXJuICZtX25l
dHdvcms7IH0KCiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQogICAgY2xhc3MgRGF0YWJhc2Ugewog
ICAgcHVibGljOgogICAgICAgIERhdGFiYXNlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBhZGREYXRhYmFzZSgvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6OkRhdGFiYXNlOjpEYXRhYmFzZT4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gZGF0YWJhc2UpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25TdWNjZWVk
ZWQoaW50IHRyYW5zYWN0aW9uSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGNvbHVtbk5h
bWVzLCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZXMpOwogICAgICAgIHZvaWQgc3Fs
VHJhbnNhY3Rpb25GYWlsZWQoaW50IHRyYW5zYWN0aW9uSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBzcWxFcnJvcik7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRl
OgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7CiAgICB9OwoKICAgIERhdGFiYXNlKiBkYXRhYmFzZSgpIHsgcmV0dXJuICZtX2RhdGFi
YXNlOyB9CgojZW5kaWYgLy8gRU5BQkxFKFNRTF9EQVRBQkFTRSkKICAgIGNsYXNzIERPTVN0b3Jh
Z2UgewogICAgcHVibGljOgogICAgICAgIERPTVN0b3JhZ2UoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGFkZERPTVN0b3Jh
Z2UoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHN0b3JhZ2UpOwogICAgICAgIHZvaWQgdXBk
YXRlRE9NU3RvcmFnZShpbnQgc3RvcmFnZUlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
ICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NU3RvcmFnZSogZG9tc3RvcmFnZSgpIHsg
cmV0dXJuICZtX2RvbXN0b3JhZ2U7IH0KCiAgICBjbGFzcyBBcHBsaWNhdGlvbkNhY2hlIHsKICAg
IHB1YmxpYzoKICAgICAgICBBcHBsaWNhdGlvbkNhY2hlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBhcHBsaWNhdGlvbkNh
Y2hlU3RhdHVzVXBkYXRlZChjb25zdCBTdHJpbmcmIGZyYW1lSWQsIGNvbnN0IFN0cmluZyYgbWFu
aWZlc3RVUkwsIGludCBzdGF0dXMpOwogICAgICAgIHZvaWQgbmV0d29ya1N0YXRlVXBkYXRlZChi
b29sIGlzTm93T25saW5lKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQog
ICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6
CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsKICAgIH07CgogICAgQXBwbGljYXRpb25DYWNoZSogYXBwbGljYXRpb25jYWNoZSgpIHsg
cmV0dXJuICZtX2FwcGxpY2F0aW9uY2FjaGU7IH0KCiNpZiBFTkFCTEUoRklMRV9TWVNURU0pCiAg
ICBjbGFzcyBGaWxlU3lzdGVtIHsKICAgIHB1YmxpYzoKICAgICAgICBGaWxlU3lzdGVtKEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAg
dm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwg
PSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIEZpbGVTeXN0
ZW0qIGZpbGVzeXN0ZW0oKSB7IHJldHVybiAmbV9maWxlc3lzdGVtOyB9CgojZW5kaWYgLy8gRU5B
QkxFKEZJTEVfU1lTVEVNKQogICAgY2xhc3MgRE9NIHsKICAgIHB1YmxpYzoKICAgICAgICBET00o
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAg
ICAgICB2b2lkIGRvY3VtZW50VXBkYXRlZCgpOwogICAgICAgIHZvaWQgc2V0Q2hpbGROb2Rlcyhp
bnQgcGFyZW50SWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVzKTsKICAgICAgICB2
b2lkIGF0dHJpYnV0ZU1vZGlmaWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29u
c3QgU3RyaW5nJiB2YWx1ZSk7CiAgICAgICAgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKGludCBub2Rl
SWQsIGNvbnN0IFN0cmluZyYgbmFtZSk7CiAgICAgICAgdm9pZCBpbmxpbmVTdHlsZUludmFsaWRh
dGVkKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVJZHMpOwogICAgICAgIHZvaWQgY2hh
cmFjdGVyRGF0YU1vZGlmaWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgY2hhcmFjdGVyRGF0
YSk7CiAgICAgICAgdm9pZCBjaGlsZE5vZGVDb3VudFVwZGF0ZWQoaW50IG5vZGVJZCwgaW50IGNo
aWxkTm9kZUNvdW50KTsKICAgICAgICB2b2lkIGNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnRO
b2RlSWQsIGludCBwcmV2aW91c05vZGVJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006
Ok5vZGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG5vZGUpOwogICAgICAgIHZvaWQg
Y2hpbGROb2RlUmVtb3ZlZChpbnQgcGFyZW50Tm9kZUlkLCBpbnQgbm9kZUlkKTsKICAgICAgICB2
b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NKiBkb20o
KSB7IHJldHVybiAmbV9kb207IH0KCiAgICBjbGFzcyBDU1MgewogICAgcHVibGljOgogICAgICAg
IENTUyhJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkg
OiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
fQogICAgICAgIHZvaWQgbWVkaWFRdWVyeVJlc3VsdENoYW5nZWQoKTsKICAgICAgICB2b2lkIHNl
dEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
Z2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgQ1NTKiBjc3MoKSB7IHJl
dHVybiAmbV9jc3M7IH0KCiAgICBjbGFzcyBUaW1lbGluZSB7CiAgICBwdWJsaWM6CiAgICAgICAg
VGltZWxpbmUoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KSB7IH0KICAgICAgICB2b2lkIGV2ZW50UmVjb3JkZWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVy
OjpUaW1lbGluZTo6VGltZWxpbmVFdmVudD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVjb3JkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyBy
ZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAg
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAg
IH07CgogICAgVGltZWxpbmUqIHRpbWVsaW5lKCkgeyByZXR1cm4gJm1fdGltZWxpbmU7IH0KCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgIGNsYXNzIERlYnVnZ2VyIHsKICAgIHB1
YmxpYzoKICAgICAgICBEZWJ1Z2dlcihJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgZ2xvYmFsT2JqZWN0Q2xlYXJlZCgpOwog
ICAgICAgIHZvaWQgc2NyaXB0UGFyc2VkKGNvbnN0IFN0cmluZyYgc2NyaXB0SWQsIGNvbnN0IFN0
cmluZyYgdXJsLCBpbnQgc3RhcnRMaW5lLCBpbnQgc3RhcnRDb2x1bW4sIGludCBlbmRMaW5lLCBp
bnQgZW5kQ29sdW1uLCBjb25zdCBib29sKiBjb25zdCBpc0NvbnRlbnRTY3JpcHQpOwogICAgICAg
IHZvaWQgc2NyaXB0RmFpbGVkVG9QYXJzZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5n
JiBzY3JpcHRTb3VyY2UsIGludCBzdGFydExpbmUsIGludCBlcnJvckxpbmUsIGNvbnN0IFN0cmlu
ZyYgZXJyb3JNZXNzYWdlKTsKICAgICAgICB2b2lkIGJyZWFrcG9pbnRSZXNvbHZlZChjb25zdCBT
dHJpbmcmIGJyZWFrcG9pbnRJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6
TG9jYXRpb24+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGxvY2F0aW9uKTsKICAgIC8v
IC8vIE5hbWVkIGFmdGVyIHBhcmFtZXRlciBuYW1lICdyZWFzb24nIHdoaWxlIGdlbmVyYXRpbmcg
ZXZlbnQgcGF1c2VkLgogICAgLy8gbmFtZXNwYWNlIFJlYXNvbiB7CiAgICAvLyBjb25zdCBjaGFy
KiBjb25zdCB4aHIgPSAiWEhSIjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IGRvbSA9ICJET00i
OwogICAgLy8gY29uc3QgY2hhciogY29uc3QgZXZlbnRMaXN0ZW5lciA9ICJFdmVudExpc3RlbmVy
IjsKICAgIC8vIGNvbnN0IGNoYXIqIGNvbnN0IGV4Y2VwdGlvbiA9ICJleGNlcHRpb24iOwogICAg
Ly8gY29uc3QgY2hhciogY29uc3Qgb3RoZXIgPSAib3RoZXIiOwogICAgLy8gfSAvLyBuYW1lc3Bh
Y2UgUmVhc29uCgogICAgICAgIHZvaWQgcGF1c2VkKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+
IGNhbGxGcmFtZXMsIGNvbnN0IFN0cmluZyYgcmVhc29uLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gZGF0YSk7CiAgICAgICAgdm9pZCByZXN1bWVkKCk7CiAgICAgICAgdm9pZCBzZXRJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIERlYnVnZ2VyKiBkZWJ1Z2dlcigp
IHsgcmV0dXJuICZtX2RlYnVnZ2VyOyB9CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVC
VUdHRVIpCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgIGNsYXNzIERPTURlYnVn
Z2VyIHsKICAgIHB1YmxpYzoKICAgICAgICBET01EZWJ1Z2dlcihJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgc2V0SW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBET01EZWJ1Z2dlciogZG9tZGVidWdn
ZXIoKSB7IHJldHVybiAmbV9kb21kZWJ1Z2dlcjsgfQoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBjbGFzcyBQ
cm9maWxlciB7CiAgICBwdWJsaWM6CiAgICAgICAgUHJvZmlsZXIoSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGFkZFByb2Zp
bGVIZWFkZXIoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGhlYWRlcik7CiAgICAgICAgdm9p
ZCBhZGRIZWFwU25hcHNob3RDaHVuayhpbnQgdWlkLCBjb25zdCBTdHJpbmcmIGNodW5rKTsKICAg
ICAgICB2b2lkIGZpbmlzaEhlYXBTbmFwc2hvdChpbnQgdWlkKTsKICAgICAgICB2b2lkIHNldFJl
Y29yZGluZ1Byb2ZpbGUoYm9vbCBpc1Byb2ZpbGluZyk7CiAgICAgICAgdm9pZCByZXNldFByb2Zp
bGVzKCk7CiAgICAgICAgdm9pZCByZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzcyhpbnQgZG9uZSwg
aW50IHRvdGFsKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkg
eyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAg
ICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsK
ICAgIH07CgogICAgUHJvZmlsZXIqIHByb2ZpbGVyKCkgeyByZXR1cm4gJm1fcHJvZmlsZXI7IH0K
CiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShXT1JLRVJT
KQogICAgY2xhc3MgV29ya2VyIHsKICAgIHB1YmxpYzoKICAgICAgICBXb3JrZXIoSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lk
IHdvcmtlckNyZWF0ZWQoaW50IHdvcmtlcklkLCBjb25zdCBTdHJpbmcmIHVybCwgYm9vbCBpbnNw
ZWN0b3JDb25uZWN0ZWQpOwogICAgICAgIHZvaWQgd29ya2VyVGVybWluYXRlZChpbnQgd29ya2Vy
SWQpOwogICAgICAgIHZvaWQgZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtlcihpbnQgd29ya2VySWQs
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlKTsKICAgICAgICB2b2lkIGRpc2Nv
bm5lY3RlZEZyb21Xb3JrZXIoKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkg
eyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsg
fQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZh
dGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbDsKICAgIH07CgogICAgV29ya2VyKiB3b3JrZXIoKSB7IHJldHVybiAmbV93b3JrZXI7
IH0KCiNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKCnByaXZhdGU6CiAgICBJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgSW5zcGVjdG9yIG1f
aW5zcGVjdG9yOwogICAgTWVtb3J5IG1fbWVtb3J5OwogICAgUGFnZSBtX3BhZ2U7CiAgICBSdW50
aW1lIG1fcnVudGltZTsKICAgIENvbnNvbGUgbV9jb25zb2xlOwogICAgTmV0d29yayBtX25ldHdv
cms7CiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQogICAgRGF0YWJhc2UgbV9kYXRhYmFzZTsKI2Vu
ZGlmIC8vIEVOQUJMRShTUUxfREFUQUJBU0UpCiAgICBET01TdG9yYWdlIG1fZG9tc3RvcmFnZTsK
ICAgIEFwcGxpY2F0aW9uQ2FjaGUgbV9hcHBsaWNhdGlvbmNhY2hlOwojaWYgRU5BQkxFKEZJTEVf
U1lTVEVNKQogICAgRmlsZVN5c3RlbSBtX2ZpbGVzeXN0ZW07CiNlbmRpZiAvLyBFTkFCTEUoRklM
RV9TWVNURU0pCiAgICBET00gbV9kb207CiAgICBDU1MgbV9jc3M7CiAgICBUaW1lbGluZSBtX3Rp
bWVsaW5lOwojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBEZWJ1Z2dlciBtX2Rl
YnVnZ2VyOwojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNpZiBFTkFCTEUo
SkFWQVNDUklQVF9ERUJVR0dFUikKICAgIERPTURlYnVnZ2VyIG1fZG9tZGVidWdnZXI7CiNlbmRp
ZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RF
QlVHR0VSKQogICAgUHJvZmlsZXIgbV9wcm9maWxlcjsKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKFdPUktFUlMpCiAgICBXb3JrZXIgbV93b3JrZXI7CiNl
bmRpZiAvLyBFTkFCTEUoV09SS0VSUykKfTsKCn0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKI2VuZGlm
IC8vICFkZWZpbmVkKEluc3BlY3RvckZyb250ZW5kX2gpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>120175</attachid>
            <date>2011-12-21 06:43:43 -0800</date>
            <delta_ts>2011-12-22 01:22:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74890-20111221184341.patch</filename>
            <type>text/plain</type>
            <size>41222</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMzM5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzdjYWVkZDMwMWJmNzZk
OWFjMDhhZmI4ZGMxZmMzMWViNjVmNDkyMS4uMTUxZjE1NTNmMzAzM2FmM2ZiZTBjYmQxOTBjZGZh
YTFkMTAxMDMwMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExMSBAQAorMjAxMS0xMi0xOSAgUGV0
ZXIgUnliaW4gIDxwZXRlci5yeWJpbkBnbWFpbC5jb20+CisKKyAgICAgICAgV2ViIEluc3BlY3Rv
cjogQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weTogZ2VuZXJhdGUgYW5vbnltb3VzIHR5cGVzLgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4OTAKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBbm9ueW1vdXMg
dHlwZXMgYXJlIGdlbmVyYXRlZC4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgYXJlIGdlbmVyYXRlZC4K
KworICAgICAgICBJbiBnZW5lcmFsIGl0IG5vdyBnZW5lcmF0ZXMgQysrIHR5cGVzIGZvciBhbm9u
eW1vdXMgb2JqZWN0IHR5cGVzIGZyb20KKyAgICAgICAgSlNPTi4gSXQgdGFrZXMgYSBuYW1lIGZy
b20gdGhlIHR5cGUgZGVjbGFyYXRpb24gc2l0ZSwgdXN1YWxseSBhCisgICAgICAgIHBhcmFtZXRl
ciBuYW1lLiBUaGlzIGFsbCBpcyBleHBsYWluZWQgaW4gY29tbWVudHMgaW4gZ2VuZXJhdGVkIGZp
bGUuIEFsc28KKyAgICAgICAgYWxsIGdlbmVyYXRlZCB0eXBlcyBub3cgcmVmZXIgdG8gb3RoZXIg
Z2VuZXJhdGVkIHR5cGVzIGluIHNldHRlcgorICAgICAgICBtZXRob2RzIC0tIGJ1dCB0aGlzIGlz
IGNvbW1lbnRlZCBvdXQgaW4gZ2VuZXJhdGVkIGNvZGUgZm9yIG5vdy4gQWxsCisgICAgICAgIG5l
Y2Vzc2FyeSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBhcmUgYWxzbyBhZGRlZC4gQW5vbnltb3VzIGVu
dW1zIGFyZQorICAgICAgICBnZW5lcmF0ZWQsIGJ1dCB0aGV5IGFyZSBpbiBjb21tZW50cyB0b28s
IGJlY2F1c2Ugd2UgZGlkbid0IGhhdmUKKyAgICAgICAgc29sdXRpb24gYWJvdXQgZm9ybSB0aGUg
ZW51bXMgc2hvdWxkIGhhdmUgaW4gQysrIEFQSS4KKworICAgICAgICBJbnRlcm5hbGx5OgorICAg
ICAgICBUaGUgY2hhbmdlIHJlb3JnYW5pemVzIHR5cGUgYmluZGluZ3Mg4oCUIGEgcG9seW1vcnBo
b3VzICJjb2RlIGdlbmVyYXRvciIKKyAgICAgICAgb2JqZWN0IGlzIGZhY3RvcmVkIG91dCBmcm9t
IGJpbmRpbmcuCisgICAgICAgIEEgaGVscGVyIGNsYXNzIFdyaXRlciBpcyBhZGRlZCB0byBhbGxv
dyBnZW5lcmF0aW5nIGNvZGUgd2l0aCBhanVzdGFibGUKKyAgICAgICAgaW5kZW50YXRpb25zIGFu
ZCB0byBzdXBwb3J0IGluc2VydGlvbiBwb2ludHMgd2hlcmUgYWRkaXRpb25hbCBjb2RlIGNhbgor
ICAgICAgICBiZSBpbnNlcnRlZCByZXRyb2FjdGl2ZWx5LgorICAgICAgICBGb3J3YXJkTGlzdGVu
ZXIgY2xhc3MgaXMgdXNlZCBmb3IgcHJlcGFyaW5nIG5lY2Vzc2FyeSBmb3J3YXJkCisgICAgICAg
IGRlY2xhcmF0aW9ucy4KKyAgICAgICAgQWRIb2NUeXBlQ29udGV4dCBjb25jZXB0aW9uIGlzIGEg
c3BlY3VsYXRpdmUgYWJzdHJhY3QgY2xhc3MgdGhhdCBpcworICAgICAgICBuZWVkZWQgd2hlcmV2
ZXIgYW5vbnltb3VzIHR5cGUgY2FuIGVtZXJnZS4KKworICAgICAgICAqIGluc3BlY3Rvci9Db2Rl
R2VuZXJhdG9ySW5zcGVjdG9yLnB5OgorICAgICAgICAoZml4X3R5cGVfbmFtZS5SZXN1bHQub3V0
cHV0X2NvbW1lbnQpOgorICAgICAgICAoV3JpdGVyLl9faW5pdF9fKToKKyAgICAgICAgKFdyaXRl
ci5uZXdsaW5lKToKKyAgICAgICAgKFdyaXRlci5hcHBlbmQpOgorICAgICAgICAoV3JpdGVyLm5l
d2xpbmVfbXVsdGlsaW5lKToKKyAgICAgICAgKFdyaXRlci5hcHBlbmRfbXVsdGlsaW5lKToKKyAg
ICAgICAgKFdyaXRlci5nZXRfaW5kZW50ZWQpOgorICAgICAgICAoV3JpdGVyKToKKyAgICAgICAg
KFdyaXRlci5pbnNlcnRfd3JpdGVyKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfbmFt
ZWRfdHlwZV9kZWNsYXJhdGlvbi5IZWxwZXIud3JpdGVfZG9jKToKKyAgICAgICAgKFR5cGVCaW5k
aW5ncy5jcmVhdGVfbmFtZWRfdHlwZV9kZWNsYXJhdGlvbi5IZWxwZXIpOgorICAgICAgICAoVHlw
ZUJpbmRpbmdzLmNyZWF0ZV9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkhlbHBlci5hZGRfdG9fZm9y
d2FyZF9saXN0ZW5lcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX25hbWVkX3R5cGVf
ZGVjbGFyYXRpb24pOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9hZF9ob2NfdHlwZV9k
ZWNsYXJhdGlvbi5IZWxwZXIud3JpdGVfZG9jKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVh
dGVfYWRfaG9jX3R5cGVfZGVjbGFyYXRpb24uSGVscGVyKToKKyAgICAgICAgKFR5cGVCaW5kaW5n
cy5jcmVhdGVfYWRfaG9jX3R5cGVfZGVjbGFyYXRpb24uSGVscGVyLmFkZF90b19mb3J3YXJkX2xp
c3RlbmVyKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfYWRfaG9jX3R5cGVfZGVjbGFy
YXRpb24pOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXy5F
bnVtQmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVyYXRvci5nZW5lcmF0ZV90eXBl
X2J1aWxkZXIpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xhcmF0aW9u
Xy5FbnVtQmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVyYXRvcik6CisgICAgICAg
IChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkVudW1CaW5kaW5nLmdldF9j
b2RlX2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yLnJlZ2lzdGVyX3VzZSk6CisgICAgICAgIChUeXBl
QmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkVudW1CaW5kaW5nLmdldF9jb2RlX2dl
bmVyYXRvcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25f
LlBsYWluU3RyaW5nLmdldF9jb2RlX2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5
cGVfYnVpbGRlci5TdHJpbmcpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2Rl
Y2xhcmF0aW9uXy5QbGFpblN0cmluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVyYXRvci5n
ZW5lcmF0ZV90eXBlX2J1aWxkZXIpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBl
X2RlY2xhcmF0aW9uXy5QbGFpblN0cmluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVyYXRv
cik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLlBsYWlu
U3RyaW5nLmdldF9jb2RlX2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yLnJlZ2lzdGVyX3VzZSk6Cisg
ICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLlBsYWluU3RyaW5n
LmdldF9jb2RlX2dlbmVyYXRvcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVf
ZGVjbGFyYXRpb25fLlBsYWluU3RyaW5nLmdldF9pbl9jX3R5cGVfdGV4dC5uYW1lKToKKyAgICAg
ICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8uUGxhaW5TdHJpbmcpOgor
ICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXyk6CisgICAgICAg
IChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkNsYXNzQmluZGluZy5nZXRf
Y29kZV9nZW5lcmF0b3IpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xh
cmF0aW9uXy5DbGFzc0JpbmRpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IpOgor
ICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXy5DbGFzc0JpbmRp
bmcuZ2V0X2NvZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVy
KToKKyAgICAgICAgKEFkSG9jVHlwZUNvbnRleHRJbXBsLl9faW5pdF9fKToKKyAgICAgICAgKEFk
SG9jVHlwZUNvbnRleHRJbXBsLmdldF90eXBlX25hbWVfZml4Lk5hbWVGaXgpOgorICAgICAgICAo
QWRIb2NUeXBlQ29udGV4dEltcGwuZ2V0X3R5cGVfbmFtZV9maXguTmFtZUZpeC5vdXRwdXRfY29t
bWVudCk6CisgICAgICAgIChBZEhvY1R5cGVDb250ZXh0SW1wbC5nZXRfdHlwZV9uYW1lX2ZpeCk6
CisgICAgICAgIChBZEhvY1R5cGVDb250ZXh0SW1wbCk6CisgICAgICAgIChBZEhvY1R5cGVDb250
ZXh0SW1wbC5jYWxsX2dlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChnZW5lcmF0ZV9m
b3J3YXJkX2RlY2xhcmF0aW9uKToKKyAgICAgICAgKHJlZ2lzdGVyX3VzZSk6CisgICAgICAgIChn
ZXRfaW5fY190eXBlX3RleHQpOgorICAgICAgICAocmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAg
ICAgKFBsYWluT2JqZWN0QmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IpOgorICAgICAgICAoQ29k
ZUdlbmVyYXRvci5nZW5lcmF0ZV90eXBlX2J1aWxkZXIuQWRIb2NUeXBlQ29udGV4dC5nZXRfdHlw
ZV9uYW1lX2ZpeC5OYW1lRml4KToKKyAgICAgICAgKENvZGVHZW5lcmF0b3IuZ2VuZXJhdGVfdHlw
ZV9idWlsZGVyLkFkSG9jVHlwZUNvbnRleHQuZ2V0X3R5cGVfbmFtZV9maXguTmFtZUZpeC5vdXRw
dXRfY29tbWVudCk6CisgICAgICAgIChDb2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRl
ci5BZEhvY1R5cGVDb250ZXh0LmdldF90eXBlX25hbWVfZml4KToKKyAgICAgICAgKENvZGVHZW5l
cmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyLkFkSG9jVHlwZUNvbnRleHQpOgorICAgICAgICAo
Q29kZUdlbmVyYXRvci5nZW5lcmF0ZV90eXBlX2J1aWxkZXIuQWRIb2NUeXBlQ29udGV4dC5jYWxs
X2dlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChDb2RlR2VuZXJhdG9yLmdlbmVyYXRl
X3R5cGVfYnVpbGRlcik6CisgICAgICAgIChDb2RlR2VuZXJhdG9yKToKKyAgICAgICAgKENvZGVH
ZW5lcmF0b3IucmVnaXN0ZXJfdXNlKToKKyAgICAgICAgKFJhd1R5cGVzQmluZGluZy5nZXRfY29k
ZV9nZW5lcmF0b3IpOgorICAgICAgICAoUmF3VHlwZXNCaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4
dCk6CisgICAgICAgIChSYXdUeXBlc0JpbmRpbmcpOgorICAgICAgICAoUmF3VHlwZXNCaW5kaW5n
LnJlZHVjZV90b19yYXdfdHlwZSk6CisgICAgICAgIChUeXBlRGF0YS5fX2luaXRfXyk6CisgICAg
ICAgIChUeXBlRGF0YS5nZXRfanNvbl90eXBlKToKKyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlw
ZSk6CisgICAgICAgIChHZW5lcmF0b3IuZ28pOgorICAgICAgICAoR2VuZXJhdG9yLnByb2Nlc3Nf
ZXZlbnQuTm9PcEZvcndhcmRMaXN0ZW5lcik6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc19l
dmVudC5Ob09wRm9yd2FyZExpc3RlbmVyLmFkZF90eXBlX2RhdGEpOgorICAgICAgICAoR2VuZXJh
dG9yLnByb2Nlc3NfZXZlbnQuQWRIb2NUeXBlQ29udGV4dC5nZXRfdHlwZV9uYW1lX2ZpeC5OYW1l
Rml4KToKKyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX2V2ZW50LkFkSG9jVHlwZUNvbnRleHQu
Z2V0X3R5cGVfbmFtZV9maXguTmFtZUZpeC5vdXRwdXRfY29tbWVudCk6CisgICAgICAgIChHZW5l
cmF0b3IucHJvY2Vzc19ldmVudC5BZEhvY1R5cGVDb250ZXh0LmdldF90eXBlX25hbWVfZml4KToK
KyAgICAgICAgKEdlbmVyYXRvci5wcm9jZXNzX2V2ZW50LkFkSG9jVHlwZUNvbnRleHQpOgorICAg
ICAgICAoR2VuZXJhdG9yLnByb2Nlc3NfZXZlbnQuQWRIb2NUeXBlQ29udGV4dC5jYWxsX2dlbmVy
YXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc19ldmVudCk6Cisg
ICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc190eXBlcy5Gb3J3YXJkTGlzdGVuZXIpOgorICAgICAg
ICAoR2VuZXJhdG9yLnByb2Nlc3NfdHlwZXMuRm9yd2FyZExpc3RlbmVyLmFkZF90eXBlX2RhdGEp
OgorICAgICAgICAoR2VuZXJhdG9yLnByb2Nlc3NfdHlwZXMuZ2VuZXJhdGVfYWxsX2RvbWFpbnNf
Y29kZS5uYW1lc3BhY2VfbGF6eV9nZW5lcmF0b3IpOgorICAgICAgICAoR2VuZXJhdG9yLnByb2Nl
c3NfdHlwZXMuZ2VuZXJhdGVfYWxsX2RvbWFpbnNfY29kZSk6CisgICAgICAgIChHZW5lcmF0b3Iu
cHJvY2Vzc190eXBlcy5jYWxsX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChHZW5lcmF0b3IucHJv
Y2Vzc190eXBlcy5nZW5lcmF0ZV9mb3J3YXJkX2NhbGxiYWNrKToKKyAgICAgICAgKEdlbmVyYXRv
cik6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vzc190eXBlcyk6CisgICAgICAgIChmbGF0dGVu
X2xpc3QuZmlsbF9yZWN1cnNpdmUpOgorICAgICAgICAoZmxhdHRlbl9saXN0KToKKwogMjAxMS0x
Mi0yMCAgSWFpbiBNZXJyaWNrICA8aHVza3lAZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZW1vdmUg
dW51c2VkIHBhcmFtZXRlciBmcm9tIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6cmVidWlsZENvbXBv
c2l0aW5nTGF5ZXJUcmVlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29k
ZUdlbmVyYXRvckluc3BlY3Rvci5weSBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2Vu
ZXJhdG9ySW5zcGVjdG9yLnB5CmluZGV4IGRjZGIzMmQ1NTY0OWZhOTA1MTEzZDk5OTI0MTI0OTBk
ZTVhZjhhOTIuLjkzM2QwMDk1ZDMxZjMzYTY5NGIzMTQwMDRiNzZhZDViMzVhOWEyOWIgMTAwNzU1
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5
CkBAIC00NTUsNTUgKzQ1NSwxMzUgQEAgZGVmIGZpeF90eXBlX25hbWUoanNvbl9uYW1lKToKICAg
ICAgICAgICAgIGNsYXNzX25hbWUgPSBmaXhlZAogCiAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
Ci0gICAgICAgICAgICBkZWYgb3V0cHV0X2NvbW1lbnQob3V0cHV0KToKLSAgICAgICAgICAgICAg
ICBvdXRwdXQuYXBwZW5kKCIvLyBUeXBlIG9yaWdpbmFsbHkgd2FzIG5hbWVkICclcycuXG4iICUg
anNvbl9uYW1lKQorICAgICAgICAgICAgZGVmIG91dHB1dF9jb21tZW50KHdyaXRlcik6CisgICAg
ICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIi8vIFR5cGUgb3JpZ2luYWxseSB3YXMgbmFtZWQg
JyVzJy5cbiIgJSBqc29uX25hbWUpCiAgICAgZWxzZToKIAogICAgICAgICBjbGFzcyBSZXN1bHQo
b2JqZWN0KToKICAgICAgICAgICAgIGNsYXNzX25hbWUgPSBqc29uX25hbWUKIAogICAgICAgICAg
ICAgQHN0YXRpY21ldGhvZAotICAgICAgICAgICAgZGVmIG91dHB1dF9jb21tZW50KG91dHB1dCk6
CisgICAgICAgICAgICBkZWYgb3V0cHV0X2NvbW1lbnQod3JpdGVyKToKICAgICAgICAgICAgICAg
ICBwYXNzCiAKICAgICByZXR1cm4gUmVzdWx0CiAKIAorY2xhc3MgV3JpdGVyOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBvdXRwdXQsIGluZGVudCk6CisgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0
cHV0CisgICAgICAgIHNlbGYuaW5kZW50ID0gaW5kZW50CisKKyAgICBkZWYgbmV3bGluZShzZWxm
LCBzdHIpOgorICAgICAgICBpZiAoc2VsZi5pbmRlbnQpOgorICAgICAgICAgICAgc2VsZi5vdXRw
dXQuYXBwZW5kKHNlbGYuaW5kZW50KQorICAgICAgICBzZWxmLm91dHB1dC5hcHBlbmQoc3RyKQor
CisgICAgZGVmIGFwcGVuZChzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLm91dHB1dC5hcHBlbmQo
c3RyKQorCisgICAgZGVmIG5ld2xpbmVfbXVsdGlsaW5lKHNlbGYsIHN0cik6CisgICAgICAgIHBh
cnRzID0gc3RyLnNwbGl0KCdcbicpCisgICAgICAgIHNlbGYubmV3bGluZShwYXJ0c1swXSkKKyAg
ICAgICAgZm9yIHAgaW4gcGFydHNbMTpdOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQuYXBwZW5k
KCdcbicpCisgICAgICAgICAgICBpZiBwOgorICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZShw
KQorCisgICAgZGVmIGFwcGVuZF9tdWx0aWxpbmUoc2VsZiwgc3RyKToKKyAgICAgICAgcGFydHMg
PSBzdHIuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi5hcHBlbmQocGFydHNbMF0pCisgICAgICAg
IGZvciBwIGluIHBhcnRzWzE6XToKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LmFwcGVuZCgnXG4n
KQorICAgICAgICAgICAgaWYgcDoKKyAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmUocCkKKwor
ICAgIGRlZiBnZXRfaW5kZW50ZWQoc2VsZiwgYWRkaXRpb25hbF9pbmRlbnQpOgorICAgICAgICBy
ZXR1cm4gV3JpdGVyKHNlbGYub3V0cHV0LCBzZWxmLmluZGVudCArIGFkZGl0aW9uYWxfaW5kZW50
KQorCisgICAgZGVmIGluc2VydF93cml0ZXIoc2VsZiwgYWRkaXRpb25hbF9pbmRlbnQpOgorICAg
ICAgICBuZXdfb3V0cHV0ID0gW10KKyAgICAgICAgc2VsZi5vdXRwdXQuYXBwZW5kKG5ld19vdXRw
dXQpCisgICAgICAgIHJldHVybiBXcml0ZXIobmV3X291dHB1dCwgc2VsZi5pbmRlbnQgKyBhZGRp
dGlvbmFsX2luZGVudCkKKwogCiBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgQHN0YXRpY21ldGhv
ZAotICAgIGRlZiBjcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24oanNvbl90eXBlLCBj
b250ZXh0X2RvbWFpbl9uYW1lKToKKyAgICBkZWYgY3JlYXRlX25hbWVkX3R5cGVfZGVjbGFyYXRp
b24oanNvbl90eXBhYmxlLCBjb250ZXh0X2RvbWFpbl9uYW1lLCB0eXBlX2RhdGEpOgorICAgICAg
ICBqc29uX3R5cGUgPSB0eXBlX2RhdGEuZ2V0X2pzb25fdHlwZSgpCisKKyAgICAgICAgY2xhc3Mg
SGVscGVyOgorICAgICAgICAgICAgaXNfYWRfaG9jID0gRmFsc2UKKworICAgICAgICAgICAgQHN0
YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHdyaXRlX2RvYyh3cml0ZXIpOgorICAgICAgICAg
ICAgICAgIGlmICJkZXNjcmlwdGlvbiIgaW4ganNvbl90eXBlOgorICAgICAgICAgICAgICAgICAg
ICB3cml0ZXIubmV3bGluZSgiLyogIikKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVu
ZChqc29uX3R5cGVbImRlc2NyaXB0aW9uIl0pCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5h
cHBlbmQoIiAqL1xuIikKKworICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAg
ZGVmIGFkZF90b19mb3J3YXJkX2xpc3RlbmVyKGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAg
ICAgICAgIGZvcndhcmRfbGlzdGVuZXIuYWRkX3R5cGVfZGF0YSh0eXBlX2RhdGEpCisKKwogICAg
ICAgICBmaXhlZF90eXBlX25hbWUgPSBmaXhfdHlwZV9uYW1lKGpzb25fdHlwZVsiaWQiXSkKKyAg
ICAgICAgcmV0dXJuIFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8oanNvbl90
eXBhYmxlLCBjb250ZXh0X2RvbWFpbl9uYW1lLCBmaXhlZF90eXBlX25hbWUsIEhlbHBlcikKIAot
ICAgICAgICBkZWYgd3JpdGVfZG9jKG91dHB1dCk6Ci0gICAgICAgICAgICBpZiAiZGVzY3JpcHRp
b24iIGluIGpzb25fdHlwZToKLSAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIvKiAiKQot
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoanNvbl90eXBlWyJkZXNjcmlwdGlvbiJdKQot
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAqL1xuIikKKyAgICBAc3RhdGljbWV0aG9k
CisgICAgZGVmIGNyZWF0ZV9hZF9ob2NfdHlwZV9kZWNsYXJhdGlvbihqc29uX3R5cGFibGUsIGNv
bnRleHRfZG9tYWluX25hbWUsIGFkX2hvY190eXBlX2NvbnRleHQpOgorICAgICAgICBjbGFzcyBI
ZWxwZXI6CisgICAgICAgICAgICBpc19hZF9ob2MgPSBUcnVlCiAKLSAgICAgICAgaWYganNvbl90
eXBlWyJ0eXBlIl0gPT0gInN0cmluZyI6Ci0gICAgICAgICAgICBpZiAiZW51bSIgaW4ganNvbl90
eXBlOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHdyaXRlX2Rv
Yyh3cml0ZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgQHN0YXRpY21l
dGhvZAorICAgICAgICAgICAgZGVmIGFkZF90b19mb3J3YXJkX2xpc3RlbmVyKGZvcndhcmRfbGlz
dGVuZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZml4ZWRfdHlwZV9uYW1lID0g
YWRfaG9jX3R5cGVfY29udGV4dC5nZXRfdHlwZV9uYW1lX2ZpeCgpCisgICAgICAgIHJldHVybiBU
eXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fKGpzb25fdHlwYWJsZSwgY29udGV4
dF9kb21haW5fbmFtZSwgZml4ZWRfdHlwZV9uYW1lLCBIZWxwZXIpCisKKyAgICBAc3RhdGljbWV0
aG9kCisgICAgZGVmIGNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXyhqc29uX3R5cGFibGUsIGNvbnRl
eHRfZG9tYWluX25hbWUsIGZpeGVkX3R5cGVfbmFtZSwgaGVscGVyKToKKyAgICAgICAgaWYganNv
bl90eXBhYmxlWyJ0eXBlIl0gPT0gInN0cmluZyI6CisgICAgICAgICAgICBpZiAiZW51bSIgaW4g
anNvbl90eXBhYmxlOgogCiAgICAgICAgICAgICAgICAgY2xhc3MgRW51bUJpbmRpbmc6CiAgICAg
ICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgZGVmIGdl
bmVyYXRlX3R5cGVfYnVpbGRlcihvdXRwdXQsIGZvcndhcmRfbGlzdGVuZXIpOgotICAgICAgICAg
ICAgICAgICAgICAgICAgZW51bSA9IGpzb25fdHlwZVsiZW51bSJdCi0gICAgICAgICAgICAgICAg
ICAgICAgICB3cml0ZV9kb2Mob3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW51bV9u
YW1lID0gZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAg
IGZpeGVkX3R5cGVfbmFtZS5vdXRwdXRfY29tbWVudChvdXRwdXQpCi0gICAgICAgICAgICAgICAg
ICAgICAgICBvdXRwdXQuYXBwZW5kKCJuYW1lc3BhY2UgIikKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG91dHB1dC5hcHBlbmQoZW51bV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0
cHV0LmFwcGVuZCgiIHtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgZW51bV9pdGVt
IGluIGVudW06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9jX25hbWUgPSBlbnVt
X2l0ZW0ucmVwbGFjZSgnLScsICdfJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRw
dXQuYXBwZW5kKCJjb25zdCBjaGFyKiBjb25zdCAiKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG91dHB1dC5hcHBlbmQoQ2FwaXRhbGl6ZXIudXBwZXJfY2FtZWxfY2FzZV90b19sb3dlcihp
dGVtX2NfbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgi
ID0gXCIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoZW51bV9p
dGVtKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlwiO1xuIikK
LSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIn0gLy8gbmFtZXNwYWNlICIp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGVudW1fbmFtZSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQorICAgICAgICAgICAgICAg
ICAgICBkZWYgZ2V0X2NvZGVfZ2VuZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAj
RklYTUU6IGdlbmVyYXRlIGFkLWhvYyBlbnVtcyB0b28gb25jZSB3ZSBmaWd1cmUgb3V0IGhvdyB0
byBiZXR0ZXIgaW1wbGVtZW50IHRoZW0gaW4gQysrLgorICAgICAgICAgICAgICAgICAgICAgICAg
Y29tbWVudF9vdXQgPSBoZWxwZXIuaXNfYWRfaG9jCisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNsYXNzIENvZGVHZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBnZW5lcmF0ZV90eXBlX2J1
aWxkZXIod3JpdGVyLCBmb3J3YXJkX2xpc3RlbmVyKToKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgY29tbWVudF9vdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3cml0ZXIgPSB3cml0ZXIuZ2V0X2luZGVudGVkKCIvLyAiKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbnVtID0ganNvbl90eXBhYmxlWyJlbnVtIl0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaGVscGVyLndyaXRlX2RvYyh3cml0ZXIpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVudW1fbmFtZSA9IGZpeGVkX3R5cGVfbmFtZS5jbGFzc19u
YW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5cGVfbmFtZS5vdXRw
dXRfY29tbWVudCh3cml0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl
ci5uZXdsaW5lKCJuYW1lc3BhY2UgIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
d3JpdGVyLmFwcGVuZChlbnVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdyaXRlci5hcHBlbmQoIiB7XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
b3IgZW51bV9pdGVtIGluIGVudW06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpdGVtX2NfbmFtZSA9IGVudW1faXRlbS5yZXBsYWNlKCctJywgJ18nKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoImNvbnN0IGNoYXIqIGNvbnN0
ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKENh
cGl0YWxpemVyLnVwcGVyX2NhbWVsX2Nhc2VfdG9fbG93ZXIoaXRlbV9jX25hbWUpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiID0gXCIiKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChlbnVtX2l0ZW0p
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCJcIjtc
biIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCJ9IC8v
IG5hbWVzcGFjZSAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBw
ZW5kKGVudW1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFw
cGVuZCgiXG5cbiIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHJlZ2lzdGVyX3VzZShmb3J3YXJkX2xp
c3RlbmVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRvcgogCiAgICAgICAgICAgICAgICAg
ICAgIEBjbGFzc21ldGhvZAogICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90
ZXh0KGNscywgb3B0aW9uYWwpOgpAQCAtNTE4LDEyICs1OTgsMjQgQEAgY2xhc3MgVHlwZUJpbmRp
bmdzOgogCiAgICAgICAgICAgICAgICAgY2xhc3MgUGxhaW5TdHJpbmc6CiAgICAgICAgICAgICAg
ICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3R5
cGVfYnVpbGRlcihvdXRwdXQsIGZvcndhcmRfbGlzdGVuZXIpOgotICAgICAgICAgICAgICAgICAg
ICAgICAgd3JpdGVfZG9jKG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5
cGVfbmFtZS5vdXRwdXRfY29tbWVudChvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBv
dXRwdXQuYXBwZW5kKCJ0eXBlZGVmIFN0cmluZyAiKQotICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cHV0LmFwcGVuZChmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHB1dC5hcHBlbmQoIjtcblxuIikKKyAgICAgICAgICAgICAgICAgICAgZGVm
IGdldF9jb2RlX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGVscGVy
LmlzX2FkX2hvYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAg
ICAgICAgICAgICAgICAgICAgY2xhc3MgQ29kZUdlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVm
IGdlbmVyYXRlX3R5cGVfYnVpbGRlcih3cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIud3JpdGVfZG9jKHdyaXRlcikKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdHlwZV9uYW1lLm91dHB1dF9jb21tZW50
KHdyaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUo
InR5cGVkZWYgU3RyaW5nICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl
ci5hcHBlbmQoZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIjtcblxuIikKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYg
cmVnaXN0ZXJfdXNlKGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlR2VuZXJh
dG9yCiAKICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAgICAgICAgICAgICAg
ICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6CkBAIC01MzEsNTMgKzYyMyw1NiBAQCBjbGFz
cyBUeXBlQmluZGluZ3M6CiAKICAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAg
ICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICAjRklYTUU6IHJldHVybiBhIHR5cGVkZWYgbmFtZSBpbnN0
ZWFkLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9fcmF3X3R5
cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwgb3B0aW9uYWwpLmdldF90ZXh0
KCkKIAogICAgICAgICAgICAgICAgIHJldHVybiBQbGFpblN0cmluZwogCi0gICAgICAgIGVsaWYg
anNvbl90eXBlWyJ0eXBlIl0gPT0gIm9iamVjdCI6Ci0gICAgICAgICAgICBpZiAicHJvcGVydGll
cyIgaW4ganNvbl90eXBlOgorICAgICAgICBlbGlmIGpzb25fdHlwYWJsZVsidHlwZSJdID09ICJv
YmplY3QiOgorICAgICAgICAgICAgaWYgInByb3BlcnRpZXMiIGluIGpzb25fdHlwYWJsZToKIAog
ICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQmluZGluZzoKLSAgICAgICAgICAgICAgICAgICAg
Y2xhc3NfbmFtZV8gPSBqc29uX3R5cGVbImlkIl0KLQogICAgICAgICAgICAgICAgICAgICBAc3Rh
dGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgIGRlZiBnZW5lcmF0ZV90eXBlX2J1aWxkZXIo
b3V0cHV0LCBmb3J3YXJkX2xpc3RlbmVyKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl
X2RvYyhvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lID0gZml4ZWRf
dHlwZV9uYW1lLmNsYXNzX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3R5cGVf
bmFtZS5vdXRwdXRfY29tbWVudChvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRw
dXQuYXBwZW5kKCJjbGFzcyAiKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVu
ZChjbGFzc19uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIDog
cHVibGljIEluc3BlY3Rvck9iamVjdCB7XG4iKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0
cHV0LmFwcGVuZCgicHVibGljOlxuIikKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVy
dGllcyA9IGpzb25fdHlwZVsicHJvcGVydGllcyJdCi0gICAgICAgICAgICAgICAgICAgICAgICBt
YWluX3Byb3BlcnRpZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfcHJv
cGVydGllcyA9IFtdCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm9wZXJ0aWVz
OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJvcHRpb25hbCIgaW4gcCBhbmQgcFsi
b3B0aW9uYWwiXToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfcHJv
cGVydGllcy5hcHBlbmQocCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX3Byb3BlcnRpZXMuYXBwZW5kKHApCi0K
LSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoCisgICAgICAgICAgICAgICAg
ICAgIGRlZiBnZXRfY29kZV9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNs
YXNzIENvZGVHZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0
aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3R5cGVfYnVpbGRl
cihjbHMsIHdyaXRlciwgZm9yd2FyZF9saXN0ZW5lcik6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGhlbHBlci53cml0ZV9kb2Mod3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjbGFzc19uYW1lID0gZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdHlwZV9uYW1lLm91dHB1dF9jb21tZW50
KHdyaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUo
ImNsYXNzICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQo
Y2xhc3NfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVu
ZCgiIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7XG4iKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3cml0ZXIubmV3bGluZSgicHVibGljOlxuIikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYWRfaG9jX3R5cGVfd3JpdGVyID0gd3JpdGVyLmluc2VydF93cml0ZXIo
IiAgICAiKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBq
c29uX3R5cGFibGVbInByb3BlcnRpZXMiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtYWluX3Byb3BlcnRpZXMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBv
cHRpb25hbF9wcm9wZXJ0aWVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yIHAgaW4gcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmICJvcHRpb25hbCIgaW4gcCBhbmQgcFsib3B0aW9uYWwiXToKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9wcm9wZXJ0aWVzLmFwcGVuZChwKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYWluX3Byb3BlcnRpZXMuYXBwZW5kKHApCisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmVfbXVsdGlsaW5lKAogIiIi
ICAgIGVudW0gewogICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICIiIikKIAotICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGVfZW51bV9pdGVtcyA9IFtdCi0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiBsZW4obWFpbl9wcm9wZXJ0aWVzKSA+IDA6Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcG9zID0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIG1haW5f
cHJvcGVydGllczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9uYW1lID0g
Q2FwaXRhbGl6ZXIuY2FtZWxfY2FzZV90b19jYXBpdGFsaXplZF93aXRoX3VuZGVyc2NvcmVzKHBb
Im5hbWUiXSkgKyAiX1NFVCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVf
ZW51bV9pdGVtcy5hcHBlbmQoaXRlbV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQuYXBwZW5kKCIgICAgICAgICVzID0gMSA8PCAlcyxcbiIgJSAoaXRlbV9uYW1l
LCBwb3MpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVlID0gIigiICsgKCIgfCAi
LmpvaW4oc3RhdGVfZW51bV9pdGVtcykpICsgIikiCi0gICAgICAgICAgICAgICAgICAgICAgICBl
bHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVlID0g
IjAiCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX2VudW1faXRlbXMgPSBbXQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWFpbl9wcm9wZXJ0aWVzKSA+IDA6CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmb3IgcCBpbiBtYWluX3Byb3BlcnRpZXM6CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9uYW1lID0gQ2FwaXRhbGl6ZXIuY2FtZWxf
Y2FzZV90b19jYXBpdGFsaXplZF93aXRoX3VuZGVyc2NvcmVzKHBbIm5hbWUiXSkgKyAiX1NFVCIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9lbnVtX2l0ZW1z
LmFwcGVuZChpdGVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgd3JpdGVyLm5ld2xpbmUoIiAgICAgICAgJXMgPSAxIDw8ICVzLFxuIiAlIChpdGVtX25hbWUs
IHBvcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDEK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVl
ID0gIigiICsgKCIgfCAiLmpvaW4oc3RhdGVfZW51bV9pdGVtcykpICsgIikiCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBhbGxfZmllbGRzX3NldF92YWx1ZSA9ICIwIgorCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZSgKICIiIiAgICAgICAgQUxMX0ZJ
RUxEU19TRVQgPSAlcwogICAgIH07CiAKQEAgLTYwMCwxMSArNjk1LDE3IEBAIGNsYXNzIFR5cGVC
aW5kaW5nczoKICAgICBwdWJsaWM6CiAiIiIgJSAoYWxsX2ZpZWxkc19zZXRfdmFsdWUsIGNsYXNz
X25hbWUsIGNsYXNzX25hbWUpKQogCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAwCi0g
ICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBtYWluX3Byb3BlcnRpZXM6Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9uYW1lID0gcHJvcFsibmFtZSJdCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUgPSByZXNvbHZlX3BhcmFtX3Jhd190
eXBlKHByb3AsIGNvbnRleHRfZG9tYWluX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgb3V0cHV0LmFwcGVuZCgiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9z
ID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBtYWluX3By
b3BlcnRpZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wX25hbWUg
PSBwcm9wWyJuYW1lIl0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRf
aG9jX3R5cGVfY29udGV4dCA9IGNscy5BZEhvY1R5cGVDb250ZXh0SW1wbChwcm9wX25hbWUsIGZp
eGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lLCBhZF9ob2NfdHlwZV93cml0ZXIsIGZvcndhcmRfbGlz
dGVuZXIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVf
YmluZGluZyA9IHJlc29sdmVfcGFyYW1fdHlwZShwcm9wLCBjb250ZXh0X2RvbWFpbl9uYW1lLCBh
ZF9ob2NfdHlwZV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cGFyYW1fcmF3X3R5cGUgPSBwYXJhbV90eXBlX2JpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKCkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRlZF90eXBlID0gZ2V0
X2Fubm90YXRlZF90eXBlX3RleHQocGFyYW1fcmF3X3R5cGUuZ2V0X2NfcGFyYW1fdHlwZShQYXJh
bVR5cGUuVFlQRV9CVUlMREVSX09VVFBVVCwgRmFsc2UpLmdldF90ZXh0KCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9iaW5kaW5nLmdldF9pbl9j
X3R5cGVfdGV4dChGYWxzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3
cml0ZXIubmV3bGluZV9tdWx0aWxpbmUoIiIiCiAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCAlcz4m
IHNldCVzKCVzIHZhbHVlKQogICAgICAgICB7CiAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgJXMpLCBwcm9wZXJ0eV8lc19hbHJlYWR5X3NldCk7CkBAIC02MTIsMTUgKzcxMywx
OSBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPCVz
PigpOwogICAgICAgICB9CiAiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzdGF0
ZV9lbnVtX2l0ZW1zW3Bvc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwaXRh
bGl6ZXIubG93ZXJfY2FtZWxfY2FzZV90b191cHBlcihwcm9wX25hbWUpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcmFtX3Jhd190eXBlLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1U
eXBlLlRZUEVfQlVJTERFUl9PVVRQVVQsIEZhbHNlKS5nZXRfdGV4dCgpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0YXRlX2VudW1faXRlbXNbcG9zXSwgcHJvcF9uYW1lLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3Jhd190eXBlLmdldF9zZXR0ZXJfbmFt
ZSgpLCBwcm9wX25hbWUsIHN0YXRlX2VudW1faXRlbXNbcG9zXSkpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAlIChzdGF0ZV9lbnVtX2l0ZW1zW3Bvc10sCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBpdGFsaXplci5sb3dlcl9jYW1lbF9jYXNl
X3RvX3VwcGVyKHByb3BfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBhbm5vdGF0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRlX2VudW1faXRlbXNbcG9zXSwgcHJvcF9uYW1lLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUuZ2V0X3NldHRlcl9uYW1lKCksIHBy
b3BfbmFtZSwgc3RhdGVfZW51bV9pdGVtc1twb3NdKSkKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcG9zICs9IDEKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBv
cyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRv
ciA9IHBhcmFtX3R5cGVfYmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3IoKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZV9nZW5lcmF0b3I6CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9nZW5lcmF0b3IucmVnaXN0ZXJfdXNlKGZv
cndhcmRfbGlzdGVuZXIpCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQo
IiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRp
bGluZSgiIiIKICAgICAgICAgb3BlcmF0b3IgUmVmUHRyPCVzPiYgKCkKICAgICAgICAgewogICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwpAQCAtNjM0LDUyICs3MzksOTIgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgog
ICAgIH07CiAKICIiIgotICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2xhc3NfbmFtZSwgY2xh
c3NfbmFtZSwgY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICUgKGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25h
bWUpKQogCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIgICAgLypcbiIp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIgICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOlxuIikKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQo
IiAgICAgKiBSZWZQdHI8JXM+IHJlc3VsdCA9ICVzOjpjcmVhdGUoKSIgJSAoY2xhc3NfbmFtZSwg
Y2xhc3NfbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBtYWluX3By
b3BlcnRpZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiXG4g
ICAgICogICAgIC5zZXQlcyguLi4pIiAlIENhcGl0YWxpemVyLmxvd2VyX2NhbWVsX2Nhc2VfdG9f
dXBwZXIocHJvcFsibmFtZSJdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBl
bmQoIjtcbiAgICAgKi9cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl
ci5uZXdsaW5lKCIgICAgLypcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdy
aXRlci5uZXdsaW5lKCIgICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOlxuIikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICAgKiBSZWZQdHI8JXM+
IHJlc3VsdCA9ICVzOjpjcmVhdGUoKSIgJSAoY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcm9wIGluIG1haW5fcHJvcGVydGllczoK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmRfbXVsdGls
aW5lKCJcbiAgICAgKiAgICAgLnNldCVzKC4uLikiICUgQ2FwaXRhbGl6ZXIubG93ZXJfY2FtZWxf
Y2FzZV90b191cHBlcihwcm9wWyJuYW1lIl0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3cml0ZXIuYXBwZW5kX211bHRpbGluZSgiO1xuICAgICAqL1xuIikKIAotICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd3JpdGVyLm5ld2xpbmVfbXVsdGlsaW5lKAogIiIiICAgIHN0YXRpYyBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19G
SUVMRFNfU0VUPihhZG9wdFJlZihuZXcgJXMoKSkpOwogICAgIH0KICIiIiAlIGNsYXNzX25hbWUp
CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcm9wIGluIG9wdGlvbmFsX3Byb3BlcnRp
ZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUgPSByZXNvbHZl
X3BhcmFtX3Jhd190eXBlKHByb3AsIGNvbnRleHRfZG9tYWluX25hbWUpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc2V0dGVyX25hbWUgPSAic2V0JXMiICUgQ2FwaXRhbGl6ZXIubG93ZXJf
Y2FtZWxfY2FzZV90b191cHBlcihwcm9wWyJuYW1lIl0pCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0cHV0LmFwcGVuZCgiXG4gICAgdm9pZCAlcyIgJSBzZXR0ZXJfbmFtZSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIoJXMgdmFsdWUpXG4iICUgcGFy
YW1fcmF3X3R5cGUuZ2V0X2NfcGFyYW1fdHlwZShQYXJhbVR5cGUuVFlQRV9CVUlMREVSX09VVFBV
VCwgRmFsc2UpLmdldF90ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0
LmFwcGVuZCgiICAgIHtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFw
cGVuZCgiICAgICAgICB0aGlzLT5zZXQlcyhcIiVzXCIsIHZhbHVlKTtcbiIgJSAocGFyYW1fcmF3
X3R5cGUuZ2V0X3NldHRlcl9uYW1lKCksIHByb3BbIm5hbWUiXSkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiICAgIH1cbiIpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZvciBwcm9wIGluIG9wdGlvbmFsX3Byb3BlcnRpZXM6CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wX25hbWUgPSBwcm9wWyJuYW1lIl0KKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkX2hvY190eXBlX2NvbnRleHQgPSBjbHMu
QWRIb2NUeXBlQ29udGV4dEltcGwocHJvcF9uYW1lLCBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFt
ZSwgYWRfaG9jX3R5cGVfd3JpdGVyLCBmb3J3YXJkX2xpc3RlbmVyKQorCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcgPSByZXNvbHZlX3BhcmFt
X3R5cGUocHJvcCwgY29udGV4dF9kb21haW5fbmFtZSwgYWRfaG9jX3R5cGVfY29udGV4dCkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcl9uYW1lID0gInNldCVzIiAl
IENhcGl0YWxpemVyLmxvd2VyX2NhbWVsX2Nhc2VfdG9fdXBwZXIocHJvcF9uYW1lKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZF9tdWx0aWxpbmUoIlxu
ICAgIHZvaWQgJXMiICUgc2V0dGVyX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBhbm5vdGF0ZWRfdHlwZSA9IGdldF9hbm5vdGF0ZWRfdHlwZV90ZXh0KHBhcmFtX3R5
cGVfYmluZGluZy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlw
ZS5UWVBFX0JVSUxERVJfT1VUUFVULCBGYWxzZSkuZ2V0X3RleHQoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcuZ2V0X2luX2NfdHlw
ZV90ZXh0KEZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl
ci5hcHBlbmQoIiglcyB2YWx1ZSlcbiIgJSBhbm5vdGF0ZWRfdHlwZSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAge1xuIikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgICAgIHRoaXMt
PnNldCVzKFwiJXNcIiwgdmFsdWUpO1xuIiAlIChwYXJhbV90eXBlX2JpbmRpbmcucmVkdWNlX3Rv
X3Jhd190eXBlKCkuZ2V0X3NldHRlcl9uYW1lKCksIHByb3BbIm5hbWUiXSkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgIH1cbiIpCisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yID0gcGFyYW1f
dHlwZV9iaW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiBjb2RlX2dlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRvci5yZWdpc3Rlcl91c2UoZm9yd2FyZF9saXN0
ZW5lcikKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNldHRlcl9uYW1lIGluIElO
U1BFQ1RPUl9PQkpFQ1RfU0VUVEVSX05BTUVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQuYXBwZW5kKCIgICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjolcztcblxuIiAl
IHNldHRlcl9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2V0
dGVyX25hbWUgaW4gSU5TUEVDVE9SX09CSkVDVF9TRVRURVJfTkFNRVM6CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICB1c2luZyBJbnNw
ZWN0b3JPYmplY3Q6OiVzO1xuXG4iICUgc2V0dGVyX25hbWUpCiAKLSAgICAgICAgICAgICAgICAg
ICAgICAgIG91dHB1dC5hcHBlbmQoIn07XG5cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHdyaXRlci5uZXdsaW5lKCJ9O1xuXG4iKQorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2xhc3MgQWRIb2NUeXBlQ29udGV4dEltcGw6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9wZXJ0eV9uYW1lLCBjbGFzc19uYW1lLCB3
cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2VsZi5wcm9wZXJ0eV9uYW1lID0gcHJvcGVydHlfbmFtZQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGFzc19uYW1lID0gY2xhc3NfbmFtZQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZXIgPSB3cml0ZXIKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZF9saXN0ZW5lciA9IGZv
cndhcmRfbGlzdGVuZXIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0
X3R5cGVfbmFtZV9maXgoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjbGFzcyBOYW1lRml4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNsYXNzX25hbWUgPSBDYXBpdGFsaXplci5sb3dlcl9jYW1lbF9jYXNlX3RvX3VwcGVyKHNlbGYu
cHJvcGVydHlfbmFtZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
ZWYgb3V0cHV0X2NvbW1lbnQod3JpdGVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIi8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5h
bWUgJyVzJyB3aGlsZSBnZW5lcmF0aW5nICVzLlxuIiAlIChzZWxmLnByb3BlcnR5X25hbWUsIHNl
bGYuY2xhc3NfbmFtZSkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBOYW1lRml4CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGNhbGxf
Z2VuZXJhdGVfdHlwZV9idWlsZGVyKHNlbGYsIGNvZGVfZ2VuZXJhdG9yKToKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVp
bGRlcihzZWxmLndyaXRlciwgc2VsZi5mb3J3YXJkX2xpc3RlbmVyKQorCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlZiBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHdyaXRlcik6CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUgPSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFt
ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiY2xhc3Mg
IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChjbGFzc19u
YW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI7XG4i
KQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRlZiByZWdpc3Rlcl91c2UoZm9yd2FyZF9saXN0ZW5lcik6Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci5hZGRfdG9fZm9yd2FyZF9saXN0
ZW5lcihmb3J3YXJkX2xpc3RlbmVyKQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
Q29kZUdlbmVyYXRvcgogCiAgICAgICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAogICAgICAg
ICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywgb3B0aW9uYWwpOgotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjoiICsg
Y29udGV4dF9kb21haW5fbmFtZSArICI6OiIgKyBjbHMuY2xhc3NfbmFtZV8gKyAiPiIKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6IiArIGNv
bnRleHRfZG9tYWluX25hbWUgKyAiOjoiICsgZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUgKyAi
PiIKIAogICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgICAgICAgICAg
ICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5cGUoKToKICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBSYXdUeXBlcy5PYmplY3QKIAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFw
cGVuZCgifTtcblxuIikKICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3NCaW5kaW5nCiAgICAg
ICAgICAgICBlbHNlOgogCiAgICAgICAgICAgICAgICAgY2xhc3MgUGxhaW5PYmplY3RCaW5kaW5n
OgogICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAg
IGRlZiBnZW5lcmF0ZV90eXBlX2J1aWxkZXIob3V0cHV0LCBmb3J3YXJkX2xpc3RlbmVyKToKLSAg
ICAgICAgICAgICAgICAgICAgICAgICMgTm8tb3AKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdl
dF9jb2RlX2dlbmVyYXRvcigpOgogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogCiAgICAg
ICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZApAQCAtNjkxLDI0ICs4MzYsNTcgQEAgY2xhc3Mg
VHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhd1R5cGVzLk9i
amVjdAogCiAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYWluT2JqZWN0QmluZGluZworICAgICAg
ICBlbGlmIGpzb25fdHlwYWJsZVsidHlwZSJdID09ICJhcnJheSI6CisgICAgICAgICAgICBpZiAi
aXRlbXMiIGluIGpzb25fdHlwYWJsZToKKworICAgICAgICAgICAgICAgIGNsYXNzIENvZGVHZW5l
cmF0b3I6CisgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAg
ICAgICAgZGVmIGdlbmVyYXRlX3R5cGVfYnVpbGRlcih3cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIp
OgorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBBZEhvY1R5cGVDb250ZXh0OgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkZWYgZ2V0X3R5cGVfbmFtZV9maXgoKToKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2xhc3MgTmFtZUZpeDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNsYXNzX25hbWUgPSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSArICJJdGVtIgor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgb3V0cHV0X2NvbW1lbnQod3JpdGVy
KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90eXBlX25h
bWUub3V0cHV0X2NvbW1lbnQod3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIvLyBOYW1lZCBhcyBhbiBpdGVtIG9mIGFycmF5Llxu
IikKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZUZpeAorCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRlZiBjYWxsX2dlbmVyYXRlX3R5cGVfYnVpbGRlcihjb2RlX2dlbmVyYXRv
cik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yLmdlbmVy
YXRlX3R5cGVfYnVpbGRlcih3cml0ZXIsIGZvcndhcmRfbGlzdGVuZXIpCisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3R5cGFibGVbIml0ZW1zIl0sIGNv
bnRleHRfZG9tYWluX25hbWUsIEFkSG9jVHlwZUNvbnRleHQpCisKKyAgICAgICAgICAgICAgICAg
ICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVnaXN0ZXJfdXNlKGZv
cndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAg
ICAgICAgICAgZGVmYXVsdF9iaW5kaW5nX2NvZGVfZ2VuZXJhdG9yID0gQ29kZUdlbmVyYXRvcgor
CiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYXdfdHlwZSA9IFJhd1R5cGVzLmdldChqc29u
X3R5cGVbInR5cGUiXSkKKyAgICAgICAgICAgIGRlZmF1bHRfYmluZGluZ19jb2RlX2dlbmVyYXRv
ciA9IE5vbmUKIAotICAgICAgICAgICAgY2xhc3MgUmF3VHlwZXNCaW5kaW5nOgotICAgICAgICAg
ICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9i
dWlsZGVyKG91dHB1dCwgZm9yd2FyZF9saXN0ZW5lcik6Ci0gICAgICAgICAgICAgICAgICAgICMg
Tm8tb3AKLSAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByYXdfdHlwZSA9IFJhd1R5
cGVzLmdldChqc29uX3R5cGFibGVbInR5cGUiXSkKIAotICAgICAgICAgICAgICAgIEBjbGFzc21l
dGhvZAotICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25h
bCk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMucmVkdWNlX3RvX3Jhd190eXBlKCku
Z2V0X2NfcGFyYW1fdHlwZShQYXJhbVR5cGUuRVZFTlQsIG9wdGlvbmFsKS5nZXRfdGV4dCgpCisg
ICAgICAgIGNsYXNzIFJhd1R5cGVzQmluZGluZzoKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QK
KyAgICAgICAgICAgIGRlZiBnZXRfY29kZV9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZGVmYXVsdF9iaW5kaW5nX2NvZGVfZ2VuZXJhdG9yCiAKLSAgICAgICAgICAgICAgICBA
c3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmF3X3R5cGUKKyAgICAgICAgICAgIEBjbGFzc21l
dGhvZAorICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToK
KyAgICAgICAgICAgICAgICByZXR1cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3Bh
cmFtX3R5cGUoUGFyYW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQogCi0gICAgICAg
ICAgICByZXR1cm4gUmF3VHlwZXNCaW5kaW5nCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisg
ICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6CisgICAgICAgICAgICAgICAgcmV0
dXJuIHJhd190eXBlCisKKyAgICAgICAgcmV0dXJuIFJhd1R5cGVzQmluZGluZwogCiAKIGNsYXNz
IFR5cGVEYXRhKG9iamVjdCk6CkBAIC03MjMsNyArOTAxLDcgQEAgY2xhc3MgVHlwZURhdGEob2Jq
ZWN0KToKICAgICAgICAganNvbl90eXBlX25hbWUgPSBqc29uX3R5cGVbInR5cGUiXQogICAgICAg
ICByYXdfdHlwZSA9IFJhd1R5cGVzLmdldChqc29uX3R5cGVfbmFtZSkKICAgICAgICAgc2VsZi5y
YXdfdHlwZV8gPSByYXdfdHlwZQotICAgICAgICBzZWxmLmJpbmRpbmdfID0gVHlwZUJpbmRpbmdz
LmNyZWF0ZV9mb3JfbmFtZWRfdHlwZV9kZWNsYXJhdGlvbihqc29uX3R5cGUsIGpzb25fZG9tYWlu
WyJkb21haW4iXSkKKyAgICAgICAgc2VsZi5iaW5kaW5nXyA9IFR5cGVCaW5kaW5ncy5jcmVhdGVf
bmFtZWRfdHlwZV9kZWNsYXJhdGlvbihqc29uX3R5cGUsIGpzb25fZG9tYWluWyJkb21haW4iXSwg
c2VsZikKIAogICAgIGRlZiBnZXRfcmF3X3R5cGUoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxm
LnJhd190eXBlXwpAQCAtNzMxLDYgKzkwOSw5IEBAIGNsYXNzIFR5cGVEYXRhKG9iamVjdCk6CiAg
ICAgZGVmIGdldF9iaW5kaW5nKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5iaW5kaW5nXwog
CisgICAgZGVmIGdldF9qc29uX3R5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmpzb25f
dHlwZV8KKwogCiBjbGFzcyBEb21haW5EYXRhOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBqc29u
X2RvbWFpbik6CkBAIC03NzQsMjUgKzk1NSwxNyBAQCBjbGFzcyBUeXBlTWFwOgogICAgICAgICBy
ZXR1cm4gc2VsZi5tYXBfW2RvbWFpbl9uYW1lXVt0eXBlX25hbWVdCiAKIAotZGVmIHJlc29sdmVf
cGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUpOgorZGVmIHJlc29s
dmVfcGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUsIGFkX2hvY190
eXBlX2NvbnRleHQpOgogICAgIGlmICIkcmVmIiBpbiBqc29uX3BhcmFtZXRlcjoKICAgICAgICAg
anNvbl9yZWYgPSBqc29uX3BhcmFtZXRlclsiJHJlZiJdCiAgICAgICAgIHR5cGVfZGF0YSA9IGdl
dF9yZWZfZGF0YShqc29uX3JlZiwgc2NvcGVfZG9tYWluX25hbWUpCiAgICAgICAgIHJldHVybiB0
eXBlX2RhdGEuZ2V0X2JpbmRpbmcoKQogICAgIGVsaWYgInR5cGUiIGluIGpzb25fcGFyYW1ldGVy
OgotICAgICAgICBqc29uX3R5cGUgPSBqc29uX3BhcmFtZXRlclsidHlwZSJdCi0gICAgICAgIHJh
d190eXBlID0gUmF3VHlwZXMuZ2V0KGpzb25fdHlwZSkKLQotICAgICAgICBjbGFzcyBSYXdUeXBl
QmluZGluZzoKLSAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgIGRlZiByZWR1
Y2VfdG9fcmF3X3R5cGUoKToKLSAgICAgICAgICAgICAgICByZXR1cm4gcmF3X3R5cGUKLQotICAg
ICAgICAgICAgQHN0YXRpY21ldGhvZAotICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4
dChvcHRpb25hbCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJhd190eXBlLmdldF9jX3BhcmFt
X3R5cGUoUGFyYW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQotCi0gICAgICAgIHJl
dHVybiBSYXdUeXBlQmluZGluZworICAgICAgICByZXN1bHQgPSBUeXBlQmluZGluZ3MuY3JlYXRl
X2FkX2hvY190eXBlX2RlY2xhcmF0aW9uKGpzb25fcGFyYW1ldGVyLCBzY29wZV9kb21haW5fbmFt
ZSwgYWRfaG9jX3R5cGVfY29udGV4dCkKKyAgICAgICAgY29kZV9nZW5lcmF0b3IgPSByZXN1bHQu
Z2V0X2NvZGVfZ2VuZXJhdG9yKCkKKyAgICAgICAgaWYgY29kZV9nZW5lcmF0b3I6CisgICAgICAg
ICAgICBhZF9ob2NfdHlwZV9jb250ZXh0LmNhbGxfZ2VuZXJhdGVfdHlwZV9idWlsZGVyKGNvZGVf
Z2VuZXJhdG9yKQorICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgZWxzZToKICAgICAgICAgcmFp
c2UgRXhjZXB0aW9uKCJVbmtub3duIHR5cGUiKQogCkBAIC05MTMsNiArMTA4Niw3IEBAIHR5cGVk
ZWYgU3RyaW5nIEVycm9yU3RyaW5nOwogI2lmIEVOQUJMRShJTlNQRUNUT1IpCiAKIG5hbWVzcGFj
ZSBUeXBlQnVpbGRlciB7Ciske2ZvcndhcmRzfQogJHt0eXBlQnVpbGRlcnN9CiB9IC8vIG5hbWVz
cGFjZSBUeXBlQnVpbGRlcgogCkBAIC0xNDAxLDYgKzE1NzUsNyBAQCBjbGFzcyBHZW5lcmF0b3I6
CiAgICAgYmFja2VuZF9pbmNsdWRlX2xpc3QgPSBbXQogICAgIGZyb250ZW5kX2NvbnN0cnVjdG9y
X2luaXRfbGlzdCA9IFtdCiAgICAgdHlwZV9idWlsZGVyX2ZyYWdtZW50cyA9IFtdCisgICAgdHlw
ZV9idWlsZGVyX2ZvcndhcmRzID0gW10KIAogICAgIEBzdGF0aWNtZXRob2QKICAgICBkZWYgZ28o
KToKQEAgLTE0NDcsNyArMTYyMiw3IEBAIGNsYXNzIEdlbmVyYXRvcjoKICAgICAgICAgICAgIEdl
bmVyYXRvci5mcm9udGVuZF9kb21haW5fY2xhc3NfbGluZXMuYXBwZW5kKFRlbXBsYXRlcy5mcm9u
dGVuZF9kb21haW5fY2xhc3Muc3Vic3RpdHV0ZShOb25lLAogICAgICAgICAgICAgICAgIGRvbWFp
bkNsYXNzTmFtZT1kb21haW5fbmFtZSwKICAgICAgICAgICAgICAgICBkb21haW5GaWVsZE5hbWU9
ZG9tYWluX25hbWVfbG93ZXIsCi0gICAgICAgICAgICAgICAgZnJvbnRlbmREb21haW5NZXRob2RE
ZWNsYXJhdGlvbnM9am9pbihmcm9udGVuZF9tZXRob2RfZGVjbGFyYXRpb25fbGluZXMsICIiKSkp
CisgICAgICAgICAgICAgICAgZnJvbnRlbmREb21haW5NZXRob2REZWNsYXJhdGlvbnM9am9pbihm
bGF0dGVuX2xpc3QoZnJvbnRlbmRfbWV0aG9kX2RlY2xhcmF0aW9uX2xpbmVzKSwgIiIpKSkKIAog
ICAgICAgICAgICAgaWYgImNvbW1hbmRzIiBpbiBqc29uX2RvbWFpbjoKICAgICAgICAgICAgICAg
ICBmb3IganNvbl9jb21tYW5kIGluIGpzb25fZG9tYWluWyJjb21tYW5kcyJdOgpAQCAtMTQ5Miwx
MCArMTY2NywxOCBAQCBjbGFzcyBHZW5lcmF0b3I6CiAKICAgICBAc3RhdGljbWV0aG9kCiAgICAg
ZGVmIHByb2Nlc3NfZXZlbnQoanNvbl9ldmVudCwgZG9tYWluX25hbWUsIGZyb250ZW5kX21ldGhv
ZF9kZWNsYXJhdGlvbl9saW5lcyk6CisgICAgICAgIGNsYXNzIE5vT3BGb3J3YXJkTGlzdGVuZXI6
CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgYWRkX3R5cGVfZGF0
YSh0eXBlX2RhdGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKwogICAgICAgICBldmVudF9uYW1l
ID0ganNvbl9ldmVudFsibmFtZSJdCiAgICAgICAgIHBhcmFtZXRlcl9saXN0ID0gW10KICAgICAg
ICAgbWV0aG9kX2xpbmVfbGlzdCA9IFtdCiAgICAgICAgIGJhY2tlbmRfanNfZXZlbnRfcGFyYW1f
bGlzdCA9IFtdCisgICAgICAgIGFkX2hvY190eXBlX291dHB1dCA9IFtdCisgICAgICAgIGZyb250
ZW5kX21ldGhvZF9kZWNsYXJhdGlvbl9saW5lcy5hcHBlbmQoYWRfaG9jX3R5cGVfb3V0cHV0KQor
ICAgICAgICBhZF9ob2NfdHlwZV93cml0ZXIgPSBXcml0ZXIoYWRfaG9jX3R5cGVfb3V0cHV0LCAi
ICAgICIpCiAgICAgICAgIGlmICJwYXJhbWV0ZXJzIiBpbiBqc29uX2V2ZW50OgogICAgICAgICAg
ICAgbWV0aG9kX2xpbmVfbGlzdC5hcHBlbmQoIiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpO1xuIikKICAgICAgICAgICAg
IGZvciBqc29uX3BhcmFtZXRlciBpbiBqc29uX2V2ZW50WyJwYXJhbWV0ZXJzIl06CkBAIC0xNTEy
LDcgKzE2OTUsMjMgQEAgY2xhc3MgR2VuZXJhdG9yOgogCiAgICAgICAgICAgICAgICAgb3B0aW9u
YWwgPSBvcHRpb25hbF9tYXNrIGFuZCBqc29uX29wdGlvbmFsCiAKLSAgICAgICAgICAgICAgICBw
YXJhbV90eXBlX2JpbmRpbmcgPSByZXNvbHZlX3BhcmFtX3R5cGUoanNvbl9wYXJhbWV0ZXIsIGRv
bWFpbl9uYW1lKQorICAgICAgICAgICAgICAgIGNsYXNzIEFkSG9jVHlwZUNvbnRleHQ6CisgICAg
ICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdl
dF90eXBlX25hbWVfZml4KCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBOYW1lRml4
OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUgPSBDYXBpdGFsaXplci5s
b3dlcl9jYW1lbF9jYXNlX3RvX3VwcGVyKHBhcmFtZXRlcl9uYW1lKQorCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlZiBvdXRwdXRfY29tbWVudCh3cml0ZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3cml0ZXIubmV3bGluZSgiLy8gTmFtZWQgYWZ0ZXIgcGFyYW1ldGVyIG5hbWUgJyVzJyB3
aGlsZSBnZW5lcmF0aW5nIGV2ZW50ICVzLlxuIiAlIChwYXJhbWV0ZXJfbmFtZSwgZXZlbnRfbmFt
ZSkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYW1lRml4CisKKyAgICAgICAg
ICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgY2FsbF9n
ZW5lcmF0ZV90eXBlX2J1aWxkZXIoY29kZV9nZW5lcmF0b3IpOgorICAgICAgICAgICAgICAgICAg
ICAgICAgY29kZV9nZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKGFkX2hvY190eXBlX3dy
aXRlciwgTm9PcEZvcndhcmRMaXN0ZW5lcikKKworICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVf
YmluZGluZyA9IHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgZG9tYWluX25hbWUs
IEFkSG9jVHlwZUNvbnRleHQpCiAKICAgICAgICAgICAgICAgICBhbm5vdGF0ZWRfdHlwZSA9IGdl
dF9hbm5vdGF0ZWRfdHlwZV90ZXh0KGNfdHlwZS5nZXRfdGV4dCgpLCBwYXJhbV90eXBlX2JpbmRp
bmcuZ2V0X2luX2NfdHlwZV90ZXh0KGpzb25fb3B0aW9uYWwpKQogCkBAIC0xNjMzLDI4ICsxODMy
LDc5IEBAIGNsYXNzIEdlbmVyYXRvcjoKICAgICAgICAgb3V0cHV0ID0gR2VuZXJhdG9yLnR5cGVf
YnVpbGRlcl9mcmFnbWVudHMKIAogICAgICAgICBjbGFzcyBGb3J3YXJkTGlzdGVuZXI6Ci0gICAg
ICAgICAgICBwYXNzCi0KLSAgICAgICAgZm9yIGRvbWFpbl9kYXRhIGluIHR5cGVfbWFwLmRvbWFp
bnMoKToKLQotICAgICAgICAgICAgZG9tYWluX2ZpeGVzID0gRG9tYWluTmFtZUZpeGVzLmdldF9m
aXhlZF9kYXRhKGRvbWFpbl9kYXRhLm5hbWUoKSkKLSAgICAgICAgICAgIGRvbWFpbl9ndWFyZCA9
IGRvbWFpbl9maXhlcy5nZXRfZ3VhcmQoKQotCi0gICAgICAgICAgICBpZiBkb21haW5fZ3VhcmQ6
Ci0gICAgICAgICAgICAgICAgZG9tYWluX2d1YXJkLmdlbmVyYXRlX29wZW4ob3V0cHV0KQotCi0g
ICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJuYW1lc3BhY2UgIikKLSAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoZG9tYWluX2RhdGEubmFtZSgpKQotICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgi
IHtcbiIpCi0gICAgICAgICAgICBmb3IgdHlwZV9kYXRhIGluIGRvbWFpbl9kYXRhLnR5cGVzKCk6
Ci0gICAgICAgICAgICAgICAgdHlwZV9kYXRhLmdldF9iaW5kaW5nKCkuZ2VuZXJhdGVfdHlwZV9i
dWlsZGVyKG91dHB1dCwgRm9yd2FyZExpc3RlbmVyKQotCi0gICAgICAgICAgICBvdXRwdXQuYXBw
ZW5kKCJ9IC8vICIpCi0gICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGRvbWFpbl9kYXRhLm5hbWUo
KSkKLSAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQorICAgICAgICAgICAgdHlwZV9k
YXRhX3NldCA9IHNldCgpCisgICAgICAgICAgICBhbHJlYWR5X2RlY2xhcmVkX3NldCA9IHNldCgp
CisKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIGFkZF90eXBlX2Rh
dGEoY2xzLCB0eXBlX2RhdGEpOgorICAgICAgICAgICAgICAgIGlmIHR5cGVfZGF0YSBub3QgaW4g
Y2xzLmFscmVhZHlfZGVjbGFyZWRfc2V0OgorICAgICAgICAgICAgICAgICAgICBjbHMudHlwZV9k
YXRhX3NldC5hZGQodHlwZV9kYXRhKQorCisgICAgICAgIGRlZiBnZW5lcmF0ZV9hbGxfZG9tYWlu
c19jb2RlKG91dCwgdHlwZV9kYXRhX2NhbGxiYWNrKToKKyAgICAgICAgICAgIHdyaXRlciA9IFdy
aXRlcihvdXQsICIiKQorICAgICAgICAgICAgZm9yIGRvbWFpbl9kYXRhIGluIHR5cGVfbWFwLmRv
bWFpbnMoKToKKyAgICAgICAgICAgICAgICBkb21haW5fZml4ZXMgPSBEb21haW5OYW1lRml4ZXMu
Z2V0X2ZpeGVkX2RhdGEoZG9tYWluX2RhdGEubmFtZSgpKQorICAgICAgICAgICAgICAgIGRvbWFp
bl9ndWFyZCA9IGRvbWFpbl9maXhlcy5nZXRfZ3VhcmQoKQorCisgICAgICAgICAgICAgICAgbmFt
ZXNwYWNlX2RlY2xhcmVkID0gW10KKworICAgICAgICAgICAgICAgIGRlZiBuYW1lc3BhY2VfbGF6
eV9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5hbWVzcGFjZV9kZWNs
YXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRvbWFpbl9ndWFyZDoKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBkb21haW5fZ3VhcmQuZ2VuZXJhdGVfb3BlbihvdXQpCisgICAg
ICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgibmFtZXNwYWNlICIpCisgICAgICAg
ICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGRvbWFpbl9kYXRhLm5hbWUoKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiB7XG4iKQorICAgICAgICAgICAgICAg
ICAgICAgICAgIyBXaGF0IGlzIGEgYmV0dGVyIHdheSB0byBjaGFuZ2UgdmFsdWUgZnJvbSBvdXRl
ciBzY29wZT8KKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZV9kZWNsYXJlZC5hcHBl
bmQoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlcgorCisgICAgICAgICAg
ICAgICAgZm9yIHR5cGVfZGF0YSBpbiBkb21haW5fZGF0YS50eXBlcygpOgorICAgICAgICAgICAg
ICAgICAgICB0eXBlX2RhdGFfY2FsbGJhY2sodHlwZV9kYXRhLCBuYW1lc3BhY2VfbGF6eV9nZW5l
cmF0b3IpCisKKyAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2VfZGVjbGFyZWQ6CisgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIn0gLy8gIikKKyAgICAgICAgICAgICAgICAgICAg
d3JpdGVyLmFwcGVuZChkb21haW5fZGF0YS5uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIHdy
aXRlci5hcHBlbmQoIlxuXG4iKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGRvbWFpbl9ndWFy
ZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbl9ndWFyZC5nZW5lcmF0ZV9jbG9zZShv
dXQpCisKKyAgICAgICAgZGVmIGNhbGxfdHlwZV9idWlsZGVyKHR5cGVfZGF0YSwgd3JpdGVyX2dl
dHRlcik6CisgICAgICAgICAgICAjIERvIG5vdCBnZW5lcmF0ZSBmb3J3YXJkcyBmb3IgdGhpcyB0
eXBlIGFueSBsb25nZXIuCisgICAgICAgICAgICBGb3J3YXJkTGlzdGVuZXIuYWxyZWFkeV9kZWNs
YXJlZF9zZXQuYWRkKHR5cGVfZGF0YSkKKworICAgICAgICAgICAgY29kZV9nZW5lcmF0b3IgPSB0
eXBlX2RhdGEuZ2V0X2JpbmRpbmcoKS5nZXRfY29kZV9nZW5lcmF0b3IoKQorICAgICAgICAgICAg
IyBDYWxsIGxhenkgZ2V0dGVyIGV2ZW4gaWYgd2UgZG9uJ3QgZ2VuZXJhdCBhbnl0aGluZy4KKyAg
ICAgICAgICAgIHdyaXRlciA9IHdyaXRlcl9nZXR0ZXIoKQorICAgICAgICAgICAgaWYgY29kZV9n
ZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgY29kZV9nZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9i
dWlsZGVyKHdyaXRlciwgRm9yd2FyZExpc3RlbmVyKQorCisgICAgICAgIGdlbmVyYXRlX2FsbF9k
b21haW5zX2NvZGUob3V0cHV0LCBjYWxsX3R5cGVfYnVpbGRlcikKKworICAgICAgICBHZW5lcmF0
b3IudHlwZV9idWlsZGVyX2ZvcndhcmRzLmFwcGVuZCgiLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMu
XG4iKQorCisgICAgICAgIGRlZiBnZW5lcmF0ZV9mb3J3YXJkX2NhbGxiYWNrKHR5cGVfZGF0YSwg
d3JpdGVyX2dldHRlcik6CisgICAgICAgICAgICBpZiB0eXBlX2RhdGEgaW4gRm9yd2FyZExpc3Rl
bmVyLnR5cGVfZGF0YV9zZXQ6CisgICAgICAgICAgICAgICAgYmluZGluZyA9IHR5cGVfZGF0YS5n
ZXRfYmluZGluZygpCisgICAgICAgICAgICAgICAgYmluZGluZy5nZXRfY29kZV9nZW5lcmF0b3Io
KS5nZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHdyaXRlcl9nZXR0ZXIoKSkKKyAgICAgICAg
Z2VuZXJhdGVfYWxsX2RvbWFpbnNfY29kZShHZW5lcmF0b3IudHlwZV9idWlsZGVyX2ZvcndhcmRz
LCBnZW5lcmF0ZV9mb3J3YXJkX2NhbGxiYWNrKQorCisgICAgICAgIEdlbmVyYXRvci50eXBlX2J1
aWxkZXJfZm9yd2FyZHMuYXBwZW5kKCIvLyBFbmQgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuXG4i
KQorCisKK2RlZiBmbGF0dGVuX2xpc3QoaW5wdXQpOgorICAgIHJlcyA9IFtdCisKKyAgICBkZWYg
ZmlsbF9yZWN1cnNpdmUobCk6CisgICAgICAgIGZvciBpdGVtIGluIGw6CisgICAgICAgICAgICBp
ZiBpc2luc3RhbmNlKGl0ZW0sIGxpc3QpOgorICAgICAgICAgICAgICAgIGZpbGxfcmVjdXJzaXZl
KGl0ZW0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoaXRl
bSkKKyAgICBmaWxsX3JlY3Vyc2l2ZShpbnB1dCkKKyAgICByZXR1cm4gcmVzCiAKLSAgICAgICAg
ICAgIGlmIGRvbWFpbl9ndWFyZDoKLSAgICAgICAgICAgICAgICBkb21haW5fZ3VhcmQuZ2VuZXJh
dGVfY2xvc2Uob3V0cHV0KQogCiBHZW5lcmF0b3IuZ28oKQogCkBAIC0xNjcwLDcgKzE5MjAsOCBA
QCBiYWNrZW5kX2pzX2ZpbGUgPSBvcGVuKG91dHB1dF9jcHBfZGlybmFtZSArICIvSW5zcGVjdG9y
QmFja2VuZFN0dWIuanMiLCAidyIpCiBmcm9udGVuZF9oX2ZpbGUud3JpdGUoVGVtcGxhdGVzLmZy
b250ZW5kX2guc3Vic3RpdHV0ZShOb25lLAogICAgICAgICAgZmllbGREZWNsYXJhdGlvbnM9am9p
bihHZW5lcmF0b3IuZnJvbnRlbmRfY2xhc3NfZmllbGRfbGluZXMsICIiKSwKICAgICAgICAgIGRv
bWFpbkNsYXNzTGlzdD1qb2luKEdlbmVyYXRvci5mcm9udGVuZF9kb21haW5fY2xhc3NfbGluZXMs
ICIiKSwKLSAgICAgICAgIHR5cGVCdWlsZGVycz1qb2luKEdlbmVyYXRvci50eXBlX2J1aWxkZXJf
ZnJhZ21lbnRzLCAiIikpKQorICAgICAgICAgdHlwZUJ1aWxkZXJzPWpvaW4oZmxhdHRlbl9saXN0
KEdlbmVyYXRvci50eXBlX2J1aWxkZXJfZnJhZ21lbnRzKSwgIiIpLAorICAgICAgICAgZm9yd2Fy
ZHM9am9pbihHZW5lcmF0b3IudHlwZV9idWlsZGVyX2ZvcndhcmRzLCAiIikpKQogCiBiYWNrZW5k
X2hfZmlsZS53cml0ZShUZW1wbGF0ZXMuYmFja2VuZF9oLnN1YnN0aXR1dGUoTm9uZSwKICAgICBj
b25zdHJ1Y3RvckluaXQ9am9pbihHZW5lcmF0b3IuYmFja2VuZF9jb25zdHJ1Y3Rvcl9pbml0X2xp
c3QsICJcbiIpLAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>