<?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>147387</bug_id>
          
          <creation_ts>2015-07-28 17:09:01 -0700</creation_ts>
          <short_desc>Overflow check elimination fails for a simple test case</short_desc>
          <delta_ts>2015-08-20 17:27:07 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>basile_clement</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenb</cc>
    
    <cc>mmirman</cc>
    
    <cc>msaboff</cc>
    
    <cc>nrotem</cc>
    
    <cc>oliver</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1112944</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-07-28 17:09:01 -0700</bug_when>
    <thetext>The test case:

function foo(o) {
    var result = 0;
    for (var i = 0; i &lt; 100; ++i) // ++i still has an overflow check in the emitted code
        result += o.f;
    return result;
}

noInline(foo);

var p = {f:42};
var o = Object.create(p);

for (var i = 0; i &lt; 10000; ++i) {
    p.f = i;
    foo(o);
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1114003</commentid>
    <comment_count>1</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-01 00:55:20 -0700</bug_when>
    <thetext>The reason for the bug is that the merge rule assumes TOP when presented two claims about different constants.  For example:

@x == 0
@x &lt; 100

will yield TOP, when it should just yield @x &lt; 100.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1114004</commentid>
    <comment_count>2</comment_count>
      <attachid>258001</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-01 00:56:13 -0700</bug_when>
    <thetext>Created attachment 258001
Work in progress

This is going to be interesting.  I want to fix this test case but I don&apos;t want to introduce too much crazy.  This work-in-progress might be a bit on the crazy side still, and it&apos;s not even finished.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1114005</commentid>
    <comment_count>3</comment_count>
      <attachid>258002</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-01 01:08:09 -0700</bug_when>
    <thetext>Created attachment 258002
maybe it&apos;ll work

This is starting to look believable.  I&apos;ll have to think about it more though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119164</commentid>
    <comment_count>4</comment_count>
      <attachid>259443</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-19 20:01:51 -0700</bug_when>
    <thetext>Created attachment 259443
more things

I think that this is an even more comprehensive solution.  I haven&apos;t even tried compiling it yet, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119322</commentid>
    <comment_count>5</comment_count>
      <attachid>259487</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-20 12:46:20 -0700</bug_when>
    <thetext>Created attachment 259487
more refined

Still testing this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119358</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-20 14:27:49 -0700</bug_when>
    <thetext>Speed-up on the two microbenchmarks:

Benchmark report for JSRegress on shakezilla (MacBookPro11,3).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/secondary/OpenSource/WebKitBuild/Release/jsc (r188645)
&quot;BetterRangePhase&quot; at /Volumes/Data/tertiary/OpenSource/WebKitBuild/Release/jsc (r188645)

Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                   TipOfTree              BetterRangePhase                                 

hard-overflow-check-equal       37.5336+-0.6439     ^     33.8116+-1.6043        ^ definitely 1.1101x faster
hard-overflow-check             37.2674+-0.7066     ^     32.5268+-0.4279        ^ definitely 1.1457x faster

&lt;geometric&gt;                     37.3964+-0.4636     ^     33.1505+-0.7854        ^ definitely 1.1281x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119359</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-20 14:28:10 -0700</bug_when>
    <thetext>Overall perf:


Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on shakezilla (MacBookPro11,3).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/secondary/OpenSource/WebKitBuild/Release/jsc (r188645)
&quot;BetterRangePhase&quot; at /Volumes/Data/tertiary/OpenSource/WebKitBuild/Release/jsc (r188645)

Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                        TipOfTree              BetterRangePhase                                 
SunSpider:
   3d-cube                                            4.8236+-0.3991            4.6630+-0.1749          might be 1.0344x faster
   3d-morph                                           5.1740+-0.1408            5.1275+-0.0648        
   3d-raytrace                                        4.9851+-0.0374     ?      5.6385+-1.4123        ? might be 1.1311x slower
   access-binary-trees                                2.0193+-0.0504            2.0042+-0.0449        
   access-fannkuch                                    5.2270+-0.1482            5.2179+-0.0456        
   access-nbody                                       2.4409+-0.1936            2.3753+-0.0203          might be 1.0276x faster
   access-nsieve                                      2.9428+-0.0179     ?      2.9743+-0.0903        ? might be 1.0107x slower
   bitops-3bit-bits-in-byte                           1.4083+-0.0140            1.3948+-0.0147        
   bitops-bits-in-byte                                3.1951+-0.0596     ?      3.2238+-0.0612        ?
   bitops-bitwise-and                                 1.9133+-0.0148     ?      1.9196+-0.0132        ?
   bitops-nsieve-bits                                 2.9024+-0.0209            2.8940+-0.0334        
   controlflow-recursive                              2.0125+-0.0710            1.9435+-0.0323          might be 1.0355x faster
   crypto-aes                                         3.6629+-0.0336     ?      3.6900+-0.0560        ?
   crypto-md5                                         2.2751+-0.0271     ?      2.3149+-0.0385        ? might be 1.0175x slower
   crypto-sha1                                        2.2162+-0.0829            2.1868+-0.1081          might be 1.0134x faster
   date-format-tofte                                  6.4810+-0.0901            6.4090+-0.1364          might be 1.0112x faster
   date-format-xparb                                  4.4182+-0.0787     ?      4.5702+-0.3950        ? might be 1.0344x slower
   math-cordic                                        2.6842+-0.0135     ?      2.7149+-0.0923        ? might be 1.0114x slower
   math-partial-sums                                  5.1099+-0.1114     ?      5.1285+-0.0832        ?
   math-spectral-norm                                 1.7438+-0.0275            1.7392+-0.0240        
   regexp-dna                                         6.0820+-0.0879     ?      6.1329+-0.1491        ?
   string-base64                                      4.2095+-0.0386     ?      4.2466+-0.1689        ?
   string-fasta                                       5.8048+-0.2442            5.6915+-0.0546          might be 1.0199x faster
   string-tagcloud                                    7.7117+-0.0545     ?      7.7816+-0.1479        ?
   string-unpack-code                                17.9664+-0.2744     ?     19.5456+-3.5040        ? might be 1.0879x slower
   string-validate-input                              4.4258+-0.0726            4.4239+-0.1078        

   &lt;arithmetic&gt;                                       4.3783+-0.0232     ?      4.4597+-0.1338        ? might be 1.0186x slower

                                                        TipOfTree              BetterRangePhase                                 
LongSpider:
   3d-cube                                          813.9855+-15.3196         805.6424+-5.0391          might be 1.0104x faster
   3d-morph                                        1490.8229+-2.3010     ?   1491.2573+-6.6030        ?
   3d-raytrace                                      595.5582+-5.0321          595.2532+-2.5105        
   access-binary-trees                              799.6125+-10.5418         796.7921+-7.4698        
   access-fannkuch                                  275.2368+-3.8275     ?    275.6840+-8.7053        ?
   access-nbody                                     510.6766+-3.1072          509.8951+-3.0315        
   access-nsieve                                    357.0611+-4.3922          356.0200+-5.9756        
   bitops-3bit-bits-in-byte                          37.7559+-0.2297           37.5536+-0.2719        
   bitops-bits-in-byte                               75.6636+-2.0708           74.9225+-0.6534        
   bitops-nsieve-bits                               404.6605+-2.3672          404.6030+-4.9826        
   controlflow-recursive                            442.5568+-0.9105     ?    444.2149+-2.1903        ?
   crypto-aes                                       571.8178+-5.9766          568.0103+-7.9767        
   crypto-md5                                       494.9454+-5.3342          493.1496+-3.5585        
   crypto-sha1                                      615.0614+-4.2564     ?    621.4955+-10.5881       ? might be 1.0105x slower
   date-format-tofte                                504.0191+-14.9468         496.7238+-8.5321          might be 1.0147x faster
   date-format-xparb                                616.5331+-2.4952          613.4982+-4.0866        
   hash-map                                         149.9597+-1.0944     ?    150.1344+-3.2742        ?
   math-cordic                                      515.2488+-75.2478         482.0070+-0.6855          might be 1.0690x faster
   math-partial-sums                                490.2735+-2.2433     ?    490.7846+-2.3942        ?
   math-spectral-norm                               548.3604+-2.9451          547.9254+-2.3772        
   string-base64                                    344.3253+-3.6228     ?    352.9198+-5.8084        ? might be 1.0250x slower
   string-fasta                                     367.9363+-2.3383          365.7122+-1.9275        
   string-tagcloud                                  176.3741+-3.0525     ?    176.8751+-2.2641        ?

   &lt;geometric&gt;                                      388.8782+-2.1849          387.5050+-0.8077          might be 1.0035x faster

                                                        TipOfTree              BetterRangePhase                                 
V8Spider:
   crypto                                            47.2592+-0.9358           46.8718+-1.0772        
   deltablue                                         85.9420+-2.6256           85.1528+-2.3473        
   earley-boyer                                      39.1992+-0.5919     ?     39.2281+-0.5339        ?
   raytrace                                          32.1054+-1.5635           30.1890+-1.0699          might be 1.0635x faster
   regexp                                            60.1945+-0.2831     ?     60.3994+-0.4396        ?
   richards                                          64.1570+-1.0411           63.2755+-0.6092          might be 1.0139x faster
   splay                                             34.0770+-1.9339     ?     36.4775+-1.3040        ? might be 1.0704x slower

   &lt;geometric&gt;                                       48.9117+-0.2632           48.7826+-0.4129          might be 1.0026x faster

                                                        TipOfTree              BetterRangePhase                                 
Octane:
   encrypt                                           0.17194+-0.00106    ?     0.17237+-0.00127       ?
   decrypt                                           3.25185+-0.01243    ?     3.25300+-0.00937       ?
   deltablue                                x2       0.15465+-0.00130          0.15197+-0.00169         might be 1.0176x faster
   earley                                            0.27631+-0.00277          0.27623+-0.00176       
   boyer                                             4.20066+-0.10273    ?     4.21329+-0.11973       ?
   navier-stokes                            x2       4.82617+-0.01988    ?     4.91723+-0.19362       ? might be 1.0189x slower
   raytrace                                 x2       1.02384+-0.03019    ?     1.05524+-0.02750       ? might be 1.0307x slower
   richards                                 x2       0.10900+-0.00147          0.10772+-0.00118         might be 1.0119x faster
   splay                                    x2       0.33018+-0.00234    ?     0.33105+-0.00568       ?
   regexp                                   x2      24.41735+-0.30610    ?    24.73577+-0.23839       ? might be 1.0130x slower
   pdfjs                                    x2      36.71915+-0.35206         36.58916+-0.26680       
   mandreel                                 x2      43.46671+-0.46114    ?    43.63361+-0.31383       ?
   gbemu                                    x2      34.89000+-2.22305         33.59036+-0.23926         might be 1.0387x faster
   closure                                           0.55415+-0.00252    ?     0.55733+-0.00256       ?
   jquery                                            7.05812+-0.03970    ?     7.11249+-0.02557       ?
   box2d                                    x2       9.89896+-0.10250    ?     9.96979+-0.10886       ?
   zlib                                     x2     378.73634+-9.97887    ?   385.29796+-6.65037       ? might be 1.0173x slower
   typescript                               x2     638.33517+-8.63410    ?   641.46136+-11.30056      ?

   &lt;geometric&gt;                                       5.53977+-0.03455    ?     5.55368+-0.02200       ? might be 1.0025x slower

                                                        TipOfTree              BetterRangePhase                                 
Kraken:
   ai-astar                                          224.815+-6.703      ?     225.660+-6.294         ?
   audio-beat-detection                               50.138+-0.257      ?      50.531+-0.496         ?
   audio-dft                                          95.676+-1.649      ?      96.139+-1.702         ?
   audio-fft                                          34.613+-0.117      ?      34.676+-0.092         ?
   audio-oscillator                                   58.645+-0.361             58.592+-0.352         
   imaging-darkroom                                   61.352+-1.531             60.631+-0.192           might be 1.0119x faster
   imaging-desaturate                                 49.043+-0.470      ?      50.764+-2.430         ? might be 1.0351x slower
   imaging-gaussian-blur                              84.779+-3.480             84.305+-0.502         
   json-parse-financial                               37.986+-0.294             37.474+-0.262           might be 1.0137x faster
   json-stringify-tinderbox                           21.519+-0.050      !      24.150+-0.207         ! definitely 1.1223x slower
   stanford-crypto-aes                                40.341+-0.607             39.873+-0.138           might be 1.0118x faster
   stanford-crypto-ccm                                34.792+-1.243             34.314+-0.962           might be 1.0139x faster
   stanford-crypto-pbkdf2                             93.400+-0.192      ?      94.099+-1.362         ?
   stanford-crypto-sha256-iterative                   35.667+-0.302      ?      35.836+-0.337         ?

   &lt;arithmetic&gt;                                       65.912+-0.538      ?      66.217+-0.520         ? might be 1.0046x slower

                                                        TipOfTree              BetterRangePhase                                 
JSRegress:
   abc-forward-loop-equal                            28.9037+-0.1573     ?     29.1570+-0.9520        ?
   abc-postfix-backward-loop                         28.8847+-0.1982     ?     28.9605+-0.1234        ?
   abc-simple-backward-loop                          28.5707+-0.2482     ?     28.7503+-0.5265        ?
   abc-simple-forward-loop                           28.6636+-0.1888           28.4852+-0.1495        
   abc-skippy-loop                                   20.4679+-0.1664           20.4223+-0.1127        
   abs-boolean                                        2.4226+-0.0578            2.3932+-0.0322          might be 1.0123x faster
   adapt-to-double-divide                            15.9863+-0.0669           15.8651+-0.0732        
   aliased-arguments-getbyval                         1.1070+-0.0442            1.0899+-0.0403          might be 1.0157x faster
   allocate-big-object                                2.5492+-0.0689            2.5225+-0.0875          might be 1.0106x faster
   arguments-named-and-reflective                    10.8271+-0.1582           10.6658+-0.1544          might be 1.0151x faster
   arguments-out-of-bounds                            9.9830+-0.1649     ^      9.0731+-0.1457        ^ definitely 1.1003x faster
   arguments-strict-mode                              9.4778+-0.3494     ?      9.4856+-0.3083        ?
   arguments                                          8.4255+-0.0838            8.3662+-0.1668        
   arity-mismatch-inlining                            0.7724+-0.0485     ?      0.7748+-0.0440        ?
   array-access-polymorphic-structure                 5.7525+-0.1012     ?      5.8171+-0.1386        ? might be 1.0112x slower
   array-nonarray-polymorhpic-access                 24.0519+-0.2978           23.9109+-0.2056        
   array-prototype-every                             73.8506+-0.3924           73.1471+-0.6807        
   array-prototype-forEach                           81.7823+-19.9516          72.8767+-1.1907          might be 1.1222x faster
   array-prototype-map                               81.0087+-0.7294           80.0226+-0.5770          might be 1.0123x faster
   array-prototype-reduce                            71.4399+-1.6476           70.1857+-1.3713          might be 1.0179x faster
   array-prototype-reduceRight                       69.8370+-0.2417     ?     69.9685+-0.6222        ?
   array-prototype-some                              73.7130+-0.3903           73.3310+-1.4976        
   array-splice-contiguous                           20.5666+-0.2807           20.4993+-0.3252        
   array-with-double-add                              3.3358+-0.0288            3.3247+-0.0881        
   array-with-double-increment                        2.9946+-0.0702            2.9798+-0.0143        
   array-with-double-mul-add                          4.0659+-0.0307     ?      4.1255+-0.0716        ? might be 1.0147x slower
   array-with-double-sum                              3.1389+-0.0235     ?      3.1516+-0.0820        ?
   array-with-int32-add-sub                           5.7395+-0.0380     ?      5.7650+-0.0467        ?
   array-with-int32-or-double-sum                     3.1998+-0.0623     ?      3.2306+-0.0725        ?
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     25.9695+-0.4886           25.8633+-0.6022        
   ArrayBuffer-DataView-alloc-long-lived             11.4117+-0.1158     ?     11.5979+-0.1124        ? might be 1.0163x slower
   ArrayBuffer-Int32Array-byteOffset                  3.4760+-0.0421     ?      3.4836+-0.0212        ?
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     25.9904+-0.2496           25.8897+-0.1255        
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     19.0933+-0.1552     ?     19.6158+-0.9284        ? might be 1.0274x slower
   ArrayBuffer-Int8Array-alloc-long-lived            10.7897+-0.0690     ?     10.8992+-0.1071        ? might be 1.0101x slower
   ArrayBuffer-Int8Array-alloc                        9.1588+-0.1900     ?      9.2501+-0.0453        ?
   arrowfunction-call                                10.4887+-0.1178           10.4426+-0.0995        
   asmjs_bool_bug                                     6.9951+-0.0184     ?      7.0085+-0.0294        ?
   assign-custom-setter-polymorphic                   2.2263+-0.0163     ?      2.2799+-0.0500        ? might be 1.0241x slower
   assign-custom-setter                               3.1642+-0.0486            3.1531+-0.0387        
   basic-set                                          7.1067+-0.1476     ?      7.1109+-0.1829        ?
   big-int-mul                                        3.3803+-0.0365            3.3650+-0.0125        
   boolean-test                                       2.8326+-0.0555     ?      2.8615+-0.0222        ? might be 1.0102x slower
   branch-fold                                        3.5101+-0.0254     ?      3.5134+-0.0234        ?
   branch-on-string-as-boolean                       16.0586+-0.2417     ?     16.4581+-0.2837        ? might be 1.0249x slower
   by-val-generic                                     5.7831+-0.0655     ?      5.7832+-0.0835        ?
   call-spread-apply                                 25.3715+-0.1098     ?     25.5016+-0.4921        ?
   call-spread-call                                  20.5047+-0.1398     ^     20.2368+-0.0802        ^ definitely 1.0132x faster
   captured-assignments                               0.3817+-0.0082     ?      0.3896+-0.0063        ? might be 1.0207x slower
   cast-int-to-double                                 4.9774+-0.0410            4.9602+-0.0284        
   cell-argument                                      6.6173+-0.2184     ^      6.2421+-0.0985        ^ definitely 1.0601x faster
   cfg-simplify                                       2.7287+-0.0736            2.6918+-0.0367          might be 1.0137x faster
   chain-getter-access                                8.2574+-0.1532            8.2330+-0.0826        
   cmpeq-obj-to-obj-other                            11.3852+-0.8566           10.9670+-1.0490          might be 1.0381x faster
   constant-test                                      4.7656+-0.0336            4.7206+-0.0209        
   create-lots-of-functions                           9.4659+-0.5533     ?     10.0303+-0.6269        ? might be 1.0596x slower
   cse-new-array-buffer                               2.1083+-0.0580     ?      2.1815+-0.0968        ? might be 1.0347x slower
   cse-new-array                                      2.2529+-0.0478            2.2106+-0.0525          might be 1.0191x faster
   DataView-custom-properties                        31.0264+-1.2792           30.6884+-0.3600          might be 1.0110x faster
   delay-tear-off-arguments-strictmode               11.9542+-0.1993     ?     12.0002+-0.3376        ?
   deltablue-varargs                                152.1449+-1.5523     ?    153.6654+-2.0226        ?
   destructuring-arguments                          159.0528+-0.8241     ?    160.2248+-1.5889        ?
   destructuring-parameters-overridden-by-function   
                                                      0.4420+-0.0115     ?      0.4578+-0.0204        ? might be 1.0357x slower
   destructuring-swap                                 4.5984+-0.0557     ?      4.6274+-0.0453        ?
   direct-arguments-getbyval                          1.1038+-0.0259     ?      1.1100+-0.0414        ?
   div-boolean-double                                 5.2251+-0.0707            5.1880+-0.0892        
   div-boolean                                        8.0516+-0.0208     ?      8.0667+-0.0349        ?
   double-get-by-val-out-of-bounds                    4.2578+-0.0633     ?      4.3096+-0.0605        ? might be 1.0122x slower
   double-pollution-getbyval                          8.5764+-0.0339     ?      8.5931+-0.0356        ?
   double-pollution-putbyoffset                       3.6664+-0.0384     ?      3.6689+-0.0429        ?
   double-real-use                                   23.8280+-1.2030     ?     23.9349+-1.3436        ?
   double-to-int32-typed-array-no-inline              1.9467+-0.0794            1.9381+-0.0493        
   double-to-int32-typed-array                        1.7139+-0.0430     ?      1.7188+-0.0277        ?
   double-to-uint32-typed-array-no-inline             2.0134+-0.0350     ?      2.0282+-0.0492        ?
   double-to-uint32-typed-array                       1.8013+-0.0168            1.7815+-0.0344          might be 1.0111x faster
   elidable-new-object-dag                           33.5004+-0.3806           33.3678+-0.3841        
   elidable-new-object-roflcopter                    32.4650+-0.3444     ?     32.6691+-0.1026        ?
   elidable-new-object-then-call                     31.8487+-0.5700           31.1458+-0.4476          might be 1.0226x faster
   elidable-new-object-tree                          36.9577+-0.3630     ?     37.3893+-0.7683        ? might be 1.0117x slower
   empty-string-plus-int                              4.5219+-0.1130            4.4958+-0.0399        
   emscripten-cube2hash                              25.2717+-1.1535     ?     28.4517+-5.4926        ? might be 1.1258x slower
   exit-length-on-plain-object                       11.7951+-0.0755     ?     12.0964+-0.2798        ? might be 1.0255x slower
   external-arguments-getbyval                        1.1560+-0.0694     ?      1.1622+-0.0795        ?
   external-arguments-putbyval                        2.0914+-0.0625            2.0900+-0.0715        
   fixed-typed-array-storage-var-index                1.0833+-0.0173            1.0784+-0.0122        
   fixed-typed-array-storage                          0.8212+-0.0338            0.8078+-0.0146          might be 1.0165x faster
   Float32Array-matrix-mult                           3.7165+-0.0371            3.7128+-0.0389        
   Float32Array-to-Float64Array-set                  45.2482+-0.1478     ?     46.0603+-1.3485        ? might be 1.0179x slower
   Float64Array-alloc-long-lived                     57.0244+-0.1395     ?     57.3615+-0.5755        ?
   Float64Array-to-Int16Array-set                    56.2880+-0.2786           55.8081+-0.3373        
   fold-double-to-int                                12.0505+-0.6176           11.7951+-0.0603          might be 1.0217x faster
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     11.1171+-1.6176     ?     11.4040+-0.9605        ? might be 1.0258x slower
   fold-get-by-id-to-multi-get-by-offset             10.2190+-0.9682     ?     10.9825+-1.4132        ? might be 1.0747x slower
   fold-multi-get-by-offset-to-get-by-offset   
                                                      8.1786+-1.4603            8.1560+-1.5435        
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      8.6183+-0.7419            8.0331+-1.4701          might be 1.0729x faster
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                      8.8198+-0.7171     ?      9.0646+-1.6362        ? might be 1.0278x slower
   fold-multi-put-by-offset-to-put-by-offset   
                                                      3.8672+-0.3299     ?      3.9266+-0.3970        ? might be 1.0153x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                      8.2119+-0.4259            7.8499+-0.1089          might be 1.0461x faster
   fold-put-by-id-to-multi-put-by-offset             10.0599+-0.9381     ?     10.2707+-1.4878        ? might be 1.0209x slower
   fold-put-structure                                 5.5307+-0.8999            4.2529+-0.6295          might be 1.3005x faster
   for-of-iterate-array-entries                      10.9317+-0.1193     ?     11.0255+-0.0991        ?
   for-of-iterate-array-keys                          3.5943+-0.1215     ?      3.6625+-0.0582        ? might be 1.0190x slower
   for-of-iterate-array-values                        3.5314+-0.1807     ?      3.5607+-0.1805        ?
   fround                                            18.4798+-0.1521     ?     18.7742+-0.1957        ? might be 1.0159x slower
   ftl-library-inlining-dataview                     55.3061+-0.6132           55.2417+-0.2421        
   ftl-library-inlining                              92.4497+-6.6021           86.8344+-2.7495          might be 1.0647x faster
   function-call                                     10.6109+-0.1819           10.5941+-0.2050        
   function-dot-apply                                 1.9331+-0.0286     ?      1.9815+-0.0431        ? might be 1.0251x slower
   function-test                                      2.6512+-0.0706            2.6436+-0.0229        
   function-with-eval                               102.9968+-0.7137     ?    103.4445+-0.5444        ?
   gcse-poly-get-less-obvious                        13.8987+-0.1339     ?     13.9673+-0.2282        ?
   gcse-poly-get                                     15.6772+-0.3106           15.5052+-0.1014          might be 1.0111x faster
   gcse                                               3.7655+-0.0439            3.7595+-0.0267        
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      2.5999+-0.0742            2.5479+-0.0250          might be 1.0204x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      5.5608+-0.0187     ?      5.5794+-0.0187        ?
   get-by-id-chain-from-try-block                     5.3267+-0.0539     ?      5.3515+-0.0480        ?
   get-by-id-check-structure-elimination              4.2457+-0.0325     ?      4.2887+-0.0349        ? might be 1.0101x slower
   get-by-id-proto-or-self                           14.6232+-0.2448     ?     14.8022+-0.5972        ? might be 1.0122x slower
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      2.8303+-0.0266     ?      2.8501+-0.0513        ?
   get-by-id-self-or-proto                           14.8144+-0.5716           14.6454+-0.3828          might be 1.0115x faster
   get-by-val-out-of-bounds                           3.7969+-0.0751     ?      3.8738+-0.2593        ? might be 1.0202x slower
   get-by-val-with-string-bimorphic-check-structure-elimination-simple   
                                                      2.7456+-0.0269            2.7270+-0.0179        
   get-by-val-with-string-bimorphic-check-structure-elimination   
                                                      5.8666+-0.0655            5.8596+-0.0309        
   get-by-val-with-string-chain-from-try-block   
                                                      5.4335+-0.0682     ?      5.5839+-0.2115        ? might be 1.0277x slower
   get-by-val-with-string-check-structure-elimination   
                                                      4.9597+-0.0163     ?      4.9831+-0.0217        ?
   get-by-val-with-string-proto-or-self              14.4390+-0.1878     ?     14.5265+-0.3920        ?
   get-by-val-with-string-quadmorphic-check-structure-elimination-simple   
                                                      3.0858+-0.0099     ?      3.0944+-0.0286        ?
   get-by-val-with-string-self-or-proto              15.0469+-1.1603           14.7658+-0.3241          might be 1.0190x faster
   get-by-val-with-symbol-bimorphic-check-structure-elimination-simple   
                                                      2.9669+-0.0222     ?      2.9828+-0.0532        ?
   get-by-val-with-symbol-bimorphic-check-structure-elimination   
                                                     12.1415+-0.1109           12.1192+-0.0395        
   get-by-val-with-symbol-chain-from-try-block   
                                                      5.4829+-0.0612            5.4197+-0.0651          might be 1.0117x faster
   get-by-val-with-symbol-check-structure-elimination   
                                                     10.9056+-0.0905           10.8503+-0.0162        
   get-by-val-with-symbol-proto-or-self              14.6203+-0.6193     ?     14.8031+-0.5622        ? might be 1.0125x slower
   get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple   
                                                      3.7961+-0.0521     ?      3.8689+-0.0483        ? might be 1.0192x slower
   get-by-val-with-symbol-self-or-proto              14.6764+-0.2914     ?     14.8229+-0.6061        ?
   get_callee_monomorphic                             2.2950+-0.0499            2.2794+-0.0371        
   get_callee_polymorphic                             3.2156+-0.2233            3.1268+-0.0519          might be 1.0284x faster
   getter-no-activation                               4.7671+-0.1723            4.6676+-0.1207          might be 1.0213x faster
   getter-prototype                                   9.7256+-0.1193     ^      8.9443+-0.4066        ^ definitely 1.0873x faster
   getter-richards                                  119.7874+-5.5903          119.1671+-5.3613        
   getter                                             5.3912+-0.5562     ?      5.6847+-0.5771        ? might be 1.0544x slower
   global-object-access-with-mutating-structure   
                                                      5.5844+-0.1102     ?      5.5851+-0.1327        ?
   global-var-const-infer-fire-from-opt               0.7790+-0.0145     ?      0.8057+-0.0397        ? might be 1.0343x slower
   global-var-const-infer                             0.6142+-0.0306     ?      0.6479+-0.0474        ? might be 1.0548x slower
   HashMap-put-get-iterate-keys                      25.0407+-1.3869           24.5154+-1.4802          might be 1.0214x faster
   HashMap-put-get-iterate                           27.8880+-2.8092           27.2531+-0.6689          might be 1.0233x faster
   HashMap-string-put-get-iterate                    22.5271+-0.3421     ?     23.2525+-0.9466        ? might be 1.0322x slower
   hoist-make-rope                                    8.1205+-0.7304     ?      8.3211+-0.7454        ? might be 1.0247x slower
   hoist-poly-check-structure-effectful-loop   
                                                      4.0060+-0.0405     ?      4.0338+-0.0452        ?
   hoist-poly-check-structure                         3.2035+-0.0284            3.2019+-0.0247        
   imul-double-only                                   7.7584+-0.1400            7.5764+-0.0490          might be 1.0240x faster
   imul-int-only                                      8.4671+-0.6795            8.2396+-0.6239          might be 1.0276x faster
   imul-mixed                                         7.0561+-0.3007            6.7286+-0.0580          might be 1.0487x faster
   in-four-cases                                     16.5803+-0.0867     ?     16.8786+-0.5897        ? might be 1.0180x slower
   in-one-case-false                                  9.5507+-0.5010            9.4691+-0.5319        
   in-one-case-true                                   9.4998+-0.4536            9.3073+-0.3029          might be 1.0207x faster
   in-two-cases                                       9.6568+-0.3757     ?      9.8642+-0.4013        ? might be 1.0215x slower
   indexed-properties-in-objects                      2.6785+-0.0806            2.6655+-0.0211        
   infer-closure-const-then-mov-no-inline             2.9851+-0.0338            2.9821+-0.0214        
   infer-closure-const-then-mov                      17.7178+-0.1801     ?     17.8023+-0.1982        ?
   infer-closure-const-then-put-to-scope-no-inline   
                                                     10.6766+-0.0361     ?     10.8716+-0.3256        ? might be 1.0183x slower
   infer-closure-const-then-put-to-scope             20.6394+-0.4365           20.5717+-0.2388        
   infer-closure-const-then-reenter-no-inline   
                                                     49.0954+-0.2759           48.8848+-0.0736        
   infer-closure-const-then-reenter                  21.1635+-0.3558           20.8208+-0.3434          might be 1.0165x faster
   infer-constant-global-property                     3.3355+-0.0346     ?      3.3432+-0.0373        ?
   infer-constant-property                            2.5594+-0.0397     ?      2.5883+-0.0611        ? might be 1.0113x slower
   infer-one-time-closure-ten-vars                    9.1095+-1.3297     ^      7.6592+-0.0927        ^ definitely 1.1893x faster
   infer-one-time-closure-two-vars                    8.1317+-0.1909     ^      7.1965+-0.1528        ^ definitely 1.1299x faster
   infer-one-time-closure                             8.1842+-0.2822     ^      7.2675+-0.4643        ^ definitely 1.1261x faster
   infer-one-time-deep-closure                       13.4090+-2.2046     ^     10.3692+-0.1051        ^ definitely 1.2932x faster
   inline-arguments-access                            3.6855+-0.2182            3.5744+-0.0401          might be 1.0311x faster
   inline-arguments-aliased-access                    3.5566+-0.1100     ?      3.5972+-0.0738        ? might be 1.0114x slower
   inline-arguments-local-escape                      3.8441+-0.1673            3.8383+-0.2291        
   inline-get-scoped-var                              4.4918+-0.0866     ?      4.5332+-0.1608        ?
   inlined-put-by-id-transition                       9.6150+-0.0714     ?      9.6804+-0.2821        ?
   int-or-other-abs-then-get-by-val                   4.6833+-0.0272     ?      4.6927+-0.0663        ?
   int-or-other-abs-zero-then-get-by-val             15.4380+-0.2171           15.3268+-0.0387        
   int-or-other-add-then-get-by-val                   3.9353+-0.0536     ?      4.4395+-1.2984        ? might be 1.1281x slower
   int-or-other-add                                   4.7142+-0.0275     ?      4.7747+-0.0441        ? might be 1.0128x slower
   int-or-other-div-then-get-by-val                   3.5835+-0.0225            3.5733+-0.0194        
   int-or-other-max-then-get-by-val                   3.8144+-0.0185     ?      3.8172+-0.0356        ?
   int-or-other-min-then-get-by-val                   3.8270+-0.0458     ?      3.8441+-0.0535        ?
   int-or-other-mod-then-get-by-val                   3.4200+-0.1456            3.3977+-0.0357        
   int-or-other-mul-then-get-by-val                   3.4755+-0.0380     ?      3.5269+-0.0596        ? might be 1.0148x slower
   int-or-other-neg-then-get-by-val                   4.2778+-0.0707     ?      4.3534+-0.0528        ? might be 1.0177x slower
   int-or-other-neg-zero-then-get-by-val             15.4020+-0.2105           15.2993+-0.0974        
   int-or-other-sub-then-get-by-val                   3.9501+-0.1430            3.9162+-0.0419        
   int-or-other-sub                                   3.2995+-0.0344     ?      3.3750+-0.1129        ? might be 1.0229x slower
   int-overflow-local                                 4.1689+-0.0518     ?      4.1841+-0.0704        ?
   Int16Array-alloc-long-lived                       41.8836+-0.2448     ?     42.4842+-0.6542        ? might be 1.0143x slower
   Int16Array-bubble-sort-with-byteLength            16.8834+-0.1165     ?     17.2839+-1.0060        ? might be 1.0237x slower
   Int16Array-bubble-sort                            17.1178+-0.3292           17.0147+-0.0576        
   Int16Array-load-int-mul                            1.3789+-0.0125     ?      1.4103+-0.0537        ? might be 1.0228x slower
   Int16Array-to-Int32Array-set                      42.5354+-0.1417           42.1305+-0.2710        
   Int32Array-alloc-large                            11.6209+-0.1844     ?     11.7088+-0.2335        ?
   Int32Array-alloc-long-lived                       46.9802+-0.2126     ?     47.2723+-0.3565        ?
   Int32Array-alloc                                   2.8239+-0.0582            2.8005+-0.1386        
   Int32Array-Int8Array-view-alloc                    5.9695+-0.1185     ?      6.1803+-0.3224        ? might be 1.0353x slower
   int52-spill                                        4.4226+-0.0899            4.4168+-0.0794        
   Int8Array-alloc-long-lived                        37.8355+-0.8780           37.7861+-0.5679        
   Int8Array-load-with-byteLength                     3.3862+-0.1160            3.3257+-0.0279          might be 1.0182x faster
   Int8Array-load                                     3.3496+-0.0486            3.3155+-0.0132          might be 1.0103x faster
   integer-divide                                    10.1565+-0.0438     ?     10.2185+-0.2505        ?
   integer-modulo                                     1.5407+-0.0671            1.4753+-0.0190          might be 1.0444x faster
   is-boolean-fold-tricky                             3.7085+-0.0479     ?      3.7287+-0.0541        ?
   is-boolean-fold                                    2.6088+-0.0409            2.5840+-0.0370        
   is-function-fold-tricky-internal-function   
                                                      9.6281+-0.0475            9.6138+-0.0564        
   is-function-fold-tricky                            4.0869+-0.0883            4.0269+-0.0131          might be 1.0149x faster
   is-function-fold                                   2.6113+-0.0273     ?      2.6610+-0.0740        ? might be 1.0190x slower
   is-number-fold-tricky                              3.9680+-0.0238            3.9494+-0.0218        
   is-number-fold                                     2.6102+-0.0902            2.5914+-0.0377        
   is-object-or-null-fold-functions                   2.6352+-0.0367            2.6154+-0.0148        
   is-object-or-null-fold-less-tricky                 4.0263+-0.0318     ?      4.0399+-0.0559        ?
   is-object-or-null-fold-tricky                      5.0967+-0.0810     ?      5.1401+-0.0779        ?
   is-object-or-null-fold                             2.6048+-0.0246     ?      2.6170+-0.0326        ?
   is-object-or-null-trickier-function                4.0530+-0.0259     ?      4.0808+-0.0423        ?
   is-object-or-null-trickier-internal-function   
                                                     10.4087+-0.0245     ?     10.4341+-0.0301        ?
   is-object-or-null-tricky-function                  4.2729+-0.5903            4.0709+-0.0429          might be 1.0496x faster
   is-object-or-null-tricky-internal-function   
                                                      7.6279+-0.0770     ?      7.6668+-0.0391        ?
   is-string-fold-tricky                              3.9740+-0.0375            3.9467+-0.0364        
   is-string-fold                                     2.7062+-0.2669            2.5946+-0.0108          might be 1.0430x faster
   is-undefined-fold-tricky                           3.5298+-0.6523            3.2723+-0.0350          might be 1.0787x faster
   is-undefined-fold                                  2.5952+-0.0328            2.5769+-0.0171        
   JSONP-negative-0                                   0.2306+-0.0066     ?      0.2330+-0.0044        ? might be 1.0106x slower
   large-int-captured                                 3.8182+-0.0770     ?      3.9655+-0.4023        ? might be 1.0386x slower
   large-int-neg                                     13.5965+-0.0957           13.4574+-0.1114          might be 1.0103x faster
   large-int                                         12.8596+-0.2121     ^     12.2834+-0.1043        ^ definitely 1.0469x faster
   load-varargs-elimination                          20.4611+-0.1151           20.3619+-0.5167        
   logical-not-weird-types                            2.7943+-0.0327     ?      2.8130+-0.0388        ?
   logical-not                                        4.1881+-0.0929            4.1317+-0.0920          might be 1.0137x faster
   lots-of-fields                                     9.2768+-0.0351     ?      9.3485+-0.1314        ?
   make-indexed-storage                               2.7622+-0.1255     ?      2.7867+-0.0820        ?
   make-rope-cse                                      3.6142+-0.1947            3.5394+-0.0647          might be 1.0211x faster
   marsaglia-larger-ints                             31.0072+-0.1509           30.9019+-0.1782        
   marsaglia-osr-entry                               20.4827+-0.1966     ?     20.4976+-0.2141        ?
   math-with-out-of-bounds-array-values              21.2871+-0.8852           20.9996+-0.2425          might be 1.0137x faster
   max-boolean                                        2.6620+-0.0255     ?      2.6812+-0.0408        ?
   method-on-number                                  17.6446+-1.0188           17.0884+-0.2900          might be 1.0326x faster
   min-boolean                                        2.6280+-0.0459            2.6038+-0.0382        
   minus-boolean-double                               3.0418+-0.0280            3.0226+-0.0210        
   minus-boolean                                      2.3189+-0.0242            2.2945+-0.0616          might be 1.0106x faster
   misc-strict-eq                                    30.5630+-0.3181           30.3447+-0.2634        
   mod-boolean-double                                10.9570+-0.0672           10.9558+-0.0887        
   mod-boolean                                        8.1826+-0.0254     ?      8.2016+-0.0319        ?
   mul-boolean-double                                 3.5208+-0.0280     ?      3.5422+-0.0254        ?
   mul-boolean                                        2.7512+-0.0292            2.7446+-0.0255        
   neg-boolean                                        3.0407+-0.0375     ?      3.0489+-0.0306        ?
   negative-zero-divide                               0.3189+-0.0101            0.3137+-0.0069          might be 1.0168x faster
   negative-zero-modulo                               0.3207+-0.0174            0.3138+-0.0055          might be 1.0220x faster
   negative-zero-negate                               0.2921+-0.0061     ?      0.2951+-0.0090        ? might be 1.0102x slower
   nested-function-parsing                           43.0659+-0.5473     ?     44.3075+-0.7192        ? might be 1.0288x slower
   new-array-buffer-dead                             87.2181+-0.4743           86.9983+-0.7810        
   new-array-buffer-push                              5.9728+-0.0911     ?      5.9843+-0.3223        ?
   new-array-dead                                    15.2503+-1.1216           14.8850+-0.7108          might be 1.0245x faster
   new-array-push                                     3.3983+-0.1357            3.2422+-0.0998          might be 1.0481x faster
   no-inline-constructor                             30.2000+-0.1538     ?     30.3925+-0.1261        ?
   number-test                                        2.8658+-0.0652            2.8444+-0.0397        
   object-closure-call                                4.7395+-0.0530            4.7134+-0.0202        
   object-get-own-property-symbols-on-large-array   
                                                      4.1789+-0.1802            4.0983+-0.1465          might be 1.0197x faster
   object-test                                        2.5692+-0.0389     ?      2.6155+-0.0464        ? might be 1.0180x slower
   obvious-sink-pathology-taken                      98.0240+-0.5555     ?     98.1800+-0.5243        ?
   obvious-sink-pathology                            93.0514+-0.8599           92.9325+-0.6204        
   obviously-elidable-new-object                     28.0062+-0.2373           27.9471+-0.3017        
   plus-boolean-arith                                 2.3344+-0.0427     ?      2.3521+-0.0695        ?
   plus-boolean-double                                3.0469+-0.0422     ?      3.0691+-0.0865        ?
   plus-boolean                                       2.5334+-0.0668            2.4851+-0.0422          might be 1.0194x faster
   poly-chain-access-different-prototypes-simple   
                                                      3.1917+-0.0301     ?      3.2194+-0.0480        ?
   poly-chain-access-different-prototypes             2.8075+-0.0406     ?      2.8640+-0.0953        ? might be 1.0201x slower
   poly-chain-access-simpler                          3.1803+-0.0360     ?      3.2227+-0.0642        ? might be 1.0133x slower
   poly-chain-access                                  3.1902+-0.0642     ?      3.2209+-0.0367        ?
   poly-stricteq                                     49.1909+-0.0836     ?     49.2596+-0.1537        ?
   polymorphic-array-call                             1.1691+-0.0661     ?      1.1803+-0.0735        ?
   polymorphic-get-by-id                              2.7487+-0.0346            2.7416+-0.0316        
   polymorphic-put-by-id                             24.1470+-0.6430     ?     25.2451+-0.8415        ? might be 1.0455x slower
   polymorphic-structure                             12.6327+-0.0388     ?     12.6855+-0.0607        ?
   polyvariant-monomorphic-get-by-id                  6.7895+-0.8216     ?      6.9848+-1.0614        ? might be 1.0288x slower
   proto-getter-access                                8.2133+-0.0831            8.1457+-0.0848        
   prototype-access-with-mutating-prototype           5.2690+-0.1647     ?      5.3030+-0.1380        ?
   put-by-id-replace-and-transition                   7.8909+-0.3368            7.7716+-0.2225          might be 1.0153x faster
   put-by-id-slightly-polymorphic                     2.5768+-0.0186     ?      2.5801+-0.0438        ?
   put-by-id                                          9.5393+-0.1485            9.3793+-0.1828          might be 1.0171x faster
   put-by-val-direct                                  0.3170+-0.0069     ?      0.3176+-0.0055        ?
   put-by-val-large-index-blank-indexing-type   
                                                      5.2555+-0.1114            5.2181+-0.0968        
   put-by-val-machine-int                             2.2789+-0.1215     ?      2.3076+-0.0578        ? might be 1.0126x slower
   rare-osr-exit-on-local                            14.1663+-0.1829           14.0146+-0.2688          might be 1.0108x faster
   register-pressure-from-osr                        15.9931+-0.0587     ?     16.0367+-0.2525        ?
   repeat-multi-get-by-offset                        21.0583+-0.3340           20.8206+-0.0674          might be 1.0114x faster
   setter-prototype                                   7.6321+-0.3081            7.5180+-0.1405          might be 1.0152x faster
   setter                                             5.5865+-0.6564     ?      5.6295+-0.7255        ?
   simple-activation-demo                            25.2338+-0.0715     ?     25.2539+-0.1613        ?
   simple-getter-access                              10.4686+-0.2639           10.3486+-0.1008          might be 1.0116x faster
   simple-poly-call-nested                            8.8576+-0.8880            8.5523+-0.7655          might be 1.0357x faster
   simple-poly-call                                   1.1551+-0.0312     ?      1.1599+-0.0151        ?
   sin-boolean                                       19.5845+-1.1465           19.4984+-1.2468        
   singleton-scope                                   59.3394+-0.2162           59.3335+-0.1824        
   sink-function                                      9.8853+-0.3878     ?     10.2691+-0.5871        ? might be 1.0388x slower
   sink-huge-activation                              16.6965+-0.3679     ^     15.9382+-0.3735        ^ definitely 1.0476x faster
   sinkable-new-object-dag                           53.1363+-0.8301     ?     53.2522+-0.3817        ?
   sinkable-new-object-taken                         40.2906+-0.3114     !     42.2899+-1.5355        ! definitely 1.0496x slower
   sinkable-new-object                               29.3956+-0.4510           29.3117+-0.3099        
   slow-array-profile-convergence                     2.3485+-0.0232     ?      2.3960+-0.0769        ? might be 1.0202x slower
   slow-convergence                                   2.2192+-0.0258     ?      2.2236+-0.0362        ?
   slow-ternaries                                    16.8416+-0.1292           16.8058+-0.1501        
   sorting-benchmark                                 16.1346+-0.3067           16.1222+-0.1711        
   sparse-conditional                                 1.0703+-0.0250     ?      1.0750+-0.0478        ?
   splice-to-remove                                  11.8197+-0.1963     ?     11.8369+-0.0285        ?
   string-char-code-at                               13.7419+-0.1170           13.7165+-0.0515        
   string-concat-object                               2.1486+-0.0698            2.1321+-0.0623        
   string-concat-pair-object                          2.1322+-0.0985            2.1102+-0.0412          might be 1.0105x faster
   string-concat-pair-simple                          9.2304+-0.1709            9.1721+-0.2021        
   string-concat-simple                               9.3719+-0.2161            9.3657+-0.2099        
   string-cons-repeat                                 6.1075+-0.0452     ?      6.1258+-0.0476        ?
   string-cons-tower                                  6.3469+-0.0645     ?      6.6184+-0.5822        ? might be 1.0428x slower
   string-equality                                   18.2658+-0.0413     ?     18.3156+-0.1398        ?
   string-get-by-val-big-char                         6.4338+-0.0550     ?      6.4703+-0.0742        ?
   string-get-by-val-out-of-bounds-insane             3.0786+-0.0439            3.0509+-0.0565        
   string-get-by-val-out-of-bounds                    3.9401+-0.0407     ?      3.9517+-0.0979        ?
   string-get-by-val                                  2.7562+-0.0264     ?      2.7853+-0.0579        ? might be 1.0106x slower
   string-hash                                        1.7682+-0.0438     ?      1.7694+-0.0181        ?
   string-long-ident-equality                        12.1567+-0.0817     ?     12.2990+-0.2500        ? might be 1.0117x slower
   string-out-of-bounds                              10.7607+-0.1621     ^     10.0345+-0.2769        ^ definitely 1.0724x faster
   string-repeat-arith                               26.8748+-1.3202           25.9759+-0.2009          might be 1.0346x faster
   string-sub                                        54.4029+-0.2548     ^     50.4341+-0.1297        ^ definitely 1.0787x faster
   string-test                                        2.7346+-0.0385     ^      2.6511+-0.0208        ^ definitely 1.0315x faster
   string-var-equality                               25.0081+-0.0847     ?     25.1999+-0.6332        ?
   structure-hoist-over-transitions                   2.3070+-0.0613     ?      2.3373+-0.0217        ? might be 1.0132x slower
   substring-concat-weird                            37.5119+-1.7423           36.1075+-0.3865          might be 1.0389x faster
   substring-concat                                  39.8169+-0.3592           38.9979+-0.7159          might be 1.0210x faster
   substring                                         44.2028+-0.1596           44.0794+-0.2848        
   switch-char-constant                               2.5908+-0.0355            2.5766+-0.0390        
   switch-char                                        5.5349+-0.8283            5.5056+-0.6077        
   switch-constant                                    8.8965+-0.7128            8.1693+-0.3282          might be 1.0890x faster
   switch-string-basic-big-var                       13.4647+-0.0648     ?     13.6749+-0.4676        ? might be 1.0156x slower
   switch-string-basic-big                           15.3930+-3.2755           14.2186+-0.4210          might be 1.0826x faster
   switch-string-basic-var                           12.6572+-0.1176     ?     12.7267+-0.1926        ?
   switch-string-basic                               12.3922+-0.0682     ?     12.3944+-0.1253        ?
   switch-string-big-length-tower-var                17.1714+-0.0378     ?     17.2591+-0.0962        ?
   switch-string-length-tower-var                    12.7102+-0.1795           12.6801+-0.1005        
   switch-string-length-tower                        11.4430+-0.1387           11.4159+-0.0704        
   switch-string-short                               11.4859+-0.0800     ?     11.5287+-0.2144        ?
   switch                                            11.4172+-0.4047           11.0317+-0.3679          might be 1.0349x faster
   tear-off-arguments-simple                          3.0115+-0.0938     ?      3.0135+-0.0891        ?
   tear-off-arguments                                 3.9042+-0.0837     ?      3.9290+-0.0393        ?
   temporal-structure                                11.7858+-0.1488     ?     11.7885+-0.1248        ?
   to-int32-boolean                                  12.1361+-0.0474     ?     12.1410+-0.0487        ?
   try-catch-get-by-val-cloned-arguments             13.6319+-0.1312     ^     13.3566+-0.1058        ^ definitely 1.0206x faster
   try-catch-get-by-val-direct-arguments              6.5285+-0.8618            6.2223+-0.0574          might be 1.0492x faster
   try-catch-get-by-val-scoped-arguments              7.3409+-0.0580            7.2933+-0.0840        
   typed-array-get-set-by-val-profiling              26.2068+-0.4291     ?     26.2997+-0.3264        ?
   undefined-property-access                        224.1710+-1.4354          222.8484+-0.8984        
   undefined-test                                     2.8452+-0.0510            2.7933+-0.0408          might be 1.0186x faster
   unprofiled-licm                                   13.8447+-0.2679           13.4341+-0.1693          might be 1.0306x faster
   varargs-call                                      12.9657+-0.0781     ?     12.9774+-0.0930        ?
   varargs-construct-inline                          21.5682+-0.2146     ?     21.7564+-0.4625        ?
   varargs-construct                                 19.2841+-0.1096           19.2502+-0.0962        
   varargs-inline                                     8.2344+-0.1278     ?      8.2966+-0.0736        ?
   varargs-strict-mode                                8.9471+-0.1015            8.9078+-0.0874        
   varargs                                            8.8835+-0.0719            8.8541+-0.0509        
   weird-inlining-const-prop                          2.0304+-0.1507     ?      2.0457+-0.1232        ?

   &lt;geometric&gt;                                        7.4659+-0.0084     ^      7.4356+-0.0133        ^ definitely 1.0041x faster

                                                        TipOfTree              BetterRangePhase                                 
AsmBench:
   bigfib.cpp                                       457.5862+-5.9917          451.4442+-5.5006          might be 1.0136x faster
   cray.c                                           396.6399+-1.4649     ?    397.1593+-2.9399        ?
   dry.c                                            422.3215+-6.5909     ?    427.4141+-2.5018        ? might be 1.0121x slower
   FloatMM.c                                        684.9059+-2.9661     ?    685.5841+-2.7287        ?
   gcc-loops.cpp                                   3420.6547+-14.2443    ?   3451.4038+-78.5523       ?
   n-body.c                                         826.1157+-4.9183          824.4326+-3.0460        
   Quicksort.c                                      408.1837+-2.5891     ?    408.6560+-2.6194        ?
   stepanov_container.cpp                          3575.2595+-23.9858        3563.6010+-17.5153       
   Towers.c                                         233.4927+-1.2216     ?    234.2791+-2.0311        ?

   &lt;geometric&gt;                                      717.7194+-2.5103     ?    718.4167+-2.2634        ? might be 1.0010x slower

                                                        TipOfTree              BetterRangePhase                                 
CompressionBench:
   huffman                                           59.3516+-0.7379           59.3001+-0.9497        
   arithmetic-simple                                272.1458+-2.0620     ?    273.5842+-3.5567        ?
   arithmetic-precise                               245.2025+-2.5290     ?    246.1637+-2.5285        ?
   arithmetic-complex-precise                       244.1802+-2.8239     ?    249.1379+-4.9275        ? might be 1.0203x slower
   arithmetic-precise-order-0                       281.3200+-1.3554     ?    281.8043+-1.6782        ?
   arithmetic-precise-order-1                       302.0360+-0.7118     ?    328.6138+-61.7783       ? might be 1.0880x slower
   arithmetic-precise-order-2                       352.2339+-3.6777     ?    354.8166+-3.4909        ?
   arithmetic-simple-order-1                        325.4685+-2.6654     ?    326.3462+-2.8219        ?
   arithmetic-simple-order-2                        386.3940+-7.8857          381.1298+-2.9513          might be 1.0138x faster
   lz-string                                        314.2741+-3.4966          310.5375+-4.3828          might be 1.0120x faster

   &lt;geometric&gt;                                      254.5743+-1.2129     ?    256.7024+-4.5282        ? might be 1.0084x slower

                                                        TipOfTree              BetterRangePhase                                 
Geomean of preferred means:
   &lt;scaled-result&gt;                                   50.3760+-0.1162     ?     50.5272+-0.2232        ? might be 1.0030x slower</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119361</commentid>
    <comment_count>8</comment_count>
      <attachid>259496</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-20 14:28:36 -0700</bug_when>
    <thetext>Created attachment 259496
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119363</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-20 14:32:04 -0700</bug_when>
    <thetext>Attachment 259496 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:801:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:819:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1641:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 11 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119441</commentid>
    <comment_count>10</comment_count>
      <attachid>259496</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-08-20 16:35:02 -0700</bug_when>
    <thetext>Comment on attachment 259496
the patch

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

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:527
&gt; +        // This is more vague than other. Other is more specific than this. This is less specific than
&gt; +        // other. Other is less vague than this.
&gt; +        ASSERT(vagueness() &gt; other.vagueness());

Seems redundant with your precondition ASSERTs + the previous branch.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:808
&gt; +                    static_cast&lt;int64_t&gt;(1) + upper - static_cast&lt;int64_t&gt;(thisRight),

If
    thisRight == upper + 3;
the offset is -1. The resulting relation is:
    left &lt; thisRight - 1
which is different from
    left &lt; upper + 1

I have not yet read what follow but I assume you forbid this by API contract. It would be good to make such bounds explicit through a ASSERT_WITH_MESSAGE on entry.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:844
&gt; +                    if (m_offset &gt;= -1 &amp;&amp; m_offset &lt;= 1)

This is a useful check, it would be nice to have a small helper function to name it.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:857
&gt; +                makeUpper(std::max(thisEffectiveRight, otherEffectiveRight));
&gt; +                makeLower(std::min(thisEffectiveRight, otherEffectiveRight));

I was wondering if we could have offsets with constants.

It seems that merging:
    @a &lt; 1
    @a &gt; 0
    @a &gt; 100
    @a &lt; 99
would give us that case.

Do we have tests for that?

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:866
&gt; +                // Other is: @x &lt; otherEffectiveRight
&gt; +                // This is @x == thisEffectiveRight

I would flip the comments to match the switch() order.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:879
&gt; +                // Other is: @x &gt; otherEffectiveRight
&gt; +                // This is: @x == thisEffectiveRight

Ditto.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1484
&gt; +            // - @x &gt; @c and @x != @d where @c == @d + k and k &lt;= 0
&gt; +            //
&gt; +            //       @x &gt; @c and @x &gt; @d - k

I don&apos;t get this one.

Let say @c = 5, @d = 10;
k = -5, @c = @d + k;
    -&gt; @x &gt; @d - (-5) 
    -&gt; @x &gt; 15

Did you mean @x &gt; @d + k here?

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1492
&gt; +            //     that. Otherwise, find all NotEqual constant oeprations and refine them to be LessThan or

typo: &quot;oeprations&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119455</commentid>
    <comment_count>11</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-20 16:52:32 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Comment on attachment 259496 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=259496&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:527
&gt; &gt; +        // This is more vague than other. Other is more specific than this. This is less specific than
&gt; &gt; +        // other. Other is less vague than this.
&gt; &gt; +        ASSERT(vagueness() &gt; other.vagueness());
&gt; 
&gt; Seems redundant with your precondition ASSERTs + the previous branch.

Removed.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:808
&gt; &gt; +                    static_cast&lt;int64_t&gt;(1) + upper - static_cast&lt;int64_t&gt;(thisRight),
&gt; 
&gt; If
&gt;     thisRight == upper + 3;
&gt; the offset is -1. The resulting relation is:
&gt;     left &lt; thisRight - 1
&gt; which is different from
&gt;     left &lt; upper + 1

It is different, but it&apos;s also sound.  During merging, we can create a looser relation - one that is more likely to be true.  It&apos;s correct to say left &lt; x + 1 if we know that left &lt; x.  Here, we want to say left &lt; upper + 1, but we want to say it in terms of thisRight while creating a general relationship (offset is one of -1,0,1).  Since thisRight - 1 is:

    thisRight - 1
  = upper + 3 - 1
  = upper + 2

We are saying that left &lt; upper + 2 instead of saying left &lt; upper +1, which is fine, according to the widening rule.

&gt; 
&gt; I have not yet read what follow but I assume you forbid this by API
&gt; contract. It would be good to make such bounds explicit through a
&gt; ASSERT_WITH_MESSAGE on entry.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:844
&gt; &gt; +                    if (m_offset &gt;= -1 &amp;&amp; m_offset &lt;= 1)
&gt; 
&gt; This is a useful check, it would be nice to have a small helper function to
&gt; name it.

OK, I&apos;ll look at if there is a place to put it.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:857
&gt; &gt; +                makeUpper(std::max(thisEffectiveRight, otherEffectiveRight));
&gt; &gt; +                makeLower(std::min(thisEffectiveRight, otherEffectiveRight));
&gt; 
&gt; I was wondering if we could have offsets with constants.
&gt; 
&gt; It seems that merging:
&gt;     @a &lt; 1
&gt;     @a &gt; 0
&gt;     @a &gt; 100
&gt;     @a &lt; 99
&gt; would give us that case.
&gt; 
&gt; Do we have tests for that?

The two tests I added trigger this.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:866
&gt; &gt; +                // Other is: @x &lt; otherEffectiveRight
&gt; &gt; +                // This is @x == thisEffectiveRight
&gt; 
&gt; I would flip the comments to match the switch() order.

OK!

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:879
&gt; &gt; +                // Other is: @x &gt; otherEffectiveRight
&gt; &gt; +                // This is: @x == thisEffectiveRight
&gt; 
&gt; Ditto.

Fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1484
&gt; &gt; +            // - @x &gt; @c and @x != @d where @c == @d + k and k &lt;= 0
&gt; &gt; +            //
&gt; &gt; +            //       @x &gt; @c and @x &gt; @d - k
&gt; 
&gt; I don&apos;t get this one.
&gt; 
&gt; Let say @c = 5, @d = 10;
&gt; k = -5, @c = @d + k;
&gt;     -&gt; @x &gt; @d - (-5) 
&gt;     -&gt; @x &gt; 15
&gt; 
&gt; Did you mean @x &gt; @d + k here?

It&apos;s a good thing I didn&apos;t implement this case!  You&apos;re right, I fixed the comment.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1492
&gt; &gt; +            //     that. Otherwise, find all NotEqual constant oeprations and refine them to be LessThan or
&gt; 
&gt; typo: &quot;oeprations&quot;

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1119488</commentid>
    <comment_count>12</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-20 17:27:07 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/188720</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258001</attachid>
            <date>2015-08-01 00:56:13 -0700</date>
            <delta_ts>2015-08-01 01:08:09 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>19296</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAxODc2ODIpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQwLDE1ICsyNDAsMTYgQEAgcHVibGljOgogICAgICAg
ICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvLyBBdHRlbXB0cyB0byBjcmVhdGUgYSByZWxh
dGlvbnNoaXAgdGhhdCBzdW1tYXJpemVzIHRoZSB1bmlvbiBvZiB0aGlzIHJlbGF0aW9uc2hpcCBh
bmQKLSAgICAvLyB0aGUgb3RoZXIgcmVsYXRpb25zaGlwLiBUaGUgbnVsbCByZWxhdGlvbnNoaXAg
aXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgVE9QLiBUaGlzIGlzIHVzZWQKKyAgICAvLyBBdHRlbXB0
cyB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyB0aGF0IHN1bW1hcml6ZSB0aGUgdW5pb24gb2YgdGhp
cyByZWxhdGlvbnNoaXAgYW5kCisgICAgLy8gdGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gUmVsYXRp
b25zaGlwcyBhcmUgcmV0dXJuZWQgYnkgY2FsbGluZyB0aGUgZnVuY3RvciB3aXRoIHRoZSBuZXds
eQorICAgIC8vIGNyZWF0ZWQgcmVsYXRpb25zaGlwcy4gTm8gcmVsYXRpb25zaGlwcyBhcmUgY3Jl
YXRlZCB0byBpbmRpY2F0ZSBUT1AuIFRoaXMgaXMgdXNlZAogICAgIC8vIGZvciBtZXJnaW5nIHRo
ZSBjdXJyZW50IHJlbGF0aW9uc2hpcC1hdC1oZWFkIGZvciBzb21lIHBhaXIgb2Ygbm9kZXMgYW5k
IGEgbmV3CiAgICAgLy8gcmVsYXRpb25zaGlwLWF0LWhlYWQgYmVpbmcgcHJvcG9zZWQgYnkgYSBw
cmVkZWNlc3Nvci4gV2Ugd2lzaCB0byBjcmVhdGUgYSBuZXcKICAgICAvLyByZWxhdGlvbnNoaXAg
dGhhdCBpcyB0cnVlIHdoZW5ldmVyIGVpdGhlciBvZiB0aGVtIGFyZSB0cnVlLCB3aGljaCBlbnN1
cmluZyB0aGF0IHdlIGRvbid0CiAgICAgLy8gZG8gdGhpcyBmb3JldmVyLiBBbnl0aW1lIHdlIGNy
ZWF0ZSBhIHJlbGF0aW9uc2hpcCB0aGF0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgb2YgdGhlCiAg
ICAgLy8gcHJldmlvdXMgb25lcywgd2Ugd2lsbCBjYXVzZSB0aGUgYW5hbHlzaXMgZml4cG9pbnQg
dG8gcmVleGVjdXRlLgogICAgIC8vCi0gICAgLy8gSWYgKnRoaXMgYW5kIG90aGVyIGFyZSBpZGVu
dGljYWwsIHdlIGp1c3QgcmV0dXJuIGl0LgorICAgIC8vIElmICp0aGlzIGFuZCBvdGhlciBhcmUg
aWRlbnRpY2FsLCB3ZSBqdXN0IHBhc3MgaXQgdG8gdGhlIGZ1bmN0b3IuCiAgICAgLy8KICAgICAv
LyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHdlIHBpY2sgZnJvbSBhIGZpbml0ZSBzZXQgb2YgImdl
bmVyYWwiIHJlbGF0aW9uc2hpcHM6CiAgICAgLy8KQEAgLTI3OSwxMyArMjgwLDEyIEBAIHB1Ymxp
YzoKICAgICAvLyAgIHRoYXQncyBob3cgImRlZXAiIHRoZSBnZW5lcmFsIHJlbGF0aW9uc2hpcCBs
YXR0aWNlIGlzLgogICAgIC8vCiAgICAgLy8gTm90ZSB0aGF0IEMgYmVpbmcgY29uc3RyYWluZWQg
dG8gLTEsMCwxIGFsc28gZW5zdXJlcyB0aGF0IHdlIG5ldmVyIGhhdmUgdG8gcmV0dXJuIGEKLSAg
ICAvLyBjb21iaW5hdGlvbiBvZiBMdCBhbmQgR3QsIGFzIGluIGZvciBleGFtcGxlIHRoaXM8b3Ro
ZXIrQyAmJiB0aGlzPm90aGVyLUQuIFRoYXQncyB3aHkKLSAgICAvLyB0aGlzIGZ1bmN0aW9uIGNh
biByZXR1cm4gemVybyBvciBvbmUgcmVsYXRpb25zaGlwcyByYXRoZXIgdGhhbiBhIGxpc3Qgb2Yg
cmVsYXRpb25zaGlwcy4KLSAgICAvLyBUaGUgb25seSBwb3NzaWJsZSB2YWx1ZXMgb2YgQyBhbmQg
RCB3aGVyZSB0aGlzIHdvdWxkIHdvcmsgYXJlIC0xIGFuZCAxLCBidXQgaW4gdGhhdCBjYXNlCi0g
ICAgLy8gd2UganVzdCBzYXkgdGhpcz09b3RoZXIuIFRoYXQgc2FpZCwgdGhlIGxvZ2ljIGZvciBt
ZXJnaW5nIHR3byA9PSByZWxhdGlvbnNoaXBzLCBsaWtlCi0gICAgLy8gdGhpcz09b3RoZXIrQyB8
fCB0aGlzPT1vdGhlcitEIGlzIHRvIGF0dGVtcHQgdG8gY3JlYXRlIHRoZXNlIHR3byByZWxhdGlv
bnNoaXBzOgotICAgIC8vIHRoaXM+b3RoZXIrbWluKEMsRCktMSAmJiB0aGlzPG90aGVyK21heChD
LEQpKzEuIEJ1dCBvbmx5IG9uZSBvZiB0aGVzZSByZWxhdGlvbnNoaXBzIHdpbGwKLSAgICAvLyBi
ZWxvbmcgdG8gdGhlIHNldCBvZiBnZW5lcmFsIHJlbGF0aW9uc2hpcHMuCisgICAgLy8gY29tYmlu
YXRpb24gb2YgTHQgYW5kIEd0LCBhcyBpbiBmb3IgZXhhbXBsZSB0aGlzPG90aGVyK0MgJiYgdGhp
cz5vdGhlci1ELiBUaGUgb25seSBwb3NzaWJsZQorICAgIC8vIHZhbHVlcyBvZiBDIGFuZCBEIHdo
ZXJlIHRoaXMgd291bGQgd29yayBhcmUgLTEgYW5kIDEsIGJ1dCBpbiB0aGF0IGNhc2Ugd2UganVz
dCBzYXkKKyAgICAvLyB0aGlzPT1vdGhlci4gVGhhdCBzYWlkLCB0aGUgbG9naWMgZm9yIG1lcmdp
bmcgdHdvID09IHJlbGF0aW9uc2hpcHMsIGxpa2UgdGhpcz09b3RoZXIrQyB8fAorICAgIC8vIHRo
aXM9PW90aGVyK0QgaXMgdG8gYXR0ZW1wdCB0byBjcmVhdGUgdGhlc2UgdHdvIHJlbGF0aW9uc2hp
cHM6IHRoaXM+b3RoZXIrbWluKEMsRCktMSAmJgorICAgIC8vIHRoaXM8b3RoZXIrbWF4KEMsRCkr
MS4gQnV0IG9ubHkgb25lIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMgd2lsbCBiZWxvbmcgdG8gdGhl
IHNldCBvZiBnZW5lcmFsCisgICAgLy8gcmVsYXRpb25zaGlwcy4KICAgICAvLwogICAgIC8vIEhl
cmUncyBhbiBleGFtcGxlIG9mIHRoaXMgaW4gYWN0aW9uOgogICAgIC8vCkBAIC0yOTcsMTQgKzI5
Nyw3MCBAQCBwdWJsaWM6CiAgICAgLy8gaXRlcmF0aW9uIGFuZCBpPT1hKzEgZnJvbSB0aGUgc2Vj
b25kIGl0ZXJhdGlvbiwgd2UgY3JlYXRlIGk+YS0xIGFuZCBpPGErMiBidXQgdGhlbgogICAgIC8v
IHJlYWxpemUgdGhhdCBvbmx5IGk+YS0xIGlzIGEgdmFsaWQgZ2VuZXJhbCByZWxhdGlvbnNoaXAu
IFRoaXMgZ2l2ZXMgdXMgZXhhY3RseSB3aGF0IHdlCiAgICAgLy8gd2FudDogYSBzdGF0ZW1lbnQg
dGhhdCBpPj1hLgotICAgIFJlbGF0aW9uc2hpcCBtZXJnZShjb25zdCBSZWxhdGlvbnNoaXAmIG90
aGVyKSBjb25zdAorICAgIC8vCisgICAgLy8gSG93ZXZlciwgdGhpcyBtYXkgcmV0dXJuIGEgcGFp
ciBvZiByZWxhdGlvbnNoaXBzIHdoZW4gbWVyZ2luZyByZWxhdGlvbnNoaXBzIGludm9sdmluZwor
ICAgIC8vIGNvbnN0YW50cy4gRm9yIGV4YW1wbGUsIGlmIGdpdmVuOgorICAgIC8vCisgICAgLy8g
ICAgIEB4ID09IEBjCisgICAgLy8gICAgIEB4ID09IEBkCisgICAgLy8KKyAgICAvLyB3aGVyZSBA
YyBhbmQgQGQgYXJlIGNvbnN0YW50cywgdGhlbiB0aGlzIG1heSBwYXNzIHR3byByZWxhdGlvbnNo
aXBzIHRvIHRoZSBmdW5jdG9yOgorICAgIC8vCisgICAgLy8gICAgIEB4ID4gbWluKEBjLCBAZCkg
LSAxCisgICAgLy8gICAgIEB4IDwgbWF4KEBjLCBAZCkgKyAxCisgICAgLy8KKyAgICAvLyBUaGlz
IHN0aWxsIGFsbG93cyBmb3IgY29udmVyZ2VuY2UsIGJlY2F1c2UganVzdCBhcyB3aGVuIG1lcmdp
bmcgcmVsYXRpb25zaGlwcyBvdmVyCisgICAgLy8gdmFyaWFibGVzLCB0aGlzIGFsd2F5cyBwaWNr
cyBmcm9tIGEgc2V0IG9mIGdlbmVyYWwgcmVsYXRpb25zaGlwcy4gSGVuY2UgYWx0aG91Z2ggdGhp
cyBtYXkKKyAgICAvLyBwcm9kdWNlIHR3byByZWxhdGlvbnNoaXBzIGFzIGEgcmVzdWx0IG9mIHRo
ZSBtZXJnZSwgdGhlIHRvdGFsIG51bWJlciBvZiByZWxhdGlvbnNoaXBzIHRoYXQKKyAgICAvLyBj
YW4gYmUgcHJlc2VudCBhdCBoZWFkIG9mIGJsb2NrIGlzIGxpbWl0ZWQgYnkgTyhncmFwaC5zaXpl
XjIpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZShjb25z
dCBSZWxhdGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAogICAg
IHsKLSAgICAgICAgaWYgKCFzYW1lTm9kZXNBcyhvdGhlcikpCi0gICAgICAgICAgICByZXR1cm4g
UmVsYXRpb25zaGlwKCk7Ci0gICAgICAgIAogICAgICAgICAvLyBIYW5kbGUgdGhlIHN1cGVyIG9i
dmlvdXMgY2FzZSBmaXJzdC4KLSAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKQotICAgICAgICAg
ICAgcmV0dXJuICp0aGlzOworICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAg
ICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBib29sIGxlZnRTYW1lID0gbV9sZWZ0ID09IG90aGVyLm1fbGVmdDsKKyAg
ICAgICAgYm9vbCByaWdodFNhbWUgPSBtX3JpZ2h0ID09IG90aGVyLm1fcmlnaHQ7CisKKyAgICAg
ICAgaWYgKCFsZWZ0U2FtZSAmJiAhcmlnaHRTYW1lKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAKKyAgICAgICAgaWYgKCFsZWZ0U2FtZSB8fCAhcmlnaHRTYW1lKSB7CisgICAgICAgICAg
ICBBU1NFUlQobGVmdFNhbWUgfHwgcmlnaHRTYW1lKTsKKworICAgICAgICAgICAgLy8gSXQncyBw
b3NzaWJsZSB0aGF0IHdlIGhhdmUgdHdvIGNvbnN0YW50cywgQGMgYW5kIEBkLCBhbmQgc29tZSBu
b2RlIEB4LCB3aXRoIHR3bworICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwcyBsaWtlIHRoaXM6
CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgIEB4PkBjLTEKKyAgICAgICAgICAg
IC8vICAgICBAeDxAZCsxCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVW5sZXNzIHdl
IGRvIHNvbWV0aGluZyBzcGVjaWFsLCB0aGVzZSByZWxhdGlvbnNoaXBzIHdpbGwgZGllIGR1cmlu
ZyB0aGUgbWVyZ2UuIEJ1dAorICAgICAgICAgICAgLy8gd2UgbWF5IHdpc2ggdG8ga2VlcCBib3Ro
IHJlbGF0aW9uc2hpcHMsIGlmIHdlIGtub3cgdGhhdCBAZCBpcyBncmVhdGVyIHRoYW4gQGMuCisK
KyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBhID0gKnRoaXM7CisgICAgICAgICAgICBSZWxhdGlv
bnNoaXAgYiA9IG90aGVyOworICAgICAgICAgICAgYm9vbCBuZWVkRmxpcCA9IGZhbHNlOworCisg
ICAgICAgICAgICBpZiAocmlnaHRTYW1lKSB7CisgICAgICAgICAgICAgICAgYSA9IGEuZmxpcHBl
ZCgpOworICAgICAgICAgICAgICAgIGIgPSBiLmZsaXBwZWQoKTsKKyAgICAgICAgICAgICAgICBu
ZWVkRmxpcCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEubWVyZ2VDb25z
dGFudHNJbXBsKAorICAgICAgICAgICAgICAgIGIsIFsmXSAoUmVsYXRpb25zaGlwIHJlc3VsdCkg
eworICAgICAgICAgICAgICAgICAgICBpZiAobmVlZEZsaXApCisgICAgICAgICAgICAgICAgICAg
ICAgICByZXN1bHQgPSByZXN1bHQuZmxpcHBlZCgpOworICAgICAgICAgICAgICAgICAgICBmdW5j
dG9yKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQVNTRVJUKGxlZnRTYW1l
ICYmIHJpZ2h0U2FtZSk7CiAgICAgICAgIAogICAgICAgICAvLyBUaGlzIGRvZXMgc29tZSBpbnRl
cmVzdGluZyBwZXJtdXRhdGlvbnMgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZHVwbGljYXRlIGNv
ZGUuIEZvcgogICAgICAgICAvLyBleGFtcGxlOgpAQCAtMzMxLDcgKzM4Nyw3IEBAIHB1YmxpYzoK
ICAgICAgICAgICAgIC8vIEluIHJhcmUgY2FzZXMsIHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvIGZs
aXAuIEp1c3QgZ2l2ZSB1cCBvbiBsaWZlIGluIHRob3NlCiAgICAgICAgICAgICAvLyBjYXNlcy4K
ICAgICAgICAgICAgIGlmICghYSB8fCAhYikKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRp
b25zaGlwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgCiAgICAgICAg
ICAgICBuZWVkRmxpcCA9IHRydWU7CiAgICAgICAgICAgICAKQEAgLTMzOSw3ICszOTUsNyBAQCBw
dWJsaWM6CiAgICAgICAgICAgICAvLyBAYSA+IEBiLiBUaGF0J3MgcHJldHR5IG11Y2ggYWx3YXlz
IGEgdGF1dG9sb2d5OyB3ZSBkb24ndCBhdHRlbXB0IHRvIGRvIHNtYXJ0CiAgICAgICAgICAgICAv
LyB0aGluZ3MgZm9yIHRoYXQgY2FzZSBmb3Igbm93LgogICAgICAgICAgICAgaWYgKGEubV9raW5k
ID09IEdyZWF0ZXJUaGFuIHx8IGIubV9raW5kID09IEdyZWF0ZXJUaGFuKQotICAgICAgICAgICAg
ICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYSBM
ZXNzVGhhbiwgdGhlbiBpdCdzIGZpcnN0LgpAQCAtMzUxLDExICs0MDcsMTMgQEAgcHVibGljOgog
ICAgICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOwogICAgICAgICAKICAgICAgICAgUmVsYXRpb25z
aGlwIHJlc3VsdCA9IGEubWVyZ2VJbXBsKGIpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgCiAgICAgICAgIGlmIChuZWVkRmxpcCkKLSAgICAgICAg
ICAgIHJldHVybiByZXN1bHQuZmxpcHBlZCgpOworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0
LmZsaXBwZWQoKTsKICAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGZ1
bmN0b3IocmVzdWx0KTsKICAgICB9CiAgICAgCiAgICAgLy8gQXR0ZW1wdHMgdG8gY29uc3RydWN0
IG9uZSBSZWxhdGlvbnNoaXAgdGhhdCBhZGVxdWF0ZWx5IHN1bW1hcml6ZXMgdGhlIGludGVyc2Vj
dGlvbiBvZgpAQCAtNjY4LDYgKzcyNiwxODggQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgICAg
IHJldHVybiBncmVhdGVyVGhhbjsKICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
dG9yPgorICAgIHZvaWQgbWVyZ2VDb25zdGFudHNJbXBsKFJlbGF0aW9uc2hpcCBvdGhlciwgY29u
c3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBUaGlz
IGRvZXNuJ3QgaGF2ZSB0byBiZSBhIGZ1bmN0b3IhCisgICAgICAgIAorICAgICAgICBBU1NFUlQo
bV9sZWZ0ID09IG90aGVyLm1fbGVmdCk7CisKKyAgICAgICAgLy8gT25seSBkZWFsIHdpdGggY29u
c3RhbnQgcmlnaHQuCisgICAgICAgIGlmICghbV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkgfHwg
IW90aGVyLm1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGZhaXJseSBjb25zZXJ2YXRpdmUgbWVyZ2Uu
IFdlIGNvdWxkIHR1bmUgdGhpcyBwaGFzZSB0byBjb21lIHVwIHdpdGgKKyAgICAgICAgLy8gYWxs
IHBvc3NpYmxlIGluZXF1YWxpdGllcyBiZXR3ZWVuIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzLCBi
dXQgd2UgZm9jdXMgbWFpbmx5IG9uIGNoZWFwCisgICAgICAgIC8vIGNhc2VzIGZvciBub3cuCisK
KyAgICAgICAgLy8gSWdub3JlIHdlaXJkIG9mZnNldHMuIFRoaXMgaXNuJ3QgdG90YWxseSBuZWNl
c3NhcnkgLSB3ZSBjb3VsZCBpbnN0ZWFkIGp1c3QgYXZvaWQKKyAgICAgICAgLy8gY3JlYXRpbmcg
bm9uLWdlbmVyYWwgb2Zmc2V0cyB3aGVuIHRoZSBtZXJnZSByZXN1bHRzIGluIGEgbmV3IGNvbmRp
dGlvbi4gQnV0IHRoaXMKKyAgICAgICAgLy8gc2ltcGxpZmllcyB0aGUgbG9naWMgb2YgdGhlIG1l
cmdlIHJ1bGVzLgorICAgICAgICBpZiAobV9vZmZzZXQgPCAtMSB8fCBtX29mZnNldCA+IDEgfHwg
b3RoZXIubV9vZmZzZXQgPCAtMSB8fCBvdGhlci5tX29mZnNldCA+IDEpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgLy8gSGVyZSBhcmUgc29tZSBvZiB0aGUgdGhlIGFycmFuZ2VtZW50
cyB3ZSBjYW4gbWVyZ2UgdXNlZnVsbHkgYXNzdW1pbmcgQGMgPCBAZDoKKyAgICAgICAgLy8KKyAg
ICAgICAgLy8gICAgIEB4ID09IEBjLCBAeCA9PSBAZCA9PiBAeCA+PSBjLCBAeCA8PSBAZAorICAg
ICAgICAvLyAgICAgQHggPj0gQGMsIEB4IDw9IEBkID0+IEB4ID49IGMsIEB4IDw9IEBkCisgICAg
ICAgIC8vICAgICBAeCA9PSBAYywgQHggIT0gQGQgPT4gQHggIT0gQGQKKworICAgICAgICBpbnQg
dGhpc1JpZ2h0ID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICBpbnQgb3RoZXJSaWdodCA9
IG90aGVyLm1fcmlnaHQtPmFzSW50MzIoKTsKKworICAgICAgICAvLyBJZ25vcmUgZnVubnkgYnVz
aW5lc3MuCisgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50Pih0aGlzUmlnaHQsIG1fb2Zmc2V0
KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG90
aGVyUmlnaHQsIG90aGVyLm1fb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICBpbnQgdGhpc0VmZmVjdGl2ZVJpZ2h0ID0gdGhpc1JpZ2h0ICsgbV9vZmZzZXQ7CisgICAgICAg
IGludCBvdGhlckVmZmVjdGl2ZVJpZ2h0ID0gb3RoZXJSaWdodCArIG90aGVyLm1fb2Zmc2V0Owor
CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgRXF1YWw6IHsKKyAgICAg
ICAgICAgIC8vIE9ubHkgZGVhbCB3aXRoIHdpdGggRXF1YWxpdHkgaWYgdGhlIG9mZnNldCBpcyB6
ZXJvLiBUaGlzIG1ha2VzIHRoaW5ncyBlYXNpZXIgYW5kIGl0CisgICAgICAgICAgICAvLyBjYXB0
dXJlcyB0aGUgbW9zdCBpbnRlcmVzdGluZyBjYXNlcy4KKyAgICAgICAgICAgIGlmIChtX29mZnNl
dCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3
aXRjaCAob3RoZXIubV9raW5kKSB7CisgICAgICAgICAgICBjYXNlIEVxdWFsOiB7CisgICAgICAg
ICAgICAgICAgaWYgKG90aGVyLm1fb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgICAgICAgICBpZiAodGhpc1JpZ2h0ID09IG90aGVyUmlnaHQpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gU3VwZXIgcmFyZS4gQ1NFIGRpZG4ndCBkbyBpdHMgam9iLiBCdXQs
IHdlIGhhbmRsZSBpdCBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMp
OworICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKG90aGVyKTsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlz
UmlnaHQgPCBvdGhlclJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRp
b25zaGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRlclRoYW4sIC0xKSk7CisgICAgICAgICAgICAg
ICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgb3RoZXIubV9yaWdodCwgTGVzc1Ro
YW4sIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgb3RoZXIubV9y
aWdodCwgR3JlYXRlclRoYW4sIC0xKSk7CisgICAgICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlv
bnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgMSkpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBMZXNzVGhhbjogeworICAg
ICAgICAgICAgICAgIC8vIEVpdGhlciB0aGUgTGVzc1RoYW4gY29uZGl0aW9uIHN1YnN1bWVzIHRo
ZSBlcXVhbGl0eSwgb3IgdGhlIExlc3NUaGFuIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgIC8v
IGFuZCBlcXVhbGl0eSBtZXJnZSB0b2dldGhlciB0byBjcmVhdGUgYSBsb29zZXIgTGVzc1RoYW4g
Y29uZGl0aW9uLgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXIgaXM6IEB4IDwgb3RoZXJFZmZl
Y3RpdmVSaWdodAorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgQHggPT0gdGhpc1JpZ2h0CisK
KyAgICAgICAgICAgICAgICBpZiAob3RoZXJFZmZlY3RpdmVSaWdodCA8PSB0aGlzUmlnaHQpIHsK
KyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIEB4IDw9IHRoaXNSaWdodAorICAgICAgICAg
ICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFu
LCAxKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICBmdW5jdG9yKG90aGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR3JlYXRlclRoYW46IHsKKyAgICAg
ICAgICAgICAgICAvLyBPcHBvc2l0ZSBvZiB0aGUgTGVzc1RoYW4gY2FzZSwgYWJvdmUuCisKKyAg
ICAgICAgICAgICAgICAvLyBPdGhlciBpczogQHggPiBvdGhlckVmZmVjdGl2ZVJpZ2h0CisgICAg
ICAgICAgICAgICAgLy8gVGhpcyBpczogQHggPT0gdGhpc1JpZ2h0CisKKyAgICAgICAgICAgICAg
ICBpZiAob3RoZXJFZmZlY3RpdmVSaWdodCA+PSB0aGlzUmlnaHQpIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gQ3JlYXRlIEB4ID49IHRoaXNSaWdodAorICAgICAgICAgICAgICAgICAgICBmdW5j
dG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEdyZWF0ZXJUaGFuLCAtMSkpOworICAg
ICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgZnVuY3RvcihvdGhlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBjYXNlIE5vdEVxdWFsOiB7CisgICAgICAgICAgICAgICAgLy8g
V2Uga2VlcCB0aGUgTm90RXF1YWwgc28gbG9uZyBhcyBpdCBkb2Vzbid0IGNvbnRyYWRpY3Qgb3Vy
IEVxdWFsLgorICAgICAgICAgICAgICAgIGlmIChvdGhlckVmZmVjdGl2ZVJpZ2h0ID09IHRoaXNS
aWdodCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgZnVu
Y3RvcihvdGhlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSB9CisK
KyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExlc3NUaGFuOiB7CisgICAgICAgICAg
ICBzd2l0Y2ggKG90aGVyLm1fa2luZCkgeworICAgICAgICAgICAgY2FzZSBFcXVhbDogeworICAg
ICAgICAgICAgICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhpcywgZnVuY3Rvcik7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNl
IExlc3NUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8gS2VlcCB0aGUgb25lIHRoYXQgaGFzIGEg
bGFyZ2VyIGNvbnN0YW50LCBvciBrZWVwIGJvdGggaW4gdGhlIHdlaXJkIGNhc2Ugd2hlcmUKKyAg
ICAgICAgICAgICAgICAvLyB0aGV5IGJvdGggbWVhbiB0aGUgc2FtZSB0aGluZy4KKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAodGhpc0VmZmVjdGl2ZVJpZ2h0ID09IG90aGVy
RWZmZWN0aXZlUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7Cisg
ICAgICAgICAgICAgICAgICAgIGZ1bmN0b3Iob3RoZXIpOworICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXNFZmZl
Y3RpdmVSaWdodCA+IG90aGVyRWZmZWN0aXZlUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAg
ZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICBmdW5jdG9yKG90aGVyKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR3JlYXRlclRoYW46
IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgY2xhaW0gdGhhdCBAeCA+IEBjIHx8IEB4
IDwgQGQuIElmIEBkID4gQGMsIHRoaXMgaXMgdGhlIHRhdXRvbG9neS4gSWYKKyAgICAgICAgICAg
ICAgICAvLyBAZCA8PSBAYywgaXQncyBzb3J0IG9mIHVuaW50ZXJlc3RpbmcuIEp1c3QgaWdub3Jl
IHRoaXMuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBjYXNlIE5vdEVxdWFsOiB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGNsYWlt
IHRoYXQgQHggPCBAYyB8fCBAeCAhPSBAZC4gVGhpcyBpc24ndCBpbnRlcmVzdGluZy4KKyAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46IHsKKyAgICAgICAgICAgIGNh
c2UgKG90aGVyLm1fa2luZCkgeworICAgICAgICAgICAgY2FzZSBFcXVhbDogeworICAgICAgICAg
ICAgICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhpcywgZnVuY3Rvcik7CisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIExlc3NU
aGFuOiB7CisgICAgICAgICAgICAgICAgLy8gTm90IGludGVyZXN0aW5nLCBzZWUgYWJvdmUuCisg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNl
IEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8gS2VlcCB0aGUgb25lIHdpdGggdGhl
IHNtYWxsZXIgY29uc3RhbnQgb3Iga2VlcCBib3RoLgorICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIGlmICh0aGlzRWZmZWN0aXZlUmlnaHQgPT0gb3RoZXJFZmZlY3RpdmVSaWdodCkg
eworICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgICAgICAg
ICAgZnVuY3RvcihvdGhlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KICAgICAKICAgICBOb2RlKiBtX2xlZnQ7CiAgICAgTm9kZSogbV9yaWdodDsK
QEAgLTEyNDMsNTAgKzE0ODMsNDggQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICBmb3IgKFJl
bGF0aW9uc2hpcCBzb3VyY2VSZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgewogICAgICAgICAg
ICAgICAgICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2co
IiAgTWVyZ2luZyAiLCB0YXJnZXRSZWxhdGlvbnNoaXAsICIgYW5kICIsIHNvdXJjZVJlbGF0aW9u
c2hpcCwgIjpcbiIpOwotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRp
b25zaGlwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlbGF0aW9uc2hpcC5tZXJn
ZShzb3VyY2VSZWxhdGlvbnNoaXApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIg
ICAgR290ICIsIG5ld1JlbGF0aW9uc2hpcCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1JlbGF0aW9uc2hpcCkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAg
ICAgICAgLy8gV2UgbmVlZCB0byBmaWx0ZXIoKSB0byBhdm9pZCBleHBvbmVudGlhbCBleHBsb3Np
b24gb2YgaWRlbnRpY2FsCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuIFdl
IGRvIHRoaXMgaGVyZSB0byBhdm9pZCBtYWtpbmcgc2V0T25lU2lkZSgpIGRvCi0gICAgICAgICAg
ICAgICAgICAgIC8vIG1vcmUgd29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNpZGUoKSB3aWxs
IGJlIGNhbGxlZCBtb3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW50bHkuIEhlcmUn
cyBhbiBleGFtcGxlLiBBdCBzb21lIHBvaW50IHNvbWVvbmUgbWlnaHQgc3RhcnQKLSAgICAgICAg
ICAgICAgICAgICAgLy8gd2l0aCB0d28gcmVsYXRpb25zaGlwcyBsaWtlIEBhID4gQGIgLSBDIGFu
ZCBAYSA8IEBiICsgRC4gVGhlbgotICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMg
YSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCi0gICAgICAg
ICAgICAgICAgICAgIC8vIGJvdGggb2YgdGhlc2UgaW50byBAYSA9PSBAYi4gTm93IHdlIGhhdmUg
QGEgPT0gQGIgZHVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3Mgc2F5IHRo
YXQgdGhpcyBkdXBsaWNhdGUgQGEgPT0gQGIgZW5kcyB1cCBhdCB0aGUgaGVhZCBvZiBhCi0gICAg
ICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhl
biB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGlj
YXRlIEBhID09IEBiJ3Mgb250byB0aGUgZXhpc3RpbmcgZHVwbGljYXRlIEBhID09IEBiJ3MuCi0g
ICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdvdWxkIGJlIGZvdXIgcGFpcnMgb2YgQGEgPT0g
QGIsIGVhY2ggb2Ygd2hpY2ggd291bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEg
bmV3IEBhID09IEBiLiBOb3cgd2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGljYXRlcwotICAg
ICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIG5leHQgdGltZSBhcm91bmQgd2UnZCBoYXZlIDgs
IHRoZW4gMTYsIGV0Yy4gV2UgYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBoZXJl
IGJ5IGRvaW5nIHRoaXMgZmlsdHJhdGlvbi4gVGhhdCBtaWdodCBiZSBhIGJpdCBvZgotICAgICAg
ICAgICAgICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBwcm9iYWJseSBqdXN0IHRoZSBp
ZGVudGljYWwgZHVwbGljYXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcCBj
YXNlIHdlIHdhbnQnIHRvIGF2b2lkLiBCdXQsIEknbGwga2VlcCB0aGlzIHVudGlsCi0gICAgICAg
ICAgICAgICAgICAgIC8vIHdlIGhhdmUgZXZpZGVuY2UgdGhhdCB0aGlzIGlzIGEgcGVyZm9ybWFu
Y2UgcHJvYmxlbS4gUmVtZW1iZXIgLQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYWxy
ZWFkeSBkZWFsaW5nIHdpdGggYSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8KLSAgICAgICAg
ICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwcyB3aXRoIGlkZW50aWNhbCBsZWZ0IG9wZXJhbmQu
IEl0IHNob3VsZG4ndCBiZSBhCi0gICAgICAgICAgICAgICAgICAgIC8vIGxhcmdlIGxpc3QuCi0g
ICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAg
ICAgZm9yIChSZWxhdGlvbnNoaXAmIGV4aXN0aW5nUmVsYXRpb25zaGlwIDogbWVyZ2VkUmVsYXRp
b25zaGlwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUmVsYXRpb25z
aGlwLnNhbWVOb2Rlc0FzKG5ld1JlbGF0aW9uc2hpcCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBleGlzdGluZ1JlbGF0aW9uc2hpcC5maWx0ZXIobmV3UmVsYXRpb25zaGlwKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWQpIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVsYXRp
b25zaGlwLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUmVsYXRpb25zaGlw
LAorICAgICAgICAgICAgICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25z
aGlwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3UmVsYXRpb25z
aGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2b2lkIGV4cG9uZW50aWFs
IGV4cGxvc2lvbiBvZiBpZGVudGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBy
ZWxhdGlvbnNoaXBzLiBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgbWFraW5nIHNldE9uZVNpZGUo
KSBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgd29yaywgc2luY2Ugd2Ug
ZXhwZWN0IHNldE9uZVNpZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0IHNvbWUgcG9p
bnQgc29tZW9uZSBtaWdodCBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdp
dGggdHdvIHJlbGF0aW9uc2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEgPCBAYiArIEQuIFRo
ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMgYSBzZXRSZWxh
dGlvbnNoaXAoKSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gYm90aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBOb3cgd2UgaGF2ZSBA
YSA9PSBAYiBkdXBsaWNhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdz
IHNheSB0aGF0IHRoaXMgZHVwbGljYXRlIEBhID09IEBiIGVuZHMgdXAgYXQgdGhlIGhlYWQgb2Yg
YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRpZG4ndCBoYXZl
IHRoaXMgcnVsZSwgdGhlbiB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRoZSBleGlzdGluZyBk
dXBsaWNhdGUgQGEgPT0gQGIncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVy
ZSB3b3VsZCBiZSBmb3VyIHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdoaWNoIHdvdWxkCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBhID09IEBiLiBOb3cg
d2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGljYXRlcworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGFuZCB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUgOCwgdGhlbiAxNiwg
ZXRjLiBXZSBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaGVyZSBi
eSBkb2luZyB0aGlzIGZpbHRyYXRpb24uIFRoYXQgbWlnaHQgYmUgYSBiaXQgb2YKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBwcm9iYWJseSBqdXN0
IHRoZSBpZGVudGljYWwgZHVwbGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
cmVsYXRpb25zaGlwIGNhc2Ugd2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwgSSdsbCBrZWVwIHRoaXMg
dW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGV2aWRlbmNlIHRo
YXQgdGhpcyBpcyBhIHBlcmZvcm1hbmNlIHByb2JsZW0uIFJlbWVtYmVyIC0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGggYSBsaXN0IHRo
YXQgaXMgcHJ1bmVkIGRvd24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxh
dGlvbnNoaXBzIHdpdGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hvdWxkbid0IGJlIGEK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXJnZSBsaXN0LgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYgZXhpc3RpbmdSZWxhdGlvbnNoaXAgOiBtZXJnZWRS
ZWxhdGlvbnNoaXBzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlz
dGluZ1JlbGF0aW9uc2hpcC5zYW1lTm9kZXNBcyhuZXdSZWxhdGlvbnNoaXApKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVsYXRpb25zaGlw
LmZpbHRlcihuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGZpbHRlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlm
ICghZm91bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRSZWxhdGlvbnNoaXBzLmFw
cGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1lcmdlZFJlbGF0aW9uc2hpcHMuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7
CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICBzdGQ6OnNvcnQobWVyZ2VkUmVsYXRpb25zaGlwcy5iZWdpbigp
LCBtZXJnZWRSZWxhdGlvbnNoaXBzLmVuZCgpKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258002</attachid>
            <date>2015-08-01 01:08:09 -0700</date>
            <delta_ts>2015-08-19 20:01:51 -0700</delta_ts>
            <desc>maybe it&apos;ll work</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>18695</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAxODc2ODIpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQwLDE1ICsyNDAsMTYgQEAgcHVibGljOgogICAgICAg
ICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvLyBBdHRlbXB0cyB0byBjcmVhdGUgYSByZWxh
dGlvbnNoaXAgdGhhdCBzdW1tYXJpemVzIHRoZSB1bmlvbiBvZiB0aGlzIHJlbGF0aW9uc2hpcCBh
bmQKLSAgICAvLyB0aGUgb3RoZXIgcmVsYXRpb25zaGlwLiBUaGUgbnVsbCByZWxhdGlvbnNoaXAg
aXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgVE9QLiBUaGlzIGlzIHVzZWQKKyAgICAvLyBBdHRlbXB0
cyB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyB0aGF0IHN1bW1hcml6ZSB0aGUgdW5pb24gb2YgdGhp
cyByZWxhdGlvbnNoaXAgYW5kCisgICAgLy8gdGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gUmVsYXRp
b25zaGlwcyBhcmUgcmV0dXJuZWQgYnkgY2FsbGluZyB0aGUgZnVuY3RvciB3aXRoIHRoZSBuZXds
eQorICAgIC8vIGNyZWF0ZWQgcmVsYXRpb25zaGlwcy4gTm8gcmVsYXRpb25zaGlwcyBhcmUgY3Jl
YXRlZCB0byBpbmRpY2F0ZSBUT1AuIFRoaXMgaXMgdXNlZAogICAgIC8vIGZvciBtZXJnaW5nIHRo
ZSBjdXJyZW50IHJlbGF0aW9uc2hpcC1hdC1oZWFkIGZvciBzb21lIHBhaXIgb2Ygbm9kZXMgYW5k
IGEgbmV3CiAgICAgLy8gcmVsYXRpb25zaGlwLWF0LWhlYWQgYmVpbmcgcHJvcG9zZWQgYnkgYSBw
cmVkZWNlc3Nvci4gV2Ugd2lzaCB0byBjcmVhdGUgYSBuZXcKICAgICAvLyByZWxhdGlvbnNoaXAg
dGhhdCBpcyB0cnVlIHdoZW5ldmVyIGVpdGhlciBvZiB0aGVtIGFyZSB0cnVlLCB3aGljaCBlbnN1
cmluZyB0aGF0IHdlIGRvbid0CiAgICAgLy8gZG8gdGhpcyBmb3JldmVyLiBBbnl0aW1lIHdlIGNy
ZWF0ZSBhIHJlbGF0aW9uc2hpcCB0aGF0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgb2YgdGhlCiAg
ICAgLy8gcHJldmlvdXMgb25lcywgd2Ugd2lsbCBjYXVzZSB0aGUgYW5hbHlzaXMgZml4cG9pbnQg
dG8gcmVleGVjdXRlLgogICAgIC8vCi0gICAgLy8gSWYgKnRoaXMgYW5kIG90aGVyIGFyZSBpZGVu
dGljYWwsIHdlIGp1c3QgcmV0dXJuIGl0LgorICAgIC8vIElmICp0aGlzIGFuZCBvdGhlciBhcmUg
aWRlbnRpY2FsLCB3ZSBqdXN0IHBhc3MgaXQgdG8gdGhlIGZ1bmN0b3IuCiAgICAgLy8KICAgICAv
LyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHdlIHBpY2sgZnJvbSBhIGZpbml0ZSBzZXQgb2YgImdl
bmVyYWwiIHJlbGF0aW9uc2hpcHM6CiAgICAgLy8KQEAgLTI3OSwxMyArMjgwLDEyIEBAIHB1Ymxp
YzoKICAgICAvLyAgIHRoYXQncyBob3cgImRlZXAiIHRoZSBnZW5lcmFsIHJlbGF0aW9uc2hpcCBs
YXR0aWNlIGlzLgogICAgIC8vCiAgICAgLy8gTm90ZSB0aGF0IEMgYmVpbmcgY29uc3RyYWluZWQg
dG8gLTEsMCwxIGFsc28gZW5zdXJlcyB0aGF0IHdlIG5ldmVyIGhhdmUgdG8gcmV0dXJuIGEKLSAg
ICAvLyBjb21iaW5hdGlvbiBvZiBMdCBhbmQgR3QsIGFzIGluIGZvciBleGFtcGxlIHRoaXM8b3Ro
ZXIrQyAmJiB0aGlzPm90aGVyLUQuIFRoYXQncyB3aHkKLSAgICAvLyB0aGlzIGZ1bmN0aW9uIGNh
biByZXR1cm4gemVybyBvciBvbmUgcmVsYXRpb25zaGlwcyByYXRoZXIgdGhhbiBhIGxpc3Qgb2Yg
cmVsYXRpb25zaGlwcy4KLSAgICAvLyBUaGUgb25seSBwb3NzaWJsZSB2YWx1ZXMgb2YgQyBhbmQg
RCB3aGVyZSB0aGlzIHdvdWxkIHdvcmsgYXJlIC0xIGFuZCAxLCBidXQgaW4gdGhhdCBjYXNlCi0g
ICAgLy8gd2UganVzdCBzYXkgdGhpcz09b3RoZXIuIFRoYXQgc2FpZCwgdGhlIGxvZ2ljIGZvciBt
ZXJnaW5nIHR3byA9PSByZWxhdGlvbnNoaXBzLCBsaWtlCi0gICAgLy8gdGhpcz09b3RoZXIrQyB8
fCB0aGlzPT1vdGhlcitEIGlzIHRvIGF0dGVtcHQgdG8gY3JlYXRlIHRoZXNlIHR3byByZWxhdGlv
bnNoaXBzOgotICAgIC8vIHRoaXM+b3RoZXIrbWluKEMsRCktMSAmJiB0aGlzPG90aGVyK21heChD
LEQpKzEuIEJ1dCBvbmx5IG9uZSBvZiB0aGVzZSByZWxhdGlvbnNoaXBzIHdpbGwKLSAgICAvLyBi
ZWxvbmcgdG8gdGhlIHNldCBvZiBnZW5lcmFsIHJlbGF0aW9uc2hpcHMuCisgICAgLy8gY29tYmlu
YXRpb24gb2YgTHQgYW5kIEd0LCBhcyBpbiBmb3IgZXhhbXBsZSB0aGlzPG90aGVyK0MgJiYgdGhp
cz5vdGhlci1ELiBUaGUgb25seSBwb3NzaWJsZQorICAgIC8vIHZhbHVlcyBvZiBDIGFuZCBEIHdo
ZXJlIHRoaXMgd291bGQgd29yayBhcmUgLTEgYW5kIDEsIGJ1dCBpbiB0aGF0IGNhc2Ugd2UganVz
dCBzYXkKKyAgICAvLyB0aGlzPT1vdGhlci4gVGhhdCBzYWlkLCB0aGUgbG9naWMgZm9yIG1lcmdp
bmcgdHdvID09IHJlbGF0aW9uc2hpcHMsIGxpa2UgdGhpcz09b3RoZXIrQyB8fAorICAgIC8vIHRo
aXM9PW90aGVyK0QgaXMgdG8gYXR0ZW1wdCB0byBjcmVhdGUgdGhlc2UgdHdvIHJlbGF0aW9uc2hp
cHM6IHRoaXM+b3RoZXIrbWluKEMsRCktMSAmJgorICAgIC8vIHRoaXM8b3RoZXIrbWF4KEMsRCkr
MS4gQnV0IG9ubHkgb25lIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMgd2lsbCBiZWxvbmcgdG8gdGhl
IHNldCBvZiBnZW5lcmFsCisgICAgLy8gcmVsYXRpb25zaGlwcy4KICAgICAvLwogICAgIC8vIEhl
cmUncyBhbiBleGFtcGxlIG9mIHRoaXMgaW4gYWN0aW9uOgogICAgIC8vCkBAIC0yOTcsMTQgKzI5
Nyw0MiBAQCBwdWJsaWM6CiAgICAgLy8gaXRlcmF0aW9uIGFuZCBpPT1hKzEgZnJvbSB0aGUgc2Vj
b25kIGl0ZXJhdGlvbiwgd2UgY3JlYXRlIGk+YS0xIGFuZCBpPGErMiBidXQgdGhlbgogICAgIC8v
IHJlYWxpemUgdGhhdCBvbmx5IGk+YS0xIGlzIGEgdmFsaWQgZ2VuZXJhbCByZWxhdGlvbnNoaXAu
IFRoaXMgZ2l2ZXMgdXMgZXhhY3RseSB3aGF0IHdlCiAgICAgLy8gd2FudDogYSBzdGF0ZW1lbnQg
dGhhdCBpPj1hLgotICAgIFJlbGF0aW9uc2hpcCBtZXJnZShjb25zdCBSZWxhdGlvbnNoaXAmIG90
aGVyKSBjb25zdAorICAgIC8vCisgICAgLy8gSG93ZXZlciwgdGhpcyBtYXkgcmV0dXJuIGEgcGFp
ciBvZiByZWxhdGlvbnNoaXBzIHdoZW4gbWVyZ2luZyByZWxhdGlvbnNoaXBzIGludm9sdmluZwor
ICAgIC8vIGNvbnN0YW50cy4gRm9yIGV4YW1wbGUsIGlmIGdpdmVuOgorICAgIC8vCisgICAgLy8g
ICAgIEB4ID09IEBjCisgICAgLy8gICAgIEB4ID09IEBkCisgICAgLy8KKyAgICAvLyB3aGVyZSBA
YyBhbmQgQGQgYXJlIGNvbnN0YW50cywgdGhlbiB0aGlzIG1heSBwYXNzIHR3byByZWxhdGlvbnNo
aXBzIHRvIHRoZSBmdW5jdG9yOgorICAgIC8vCisgICAgLy8gICAgIEB4ID4gbWluKEBjLCBAZCkg
LSAxCisgICAgLy8gICAgIEB4IDwgbWF4KEBjLCBAZCkgKyAxCisgICAgLy8KKyAgICAvLyBUaGlz
IHN0aWxsIGFsbG93cyBmb3IgY29udmVyZ2VuY2UsIGJlY2F1c2UganVzdCBhcyB3aGVuIG1lcmdp
bmcgcmVsYXRpb25zaGlwcyBvdmVyCisgICAgLy8gdmFyaWFibGVzLCB0aGlzIGFsd2F5cyBwaWNr
cyBmcm9tIGEgc2V0IG9mIGdlbmVyYWwgcmVsYXRpb25zaGlwcy4gSGVuY2UgYWx0aG91Z2ggdGhp
cyBtYXkKKyAgICAvLyBwcm9kdWNlIHR3byByZWxhdGlvbnNoaXBzIGFzIGEgcmVzdWx0IG9mIHRo
ZSBtZXJnZSwgdGhlIHRvdGFsIG51bWJlciBvZiByZWxhdGlvbnNoaXBzIHRoYXQKKyAgICAvLyBj
YW4gYmUgcHJlc2VudCBhdCBoZWFkIG9mIGJsb2NrIGlzIGxpbWl0ZWQgYnkgTyhncmFwaC5zaXpl
XjIpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZShjb25z
dCBSZWxhdGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAogICAg
IHsKLSAgICAgICAgaWYgKCFzYW1lTm9kZXNBcyhvdGhlcikpCi0gICAgICAgICAgICByZXR1cm4g
UmVsYXRpb25zaGlwKCk7Ci0gICAgICAgIAogICAgICAgICAvLyBIYW5kbGUgdGhlIHN1cGVyIG9i
dmlvdXMgY2FzZSBmaXJzdC4KLSAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKQotICAgICAgICAg
ICAgcmV0dXJuICp0aGlzOworICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAg
ICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBpZiAobV9sZWZ0ICE9IG90aGVyLm1fbGVmdCkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgCisgICAgICAgIGlmIChtX3JpZ2h0ICE9IG90aGVyLm1fcmlnaHQpIHsK
KyAgICAgICAgICAgIEFTU0VSVChsZWZ0U2FtZSk7CisKKyAgICAgICAgICAgIG1lcmdlQ29uc3Rh
bnRzSW1wbChvdGhlciwgZnVuY3Rvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIEFTU0VSVChzYW1lTm9kZXNBcyhvdGhlcikpOwogICAgICAgICAK
ICAgICAgICAgLy8gVGhpcyBkb2VzIHNvbWUgaW50ZXJlc3RpbmcgcGVybXV0YXRpb25zIHRvIHJl
ZHVjZSB0aGUgYW1vdW50IG9mIGR1cGxpY2F0ZSBjb2RlLiBGb3IKICAgICAgICAgLy8gZXhhbXBs
ZToKQEAgLTMzMSw3ICszNTksNyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAvLyBJbiByYXJlIGNh
c2VzLCB3ZSBtaWdodCBub3QgYmUgYWJsZSB0byBmbGlwLiBKdXN0IGdpdmUgdXAgb24gbGlmZSBp
biB0aG9zZQogICAgICAgICAgICAgLy8gY2FzZXMuCiAgICAgICAgICAgICBpZiAoIWEgfHwgIWIp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAg
IHJldHVybjsKICAgICAgICAgICAgIAogICAgICAgICAgICAgbmVlZEZsaXAgPSB0cnVlOwogICAg
ICAgICAgICAgCkBAIC0zMzksNyArMzY3LDcgQEAgcHVibGljOgogICAgICAgICAgICAgLy8gQGEg
PiBAYi4gVGhhdCdzIHByZXR0eSBtdWNoIGFsd2F5cyBhIHRhdXRvbG9neTsgd2UgZG9uJ3QgYXR0
ZW1wdCB0byBkbyBzbWFydAogICAgICAgICAgICAgLy8gdGhpbmdzIGZvciB0aGF0IGNhc2UgZm9y
IG5vdy4KICAgICAgICAgICAgIGlmIChhLm1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBiLm1fa2lu
ZCA9PSBHcmVhdGVyVGhhbikKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7
CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAv
LyBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTGVzc1RoYW4sIHRoZW4gaXQncyBmaXJzdC4K
QEAgLTM1MSwxMSArMzc5LDEzIEBAIHB1YmxpYzoKICAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBi
KTsKICAgICAgICAgCiAgICAgICAgIFJlbGF0aW9uc2hpcCByZXN1bHQgPSBhLm1lcmdlSW1wbChi
KTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIAog
ICAgICAgICBpZiAobmVlZEZsaXApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmZsaXBwZWQo
KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5mbGlwcGVkKCk7CiAgICAgICAgIAotICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBmdW5jdG9yKHJlc3VsdCk7CiAgICAgfQogICAg
IAogICAgIC8vIEF0dGVtcHRzIHRvIGNvbnN0cnVjdCBvbmUgUmVsYXRpb25zaGlwIHRoYXQgYWRl
cXVhdGVseSBzdW1tYXJpemVzIHRoZSBpbnRlcnNlY3Rpb24gb2YKQEAgLTY2OCw2ICs2OTgsMTk4
IEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICByZXR1cm4gZ3JlYXRlclRoYW47CiAgICAg
fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1lcmdlQ29uc3Rh
bnRzSW1wbChSZWxhdGlvbnNoaXAgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQobV9sZWZ0ID09IG90aGVyLm1fbGVmdCk7CisKKyAgICAg
ICAgLy8gT25seSBkZWFsIHdpdGggY29uc3RhbnQgcmlnaHQuCisgICAgICAgIGlmICghbV9yaWdo
dC0+aXNJbnQzMkNvbnN0YW50KCkgfHwgIW90aGVyLm1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgp
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGZh
aXJseSBjb25zZXJ2YXRpdmUgbWVyZ2UuIFdlIGNvdWxkIHR1bmUgdGhpcyBwaGFzZSB0byBjb21l
IHVwIHdpdGgKKyAgICAgICAgLy8gYWxsIHBvc3NpYmxlIGluZXF1YWxpdGllcyBiZXR3ZWVuIHZh
cmlhYmxlcyBhbmQgY29uc3RhbnRzLCBidXQgd2UgZm9jdXMgbWFpbmx5IG9uIGNoZWFwCisgICAg
ICAgIC8vIGNhc2VzIGZvciBub3cuCisKKyAgICAgICAgLy8gSWdub3JlIHdlaXJkIG9mZnNldHMu
IFRoaXMgaXNuJ3QgdG90YWxseSBuZWNlc3NhcnkgLSB3ZSBjb3VsZCBpbnN0ZWFkIGp1c3QgYXZv
aWQKKyAgICAgICAgLy8gY3JlYXRpbmcgbm9uLWdlbmVyYWwgb2Zmc2V0cyB3aGVuIHRoZSBtZXJn
ZSByZXN1bHRzIGluIGEgbmV3IGNvbmRpdGlvbi4gQnV0IHRoaXMKKyAgICAgICAgLy8gc2ltcGxp
ZmllcyB0aGUgbG9naWMgb2YgdGhlIG1lcmdlIHJ1bGVzLgorICAgICAgICBpZiAobV9vZmZzZXQg
PCAtMSB8fCBtX29mZnNldCA+IDEgfHwgb3RoZXIubV9vZmZzZXQgPCAtMSB8fCBvdGhlci5tX29m
ZnNldCA+IDEpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSGVyZSBhcmUgc29t
ZSBvZiB0aGUgdGhlIGFycmFuZ2VtZW50cyB3ZSBjYW4gbWVyZ2UgdXNlZnVsbHkgYXNzdW1pbmcg
QGMgPCBAZDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEB4ID09IEBjLCBAeCA9PSBAZCA9
PiBAeCA+PSBjLCBAeCA8PSBAZAorICAgICAgICAvLyAgICAgQHggPj0gQGMsIEB4IDw9IEBkID0+
IFRPUAorICAgICAgICAvLyAgICAgQHggPT0gQGMsIEB4ICE9IEBkID0+IEB4ICE9IEBkCisKKyAg
ICAgICAgaW50IHRoaXNSaWdodCA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgaW50IG90
aGVyUmlnaHQgPSBvdGhlci5tX3JpZ2h0LT5hc0ludDMyKCk7CisKKyAgICAgICAgLy8gSWdub3Jl
IGZ1bm55IGJ1c2luZXNzLgorICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4odGhpc1JpZ2h0
LCBtX29mZnNldCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChzdW1PdmVyZmxv
d3M8aW50PihvdGhlclJpZ2h0LCBvdGhlci5tX29mZnNldCkpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgaW50IHRoaXNFZmZlY3RpdmVSaWdodCA9IHRoaXNSaWdodCArIG1fb2Zmc2V0
OworICAgICAgICBpbnQgb3RoZXJFZmZlY3RpdmVSaWdodCA9IG90aGVyUmlnaHQgKyBvdGhlci5t
X29mZnNldDsKKworICAgICAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgICAgICBjYXNlIEVxdWFs
OiB7CisgICAgICAgICAgICAvLyBPbmx5IGRlYWwgd2l0aCB3aXRoIEVxdWFsaXR5IGlmIHRoZSBv
ZmZzZXQgaXMgemVyby4gVGhpcyBtYWtlcyB0aGluZ3MgZWFzaWVyIGFuZCBpdAorICAgICAgICAg
ICAgLy8gY2FwdHVyZXMgdGhlIG1vc3QgaW50ZXJlc3RpbmcgY2FzZXMuCisgICAgICAgICAgICBp
ZiAobV9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBzd2l0Y2ggKG90aGVyLm1fa2luZCkgeworICAgICAgICAgICAgY2FzZSBFcXVhbDog
eworICAgICAgICAgICAgICAgIGlmIChvdGhlci5tX29mZnNldCkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXNSaWdodCA9PSBvdGhlclJpZ2h0
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN1cGVyIHJhcmUuIENTRSBkaWRuJ3QgZG8gaXRz
IGpvYi4gQnV0LCB3ZSBoYW5kbGUgaXQgYW55d2F5LgorICAgICAgICAgICAgICAgICAgICBmdW5j
dG9yKCp0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyB0aGUgb25seSBjYXNlIHdo
ZXJlIGEgbWVyZ2Ugd2lsbCBjcmVhdGUgbW9yZSBydWxlcyB0aGFuIHdoYXQgaXQKKyAgICAgICAg
ICAgICAgICAvLyBzdGFydGVkIHdpdGguIFRoaXMgaXMgZmluZSBmb3IgY29udmVyZ2VuY2UgYmVj
YXVzZSB0aGUgTGVzc1RoYW4vR3JlYXRlclRoYW4KKyAgICAgICAgICAgICAgICAvLyBydWxlcyB0
aGF0IHRoaXMgY3JlYXRlcyBhcmUgZ2VuZXJhbCAoaS5lLiBoYXZlIHNtYWxsIG9mZnNldHMpIGFu
ZCB0aGV5IG5ldmVyCisgICAgICAgICAgICAgICAgLy8gc3Bhd24gbW9yZSBydWxlcyB1cG9uIHN1
YnNlcXVlbnQgbWVyZ2luZy4KKyAgICAgICAgICAgICAgICBpZiAodGhpc1JpZ2h0IDwgb3RoZXJS
aWdodCkgeworICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQs
IG1fcmlnaHQsIEdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAgICAgICAgICAgICBmdW5jdG9y
KFJlbGF0aW9uc2hpcChtX2xlZnQsIG90aGVyLm1fcmlnaHQsIExlc3NUaGFuLCAxKSk7CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG90aGVyLm1fcmlnaHQsIEdyZWF0ZXJU
aGFuLCAtMSkpOworICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwg
bV9yaWdodCwgTGVzc1RoYW4sIDEpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTGVzc1RoYW46IHsKKyAgICAgICAgICAgICAgICAv
LyBFaXRoZXIgdGhlIExlc3NUaGFuIGNvbmRpdGlvbiBzdWJzdW1lcyB0aGUgZXF1YWxpdHksIG9y
IHRoZSBMZXNzVGhhbiBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAvLyBhbmQgZXF1YWxpdHkg
bWVyZ2UgdG9nZXRoZXIgdG8gY3JlYXRlIGEgbG9vc2VyIExlc3NUaGFuIGNvbmRpdGlvbi4KKwor
ICAgICAgICAgICAgICAgIC8vIE90aGVyIGlzOiBAeCA8IG90aGVyRWZmZWN0aXZlUmlnaHQKKyAg
ICAgICAgICAgICAgICAvLyBUaGlzIGlzIEB4ID09IHRoaXNSaWdodAorCisgICAgICAgICAgICAg
ICAgaWYgKG90aGVyRWZmZWN0aXZlUmlnaHQgPD0gdGhpc1JpZ2h0KSB7CisgICAgICAgICAgICAg
ICAgICAgIC8vIENyZWF0ZSBAeCA8PSB0aGlzUmlnaHQKKyAgICAgICAgICAgICAgICAgICAgZnVu
Y3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgMSkpOworICAgICAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgZnVuY3RvcihvdGhlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8g
T3Bwb3NpdGUgb2YgdGhlIExlc3NUaGFuIGNhc2UsIGFib3ZlLgorCisgICAgICAgICAgICAgICAg
Ly8gT3RoZXIgaXM6IEB4ID4gb3RoZXJFZmZlY3RpdmVSaWdodAorICAgICAgICAgICAgICAgIC8v
IFRoaXMgaXM6IEB4ID09IHRoaXNSaWdodAorCisgICAgICAgICAgICAgICAgaWYgKG90aGVyRWZm
ZWN0aXZlUmlnaHQgPj0gdGhpc1JpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0
ZSBAeCA+PSB0aGlzUmlnaHQKKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNo
aXAobV9sZWZ0LCBtX3JpZ2h0LCBHcmVhdGVyVGhhbiwgLTEpKTsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZ1bmN0b3Io
b3RoZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgY2FzZSBOb3RFcXVhbDogeworICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdGhlIE5v
dEVxdWFsIHNvIGxvbmcgYXMgaXQgZG9lc24ndCBjb250cmFkaWN0IG91ciBFcXVhbC4KKyAgICAg
ICAgICAgICAgICBpZiAob3RoZXJFZmZlY3RpdmVSaWdodCA9PSB0aGlzUmlnaHQpCisgICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIGZ1bmN0b3Iob3RoZXIpOwor
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gfQorCisgICAgICAgICAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgY2FzZSBMZXNzVGhhbjogeworICAgICAgICAgICAgc3dpdGNoIChvdGhl
ci5tX2tpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgRXF1YWw6IHsKKyAgICAgICAgICAgICAgICBv
dGhlci5tZXJnZUNvbnN0YW50c0ltcGwoKnRoaXMsIGZ1bmN0b3IpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBMZXNzVGhhbjogewor
ICAgICAgICAgICAgICAgIC8vIEtlZXAgdGhlIG9uZSB0aGF0IGhhcyBhIGxhcmdlciBjb25zdGFu
dCwgb3Iga2VlcCBib3RoIGluIHRoZSB3ZWlyZCBjYXNlIHdoZXJlCisgICAgICAgICAgICAgICAg
Ly8gdGhleSBib3RoIG1lYW4gdGhlIHNhbWUgdGhpbmcuCisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgaWYgKHRoaXNFZmZlY3RpdmVSaWdodCA+PSBvdGhlckVmZmVjdGl2ZVJpZ2h0
KSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnVuY3Rv
cihvdGhlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBh
IGNsYWltIHRoYXQgQHggPiBAYyB8fCBAeCA8IEBkLiBJZiBAZCA+IEBjLCB0aGlzIGlzIHRoZSB0
YXV0b2xvZ3kuIElmCisgICAgICAgICAgICAgICAgLy8gQGQgPD0gQGMsIGl0J3Mgc29ydCBvZiB1
bmludGVyZXN0aW5nLiBKdXN0IGlnbm9yZSB0aGlzLgorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBOb3RFcXVhbDogeworICAgICAgICAg
ICAgICAgIC8vIFdlIGhhdmUgYSBjbGFpbSB0aGF0IEB4IDwgQGMgfHwgQHggIT0gQGQuIFRoaXMg
aXNuJ3QgaW50ZXJlc3RpbmcuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fSB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdyZWF0
ZXJUaGFuOiB7CisgICAgICAgICAgICBjYXNlIChvdGhlci5tX2tpbmQpIHsKKyAgICAgICAgICAg
IGNhc2UgRXF1YWw6IHsKKyAgICAgICAgICAgICAgICBvdGhlci5tZXJnZUNvbnN0YW50c0ltcGwo
KnRoaXMsIGZ1bmN0b3IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgY2FzZSBMZXNzVGhhbjogeworICAgICAgICAgICAgICAgIC8vIE5vdCBp
bnRlcmVzdGluZywgc2VlIGFib3ZlLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjogeworICAgICAgICAgICAgICAg
IC8vIEtlZXAgdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVyIGNvbnN0YW50IG9yIGtlZXAgYm90aC4K
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAodGhpc0VmZmVjdGl2ZVJpZ2h0
IDw9IG90aGVyRWZmZWN0aXZlUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rvcigq
dGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICBmdW5jdG9yKG90aGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTm90RXF1YWw6IHsKKyAgICAgICAg
ICAgICAgICAvLyBOb3QgaW50ZXJlc3RpbmcsIHNlZSBhYm92ZS4KKyAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICB9IH0KKworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNh
c2UgTm90RXF1YWw6IHsKKyAgICAgICAgICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhp
cywgZnVuY3Rvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gfQorCisgICAgICAg
IFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQogICAgIAogICAgIE5vZGUqIG1f
bGVmdDsKICAgICBOb2RlKiBtX3JpZ2h0OwpAQCAtMTI0Myw1MCArMTQ2NSw0OCBAQCBwcml2YXRl
OgogICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHNvdXJjZVJlbGF0aW9uc2hpcCA6
IGl0ZXItPnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQogICAgICAg
ICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICBNZXJnaW5nICIsIHRhcmdldFJlbGF0aW9uc2hp
cCwgIiBhbmQgIiwgc291cmNlUmVsYXRpb25zaGlwLCAiOlxuIik7Ci0gICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPQotICAgICAgICAgICAgICAgICAgICAg
ICAgdGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdlKHNvdXJjZVJlbGF0aW9uc2hpcCk7Ci0gICAgICAg
ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3UmVsYXRpb25zaGlwLCAiXG4i
KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICghbmV3UmVs
YXRpb25zaGlwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlcigpIHRv
IGF2b2lkIGV4cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBpZGVudGljYWwKLSAgICAgICAgICAgICAg
ICAgICAgLy8gcmVsYXRpb25zaGlwcy4gV2UgZG8gdGhpcyBoZXJlIHRvIGF2b2lkIG1ha2luZyBz
ZXRPbmVTaWRlKCkgZG8KLSAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSB3b3JrLCBzaW5jZSB3
ZSBleHBlY3Qgc2V0T25lU2lkZSgpIHdpbGwgYmUgY2FsbGVkIG1vcmUKLSAgICAgICAgICAgICAg
ICAgICAgLy8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0IHNvbWUgcG9pbnQgc29t
ZW9uZSBtaWdodCBzdGFydAotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHR3byByZWxhdGlv
bnNoaXBzIGxpa2UgQGEgPiBAYiAtIEMgYW5kIEBhIDwgQGIgKyBELiBUaGVuCi0gICAgICAgICAg
ICAgICAgICAgIC8vIHNvbWVvbmUgZG9lcyBhIHNldFJlbGF0aW9uc2hpcCgpIHBhc3Npbmcgc29t
ZXRoaW5nIHRoYXQgdHVybnMKLSAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvZiB0aGVzZSBp
bnRvIEBhID09IEBiLiBOb3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNhdGVkLgotICAgICAgICAg
ICAgICAgICAgICAvLyBMZXQncyBzYXkgdGhhdCB0aGlzIGR1cGxpY2F0ZSBAYSA9PSBAYiBlbmRz
IHVwIGF0IHRoZSBoZWFkIG9mIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9vcC4gSWYgd2Ug
ZGlkbid0IGhhdmUgdGhpcyBydWxlLCB0aGVuIHRoZSBsb29wIHdvdWxkIHByb3BhZ2F0ZQotICAg
ICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRoZSBleGlzdGlu
ZyBkdXBsaWNhdGUgQGEgPT0gQGIncy4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgd291
bGQgYmUgZm91ciBwYWlycyBvZiBAYSA9PSBAYiwgZWFjaCBvZiB3aGljaCB3b3VsZAotICAgICAg
ICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgQGEgPT0gQGIuIE5vdyB3ZSdkIGhhdmUgZm91
ciBvZiB0aGVzZSBkdXBsaWNhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbmV4
dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUgOCwgdGhlbiAxNiwgZXRjLiBXZSBhdm9pZAotICAgICAg
ICAgICAgICAgICAgICAvLyB0aGlzIGhlcmUgYnkgZG9pbmcgdGhpcyBmaWx0cmF0aW9uLiBUaGF0
IG1pZ2h0IGJlIGEgYml0IG9mCi0gICAgICAgICAgICAgICAgICAgIC8vIG92ZXJraWxsLCBzaW5j
ZSBpdCdzIHByb2JhYmx5IGp1c3QgdGhlIGlkZW50aWNhbCBkdXBsaWNhdGUKLSAgICAgICAgICAg
ICAgICAgICAgLy8gcmVsYXRpb25zaGlwIGNhc2Ugd2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwgSSds
bCBrZWVwIHRoaXMgdW50aWwKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBldmlkZW5j
ZSB0aGF0IHRoaXMgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLiBSZW1lbWJlciAtCi0gICAgICAg
ICAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IGRlYWxpbmcgd2l0aCBhIGxpc3QgdGhhdCBp
cyBwcnVuZWQgZG93biB0bwotICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIHdp
dGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hvdWxkbid0IGJlIGEKLSAgICAgICAgICAg
ICAgICAgICAgLy8gbGFyZ2UgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZCA9
IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYgZXhpc3RpbmdS
ZWxhdGlvbnNoaXAgOiBtZXJnZWRSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoZXhpc3RpbmdSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMobmV3UmVsYXRpb25zaGlw
KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXJlZCA9
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVsYXRpb25zaGlwLmZp
bHRlcihuZXdSZWxhdGlvbnNoaXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChm
aWx0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0
aW9uc2hpcCA9IGZpbHRlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Vu
ZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICB0YXJnZXRSZWxhdGlvbnNoaXAubWVyZ2UoCisgICAgICAgICAgICAgICAg
ICAgICAgICBzb3VyY2VSZWxhdGlvbnNoaXAsCisgICAgICAgICAgICAgICAgICAgICAgICBbJl0g
KFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgIEdvdCAiLCBuZXdSZWxhdGlvbnNoaXAsICJcbiIpOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZmls
dGVyKCkgdG8gYXZvaWQgZXhwb25lbnRpYWwgZXhwbG9zaW9uIG9mIGlkZW50aWNhbAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuIFdlIGRvIHRoaXMgaGVyZSB0
byBhdm9pZCBtYWtpbmcgc2V0T25lU2lkZSgpIGRvCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gbW9yZSB3b3JrLCBzaW5jZSB3ZSBleHBlY3Qgc2V0T25lU2lkZSgpIHdpbGwgYmUgY2Fs
bGVkIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVxdWVudGx5LiBIZXJl
J3MgYW4gZXhhbXBsZS4gQXQgc29tZSBwb2ludCBzb21lb25lIG1pZ2h0IHN0YXJ0CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0d28gcmVsYXRpb25zaGlwcyBsaWtlIEBhID4g
QGIgLSBDIGFuZCBAYSA8IEBiICsgRC4gVGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIHNvbWVvbmUgZG9lcyBhIHNldFJlbGF0aW9uc2hpcCgpIHBhc3Npbmcgc29tZXRoaW5nIHRo
YXQgdHVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIG9mIHRoZXNlIGlu
dG8gQGEgPT0gQGIuIE5vdyB3ZSBoYXZlIEBhID09IEBiIGR1cGxpY2F0ZWQuCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gTGV0J3Mgc2F5IHRoYXQgdGhpcyBkdXBsaWNhdGUgQGEgPT0g
QGIgZW5kcyB1cCBhdCB0aGUgaGVhZCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gbG9vcC4gSWYgd2UgZGlkbid0IGhhdmUgdGhpcyBydWxlLCB0aGVuIHRoZSBsb29wIHdvdWxk
IHByb3BhZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBAYSA9
PSBAYidzIG9udG8gdGhlIGV4aXN0aW5nIGR1cGxpY2F0ZSBAYSA9PSBAYidzLgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdvdWxkIGJlIGZvdXIgcGFpcnMgb2YgQGEgPT0g
QGIsIGVhY2ggb2Ygd2hpY2ggd291bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBj
cmVhdGUgYSBuZXcgQGEgPT0gQGIuIE5vdyB3ZSdkIGhhdmUgZm91ciBvZiB0aGVzZSBkdXBsaWNh
dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBuZXh0IHRpbWUgYXJv
dW5kIHdlJ2QgaGF2ZSA4LCB0aGVuIDE2LCBldGMuIFdlIGF2b2lkCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gdGhpcyBoZXJlIGJ5IGRvaW5nIHRoaXMgZmlsdHJhdGlvbi4gVGhhdCBt
aWdodCBiZSBhIGJpdCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJraWxs
LCBzaW5jZSBpdCdzIHByb2JhYmx5IGp1c3QgdGhlIGlkZW50aWNhbCBkdXBsaWNhdGUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXAgY2FzZSB3ZSB3YW50JyB0byBh
dm9pZC4gQnV0LCBJJ2xsIGtlZXAgdGhpcyB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIHdlIGhhdmUgZXZpZGVuY2UgdGhhdCB0aGlzIGlzIGEgcGVyZm9ybWFuY2UgcHJvYmxl
bS4gUmVtZW1iZXIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJl
YWR5IGRlYWxpbmcgd2l0aCBhIGxpc3QgdGhhdCBpcyBwcnVuZWQgZG93biB0bworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgd2l0aCBpZGVudGljYWwgbGVmdCBv
cGVyYW5kLiBJdCBzaG91bGRuJ3QgYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IGxhcmdlIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZh
bHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBleGlz
dGluZ1JlbGF0aW9uc2hpcCA6IG1lcmdlZFJlbGF0aW9uc2hpcHMpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKG5l
d1JlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcCBmaWx0ZXJlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAuZmlsdGVyKG5ld1JlbGF0aW9uc2hpcCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWQpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0aW9uc2hpcCA9IGZp
bHRlcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1lcmdlZFJlbGF0aW9uc2hpcHMuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFm
b3VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUmVsYXRpb25zaGlw
cy5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwog
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZDo6c29ydCht
ZXJnZWRSZWxhdGlvbnNoaXBzLmJlZ2luKCksIG1lcmdlZFJlbGF0aW9uc2hpcHMuZW5kKCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>259443</attachid>
            <date>2015-08-19 20:01:51 -0700</date>
            <delta_ts>2015-08-20 12:46:20 -0700</delta_ts>
            <desc>more things</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>27936</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAxODg2NDUpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjksNiArNjksMjYgQEAgcHVibGljOgogICAgICAgICBO
b3RFcXVhbCwKICAgICAgICAgR3JlYXRlclRoYW4KICAgICB9OworCisgICAgLy8gU29tZSByZWxh
dGlvbnNoaXBzIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIG90aGVycy4gV2hlbiBhIHJl
bGF0aW9uc2hpcCBwcm92aWRlcyBtb3JlCisgICAgLy8gaW5mb3JtYXRpb24sIGl0IGlzIGxlc3Mg
dmFndWUuCisgICAgc3RhdGljIHVuc2lnbmVkIHZhZ3VlbmVzcyhLaW5kIGtpbmQpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBjYXNlIExlc3NUaGFuOgorICAgICAgICBjYXNlIEdyZWF0ZXJU
aGFuOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAg
ICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgbWluVmFndWVuZXNzID0gMDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4
VmFndWVuZXNzID0gMjsKICAgICAKICAgICBzdGF0aWMgS2luZCBmbGlwcGVkKEtpbmQga2luZCkK
ICAgICB7CkBAIC0xMTgsNiArMTM4LDggQEAgcHVibGljOgogICAgIE5vZGUqIHJpZ2h0KCkgY29u
c3QgeyByZXR1cm4gbV9yaWdodDsgfQogICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1f
a2luZDsgfQogICAgIGludCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCisg
ICAgdW5zaWduZWQgdmFndWVuZXNzKCkgY29uc3QgeyByZXR1cm4gdmFndWVuZXNzKGtpbmQoKSk7
IH0KICAgICAKICAgICBSZWxhdGlvbnNoaXAgZmxpcHBlZCgpIGNvbnN0CiAgICAgewpAQCAtMjM4
LDE1ICsyNjAsMTYgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAg
ICAvLyBBdHRlbXB0cyB0byBjcmVhdGUgYSByZWxhdGlvbnNoaXAgdGhhdCBzdW1tYXJpemVzIHRo
ZSB1bmlvbiBvZiB0aGlzIHJlbGF0aW9uc2hpcCBhbmQKLSAgICAvLyB0aGUgb3RoZXIgcmVsYXRp
b25zaGlwLiBUaGUgbnVsbCByZWxhdGlvbnNoaXAgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgVE9Q
LiBUaGlzIGlzIHVzZWQKKyAgICAvLyBBdHRlbXB0cyB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyB0
aGF0IHN1bW1hcml6ZSB0aGUgdW5pb24gb2YgdGhpcyByZWxhdGlvbnNoaXAgYW5kCisgICAgLy8g
dGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gUmVsYXRpb25zaGlwcyBhcmUgcmV0dXJuZWQgYnkgY2Fs
bGluZyB0aGUgZnVuY3RvciB3aXRoIHRoZSBuZXdseQorICAgIC8vIGNyZWF0ZWQgcmVsYXRpb25z
aGlwcy4gTm8gcmVsYXRpb25zaGlwcyBhcmUgY3JlYXRlZCB0byBpbmRpY2F0ZSBUT1AuIFRoaXMg
aXMgdXNlZAogICAgIC8vIGZvciBtZXJnaW5nIHRoZSBjdXJyZW50IHJlbGF0aW9uc2hpcC1hdC1o
ZWFkIGZvciBzb21lIHBhaXIgb2Ygbm9kZXMgYW5kIGEgbmV3CiAgICAgLy8gcmVsYXRpb25zaGlw
LWF0LWhlYWQgYmVpbmcgcHJvcG9zZWQgYnkgYSBwcmVkZWNlc3Nvci4gV2Ugd2lzaCB0byBjcmVh
dGUgYSBuZXcKICAgICAvLyByZWxhdGlvbnNoaXAgdGhhdCBpcyB0cnVlIHdoZW5ldmVyIGVpdGhl
ciBvZiB0aGVtIGFyZSB0cnVlLCB3aGljaCBlbnN1cmluZyB0aGF0IHdlIGRvbid0CiAgICAgLy8g
ZG8gdGhpcyBmb3JldmVyLiBBbnl0aW1lIHdlIGNyZWF0ZSBhIHJlbGF0aW9uc2hpcCB0aGF0IGlz
IG5vdCBlcXVhbCB0byBlaXRoZXIgb2YgdGhlCiAgICAgLy8gcHJldmlvdXMgb25lcywgd2Ugd2ls
bCBjYXVzZSB0aGUgYW5hbHlzaXMgZml4cG9pbnQgdG8gcmVleGVjdXRlLgogICAgIC8vCi0gICAg
Ly8gSWYgKnRoaXMgYW5kIG90aGVyIGFyZSBpZGVudGljYWwsIHdlIGp1c3QgcmV0dXJuIGl0Lgor
ICAgIC8vIElmICp0aGlzIGFuZCBvdGhlciBhcmUgaWRlbnRpY2FsLCB3ZSBqdXN0IHBhc3MgaXQg
dG8gdGhlIGZ1bmN0b3IuCiAgICAgLy8KICAgICAvLyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHdl
IHBpY2sgZnJvbSBhIGZpbml0ZSBzZXQgb2YgImdlbmVyYWwiIHJlbGF0aW9uc2hpcHM6CiAgICAg
Ly8KQEAgLTI3NywxMyArMzAwLDEyIEBAIHB1YmxpYzoKICAgICAvLyAgIHRoYXQncyBob3cgImRl
ZXAiIHRoZSBnZW5lcmFsIHJlbGF0aW9uc2hpcCBsYXR0aWNlIGlzLgogICAgIC8vCiAgICAgLy8g
Tm90ZSB0aGF0IEMgYmVpbmcgY29uc3RyYWluZWQgdG8gLTEsMCwxIGFsc28gZW5zdXJlcyB0aGF0
IHdlIG5ldmVyIGhhdmUgdG8gcmV0dXJuIGEKLSAgICAvLyBjb21iaW5hdGlvbiBvZiBMdCBhbmQg
R3QsIGFzIGluIGZvciBleGFtcGxlIHRoaXM8b3RoZXIrQyAmJiB0aGlzPm90aGVyLUQuIFRoYXQn
cyB3aHkKLSAgICAvLyB0aGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gemVybyBvciBvbmUgcmVsYXRp
b25zaGlwcyByYXRoZXIgdGhhbiBhIGxpc3Qgb2YgcmVsYXRpb25zaGlwcy4KLSAgICAvLyBUaGUg
b25seSBwb3NzaWJsZSB2YWx1ZXMgb2YgQyBhbmQgRCB3aGVyZSB0aGlzIHdvdWxkIHdvcmsgYXJl
IC0xIGFuZCAxLCBidXQgaW4gdGhhdCBjYXNlCi0gICAgLy8gd2UganVzdCBzYXkgdGhpcz09b3Ro
ZXIuIFRoYXQgc2FpZCwgdGhlIGxvZ2ljIGZvciBtZXJnaW5nIHR3byA9PSByZWxhdGlvbnNoaXBz
LCBsaWtlCi0gICAgLy8gdGhpcz09b3RoZXIrQyB8fCB0aGlzPT1vdGhlcitEIGlzIHRvIGF0dGVt
cHQgdG8gY3JlYXRlIHRoZXNlIHR3byByZWxhdGlvbnNoaXBzOgotICAgIC8vIHRoaXM+b3RoZXIr
bWluKEMsRCktMSAmJiB0aGlzPG90aGVyK21heChDLEQpKzEuIEJ1dCBvbmx5IG9uZSBvZiB0aGVz
ZSByZWxhdGlvbnNoaXBzIHdpbGwKLSAgICAvLyBiZWxvbmcgdG8gdGhlIHNldCBvZiBnZW5lcmFs
IHJlbGF0aW9uc2hpcHMuCisgICAgLy8gY29tYmluYXRpb24gb2YgTHQgYW5kIEd0LCBhcyBpbiBm
b3IgZXhhbXBsZSB0aGlzPG90aGVyK0MgJiYgdGhpcz5vdGhlci1ELiBUaGUgb25seSBwb3NzaWJs
ZQorICAgIC8vIHZhbHVlcyBvZiBDIGFuZCBEIHdoZXJlIHRoaXMgd291bGQgd29yayBhcmUgLTEg
YW5kIDEsIGJ1dCBpbiB0aGF0IGNhc2Ugd2UganVzdCBzYXkKKyAgICAvLyB0aGlzPT1vdGhlci4g
VGhhdCBzYWlkLCB0aGUgbG9naWMgZm9yIG1lcmdpbmcgdHdvID09IHJlbGF0aW9uc2hpcHMsIGxp
a2UgdGhpcz09b3RoZXIrQyB8fAorICAgIC8vIHRoaXM9PW90aGVyK0QgaXMgdG8gYXR0ZW1wdCB0
byBjcmVhdGUgdGhlc2UgdHdvIHJlbGF0aW9uc2hpcHM6IHRoaXM+b3RoZXIrbWluKEMsRCktMSAm
JgorICAgIC8vIHRoaXM8b3RoZXIrbWF4KEMsRCkrMS4gQnV0IG9ubHkgb25lIG9mIHRoZXNlIHJl
bGF0aW9uc2hpcHMgd2lsbCBiZWxvbmcgdG8gdGhlIHNldCBvZiBnZW5lcmFsCisgICAgLy8gcmVs
YXRpb25zaGlwcy4KICAgICAvLwogICAgIC8vIEhlcmUncyBhbiBleGFtcGxlIG9mIHRoaXMgaW4g
YWN0aW9uOgogICAgIC8vCkBAIC0yOTUsMTQgKzMxNyw0MCBAQCBwdWJsaWM6CiAgICAgLy8gaXRl
cmF0aW9uIGFuZCBpPT1hKzEgZnJvbSB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgd2UgY3JlYXRlIGk+
YS0xIGFuZCBpPGErMiBidXQgdGhlbgogICAgIC8vIHJlYWxpemUgdGhhdCBvbmx5IGk+YS0xIGlz
IGEgdmFsaWQgZ2VuZXJhbCByZWxhdGlvbnNoaXAuIFRoaXMgZ2l2ZXMgdXMgZXhhY3RseSB3aGF0
IHdlCiAgICAgLy8gd2FudDogYSBzdGF0ZW1lbnQgdGhhdCBpPj1hLgotICAgIFJlbGF0aW9uc2hp
cCBtZXJnZShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIC8vCisgICAgLy8g
SG93ZXZlciwgdGhpcyBtYXkgcmV0dXJuIGEgcGFpciBvZiByZWxhdGlvbnNoaXBzIHdoZW4gbWVy
Z2luZyByZWxhdGlvbnNoaXBzIGludm9sdmluZworICAgIC8vIGNvbnN0YW50cy4gRm9yIGV4YW1w
bGUsIGlmIGdpdmVuOgorICAgIC8vCisgICAgLy8gICAgIEB4ID09IEBjCisgICAgLy8gICAgIEB4
ID09IEBkCisgICAgLy8KKyAgICAvLyB3aGVyZSBAYyBhbmQgQGQgYXJlIGNvbnN0YW50cywgdGhl
biB0aGlzIG1heSBwYXNzIHR3byByZWxhdGlvbnNoaXBzIHRvIHRoZSBmdW5jdG9yOgorICAgIC8v
CisgICAgLy8gICAgIEB4ID4gbWluKEBjLCBAZCkgLSAxCisgICAgLy8gICAgIEB4IDwgbWF4KEBj
LCBAZCkgKyAxCisgICAgLy8KKyAgICAvLyBUaGlzIHN0aWxsIGFsbG93cyBmb3IgY29udmVyZ2Vu
Y2UsIGJlY2F1c2UganVzdCBhcyB3aGVuIG1lcmdpbmcgcmVsYXRpb25zaGlwcyBvdmVyCisgICAg
Ly8gdmFyaWFibGVzLCB0aGlzIGFsd2F5cyBwaWNrcyBmcm9tIGEgc2V0IG9mIGdlbmVyYWwgcmVs
YXRpb25zaGlwcy4gSGVuY2UgYWx0aG91Z2ggdGhpcyBtYXkKKyAgICAvLyBwcm9kdWNlIHR3byBy
ZWxhdGlvbnNoaXBzIGFzIGEgcmVzdWx0IG9mIHRoZSBtZXJnZSwgdGhlIHRvdGFsIG51bWJlciBv
ZiByZWxhdGlvbnNoaXBzIHRoYXQKKyAgICAvLyBjYW4gYmUgcHJlc2VudCBhdCBoZWFkIG9mIGJs
b2NrIGlzIGxpbWl0ZWQgYnkgTyhncmFwaC5zaXplXjIpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyLCBjb25z
dCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAogICAgIHsKLSAgICAgICAgaWYgKCFzYW1lTm9kZXNB
cyhvdGhlcikpCi0gICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7Ci0gICAgICAgIAog
ICAgICAgICAvLyBIYW5kbGUgdGhlIHN1cGVyIG9idmlvdXMgY2FzZSBmaXJzdC4KLSAgICAgICAg
aWYgKCp0aGlzID09IG90aGVyKQotICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICBp
ZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9sZWZ0ICE9
IG90aGVyLm1fbGVmdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlm
IChtX3JpZ2h0ICE9IG90aGVyLm1fcmlnaHQpIHsKKyAgICAgICAgICAgIG1lcmdlQ29uc3RhbnRz
SW1wbChvdGhlciwgZnVuY3Rvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIEFTU0VSVChzYW1lTm9kZXNBcyhvdGhlcikpOwogICAgICAgICAKICAg
ICAgICAgLy8gVGhpcyBkb2VzIHNvbWUgaW50ZXJlc3RpbmcgcGVybXV0YXRpb25zIHRvIHJlZHVj
ZSB0aGUgYW1vdW50IG9mIGR1cGxpY2F0ZSBjb2RlLiBGb3IKICAgICAgICAgLy8gZXhhbXBsZToK
QEAgLTMyOSw3ICszNzcsNyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAvLyBJbiByYXJlIGNhc2Vz
LCB3ZSBtaWdodCBub3QgYmUgYWJsZSB0byBmbGlwLiBKdXN0IGdpdmUgdXAgb24gbGlmZSBpbiB0
aG9zZQogICAgICAgICAgICAgLy8gY2FzZXMuCiAgICAgICAgICAgICBpZiAoIWEgfHwgIWIpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKICAgICAgICAgICAgIAogICAgICAgICAgICAgbmVlZEZsaXAgPSB0cnVlOwogICAgICAg
ICAgICAgCkBAIC0zMzcsNyArMzg1LDcgQEAgcHVibGljOgogICAgICAgICAgICAgLy8gQGEgPiBA
Yi4gVGhhdCdzIHByZXR0eSBtdWNoIGFsd2F5cyBhIHRhdXRvbG9neTsgd2UgZG9uJ3QgYXR0ZW1w
dCB0byBkbyBzbWFydAogICAgICAgICAgICAgLy8gdGhpbmdzIGZvciB0aGF0IGNhc2UgZm9yIG5v
dy4KICAgICAgICAgICAgIGlmIChhLm1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBiLm1fa2luZCA9
PSBHcmVhdGVyVGhhbikKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvLyBN
YWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTGVzc1RoYW4sIHRoZW4gaXQncyBmaXJzdC4KQEAg
LTM0OSwxMSArMzk3LDEzIEBAIHB1YmxpYzoKICAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsK
ICAgICAgICAgCiAgICAgICAgIFJlbGF0aW9uc2hpcCByZXN1bHQgPSBhLm1lcmdlSW1wbChiKTsK
KyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIAogICAg
ICAgICBpZiAobmVlZEZsaXApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmZsaXBwZWQoKTsK
KyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5mbGlwcGVkKCk7CiAgICAgICAgIAotICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgICAgICBmdW5jdG9yKHJlc3VsdCk7CiAgICAgfQogICAgIAog
ICAgIC8vIEF0dGVtcHRzIHRvIGNvbnN0cnVjdCBvbmUgUmVsYXRpb25zaGlwIHRoYXQgYWRlcXVh
dGVseSBzdW1tYXJpemVzIHRoZSBpbnRlcnNlY3Rpb24gb2YKQEAgLTQ1Niw2ICs1MDYsNTkgQEAg
cHVibGljOgogICAgICAgICBBU1NFUlQobV9raW5kID09IEdyZWF0ZXJUaGFuKTsKICAgICAgICAg
cmV0dXJuIGZpbHRlckZsaXBwZWQoKTsKICAgICB9CisKKyAgICAvLyBDb21lIHVwIHdpdGggYSBy
ZWxhdGlvbnNoaXAgdGhhdCBpcyB0aGUgYmVzdCBkZXNjcmlwdGlvbiBvZiB0aGlzICYmIG90aGVy
LCBwcm92aWRlZCB0aGF0IGxlZnQoKSBpcworICAgIC8vIHRoZSBzYW1lIGFuZCByaWdodCgpIGlz
IGEgY29uc3RhbnQuIEFsc28gcmVxdWlyZXMgdGhhdCB0aGlzIGlzIGF0IGxlYXN0IGFzIHZhZ3Vl
IGFzIG90aGVyLiBJdCBtYXkKKyAgICAvLyByZXR1cm4gdGhpcyBvciBpdCBtYXkgcmV0dXJuIHNv
bWV0aGluZyBlbHNlLCBidXQgd2hhdGV2ZXIgaXQgcmV0dXJucywgaXQgd2lsbCBoYXZlIHRoZSBz
YW1lIG5vZGVzIGFzCisgICAgLy8gdGhpcy4gVGhpcyBpcyBub3QgYXV0b21hdGljYWxseSBkb25l
IGJ5IGZpbHRlcigpIGJlY2F1c2UgaXQgY3VycmVudGx5IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2Fs
bCB0aGlzCisgICAgLy8gZHVyaW5nIGEgdmVyeSBwYXJ0aWN1bGFyIHBhcnQgb2Ygc2V0T25lU2lk
ZSgpLgorICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXJDb25zdGFudChjb25zdCBSZWxhdGlvbnNoaXAm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fbGVmdCA9PSBvdGhlci5tX2xl
ZnQpOworICAgICAgICBBU1NFUlQobV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkpOworICAgICAg
ICBBU1NFUlQob3RoZXIubV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkpOworICAgICAgICBBU1NF
UlQodmFndWVuZXNzKCkgPj0gb3RoZXIucmVsYXRpb25zaGlwKCkpOworCisgICAgICAgIGlmICh2
YWd1ZW5lc3MoKSA9PSBvdGhlci52YWd1ZW5lc3MoKSkKKyAgICAgICAgICAgIHJldHVybiAqdGhp
czsKKworICAgICAgICAvLyBUaGlzIGlzIG1vcmUgdmFndWUgdGhhbiBvdGhlci4gT3RoZXIgaXMg
bW9yZSBzcGVjaWZpYyB0aGFuIHRoaXMuIFRoaXMgaXMgbGVzcyBzcGVjaWZpYyB0aGFuCisgICAg
ICAgIC8vIG90aGVyLiBPdGhlciBpcyBsZXNzIHZhZ3VlIHRoYW4gdGhpcy4KKyAgICAgICAgQVNT
RVJUKHZhZ3VlbmVzcygpID4gb3RoZXIudmFndWVuZXNzKCkpOworCisgICAgICAgIGludCB0aGlz
UmlnaHQgPSBtX3JpZ2h0LT5hc0ludDMyKCk7CisgICAgICAgIGludCBvdGhlclJpZ2h0ID0gb3Ro
ZXIubV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIGZ1bm55
IGJ1c2luZXNzLgorICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4odGhpc1JpZ2h0LCBtX29m
ZnNldCkpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlmIChzdW1PdmVyZmxv
d3M8aW50PihvdGhlclJpZ2h0LCBvdGhlci5tX29mZnNldCkpCisgICAgICAgICAgICByZXR1cm4g
KnRoaXM7CisKKyAgICAgICAgaW50IHRoaXNFZmZlY3RpdmVSaWdodCA9IHRoaXNSaWdodCArIG1f
b2Zmc2V0OworICAgICAgICBpbnQgb3RoZXJFZmZlY3RpdmVSaWdodCA9IG90aGVyUmlnaHQgKyBv
dGhlci5tX29mZnNldDsKKworICAgICAgICBzd2l0Y2ggKG90aGVyLm1fa2luZCkgeworICAgICAg
ICBjYXNlIEVxdWFsOgorICAgICAgICAgICAgLy8gUmV0dXJuIGEgdmVyc2lvbiBvZiAqdGhpcyB0
aGF0IGlzIEVxdWFsIHRvIG90aGVyJ3MgY29uc3RhbnQuCisgICAgICAgICAgICByZXR1cm4gUmVs
YXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgRXF1YWwsIG90aGVyRWZmZWN0aXZlUmlnaHQgLSB0
aGlzUmlnaHQpOworCisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgIGNhc2UgR3JlYXRl
clRoYW46CisgICAgICAgICAgICBBU1NFUlQobV9raW5kID09IE5vdEVxdWFsKTsKKyAgICAgICAg
ICAgIC8vIFdlIGNvdWxkIGRvIHNtYXJ0IHRoaW5ncyBoZXJlLiBCdXQgd2UgZG9uJ3QgY3VycmVu
dGx5IGhhdmUgYW4gZXhhbXBsZSBvZiB3aGVuIGl0IHdvdWxkIGJlCisgICAgICAgICAgICAvLyB2
YWx1YWJsZS4gTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGJlIGNhcmVmdWwuIFdlIGNvdWxkIHJlZmlu
ZSBOb3RFcXVhbCB0byBMZXNzVGhhbiwgYnV0IG9ubHkKKyAgICAgICAgICAgIC8vIGlmIHRoZSBM
ZXNzVGhhbiBzdWJzdW1lcyB0aGUgTm90RXF1YWwuCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7
CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBOb3RFcXVhbDoKKyAgICAgICAgICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KCk7CisgICAgICAgIH0KKworICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgfQogICAgIAogICAgIGludCBtaW5W
YWx1ZU9mTGVmdCgpIGNvbnN0CiAgICAgewpAQCAtNjY2LDYgKzc2OSwxOTggQEAgcHJpdmF0ZToK
ICAgICAgICAgCiAgICAgICAgIHJldHVybiBncmVhdGVyVGhhbjsKICAgICB9CisKKyAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVyZ2VDb25zdGFudHNJbXBsKGNvbnN0
IFJlbGF0aW9uc2hpcCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQobV9sZWZ0ID09IG90aGVyLm1fbGVmdCk7CisKKyAgICAgICAgLy8g
T25seSBkZWFsIHdpdGggY29uc3RhbnQgcmlnaHQuCisgICAgICAgIGlmICghbV9yaWdodC0+aXNJ
bnQzMkNvbnN0YW50KCkgfHwgIW90aGVyLm1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAg
ICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGZhaXJseSBj
b25zZXJ2YXRpdmUgbWVyZ2UuIFdlIGNvdWxkIHR1bmUgdGhpcyBwaGFzZSB0byBjb21lIHVwIHdp
dGgKKyAgICAgICAgLy8gYWxsIHBvc3NpYmxlIGluZXF1YWxpdGllcyBiZXR3ZWVuIHZhcmlhYmxl
cyBhbmQgY29uc3RhbnRzLCBidXQgd2UgZm9jdXMgbWFpbmx5IG9uIGNoZWFwCisgICAgICAgIC8v
IGNhc2VzIGZvciBub3cuCisKKyAgICAgICAgLy8gSWdub3JlIHdlaXJkIG9mZnNldHMuIFRoaXMg
aXNuJ3QgdG90YWxseSBuZWNlc3NhcnkgLSB3ZSBjb3VsZCBpbnN0ZWFkIGp1c3QgYXZvaWQKKyAg
ICAgICAgLy8gY3JlYXRpbmcgbm9uLWdlbmVyYWwgb2Zmc2V0cyB3aGVuIHRoZSBtZXJnZSByZXN1
bHRzIGluIGEgbmV3IGNvbmRpdGlvbi4gQnV0IHRoaXMKKyAgICAgICAgLy8gc2ltcGxpZmllcyB0
aGUgbG9naWMgb2YgdGhlIG1lcmdlIHJ1bGVzLgorICAgICAgICBpZiAobV9vZmZzZXQgPCAtMSB8
fCBtX29mZnNldCA+IDEgfHwgb3RoZXIubV9vZmZzZXQgPCAtMSB8fCBvdGhlci5tX29mZnNldCA+
IDEpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSGVyZSBhcmUgc29tZSBvZiB0
aGUgdGhlIGFycmFuZ2VtZW50cyB3ZSBjYW4gbWVyZ2UgdXNlZnVsbHkgYXNzdW1pbmcgQGMgPCBA
ZDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEB4ID09IEBjIHx8IEB4ID09IEBkICAgPT4g
ICBAeCA+PSBjICYmIEB4IDw9IEBkCisgICAgICAgIC8vICAgICBAeCA+PSBAYyB8fCBAeCA8PSBA
ZCAgID0+ICAgVE9QCisgICAgICAgIC8vICAgICBAeCA9PSBAYyB8fCBAeCAhPSBAZCAgID0+ICAg
QHggIT0gQGQKKworICAgICAgICBpbnQgdGhpc1JpZ2h0ID0gbV9yaWdodC0+YXNJbnQzMigpOwor
ICAgICAgICBpbnQgb3RoZXJSaWdodCA9IG90aGVyLm1fcmlnaHQtPmFzSW50MzIoKTsKKworICAg
ICAgICAvLyBJZ25vcmUgZnVubnkgYnVzaW5lc3MuCisgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8
aW50Pih0aGlzUmlnaHQsIG1fb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKHN1bU92ZXJmbG93czxpbnQ+KG90aGVyUmlnaHQsIG90aGVyLm1fb2Zmc2V0KSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBpbnQgdGhpc0VmZmVjdGl2ZVJpZ2h0ID0gdGhpc1Jp
Z2h0ICsgbV9vZmZzZXQ7CisgICAgICAgIGludCBvdGhlckVmZmVjdGl2ZVJpZ2h0ID0gb3RoZXJS
aWdodCArIG90aGVyLm1fb2Zmc2V0OworCisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAg
ICAgIGNhc2UgRXF1YWw6IHsKKyAgICAgICAgICAgIC8vIE9ubHkgZGVhbCB3aXRoIHdpdGggRXF1
YWxpdHkgaWYgdGhlIG9mZnNldCBpcyB6ZXJvLiBUaGlzIG1ha2VzIHRoaW5ncyBlYXNpZXIgYW5k
IGl0CisgICAgICAgICAgICAvLyBjYXB0dXJlcyB0aGUgbW9zdCBpbnRlcmVzdGluZyBjYXNlcy4K
KyAgICAgICAgICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAob3RoZXIubV9raW5kKSB7CisgICAgICAgICAg
ICBjYXNlIEVxdWFsOiB7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLm1fb2Zmc2V0KQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAodGhpc1JpZ2h0
ID09IG90aGVyUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VwZXIgcmFyZS4gQ1NF
IGRpZG4ndCBkbyBpdHMgam9iLiBTbywgd2UganVzdCBrZWVwIG9uZSBvZiB0aGVtLgorICAgICAg
ICAgICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdoYXQgZm9sbG93cyBp
cyB0aGUgb25seSBjYXNlIHdoZXJlIGEgbWVyZ2Ugd2lsbCBjcmVhdGUgbW9yZSBydWxlcyB0aGFu
IHdoYXQgaXQKKyAgICAgICAgICAgICAgICAvLyBzdGFydGVkIHdpdGguIFRoaXMgaXMgZmluZSBm
b3IgY29udmVyZ2VuY2UgYmVjYXVzZSB0aGUgTGVzc1RoYW4vR3JlYXRlclRoYW4KKyAgICAgICAg
ICAgICAgICAvLyBydWxlcyB0aGF0IHRoaXMgY3JlYXRlcyBhcmUgZ2VuZXJhbCAoaS5lLiBoYXZl
IHNtYWxsIG9mZnNldHMpIGFuZCB0aGV5IG5ldmVyCisgICAgICAgICAgICAgICAgLy8gc3Bhd24g
bW9yZSBydWxlcyB1cG9uIHN1YnNlcXVlbnQgbWVyZ2luZy4KKyAgICAgICAgICAgICAgICBpZiAo
dGhpc1JpZ2h0IDwgb3RoZXJSaWdodCkgeworICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKFJl
bGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAg
ICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG90aGVyLm1fcmlnaHQsIExl
c3NUaGFuLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG90aGVy
Lm1fcmlnaHQsIEdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVs
YXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIDEpKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTGVzc1RoYW46IHsK
KyAgICAgICAgICAgICAgICAvLyBFaXRoZXIgdGhlIExlc3NUaGFuIGNvbmRpdGlvbiBzdWJzdW1l
cyB0aGUgZXF1YWxpdHksIG9yIHRoZSBMZXNzVGhhbiBjb25kaXRpb24KKyAgICAgICAgICAgICAg
ICAvLyBhbmQgZXF1YWxpdHkgbWVyZ2UgdG9nZXRoZXIgdG8gY3JlYXRlIGEgbG9vc2VyIExlc3NU
aGFuIGNvbmRpdGlvbi4KKworICAgICAgICAgICAgICAgIC8vIE90aGVyIGlzOiBAeCA8IG90aGVy
RWZmZWN0aXZlUmlnaHQKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIEB4ID09IHRoaXNSaWdo
dAorCisgICAgICAgICAgICAgICAgaWYgKG90aGVyRWZmZWN0aXZlUmlnaHQgPD0gdGhpc1JpZ2h0
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBAeCA8PSB0aGlzUmlnaHQKKyAgICAg
ICAgICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNz
VGhhbiwgMSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgZnVuY3RvcihvdGhlcik7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7Cisg
ICAgICAgICAgICAgICAgLy8gT3Bwb3NpdGUgb2YgdGhlIExlc3NUaGFuIGNhc2UsIGFib3ZlLgor
CisgICAgICAgICAgICAgICAgLy8gT3RoZXIgaXM6IEB4ID4gb3RoZXJFZmZlY3RpdmVSaWdodAor
ICAgICAgICAgICAgICAgIC8vIFRoaXMgaXM6IEB4ID09IHRoaXNSaWdodAorCisgICAgICAgICAg
ICAgICAgaWYgKG90aGVyRWZmZWN0aXZlUmlnaHQgPj0gdGhpc1JpZ2h0KSB7CisgICAgICAgICAg
ICAgICAgICAgIC8vIENyZWF0ZSBAeCA+PSB0aGlzUmlnaHQKKyAgICAgICAgICAgICAgICAgICAg
ZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBHcmVhdGVyVGhhbiwgLTEpKTsK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGZ1bmN0b3Iob3RoZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBOb3RFcXVhbDogeworICAgICAgICAgICAgICAg
IC8vIFdlIGtlZXAgdGhlIE5vdEVxdWFsIHNvIGxvbmcgYXMgaXQgZG9lc24ndCBjb250cmFkaWN0
IG91ciBFcXVhbC4KKyAgICAgICAgICAgICAgICBpZiAob3RoZXJFZmZlY3RpdmVSaWdodCA9PSB0
aGlzUmlnaHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAg
IGZ1bmN0b3Iob3RoZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0g
fQorCisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMZXNzVGhhbjogeworICAgICAg
ICAgICAgc3dpdGNoIChvdGhlci5tX2tpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgRXF1YWw6IHsK
KyAgICAgICAgICAgICAgICBvdGhlci5tZXJnZUNvbnN0YW50c0ltcGwoKnRoaXMsIGZ1bmN0b3Ip
OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Y2FzZSBMZXNzVGhhbjogeworICAgICAgICAgICAgICAgIC8vIEtlZXAgdGhlIG9uZSB0aGF0IGhh
cyBhIGxhcmdlciBjb25zdGFudC4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBp
ZiAodGhpc0VmZmVjdGl2ZVJpZ2h0ID49IG90aGVyRWZmZWN0aXZlUmlnaHQpIHsKKyAgICAgICAg
ICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmdW5jdG9yKG90aGVyKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2Ug
R3JlYXRlclRoYW46IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgY2xhaW0gdGhhdCBA
eCA+IEBjIHx8IEB4IDwgQGQuIElmIEBkID4gQGMsIHRoaXMgaXMgdGhlIHRhdXRvbG9neS4gSWYK
KyAgICAgICAgICAgICAgICAvLyBAZCA8PSBAYywgaXQncyBzb3J0IG9mIHVuaW50ZXJlc3Rpbmcu
IEp1c3QgaWdub3JlIHRoaXMuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjYXNlIE5vdEVxdWFsOiB7CisgICAgICAgICAgICAgICAgLy8gV2Ug
aGF2ZSBhIGNsYWltIHRoYXQgQHggPCBAYyB8fCBAeCAhPSBAZC4gVGhpcyBpc24ndCBpbnRlcmVz
dGluZy4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46IHsKKyAg
ICAgICAgICAgIHN3aXRjaCAob3RoZXIubV9raW5kKSB7CisgICAgICAgICAgICBjYXNlIEVxdWFs
OiB7CisgICAgICAgICAgICAgICAgb3RoZXIubWVyZ2VDb25zdGFudHNJbXBsKCp0aGlzLCBmdW5j
dG9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGNhc2UgTGVzc1RoYW46IHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgaW50ZXJlc3Rpbmcs
IHNlZSBhYm92ZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGNhc2UgR3JlYXRlclRoYW46IHsKKyAgICAgICAgICAgICAgICAvLyBLZWVwIHRo
ZSBvbmUgd2l0aCB0aGUgc21hbGxlciBjb25zdGFudC4KKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBpZiAodGhpc0VmZmVjdGl2ZVJpZ2h0IDw9IG90aGVyRWZmZWN0aXZlUmlnaHQp
IHsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmdW5jdG9y
KG90aGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGNhc2UgTm90RXF1YWw6IHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgaW50ZXJlc3Rp
bmcsIHNlZSBhYm92ZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IH0K
KworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTm90RXF1YWw6IHsKKyAgICAgICAg
ICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICAgICAgb3RoZXIubWVy
Z2VDb25zdGFudHNJbXBsKCp0aGlzLCBmdW5jdG9yKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfSB9CisKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9
CiAgICAgCiAgICAgTm9kZSogbV9sZWZ0OwogICAgIE5vZGUqIG1fcmlnaHQ7CkBAIC0xMTU5LDYg
KzE0NTQsNzIgQEAgcHJpdmF0ZToKICAgICAgICAgYXV0byByZXN1bHQgPSByZWxhdGlvbnNoaXBN
YXAuYWRkKAogICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxlZnQoKSwgVmVjdG9yPFJlbGF0aW9u
c2hpcD4oKSk7CiAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+JiByZWxhdGlvbnNoaXBzID0g
cmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKKworICAgICAgICBpZiAocmVsYXRpb25zaGlwLnJpZ2h0
KCktPmlzSW50MzJDb25zdGFudCgpKSB7CisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGRvIHNv
bWUgd29yayB0byByZWZpbmUgcmVsYXRpb25zaGlwcyBvdmVyIGNvbnN0YW50cy4gVGhpcyBpcyBu
ZWNlc3NhcnkgYmVjYXVzZQorICAgICAgICAgICAgLy8gd2hlbiB3ZSBpbnRyb2R1Y2UgYSBjb25z
dGFudCBpbnRvIHRoZSBJUiwgd2UgZG9uJ3QgYXV0b21hdGljYWxseSBjcmVhdGUgcmVsYXRpb25z
aGlwcworICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGF0IGNvbnN0YW50IGFuZCB0aGUgb3RoZXIg
Y29uc3RhbnRzLiBUaGF0IG1lYW5zIHRoYXQgd2hlbiB3ZSBkbyBpbnRyb2R1Y2UKKyAgICAgICAg
ICAgIC8vIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhIG5vbi1jb25zdGFudCBhbmQgYSBjb25zdGFu
dCwgd2UgbmVlZCB0byBjaGVjayB0aGUgb3RoZXIKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hp
cHMgYmV0d2VlbiB0aGF0IG5vbi1jb25zdGFudCBhbmQgb3RoZXIgY29uc3RhbnRzIHRvIHNlZSBp
ZiB3ZSBjYW4gbWFrZSBzb21lCisgICAgICAgICAgICAvLyByZWZpbmVtZW50cy4gUG9zc2libGUg
Y29uc3RhbnQgc3RhdGVtZW50IGZpbHRyYXRpb25zOgorICAgICAgICAgICAgLy8KKyAgICAgICAg
ICAgIC8vIC0gQHggPT0gQGMgYW5kIEB4ICE9IEBkLCB3aGVyZSBAYyA+IEBkOgorICAgICAgICAg
ICAgLy8gICAgICAgQHggPT0gQGMgYW5kIEB4ID4gQGQKKyAgICAgICAgICAgIC8vCisgICAgICAg
ICAgICAvLyBvciB3ZSBjb3VsZCBkbyBzb21ldGhpbmcgZmFyIG1vcmUgYWdncmVzc2l2ZToKKyAg
ICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAtIEB4ID09IEBjIGFuZCBAeCBvcCBAZCB3aGVy
ZSBAYyA9PSBAZCArIGsKKyAgICAgICAgICAgIC8vICAgICAgIEB4ID09IEBjIGFuZCBAeCA9PSBA
ZCArIGsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBCdXQgdGhpcyBpcyBhbHNvIHBv
c3NpYmxlOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIC0gQHggPiBAYyBhbmQgQHgg
IT0gQGQgd2hlcmUgQGMgPT0gQGQgKyBrIGFuZCBrIDw9IDAKKyAgICAgICAgICAgIC8vCisgICAg
ICAgICAgICAvLyAgICAgICBAeCA+IEBjIGFuZCBAeCA+IEBkIC0gaworICAgICAgICAgICAgLy8K
KyAgICAgICAgICAgIC8vIFNvLCBoZXJlJ3Mgd2hhdCB3ZSBzaG91bGQgZG8gZGVwZW5kaW5nIG9u
IHRoZSBraW5kIG9mIHJlbGF0aW9uc2hpcCB3ZSdyZSBpbnRyb2R1Y2luZzoKKyAgICAgICAgICAg
IC8vCisgICAgICAgICAgICAvLyBFcXVhbCBjb25zdGFudDogRmluZCBhbGwgTGVzc1RoYW4sIE5v
dEVxdWFsLCBhbmQgR3JlYXRlclRoYW4gY29uc3RhbnQgb3BlcmF0aW9ucyBhbmQgcmVmaW5lCisg
ICAgICAgICAgICAvLyAgICAgdGhlbSB0byBiZSBFcXVhbCBjb25zdGFudC4gRG9uJ3Qgd29ycnkg
YWJvdXQgY29udHJhZGljdGlvbnMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTGVz
c1RoYW4sIEdyZWF0ZXJUaGFuIGNvbnN0YW50OiBTZWUgaWYgdGhlcmUgaXMgYW55IEVxdWFsIGNv
bnN0YW50LCBhbmQgaWYgc28sIHJlZmluZSB0bworICAgICAgICAgICAgLy8gICAgIHRoYXQuIE90
aGVyd2lzZSwgZmluZCBhbGwgTm90RXF1YWwgY29uc3RhbnQgb2VwcmF0aW9ucyBhbmQgcmVmaW5l
IHRoZW0gdG8gYmUgTGVzc1RoYW4gb3IKKyAgICAgICAgICAgIC8vICAgICBHcmVhdGVyVGhhbiBj
b25zdGFudCBpZiBwb3NzaWJsZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOb3RF
cXVhbCBjb25zdGFudDogU2VlIGlmIHRoZXJlIGlzIGFueSBFcXVhbCBjb25zdGFudCwgYW5kIGlm
IHNvLCByZWZpbmUgdG8gdGhhdC4gT3RoZXJ3aXNlLAorICAgICAgICAgICAgLy8gICAgIHNlZSBp
ZiB0aGVyZSBpcyBhbnkgTGVzc1RoYW4gb3IgR3JlYXRlclRoYW4gY29uc3RhbnQgb3BlcmF0aW9u
LCBhbmQgaWYgc28sIGF0dGVtcHQgdG8KKyAgICAgICAgICAgIC8vICAgICByZWZpbmUgdG8gdGhh
dC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTZWVtcyB0aGF0IHRoZSBrZXkgdGhp
bmcgaXMgdG8gaGF2ZSBhIGZpbHRlckNvbnN0YW50KCkgb3BlcmF0aW9uIHRoYXQgcmV0dXJucyBh
IHJlZmluZWQKKyAgICAgICAgICAgIC8vIHZlcnNpb24gb2YgKnRoaXMgYmFzZWQgb24gb3RoZXIu
IFRoZSBjb2RlIGhlcmUgYWNjb21wbGlzaGVzIHRoaXMgYnkgdXNpbmcgdGhlIHZhZ3VlbmVzcwor
ICAgICAgICAgICAgLy8gaW5kZXggKFJlbGF0aW9uc2hpcDo6dmFndWVuZXNzKCkpIHRvIGZpcnN0
IGZpbmQgbGVzcyB2YWd1ZSByZWxhdGlvbnNoaXBzIGFuZCByZWZpbmUgdGhpcyBvbmUKKyAgICAg
ICAgICAgIC8vIHVzaW5nIHRoZW0sIGFuZCB0aGVuIGZpbmQgbW9yZSB2YWd1ZSByZWxhdGlvbnNo
aXBzIGFuZCByZWZpbmUgdGhvc2UgdG8gdGhpcy4KKworICAgICAgICAgICAgaWYgKHJlbGF0aW9u
c2hpcC52YWd1ZW5lc3MoKSAhPSBSZWxhdGlvbnNoaXBzOjptaW5WYWd1ZW5lc3MpIHsKKyAgICAg
ICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYgb3RoZXJSZWxhdGlvbnNoaXAgOiByZWxhdGlv
bnNoaXBzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclJlbGF0aW9uc2hpcC52YWd1
ZW5lc3MoKSA8IHJlbGF0aW9uc2hpcC52YWd1ZW5lc3MoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgJiYgb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKS0+aXNJbnQzMkNvbnN0YW50KCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxh
dGlvbnNoaXAuZmlsdGVyQ29uc3RhbnQob3RoZXJSZWxhdGlvbnNoaXApOworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgbmV3UmVsYXRpb25zaGlwICE9IHJlbGF0aW9uc2hp
cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgICBSZWZpbmVkIHRv
OiAiLCBuZXdSZWxhdGlvbnNoaXAsICIgYmFzZWQgb24gIiwgb3RoZXJSZWxhdGlvbnNoaXAsICJc
biIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gbmV3UmVsYXRpb25z
aGlwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLnZhZ3VlbmVzcygpICE9IFJlbGF0
aW9uc2hpcHM6Om1heFZhZ3VlbmVzcykgeworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25z
aGlwJiBvdGhlclJlbGF0aW9uc2hpcCA6IHJlbGF0aW9uc2hpcHMpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKG90aGVyUmVsYXRpb25zaGlwLnZhZ3VlbmVzcygpID4gcmVsYXRpb25zaGlwLnZh
Z3VlbmVzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBvdGhlclJlbGF0aW9uc2hpcC5y
aWdodCgpLT5pc0ludDMyQ29uc3RhbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVs
YXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9IG90aGVyUmVsYXRpb25zaGlwLmZpbHRlckNvbnN0
YW50KHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAm
JiBuZXdSZWxhdGlvbnNoaXAgIT0gb3RoZXJSZWxhdGlvbnNoaXApCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGF0YUxvZygiICAgICAgUmVmaW5lZCAiLCBvdGhlclJlbGF0aW9uc2hpcCwg
IiB0bzogIiwgbmV3UmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG90aGVyUmVsYXRpb25zaGlwID0gbmV3UmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAg
ICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CiAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxz
ZTsKICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAmIG90aGVyUmVsYXRpb25zaGlwIDogcmVsYXRp
b25zaGlwcykgewpAQCAtMTE2OSw2ICsxNTMwLDkgQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAg
ICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgLy8gRklYTUU6IEFsc28gYWRkIGZpbHRyYXRpb24gb3ZlciBzdGF0ZW1lbnRz
IGFib3V0IGNvbnN0YW50cy4gRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUKKyAgICAgICAgICAgIC8v
IEB4ID09IEBjIGFuZCBAeCAhPSBAZCwgd2hlcmUgQGQgPiBAYywgdGhlbiB3ZSB3YW50IHRvIHR1
cm4gQHggIT0gQGQgaW50byBAeCA8IEBkLgogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAo
dGltZVRvTGl2ZSAmJiBvdGhlclJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpF
cXVhbCkgewogICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQpAQCAtMTI2Miw1MCArMTYyNiw0
OCBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHNvdXJjZVJl
bGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJi
b3NlKQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICBNZXJnaW5nICIsIHRhcmdl
dFJlbGF0aW9uc2hpcCwgIiBhbmQgIiwgc291cmNlUmVsYXRpb25zaGlwLCAiOlxuIik7Ci0gICAg
ICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPQotICAgICAgICAg
ICAgICAgICAgICAgICAgdGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdlKHNvdXJjZVJlbGF0aW9uc2hp
cCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9z
ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3UmVsYXRp
b25zaGlwLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAg
IGlmICghbmV3UmVsYXRpb25zaGlwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRv
IGZpbHRlcigpIHRvIGF2b2lkIGV4cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBpZGVudGljYWwKLSAg
ICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwcy4gV2UgZG8gdGhpcyBoZXJlIHRvIGF2
b2lkIG1ha2luZyBzZXRPbmVTaWRlKCkgZG8KLSAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSB3
b3JrLCBzaW5jZSB3ZSBleHBlY3Qgc2V0T25lU2lkZSgpIHdpbGwgYmUgY2FsbGVkIG1vcmUKLSAg
ICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0IHNv
bWUgcG9pbnQgc29tZW9uZSBtaWdodCBzdGFydAotICAgICAgICAgICAgICAgICAgICAvLyB3aXRo
IHR3byByZWxhdGlvbnNoaXBzIGxpa2UgQGEgPiBAYiAtIEMgYW5kIEBhIDwgQGIgKyBELiBUaGVu
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNvbWVvbmUgZG9lcyBhIHNldFJlbGF0aW9uc2hpcCgp
IHBhc3Npbmcgc29tZXRoaW5nIHRoYXQgdHVybnMKLSAgICAgICAgICAgICAgICAgICAgLy8gYm90
aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBOb3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNhdGVk
LgotICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBzYXkgdGhhdCB0aGlzIGR1cGxpY2F0ZSBA
YSA9PSBAYiBlbmRzIHVwIGF0IHRoZSBoZWFkIG9mIGEKLSAgICAgICAgICAgICAgICAgICAgLy8g
bG9vcC4gSWYgd2UgZGlkbid0IGhhdmUgdGhpcyBydWxlLCB0aGVuIHRoZSBsb29wIHdvdWxkIHBy
b3BhZ2F0ZQotICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRv
IHRoZSBleGlzdGluZyBkdXBsaWNhdGUgQGEgPT0gQGIncy4KLSAgICAgICAgICAgICAgICAgICAg
Ly8gVGhlcmUgd291bGQgYmUgZm91ciBwYWlycyBvZiBAYSA9PSBAYiwgZWFjaCBvZiB3aGljaCB3
b3VsZAotICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgQGEgPT0gQGIuIE5vdyB3
ZSdkIGhhdmUgZm91ciBvZiB0aGVzZSBkdXBsaWNhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8v
IGFuZCB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUgOCwgdGhlbiAxNiwgZXRjLiBXZSBh
dm9pZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGhlcmUgYnkgZG9pbmcgdGhpcyBmaWx0
cmF0aW9uLiBUaGF0IG1pZ2h0IGJlIGEgYml0IG9mCi0gICAgICAgICAgICAgICAgICAgIC8vIG92
ZXJraWxsLCBzaW5jZSBpdCdzIHByb2JhYmx5IGp1c3QgdGhlIGlkZW50aWNhbCBkdXBsaWNhdGUK
LSAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwIGNhc2Ugd2Ugd2FudCcgdG8gYXZv
aWQuIEJ1dCwgSSdsbCBrZWVwIHRoaXMgdW50aWwKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ug
aGF2ZSBldmlkZW5jZSB0aGF0IHRoaXMgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLiBSZW1lbWJl
ciAtCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IGRlYWxpbmcgd2l0aCBh
IGxpc3QgdGhhdCBpcyBwcnVuZWQgZG93biB0bwotICAgICAgICAgICAgICAgICAgICAvLyByZWxh
dGlvbnNoaXBzIHdpdGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hvdWxkbid0IGJlIGEK
LSAgICAgICAgICAgICAgICAgICAgLy8gbGFyZ2UgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAg
Ym9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hp
cCYgZXhpc3RpbmdSZWxhdGlvbnNoaXAgOiBtZXJnZWRSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMobmV3
UmVsYXRpb25zaGlwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hp
cCBmaWx0ZXJlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVs
YXRpb25zaGlwLmZpbHRlcihuZXdSZWxhdGlvbnNoaXApOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChmaWx0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
eGlzdGluZ1JlbGF0aW9uc2hpcCA9IGZpbHRlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWxhdGlvbnNoaXAubWVyZ2UoCisgICAg
ICAgICAgICAgICAgICAgICAgICBzb3VyY2VSZWxhdGlvbnNoaXAsCisgICAgICAgICAgICAgICAg
ICAgICAgICBbJl0gKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGF0YUxvZygiICAgIEdvdCAiLCBuZXdSZWxhdGlvbnNoaXAsICJcbiIpOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdl
IG5lZWQgdG8gZmlsdGVyKCkgdG8gYXZvaWQgZXhwb25lbnRpYWwgZXhwbG9zaW9uIG9mIGlkZW50
aWNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuIFdlIGRv
IHRoaXMgaGVyZSB0byBhdm9pZCBtYWtpbmcgc2V0T25lU2lkZSgpIGRvCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gbW9yZSB3b3JrLCBzaW5jZSB3ZSBleHBlY3Qgc2V0T25lU2lkZSgp
IHdpbGwgYmUgY2FsbGVkIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVx
dWVudGx5LiBIZXJlJ3MgYW4gZXhhbXBsZS4gQXQgc29tZSBwb2ludCBzb21lb25lIG1pZ2h0IHN0
YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0d28gcmVsYXRpb25zaGlw
cyBsaWtlIEBhID4gQGIgLSBDIGFuZCBAYSA8IEBiICsgRC4gVGhlbgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIHNvbWVvbmUgZG9lcyBhIHNldFJlbGF0aW9uc2hpcCgpIHBhc3Npbmcg
c29tZXRoaW5nIHRoYXQgdHVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3Ro
IG9mIHRoZXNlIGludG8gQGEgPT0gQGIuIE5vdyB3ZSBoYXZlIEBhID09IEBiIGR1cGxpY2F0ZWQu
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3Mgc2F5IHRoYXQgdGhpcyBkdXBs
aWNhdGUgQGEgPT0gQGIgZW5kcyB1cCBhdCB0aGUgaGVhZCBvZiBhCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gbG9vcC4gSWYgd2UgZGlkbid0IGhhdmUgdGhpcyBydWxlLCB0aGVuIHRo
ZSBsb29wIHdvdWxkIHByb3BhZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1
cGxpY2F0ZSBAYSA9PSBAYidzIG9udG8gdGhlIGV4aXN0aW5nIGR1cGxpY2F0ZSBAYSA9PSBAYidz
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdvdWxkIGJlIGZvdXIgcGFp
cnMgb2YgQGEgPT0gQGIsIGVhY2ggb2Ygd2hpY2ggd291bGQKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBjcmVhdGUgYSBuZXcgQGEgPT0gQGIuIE5vdyB3ZSdkIGhhdmUgZm91ciBvZiB0
aGVzZSBkdXBsaWNhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBu
ZXh0IHRpbWUgYXJvdW5kIHdlJ2QgaGF2ZSA4LCB0aGVuIDE2LCBldGMuIFdlIGF2b2lkCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBoZXJlIGJ5IGRvaW5nIHRoaXMgZmlsdHJh
dGlvbi4gVGhhdCBtaWdodCBiZSBhIGJpdCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIG92ZXJraWxsLCBzaW5jZSBpdCdzIHByb2JhYmx5IGp1c3QgdGhlIGlkZW50aWNhbCBkdXBs
aWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXAgY2FzZSB3
ZSB3YW50JyB0byBhdm9pZC4gQnV0LCBJJ2xsIGtlZXAgdGhpcyB1bnRpbAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgZXZpZGVuY2UgdGhhdCB0aGlzIGlzIGEgcGVyZm9y
bWFuY2UgcHJvYmxlbS4gUmVtZW1iZXIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IHdlIGFyZSBhbHJlYWR5IGRlYWxpbmcgd2l0aCBhIGxpc3QgdGhhdCBpcyBwcnVuZWQgZG93biB0
bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgd2l0aCBpZGVu
dGljYWwgbGVmdCBvcGVyYW5kLiBJdCBzaG91bGRuJ3QgYmUgYQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGxhcmdlIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9v
bCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRp
b25zaGlwJiBleGlzdGluZ1JlbGF0aW9uc2hpcCA6IG1lcmdlZFJlbGF0aW9uc2hpcHMpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUmVsYXRpb25zaGlwLnNh
bWVOb2Rlc0FzKG5ld1JlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXJlZCA9CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAuZmlsdGVyKG5ld1JlbGF0aW9u
c2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWQp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0
aW9uc2hpcCA9IGZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG1lcmdlZFJlbGF0aW9uc2hpcHMuYXBwZW5kKG5ld1JlbGF0aW9uc2hp
cCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2Vk
UmVsYXRpb25zaGlwcy5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIH0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAg
IHN0ZDo6c29ydChtZXJnZWRSZWxhdGlvbnNoaXBzLmJlZ2luKCksIG1lcmdlZFJlbGF0aW9uc2hp
cHMuZW5kKCkpOwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvaGFy
ZC1vdmVyZmxvdy1jaGVjay1lcXVhbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL3NjcmlwdC10ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNrLWVxdWFsLmpzCShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvaGFyZC1vdmVyZmxv
dy1jaGVjay1lcXVhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3IEBACitmdW5jdGlv
biBmb28obykgeworICAgIHZhciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSAwOyBpICE9
IDEwMDsgKytpKSAvLyArK2kgc3RpbGwgaGFzIGFuIG92ZXJmbG93IGNoZWNrIGluIHRoZSBlbWl0
dGVkIGNvZGUKKyAgICAgICAgcmVzdWx0ICs9IG8uZjsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
Citub0lubGluZShmb28pOworCit2YXIgcCA9IHtmOjQyfTsKK3ZhciBvID0gT2JqZWN0LmNyZWF0
ZShwKTsKKworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwMDsgKytpKSB7CisgICAgcC5mID0gaTsK
KyAgICBmb28obyk7Cit9CisKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRl
c3RzL2hhcmQtb3ZlcmZsb3ctY2hlY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMv
cmVncmVzcy9zY3JpcHQtdGVzdHMvaGFyZC1vdmVyZmxvdy1jaGVjay5qcwkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ctY2hl
Y2suanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNyBAQAorZnVuY3Rpb24gZm9vKG8pIHsK
KyAgICB2YXIgcmVzdWx0ID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwMDsgKytpKSAv
LyArK2kgc3RpbGwgaGFzIGFuIG92ZXJmbG93IGNoZWNrIGluIHRoZSBlbWl0dGVkIGNvZGUKKyAg
ICAgICAgcmVzdWx0ICs9IG8uZjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitub0lubGluZShm
b28pOworCit2YXIgcCA9IHtmOjQyfTsKK3ZhciBvID0gT2JqZWN0LmNyZWF0ZShwKTsKKworZm9y
ICh2YXIgaSA9IDA7IGkgPCAxMDAwMDsgKytpKSB7CisgICAgcC5mID0gaTsKKyAgICBmb28obyk7
Cit9CisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>259487</attachid>
            <date>2015-08-20 12:46:20 -0700</date>
            <delta_ts>2015-08-20 14:28:36 -0700</delta_ts>
            <desc>more refined</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>35938</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg4Njk1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBA
CisyMDE1LTA4LTIwICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
T3ZlcmZsb3cgY2hlY2sgZWxpbWluYXRpb24gZmFpbHMgZm9yIGEgc2ltcGxlIHRlc3QgY2FzZQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3Mzg3CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgT3ZlcmZsb3cg
Y2hlY2sgZWxpbWluYXRpb24gd2FzIGhhdmluZyBpc3N1ZXMgd2hlbiB0aGluZ3MgZ290IGNvbnN0
YW50LWZvbGRlZCwgYmVjYXVzZSB3aGVyZWFzIGFuCisgICAgICAgIEFkZCBvciBMZXNzVGhhbiBv
cGVyYXRpb24gdGVhY2hlcyB1cyBhYm91dCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHRoaW5n
cyBiZWluZyBhZGRlZCBvcgorICAgICAgICBjb21wYXJlZCwgd2UgZG9uJ3QgZG8gdGhhdCB3aGVu
IHdlIHNlZSBhIEpTQ29uc3RhbnQuIFdlIGRvbid0IGNyZWF0ZSBhIHJlbGF0aW9uc2hpcCBiZXR3
ZWVuIGV2ZXJ5CisgICAgICAgIEpTQ29uc3RhbnQgYW5kIGV2ZXJ5IG90aGVyIEpTQ29uc3RhbnQu
IFNvLCBpZiB3ZSBjb25zdGFudC1mb2xkIGFuIEFkZCwgd2UgZm9yZ2V0IHRoZSByZWxhdGlvbnNo
aXBzCisgICAgICAgIHRoYXQgaXQgd291bGQgaGF2ZSBoYWQgd2l0aCBpdHMgaW5wdXRzLgorCisg
ICAgICAgIE9uZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIGV2ZXJ5IEpTQ29uc3RhbnQgY3Jl
YXRlIGEgcmVsYXRpb25zaGlwIHdpdGggZXZlcnkgb3RoZXIgSlNDb25zdGFudC4KKyAgICAgICAg
VGhpcyBpcyBkYW5nZXJvdXMsIHNpbmNlIGl0IHdvdWxkIGNyZWF0ZSBPKG5eMikgZXhwbG9zaW9u
IG9mIHJlbGF0aW9uc2hpcHMuCisKKyAgICAgICAgSW5zdGVhZCwgdGhpcyBwYXRjaCB0ZWFjaGVz
IGZpbHRyYXRpb24gYW5kIG1lcmdpbmcgaG93IHRvIGJlaGF2ZSAiYXMgaWYiIHRoZXJlIHdlcmUg
aW50ZXItY29uc3RhbnQKKyAgICAgICAgcmVsYXRpb25zaGlwcy4gTm9ybWFsbHkgdGhvc2Ugb3Bl
cmF0aW9ucyBvbmx5IHdvcmsgb24gdHdvIHJlbGF0aW9uc2hpcHMgaW52b2x2aW5nIHRoZSBzYW1l
IG5vZGUKKyAgICAgICAgcGFpci4gQnV0IG5vdywgaWYgd2UgaGF2ZSBAeCBvcCBAYyBhbmQgQHgg
b3AgQGQsIHdoZXJlIEBjIGFuZCBAZCBhcmUgZGlmZmVyZW50IG5vZGVzIGJ1dCBib3RoIGFyZQor
ICAgICAgICBjb25zdGFudHMsIHdlIHdpbGwgZG8gbWVyZ2luZyBvciBmaWx0ZXJpbmcgYnkgZ3Jv
a2tpbmcgdGhlIGNvbnN0YW50IHZhbHVlcy4KKworICAgICAgICAqIGRmZy9ERkdJbnRlZ2VyUmFu
Z2VPcHRpbWl6YXRpb25QaGFzZS5jcHA6CisKIDIwMTUtMDgtMjAgIEFsZXggQ2hyaXN0ZW5zZW4g
IDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICBDbGVhbiB1cCBDTWFrZSBidWls
ZCBhZnRlciByMTg4NjczCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVn
ZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcAkocmV2aXNp
b24gMTg4NjQ1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VP
cHRpbWl6YXRpb25QaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY5LDYgKzY5LDI2IEBAIHB1
YmxpYzoKICAgICAgICAgTm90RXF1YWwsCiAgICAgICAgIEdyZWF0ZXJUaGFuCiAgICAgfTsKKwor
ICAgIC8vIFNvbWUgcmVsYXRpb25zaGlwcyBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBv
dGhlcnMuIFdoZW4gYSByZWxhdGlvbnNoaXAgcHJvdmlkZXMgbW9yZQorICAgIC8vIGluZm9ybWF0
aW9uLCBpdCBpcyBsZXNzIHZhZ3VlLgorICAgIHN0YXRpYyB1bnNpZ25lZCB2YWd1ZW5lc3MoS2lu
ZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgRXF1
YWw6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAg
ICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNl
IE5vdEVxdWFsOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisg
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1pblZhZ3VlbmVzcyA9IDA7CisgICAgc3RhdGljIGNv
bnN0IHVuc2lnbmVkIG1heFZhZ3VlbmVzcyA9IDI7CiAgICAgCiAgICAgc3RhdGljIEtpbmQgZmxp
cHBlZChLaW5kIGtpbmQpCiAgICAgewpAQCAtMTE4LDYgKzEzOCw4IEBAIHB1YmxpYzoKICAgICBO
b2RlKiByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHQ7IH0KICAgICBLaW5kIGtpbmQoKSBj
b25zdCB7IHJldHVybiBtX2tpbmQ7IH0KICAgICBpbnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4g
bV9vZmZzZXQ7IH0KKworICAgIHVuc2lnbmVkIHZhZ3VlbmVzcygpIGNvbnN0IHsgcmV0dXJuIHZh
Z3VlbmVzcyhraW5kKCkpOyB9CiAgICAgCiAgICAgUmVsYXRpb25zaGlwIGZsaXBwZWQoKSBjb25z
dAogICAgIHsKQEAgLTIzOCwxNSArMjYwLDE2IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIHRy
dWU7CiAgICAgfQogCi0gICAgLy8gQXR0ZW1wdHMgdG8gY3JlYXRlIGEgcmVsYXRpb25zaGlwIHRo
YXQgc3VtbWFyaXplcyB0aGUgdW5pb24gb2YgdGhpcyByZWxhdGlvbnNoaXAgYW5kCi0gICAgLy8g
dGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gVGhlIG51bGwgcmVsYXRpb25zaGlwIGlzIHJldHVybmVk
IHRvIGluZGljYXRlIFRPUC4gVGhpcyBpcyB1c2VkCisgICAgLy8gQXR0ZW1wdHMgdG8gY3JlYXRl
IHJlbGF0aW9uc2hpcHMgdGhhdCBzdW1tYXJpemUgdGhlIHVuaW9uIG9mIHRoaXMgcmVsYXRpb25z
aGlwIGFuZAorICAgIC8vIHRoZSBvdGhlciByZWxhdGlvbnNoaXAuIFJlbGF0aW9uc2hpcHMgYXJl
IHJldHVybmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0b3Igd2l0aCB0aGUgbmV3bHkKKyAgICAvLyBj
cmVhdGVkIHJlbGF0aW9uc2hpcHMuIE5vIHJlbGF0aW9uc2hpcHMgYXJlIGNyZWF0ZWQgdG8gaW5k
aWNhdGUgVE9QLiBUaGlzIGlzIHVzZWQKICAgICAvLyBmb3IgbWVyZ2luZyB0aGUgY3VycmVudCBy
ZWxhdGlvbnNoaXAtYXQtaGVhZCBmb3Igc29tZSBwYWlyIG9mIG5vZGVzIGFuZCBhIG5ldwogICAg
IC8vIHJlbGF0aW9uc2hpcC1hdC1oZWFkIGJlaW5nIHByb3Bvc2VkIGJ5IGEgcHJlZGVjZXNzb3Iu
IFdlIHdpc2ggdG8gY3JlYXRlIGEgbmV3CiAgICAgLy8gcmVsYXRpb25zaGlwIHRoYXQgaXMgdHJ1
ZSB3aGVuZXZlciBlaXRoZXIgb2YgdGhlbSBhcmUgdHJ1ZSwgd2hpY2ggZW5zdXJpbmcgdGhhdCB3
ZSBkb24ndAogICAgIC8vIGRvIHRoaXMgZm9yZXZlci4gQW55dGltZSB3ZSBjcmVhdGUgYSByZWxh
dGlvbnNoaXAgdGhhdCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIG9mIHRoZQogICAgIC8vIHByZXZp
b3VzIG9uZXMsIHdlIHdpbGwgY2F1c2UgdGhlIGFuYWx5c2lzIGZpeHBvaW50IHRvIHJlZXhlY3V0
ZS4KICAgICAvLwotICAgIC8vIElmICp0aGlzIGFuZCBvdGhlciBhcmUgaWRlbnRpY2FsLCB3ZSBq
dXN0IHJldHVybiBpdC4KKyAgICAvLyBJZiAqdGhpcyBhbmQgb3RoZXIgYXJlIGlkZW50aWNhbCwg
d2UganVzdCBwYXNzIGl0IHRvIHRoZSBmdW5jdG9yLgogICAgIC8vCiAgICAgLy8gSWYgdGhleSBh
cmUgZGlmZmVyZW50LCB3ZSBwaWNrIGZyb20gYSBmaW5pdGUgc2V0IG9mICJnZW5lcmFsIiByZWxh
dGlvbnNoaXBzOgogICAgIC8vCkBAIC0yNzcsMTMgKzMwMCwxMiBAQCBwdWJsaWM6CiAgICAgLy8g
ICB0aGF0J3MgaG93ICJkZWVwIiB0aGUgZ2VuZXJhbCByZWxhdGlvbnNoaXAgbGF0dGljZSBpcy4K
ICAgICAvLwogICAgIC8vIE5vdGUgdGhhdCBDIGJlaW5nIGNvbnN0cmFpbmVkIHRvIC0xLDAsMSBh
bHNvIGVuc3VyZXMgdGhhdCB3ZSBuZXZlciBoYXZlIHRvIHJldHVybiBhCi0gICAgLy8gY29tYmlu
YXRpb24gb2YgTHQgYW5kIEd0LCBhcyBpbiBmb3IgZXhhbXBsZSB0aGlzPG90aGVyK0MgJiYgdGhp
cz5vdGhlci1ELiBUaGF0J3Mgd2h5Ci0gICAgLy8gdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIHpl
cm8gb3Igb25lIHJlbGF0aW9uc2hpcHMgcmF0aGVyIHRoYW4gYSBsaXN0IG9mIHJlbGF0aW9uc2hp
cHMuCi0gICAgLy8gVGhlIG9ubHkgcG9zc2libGUgdmFsdWVzIG9mIEMgYW5kIEQgd2hlcmUgdGhp
cyB3b3VsZCB3b3JrIGFyZSAtMSBhbmQgMSwgYnV0IGluIHRoYXQgY2FzZQotICAgIC8vIHdlIGp1
c3Qgc2F5IHRoaXM9PW90aGVyLiBUaGF0IHNhaWQsIHRoZSBsb2dpYyBmb3IgbWVyZ2luZyB0d28g
PT0gcmVsYXRpb25zaGlwcywgbGlrZQotICAgIC8vIHRoaXM9PW90aGVyK0MgfHwgdGhpcz09b3Ro
ZXIrRCBpcyB0byBhdHRlbXB0IHRvIGNyZWF0ZSB0aGVzZSB0d28gcmVsYXRpb25zaGlwczoKLSAg
ICAvLyB0aGlzPm90aGVyK21pbihDLEQpLTEgJiYgdGhpczxvdGhlcittYXgoQyxEKSsxLiBCdXQg
b25seSBvbmUgb2YgdGhlc2UgcmVsYXRpb25zaGlwcyB3aWxsCi0gICAgLy8gYmVsb25nIHRvIHRo
ZSBzZXQgb2YgZ2VuZXJhbCByZWxhdGlvbnNoaXBzLgorICAgIC8vIGNvbWJpbmF0aW9uIG9mIEx0
IGFuZCBHdCwgYXMgaW4gZm9yIGV4YW1wbGUgdGhpczxvdGhlcitDICYmIHRoaXM+b3RoZXItRC4g
VGhlIG9ubHkgcG9zc2libGUKKyAgICAvLyB2YWx1ZXMgb2YgQyBhbmQgRCB3aGVyZSB0aGlzIHdv
dWxkIHdvcmsgYXJlIC0xIGFuZCAxLCBidXQgaW4gdGhhdCBjYXNlIHdlIGp1c3Qgc2F5CisgICAg
Ly8gdGhpcz09b3RoZXIuIFRoYXQgc2FpZCwgdGhlIGxvZ2ljIGZvciBtZXJnaW5nIHR3byA9PSBy
ZWxhdGlvbnNoaXBzLCBsaWtlIHRoaXM9PW90aGVyK0MgfHwKKyAgICAvLyB0aGlzPT1vdGhlcitE
IGlzIHRvIGF0dGVtcHQgdG8gY3JlYXRlIHRoZXNlIHR3byByZWxhdGlvbnNoaXBzOiB0aGlzPm90
aGVyK21pbihDLEQpLTEgJiYKKyAgICAvLyB0aGlzPG90aGVyK21heChDLEQpKzEuIEJ1dCBvbmx5
IG9uZSBvZiB0aGVzZSByZWxhdGlvbnNoaXBzIHdpbGwgYmVsb25nIHRvIHRoZSBzZXQgb2YgZ2Vu
ZXJhbAorICAgIC8vIHJlbGF0aW9uc2hpcHMuCiAgICAgLy8KICAgICAvLyBIZXJlJ3MgYW4gZXhh
bXBsZSBvZiB0aGlzIGluIGFjdGlvbjoKICAgICAvLwpAQCAtMjk1LDE0ICszMTcsNDAgQEAgcHVi
bGljOgogICAgIC8vIGl0ZXJhdGlvbiBhbmQgaT09YSsxIGZyb20gdGhlIHNlY29uZCBpdGVyYXRp
b24sIHdlIGNyZWF0ZSBpPmEtMSBhbmQgaTxhKzIgYnV0IHRoZW4KICAgICAvLyByZWFsaXplIHRo
YXQgb25seSBpPmEtMSBpcyBhIHZhbGlkIGdlbmVyYWwgcmVsYXRpb25zaGlwLiBUaGlzIGdpdmVz
IHVzIGV4YWN0bHkgd2hhdCB3ZQogICAgIC8vIHdhbnQ6IGEgc3RhdGVtZW50IHRoYXQgaT49YS4K
LSAgICBSZWxhdGlvbnNoaXAgbWVyZ2UoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QK
KyAgICAvLworICAgIC8vIEhvd2V2ZXIsIHRoaXMgbWF5IHJldHVybiBhIHBhaXIgb2YgcmVsYXRp
b25zaGlwcyB3aGVuIG1lcmdpbmcgcmVsYXRpb25zaGlwcyBpbnZvbHZpbmcKKyAgICAvLyBjb25z
dGFudHMuIEZvciBleGFtcGxlLCBpZiBnaXZlbjoKKyAgICAvLworICAgIC8vICAgICBAeCA9PSBA
YworICAgIC8vICAgICBAeCA9PSBAZAorICAgIC8vCisgICAgLy8gd2hlcmUgQGMgYW5kIEBkIGFy
ZSBjb25zdGFudHMsIHRoZW4gdGhpcyBtYXkgcGFzcyB0d28gcmVsYXRpb25zaGlwcyB0byB0aGUg
ZnVuY3RvcjoKKyAgICAvLworICAgIC8vICAgICBAeCA+IG1pbihAYywgQGQpIC0gMQorICAgIC8v
ICAgICBAeCA8IG1heChAYywgQGQpICsgMQorICAgIC8vCisgICAgLy8gVGhpcyBzdGlsbCBhbGxv
d3MgZm9yIGNvbnZlcmdlbmNlLCBiZWNhdXNlIGp1c3QgYXMgd2hlbiBtZXJnaW5nIHJlbGF0aW9u
c2hpcHMgb3ZlcgorICAgIC8vIHZhcmlhYmxlcywgdGhpcyBhbHdheXMgcGlja3MgZnJvbSBhIHNl
dCBvZiBnZW5lcmFsIHJlbGF0aW9uc2hpcHMuIEhlbmNlIGFsdGhvdWdoIHRoaXMgbWF5CisgICAg
Ly8gcHJvZHVjZSB0d28gcmVsYXRpb25zaGlwcyBhcyBhIHJlc3VsdCBvZiB0aGUgbWVyZ2UsIHRo
ZSB0b3RhbCBudW1iZXIgb2YgcmVsYXRpb25zaGlwcyB0aGF0CisgICAgLy8gY2FuIGJlIHByZXNl
bnQgYXQgaGVhZCBvZiBibG9jayBpcyBsaW1pdGVkIGJ5IE8oZ3JhcGguc2l6ZV4yKS4KKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRpb25z
aGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKICAgICB7Ci0gICAgICAg
IGlmICghc2FtZU5vZGVzQXMob3RoZXIpKQotICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hp
cCgpOwotICAgICAgICAKICAgICAgICAgLy8gSGFuZGxlIHRoZSBzdXBlciBvYnZpb3VzIGNhc2Ug
Zmlyc3QuCi0gICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikKLSAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICBmdW5jdG9y
KCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgaWYgKG1fbGVmdCAhPSBvdGhlci5tX2xlZnQpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIAorICAgICAgICBpZiAobV9yaWdodCAhPSBvdGhlci5tX3JpZ2h0KSB7CisgICAgICAgICAg
ICBtZXJnZUNvbnN0YW50c0ltcGwob3RoZXIsIGZ1bmN0b3IpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBBU1NFUlQoc2FtZU5vZGVzQXMob3RoZXIp
KTsKICAgICAgICAgCiAgICAgICAgIC8vIFRoaXMgZG9lcyBzb21lIGludGVyZXN0aW5nIHBlcm11
dGF0aW9ucyB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBkdXBsaWNhdGUgY29kZS4gRm9yCiAgICAg
ICAgIC8vIGV4YW1wbGU6CkBAIC0zMjksNyArMzc3LDcgQEAgcHVibGljOgogICAgICAgICAgICAg
Ly8gSW4gcmFyZSBjYXNlcywgd2UgbWlnaHQgbm90IGJlIGFibGUgdG8gZmxpcC4gSnVzdCBnaXZl
IHVwIG9uIGxpZmUgaW4gdGhvc2UKICAgICAgICAgICAgIC8vIGNhc2VzLgogICAgICAgICAgICAg
aWYgKCFhIHx8ICFiKQotICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAKICAgICAgICAgICAgIG5lZWRGbGlw
ID0gdHJ1ZTsKICAgICAgICAgICAgIApAQCAtMzM3LDcgKzM4NSw3IEBAIHB1YmxpYzoKICAgICAg
ICAgICAgIC8vIEBhID4gQGIuIFRoYXQncyBwcmV0dHkgbXVjaCBhbHdheXMgYSB0YXV0b2xvZ3k7
IHdlIGRvbid0IGF0dGVtcHQgdG8gZG8gc21hcnQKICAgICAgICAgICAgIC8vIHRoaW5ncyBmb3Ig
dGhhdCBjYXNlIGZvciBub3cuCiAgICAgICAgICAgICBpZiAoYS5tX2tpbmQgPT0gR3JlYXRlclRo
YW4gfHwgYi5tX2tpbmQgPT0gR3JlYXRlclRoYW4pCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJl
bGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAg
ICAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaWYgd2UgaGF2ZSBhIExlc3NUaGFuLCB0aGVu
IGl0J3MgZmlyc3QuCkBAIC0zNDksMTEgKzM5NywxMyBAQCBwdWJsaWM6CiAgICAgICAgICAgICBz
dGQ6OnN3YXAoYSwgYik7CiAgICAgICAgIAogICAgICAgICBSZWxhdGlvbnNoaXAgcmVzdWx0ID0g
YS5tZXJnZUltcGwoYik7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICAKICAgICAgICAgaWYgKG5lZWRGbGlwKQotICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdC5mbGlwcGVkKCk7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmxpcHBlZCgpOwog
ICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZnVuY3RvcihyZXN1bHQp
OwogICAgIH0KICAgICAKICAgICAvLyBBdHRlbXB0cyB0byBjb25zdHJ1Y3Qgb25lIFJlbGF0aW9u
c2hpcCB0aGF0IGFkZXF1YXRlbHkgc3VtbWFyaXplcyB0aGUgaW50ZXJzZWN0aW9uIG9mCkBAIC00
NTYsNiArNTA2LDU2IEBAIHB1YmxpYzoKICAgICAgICAgQVNTRVJUKG1fa2luZCA9PSBHcmVhdGVy
VGhhbik7CiAgICAgICAgIHJldHVybiBmaWx0ZXJGbGlwcGVkKCk7CiAgICAgfQorCisgICAgLy8g
Q29tZSB1cCB3aXRoIGEgcmVsYXRpb25zaGlwIHRoYXQgaXMgdGhlIGJlc3QgZGVzY3JpcHRpb24g
b2YgdGhpcyAmJiBvdGhlciwgcHJvdmlkZWQgdGhhdCBsZWZ0KCkgaXMKKyAgICAvLyB0aGUgc2Ft
ZSBhbmQgcmlnaHQoKSBpcyBhIGNvbnN0YW50LiBBbHNvIHJlcXVpcmVzIHRoYXQgdGhpcyBpcyBh
dCBsZWFzdCBhcyB2YWd1ZSBhcyBvdGhlci4gSXQgbWF5CisgICAgLy8gcmV0dXJuIHRoaXMgb3Ig
aXQgbWF5IHJldHVybiBzb21ldGhpbmcgZWxzZSwgYnV0IHdoYXRldmVyIGl0IHJldHVybnMsIGl0
IHdpbGwgaGF2ZSB0aGUgc2FtZSBub2RlcyBhcworICAgIC8vIHRoaXMuIFRoaXMgaXMgbm90IGF1
dG9tYXRpY2FsbHkgZG9uZSBieSBmaWx0ZXIoKSBiZWNhdXNlIGl0IGN1cnJlbnRseSBvbmx5IG1h
a2VzIHNlbnNlIHRvIGNhbGwgdGhpcworICAgIC8vIGR1cmluZyBhIHZlcnkgcGFydGljdWxhciBw
YXJ0IG9mIHNldE9uZVNpZGUoKS4KKyAgICBSZWxhdGlvbnNoaXAgZmlsdGVyQ29uc3RhbnQoY29u
c3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2xl
ZnQgPT0gb3RoZXIubV9sZWZ0KTsKKyAgICAgICAgQVNTRVJUKG1fcmlnaHQtPmlzSW50MzJDb25z
dGFudCgpKTsKKyAgICAgICAgQVNTRVJUKG90aGVyLm1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgp
KTsKKyAgICAgICAgQVNTRVJUKHZhZ3VlbmVzcygpID49IG90aGVyLnZhZ3VlbmVzcygpKTsKKwor
ICAgICAgICBpZiAodmFndWVuZXNzKCkgPT0gb3RoZXIudmFndWVuZXNzKCkpCisgICAgICAgICAg
ICByZXR1cm4gKnRoaXM7CisKKyAgICAgICAgLy8gVGhpcyBpcyBtb3JlIHZhZ3VlIHRoYW4gb3Ro
ZXIuIE90aGVyIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGlzLiBUaGlzIGlzIGxlc3Mgc3BlY2lm
aWMgdGhhbgorICAgICAgICAvLyBvdGhlci4gT3RoZXIgaXMgbGVzcyB2YWd1ZSB0aGFuIHRoaXMu
CisgICAgICAgIEFTU0VSVCh2YWd1ZW5lc3MoKSA+IG90aGVyLnZhZ3VlbmVzcygpKTsKKworICAg
ICAgICBpbnQgdGhpc1JpZ2h0ID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICBpbnQgb3Ro
ZXJSaWdodCA9IG90aGVyLm1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIC8v
IElnbm9yZSBmdW5ueSBidXNpbmVzcy4KKyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG90
aGVyUmlnaHQsIG90aGVyLm1fb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKwor
ICAgICAgICBpbnQgb3RoZXJFZmZlY3RpdmVSaWdodCA9IG90aGVyUmlnaHQgKyBvdGhlci5tX29m
ZnNldDsKKworICAgICAgICBzd2l0Y2ggKG90aGVyLm1fa2luZCkgeworICAgICAgICBjYXNlIEVx
dWFsOgorICAgICAgICAgICAgLy8gUmV0dXJuIGEgdmVyc2lvbiBvZiAqdGhpcyB0aGF0IGlzIEVx
dWFsIHRvIG90aGVyJ3MgY29uc3RhbnQuCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KG1fbGVmdCwgbV9yaWdodCwgRXF1YWwsIG90aGVyRWZmZWN0aXZlUmlnaHQgLSB0aGlzUmlnaHQp
OworCisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46Cisg
ICAgICAgICAgICBBU1NFUlQobV9raW5kID09IE5vdEVxdWFsKTsKKyAgICAgICAgICAgIC8vIFdl
IGNvdWxkIGRvIHNtYXJ0IHRoaW5ncyBoZXJlLiBCdXQgd2UgZG9uJ3QgY3VycmVudGx5IGhhdmUg
YW4gZXhhbXBsZSBvZiB3aGVuIGl0IHdvdWxkIGJlCisgICAgICAgICAgICAvLyB2YWx1YWJsZS4g
Tm90ZSB0aGF0IHlvdSBoYXZlIHRvIGJlIGNhcmVmdWwuIFdlIGNvdWxkIHJlZmluZSBOb3RFcXVh
bCB0byBMZXNzVGhhbiwgYnV0IG9ubHkKKyAgICAgICAgICAgIC8vIGlmIHRoZSBMZXNzVGhhbiBz
dWJzdW1lcyB0aGUgTm90RXF1YWwuCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
ICAgICAKKyAgICAgICAgY2FzZSBOb3RFcXVhbDoKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAg
ICAgIH0KKworICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBy
ZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgfQogICAgIAogICAgIGludCBtaW5WYWx1ZU9mTGVm
dCgpIGNvbnN0CiAgICAgewpAQCAtNjY2LDYgKzc2NiwyMDcgQEAgcHJpdmF0ZToKICAgICAgICAg
CiAgICAgICAgIHJldHVybiBncmVhdGVyVGhhbjsKICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVyZ2VDb25zdGFudHNJbXBsKGNvbnN0IFJlbGF0aW9u
c2hpcCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIGNvbnN0CisgICAgeworICAgICAg
ICBBU1NFUlQobV9sZWZ0ID09IG90aGVyLm1fbGVmdCk7CisKKyAgICAgICAgLy8gT25seSBkZWFs
IHdpdGggY29uc3RhbnQgcmlnaHQuCisgICAgICAgIGlmICghbV9yaWdodC0+aXNJbnQzMkNvbnN0
YW50KCkgfHwgIW90aGVyLm1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGZhaXJseSBjb25zZXJ2YXRp
dmUgbWVyZ2UuIFdlIGNvdWxkIHR1bmUgdGhpcyBwaGFzZSB0byBjb21lIHVwIHdpdGgKKyAgICAg
ICAgLy8gYWxsIHBvc3NpYmxlIGluZXF1YWxpdGllcyBiZXR3ZWVuIHZhcmlhYmxlcyBhbmQgY29u
c3RhbnRzLCBidXQgd2UgZm9jdXMgbWFpbmx5IG9uIGNoZWFwCisgICAgICAgIC8vIGNhc2VzIGZv
ciBub3cuCisKKyAgICAgICAgLy8gSGVyZSBhcmUgc29tZSBvZiB0aGUgdGhlIGFycmFuZ2VtZW50
cyB3ZSBjYW4gbWVyZ2UgdXNlZnVsbHkgYXNzdW1pbmcgQGMgPCBAZDoKKyAgICAgICAgLy8KKyAg
ICAgICAgLy8gICAgIEB4ID09IEBjIHx8IEB4ID09IEBkICAgPT4gICBAeCA+PSBjICYmIEB4IDw9
IEBkCisgICAgICAgIC8vICAgICBAeCA+PSBAYyB8fCBAeCA8PSBAZCAgID0+ICAgVE9QCisgICAg
ICAgIC8vICAgICBAeCA9PSBAYyB8fCBAeCAhPSBAZCAgID0+ICAgQHggIT0gQGQKKworICAgICAg
ICBpbnQgdGhpc1JpZ2h0ID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICBpbnQgb3RoZXJS
aWdodCA9IG90aGVyLm1fcmlnaHQtPmFzSW50MzIoKTsKKworICAgICAgICAvLyBJZ25vcmUgZnVu
bnkgYnVzaW5lc3MuCisgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50Pih0aGlzUmlnaHQsIG1f
b2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxp
bnQ+KG90aGVyUmlnaHQsIG90aGVyLm1fb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICBpbnQgdGhpc0VmZmVjdGl2ZVJpZ2h0ID0gdGhpc1JpZ2h0ICsgbV9vZmZzZXQ7Cisg
ICAgICAgIGludCBvdGhlckVmZmVjdGl2ZVJpZ2h0ID0gb3RoZXJSaWdodCArIG90aGVyLm1fb2Zm
c2V0OworCisgICAgICAgIGF1dG8gbWFrZVVwcGVyID0gWyZdIChpbnQ2NF90IHVwcGVyKSB7Cisg
ICAgICAgICAgICBpZiAodXBwZXIgPD0gdGhpc1JpZ2h0KSB7CisgICAgICAgICAgICAgICAgLy8g
V2Ugd2FudCBtX3JpZ2h0ICsgb2Zmc2V0IHRvIGJlIGVxdWFsIHRvIHVwcGVyLiBIZW5jZSB3ZSB3
YW50IG9mZnNldCB0byBjYW5jZWwKKyAgICAgICAgICAgICAgICAvLyB3aXRoIG1fcmlnaHQuIEJ1
dCB0aGVyZSdzIG1vcmUgdG8gaXQsIHNpbmNlIHdlIHdhbnQgKzEgdG8gdHVybiB0aGUgTGVzc1Ro
YW4gaW50bworICAgICAgICAgICAgICAgIC8vIGEgTGVzc1RoYW5PckVxdWFsLCBhbmQgd2Ugd2Fu
dCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZW5kIHVwIHdpdGggbm9uLWdlbmVyYWwKKyAgICAgICAg
ICAgICAgICAvLyBvZmZzZXRzLiAKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc3RhdGlj
X2Nhc3Q8aW50PihzdGQ6Om1heCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50
NjRfdD4oMSkgKyB1cHBlciAtIHN0YXRpY19jYXN0PGludDY0X3Q+KHRoaXNSaWdodCksCisgICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KC0xKSkpOworICAgICAgICAgICAg
ICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIG9mZnNl
dCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVwcGVyIDw9IG90aGVyUmlnaHQp
IHsKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihzdGQ6Om1h
eCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMSkgKyB1cHBlciAt
IHN0YXRpY19jYXN0PGludDY0X3Q+KG90aGVyUmlnaHQpLAorICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxpbnQ2NF90PigtMSkpKTsKKyAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0
aW9uc2hpcChtX2xlZnQsIG90aGVyLm1fcmlnaHQsIExlc3NUaGFuLCBvZmZzZXQpKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgYXV0byBtYWtlTG93ZXIgPSBbJl0gKGludDY0
X3QgbG93ZXIpIHsKKyAgICAgICAgICAgIGlmIChsb3dlciA+PSB0aGlzUmlnaHQpIHsKKyAgICAg
ICAgICAgICAgICAvLyBXZSB3YW50IG1fcmlnaHQgKyBvZmZzZXQgdG8gYmUgZXF1YWwgdG8gbG93
ZXIuIEhlbmNlIHdlIHdhbnQgb2Zmc2V0IHRvIGNhbmNlbCB3aXRoCisgICAgICAgICAgICAgICAg
Ly8gbV9yaWdodC4gQnV0IHRoZXJlJ3MgbW9yZSB0byBpdCwgc2luY2Ugd2Ugd2FudCAtMSB0byB0
dXJuIHRoZSBHcmVhdGVyVGhhbiBpbnRvIGEKKyAgICAgICAgICAgICAgICAvLyBHcmVhdGVyVGhh
bk9yRXF1YWwsIGFuZCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgd2l0aCBu
b24tZ2VuZXJhbAorICAgICAgICAgICAgICAgIC8vIG9mZnNldHMuCisgICAgICAgICAgICAgICAg
aW50IG9mZnNldCA9IHN0YXRpY19jYXN0PGludD4oc3RkOjptaW4oCisgICAgICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KC0xKSArIGxvd2VyIC0gc3RhdGljX2Nhc3Q8aW50NjRf
dD4odGhpc1JpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4o
MSkpKTsKKyAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmln
aHQsIEdyZWF0ZXJUaGFuLCBvZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
IChsb3dlciA+PSBvdGhlclJpZ2h0KSB7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHN0
YXRpY19jYXN0PGludD4oc3RkOjptaW4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PGludDY0X3Q+KC0xKSArIGxvd2VyIC0gc3RhdGljX2Nhc3Q8aW50NjRfdD4ob3RoZXJSaWdodCks
CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KDEpKSk7CisgICAgICAg
ICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBvdGhlci5tX3JpZ2h0LCBHcmVh
dGVyVGhhbiwgb2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAg
c3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDogeworICAgICAgICAgICAgc3dp
dGNoIChvdGhlci5tX2tpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgRXF1YWw6IHsKKyAgICAgICAg
ICAgICAgICBpZiAodGhpc0VmZmVjdGl2ZVJpZ2h0ID09IG90aGVyRWZmZWN0aXZlUmlnaHQpIHsK
KyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcm9iYWJseSB3b24ndCBhcmlzZSBvZnRlbi4g
V2UgY2FuIGtlZXAgd2hpY2hldmVyIHJlbGF0aW9uc2hpcCBpcyBnZW5lcmFsLgorICAgICAgICAg
ICAgICAgICAgICBpZiAobV9vZmZzZXQgPj0gLTEgJiYgbV9vZmZzZXQgPD0gMSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgICAgICAgICBpZiAo
b3RoZXIubV9vZmZzZXQgPj0gLTEgJiYgb3RoZXIubV9vZmZzZXQgPD0gMSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGZ1bmN0b3Iob3RoZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gV2hhdCBmb2xsb3dzIGlz
IHRoZSBvbmx5IGNhc2Ugd2hlcmUgYSBtZXJnZSB3aWxsIGNyZWF0ZSBtb3JlIHJ1bGVzIHRoYW4g
d2hhdCBpdAorICAgICAgICAgICAgICAgIC8vIHN0YXJ0ZWQgd2l0aC4gVGhpcyBpcyBmaW5lIGZv
ciBjb252ZXJnZW5jZSBiZWNhdXNlIHRoZSBMZXNzVGhhbi9HcmVhdGVyVGhhbgorICAgICAgICAg
ICAgICAgIC8vIHJ1bGVzIHRoYXQgdGhpcyBjcmVhdGVzIGFyZSBnZW5lcmFsIChpLmUuIGhhdmUg
c21hbGwgb2Zmc2V0cykgYW5kIHRoZXkgbmV2ZXIKKyAgICAgICAgICAgICAgICAvLyBzcGF3biBt
b3JlIHJ1bGVzIHVwb24gc3Vic2VxdWVudCBtZXJnaW5nLgorCisgICAgICAgICAgICAgICAgbWFr
ZVVwcGVyKHN0ZDo6bWF4KHRoaXNFZmZlY3RpdmVSaWdodCwgb3RoZXJFZmZlY3RpdmVSaWdodCkp
OworICAgICAgICAgICAgICAgIG1ha2VMb3dlcihzdGQ6Om1pbih0aGlzRWZmZWN0aXZlUmlnaHQs
IG90aGVyRWZmZWN0aXZlUmlnaHQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTGVzc1RoYW46IHsKKyAgICAgICAgICAgICAgICAv
LyBFaXRoZXIgdGhlIExlc3NUaGFuIGNvbmRpdGlvbiBzdWJzdW1lcyB0aGUgZXF1YWxpdHksIG9y
IHRoZSBMZXNzVGhhbiBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAvLyBhbmQgZXF1YWxpdHkg
bWVyZ2UgdG9nZXRoZXIgdG8gY3JlYXRlIGEgbG9vc2VyIExlc3NUaGFuIGNvbmRpdGlvbi4KKwor
ICAgICAgICAgICAgICAgIC8vIE90aGVyIGlzOiBAeCA8IG90aGVyRWZmZWN0aXZlUmlnaHQKKyAg
ICAgICAgICAgICAgICAvLyBUaGlzIGlzIEB4ID09IHRoaXNFZmZlY3RpdmVSaWdodAorCisgICAg
ICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBjcmVhdGUgQHggPD0gdXBwZXIuIEZpZ3VyZSBvdXQg
dGhlIHZhbHVlIG9mIHVwcGVyLgorICAgICAgICAgICAgICAgIG1ha2VVcHBlcihzdGQ6Om1heCgK
KyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ob3RoZXJFZmZlY3RpdmVS
aWdodCkgLSAxLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0aGlz
RWZmZWN0aXZlUmlnaHQpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8g
T3Bwb3NpdGUgb2YgdGhlIExlc3NUaGFuIGNhc2UsIGFib3ZlLgorCisgICAgICAgICAgICAgICAg
Ly8gT3RoZXIgaXM6IEB4ID4gb3RoZXJFZmZlY3RpdmVSaWdodAorICAgICAgICAgICAgICAgIC8v
IFRoaXMgaXM6IEB4ID09IHRoaXNFZmZlY3RpdmVSaWdodAorCisgICAgICAgICAgICAgICAgbWFr
ZUxvd2VyKHN0ZDo6bWluKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90
PihvdGhlckVmZmVjdGl2ZVJpZ2h0KSArIDEsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PGludDY0X3Q+KHRoaXNFZmZlY3RpdmVSaWdodCkpKTsKKyAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTm90RXF1YWw6IHsKKyAgICAg
ICAgICAgICAgICAvLyBXZSBrZWVwIHRoZSBOb3RFcXVhbCBzbyBsb25nIGFzIGl0IGRvZXNuJ3Qg
Y29udHJhZGljdCBvdXIgRXF1YWwuCisgICAgICAgICAgICAgICAgaWYgKG90aGVyRWZmZWN0aXZl
UmlnaHQgPT0gdGhpc0VmZmVjdGl2ZVJpZ2h0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgICAgICAgICAvLyBCdXQsIHdlIG9ubHkga2VlcCB0aGUgTm90RXF1YWwgaWYg
aXQgaXMgZ2VuZXJhbC4gVGhpcyBzaW1wbGlmaWVzIHJlYXNvbmluZyBhYm91dAorICAgICAgICAg
ICAgICAgIC8vIGNvbnZlcmdlbmNlOiBtZXJnaW5nIG5ldmVyIGludHJvZHVjZXMgYSBuZXcgcnVs
ZSB1bmxlc3MgdGhhdCBydWxlIGlzIGdlbmVyYWwuCisgICAgICAgICAgICAgICAgaWYgKG90aGVy
Lm1fb2Zmc2V0IDwgLTEgfHwgb3RoZXIubV9vZmZzZXQgPiAxKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZnVuY3RvcihvdGhl
cik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSB9CisKKyAgICAgICAg
ICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBjYXNlIExlc3NUaGFuOiB7CisgICAgICAgICAgICBzd2l0Y2gg
KG90aGVyLm1fa2luZCkgeworICAgICAgICAgICAgY2FzZSBFcXVhbDogeworICAgICAgICAgICAg
ICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhpcywgZnVuY3Rvcik7CisgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIExlc3NUaGFu
OiB7CisgICAgICAgICAgICAgICAgbWFrZVVwcGVyKHN0ZDo6bWF4KAorICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0aGlzRWZmZWN0aXZlUmlnaHQpIC0gMSwKKyAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ob3RoZXJFZmZlY3RpdmVSaWdodCkg
LSAxKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGNs
YWltIHRoYXQgQHggPiBAYyB8fCBAeCA8IEBkLiBJZiBAZCA+IEBjLCB0aGlzIGlzIHRoZSB0YXV0
b2xvZ3kuIElmCisgICAgICAgICAgICAgICAgLy8gQGQgPD0gQGMsIGl0J3Mgc29ydCBvZiB1bmlu
dGVyZXN0aW5nLiBKdXN0IGlnbm9yZSB0aGlzLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBOb3RFcXVhbDogeworICAgICAgICAgICAg
ICAgIC8vIFdlIGhhdmUgYSBjbGFpbSB0aGF0IEB4IDwgQGMgfHwgQHggIT0gQGQuIFRoaXMgaXNu
J3QgaW50ZXJlc3RpbmcuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdyZWF0ZXJU
aGFuOiB7CisgICAgICAgICAgICBzd2l0Y2ggKG90aGVyLm1fa2luZCkgeworICAgICAgICAgICAg
Y2FzZSBFcXVhbDogeworICAgICAgICAgICAgICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgq
dGhpcywgZnVuY3Rvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBjYXNlIExlc3NUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8gTm90IGlu
dGVyZXN0aW5nLCBzZWUgYWJvdmUuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAg
bWFrZUxvd2VyKHN0ZDo6bWluKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2
NF90Pih0aGlzRWZmZWN0aXZlUmlnaHQpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8aW50NjRfdD4ob3RoZXJFZmZlY3RpdmVSaWdodCkgKyAxKSk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE5vdEVxdWFsOiB7
CisgICAgICAgICAgICAgICAgLy8gTm90IGludGVyZXN0aW5nLCBzZWUgYWJvdmUuCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSB9CisKKyAgICAgICAgICAgIFJFTEVBU0Vf
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor
ICAgICAgICBjYXNlIE5vdEVxdWFsOiB7CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09
IEVxdWFsKQorICAgICAgICAgICAgICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhpcywg
ZnVuY3Rvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gfQorCisgICAgICAgIFJF
TEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQogICAgIAogICAgIE5vZGUqIG1fbGVm
dDsKICAgICBOb2RlKiBtX3JpZ2h0OwpAQCAtMTE1OSw2ICsxNDYwLDc2IEBAIHByaXZhdGU6CiAg
ICAgICAgIGF1dG8gcmVzdWx0ID0gcmVsYXRpb25zaGlwTWFwLmFkZCgKICAgICAgICAgICAgIHJl
bGF0aW9uc2hpcC5sZWZ0KCksIFZlY3RvcjxSZWxhdGlvbnNoaXA+KCkpOwogICAgICAgICBWZWN0
b3I8UmVsYXRpb25zaGlwPiYgcmVsYXRpb25zaGlwcyA9IHJlc3VsdC5pdGVyYXRvci0+dmFsdWU7
CisKKyAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5yaWdodCgpLT5pc0ludDMyQ29uc3RhbnQoKSkg
eworICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBkbyBzb21lIHdvcmsgdG8gcmVmaW5lIHJlbGF0
aW9uc2hpcHMgb3ZlciBjb25zdGFudHMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKyAgICAg
ICAgICAgIC8vIHdoZW4gd2UgaW50cm9kdWNlIGEgY29uc3RhbnQgaW50byB0aGUgSVIsIHdlIGRv
bid0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHJlbGF0aW9uc2hpcHMKKyAgICAgICAgICAgIC8vIGJl
dHdlZW4gdGhhdCBjb25zdGFudCBhbmQgdGhlIG90aGVyIGNvbnN0YW50cy4gVGhhdCBtZWFucyB0
aGF0IHdoZW4gd2UgZG8gaW50cm9kdWNlCisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIGJl
dHdlZW4gYSBub24tY29uc3RhbnQgYW5kIGEgY29uc3RhbnQsIHdlIG5lZWQgdG8gY2hlY2sgdGhl
IG90aGVyCisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhhdCBub24tY29u
c3RhbnQgYW5kIG90aGVyIGNvbnN0YW50cyB0byBzZWUgaWYgd2UgY2FuIG1ha2Ugc29tZQorICAg
ICAgICAgICAgLy8gcmVmaW5lbWVudHMuIFBvc3NpYmxlIGNvbnN0YW50IHN0YXRlbWVudCBmaWx0
cmF0aW9uczoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAtIEB4ID09IEBjIGFuZCBA
eCAhPSBAZCwgd2hlcmUgQGMgPiBAZDoKKyAgICAgICAgICAgIC8vICAgICAgIEB4ID09IEBjIGFu
ZCBAeCA+IEBkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gYnV0IGFjdHVhbGx5IHdl
IGFyZSBtb3JlIGFnZ3Jlc3NpdmU6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gLSBA
eCA9PSBAYyBhbmQgQHggb3AgQGQgd2hlcmUgQGMgPT0gQGQgKyBrCisgICAgICAgICAgICAvLyAg
ICAgICBAeCA9PSBAYyBhbmQgQHggPT0gQGQgKyBrCisgICAgICAgICAgICAvLworICAgICAgICAg
ICAgLy8gQW5kIHRoaXMgaXMgYWxzbyBwb3NzaWJsZToKKyAgICAgICAgICAgIC8vCisgICAgICAg
ICAgICAvLyAtIEB4ID4gQGMgYW5kIEB4ICE9IEBkIHdoZXJlIEBjID09IEBkICsgayBhbmQgayA8
PSAwCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgICAgQHggPiBAYyBhbmQgQHgg
PiBAZCAtIGsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTbywgaGVyZSdzIHdoYXQg
d2Ugc2hvdWxkIGRvIGRlcGVuZGluZyBvbiB0aGUga2luZCBvZiByZWxhdGlvbnNoaXAgd2UncmUg
aW50cm9kdWNpbmc6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRXF1YWwgY29uc3Rh
bnQ6IEZpbmQgYWxsIExlc3NUaGFuLCBOb3RFcXVhbCwgYW5kIEdyZWF0ZXJUaGFuIGNvbnN0YW50
IG9wZXJhdGlvbnMgYW5kIHJlZmluZQorICAgICAgICAgICAgLy8gICAgIHRoZW0gdG8gYmUgRXF1
YWwgY29uc3RhbnQuIERvbid0IHdvcnJ5IGFib3V0IGNvbnRyYWRpY3Rpb25zLgorICAgICAgICAg
ICAgLy8KKyAgICAgICAgICAgIC8vIExlc3NUaGFuLCBHcmVhdGVyVGhhbiBjb25zdGFudDogU2Vl
IGlmIHRoZXJlIGlzIGFueSBFcXVhbCBjb25zdGFudCwgYW5kIGlmIHNvLCByZWZpbmUgdG8KKyAg
ICAgICAgICAgIC8vICAgICB0aGF0LiBPdGhlcndpc2UsIGZpbmQgYWxsIE5vdEVxdWFsIGNvbnN0
YW50IG9lcHJhdGlvbnMgYW5kIHJlZmluZSB0aGVtIHRvIGJlIExlc3NUaGFuIG9yCisgICAgICAg
ICAgICAvLyAgICAgR3JlYXRlclRoYW4gY29uc3RhbnQgaWYgcG9zc2libGUuCisgICAgICAgICAg
ICAvLworICAgICAgICAgICAgLy8gTm90RXF1YWwgY29uc3RhbnQ6IFNlZSBpZiB0aGVyZSBpcyBh
bnkgRXF1YWwgY29uc3RhbnQsIGFuZCBpZiBzbywgcmVmaW5lIHRvIHRoYXQuIE90aGVyd2lzZSwK
KyAgICAgICAgICAgIC8vICAgICBzZWUgaWYgdGhlcmUgaXMgYW55IExlc3NUaGFuIG9yIEdyZWF0
ZXJUaGFuIGNvbnN0YW50IG9wZXJhdGlvbiwgYW5kIGlmIHNvLCBhdHRlbXB0IHRvCisgICAgICAg
ICAgICAvLyAgICAgcmVmaW5lIHRvIHRoYXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAg
Ly8gU2VlbXMgdGhhdCB0aGUga2V5IHRoaW5nIGlzIHRvIGhhdmUgYSBmaWx0ZXJDb25zdGFudCgp
IG9wZXJhdGlvbiB0aGF0IHJldHVybnMgYSByZWZpbmVkCisgICAgICAgICAgICAvLyB2ZXJzaW9u
IG9mICp0aGlzIGJhc2VkIG9uIG90aGVyLiBUaGUgY29kZSBoZXJlIGFjY29tcGxpc2hlcyB0aGlz
IGJ5IHVzaW5nIHRoZSB2YWd1ZW5lc3MKKyAgICAgICAgICAgIC8vIGluZGV4IChSZWxhdGlvbnNo
aXA6OnZhZ3VlbmVzcygpKSB0byBmaXJzdCBmaW5kIGxlc3MgdmFndWUgcmVsYXRpb25zaGlwcyBh
bmQgcmVmaW5lIHRoaXMgb25lCisgICAgICAgICAgICAvLyB1c2luZyB0aGVtLCBhbmQgdGhlbiBm
aW5kIG1vcmUgdmFndWUgcmVsYXRpb25zaGlwcyBhbmQgcmVmaW5lIHRob3NlIHRvIHRoaXMuCisK
KyAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAudmFndWVuZXNzKCkgIT0gUmVsYXRpb25zaGlw
OjptaW5WYWd1ZW5lc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbWluaW1hbGx5
IHZhZ3VlIChtYXhpbWFsbHkgc3BlY2lmaWMpLCBzbyB0cnkgdG8gcmVmaW5lIG91cnNlbHZlcyBi
YXNlZCBvbiB3aGF0CisgICAgICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93LgorICAgICAg
ICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBvdGhlclJlbGF0aW9uc2hpcCA6IHJlbGF0aW9u
c2hpcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyUmVsYXRpb25zaGlwLnZhZ3Vl
bmVzcygpIDwgcmVsYXRpb25zaGlwLnZhZ3VlbmVzcygpCisgICAgICAgICAgICAgICAgICAgICAg
ICAmJiBvdGhlclJlbGF0aW9uc2hpcC5yaWdodCgpLT5pc0ludDMyQ29uc3RhbnQoKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9IHJlbGF0
aW9uc2hpcC5maWx0ZXJDb25zdGFudChvdGhlclJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBuZXdSZWxhdGlvbnNoaXAgIT0gcmVsYXRpb25zaGlw
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFJlZmluZWQgdG86
ICIsIG5ld1JlbGF0aW9uc2hpcCwgIiBiYXNlZCBvbiAiLCBvdGhlclJlbGF0aW9uc2hpcCwgIlxu
Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBuZXdSZWxhdGlvbnNo
aXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAudmFndWVuZXNzKCkgIT0gUmVsYXRp
b25zaGlwOjptYXhWYWd1ZW5lc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbWF4
aW1hbGx5IHZhbHVlIChtaW5pbWFsbHkgc3BlY2lmaWMpLCBzbyB0cnkgdG8gcmVmaW5lIG90aGVy
IHJlbGF0aW9uc2hpcHMKKyAgICAgICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGlzIG9uZS4KKyAg
ICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYgb3RoZXJSZWxhdGlvbnNoaXAgOiByZWxh
dGlvbnNoaXBzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclJlbGF0aW9uc2hpcC52
YWd1ZW5lc3MoKSA+IHJlbGF0aW9uc2hpcC52YWd1ZW5lc3MoKQorICAgICAgICAgICAgICAgICAg
ICAgICAgJiYgb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKS0+aXNJbnQzMkNvbnN0YW50KCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSBv
dGhlclJlbGF0aW9uc2hpcC5maWx0ZXJDb25zdGFudChyZWxhdGlvbnNoaXApOworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgbmV3UmVsYXRpb25zaGlwICE9IG90aGVyUmVs
YXRpb25zaGlwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFJl
ZmluZWQgIiwgb3RoZXJSZWxhdGlvbnNoaXAsICIgdG86ICIsIG5ld1JlbGF0aW9uc2hpcCwgIlxu
Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlclJlbGF0aW9uc2hpcCA9IG5ld1JlbGF0
aW9uc2hpcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRk
OwogICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
JiBvdGhlclJlbGF0aW9uc2hpcCA6IHJlbGF0aW9uc2hpcHMpIHsKQEAgLTExNjksNiArMTU0MCw5
IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZJWE1FOiBBbHNvIGFk
ZCBmaWx0cmF0aW9uIG92ZXIgc3RhdGVtZW50cyBhYm91dCBjb25zdGFudHMuIEZvciBleGFtcGxl
LCBpZiB3ZSBoYXZlCisgICAgICAgICAgICAvLyBAeCA9PSBAYyBhbmQgQHggIT0gQGQsIHdoZXJl
IEBkID4gQGMsIHRoZW4gd2Ugd2FudCB0byB0dXJuIEB4ICE9IEBkIGludG8gQHggPCBAZC4KICAg
ICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYgb3RoZXJSZWxhdGlvbnNo
aXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKICAgICAgICAgICAgICAgICBpZiAo
dmVyYm9zZSkKQEAgLTEyNjIsNTAgKzE2MzYsNDggQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAg
ICBmb3IgKFJlbGF0aW9uc2hpcCBzb3VyY2VSZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgewog
ICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgICAgICAgICAgICAgICAg
IGRhdGFMb2coIiAgTWVyZ2luZyAiLCB0YXJnZXRSZWxhdGlvbnNoaXAsICIgYW5kICIsIHNvdXJj
ZVJlbGF0aW9uc2hpcCwgIjpcbiIpOwotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAg
bmV3UmVsYXRpb25zaGlwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlbGF0aW9u
c2hpcC5tZXJnZShzb3VyY2VSZWxhdGlvbnNoaXApOwotICAgICAgICAgICAgICAgICAgICAKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBk
YXRhTG9nKCIgICAgR290ICIsIG5ld1JlbGF0aW9uc2hpcCwgIlxuIik7Ci0gICAgICAgICAgICAg
ICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1JlbGF0aW9uc2hpcCkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaWx0ZXIoKSB0byBhdm9pZCBleHBvbmVudGlh
bCBleHBsb3Npb24gb2YgaWRlbnRpY2FsCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9u
c2hpcHMuIFdlIGRvIHRoaXMgaGVyZSB0byBhdm9pZCBtYWtpbmcgc2V0T25lU2lkZSgpIGRvCi0g
ICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgd29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNp
ZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW50
bHkuIEhlcmUncyBhbiBleGFtcGxlLiBBdCBzb21lIHBvaW50IHNvbWVvbmUgbWlnaHQgc3RhcnQK
LSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0d28gcmVsYXRpb25zaGlwcyBsaWtlIEBhID4g
QGIgLSBDIGFuZCBAYSA8IEBiICsgRC4gVGhlbgotICAgICAgICAgICAgICAgICAgICAvLyBzb21l
b25lIGRvZXMgYSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5z
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb2YgdGhlc2UgaW50byBAYSA9PSBAYi4gTm93
IHdlIGhhdmUgQGEgPT0gQGIgZHVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gTGV0
J3Mgc2F5IHRoYXQgdGhpcyBkdXBsaWNhdGUgQGEgPT0gQGIgZW5kcyB1cCBhdCB0aGUgaGVhZCBv
ZiBhCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRpZG4ndCBoYXZlIHRoaXMg
cnVsZSwgdGhlbiB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKLSAgICAgICAgICAgICAgICAgICAg
Ly8gZHVwbGljYXRlIEBhID09IEBiJ3Mgb250byB0aGUgZXhpc3RpbmcgZHVwbGljYXRlIEBhID09
IEBiJ3MuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdvdWxkIGJlIGZvdXIgcGFpcnMg
b2YgQGEgPT0gQGIsIGVhY2ggb2Ygd2hpY2ggd291bGQKLSAgICAgICAgICAgICAgICAgICAgLy8g
Y3JlYXRlIGEgbmV3IEBhID09IEBiLiBOb3cgd2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGlj
YXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIG5leHQgdGltZSBhcm91bmQgd2Un
ZCBoYXZlIDgsIHRoZW4gMTYsIGV0Yy4gV2UgYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgLy8g
dGhpcyBoZXJlIGJ5IGRvaW5nIHRoaXMgZmlsdHJhdGlvbi4gVGhhdCBtaWdodCBiZSBhIGJpdCBv
ZgotICAgICAgICAgICAgICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBwcm9iYWJseSBq
dXN0IHRoZSBpZGVudGljYWwgZHVwbGljYXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0
aW9uc2hpcCBjYXNlIHdlIHdhbnQnIHRvIGF2b2lkLiBCdXQsIEknbGwga2VlcCB0aGlzIHVudGls
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgZXZpZGVuY2UgdGhhdCB0aGlzIGlzIGEg
cGVyZm9ybWFuY2UgcHJvYmxlbS4gUmVtZW1iZXIgLQotICAgICAgICAgICAgICAgICAgICAvLyB3
ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGggYSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8K
LSAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwcyB3aXRoIGlkZW50aWNhbCBsZWZ0
IG9wZXJhbmQuIEl0IHNob3VsZG4ndCBiZSBhCi0gICAgICAgICAgICAgICAgICAgIC8vIGxhcmdl
IGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAmIGV4aXN0aW5nUmVsYXRpb25zaGlwIDogbWVy
Z2VkUmVsYXRpb25zaGlwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5n
UmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKG5ld1JlbGF0aW9uc2hpcCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0aW9uc2hpcC5maWx0ZXIobmV3UmVsYXRpb25z
aGlwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWQpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAgPSBmaWx0ZXJl
ZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgdGFy
Z2V0UmVsYXRpb25zaGlwLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUmVs
YXRpb25zaGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgbmV3
UmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2Up
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3
UmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2b2lkIGV4
cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBpZGVudGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyByZWxhdGlvbnNoaXBzLiBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgbWFraW5nIHNl
dE9uZVNpZGUoKSBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgd29yaywg
c2luY2Ugd2UgZXhwZWN0IHNldE9uZVNpZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0
IHNvbWUgcG9pbnQgc29tZW9uZSBtaWdodCBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIHdpdGggdHdvIHJlbGF0aW9uc2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEgPCBA
YiArIEQuIFRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMg
YSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBOb3cg
d2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIExldCdzIHNheSB0aGF0IHRoaXMgZHVwbGljYXRlIEBhID09IEBiIGVuZHMgdXAgYXQgdGhl
IGhlYWQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRp
ZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhlbiB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRoZSBl
eGlzdGluZyBkdXBsaWNhdGUgQGEgPT0gQGIncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBUaGVyZSB3b3VsZCBiZSBmb3VyIHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdoaWNo
IHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBhID09
IEBiLiBOb3cgd2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGljYXRlcworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUgOCwg
dGhlbiAxNiwgZXRjLiBXZSBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRo
aXMgaGVyZSBieSBkb2luZyB0aGlzIGZpbHRyYXRpb24uIFRoYXQgbWlnaHQgYmUgYSBiaXQgb2YK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBwcm9i
YWJseSBqdXN0IHRoZSBpZGVudGljYWwgZHVwbGljYXRlCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gcmVsYXRpb25zaGlwIGNhc2Ugd2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwgSSdsbCBr
ZWVwIHRoaXMgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGV2
aWRlbmNlIHRoYXQgdGhpcyBpcyBhIHBlcmZvcm1hbmNlIHByb2JsZW0uIFJlbWVtYmVyIC0KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGgg
YSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyByZWxhdGlvbnNoaXBzIHdpdGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hvdWxk
bid0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXJnZSBsaXN0LgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYgZXhpc3RpbmdSZWxhdGlvbnNoaXAg
OiBtZXJnZWRSZWxhdGlvbnNoaXBzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChleGlzdGluZ1JlbGF0aW9uc2hpcC5zYW1lTm9kZXNBcyhuZXdSZWxhdGlvbnNoaXApKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgZmlsdGVy
ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVs
YXRpb25zaGlwLmZpbHRlcihuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgICAgIGlmICghZm91bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRSZWxhdGlv
bnNoaXBzLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZFJlbGF0aW9uc2hpcHMuYXBwZW5kKG5ld1JlbGF0
aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGQ6OnNvcnQobWVyZ2VkUmVsYXRpb25zaGlw
cy5iZWdpbigpLCBtZXJnZWRSZWxhdGlvbnNoaXBzLmVuZCgpKTsKSW5kZXg6IExheW91dFRlc3Rz
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9u
IDE4ODY5NSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI2IEBACisyMDE1LTA4LTIwICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisK
KyAgICAgICAgT3ZlcmZsb3cgY2hlY2sgZWxpbWluYXRpb24gZmFpbHMgZm9yIGEgc2ltcGxlIHRl
c3QgY2FzZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTQ3Mzg3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkZWQgdHdvIHRlc3QgY2FzZXMgdGhhdCBwcmV2aW91c2x5IHdvdWxkIGhhdmUgYW4gdW5uZWNl
c3Nhcnkgb3ZlcmZsb3cgY2hlY2sgb24gYW4gaW5kdWN0aW9uCisgICAgICAgIHZhcmlhYmxlLgor
CisgICAgICAgIEFsc28gYWRkZWQgLmh0bWwvZXhwZWN0ZWQgZmlsZXMgZm9yIHNvbWUgcmVncmVz
cyB0ZXN0IHRoYXQgZGlkbid0IGhhdmUgdGhlbS4KKworICAgICAgICAqIGpzL3JlZ3Jlc3MvZnVu
Y3Rpb24tY2FsbC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3MvZnVu
Y3Rpb24tY2FsbC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2hhcmQtb3ZlcmZs
b3ctY2hlY2stZXF1YWwtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNz
L2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuaHRtbDogQWRkZWQuCisgICAgICAgICoganMvcmVn
cmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICog
anMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGpz
L3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuanM6IEFkZGVk
LgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiBqcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9oYXJk
LW92ZXJmbG93LWNoZWNrLmpzOiBBZGRlZC4KKyAgICAgICAgKGZvbyk6CisKIDIwMTUtMDgtMjAg
IENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAogICAgICAgICBbQ29jb2FdIFRyZWF0
IEVwb2NoIGFzIGludmFsaWQgdmFsdWUgZm9yICJMYXN0LU1vZGlmaWVkIiBoZWFkZXIKSW5kZXg6
IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC1leHBlY3RlZC50eHQKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9mdW5jdGlvbi1jYWxsLWV4cGVjdGVkLnR4
dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC1l
eHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2Z1
bmN0aW9uLWNhbGwKKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNT
IiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCisKK1BBU1Mgbm8gZXhj
ZXB0aW9uIHRocm93bgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENP
TVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC5odG1s
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC5odG1s
CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9mdW5jdGlvbi1jYWxsLmh0
bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElD
ICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIu
Li8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+
Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcHJlLmpzIj48L3NjcmlwdD4K
KzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvZnVuY3Rpb24tY2FsbC5qcyI+PC9zY3JpcHQ+Cis8
c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8
c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8
L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZs
b3ctY2hlY2stZXF1YWwtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pz
L3JlZ3Jlc3MvaGFyZC1vdmVyZmxvdy1jaGVjay1lcXVhbC1leHBlY3RlZC50eHQJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwt
ZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAgQEAKK0pTUmVncmVzcy9o
YXJkLW92ZXJmbG93LWNoZWNrLWVxdWFsCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNl
cmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKwor
CitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRy
dWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQt
b3ZlcmZsb3ctY2hlY2stZXF1YWwuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuaHRtbAkocmV2aXNpb24gMCkKKysrIExh
eW91dFRlc3RzL2pzL3JlZ3Jlc3MvaGFyZC1vdmVyZmxvdy1jaGVjay1lcXVhbC5odG1sCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVU
Ri8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVz
b3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlw
dCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0
IHNyYz0ic2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuanMiPjwvc2NyaXB0
PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0
PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0
PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9oYXJkLW92
ZXJmbG93LWNoZWNrLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvanMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLWV4cGVjdGVkLnR4dAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBACitKU1JlZ3Jlc3MvaGFyZC1vdmVyZmxvdy1j
aGVjaworCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3Nh
Z2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworUEFTUyBubyBleGNlcHRpb24g
dGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUK
KwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNr
Lmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZs
b3ctY2hlY2suaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUg
SFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNj
cmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hl
YWQ+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMi
Pjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNr
LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wb3N0
LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wb3N0
LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2pzL3Jl
Z3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvaGFyZC1vdmVyZmxvdy1j
aGVjay1lcXVhbC5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2Ny
aXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxNyBAQAorZnVuY3Rpb24gZm9vKG8pIHsKKyAgICB2YXIgcmVzdWx0ID0gMDsKKyAg
ICBmb3IgKHZhciBpID0gMDsgaSAhPSAxMDA7ICsraSkgLy8gKytpIHN0aWxsIGhhcyBhbiBvdmVy
ZmxvdyBjaGVjayBpbiB0aGUgZW1pdHRlZCBjb2RlCisgICAgICAgIHJlc3VsdCArPSBvLmY7Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIHAgPSB7Zjo0Mn07
Cit2YXIgbyA9IE9iamVjdC5jcmVhdGUocCk7CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7
ICsraSkgeworICAgIHAuZiA9IGk7CisgICAgZm9vKG8pOworfQorCkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNrLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ct
Y2hlY2suanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10
ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNrLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTcg
QEAKK2Z1bmN0aW9uIGZvbyhvKSB7CisgICAgdmFyIHJlc3VsdCA9IDA7CisgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCAxMDA7ICsraSkgLy8gKytpIHN0aWxsIGhhcyBhbiBvdmVyZmxvdyBjaGVjayBp
biB0aGUgZW1pdHRlZCBjb2RlCisgICAgICAgIHJlc3VsdCArPSBvLmY7CisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIHAgPSB7Zjo0Mn07Cit2YXIgbyA9IE9i
amVjdC5jcmVhdGUocCk7CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgeworICAg
IHAuZiA9IGk7CisgICAgZm9vKG8pOworfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>259496</attachid>
            <date>2015-08-20 14:28:36 -0700</date>
            <delta_ts>2015-08-20 16:35:02 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>36309</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg4Njk1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBA
CisyMDE1LTA4LTIwICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
T3ZlcmZsb3cgY2hlY2sgZWxpbWluYXRpb24gZmFpbHMgZm9yIGEgc2ltcGxlIHRlc3QgY2FzZQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3Mzg3CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgT3ZlcmZsb3cg
Y2hlY2sgZWxpbWluYXRpb24gd2FzIGhhdmluZyBpc3N1ZXMgd2hlbiB0aGluZ3MgZ290IGNvbnN0
YW50LWZvbGRlZCwgYmVjYXVzZSB3aGVyZWFzIGFuCisgICAgICAgIEFkZCBvciBMZXNzVGhhbiBv
cGVyYXRpb24gdGVhY2hlcyB1cyBhYm91dCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHRoaW5n
cyBiZWluZyBhZGRlZCBvcgorICAgICAgICBjb21wYXJlZCwgd2UgZG9uJ3QgZG8gdGhhdCB3aGVu
IHdlIHNlZSBhIEpTQ29uc3RhbnQuIFdlIGRvbid0IGNyZWF0ZSBhIHJlbGF0aW9uc2hpcCBiZXR3
ZWVuIGV2ZXJ5CisgICAgICAgIEpTQ29uc3RhbnQgYW5kIGV2ZXJ5IG90aGVyIEpTQ29uc3RhbnQu
IFNvLCBpZiB3ZSBjb25zdGFudC1mb2xkIGFuIEFkZCwgd2UgZm9yZ2V0IHRoZSByZWxhdGlvbnNo
aXBzCisgICAgICAgIHRoYXQgaXQgd291bGQgaGF2ZSBoYWQgd2l0aCBpdHMgaW5wdXRzLgorCisg
ICAgICAgIE9uZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIGV2ZXJ5IEpTQ29uc3RhbnQgY3Jl
YXRlIGEgcmVsYXRpb25zaGlwIHdpdGggZXZlcnkgb3RoZXIgSlNDb25zdGFudC4KKyAgICAgICAg
VGhpcyBpcyBkYW5nZXJvdXMsIHNpbmNlIGl0IHdvdWxkIGNyZWF0ZSBPKG5eMikgZXhwbG9zaW9u
IG9mIHJlbGF0aW9uc2hpcHMuCisKKyAgICAgICAgSW5zdGVhZCwgdGhpcyBwYXRjaCB0ZWFjaGVz
IGZpbHRyYXRpb24gYW5kIG1lcmdpbmcgaG93IHRvIGJlaGF2ZSAiYXMgaWYiIHRoZXJlIHdlcmUg
aW50ZXItY29uc3RhbnQKKyAgICAgICAgcmVsYXRpb25zaGlwcy4gTm9ybWFsbHkgdGhvc2Ugb3Bl
cmF0aW9ucyBvbmx5IHdvcmsgb24gdHdvIHJlbGF0aW9uc2hpcHMgaW52b2x2aW5nIHRoZSBzYW1l
IG5vZGUKKyAgICAgICAgcGFpci4gQnV0IG5vdywgaWYgd2UgaGF2ZSBAeCBvcCBAYyBhbmQgQHgg
b3AgQGQsIHdoZXJlIEBjIGFuZCBAZCBhcmUgZGlmZmVyZW50IG5vZGVzIGJ1dCBib3RoIGFyZQor
ICAgICAgICBjb25zdGFudHMsIHdlIHdpbGwgZG8gbWVyZ2luZyBvciBmaWx0ZXJpbmcgYnkgZ3Jv
a2tpbmcgdGhlIGNvbnN0YW50IHZhbHVlcy4KKworICAgICAgICBUaGlzIHNwZWVkcyB1cCBsb3Rz
IG9mIHRlc3RzIGluIEpTUmVncmVzcywgYmVjYXVzZSBpdCBlbmFibGVzIG92ZXJmbG93IGNoZWNr
IGVsaW1pbmF0aW9uIG9uIHRoaW5ncworICAgICAgICBsaWtlOgorCisgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgMTAwOyArK2kpCisKKyAgICAgICAgUHJldmlvdXNseSwgdGhlIGZhY3QgdGhh
dCB0aGlzIHdhcyBhbGwgY29uc3RhbnRzIHdvdWxkIHRocm93IG9mZiB0aGUgYW5hbHlzaXMgYmVj
YXVzZSB0aGUgYW5hbHlzaXMKKyAgICAgICAgd291bGRuJ3QgImtub3ciIHRoYXQgMCA8IDEwMC4K
KworICAgICAgICAqIGRmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHA6CisK
IDIwMTUtMDgtMjAgIEFsZXggQ2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4K
IAogICAgICAgICBDbGVhbiB1cCBDTWFrZSBidWlsZCBhZnRlciByMTg4NjczCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmNwcAkocmV2aXNpb24gMTg4NjQ1KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTY5LDYgKzY5LDI2IEBAIHB1YmxpYzoKICAgICAgICAgTm90RXF1YWwsCiAg
ICAgICAgIEdyZWF0ZXJUaGFuCiAgICAgfTsKKworICAgIC8vIFNvbWUgcmVsYXRpb25zaGlwcyBw
cm92aWRlIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBvdGhlcnMuIFdoZW4gYSByZWxhdGlvbnNoaXAg
cHJvdmlkZXMgbW9yZQorICAgIC8vIGluZm9ybWF0aW9uLCBpdCBpcyBsZXNzIHZhZ3VlLgorICAg
IHN0YXRpYyB1bnNpZ25lZCB2YWd1ZW5lc3MoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAg
ICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAgICAgcmV0
dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1p
blZhZ3VlbmVzcyA9IDA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heFZhZ3VlbmVzcyA9
IDI7CiAgICAgCiAgICAgc3RhdGljIEtpbmQgZmxpcHBlZChLaW5kIGtpbmQpCiAgICAgewpAQCAt
MTE4LDYgKzEzOCw4IEBAIHB1YmxpYzoKICAgICBOb2RlKiByaWdodCgpIGNvbnN0IHsgcmV0dXJu
IG1fcmlnaHQ7IH0KICAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KICAg
ICBpbnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7IH0KKworICAgIHVuc2lnbmVk
IHZhZ3VlbmVzcygpIGNvbnN0IHsgcmV0dXJuIHZhZ3VlbmVzcyhraW5kKCkpOyB9CiAgICAgCiAg
ICAgUmVsYXRpb25zaGlwIGZsaXBwZWQoKSBjb25zdAogICAgIHsKQEAgLTIzOCwxNSArMjYwLDE2
IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLy8gQXR0ZW1w
dHMgdG8gY3JlYXRlIGEgcmVsYXRpb25zaGlwIHRoYXQgc3VtbWFyaXplcyB0aGUgdW5pb24gb2Yg
dGhpcyByZWxhdGlvbnNoaXAgYW5kCi0gICAgLy8gdGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gVGhl
IG51bGwgcmVsYXRpb25zaGlwIGlzIHJldHVybmVkIHRvIGluZGljYXRlIFRPUC4gVGhpcyBpcyB1
c2VkCisgICAgLy8gQXR0ZW1wdHMgdG8gY3JlYXRlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdW1tYXJp
emUgdGhlIHVuaW9uIG9mIHRoaXMgcmVsYXRpb25zaGlwIGFuZAorICAgIC8vIHRoZSBvdGhlciBy
ZWxhdGlvbnNoaXAuIFJlbGF0aW9uc2hpcHMgYXJlIHJldHVybmVkIGJ5IGNhbGxpbmcgdGhlIGZ1
bmN0b3Igd2l0aCB0aGUgbmV3bHkKKyAgICAvLyBjcmVhdGVkIHJlbGF0aW9uc2hpcHMuIE5vIHJl
bGF0aW9uc2hpcHMgYXJlIGNyZWF0ZWQgdG8gaW5kaWNhdGUgVE9QLiBUaGlzIGlzIHVzZWQKICAg
ICAvLyBmb3IgbWVyZ2luZyB0aGUgY3VycmVudCByZWxhdGlvbnNoaXAtYXQtaGVhZCBmb3Igc29t
ZSBwYWlyIG9mIG5vZGVzIGFuZCBhIG5ldwogICAgIC8vIHJlbGF0aW9uc2hpcC1hdC1oZWFkIGJl
aW5nIHByb3Bvc2VkIGJ5IGEgcHJlZGVjZXNzb3IuIFdlIHdpc2ggdG8gY3JlYXRlIGEgbmV3CiAg
ICAgLy8gcmVsYXRpb25zaGlwIHRoYXQgaXMgdHJ1ZSB3aGVuZXZlciBlaXRoZXIgb2YgdGhlbSBh
cmUgdHJ1ZSwgd2hpY2ggZW5zdXJpbmcgdGhhdCB3ZSBkb24ndAogICAgIC8vIGRvIHRoaXMgZm9y
ZXZlci4gQW55dGltZSB3ZSBjcmVhdGUgYSByZWxhdGlvbnNoaXAgdGhhdCBpcyBub3QgZXF1YWwg
dG8gZWl0aGVyIG9mIHRoZQogICAgIC8vIHByZXZpb3VzIG9uZXMsIHdlIHdpbGwgY2F1c2UgdGhl
IGFuYWx5c2lzIGZpeHBvaW50IHRvIHJlZXhlY3V0ZS4KICAgICAvLwotICAgIC8vIElmICp0aGlz
IGFuZCBvdGhlciBhcmUgaWRlbnRpY2FsLCB3ZSBqdXN0IHJldHVybiBpdC4KKyAgICAvLyBJZiAq
dGhpcyBhbmQgb3RoZXIgYXJlIGlkZW50aWNhbCwgd2UganVzdCBwYXNzIGl0IHRvIHRoZSBmdW5j
dG9yLgogICAgIC8vCiAgICAgLy8gSWYgdGhleSBhcmUgZGlmZmVyZW50LCB3ZSBwaWNrIGZyb20g
YSBmaW5pdGUgc2V0IG9mICJnZW5lcmFsIiByZWxhdGlvbnNoaXBzOgogICAgIC8vCkBAIC0yNzcs
MTMgKzMwMCwxMiBAQCBwdWJsaWM6CiAgICAgLy8gICB0aGF0J3MgaG93ICJkZWVwIiB0aGUgZ2Vu
ZXJhbCByZWxhdGlvbnNoaXAgbGF0dGljZSBpcy4KICAgICAvLwogICAgIC8vIE5vdGUgdGhhdCBD
IGJlaW5nIGNvbnN0cmFpbmVkIHRvIC0xLDAsMSBhbHNvIGVuc3VyZXMgdGhhdCB3ZSBuZXZlciBo
YXZlIHRvIHJldHVybiBhCi0gICAgLy8gY29tYmluYXRpb24gb2YgTHQgYW5kIEd0LCBhcyBpbiBm
b3IgZXhhbXBsZSB0aGlzPG90aGVyK0MgJiYgdGhpcz5vdGhlci1ELiBUaGF0J3Mgd2h5Ci0gICAg
Ly8gdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIHplcm8gb3Igb25lIHJlbGF0aW9uc2hpcHMgcmF0
aGVyIHRoYW4gYSBsaXN0IG9mIHJlbGF0aW9uc2hpcHMuCi0gICAgLy8gVGhlIG9ubHkgcG9zc2li
bGUgdmFsdWVzIG9mIEMgYW5kIEQgd2hlcmUgdGhpcyB3b3VsZCB3b3JrIGFyZSAtMSBhbmQgMSwg
YnV0IGluIHRoYXQgY2FzZQotICAgIC8vIHdlIGp1c3Qgc2F5IHRoaXM9PW90aGVyLiBUaGF0IHNh
aWQsIHRoZSBsb2dpYyBmb3IgbWVyZ2luZyB0d28gPT0gcmVsYXRpb25zaGlwcywgbGlrZQotICAg
IC8vIHRoaXM9PW90aGVyK0MgfHwgdGhpcz09b3RoZXIrRCBpcyB0byBhdHRlbXB0IHRvIGNyZWF0
ZSB0aGVzZSB0d28gcmVsYXRpb25zaGlwczoKLSAgICAvLyB0aGlzPm90aGVyK21pbihDLEQpLTEg
JiYgdGhpczxvdGhlcittYXgoQyxEKSsxLiBCdXQgb25seSBvbmUgb2YgdGhlc2UgcmVsYXRpb25z
aGlwcyB3aWxsCi0gICAgLy8gYmVsb25nIHRvIHRoZSBzZXQgb2YgZ2VuZXJhbCByZWxhdGlvbnNo
aXBzLgorICAgIC8vIGNvbWJpbmF0aW9uIG9mIEx0IGFuZCBHdCwgYXMgaW4gZm9yIGV4YW1wbGUg
dGhpczxvdGhlcitDICYmIHRoaXM+b3RoZXItRC4gVGhlIG9ubHkgcG9zc2libGUKKyAgICAvLyB2
YWx1ZXMgb2YgQyBhbmQgRCB3aGVyZSB0aGlzIHdvdWxkIHdvcmsgYXJlIC0xIGFuZCAxLCBidXQg
aW4gdGhhdCBjYXNlIHdlIGp1c3Qgc2F5CisgICAgLy8gdGhpcz09b3RoZXIuIFRoYXQgc2FpZCwg
dGhlIGxvZ2ljIGZvciBtZXJnaW5nIHR3byA9PSByZWxhdGlvbnNoaXBzLCBsaWtlIHRoaXM9PW90
aGVyK0MgfHwKKyAgICAvLyB0aGlzPT1vdGhlcitEIGlzIHRvIGF0dGVtcHQgdG8gY3JlYXRlIHRo
ZXNlIHR3byByZWxhdGlvbnNoaXBzOiB0aGlzPm90aGVyK21pbihDLEQpLTEgJiYKKyAgICAvLyB0
aGlzPG90aGVyK21heChDLEQpKzEuIEJ1dCBvbmx5IG9uZSBvZiB0aGVzZSByZWxhdGlvbnNoaXBz
IHdpbGwgYmVsb25nIHRvIHRoZSBzZXQgb2YgZ2VuZXJhbAorICAgIC8vIHJlbGF0aW9uc2hpcHMu
CiAgICAgLy8KICAgICAvLyBIZXJlJ3MgYW4gZXhhbXBsZSBvZiB0aGlzIGluIGFjdGlvbjoKICAg
ICAvLwpAQCAtMjk1LDE0ICszMTcsNDAgQEAgcHVibGljOgogICAgIC8vIGl0ZXJhdGlvbiBhbmQg
aT09YSsxIGZyb20gdGhlIHNlY29uZCBpdGVyYXRpb24sIHdlIGNyZWF0ZSBpPmEtMSBhbmQgaTxh
KzIgYnV0IHRoZW4KICAgICAvLyByZWFsaXplIHRoYXQgb25seSBpPmEtMSBpcyBhIHZhbGlkIGdl
bmVyYWwgcmVsYXRpb25zaGlwLiBUaGlzIGdpdmVzIHVzIGV4YWN0bHkgd2hhdCB3ZQogICAgIC8v
IHdhbnQ6IGEgc3RhdGVtZW50IHRoYXQgaT49YS4KLSAgICBSZWxhdGlvbnNoaXAgbWVyZ2UoY29u
c3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICAvLworICAgIC8vIEhvd2V2ZXIsIHRo
aXMgbWF5IHJldHVybiBhIHBhaXIgb2YgcmVsYXRpb25zaGlwcyB3aGVuIG1lcmdpbmcgcmVsYXRp
b25zaGlwcyBpbnZvbHZpbmcKKyAgICAvLyBjb25zdGFudHMuIEZvciBleGFtcGxlLCBpZiBnaXZl
bjoKKyAgICAvLworICAgIC8vICAgICBAeCA9PSBAYworICAgIC8vICAgICBAeCA9PSBAZAorICAg
IC8vCisgICAgLy8gd2hlcmUgQGMgYW5kIEBkIGFyZSBjb25zdGFudHMsIHRoZW4gdGhpcyBtYXkg
cGFzcyB0d28gcmVsYXRpb25zaGlwcyB0byB0aGUgZnVuY3RvcjoKKyAgICAvLworICAgIC8vICAg
ICBAeCA+IG1pbihAYywgQGQpIC0gMQorICAgIC8vICAgICBAeCA8IG1heChAYywgQGQpICsgMQor
ICAgIC8vCisgICAgLy8gVGhpcyBzdGlsbCBhbGxvd3MgZm9yIGNvbnZlcmdlbmNlLCBiZWNhdXNl
IGp1c3QgYXMgd2hlbiBtZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlcgorICAgIC8vIHZhcmlhYmxl
cywgdGhpcyBhbHdheXMgcGlja3MgZnJvbSBhIHNldCBvZiBnZW5lcmFsIHJlbGF0aW9uc2hpcHMu
IEhlbmNlIGFsdGhvdWdoIHRoaXMgbWF5CisgICAgLy8gcHJvZHVjZSB0d28gcmVsYXRpb25zaGlw
cyBhcyBhIHJlc3VsdCBvZiB0aGUgbWVyZ2UsIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVsYXRpb25z
aGlwcyB0aGF0CisgICAgLy8gY2FuIGJlIHByZXNlbnQgYXQgaGVhZCBvZiBibG9jayBpcyBsaW1p
dGVkIGJ5IE8oZ3JhcGguc2l6ZV4yKS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgor
ICAgIHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYg
ZnVuY3RvcikgY29uc3QKICAgICB7Ci0gICAgICAgIGlmICghc2FtZU5vZGVzQXMob3RoZXIpKQot
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOwotICAgICAgICAKICAgICAgICAgLy8g
SGFuZGxlIHRoZSBzdXBlciBvYnZpb3VzIGNhc2UgZmlyc3QuCi0gICAgICAgIGlmICgqdGhpcyA9
PSBvdGhlcikKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgaWYgKCp0aGlzID09
IG90aGVyKSB7CisgICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1fbGVmdCAhPSBvdGhlci5tX2xl
ZnQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBpZiAobV9yaWdodCAh
PSBvdGhlci5tX3JpZ2h0KSB7CisgICAgICAgICAgICBtZXJnZUNvbnN0YW50c0ltcGwob3RoZXIs
IGZ1bmN0b3IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBBU1NFUlQoc2FtZU5vZGVzQXMob3RoZXIpKTsKICAgICAgICAgCiAgICAgICAgIC8vIFRo
aXMgZG9lcyBzb21lIGludGVyZXN0aW5nIHBlcm11dGF0aW9ucyB0byByZWR1Y2UgdGhlIGFtb3Vu
dCBvZiBkdXBsaWNhdGUgY29kZS4gRm9yCiAgICAgICAgIC8vIGV4YW1wbGU6CkBAIC0zMjksNyAr
Mzc3LDcgQEAgcHVibGljOgogICAgICAgICAgICAgLy8gSW4gcmFyZSBjYXNlcywgd2UgbWlnaHQg
bm90IGJlIGFibGUgdG8gZmxpcC4gSnVzdCBnaXZlIHVwIG9uIGxpZmUgaW4gdGhvc2UKICAgICAg
ICAgICAgIC8vIGNhc2VzLgogICAgICAgICAgICAgaWYgKCFhIHx8ICFiKQotICAgICAgICAgICAg
ICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgICAgICAKICAgICAgICAgICAgIG5lZWRGbGlwID0gdHJ1ZTsKICAgICAgICAgICAgIApAQCAt
MzM3LDcgKzM4NSw3IEBAIHB1YmxpYzoKICAgICAgICAgICAgIC8vIEBhID4gQGIuIFRoYXQncyBw
cmV0dHkgbXVjaCBhbHdheXMgYSB0YXV0b2xvZ3k7IHdlIGRvbid0IGF0dGVtcHQgdG8gZG8gc21h
cnQKICAgICAgICAgICAgIC8vIHRoaW5ncyBmb3IgdGhhdCBjYXNlIGZvciBub3cuCiAgICAgICAg
ICAgICBpZiAoYS5tX2tpbmQgPT0gR3JlYXRlclRoYW4gfHwgYi5tX2tpbmQgPT0gR3JlYXRlclRo
YW4pCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRo
YXQgaWYgd2UgaGF2ZSBhIExlc3NUaGFuLCB0aGVuIGl0J3MgZmlyc3QuCkBAIC0zNDksMTEgKzM5
NywxMyBAQCBwdWJsaWM6CiAgICAgICAgICAgICBzdGQ6OnN3YXAoYSwgYik7CiAgICAgICAgIAog
ICAgICAgICBSZWxhdGlvbnNoaXAgcmVzdWx0ID0gYS5tZXJnZUltcGwoYik7CisgICAgICAgIGlm
ICghcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAKICAgICAgICAgaWYgKG5l
ZWRGbGlwKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5mbGlwcGVkKCk7CisgICAgICAgICAg
ICByZXN1bHQgPSByZXN1bHQuZmxpcHBlZCgpOwogICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICAgICAgZnVuY3RvcihyZXN1bHQpOwogICAgIH0KICAgICAKICAgICAvLyBBdHRl
bXB0cyB0byBjb25zdHJ1Y3Qgb25lIFJlbGF0aW9uc2hpcCB0aGF0IGFkZXF1YXRlbHkgc3VtbWFy
aXplcyB0aGUgaW50ZXJzZWN0aW9uIG9mCkBAIC00NTYsNiArNTA2LDU2IEBAIHB1YmxpYzoKICAg
ICAgICAgQVNTRVJUKG1fa2luZCA9PSBHcmVhdGVyVGhhbik7CiAgICAgICAgIHJldHVybiBmaWx0
ZXJGbGlwcGVkKCk7CiAgICAgfQorCisgICAgLy8gQ29tZSB1cCB3aXRoIGEgcmVsYXRpb25zaGlw
IHRoYXQgaXMgdGhlIGJlc3QgZGVzY3JpcHRpb24gb2YgdGhpcyAmJiBvdGhlciwgcHJvdmlkZWQg
dGhhdCBsZWZ0KCkgaXMKKyAgICAvLyB0aGUgc2FtZSBhbmQgcmlnaHQoKSBpcyBhIGNvbnN0YW50
LiBBbHNvIHJlcXVpcmVzIHRoYXQgdGhpcyBpcyBhdCBsZWFzdCBhcyB2YWd1ZSBhcyBvdGhlci4g
SXQgbWF5CisgICAgLy8gcmV0dXJuIHRoaXMgb3IgaXQgbWF5IHJldHVybiBzb21ldGhpbmcgZWxz
ZSwgYnV0IHdoYXRldmVyIGl0IHJldHVybnMsIGl0IHdpbGwgaGF2ZSB0aGUgc2FtZSBub2RlcyBh
cworICAgIC8vIHRoaXMuIFRoaXMgaXMgbm90IGF1dG9tYXRpY2FsbHkgZG9uZSBieSBmaWx0ZXIo
KSBiZWNhdXNlIGl0IGN1cnJlbnRseSBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwgdGhpcworICAg
IC8vIGR1cmluZyBhIHZlcnkgcGFydGljdWxhciBwYXJ0IG9mIHNldE9uZVNpZGUoKS4KKyAgICBS
ZWxhdGlvbnNoaXAgZmlsdGVyQ29uc3RhbnQoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2xlZnQgPT0gb3RoZXIubV9sZWZ0KTsKKyAgICAg
ICAgQVNTRVJUKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKTsKKyAgICAgICAgQVNTRVJUKG90
aGVyLm1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKTsKKyAgICAgICAgQVNTRVJUKHZhZ3VlbmVz
cygpID49IG90aGVyLnZhZ3VlbmVzcygpKTsKKworICAgICAgICBpZiAodmFndWVuZXNzKCkgPT0g
b3RoZXIudmFndWVuZXNzKCkpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICAgICAg
Ly8gVGhpcyBpcyBtb3JlIHZhZ3VlIHRoYW4gb3RoZXIuIE90aGVyIGlzIG1vcmUgc3BlY2lmaWMg
dGhhbiB0aGlzLiBUaGlzIGlzIGxlc3Mgc3BlY2lmaWMgdGhhbgorICAgICAgICAvLyBvdGhlci4g
T3RoZXIgaXMgbGVzcyB2YWd1ZSB0aGFuIHRoaXMuCisgICAgICAgIEFTU0VSVCh2YWd1ZW5lc3Mo
KSA+IG90aGVyLnZhZ3VlbmVzcygpKTsKKworICAgICAgICBpbnQgdGhpc1JpZ2h0ID0gbV9yaWdo
dC0+YXNJbnQzMigpOworICAgICAgICBpbnQgb3RoZXJSaWdodCA9IG90aGVyLm1fcmlnaHQtPmFz
SW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIC8vIElnbm9yZSBmdW5ueSBidXNpbmVzcy4KKyAg
ICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG90aGVyUmlnaHQsIG90aGVyLm1fb2Zmc2V0KSkK
KyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKworICAgICAgICBpbnQgb3RoZXJFZmZlY3RpdmVS
aWdodCA9IG90aGVyUmlnaHQgKyBvdGhlci5tX29mZnNldDsKKworICAgICAgICBzd2l0Y2ggKG90
aGVyLm1fa2luZCkgeworICAgICAgICBjYXNlIEVxdWFsOgorICAgICAgICAgICAgLy8gUmV0dXJu
IGEgdmVyc2lvbiBvZiAqdGhpcyB0aGF0IGlzIEVxdWFsIHRvIG90aGVyJ3MgY29uc3RhbnQuCisg
ICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgRXF1YWwsIG90
aGVyRWZmZWN0aXZlUmlnaHQgLSB0aGlzUmlnaHQpOworCisgICAgICAgIGNhc2UgTGVzc1RoYW46
CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBBU1NFUlQobV9raW5kID09
IE5vdEVxdWFsKTsKKyAgICAgICAgICAgIC8vIFdlIGNvdWxkIGRvIHNtYXJ0IHRoaW5ncyBoZXJl
LiBCdXQgd2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYW4gZXhhbXBsZSBvZiB3aGVuIGl0IHdvdWxk
IGJlCisgICAgICAgICAgICAvLyB2YWx1YWJsZS4gTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGJlIGNh
cmVmdWwuIFdlIGNvdWxkIHJlZmluZSBOb3RFcXVhbCB0byBMZXNzVGhhbiwgYnV0IG9ubHkKKyAg
ICAgICAgICAgIC8vIGlmIHRoZSBMZXNzVGhhbiBzdWJzdW1lcyB0aGUgTm90RXF1YWwuCisgICAg
ICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBOb3RFcXVh
bDoKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAg
ICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIH0KKworICAgICAgICBSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAg
fQogICAgIAogICAgIGludCBtaW5WYWx1ZU9mTGVmdCgpIGNvbnN0CiAgICAgewpAQCAtNjY2LDYg
Kzc2NiwyMDcgQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgICAgIHJldHVybiBncmVhdGVyVGhh
bjsKICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVy
Z2VDb25zdGFudHNJbXBsKGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3Im
IGZ1bmN0b3IpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9sZWZ0ID09IG90aGVyLm1f
bGVmdCk7CisKKyAgICAgICAgLy8gT25seSBkZWFsIHdpdGggY29uc3RhbnQgcmlnaHQuCisgICAg
ICAgIGlmICghbV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkgfHwgIW90aGVyLm1fcmlnaHQtPmlz
SW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFdoYXQg
Zm9sbG93cyBpcyBhIGZhaXJseSBjb25zZXJ2YXRpdmUgbWVyZ2UuIFdlIGNvdWxkIHR1bmUgdGhp
cyBwaGFzZSB0byBjb21lIHVwIHdpdGgKKyAgICAgICAgLy8gYWxsIHBvc3NpYmxlIGluZXF1YWxp
dGllcyBiZXR3ZWVuIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzLCBidXQgd2UgZm9jdXMgbWFpbmx5
IG9uIGNoZWFwCisgICAgICAgIC8vIGNhc2VzIGZvciBub3cuCisKKyAgICAgICAgLy8gSGVyZSBh
cmUgc29tZSBvZiB0aGUgdGhlIGFycmFuZ2VtZW50cyB3ZSBjYW4gbWVyZ2UgdXNlZnVsbHkgYXNz
dW1pbmcgQGMgPCBAZDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEB4ID09IEBjIHx8IEB4
ID09IEBkICAgPT4gICBAeCA+PSBjICYmIEB4IDw9IEBkCisgICAgICAgIC8vICAgICBAeCA+PSBA
YyB8fCBAeCA8PSBAZCAgID0+ICAgVE9QCisgICAgICAgIC8vICAgICBAeCA9PSBAYyB8fCBAeCAh
PSBAZCAgID0+ICAgQHggIT0gQGQKKworICAgICAgICBpbnQgdGhpc1JpZ2h0ID0gbV9yaWdodC0+
YXNJbnQzMigpOworICAgICAgICBpbnQgb3RoZXJSaWdodCA9IG90aGVyLm1fcmlnaHQtPmFzSW50
MzIoKTsKKworICAgICAgICAvLyBJZ25vcmUgZnVubnkgYnVzaW5lc3MuCisgICAgICAgIGlmIChz
dW1PdmVyZmxvd3M8aW50Pih0aGlzUmlnaHQsIG1fb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG90aGVyUmlnaHQsIG90aGVyLm1fb2Zm
c2V0KSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpbnQgdGhpc0VmZmVjdGl2ZVJp
Z2h0ID0gdGhpc1JpZ2h0ICsgbV9vZmZzZXQ7CisgICAgICAgIGludCBvdGhlckVmZmVjdGl2ZVJp
Z2h0ID0gb3RoZXJSaWdodCArIG90aGVyLm1fb2Zmc2V0OworCisgICAgICAgIGF1dG8gbWFrZVVw
cGVyID0gWyZdIChpbnQ2NF90IHVwcGVyKSB7CisgICAgICAgICAgICBpZiAodXBwZXIgPD0gdGhp
c1JpZ2h0KSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBtX3JpZ2h0ICsgb2Zmc2V0IHRv
IGJlIGVxdWFsIHRvIHVwcGVyLiBIZW5jZSB3ZSB3YW50IG9mZnNldCB0byBjYW5jZWwKKyAgICAg
ICAgICAgICAgICAvLyB3aXRoIG1fcmlnaHQuIEJ1dCB0aGVyZSdzIG1vcmUgdG8gaXQsIHNpbmNl
IHdlIHdhbnQgKzEgdG8gdHVybiB0aGUgTGVzc1RoYW4gaW50bworICAgICAgICAgICAgICAgIC8v
IGEgTGVzc1RoYW5PckVxdWFsLCBhbmQgd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZW5k
IHVwIHdpdGggbm9uLWdlbmVyYWwKKyAgICAgICAgICAgICAgICAvLyBvZmZzZXRzLiAKKyAgICAg
ICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihzdGQ6Om1heCgKKyAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMSkgKyB1cHBlciAtIHN0YXRpY19j
YXN0PGludDY0X3Q+KHRoaXNSaWdodCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PGludDY0X3Q+KC0xKSkpOworICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1f
bGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIG9mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgaWYgKHVwcGVyIDw9IG90aGVyUmlnaHQpIHsKKyAgICAgICAgICAgICAgICBpbnQgb2Zm
c2V0ID0gc3RhdGljX2Nhc3Q8aW50PihzdGQ6Om1heCgKKyAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8aW50NjRfdD4oMSkgKyB1cHBlciAtIHN0YXRpY19jYXN0PGludDY0X3Q+KG90aGVy
UmlnaHQpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PigtMSkpKTsK
KyAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG90aGVyLm1fcmln
aHQsIExlc3NUaGFuLCBvZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAg
ICAgYXV0byBtYWtlTG93ZXIgPSBbJl0gKGludDY0X3QgbG93ZXIpIHsKKyAgICAgICAgICAgIGlm
IChsb3dlciA+PSB0aGlzUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IG1fcmln
aHQgKyBvZmZzZXQgdG8gYmUgZXF1YWwgdG8gbG93ZXIuIEhlbmNlIHdlIHdhbnQgb2Zmc2V0IHRv
IGNhbmNlbCB3aXRoCisgICAgICAgICAgICAgICAgLy8gbV9yaWdodC4gQnV0IHRoZXJlJ3MgbW9y
ZSB0byBpdCwgc2luY2Ugd2Ugd2FudCAtMSB0byB0dXJuIHRoZSBHcmVhdGVyVGhhbiBpbnRvIGEK
KyAgICAgICAgICAgICAgICAvLyBHcmVhdGVyVGhhbk9yRXF1YWwsIGFuZCB3ZSB3YW50IHRvIG1h
a2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgd2l0aCBub24tZ2VuZXJhbAorICAgICAgICAgICAgICAg
IC8vIG9mZnNldHMuCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHN0YXRpY19jYXN0PGlu
dD4oc3RkOjptaW4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KC0x
KSArIGxvd2VyIC0gc3RhdGljX2Nhc3Q8aW50NjRfdD4odGhpc1JpZ2h0KSwKKyAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMSkpKTsKKyAgICAgICAgICAgICAgICBmdW5j
dG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEdyZWF0ZXJUaGFuLCBvZmZzZXQpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb3dlciA+PSBvdGhlclJpZ2h0KSB7Cisg
ICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHN0YXRpY19jYXN0PGludD4oc3RkOjptaW4oCisg
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KC0xKSArIGxvd2VyIC0gc3Rh
dGljX2Nhc3Q8aW50NjRfdD4ob3RoZXJSaWdodCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PGludDY0X3Q+KDEpKSk7CisgICAgICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNo
aXAobV9sZWZ0LCBvdGhlci5tX3JpZ2h0LCBHcmVhdGVyVGhhbiwgb2Zmc2V0KSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAg
Y2FzZSBFcXVhbDogeworICAgICAgICAgICAgc3dpdGNoIChvdGhlci5tX2tpbmQpIHsKKyAgICAg
ICAgICAgIGNhc2UgRXF1YWw6IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpc0VmZmVjdGl2ZVJp
Z2h0ID09IG90aGVyRWZmZWN0aXZlUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhp
cyBwcm9iYWJseSB3b24ndCBhcmlzZSBvZnRlbi4gV2UgY2FuIGtlZXAgd2hpY2hldmVyIHJlbGF0
aW9uc2hpcCBpcyBnZW5lcmFsLgorICAgICAgICAgICAgICAgICAgICBpZiAobV9vZmZzZXQgPj0g
LTEgJiYgbV9vZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoKnRo
aXMpOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXIubV9vZmZzZXQgPj0gLTEgJiYgb3Ro
ZXIubV9vZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3Iob3RoZXIp
OworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgLy8gV2hhdCBmb2xsb3dzIGlzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgYSBtZXJn
ZSB3aWxsIGNyZWF0ZSBtb3JlIHJ1bGVzIHRoYW4gd2hhdCBpdAorICAgICAgICAgICAgICAgIC8v
IHN0YXJ0ZWQgd2l0aC4gVGhpcyBpcyBmaW5lIGZvciBjb252ZXJnZW5jZSBiZWNhdXNlIHRoZSBM
ZXNzVGhhbi9HcmVhdGVyVGhhbgorICAgICAgICAgICAgICAgIC8vIHJ1bGVzIHRoYXQgdGhpcyBj
cmVhdGVzIGFyZSBnZW5lcmFsIChpLmUuIGhhdmUgc21hbGwgb2Zmc2V0cykgYW5kIHRoZXkgbmV2
ZXIKKyAgICAgICAgICAgICAgICAvLyBzcGF3biBtb3JlIHJ1bGVzIHVwb24gc3Vic2VxdWVudCBt
ZXJnaW5nLgorCisgICAgICAgICAgICAgICAgbWFrZVVwcGVyKHN0ZDo6bWF4KHRoaXNFZmZlY3Rp
dmVSaWdodCwgb3RoZXJFZmZlY3RpdmVSaWdodCkpOworICAgICAgICAgICAgICAgIG1ha2VMb3dl
cihzdGQ6Om1pbih0aGlzRWZmZWN0aXZlUmlnaHQsIG90aGVyRWZmZWN0aXZlUmlnaHQpKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2Ug
TGVzc1RoYW46IHsKKyAgICAgICAgICAgICAgICAvLyBFaXRoZXIgdGhlIExlc3NUaGFuIGNvbmRp
dGlvbiBzdWJzdW1lcyB0aGUgZXF1YWxpdHksIG9yIHRoZSBMZXNzVGhhbiBjb25kaXRpb24KKyAg
ICAgICAgICAgICAgICAvLyBhbmQgZXF1YWxpdHkgbWVyZ2UgdG9nZXRoZXIgdG8gY3JlYXRlIGEg
bG9vc2VyIExlc3NUaGFuIGNvbmRpdGlvbi4KKworICAgICAgICAgICAgICAgIC8vIE90aGVyIGlz
OiBAeCA8IG90aGVyRWZmZWN0aXZlUmlnaHQKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIEB4
ID09IHRoaXNFZmZlY3RpdmVSaWdodAorCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBj
cmVhdGUgQHggPD0gdXBwZXIuIEZpZ3VyZSBvdXQgdGhlIHZhbHVlIG9mIHVwcGVyLgorICAgICAg
ICAgICAgICAgIG1ha2VVcHBlcihzdGQ6Om1heCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8aW50NjRfdD4ob3RoZXJFZmZlY3RpdmVSaWdodCkgLSAxLAorICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0aGlzRWZmZWN0aXZlUmlnaHQpKSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdyZWF0
ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgLy8gT3Bwb3NpdGUgb2YgdGhlIExlc3NUaGFuIGNh
c2UsIGFib3ZlLgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXIgaXM6IEB4ID4gb3RoZXJFZmZl
Y3RpdmVSaWdodAorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXM6IEB4ID09IHRoaXNFZmZlY3Rp
dmVSaWdodAorCisgICAgICAgICAgICAgICAgbWFrZUxvd2VyKHN0ZDo6bWluKAorICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihvdGhlckVmZmVjdGl2ZVJpZ2h0KSArIDEs
CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHRoaXNFZmZlY3RpdmVS
aWdodCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGNhc2UgTm90RXF1YWw6IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBrZWVwIHRoZSBO
b3RFcXVhbCBzbyBsb25nIGFzIGl0IGRvZXNuJ3QgY29udHJhZGljdCBvdXIgRXF1YWwuCisgICAg
ICAgICAgICAgICAgaWYgKG90aGVyRWZmZWN0aXZlUmlnaHQgPT0gdGhpc0VmZmVjdGl2ZVJpZ2h0
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLyBCdXQs
IHdlIG9ubHkga2VlcCB0aGUgTm90RXF1YWwgaWYgaXQgaXMgZ2VuZXJhbC4gVGhpcyBzaW1wbGlm
aWVzIHJlYXNvbmluZyBhYm91dAorICAgICAgICAgICAgICAgIC8vIGNvbnZlcmdlbmNlOiBtZXJn
aW5nIG5ldmVyIGludHJvZHVjZXMgYSBuZXcgcnVsZSB1bmxlc3MgdGhhdCBydWxlIGlzIGdlbmVy
YWwuCisgICAgICAgICAgICAgICAgaWYgKG90aGVyLm1fb2Zmc2V0IDwgLTEgfHwgb3RoZXIubV9v
ZmZzZXQgPiAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgZnVuY3RvcihvdGhlcik7CisgICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgfSB9CisKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExl
c3NUaGFuOiB7CisgICAgICAgICAgICBzd2l0Y2ggKG90aGVyLm1fa2luZCkgeworICAgICAgICAg
ICAgY2FzZSBFcXVhbDogeworICAgICAgICAgICAgICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1w
bCgqdGhpcywgZnVuY3Rvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjYXNlIExlc3NUaGFuOiB7CisgICAgICAgICAgICAgICAgbWFrZVVw
cGVyKHN0ZDo6bWF4KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0
aGlzRWZmZWN0aXZlUmlnaHQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
aW50NjRfdD4ob3RoZXJFZmZlY3RpdmVSaWdodCkgLSAxKSk7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7Cisg
ICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGNsYWltIHRoYXQgQHggPiBAYyB8fCBAeCA8IEBk
LiBJZiBAZCA+IEBjLCB0aGlzIGlzIHRoZSB0YXV0b2xvZ3kuIElmCisgICAgICAgICAgICAgICAg
Ly8gQGQgPD0gQGMsIGl0J3Mgc29ydCBvZiB1bmludGVyZXN0aW5nLiBKdXN0IGlnbm9yZSB0aGlz
LgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Y2FzZSBOb3RFcXVhbDogeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBjbGFpbSB0aGF0
IEB4IDwgQGMgfHwgQHggIT0gQGQuIFRoaXMgaXNuJ3QgaW50ZXJlc3RpbmcuCisgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSB9CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICBzd2l0Y2gg
KG90aGVyLm1fa2luZCkgeworICAgICAgICAgICAgY2FzZSBFcXVhbDogeworICAgICAgICAgICAg
ICAgIG90aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhpcywgZnVuY3Rvcik7CisgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIExlc3NUaGFu
OiB7CisgICAgICAgICAgICAgICAgLy8gTm90IGludGVyZXN0aW5nLCBzZWUgYWJvdmUuCisgICAg
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdy
ZWF0ZXJUaGFuOiB7CisgICAgICAgICAgICAgICAgbWFrZUxvd2VyKHN0ZDo6bWluKAorICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0aGlzRWZmZWN0aXZlUmlnaHQpICsg
MSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ob3RoZXJFZmZlY3Rp
dmVSaWdodCkgKyAxKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBjYXNlIE5vdEVxdWFsOiB7CisgICAgICAgICAgICAgICAgLy8gTm90IGlu
dGVyZXN0aW5nLCBzZWUgYWJvdmUuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfSB9CisKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE5vdEVxdWFsOiB7Cisg
ICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEVxdWFsKQorICAgICAgICAgICAgICAgIG90
aGVyLm1lcmdlQ29uc3RhbnRzSW1wbCgqdGhpcywgZnVuY3Rvcik7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0gfQorCisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgfQogICAgIAogICAgIE5vZGUqIG1fbGVmdDsKICAgICBOb2RlKiBtX3JpZ2h0OwpAQCAt
MTE1OSw2ICsxNDYwLDc2IEBAIHByaXZhdGU6CiAgICAgICAgIGF1dG8gcmVzdWx0ID0gcmVsYXRp
b25zaGlwTWFwLmFkZCgKICAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5sZWZ0KCksIFZlY3RvcjxS
ZWxhdGlvbnNoaXA+KCkpOwogICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiYgcmVsYXRpb25z
aGlwcyA9IHJlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisKKyAgICAgICAgaWYgKHJlbGF0aW9uc2hp
cC5yaWdodCgpLT5pc0ludDMyQ29uc3RhbnQoKSkgeworICAgICAgICAgICAgLy8gV2Ugd2FudCB0
byBkbyBzb21lIHdvcmsgdG8gcmVmaW5lIHJlbGF0aW9uc2hpcHMgb3ZlciBjb25zdGFudHMuIFRo
aXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKyAgICAgICAgICAgIC8vIHdoZW4gd2UgaW50cm9kdWNl
IGEgY29uc3RhbnQgaW50byB0aGUgSVIsIHdlIGRvbid0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHJl
bGF0aW9uc2hpcHMKKyAgICAgICAgICAgIC8vIGJldHdlZW4gdGhhdCBjb25zdGFudCBhbmQgdGhl
IG90aGVyIGNvbnN0YW50cy4gVGhhdCBtZWFucyB0aGF0IHdoZW4gd2UgZG8gaW50cm9kdWNlCisg
ICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIGJldHdlZW4gYSBub24tY29uc3RhbnQgYW5kIGEg
Y29uc3RhbnQsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG90aGVyCisgICAgICAgICAgICAvLyByZWxh
dGlvbnNoaXBzIGJldHdlZW4gdGhhdCBub24tY29uc3RhbnQgYW5kIG90aGVyIGNvbnN0YW50cyB0
byBzZWUgaWYgd2UgY2FuIG1ha2Ugc29tZQorICAgICAgICAgICAgLy8gcmVmaW5lbWVudHMuIFBv
c3NpYmxlIGNvbnN0YW50IHN0YXRlbWVudCBmaWx0cmF0aW9uczoKKyAgICAgICAgICAgIC8vCisg
ICAgICAgICAgICAvLyAtIEB4ID09IEBjIGFuZCBAeCAhPSBAZCwgd2hlcmUgQGMgPiBAZDoKKyAg
ICAgICAgICAgIC8vICAgICAgIEB4ID09IEBjIGFuZCBAeCA+IEBkCisgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgLy8gYnV0IGFjdHVhbGx5IHdlIGFyZSBtb3JlIGFnZ3Jlc3NpdmU6CisgICAg
ICAgICAgICAvLworICAgICAgICAgICAgLy8gLSBAeCA9PSBAYyBhbmQgQHggb3AgQGQgd2hlcmUg
QGMgPT0gQGQgKyBrCisgICAgICAgICAgICAvLyAgICAgICBAeCA9PSBAYyBhbmQgQHggPT0gQGQg
KyBrCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQW5kIHRoaXMgaXMgYWxzbyBwb3Nz
aWJsZToKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAtIEB4ID4gQGMgYW5kIEB4ICE9
IEBkIHdoZXJlIEBjID09IEBkICsgayBhbmQgayA8PSAwCisgICAgICAgICAgICAvLworICAgICAg
ICAgICAgLy8gICAgICAgQHggPiBAYyBhbmQgQHggPiBAZCAtIGsKKyAgICAgICAgICAgIC8vCisg
ICAgICAgICAgICAvLyBTbywgaGVyZSdzIHdoYXQgd2Ugc2hvdWxkIGRvIGRlcGVuZGluZyBvbiB0
aGUga2luZCBvZiByZWxhdGlvbnNoaXAgd2UncmUgaW50cm9kdWNpbmc6CisgICAgICAgICAgICAv
LworICAgICAgICAgICAgLy8gRXF1YWwgY29uc3RhbnQ6IEZpbmQgYWxsIExlc3NUaGFuLCBOb3RF
cXVhbCwgYW5kIEdyZWF0ZXJUaGFuIGNvbnN0YW50IG9wZXJhdGlvbnMgYW5kIHJlZmluZQorICAg
ICAgICAgICAgLy8gICAgIHRoZW0gdG8gYmUgRXF1YWwgY29uc3RhbnQuIERvbid0IHdvcnJ5IGFi
b3V0IGNvbnRyYWRpY3Rpb25zLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIExlc3NU
aGFuLCBHcmVhdGVyVGhhbiBjb25zdGFudDogU2VlIGlmIHRoZXJlIGlzIGFueSBFcXVhbCBjb25z
dGFudCwgYW5kIGlmIHNvLCByZWZpbmUgdG8KKyAgICAgICAgICAgIC8vICAgICB0aGF0LiBPdGhl
cndpc2UsIGZpbmQgYWxsIE5vdEVxdWFsIGNvbnN0YW50IG9lcHJhdGlvbnMgYW5kIHJlZmluZSB0
aGVtIHRvIGJlIExlc3NUaGFuIG9yCisgICAgICAgICAgICAvLyAgICAgR3JlYXRlclRoYW4gY29u
c3RhbnQgaWYgcG9zc2libGUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTm90RXF1
YWwgY29uc3RhbnQ6IFNlZSBpZiB0aGVyZSBpcyBhbnkgRXF1YWwgY29uc3RhbnQsIGFuZCBpZiBz
bywgcmVmaW5lIHRvIHRoYXQuIE90aGVyd2lzZSwKKyAgICAgICAgICAgIC8vICAgICBzZWUgaWYg
dGhlcmUgaXMgYW55IExlc3NUaGFuIG9yIEdyZWF0ZXJUaGFuIGNvbnN0YW50IG9wZXJhdGlvbiwg
YW5kIGlmIHNvLCBhdHRlbXB0IHRvCisgICAgICAgICAgICAvLyAgICAgcmVmaW5lIHRvIHRoYXQu
CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2VlbXMgdGhhdCB0aGUga2V5IHRoaW5n
IGlzIHRvIGhhdmUgYSBmaWx0ZXJDb25zdGFudCgpIG9wZXJhdGlvbiB0aGF0IHJldHVybnMgYSBy
ZWZpbmVkCisgICAgICAgICAgICAvLyB2ZXJzaW9uIG9mICp0aGlzIGJhc2VkIG9uIG90aGVyLiBU
aGUgY29kZSBoZXJlIGFjY29tcGxpc2hlcyB0aGlzIGJ5IHVzaW5nIHRoZSB2YWd1ZW5lc3MKKyAg
ICAgICAgICAgIC8vIGluZGV4IChSZWxhdGlvbnNoaXA6OnZhZ3VlbmVzcygpKSB0byBmaXJzdCBm
aW5kIGxlc3MgdmFndWUgcmVsYXRpb25zaGlwcyBhbmQgcmVmaW5lIHRoaXMgb25lCisgICAgICAg
ICAgICAvLyB1c2luZyB0aGVtLCBhbmQgdGhlbiBmaW5kIG1vcmUgdmFndWUgcmVsYXRpb25zaGlw
cyBhbmQgcmVmaW5lIHRob3NlIHRvIHRoaXMuCisKKyAgICAgICAgICAgIGlmIChyZWxhdGlvbnNo
aXAudmFndWVuZXNzKCkgIT0gUmVsYXRpb25zaGlwOjptaW5WYWd1ZW5lc3MpIHsKKyAgICAgICAg
ICAgICAgICAvLyBXZSdyZSBub3QgbWluaW1hbGx5IHZhZ3VlIChtYXhpbWFsbHkgc3BlY2lmaWMp
LCBzbyB0cnkgdG8gcmVmaW5lIG91cnNlbHZlcyBiYXNlZCBvbiB3aGF0CisgICAgICAgICAgICAg
ICAgLy8gd2UgYWxyZWFkeSBrbm93LgorICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
JiBvdGhlclJlbGF0aW9uc2hpcCA6IHJlbGF0aW9uc2hpcHMpIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKG90aGVyUmVsYXRpb25zaGlwLnZhZ3VlbmVzcygpIDwgcmVsYXRpb25zaGlwLnZhZ3Vl
bmVzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBvdGhlclJlbGF0aW9uc2hpcC5yaWdo
dCgpLT5pc0ludDMyQ29uc3RhbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRp
b25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcC5maWx0ZXJDb25zdGFudChvdGhl
clJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBu
ZXdSZWxhdGlvbnNoaXAgIT0gcmVsYXRpb25zaGlwKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRhdGFMb2coIiAgICAgIFJlZmluZWQgdG86ICIsIG5ld1JlbGF0aW9uc2hpcCwgIiBiYXNl
ZCBvbiAiLCBvdGhlclJlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAg
ICByZWxhdGlvbnNoaXAgPSBuZXdSZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZWxh
dGlvbnNoaXAudmFndWVuZXNzKCkgIT0gUmVsYXRpb25zaGlwOjptYXhWYWd1ZW5lc3MpIHsKKyAg
ICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbWF4aW1hbGx5IHZhbHVlIChtaW5pbWFsbHkgc3Bl
Y2lmaWMpLCBzbyB0cnkgdG8gcmVmaW5lIG90aGVyIHJlbGF0aW9uc2hpcHMKKyAgICAgICAgICAg
ICAgICAvLyBiYXNlZCBvbiB0aGlzIG9uZS4KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9u
c2hpcCYgb3RoZXJSZWxhdGlvbnNoaXAgOiByZWxhdGlvbnNoaXBzKSB7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChvdGhlclJlbGF0aW9uc2hpcC52YWd1ZW5lc3MoKSA+IHJlbGF0aW9uc2hpcC52
YWd1ZW5lc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3RoZXJSZWxhdGlvbnNoaXAu
cmlnaHQoKS0+aXNJbnQzMkNvbnN0YW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSBvdGhlclJlbGF0aW9uc2hpcC5maWx0ZXJDb25z
dGFudChyZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2Ug
JiYgbmV3UmVsYXRpb25zaGlwICE9IG90aGVyUmVsYXRpb25zaGlwKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFJlZmluZWQgIiwgb3RoZXJSZWxhdGlvbnNoaXAs
ICIgdG86ICIsIG5ld1JlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAg
ICBvdGhlclJlbGF0aW9uc2hpcCA9IG5ld1JlbGF0aW9uc2hpcDsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAg
ICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRkOwogICAgICAgICBib29sIGZvdW5kID0gZmFs
c2U7CiAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBvdGhlclJlbGF0aW9uc2hpcCA6IHJlbGF0
aW9uc2hpcHMpIHsKQEAgLTExNjksNiArMTU0MCw5IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAg
ICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIC8vIEZJWE1FOiBBbHNvIGFkZCBmaWx0cmF0aW9uIG92ZXIgc3RhdGVtZW50
cyBhYm91dCBjb25zdGFudHMuIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlCisgICAgICAgICAgICAv
LyBAeCA9PSBAYyBhbmQgQHggIT0gQGQsIHdoZXJlIEBkID4gQGMsIHRoZW4gd2Ugd2FudCB0byB0
dXJuIEB4ICE9IEBkIGludG8gQHggPCBAZC4KICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYg
KHRpbWVUb0xpdmUgJiYgb3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6
RXF1YWwpIHsKICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKQEAgLTEyNjIsNTAgKzE2MzYs
NDggQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCBzb3VyY2VS
ZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAodmVy
Ym9zZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgTWVyZ2luZyAiLCB0YXJn
ZXRSZWxhdGlvbnNoaXAsICIgYW5kICIsIHNvdXJjZVJlbGF0aW9uc2hpcCwgIjpcbiIpOwotICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0KLSAgICAgICAg
ICAgICAgICAgICAgICAgIHRhcmdldFJlbGF0aW9uc2hpcC5tZXJnZShzb3VyY2VSZWxhdGlvbnNo
aXApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJv
c2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgR290ICIsIG5ld1JlbGF0
aW9uc2hpcCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAg
ICBpZiAoIW5ld1JlbGF0aW9uc2hpcCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0
byBmaWx0ZXIoKSB0byBhdm9pZCBleHBvbmVudGlhbCBleHBsb3Npb24gb2YgaWRlbnRpY2FsCi0g
ICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuIFdlIGRvIHRoaXMgaGVyZSB0byBh
dm9pZCBtYWtpbmcgc2V0T25lU2lkZSgpIGRvCi0gICAgICAgICAgICAgICAgICAgIC8vIG1vcmUg
d29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNpZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCi0g
ICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW50bHkuIEhlcmUncyBhbiBleGFtcGxlLiBBdCBz
b21lIHBvaW50IHNvbWVvbmUgbWlnaHQgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0
aCB0d28gcmVsYXRpb25zaGlwcyBsaWtlIEBhID4gQGIgLSBDIGFuZCBAYSA8IEBiICsgRC4gVGhl
bgotICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMgYSBzZXRSZWxhdGlvbnNoaXAo
KSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCi0gICAgICAgICAgICAgICAgICAgIC8vIGJv
dGggb2YgdGhlc2UgaW50byBAYSA9PSBAYi4gTm93IHdlIGhhdmUgQGEgPT0gQGIgZHVwbGljYXRl
ZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3Mgc2F5IHRoYXQgdGhpcyBkdXBsaWNhdGUg
QGEgPT0gQGIgZW5kcyB1cCBhdCB0aGUgaGVhZCBvZiBhCi0gICAgICAgICAgICAgICAgICAgIC8v
IGxvb3AuIElmIHdlIGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhlbiB0aGUgbG9vcCB3b3VsZCBw
cm9wYWdhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIEBhID09IEBiJ3Mgb250
byB0aGUgZXhpc3RpbmcgZHVwbGljYXRlIEBhID09IEBiJ3MuCi0gICAgICAgICAgICAgICAgICAg
IC8vIFRoZXJlIHdvdWxkIGJlIGZvdXIgcGFpcnMgb2YgQGEgPT0gQGIsIGVhY2ggb2Ygd2hpY2gg
d291bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBhID09IEBiLiBOb3cg
d2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGljYXRlcwotICAgICAgICAgICAgICAgICAgICAv
LyBhbmQgdGhlIG5leHQgdGltZSBhcm91bmQgd2UnZCBoYXZlIDgsIHRoZW4gMTYsIGV0Yy4gV2Ug
YXZvaWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBoZXJlIGJ5IGRvaW5nIHRoaXMgZmls
dHJhdGlvbi4gVGhhdCBtaWdodCBiZSBhIGJpdCBvZgotICAgICAgICAgICAgICAgICAgICAvLyBv
dmVya2lsbCwgc2luY2UgaXQncyBwcm9iYWJseSBqdXN0IHRoZSBpZGVudGljYWwgZHVwbGljYXRl
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcCBjYXNlIHdlIHdhbnQnIHRvIGF2
b2lkLiBCdXQsIEknbGwga2VlcCB0aGlzIHVudGlsCi0gICAgICAgICAgICAgICAgICAgIC8vIHdl
IGhhdmUgZXZpZGVuY2UgdGhhdCB0aGlzIGlzIGEgcGVyZm9ybWFuY2UgcHJvYmxlbS4gUmVtZW1i
ZXIgLQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGgg
YSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVs
YXRpb25zaGlwcyB3aXRoIGlkZW50aWNhbCBsZWZ0IG9wZXJhbmQuIEl0IHNob3VsZG4ndCBiZSBh
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxhcmdlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAg
IGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNo
aXAmIGV4aXN0aW5nUmVsYXRpb25zaGlwIDogbWVyZ2VkUmVsYXRpb25zaGlwcykgewotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKG5l
d1JlbGF0aW9uc2hpcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXAgZmlsdGVyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Jl
bGF0aW9uc2hpcC5maWx0ZXIobmV3UmVsYXRpb25zaGlwKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoZmlsdGVyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZXhpc3RpbmdSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdlKAorICAg
ICAgICAgICAgICAgICAgICAgICAgc291cmNlUmVsYXRpb25zaGlwLAorICAgICAgICAgICAgICAg
ICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3UmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBX
ZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2b2lkIGV4cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBpZGVu
dGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLiBXZSBk
byB0aGlzIGhlcmUgdG8gYXZvaWQgbWFraW5nIHNldE9uZVNpZGUoKSBkbworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIG1vcmUgd29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNpZGUo
KSB3aWxsIGJlIGNhbGxlZCBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJl
cXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0IHNvbWUgcG9pbnQgc29tZW9uZSBtaWdodCBz
dGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdHdvIHJlbGF0aW9uc2hp
cHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEgPCBAYiArIEQuIFRoZW4KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMgYSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNzaW5n
IHNvbWV0aGluZyB0aGF0IHR1cm5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90
aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBOb3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNhdGVk
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIHNheSB0aGF0IHRoaXMgZHVw
bGljYXRlIEBhID09IEBiIGVuZHMgdXAgYXQgdGhlIGhlYWQgb2YgYQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhlbiB0
aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBk
dXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRoZSBleGlzdGluZyBkdXBsaWNhdGUgQGEgPT0gQGIn
cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3b3VsZCBiZSBmb3VyIHBh
aXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdoaWNoIHdvdWxkCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBhID09IEBiLiBOb3cgd2UnZCBoYXZlIGZvdXIgb2Yg
dGhlc2UgZHVwbGljYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUg
bmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUgOCwgdGhlbiAxNiwgZXRjLiBXZSBhdm9pZAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaGVyZSBieSBkb2luZyB0aGlzIGZpbHRy
YXRpb24uIFRoYXQgbWlnaHQgYmUgYSBiaXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBwcm9iYWJseSBqdXN0IHRoZSBpZGVudGljYWwgZHVw
bGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwIGNhc2Ug
d2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwgSSdsbCBrZWVwIHRoaXMgdW50aWwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGV2aWRlbmNlIHRoYXQgdGhpcyBpcyBhIHBlcmZv
cm1hbmNlIHByb2JsZW0uIFJlbWVtYmVyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGggYSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24g
dG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIHdpdGggaWRl
bnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hvdWxkbid0IGJlIGEKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBsYXJnZSBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0
aW9uc2hpcCYgZXhpc3RpbmdSZWxhdGlvbnNoaXAgOiBtZXJnZWRSZWxhdGlvbnNoaXBzKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1JlbGF0aW9uc2hpcC5z
YW1lTm9kZXNBcyhuZXdSZWxhdGlvbnNoaXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVsYXRpb25zaGlwLmZpbHRlcihuZXdSZWxhdGlv
bnNoaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVk
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWxh
dGlvbnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBtZXJnZWRSZWxhdGlvbnNoaXBzLmFwcGVuZChuZXdSZWxhdGlvbnNo
aXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdl
ZFJlbGF0aW9uc2hpcHMuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICBzdGQ6OnNvcnQobWVyZ2VkUmVsYXRpb25zaGlwcy5iZWdpbigpLCBtZXJnZWRSZWxhdGlvbnNo
aXBzLmVuZCgpKTsKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4ODY5NSkKKysrIExheW91dFRlc3RzL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDE1LTA4LTIwICBGaWxp
cCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAgT3ZlcmZsb3cgY2hlY2sgZWxp
bWluYXRpb24gZmFpbHMgZm9yIGEgc2ltcGxlIHRlc3QgY2FzZQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3Mzg3CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkZWQgdHdvIHRlc3QgY2FzZXMgdGhhdCBw
cmV2aW91c2x5IHdvdWxkIGhhdmUgYW4gdW5uZWNlc3Nhcnkgb3ZlcmZsb3cgY2hlY2sgb24gYW4g
aW5kdWN0aW9uCisgICAgICAgIHZhcmlhYmxlLiBUaGVzZSB0ZXN0cyBzcGVlZCB1cCBieSAxMC0x
NSUgdGhhbmtzIHRvIHRoaXMgY2hhbmdlLgorCisgICAgICAgIEFsc28gYWRkZWQgLmh0bWwvZXhw
ZWN0ZWQgZmlsZXMgZm9yIHNvbWUgcmVncmVzcyB0ZXN0IHRoYXQgZGlkbid0IGhhdmUgdGhlbS4K
KworICAgICAgICAqIGpzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC1leHBlY3RlZC50eHQ6IEFkZGVk
LgorICAgICAgICAqIGpzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC5odG1sOiBBZGRlZC4KKyAgICAg
ICAgKiBqcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwtZXhwZWN0ZWQudHh0OiBB
ZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuaHRt
bDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNr
Lmh0bWw6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3Zl
cmZsb3ctY2hlY2stZXF1YWwuanM6IEFkZGVkLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiBq
cy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNrLmpzOiBBZGRlZC4KKyAg
ICAgICAgKGZvbyk6CisKIDIwMTUtMDgtMjAgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNv
bT4KIAogICAgICAgICBbQ29jb2FdIFRyZWF0IEVwb2NoIGFzIGludmFsaWQgdmFsdWUgZm9yICJM
YXN0LU1vZGlmaWVkIiBoZWFkZXIKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZnVuY3Rp
b24tY2FsbC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVz
cy9mdW5jdGlvbi1jYWxsLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2pzL3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2Z1bmN0aW9uLWNhbGwKKworT24gc3VjY2VzcywgeW91
IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1Qg
Q09NUExFVEUiLgorCisKK1BBU1Mgbm8gZXhjZXB0aW9uIHRocm93bgorUEFTUyBzdWNjZXNzZnVs
bHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2pz
L3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pz
L3JlZ3Jlc3MvZnVuY3Rpb24tY2FsbC5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9mdW5jdGlvbi1jYWxsLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0
bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMi
Pjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2Vz
L3JlZ3Jlc3MtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvZnVu
Y3Rpb24tY2FsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3Jl
Z3Jlc3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pz
LXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRU
ZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwtZXhwZWN0ZWQudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvaGFyZC1vdmVyZmxvdy1jaGVjay1l
cXVhbC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNz
L2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMTAgQEAKK0pTUmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLWVxdWFsCisKK09u
IHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxv
d2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BB
U1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBM
YXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1YWwuaHRtbAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXF1
YWwuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvaGFyZC1vdmVy
Zmxvdy1jaGVjay1lcXVhbC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwh
RE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhl
YWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Njcmlw
dD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNz
LXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZs
b3ctY2hlY2stZXF1YWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNl
cy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNl
cy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5
b3V0VGVzdHMvanMvcmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLWV4cGVjdGVkLnR4dAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2stZXhw
ZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9oYXJkLW92
ZXJmbG93LWNoZWNrLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBA
CitKU1JlZ3Jlc3MvaGFyZC1vdmVyZmxvdy1jaGVjaworCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBz
ZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVU
RSIuCisKKworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNl
ZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVz
cy9oYXJkLW92ZXJmbG93LWNoZWNrLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMv
cmVncmVzcy9oYXJkLW92ZXJmbG93LWNoZWNrLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRU
ZXN0cy9qcy9yZWdyZXNzL2hhcmQtb3ZlcmZsb3ctY2hlY2suaHRtbAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1M
Ly9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10
ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSIuLi8u
Li9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlw
dC10ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNrLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIu
Li8uLi9yZXNvdXJjZXMvcmVncmVzcy1wb3N0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIu
Li8uLi9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRt
bD4KSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZs
b3ctY2hlY2stZXF1YWwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9z
Y3JpcHQtdGVzdHMvaGFyZC1vdmVyZmxvdy1jaGVjay1lcXVhbC5qcwkocmV2aXNpb24gMCkKKysr
IExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2hhcmQtb3ZlcmZsb3ctY2hlY2st
ZXF1YWwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNyBAQAorZnVuY3Rpb24gZm9vKG8p
IHsKKyAgICB2YXIgcmVzdWx0ID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSAhPSAxMDA7ICsr
aSkgLy8gKytpIHN0aWxsIGhhcyBhbiBvdmVyZmxvdyBjaGVjayBpbiB0aGUgZW1pdHRlZCBjb2Rl
CisgICAgICAgIHJlc3VsdCArPSBvLmY7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9Jbmxp
bmUoZm9vKTsKKwordmFyIHAgPSB7Zjo0Mn07Cit2YXIgbyA9IE9iamVjdC5jcmVhdGUocCk7CisK
K2ZvciAodmFyIGkgPSAwOyBpIDwgNTAwMDAwOyArK2kpIHsKKyAgICBwLmYgPSBpOworICAgIGZv
byhvKTsKK30KKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvaGFy
ZC1vdmVyZmxvdy1jaGVjay5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNz
L3NjcmlwdC10ZXN0cy9oYXJkLW92ZXJmbG93LWNoZWNrLmpzCShyZXZpc2lvbiAwKQorKysgTGF5
b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvaGFyZC1vdmVyZmxvdy1jaGVjay5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3IEBACitmdW5jdGlvbiBmb28obykgeworICAgIHZh
ciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyArK2kpIC8vICsraSBz
dGlsbCBoYXMgYW4gb3ZlcmZsb3cgY2hlY2sgaW4gdGhlIGVtaXR0ZWQgY29kZQorICAgICAgICBy
ZXN1bHQgKz0gby5mOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK25vSW5saW5lKGZvbyk7CisK
K3ZhciBwID0ge2Y6NDJ9OwordmFyIG8gPSBPYmplY3QuY3JlYXRlKHApOworCitmb3IgKHZhciBp
ID0gMDsgaSA8IDUwMDAwMDsgKytpKSB7CisgICAgcC5mID0gaTsKKyAgICBmb28obyk7Cit9CisK
</data>
<flag name="review"
          id="284680"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>