<?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>144013</bug_id>
          
          <creation_ts>2015-04-21 14:54:17 -0700</creation_ts>
          <short_desc>It shouldn&apos;t take 1846 lines of code and 5 FIXMEs to sort an array.</short_desc>
          <delta_ts>2015-05-04 11:16:54 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>144189</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>kling</cc>
    
    <cc>mark.lam</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1087176</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-21 14:54:17 -0700</bug_when>
    <thetext>It shouldn&apos;t take 1846 lines of code and 5 FIXMEs to sort an array.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1087910</commentid>
    <comment_count>1</comment_count>
      <attachid>251462</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-23 12:01:36 -0700</bug_when>
    <thetext>Created attachment 251462
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1087911</commentid>
    <comment_count>2</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-23 12:01:59 -0700</bug_when>
    <thetext>Baseline:/Volumes/Big/ggaren/OpenSource/WebKitBuildBaseline/Release/jsc Patch:/Volumes/Big/ggaren/OpenSource/WebKitBuild/Release/jsc
Warning: could not identify checkout location for Baseline
Warning: refusing to run JSBench because not all VMs are DumpRenderTree or WebKitTestRunner.
Warning: refusing to run DSPJS because not all VMs are DumpRenderTree or WebKitTestRunner.
3292/3292                                                                                    
Generating benchmark report at /Volumes/Big/ggaren/Internal/Baseline_Patch_SunSpiderLongSpiderV8SpiderOctaneKrakenJSRegressAsmBenchCompressionBench_Geoffrey-Garens-Mac-Pro_20150421_1435_report.txt
And raw data at /Volumes/Big/ggaren/Internal/Baseline_Patch_SunSpiderLongSpiderV8SpiderOctaneKrakenJSRegressAsmBenchCompressionBench_Geoffrey-Garens-Mac-Pro_20150421_1435.json

Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on Geoffrey-Garens-Mac-Pro (MacPro6,1).

VMs tested:
&quot;Baseline&quot; at /Volumes/Big/ggaren/OpenSource/WebKitBuildBaseline/Release/jsc
&quot;Patch&quot; at /Volumes/Big/ggaren/OpenSource/WebKitBuild/Release/jsc (r183036)

Collected 4 samples per benchmark/VM, with 4 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.

                                                         Baseline                   Patch                                       
SunSpider:
   3d-cube                                            5.5677+-0.7728            5.3825+-0.2220          might be 1.0344x faster
   3d-morph                                           6.1693+-0.1987            6.1157+-0.0410        
   3d-raytrace                                        6.8361+-0.1144     ?      6.9913+-0.3576        ? might be 1.0227x slower
   access-binary-trees                                2.4767+-0.0942     ?      2.4887+-0.1224        ?
   access-fannkuch                                    6.2525+-0.1460     ?      6.2554+-0.2226        ?
   access-nbody                                       3.2916+-0.4163            3.0532+-0.0306          might be 1.0781x faster
   access-nsieve                                      3.8262+-0.2284            3.7385+-0.0647          might be 1.0235x faster
   bitops-3bit-bits-in-byte                           1.8043+-0.0622     ?      1.8215+-0.1008        ?
   bitops-bits-in-byte                                3.6970+-0.1164            3.6378+-0.1394          might be 1.0163x faster
   bitops-bitwise-and                                 2.4180+-0.0683     ?      2.4342+-0.3351        ?
   bitops-nsieve-bits                                 4.0034+-0.0785     ?      4.1245+-0.1513        ? might be 1.0303x slower
   controlflow-recursive                              2.6765+-0.3857            2.4520+-0.0799          might be 1.0916x faster
   crypto-aes                                         4.8315+-0.6163            4.6675+-0.2707          might be 1.0352x faster
   crypto-md5                                         2.6105+-0.0582     ?      2.7078+-0.2331        ? might be 1.0373x slower
   crypto-sha1                                        2.7966+-0.0718     ?      2.8128+-0.0067        ?
   date-format-tofte                                 10.2387+-0.1914     ?     10.2669+-0.1977        ?
   date-format-xparb                                  5.8578+-0.2059     ?      6.1187+-0.6560        ? might be 1.0445x slower
   math-cordic                                        3.4519+-0.1443     ?      3.5068+-0.1411        ? might be 1.0159x slower
   math-partial-sums                                  5.8187+-0.2908            5.5450+-0.1255          might be 1.0494x faster
   math-spectral-norm                                 2.2040+-0.1859            2.1609+-0.0693          might be 1.0199x faster
   regexp-dna                                         7.7953+-0.3243            7.6183+-0.1443          might be 1.0232x faster
   string-base64                                      4.6689+-0.0981     ?      4.8115+-0.2734        ? might be 1.0305x slower
   string-fasta                                       7.1084+-0.1103     ?      7.2725+-0.5848        ? might be 1.0231x slower
   string-tagcloud                                   10.1756+-0.2671           10.1475+-0.4400        
   string-unpack-code                                21.1628+-1.2764           21.1196+-0.4574        
   string-validate-input                              5.1068+-0.4456     ?      5.1253+-0.3623        ?

   &lt;arithmetic&gt;                                       5.4941+-0.0729            5.4760+-0.0785          might be 1.0033x faster

                                                         Baseline                   Patch                                       
LongSpider:
   3d-cube                                          887.0122+-20.8954    ^    860.3473+-4.1141        ^ definitely 1.0310x faster
   3d-morph                                        1629.5960+-6.2563     ?   1631.1393+-6.6875        ?
   3d-raytrace                                      793.3199+-18.7722         785.7487+-7.8263        
   access-binary-trees                             1009.6404+-13.9421        1006.8672+-10.4661       
   access-fannkuch                                  362.7690+-17.2503         356.3654+-13.7783         might be 1.0180x faster
   access-nbody                                     650.6440+-2.4717     ?    657.1128+-19.8439       ?
   access-nsieve                                    833.9120+-7.6673     ?    834.5908+-4.3252        ?
   bitops-3bit-bits-in-byte                          49.4887+-1.0497     ?     50.1646+-0.9087        ? might be 1.0137x slower
   bitops-bits-in-byte                               99.2305+-0.5604     ?     99.4317+-2.1340        ?
   bitops-nsieve-bits                               744.7573+-1.9660     !    764.3015+-4.6385        ! definitely 1.0262x slower
   controlflow-recursive                            527.5343+-20.7141         525.9948+-7.3874        
   crypto-aes                                       718.5527+-3.0679          718.3098+-2.9095        
   crypto-md5                                       589.8535+-2.6433          588.7848+-4.5623        
   crypto-sha1                                      650.0023+-0.7419     ?    659.9891+-16.1040       ? might be 1.0154x slower
   date-format-tofte                                789.6113+-12.1471    ?    791.7051+-16.2973       ?
   date-format-xparb                                812.5604+-51.2902         806.5718+-24.3214       
   math-cordic                                      630.0166+-4.2850          628.8588+-1.0235        
   math-partial-sums                                552.0300+-14.3384         543.8149+-12.0292         might be 1.0151x faster
   math-spectral-norm                               627.2335+-61.5716         604.0975+-5.6619          might be 1.0383x faster
   string-base64                                    377.6727+-1.0512     ?    379.1585+-11.0813       ?
   string-fasta                                     459.1750+-3.3120          458.9230+-6.9162        
   string-tagcloud                                  230.3871+-1.2264     ^    212.1227+-9.5972        ^ definitely 1.0861x faster

   &lt;geometric&gt;                                      524.2341+-2.4103          521.0470+-2.1548          might be 1.0061x faster

                                                         Baseline                   Patch                                       
V8Spider:
   crypto                                            59.8617+-0.8946           59.2698+-0.7479        
   deltablue                                         79.8693+-2.2981     ?     80.5650+-1.0764        ?
   earley-boyer                                      46.3749+-1.2060           46.3386+-1.0401        
   raytrace                                          35.2684+-0.2628           35.2287+-0.1933        
   regexp                                            70.4697+-1.4735     ?     71.1258+-2.7274        ?
   richards                                          82.8699+-2.5135     ?     84.3646+-1.4174        ? might be 1.0180x slower
   splay                                             39.8848+-2.8721     ?     41.5512+-3.0335        ? might be 1.0418x slower

   &lt;geometric&gt;                                       56.4189+-0.8379     ?     56.9443+-0.7310        ? might be 1.0093x slower

                                                         Baseline                   Patch                                       
Octane:
   encrypt                                           0.23418+-0.00176    ?     0.23779+-0.00724       ? might be 1.0154x slower
   decrypt                                           4.30039+-0.16977    ?     4.35327+-0.02320       ? might be 1.0123x slower
   deltablue                                x2       0.22356+-0.01669          0.21887+-0.00922         might be 1.0214x faster
   earley                                            0.55289+-0.00308    ?     0.55639+-0.01237       ?
   boyer                                             6.90810+-0.02899    ?     6.91300+-0.02594       ?
   navier-stokes                            x2       5.52322+-0.01298    ?     5.52815+-0.00882       ?
   raytrace                                 x2       1.27607+-0.07928          1.27430+-0.07017       
   richards                                 x2       0.12364+-0.00263          0.12353+-0.00206       
   splay                                    x2       0.41213+-0.00149    ^     0.40800+-0.00190       ^ definitely 1.0101x faster
   regexp                                   x2      33.56686+-1.01507         33.23486+-0.35511       
   pdfjs                                    x2      46.65090+-1.74282         45.72426+-0.54246         might be 1.0203x faster
   mandreel                                 x2      56.39650+-0.80499         56.29856+-0.17832       
   gbemu                                    x2      42.95156+-1.65639         42.45541+-0.30524         might be 1.0117x faster
   closure                                           0.63235+-0.00394    ?     0.63482+-0.00368       ?
   jquery                                            7.96260+-0.05127          7.95972+-0.06325       
   box2d                                    x2      13.57527+-0.05180    ?    13.67634+-0.29886       ?
   zlib                                     x2     394.50187+-29.24636   ?   411.35183+-3.01397       ? might be 1.0427x slower
   typescript                               x2     890.05432+-21.59462   ?   900.04626+-13.18710      ? might be 1.0112x slower

   &lt;geometric&gt;                                       7.13849+-0.02942    ?     7.14114+-0.05586       ? might be 1.0004x slower

                                                         Baseline                   Patch                                       
Kraken:
   ai-astar                                          357.706+-7.014            355.855+-10.479        
   audio-beat-detection                              114.962+-1.072            114.598+-0.774         
   audio-dft                                         147.864+-1.855            147.753+-1.228         
   audio-fft                                          84.965+-0.781             84.459+-1.334         
   audio-oscillator                                  220.126+-3.593            218.508+-1.209         
   imaging-darkroom                                  110.796+-0.530            110.663+-0.612         
   imaging-desaturate                                 68.986+-0.817      ?      69.190+-2.597         ?
   imaging-gaussian-blur                             120.578+-6.964            117.766+-1.128           might be 1.0239x faster
   json-parse-financial                               47.461+-0.642      ?      47.833+-1.472         ?
   json-stringify-tinderbox                           60.874+-2.431             59.954+-1.502           might be 1.0153x faster
   stanford-crypto-aes                                68.495+-1.784             67.108+-2.266           might be 1.0207x faster
   stanford-crypto-ccm                                64.395+-8.390             62.453+-7.470           might be 1.0311x faster
   stanford-crypto-pbkdf2                            177.650+-2.095      ?     180.404+-9.641         ? might be 1.0155x slower
   stanford-crypto-sha256-iterative                   58.750+-2.628             57.804+-0.724           might be 1.0164x faster

   &lt;arithmetic&gt;                                      121.686+-1.080            121.025+-0.433           might be 1.0055x faster

                                                         Baseline                   Patch                                       
JSRegress:
   abs-boolean                                        2.9094+-0.1151            2.8706+-0.1008          might be 1.0135x faster
   adapt-to-double-divide                            17.7902+-0.2613           17.5744+-0.2143          might be 1.0123x faster
   aliased-arguments-getbyval                         1.4661+-0.0634            1.4111+-0.0916          might be 1.0390x faster
   allocate-big-object                                2.8365+-0.1412     ?      2.8466+-0.2833        ?
   arguments-named-and-reflective                    12.5333+-0.4746           12.3802+-0.0832          might be 1.0124x faster
   arguments-out-of-bounds                           15.3045+-0.2324     ?     15.4169+-0.0845        ?
   arguments-strict-mode                             11.2045+-0.2630     ?     11.3172+-0.1610        ? might be 1.0101x slower
   arguments                                         10.1086+-0.9549            9.9953+-0.1285          might be 1.0113x faster
   arity-mismatch-inlining                            1.0524+-0.1134            1.0432+-0.0782        
   array-access-polymorphic-structure                 6.7587+-0.4709            6.5449+-0.1193          might be 1.0327x faster
   array-nonarray-polymorhpic-access                 36.4120+-1.8565           35.9543+-4.1115          might be 1.0127x faster
   array-prototype-every                             91.4720+-1.6474           90.6045+-0.3903        
   array-prototype-forEach                           91.9144+-1.1860     ^     88.5771+-0.6226        ^ definitely 1.0377x faster
   array-prototype-map                              100.6151+-1.7543          100.3936+-0.9512        
   array-prototype-some                              91.9785+-1.7787           91.0440+-0.7031          might be 1.0103x faster
   array-splice-contiguous                           43.1200+-0.4139     ?     43.7303+-2.0848        ? might be 1.0142x slower
   array-with-double-add                              4.3311+-0.1221     ?      4.4105+-0.0555        ? might be 1.0183x slower
   array-with-double-increment                        3.5062+-0.1784            3.4887+-0.0898        
   array-with-double-mul-add                          5.3138+-0.0742            5.2813+-0.1747        
   array-with-double-sum                              3.5532+-0.1424            3.5170+-0.0270          might be 1.0103x faster
   array-with-int32-add-sub                           7.1514+-0.1529     ?      7.2803+-0.2799        ? might be 1.0180x slower
   array-with-int32-or-double-sum                     3.6124+-0.0797            3.5643+-0.0789          might be 1.0135x faster
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     33.2905+-0.9426     ?     33.4192+-0.9062        ?
   ArrayBuffer-DataView-alloc-long-lived             14.0106+-0.6232     ?     14.0468+-0.6647        ?
   ArrayBuffer-Int32Array-byteOffset                  4.1122+-0.3320     ?      4.1419+-0.2097        ?
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     35.1407+-0.6321           34.6693+-0.7550          might be 1.0136x faster
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     23.4186+-1.0638     ?     24.3345+-1.2385        ? might be 1.0391x slower
   ArrayBuffer-Int8Array-alloc-long-lived            13.6414+-0.6080           13.6016+-0.6798        
   ArrayBuffer-Int8Array-alloc                       11.8489+-1.6121           11.2255+-0.2632          might be 1.0555x faster
   asmjs_bool_bug                                     8.1063+-0.1908     ?      8.2493+-0.2555        ? might be 1.0176x slower
   assign-custom-setter-polymorphic                   3.6128+-0.2408            3.4476+-0.2088          might be 1.0479x faster
   assign-custom-setter                               4.8065+-0.2370            4.4275+-0.1516          might be 1.0856x faster
   basic-set                                          9.4175+-0.2282     ?      9.5522+-0.1614        ? might be 1.0143x slower
   big-int-mul                                        4.3123+-0.1057            4.1713+-0.0645          might be 1.0338x faster
   boolean-test                                       3.2523+-0.1012     ?      3.2888+-0.0749        ? might be 1.0112x slower
   branch-fold                                        4.0492+-0.2695            4.0244+-0.1662        
   by-val-generic                                     8.3965+-0.6057            8.2150+-0.3167          might be 1.0221x faster
   call-spread-apply                                 31.6777+-0.6910     ?     33.5292+-5.1304        ? might be 1.0585x slower
   call-spread-call                                  26.1017+-0.7777     ?     26.4108+-0.6924        ? might be 1.0118x slower
   captured-assignments                               0.5575+-0.0160            0.5470+-0.0218          might be 1.0192x faster
   cast-int-to-double                                 5.8088+-0.2091            5.7172+-0.2502          might be 1.0160x faster
   cell-argument                                      8.7584+-0.3149            8.5868+-0.4153          might be 1.0200x faster
   cfg-simplify                                       3.0412+-0.0826     ?      3.0623+-0.1372        ?
   chain-getter-access                               10.8195+-0.3086     ?     10.9815+-0.6609        ? might be 1.0150x slower
   cmpeq-obj-to-obj-other                            11.6938+-0.0268           11.4757+-0.3539          might be 1.0190x faster
   constant-test                                      5.5484+-0.1910            5.4340+-0.2063          might be 1.0210x faster
   create-lots-of-functions                          11.9831+-1.2744           11.6940+-0.7576          might be 1.0247x faster
   DataView-custom-properties                        39.0237+-0.9481     ?     39.6093+-1.7499        ? might be 1.0150x slower
   deconstructing-parameters-overridden-by-function   
                                                      0.6750+-0.0388            0.6731+-0.0783        
   delay-tear-off-arguments-strictmode               14.5137+-1.0844           14.1950+-0.2538          might be 1.0225x faster
   deltablue-varargs                                214.6038+-2.6073     ?    218.0558+-2.2539        ? might be 1.0161x slower
   destructuring-arguments                           17.6169+-0.7706           17.6015+-0.7268        
   destructuring-swap                                 5.5090+-0.1994     ?      5.6208+-0.1626        ? might be 1.0203x slower
   direct-arguments-getbyval                          1.4108+-0.0745     ?      1.4285+-0.1377        ? might be 1.0125x slower
   div-boolean-double                                 5.5641+-0.0677     ?      5.6941+-0.3294        ? might be 1.0234x slower
   div-boolean                                        8.7202+-0.5452     ?      8.9539+-1.6962        ? might be 1.0268x slower
   double-get-by-val-out-of-bounds                    4.6752+-0.0863     ?      4.7353+-0.1974        ? might be 1.0129x slower
   double-pollution-getbyval                          9.4255+-0.2810     ?      9.6119+-0.3883        ? might be 1.0198x slower
   double-pollution-putbyoffset                       4.6297+-0.2159     ?      4.7104+-0.1706        ? might be 1.0174x slower
   double-to-int32-typed-array-no-inline              2.6053+-0.0949     ?      2.6315+-0.1447        ? might be 1.0101x slower
   double-to-int32-typed-array                        2.2092+-0.0635     ?      2.2324+-0.0601        ? might be 1.0105x slower
   double-to-uint32-typed-array-no-inline             2.6342+-0.0826     ?      2.6847+-0.0382        ? might be 1.0192x slower
   double-to-uint32-typed-array                       2.3294+-0.2728            2.2415+-0.0368          might be 1.0392x faster
   elidable-new-object-dag                           41.9064+-0.9755     ?     42.1622+-0.7659        ?
   elidable-new-object-roflcopter                    46.9862+-0.6008           46.7589+-1.5929        
   elidable-new-object-then-call                     36.8167+-3.9337     ?     38.0142+-6.0864        ? might be 1.0325x slower
   elidable-new-object-tree                          46.0569+-2.1536           44.4938+-0.9560          might be 1.0351x faster
   empty-string-plus-int                              5.7245+-0.2284            5.6328+-0.2186          might be 1.0163x faster
   emscripten-cube2hash                              40.8355+-0.6106     ?     41.9808+-1.4297        ? might be 1.0280x slower
   exit-length-on-plain-object                       14.6993+-0.3555           14.5534+-1.2699          might be 1.0100x faster
   external-arguments-getbyval                        1.4156+-0.0219     ?      1.5408+-0.2956        ? might be 1.0884x slower
   external-arguments-putbyval                        2.5085+-0.0811     ?      2.5780+-0.1528        ? might be 1.0277x slower
   fixed-typed-array-storage-var-index                1.4658+-0.0549     ?      1.5037+-0.1505        ? might be 1.0259x slower
   fixed-typed-array-storage                          1.1517+-0.0725            1.1207+-0.0428          might be 1.0277x faster
   Float32Array-matrix-mult                           4.6752+-0.0575            4.6550+-0.2147        
   Float32Array-to-Float64Array-set                  58.5582+-2.3890     ?     58.6997+-0.4127        ?
   Float64Array-alloc-long-lived                     73.5706+-3.0572           72.4182+-0.3813          might be 1.0159x faster
   Float64Array-to-Int16Array-set                    70.1050+-0.9200     ?     74.2009+-3.5602        ? might be 1.0584x slower
   fold-double-to-int                                15.2723+-0.9452           14.8812+-0.2792          might be 1.0263x faster
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                      9.0269+-0.7765     ?      9.2622+-0.5734        ? might be 1.0261x slower
   fold-get-by-id-to-multi-get-by-offset              7.5248+-0.3105     ?      7.7972+-0.3617        ? might be 1.0362x slower
   fold-multi-get-by-offset-to-get-by-offset   
                                                      6.9977+-0.8436            6.8033+-1.0456          might be 1.0286x faster
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      7.2759+-0.7964     ?      7.4968+-0.7903        ? might be 1.0304x slower
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                      6.7702+-0.8682     ?      7.0533+-0.0892        ? might be 1.0418x slower
   fold-multi-put-by-offset-to-put-by-offset   
                                                      5.2223+-0.0497     !      5.3822+-0.0412        ! definitely 1.0306x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     11.0278+-0.6893     ?     11.1487+-1.4232        ? might be 1.0110x slower
   fold-put-by-id-to-multi-put-by-offset              7.5066+-0.3450            7.0890+-0.0744          might be 1.0589x faster
   fold-put-structure                                 4.7961+-0.8946            4.5361+-0.0354          might be 1.0573x faster
   for-of-iterate-array-entries                       4.7314+-0.3139            4.6050+-0.2087          might be 1.0274x faster
   for-of-iterate-array-keys                          3.9197+-0.1572     ?      3.9472+-0.1828        ?
   for-of-iterate-array-values                        3.8558+-0.0772            3.7812+-0.2246          might be 1.0197x faster
   fround                                            20.4633+-0.5491     ?     20.6503+-0.7596        ?
   ftl-library-inlining-dataview                     83.2618+-1.2690     ?     85.8697+-11.9908       ? might be 1.0313x slower
   ftl-library-inlining                              79.7913+-32.4172          79.7305+-33.6498       
   function-dot-apply                                 2.5000+-0.1349            2.4999+-0.0711        
   function-test                                      3.6436+-0.0634            3.5603+-0.0935          might be 1.0234x faster
   function-with-eval                               104.6974+-0.5757     ?    107.7865+-2.7821        ? might be 1.0295x slower
   gcse-poly-get-less-obvious                        19.9857+-1.2704     !     24.8235+-3.1354        ! definitely 1.2421x slower
   gcse-poly-get                                     24.4490+-6.5179           22.8880+-3.2762          might be 1.0682x faster
   gcse                                               4.5554+-0.0645     ?      4.6890+-0.2343        ? might be 1.0293x slower
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      3.0457+-0.1641            2.9805+-0.1158          might be 1.0219x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      6.6837+-0.2884            6.5342+-0.1803          might be 1.0229x faster
   get-by-id-chain-from-try-block                     7.3915+-0.4488            7.0908+-0.3223          might be 1.0424x faster
   get-by-id-check-structure-elimination              5.6979+-0.1629            5.4233+-0.2034          might be 1.0506x faster
   get-by-id-proto-or-self                           21.3553+-2.3495     ^     18.0282+-0.8640        ^ definitely 1.1845x faster
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      3.2388+-0.1759            3.2083+-0.1533        
   get-by-id-self-or-proto                           21.0477+-1.4021           18.8860+-1.2192          might be 1.1145x faster
   get-by-val-out-of-bounds                           4.5901+-0.1605            4.4645+-0.0669          might be 1.0281x faster
   get_callee_monomorphic                             2.7032+-0.3453            2.6510+-0.1478          might be 1.0197x faster
   get_callee_polymorphic                             3.7428+-0.3348            3.5882+-0.1220          might be 1.0431x faster
   getter-no-activation                               5.5292+-0.1162     ?      5.5577+-0.0311        ?
   getter-richards                                  105.1459+-1.6929          104.5331+-2.6928        
   getter                                             5.9775+-0.1015     ?      6.1130+-0.1237        ? might be 1.0227x slower
   global-var-const-infer-fire-from-opt               1.0563+-0.0354     ?      1.1340+-0.3016        ? might be 1.0736x slower
   global-var-const-infer                             1.1948+-0.2108            1.0437+-0.2097          might be 1.1447x faster
   HashMap-put-get-iterate-keys                      28.0132+-0.3075     ?     28.5099+-1.1406        ? might be 1.0177x slower
   HashMap-put-get-iterate                           28.8633+-2.0218           28.4125+-0.7358          might be 1.0159x faster
   HashMap-string-put-get-iterate                    27.1171+-0.7642     ?     27.4158+-0.8218        ? might be 1.0110x slower
   hoist-make-rope                                   11.7551+-2.7456     ?     11.9830+-1.8950        ? might be 1.0194x slower
   hoist-poly-check-structure-effectful-loop   
                                                      5.5980+-0.2939            5.5310+-0.2166          might be 1.0121x faster
   hoist-poly-check-structure                         4.0390+-0.3803            3.9198+-0.0604          might be 1.0304x faster
   imul-double-only                                   8.3347+-1.2914            8.1788+-1.0365          might be 1.0191x faster
   imul-int-only                                     10.1284+-0.7330            9.9365+-0.7853          might be 1.0193x faster
   imul-mixed                                         7.7749+-0.3717     ?      8.0840+-0.1760        ? might be 1.0398x slower
   in-four-cases                                     20.0421+-0.3802     ?     20.5680+-0.8189        ? might be 1.0262x slower
   in-one-case-false                                 10.7999+-0.1297     ?     10.8692+-0.1303        ?
   in-one-case-true                                  10.8538+-0.2015     ?     10.9510+-0.2660        ?
   in-two-cases                                      11.3312+-0.3854           11.1518+-0.1251          might be 1.0161x faster
   indexed-properties-in-objects                      3.2654+-0.1699            3.1768+-0.1503          might be 1.0279x faster
   infer-closure-const-then-mov-no-inline             4.6840+-0.0525     ?      4.7139+-0.1532        ?
   infer-closure-const-then-mov                      21.4635+-0.2662           21.3054+-0.4004        
   infer-closure-const-then-put-to-scope-no-inline   
                                                     15.7256+-0.9889           15.2602+-0.9636          might be 1.0305x faster
   infer-closure-const-then-put-to-scope             24.4890+-0.6259           23.4423+-0.7379          might be 1.0447x faster
   infer-closure-const-then-reenter-no-inline   
                                                     66.5543+-2.1922           65.6005+-0.8278          might be 1.0145x faster
   infer-closure-const-then-reenter                  23.6190+-1.0882           23.5042+-1.5250        
   infer-constant-global-property                    32.5217+-1.2698           31.7505+-0.7211          might be 1.0243x faster
   infer-constant-property                            2.9675+-0.1916            2.8633+-0.0368          might be 1.0364x faster
   infer-one-time-closure-ten-vars                   12.7314+-0.5340     ?     12.9506+-0.3939        ? might be 1.0172x slower
   infer-one-time-closure-two-vars                   12.3081+-0.1821     ?     12.8495+-1.2093        ? might be 1.0440x slower
   infer-one-time-closure                            12.3171+-0.4983     ?     12.5190+-1.6315        ? might be 1.0164x slower
   infer-one-time-deep-closure                       21.4243+-0.4128     ?     22.3924+-1.7422        ? might be 1.0452x slower
   inline-arguments-access                            4.5353+-0.2916     ?      4.7390+-0.5464        ? might be 1.0449x slower
   inline-arguments-aliased-access                    4.5366+-0.1217            4.5284+-0.2606        
   inline-arguments-local-escape                      4.7930+-0.3467            4.5610+-0.1318          might be 1.0509x faster
   inline-get-scoped-var                              5.5200+-0.0947            5.4669+-0.0524        
   inlined-put-by-id-transition                      10.9617+-0.8398           10.9065+-0.7564        
   int-or-other-abs-then-get-by-val                   5.6992+-0.3623            5.4805+-0.0603          might be 1.0399x faster
   int-or-other-abs-zero-then-get-by-val             19.2844+-0.5763     ^     18.0856+-0.1715        ^ definitely 1.0663x faster
   int-or-other-add-then-get-by-val                   4.7267+-0.1398     !      5.0997+-0.1516        ! definitely 1.0789x slower
   int-or-other-add                                   5.8188+-0.1028            5.8063+-0.2168        
   int-or-other-div-then-get-by-val                   4.7885+-0.2473            4.7780+-0.1635        
   int-or-other-max-then-get-by-val                   4.8740+-0.2931            4.6931+-0.0310          might be 1.0385x faster
   int-or-other-min-then-get-by-val                   4.9388+-0.2386            4.9221+-0.2019        
   int-or-other-mod-then-get-by-val                   4.3675+-0.1319            4.1954+-0.2654          might be 1.0410x faster
   int-or-other-mul-then-get-by-val                   4.4780+-0.3448            4.3141+-0.2117          might be 1.0380x faster
   int-or-other-neg-then-get-by-val                   5.0284+-0.0868            4.9285+-0.0736          might be 1.0203x faster
   int-or-other-neg-zero-then-get-by-val             18.9901+-0.7357           18.3657+-0.1439          might be 1.0340x faster
   int-or-other-sub-then-get-by-val                   4.6493+-0.1366     !      5.1746+-0.2324        ! definitely 1.1130x slower
   int-or-other-sub                                   3.8831+-0.1287     ?      3.9573+-0.2892        ? might be 1.0191x slower
   int-overflow-local                                 4.7625+-0.1670            4.7220+-0.1353        
   Int16Array-alloc-long-lived                       51.2442+-0.4705     ?     51.4240+-1.1816        ?
   Int16Array-bubble-sort-with-byteLength            20.5860+-0.9416     ?     20.5948+-0.8057        ?
   Int16Array-bubble-sort                            20.5998+-0.4349     ?     21.0256+-0.2802        ? might be 1.0207x slower
   Int16Array-load-int-mul                            1.6882+-0.0474     ?      1.7139+-0.0469        ? might be 1.0152x slower
   Int16Array-to-Int32Array-set                      52.8524+-1.0131     ?     59.6533+-15.5013       ? might be 1.1287x slower
   Int32Array-alloc-large                            22.1255+-2.5554           21.6679+-0.5149          might be 1.0211x faster
   Int32Array-alloc-long-lived                       59.0287+-1.7037           58.0013+-1.5312          might be 1.0177x faster
   Int32Array-alloc                                   3.0342+-0.1372            3.0108+-0.2692        
   Int32Array-Int8Array-view-alloc                    8.2670+-1.6515            6.8789+-0.1286          might be 1.2018x faster
   int52-spill                                        7.0615+-0.3609            6.7220+-0.1933          might be 1.0505x faster
   Int8Array-alloc-long-lived                        48.6080+-1.4742     ?     48.9330+-2.1192        ?
   Int8Array-load-with-byteLength                     3.5845+-0.0505     ?      3.6327+-0.0759        ? might be 1.0134x slower
   Int8Array-load                                     3.6232+-0.1532     ?      3.6365+-0.0788        ?
   integer-divide                                    12.3243+-0.3675     ?     12.4622+-0.1446        ? might be 1.0112x slower
   integer-modulo                                     2.4131+-0.1436     ?      2.5792+-0.5207        ? might be 1.0688x slower
   large-int-captured                                 4.7529+-0.6254            4.5573+-0.1795          might be 1.0429x faster
   large-int-neg                                     17.2642+-0.3643     ?     17.7886+-0.7136        ? might be 1.0304x slower
   large-int                                         16.1411+-1.0549           15.9443+-0.4588          might be 1.0123x faster
   logical-not                                        4.9774+-0.1163     ?      5.0394+-0.0418        ? might be 1.0124x slower
   lots-of-fields                                    13.6369+-0.4456           13.6218+-0.3821        
   make-indexed-storage                               3.3918+-0.6359            3.2209+-0.6400          might be 1.0531x faster
   make-rope-cse                                      4.0998+-0.4404            3.8295+-0.0454          might be 1.0706x faster
   marsaglia-larger-ints                             41.4015+-1.7866           41.0850+-1.3415        
   marsaglia-osr-entry                               24.3041+-0.5590           23.4384+-0.4273          might be 1.0369x faster
   max-boolean                                        2.6593+-0.0880     ?      2.7771+-0.1590        ? might be 1.0443x slower
   method-on-number                                  19.9067+-0.1212           18.7903+-1.9443          might be 1.0594x faster
   min-boolean                                        2.6902+-0.1038     ?      2.7271+-0.0652        ? might be 1.0137x slower
   minus-boolean-double                               3.3341+-0.0322            3.3179+-0.0601        
   minus-boolean                                      2.5505+-0.1365            2.4977+-0.0734          might be 1.0211x faster
   misc-strict-eq                                    40.0247+-2.5346     ?     42.3330+-4.7212        ? might be 1.0577x slower
   mod-boolean-double                                11.5089+-0.2432     ?     11.7336+-0.5686        ? might be 1.0195x slower
   mod-boolean                                        8.5070+-0.2636            8.5048+-0.1307        
   mul-boolean-double                                 3.9818+-0.0689     ?      4.0060+-0.2999        ?
   mul-boolean                                        3.0635+-0.0404     ?      3.1466+-0.1677        ? might be 1.0271x slower
   neg-boolean                                        3.4128+-0.1914     ?      3.4681+-0.1957        ? might be 1.0162x slower
   negative-zero-divide                               0.4371+-0.0342     ?      0.4597+-0.0386        ? might be 1.0518x slower
   negative-zero-modulo                               0.4958+-0.1131     ?      0.5012+-0.1195        ? might be 1.0110x slower
   negative-zero-negate                               0.4586+-0.0942            0.4225+-0.0376          might be 1.0852x faster
   nested-function-parsing                           40.6443+-1.2286     ?     40.9342+-1.6214        ?
   new-array-buffer-dead                              3.0907+-0.1616     ?      3.2468+-0.2757        ? might be 1.0505x slower
   new-array-buffer-push                              6.7543+-0.5682            6.6116+-0.2935          might be 1.0216x faster
   new-array-dead                                    12.5408+-1.7713     ?     12.8027+-1.3509        ? might be 1.0209x slower
   new-array-push                                     4.0477+-0.1923     ?      4.0612+-0.1600        ?
   no-inline-constructor                            116.8820+-0.8080          115.6589+-0.7059          might be 1.0106x faster
   number-test                                        3.1821+-0.0281     ?      3.2955+-0.1658        ? might be 1.0356x slower
   object-closure-call                                6.0718+-0.3817            5.9651+-0.1466          might be 1.0179x faster
   object-test                                        3.3118+-0.0844     ?      3.3960+-0.2179        ? might be 1.0254x slower
   obvious-sink-pathology-taken                     130.1315+-5.1633          128.4725+-1.3687          might be 1.0129x faster
   obvious-sink-pathology                           121.4161+-2.8040          120.4976+-1.3237        
   obviously-elidable-new-object                     34.5986+-0.2854     ?     35.0461+-0.8574        ? might be 1.0129x slower
   plus-boolean-arith                                 2.7036+-0.0513            2.6896+-0.0504        
   plus-boolean-double                                3.4060+-0.1439     ?      3.4170+-0.1190        ?
   plus-boolean                                       2.6425+-0.1893            2.6183+-0.1075        
   poly-chain-access-different-prototypes-simple   
                                                      3.5597+-0.2249            3.4790+-0.0558          might be 1.0232x faster
   poly-chain-access-different-prototypes             2.8995+-0.1854            2.8965+-0.1629        
   poly-chain-access-simpler                          3.5113+-0.0232     ?      3.7368+-0.4338        ? might be 1.0642x slower
   poly-chain-access                                  2.8120+-0.0181     ?      2.8436+-0.0554        ? might be 1.0112x slower
   poly-stricteq                                     61.7170+-1.7783     ?     62.0993+-0.8923        ?
   polymorphic-array-call                             1.3843+-0.1338     ?      1.4333+-0.0665        ? might be 1.0354x slower
   polymorphic-get-by-id                              3.3296+-0.1802     ?      3.4681+-0.2420        ? might be 1.0416x slower
   polymorphic-put-by-id                             30.8491+-1.4378     ?     32.6600+-2.3183        ? might be 1.0587x slower
   polymorphic-structure                             15.5881+-0.3119     ?     15.6896+-0.3797        ?
   polyvariant-monomorphic-get-by-id                  9.2390+-0.0807     ?      9.3296+-0.0792        ?
   proto-getter-access                               10.7971+-0.3053           10.6278+-0.4782          might be 1.0159x faster
   put-by-id-replace-and-transition                   9.3727+-0.7520     ?      9.4220+-0.1184        ?
   put-by-id-slightly-polymorphic                     3.1254+-0.1894     ?      3.1448+-0.1022        ?
   put-by-id                                         13.3989+-1.5146           13.1417+-0.5633          might be 1.0196x faster
   put-by-val-direct                                  0.6219+-0.1498            0.5909+-0.0762          might be 1.0525x faster
   put-by-val-large-index-blank-indexing-type   
                                                      5.5932+-0.0590            5.5737+-0.2250        
   put-by-val-machine-int                             3.0563+-0.4014            2.7640+-0.1843          might be 1.1058x faster
   rare-osr-exit-on-local                            15.9012+-0.2611     ?     16.1818+-0.4525        ? might be 1.0176x slower
   register-pressure-from-osr                        23.3110+-0.4679           23.1919+-0.5172        
   setter                                             5.9892+-0.1082            5.9137+-0.0351          might be 1.0128x faster
   simple-activation-demo                            27.0500+-2.0148     ?     27.5398+-0.7151        ? might be 1.0181x slower
   simple-getter-access                              13.7763+-0.5639           13.4545+-0.2189          might be 1.0239x faster
   simple-poly-call-nested                            9.0325+-0.1893     ?      9.0833+-0.1710        ?
   simple-poly-call                                   1.5851+-0.0500            1.5650+-0.0746          might be 1.0129x faster
   sin-boolean                                       20.0225+-1.0025           19.5280+-0.5666          might be 1.0253x faster
   singleton-scope                                   71.0651+-1.0281     ?     71.1440+-0.4721        ?
   sinkable-new-object-dag                           72.2231+-2.6787     ?     72.6106+-2.7900        ?
   sinkable-new-object-taken                         54.4644+-3.0579     ?     55.3016+-5.1681        ? might be 1.0154x slower
   sinkable-new-object                               40.0522+-2.9281           39.0502+-1.3797          might be 1.0257x faster
   slow-array-profile-convergence                     3.0457+-0.0452     ?      3.1494+-0.1408        ? might be 1.0341x slower
   slow-convergence                                   3.0182+-0.3461            2.9833+-0.3865          might be 1.0117x faster
   sorting-benchmark                                 22.5609+-0.0926     ^     20.7278+-0.6849        ^ definitely 1.0884x faster
   sparse-conditional                                 1.3547+-0.0320            1.3480+-0.0822        
   splice-to-remove                                  17.1979+-0.6025     ?     17.3720+-0.5953        ? might be 1.0101x slower
   string-char-code-at                               17.2379+-0.2115     ?     17.4885+-0.6691        ? might be 1.0145x slower
   string-concat-object                               2.3848+-0.2652            2.3435+-0.2369          might be 1.0176x faster
   string-concat-pair-object                          2.2933+-0.1304            2.2437+-0.2398          might be 1.0221x faster
   string-concat-pair-simple                         11.9855+-0.1087     ?     12.2153+-1.2030        ? might be 1.0192x slower
   string-concat-simple                              12.8290+-1.4901           12.6882+-1.4629          might be 1.0111x faster
   string-cons-repeat                                 7.8910+-0.3131            7.7726+-0.3273          might be 1.0152x faster
   string-cons-tower                                  7.8138+-0.3253            7.7081+-0.1655          might be 1.0137x faster
   string-equality                                   18.5762+-0.6451     ?     19.2319+-0.9758        ? might be 1.0353x slower
   string-get-by-val-big-char                         7.8150+-0.2785            7.5640+-0.2695          might be 1.0332x faster
   string-get-by-val-out-of-bounds-insane             3.8489+-0.1089     ?      4.0306+-0.4800        ? might be 1.0472x slower
   string-get-by-val-out-of-bounds                    5.7870+-0.2416            5.7411+-0.1266        
   string-get-by-val                                  3.4217+-0.0316     !      3.7233+-0.1345        ! definitely 1.0882x slower
   string-hash                                        2.3846+-0.1428            2.2858+-0.0435          might be 1.0433x faster
   string-long-ident-equality                        15.9120+-1.0202     ?     16.3937+-1.0794        ? might be 1.0303x slower
   string-out-of-bounds                              15.6583+-0.8115     ?     15.7007+-0.6202        ?
   string-repeat-arith                               33.4465+-1.1011     ?     33.8704+-0.7442        ? might be 1.0127x slower
   string-sub                                        66.9725+-1.1497     ?     68.4734+-0.6941        ? might be 1.0224x slower
   string-test                                        3.2484+-0.3642            3.1146+-0.0802          might be 1.0429x faster
   string-var-equality                               38.8778+-2.3596           38.6916+-0.6764        
   structure-hoist-over-transitions                   2.7111+-0.1315     ?      2.7653+-0.1477        ? might be 1.0200x slower
   substring-concat-weird                            41.6284+-1.3169     ?     42.0735+-2.0585        ? might be 1.0107x slower
   substring-concat                                  42.6646+-0.2971     ?     43.4982+-1.2702        ? might be 1.0195x slower
   substring                                         47.7443+-1.8314           47.7068+-1.8116        
   switch-char-constant                               3.0320+-0.2579            2.9606+-0.1061          might be 1.0241x faster
   switch-char                                        7.7990+-0.0803     ^      7.0922+-0.0868        ^ definitely 1.0997x faster
   switch-constant                                    9.3627+-0.7913            8.7604+-0.1575          might be 1.0688x faster
   switch-string-basic-big-var                       15.5233+-0.2419           15.5052+-0.2059        
   switch-string-basic-big                           14.1606+-0.1085     ?     14.5585+-0.4931        ? might be 1.0281x slower
   switch-string-basic-var                           14.9198+-0.2648     ?     14.9225+-0.7580        ?
   switch-string-basic                               13.4817+-0.2402     ?     13.7347+-0.5253        ? might be 1.0188x slower
   switch-string-big-length-tower-var                20.9870+-0.4479     ?     21.0053+-0.5422        ?
   switch-string-length-tower-var                    15.4657+-0.7295     ?     15.9496+-1.0643        ? might be 1.0313x slower
   switch-string-length-tower                        12.9510+-0.1741     ?     13.2574+-0.3620        ? might be 1.0237x slower
   switch-string-short                               13.1969+-0.3666     ?     13.3582+-0.6163        ? might be 1.0122x slower
   switch                                            13.1130+-0.0739     ?     13.1978+-0.7233        ?
   tear-off-arguments-simple                          3.4486+-0.1377     ?      3.4529+-0.1529        ?
   tear-off-arguments                                 4.8719+-0.2929            4.8173+-0.1661          might be 1.0113x faster
   temporal-structure                                12.9145+-0.1130     ?     13.1350+-0.4200        ? might be 1.0171x slower
   to-int32-boolean                                  14.6807+-0.6033           14.4744+-0.4869          might be 1.0143x faster
   try-catch-get-by-val-cloned-arguments             14.2733+-0.3463     ?     14.7277+-0.5330        ? might be 1.0318x slower
   try-catch-get-by-val-direct-arguments              6.6127+-0.9881            6.4135+-0.4473          might be 1.0311x faster
   try-catch-get-by-val-scoped-arguments              7.8650+-0.2240            7.7143+-0.6459          might be 1.0195x faster
   undefined-property-access                        370.0018+-1.9359     ?    371.5791+-1.7469        ?
   undefined-test                                     3.3199+-0.1113            3.2123+-0.0781          might be 1.0335x faster
   unprofiled-licm                                   23.9647+-0.7879           23.2492+-0.5111          might be 1.0308x faster
   varargs-call                                      17.5212+-0.1020           17.5209+-0.5859        
   varargs-construct-inline                          23.3658+-1.0190           22.8248+-0.9456          might be 1.0237x faster
   varargs-construct                                 34.1817+-0.9736     ?     34.6476+-1.3970        ? might be 1.0136x slower
   varargs-inline                                     9.9994+-0.4089            9.8880+-0.2856          might be 1.0113x faster
   varargs-strict-mode                               11.0100+-1.0367           10.6146+-0.2007          might be 1.0373x faster
   varargs                                           10.5338+-0.1003     ?     10.6870+-0.4134        ? might be 1.0145x slower
   weird-inlining-const-prop                          2.4048+-0.1160            2.3984+-0.1915        

   &lt;geometric&gt;                                        9.0942+-0.0204            9.0699+-0.0248          might be 1.0027x faster

                                                         Baseline                   Patch                                       
AsmBench:
   bigfib.cpp                                       527.8453+-4.7890     ?    528.8416+-4.5860        ?
   cray.c                                           457.9510+-3.3883          457.7573+-4.5121        
   dry.c                                            522.6187+-18.1359         521.7680+-16.8284       
   FloatMM.c                                        763.0771+-4.2214     ?    764.7709+-10.1078       ?
   gcc-loops.cpp                                   4460.0385+-36.5182        4432.7841+-23.3158       
   n-body.c                                        1038.3492+-4.7112         1037.3658+-2.6211        
   Quicksort.c                                      455.1869+-17.6462    ?    455.4370+-5.9530        ?
   stepanov_container.cpp                          3935.8091+-30.2955    ?   3936.5145+-30.1089       ?
   Towers.c                                         270.8192+-1.0717     ?    275.1235+-14.6857       ? might be 1.0159x slower

   &lt;geometric&gt;                                      843.6566+-5.2953     ?    844.7098+-3.1847        ? might be 1.0012x slower

                                                         Baseline                   Patch                                       
CompressionBench:
   huffman                                          382.6453+-4.4196          380.9722+-5.7205        
   arithmetic-simple                                422.0490+-1.5252          420.0300+-6.9245        
   arithmetic-precise                               310.6108+-1.7842     ?    313.3753+-2.9157        ?
   arithmetic-complex-precise                       310.3244+-4.0230     ?    312.2260+-2.7202        ?
   arithmetic-precise-order-0                       450.8635+-18.4893         446.4185+-9.4843        
   arithmetic-precise-order-1                       349.9102+-12.6022         344.2668+-4.2443          might be 1.0164x faster
   arithmetic-precise-order-2                       392.5510+-1.6324          389.6470+-2.1989        
   arithmetic-simple-order-1                        443.3873+-2.7466     ?    444.3158+-2.6391        ?
   arithmetic-simple-order-2                        501.3690+-2.8329          500.7195+-3.4928        
   lz-string                                        315.1551+-3.7846     ?    318.2733+-8.1165        ?

   &lt;geometric&gt;                                      382.7656+-0.5336          382.1184+-1.2432          might be 1.0017x faster

                                                         Baseline                   Patch                                       
Geomean of preferred means:
   &lt;scaled-result&gt;                                   67.1724+-0.1347           67.1026+-0.1757          might be 1.0010x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088083</commentid>
    <comment_count>3</comment_count>
      <attachid>251462</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-04-23 16:12:53 -0700</bug_when>
    <thetext>Comment on attachment 251462
Patch

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

&gt; Source/JavaScriptCore/builtins/Array.prototype.js:295
&gt; +        for (var i = 0; i &lt; aString.length; ++i) {

Shouldn&apos;t we be using min(aString.length, bString.length) as the iteration limit of this loop?

&gt; Source/JavaScriptCore/builtins/Array.prototype.js:424
&gt; +        var deleteCount = min(valueCount, holeCount);

Why is deleteCount != holeCount?  What is the difference between a deleted entry and a hole?  Can you please clarify?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088122</commentid>
    <comment_count>4</comment_count>
      <attachid>251462</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-04-23 18:14:40 -0700</bug_when>
    <thetext>Comment on attachment 251462
Patch

Need to remove AVLTree.h from Source/WTF/wtf/CMakeLists.txt to fix the GTK build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088304</commentid>
    <comment_count>5</comment_count>
      <attachid>251567</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-24 12:43:58 -0700</bug_when>
    <thetext>Created attachment 251567
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088305</commentid>
    <comment_count>6</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-24 12:48:23 -0700</bug_when>
    <thetext>&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=251462&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/builtins/Array.prototype.js:295
&gt; &gt; +        for (var i = 0; i &lt; aString.length; ++i) {
&gt; 
&gt; Shouldn&apos;t we be using min(aString.length, bString.length) as the iteration
&gt; limit of this loop?

Not required for correctness, since NaN does its thing, but I made this change for clarity.

&gt; &gt; Source/JavaScriptCore/builtins/Array.prototype.js:424
&gt; &gt; +        var deleteCount = min(valueCount, holeCount);
&gt; 
&gt; Why is deleteCount != holeCount?  What is the difference between a deleted
&gt; entry and a hole?  Can you please clarify?

The goal was to avoid doing lots of deletes in new Array(BIG), but the algorithm proved incorrect. Updated patch fixes this and includes two new tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088306</commentid>
    <comment_count>7</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-04-24 12:54:35 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=251462&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/builtins/Array.prototype.js:295
&gt; &gt; &gt; +        for (var i = 0; i &lt; aString.length; ++i) {
&gt; &gt; 
&gt; &gt; Shouldn&apos;t we be using min(aString.length, bString.length) as the iteration
&gt; &gt; limit of this loop?
&gt; 
&gt; Not required for correctness, since NaN does its thing, but I made this
&gt; change for clarity.

This change also avoids unnecessary work in the case where the first string is longer than the second.  Hence, it can be a perf gain if there are a mix of lots of long and short strings in the array.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088345</commentid>
    <comment_count>8</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-24 14:58:11 -0700</bug_when>
    <thetext>&gt; &gt; &gt; Shouldn&apos;t we be using min(aString.length, bString.length) as the iteration
&gt; &gt; &gt; limit of this loop?
&gt; &gt; 
&gt; &gt; Not required for correctness, since NaN does its thing, but I made this
&gt; &gt; change for clarity.
&gt; 
&gt; This change also avoids unnecessary work in the case where the first string
&gt; is longer than the second.  Hence, it can be a perf gain if there are a mix
&gt; of lots of long and short strings in the array.

We don&apos;t avoid any work. charCodeAt past the end of a string returns NaN, which breaks you out of the loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088350</commentid>
    <comment_count>9</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-04-24 15:01:54 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; &gt; &gt; Shouldn&apos;t we be using min(aString.length, bString.length) as the iteration
&gt; &gt; &gt; &gt; limit of this loop?
&gt; &gt; &gt; 
&gt; &gt; &gt; Not required for correctness, since NaN does its thing, but I made this
&gt; &gt; &gt; change for clarity.
&gt; &gt; 
&gt; &gt; This change also avoids unnecessary work in the case where the first string
&gt; &gt; is longer than the second.  Hence, it can be a perf gain if there are a mix
&gt; &gt; of lots of long and short strings in the array.
&gt; 
&gt; We don&apos;t avoid any work. charCodeAt past the end of a string returns NaN,
&gt; which breaks you out of the loop.

Oh, you&apos;re right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088356</commentid>
    <comment_count>10</comment_count>
      <attachid>251567</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-04-24 15:12:36 -0700</bug_when>
    <thetext>Comment on attachment 251567
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088371</commentid>
    <comment_count>11</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-24 16:03:38 -0700</bug_when>
    <thetext>Committed r183288: &lt;http://trac.webkit.org/changeset/183288&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088477</commentid>
    <comment_count>12</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-04-24 21:49:07 -0700</bug_when>
    <thetext>js/sort-with-side-effecting-comparisons.html is timing out after this:
https://build.webkit.org/results/Apple%20Mavericks%20Debug%20WK1%20(Tests)/r183306%20(12194)/results.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088497</commentid>
    <comment_count>13</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2015-04-24 23:52:39 -0700</bug_when>
    <thetext>Yes, so rolling out.

https://webkit-test-results.appspot.com/dashboards/flakiness_dashboard.html#showAllRuns=true&amp;tests=js%2Fsort-with-side-effecting-comparisons.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1088499</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-04-24 23:55:09 -0700</bug_when>
    <thetext>Re-opened since this is blocked by bug 144189</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090128</commentid>
    <comment_count>15</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-29 12:49:12 -0700</bug_when>
    <thetext>Committed r183570: &lt;http://trac.webkit.org/changeset/183570&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090129</commentid>
    <comment_count>16</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-29 12:50:44 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Committed r183570: &lt;http://trac.webkit.org/changeset/183570&gt;

Relevant ChangeLog:

        * script-tests/sort-with-side-effecting-comparisons.js: Made this test
        shorter so that it wouldn&apos;t hang debug builds. This test is O(N^2). It
        used to terminate sooner because our sort implementation would (sometimes)
        terminate sooner if you shrank the array. Our new sort does not accept
        intermediate updates to the array&apos;s length, matching Firefox. I spoke
        to Gavin and Alexey about this, and we think that going out of our way
        to honor length changes mid-sort doesn&apos;t make much sense because it&apos;s
        not possible to honor the general case of value changes in a predictable
        way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090285</commentid>
    <comment_count>17</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-04-29 18:59:20 -0700</bug_when>
    <thetext>This caused a ~22% regression on the jslib-traverse-jquery test:

https://perf.webkit.org/#mode=charts&amp;chartList=%5B%5B%22mac-yosemite%22%2C%22Dromaeo%2Fjslib-traverse-jquery%3ARuns%22%5D%5D</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090491</commentid>
    <comment_count>18</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-30 11:13:47 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; This caused a ~22% regression on the jslib-traverse-jquery test:
&gt; 
&gt; https://perf.webkit.org/#mode=charts&amp;chartList=%5B%5B%22mac-
&gt; yosemite%22%2C%22Dromaeo%2Fjslib-traverse-jquery%3ARuns%22%5D%5D

I just tested a micro benchmark of node sorting using the jQuery node sorting comparator, and this new sort is a 10X speedup over the old. What gives? :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090501</commentid>
    <comment_count>19</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-30 11:29:02 -0700</bug_when>
    <thetext>If you run PerformanceTests/Dromaeo/jslib-traverse-jquery.html manually, and average the 9 mean runs/s numbers from parent, parents, prev, prevAll, etc., the new sort is 2% faster. 

But the :Runs number reported is 27% slower. What does the :Runs number measure?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090528</commentid>
    <comment_count>20</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-30 12:13:47 -0700</bug_when>
    <thetext>Looks like the actual test is controlled by Dromaeo/resources/dromaeo/web/tests/jslib-traverse-jquery.html, and the :Runs number is maybe total time across all tests, so it is dominated by the slowest test.

In prevail, one of the tests that got slower, we are spending lots more time Node::compareDocumentPosition. Presumably, we are doing more comparisons, and the comparisons are very expensive.

Perhaps we should optimize Node::compareDocumentPosition.

An initial test seems to indicate that ending early when the array is already sorted -- which is easy for merge sort to do -- is a big speedup. Assuming I did it right, and didn&apos;t just break all sorting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090529</commentid>
    <comment_count>21</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-30 12:14:12 -0700</bug_when>
    <thetext>s/prevail/prevAll/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090603</commentid>
    <comment_count>22</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-04-30 15:35:45 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; Looks like the actual test is controlled by
&gt; Dromaeo/resources/dromaeo/web/tests/jslib-traverse-jquery.html, and the
&gt; :Runs number is maybe total time across all tests, so it is dominated by the
&gt; slowest test.
&gt; 
&gt; In prevail, one of the tests that got slower, we are spending lots more time
&gt; Node::compareDocumentPosition. Presumably, we are doing more comparisons,
&gt; and the comparisons are very expensive.
&gt; 
&gt; Perhaps we should optimize Node::compareDocumentPosition.

That seems like a generally useful thing to do.

&gt; An initial test seems to indicate that ending early when the array is
&gt; already sorted -- which is easy for merge sort to do -- is a big speedup.
&gt; Assuming I did it right, and didn&apos;t just break all sorting.

This sounds promising :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090606</commentid>
    <comment_count>23</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-04-30 15:49:47 -0700</bug_when>
    <thetext>&gt; &gt; Perhaps we should optimize Node::compareDocumentPosition.
&gt; 
&gt; That seems like a generally useful thing to do.

This doesn&apos;t look possible. Node::compareDocumentPosition is linear time by design, and I don&apos;t see an immediate way to fix it. If you have two nodes that are siblings, the only way to know if A comes before B is to search backwards from B until you find A or null.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1091447</commentid>
    <comment_count>24</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-05-04 11:16:54 -0700</bug_when>
    <thetext>Regression covered in https://bugs.webkit.org/show_bug.cgi?id=144476.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>251462</attachid>
            <date>2015-04-23 12:01:36 -0700</date>
            <delta_ts>2015-04-24 12:43:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144013-20150423120032.patch</filename>
            <type>text/plain</type>
            <size>97947</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzNyBA
QAorMjAxNS0wNC0yMSAgR2VvZmZyZXkgR2FyZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgorCisgICAg
ICAgIEl0IHNob3VsZG4ndCB0YWtlIDE4NDYgbGluZXMgb2YgY29kZSBhbmQgNSBGSVhNRXMgdG8g
c29ydCBhbiBhcnJheS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NDAxMworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFRoaXMgcGF0Y2ggaW1wbGVtZW50cyBBcnJheS5wcm90b3R5cGUuc29ydCBpbiBKYXZh
U2NyaXB0LCByZW1vdmluZyB0aGUKKyAgICAgICAgQysrIGltcGxlbWVudGF0aW9ucy4gSXQgaXMg
c2ltcGxlciBhbmQgbGVzcyBlcnJvci1wcm9uZSB0byBleHByZXNzIG91cgorICAgICAgICBvcGVy
YXRpb25zIGluIEphdmFTY3JpcHQsIHdoaWNoIHByb3ZpZGVzIG1lbW9yeSBzYWZldHksIGV4Y2Vw
dGlvbiBzYWZldHksCisgICAgICAgIGFuZCByZWN1cnNpb24gc2FmZXR5LgorCisgICAgICAgIFRo
ZSBwZXJmb3JtYW5jZSByZXN1bHQgaXMgbWl4ZWQsIGJ1dCBuZXQgcG9zaXRpdmUgaW4gbXkgb3Bp
bmlvbi4gSXQncworICAgICAgICBkaWZmaWN1bHQgdG8gZW51bWVyYXRlIGFsbCB0aGUgcmVzdWx0
cywgc2luY2Ugd2UgdXNlZCB0byBoYXZlIHNvIG1hbnkKKyAgICAgICAgZGlmZmVyZW50IHNvcnRp
bmcgbW9kZXMsIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBkaWZmZXJlbnQgZGF0YSBwYXR0ZXJucwor
ICAgICAgICBhY3Jvc3Mgd2hpY2ggeW91IG1pZ2h0IHdhbnQgdG8gbWVhc3VyZSBzb3J0aW5nLiBT
dWZmaWNlIGl0IHRvIHNheToKKworICAgICAgICAgICAgKCopIFRoZSBiZW5jaG1hcmtzIHdlIHRy
YWNrIGFyZSBmYXN0ZXIgb3IgdW5jaGFuZ2VkLgorCisgICAgICAgICAgICAoKikgU29ydGluZyBy
YW5kb20gaW5wdXQgdXNpbmcgYSBjb21wYXJhdG9yIC0tIHdoaWNoIHdlIHRoaW5rIGlzCisgICAg
ICAgICAgICBjb21tb24gLS0gaXMgM1ggZmFzdGVyLgorCisgICAgICAgICAgICAoKikgU29ydGlu
ZyByYW5kb20gaW5wdXQgaW4gYSBub24tYXJyYXkgb2JqZWN0IC0tIHdoaWNoIGpRdWVyeSBkb2Vz
CisgICAgICAgICAgICAtLSBpcyA0WCBmYXN0ZXIuCisKKyAgICAgICAgICAgICgqKSBTb3J0aW5n
IHJhbmRvbSBpbnB1dCBpbiBhIGNvbXBhY3QgYXJyYXkgb2YgaW50ZWdlcnMgdXNpbmcgYQorICAg
ICAgICAgICAgdHJpdmlhbCBwYXR0ZXJuLW1hdGNoYWJsZSBjb21wYXJhdG9yIGlzIDJYICpzbG93
ZXIqLgorCisgICAgICAgICogYnVpbHRpbnMvQXJyYXkucHJvdG90eXBlLmpzOgorICAgICAgICAo
c29ydC5taW4pOgorICAgICAgICAoc29ydC5zdHJpbmdDb21wYXJhdG9yKToKKyAgICAgICAgKHNv
cnQuY29tcGFjdFNwYXJzZSk6IFNwZWNpYWwgY2FzZSBjb21wYWN0aW9uIGZvciBzcGFyc2UgYXJy
YXlzIGJlY2F1c2UKKyAgICAgICAgd2UgZG9uJ3Qgd2FudCB0byBoYW5nIHdoZW4gc29ydGluZyBu
ZXcgQXJyYXkoQklHKS4KKworICAgICAgICAoc29ydC5jb21wYWN0KToKKyAgICAgICAgKHNvcnQu
bWVyZ2UpOgorICAgICAgICAoc29ydC5tZXJnZVNvcnQpOiBVc2UgbWVyZ2Ugc29ydCBiZWNhdXNl
IGl0J3MgYSByZWFzb25hYmx5IGVmZmljaWVudAorICAgICAgICBzdGFibGUgc29ydC4gV2UgaGF2
ZSBldmlkZW5jZSB0aGF0IHNvbWUgc2l0ZXMgZGVwZW5kIG9uIHN0YWJsZSBzb3J0LAorICAgICAg
ICBldmVuIHRob3VnaCB0aGUgRVM2IHNwZWMgZG9lcyBub3QgbWFuZGF0ZSBpdC4gKFNlZQorICAg
ICAgICA8aHR0cDovL3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvMzM5Njc+LikKKworICAgICAg
ICBBbHNvLCB3ZSBkb24ndCBjYXJlIHRoYXQgbWVyZ2Ugc29ydCByZXF1aXJlcyBhIHNlY29uZGFy
eSBidWZmZXIgYmVjYXVzZQorICAgICAgICBKYXZhU2NyaXB0IHNvcnRpbmcgdXN1YWxseSByZXF1
aXJlcyBvbmUgYW55d2F5LCBkdWUgdG8gdGhlIG5lZWQgdG8KKyAgICAgICAgY29tcGFjdCBhd2F5
IHVuZGVmaW5lZHMgYW5kIGhvbGVzLgorCisgICAgICAgIFRoaXMgaXMgYSB0ZXh0Ym9vayBpbXBs
ZW1lbnRhdGlvbiBvZiBtZXJnZSBzb3J0IHdpdGggdGhyZWUgb3B0aW1pemF0aW9uczoKKworICAg
ICAgICAgICAgKDEpIFVzZSBpdGVyYXRpb24gaW5zdGVhZCBvZiByZWN1cnNpb247CisKKyAgICAg
ICAgICAgICgyKSBVc2UgYXJyYXkgc3Vic2NyaXB0aW5nIGluc3RlYWQgb2YgYXJyYXkgY29weWlu
ZyBpbiBvcmRlciB0bworICAgICAgICAgICAgY3JlYXRlIGxvZ2ljYWwgc3ViLWxpc3RzIHdpdGhv
dXQgY3JlYXRpbmcgcGh5c2ljYWwgc3ViLWxpc3RzOworCisgICAgICAgICAgICAoMykgU3dhcCBz
cmMgYW5kIGRzdCBhdCBlYWNoIGl0ZXJhdGlvbiBpbnN0ZWFkIG9mIGNvcHlpbmcgc3JjIGludG8K
KyAgICAgICAgICAgIGRzdCwgYW5kIG9ubHkgY29weSBzcmMgaW50byBkc3QgYXQgdGhlIGVuZCBp
ZiBzcmMgaXMgbm90IGFscmVhZHkgZHN0LgorCisgICAgICAgIChzb3J0LmluZmxhdGUpOgorICAg
ICAgICAoc29ydC5jb21wYXJhdG9yU29ydCk6CisgICAgICAgIChzb3J0KTogU29ydCBpbiBKYXZh
U2NyaXB0IGZvciB0aGUgd2luLgorCisgICAgICAgICogYnVpbHRpbnMvQnVpbHRpbkV4ZWN1dGFi
bGVzLmNwcDoKKyAgICAgICAgKEpTQzo6QnVpbHRpbkV4ZWN1dGFibGVzOjpjcmVhdGVFeGVjdXRh
YmxlSW50ZXJuYWwpOiBBbGxvdyBub24tcHJpdmF0ZQorICAgICAgICBuYW1lcyBzbyB3ZSBjYW4g
dXNlIGhlbHBlciBmdW5jdGlvbnMuCisKKyAgICAgICAgKiBieXRlY29kZS9Db2RlQmxvY2suaDoK
KyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjppc051bWVyaWNDb21wYXJlRnVuY3Rpb24pOiBEZWxl
dGVkLgorICAgICAgICAqIGJ5dGVjb2RlL1VubGlua2VkQ29kZUJsb2NrLmNwcDoKKyAgICAgICAg
KEpTQzo6VW5saW5rZWRDb2RlQmxvY2s6OlVubGlua2VkQ29kZUJsb2NrKToKKyAgICAgICAgKiBi
eXRlY29kZS9VbmxpbmtlZENvZGVCbG9jay5oOgorICAgICAgICAoSlNDOjpVbmxpbmtlZENvZGVC
bG9jazo6c2V0SXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6VW5saW5rZWRDb2RlQmxvY2s6OmlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbik6IERlbGV0ZWQu
CisgICAgICAgICogYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcDoKKyAgICAgICAg
KEpTQzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OnNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbik6IERl
bGV0ZWQuCisgICAgICAgICogYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmg6CisgICAg
ICAgICogYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHA6CisgICAgICAgIChKU0M6OkZ1bmN0
aW9uTm9kZTo6ZW1pdEJ5dGVjb2RlKTogV2UgZG9uJ3QgZG8gdGhpcyBzcGVjaWFsIGNhc2luZyBi
YXNlZAorICAgICAgICBvbiBwYXR0ZXJuIG1hdGNoaW5nIGFueW1vcmUuIFRoaXMgd2FzIG1haW5s
eSBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgCisgICAgICAgIHRoZSBvdmVyaGVhZCBvZiBjYWxs
aW5nIHRvIEpTLCB3aGljaCB3ZSBub3cgYXZvaWQgYnkgY29tcGlsaW5nIHRoZSBjYWxsCisgICAg
ICAgIChhbmQgcG9zc2libHkgaW5saW5pbmcgaXQpLgorCisgICAgICAgICogaGVhcC9IZWFwLmNw
cDoKKyAgICAgICAgKEpTQzo6SGVhcDo6bWFya1Jvb3RzKToKKyAgICAgICAgKEpTQzo6SGVhcDo6
cHVzaFRlbXBTb3J0VmVjdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SGVhcDo6cG9wVGVt
cFNvcnRWZWN0b3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpIZWFwOjp2aXNpdFRlbXBTb3J0
VmVjdG9ycyk6IERlbGV0ZWQuCisgICAgICAgICogaGVhcC9IZWFwLmg6IFdlIGRvbid0IGhhdmUg
dGVtcCBzb3J0IHZlY3RvcnMgYW55bW9yZSBiZWNhdXNlIHdlIHNvcnQKKyAgICAgICAgaW4gSmF2
YVNjcmlwdCB1c2luZyBhIG5vcm1hbCBKYXZhU2NyaXB0IGFycmF5IGZvciBvdXIgdGVtcG9yYXJ5
IHN0b3JhZ2UuCisKKyAgICAgICAgKiBwYXJzZXIvUGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6
UGFyc2VyPExleGVyVHlwZT46OnBhcnNlSW5uZXIpOiBBbGxvdyBjYXB0dXJpbmcgc28gd2UgY2Fu
IHVzZQorICAgICAgICBoZWxwZXIgZnVuY3Rpb25zLgorCisgICAgICAgICogcnVudGltZS9BcnJh
eVByb3RvdHlwZS5jcHA6CisgICAgICAgIChKU0M6OmlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbik6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OmF0dGVtcHRGYXN0U29ydCk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OnBlcmZvcm1TbG93U29ydCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OmFycmF5
UHJvdG9GdW5jU29ydCk6IERlbGV0ZWQuCisKKyAgICAgICAgKiBydW50aW1lL0NvbW1vbklkZW50
aWZpZXJzLmg6IE5ldyBzdHJpbmdzIHVzZWQgYnkgc29ydC4KKworICAgICAgICAqIHJ1bnRpbWUv
SlNBcnJheS5jcHA6CisgICAgICAgIChKU0M6OmNvbXBhcmVOdW1iZXJzRm9yUVNvcnRXaXRoSW50
MzIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpjb21wYXJlTnVtYmVyc0ZvclFTb3J0V2l0aERv
dWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OmNvbXBhcmVOdW1iZXJzRm9yUVNvcnQpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpjb21wYXJlQnlTdHJpbmdQYWlyRm9yUVNvcnQpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpKU0FycmF5Ojpzb3J0TnVtZXJpY1ZlY3Rvcik6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkpTQXJyYXk6OnNvcnROdW1lcmljKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6Q29udGlndW91c1R5cGVBY2Nlc3Nvcjo6Z2V0QXNWYWx1ZSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkNvbnRpZ3VvdXNUeXBlQWNjZXNzb3I6OnNldFdpdGhWYWx1ZSk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkNvbnRpZ3VvdXNUeXBlQWNjZXNzb3I6OnJlcGxhY2VEYXRhUmVmZXJl
bmNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6Q29udGlndW91c1R5cGVBY2Nlc3NvcjxBcnJh
eVdpdGhEb3VibGU+OjpnZXRBc1ZhbHVlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6Q29udGln
dW91c1R5cGVBY2Nlc3NvcjxBcnJheVdpdGhEb3VibGU+OjpzZXRXaXRoVmFsdWUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpDb250aWd1b3VzVHlwZUFjY2Vzc29yPEFycmF5V2l0aERvdWJsZT46
OnJlcGxhY2VEYXRhUmVmZXJlbmNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNBcnJheTo6
c29ydENvbXBhY3RlZFZlY3Rvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkpTQXJyYXk6OnNv
cnQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpBVkxUcmVlQWJzdHJhY3RvckZvckFycmF5Q29t
cGFyZTo6Z2V0X2xlc3MpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpBVkxUcmVlQWJzdHJhY3Rv
ckZvckFycmF5Q29tcGFyZTo6c2V0X2xlc3MpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpBVkxU
cmVlQWJzdHJhY3RvckZvckFycmF5Q29tcGFyZTo6Z2V0X2dyZWF0ZXIpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpBVkxUcmVlQWJzdHJhY3RvckZvckFycmF5Q29tcGFyZTo6c2V0X2dyZWF0ZXIp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpBVkxUcmVlQWJzdHJhY3RvckZvckFycmF5Q29tcGFy
ZTo6Z2V0X2JhbGFuY2VfZmFjdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QVZMVHJlZUFi
c3RyYWN0b3JGb3JBcnJheUNvbXBhcmU6OnNldF9iYWxhbmNlX2ZhY3Rvcik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpjb21wYXJlX2tl
eV9rZXkpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpBVkxUcmVlQWJzdHJhY3RvckZvckFycmF5
Q29tcGFyZTo6Y29tcGFyZV9rZXlfbm9kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkFWTFRy
ZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpjb21wYXJlX25vZGVfbm9kZSk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpudWxsKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNBcnJheTo6c29ydFZlY3Rvcik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkpTQXJyYXk6OmNvbXBhY3RGb3JTb3J0aW5nKTogRGVsZXRlZC4KKyAgICAg
ICAgKiBydW50aW1lL0pTQXJyYXkuaDoKKworICAgICAgICAqIHJ1bnRpbWUvSlNHbG9iYWxPYmpl
Y3QuY3BwOgorICAgICAgICAoSlNDOjpKU0dsb2JhbE9iamVjdDo6aW5pdCk6CisgICAgICAgICog
cnVudGltZS9PYmplY3RDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChKU0M6Ok9iamVjdENvbnN0
cnVjdG9yOjpmaW5pc2hDcmVhdGlvbik6IFByb3ZpZGUgc29tZSBidWlsdGlucyB1c2VkCisgICAg
ICAgIGJ5IHNvcnQuCisKIDIwMTUtMDQtMjIgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNv
bT4KIAogICAgICAgICBVbnJldmlld2VkLCBmaXggZGVidWcgYnVpbGQuCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnVpbHRpbnMvQXJyYXkucHJvdG90eXBlLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9idWlsdGlucy9BcnJheS5wcm90b3R5cGUuanMJKHJldmlz
aW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9idWlsdGlucy9BcnJheS5wcm90
b3R5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0
IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxNCwgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI3NywzICsyNzcsMTgyIEBAIGZ1bmN0aW9uIGluY2x1
ZGVzKHNlYXJjaEVsZW1lbnQgLyosIGZyb20KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQor
CitmdW5jdGlvbiBzb3J0KGNvbXBhcmF0b3IpCit7CisgICAgInVzZSBzdHJpY3QiOworCisgICAg
ZnVuY3Rpb24gbWluKGEsIGIpCisgICAgeworICAgICAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsK
KyAgICB9CisKKyAgICBmdW5jdGlvbiBzdHJpbmdDb21wYXJhdG9yKGEsIGIpCisgICAgeworICAg
ICAgICB2YXIgYVN0cmluZyA9IEBTdHJpbmcoYSk7CisgICAgICAgIHZhciBiU3RyaW5nID0gQFN0
cmluZyhiKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFTdHJpbmcubGVuZ3RoOyAr
K2kpIHsKKyAgICAgICAgICAgIHZhciBhQ2hhckNvZGUgPSBhU3RyaW5nLkBjaGFyQ29kZUF0KGkp
OworICAgICAgICAgICAgdmFyIGJDaGFyQ29kZSA9IGJTdHJpbmcuQGNoYXJDb2RlQXQoaSk7CisK
KyAgICAgICAgICAgIGlmIChhQ2hhckNvZGUgPT0gYkNoYXJDb2RlKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYUNoYXJDb2RlIDwgYkNoYXJDb2RlKQorICAg
ICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAg
IH0KKworICAgICAgICB2YXIgYUxlbmd0aCA9IGFTdHJpbmcubGVuZ3RoOworICAgICAgICB2YXIg
Ykxlbmd0aCA9IGJTdHJpbmcubGVuZ3RoOworCisgICAgICAgIGlmIChhTGVuZ3RoID09IGJMZW5n
dGgpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoYUxlbmd0aCA8IGJMZW5n
dGgpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQor
CisgICAgLy8gUmVtb3ZlIGhvbGVzIGFuZCB1bmRlZmluZWRzIGluIGEgc3BhcnNlIGFycmF5Lgor
ICAgIGZ1bmN0aW9uIGNvbXBhY3RTcGFyc2UoYXJyYXksIGxlbmd0aCkKKyAgICB7CisgICAgICAg
IHZhciB2YWx1ZXMgPSBbIF07CisgICAgICAgIHZhciBzZWVuID0geyB9OworICAgICAgICB2YXIg
dW5kZWZpbmVkQ291bnQgPSAwOworCisgICAgICAgIGZvciAodmFyIG9iamVjdCA9IGFycmF5OyBv
YmplY3Q7IG9iamVjdCA9IEBPYmplY3QuQGdldFByb3RvdHlwZU9mKG9iamVjdCkpIHsKKyAgICAg
ICAgICAgIHZhciBwcm9wZXJ0eU5hbWVzID0gQE9iamVjdC5AZ2V0T3duUHJvcGVydHlOYW1lcyhv
YmplY3QpOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxl
bmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcHJvcGVydHlOYW1lc1tp
XTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGgpIHsgLy8gRXhjbHVkZXMgbm9u
LW51bWVyaWMgcHJvcGVydGllcyBhbmQgcHJvcGVydGllcyBwYXN0IGxlbmd0aC4KKyAgICAgICAg
ICAgICAgICAgICAgaWYgKHNlZW5baW5kZXhdKSAvLyBFeGNsdWRlcyBkdXBsaWNhdGVzLgorICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHNlZW5b
aW5kZXhdID0gMTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRl
eF07CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICArK3VuZGVmaW5lZENvdW50OworICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
ICAgICB2YWx1ZXNbdmFsdWVzLmxlbmd0aF0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWVDb3VudCA9IHZhbHVl
cy5sZW5ndGg7CisgICAgICAgIHZhciBob2xlQ291bnQgPSBsZW5ndGggLSB2YWx1ZUNvdW50IC0g
dW5kZWZpbmVkQ291bnQ7CisgICAgICAgIHJldHVybiB7IHZhbHVlcywgdmFsdWVDb3VudCwgdW5k
ZWZpbmVkQ291bnQsIGhvbGVDb3VudCB9OworICAgIH0KKworICAgIC8vIFJlbW92ZSBob2xlcyBh
bmQgdW5kZWZpbmVkcy4KKyAgICBmdW5jdGlvbiBjb21wYWN0KGFycmF5LCBsZW5ndGgpCisgICAg
eworICAgICAgICB2YXIgdmFsdWVzID0gWyBdOworICAgICAgICB2YXIgdW5kZWZpbmVkQ291bnQg
PSAwOworICAgICAgICB2YXIgaG9sZUNvdW50ID0gMDsKKworICAgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIShpIGluIGFycmF5KSkgewor
ICAgICAgICAgICAgICAgICsraG9sZUNvdW50OworICAgICAgICAgICAgICAgIGlmIChob2xlQ291
bnQgPCAyNTYpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAg
IHJldHVybiBjb21wYWN0U3BhcnNlKGFycmF5LCBsZW5ndGgpOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpXTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9
PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgKyt1bmRlZmluZWRDb3VudDsKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlc1t2
YWx1ZXMubGVuZ3RoXSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIHZhciB2YWx1ZUNvdW50
ID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHsgdmFsdWVzLCB2YWx1ZUNvdW50LCB1
bmRlZmluZWRDb3VudCwgaG9sZUNvdW50IH07CisgICAgfQorCisgICAgZnVuY3Rpb24gbWVyZ2Uo
ZHN0LCBzcmMsIHNyY0luZGV4LCBzcmNFbmQsIHdpZHRoLCBjb21wYXJhdG9yKQorICAgIHsKKyAg
ICAgICAgdmFyIGxlZnQgPSBzcmNJbmRleDsKKyAgICAgICAgdmFyIGxlZnRFbmQgPSBtaW4obGVm
dCArIHdpZHRoLCBzcmNFbmQpOworICAgICAgICB2YXIgcmlnaHQgPSBsZWZ0RW5kOworICAgICAg
ICB2YXIgcmlnaHRFbmQgPSBtaW4ocmlnaHQgKyB3aWR0aCwgc3JjRW5kKTsKKworICAgICAgICBm
b3IgKHZhciBkc3RJbmRleCA9IGxlZnQ7IGRzdEluZGV4IDwgcmlnaHRFbmQ7ICsrZHN0SW5kZXgp
IHsKKyAgICAgICAgICAgIGlmIChyaWdodCA8IHJpZ2h0RW5kKSB7CisgICAgICAgICAgICAgICAg
aWYgKGxlZnQgPj0gbGVmdEVuZCB8fCBjb21wYXJhdG9yKHNyY1tsZWZ0XSwgc3JjW3JpZ2h0XSkg
PiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkc3RJbmRleF0gPSBzcmNbcmlnaHQrK107
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHNyY1tsZWZ0KytdOworICAg
ICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gbWVyZ2VTb3J0KHJlc3VsdCwgdmFsdWVzLCB2
YWx1ZUNvdW50LCBidWZmZXIsIGNvbXBhcmF0b3IpCisgICAgeworICAgICAgICB2YXIgZHN0ID0g
YnVmZmVyOworICAgICAgICB2YXIgc3JjID0gdmFsdWVzOworICAgICAgICBmb3IgKHZhciB3aWR0
aCA9IDE7IHdpZHRoIDwgdmFsdWVDb3VudDsgd2lkdGggKj0gMikgeworICAgICAgICAgICAgZm9y
ICh2YXIgc3JjSW5kZXggPSAwOyBzcmNJbmRleCA8IHZhbHVlQ291bnQ7IHNyY0luZGV4ICs9IDIg
KiB3aWR0aCkKKyAgICAgICAgICAgICAgICBtZXJnZShkc3QsIHNyYywgc3JjSW5kZXgsIHZhbHVl
Q291bnQsIHdpZHRoLCBjb21wYXJhdG9yKTsKKworICAgICAgICAgICAgdmFyIHRtcCA9IHNyYzsK
KyAgICAgICAgICAgIHNyYyA9IGRzdDsKKyAgICAgICAgICAgIGRzdCA9IHRtcDsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChzcmMgIT0gcmVzdWx0KSB7CisgICAgICAgICAgICBmb3IodmFyIGkg
PSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHNy
Y1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlc3RvcmUgaG9sZXMgYW5kIHVuZGVm
aW5lZHMuIFJlc3VsdCBpcyBbIHZhbHVlcy4uLiwgdW5kZWZpbmVzLi4uLCBob2xlcy4uLiBdLgor
ICAgIGZ1bmN0aW9uIGluZmxhdGUoYXJyYXksIHZhbHVlQ291bnQsIHVuZGVmaW5lZENvdW50LCBo
b2xlQ291bnQpCisgICAgeworICAgICAgICB2YXIgdW5kZWZpbmVkRW5kID0gdmFsdWVDb3VudCAr
IHVuZGVmaW5lZENvdW50OworICAgICAgICBmb3IgKHZhciBpID0gdmFsdWVDb3VudDsgaSA8IHVu
ZGVmaW5lZEVuZDsgKytpKQorICAgICAgICAgICAgYXJyYXlbaV0gPSB1bmRlZmluZWQ7CisKKyAg
ICAgICAgdmFyIGRlbGV0ZUVuZCA9IHVuZGVmaW5lZEVuZCArIGhvbGVDb3VudDsKKyAgICAgICAg
dmFyIGRlbGV0ZUNvdW50ID0gbWluKHZhbHVlQ291bnQsIGhvbGVDb3VudCk7CisgICAgICAgIGZv
ciAodmFyIGkgPSBkZWxldGVFbmQgLSBkZWxldGVDb3VudDsgaSA8IGRlbGV0ZUVuZDsgKytpKQor
ICAgICAgICAgICAgZGVsZXRlIGFycmF5W2ldOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNvbXBh
cmF0b3JTb3J0KGFycmF5LCBjb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9
IGFycmF5Lmxlbmd0aCA+Pj4gMDsKKworICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRo
IEZpcmVmb3ggYW5kIENocm9tZSwgZG8gbm90aGluZyBvYnNlcnZhYmxlCisgICAgICAgIC8vIHRv
IHRoZSB0YXJnZXQgYXJyYXkgaWYgaXQgaGFzIDAgb3IgMSBzb3J0YWJsZSBwcm9wZXJ0aWVzLgor
ICAgICAgICBpZiAobGVuZ3RoIDwgMikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2
YXIgeyB2YWx1ZXMsIHZhbHVlQ291bnQsIHVuZGVmaW5lZENvdW50LCBob2xlQ291bnQgfSA9IGNv
bXBhY3QoYXJyYXksIGxlbmd0aCk7CisgICAgICAgIG1lcmdlU29ydChhcnJheSwgdmFsdWVzLCB2
YWx1ZUNvdW50LCBhcnJheSwgY29tcGFyYXRvcik7CisgICAgICAgIGluZmxhdGUoYXJyYXksIHZh
bHVlQ291bnQsIHVuZGVmaW5lZENvdW50LCBob2xlQ291bnQpOworICAgIH0KKworICAgIGlmICh0
aGlzID09PSBudWxsKQorICAgICAgICB0aHJvdyBuZXcgQFR5cGVFcnJvcigiQXJyYXkucHJvdG90
eXBlLnNvcnQgcmVxdWlyZXMgdGhhdCB8dGhpc3wgbm90IGJlIG51bGwiKTsKKworICAgIGlmICh0
aGlzID09PSB1bmRlZmluZWQpCisgICAgICAgIHRocm93IG5ldyBAVHlwZUVycm9yKCJBcnJheS5w
cm90b3R5cGUuc29ydCByZXF1aXJlcyB0aGF0IHx0aGlzfCBub3QgYmUgdW5kZWZpbmVkIik7CisK
KyAgICBpZiAodHlwZW9mIHRoaXMgPT0gInN0cmluZyIpCisgICAgICAgIHRocm93IG5ldyBAVHlw
ZUVycm9yKCJBdHRlbXB0ZWQgdG8gYXNzaWduIHRvIHJlYWRvbmx5IHByb3BlcnR5LiIpOworCisg
ICAgaWYgKHR5cGVvZiBjb21wYXJhdG9yICE9PSAiZnVuY3Rpb24iKQorICAgICAgICBjb21wYXJh
dG9yID0gc3RyaW5nQ29tcGFyYXRvcjsKKworICAgIHZhciBhcnJheSA9IEBPYmplY3QodGhpcyk7
CisgICAgY29tcGFyYXRvclNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOworICAgIHJldHVybiBhcnJh
eTsKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9idWlsdGlucy9CdWlsdGluRXhlY3V0
YWJsZXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9idWlsdGlucy9C
dWlsdGluRXhlY3V0YWJsZXMuY3BwCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnVpbHRpbnMvQnVpbHRpbkV4ZWN1dGFibGVzLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTAxLDcgKzEwMSw2IEBAIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiBCdWlsdGluRXhl
Y3UKICAgICAgICAgCiAgICAgICAgIGlmIChjbG9zZWRWYXJpYWJsZSA9PSBtX3ZtLnByb3BlcnR5
TmFtZXMtPnVuZGVmaW5lZEtleXdvcmQuaW1wbCgpKQogICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fdm0ucHJvcGVydHlOYW1lcy0+aXNQcml2YXRlTmFtZShj
bG9zZWRWYXJpYWJsZS5nZXQoKSkpOwogICAgIH0KICAgICBib2R5LT5vdmVycmlkZU5hbWUobmFt
ZSk7CiAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9
IFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlOjpjcmVhdGUoJm1fdm0sIHNvdXJjZSwgYm9keSwg
a2luZCwgV1RGOjptb3ZlKHNvdXJjZU92ZXJyaWRlKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5oCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTI0
OSw4ICsyNDksNiBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbnN0cnVj
dGlvbio+KHJldHVybkFkZHJlc3MpIC0gaW5zdHJ1Y3Rpb25zKCkuYmVnaW4oKTsKICAgICB9CiAK
LSAgICBib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbigpIHsgcmV0dXJuIG1fdW5saW5rZWRD
b2RlLT5pc051bWVyaWNDb21wYXJlRnVuY3Rpb24oKTsgfQotCiAgICAgdW5zaWduZWQgbnVtYmVy
T2ZJbnN0cnVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBtX2luc3RydWN0aW9ucy5zaXplKCk7IH0K
ICAgICBSZWZDb3VudGVkQXJyYXk8SW5zdHJ1Y3Rpb24+JiBpbnN0cnVjdGlvbnMoKSB7IHJldHVy
biBtX2luc3RydWN0aW9uczsgfQogICAgIGNvbnN0IFJlZkNvdW50ZWRBcnJheTxJbnN0cnVjdGlv
bj4mIGluc3RydWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHJ1Y3Rpb25zOyB9CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRDb2RlQmxvY2suY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9VbmxpbmtlZENvZGVC
bG9jay5jcHAJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9VbmxpbmtlZENvZGVCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0MSw3ICsyNDEs
NiBAQCBVbmxpbmtlZENvZGVCbG9jazo6VW5saW5rZWRDb2RlQmxvY2soVk0qCiAgICAgLCBtX2ds
b2JhbE9iamVjdFJlZ2lzdGVyKFZpcnR1YWxSZWdpc3RlcigpKQogICAgICwgbV9uZWVkc0Z1bGxT
Y29wZUNoYWluKGluZm8ubmVlZHNBY3RpdmF0aW9uKCkpCiAgICAgLCBtX3VzZXNFdmFsKGluZm8u
dXNlc0V2YWwoKSkKLSAgICAsIG1faXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKGZhbHNlKQogICAg
ICwgbV9pc1N0cmljdE1vZGUoaW5mby5pc1N0cmljdE1vZGUoKSkKICAgICAsIG1faXNDb25zdHJ1
Y3RvcihpbmZvLmlzQ29uc3RydWN0b3IoKSkKICAgICAsIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMo
ZmFsc2UpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRDb2Rl
QmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5s
aW5rZWRDb2RlQmxvY2suaAkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb2RlL1VubGlua2VkQ29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTM0NCw5
ICszNDQsNiBAQCBwdWJsaWM6CiAgICAgdW5zaWduZWQganVtcFRhcmdldChpbnQgaW5kZXgpIGNv
bnN0IHsgcmV0dXJuIG1fanVtcFRhcmdldHNbaW5kZXhdOyB9CiAgICAgdW5zaWduZWQgbGFzdEp1
bXBUYXJnZXQoKSBjb25zdCB7IHJldHVybiBtX2p1bXBUYXJnZXRzLmxhc3QoKTsgfQogCi0gICAg
dm9pZCBzZXRJc051bWVyaWNDb21wYXJlRnVuY3Rpb24oYm9vbCBpc051bWVyaWNDb21wYXJlRnVu
Y3Rpb24pIHsgbV9pc051bWVyaWNDb21wYXJlRnVuY3Rpb24gPSBpc051bWVyaWNDb21wYXJlRnVu
Y3Rpb247IH0KLSAgICBib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbigpIGNvbnN0IHsgcmV0
dXJuIG1faXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uOyB9Ci0KICAgICBib29sIGlzQnVpbHRpbkZ1
bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9pc0J1aWx0aW5GdW5jdGlvbjsgfQogCiAgICAgQ29u
c3RydWN0b3JLaW5kIGNvbnN0cnVjdG9yS2luZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0
PENvbnN0cnVjdG9yS2luZD4obV9jb25zdHJ1Y3RvcktpbmQpOyB9CkBAIC01MzYsNyArNTMzLDYg
QEAgcHJpdmF0ZToKIAogICAgIHVuc2lnbmVkIG1fbmVlZHNGdWxsU2NvcGVDaGFpbiA6IDE7CiAg
ICAgdW5zaWduZWQgbV91c2VzRXZhbCA6IDE7Ci0gICAgdW5zaWduZWQgbV9pc051bWVyaWNDb21w
YXJlRnVuY3Rpb24gOiAxOwogICAgIHVuc2lnbmVkIG1faXNTdHJpY3RNb2RlIDogMTsKICAgICB1
bnNpZ25lZCBtX2lzQ29uc3RydWN0b3IgOiAxOwogICAgIHVuc2lnbmVkIG1faGFzQ2FwdHVyZWRW
YXJpYWJsZXMgOiAxOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9C
eXRlY29kZUdlbmVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDE4MzE5OCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yNjAzLDExICsyNjAzLDYgQEAgUmVnaXN0ZXJJRCogQnl0ZWNv
ZGVHZW5lcmF0b3I6OmVtaXRUaHJvdwogICAgIHJldHVybiBuZXdUZW1wb3JhcnkoKTsKIH0KIAot
dm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6c2V0SXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKGJvb2wg
aXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKQotewotICAgIG1fY29kZUJsb2NrLT5zZXRJc051bWVy
aWNDb21wYXJlRnVuY3Rpb24oaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTsKLX0KLQogYm9vbCBC
eXRlY29kZUdlbmVyYXRvcjo6aXNBcmd1bWVudE51bWJlcihjb25zdCBJZGVudGlmaWVyJiBpZGVu
dCwgaW50IGFyZ3VtZW50TnVtYmVyKQogewogICAgIFJlZ2lzdGVySUQqIHJlZ2lzdGVySUQgPSB2
YXJpYWJsZShpZGVudCkubG9jYWwoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHJldmlzaW9uIDE4MzE5
OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0
b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMjc2LDggKzI3Niw2IEBAIG5hbWVzcGFjZSBKU0Mgewog
CiAgICAgICAgIGJvb2wgaXNBcmd1bWVudE51bWJlcihjb25zdCBJZGVudGlmaWVyJiwgaW50KTsK
IAotICAgICAgICB2b2lkIHNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJp
Y0NvbXBhcmVGdW5jdGlvbik7Ci0KICAgICAgICAgVmFyaWFibGUgdmFyaWFibGUoY29uc3QgSWRl
bnRpZmllciYpOwogICAgICAgICAKICAgICAgICAgLy8gSWdub3JlcyB0aGUgcG9zc2liaWxpdHkg
b2YgaW50ZXJ2ZW5pbmcgc2NvcGVzLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAkocmV2aXNpb24gMTgzMTk4KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yODIxLDIyICsyODIxLDYgQEAgdm9pZCBGdW5jdGlvbk5vZGU6OmVtaXRC
eXRlY29kZShCeXRlY29kZQogICAgICAgICBnZW5lcmF0b3IuZW1pdFJldHVybihyMCk7CiAgICAg
ICAgIHJldHVybjsKICAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhIHJldHVybiBzdGF0bWVu
dCwgYW5kIGl0IGlzIHRoZSBvbmx5IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24sIGNoZWNrIGlm
IHRoaXMgaXMgYSBudW1lcmljIGNvbXBhcmUuCi0gICAgaWYgKHN0YXRpY19jYXN0PEJsb2NrTm9k
ZSo+KHNpbmdsZVN0YXRlbWVudCktPnNpbmdsZVN0YXRlbWVudCgpKSB7Ci0gICAgICAgIEV4cHJl
c3Npb25Ob2RlKiByZXR1cm5WYWx1ZUV4cHJlc3Npb24gPSByZXR1cm5Ob2RlLT52YWx1ZSgpOwot
ICAgICAgICBpZiAocmV0dXJuVmFsdWVFeHByZXNzaW9uICYmIHJldHVyblZhbHVlRXhwcmVzc2lv
bi0+aXNTdWJ0cmFjdCgpKSB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uTm9kZSogbGhzRXhwcmVz
c2lvbiA9IHN0YXRpY19jYXN0PFN1Yk5vZGUqPihyZXR1cm5WYWx1ZUV4cHJlc3Npb24pLT5saHMo
KTsKLSAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlKiByaHNFeHByZXNzaW9uID0gc3RhdGljX2Nh
c3Q8U3ViTm9kZSo+KHJldHVyblZhbHVlRXhwcmVzc2lvbiktPnJocygpOwotICAgICAgICAgICAg
aWYgKGxoc0V4cHJlc3Npb24tPmlzUmVzb2x2ZU5vZGUoKQotICAgICAgICAgICAgICAgICYmIHJo
c0V4cHJlc3Npb24tPmlzUmVzb2x2ZU5vZGUoKQotICAgICAgICAgICAgICAgICYmIGdlbmVyYXRv
ci5pc0FyZ3VtZW50TnVtYmVyKHN0YXRpY19jYXN0PFJlc29sdmVOb2RlKj4obGhzRXhwcmVzc2lv
biktPmlkZW50aWZpZXIoKSwgMCkKLSAgICAgICAgICAgICAgICAmJiBnZW5lcmF0b3IuaXNBcmd1
bWVudE51bWJlcihzdGF0aWNfY2FzdDxSZXNvbHZlTm9kZSo+KHJoc0V4cHJlc3Npb24pLT5pZGVu
dGlmaWVyKCksIDEpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZ2VuZXJh
dG9yLnNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1
bmNEZWNsTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9oZWFwL0hlYXAuY3BwCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgxLDE3ICs0ODEs
NiBAQCB2b2lkIEhlYXA6OmFkZFJlZmVyZW5jZShKU0NlbGwqIGNlbGwsIEFyCiAgICAgfQogfQog
Ci12b2lkIEhlYXA6OnB1c2hUZW1wU29ydFZlY3RvcihWZWN0b3I8VmFsdWVTdHJpbmdQYWlyLCAw
LCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4qIHRlbXBWZWN0b3IpCi17Ci0gICAgbV90ZW1wU29ydGlu
Z1ZlY3RvcnMuYXBwZW5kKHRlbXBWZWN0b3IpOwotfQotCi12b2lkIEhlYXA6OnBvcFRlbXBTb3J0
VmVjdG9yKFZlY3RvcjxWYWx1ZVN0cmluZ1BhaXIsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93Piog
dGVtcFZlY3RvcikKLXsKLSAgICBBU1NFUlRfVU5VU0VEKHRlbXBWZWN0b3IsIHRlbXBWZWN0b3Ig
PT0gbV90ZW1wU29ydGluZ1ZlY3RvcnMubGFzdCgpKTsKLSAgICBtX3RlbXBTb3J0aW5nVmVjdG9y
cy5yZW1vdmVMYXN0KCk7Ci19Ci0KIHZvaWQgSGVhcDo6aGFydmVzdFdlYWtSZWZlcmVuY2VzKCkK
IHsKICAgICBtX3Nsb3RWaXNpdG9yLmhhcnZlc3RXZWFrUmVmZXJlbmNlcygpOwpAQCAtNTcxLDcg
KzU2MCw2IEBAIHZvaWQgSGVhcDo6bWFya1Jvb3RzKGRvdWJsZSBnY1N0YXJ0VGltZSwKICAgICAg
ICAgdmlzaXRTbWFsbFN0cmluZ3MoKTsKICAgICAgICAgdmlzaXRDb25zZXJ2YXRpdmVSb290cyhj
b25zZXJ2YXRpdmVSb290cyk7CiAgICAgICAgIHZpc2l0UHJvdGVjdGVkT2JqZWN0cyhoZWFwUm9v
dFZpc2l0b3IpOwotICAgICAgICB2aXNpdFRlbXBTb3J0VmVjdG9ycyhoZWFwUm9vdFZpc2l0b3Ip
OwogICAgICAgICB2aXNpdEFyZ3VtZW50QnVmZmVycyhoZWFwUm9vdFZpc2l0b3IpOwogICAgICAg
ICB2aXNpdEV4Y2VwdGlvbihoZWFwUm9vdFZpc2l0b3IpOwogICAgICAgICB2aXNpdFN0cm9uZ0hh
bmRsZXMoaGVhcFJvb3RWaXNpdG9yKTsKQEAgLTcxMCwyMyArNjk4LDYgQEAgdm9pZCBIZWFwOjp2
aXNpdFByb3RlY3RlZE9iamVjdHMoSGVhcFJvbwogICAgIG1fc2xvdFZpc2l0b3IuZG9uYXRlQW5k
RHJhaW4oKTsKIH0KIAotdm9pZCBIZWFwOjp2aXNpdFRlbXBTb3J0VmVjdG9ycyhIZWFwUm9vdFZp
c2l0b3ImIGhlYXBSb290VmlzaXRvcikKLXsKLSAgICBHQ1BIQVNFKFZpc2l0VGVtcFNvcnRWZWN0
b3JzKTsKLQotICAgIGZvciAoYXV0byogdmVjdG9yIDogbV90ZW1wU29ydGluZ1ZlY3RvcnMpIHsK
LSAgICAgICAgZm9yIChhdXRvJiB2YWx1ZVN0cmluZ1BhaXIgOiAqdmVjdG9yKSB7Ci0gICAgICAg
ICAgICBpZiAodmFsdWVTdHJpbmdQYWlyLmZpcnN0KQotICAgICAgICAgICAgICAgIGhlYXBSb290
VmlzaXRvci52aXNpdCgmdmFsdWVTdHJpbmdQYWlyLmZpcnN0KTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGlmIChPcHRpb25zOjpsb2dHQygpID09IEdDTG9nZ2luZzo6VmVyYm9zZSkKLSAgICAg
ICAgZGF0YUxvZygiVGVtcCBTb3J0IFZlY3RvcnM6XG4iLCBtX3Nsb3RWaXNpdG9yKTsKLQotICAg
IG1fc2xvdFZpc2l0b3IuZG9uYXRlQW5kRHJhaW4oKTsKLX0KLQogdm9pZCBIZWFwOjp2aXNpdEFy
Z3VtZW50QnVmZmVycyhIZWFwUm9vdFZpc2l0b3ImIHZpc2l0b3IpCiB7CiAgICAgR0NQSEFTRShN
YXJraW5nQXJndW1lbnRCdWZmZXJzKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFw
L0hlYXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmgJ
KHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXAuaAko
d29ya2luZyBjb3B5KQpAQCAtNzUsNyArNzUsNiBAQCBjbGFzcyBXb3JrbGlzdDsKIAogc3RhdGlj
IHZvaWQqIGNvbnN0IHpvbWJpZmllZEJpdHMgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigweGRl
YWRiZWVmKTsKIAotdHlwZWRlZiBzdGQ6OnBhaXI8SlNWYWx1ZSwgV1RGOjpTdHJpbmc+IFZhbHVl
U3RyaW5nUGFpcjsKIHR5cGVkZWYgSGFzaENvdW50ZWRTZXQ8SlNDZWxsKj4gUHJvdGVjdENvdW50
U2V0OwogdHlwZWRlZiBIYXNoQ291bnRlZFNldDxjb25zdCBjaGFyKj4gVHlwZUNvdW50U2V0Owog
CkBAIC0xODYsOSArMTg1LDYgQEAgcHVibGljOgogICAgIEpTX0VYUE9SVF9QUklWQVRFIHN0ZDo6
dW5pcXVlX3B0cjxUeXBlQ291bnRTZXQ+IG9iamVjdFR5cGVDb3VudHMoKTsKICAgICB2b2lkIHNo
b3dTdGF0aXN0aWNzKCk7CiAKLSAgICB2b2lkIHB1c2hUZW1wU29ydFZlY3RvcihWZWN0b3I8VmFs
dWVTdHJpbmdQYWlyLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4qKTsKLSAgICB2b2lkIHBvcFRl
bXBTb3J0VmVjdG9yKFZlY3RvcjxWYWx1ZVN0cmluZ1BhaXIsIDAsIFVuc2FmZVZlY3Rvck92ZXJm
bG93PiopOwotCiAgICAgSGFzaFNldDxNYXJrZWRBcmd1bWVudEJ1ZmZlcio+JiBtYXJrTGlzdFNl
dCgpOwogICAgIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IHR5cGVuYW1lIEZ1bmN0
b3I6OlJldHVyblR5cGUgZm9yRWFjaFByb3RlY3RlZENlbGwoRnVuY3RvciYpOwpAQCAtMzAwLDcg
KzI5Niw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCB2aXNpdENvbXBpbGVyV29ya2xpc3RXZWFrUmVm
ZXJlbmNlcygpOwogICAgIHZvaWQgcmVtb3ZlRGVhZENvbXBpbGVyV29ya2xpc3RFbnRyaWVzKCk7
CiAgICAgdm9pZCB2aXNpdFByb3RlY3RlZE9iamVjdHMoSGVhcFJvb3RWaXNpdG9yJik7Ci0gICAg
dm9pZCB2aXNpdFRlbXBTb3J0VmVjdG9ycyhIZWFwUm9vdFZpc2l0b3ImKTsKICAgICB2b2lkIHZp
c2l0QXJndW1lbnRCdWZmZXJzKEhlYXBSb290VmlzaXRvciYpOwogICAgIHZvaWQgdmlzaXRFeGNl
cHRpb24oSGVhcFJvb3RWaXNpdG9yJik7CiAgICAgdm9pZCB2aXNpdFN0cm9uZ0hhbmRsZXMoSGVh
cFJvb3RWaXNpdG9yJik7CkBAIC0zNzEsNyArMzY2LDYgQEAgcHJpdmF0ZToKICAgICBIYXNoU2V0
PGNvbnN0IEpTQ2VsbCo+IG1fY29weWluZ1JlbWVtYmVyZWRTZXQ7CiAKICAgICBQcm90ZWN0Q291
bnRTZXQgbV9wcm90ZWN0ZWRWYWx1ZXM7Ci0gICAgVmVjdG9yPFZlY3RvcjxWYWx1ZVN0cmluZ1Bh
aXIsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93Pio+IG1fdGVtcFNvcnRpbmdWZWN0b3JzOwogICAg
IHN0ZDo6dW5pcXVlX3B0cjxIYXNoU2V0PE1hcmtlZEFyZ3VtZW50QnVmZmVyKj4+IG1fbWFya0xp
c3RTZXQ7CiAKICAgICBNYWNoaW5lVGhyZWFkcyBtX21hY2hpbmVUaHJlYWRzOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9QYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmNwcAkocmV2aXNpb24gMTgzMTk4KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9QYXJzZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yODgsNyArMjg4LDYgQEAgU3RyaW5nIFBhcnNlcjxMZXhlclR5cGU+OjpwYXJzZUlubmVyKCkK
ICAgICAgICAgZmVhdHVyZXMgfD0gTW9kaWZpZWRBcmd1bWVudHNGZWF0dXJlOwogICAgIFZlY3Rv
cjxSZWZQdHI8U3RyaW5nSW1wbD4+IGNsb3NlZFZhcmlhYmxlczsKICAgICBpZiAobV9wYXJzaW5n
QnVpbHRpbikgewotICAgICAgICBSRUxFQVNFX0FTU0VSVCghY2FwdHVyZWRWYXJpYWJsZXMuc2l6
ZSgpKTsKICAgICAgICAgSWRlbnRpZmllclNldCB1c2VkVmFyaWFibGVzOwogICAgICAgICBzY29w
ZS0+Z2V0VXNlZFZhcmlhYmxlcyh1c2VkVmFyaWFibGVzKTsKICAgICAgICAgZm9yIChjb25zdCBh
dXRvJiB2YXJpYWJsZSA6IHVzZWRWYXJpYWJsZXMpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0FycmF5UHJvdG90eXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9BcnJheVByb3RvdHlwZS5jcHAJKHJldmlzaW9uIDE4MzE5OCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FycmF5UHJvdG90eXBlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTQsNyArNTQsNiBAQCBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxM
IGFycmF5UHJvdG9GCiBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5UHJvdG9GdW5j
UmV2ZXJzZShFeGVjU3RhdGUqKTsKIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgYXJyYXlQ
cm90b0Z1bmNTaGlmdChFeGVjU3RhdGUqKTsKIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
YXJyYXlQcm90b0Z1bmNTbGljZShFeGVjU3RhdGUqKTsKLUVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgYXJyYXlQcm90b0Z1bmNTb3J0KEV4ZWNTdGF0ZSopOwogRW5jb2RlZEpTVmFsdWUgSlND
X0hPU1RfQ0FMTCBhcnJheVByb3RvRnVuY1NwbGljZShFeGVjU3RhdGUqKTsKIEVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgYXJyYXlQcm90b0Z1bmNVblNoaWZ0KEV4ZWNTdGF0ZSopOwogRW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3RvRnVuY0luZGV4T2YoRXhlY1N0YXRl
Kik7CkBAIC03MCwyMSArNjksNiBAQCBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5
UHJvdG9GCiAKIG5hbWVzcGFjZSBKU0MgewogCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNOdW1lcmlj
Q29tcGFyZUZ1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBmdW5jdGlvbiwgQ2FsbFR5
cGUgY2FsbFR5cGUsIGNvbnN0IENhbGxEYXRhJiBjYWxsRGF0YSkKLXsKLSAgICBpZiAoY2FsbFR5
cGUgIT0gQ2FsbFR5cGVKUykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgRnVuY3Rpb25F
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0gY2FsbERhdGEuanMuZnVuY3Rpb25FeGVjdXRhYmxlOwot
ICAgIEpTU2NvcGUqIHNjb3BlID0gY2FsbERhdGEuanMuc2NvcGU7Ci0KLSAgICBKU09iamVjdCog
ZXJyb3IgPSBleGVjdXRhYmxlLT5wcmVwYXJlRm9yRXhlY3V0aW9uKGV4ZWMsIGpzQ2FzdDxKU0Z1
bmN0aW9uKj4oZnVuY3Rpb24pLCBzY29wZSwgQ29kZUZvckNhbGwpOwotICAgIGlmIChlcnJvcikK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGV4ZWN1dGFibGUtPmNvZGVCbG9j
a0ZvckNhbGwoKS0+aXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKCk7Ci19Ci0KIC8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcnJheVByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCiAKIGNvbnN0IENsYXNzSW5mbyBBcnJheVByb3RvdHlwZTo6c19pbmZvID0geyJB
cnJheSIsICZKU0FycmF5OjpzX2luZm8sICZhcnJheVByb3RvdHlwZVRhYmxlLCBDUkVBVEVfTUVU
SE9EX1RBQkxFKEFycmF5UHJvdG90eXBlKX07CkBAIC02NTQsMTU1ICs2MzgsNiBAQCBpbmxpbmUg
SlNWYWx1ZSBnZXRPckhvbGUoSlNPYmplY3QqIG9iaiwgCiAgICAgcmV0dXJuIEpTVmFsdWUoKTsK
IH0KIAotc3RhdGljIGJvb2wgYXR0ZW1wdEZhc3RTb3J0KEV4ZWNTdGF0ZSogZXhlYywgSlNPYmpl
Y3QqIHRoaXNPYmosIEpTVmFsdWUgZnVuY3Rpb24sIENhbGxEYXRhJiBjYWxsRGF0YSwgQ2FsbFR5
cGUmIGNhbGxUeXBlKQotewotICAgIGlmICh0aGlzT2JqLT5jbGFzc0luZm8oKSAhPSBKU0FycmF5
OjppbmZvKCkKLSAgICAgICAgfHwgYXNBcnJheSh0aGlzT2JqKS0+aGFzU3BhcnNlTWFwKCkKLSAg
ICAgICAgfHwgc2hvdWxkVXNlU2xvd1B1dCh0aGlzT2JqLT5pbmRleGluZ1R5cGUoKSkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAoaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9u
KGV4ZWMsIGZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEpKQotICAgICAgICBhc0FycmF5KHRo
aXNPYmopLT5zb3J0TnVtZXJpYyhleGVjLCBmdW5jdGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKTsK
LSAgICBlbHNlIGlmIChjYWxsVHlwZSAhPSBDYWxsVHlwZU5vbmUpCi0gICAgICAgIGFzQXJyYXko
dGhpc09iaiktPnNvcnQoZXhlYywgZnVuY3Rpb24sIGNhbGxUeXBlLCBjYWxsRGF0YSk7Ci0gICAg
ZWxzZQotICAgICAgICBhc0FycmF5KHRoaXNPYmopLT5zb3J0KGV4ZWMpOwotICAgIHJldHVybiB0
cnVlOwotfQotCi1zdGF0aWMgYm9vbCBwZXJmb3JtU2xvd1NvcnQoRXhlY1N0YXRlKiBleGVjLCBK
U09iamVjdCogdGhpc09iaiwgdW5zaWduZWQgbGVuZ3RoLCBKU1ZhbHVlIGZ1bmN0aW9uLCBDYWxs
RGF0YSYgY2FsbERhdGEsIENhbGxUeXBlJiBjYWxsVHlwZSkKLXsKLSAgICAvLyAiTWluIiBzb3J0
LiBOb3QgdGhlIGZhc3Rlc3QsIGJ1dCBkZWZpbml0ZWx5IGxlc3MgY29kZSB0aGFuIGhlYXBzb3J0
Ci0gICAgLy8gb3IgcXVpY2tzb3J0LCBhbmQgbXVjaCBsZXNzIHN3YXBwaW5nIHRoYW4gYnViYmxl
c29ydC9pbnNlcnRpb25zb3J0LgotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGgg
LSAxOyArK2kpIHsKLSAgICAgICAgSlNWYWx1ZSBpT2JqID0gZ2V0T3JIb2xlKHRoaXNPYmosIGV4
ZWMsIGkpOwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIHVuc2lnbmVkIHRoZW1pbiA9IGk7Ci0gICAgICAgIEpTVmFs
dWUgbWluT2JqID0gaU9iajsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gaSArIDE7IGogPCBs
ZW5ndGg7ICsraikgewotICAgICAgICAgICAgSlNWYWx1ZSBqT2JqID0gZ2V0T3JIb2xlKHRoaXNP
YmosIGV4ZWMsIGopOwotICAgICAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGRvdWJsZSBjb21wYXJlUmVz
dWx0OwotICAgICAgICAgICAgaWYgKCFqT2JqKQotICAgICAgICAgICAgICAgIGNvbXBhcmVSZXN1
bHQgPSAxOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1pbk9iaikKLSAgICAgICAgICAgICAgICBj
b21wYXJlUmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICBlbHNlIGlmIChqT2JqLmlzVW5kZWZpbmVk
KCkpCi0gICAgICAgICAgICAgICAgY29tcGFyZVJlc3VsdCA9IDE7IC8vIGRvbid0IGNoZWNrIG1p
bk9iaiBiZWNhdXNlIHRoZXJlJ3Mgbm8gbmVlZCB0byBkaWZmZXJlbnRpYXRlID09ICgwKSBmcm9t
ID4gKDEpCi0gICAgICAgICAgICBlbHNlIGlmIChtaW5PYmouaXNVbmRlZmluZWQoKSkKLSAgICAg
ICAgICAgICAgICBjb21wYXJlUmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICBlbHNlIGlmIChjYWxs
VHlwZSAhPSBDYWxsVHlwZU5vbmUpIHsKLSAgICAgICAgICAgICAgICBNYXJrZWRBcmd1bWVudEJ1
ZmZlciBsOwotICAgICAgICAgICAgICAgIGwuYXBwZW5kKGpPYmopOwotICAgICAgICAgICAgICAg
IGwuYXBwZW5kKG1pbk9iaik7Ci0gICAgICAgICAgICAgICAgY29tcGFyZVJlc3VsdCA9IGNhbGwo
ZXhlYywgZnVuY3Rpb24sIGNhbGxUeXBlLCBjYWxsRGF0YSwganNVbmRlZmluZWQoKSwgbCkudG9O
dW1iZXIoZXhlYyk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBjb21wYXJl
UmVzdWx0ID0gY29kZVBvaW50Q29tcGFyZUxlc3NUaGFuKGpPYmoudG9XVEZTdHJpbmdJbmxpbmUo
ZXhlYyksIG1pbk9iai50b1dURlN0cmluZ0lubGluZShleGVjKSkgPyAtMSA6IDE7Ci0KLSAgICAg
ICAgICAgIGlmIChjb21wYXJlUmVzdWx0IDwgMCkgewotICAgICAgICAgICAgICAgIHRoZW1pbiA9
IGo7Ci0gICAgICAgICAgICAgICAgbWluT2JqID0gak9iajsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgICAvLyBTd2FwIHRoZW1pbiBhbmQgaQotICAgICAgICBpZiAodGhlbWluID4g
aSkgewotICAgICAgICAgICAgaWYgKG1pbk9iaikgewotICAgICAgICAgICAgICAgIHRoaXNPYmot
Pm1ldGhvZFRhYmxlKGV4ZWMtPnZtKCkpLT5wdXRCeUluZGV4KHRoaXNPYmosIGV4ZWMsIGksIG1p
bk9iaiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYg
KCF0aGlzT2JqLT5tZXRob2RUYWJsZShleGVjLT52bSgpKS0+ZGVsZXRlUHJvcGVydHlCeUluZGV4
KHRoaXNPYmosIGV4ZWMsIGkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dUeXBlRXJyb3IoZXhl
YywgQVNDSUlMaXRlcmFsKCJVbmFibGUgdG8gZGVsZXRlIHByb3BlcnR5LiIpKTsKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaU9i
aikgewotICAgICAgICAgICAgICAgIHRoaXNPYmotPm1ldGhvZFRhYmxlKGV4ZWMtPnZtKCkpLT5w
dXRCeUluZGV4KHRoaXNPYmosIGV4ZWMsIHRoZW1pbiwgaU9iaiwgdHJ1ZSk7Ci0gICAgICAgICAg
ICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzT2JqLT5tZXRob2RUYWJsZShl
eGVjLT52bSgpKS0+ZGVsZXRlUHJvcGVydHlCeUluZGV4KHRoaXNPYmosIGV4ZWMsIHRoZW1pbikp
IHsKLSAgICAgICAgICAgICAgICB0aHJvd1R5cGVFcnJvcihleGVjLCBBU0NJSUxpdGVyYWwoIlVu
YWJsZSB0byBkZWxldGUgcHJvcGVydHkuIikpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3RvRnVuY1NvcnQoRXhlY1N0
YXRlKiBleGVjKQotewotICAgIEpTT2JqZWN0KiB0aGlzT2JqID0gZXhlYy0+dGhpc1ZhbHVlKCku
dG9UaGlzKGV4ZWMsIFN0cmljdE1vZGUpLnRvT2JqZWN0KGV4ZWMpOwotICAgIHVuc2lnbmVkIGxl
bmd0aCA9IGdldExlbmd0aChleGVjLCB0aGlzT2JqKTsKLSAgICBpZiAoIWxlbmd0aCB8fCBleGVj
LT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aGlzT2Jq
KTsKLQotICAgIEpTVmFsdWUgZnVuY3Rpb24gPSBleGVjLT5hcmd1bWVudCgwKTsKLSAgICBDYWxs
RGF0YSBjYWxsRGF0YTsKLSAgICBDYWxsVHlwZSBjYWxsVHlwZSA9IGdldENhbGxEYXRhKGZ1bmN0
aW9uLCBjYWxsRGF0YSk7Ci0KLSAgICBpZiAoYXR0ZW1wdEZhc3RTb3J0KGV4ZWMsIHRoaXNPYmos
IGZ1bmN0aW9uLCBjYWxsRGF0YSwgY2FsbFR5cGUpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKHRoaXNPYmopOwotICAgIAotICAgIC8vIEFzc3VtZSB0aGF0IGZvciBzbWFsbC1pc2gg
YXJyYXlzLCBkb2luZyB0aGUgc2xvdyBzb3J0IGRpcmVjdGx5IGlzIGJldHRlci4KLSAgICBpZiAo
bGVuZ3RoIDwgMTAwMCkKLSAgICAgICAgcmV0dXJuIHBlcmZvcm1TbG93U29ydChleGVjLCB0aGlz
T2JqLCBsZW5ndGgsIGZ1bmN0aW9uLCBjYWxsRGF0YSwgY2FsbFR5cGUpID8gSlNWYWx1ZTo6ZW5j
b2RlKHRoaXNPYmopIDogSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgIAotICAg
IEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBKU0dsb2JhbE9iamVjdDo6Y3JlYXRlKAot
ICAgICAgICBleGVjLT52bSgpLCBKU0dsb2JhbE9iamVjdDo6Y3JlYXRlU3RydWN0dXJlKGV4ZWMt
PnZtKCksIGpzTnVsbCgpKSk7Ci0gICAgSlNBcnJheSogZmxhdEFycmF5ID0gY29uc3RydWN0RW1w
dHlBcnJheShnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgbnVsbHB0cik7Ci0gICAgaWYgKGV4
ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5k
ZWZpbmVkKCkpOwotICAgIAotICAgIFByb3BlcnR5TmFtZUFycmF5IG5hbWVBcnJheShleGVjKTsK
LSAgICB0aGlzT2JqLT5tZXRob2RUYWJsZShleGVjLT52bSgpKS0+Z2V0UHJvcGVydHlOYW1lcyh0
aGlzT2JqLCBleGVjLCBuYW1lQXJyYXksIEVudW1lcmF0aW9uTW9kZShEb250RW51bVByb3BlcnRp
ZXNNb2RlOjpJbmNsdWRlKSk7Ci0gICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotCi0gICAgVmVjdG9yPHVp
bnQzMl90LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4ga2V5czsKLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG5hbWVBcnJheS5zaXplKCk7ICsraSkgewotICAgICAgICBQcm9wZXJ0eU5hbWUg
bmFtZSA9IG5hbWVBcnJheVtpXTsKLSAgICAgICAgT3B0aW9uYWw8dWludDMyX3Q+IG9wdGlvbmFs
SW5kZXggPSBwYXJzZUluZGV4KG5hbWUpOwotICAgICAgICBpZiAoIW9wdGlvbmFsSW5kZXgpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICB1aW50MzJfdCBpbmRleCA9IG9wdGlvbmFs
SW5kZXgudmFsdWUoKTsKLSAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9IGdldE9ySG9sZSh0aGlzT2Jq
LCBleGVjLCBpbmRleCk7Ci0gICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0gICAgICAgIGlm
ICghdmFsdWUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAga2V5cy5hcHBlbmQoaW5k
ZXgpOwotICAgICAgICBmbGF0QXJyYXktPnB1c2goZXhlYywgdmFsdWUpOwotICAgICAgICBpZiAo
ZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2Rl
KGpzVW5kZWZpbmVkKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWF0dGVtcHRGYXN0U29ydChl
eGVjLCBmbGF0QXJyYXksIGZ1bmN0aW9uLCBjYWxsRGF0YSwgY2FsbFR5cGUpCi0gICAgICAgICYm
ICFwZXJmb3JtU2xvd1NvcnQoZXhlYywgZmxhdEFycmF5LCBmbGF0QXJyYXktPmxlbmd0aCgpLCBm
dW5jdGlvbiwgY2FsbERhdGEsIGNhbGxUeXBlKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVu
Y29kZShqc1VuZGVmaW5lZCgpKTsKLSAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtl
eXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0ga2V5c1tpXTsKLSAgICAg
ICAgaWYgKGluZGV4IDwgZmxhdEFycmF5LT5sZW5ndGgoKSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAKLSAgICAgICAgaWYgKCF0aGlzT2JqLT5tZXRob2RUYWJsZShleGVjLT52bSgp
KS0+ZGVsZXRlUHJvcGVydHlCeUluZGV4KHRoaXNPYmosIGV4ZWMsIGluZGV4KSkgewotICAgICAg
ICAgICAgdGhyb3dUeXBlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJVbmFibGUgdG8gZGVsZXRl
IHByb3BlcnR5LiIpKTsKLSAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaSA9IGZs
YXRBcnJheS0+bGVuZ3RoKCk7IGktLTspIHsKLSAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9IGdldE9y
SG9sZShmbGF0QXJyYXksIGV4ZWMsIGkpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCh2YWx1ZSk7
Ci0gICAgICAgIHRoaXNPYmotPm1ldGhvZFRhYmxlKGV4ZWMtPnZtKCkpLT5wdXRCeUluZGV4KHRo
aXNPYmosIGV4ZWMsIGksIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgp
KTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aGlzT2JqKTsKLX0K
LQogRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3RvRnVuY1NwbGljZShFeGVj
U3RhdGUqIGV4ZWMpCiB7CiAgICAgLy8gMTUuNC40LjEyCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmgJKHJldmlzaW9uIDE4MzE5
OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI2Niw5ICsyNjYsMTIgQEAKICAgICBtYWNybyhPYmplY3QpIFwK
ICAgICBtYWNybyhOdW1iZXIpIFwKICAgICBtYWNybyhBcnJheSkgXAorICAgIG1hY3JvKFN0cmlu
ZykgXAogICAgIG1hY3JvKGFicykgXAogICAgIG1hY3JvKGZsb29yKSBcCiAgICAgbWFjcm8oaXNG
aW5pdGUpIFwKKyAgICBtYWNybyhnZXRQcm90b3R5cGVPZikgXAorICAgIG1hY3JvKGdldE93blBy
b3BlcnR5TmFtZXMpIFwKICAgICBtYWNybyhUeXBlRXJyb3IpIFwKICAgICBtYWNybyh1bmRlZmlu
ZWQpIFwKICAgICBtYWNybyhCdWlsdGluTG9nKSBcCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU0FycmF5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU0FycmF5LmNwcAkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDcgKzM0
LDYgQEAKICNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCiAjaW5jbHVkZSAiUHJvcGVydHlOYW1lQXJy
YXkuaCIKICNpbmNsdWRlICJSZWplY3QuaCIKLSNpbmNsdWRlIDx3dGYvQVZMVHJlZS5oPgogI2lu
Y2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CkBAIC05OTQs
NTIxICs5OTMsNiBAQCBib29sIEpTQXJyYXk6OnVuc2hpZnRDb3VudFdpdGhBbnlJbmRleGluCiAg
ICAgfQogfQogCi1zdGF0aWMgaW50IGNvbXBhcmVOdW1iZXJzRm9yUVNvcnRXaXRoSW50MzIoY29u
c3Qgdm9pZCogYSwgY29uc3Qgdm9pZCogYikKLXsKLSAgICBpbnQzMl90IGlhID0gc3RhdGljX2Nh
c3Q8Y29uc3QgSlNWYWx1ZSo+KGEpLT5hc0ludDMyKCk7Ci0gICAgaW50MzJfdCBpYiA9IHN0YXRp
Y19jYXN0PGNvbnN0IEpTVmFsdWUqPihiKS0+YXNJbnQzMigpOwotICAgIHJldHVybiBpYSAtIGli
OwotfQotCi1zdGF0aWMgaW50IGNvbXBhcmVOdW1iZXJzRm9yUVNvcnRXaXRoRG91YmxlKGNvbnN0
IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCi17Ci0gICAgZG91YmxlIGRhID0gKnN0YXRpY19jYXN0
PGNvbnN0IGRvdWJsZSo+KGEpOwotICAgIGRvdWJsZSBkYiA9ICpzdGF0aWNfY2FzdDxjb25zdCBk
b3VibGUqPihiKTsKLSAgICByZXR1cm4gKGRhID4gZGIpIC0gKGRhIDwgZGIpOwotfQotCi1zdGF0
aWMgaW50IGNvbXBhcmVOdW1iZXJzRm9yUVNvcnQoY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCog
YikKLXsKLSAgICBkb3VibGUgZGEgPSBzdGF0aWNfY2FzdDxjb25zdCBKU1ZhbHVlKj4oYSktPmFz
TnVtYmVyKCk7Ci0gICAgZG91YmxlIGRiID0gc3RhdGljX2Nhc3Q8Y29uc3QgSlNWYWx1ZSo+KGIp
LT5hc051bWJlcigpOwotICAgIHJldHVybiAoZGEgPiBkYikgLSAoZGEgPCBkYik7Ci19Ci0KLXN0
YXRpYyBpbnQgY29tcGFyZUJ5U3RyaW5nUGFpckZvclFTb3J0KGNvbnN0IHZvaWQqIGEsIGNvbnN0
IHZvaWQqIGIpCi17Ci0gICAgY29uc3QgVmFsdWVTdHJpbmdQYWlyKiB2YSA9IHN0YXRpY19jYXN0
PGNvbnN0IFZhbHVlU3RyaW5nUGFpcio+KGEpOwotICAgIGNvbnN0IFZhbHVlU3RyaW5nUGFpciog
dmIgPSBzdGF0aWNfY2FzdDxjb25zdCBWYWx1ZVN0cmluZ1BhaXIqPihiKTsKLSAgICByZXR1cm4g
Y29kZVBvaW50Q29tcGFyZSh2YS0+c2Vjb25kLCB2Yi0+c2Vjb25kKTsKLX0KLQotdGVtcGxhdGU8
SW5kZXhpbmdUeXBlIGFycmF5SW5kZXhpbmdUeXBlPgotdm9pZCBKU0FycmF5Ojpzb3J0TnVtZXJp
Y1ZlY3RvcihFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgY29tcGFyZUZ1bmN0aW9uLCBDYWxsVHlw
ZSBjYWxsVHlwZSwgY29uc3QgQ2FsbERhdGEmIGNhbGxEYXRhKQotewotICAgIEFTU0VSVChhcnJh
eUluZGV4aW5nVHlwZSA9PSBBcnJheVdpdGhJbnQzMiB8fCBhcnJheUluZGV4aW5nVHlwZSA9PSBB
cnJheVdpdGhEb3VibGUgfHwgYXJyYXlJbmRleGluZ1R5cGUgPT0gQXJyYXlXaXRoQ29udGlndW91
cyB8fCBhcnJheUluZGV4aW5nVHlwZSA9PSBBcnJheVdpdGhBcnJheVN0b3JhZ2UpOwotICAgIAot
ICAgIHVuc2lnbmVkIGxlbmd0aE5vdEluY2x1ZGluZ1VuZGVmaW5lZDsKLSAgICB1bnNpZ25lZCBu
ZXdSZWxldmFudExlbmd0aDsKLSAgICBjb21wYWN0Rm9yU29ydGluZzxhcnJheUluZGV4aW5nVHlw
ZT4oCi0gICAgICAgIGxlbmd0aE5vdEluY2x1ZGluZ1VuZGVmaW5lZCwKLSAgICAgICAgbmV3UmVs
ZXZhbnRMZW5ndGgpOwotICAgIAotICAgIENvbnRpZ3VvdXNKU1ZhbHVlcyBkYXRhID0gaW5kZXhp
bmdEYXRhPGFycmF5SW5kZXhpbmdUeXBlPigpOwotICAgIAotICAgIGlmIChhcnJheUluZGV4aW5n
VHlwZSA9PSBBcnJheVdpdGhBcnJheVN0b3JhZ2UgJiYgYXJyYXlTdG9yYWdlKCktPm1fc3BhcnNl
TWFwLmdldCgpKSB7Ci0gICAgICAgIHRocm93T3V0T2ZNZW1vcnlFcnJvcihleGVjKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWxlbmd0aE5vdEluY2x1ZGluZ1VuZGVm
aW5lZCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGJvb2wgYWxsVmFsdWVzQXJlTnVtYmVy
cyA9IHRydWU7Ci0gICAgc3dpdGNoIChhcnJheUluZGV4aW5nVHlwZSkgewotICAgIGNhc2UgQXJy
YXlXaXRoSW50MzI6Ci0gICAgY2FzZSBBcnJheVdpdGhEb3VibGU6Ci0gICAgICAgIGJyZWFrOwot
ICAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5l
d1JlbGV2YW50TGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghZGF0YVtpXS5pc051bWJl
cigpKSB7Ci0gICAgICAgICAgICAgICAgYWxsVmFsdWVzQXJlTnVtYmVycyA9IGZhbHNlOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWFsbFZhbHVlc0FyZU51bWJlcnMpCi0gICAgICAg
IHJldHVybiBzb3J0KGV4ZWMsIGNvbXBhcmVGdW5jdGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKTsK
LSAgICAKLSAgICAvLyBGb3IgbnVtZXJpYyBjb21wYXJpc29uLCB3aGljaCBpcyBmYXN0LCBxc29y
dCBpcyBmYXN0ZXIgdGhhbiBtZXJnZXNvcnQuIFdlCi0gICAgLy8gYWxzbyBkb24ndCByZXF1aXJl
IG1lcmdlc29ydCdzIHN0YWJpbGl0eSwgc2luY2UgdGhlcmUncyBubyB1c2VyIHZpc2libGUKLSAg
ICAvLyBzaWRlLWVmZmVjdCBmcm9tIHN3YXBwaW5nIHRoZSBvcmRlciBvZiBlcXVhbCBwcmltaXRp
dmUgdmFsdWVzLgotICAgIGludCAoKmNvbXBhcmUpKGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKik7
Ci0gICAgc3dpdGNoIChhcnJheUluZGV4aW5nVHlwZSkgewotICAgIGNhc2UgQXJyYXlXaXRoSW50
MzI6Ci0gICAgICAgIGNvbXBhcmUgPSBjb21wYXJlTnVtYmVyc0ZvclFTb3J0V2l0aEludDMyOwot
ICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBBcnJheVdpdGhEb3VibGU6Ci0gICAg
ICAgIGNvbXBhcmUgPSBjb21wYXJlTnVtYmVyc0ZvclFTb3J0V2l0aERvdWJsZTsKLSAgICAgICAg
QVNTRVJUKHNpemVvZihXcml0ZUJhcnJpZXI8VW5rbm93bj4pID09IHNpemVvZihkb3VibGUpKTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNvbXBhcmUg
PSBjb21wYXJlTnVtYmVyc0ZvclFTb3J0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQVNT
RVJUKGRhdGEubGVuZ3RoKCkgPj0gbmV3UmVsZXZhbnRMZW5ndGgpOwotICAgIHFzb3J0KGRhdGEu
ZGF0YSgpLCBuZXdSZWxldmFudExlbmd0aCwgc2l6ZW9mKFdyaXRlQmFycmllcjxVbmtub3duPiks
IGNvbXBhcmUpOwotICAgIHJldHVybjsKLX0KLQotdm9pZCBKU0FycmF5Ojpzb3J0TnVtZXJpYyhF
eGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgY29tcGFyZUZ1bmN0aW9uLCBDYWxsVHlwZSBjYWxsVHlw
ZSwgY29uc3QgQ2FsbERhdGEmIGNhbGxEYXRhKQotewotICAgIEFTU0VSVCghaW5TcGFyc2VJbmRl
eGluZ01vZGUoKSk7Ci0KLSAgICBzd2l0Y2ggKGluZGV4aW5nVHlwZSgpKSB7Ci0gICAgY2FzZSBB
cnJheUNsYXNzOgotICAgIGNhc2UgQXJyYXlXaXRoVW5kZWNpZGVkOgotICAgICAgICByZXR1cm47
Ci0gICAgICAgIAotICAgIGNhc2UgQXJyYXlXaXRoSW50MzI6Ci0gICAgICAgIHNvcnROdW1lcmlj
VmVjdG9yPEFycmF5V2l0aEludDMyPihleGVjLCBjb21wYXJlRnVuY3Rpb24sIGNhbGxUeXBlLCBj
YWxsRGF0YSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgY2FzZSBBcnJheVdpdGhE
b3VibGU6Ci0gICAgICAgIHNvcnROdW1lcmljVmVjdG9yPEFycmF5V2l0aERvdWJsZT4oZXhlYywg
Y29tcGFyZUZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEpOwotICAgICAgICByZXR1cm47Ci0g
ICAgICAgIAotICAgIGNhc2UgQXJyYXlXaXRoQ29udGlndW91czoKLSAgICAgICAgc29ydE51bWVy
aWNWZWN0b3I8QXJyYXlXaXRoQ29udGlndW91cz4oZXhlYywgY29tcGFyZUZ1bmN0aW9uLCBjYWxs
VHlwZSwgY2FsbERhdGEpOwotICAgICAgICByZXR1cm47Ci0KLSAgICBjYXNlIEFycmF5V2l0aEFy
cmF5U3RvcmFnZToKLSAgICAgICAgc29ydE51bWVyaWNWZWN0b3I8QXJyYXlXaXRoQXJyYXlTdG9y
YWdlPihleGVjLCBjb21wYXJlRnVuY3Rpb24sIGNhbGxUeXBlLCBjYWxsRGF0YSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgICAgZGF0YUxvZygiSW5kZXhp
bmcgdHlwZTogIiwgaW5kZXhpbmdUeXBlKCksICJcbiIpOwotICAgICAgICBSRUxFQVNFX0FTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8
SW5kZXhpbmdUeXBlPiBzdHJ1Y3QgQ29udGlndW91c1R5cGVBY2Nlc3NvciB7Ci0gICAgdHlwZWRl
ZiBXcml0ZUJhcnJpZXI8VW5rbm93bj4gVHlwZTsKLSAgICBzdGF0aWMgSlNWYWx1ZSBnZXRBc1Zh
bHVlKENvbnRpZ3VvdXNEYXRhPFR5cGU+IGRhdGEsIHNpemVfdCBpKSB7IHJldHVybiBkYXRhW2ld
LmdldCgpOyB9Ci0gICAgc3RhdGljIHZvaWQgc2V0V2l0aFZhbHVlKFZNJiB2bSwgSlNBcnJheSog
dGhpc1ZhbHVlLCBDb250aWd1b3VzRGF0YTxUeXBlPiBkYXRhLCBzaXplX3QgaSwgSlNWYWx1ZSB2
YWx1ZSkKLSAgICB7Ci0gICAgICAgIGRhdGFbaV0uc2V0KHZtLCB0aGlzVmFsdWUsIHZhbHVlKTsK
LSAgICB9Ci0gICAgc3RhdGljIHZvaWQgcmVwbGFjZURhdGFSZWZlcmVuY2UoQ29udGlndW91c0Rh
dGE8VHlwZT4qIG91dERhdGEsIENvbnRpZ3VvdXNKU1ZhbHVlcyBpbkRhdGEpCi0gICAgewotICAg
ICAgICAqb3V0RGF0YSA9IGluRGF0YTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZSA8PiBzdHJ1Y3Qg
Q29udGlndW91c1R5cGVBY2Nlc3NvcjxBcnJheVdpdGhEb3VibGU+IHsKLSAgICB0eXBlZGVmIGRv
dWJsZSBUeXBlOwotICAgIHN0YXRpYyBKU1ZhbHVlIGdldEFzVmFsdWUoQ29udGlndW91c0RhdGE8
VHlwZT4gZGF0YSwgc2l6ZV90IGkpIHsgQVNTRVJUKGRhdGFbaV0gPT0gZGF0YVtpXSk7IHJldHVy
biBKU1ZhbHVlKEpTVmFsdWU6OkVuY29kZUFzRG91YmxlLCBkYXRhW2ldKTsgfQotICAgIHN0YXRp
YyB2b2lkIHNldFdpdGhWYWx1ZShWTSYsIEpTQXJyYXkqLCBDb250aWd1b3VzRGF0YTxUeXBlPiBk
YXRhLCBzaXplX3QgaSwgSlNWYWx1ZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGRhdGFbaV0gPSB2
YWx1ZS5hc051bWJlcigpOwotICAgIH0KLSAgICBzdGF0aWMgTk9fUkVUVVJOX0RVRV9UT19DUkFT
SCB2b2lkIHJlcGxhY2VEYXRhUmVmZXJlbmNlKENvbnRpZ3VvdXNEYXRhPFR5cGU+KiwgQ29udGln
dW91c0pTVmFsdWVzKQotICAgIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdF
KDAsICJJbmNvbnNpc3RlbnQgaW5kZXhpbmcgdHlwZXMgZHVyaW5nIGNvbXBhY3QgYXJyYXkgc29y
dC4iKTsKLSAgICB9Ci19OwotCi0KLXRlbXBsYXRlPEluZGV4aW5nVHlwZSBhcnJheUluZGV4aW5n
VHlwZSwgdHlwZW5hbWUgU3RvcmFnZVR5cGU+Ci12b2lkIEpTQXJyYXk6OnNvcnRDb21wYWN0ZWRW
ZWN0b3IoRXhlY1N0YXRlKiBleGVjLCBDb250aWd1b3VzRGF0YTxTdG9yYWdlVHlwZT4gZGF0YSwg
dW5zaWduZWQgcmVsZXZhbnRMZW5ndGgpCi17Ci0gICAgaWYgKCFyZWxldmFudExlbmd0aCkKLSAg
ICAgICAgcmV0dXJuOwotICAgIAotICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7Ci0KLSAgICAvLyBD
b252ZXJ0aW5nIEphdmFTY3JpcHQgdmFsdWVzIHRvIHN0cmluZ3MgY2FuIGJlIGV4cGVuc2l2ZSwg
c28gd2UgZG8gaXQgb25jZSB1cCBmcm9udCBhbmQgc29ydCBiYXNlZCBvbiB0aGF0LgotICAgIC8v
IFRoaXMgaXMgYSBjb25zaWRlcmFibGUgaW1wcm92ZW1lbnQgb3ZlciBkb2luZyBpdCB0d2ljZSBw
ZXIgY29tcGFyaXNvbiwgdGhvdWdoIGl0IHJlcXVpcmVzIGEgbGFyZ2UgdGVtcG9yYXJ5Ci0gICAg
Ly8gYnVmZmVyLiBCZXNpZGVzLCB0aGlzIHByb3RlY3RzIHVzIGZyb20gY3Jhc2hpbmcgaWYgc29t
ZSBvYmplY3RzIGhhdmUgY3VzdG9tIHRvU3RyaW5nIG1ldGhvZHMgdGhhdCByZXR1cm4KLSAgICAv
LyByYW5kb20gb3Igb3RoZXJ3aXNlIGNoYW5naW5nIHJlc3VsdHMsIGVmZmVjdGl2ZWx5IG1ha2lu
ZyBjb21wYXJlIGZ1bmN0aW9uIGluY29uc2lzdGVudC4KLSAgICAgICAgCi0gICAgVmVjdG9yPFZh
bHVlU3RyaW5nUGFpciwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IHZhbHVlcyhyZWxldmFudExl
bmd0aCk7Ci0gICAgaWYgKCF2YWx1ZXMuYmVnaW4oKSkgewotICAgICAgICB0aHJvd091dE9mTWVt
b3J5RXJyb3IoZXhlYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAgIEhl
YXA6OmhlYXAodGhpcyktPnB1c2hUZW1wU29ydFZlY3RvcigmdmFsdWVzKTsKLSAgICAgICAgCi0g
ICAgYm9vbCBpc1NvcnRpbmdQcmltaXRpdmVWYWx1ZXMgPSB0cnVlOwotCi0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCByZWxldmFudExlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEpTVmFsdWUgdmFs
dWUgPSBDb250aWd1b3VzVHlwZUFjY2Vzc29yPGFycmF5SW5kZXhpbmdUeXBlPjo6Z2V0QXNWYWx1
ZShkYXRhLCBpKTsKLSAgICAgICAgQVNTRVJUKGFycmF5SW5kZXhpbmdUeXBlICE9IEFycmF5V2l0
aEludDMyIHx8IHZhbHVlLmlzSW50MzIoKSk7Ci0gICAgICAgIEFTU0VSVCghdmFsdWUuaXNVbmRl
ZmluZWQoKSk7Ci0gICAgICAgIHZhbHVlc1tpXS5maXJzdCA9IHZhbHVlOwotICAgICAgICBpZiAo
YXJyYXlJbmRleGluZ1R5cGUgIT0gQXJyYXlXaXRoRG91YmxlICYmIGFycmF5SW5kZXhpbmdUeXBl
ICE9IEFycmF5V2l0aEludDMyKQotICAgICAgICAgICAgaXNTb3J0aW5nUHJpbWl0aXZlVmFsdWVz
ID0gaXNTb3J0aW5nUHJpbWl0aXZlVmFsdWVzICYmIHZhbHVlLmlzUHJpbWl0aXZlKCk7Ci0gICAg
fQotICAgICAgICAKLSAgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBsb29wIGNvbnRpbnVlcyB0
byBjYWxsIHRvU3RyaW5nIG9uIHN1YnNlcXVlbnQgdmFsdWVzIGV2ZW4gYWZ0ZXIKLSAgICAvLyBh
IHRvU3RyaW5nIGNhbGwgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgCi0gICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCByZWxldmFudExlbmd0aDsgaSsrKQotICAgICAgICB2YWx1ZXNbaV0u
c2Vjb25kID0gdmFsdWVzW2ldLmZpcnN0LnRvV1RGU3RyaW5nSW5saW5lKGV4ZWMpOwotICAgICAg
ICAKLSAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgSGVhcDo6aGVhcCh0
aGlzKS0+cG9wVGVtcFNvcnRWZWN0b3IoJnZhbHVlcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgICAgIAotICAgIC8vIEZJWE1FOiBTaW5jZSB3ZSBzb3J0IGJ5IHN0cmluZyB2YWx1ZSwg
YSBmYXN0IGFsZ29yaXRobSBtaWdodCBiZSB0byB1c2UgYSByYWRpeCBzb3J0LiBUaGF0IHdvdWxk
IGJlIE8oTikgcmF0aGVyCi0gICAgLy8gdGhhbiBPKE4gbG9nIE4pLgotICAgICAgICAKLSNpZiBI
QVZFKE1FUkdFU09SVCkKLSAgICBpZiAoaXNTb3J0aW5nUHJpbWl0aXZlVmFsdWVzKQotICAgICAg
ICBxc29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnNpemUoKSwgc2l6ZW9mKFZhbHVlU3RyaW5n
UGFpciksIGNvbXBhcmVCeVN0cmluZ1BhaXJGb3JRU29ydCk7Ci0gICAgZWxzZQotICAgICAgICBt
ZXJnZXNvcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5zaXplKCksIHNpemVvZihWYWx1ZVN0cmlu
Z1BhaXIpLCBjb21wYXJlQnlTdHJpbmdQYWlyRm9yUVNvcnQpOwotI2Vsc2UKLSAgICAvLyBGSVhN
RTogVGhlIHFzb3J0IGxpYnJhcnkgZnVuY3Rpb24gaXMgbGlrZWx5IHRvIG5vdCBiZSBhIHN0YWJs
ZSBzb3J0LgotICAgIC8vIEVDTUFTY3JpcHQtMjYyIGRvZXMgbm90IHNwZWNpZnkgYSBzdGFibGUg
c29ydCwgYnV0IGluIHByYWN0aWNlLCBicm93c2VycyBwZXJmb3JtIGEgc3RhYmxlIHNvcnQuCi0g
ICAgcXNvcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5zaXplKCksIHNpemVvZihWYWx1ZVN0cmlu
Z1BhaXIpLCBjb21wYXJlQnlTdHJpbmdQYWlyRm9yUVNvcnQpOwotI2VuZGlmCi0gICAgCi0gICAg
Ly8gSWYgdGhlIHRvU3RyaW5nIGZ1bmN0aW9uIGNoYW5nZWQgdGhlIGxlbmd0aCBvZiB0aGUgYXJy
YXkgb3IgdmVjdG9yIHN0b3JhZ2UsCi0gICAgLy8gaW5jcmVhc2UgdGhlIGxlbmd0aCB0byBoYW5k
bGUgdGhlIG9yaWduYWwgbnVtYmVyIG9mIGFjdHVhbCB2YWx1ZXMuCi0gICAgc3dpdGNoIChhcnJh
eUluZGV4aW5nVHlwZSkgewotICAgIGNhc2UgQXJyYXlXaXRoSW50MzI6Ci0gICAgY2FzZSBBcnJh
eVdpdGhEb3VibGU6Ci0gICAgY2FzZSBBcnJheVdpdGhDb250aWd1b3VzOgotICAgICAgICBlbnN1
cmVMZW5ndGgodm0sIHJlbGV2YW50TGVuZ3RoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAot
ICAgIGNhc2UgQXJyYXlXaXRoQXJyYXlTdG9yYWdlOgotICAgICAgICBpZiAoYXJyYXlTdG9yYWdl
KCktPnZlY3Rvckxlbmd0aCgpIDwgcmVsZXZhbnRMZW5ndGgpIHsKLSAgICAgICAgICAgIGluY3Jl
YXNlVmVjdG9yTGVuZ3RoKGV4ZWMtPnZtKCksIHJlbGV2YW50TGVuZ3RoKTsKLSAgICAgICAgICAg
IENvbnRpZ3VvdXNUeXBlQWNjZXNzb3I8YXJyYXlJbmRleGluZ1R5cGU+OjpyZXBsYWNlRGF0YVJl
ZmVyZW5jZSgmZGF0YSwgYXJyYXlTdG9yYWdlKCktPnZlY3RvcigpKTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoYXJyYXlTdG9yYWdlKCktPmxlbmd0aCgpIDwgcmVsZXZhbnRMZW5ndGgpCi0gICAg
ICAgICAgICBhcnJheVN0b3JhZ2UoKS0+c2V0TGVuZ3RoKHJlbGV2YW50TGVuZ3RoKTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIENSQVNIKCk7Ci0gICAg
fQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWxldmFudExlbmd0aDsgaSsrKQotICAg
ICAgICBDb250aWd1b3VzVHlwZUFjY2Vzc29yPGFycmF5SW5kZXhpbmdUeXBlPjo6c2V0V2l0aFZh
bHVlKHZtLCB0aGlzLCBkYXRhLCBpLCB2YWx1ZXNbaV0uZmlyc3QpOwotICAgIAotICAgIEhlYXA6
OmhlYXAodGhpcyktPnBvcFRlbXBTb3J0VmVjdG9yKCZ2YWx1ZXMpOwotfQotCi12b2lkIEpTQXJy
YXk6OnNvcnQoRXhlY1N0YXRlKiBleGVjKQotewotICAgIEFTU0VSVCghaW5TcGFyc2VJbmRleGlu
Z01vZGUoKSk7Ci0gICAgCi0gICAgc3dpdGNoIChpbmRleGluZ1R5cGUoKSkgewotICAgIGNhc2Ug
QXJyYXlDbGFzczoKLSAgICBjYXNlIEFycmF5V2l0aFVuZGVjaWRlZDoKLSAgICAgICAgcmV0dXJu
OwotICAgICAgICAKLSAgICBjYXNlIEFycmF5V2l0aEludDMyOiB7Ci0gICAgICAgIHVuc2lnbmVk
IGxlbmd0aE5vdEluY2x1ZGluZ1VuZGVmaW5lZDsKLSAgICAgICAgdW5zaWduZWQgbmV3UmVsZXZh
bnRMZW5ndGg7Ci0gICAgICAgIGNvbXBhY3RGb3JTb3J0aW5nPEFycmF5V2l0aEludDMyPigKLSAg
ICAgICAgICAgIGxlbmd0aE5vdEluY2x1ZGluZ1VuZGVmaW5lZCwgbmV3UmVsZXZhbnRMZW5ndGgp
OwotICAgICAgICAKLSAgICAgICAgc29ydENvbXBhY3RlZFZlY3RvcjxBcnJheVdpdGhJbnQzMj4o
Ci0gICAgICAgICAgICBleGVjLCBtX2J1dHRlcmZseS0+Y29udGlndW91c0ludDMyKCksIGxlbmd0
aE5vdEluY2x1ZGluZ1VuZGVmaW5lZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAg
IAotICAgIGNhc2UgQXJyYXlXaXRoRG91YmxlOiB7Ci0gICAgICAgIHVuc2lnbmVkIGxlbmd0aE5v
dEluY2x1ZGluZ1VuZGVmaW5lZDsKLSAgICAgICAgdW5zaWduZWQgbmV3UmVsZXZhbnRMZW5ndGg7
Ci0gICAgICAgIGNvbXBhY3RGb3JTb3J0aW5nPEFycmF5V2l0aERvdWJsZT4oCi0gICAgICAgICAg
ICBsZW5ndGhOb3RJbmNsdWRpbmdVbmRlZmluZWQsIG5ld1JlbGV2YW50TGVuZ3RoKTsKLSAgICAg
ICAgCi0gICAgICAgIHNvcnRDb21wYWN0ZWRWZWN0b3I8QXJyYXlXaXRoRG91YmxlPigKLSAgICAg
ICAgICAgIGV4ZWMsIG1fYnV0dGVyZmx5LT5jb250aWd1b3VzRG91YmxlKCksIGxlbmd0aE5vdElu
Y2x1ZGluZ1VuZGVmaW5lZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAg
IGNhc2UgQXJyYXlXaXRoQ29udGlndW91czogewotICAgICAgICB1bnNpZ25lZCBsZW5ndGhOb3RJ
bmNsdWRpbmdVbmRlZmluZWQ7Ci0gICAgICAgIHVuc2lnbmVkIG5ld1JlbGV2YW50TGVuZ3RoOwot
ICAgICAgICBjb21wYWN0Rm9yU29ydGluZzxBcnJheVdpdGhDb250aWd1b3VzPigKLSAgICAgICAg
ICAgIGxlbmd0aE5vdEluY2x1ZGluZ1VuZGVmaW5lZCwgbmV3UmVsZXZhbnRMZW5ndGgpOwotICAg
ICAgICAKLSAgICAgICAgc29ydENvbXBhY3RlZFZlY3RvcjxBcnJheVdpdGhDb250aWd1b3VzPigK
LSAgICAgICAgICAgIGV4ZWMsIG1fYnV0dGVyZmx5LT5jb250aWd1b3VzKCksIGxlbmd0aE5vdElu
Y2x1ZGluZ1VuZGVmaW5lZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAg
IGNhc2UgQXJyYXlXaXRoQXJyYXlTdG9yYWdlOiB7Ci0gICAgICAgIHVuc2lnbmVkIGxlbmd0aE5v
dEluY2x1ZGluZ1VuZGVmaW5lZDsKLSAgICAgICAgdW5zaWduZWQgbmV3UmVsZXZhbnRMZW5ndGg7
Ci0gICAgICAgIGNvbXBhY3RGb3JTb3J0aW5nPEFycmF5V2l0aEFycmF5U3RvcmFnZT4oCi0gICAg
ICAgICAgICBsZW5ndGhOb3RJbmNsdWRpbmdVbmRlZmluZWQsIG5ld1JlbGV2YW50TGVuZ3RoKTsK
LSAgICAgICAgQXJyYXlTdG9yYWdlKiBzdG9yYWdlID0gbV9idXR0ZXJmbHktPmFycmF5U3RvcmFn
ZSgpOwotICAgICAgICBBU1NFUlQoIXN0b3JhZ2UtPm1fc3BhcnNlTWFwKTsKLSAgICAgICAgCi0g
ICAgICAgIHNvcnRDb21wYWN0ZWRWZWN0b3I8QXJyYXlXaXRoQXJyYXlTdG9yYWdlPihleGVjLCBz
dG9yYWdlLT52ZWN0b3IoKSwgbGVuZ3RoTm90SW5jbHVkaW5nVW5kZWZpbmVkKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci19Ci0KLXN0cnVjdCBBVkxUcmVlTm9kZUZvckFy
cmF5Q29tcGFyZSB7Ci0gICAgSlNWYWx1ZSB2YWx1ZTsKLQotICAgIC8vIENoaWxkIHBvaW50ZXJz
LiAgVGhlIGhpZ2ggYml0IG9mIGd0IGlzIHJvYmJlZCBhbmQgdXNlZCBhcyB0aGUKLSAgICAvLyBi
YWxhbmNlIGZhY3RvciBzaWduLiAgVGhlIGhpZ2ggYml0IG9mIGx0IGlzIHJvYmJlZCBhbmQgdXNl
ZCBhcwotICAgIC8vIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGJhbGFuY2UgZmFjdG9yLgotICAgIGlu
dDMyX3QgZ3Q7Ci0gICAgaW50MzJfdCBsdDsKLX07Ci0KLXN0cnVjdCBBVkxUcmVlQWJzdHJhY3Rv
ckZvckFycmF5Q29tcGFyZSB7Ci0gICAgdHlwZWRlZiBpbnQzMl90IGhhbmRsZTsgLy8gSGFuZGxl
IGlzIGFuIGluZGV4IGludG8gbV9ub2RlcyB2ZWN0b3IuCi0gICAgdHlwZWRlZiBKU1ZhbHVlIGtl
eTsKLSAgICB0eXBlZGVmIGludDMyX3Qgc2l6ZTsKLQotICAgIFZlY3RvcjxBVkxUcmVlTm9kZUZv
ckFycmF5Q29tcGFyZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbm9kZXM7Ci0gICAgRXhl
Y1N0YXRlKiBtX2V4ZWM7Ci0gICAgSlNWYWx1ZSBtX2NvbXBhcmVGdW5jdGlvbjsKLSAgICBDYWxs
VHlwZSBtX2NvbXBhcmVDYWxsVHlwZTsKLSAgICBjb25zdCBDYWxsRGF0YSogbV9jb21wYXJlQ2Fs
bERhdGE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENhY2hlZENhbGw+IG1fY2FjaGVkQ2FsbDsKLQot
ICAgIGhhbmRsZSBnZXRfbGVzcyhoYW5kbGUgaCkgeyByZXR1cm4gbV9ub2Rlc1toXS5sdCAmIDB4
N0ZGRkZGRkY7IH0KLSAgICB2b2lkIHNldF9sZXNzKGhhbmRsZSBoLCBoYW5kbGUgbGgpIHsgbV9u
b2Rlc1toXS5sdCAmPSAweDgwMDAwMDAwOyBtX25vZGVzW2hdLmx0IHw9IGxoOyB9Ci0gICAgaGFu
ZGxlIGdldF9ncmVhdGVyKGhhbmRsZSBoKSB7IHJldHVybiBtX25vZGVzW2hdLmd0ICYgMHg3RkZG
RkZGRjsgfQotICAgIHZvaWQgc2V0X2dyZWF0ZXIoaGFuZGxlIGgsIGhhbmRsZSBnaCkgeyBtX25v
ZGVzW2hdLmd0ICY9IDB4ODAwMDAwMDA7IG1fbm9kZXNbaF0uZ3QgfD0gZ2g7IH0KLQotICAgIGlu
dCBnZXRfYmFsYW5jZV9mYWN0b3IoaGFuZGxlIGgpCi0gICAgewotICAgICAgICBpZiAobV9ub2Rl
c1toXS5ndCAmIDB4ODAwMDAwMDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obV9ub2Rlc1toXS5sdCkgPj4gMzE7Ci0gICAgfQot
Ci0gICAgdm9pZCBzZXRfYmFsYW5jZV9mYWN0b3IoaGFuZGxlIGgsIGludCBiZikKLSAgICB7Ci0g
ICAgICAgIGlmIChiZiA9PSAwKSB7Ci0gICAgICAgICAgICBtX25vZGVzW2hdLmx0ICY9IDB4N0ZG
RkZGRkY7Ci0gICAgICAgICAgICBtX25vZGVzW2hdLmd0ICY9IDB4N0ZGRkZGRkY7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBtX25vZGVzW2hdLmx0IHw9IDB4ODAwMDAwMDA7Ci0gICAg
ICAgICAgICBpZiAoYmYgPCAwKQotICAgICAgICAgICAgICAgIG1fbm9kZXNbaF0uZ3QgfD0gMHg4
MDAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX25vZGVzW2hdLmd0
ICY9IDB4N0ZGRkZGRkY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZV9rZXlf
a2V5KGtleSB2YSwga2V5IHZiKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCF2YS5pc1VuZGVmaW5l
ZCgpKTsKLSAgICAgICAgQVNTRVJUKCF2Yi5pc1VuZGVmaW5lZCgpKTsKLQotICAgICAgICBpZiAo
bV9leGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAg
IGRvdWJsZSBjb21wYXJlUmVzdWx0OwotICAgICAgICBpZiAobV9jYWNoZWRDYWxsKSB7Ci0gICAg
ICAgICAgICBtX2NhY2hlZENhbGwtPnNldFRoaXMoanNVbmRlZmluZWQoKSk7Ci0gICAgICAgICAg
ICBtX2NhY2hlZENhbGwtPnNldEFyZ3VtZW50KDAsIHZhKTsKLSAgICAgICAgICAgIG1fY2FjaGVk
Q2FsbC0+c2V0QXJndW1lbnQoMSwgdmIpOwotICAgICAgICAgICAgY29tcGFyZVJlc3VsdCA9IG1f
Y2FjaGVkQ2FsbC0+Y2FsbCgpLnRvTnVtYmVyKG1fZXhlYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBNYXJrZWRBcmd1bWVudEJ1ZmZlciBhcmd1bWVudHM7Ci0gICAgICAgICAgICBh
cmd1bWVudHMuYXBwZW5kKHZhKTsKLSAgICAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQodmIpOwot
ICAgICAgICAgICAgY29tcGFyZVJlc3VsdCA9IGNhbGwobV9leGVjLCBtX2NvbXBhcmVGdW5jdGlv
biwgbV9jb21wYXJlQ2FsbFR5cGUsICptX2NvbXBhcmVDYWxsRGF0YSwganNVbmRlZmluZWQoKSwg
YXJndW1lbnRzKS50b051bWJlcihtX2V4ZWMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAo
Y29tcGFyZVJlc3VsdCA8IDApID8gLTEgOiAxOyAvLyBOb3QgcGFzc2luZyBlcXVhbGl0eSB0aHJv
dWdoLCBiZWNhdXNlIHdlIG5lZWQgdG8gc3RvcmUgYWxsIHZhbHVlcywgZXZlbiBpZiBlcXVpdmFs
ZW50LgotICAgIH0KLQotICAgIGludCBjb21wYXJlX2tleV9ub2RlKGtleSBrLCBoYW5kbGUgaCkg
eyByZXR1cm4gY29tcGFyZV9rZXlfa2V5KGssIG1fbm9kZXNbaF0udmFsdWUpOyB9Ci0gICAgaW50
IGNvbXBhcmVfbm9kZV9ub2RlKGhhbmRsZSBoMSwgaGFuZGxlIGgyKSB7IHJldHVybiBjb21wYXJl
X2tleV9rZXkobV9ub2Rlc1toMV0udmFsdWUsIG1fbm9kZXNbaDJdLnZhbHVlKTsgfQotCi0gICAg
c3RhdGljIGhhbmRsZSBudWxsKCkgeyByZXR1cm4gMHg3RkZGRkZGRjsgfQotfTsKLQotdGVtcGxh
dGU8SW5kZXhpbmdUeXBlIGFycmF5SW5kZXhpbmdUeXBlPgotdm9pZCBKU0FycmF5Ojpzb3J0VmVj
dG9yKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBjb21wYXJlRnVuY3Rpb24sIENhbGxUeXBlIGNh
bGxUeXBlLCBjb25zdCBDYWxsRGF0YSYgY2FsbERhdGEpCi17Ci0gICAgQVNTRVJUKCFpblNwYXJz
ZUluZGV4aW5nTW9kZSgpKTsKLSAgICBBU1NFUlQoYXJyYXlJbmRleGluZ1R5cGUgPT0gaW5kZXhp
bmdUeXBlKCkpOwotICAgIAotICAgIC8vIEZJWE1FOiBUaGlzIGlnbm9yZXMgZXhjZXB0aW9ucyBy
YWlzZWQgaW4gdGhlIGNvbXBhcmUgZnVuY3Rpb24gb3IgaW4gdG9OdW1iZXIuCi0gICAgICAgIAot
ICAgIC8vIFRoZSBtYXhpbXVtIHRyZWUgZGVwdGggaXMgY29tcGlsZWQgaW4gLSBidXQgdGhlIGNh
bGxlciBpcyBjbGVhcmx5IHVwIHRvIG5vIGdvb2QKLSAgICAvLyBpZiBhIGxhcmdlciBhcnJheSBp
cyBwYXNzZWQuCi0gICAgQVNTRVJUKG1fYnV0dGVyZmx5LT5wdWJsaWNMZW5ndGgoKSA8PSBzdGF0
aWNfY2FzdDx1bnNpZ25lZD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkpOwotICAg
IGlmIChtX2J1dHRlcmZseS0+cHVibGljTGVuZ3RoKCkgPiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
c3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkpCi0gICAgICAgIHJldHVybjsKLSAgICAg
ICAgCi0gICAgdW5zaWduZWQgdXNlZFZlY3Rvckxlbmd0aCA9IHJlbGV2YW50TGVuZ3RoPGFycmF5
SW5kZXhpbmdUeXBlPigpOwotICAgIHVuc2lnbmVkIG5vZGVDb3VudCA9IHVzZWRWZWN0b3JMZW5n
dGg7Ci0gICAgICAgIAotICAgIGlmICghbm9kZUNvdW50KQotICAgICAgICByZXR1cm47Ci0gICAg
ICAgIAotICAgIEFWTFRyZWU8QVZMVHJlZUFic3RyYWN0b3JGb3JBcnJheUNvbXBhcmUsIDQ0PiB0
cmVlOyAvLyBEZXB0aCA0NCBpcyBlbm91Z2ggZm9yIDJeMzEgaXRlbXMKLSAgICB0cmVlLmFic3Ry
YWN0b3IoKS5tX2V4ZWMgPSBleGVjOwotICAgIHRyZWUuYWJzdHJhY3RvcigpLm1fY29tcGFyZUZ1
bmN0aW9uID0gY29tcGFyZUZ1bmN0aW9uOwotICAgIHRyZWUuYWJzdHJhY3RvcigpLm1fY29tcGFy
ZUNhbGxUeXBlID0gY2FsbFR5cGU7Ci0gICAgdHJlZS5hYnN0cmFjdG9yKCkubV9jb21wYXJlQ2Fs
bERhdGEgPSAmY2FsbERhdGE7Ci0gICAgdHJlZS5hYnN0cmFjdG9yKCkubV9ub2Rlcy5ncm93KG5v
ZGVDb3VudCk7Ci0KLSAgICBpZiAoY2FsbFR5cGUgPT0gQ2FsbFR5cGVKUykKLSAgICAgICAgdHJl
ZS5hYnN0cmFjdG9yKCkubV9jYWNoZWRDYWxsID0gc3RkOjptYWtlX3VuaXF1ZTxDYWNoZWRDYWxs
PihleGVjLCBqc0Nhc3Q8SlNGdW5jdGlvbio+KGNvbXBhcmVGdW5jdGlvbiksIDIpOwotCi0gICAg
aWYgKCF0cmVlLmFic3RyYWN0b3IoKS5tX25vZGVzLmJlZ2luKCkpIHsKLSAgICAgICAgdGhyb3dP
dXRPZk1lbW9yeUVycm9yKGV4ZWMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAK
LSAgICAvLyBGSVhNRTogSWYgdGhlIGNvbXBhcmUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIGFycmF5
LCB0aGUgdmVjdG9yLCBtYXAsIGV0Yy4gY291bGQgYmUgbW9kaWZpZWQKLSAgICAvLyByaWdodCBv
dXQgZnJvbSB1bmRlciB1cyB3aGlsZSB3ZSdyZSBidWlsZGluZyB0aGUgdHJlZSBoZXJlLgotICAg
ICAgICAKLSAgICB1bnNpZ25lZCBudW1EZWZpbmVkID0gMDsKLSAgICB1bnNpZ25lZCBudW1VbmRl
ZmluZWQgPSAwOwotICAgIAotICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYXJyYXksIGlnbm9yaW5n
IG1pc3NpbmcgdmFsdWVzLCBjb3VudGluZyB1bmRlZmluZWQgb25lcywgYW5kIGluc2VydGluZyBh
bGwgb3RoZXIgb25lcyBpbnRvIHRoZSB0cmVlLgotICAgIGZvciAoOyBudW1EZWZpbmVkIDwgdXNl
ZFZlY3Rvckxlbmd0aDsgKytudW1EZWZpbmVkKSB7Ci0gICAgICAgIGlmIChudW1EZWZpbmVkID49
IG1fYnV0dGVyZmx5LT52ZWN0b3JMZW5ndGgoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBKU1ZhbHVlIHYgPSBnZXRIb2x5SW5kZXhRdWlja2x5KG51bURlZmluZWQpOwotICAgICAgICBp
ZiAoIXYgfHwgdi5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRy
ZWUuYWJzdHJhY3RvcigpLm1fbm9kZXNbbnVtRGVmaW5lZF0udmFsdWUgPSB2OwotICAgICAgICB0
cmVlLmluc2VydChudW1EZWZpbmVkKTsKLSAgICB9Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gbnVt
RGVmaW5lZDsgaSA8IHVzZWRWZWN0b3JMZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoaSA+PSBt
X2J1dHRlcmZseS0+dmVjdG9yTGVuZ3RoKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
SlNWYWx1ZSB2ID0gZ2V0SG9seUluZGV4UXVpY2tseShpKTsKLSAgICAgICAgaWYgKHYpIHsKLSAg
ICAgICAgICAgIGlmICh2LmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgKytudW1VbmRl
ZmluZWQ7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmVlLmFic3RyYWN0
b3IoKS5tX25vZGVzW251bURlZmluZWRdLnZhbHVlID0gdjsKLSAgICAgICAgICAgICAgICB0cmVl
Lmluc2VydChudW1EZWZpbmVkKTsKLSAgICAgICAgICAgICAgICArK251bURlZmluZWQ7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdW5zaWduZWQgbmV3VXNlZFZl
Y3Rvckxlbmd0aCA9IG51bURlZmluZWQgKyBudW1VbmRlZmluZWQ7Ci0gICAgICAgIAotICAgIC8v
IFRoZSBhcnJheSBzaXplIG1heSBoYXZlIGNoYW5nZWQuIEZpZ3VyZSBvdXQgdGhlIG5ldyBib3Vu
ZHMuCi0gICAgdW5zaWduZWQgbmV3ZXN0VXNlZFZlY3Rvckxlbmd0aCA9IGN1cnJlbnRSZWxldmFu
dExlbmd0aCgpOwotICAgICAgICAKLSAgICB1bnNpZ25lZCBlbGVtZW50c1RvRXh0cmFjdFRocmVz
aG9sZCA9IG1pbihtaW4obmV3ZXN0VXNlZFZlY3Rvckxlbmd0aCwgbnVtRGVmaW5lZCksIHN0YXRp
Y19jYXN0PHVuc2lnbmVkPih0cmVlLmFic3RyYWN0b3IoKS5tX25vZGVzLnNpemUoKSkpOwotICAg
IHVuc2lnbmVkIHVuZGVmaW5lZEVsZW1lbnRzVGhyZXNob2xkID0gbWluKG5ld2VzdFVzZWRWZWN0
b3JMZW5ndGgsIG5ld1VzZWRWZWN0b3JMZW5ndGgpOwotICAgIHVuc2lnbmVkIGNsZWFyRWxlbWVu
dHNUaHJlc2hvbGQgPSBtaW4obmV3ZXN0VXNlZFZlY3Rvckxlbmd0aCwgdXNlZFZlY3Rvckxlbmd0
aCk7Ci0gICAgICAgIAotICAgIC8vIENvcHkgdGhlIHZhbHVlcyBiYWNrIGludG8gbV9zdG9yYWdl
LgotICAgIEFWTFRyZWU8QVZMVHJlZUFic3RyYWN0b3JGb3JBcnJheUNvbXBhcmUsIDQ0Pjo6SXRl
cmF0b3IgaXRlcjsKLSAgICBpdGVyLnN0YXJ0X2l0ZXJfbGVhc3QodHJlZSk7Ci0gICAgVk0mIHZt
ID0gZXhlYy0+dm0oKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZWxlbWVudHNUb0V4
dHJhY3RUaHJlc2hvbGQ7ICsraSkgewotICAgICAgICBBU1NFUlQoaSA8IGJ1dHRlcmZseSgpLT52
ZWN0b3JMZW5ndGgoKSk7Ci0gICAgICAgIGlmIChpbmRleGluZ1R5cGUoKSA9PSBBcnJheVdpdGhE
b3VibGUpCi0gICAgICAgICAgICBidXR0ZXJmbHkoKS0+Y29udGlndW91c0RvdWJsZSgpW2ldID0g
dHJlZS5hYnN0cmFjdG9yKCkubV9ub2Rlc1sqaXRlcl0udmFsdWUuYXNOdW1iZXIoKTsKLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgY3VycmVudEluZGV4aW5nRGF0YSgpW2ldLnNldCh2bSwgdGhp
cywgdHJlZS5hYnN0cmFjdG9yKCkubV9ub2Rlc1sqaXRlcl0udmFsdWUpOwotICAgICAgICArK2l0
ZXI7Ci0gICAgfQotICAgIC8vIFB1dCB1bmRlZmluZWQgdmFsdWVzIGJhY2sgaW4uCi0gICAgc3dp
dGNoIChpbmRleGluZ1R5cGUoKSkgewotICAgIGNhc2UgQXJyYXlXaXRoSW50MzI6Ci0gICAgY2Fz
ZSBBcnJheVdpdGhEb3VibGU6Ci0gICAgICAgIEFTU0VSVChlbGVtZW50c1RvRXh0cmFjdFRocmVz
aG9sZCA9PSB1bmRlZmluZWRFbGVtZW50c1RocmVzaG9sZCk7Ci0gICAgICAgIGJyZWFrOwotICAg
ICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBlbGVtZW50c1Rv
RXh0cmFjdFRocmVzaG9sZDsgaSA8IHVuZGVmaW5lZEVsZW1lbnRzVGhyZXNob2xkOyArK2kpIHsK
LSAgICAgICAgICAgIEFTU0VSVChpIDwgYnV0dGVyZmx5KCktPnZlY3Rvckxlbmd0aCgpKTsKLSAg
ICAgICAgICAgIGN1cnJlbnRJbmRleGluZ0RhdGEoKVtpXS5zZXRVbmRlZmluZWQoKTsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIC8vIEVuc3VyZSB0aGF0IHVudXNlZCB2YWx1ZXMgaW4gdGhlIHZl
Y3RvciBhcmUgemVyb2VkIG91dC4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSB1bmRlZmluZWRFbGVt
ZW50c1RocmVzaG9sZDsgaSA8IGNsZWFyRWxlbWVudHNUaHJlc2hvbGQ7ICsraSkgewotICAgICAg
ICBBU1NFUlQoaSA8IGJ1dHRlcmZseSgpLT52ZWN0b3JMZW5ndGgoKSk7Ci0gICAgICAgIGlmIChp
bmRleGluZ1R5cGUoKSA9PSBBcnJheVdpdGhEb3VibGUpCi0gICAgICAgICAgICBidXR0ZXJmbHko
KS0+Y29udGlndW91c0RvdWJsZSgpW2ldID0gUE5hTjsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgY3VycmVudEluZGV4aW5nRGF0YSgpW2ldLmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIGlm
IChoYXNBbnlBcnJheVN0b3JhZ2UoaW5kZXhpbmdUeXBlKCkpKQotICAgICAgICBhcnJheVN0b3Jh
Z2UoKS0+bV9udW1WYWx1ZXNJblZlY3RvciA9IG5ld1VzZWRWZWN0b3JMZW5ndGg7Ci19Ci0KLXZv
aWQgSlNBcnJheTo6c29ydChFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgY29tcGFyZUZ1bmN0aW9u
LCBDYWxsVHlwZSBjYWxsVHlwZSwgY29uc3QgQ2FsbERhdGEmIGNhbGxEYXRhKQotewotICAgIEFT
U0VSVCghaW5TcGFyc2VJbmRleGluZ01vZGUoKSk7Ci0gICAgCi0gICAgc3dpdGNoIChpbmRleGlu
Z1R5cGUoKSkgewotICAgIGNhc2UgQXJyYXlDbGFzczoKLSAgICBjYXNlIEFycmF5V2l0aFVuZGVj
aWRlZDoKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBjYXNlIEFycmF5V2l0aEludDMy
OgotICAgICAgICBzb3J0VmVjdG9yPEFycmF5V2l0aEludDMyPihleGVjLCBjb21wYXJlRnVuY3Rp
b24sIGNhbGxUeXBlLCBjYWxsRGF0YSk7Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNhc2UgQXJy
YXlXaXRoRG91YmxlOgotICAgICAgICBzb3J0VmVjdG9yPEFycmF5V2l0aERvdWJsZT4oZXhlYywg
Y29tcGFyZUZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEpOwotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYXNlIEFycmF5V2l0aENvbnRpZ3VvdXM6Ci0gICAgICAgIHNvcnRWZWN0b3I8QXJyYXlX
aXRoQ29udGlndW91cz4oZXhlYywgY29tcGFyZUZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEp
OwotICAgICAgICByZXR1cm47Ci0KLSAgICBjYXNlIEFycmF5V2l0aEFycmF5U3RvcmFnZToKLSAg
ICAgICAgc29ydFZlY3RvcjxBcnJheVdpdGhBcnJheVN0b3JhZ2U+KGV4ZWMsIGNvbXBhcmVGdW5j
dGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAg
ICBkZWZhdWx0OgotICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0K
LX0KLQogdm9pZCBKU0FycmF5OjpmaWxsQXJnTGlzdChFeGVjU3RhdGUqIGV4ZWMsIE1hcmtlZEFy
Z3VtZW50QnVmZmVyJiBhcmdzKQogewogICAgIHVuc2lnbmVkIGkgPSAwOwpAQCAtMTYzOSw5NSAr
MTEyMyw0IEBAIHZvaWQgSlNBcnJheTo6Y29weVRvQXJndW1lbnRzKEV4ZWNTdGF0ZSoKICAgICB9
CiB9CiAKLXRlbXBsYXRlPEluZGV4aW5nVHlwZSBhcnJheUluZGV4aW5nVHlwZT4KLXZvaWQgSlNB
cnJheTo6Y29tcGFjdEZvclNvcnRpbmcodW5zaWduZWQmIG51bURlZmluZWQsIHVuc2lnbmVkJiBu
ZXdSZWxldmFudExlbmd0aCkKLXsKLSAgICBBU1NFUlQoIWluU3BhcnNlSW5kZXhpbmdNb2RlKCkp
OwotICAgIEFTU0VSVChhcnJheUluZGV4aW5nVHlwZSA9PSBpbmRleGluZ1R5cGUoKSk7Ci0KLSAg
ICB1bnNpZ25lZCBteVJlbGV2YW50TGVuZ3RoID0gcmVsZXZhbnRMZW5ndGg8YXJyYXlJbmRleGlu
Z1R5cGU+KCk7Ci0gICAgCi0gICAgbnVtRGVmaW5lZCA9IDA7Ci0gICAgdW5zaWduZWQgbnVtVW5k
ZWZpbmVkID0gMDsKLSAgICAgICAgCi0gICAgZm9yICg7IG51bURlZmluZWQgPCBteVJlbGV2YW50
TGVuZ3RoOyArK251bURlZmluZWQpIHsKLSAgICAgICAgQVNTRVJUKG51bURlZmluZWQgPCBtX2J1
dHRlcmZseS0+dmVjdG9yTGVuZ3RoKCkpOwotICAgICAgICBpZiAoYXJyYXlJbmRleGluZ1R5cGUg
PT0gQXJyYXlXaXRoSW50MzIpIHsKLSAgICAgICAgICAgIEpTVmFsdWUgdiA9IG1fYnV0dGVyZmx5
LT5jb250aWd1b3VzSW50MzIoKVtudW1EZWZpbmVkXS5nZXQoKTsKLSAgICAgICAgICAgIGlmICgh
dikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIEFTU0VSVCh2LmlzSW50MzIo
KSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJyYXlJ
bmRleGluZ1R5cGUgPT0gQXJyYXlXaXRoRG91YmxlKSB7Ci0gICAgICAgICAgICBkb3VibGUgdiA9
IG1fYnV0dGVyZmx5LT5jb250aWd1b3VzRG91YmxlKClbbnVtRGVmaW5lZF07Ci0gICAgICAgICAg
ICBpZiAodiAhPSB2KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgIH0KLSAgICAgICAgSlNWYWx1ZSB2ID0gaW5kZXhpbmdEYXRhPGFycmF5SW5k
ZXhpbmdUeXBlPigpW251bURlZmluZWRdLmdldCgpOwotICAgICAgICBpZiAoIXYgfHwgdi5pc1Vu
ZGVmaW5lZCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSBudW1EZWZpbmVkOyBpIDwgbXlSZWxldmFudExlbmd0aDsgKytpKSB7Ci0g
ICAgICAgIEFTU0VSVChpIDwgbV9idXR0ZXJmbHktPnZlY3Rvckxlbmd0aCgpKTsKLSAgICAgICAg
aWYgKGFycmF5SW5kZXhpbmdUeXBlID09IEFycmF5V2l0aEludDMyKSB7Ci0gICAgICAgICAgICBK
U1ZhbHVlIHYgPSBtX2J1dHRlcmZseS0+Y29udGlndW91c0ludDMyKClbaV0uZ2V0KCk7Ci0gICAg
ICAgICAgICBpZiAoIXYpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBB
U1NFUlQodi5pc0ludDMyKCkpOwotICAgICAgICAgICAgQVNTRVJUKG51bURlZmluZWQgPCBtX2J1
dHRlcmZseS0+dmVjdG9yTGVuZ3RoKCkpOwotICAgICAgICAgICAgbV9idXR0ZXJmbHktPmNvbnRp
Z3VvdXNJbnQzMigpW251bURlZmluZWQrK10uc2V0V2l0aG91dFdyaXRlQmFycmllcih2KTsKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcnJheUluZGV4aW5n
VHlwZSA9PSBBcnJheVdpdGhEb3VibGUpIHsKLSAgICAgICAgICAgIGRvdWJsZSB2ID0gbV9idXR0
ZXJmbHktPmNvbnRpZ3VvdXNEb3VibGUoKVtpXTsKLSAgICAgICAgICAgIGlmICh2ICE9IHYpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBBU1NFUlQobnVtRGVmaW5lZCA8
IG1fYnV0dGVyZmx5LT52ZWN0b3JMZW5ndGgoKSk7Ci0gICAgICAgICAgICBtX2J1dHRlcmZseS0+
Y29udGlndW91c0RvdWJsZSgpW251bURlZmluZWQrK10gPSB2OwotICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgIH0KLSAgICAgICAgSlNWYWx1ZSB2ID0gaW5kZXhpbmdEYXRhPGFycmF5SW5k
ZXhpbmdUeXBlPigpW2ldLmdldCgpOwotICAgICAgICBpZiAodikgewotICAgICAgICAgICAgaWYg
KHYuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICArK251bVVuZGVmaW5lZDsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEFTU0VSVChudW1EZWZpbmVkIDwgbV9idXR0
ZXJmbHktPnZlY3Rvckxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBpbmRleGluZ0RhdGE8YXJy
YXlJbmRleGluZ1R5cGU+KClbbnVtRGVmaW5lZCsrXS5zZXRXaXRob3V0V3JpdGVCYXJyaWVyKHYp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBuZXdSZWxl
dmFudExlbmd0aCA9IG51bURlZmluZWQgKyBudW1VbmRlZmluZWQ7Ci0gICAgCi0gICAgaWYgKGhh
c0FueUFycmF5U3RvcmFnZShhcnJheUluZGV4aW5nVHlwZSkpCi0gICAgICAgIFJFTEVBU0VfQVNT
RVJUKCFhcnJheVN0b3JhZ2UoKS0+bV9zcGFyc2VNYXApOwotICAgIAotICAgIHN3aXRjaCAoYXJy
YXlJbmRleGluZ1R5cGUpIHsKLSAgICBjYXNlIEFycmF5V2l0aEludDMyOgotICAgIGNhc2UgQXJy
YXlXaXRoRG91YmxlOgotICAgICAgICBSRUxFQVNFX0FTU0VSVChudW1EZWZpbmVkID09IG5ld1Jl
bGV2YW50TGVuZ3RoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IG51bURlZmluZWQ7IGkgPCBuZXdSZWxldmFudExlbmd0
aDsgKytpKSB7Ci0gICAgICAgICAgICBBU1NFUlQoaSA8IG1fYnV0dGVyZmx5LT52ZWN0b3JMZW5n
dGgoKSk7Ci0gICAgICAgICAgICBpbmRleGluZ0RhdGE8YXJyYXlJbmRleGluZ1R5cGU+KClbaV0u
c2V0VW5kZWZpbmVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGZv
ciAodW5zaWduZWQgaSA9IG5ld1JlbGV2YW50TGVuZ3RoOyBpIDwgbXlSZWxldmFudExlbmd0aDsg
KytpKSB7Ci0gICAgICAgIEFTU0VSVChpIDwgbV9idXR0ZXJmbHktPnZlY3Rvckxlbmd0aCgpKTsK
LSAgICAgICAgaWYgKGFycmF5SW5kZXhpbmdUeXBlID09IEFycmF5V2l0aERvdWJsZSkKLSAgICAg
ICAgICAgIG1fYnV0dGVyZmx5LT5jb250aWd1b3VzRG91YmxlKClbaV0gPSBQTmFOOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBpbmRleGluZ0RhdGE8YXJyYXlJbmRleGluZ1R5cGU+KClbaV0u
Y2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzQW55QXJyYXlTdG9yYWdlKGFycmF5SW5kZXhp
bmdUeXBlKSkKLSAgICAgICAgYXJyYXlTdG9yYWdlKCktPm1fbnVtVmFsdWVzSW5WZWN0b3IgPSBu
ZXdSZWxldmFudExlbmd0aDsKLX0KLQogfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0FycmF5LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5oCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0FycmF5LmgJKHdvcmtpbmcgY29weSkKQEAgLTcw
LDEwICs3MCw2IEBAIHB1YmxpYzoKICAgICAvLyBPSyB0byB1c2Ugb24gbmV3IGFycmF5cywgYnV0
IG5vdCBpZiBpdCBtaWdodCBiZSBhIFJlZ0V4cE1hdGNoQXJyYXkuCiAgICAgSlNfRVhQT1JUX1BS
SVZBVEUgYm9vbCBzZXRMZW5ndGgoRXhlY1N0YXRlKiwgdW5zaWduZWQsIGJvb2wgdGhyb3dFeGNl
cHRpb24gPSBmYWxzZSk7CiAKLSAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIHNvcnQoRXhlY1N0
YXRlKik7Ci0gICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBzb3J0KEV4ZWNTdGF0ZSosIEpTVmFs
dWUgY29tcGFyZUZ1bmN0aW9uLCBDYWxsVHlwZSwgY29uc3QgQ2FsbERhdGEmKTsKLSAgICBKU19F
WFBPUlRfUFJJVkFURSB2b2lkIHNvcnROdW1lcmljKEV4ZWNTdGF0ZSosIEpTVmFsdWUgY29tcGFy
ZUZ1bmN0aW9uLCBDYWxsVHlwZSwgY29uc3QgQ2FsbERhdGEmKTsKLQogICAgIEpTX0VYUE9SVF9Q
UklWQVRFIHZvaWQgcHVzaChFeGVjU3RhdGUqLCBKU1ZhbHVlKTsKICAgICBKU19FWFBPUlRfUFJJ
VkFURSBKU1ZhbHVlIHBvcChFeGVjU3RhdGUqKTsKIApAQCAtMTYzLDIwICsxNTksOCBAQCBwcml2
YXRlOgogICAgIGJvb2wgdW5zaGlmdENvdW50V2l0aEFycmF5U3RvcmFnZShFeGVjU3RhdGUqLCB1
bnNpZ25lZCBzdGFydEluZGV4LCB1bnNpZ25lZCBjb3VudCwgQXJyYXlTdG9yYWdlKik7CiAgICAg
Ym9vbCB1bnNoaWZ0Q291bnRTbG93Q2FzZShWTSYsIGJvb2wsIHVuc2lnbmVkKTsKIAotICAgIHRl
bXBsYXRlPEluZGV4aW5nVHlwZSBpbmRleGluZ1R5cGU+Ci0gICAgdm9pZCBzb3J0TnVtZXJpY1Zl
Y3RvcihFeGVjU3RhdGUqLCBKU1ZhbHVlIGNvbXBhcmVGdW5jdGlvbiwgQ2FsbFR5cGUsIGNvbnN0
IENhbGxEYXRhJik7Ci0gICAgICAgIAotICAgIHRlbXBsYXRlPEluZGV4aW5nVHlwZSBpbmRleGlu
Z1R5cGUsIHR5cGVuYW1lIFN0b3JhZ2VUeXBlPgotICAgIHZvaWQgc29ydENvbXBhY3RlZFZlY3Rv
cihFeGVjU3RhdGUqLCBDb250aWd1b3VzRGF0YTxTdG9yYWdlVHlwZT4sIHVuc2lnbmVkIHJlbGV2
YW50TGVuZ3RoKTsKLSAgICAgICAgCi0gICAgdGVtcGxhdGU8SW5kZXhpbmdUeXBlIGluZGV4aW5n
VHlwZT4KLSAgICB2b2lkIHNvcnRWZWN0b3IoRXhlY1N0YXRlKiwgSlNWYWx1ZSBjb21wYXJlRnVu
Y3Rpb24sIENhbGxUeXBlLCBjb25zdCBDYWxsRGF0YSYpOwotCiAgICAgYm9vbCBzZXRMZW5ndGhX
aXRoQXJyYXlTdG9yYWdlKEV4ZWNTdGF0ZSosIHVuc2lnbmVkIG5ld0xlbmd0aCwgYm9vbCB0aHJv
d0V4Y2VwdGlvbiwgQXJyYXlTdG9yYWdlKik7CiAgICAgdm9pZCBzZXRMZW5ndGhXcml0YWJsZShF
eGVjU3RhdGUqLCBib29sIHdyaXRhYmxlKTsKLSAgICAgICAgCi0gICAgdGVtcGxhdGU8SW5kZXhp
bmdUeXBlIGluZGV4aW5nVHlwZT4KLSAgICB2b2lkIGNvbXBhY3RGb3JTb3J0aW5nKHVuc2lnbmVk
JiBudW1EZWZpbmVkLCB1bnNpZ25lZCYgbmV3UmVsZXZhbnRMZW5ndGgpOwogfTsKIAogaW5saW5l
IEJ1dHRlcmZseSogY3JlYXRlQ29udGlndW91c0FycmF5QnV0dGVyZmx5KFZNJiB2bSwgSlNDZWxs
KiBpbnRlbmRlZE93bmVyLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkJiB2ZWN0b3JMZW5ndGgp
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbE9iamVjdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxPYmpl
Y3QuY3BwCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9KU0dsb2JhbE9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzOCw4ICs0MzgsMTEgQEAg
cHV0RGlyZWN0V2l0aG91dFRyYW5zaXRpb24odm0sIHZtLnByb3BlcgogICAgICAgICBHbG9iYWxQ
cm9wZXJ0eUluZm8odm0ucHJvcGVydHlOYW1lcy0+QnVpbHRpbkxvZ1ByaXZhdGVOYW1lLCBidWls
dGluTG9nLCBEb250RW51bSB8IERvbnREZWxldGUgfCBSZWFkT25seSksCiAgICAgICAgIEdsb2Jh
bFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVzLT5BcnJheVByaXZhdGVOYW1lLCBhcnJheUNv
bnN0cnVjdG9yLCBEb250RW51bSB8IERvbnREZWxldGUgfCBSZWFkT25seSksCiAgICAgICAgIEds
b2JhbFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVzLT5OdW1iZXJQcml2YXRlTmFtZSwgbnVt
YmVyQ29uc3RydWN0b3IsIERvbnRFbnVtIHwgRG9udERlbGV0ZSB8IFJlYWRPbmx5KSwKKyAgICAg
ICAgR2xvYmFsUHJvcGVydHlJbmZvKHZtLnByb3BlcnR5TmFtZXMtPlN0cmluZ1ByaXZhdGVOYW1l
LCBzdHJpbmdDb25zdHJ1Y3RvciwgRG9udEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkpLAog
ICAgICAgICBHbG9iYWxQcm9wZXJ0eUluZm8odm0ucHJvcGVydHlOYW1lcy0+YWJzUHJpdmF0ZU5h
bWUsIHByaXZhdGVGdW5jQWJzLCBEb250RW51bSB8IERvbnREZWxldGUgfCBSZWFkT25seSksCiAg
ICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVzLT5mbG9vclByaXZhdGVO
YW1lLCBwcml2YXRlRnVuY0Zsb29yLCBEb250RW51bSB8IERvbnREZWxldGUgfCBSZWFkT25seSks
CisgICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVzLT5nZXRQcm90b3R5
cGVPZlByaXZhdGVOYW1lLCBwcml2YXRlRnVuY0Zsb29yLCBEb250RW51bSB8IERvbnREZWxldGUg
fCBSZWFkT25seSksCisgICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVz
LT5nZXRPd25Qcm9wZXJ0eU5hbWVzUHJpdmF0ZU5hbWUsIHByaXZhdGVGdW5jRmxvb3IsIERvbnRF
bnVtIHwgRG9udERlbGV0ZSB8IFJlYWRPbmx5KSwKICAgICAgICAgR2xvYmFsUHJvcGVydHlJbmZv
KHZtLnByb3BlcnR5TmFtZXMtPmlzRmluaXRlUHJpdmF0ZU5hbWUsIHByaXZhdGVGdW5jSXNGaW5p
dGUsIERvbnRFbnVtIHwgRG9udERlbGV0ZSB8IFJlYWRPbmx5KSwKICAgICAgICAgR2xvYmFsUHJv
cGVydHlJbmZvKHZtLnByb3BlcnR5TmFtZXMtPmFycmF5SXRlcmF0aW9uS2luZEtleVByaXZhdGVO
YW1lLCBqc051bWJlcihBcnJheUl0ZXJhdGVLZXkpLCBEb250RW51bSB8IERvbnREZWxldGUgfCBS
ZWFkT25seSksCiAgICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVzLT5h
cnJheUl0ZXJhdGlvbktpbmRWYWx1ZVByaXZhdGVOYW1lLCBqc051bWJlcihBcnJheUl0ZXJhdGVW
YWx1ZSksIERvbnRFbnVtIHwgRG9udERlbGV0ZSB8IFJlYWRPbmx5KSwKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL09iamVjdENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PYmplY3RDb25zdHJ1Y3Rvci5jcHAJKHJl
dmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09iamVjdENv
bnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTgsNiArOTgsOSBAQCB2b2lkIE9iamVj
dENvbnN0cnVjdG9yOjpmaW5pc2hDcmVhdGlvbihWCiAKICAgICBpZiAoIWdsb2JhbE9iamVjdC0+
cnVudGltZUZsYWdzKCkuaXNTeW1ib2xEaXNhYmxlZCgpKQogICAgICAgICBKU0NfTkFUSVZFX0ZV
TkNUSU9OKCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCBvYmplY3RDb25zdHJ1Y3RvckdldE93blBy
b3BlcnR5U3ltYm9scywgRG9udEVudW0sIDEpOworCisgICAgSlNDX05BVElWRV9GVU5DVElPTih2
bS5wcm9wZXJ0eU5hbWVzLT5nZXRQcm90b3R5cGVPZlByaXZhdGVOYW1lLCBvYmplY3RDb25zdHJ1
Y3RvckdldFByb3RvdHlwZU9mLCBEb250RW51bSwgMSk7CisgICAgSlNDX05BVElWRV9GVU5DVElP
Tih2bS5wcm9wZXJ0eU5hbWVzLT5nZXRPd25Qcm9wZXJ0eU5hbWVzUHJpdmF0ZU5hbWUsIG9iamVj
dENvbnN0cnVjdG9yR2V0T3duUHJvcGVydHlOYW1lcywgRG9udEVudW0sIDEpOwogfQogCiBib29s
IE9iamVjdENvbnN0cnVjdG9yOjpnZXRPd25Qcm9wZXJ0eVNsb3QoSlNPYmplY3QqIG9iamVjdCwg
RXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3Qg
JnNsb3QpCkluZGV4OiBTb3VyY2UvV1RGL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V1RGL0NoYW5nZUxvZwkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL1dURi9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxOCBAQAorMjAxNS0wNC0yMSAgR2VvZmZyZXkgR2Fy
ZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgorCisgICAgICAgIEl0IHNob3VsZG4ndCB0YWtlIDE4NDYg
bGluZXMgb2YgY29kZSBhbmQgNSBGSVhNRXMgdG8gc29ydCBhbiBhcnJheS4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NDAxMworCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJlbW92ZSB0aGlzIGN1c3RvbSB0
cmVlIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaXMgdW51c2VkLiAoSXQgd2FzCisgICAgICAg
IHByZXZpb3VzbHkgdXNlZCB0byBhY2hpZXZlIGEgc3RhYmxlIGFycmF5IHNvcnQgaW4gY2VydGFp
biBjYXNlcy4pCisKKyAgICAgICAgKiBXVEYudmN4cHJvai9XVEYudmN4cHJvajoKKyAgICAgICAg
KiBXVEYudmN4cHJvai9XVEYudmN4cHJvai5maWx0ZXJzOgorICAgICAgICAqIFdURi54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHd0Zi9BVkxUcmVlLmg6IFJlbW92ZWQuCisK
IDIwMTUtMDQtMjMgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAg
ICAgVW5kbyB0aGUgV1RGIHBhcnQgb2YgdGhlIHByZXZpb3VzIGJ1aWxkIGZpeCwgd2UgZG9uJ3Qg
dXNlIHByaXZhdGUgaGVhZGVycyBpbiBXVEYuCkluZGV4OiBTb3VyY2UvV1RGL1dURi52Y3hwcm9q
L1dURi52Y3hwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvV1RGLnZjeHByb2ovV1RGLnZj
eHByb2oJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9XVEYvV1RGLnZjeHByb2ovV1RGLnZj
eHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE2Myw3ICsxNjMsNiBAQAogICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5cd3RmXEFzc2VydGlvbnMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9
Ii4uXHd0ZlxBdG9taWNzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx3dGZcQXV0
b2RyYWluZWRQb29sLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx3dGZcQVZMVHJl
ZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cd3RmXEJhZy5oIiAvPgogICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5cd3RmXEJhZ1RvSGFzaE1hcC5oIiAvPgogICAgIDxDbEluY2x1
ZGUgSW5jbHVkZT0iLi5cd3RmXEJpdG1hcC5oIiAvPgpJbmRleDogU291cmNlL1dURi9XVEYudmN4
cHJvai9XVEYudmN4cHJvai5maWx0ZXJzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvV1RGLnZj
eHByb2ovV1RGLnZjeHByb2ouZmlsdGVycwkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL1dU
Ri9XVEYudmN4cHJvai9XVEYudmN4cHJvai5maWx0ZXJzCSh3b3JraW5nIGNvcHkpCkBAIC0zODEs
OSArMzgxLDYgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHd0ZlxBdG9taWNzLmgiPgog
ICAgICAgPEZpbHRlcj53dGY8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNs
dWRlIEluY2x1ZGU9Ii4uXHd0ZlxBVkxUcmVlLmgiPgotICAgICAgPEZpbHRlcj53dGY8L0ZpbHRl
cj4KLSAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHd0ZlxCaXRt
YXAuaCI+CiAgICAgICA8RmlsdGVyPnd0ZjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpJbmRl
eDogU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV1RGL1dURi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODMx
OTgpCisrKyBTb3VyY2UvV1RGL1dURi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5n
IGNvcHkpCkBAIC0xMDcsNyArMTA3LDYgQEAKIAkJQThBNDczODYxNTFBODI1QjAwNDEyM0ZGIC8q
IEFzc2VydGlvbnMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQThBNDcyNUIxNTFBODI1QTAwNDEyM0ZGIC8qIEFzc2VydGlvbnMuY3BwICovOyB9Owog
CQlBOEE0NzM4NzE1MUE4MjVCMDA0MTIzRkYgLyogQXNzZXJ0aW9ucy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThBNDcyNUMxNTFBODI1QTAwNDEyM0ZG
IC8qIEFzc2VydGlvbnMuaCAqLzsgfTsKIAkJQThBNDczODgxNTFBODI1QjAwNDEyM0ZGIC8qIEF0
b21pY3MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4
QTQ3MjVEMTUxQTgyNUEwMDQxMjNGRiAvKiBBdG9taWNzLmggKi87IH07Ci0JCUE4QTQ3Mzg5MTUx
QTgyNUIwMDQxMjNGRiAvKiBBVkxUcmVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBOEE0NzI1RTE1MUE4MjVBMDA0MTIzRkYgLyogQVZMVHJlZS5oICov
OyB9OwogCQlBOEE0NzM4QTE1MUE4MjVCMDA0MTIzRkYgLyogQml0bWFwLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEE0NzI1RjE1MUE4MjVBMDA0MTIz
RkYgLyogQml0bWFwLmggKi87IH07CiAJCUE4QTQ3MzhCMTUxQTgyNUIwMDQxMjNGRiAvKiBCaXRW
ZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QThBNDcyNjAxNTFBODI1QTAwNDEyM0ZGIC8qIEJpdFZlY3Rvci5jcHAgKi87IH07CiAJCUE4QTQ3
MzhDMTUxQTgyNUIwMDQxMjNGRiAvKiBCaXRWZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4QTQ3MjYxMTUxQTgyNUEwMDQxMjNGRiAvKiBCaXRW
ZWN0b3IuaCAqLzsgfTsKQEAgLTM5NSw3ICszOTQsNiBAQAogCQlBOEE0NzI1QjE1MUE4MjVBMDA0
MTIzRkYgLyogQXNzZXJ0aW9ucy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBBc3NlcnRpb25zLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQThBNDcy
NUMxNTFBODI1QTAwNDEyM0ZGIC8qIEFzc2VydGlvbnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gQXNzZXJ0aW9ucy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlB
OEE0NzI1RDE1MUE4MjVBMDA0MTIzRkYgLyogQXRvbWljcy5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBBdG9taWNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCUE4
QTQ3MjVFMTUxQTgyNUEwMDQxMjNGRiAvKiBBVkxUcmVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IEFWTFRyZWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQThB
NDcyNUYxNTFBODI1QTAwNDEyM0ZGIC8qIEJpdG1hcC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBCaXRtYXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQThBNDcy
NjAxNTFBODI1QTAwNDEyM0ZGIC8qIEJpdFZlY3Rvci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBCaXRWZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlBOEE0NzI2MTE1MUE4MjVBMDA0MTIzRkYgLyogQml0VmVjdG9yLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJpdFZlY3Rvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtNzAyLDcgKzcwMCw2IEBACiAJCQkJQThBNDcyNUQxNTFBODI1QTAwNDEyM0ZGIC8q
IEF0b21pY3MuaCAqLywKIAkJCQkxNDY5NDE5QTE2RUFCMTBBMDAyNEUxNDYgLyogQXV0b2RyYWlu
ZWRQb29sLmggKi8sCiAJCQkJMTQ2OTQxOUIxNkVBQjEwQTAwMjRFMTQ2IC8qIEF1dG9kcmFpbmVk
UG9vbE1hYy5tbSAqLywKLQkJCQlBOEE0NzI1RTE1MUE4MjVBMDA0MTIzRkYgLyogQVZMVHJlZS5o
ICovLAogCQkJCTBGQjE0RTE4MTgwRkEyMTgwMDlCNkI0RCAvKiBCYWcuaCAqLywKIAkJCQkwRkIx
NEUxQTE4MTBFMURBMDA5QjZCNEQgLyogQmFnVG9IYXNoTWFwLmggKi8sCiAJCQkJQThBNDcyNUYx
NTFBODI1QTAwNDEyM0ZGIC8qIEJpdG1hcC5oICovLApAQCAtMTA0OCw3ICsxMDQ1LDYgQEAKIAkJ
CQlBOEE0NzQzODE1MUE4MjVCMDA0MTIzRkYgLyogQXRvbWljU3RyaW5nSW1wbC5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJOUJEOEY0MEIxNzZDMkI0NzAwMDJEODY1IC8qIEF0b21pY1N0cmluZ1RhYmxl
LmggaW4gSGVhZGVycyAqLywKIAkJCQkxNDY5NDE5QzE2RUFCMTBBMDAyNEUxNDYgLyogQXV0b2Ry
YWluZWRQb29sLmggaW4gSGVhZGVycyAqLywKLQkJCQlBOEE0NzM4OTE1MUE4MjVCMDA0MTIzRkYg
LyogQVZMVHJlZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJODEzNDAxMzkxNUIwOTJGRDAwMUZGMEI4
IC8qIEJhc2U2NC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQThBNDczQTkxNTFBODI1QjAwNDEyM0ZG
IC8qIGJpZ251bS1kdG9hLmggaW4gSGVhZGVycyAqLywKIAkJCQlBOEE0NzNBQjE1MUE4MjVCMDA0
MTIzRkYgLyogYmlnbnVtLmggaW4gSGVhZGVycyAqLywKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL0FW
TFRyZWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9BVkxUcmVlLmgJKHJldmlzaW9u
IDE4MzE5OCkKKysrIFNvdXJjZS9XVEYvd3RmL0FWTFRyZWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MSw5NjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQmFzZWQgb24gQWJzdHJhY3QgQVZMIFRyZWUgVGVtcGxh
dGUgdjEuNSBieSBXYWx0IEthcmFzCi0gKiA8aHR0cDovL2dlb2NpdGllcy5jb20vd2thcmFzL2dl
bl9jcHAvYXZsX3RyZWUuaHRtbD4uCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0gKiAgICAg
aXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZAotICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQotICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaWZuZGVmIEFWTF9UUkVFX0hfCi0jZGVmaW5lIEFWTF9UUkVFX0hfCi0KLSNp
bmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgotCi1uYW1lc3BhY2Ug
V1RGIHsKLQotLy8gSGVyZSBpcyB0aGUgcmVmZXJlbmNlIGNsYXNzIGZvciBCU2V0LgotLy8KLS8v
IGNsYXNzIEJTZXQKLS8vICAgewotLy8gICBwdWJsaWM6Ci0vLwotLy8gICAgIGNsYXNzIEFOWV9i
aXRyZWYKLS8vICAgICAgIHsKLS8vICAgICAgIHB1YmxpYzoKLS8vICAgICAgICAgb3BlcmF0b3Ig
Ym9vbCAoKTsKLS8vICAgICAgICAgdm9pZCBvcGVyYXRvciA9IChib29sIGIpOwotLy8gICAgICAg
fTsKLS8vCi0vLyAgICAgLy8gRG9lcyBub3QgaGF2ZSB0byBpbml0aWFsaXplIGJpdHMuCi0vLyAg
ICAgQlNldCgpOwotLy8KLS8vICAgICAvLyBNdXN0IHJldHVybiBhIHZhbGlkIHZhbHVlIGZvciBp
bmRleCB3aGVuIDAgPD0gaW5kZXggPCBtYXhEZXB0aAotLy8gICAgIEFOWV9iaXRyZWYgb3BlcmF0
b3IgW10gKHVuc2lnbmVkIGluZGV4KTsKLS8vCi0vLyAgICAgLy8gU2V0IGFsbCBiaXRzIHRvIDEu
Ci0vLyAgICAgdm9pZCBzZXQoKTsKLS8vCi0vLyAgICAgLy8gU2V0IGFsbCBiaXRzIHRvIDAuCi0v
LyAgICAgdm9pZCByZXNldCgpOwotLy8gICB9OwotCi10ZW1wbGF0ZTx1bnNpZ25lZCBtYXhEZXB0
aD4KLWNsYXNzIEFWTFRyZWVEZWZhdWx0QlNldCB7Ci1wdWJsaWM6Ci0gICAgYm9vbCYgb3BlcmF0
b3JbXSh1bnNpZ25lZCBpKSB7IEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGkgPCBt
YXhEZXB0aCk7IHJldHVybiBtX2RhdGFbaV07IH0KLSAgICB2b2lkIHNldCgpIHsgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG1heERlcHRoOyArK2kpIG1fZGF0YVtpXSA9IHRydWU7IH0KLSAgICB2
b2lkIHJlc2V0KCkgeyBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF4RGVwdGg7ICsraSkgbV9k
YXRhW2ldID0gZmFsc2U7IH0KLQotcHJpdmF0ZToKLSAgICBzdGQ6OmFycmF5PGJvb2wsIG1heERl
cHRoPiBtX2RhdGE7Ci19OwotCi0vLyBIb3cgdG8gZGV0ZXJtaW5lIG1heERlcHRoOgotLy8gZCAg
TWluaW11bSBudW1iZXIgb2Ygbm9kZXMKLS8vIDIgIDIKLS8vIDMgIDQKLS8vIDQgIDcKLS8vIDUg
IDEyCi0vLyA2ICAyMAotLy8gNyAgMzMKLS8vIDggIDU0Ci0vLyA5ICA4OAotLy8gMTAgMTQzCi0v
LyAxMSAyMzIKLS8vIDEyIDM3NgotLy8gMTMgNjA5Ci0vLyAxNCA5ODYKLS8vIDE1IDEsNTk2Ci0v
LyAxNiAyLDU4MwotLy8gMTcgNCwxODAKLS8vIDE4IDYsNzY0Ci0vLyAxOSAxMCw5NDUKLS8vIDIw
IDE3LDcxMAotLy8gMjEgMjgsNjU2Ci0vLyAyMiA0NiwzNjcKLS8vIDIzIDc1LDAyNAotLy8gMjQg
MTIxLDM5MgotLy8gMjUgMTk2LDQxNwotLy8gMjYgMzE3LDgxMAotLy8gMjcgNTE0LDIyOAotLy8g
MjggODMyLDAzOQotLy8gMjkgMSwzNDYsMjY4Ci0vLyAzMCAyLDE3OCwzMDgKLS8vIDMxIDMsNTI0
LDU3NwotLy8gMzIgNSw3MDIsODg2Ci0vLyAzMyA5LDIyNyw0NjQKLS8vIDM0IDE0LDkzMCwzNTEK
LS8vIDM1IDI0LDE1Nyw4MTYKLS8vIDM2IDM5LDA4OCwxNjgKLS8vIDM3IDYzLDI0NSw5ODUKLS8v
IDM4IDEwMiwzMzQsMTU0Ci0vLyAzOSAxNjUsNTgwLDE0MAotLy8gNDAgMjY3LDkxNCwyOTUKLS8v
IDQxIDQzMyw0OTQsNDM2Ci0vLyA0MiA3MDEsNDA4LDczMgotLy8gNDMgMSwxMzQsOTAzLDE2OQot
Ly8gNDQgMSw4MzYsMzExLDkwMgotLy8gNDUgMiw5NzEsMjE1LDA3MgotLy8KLS8vIEUuZy4sIGlm
LCBpbiBhIHBhcnRpY3VsYXIgaW5zdGFudGlhdGlvbiwgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5v
ZGVzIGluIGEgdHJlZSBpbnN0YW5jZSBpcyAxLDAwMCwwMDAsIHRoZSBtYXhpbXVtIGRlcHRoIHNo
b3VsZCBiZSAyOC4KLS8vIFlvdSBwaWNrIDI4IGJlY2F1c2UgTU4oMjgpIGlzIDgzMiwwMzksIHdo
aWNoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLDAwMCwwMDAsIGFuZCBNTigyOSkgaXMgMSwz
NDYsMjY4LCB3aGljaCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gMSwwMDAsMDAwLgotCi10ZW1w
bGF0ZSA8Y2xhc3MgQWJzdHJhY3RvciwgdW5zaWduZWQgbWF4RGVwdGggPSAzMiwgY2xhc3MgQlNl
dCA9IEFWTFRyZWVEZWZhdWx0QlNldDxtYXhEZXB0aD4+Ci1jbGFzcyBBVkxUcmVlIHsKLXB1Ymxp
YzoKLQotICAgIHR5cGVkZWYgdHlwZW5hbWUgQWJzdHJhY3Rvcjo6a2V5IGtleTsKLSAgICB0eXBl
ZGVmIHR5cGVuYW1lIEFic3RyYWN0b3I6OmhhbmRsZSBoYW5kbGU7Ci0gICAgdHlwZWRlZiB0eXBl
bmFtZSBBYnN0cmFjdG9yOjpzaXplIHNpemU7Ci0KLSAgICBlbnVtIFNlYXJjaFR5cGUgewotICAg
ICAgICBFUVVBTCA9IDEsCi0gICAgICAgIExFU1MgPSAyLAotICAgICAgICBHUkVBVEVSID0gNCwK
LSAgICAgICAgTEVTU19FUVVBTCA9IEVRVUFMIHwgTEVTUywKLSAgICAgICAgR1JFQVRFUl9FUVVB
TCA9IEVRVUFMIHwgR1JFQVRFUgotICAgIH07Ci0KLQotICAgIEFic3RyYWN0b3ImIGFic3RyYWN0
b3IoKSB7IHJldHVybiBhYnM7IH0KLQotICAgIGlubGluZSBoYW5kbGUgaW5zZXJ0KGhhbmRsZSBo
KTsKLQotICAgIGlubGluZSBoYW5kbGUgc2VhcmNoKGtleSBrLCBTZWFyY2hUeXBlIHN0ID0gRVFV
QUwpOwotICAgIGlubGluZSBoYW5kbGUgc2VhcmNoX2xlYXN0KCk7Ci0gICAgaW5saW5lIGhhbmRs
ZSBzZWFyY2hfZ3JlYXRlc3QoKTsKLQotICAgIGlubGluZSBoYW5kbGUgcmVtb3ZlKGtleSBrKTsK
LQotICAgIGlubGluZSBoYW5kbGUgc3Vic3QoaGFuZGxlIG5ld19ub2RlKTsKLQotICAgIHZvaWQg
cHVyZ2UoKSB7IGFicy5yb290ID0gbnVsbCgpOyB9Ci0KLSAgICBib29sIGlzX2VtcHR5KCkgeyBy
ZXR1cm4gYWJzLnJvb3QgPT0gbnVsbCgpOyB9Ci0KLSAgICBBVkxUcmVlKCkgeyBhYnMucm9vdCA9
IG51bGwoKTsgfQotCi0gICAgY2xhc3MgSXRlcmF0b3IgewotICAgIHB1YmxpYzoKLQotICAgICAg
ICAvLyBJbml0aWFsaXplIGRlcHRoIHRvIGludmFsaWQgdmFsdWUsIHRvIGluZGljYXRlIGl0ZXJh
dG9yIGlzCi0gICAgICAgIC8vIGludmFsaWQuICAgKERlcHRoIGlzIHplcm8tYmFzZS4pCi0gICAg
ICAgIEl0ZXJhdG9yKCkgeyBkZXB0aCA9IH4wVTsgfQotCi0gICAgICAgIHZvaWQgc3RhcnRfaXRl
cihBVkxUcmVlICZ0cmVlLCBrZXkgaywgU2VhcmNoVHlwZSBzdCA9IEVRVUFMKQotICAgICAgICB7
Ci0gICAgICAgICAgICAvLyBNYXNrIG9mIGhpZ2ggYml0IGluIGFuIGludC4KLSAgICAgICAgICAg
IGNvbnN0IGludCBNQVNLX0hJR0hfQklUID0gKGludCkgfiAoKH4gKHVuc2lnbmVkKSAwKSA+PiAx
KTsKLQotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdHJlZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIGl0
ZXJhdGUgdGhyb3VnaCBpbiBhCi0gICAgICAgICAgICAvLyBtZW1iZXIgdmFyaWFibGUuCi0gICAg
ICAgICAgICB0cmVlXyA9ICZ0cmVlOwotCi0gICAgICAgICAgICBpbnQgY21wLCB0YXJnZXRfY21w
OwotICAgICAgICAgICAgaGFuZGxlIGggPSB0cmVlXy0+YWJzLnJvb3Q7Ci0gICAgICAgICAgICB1
bnNpZ25lZCBkID0gMDsKLQotICAgICAgICAgICAgZGVwdGggPSB+MFU7Ci0KLSAgICAgICAgICAg
IGlmIChoID09IG51bGwoKSkKLSAgICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eS4KLSAgICAg
ICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoc3QgJiBMRVNTKQotICAgICAgICAg
ICAgICAvLyBLZXkgY2FuIGJlIGdyZWF0ZXIgdGhhbiBrZXkgb2Ygc3RhcnRpbmcgbm9kZS4KLSAg
ICAgICAgICAgICAgdGFyZ2V0X2NtcCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdCAmIEdS
RUFURVIpCi0gICAgICAgICAgICAgIC8vIEtleSBjYW4gYmUgbGVzcyB0aGFuIGtleSBvZiBzdGFy
dGluZyBub2RlLgotICAgICAgICAgICAgICB0YXJnZXRfY21wID0gLTE7Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgIC8vIEtleSBtdXN0IGJlIHNhbWUgYXMga2V5IG9mIHN0YXJ0aW5n
IG5vZGUuCi0gICAgICAgICAgICAgIHRhcmdldF9jbXAgPSAwOwotCi0gICAgICAgICAgICBmb3Ig
KDs7KSB7Ci0gICAgICAgICAgICAgICAgY21wID0gY21wX2tfbihrLCBoKTsKLSAgICAgICAgICAg
ICAgICBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0ICYgRVFVQUwp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVxdWFsIG5vZGUgd2FzIHNvdWdodCBhbmQg
Zm91bmQgYXMgc3RhcnRpbmcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0g
ZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIGNtcCA9IC10YXJnZXRfY21wOwotICAgICAgICAgICAgICAg
IH0gZWxzZSBpZiAodGFyZ2V0X2NtcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgh
KChjbXAgXiB0YXJnZXRfY21wKSAmIE1BU0tfSElHSF9CSVQpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBjbXAgYW5kIHRhcmdldF9jbXAgYXJlIGJvdGggbmVnYXRpdmUgb3IgYm90aCBw
b3NpdGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZDsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoID0gY21wIDwg
MCA/IGdldF9sdChoKSA6IGdldF9ndChoKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA9PSBudWxs
KCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGJyYW5jaFtk
XSA9IGNtcCA+IDA7Ci0gICAgICAgICAgICAgICAgcGF0aF9oW2QrK10gPSBoOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydF9pdGVyX2xlYXN0KEFWTFRyZWUg
JnRyZWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyZWVfID0gJnRyZWU7Ci0KLSAgICAgICAg
ICAgIGhhbmRsZSBoID0gdHJlZV8tPmFicy5yb290OwotCi0gICAgICAgICAgICBkZXB0aCA9IH4w
VTsKLQotICAgICAgICAgICAgYnJhbmNoLnJlc2V0KCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICho
ICE9IG51bGwoKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXB0aCAhPSB+MFUpCi0gICAgICAg
ICAgICAgICAgICAgIHBhdGhfaFtkZXB0aF0gPSBoOwotICAgICAgICAgICAgICAgIGRlcHRoKys7
Ci0gICAgICAgICAgICAgICAgaCA9IGdldF9sdChoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotCi0gICAgICAgIHZvaWQgc3RhcnRfaXRlcl9ncmVhdGVzdChBVkxUcmVlICZ0cmVlKQotICAg
ICAgICB7Ci0gICAgICAgICAgICB0cmVlXyA9ICZ0cmVlOwotCi0gICAgICAgICAgICBoYW5kbGUg
aCA9IHRyZWVfLT5hYnMucm9vdDsKLQotICAgICAgICAgICAgZGVwdGggPSB+MFU7Ci0KLSAgICAg
ICAgICAgIGJyYW5jaC5zZXQoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGggIT0gbnVsbCgpKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKGRlcHRoICE9IH4wVSkKLSAgICAgICAgICAgICAgICAgICAg
cGF0aF9oW2RlcHRoXSA9IGg7Ci0gICAgICAgICAgICAgICAgZGVwdGgrKzsKLSAgICAgICAgICAg
ICAgICBoID0gZ2V0X2d0KGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
aGFuZGxlIG9wZXJhdG9yKigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZXB0aCA9PSB+
MFUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGwoKTsKLQotICAgICAgICAgICAgcmV0dXJu
IGRlcHRoID09IDAgPyB0cmVlXy0+YWJzLnJvb3QgOiBwYXRoX2hbZGVwdGggLSAxXTsKLSAgICAg
ICAgfQotCi0gICAgICAgIHZvaWQgb3BlcmF0b3IrKygpCi0gICAgICAgIHsKLSAgICAgICAgICAg
IGlmIChkZXB0aCAhPSB+MFUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUgaCA9IGdldF9ndCgq
KnRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChoID09IG51bGwoKSkgewotICAgICAgICAgICAg
ICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gfjBVOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICAgICAgZGVwdGgtLTsKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYnJh
bmNoW2RlcHRoXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgYnJhbmNoW2RlcHRoXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhfaFtkZXB0
aCsrXSA9IGg7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGggPSBnZXRfbHQoaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9
PSBudWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBicmFuY2hbZGVwdGhdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBwYXRoX2hbZGVwdGgrK10gPSBoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBvcGVy
YXRvci0tKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlcHRoICE9IH4wVSkgewotICAg
ICAgICAgICAgICAgIGhhbmRsZSBoID0gZ2V0X2x0KCoqdGhpcyk7Ci0gICAgICAgICAgICAgICAg
aWYgKGggPT0gbnVsbCgpKQotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlcHRoID0gfjBVOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTsKLSAg
ICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWJyYW5jaFtkZXB0aF0pOwotICAgICAgICAgICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmFuY2hbZGVwdGhdID0gZmFsc2U7Ci0g
ICAgICAgICAgICAgICAgICAgIHBhdGhfaFtkZXB0aCsrXSA9IGg7Ci0gICAgICAgICAgICAgICAg
ICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBnZXRfZ3QoaCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9PSBudWxsKCkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hbZGVwdGhd
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaFtkZXB0aCsrXSA9IGg7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLQotICAgICAgICB2b2lkIG9wZXJhdG9yKysoaW50KSB7ICsrKCp0aGlzKTsgfQot
ICAgICAgICB2b2lkIG9wZXJhdG9yLS0oaW50KSB7IC0tKCp0aGlzKTsgfQotCi0gICAgcHJvdGVj
dGVkOgotCi0gICAgICAgIC8vIFRyZWUgYmVpbmcgaXRlcmF0ZWQgb3Zlci4KLSAgICAgICAgQVZM
VHJlZSAqdHJlZV87Ci0KLSAgICAgICAgLy8gUmVjb3JkcyBhIHBhdGggaW50byB0aGUgdHJlZS4g
IElmIGJyYW5jaFtuXSBpcyB0cnVlLCBpbmRpY2F0ZXMKLSAgICAgICAgLy8gdGFrZSBncmVhdGVy
IGJyYW5jaCBmcm9tIHRoZSBudGggbm9kZSBpbiB0aGUgcGF0aCwgb3RoZXJ3aXNlCi0gICAgICAg
IC8vIHRha2UgdGhlIGxlc3MgYnJhbmNoLiAgYnJhbmNoWzBdIGdpdmVzIGJyYW5jaCBmcm9tIHJv
b3QsIGFuZAotICAgICAgICAvLyBzbyBvbi4KLSAgICAgICAgQlNldCBicmFuY2g7Ci0KLSAgICAg
ICAgLy8gWmVyby1iYXNlZCBkZXB0aCBvZiBwYXRoIGludG8gdHJlZS4KLSAgICAgICAgdW5zaWdu
ZWQgZGVwdGg7Ci0KLSAgICAgICAgLy8gSGFuZGxlcyBvZiBub2RlcyBpbiBwYXRoIGZyb20gcm9v
dCB0byBjdXJyZW50IG5vZGUgKHJldHVybmVkIGJ5ICopLgotICAgICAgICBoYW5kbGUgcGF0aF9o
W21heERlcHRoIC0gMV07Ci0KLSAgICAgICAgaW50IGNtcF9rX24oa2V5IGssIGhhbmRsZSBoKSB7
IHJldHVybiB0cmVlXy0+YWJzLmNvbXBhcmVfa2V5X25vZGUoaywgaCk7IH0KLSAgICAgICAgaW50
IGNtcF9uX24oaGFuZGxlIGgxLCBoYW5kbGUgaDIpIHsgcmV0dXJuIHRyZWVfLT5hYnMuY29tcGFy
ZV9ub2RlX25vZGUoaDEsIGgyKTsgfQotICAgICAgICBoYW5kbGUgZ2V0X2x0KGhhbmRsZSBoKSB7
IHJldHVybiB0cmVlXy0+YWJzLmdldF9sZXNzKGgpOyB9Ci0gICAgICAgIGhhbmRsZSBnZXRfZ3Qo
aGFuZGxlIGgpIHsgcmV0dXJuIHRyZWVfLT5hYnMuZ2V0X2dyZWF0ZXIoaCk7IH0KLSAgICAgICAg
aGFuZGxlIG51bGwoKSB7IHJldHVybiB0cmVlXy0+YWJzLm51bGwoKTsgfQotICAgIH07Ci0KLSAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBmd2RfaXRlcj4KLSAgICBib29sIGJ1aWxkKGZ3ZF9pdGVyIHAs
IHNpemUgbnVtX25vZGVzKQotICAgIHsKLSAgICAgICAgaWYgKG51bV9ub2RlcyA9PSAwKSB7Ci0g
ICAgICAgICAgICBhYnMucm9vdCA9IG51bGwoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2l2ZXMgcGF0aCB0byBzdWJ0cmVlIGJlaW5nIGJ1aWx0
LiAgSWYgYnJhbmNoW05dIGlzIGZhbHNlLCBicmFuY2gKLSAgICAgICAgLy8gbGVzcyBmcm9tIHRo
ZSBub2RlIGF0IGRlcHRoIE4sIGlmIHRydWUgYnJhbmNoIGdyZWF0ZXIuCi0gICAgICAgIEJTZXQg
YnJhbmNoOwotCi0gICAgICAgIC8vIElmIHJlbVtOXSBpcyB0cnVlLCB0aGVuIGZvciB0aGUgY3Vy
cmVudCBzdWJ0cmVlIGF0IGRlcHRoIE4sIGl0J3MKLSAgICAgICAgLy8gZ3JlYXRlciBzdWJ0cmVl
IGhhcyBvbmUgbW9yZSBub2RlIHRoYW4gaXQncyBsZXNzIHN1YnRyZWUuCi0gICAgICAgIEJTZXQg
cmVtOwotCi0gICAgICAgICAgICAvLyBEZXB0aCBvZiByb290IG5vZGUgb2YgY3VycmVudCBzdWJ0
cmVlLgotICAgICAgICB1bnNpZ25lZCBkZXB0aCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIE51bWJl
ciBvZiBub2RlcyBpbiBjdXJyZW50IHN1YnRyZWUuCi0gICAgICAgIHNpemUgbnVtX3N1YiA9IG51
bV9ub2RlczsKLQotICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIHJlbGllcyBvbiBhIHN0YWNrIG9m
IG5vZGVzIHdob3NlIGxlc3Mgc3VidHJlZSBoYXMKLSAgICAgICAgLy8gYmVlbiBidWlsdCwgYnV0
IHdob3NlIHJpZ2h0IHN1YnRyZWUgaGFzIG5vdCB5ZXQgYmVlbiBidWlsdC4gIFRoZQotICAgICAg
ICAvLyBzdGFjayBpcyBpbXBsZW1lbnRlZCBhcyBsaW5rZWQgbGlzdC4gIFRoZSBub2RlcyBhcmUg
bGlua2VkCi0gICAgICAgIC8vIHRvZ2V0aGVyIGJ5IGhhdmluZyB0aGUgImdyZWF0ZXIiIGhhbmRs
ZSBvZiBhIG5vZGUgc2V0IHRvIHRoZQotICAgICAgICAvLyBuZXh0IG5vZGUgaW4gdGhlIGxpc3Qu
ICAibGVzc19wYXJlbnQiIGlzIHRoZSBoYW5kbGUgb2YgdGhlIGZpcnN0Ci0gICAgICAgIC8vIG5v
ZGUgaW4gdGhlIGxpc3QuCi0gICAgICAgIGhhbmRsZSBsZXNzX3BhcmVudCA9IG51bGwoKTsKLQot
ICAgICAgICAvLyBoIGlzIHJvb3Qgb2YgY3VycmVudCBzdWJ0cmVlLCBjaGlsZCBpcyBvbmUgb2Yg
aXRzIGNoaWxkcmVuLgotICAgICAgICBoYW5kbGUgaCwgY2hpbGQ7Ci0KLSAgICAgICAgZm9yICg7
OykgewotICAgICAgICAgICAgd2hpbGUgKG51bV9zdWIgPiAyKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gU3VidHJhY3Qgb25lIGZvciByb290IG9mIHN1YnRyZWUuCi0gICAgICAgICAgICAgICAgbnVt
X3N1Yi0tOwotICAgICAgICAgICAgICAgIHJlbVtkZXB0aF0gPSAhIShudW1fc3ViICYgMSk7Ci0g
ICAgICAgICAgICAgICAgYnJhbmNoW2RlcHRoKytdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
bnVtX3N1YiA+Pj0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bV9zdWIg
PT0gMikgewotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgc3VidHJlZSB3aXRoIHR3byBub2Rl
cywgc2xhbnRpbmcgdG8gZ3JlYXRlci4KLSAgICAgICAgICAgICAgICAvLyBJIGFyYml0cmFyaWx5
IGNob3NlIHRvIGFsd2F5cyBoYXZlIHRoZSBleHRyYSBub2RlIGluIHRoZQotICAgICAgICAgICAg
ICAgIC8vIGdyZWF0ZXIgc3VidHJlZSB3aGVuIHRoZXJlIGlzIGFuIG9kZCBudW1iZXIgb2Ygbm9k
ZXMgdG8KLSAgICAgICAgICAgICAgICAvLyBzcGxpdCBiZXR3ZWVuIHRoZSB0d28gc3VidHJlZXMu
Ci0KLSAgICAgICAgICAgICAgICBoID0gKnA7Ci0gICAgICAgICAgICAgICAgcCsrOwotICAgICAg
ICAgICAgICAgIGNoaWxkID0gKnA7Ci0gICAgICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAg
ICAgIHNldF9sdChjaGlsZCwgbnVsbCgpKTsKLSAgICAgICAgICAgICAgICBzZXRfZ3QoY2hpbGQs
IG51bGwoKSk7Ci0gICAgICAgICAgICAgICAgc2V0X2JmKGNoaWxkLCAwKTsKLSAgICAgICAgICAg
ICAgICBzZXRfZ3QoaCwgY2hpbGQpOwotICAgICAgICAgICAgICAgIHNldF9sdChoLCBudWxsKCkp
OwotICAgICAgICAgICAgICAgIHNldF9iZihoLCAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8v
IG51bV9zdWIgPT0gMQotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgc3VidHJlZSB3aXRoIG9u
ZSBub2RlLgotCi0gICAgICAgICAgICAgICAgaCA9ICpwOwotICAgICAgICAgICAgICAgIHArKzsK
LSAgICAgICAgICAgICAgICBzZXRfbHQoaCwgbnVsbCgpKTsKLSAgICAgICAgICAgICAgICBzZXRf
Z3QoaCwgbnVsbCgpKTsKLSAgICAgICAgICAgICAgICBzZXRfYmYoaCwgMCk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChkZXB0aCkgewotICAgICAgICAgICAgICAgIGRlcHRo
LS07Ci0gICAgICAgICAgICAgICAgaWYgKCFicmFuY2hbZGVwdGhdKQotICAgICAgICAgICAgICAg
ICAgICAvLyBXZSd2ZSBjb21wbGV0ZWQgYSBsZXNzIHN1YnRyZWUuCi0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gV2UndmUgY29tcGxldGVkIGEgZ3JlYXRl
ciBzdWJ0cmVlLCBzbyBhdHRhY2ggaXQgdG8KLSAgICAgICAgICAgICAgICAvLyBpdHMgcGFyZW50
ICh0aGF0IGlzIGxlc3MgdGhhbiBpdCkuICBXZSBwb3AgdGhlIHBhcmVudAotICAgICAgICAgICAg
ICAgIC8vIG9mZiB0aGUgc3RhY2sgb2YgbGVzcyBwYXJlbnRzLgotICAgICAgICAgICAgICAgIGNo
aWxkID0gaDsKLSAgICAgICAgICAgICAgICBoID0gbGVzc19wYXJlbnQ7Ci0gICAgICAgICAgICAg
ICAgbGVzc19wYXJlbnQgPSBnZXRfZ3QoaCk7Ci0gICAgICAgICAgICAgICAgc2V0X2d0KGgsIGNo
aWxkKTsKLSAgICAgICAgICAgICAgICAvLyBudW1fc3ViID0gMiAqIChudW1fc3ViIC0gcmVtW2Rl
cHRoXSkgKyByZW1bZGVwdGhdICsgMQotICAgICAgICAgICAgICAgIG51bV9zdWIgPDw9IDE7Ci0g
ICAgICAgICAgICAgICAgbnVtX3N1YiArPSAxIC0gcmVtW2RlcHRoXTsKLSAgICAgICAgICAgICAg
ICBpZiAobnVtX3N1YiAmIChudW1fc3ViIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgIC8vIG51
bV9zdWIgaXMgbm90IGEgcG93ZXIgb2YgMgotICAgICAgICAgICAgICAgICAgICBzZXRfYmYoaCwg
MCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAvLyBudW1fc3Vi
IGlzIGEgcG93ZXIgb2YgMgotICAgICAgICAgICAgICAgICAgICBzZXRfYmYoaCwgMSk7Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChudW1fc3ViID09IG51bV9ub2RlcykKLSAgICAg
ICAgICAgICAgICAvLyBXZSd2ZSBjb21wbGV0ZWQgdGhlIGZ1bGwgdHJlZS4KLSAgICAgICAgICAg
ICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gVGhlIHN1YnRyZWUgd2UndmUgY29tcGxldGVk
IGlzIHRoZSBsZXNzIHN1YnRyZWUgb2YgdGhlCi0gICAgICAgICAgICAvLyBuZXh0IG5vZGUgaW4g
dGhlIHNlcXVlbmNlLgotCi0gICAgICAgICAgICBjaGlsZCA9IGg7Ci0gICAgICAgICAgICBoID0g
KnA7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICBzZXRfbHQoaCwgY2hpbGQpOwotCi0g
ICAgICAgICAgICAvLyBQdXQgaCBpbnRvIHN0YWNrIG9mIGxlc3MgcGFyZW50cy4KLSAgICAgICAg
ICAgIHNldF9ndChoLCBsZXNzX3BhcmVudCk7Ci0gICAgICAgICAgICBsZXNzX3BhcmVudCA9IGg7
Ci0KLSAgICAgICAgICAgIC8vIFByb2NlZWQgdG8gY3JlYXRpbmcgZ3JlYXRlciB0aGFuIHN1YnRy
ZWUgb2YgaC4KLSAgICAgICAgICAgIGJyYW5jaFtkZXB0aF0gPSB0cnVlOwotICAgICAgICAgICAg
bnVtX3N1YiArPSByZW1bZGVwdGgrK107Ci0KLSAgICAgICAgfSAvLyBlbmQgZm9yICg7OykKLQot
ICAgICAgICBhYnMucm9vdCA9IGg7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi1w
cm90ZWN0ZWQ6Ci0KLSAgICBmcmllbmQgY2xhc3MgSXRlcmF0b3I7Ci0KLSAgICAvLyBDcmVhdGUg
YSBjbGFzcyB3aG9zZSBzb2xlIHB1cnBvc2UgaXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKLSAgICAv
LyB0aGUgImVtcHR5IG1lbWJlciIgb3B0aW1pemF0aW9uLgotICAgIHN0cnVjdCBhYnNfcGx1c19y
b290IDogcHVibGljIEFic3RyYWN0b3IgewotICAgICAgICAvLyBUaGUgaGFuZGxlIG9mIHRoZSBy
b290IGVsZW1lbnQgaW4gdGhlIEFWTCB0cmVlLgotICAgICAgICBoYW5kbGUgcm9vdDsKLSAgICB9
OwotCi0gICAgYWJzX3BsdXNfcm9vdCBhYnM7Ci0KLQotICAgIGhhbmRsZSBnZXRfbHQoaGFuZGxl
IGgpIHsgcmV0dXJuIGFicy5nZXRfbGVzcyhoKTsgfQotICAgIHZvaWQgc2V0X2x0KGhhbmRsZSBo
LCBoYW5kbGUgbGgpIHsgYWJzLnNldF9sZXNzKGgsIGxoKTsgfQotCi0gICAgaGFuZGxlIGdldF9n
dChoYW5kbGUgaCkgeyByZXR1cm4gYWJzLmdldF9ncmVhdGVyKGgpOyB9Ci0gICAgdm9pZCBzZXRf
Z3QoaGFuZGxlIGgsIGhhbmRsZSBnaCkgeyBhYnMuc2V0X2dyZWF0ZXIoaCwgZ2gpOyB9Ci0KLSAg
ICBpbnQgZ2V0X2JmKGhhbmRsZSBoKSB7IHJldHVybiBhYnMuZ2V0X2JhbGFuY2VfZmFjdG9yKGgp
OyB9Ci0gICAgdm9pZCBzZXRfYmYoaGFuZGxlIGgsIGludCBiZikgeyBhYnMuc2V0X2JhbGFuY2Vf
ZmFjdG9yKGgsIGJmKTsgfQotCi0gICAgaW50IGNtcF9rX24oa2V5IGssIGhhbmRsZSBoKSB7IHJl
dHVybiBhYnMuY29tcGFyZV9rZXlfbm9kZShrLCBoKTsgfQotICAgIGludCBjbXBfbl9uKGhhbmRs
ZSBoMSwgaGFuZGxlIGgyKSB7IHJldHVybiBhYnMuY29tcGFyZV9ub2RlX25vZGUoaDEsIGgyKTsg
fQotCi0gICAgaGFuZGxlIG51bGwoKSB7IHJldHVybiBhYnMubnVsbCgpOyB9Ci0KLXByaXZhdGU6
Ci0KLSAgICAvLyBCYWxhbmNlcyBzdWJ0cmVlLCByZXR1cm5zIGhhbmRsZSBvZiByb290IG5vZGUg
b2Ygc3VidHJlZQotICAgIC8vIGFmdGVyIGJhbGFuY2luZy4KLSAgICBoYW5kbGUgYmFsYW5jZSho
YW5kbGUgYmFsX2gpCi0gICAgewotICAgICAgICBoYW5kbGUgZGVlcF9oOwotCi0gICAgICAgIC8v
IEVpdGhlciB0aGUgImdyZWF0ZXIgdGhhbiIgb3IgdGhlICJsZXNzIHRoYW4iIHN1YnRyZWUgb2YK
LSAgICAgICAgLy8gdGhpcyBub2RlIGhhcyB0byBiZSAyIGxldmVscyBkZWVwZXIgKG9yIGVsc2Ug
aXQgd291bGRuJ3QKLSAgICAgICAgLy8gbmVlZCBiYWxhbmNpbmcpLgotCi0gICAgICAgIGlmIChn
ZXRfYmYoYmFsX2gpID4gMCkgewotICAgICAgICAgICAgLy8gIkdyZWF0ZXIgdGhhbiIgc3VidHJl
ZSBpcyBkZWVwZXIuCi0KLSAgICAgICAgICAgIGRlZXBfaCA9IGdldF9ndChiYWxfaCk7Ci0KLSAg
ICAgICAgICAgIGlmIChnZXRfYmYoZGVlcF9oKSA8IDApIHsKLSAgICAgICAgICAgICAgICBoYW5k
bGUgb2xkX2ggPSBiYWxfaDsKLSAgICAgICAgICAgICAgICBiYWxfaCA9IGdldF9sdChkZWVwX2gp
OwotCi0gICAgICAgICAgICAgICAgc2V0X2d0KG9sZF9oLCBnZXRfbHQoYmFsX2gpKTsKLSAgICAg
ICAgICAgICAgICBzZXRfbHQoZGVlcF9oLCBnZXRfZ3QoYmFsX2gpKTsKLSAgICAgICAgICAgICAg
ICBzZXRfbHQoYmFsX2gsIG9sZF9oKTsKLSAgICAgICAgICAgICAgICBzZXRfZ3QoYmFsX2gsIGRl
ZXBfaCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgYmYgPSBnZXRfYmYoYmFsX2gpOwotICAgICAg
ICAgICAgICAgIGlmIChiZiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiZiA+IDAp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9iZihvbGRfaCwgLTEpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgc2V0X2JmKGRlZXBfaCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfYmYoZGVlcF9oLCAxKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHNldF9iZihvbGRfaCwgMCk7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKGJhbF9oLCAwKTsKLSAgICAgICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRfYmYob2xkX2gsIDApOwotICAgICAg
ICAgICAgICAgICAgICBzZXRfYmYoZGVlcF9oLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldF9ndChiYWxfaCwgZ2V0X2x0KGRl
ZXBfaCkpOwotICAgICAgICAgICAgICAgIHNldF9sdChkZWVwX2gsIGJhbF9oKTsKLSAgICAgICAg
ICAgICAgICBpZiAoZ2V0X2JmKGRlZXBfaCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBz
ZXRfYmYoZGVlcF9oLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9iZihiYWxfaCwgMSk7
Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKGRl
ZXBfaCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9iZihiYWxfaCwgMCk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJhbF9oID0gZGVlcF9oOwotICAgICAgICAgICAg
fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gIkxlc3MgdGhhbiIgc3VidHJlZSBp
cyBkZWVwZXIuCi0KLSAgICAgICAgICAgIGRlZXBfaCA9IGdldF9sdChiYWxfaCk7Ci0KLSAgICAg
ICAgICAgIGlmIChnZXRfYmYoZGVlcF9oKSA+IDApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUg
b2xkX2ggPSBiYWxfaDsKLSAgICAgICAgICAgICAgICBiYWxfaCA9IGdldF9ndChkZWVwX2gpOwot
ICAgICAgICAgICAgICAgIHNldF9sdChvbGRfaCwgZ2V0X2d0KGJhbF9oKSk7Ci0gICAgICAgICAg
ICAgICAgc2V0X2d0KGRlZXBfaCwgZ2V0X2x0KGJhbF9oKSk7Ci0gICAgICAgICAgICAgICAgc2V0
X2d0KGJhbF9oLCBvbGRfaCk7Ci0gICAgICAgICAgICAgICAgc2V0X2x0KGJhbF9oLCBkZWVwX2gp
OwotCi0gICAgICAgICAgICAgICAgaW50IGJmID0gZ2V0X2JmKGJhbF9oKTsKLSAgICAgICAgICAg
ICAgICBpZiAoYmYgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmYgPCAwKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBzZXRfYmYob2xkX2gsIDEpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgc2V0X2JmKGRlZXBfaCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfYmYoZGVlcF9oLCAtMSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBzZXRfYmYob2xkX2gsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIHNldF9iZihiYWxfaCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKG9sZF9oLCAwKTsKLSAgICAgICAgICAg
ICAgICAgICAgc2V0X2JmKGRlZXBfaCwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRfbHQoYmFsX2gsIGdldF9ndChkZWVwX2gp
KTsKLSAgICAgICAgICAgICAgICBzZXRfZ3QoZGVlcF9oLCBiYWxfaCk7Ci0gICAgICAgICAgICAg
ICAgaWYgKGdldF9iZihkZWVwX2gpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2Jm
KGRlZXBfaCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9iZihiYWxfaCwgLTEpOwotICAg
ICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9iZihkZWVwX2gs
IDApOwotICAgICAgICAgICAgICAgICAgICBzZXRfYmYoYmFsX2gsIDApOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBiYWxfaCA9IGRlZXBfaDsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBiYWxfaDsKLSAgICB9Ci0KLX07Ci0KLXRlbXBsYXRl
IDxjbGFzcyBBYnN0cmFjdG9yLCB1bnNpZ25lZCBtYXhEZXB0aCwgY2xhc3MgQlNldD4KLWlubGlu
ZSB0eXBlbmFtZSBBVkxUcmVlPEFic3RyYWN0b3IsIG1heERlcHRoLCBCU2V0Pjo6aGFuZGxlCi1B
VkxUcmVlPEFic3RyYWN0b3IsIG1heERlcHRoLCBCU2V0Pjo6aW5zZXJ0KGhhbmRsZSBoKQotewot
ICAgIHNldF9sdChoLCBudWxsKCkpOwotICAgIHNldF9ndChoLCBudWxsKCkpOwotICAgIHNldF9i
ZihoLCAwKTsKLQotICAgIGlmIChhYnMucm9vdCA9PSBudWxsKCkpCi0gICAgICAgIGFicy5yb290
ID0gaDsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gTGFzdCB1bmJhbGFuY2VkIG5vZGUgZW5jb3Vu
dGVyZWQgaW4gc2VhcmNoIGZvciBpbnNlcnRpb24gcG9pbnQuCi0gICAgICAgIGhhbmRsZSB1bmJh
bCA9IG51bGwoKTsKLSAgICAgICAgLy8gUGFyZW50IG9mIGxhc3QgdW5iYWxhbmNlZCBub2RlLgot
ICAgICAgICBoYW5kbGUgcGFyZW50X3VuYmFsID0gbnVsbCgpOwotICAgICAgICAvLyBCYWxhbmNl
IGZhY3RvciBvZiBsYXN0IHVuYmFsYW5jZWQgbm9kZS4KLSAgICAgICAgaW50IHVuYmFsX2JmOwot
Ci0gICAgICAgIC8vIFplcm8tYmFzZWQgZGVwdGggaW4gdHJlZS4KLSAgICAgICAgdW5zaWduZWQg
ZGVwdGggPSAwLCB1bmJhbF9kZXB0aCA9IDA7Ci0KLSAgICAgICAgLy8gUmVjb3JkcyBhIHBhdGgg
aW50byB0aGUgdHJlZS4gIElmIGJyYW5jaFtuXSBpcyB0cnVlLCBpbmRpY2F0ZXMKLSAgICAgICAg
Ly8gdGFrZSBncmVhdGVyIGJyYW5jaCBmcm9tIHRoZSBudGggbm9kZSBpbiB0aGUgcGF0aCwgb3Ro
ZXJ3aXNlCi0gICAgICAgIC8vIHRha2UgdGhlIGxlc3MgYnJhbmNoLiAgYnJhbmNoWzBdIGdpdmVz
IGJyYW5jaCBmcm9tIHJvb3QsIGFuZAotICAgICAgICAvLyBzbyBvbi4KLSAgICAgICAgQlNldCBi
cmFuY2g7Ci0KLSAgICAgICAgaGFuZGxlIGhoID0gYWJzLnJvb3Q7Ci0gICAgICAgIGhhbmRsZSBw
YXJlbnQgPSBudWxsKCk7Ci0gICAgICAgIGludCBjbXA7Ci0KLSAgICAgICAgZG8gewotICAgICAg
ICAgICAgaWYgKGdldF9iZihoaCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHVuYmFsID0gaGg7
Ci0gICAgICAgICAgICAgICAgcGFyZW50X3VuYmFsID0gcGFyZW50OwotICAgICAgICAgICAgICAg
IHVuYmFsX2RlcHRoID0gZGVwdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbXAgPSBj
bXBfbl9uKGgsIGhoKTsKLSAgICAgICAgICAgIGlmIChjbXAgPT0gMCkKLSAgICAgICAgICAgICAg
ICAvLyBEdXBsaWNhdGUga2V5LgotICAgICAgICAgICAgICAgIHJldHVybiBoaDsKLSAgICAgICAg
ICAgIHBhcmVudCA9IGhoOwotICAgICAgICAgICAgaGggPSBjbXAgPCAwID8gZ2V0X2x0KGhoKSA6
IGdldF9ndChoaCk7Ci0gICAgICAgICAgICBicmFuY2hbZGVwdGgrK10gPSBjbXAgPiAwOwotICAg
ICAgICB9IHdoaWxlIChoaCAhPSBudWxsKCkpOwotCi0gICAgICAgIC8vICBBZGQgbm9kZSB0byBp
bnNlcnQgYXMgbGVhZiBvZiB0cmVlLgotICAgICAgICBpZiAoY21wIDwgMCkKLSAgICAgICAgICAg
IHNldF9sdChwYXJlbnQsIGgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXRfZ3QocGFy
ZW50LCBoKTsKLQotICAgICAgICBkZXB0aCA9IHVuYmFsX2RlcHRoOwotCi0gICAgICAgIGlmICh1
bmJhbCA9PSBudWxsKCkpCi0gICAgICAgICAgICBoaCA9IGFicy5yb290OwotICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgIGNtcCA9IGJyYW5jaFtkZXB0aCsrXSA/IDEgOiAtMTsKLSAgICAgICAg
ICAgIHVuYmFsX2JmID0gZ2V0X2JmKHVuYmFsKTsKLSAgICAgICAgICAgIGlmIChjbXAgPCAwKQot
ICAgICAgICAgICAgICAgIHVuYmFsX2JmLS07Ci0gICAgICAgICAgICBlbHNlICAvLyBjbXAgPiAw
Ci0gICAgICAgICAgICAgICAgdW5iYWxfYmYrKzsKLSAgICAgICAgICAgIGhoID0gY21wIDwgMCA/
IGdldF9sdCh1bmJhbCkgOiBnZXRfZ3QodW5iYWwpOwotICAgICAgICAgICAgaWYgKCh1bmJhbF9i
ZiAhPSAtMikgJiYgKHVuYmFsX2JmICE9IDIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gcmVi
YWxhbmNpbmcgb2YgdHJlZSBpcyBuZWNlc3NhcnkuCi0gICAgICAgICAgICAgICAgc2V0X2JmKHVu
YmFsLCB1bmJhbF9iZik7Ci0gICAgICAgICAgICAgICAgdW5iYWwgPSBudWxsKCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGggIT0gbnVsbCgpKQotICAgICAgICAg
ICAgd2hpbGUgKGggIT0gaGgpIHsKLSAgICAgICAgICAgICAgICBjbXAgPSBicmFuY2hbZGVwdGgr
K10gPyAxIDogLTE7Ci0gICAgICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKLSAgICAgICAgICAg
ICAgICAgICAgc2V0X2JmKGhoLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGhoID0gZ2V0X2x0
KGhoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBjbXAgPiAwCi0gICAgICAgICAgICAg
ICAgICAgIHNldF9iZihoaCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGhoID0gZ2V0X2d0KGho
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVuYmFs
ICE9IG51bGwoKSkgewotICAgICAgICAgICAgdW5iYWwgPSBiYWxhbmNlKHVuYmFsKTsKLSAgICAg
ICAgICAgIGlmIChwYXJlbnRfdW5iYWwgPT0gbnVsbCgpKQotICAgICAgICAgICAgICAgIGFicy5y
b290ID0gdW5iYWw7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXB0aCA9
IHVuYmFsX2RlcHRoIC0gMTsKLSAgICAgICAgICAgICAgICBjbXAgPSBicmFuY2hbZGVwdGhdID8g
MSA6IC0xOwotICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKQotICAgICAgICAgICAgICAgICAg
ICBzZXRfbHQocGFyZW50X3VuYmFsLCB1bmJhbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSAgLy8g
Y21wID4gMAotICAgICAgICAgICAgICAgICAgICBzZXRfZ3QocGFyZW50X3VuYmFsLCB1bmJhbCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaDsKLX0KLQot
dGVtcGxhdGUgPGNsYXNzIEFic3RyYWN0b3IsIHVuc2lnbmVkIG1heERlcHRoLCBjbGFzcyBCU2V0
PgotaW5saW5lIHR5cGVuYW1lIEFWTFRyZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+Ojpo
YW5kbGUKLUFWTFRyZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+OjpzZWFyY2goa2V5IGss
IHR5cGVuYW1lIEFWTFRyZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+OjpTZWFyY2hUeXBl
IHN0KQotewotICAgIGNvbnN0IGludCBNQVNLX0hJR0hfQklUID0gKGludCkgfiAoKH4gKHVuc2ln
bmVkKSAwKSA+PiAxKTsKLQotICAgIGludCBjbXAsIHRhcmdldF9jbXA7Ci0gICAgaGFuZGxlIG1h
dGNoX2ggPSBudWxsKCk7Ci0gICAgaGFuZGxlIGggPSBhYnMucm9vdDsKLQotICAgIGlmIChzdCAm
IExFU1MpCi0gICAgICAgIHRhcmdldF9jbXAgPSAxOwotICAgIGVsc2UgaWYgKHN0ICYgR1JFQVRF
UikKLSAgICAgICAgdGFyZ2V0X2NtcCA9IC0xOwotICAgIGVsc2UKLSAgICAgICAgdGFyZ2V0X2Nt
cCA9IDA7Ci0KLSAgICB3aGlsZSAoaCAhPSBudWxsKCkpIHsKLSAgICAgICAgY21wID0gY21wX2tf
bihrLCBoKTsKLSAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoc3QgJiBF
UVVBTCkgewotICAgICAgICAgICAgICAgIG1hdGNoX2ggPSBoOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY21wID0gLXRhcmdldF9jbXA7Ci0gICAg
ICAgIH0gZWxzZSBpZiAodGFyZ2V0X2NtcCAhPSAwKQotICAgICAgICAgICAgaWYgKCEoKGNtcCBe
IHRhcmdldF9jbXApICYgTUFTS19ISUdIX0JJVCkpCi0gICAgICAgICAgICAgICAgLy8gY21wIGFu
ZCB0YXJnZXRfY21wIGFyZSBib3RoIHBvc2l0aXZlIG9yIGJvdGggbmVnYXRpdmUuCi0gICAgICAg
ICAgICAgICAgbWF0Y2hfaCA9IGg7Ci0gICAgICAgIGggPSBjbXAgPCAwID8gZ2V0X2x0KGgpIDog
Z2V0X2d0KGgpOwotICAgIH0KLQotICAgIHJldHVybiBtYXRjaF9oOwotfQotCi10ZW1wbGF0ZSA8
Y2xhc3MgQWJzdHJhY3RvciwgdW5zaWduZWQgbWF4RGVwdGgsIGNsYXNzIEJTZXQ+Ci1pbmxpbmUg
dHlwZW5hbWUgQVZMVHJlZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwgQlNldD46OmhhbmRsZQotQVZM
VHJlZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwgQlNldD46OnNlYXJjaF9sZWFzdCgpCi17Ci0gICAg
aGFuZGxlIGggPSBhYnMucm9vdCwgcGFyZW50ID0gbnVsbCgpOwotCi0gICAgd2hpbGUgKGggIT0g
bnVsbCgpKSB7Ci0gICAgICAgIHBhcmVudCA9IGg7Ci0gICAgICAgIGggPSBnZXRfbHQoaCk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHBhcmVudDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEFic3RyYWN0
b3IsIHVuc2lnbmVkIG1heERlcHRoLCBjbGFzcyBCU2V0PgotaW5saW5lIHR5cGVuYW1lIEFWTFRy
ZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+OjpoYW5kbGUKLUFWTFRyZWU8QWJzdHJhY3Rv
ciwgbWF4RGVwdGgsIEJTZXQ+OjpzZWFyY2hfZ3JlYXRlc3QoKQotewotICAgIGhhbmRsZSBoID0g
YWJzLnJvb3QsIHBhcmVudCA9IG51bGwoKTsKLQotICAgIHdoaWxlIChoICE9IG51bGwoKSkgewot
ICAgICAgICBwYXJlbnQgPSBoOwotICAgICAgICBoID0gZ2V0X2d0KGgpOwotICAgIH0KLQotICAg
IHJldHVybiBwYXJlbnQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBBYnN0cmFjdG9yLCB1bnNpZ25l
ZCBtYXhEZXB0aCwgY2xhc3MgQlNldD4KLWlubGluZSB0eXBlbmFtZSBBVkxUcmVlPEFic3RyYWN0
b3IsIG1heERlcHRoLCBCU2V0Pjo6aGFuZGxlCi1BVkxUcmVlPEFic3RyYWN0b3IsIG1heERlcHRo
LCBCU2V0Pjo6cmVtb3ZlKGtleSBrKQotewotICAgIC8vIFplcm8tYmFzZWQgZGVwdGggaW4gdHJl
ZS4KLSAgICB1bnNpZ25lZCBkZXB0aCA9IDAsIHJtX2RlcHRoOwotCi0gICAgLy8gUmVjb3JkcyBh
IHBhdGggaW50byB0aGUgdHJlZS4gIElmIGJyYW5jaFtuXSBpcyB0cnVlLCBpbmRpY2F0ZXMKLSAg
ICAvLyB0YWtlIGdyZWF0ZXIgYnJhbmNoIGZyb20gdGhlIG50aCBub2RlIGluIHRoZSBwYXRoLCBv
dGhlcndpc2UKLSAgICAvLyB0YWtlIHRoZSBsZXNzIGJyYW5jaC4gIGJyYW5jaFswXSBnaXZlcyBi
cmFuY2ggZnJvbSByb290LCBhbmQKLSAgICAvLyBzbyBvbi4KLSAgICBCU2V0IGJyYW5jaDsKLQot
ICAgIGhhbmRsZSBoID0gYWJzLnJvb3Q7Ci0gICAgaGFuZGxlIHBhcmVudCA9IG51bGwoKSwgY2hp
bGQ7Ci0gICAgaW50IGNtcCwgY21wX3Nob3J0ZW5lZF9zdWJfd2l0aF9wYXRoID0gMDsKLQotICAg
IGZvciAoOzspIHsKLSAgICAgICAgaWYgKGggPT0gbnVsbCgpKQotICAgICAgICAgICAgLy8gTm8g
bm9kZSBpbiB0cmVlIHdpdGggZ2l2ZW4ga2V5LgotICAgICAgICAgICAgcmV0dXJuIG51bGwoKTsK
LSAgICAgICAgY21wID0gY21wX2tfbihrLCBoKTsKLSAgICAgICAgaWYgKGNtcCA9PSAwKQotICAg
ICAgICAgICAgLy8gRm91bmQgbm9kZSB0byByZW1vdmUuCi0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgcGFyZW50ID0gaDsKLSAgICAgICAgaCA9IGNtcCA8IDAgPyBnZXRfbHQoaCkgOiBnZXRf
Z3QoaCk7Ci0gICAgICAgIGJyYW5jaFtkZXB0aCsrXSA9IGNtcCA+IDA7Ci0gICAgICAgIGNtcF9z
aG9ydGVuZWRfc3ViX3dpdGhfcGF0aCA9IGNtcDsKLSAgICB9Ci0gICAgaGFuZGxlIHJtID0gaDsK
LSAgICBoYW5kbGUgcGFyZW50X3JtID0gcGFyZW50OwotICAgIHJtX2RlcHRoID0gZGVwdGg7Ci0K
LSAgICAvLyBJZiB0aGUgbm9kZSB0byByZW1vdmUgaXMgbm90IGEgbGVhZiBub2RlLCB3ZSBuZWVk
IHRvIGdldCBhCi0gICAgLy8gbGVhZiBub2RlLCBvciBhIG5vZGUgd2l0aCBhIHNpbmdsZSBsZWFm
IGFzIGl0cyBjaGlsZCwgdG8gcHV0Ci0gICAgLy8gaW4gdGhlIHBsYWNlIG9mIHRoZSBub2RlIHRv
IHJlbW92ZS4gIFdlIHdpbGwgZ2V0IHRoZSBncmVhdGVzdAotICAgIC8vIG5vZGUgaW4gdGhlIGxl
c3Mgc3VidHJlZSAob2YgdGhlIG5vZGUgdG8gcmVtb3ZlKSwgb3IgdGhlIGxlYXN0Ci0gICAgLy8g
bm9kZSBpbiB0aGUgZ3JlYXRlciBzdWJ0cmVlLiAgV2UgdGFrZSB0aGUgbGVhZiBub2RlIGZyb20g
dGhlCi0gICAgLy8gZGVlcGVyIHN1YnRyZWUsIGlmIHRoZXJlIGlzIG9uZS4KLQotICAgIGlmIChn
ZXRfYmYoaCkgPCAwKSB7Ci0gICAgICAgIGNoaWxkID0gZ2V0X2x0KGgpOwotICAgICAgICBicmFu
Y2hbZGVwdGhdID0gZmFsc2U7Ci0gICAgICAgIGNtcCA9IC0xOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIGNoaWxkID0gZ2V0X2d0KGgpOwotICAgICAgICBicmFuY2hbZGVwdGhdID0gdHJ1ZTsKLSAg
ICAgICAgY21wID0gMTsKLSAgICB9Ci0gICAgZGVwdGgrKzsKLQotICAgIGlmIChjaGlsZCAhPSBu
dWxsKCkpIHsKLSAgICAgICAgY21wID0gLWNtcDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAg
cGFyZW50ID0gaDsKLSAgICAgICAgICAgIGggPSBjaGlsZDsKLSAgICAgICAgICAgIGlmIChjbXAg
PCAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSBnZXRfbHQoaCk7Ci0gICAgICAgICAgICAg
ICAgYnJhbmNoW2RlcHRoXSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgICAgICBjaGlsZCA9IGdldF9ndChoKTsKLSAgICAgICAgICAgICAgICBicmFuY2hbZGVwdGhd
ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlcHRoKys7Ci0gICAgICAgIH0g
d2hpbGUgKGNoaWxkICE9IG51bGwoKSk7Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBybSkKLSAg
ICAgICAgICAgIC8vIE9ubHkgd2VudCB0aHJvdWdoIGRvIGxvb3Agb25jZS4gIERlbGV0ZWQgbm9k
ZSB3aWxsIGJlIHJlcGxhY2VkCi0gICAgICAgICAgICAvLyBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUg
Ynkgb25lIG9mIGl0cyBpbW1lZGlhdGUgY2hpbGRyZW4uCi0gICAgICAgICAgICBjbXBfc2hvcnRl
bmVkX3N1Yl93aXRoX3BhdGggPSAtY21wOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjbXBf
c2hvcnRlbmVkX3N1Yl93aXRoX3BhdGggPSBjbXA7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBoYW5k
bGUgb2YgdGhlIG9wcG9zaXRlIGNoaWxkLCB3aGljaCBtYXkgbm90IGJlIG51bGwuCi0gICAgICAg
IGNoaWxkID0gY21wID4gMCA/IGdldF9sdChoKSA6IGdldF9ndChoKTsKLSAgICB9Ci0KLSAgICBp
ZiAocGFyZW50ID09IG51bGwoKSkKLSAgICAgICAgLy8gVGhlcmUgd2VyZSBvbmx5IDEgb3IgMiBu
b2RlcyBpbiB0aGlzIHRyZWUuCi0gICAgICAgIGFicy5yb290ID0gY2hpbGQ7Ci0gICAgZWxzZSBp
ZiAoY21wX3Nob3J0ZW5lZF9zdWJfd2l0aF9wYXRoIDwgMCkKLSAgICAgICAgc2V0X2x0KHBhcmVu
dCwgY2hpbGQpOwotICAgIGVsc2UKLSAgICAgICAgc2V0X2d0KHBhcmVudCwgY2hpbGQpOwotCi0g
ICAgLy8gInBhdGgiIGlzIHRoZSBwYXJlbnQgb2YgdGhlIHN1YnRyZWUgYmVpbmcgZWxpbWluYXRl
ZCBvciByZWR1Y2VkCi0gICAgLy8gZnJvbSBhIGRlcHRoIG9mIDIgdG8gMS4gIElmICJwYXRoIiBp
cyB0aGUgbm9kZSB0byBiZSByZW1vdmVkLCB3ZQotICAgIC8vIHNldCBwYXRoIHRvIHRoZSBub2Rl
IHdlJ3JlIGFib3V0IHRvIHBva2UgaW50byB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAgLy8gbm9k
ZSB0byBiZSByZW1vdmVkLgotICAgIGhhbmRsZSBwYXRoID0gcGFyZW50ID09IHJtID8gaCA6IHBh
cmVudDsKLQotICAgIGlmIChoICE9IHJtKSB7Ci0gICAgICAgIC8vIFBva2UgaW4gdGhlIHJlcGxh
Y2VtZW50IGZvciB0aGUgbm9kZSB0byBiZSByZW1vdmVkLgotICAgICAgICBzZXRfbHQoaCwgZ2V0
X2x0KHJtKSk7Ci0gICAgICAgIHNldF9ndChoLCBnZXRfZ3Qocm0pKTsKLSAgICAgICAgc2V0X2Jm
KGgsIGdldF9iZihybSkpOwotICAgICAgICBpZiAocGFyZW50X3JtID09IG51bGwoKSkKLSAgICAg
ICAgICAgIGFicy5yb290ID0gaDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkZXB0aCA9
IHJtX2RlcHRoIC0gMTsKLSAgICAgICAgICAgIGlmIChicmFuY2hbZGVwdGhdKQotICAgICAgICAg
ICAgICAgIHNldF9ndChwYXJlbnRfcm0sIGgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIHNldF9sdChwYXJlbnRfcm0sIGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYg
KHBhdGggIT0gbnVsbCgpKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBsaW5rZWQg
bGlzdCBmcm9tIHRoZSBwYXJlbnQgb2YgdGhlIHBhdGggbm9kZQotICAgICAgICAvLyB0byB0aGUg
cm9vdCBub2RlLgotICAgICAgICBoID0gYWJzLnJvb3Q7Ci0gICAgICAgIHBhcmVudCA9IG51bGwo
KTsKLSAgICAgICAgZGVwdGggPSAwOwotICAgICAgICB3aGlsZSAoaCAhPSBwYXRoKSB7Ci0gICAg
ICAgICAgICBpZiAoYnJhbmNoW2RlcHRoKytdKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSBn
ZXRfZ3QoaCk7Ci0gICAgICAgICAgICAgICAgc2V0X2d0KGgsIHBhcmVudCk7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxkID0gZ2V0X2x0KGgpOwotICAgICAgICAg
ICAgICAgIHNldF9sdChoLCBwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFy
ZW50ID0gaDsKLSAgICAgICAgICAgIGggPSBjaGlsZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IENsaW1iIGZyb20gdGhlIHBhdGggbm9kZSB0byB0aGUgcm9vdCBub2RlIHVzaW5nIHRoZSBsaW5r
ZWQKLSAgICAgICAgLy8gbGlzdCwgcmVzdG9yaW5nIHRoZSB0cmVlIHN0cnVjdHVyZSBhbmQgcmVi
YWxhbmNpbmcgYXMgbmVjZXNzYXJ5LgotICAgICAgICBib29sIHJlZHVjZWRfZGVwdGggPSB0cnVl
OwotICAgICAgICBpbnQgYmY7Ci0gICAgICAgIGNtcCA9IGNtcF9zaG9ydGVuZWRfc3ViX3dpdGhf
cGF0aDsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgaWYgKHJlZHVjZWRfZGVwdGgp
IHsKLSAgICAgICAgICAgICAgICBiZiA9IGdldF9iZihoKTsKLSAgICAgICAgICAgICAgICBpZiAo
Y21wIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYmYrKzsKLSAgICAgICAgICAgICAgICBlbHNl
ICAvLyBjbXAgPiAwCi0gICAgICAgICAgICAgICAgICAgIGJmLS07Ci0gICAgICAgICAgICAgICAg
aWYgKChiZiA9PSAtMikgfHwgKGJmID09IDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGggPSBi
YWxhbmNlKGgpOwotICAgICAgICAgICAgICAgICAgICBiZiA9IGdldF9iZihoKTsKLSAgICAgICAg
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKGgsIGJmKTsKLSAgICAg
ICAgICAgICAgICByZWR1Y2VkX2RlcHRoID0gKGJmID09IDApOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBjaGlsZCA9IGg7Ci0gICAgICAgICAgICBoID0gcGFyZW50OwotICAgICAgICAg
ICAgY21wID0gYnJhbmNoWy0tZGVwdGhdID8gMSA6IC0xOwotICAgICAgICAgICAgaWYgKGNtcCA8
IDApICAgIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBnZXRfbHQoaCk7Ci0gICAgICAgICAg
ICAgICAgc2V0X2x0KGgsIGNoaWxkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgcGFyZW50ID0gZ2V0X2d0KGgpOwotICAgICAgICAgICAgICAgIHNldF9ndChoLCBjaGls
ZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWJzLnJvb3QgPSBoOwotICAg
IH0KLQotICAgIHJldHVybiBybTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEFic3RyYWN0b3IsIHVu
c2lnbmVkIG1heERlcHRoLCBjbGFzcyBCU2V0PgotaW5saW5lIHR5cGVuYW1lIEFWTFRyZWU8QWJz
dHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+OjpoYW5kbGUKLUFWTFRyZWU8QWJzdHJhY3RvciwgbWF4
RGVwdGgsIEJTZXQ+OjpzdWJzdChoYW5kbGUgbmV3X25vZGUpCi17Ci0gICAgaGFuZGxlIGggPSBh
YnMucm9vdDsKLSAgICBoYW5kbGUgcGFyZW50ID0gbnVsbCgpOwotICAgIGludCBjbXAsIGxhc3Rf
Y21wOwotCi0gICAgLyogU2VhcmNoIGZvciBub2RlIGFscmVhZHkgaW4gdHJlZSB3aXRoIHNhbWUg
a2V5LiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGggPT0gbnVsbCgpKQotICAgICAg
ICAgICAgLyogTm8gbm9kZSBpbiB0cmVlIHdpdGggc2FtZSBrZXkgYXMgbmV3IG5vZGUuICovCi0g
ICAgICAgICAgICByZXR1cm4gbnVsbCgpOwotICAgICAgICBjbXAgPSBjbXBfbl9uKG5ld19ub2Rl
LCBoKTsKLSAgICAgICAgaWYgKGNtcCA9PSAwKQotICAgICAgICAgICAgLyogRm91bmQgdGhlIG5v
ZGUgdG8gc3Vic3RpdHV0ZSBuZXcgb25lIGZvci4gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBsYXN0X2NtcCA9IGNtcDsKLSAgICAgICAgcGFyZW50ID0gaDsKLSAgICAgICAgaCA9IGNt
cCA8IDAgPyBnZXRfbHQoaCkgOiBnZXRfZ3QoaCk7Ci0gICAgfQotCi0gICAgLyogQ29weSB0cmVl
IGhvdXNla2VlcGluZyBmaWVsZHMgZnJvbSBub2RlIGluIHRyZWUgdG8gbmV3IG5vZGUuICovCi0g
ICAgc2V0X2x0KG5ld19ub2RlLCBnZXRfbHQoaCkpOwotICAgIHNldF9ndChuZXdfbm9kZSwgZ2V0
X2d0KGgpKTsKLSAgICBzZXRfYmYobmV3X25vZGUsIGdldF9iZihoKSk7Ci0KLSAgICBpZiAocGFy
ZW50ID09IG51bGwoKSkKLSAgICAgICAgLyogTmV3IG5vZGUgaXMgYWxzbyBuZXcgcm9vdC4gKi8K
LSAgICAgICAgYWJzLnJvb3QgPSBuZXdfbm9kZTsKLSAgICBlbHNlIHsKLSAgICAgICAgLyogTWFr
ZSBwYXJlbnQgcG9pbnQgdG8gbmV3IG5vZGUuICovCi0gICAgICAgIGlmIChsYXN0X2NtcCA8IDAp
Ci0gICAgICAgICAgICBzZXRfbHQocGFyZW50LCBuZXdfbm9kZSk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHNldF9ndChwYXJlbnQsIG5ld19ub2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
aDsKLX0KLQotfQotCi0jZW5kaWYKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MzE5OCkKKysrIExheW91
dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDE1LTA0
LTIxICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CisKKyAgICAgICAgSXQgc2hv
dWxkbid0IHRha2UgMTg0NiBsaW5lcyBvZiBjb2RlIGFuZCA1IEZJWE1FcyB0byBzb3J0IGFuIGFy
cmF5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0
MDEzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBq
cy9zY3JpcHQtdGVzdHMvYXJyYXktaG9sZXMuanM6IAorICAgICAgICAqIGpzL2FycmF5LWhvbGVz
LWV4cGVjdGVkLnR4dDogVGhpcyByZXN1bHQgbm93IG1hdGNoZXMgRmlyZWZveC4gV2Ugc2VlCisg
ICAgICAgICdwZWVrYWJvbycsIHdoaWNoIGlzIGEgcHJvdG90eXBlIHByb3BlcnR5LCByYXRoZXIg
dGhhbiBhIGhvbGUsIGJlY2F1c2UKKyAgICAgICAgc29ydGluZyB1c2VzIFtbR2V0XV0sIHdoaWNo
IHNlZXMgcHJvdG90eXBlIHByb3BlcnRpZXMuCisKKyAgICAgICAgVGhlIEVTNiBzcGVjIHNheXMg
dGhhdCBzb3J0aW5nIHNob3VsZCB1c2UgW1tHZXRdXSwgc28gdGhpcyBuZXcgcmVzdWx0CisgICAg
ICAgIG1hdGNoZXMgdGhlIHNwZWMgYSBsaXR0bGUgYmV0dGVyIC0tIGFsdGhvdWdoIHRoZSBzcGVj
IGFsc28gc2F5cyB0aGF0IHRoZQorICAgICAgICByZXN1bHQgb2Ygc29ydGluZyBpcyB1bmRlZmlu
ZWQgaW4gdGhpcyBjYXNlIGJlY2F1c2Ugb2YgdGhlIHByZXNlbmNlIG9mCisgICAgICAgIGFuIGlu
ZGV4ZWQgcHJvcGVydHkgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi4KKworICAgICAgICAqIGpzL2Rv
bS9hcnJheS1wcm90b3R5cGUtcHJvcGVydGllcy1leHBlY3RlZC50eHQ6IFVwZGF0ZWQgZXJyb3Ig
bWVzc2FnZQorICAgICAgICB0byBtYXRjaCBvdGhlciBhcnJheSBwcm90b3R5cGUgZXJyb3IgbWVz
c2FnZXMuCisKIDIwMTUtMDQtMjMgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAog
ICAgICAgICBVbnJldmlld2VkLCB0ZW1wb3JhcmlseSBza2lwIGh0dHAvdGVzdHMvd2Vic29ja2V0
L3Rlc3RzL2h5Ymkvc3RvcC1vbi1yZXN1bWUtaW4tZXJyb3ItaGFuZGxlci5odG1sIG9uIFdpbmRv
d3MuCkluZGV4OiBMYXlvdXRUZXN0cy9qcy9hcnJheS1ob2xlcy1leHBlY3RlZC50eHQKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvanMvYXJyYXktaG9sZXMtZXhwZWN0ZWQudHh0CShyZXZpc2lv
biAxODMxOTgpCisrKyBMYXlvdXRUZXN0cy9qcy9hcnJheS1ob2xlcy1leHBlY3RlZC50eHQJKHdv
cmtpbmcgY29weSkKQEAgLTM2LDcgKzM2LDcgQEAgUEFTUyBzaG93SG9sZXMoWzAsICwgMl0uY29u
Y2F0KFszLCAsIDVdKQogUEFTUyBzaG93SG9sZXMoWzAsICwgMiwgM10ucmV2ZXJzZSgpKSBpcyAn
WzMsIDIsIHBlZWthYm9vLCAwXScKIFBBU1MgYSA9IFswLCAsIDIsIDNdOyBhLnNoaWZ0KCk7IHNo
b3dIb2xlcyhhKSBpcyAnW3BlZWthYm9vLCAyLCAzXScKIFBBU1Mgc2hvd0hvbGVzKFswLCAsIDIs
IDNdLnNsaWNlKDAsIDMpKSBpcyAnWzAsIHBlZWthYm9vLCAyXScKLVBBU1Mgc2hvd0hvbGVzKFsw
LCAsIDIsIDNdLnNvcnQoKSkgaXMgJ1swLCAyLCAzLCBob2xlXScKK1BBU1Mgc2hvd0hvbGVzKFsw
LCAsIDIsIDNdLnNvcnQoKSkgaXMgJ1swLCAyLCAzLCBwZWVrYWJvb10nCiBQQVNTIHNob3dIb2xl
cyhbMCwgdW5kZWZpbmVkLCAyLCAzXS5zb3J0KCkpIGlzICdbMCwgMiwgMywgdW5kZWZpbmVkXScK
IFBBU1MgYSA9IFswLCAsIDIsIDNdOyBhLnNwbGljZSgyLCAzLCA1LCA2KTsgc2hvd0hvbGVzKGEp
IGlzICdbMCwgaG9sZSwgNSwgNl0nCiBQQVNTIGEgPSBbMCwgLCAyLCAzXTsgYS51bnNoaWZ0KDQp
OyBzaG93SG9sZXMoYSkgaXMgJ1s0LCAwLCBwZWVrYWJvbywgMiwgM10nCkluZGV4OiBMYXlvdXRU
ZXN0cy9qcy9kb20vYXJyYXktcHJvdG90eXBlLXByb3BlcnRpZXMtZXhwZWN0ZWQudHh0Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL2pzL2RvbS9hcnJheS1wcm90b3R5cGUtcHJvcGVydGllcy1l
eHBlY3RlZC50eHQJKHJldmlzaW9uIDE4MzE5OCkKKysrIExheW91dFRlc3RzL2pzL2RvbS9hcnJh
eS1wcm90b3R5cGUtcHJvcGVydGllcy1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTEy
LDcgKzEyLDcgQEAgUEFTUyBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHVuZGVmaW5lZAogUEFT
UyBBcnJheS5wcm90b3R5cGUucmV2ZXJzZS5jYWxsKHVuZGVmaW5lZCkgdGhyZXcgZXhjZXB0aW9u
IFR5cGVFcnJvcjogdW5kZWZpbmVkIGlzIG5vdCBhbiBvYmplY3QgKGV2YWx1YXRpbmcgJ0FycmF5
LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwodW5kZWZpbmVkKScpLgogUEFTUyBBcnJheS5wcm90b3R5
cGUuc2hpZnQuY2FsbCh1bmRlZmluZWQpIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVm
aW5lZCBpcyBub3QgYW4gb2JqZWN0IChldmFsdWF0aW5nICdBcnJheS5wcm90b3R5cGUuc2hpZnQu
Y2FsbCh1bmRlZmluZWQpJykuCiBQQVNTIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHVuZGVm
aW5lZCwgMCwgMSkgdGhyZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjogdW5kZWZpbmVkIGlzIG5vdCBh
biBvYmplY3QgKGV2YWx1YXRpbmcgJ0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHVuZGVmaW5l
ZCwgMCwgMSknKS4KLVBBU1MgQXJyYXkucHJvdG90eXBlLnNvcnQuY2FsbCh1bmRlZmluZWQpIHRo
cmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChldmFs
dWF0aW5nICdBcnJheS5wcm90b3R5cGUuc29ydC5jYWxsKHVuZGVmaW5lZCknKS4KK1BBU1MgQXJy
YXkucHJvdG90eXBlLnNvcnQuY2FsbCh1bmRlZmluZWQpIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJy
b3I6IEFycmF5LnByb3RvdHlwZS5zb3J0IHJlcXVpcmVzIHRoYXQgfHRoaXN8IG5vdCBiZSB1bmRl
ZmluZWQuCiBQQVNTIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbCh1bmRlZmluZWQsIDAsIDEp
IHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChl
dmFsdWF0aW5nICdBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwodW5kZWZpbmVkLCAwLCAxKScp
LgogUEFTUyBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHVuZGVmaW5lZCwge30pIHRocmV3
IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChldmFsdWF0
aW5nICdBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHVuZGVmaW5lZCwge30pJykuCiBQQVNT
IEFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKHVuZGVmaW5lZCwgdG9TdHJpbmcpIHRocmV3IGV4
Y2VwdGlvbiBUeXBlRXJyb3I6IEFycmF5LnByb3RvdHlwZS5ldmVyeSByZXF1aXJlcyB0aGF0IHx0
aGlzfCBub3QgYmUgdW5kZWZpbmVkLgpJbmRleDogTGF5b3V0VGVzdHMvanMvc2NyaXB0LXRlc3Rz
L2FycmF5LWhvbGVzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0
cy9hcnJheS1ob2xlcy5qcwkocmV2aXNpb24gMTgzMTk4KQorKysgTGF5b3V0VGVzdHMvanMvc2Ny
aXB0LXRlc3RzL2FycmF5LWhvbGVzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC04Nyw3ICs4Nyw3IEBA
IHNob3VsZEJlKCJzaG93SG9sZXMoWzAsICwgMl0uY29uY2F0KFszLCAKIHNob3VsZEJlKCJzaG93
SG9sZXMoWzAsICwgMiwgM10ucmV2ZXJzZSgpKSIsICInWzMsIDIsIHBlZWthYm9vLCAwXSciKTsK
IHNob3VsZEJlKCJhID0gWzAsICwgMiwgM107IGEuc2hpZnQoKTsgc2hvd0hvbGVzKGEpIiwgIidb
cGVla2Fib28sIDIsIDNdJyIpOwogc2hvdWxkQmUoInNob3dIb2xlcyhbMCwgLCAyLCAzXS5zbGlj
ZSgwLCAzKSkiLCAiJ1swLCBwZWVrYWJvbywgMl0nIik7Ci1zaG91bGRCZSgic2hvd0hvbGVzKFsw
LCAsIDIsIDNdLnNvcnQoKSkiLCAiJ1swLCAyLCAzLCBob2xlXSciKTsKK3Nob3VsZEJlKCJzaG93
SG9sZXMoWzAsICwgMiwgM10uc29ydCgpKSIsICInWzAsIDIsIDMsIHBlZWthYm9vXSciKTsKIHNo
b3VsZEJlKCJzaG93SG9sZXMoWzAsIHVuZGVmaW5lZCwgMiwgM10uc29ydCgpKSIsICInWzAsIDIs
IDMsIHVuZGVmaW5lZF0nIik7CiBzaG91bGRCZSgiYSA9IFswLCAsIDIsIDNdOyBhLnNwbGljZSgy
LCAzLCA1LCA2KTsgc2hvd0hvbGVzKGEpIiwgIidbMCwgaG9sZSwgNSwgNl0nIik7CiBzaG91bGRC
ZSgiYSA9IFswLCAsIDIsIDNdOyBhLnVuc2hpZnQoNCk7IHNob3dIb2xlcyhhKSIsICInWzQsIDAs
IHBlZWthYm9vLCAyLCAzXSciKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>251567</attachid>
            <date>2015-04-24 12:43:58 -0700</date>
            <delta_ts>2015-04-24 15:12:36 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144013-20150424124252.patch</filename>
            <type>text/plain</type>
            <size>107751</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzNCBA
QAorMjAxNS0wNC0yMSAgR2VvZmZyZXkgR2FyZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgorCisgICAg
ICAgIEl0IHNob3VsZG4ndCB0YWtlIDE4NDYgbGluZXMgb2YgY29kZSBhbmQgNSBGSVhNRXMgdG8g
c29ydCBhbiBhcnJheS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NDAxMworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFRoaXMgcGF0Y2ggaW1wbGVtZW50cyBBcnJheS5wcm90b3R5cGUuc29ydCBpbiBKYXZh
U2NyaXB0LCByZW1vdmluZyB0aGUKKyAgICAgICAgQysrIGltcGxlbWVudGF0aW9ucy4gSXQgaXMg
c2ltcGxlciBhbmQgbGVzcyBlcnJvci1wcm9uZSB0byBleHByZXNzIG91cgorICAgICAgICBvcGVy
YXRpb25zIGluIEphdmFTY3JpcHQsIHdoaWNoIHByb3ZpZGVzIG1lbW9yeSBzYWZldHksIGV4Y2Vw
dGlvbiBzYWZldHksCisgICAgICAgIGFuZCByZWN1cnNpb24gc2FmZXR5LgorCisgICAgICAgIFRo
ZSBwZXJmb3JtYW5jZSByZXN1bHQgaXMgbWl4ZWQsIGJ1dCBuZXQgcG9zaXRpdmUgaW4gbXkgb3Bp
bmlvbi4gSXQncworICAgICAgICBkaWZmaWN1bHQgdG8gZW51bWVyYXRlIGFsbCB0aGUgcmVzdWx0
cywgc2luY2Ugd2UgdXNlZCB0byBoYXZlIHNvIG1hbnkKKyAgICAgICAgZGlmZmVyZW50IHNvcnRp
bmcgbW9kZXMsIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBkaWZmZXJlbnQgZGF0YSBwYXR0ZXJucwor
ICAgICAgICBhY3Jvc3Mgd2hpY2ggeW91IG1pZ2h0IHdhbnQgdG8gbWVhc3VyZSBzb3J0aW5nLiBT
dWZmaWNlIGl0IHRvIHNheToKKworICAgICAgICAgICAgKCopIFRoZSBiZW5jaG1hcmtzIHdlIHRy
YWNrIGFyZSBmYXN0ZXIgb3IgdW5jaGFuZ2VkLgorCisgICAgICAgICAgICAoKikgU29ydGluZyBy
YW5kb20gaW5wdXQgdXNpbmcgYSBjb21wYXJhdG9yIC0tIHdoaWNoIHdlIHRoaW5rIGlzCisgICAg
ICAgICAgICBjb21tb24gLS0gaXMgM1ggZmFzdGVyLgorCisgICAgICAgICAgICAoKikgU29ydGlu
ZyByYW5kb20gaW5wdXQgaW4gYSBub24tYXJyYXkgb2JqZWN0IC0tIHdoaWNoIGpRdWVyeSBkb2Vz
CisgICAgICAgICAgICAtLSBpcyA0WCBmYXN0ZXIuCisKKyAgICAgICAgICAgICgqKSBTb3J0aW5n
IHJhbmRvbSBpbnB1dCBpbiBhIGNvbXBhY3QgYXJyYXkgb2YgaW50ZWdlcnMgdXNpbmcgYQorICAg
ICAgICAgICAgdHJpdmlhbCBwYXR0ZXJuLW1hdGNoYWJsZSBjb21wYXJhdG9yIGlzIDJYICpzbG93
ZXIqLgorCisgICAgICAgICogYnVpbHRpbnMvQXJyYXkucHJvdG90eXBlLmpzOgorICAgICAgICAo
c29ydC5taW4pOgorICAgICAgICAoc29ydC5zdHJpbmdDb21wYXJhdG9yKToKKyAgICAgICAgKHNv
cnQuY29tcGFjdFNwYXJzZSk6IFNwZWNpYWwgY2FzZSBjb21wYWN0aW9uIGZvciBzcGFyc2UgYXJy
YXlzIGJlY2F1c2UKKyAgICAgICAgd2UgZG9uJ3Qgd2FudCB0byBoYW5nIHdoZW4gc29ydGluZyBu
ZXcgQXJyYXkoQklHKS4KKworICAgICAgICAoc29ydC5jb21wYWN0KToKKyAgICAgICAgKHNvcnQu
bWVyZ2UpOgorICAgICAgICAoc29ydC5tZXJnZVNvcnQpOiBVc2UgbWVyZ2Ugc29ydCBiZWNhdXNl
IGl0J3MgYSByZWFzb25hYmx5IGVmZmljaWVudAorICAgICAgICBzdGFibGUgc29ydC4gV2UgaGF2
ZSBldmlkZW5jZSB0aGF0IHNvbWUgc2l0ZXMgZGVwZW5kIG9uIHN0YWJsZSBzb3J0LAorICAgICAg
ICBldmVuIHRob3VnaCB0aGUgRVM2IHNwZWMgZG9lcyBub3QgbWFuZGF0ZSBpdC4gKFNlZQorICAg
ICAgICA8aHR0cDovL3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvMzM5Njc+LikKKworICAgICAg
ICBUaGlzIGlzIGEgdGV4dGJvb2sgaW1wbGVtZW50YXRpb24gb2YgbWVyZ2Ugc29ydCB3aXRoIHRo
cmVlIG9wdGltaXphdGlvbnM6CisKKyAgICAgICAgICAgICgxKSBVc2UgaXRlcmF0aW9uIGluc3Rl
YWQgb2YgcmVjdXJzaW9uOworCisgICAgICAgICAgICAoMikgVXNlIGFycmF5IHN1YnNjcmlwdGlu
ZyBpbnN0ZWFkIG9mIGFycmF5IGNvcHlpbmcgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgIGNyZWF0
ZSBsb2dpY2FsIHN1Yi1saXN0cyB3aXRob3V0IGNyZWF0aW5nIHBoeXNpY2FsIHN1Yi1saXN0czsK
KworICAgICAgICAgICAgKDMpIFN3YXAgc3JjIGFuZCBkc3QgYXQgZWFjaCBpdGVyYXRpb24gaW5z
dGVhZCBvZiBjb3B5aW5nIHNyYyBpbnRvCisgICAgICAgICAgICBkc3QsIGFuZCBvbmx5IGNvcHkg
c3JjIGludG8gdGhlIHN1YmplY3QgYXJyYXkgYXQgdGhlIGVuZCBpZiBzcmMgaXMKKyAgICAgICAg
ICAgIG5vdCB0aGUgc3ViamVjdCBhcnJheS4KKworICAgICAgICAoc29ydC5pbmZsYXRlKToKKyAg
ICAgICAgKHNvcnQuY29tcGFyYXRvclNvcnQpOgorICAgICAgICAoc29ydCk6IFNvcnQgaW4gSmF2
YVNjcmlwdCBmb3IgdGhlIHdpbi4KKworICAgICAgICAqIGJ1aWx0aW5zL0J1aWx0aW5FeGVjdXRh
Ymxlcy5jcHA6CisgICAgICAgIChKU0M6OkJ1aWx0aW5FeGVjdXRhYmxlczo6Y3JlYXRlRXhlY3V0
YWJsZUludGVybmFsKTogQWxsb3cgbm9uLXByaXZhdGUKKyAgICAgICAgbmFtZXMgc28gd2UgY2Fu
IHVzZSBoZWxwZXIgZnVuY3Rpb25zLgorCisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2NrLmg6
CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6aXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTogRGVs
ZXRlZC4KKyAgICAgICAgKiBieXRlY29kZS9VbmxpbmtlZENvZGVCbG9jay5jcHA6CisgICAgICAg
IChKU0M6OlVubGlua2VkQ29kZUJsb2NrOjpVbmxpbmtlZENvZGVCbG9jayk6CisgICAgICAgICog
Ynl0ZWNvZGUvVW5saW5rZWRDb2RlQmxvY2suaDoKKyAgICAgICAgKEpTQzo6VW5saW5rZWRDb2Rl
QmxvY2s6OnNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlVubGlua2VkQ29kZUJsb2NrOjppc051bWVyaWNDb21wYXJlRnVuY3Rpb24pOiBEZWxldGVk
LgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHA6CisgICAgICAg
IChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjpzZXRJc051bWVyaWNDb21wYXJlRnVuY3Rpb24pOiBE
ZWxldGVkLgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oOgorICAg
ICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwOgorICAgICAgICAoSlNDOjpGdW5j
dGlvbk5vZGU6OmVtaXRCeXRlY29kZSk6IFdlIGRvbid0IGRvIHRoaXMgc3BlY2lhbCBjYXNpbmcg
YmFzZWQKKyAgICAgICAgb24gcGF0dGVybiBtYXRjaGluZyBhbnltb3JlLiBUaGlzIHdhcyBtYWlu
bHkgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIAorICAgICAgICB0aGUgb3ZlcmhlYWQgb2YgY2Fs
bGluZyBmcm9tIEMrKyB0byBKUywgd2hpY2ggd2Ugbm93IGF2b2lkIGJ5CisgICAgICAgIHNvcnRp
bmcgaW4gSlMuCisKKyAgICAgICAgKiBoZWFwL0hlYXAuY3BwOgorICAgICAgICAoSlNDOjpIZWFw
OjptYXJrUm9vdHMpOgorICAgICAgICAoSlNDOjpIZWFwOjpwdXNoVGVtcFNvcnRWZWN0b3IpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpIZWFwOjpwb3BUZW1wU29ydFZlY3Rvcik6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkhlYXA6OnZpc2l0VGVtcFNvcnRWZWN0b3JzKTogRGVsZXRlZC4KKyAg
ICAgICAgKiBoZWFwL0hlYXAuaDogV2UgZG9uJ3QgaGF2ZSB0ZW1wIHNvcnQgdmVjdG9ycyBhbnlt
b3JlIGJlY2F1c2Ugd2Ugc29ydAorICAgICAgICBpbiBKYXZhU2NyaXB0IHVzaW5nIGEgbm9ybWFs
IEphdmFTY3JpcHQgYXJyYXkgZm9yIG91ciB0ZW1wb3Jhcnkgc3RvcmFnZS4KKworICAgICAgICAq
IHBhcnNlci9QYXJzZXIuY3BwOgorICAgICAgICAoSlNDOjpQYXJzZXI8TGV4ZXJUeXBlPjo6cGFy
c2VJbm5lcik6IEFsbG93IGNhcHR1cmluZyBzbyB3ZSBjYW4gdXNlCisgICAgICAgIGhlbHBlciBm
dW5jdGlvbnMuCisKKyAgICAgICAgKiBydW50aW1lL0FycmF5UHJvdG90eXBlLmNwcDoKKyAgICAg
ICAgKEpTQzo6aXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6YXR0ZW1wdEZhc3RTb3J0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6cGVyZm9ybVNsb3dT
b3J0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6YXJyYXlQcm90b0Z1bmNTb3J0KTogRGVsZXRl
ZC4KKworICAgICAgICAqIHJ1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuaDogTmV3IHN0cmluZ3Mg
dXNlZCBieSBzb3J0LgorCisgICAgICAgICogcnVudGltZS9KU0FycmF5LmNwcDoKKyAgICAgICAg
KEpTQzo6Y29tcGFyZU51bWJlcnNGb3JRU29ydFdpdGhJbnQzMik6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OmNvbXBhcmVOdW1iZXJzRm9yUVNvcnRXaXRoRG91YmxlKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6Y29tcGFyZU51bWJlcnNGb3JRU29ydCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OmNvbXBhcmVCeVN0cmluZ1BhaXJGb3JRU29ydCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkpT
QXJyYXk6OnNvcnROdW1lcmljVmVjdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNBcnJh
eTo6c29ydE51bWVyaWMpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpDb250aWd1b3VzVHlwZUFj
Y2Vzc29yOjpnZXRBc1ZhbHVlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6Q29udGlndW91c1R5
cGVBY2Nlc3Nvcjo6c2V0V2l0aFZhbHVlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6Q29udGln
dW91c1R5cGVBY2Nlc3Nvcjo6cmVwbGFjZURhdGFSZWZlcmVuY2UpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpDb250aWd1b3VzVHlwZUFjY2Vzc29yPEFycmF5V2l0aERvdWJsZT46OmdldEFzVmFs
dWUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpDb250aWd1b3VzVHlwZUFjY2Vzc29yPEFycmF5
V2l0aERvdWJsZT46OnNldFdpdGhWYWx1ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkNvbnRp
Z3VvdXNUeXBlQWNjZXNzb3I8QXJyYXlXaXRoRG91YmxlPjo6cmVwbGFjZURhdGFSZWZlcmVuY2Up
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpKU0FycmF5Ojpzb3J0Q29tcGFjdGVkVmVjdG9yKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNBcnJheTo6c29ydCk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpnZXRfbGVzcyk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpzZXRf
bGVzcyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlD
b21wYXJlOjpnZXRfZ3JlYXRlcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkFWTFRyZWVBYnN0
cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpzZXRfZ3JlYXRlcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpnZXRfYmFsYW5jZV9mYWN0b3Ip
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpBVkxUcmVlQWJzdHJhY3RvckZvckFycmF5Q29tcGFy
ZTo6c2V0X2JhbGFuY2VfZmFjdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QVZMVHJlZUFi
c3RyYWN0b3JGb3JBcnJheUNvbXBhcmU6OmNvbXBhcmVfa2V5X2tleSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlOjpjb21wYXJlX2tleV9u
b2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QVZMVHJlZUFic3RyYWN0b3JGb3JBcnJheUNv
bXBhcmU6OmNvbXBhcmVfbm9kZV9ub2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QVZMVHJl
ZUFic3RyYWN0b3JGb3JBcnJheUNvbXBhcmU6Om51bGwpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpKU0FycmF5Ojpzb3J0VmVjdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNBcnJheTo6
Y29tcGFjdEZvclNvcnRpbmcpOiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvSlNBcnJheS5o
OgorCisgICAgICAgICogcnVudGltZS9KU0dsb2JhbE9iamVjdC5jcHA6CisgICAgICAgIChKU0M6
OkpTR2xvYmFsT2JqZWN0Ojppbml0KToKKyAgICAgICAgKiBydW50aW1lL09iamVjdENvbnN0cnVj
dG9yLmNwcDoKKyAgICAgICAgKEpTQzo6T2JqZWN0Q29uc3RydWN0b3I6OmZpbmlzaENyZWF0aW9u
KTogUHJvdmlkZSBzb21lIGJ1aWx0aW5zIHVzZWQKKyAgICAgICAgYnkgc29ydC4KKwogMjAxNS0w
NC0yMiAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3
ZWQsIGZpeCBkZWJ1ZyBidWlsZC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9idWlsdGlu
cy9BcnJheS5wcm90b3R5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J1aWx0aW5zL0FycmF5LnByb3RvdHlwZS5qcwkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2J1aWx0aW5zL0FycmF5LnByb3RvdHlwZS5qcwkod29ya2luZyBjb3B5
KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LCAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMjc3LDMgKzI3NywxODUgQEAgZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiwg
ZnJvbQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CisKK2Z1bmN0aW9uIHNvcnQoY29tcGFy
YXRvcikKK3sKKyAgICAidXNlIHN0cmljdCI7CisKKyAgICBmdW5jdGlvbiBtaW4oYSwgYikKKyAg
ICB7CisgICAgICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOworICAgIH0KKworICAgIGZ1bmN0aW9u
IHN0cmluZ0NvbXBhcmF0b3IoYSwgYikKKyAgICB7CisgICAgICAgIHZhciBhU3RyaW5nID0gQFN0
cmluZyhhKTsKKyAgICAgICAgdmFyIGJTdHJpbmcgPSBAU3RyaW5nKGIpOworCisgICAgICAgIHZh
ciBhTGVuZ3RoID0gYVN0cmluZy5sZW5ndGg7CisgICAgICAgIHZhciBiTGVuZ3RoID0gYlN0cmlu
Zy5sZW5ndGg7CisgICAgICAgIHZhciBsZW5ndGggPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7CisK
KyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAg
dmFyIGFDaGFyQ29kZSA9IGFTdHJpbmcuQGNoYXJDb2RlQXQoaSk7CisgICAgICAgICAgICB2YXIg
YkNoYXJDb2RlID0gYlN0cmluZy5AY2hhckNvZGVBdChpKTsKKworICAgICAgICAgICAgaWYgKGFD
aGFyQ29kZSA9PSBiQ2hhckNvZGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgICAgIGlmIChhQ2hhckNvZGUgPCBiQ2hhckNvZGUpCisgICAgICAgICAgICAgICAgcmV0dXJu
IC0xOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChh
TGVuZ3RoID09IGJMZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAo
YUxlbmd0aCA8IGJMZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcmV0
dXJuIDE7CisgICAgfQorCisgICAgLy8gTW92ZSB1bmRlZmluZWRzIGFuZCBob2xlcyB0byB0aGUg
ZW5kIG9mIGEgc3BhcnNlIGFycmF5LiBSZXN1bHQgaXMgW3ZhbHVlcy4uLiwgdW5kZWZpbmVkcy4u
LiwgaG9sZXMuLi5dLgorICAgIGZ1bmN0aW9uIGNvbXBhY3RTcGFyc2UoYXJyYXksIGRzdCwgc3Jj
LCBsZW5ndGgpCisgICAgeworICAgICAgICB2YXIgdmFsdWVzID0gWyBdOworICAgICAgICB2YXIg
c2VlbiA9IHsgfTsKKyAgICAgICAgdmFyIHZhbHVlQ291bnQgPSAwOworICAgICAgICB2YXIgdW5k
ZWZpbmVkQ291bnQgPSAwOworCisgICAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHRoZSBpbi1wcm9n
cmVzcyBub24tc3BhcnNlIGNvbXBhY3Rpb24gdGhhdCBmYWlsZWQuCisgICAgICAgIGZvciAodmFy
IGkgPSBkc3Q7IGkgPCBzcmM7ICsraSkKKyAgICAgICAgICAgIGRlbGV0ZSBhcnJheVtpXTsKKwor
ICAgICAgICBmb3IgKHZhciBvYmplY3QgPSBhcnJheTsgb2JqZWN0OyBvYmplY3QgPSBAT2JqZWN0
LkBnZXRQcm90b3R5cGVPZihvYmplY3QpKSB7CisgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1l
cyA9IEBPYmplY3QuQGdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTsKKyAgICAgICAgICAgIGZv
ciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7ICsraSkgeworICAgICAgICAg
ICAgICAgIHZhciBpbmRleCA9IHByb3BlcnR5TmFtZXNbaV07CisgICAgICAgICAgICAgICAgaWYg
KGluZGV4IDwgbGVuZ3RoKSB7IC8vIEV4Y2x1ZGUgbm9uLW51bWVyaWMgcHJvcGVydGllcyBhbmQg
cHJvcGVydGllcyBwYXN0IGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5baW5k
ZXhdKSAvLyBFeGNsdWRlIGR1cGxpY2F0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgc2VlbltpbmRleF0gPSAxOworCisgICAgICAgICAg
ICAgICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAg
ZGVsZXRlIGFycmF5W2luZGV4XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09
IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKyt1bmRlZmluZWRDb3VudDsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbdmFsdWVDb3VudCsrXSA9IHZhbHVlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAo
dmFyIGkgPSB2YWx1ZUNvdW50OyBpIDwgdmFsdWVDb3VudCArIHVuZGVmaW5lZENvdW50OyArK2kp
CisgICAgICAgICAgICBhcnJheVtpXSA9IHVuZGVmaW5lZDsKKworICAgICAgICByZXR1cm4gdmFs
dWVDb3VudDsKKyAgICB9CisKKyAgICAvLyBNb3ZlIHVuZGVmaW5lZHMgYW5kIGhvbGVzIHRvIHRo
ZSBlbmQgb2YgYW4gYXJyYXkuIFJlc3VsdCBpcyBbdmFsdWVzLi4uLCB1bmRlZmluZWRzLi4uLCBo
b2xlcy4uLl0uCisgICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSwgbGVuZ3RoKQorICAgIHsKKyAg
ICAgICAgdmFyIGhvbGVDb3VudCA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgZHN0ID0gMCwgc3Jj
ID0gMDsgc3JjIDwgbGVuZ3RoOyArK3NyYykgeworICAgICAgICAgICAgaWYgKCEoc3JjIGluIGFy
cmF5KSkgeworICAgICAgICAgICAgICAgICsraG9sZUNvdW50OworICAgICAgICAgICAgICAgIGlm
IChob2xlQ291bnQgPCAyNTYpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgICAgIHJldHVybiBjb21wYWN0U3BhcnNlKGFycmF5LCBkc3QsIHNyYywgbGVuZ3RoKTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbc3JjXTsKKyAg
ICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgYXJyYXlbZHN0KytdID0gdmFsdWU7CisgICAgICAgIH0KKworICAg
ICAgICB2YXIgdmFsdWVDb3VudCA9IGRzdDsKKyAgICAgICAgdmFyIHVuZGVmaW5lZENvdW50ID0g
bGVuZ3RoIC0gdmFsdWVDb3VudCAtIGhvbGVDb3VudDsKKworICAgICAgICBmb3IgKHZhciBpID0g
dmFsdWVDb3VudDsgaSA8IHZhbHVlQ291bnQgKyB1bmRlZmluZWRDb3VudDsgKytpKQorICAgICAg
ICAgICAgYXJyYXlbaV0gPSB1bmRlZmluZWQ7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IHZhbHVl
Q291bnQgKyB1bmRlZmluZWRDb3VudDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgZGVs
ZXRlIGFycmF5W2ldOworCisgICAgICAgIHJldHVybiB2YWx1ZUNvdW50OworICAgIH0KKworICAg
IGZ1bmN0aW9uIG1lcmdlKGRzdCwgc3JjLCBzcmNJbmRleCwgc3JjRW5kLCB3aWR0aCwgY29tcGFy
YXRvcikKKyAgICB7CisgICAgICAgIHZhciBsZWZ0ID0gc3JjSW5kZXg7CisgICAgICAgIHZhciBs
ZWZ0RW5kID0gbWluKGxlZnQgKyB3aWR0aCwgc3JjRW5kKTsKKyAgICAgICAgdmFyIHJpZ2h0ID0g
bGVmdEVuZDsKKyAgICAgICAgdmFyIHJpZ2h0RW5kID0gbWluKHJpZ2h0ICsgd2lkdGgsIHNyY0Vu
ZCk7CisKKyAgICAgICAgZm9yICh2YXIgZHN0SW5kZXggPSBsZWZ0OyBkc3RJbmRleCA8IHJpZ2h0
RW5kOyArK2RzdEluZGV4KSB7CisgICAgICAgICAgICBpZiAocmlnaHQgPCByaWdodEVuZCkgewor
ICAgICAgICAgICAgICAgIGlmIChsZWZ0ID49IGxlZnRFbmQgfHwgY29tcGFyYXRvcihzcmNbbGVm
dF0sIHNyY1tyaWdodF0pID4gMCkgeworICAgICAgICAgICAgICAgICAgICBkc3RbZHN0SW5kZXhd
ID0gc3JjW3JpZ2h0KytdOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RJbmRleF0gPSBz
cmNbbGVmdCsrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIG1lcmdlU29ydChh
cnJheSwgdmFsdWVDb3VudCwgY29tcGFyYXRvcikKKyAgICB7CisgICAgICAgIHZhciBidWZmZXIg
PSBbIF07CisgICAgICAgIGJ1ZmZlci5sZW5ndGggPSB2YWx1ZUNvdW50OworCisgICAgICAgIHZh
ciBkc3QgPSBidWZmZXI7CisgICAgICAgIHZhciBzcmMgPSBhcnJheTsKKyAgICAgICAgZm9yICh2
YXIgd2lkdGggPSAxOyB3aWR0aCA8IHZhbHVlQ291bnQ7IHdpZHRoICo9IDIpIHsKKyAgICAgICAg
ICAgIGZvciAodmFyIHNyY0luZGV4ID0gMDsgc3JjSW5kZXggPCB2YWx1ZUNvdW50OyBzcmNJbmRl
eCArPSAyICogd2lkdGgpCisgICAgICAgICAgICAgICAgbWVyZ2UoZHN0LCBzcmMsIHNyY0luZGV4
LCB2YWx1ZUNvdW50LCB3aWR0aCwgY29tcGFyYXRvcik7CisKKyAgICAgICAgICAgIHZhciB0bXAg
PSBzcmM7CisgICAgICAgICAgICBzcmMgPSBkc3Q7CisgICAgICAgICAgICBkc3QgPSB0bXA7Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoc3JjICE9IGFycmF5KSB7CisgICAgICAgICAgICBmb3Io
dmFyIGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGFycmF5W2ld
ID0gc3JjW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gY29tcGFyYXRvclNv
cnQoYXJyYXksIGNvbXBhcmF0b3IpCisgICAgeworICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXku
bGVuZ3RoID4+PiAwOworCisgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggRmlyZWZv
eCBhbmQgQ2hyb21lLCBkbyBub3RoaW5nIG9ic2VydmFibGUKKyAgICAgICAgLy8gdG8gdGhlIHRh
cmdldCBhcnJheSBpZiBpdCBoYXMgMCBvciAxIHNvcnRhYmxlIHByb3BlcnRpZXMuCisgICAgICAg
IGlmIChsZW5ndGggPCAyKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhciB2YWx1
ZUNvdW50ID0gY29tcGFjdChhcnJheSwgbGVuZ3RoKTsKKyAgICAgICAgbWVyZ2VTb3J0KGFycmF5
LCB2YWx1ZUNvdW50LCBjb21wYXJhdG9yKTsKKyAgICB9CisKKyAgICBpZiAodGhpcyA9PT0gbnVs
bCkKKyAgICAgICAgdGhyb3cgbmV3IEBUeXBlRXJyb3IoIkFycmF5LnByb3RvdHlwZS5zb3J0IHJl
cXVpcmVzIHRoYXQgfHRoaXN8IG5vdCBiZSBudWxsIik7CisKKyAgICBpZiAodGhpcyA9PT0gdW5k
ZWZpbmVkKQorICAgICAgICB0aHJvdyBuZXcgQFR5cGVFcnJvcigiQXJyYXkucHJvdG90eXBlLnNv
cnQgcmVxdWlyZXMgdGhhdCB8dGhpc3wgbm90IGJlIHVuZGVmaW5lZCIpOworCisgICAgaWYgKHR5
cGVvZiB0aGlzID09ICJzdHJpbmciKQorICAgICAgICB0aHJvdyBuZXcgQFR5cGVFcnJvcigiQXR0
ZW1wdGVkIHRvIGFzc2lnbiB0byByZWFkb25seSBwcm9wZXJ0eS4iKTsKKworICAgIGlmICh0eXBl
b2YgY29tcGFyYXRvciAhPT0gImZ1bmN0aW9uIikKKyAgICAgICAgY29tcGFyYXRvciA9IHN0cmlu
Z0NvbXBhcmF0b3I7CisKKyAgICB2YXIgYXJyYXkgPSBAT2JqZWN0KHRoaXMpOworICAgIGNvbXBh
cmF0b3JTb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKKyAgICByZXR1cm4gYXJyYXk7Cit9CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnVpbHRpbnMvQnVpbHRpbkV4ZWN1dGFibGVzLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnVpbHRpbnMvQnVpbHRpbkV4ZWN1
dGFibGVzLmNwcAkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J1
aWx0aW5zL0J1aWx0aW5FeGVjdXRhYmxlcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwMSw3ICsx
MDEsNiBAQCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogQnVpbHRpbkV4ZWN1CiAgICAgICAg
IAogICAgICAgICBpZiAoY2xvc2VkVmFyaWFibGUgPT0gbV92bS5wcm9wZXJ0eU5hbWVzLT51bmRl
ZmluZWRLZXl3b3JkLmltcGwoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBSRUxF
QVNFX0FTU0VSVChtX3ZtLnByb3BlcnR5TmFtZXMtPmlzUHJpdmF0ZU5hbWUoY2xvc2VkVmFyaWFi
bGUuZ2V0KCkpKTsKICAgICB9CiAgICAgYm9keS0+b3ZlcnJpZGVOYW1lKG5hbWUpOwogICAgIFVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbkV4ZWN1dGFibGUgPSBVbmxpbmtlZEZ1
bmN0aW9uRXhlY3V0YWJsZTo6Y3JlYXRlKCZtX3ZtLCBzb3VyY2UsIGJvZHksIGtpbmQsIFdURjo6
bW92ZShzb3VyY2VPdmVycmlkZSkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b2RlL0NvZGVCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9Db2RlQmxvY2suaAkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb2RlL0NvZGVCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNDksOCArMjQ5LDYg
QEAgcHVibGljOgogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5zdHJ1Y3Rpb24qPihyZXR1
cm5BZGRyZXNzKSAtIGluc3RydWN0aW9ucygpLmJlZ2luKCk7CiAgICAgfQogCi0gICAgYm9vbCBp
c051bWVyaWNDb21wYXJlRnVuY3Rpb24oKSB7IHJldHVybiBtX3VubGlua2VkQ29kZS0+aXNOdW1l
cmljQ29tcGFyZUZ1bmN0aW9uKCk7IH0KLQogICAgIHVuc2lnbmVkIG51bWJlck9mSW5zdHJ1Y3Rp
b25zKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cnVjdGlvbnMuc2l6ZSgpOyB9CiAgICAgUmVmQ291
bnRlZEFycmF5PEluc3RydWN0aW9uPiYgaW5zdHJ1Y3Rpb25zKCkgeyByZXR1cm4gbV9pbnN0cnVj
dGlvbnM7IH0KICAgICBjb25zdCBSZWZDb3VudGVkQXJyYXk8SW5zdHJ1Y3Rpb24+JiBpbnN0cnVj
dGlvbnMoKSBjb25zdCB7IHJldHVybiBtX2luc3RydWN0aW9uczsgfQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2J5dGVjb2RlL1VubGlua2VkQ29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRDb2RlQmxvY2suY3BwCShy
ZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5r
ZWRDb2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNDEsNyArMjQxLDYgQEAgVW5saW5r
ZWRDb2RlQmxvY2s6OlVubGlua2VkQ29kZUJsb2NrKFZNKgogICAgICwgbV9nbG9iYWxPYmplY3RS
ZWdpc3RlcihWaXJ0dWFsUmVnaXN0ZXIoKSkKICAgICAsIG1fbmVlZHNGdWxsU2NvcGVDaGFpbihp
bmZvLm5lZWRzQWN0aXZhdGlvbigpKQogICAgICwgbV91c2VzRXZhbChpbmZvLnVzZXNFdmFsKCkp
Ci0gICAgLCBtX2lzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbihmYWxzZSkKICAgICAsIG1faXNTdHJp
Y3RNb2RlKGluZm8uaXNTdHJpY3RNb2RlKCkpCiAgICAgLCBtX2lzQ29uc3RydWN0b3IoaW5mby5p
c0NvbnN0cnVjdG9yKCkpCiAgICAgLCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzKGZhbHNlKQpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1VubGlua2VkQ29kZUJsb2NrLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1VubGlua2VkQ29kZUJs
b2NrLmgJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9VbmxpbmtlZENvZGVCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNDQsOSArMzQ0LDYgQEAg
cHVibGljOgogICAgIHVuc2lnbmVkIGp1bXBUYXJnZXQoaW50IGluZGV4KSBjb25zdCB7IHJldHVy
biBtX2p1bXBUYXJnZXRzW2luZGV4XTsgfQogICAgIHVuc2lnbmVkIGxhc3RKdW1wVGFyZ2V0KCkg
Y29uc3QgeyByZXR1cm4gbV9qdW1wVGFyZ2V0cy5sYXN0KCk7IH0KIAotICAgIHZvaWQgc2V0SXNO
dW1lcmljQ29tcGFyZUZ1bmN0aW9uKGJvb2wgaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKSB7IG1f
aXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uID0gaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uOyB9Ci0g
ICAgYm9vbCBpc051bWVyaWNDb21wYXJlRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX2lzTnVt
ZXJpY0NvbXBhcmVGdW5jdGlvbjsgfQotCiAgICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1faXNCdWlsdGluRnVuY3Rpb247IH0KIAogICAgIENvbnN0cnVjdG9yS2lu
ZCBjb25zdHJ1Y3RvcktpbmQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxDb25zdHJ1Y3Rv
cktpbmQ+KG1fY29uc3RydWN0b3JLaW5kKTsgfQpAQCAtNTM2LDcgKzUzMyw2IEBAIHByaXZhdGU6
CiAKICAgICB1bnNpZ25lZCBtX25lZWRzRnVsbFNjb3BlQ2hhaW4gOiAxOwogICAgIHVuc2lnbmVk
IG1fdXNlc0V2YWwgOiAxOwotICAgIHVuc2lnbmVkIG1faXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9u
IDogMTsKICAgICB1bnNpZ25lZCBtX2lzU3RyaWN0TW9kZSA6IDE7CiAgICAgdW5zaWduZWQgbV9p
c0NvbnN0cnVjdG9yIDogMTsKICAgICB1bnNpZ25lZCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDog
MTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5l
cmF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGls
ZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjYwMywxMSArMjYwMyw2IEBAIFJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9y
OjplbWl0VGhyb3cKICAgICByZXR1cm4gbmV3VGVtcG9yYXJ5KCk7CiB9CiAKLXZvaWQgQnl0ZWNv
ZGVHZW5lcmF0b3I6OnNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJpY0Nv
bXBhcmVGdW5jdGlvbikKLXsKLSAgICBtX2NvZGVCbG9jay0+c2V0SXNOdW1lcmljQ29tcGFyZUZ1
bmN0aW9uKGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbik7Ci19Ci0KIGJvb2wgQnl0ZWNvZGVHZW5l
cmF0b3I6OmlzQXJndW1lbnROdW1iZXIoY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIGludCBhcmd1
bWVudE51bWJlcikKIHsKICAgICBSZWdpc3RlcklEKiByZWdpc3RlcklEID0gdmFyaWFibGUoaWRl
bnQpLmxvY2FsKCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5
dGVjb2RlR2VuZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHdvcmtp
bmcgY29weSkKQEAgLTI3Niw4ICsyNzYsNiBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBi
b29sIGlzQXJndW1lbnROdW1iZXIoY29uc3QgSWRlbnRpZmllciYsIGludCk7CiAKLSAgICAgICAg
dm9pZCBzZXRJc051bWVyaWNDb21wYXJlRnVuY3Rpb24oYm9vbCBpc051bWVyaWNDb21wYXJlRnVu
Y3Rpb24pOwotCiAgICAgICAgIFZhcmlhYmxlIHZhcmlhYmxlKGNvbnN0IElkZW50aWZpZXImKTsK
ICAgICAgICAgCiAgICAgICAgIC8vIElnbm9yZXMgdGhlIHBvc3NpYmlsaXR5IG9mIGludGVydmVu
aW5nIHNjb3Blcy4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9k
ZXNDb2RlZ2VuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNv
bXBpbGVyL05vZGVzQ29kZWdlbi5jcHAJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjgyMSwyMiArMjgyMSw2IEBAIHZvaWQgRnVuY3Rpb25Ob2RlOjplbWl0Qnl0ZWNvZGUoQnl0
ZWNvZGUKICAgICAgICAgZ2VuZXJhdG9yLmVtaXRSZXR1cm4ocjApOwogICAgICAgICByZXR1cm47
CiAgICAgfQotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSByZXR1cm4gc3RhdG1lbnQsIGFuZCBpdCBp
cyB0aGUgb25seSBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uLCBjaGVjayBpZiB0aGlzIGlzIGEg
bnVtZXJpYyBjb21wYXJlLgotICAgIGlmIChzdGF0aWNfY2FzdDxCbG9ja05vZGUqPihzaW5nbGVT
dGF0ZW1lbnQpLT5zaW5nbGVTdGF0ZW1lbnQoKSkgewotICAgICAgICBFeHByZXNzaW9uTm9kZSog
cmV0dXJuVmFsdWVFeHByZXNzaW9uID0gcmV0dXJuTm9kZS0+dmFsdWUoKTsKLSAgICAgICAgaWYg
KHJldHVyblZhbHVlRXhwcmVzc2lvbiAmJiByZXR1cm5WYWx1ZUV4cHJlc3Npb24tPmlzU3VidHJh
Y3QoKSkgewotICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUqIGxoc0V4cHJlc3Npb24gPSBzdGF0
aWNfY2FzdDxTdWJOb2RlKj4ocmV0dXJuVmFsdWVFeHByZXNzaW9uKS0+bGhzKCk7Ci0gICAgICAg
ICAgICBFeHByZXNzaW9uTm9kZSogcmhzRXhwcmVzc2lvbiA9IHN0YXRpY19jYXN0PFN1Yk5vZGUq
PihyZXR1cm5WYWx1ZUV4cHJlc3Npb24pLT5yaHMoKTsKLSAgICAgICAgICAgIGlmIChsaHNFeHBy
ZXNzaW9uLT5pc1Jlc29sdmVOb2RlKCkKLSAgICAgICAgICAgICAgICAmJiByaHNFeHByZXNzaW9u
LT5pc1Jlc29sdmVOb2RlKCkKLSAgICAgICAgICAgICAgICAmJiBnZW5lcmF0b3IuaXNBcmd1bWVu
dE51bWJlcihzdGF0aWNfY2FzdDxSZXNvbHZlTm9kZSo+KGxoc0V4cHJlc3Npb24pLT5pZGVudGlm
aWVyKCksIDApCi0gICAgICAgICAgICAgICAgJiYgZ2VuZXJhdG9yLmlzQXJndW1lbnROdW1iZXIo
c3RhdGljX2Nhc3Q8UmVzb2x2ZU5vZGUqPihyaHNFeHByZXNzaW9uKS0+aWRlbnRpZmllcigpLCAx
KSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGdlbmVyYXRvci5zZXRJc051
bWVyaWNDb21wYXJlRnVuY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jRGVjbE5vZGUg
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaGVhcC9IZWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
aGVhcC9IZWFwLmNwcAkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2hlYXAvSGVhcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4MSwxNyArNDgxLDYgQEAgdm9pZCBI
ZWFwOjphZGRSZWZlcmVuY2UoSlNDZWxsKiBjZWxsLCBBcgogICAgIH0KIH0KIAotdm9pZCBIZWFw
OjpwdXNoVGVtcFNvcnRWZWN0b3IoVmVjdG9yPFZhbHVlU3RyaW5nUGFpciwgMCwgVW5zYWZlVmVj
dG9yT3ZlcmZsb3c+KiB0ZW1wVmVjdG9yKQotewotICAgIG1fdGVtcFNvcnRpbmdWZWN0b3JzLmFw
cGVuZCh0ZW1wVmVjdG9yKTsKLX0KLQotdm9pZCBIZWFwOjpwb3BUZW1wU29ydFZlY3RvcihWZWN0
b3I8VmFsdWVTdHJpbmdQYWlyLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4qIHRlbXBWZWN0b3Ip
Ci17Ci0gICAgQVNTRVJUX1VOVVNFRCh0ZW1wVmVjdG9yLCB0ZW1wVmVjdG9yID09IG1fdGVtcFNv
cnRpbmdWZWN0b3JzLmxhc3QoKSk7Ci0gICAgbV90ZW1wU29ydGluZ1ZlY3RvcnMucmVtb3ZlTGFz
dCgpOwotfQotCiB2b2lkIEhlYXA6OmhhcnZlc3RXZWFrUmVmZXJlbmNlcygpCiB7CiAgICAgbV9z
bG90VmlzaXRvci5oYXJ2ZXN0V2Vha1JlZmVyZW5jZXMoKTsKQEAgLTU3MSw3ICs1NjAsNiBAQCB2
b2lkIEhlYXA6Om1hcmtSb290cyhkb3VibGUgZ2NTdGFydFRpbWUsCiAgICAgICAgIHZpc2l0U21h
bGxTdHJpbmdzKCk7CiAgICAgICAgIHZpc2l0Q29uc2VydmF0aXZlUm9vdHMoY29uc2VydmF0aXZl
Um9vdHMpOwogICAgICAgICB2aXNpdFByb3RlY3RlZE9iamVjdHMoaGVhcFJvb3RWaXNpdG9yKTsK
LSAgICAgICAgdmlzaXRUZW1wU29ydFZlY3RvcnMoaGVhcFJvb3RWaXNpdG9yKTsKICAgICAgICAg
dmlzaXRBcmd1bWVudEJ1ZmZlcnMoaGVhcFJvb3RWaXNpdG9yKTsKICAgICAgICAgdmlzaXRFeGNl
cHRpb24oaGVhcFJvb3RWaXNpdG9yKTsKICAgICAgICAgdmlzaXRTdHJvbmdIYW5kbGVzKGhlYXBS
b290VmlzaXRvcik7CkBAIC03MTAsMjMgKzY5OCw2IEBAIHZvaWQgSGVhcDo6dmlzaXRQcm90ZWN0
ZWRPYmplY3RzKEhlYXBSb28KICAgICBtX3Nsb3RWaXNpdG9yLmRvbmF0ZUFuZERyYWluKCk7CiB9
CiAKLXZvaWQgSGVhcDo6dmlzaXRUZW1wU29ydFZlY3RvcnMoSGVhcFJvb3RWaXNpdG9yJiBoZWFw
Um9vdFZpc2l0b3IpCi17Ci0gICAgR0NQSEFTRShWaXNpdFRlbXBTb3J0VmVjdG9ycyk7Ci0KLSAg
ICBmb3IgKGF1dG8qIHZlY3RvciA6IG1fdGVtcFNvcnRpbmdWZWN0b3JzKSB7Ci0gICAgICAgIGZv
ciAoYXV0byYgdmFsdWVTdHJpbmdQYWlyIDogKnZlY3RvcikgewotICAgICAgICAgICAgaWYgKHZh
bHVlU3RyaW5nUGFpci5maXJzdCkKLSAgICAgICAgICAgICAgICBoZWFwUm9vdFZpc2l0b3Iudmlz
aXQoJnZhbHVlU3RyaW5nUGFpci5maXJzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAo
T3B0aW9uczo6bG9nR0MoKSA9PSBHQ0xvZ2dpbmc6OlZlcmJvc2UpCi0gICAgICAgIGRhdGFMb2co
IlRlbXAgU29ydCBWZWN0b3JzOlxuIiwgbV9zbG90VmlzaXRvcik7Ci0KLSAgICBtX3Nsb3RWaXNp
dG9yLmRvbmF0ZUFuZERyYWluKCk7Ci19Ci0KIHZvaWQgSGVhcDo6dmlzaXRBcmd1bWVudEJ1ZmZl
cnMoSGVhcFJvb3RWaXNpdG9yJiB2aXNpdG9yKQogewogICAgIEdDUEhBU0UoTWFya2luZ0FyZ3Vt
ZW50QnVmZmVycyk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcC5oCShyZXZpc2lvbiAx
ODMxOTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTc1LDcgKzc1LDYgQEAgY2xhc3MgV29ya2xpc3Q7CiAKIHN0YXRpYyB2b2lkKiBjb25z
dCB6b21iaWZpZWRCaXRzID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oMHhkZWFkYmVlZik7CiAK
LXR5cGVkZWYgc3RkOjpwYWlyPEpTVmFsdWUsIFdURjo6U3RyaW5nPiBWYWx1ZVN0cmluZ1BhaXI7
CiB0eXBlZGVmIEhhc2hDb3VudGVkU2V0PEpTQ2VsbCo+IFByb3RlY3RDb3VudFNldDsKIHR5cGVk
ZWYgSGFzaENvdW50ZWRTZXQ8Y29uc3QgY2hhcio+IFR5cGVDb3VudFNldDsKIApAQCAtMTg2LDkg
KzE4NSw2IEBAIHB1YmxpYzoKICAgICBKU19FWFBPUlRfUFJJVkFURSBzdGQ6OnVuaXF1ZV9wdHI8
VHlwZUNvdW50U2V0PiBvYmplY3RUeXBlQ291bnRzKCk7CiAgICAgdm9pZCBzaG93U3RhdGlzdGlj
cygpOwogCi0gICAgdm9pZCBwdXNoVGVtcFNvcnRWZWN0b3IoVmVjdG9yPFZhbHVlU3RyaW5nUGFp
ciwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+Kik7Ci0gICAgdm9pZCBwb3BUZW1wU29ydFZlY3Rv
cihWZWN0b3I8VmFsdWVTdHJpbmdQYWlyLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4qKTsKLQog
ICAgIEhhc2hTZXQ8TWFya2VkQXJndW1lbnRCdWZmZXIqPiYgbWFya0xpc3RTZXQoKTsKICAgICAK
ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPiB0eXBlbmFtZSBGdW5jdG9yOjpSZXR1cm5U
eXBlIGZvckVhY2hQcm90ZWN0ZWRDZWxsKEZ1bmN0b3ImKTsKQEAgLTMwMCw3ICsyOTYsNiBAQCBw
cml2YXRlOgogICAgIHZvaWQgdmlzaXRDb21waWxlcldvcmtsaXN0V2Vha1JlZmVyZW5jZXMoKTsK
ICAgICB2b2lkIHJlbW92ZURlYWRDb21waWxlcldvcmtsaXN0RW50cmllcygpOwogICAgIHZvaWQg
dmlzaXRQcm90ZWN0ZWRPYmplY3RzKEhlYXBSb290VmlzaXRvciYpOwotICAgIHZvaWQgdmlzaXRU
ZW1wU29ydFZlY3RvcnMoSGVhcFJvb3RWaXNpdG9yJik7CiAgICAgdm9pZCB2aXNpdEFyZ3VtZW50
QnVmZmVycyhIZWFwUm9vdFZpc2l0b3ImKTsKICAgICB2b2lkIHZpc2l0RXhjZXB0aW9uKEhlYXBS
b290VmlzaXRvciYpOwogICAgIHZvaWQgdmlzaXRTdHJvbmdIYW5kbGVzKEhlYXBSb290VmlzaXRv
ciYpOwpAQCAtMzcxLDcgKzM2Niw2IEBAIHByaXZhdGU6CiAgICAgSGFzaFNldDxjb25zdCBKU0Nl
bGwqPiBtX2NvcHlpbmdSZW1lbWJlcmVkU2V0OwogCiAgICAgUHJvdGVjdENvdW50U2V0IG1fcHJv
dGVjdGVkVmFsdWVzOwotICAgIFZlY3RvcjxWZWN0b3I8VmFsdWVTdHJpbmdQYWlyLCAwLCBVbnNh
ZmVWZWN0b3JPdmVyZmxvdz4qPiBtX3RlbXBTb3J0aW5nVmVjdG9yczsKICAgICBzdGQ6OnVuaXF1
ZV9wdHI8SGFzaFNldDxNYXJrZWRBcmd1bWVudEJ1ZmZlcio+PiBtX21hcmtMaXN0U2V0OwogCiAg
ICAgTWFjaGluZVRocmVhZHMgbV9tYWNoaW5lVGhyZWFkczsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9wYXJzZXIvUGFyc2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcGFyc2VyL1BhcnNlci5jcHAJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjg4LDcgKzI4
OCw2IEBAIFN0cmluZyBQYXJzZXI8TGV4ZXJUeXBlPjo6cGFyc2VJbm5lcigpCiAgICAgICAgIGZl
YXR1cmVzIHw9IE1vZGlmaWVkQXJndW1lbnRzRmVhdHVyZTsKICAgICBWZWN0b3I8UmVmUHRyPFN0
cmluZ0ltcGw+PiBjbG9zZWRWYXJpYWJsZXM7CiAgICAgaWYgKG1fcGFyc2luZ0J1aWx0aW4pIHsK
LSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWNhcHR1cmVkVmFyaWFibGVzLnNpemUoKSk7CiAgICAg
ICAgIElkZW50aWZpZXJTZXQgdXNlZFZhcmlhYmxlczsKICAgICAgICAgc2NvcGUtPmdldFVzZWRW
YXJpYWJsZXModXNlZFZhcmlhYmxlcyk7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFi
bGUgOiB1c2VkVmFyaWFibGVzKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9BcnJheVByb3RvdHlwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvQXJyYXlQcm90b3R5cGUuY3BwCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9BcnJheVByb3RvdHlwZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTU0LDcgKzU0LDYgQEAgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3Rv
RgogRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3RvRnVuY1JldmVyc2UoRXhl
Y1N0YXRlKik7CiBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5UHJvdG9GdW5jU2hp
ZnQoRXhlY1N0YXRlKik7CiBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5UHJvdG9G
dW5jU2xpY2UoRXhlY1N0YXRlKik7Ci1FbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5
UHJvdG9GdW5jU29ydChFeGVjU3RhdGUqKTsKIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
YXJyYXlQcm90b0Z1bmNTcGxpY2UoRXhlY1N0YXRlKik7CiBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9T
VF9DQUxMIGFycmF5UHJvdG9GdW5jVW5TaGlmdChFeGVjU3RhdGUqKTsKIEVuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgYXJyYXlQcm90b0Z1bmNJbmRleE9mKEV4ZWNTdGF0ZSopOwpAQCAtNzAs
MjEgKzY5LDYgQEAgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3RvRgogCiBu
YW1lc3BhY2UgSlNDIHsKIAotc3RhdGljIGlubGluZSBib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5j
dGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgZnVuY3Rpb24sIENhbGxUeXBlIGNhbGxUeXBl
LCBjb25zdCBDYWxsRGF0YSYgY2FsbERhdGEpCi17Ci0gICAgaWYgKGNhbGxUeXBlICE9IENhbGxU
eXBlSlMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGNhbGxEYXRhLmpzLmZ1bmN0aW9uRXhlY3V0YWJsZTsKLSAgICBKU1Njb3Bl
KiBzY29wZSA9IGNhbGxEYXRhLmpzLnNjb3BlOwotCi0gICAgSlNPYmplY3QqIGVycm9yID0gZXhl
Y3V0YWJsZS0+cHJlcGFyZUZvckV4ZWN1dGlvbihleGVjLCBqc0Nhc3Q8SlNGdW5jdGlvbio+KGZ1
bmN0aW9uKSwgc2NvcGUsIENvZGVGb3JDYWxsKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIHJldHVybiBleGVjdXRhYmxlLT5jb2RlQmxvY2tGb3JDYWxsKCkt
PmlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbigpOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gQXJyYXlQcm90b3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog
CiBjb25zdCBDbGFzc0luZm8gQXJyYXlQcm90b3R5cGU6OnNfaW5mbyA9IHsiQXJyYXkiLCAmSlNB
cnJheTo6c19pbmZvLCAmYXJyYXlQcm90b3R5cGVUYWJsZSwgQ1JFQVRFX01FVEhPRF9UQUJMRShB
cnJheVByb3RvdHlwZSl9OwpAQCAtNjU0LDE1NSArNjM4LDYgQEAgaW5saW5lIEpTVmFsdWUgZ2V0
T3JIb2xlKEpTT2JqZWN0KiBvYmosIAogICAgIHJldHVybiBKU1ZhbHVlKCk7CiB9CiAKLXN0YXRp
YyBib29sIGF0dGVtcHRGYXN0U29ydChFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2Jq
LCBKU1ZhbHVlIGZ1bmN0aW9uLCBDYWxsRGF0YSYgY2FsbERhdGEsIENhbGxUeXBlJiBjYWxsVHlw
ZSkKLXsKLSAgICBpZiAodGhpc09iai0+Y2xhc3NJbmZvKCkgIT0gSlNBcnJheTo6aW5mbygpCi0g
ICAgICAgIHx8IGFzQXJyYXkodGhpc09iaiktPmhhc1NwYXJzZU1hcCgpCi0gICAgICAgIHx8IHNo
b3VsZFVzZVNsb3dQdXQodGhpc09iai0+aW5kZXhpbmdUeXBlKCkpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgCi0gICAgaWYgKGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbihleGVjLCBmdW5j
dGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKSkKLSAgICAgICAgYXNBcnJheSh0aGlzT2JqKS0+c29y
dE51bWVyaWMoZXhlYywgZnVuY3Rpb24sIGNhbGxUeXBlLCBjYWxsRGF0YSk7Ci0gICAgZWxzZSBp
ZiAoY2FsbFR5cGUgIT0gQ2FsbFR5cGVOb25lKQotICAgICAgICBhc0FycmF5KHRoaXNPYmopLT5z
b3J0KGV4ZWMsIGZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEpOwotICAgIGVsc2UKLSAgICAg
ICAgYXNBcnJheSh0aGlzT2JqKS0+c29ydChleGVjKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
c3RhdGljIGJvb2wgcGVyZm9ybVNsb3dTb3J0KEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRo
aXNPYmosIHVuc2lnbmVkIGxlbmd0aCwgSlNWYWx1ZSBmdW5jdGlvbiwgQ2FsbERhdGEmIGNhbGxE
YXRhLCBDYWxsVHlwZSYgY2FsbFR5cGUpCi17Ci0gICAgLy8gIk1pbiIgc29ydC4gTm90IHRoZSBm
YXN0ZXN0LCBidXQgZGVmaW5pdGVseSBsZXNzIGNvZGUgdGhhbiBoZWFwc29ydAotICAgIC8vIG9y
IHF1aWNrc29ydCwgYW5kIG11Y2ggbGVzcyBzd2FwcGluZyB0aGFuIGJ1YmJsZXNvcnQvaW5zZXJ0
aW9uc29ydC4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgKytpKSB7
Ci0gICAgICAgIEpTVmFsdWUgaU9iaiA9IGdldE9ySG9sZSh0aGlzT2JqLCBleGVjLCBpKTsKLSAg
ICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICB1bnNpZ25lZCB0aGVtaW4gPSBpOwotICAgICAgICBKU1ZhbHVlIG1pbk9iaiA9
IGlPYmo7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaiA9IGkgKyAxOyBqIDwgbGVuZ3RoOyArK2op
IHsKLSAgICAgICAgICAgIEpTVmFsdWUgak9iaiA9IGdldE9ySG9sZSh0aGlzT2JqLCBleGVjLCBq
KTsKLSAgICAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBkb3VibGUgY29tcGFyZVJlc3VsdDsKLSAgICAg
ICAgICAgIGlmICghak9iaikKLSAgICAgICAgICAgICAgICBjb21wYXJlUmVzdWx0ID0gMTsKLSAg
ICAgICAgICAgIGVsc2UgaWYgKCFtaW5PYmopCi0gICAgICAgICAgICAgICAgY29tcGFyZVJlc3Vs
dCA9IC0xOwotICAgICAgICAgICAgZWxzZSBpZiAoak9iai5pc1VuZGVmaW5lZCgpKQotICAgICAg
ICAgICAgICAgIGNvbXBhcmVSZXN1bHQgPSAxOyAvLyBkb24ndCBjaGVjayBtaW5PYmogYmVjYXVz
ZSB0aGVyZSdzIG5vIG5lZWQgdG8gZGlmZmVyZW50aWF0ZSA9PSAoMCkgZnJvbSA+ICgxKQotICAg
ICAgICAgICAgZWxzZSBpZiAobWluT2JqLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAg
Y29tcGFyZVJlc3VsdCA9IC0xOwotICAgICAgICAgICAgZWxzZSBpZiAoY2FsbFR5cGUgIT0gQ2Fs
bFR5cGVOb25lKSB7Ci0gICAgICAgICAgICAgICAgTWFya2VkQXJndW1lbnRCdWZmZXIgbDsKLSAg
ICAgICAgICAgICAgICBsLmFwcGVuZChqT2JqKTsKLSAgICAgICAgICAgICAgICBsLmFwcGVuZCht
aW5PYmopOwotICAgICAgICAgICAgICAgIGNvbXBhcmVSZXN1bHQgPSBjYWxsKGV4ZWMsIGZ1bmN0
aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEsIGpzVW5kZWZpbmVkKCksIGwpLnRvTnVtYmVyKGV4ZWMp
OwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY29tcGFyZVJlc3VsdCA9IGNv
ZGVQb2ludENvbXBhcmVMZXNzVGhhbihqT2JqLnRvV1RGU3RyaW5nSW5saW5lKGV4ZWMpLCBtaW5P
YmoudG9XVEZTdHJpbmdJbmxpbmUoZXhlYykpID8gLTEgOiAxOwotCi0gICAgICAgICAgICBpZiAo
Y29tcGFyZVJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgICAgICB0aGVtaW4gPSBqOwotICAgICAg
ICAgICAgICAgIG1pbk9iaiA9IGpPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgLy8gU3dhcCB0aGVtaW4gYW5kIGkKLSAgICAgICAgaWYgKHRoZW1pbiA+IGkpIHsKLSAgICAg
ICAgICAgIGlmIChtaW5PYmopIHsKLSAgICAgICAgICAgICAgICB0aGlzT2JqLT5tZXRob2RUYWJs
ZShleGVjLT52bSgpKS0+cHV0QnlJbmRleCh0aGlzT2JqLCBleGVjLCBpLCBtaW5PYmosIHRydWUp
OwotICAgICAgICAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpc09iai0+
bWV0aG9kVGFibGUoZXhlYy0+dm0oKSktPmRlbGV0ZVByb3BlcnR5QnlJbmRleCh0aGlzT2JqLCBl
eGVjLCBpKSkgewotICAgICAgICAgICAgICAgIHRocm93VHlwZUVycm9yKGV4ZWMsIEFTQ0lJTGl0
ZXJhbCgiVW5hYmxlIHRvIGRlbGV0ZSBwcm9wZXJ0eS4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlPYmopIHsKLSAgICAg
ICAgICAgICAgICB0aGlzT2JqLT5tZXRob2RUYWJsZShleGVjLT52bSgpKS0+cHV0QnlJbmRleCh0
aGlzT2JqLCBleGVjLCB0aGVtaW4sIGlPYmosIHRydWUpOwotICAgICAgICAgICAgICAgIGlmIChl
eGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpc09iai0+bWV0aG9kVGFibGUoZXhlYy0+dm0oKSkt
PmRlbGV0ZVByb3BlcnR5QnlJbmRleCh0aGlzT2JqLCBleGVjLCB0aGVtaW4pKSB7Ci0gICAgICAg
ICAgICAgICAgdGhyb3dUeXBlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJVbmFibGUgdG8gZGVs
ZXRlIHByb3BlcnR5LiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUVuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgYXJyYXlQcm90b0Z1bmNTb3J0KEV4ZWNTdGF0ZSogZXhlYykK
LXsKLSAgICBKU09iamVjdCogdGhpc09iaiA9IGV4ZWMtPnRoaXNWYWx1ZSgpLnRvVGhpcyhleGVj
LCBTdHJpY3RNb2RlKS50b09iamVjdChleGVjKTsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBnZXRM
ZW5ndGgoZXhlYywgdGhpc09iaik7Ci0gICAgaWYgKCFsZW5ndGggfHwgZXhlYy0+aGFkRXhjZXB0
aW9uKCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhpc09iaik7Ci0KLSAgICBK
U1ZhbHVlIGZ1bmN0aW9uID0gZXhlYy0+YXJndW1lbnQoMCk7Ci0gICAgQ2FsbERhdGEgY2FsbERh
dGE7Ci0gICAgQ2FsbFR5cGUgY2FsbFR5cGUgPSBnZXRDYWxsRGF0YShmdW5jdGlvbiwgY2FsbERh
dGEpOwotCi0gICAgaWYgKGF0dGVtcHRGYXN0U29ydChleGVjLCB0aGlzT2JqLCBmdW5jdGlvbiwg
Y2FsbERhdGEsIGNhbGxUeXBlKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aGlz
T2JqKTsKLSAgICAKLSAgICAvLyBBc3N1bWUgdGhhdCBmb3Igc21hbGwtaXNoIGFycmF5cywgZG9p
bmcgdGhlIHNsb3cgc29ydCBkaXJlY3RseSBpcyBiZXR0ZXIuCi0gICAgaWYgKGxlbmd0aCA8IDEw
MDApCi0gICAgICAgIHJldHVybiBwZXJmb3JtU2xvd1NvcnQoZXhlYywgdGhpc09iaiwgbGVuZ3Ro
LCBmdW5jdGlvbiwgY2FsbERhdGEsIGNhbGxUeXBlKSA/IEpTVmFsdWU6OmVuY29kZSh0aGlzT2Jq
KSA6IEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLSAgICAKLSAgICBKU0dsb2JhbE9i
amVjdCogZ2xvYmFsT2JqZWN0ID0gSlNHbG9iYWxPYmplY3Q6OmNyZWF0ZSgKLSAgICAgICAgZXhl
Yy0+dm0oKSwgSlNHbG9iYWxPYmplY3Q6OmNyZWF0ZVN0cnVjdHVyZShleGVjLT52bSgpLCBqc051
bGwoKSkpOwotICAgIEpTQXJyYXkqIGZsYXRBcnJheSA9IGNvbnN0cnVjdEVtcHR5QXJyYXkoZ2xv
YmFsT2JqZWN0LT5nbG9iYWxFeGVjKCksIG51bGxwdHIpOwotICAgIGlmIChleGVjLT5oYWRFeGNl
cHRpb24oKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsK
LSAgICAKLSAgICBQcm9wZXJ0eU5hbWVBcnJheSBuYW1lQXJyYXkoZXhlYyk7Ci0gICAgdGhpc09i
ai0+bWV0aG9kVGFibGUoZXhlYy0+dm0oKSktPmdldFByb3BlcnR5TmFtZXModGhpc09iaiwgZXhl
YywgbmFtZUFycmF5LCBFbnVtZXJhdGlvbk1vZGUoRG9udEVudW1Qcm9wZXJ0aWVzTW9kZTo6SW5j
bHVkZSkpOwotICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQotICAgIFZlY3Rvcjx1aW50MzJfdCwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IGtleXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBu
YW1lQXJyYXkuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgUHJvcGVydHlOYW1lIG5hbWUgPSBuYW1l
QXJyYXlbaV07Ci0gICAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBvcHRpb25hbEluZGV4ID0gcGFy
c2VJbmRleChuYW1lKTsKLSAgICAgICAgaWYgKCFvcHRpb25hbEluZGV4KQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgdWludDMyX3QgaW5kZXggPSBvcHRpb25hbEluZGV4LnZhbHVl
KCk7Ci0gICAgICAgIEpTVmFsdWUgdmFsdWUgPSBnZXRPckhvbGUodGhpc09iaiwgZXhlYywgaW5k
ZXgpOwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1
cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICBpZiAoIXZhbHVlKQot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGtleXMuYXBwZW5kKGluZGV4KTsKLSAgICAg
ICAgZmxhdEFycmF5LT5wdXNoKGV4ZWMsIHZhbHVlKTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4
Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5l
ZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFhdHRlbXB0RmFzdFNvcnQoZXhlYywgZmxhdEFy
cmF5LCBmdW5jdGlvbiwgY2FsbERhdGEsIGNhbGxUeXBlKQotICAgICAgICAmJiAhcGVyZm9ybVNs
b3dTb3J0KGV4ZWMsIGZsYXRBcnJheSwgZmxhdEFycmF5LT5sZW5ndGgoKSwgZnVuY3Rpb24sIGNh
bGxEYXRhLCBjYWxsVHlwZSkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsg
KytpKSB7Ci0gICAgICAgIHNpemVfdCBpbmRleCA9IGtleXNbaV07Ci0gICAgICAgIGlmIChpbmRl
eCA8IGZsYXRBcnJheS0+bGVuZ3RoKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
Ci0gICAgICAgIGlmICghdGhpc09iai0+bWV0aG9kVGFibGUoZXhlYy0+dm0oKSktPmRlbGV0ZVBy
b3BlcnR5QnlJbmRleCh0aGlzT2JqLCBleGVjLCBpbmRleCkpIHsKLSAgICAgICAgICAgIHRocm93
VHlwZUVycm9yKGV4ZWMsIEFTQ0lJTGl0ZXJhbCgiVW5hYmxlIHRvIGRlbGV0ZSBwcm9wZXJ0eS4i
KSk7Ci0gICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSBmbGF0QXJyYXktPmxl
bmd0aCgpOyBpLS07KSB7Ci0gICAgICAgIEpTVmFsdWUgdmFsdWUgPSBnZXRPckhvbGUoZmxhdEFy
cmF5LCBleGVjLCBpKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQodmFsdWUpOwotICAgICAgICB0
aGlzT2JqLT5tZXRob2RUYWJsZShleGVjLT52bSgpKS0+cHV0QnlJbmRleCh0aGlzT2JqLCBleGVj
LCBpLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAg
ICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0gICAgfQot
ICAgIAotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhpc09iaik7Ci19Ci0KIEVuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgYXJyYXlQcm90b0Z1bmNTcGxpY2UoRXhlY1N0YXRlKiBleGVj
KQogewogICAgIC8vIDE1LjQuNC4xMgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvQ29tbW9uSWRlbnRpZmllcnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5oCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5oCSh3b3JraW5nIGNv
cHkpCkBAIC0yNjYsOSArMjY2LDEyIEBACiAgICAgbWFjcm8oT2JqZWN0KSBcCiAgICAgbWFjcm8o
TnVtYmVyKSBcCiAgICAgbWFjcm8oQXJyYXkpIFwKKyAgICBtYWNybyhTdHJpbmcpIFwKICAgICBt
YWNybyhhYnMpIFwKICAgICBtYWNybyhmbG9vcikgXAogICAgIG1hY3JvKGlzRmluaXRlKSBcCisg
ICAgbWFjcm8oZ2V0UHJvdG90eXBlT2YpIFwKKyAgICBtYWNybyhnZXRPd25Qcm9wZXJ0eU5hbWVz
KSBcCiAgICAgbWFjcm8oVHlwZUVycm9yKSBcCiAgICAgbWFjcm8odW5kZWZpbmVkKSBcCiAgICAg
bWFjcm8oQnVpbHRpbkxvZykgXApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SlNBcnJheS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SlNBcnJheS5jcHAJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0pTQXJyYXkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw3ICszNCw2IEBACiAjaW5j
bHVkZSAiSlNDSW5saW5lcy5oIgogI2luY2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5LmgiCiAjaW5j
bHVkZSAiUmVqZWN0LmgiCi0jaW5jbHVkZSA8d3RmL0FWTFRyZWUuaD4KICNpbmNsdWRlIDx3dGYv
QXNzZXJ0aW9ucy5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtOTk0LDUyMSArOTkzLDYg
QEAgYm9vbCBKU0FycmF5Ojp1bnNoaWZ0Q291bnRXaXRoQW55SW5kZXhpbgogICAgIH0KIH0KIAot
c3RhdGljIGludCBjb21wYXJlTnVtYmVyc0ZvclFTb3J0V2l0aEludDMyKGNvbnN0IHZvaWQqIGEs
IGNvbnN0IHZvaWQqIGIpCi17Ci0gICAgaW50MzJfdCBpYSA9IHN0YXRpY19jYXN0PGNvbnN0IEpT
VmFsdWUqPihhKS0+YXNJbnQzMigpOwotICAgIGludDMyX3QgaWIgPSBzdGF0aWNfY2FzdDxjb25z
dCBKU1ZhbHVlKj4oYiktPmFzSW50MzIoKTsKLSAgICByZXR1cm4gaWEgLSBpYjsKLX0KLQotc3Rh
dGljIGludCBjb21wYXJlTnVtYmVyc0ZvclFTb3J0V2l0aERvdWJsZShjb25zdCB2b2lkKiBhLCBj
b25zdCB2b2lkKiBiKQotewotICAgIGRvdWJsZSBkYSA9ICpzdGF0aWNfY2FzdDxjb25zdCBkb3Vi
bGUqPihhKTsKLSAgICBkb3VibGUgZGIgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgZG91YmxlKj4oYik7
Ci0gICAgcmV0dXJuIChkYSA+IGRiKSAtIChkYSA8IGRiKTsKLX0KLQotc3RhdGljIGludCBjb21w
YXJlTnVtYmVyc0ZvclFTb3J0KGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCi17Ci0gICAg
ZG91YmxlIGRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgSlNWYWx1ZSo+KGEpLT5hc051bWJlcigpOwot
ICAgIGRvdWJsZSBkYiA9IHN0YXRpY19jYXN0PGNvbnN0IEpTVmFsdWUqPihiKS0+YXNOdW1iZXIo
KTsKLSAgICByZXR1cm4gKGRhID4gZGIpIC0gKGRhIDwgZGIpOwotfQotCi1zdGF0aWMgaW50IGNv
bXBhcmVCeVN0cmluZ1BhaXJGb3JRU29ydChjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKQot
ewotICAgIGNvbnN0IFZhbHVlU3RyaW5nUGFpciogdmEgPSBzdGF0aWNfY2FzdDxjb25zdCBWYWx1
ZVN0cmluZ1BhaXIqPihhKTsKLSAgICBjb25zdCBWYWx1ZVN0cmluZ1BhaXIqIHZiID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgVmFsdWVTdHJpbmdQYWlyKj4oYik7Ci0gICAgcmV0dXJuIGNvZGVQb2ludENv
bXBhcmUodmEtPnNlY29uZCwgdmItPnNlY29uZCk7Ci19Ci0KLXRlbXBsYXRlPEluZGV4aW5nVHlw
ZSBhcnJheUluZGV4aW5nVHlwZT4KLXZvaWQgSlNBcnJheTo6c29ydE51bWVyaWNWZWN0b3IoRXhl
Y1N0YXRlKiBleGVjLCBKU1ZhbHVlIGNvbXBhcmVGdW5jdGlvbiwgQ2FsbFR5cGUgY2FsbFR5cGUs
IGNvbnN0IENhbGxEYXRhJiBjYWxsRGF0YSkKLXsKLSAgICBBU1NFUlQoYXJyYXlJbmRleGluZ1R5
cGUgPT0gQXJyYXlXaXRoSW50MzIgfHwgYXJyYXlJbmRleGluZ1R5cGUgPT0gQXJyYXlXaXRoRG91
YmxlIHx8IGFycmF5SW5kZXhpbmdUeXBlID09IEFycmF5V2l0aENvbnRpZ3VvdXMgfHwgYXJyYXlJ
bmRleGluZ1R5cGUgPT0gQXJyYXlXaXRoQXJyYXlTdG9yYWdlKTsKLSAgICAKLSAgICB1bnNpZ25l
ZCBsZW5ndGhOb3RJbmNsdWRpbmdVbmRlZmluZWQ7Ci0gICAgdW5zaWduZWQgbmV3UmVsZXZhbnRM
ZW5ndGg7Ci0gICAgY29tcGFjdEZvclNvcnRpbmc8YXJyYXlJbmRleGluZ1R5cGU+KAotICAgICAg
ICBsZW5ndGhOb3RJbmNsdWRpbmdVbmRlZmluZWQsCi0gICAgICAgIG5ld1JlbGV2YW50TGVuZ3Ro
KTsKLSAgICAKLSAgICBDb250aWd1b3VzSlNWYWx1ZXMgZGF0YSA9IGluZGV4aW5nRGF0YTxhcnJh
eUluZGV4aW5nVHlwZT4oKTsKLSAgICAKLSAgICBpZiAoYXJyYXlJbmRleGluZ1R5cGUgPT0gQXJy
YXlXaXRoQXJyYXlTdG9yYWdlICYmIGFycmF5U3RvcmFnZSgpLT5tX3NwYXJzZU1hcC5nZXQoKSkg
ewotICAgICAgICB0aHJvd091dE9mTWVtb3J5RXJyb3IoZXhlYyk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgCi0gICAgaWYgKCFsZW5ndGhOb3RJbmNsdWRpbmdVbmRlZmluZWQpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBib29sIGFsbFZhbHVlc0FyZU51bWJlcnMgPSB0cnVlOwot
ICAgIHN3aXRjaCAoYXJyYXlJbmRleGluZ1R5cGUpIHsKLSAgICBjYXNlIEFycmF5V2l0aEludDMy
OgotICAgIGNhc2UgQXJyYXlXaXRoRG91YmxlOgotICAgICAgICBicmVhazsKLSAgICAgICAgCi0g
ICAgZGVmYXVsdDoKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdSZWxldmFudExl
bmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoIWRhdGFbaV0uaXNOdW1iZXIoKSkgewotICAg
ICAgICAgICAgICAgIGFsbFZhbHVlc0FyZU51bWJlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9
Ci0gICAgCi0gICAgaWYgKCFhbGxWYWx1ZXNBcmVOdW1iZXJzKQotICAgICAgICByZXR1cm4gc29y
dChleGVjLCBjb21wYXJlRnVuY3Rpb24sIGNhbGxUeXBlLCBjYWxsRGF0YSk7Ci0gICAgCi0gICAg
Ly8gRm9yIG51bWVyaWMgY29tcGFyaXNvbiwgd2hpY2ggaXMgZmFzdCwgcXNvcnQgaXMgZmFzdGVy
IHRoYW4gbWVyZ2Vzb3J0LiBXZQotICAgIC8vIGFsc28gZG9uJ3QgcmVxdWlyZSBtZXJnZXNvcnQn
cyBzdGFiaWxpdHksIHNpbmNlIHRoZXJlJ3Mgbm8gdXNlciB2aXNpYmxlCi0gICAgLy8gc2lkZS1l
ZmZlY3QgZnJvbSBzd2FwcGluZyB0aGUgb3JkZXIgb2YgZXF1YWwgcHJpbWl0aXZlIHZhbHVlcy4K
LSAgICBpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopOwotICAgIHN3aXRj
aCAoYXJyYXlJbmRleGluZ1R5cGUpIHsKLSAgICBjYXNlIEFycmF5V2l0aEludDMyOgotICAgICAg
ICBjb21wYXJlID0gY29tcGFyZU51bWJlcnNGb3JRU29ydFdpdGhJbnQzMjsKLSAgICAgICAgYnJl
YWs7Ci0gICAgICAgIAotICAgIGNhc2UgQXJyYXlXaXRoRG91YmxlOgotICAgICAgICBjb21wYXJl
ID0gY29tcGFyZU51bWJlcnNGb3JRU29ydFdpdGhEb3VibGU7Ci0gICAgICAgIEFTU0VSVChzaXpl
b2YoV3JpdGVCYXJyaWVyPFVua25vd24+KSA9PSBzaXplb2YoZG91YmxlKSk7Ci0gICAgICAgIGJy
ZWFrOwotICAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBjb21wYXJlID0gY29tcGFyZU51
bWJlcnNGb3JRU29ydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEFTU0VSVChkYXRhLmxl
bmd0aCgpID49IG5ld1JlbGV2YW50TGVuZ3RoKTsKLSAgICBxc29ydChkYXRhLmRhdGEoKSwgbmV3
UmVsZXZhbnRMZW5ndGgsIHNpemVvZihXcml0ZUJhcnJpZXI8VW5rbm93bj4pLCBjb21wYXJlKTsK
LSAgICByZXR1cm47Ci19Ci0KLXZvaWQgSlNBcnJheTo6c29ydE51bWVyaWMoRXhlY1N0YXRlKiBl
eGVjLCBKU1ZhbHVlIGNvbXBhcmVGdW5jdGlvbiwgQ2FsbFR5cGUgY2FsbFR5cGUsIGNvbnN0IENh
bGxEYXRhJiBjYWxsRGF0YSkKLXsKLSAgICBBU1NFUlQoIWluU3BhcnNlSW5kZXhpbmdNb2RlKCkp
OwotCi0gICAgc3dpdGNoIChpbmRleGluZ1R5cGUoKSkgewotICAgIGNhc2UgQXJyYXlDbGFzczoK
LSAgICBjYXNlIEFycmF5V2l0aFVuZGVjaWRlZDoKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAK
LSAgICBjYXNlIEFycmF5V2l0aEludDMyOgotICAgICAgICBzb3J0TnVtZXJpY1ZlY3RvcjxBcnJh
eVdpdGhJbnQzMj4oZXhlYywgY29tcGFyZUZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEpOwot
ICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGNhc2UgQXJyYXlXaXRoRG91YmxlOgotICAg
ICAgICBzb3J0TnVtZXJpY1ZlY3RvcjxBcnJheVdpdGhEb3VibGU+KGV4ZWMsIGNvbXBhcmVGdW5j
dGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAg
ICBjYXNlIEFycmF5V2l0aENvbnRpZ3VvdXM6Ci0gICAgICAgIHNvcnROdW1lcmljVmVjdG9yPEFy
cmF5V2l0aENvbnRpZ3VvdXM+KGV4ZWMsIGNvbXBhcmVGdW5jdGlvbiwgY2FsbFR5cGUsIGNhbGxE
YXRhKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBBcnJheVdpdGhBcnJheVN0b3JhZ2U6
Ci0gICAgICAgIHNvcnROdW1lcmljVmVjdG9yPEFycmF5V2l0aEFycmF5U3RvcmFnZT4oZXhlYywg
Y29tcGFyZUZ1bmN0aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEpOwotICAgICAgICByZXR1cm47Ci0g
ICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGRhdGFMb2coIkluZGV4aW5nIHR5cGU6ICIs
IGluZGV4aW5nVHlwZSgpLCAiXG4iKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotdGVtcGxhdGUgPEluZGV4aW5nVHlw
ZT4gc3RydWN0IENvbnRpZ3VvdXNUeXBlQWNjZXNzb3IgewotICAgIHR5cGVkZWYgV3JpdGVCYXJy
aWVyPFVua25vd24+IFR5cGU7Ci0gICAgc3RhdGljIEpTVmFsdWUgZ2V0QXNWYWx1ZShDb250aWd1
b3VzRGF0YTxUeXBlPiBkYXRhLCBzaXplX3QgaSkgeyByZXR1cm4gZGF0YVtpXS5nZXQoKTsgfQot
ICAgIHN0YXRpYyB2b2lkIHNldFdpdGhWYWx1ZShWTSYgdm0sIEpTQXJyYXkqIHRoaXNWYWx1ZSwg
Q29udGlndW91c0RhdGE8VHlwZT4gZGF0YSwgc2l6ZV90IGksIEpTVmFsdWUgdmFsdWUpCi0gICAg
ewotICAgICAgICBkYXRhW2ldLnNldCh2bSwgdGhpc1ZhbHVlLCB2YWx1ZSk7Ci0gICAgfQotICAg
IHN0YXRpYyB2b2lkIHJlcGxhY2VEYXRhUmVmZXJlbmNlKENvbnRpZ3VvdXNEYXRhPFR5cGU+KiBv
dXREYXRhLCBDb250aWd1b3VzSlNWYWx1ZXMgaW5EYXRhKQotICAgIHsKLSAgICAgICAgKm91dERh
dGEgPSBpbkRhdGE7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgPD4gc3RydWN0IENvbnRpZ3VvdXNU
eXBlQWNjZXNzb3I8QXJyYXlXaXRoRG91YmxlPiB7Ci0gICAgdHlwZWRlZiBkb3VibGUgVHlwZTsK
LSAgICBzdGF0aWMgSlNWYWx1ZSBnZXRBc1ZhbHVlKENvbnRpZ3VvdXNEYXRhPFR5cGU+IGRhdGEs
IHNpemVfdCBpKSB7IEFTU0VSVChkYXRhW2ldID09IGRhdGFbaV0pOyByZXR1cm4gSlNWYWx1ZShK
U1ZhbHVlOjpFbmNvZGVBc0RvdWJsZSwgZGF0YVtpXSk7IH0KLSAgICBzdGF0aWMgdm9pZCBzZXRX
aXRoVmFsdWUoVk0mLCBKU0FycmF5KiwgQ29udGlndW91c0RhdGE8VHlwZT4gZGF0YSwgc2l6ZV90
IGksIEpTVmFsdWUgdmFsdWUpCi0gICAgewotICAgICAgICBkYXRhW2ldID0gdmFsdWUuYXNOdW1i
ZXIoKTsKLSAgICB9Ci0gICAgc3RhdGljIE5PX1JFVFVSTl9EVUVfVE9fQ1JBU0ggdm9pZCByZXBs
YWNlRGF0YVJlZmVyZW5jZShDb250aWd1b3VzRGF0YTxUeXBlPiosIENvbnRpZ3VvdXNKU1ZhbHVl
cykKLSAgICB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FHRSgwLCAiSW5jb25z
aXN0ZW50IGluZGV4aW5nIHR5cGVzIGR1cmluZyBjb21wYWN0IGFycmF5IHNvcnQuIik7Ci0gICAg
fQotfTsKLQotCi10ZW1wbGF0ZTxJbmRleGluZ1R5cGUgYXJyYXlJbmRleGluZ1R5cGUsIHR5cGVu
YW1lIFN0b3JhZ2VUeXBlPgotdm9pZCBKU0FycmF5Ojpzb3J0Q29tcGFjdGVkVmVjdG9yKEV4ZWNT
dGF0ZSogZXhlYywgQ29udGlndW91c0RhdGE8U3RvcmFnZVR5cGU+IGRhdGEsIHVuc2lnbmVkIHJl
bGV2YW50TGVuZ3RoKQotewotICAgIGlmICghcmVsZXZhbnRMZW5ndGgpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBWTSYgdm0gPSBleGVjLT52bSgpOwotCi0gICAgLy8gQ29udmVydGluZyBK
YXZhU2NyaXB0IHZhbHVlcyB0byBzdHJpbmdzIGNhbiBiZSBleHBlbnNpdmUsIHNvIHdlIGRvIGl0
IG9uY2UgdXAgZnJvbnQgYW5kIHNvcnQgYmFzZWQgb24gdGhhdC4KLSAgICAvLyBUaGlzIGlzIGEg
Y29uc2lkZXJhYmxlIGltcHJvdmVtZW50IG92ZXIgZG9pbmcgaXQgdHdpY2UgcGVyIGNvbXBhcmlz
b24sIHRob3VnaCBpdCByZXF1aXJlcyBhIGxhcmdlIHRlbXBvcmFyeQotICAgIC8vIGJ1ZmZlci4g
QmVzaWRlcywgdGhpcyBwcm90ZWN0cyB1cyBmcm9tIGNyYXNoaW5nIGlmIHNvbWUgb2JqZWN0cyBo
YXZlIGN1c3RvbSB0b1N0cmluZyBtZXRob2RzIHRoYXQgcmV0dXJuCi0gICAgLy8gcmFuZG9tIG9y
IG90aGVyd2lzZSBjaGFuZ2luZyByZXN1bHRzLCBlZmZlY3RpdmVseSBtYWtpbmcgY29tcGFyZSBm
dW5jdGlvbiBpbmNvbnNpc3RlbnQuCi0gICAgICAgIAotICAgIFZlY3RvcjxWYWx1ZVN0cmluZ1Bh
aXIsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiB2YWx1ZXMocmVsZXZhbnRMZW5ndGgpOwotICAg
IGlmICghdmFsdWVzLmJlZ2luKCkpIHsKLSAgICAgICAgdGhyb3dPdXRPZk1lbW9yeUVycm9yKGV4
ZWMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBIZWFwOjpoZWFwKHRo
aXMpLT5wdXNoVGVtcFNvcnRWZWN0b3IoJnZhbHVlcyk7Ci0gICAgICAgIAotICAgIGJvb2wgaXNT
b3J0aW5nUHJpbWl0aXZlVmFsdWVzID0gdHJ1ZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcmVsZXZhbnRMZW5ndGg7IGkrKykgewotICAgICAgICBKU1ZhbHVlIHZhbHVlID0gQ29udGln
dW91c1R5cGVBY2Nlc3NvcjxhcnJheUluZGV4aW5nVHlwZT46OmdldEFzVmFsdWUoZGF0YSwgaSk7
Ci0gICAgICAgIEFTU0VSVChhcnJheUluZGV4aW5nVHlwZSAhPSBBcnJheVdpdGhJbnQzMiB8fCB2
YWx1ZS5pc0ludDMyKCkpOwotICAgICAgICBBU1NFUlQoIXZhbHVlLmlzVW5kZWZpbmVkKCkpOwot
ICAgICAgICB2YWx1ZXNbaV0uZmlyc3QgPSB2YWx1ZTsKLSAgICAgICAgaWYgKGFycmF5SW5kZXhp
bmdUeXBlICE9IEFycmF5V2l0aERvdWJsZSAmJiBhcnJheUluZGV4aW5nVHlwZSAhPSBBcnJheVdp
dGhJbnQzMikKLSAgICAgICAgICAgIGlzU29ydGluZ1ByaW1pdGl2ZVZhbHVlcyA9IGlzU29ydGlu
Z1ByaW1pdGl2ZVZhbHVlcyAmJiB2YWx1ZS5pc1ByaW1pdGl2ZSgpOwotICAgIH0KLSAgICAgICAg
Ci0gICAgLy8gRklYTUU6IFRoZSBmb2xsb3dpbmcgbG9vcCBjb250aW51ZXMgdG8gY2FsbCB0b1N0
cmluZyBvbiBzdWJzZXF1ZW50IHZhbHVlcyBldmVuIGFmdGVyCi0gICAgLy8gYSB0b1N0cmluZyBj
YWxsIHJhaXNlcyBhbiBleGNlcHRpb24uCi0gICAgICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgcmVsZXZhbnRMZW5ndGg7IGkrKykKLSAgICAgICAgdmFsdWVzW2ldLnNlY29uZCA9IHZh
bHVlc1tpXS5maXJzdC50b1dURlN0cmluZ0lubGluZShleGVjKTsKLSAgICAgICAgCi0gICAgaWYg
KGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7Ci0gICAgICAgIEhlYXA6OmhlYXAodGhpcyktPnBvcFRl
bXBTb3J0VmVjdG9yKCZ2YWx1ZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAK
LSAgICAvLyBGSVhNRTogU2luY2Ugd2Ugc29ydCBieSBzdHJpbmcgdmFsdWUsIGEgZmFzdCBhbGdv
cml0aG0gbWlnaHQgYmUgdG8gdXNlIGEgcmFkaXggc29ydC4gVGhhdCB3b3VsZCBiZSBPKE4pIHJh
dGhlcgotICAgIC8vIHRoYW4gTyhOIGxvZyBOKS4KLSAgICAgICAgCi0jaWYgSEFWRShNRVJHRVNP
UlQpCi0gICAgaWYgKGlzU29ydGluZ1ByaW1pdGl2ZVZhbHVlcykKLSAgICAgICAgcXNvcnQodmFs
dWVzLmJlZ2luKCksIHZhbHVlcy5zaXplKCksIHNpemVvZihWYWx1ZVN0cmluZ1BhaXIpLCBjb21w
YXJlQnlTdHJpbmdQYWlyRm9yUVNvcnQpOwotICAgIGVsc2UKLSAgICAgICAgbWVyZ2Vzb3J0KHZh
bHVlcy5iZWdpbigpLCB2YWx1ZXMuc2l6ZSgpLCBzaXplb2YoVmFsdWVTdHJpbmdQYWlyKSwgY29t
cGFyZUJ5U3RyaW5nUGFpckZvclFTb3J0KTsKLSNlbHNlCi0gICAgLy8gRklYTUU6IFRoZSBxc29y
dCBsaWJyYXJ5IGZ1bmN0aW9uIGlzIGxpa2VseSB0byBub3QgYmUgYSBzdGFibGUgc29ydC4KLSAg
ICAvLyBFQ01BU2NyaXB0LTI2MiBkb2VzIG5vdCBzcGVjaWZ5IGEgc3RhYmxlIHNvcnQsIGJ1dCBp
biBwcmFjdGljZSwgYnJvd3NlcnMgcGVyZm9ybSBhIHN0YWJsZSBzb3J0LgotICAgIHFzb3J0KHZh
bHVlcy5iZWdpbigpLCB2YWx1ZXMuc2l6ZSgpLCBzaXplb2YoVmFsdWVTdHJpbmdQYWlyKSwgY29t
cGFyZUJ5U3RyaW5nUGFpckZvclFTb3J0KTsKLSNlbmRpZgotICAgIAotICAgIC8vIElmIHRoZSB0
b1N0cmluZyBmdW5jdGlvbiBjaGFuZ2VkIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IG9yIHZlY3Rv
ciBzdG9yYWdlLAotICAgIC8vIGluY3JlYXNlIHRoZSBsZW5ndGggdG8gaGFuZGxlIHRoZSBvcmln
bmFsIG51bWJlciBvZiBhY3R1YWwgdmFsdWVzLgotICAgIHN3aXRjaCAoYXJyYXlJbmRleGluZ1R5
cGUpIHsKLSAgICBjYXNlIEFycmF5V2l0aEludDMyOgotICAgIGNhc2UgQXJyYXlXaXRoRG91Ymxl
OgotICAgIGNhc2UgQXJyYXlXaXRoQ29udGlndW91czoKLSAgICAgICAgZW5zdXJlTGVuZ3RoKHZt
LCByZWxldmFudExlbmd0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEFy
cmF5V2l0aEFycmF5U3RvcmFnZToKLSAgICAgICAgaWYgKGFycmF5U3RvcmFnZSgpLT52ZWN0b3JM
ZW5ndGgoKSA8IHJlbGV2YW50TGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbmNyZWFzZVZlY3Rvckxl
bmd0aChleGVjLT52bSgpLCByZWxldmFudExlbmd0aCk7Ci0gICAgICAgICAgICBDb250aWd1b3Vz
VHlwZUFjY2Vzc29yPGFycmF5SW5kZXhpbmdUeXBlPjo6cmVwbGFjZURhdGFSZWZlcmVuY2UoJmRh
dGEsIGFycmF5U3RvcmFnZSgpLT52ZWN0b3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFy
cmF5U3RvcmFnZSgpLT5sZW5ndGgoKSA8IHJlbGV2YW50TGVuZ3RoKQotICAgICAgICAgICAgYXJy
YXlTdG9yYWdlKCktPnNldExlbmd0aChyZWxldmFudExlbmd0aCk7Ci0gICAgICAgIGJyZWFrOwot
ICAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBDUkFTSCgpOwotICAgIH0KLQotICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVsZXZhbnRMZW5ndGg7IGkrKykKLSAgICAgICAgQ29udGln
dW91c1R5cGVBY2Nlc3NvcjxhcnJheUluZGV4aW5nVHlwZT46OnNldFdpdGhWYWx1ZSh2bSwgdGhp
cywgZGF0YSwgaSwgdmFsdWVzW2ldLmZpcnN0KTsKLSAgICAKLSAgICBIZWFwOjpoZWFwKHRoaXMp
LT5wb3BUZW1wU29ydFZlY3RvcigmdmFsdWVzKTsKLX0KLQotdm9pZCBKU0FycmF5Ojpzb3J0KEV4
ZWNTdGF0ZSogZXhlYykKLXsKLSAgICBBU1NFUlQoIWluU3BhcnNlSW5kZXhpbmdNb2RlKCkpOwot
ICAgIAotICAgIHN3aXRjaCAoaW5kZXhpbmdUeXBlKCkpIHsKLSAgICBjYXNlIEFycmF5Q2xhc3M6
Ci0gICAgY2FzZSBBcnJheVdpdGhVbmRlY2lkZWQ6Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAg
Ci0gICAgY2FzZSBBcnJheVdpdGhJbnQzMjogewotICAgICAgICB1bnNpZ25lZCBsZW5ndGhOb3RJ
bmNsdWRpbmdVbmRlZmluZWQ7Ci0gICAgICAgIHVuc2lnbmVkIG5ld1JlbGV2YW50TGVuZ3RoOwot
ICAgICAgICBjb21wYWN0Rm9yU29ydGluZzxBcnJheVdpdGhJbnQzMj4oCi0gICAgICAgICAgICBs
ZW5ndGhOb3RJbmNsdWRpbmdVbmRlZmluZWQsIG5ld1JlbGV2YW50TGVuZ3RoKTsKLSAgICAgICAg
Ci0gICAgICAgIHNvcnRDb21wYWN0ZWRWZWN0b3I8QXJyYXlXaXRoSW50MzI+KAotICAgICAgICAg
ICAgZXhlYywgbV9idXR0ZXJmbHktPmNvbnRpZ3VvdXNJbnQzMigpLCBsZW5ndGhOb3RJbmNsdWRp
bmdVbmRlZmluZWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBjYXNl
IEFycmF5V2l0aERvdWJsZTogewotICAgICAgICB1bnNpZ25lZCBsZW5ndGhOb3RJbmNsdWRpbmdV
bmRlZmluZWQ7Ci0gICAgICAgIHVuc2lnbmVkIG5ld1JlbGV2YW50TGVuZ3RoOwotICAgICAgICBj
b21wYWN0Rm9yU29ydGluZzxBcnJheVdpdGhEb3VibGU+KAotICAgICAgICAgICAgbGVuZ3RoTm90
SW5jbHVkaW5nVW5kZWZpbmVkLCBuZXdSZWxldmFudExlbmd0aCk7Ci0gICAgICAgIAotICAgICAg
ICBzb3J0Q29tcGFjdGVkVmVjdG9yPEFycmF5V2l0aERvdWJsZT4oCi0gICAgICAgICAgICBleGVj
LCBtX2J1dHRlcmZseS0+Y29udGlndW91c0RvdWJsZSgpLCBsZW5ndGhOb3RJbmNsdWRpbmdVbmRl
ZmluZWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBjYXNlIEFycmF5
V2l0aENvbnRpZ3VvdXM6IHsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoTm90SW5jbHVkaW5nVW5k
ZWZpbmVkOwotICAgICAgICB1bnNpZ25lZCBuZXdSZWxldmFudExlbmd0aDsKLSAgICAgICAgY29t
cGFjdEZvclNvcnRpbmc8QXJyYXlXaXRoQ29udGlndW91cz4oCi0gICAgICAgICAgICBsZW5ndGhO
b3RJbmNsdWRpbmdVbmRlZmluZWQsIG5ld1JlbGV2YW50TGVuZ3RoKTsKLSAgICAgICAgCi0gICAg
ICAgIHNvcnRDb21wYWN0ZWRWZWN0b3I8QXJyYXlXaXRoQ29udGlndW91cz4oCi0gICAgICAgICAg
ICBleGVjLCBtX2J1dHRlcmZseS0+Y29udGlndW91cygpLCBsZW5ndGhOb3RJbmNsdWRpbmdVbmRl
ZmluZWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBjYXNlIEFycmF5
V2l0aEFycmF5U3RvcmFnZTogewotICAgICAgICB1bnNpZ25lZCBsZW5ndGhOb3RJbmNsdWRpbmdV
bmRlZmluZWQ7Ci0gICAgICAgIHVuc2lnbmVkIG5ld1JlbGV2YW50TGVuZ3RoOwotICAgICAgICBj
b21wYWN0Rm9yU29ydGluZzxBcnJheVdpdGhBcnJheVN0b3JhZ2U+KAotICAgICAgICAgICAgbGVu
Z3RoTm90SW5jbHVkaW5nVW5kZWZpbmVkLCBuZXdSZWxldmFudExlbmd0aCk7Ci0gICAgICAgIEFy
cmF5U3RvcmFnZSogc3RvcmFnZSA9IG1fYnV0dGVyZmx5LT5hcnJheVN0b3JhZ2UoKTsKLSAgICAg
ICAgQVNTRVJUKCFzdG9yYWdlLT5tX3NwYXJzZU1hcCk7Ci0gICAgICAgIAotICAgICAgICBzb3J0
Q29tcGFjdGVkVmVjdG9yPEFycmF5V2l0aEFycmF5U3RvcmFnZT4oZXhlYywgc3RvcmFnZS0+dmVj
dG9yKCksIGxlbmd0aE5vdEluY2x1ZGluZ1VuZGVmaW5lZCk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgfQotfQotCi1zdHJ1Y3QgQVZMVHJlZU5vZGVGb3JBcnJheUNvbXBhcmUg
ewotICAgIEpTVmFsdWUgdmFsdWU7Ci0KLSAgICAvLyBDaGlsZCBwb2ludGVycy4gIFRoZSBoaWdo
IGJpdCBvZiBndCBpcyByb2JiZWQgYW5kIHVzZWQgYXMgdGhlCi0gICAgLy8gYmFsYW5jZSBmYWN0
b3Igc2lnbi4gIFRoZSBoaWdoIGJpdCBvZiBsdCBpcyByb2JiZWQgYW5kIHVzZWQgYXMKLSAgICAv
LyB0aGUgbWFnbml0dWRlIG9mIHRoZSBiYWxhbmNlIGZhY3Rvci4KLSAgICBpbnQzMl90IGd0Owot
ICAgIGludDMyX3QgbHQ7Ci19OwotCi1zdHJ1Y3QgQVZMVHJlZUFic3RyYWN0b3JGb3JBcnJheUNv
bXBhcmUgewotICAgIHR5cGVkZWYgaW50MzJfdCBoYW5kbGU7IC8vIEhhbmRsZSBpcyBhbiBpbmRl
eCBpbnRvIG1fbm9kZXMgdmVjdG9yLgotICAgIHR5cGVkZWYgSlNWYWx1ZSBrZXk7Ci0gICAgdHlw
ZWRlZiBpbnQzMl90IHNpemU7Ci0KLSAgICBWZWN0b3I8QVZMVHJlZU5vZGVGb3JBcnJheUNvbXBh
cmUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX25vZGVzOwotICAgIEV4ZWNTdGF0ZSogbV9l
eGVjOwotICAgIEpTVmFsdWUgbV9jb21wYXJlRnVuY3Rpb247Ci0gICAgQ2FsbFR5cGUgbV9jb21w
YXJlQ2FsbFR5cGU7Ci0gICAgY29uc3QgQ2FsbERhdGEqIG1fY29tcGFyZUNhbGxEYXRhOwotICAg
IHN0ZDo6dW5pcXVlX3B0cjxDYWNoZWRDYWxsPiBtX2NhY2hlZENhbGw7Ci0KLSAgICBoYW5kbGUg
Z2V0X2xlc3MoaGFuZGxlIGgpIHsgcmV0dXJuIG1fbm9kZXNbaF0ubHQgJiAweDdGRkZGRkZGOyB9
Ci0gICAgdm9pZCBzZXRfbGVzcyhoYW5kbGUgaCwgaGFuZGxlIGxoKSB7IG1fbm9kZXNbaF0ubHQg
Jj0gMHg4MDAwMDAwMDsgbV9ub2Rlc1toXS5sdCB8PSBsaDsgfQotICAgIGhhbmRsZSBnZXRfZ3Jl
YXRlcihoYW5kbGUgaCkgeyByZXR1cm4gbV9ub2Rlc1toXS5ndCAmIDB4N0ZGRkZGRkY7IH0KLSAg
ICB2b2lkIHNldF9ncmVhdGVyKGhhbmRsZSBoLCBoYW5kbGUgZ2gpIHsgbV9ub2Rlc1toXS5ndCAm
PSAweDgwMDAwMDAwOyBtX25vZGVzW2hdLmd0IHw9IGdoOyB9Ci0KLSAgICBpbnQgZ2V0X2JhbGFu
Y2VfZmFjdG9yKGhhbmRsZSBoKQotICAgIHsKLSAgICAgICAgaWYgKG1fbm9kZXNbaF0uZ3QgJiAw
eDgwMDAwMDAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KG1fbm9kZXNbaF0ubHQpID4+IDMxOwotICAgIH0KLQotICAgIHZvaWQg
c2V0X2JhbGFuY2VfZmFjdG9yKGhhbmRsZSBoLCBpbnQgYmYpCi0gICAgewotICAgICAgICBpZiAo
YmYgPT0gMCkgewotICAgICAgICAgICAgbV9ub2Rlc1toXS5sdCAmPSAweDdGRkZGRkZGOwotICAg
ICAgICAgICAgbV9ub2Rlc1toXS5ndCAmPSAweDdGRkZGRkZGOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgbV9ub2Rlc1toXS5sdCB8PSAweDgwMDAwMDAwOwotICAgICAgICAgICAgaWYg
KGJmIDwgMCkKLSAgICAgICAgICAgICAgICBtX25vZGVzW2hdLmd0IHw9IDB4ODAwMDAwMDA7Ci0g
ICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9ub2Rlc1toXS5ndCAmPSAweDdGRkZG
RkZGOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGNvbXBhcmVfa2V5X2tleShrZXkgdmEs
IGtleSB2YikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghdmEuaXNVbmRlZmluZWQoKSk7Ci0gICAg
ICAgIEFTU0VSVCghdmIuaXNVbmRlZmluZWQoKSk7Ci0KLSAgICAgICAgaWYgKG1fZXhlYy0+aGFk
RXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBkb3VibGUgY29t
cGFyZVJlc3VsdDsKLSAgICAgICAgaWYgKG1fY2FjaGVkQ2FsbCkgewotICAgICAgICAgICAgbV9j
YWNoZWRDYWxsLT5zZXRUaGlzKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICAgICAgbV9jYWNoZWRD
YWxsLT5zZXRBcmd1bWVudCgwLCB2YSk7Ci0gICAgICAgICAgICBtX2NhY2hlZENhbGwtPnNldEFy
Z3VtZW50KDEsIHZiKTsKLSAgICAgICAgICAgIGNvbXBhcmVSZXN1bHQgPSBtX2NhY2hlZENhbGwt
PmNhbGwoKS50b051bWJlcihtX2V4ZWMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
TWFya2VkQXJndW1lbnRCdWZmZXIgYXJndW1lbnRzOwotICAgICAgICAgICAgYXJndW1lbnRzLmFw
cGVuZCh2YSk7Ci0gICAgICAgICAgICBhcmd1bWVudHMuYXBwZW5kKHZiKTsKLSAgICAgICAgICAg
IGNvbXBhcmVSZXN1bHQgPSBjYWxsKG1fZXhlYywgbV9jb21wYXJlRnVuY3Rpb24sIG1fY29tcGFy
ZUNhbGxUeXBlLCAqbV9jb21wYXJlQ2FsbERhdGEsIGpzVW5kZWZpbmVkKCksIGFyZ3VtZW50cyku
dG9OdW1iZXIobV9leGVjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGNvbXBhcmVSZXN1
bHQgPCAwKSA/IC0xIDogMTsgLy8gTm90IHBhc3NpbmcgZXF1YWxpdHkgdGhyb3VnaCwgYmVjYXVz
ZSB3ZSBuZWVkIHRvIHN0b3JlIGFsbCB2YWx1ZXMsIGV2ZW4gaWYgZXF1aXZhbGVudC4KLSAgICB9
Ci0KLSAgICBpbnQgY29tcGFyZV9rZXlfbm9kZShrZXkgaywgaGFuZGxlIGgpIHsgcmV0dXJuIGNv
bXBhcmVfa2V5X2tleShrLCBtX25vZGVzW2hdLnZhbHVlKTsgfQotICAgIGludCBjb21wYXJlX25v
ZGVfbm9kZShoYW5kbGUgaDEsIGhhbmRsZSBoMikgeyByZXR1cm4gY29tcGFyZV9rZXlfa2V5KG1f
bm9kZXNbaDFdLnZhbHVlLCBtX25vZGVzW2gyXS52YWx1ZSk7IH0KLQotICAgIHN0YXRpYyBoYW5k
bGUgbnVsbCgpIHsgcmV0dXJuIDB4N0ZGRkZGRkY7IH0KLX07Ci0KLXRlbXBsYXRlPEluZGV4aW5n
VHlwZSBhcnJheUluZGV4aW5nVHlwZT4KLXZvaWQgSlNBcnJheTo6c29ydFZlY3RvcihFeGVjU3Rh
dGUqIGV4ZWMsIEpTVmFsdWUgY29tcGFyZUZ1bmN0aW9uLCBDYWxsVHlwZSBjYWxsVHlwZSwgY29u
c3QgQ2FsbERhdGEmIGNhbGxEYXRhKQotewotICAgIEFTU0VSVCghaW5TcGFyc2VJbmRleGluZ01v
ZGUoKSk7Ci0gICAgQVNTRVJUKGFycmF5SW5kZXhpbmdUeXBlID09IGluZGV4aW5nVHlwZSgpKTsK
LSAgICAKLSAgICAvLyBGSVhNRTogVGhpcyBpZ25vcmVzIGV4Y2VwdGlvbnMgcmFpc2VkIGluIHRo
ZSBjb21wYXJlIGZ1bmN0aW9uIG9yIGluIHRvTnVtYmVyLgotICAgICAgICAKLSAgICAvLyBUaGUg
bWF4aW11bSB0cmVlIGRlcHRoIGlzIGNvbXBpbGVkIGluIC0gYnV0IHRoZSBjYWxsZXIgaXMgY2xl
YXJseSB1cCB0byBubyBnb29kCi0gICAgLy8gaWYgYSBsYXJnZXIgYXJyYXkgaXMgcGFzc2VkLgot
ICAgIEFTU0VSVChtX2J1dHRlcmZseS0+cHVibGljTGVuZ3RoKCkgPD0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQ+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpKTsKLSAgICBpZiAobV9idXR0
ZXJmbHktPnB1YmxpY0xlbmd0aCgpID4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50Pjo6bWF4KCkpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIHVu
c2lnbmVkIHVzZWRWZWN0b3JMZW5ndGggPSByZWxldmFudExlbmd0aDxhcnJheUluZGV4aW5nVHlw
ZT4oKTsKLSAgICB1bnNpZ25lZCBub2RlQ291bnQgPSB1c2VkVmVjdG9yTGVuZ3RoOwotICAgICAg
ICAKLSAgICBpZiAoIW5vZGVDb3VudCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBB
VkxUcmVlPEFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlLCA0ND4gdHJlZTsgLy8gRGVw
dGggNDQgaXMgZW5vdWdoIGZvciAyXjMxIGl0ZW1zCi0gICAgdHJlZS5hYnN0cmFjdG9yKCkubV9l
eGVjID0gZXhlYzsKLSAgICB0cmVlLmFic3RyYWN0b3IoKS5tX2NvbXBhcmVGdW5jdGlvbiA9IGNv
bXBhcmVGdW5jdGlvbjsKLSAgICB0cmVlLmFic3RyYWN0b3IoKS5tX2NvbXBhcmVDYWxsVHlwZSA9
IGNhbGxUeXBlOwotICAgIHRyZWUuYWJzdHJhY3RvcigpLm1fY29tcGFyZUNhbGxEYXRhID0gJmNh
bGxEYXRhOwotICAgIHRyZWUuYWJzdHJhY3RvcigpLm1fbm9kZXMuZ3Jvdyhub2RlQ291bnQpOwot
Ci0gICAgaWYgKGNhbGxUeXBlID09IENhbGxUeXBlSlMpCi0gICAgICAgIHRyZWUuYWJzdHJhY3Rv
cigpLm1fY2FjaGVkQ2FsbCA9IHN0ZDo6bWFrZV91bmlxdWU8Q2FjaGVkQ2FsbD4oZXhlYywganND
YXN0PEpTRnVuY3Rpb24qPihjb21wYXJlRnVuY3Rpb24pLCAyKTsKLQotICAgIGlmICghdHJlZS5h
YnN0cmFjdG9yKCkubV9ub2Rlcy5iZWdpbigpKSB7Ci0gICAgICAgIHRocm93T3V0T2ZNZW1vcnlF
cnJvcihleGVjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgLy8gRklY
TUU6IElmIHRoZSBjb21wYXJlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBhcnJheSwgdGhlIHZlY3Rv
ciwgbWFwLCBldGMuIGNvdWxkIGJlIG1vZGlmaWVkCi0gICAgLy8gcmlnaHQgb3V0IGZyb20gdW5k
ZXIgdXMgd2hpbGUgd2UncmUgYnVpbGRpbmcgdGhlIHRyZWUgaGVyZS4KLSAgICAgICAgCi0gICAg
dW5zaWduZWQgbnVtRGVmaW5lZCA9IDA7Ci0gICAgdW5zaWduZWQgbnVtVW5kZWZpbmVkID0gMDsK
LSAgICAKLSAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGFycmF5LCBpZ25vcmluZyBtaXNzaW5nIHZh
bHVlcywgY291bnRpbmcgdW5kZWZpbmVkIG9uZXMsIGFuZCBpbnNlcnRpbmcgYWxsIG90aGVyIG9u
ZXMgaW50byB0aGUgdHJlZS4KLSAgICBmb3IgKDsgbnVtRGVmaW5lZCA8IHVzZWRWZWN0b3JMZW5n
dGg7ICsrbnVtRGVmaW5lZCkgewotICAgICAgICBpZiAobnVtRGVmaW5lZCA+PSBtX2J1dHRlcmZs
eS0+dmVjdG9yTGVuZ3RoKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgSlNWYWx1ZSB2
ID0gZ2V0SG9seUluZGV4UXVpY2tseShudW1EZWZpbmVkKTsKLSAgICAgICAgaWYgKCF2IHx8IHYu
aXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB0cmVlLmFic3RyYWN0
b3IoKS5tX25vZGVzW251bURlZmluZWRdLnZhbHVlID0gdjsKLSAgICAgICAgdHJlZS5pbnNlcnQo
bnVtRGVmaW5lZCk7Ci0gICAgfQotICAgIGZvciAodW5zaWduZWQgaSA9IG51bURlZmluZWQ7IGkg
PCB1c2VkVmVjdG9yTGVuZ3RoOyArK2kpIHsKLSAgICAgICAgaWYgKGkgPj0gbV9idXR0ZXJmbHkt
PnZlY3Rvckxlbmd0aCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIEpTVmFsdWUgdiA9
IGdldEhvbHlJbmRleFF1aWNrbHkoaSk7Ci0gICAgICAgIGlmICh2KSB7Ci0gICAgICAgICAgICBp
ZiAodi5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgICsrbnVtVW5kZWZpbmVkOwotICAg
ICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJlZS5hYnN0cmFjdG9yKCkubV9ub2Rl
c1tudW1EZWZpbmVkXS52YWx1ZSA9IHY7Ci0gICAgICAgICAgICAgICAgdHJlZS5pbnNlcnQobnVt
RGVmaW5lZCk7Ci0gICAgICAgICAgICAgICAgKytudW1EZWZpbmVkOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHVuc2lnbmVkIG5ld1VzZWRWZWN0b3JMZW5ndGgg
PSBudW1EZWZpbmVkICsgbnVtVW5kZWZpbmVkOwotICAgICAgICAKLSAgICAvLyBUaGUgYXJyYXkg
c2l6ZSBtYXkgaGF2ZSBjaGFuZ2VkLiBGaWd1cmUgb3V0IHRoZSBuZXcgYm91bmRzLgotICAgIHVu
c2lnbmVkIG5ld2VzdFVzZWRWZWN0b3JMZW5ndGggPSBjdXJyZW50UmVsZXZhbnRMZW5ndGgoKTsK
LSAgICAgICAgCi0gICAgdW5zaWduZWQgZWxlbWVudHNUb0V4dHJhY3RUaHJlc2hvbGQgPSBtaW4o
bWluKG5ld2VzdFVzZWRWZWN0b3JMZW5ndGgsIG51bURlZmluZWQpLCBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4odHJlZS5hYnN0cmFjdG9yKCkubV9ub2Rlcy5zaXplKCkpKTsKLSAgICB1bnNpZ25lZCB1
bmRlZmluZWRFbGVtZW50c1RocmVzaG9sZCA9IG1pbihuZXdlc3RVc2VkVmVjdG9yTGVuZ3RoLCBu
ZXdVc2VkVmVjdG9yTGVuZ3RoKTsKLSAgICB1bnNpZ25lZCBjbGVhckVsZW1lbnRzVGhyZXNob2xk
ID0gbWluKG5ld2VzdFVzZWRWZWN0b3JMZW5ndGgsIHVzZWRWZWN0b3JMZW5ndGgpOwotICAgICAg
ICAKLSAgICAvLyBDb3B5IHRoZSB2YWx1ZXMgYmFjayBpbnRvIG1fc3RvcmFnZS4KLSAgICBBVkxU
cmVlPEFWTFRyZWVBYnN0cmFjdG9yRm9yQXJyYXlDb21wYXJlLCA0ND46Okl0ZXJhdG9yIGl0ZXI7
Ci0gICAgaXRlci5zdGFydF9pdGVyX2xlYXN0KHRyZWUpOwotICAgIFZNJiB2bSA9IGV4ZWMtPnZt
KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGVsZW1lbnRzVG9FeHRyYWN0VGhyZXNo
b2xkOyArK2kpIHsKLSAgICAgICAgQVNTRVJUKGkgPCBidXR0ZXJmbHkoKS0+dmVjdG9yTGVuZ3Ro
KCkpOwotICAgICAgICBpZiAoaW5kZXhpbmdUeXBlKCkgPT0gQXJyYXlXaXRoRG91YmxlKQotICAg
ICAgICAgICAgYnV0dGVyZmx5KCktPmNvbnRpZ3VvdXNEb3VibGUoKVtpXSA9IHRyZWUuYWJzdHJh
Y3RvcigpLm1fbm9kZXNbKml0ZXJdLnZhbHVlLmFzTnVtYmVyKCk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGN1cnJlbnRJbmRleGluZ0RhdGEoKVtpXS5zZXQodm0sIHRoaXMsIHRyZWUuYWJz
dHJhY3RvcigpLm1fbm9kZXNbKml0ZXJdLnZhbHVlKTsKLSAgICAgICAgKytpdGVyOwotICAgIH0K
LSAgICAvLyBQdXQgdW5kZWZpbmVkIHZhbHVlcyBiYWNrIGluLgotICAgIHN3aXRjaCAoaW5kZXhp
bmdUeXBlKCkpIHsKLSAgICBjYXNlIEFycmF5V2l0aEludDMyOgotICAgIGNhc2UgQXJyYXlXaXRo
RG91YmxlOgotICAgICAgICBBU1NFUlQoZWxlbWVudHNUb0V4dHJhY3RUaHJlc2hvbGQgPT0gdW5k
ZWZpbmVkRWxlbWVudHNUaHJlc2hvbGQpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAg
ZGVmYXVsdDoKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gZWxlbWVudHNUb0V4dHJhY3RUaHJl
c2hvbGQ7IGkgPCB1bmRlZmluZWRFbGVtZW50c1RocmVzaG9sZDsgKytpKSB7Ci0gICAgICAgICAg
ICBBU1NFUlQoaSA8IGJ1dHRlcmZseSgpLT52ZWN0b3JMZW5ndGgoKSk7Ci0gICAgICAgICAgICBj
dXJyZW50SW5kZXhpbmdEYXRhKClbaV0uc2V0VW5kZWZpbmVkKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICAvLyBFbnN1cmUgdGhhdCB1bnVzZWQgdmFsdWVzIGluIHRoZSB2ZWN0b3IgYXJlIHpl
cm9lZCBvdXQuCi0gICAgZm9yICh1bnNpZ25lZCBpID0gdW5kZWZpbmVkRWxlbWVudHNUaHJlc2hv
bGQ7IGkgPCBjbGVhckVsZW1lbnRzVGhyZXNob2xkOyArK2kpIHsKLSAgICAgICAgQVNTRVJUKGkg
PCBidXR0ZXJmbHkoKS0+dmVjdG9yTGVuZ3RoKCkpOwotICAgICAgICBpZiAoaW5kZXhpbmdUeXBl
KCkgPT0gQXJyYXlXaXRoRG91YmxlKQotICAgICAgICAgICAgYnV0dGVyZmx5KCktPmNvbnRpZ3Vv
dXNEb3VibGUoKVtpXSA9IFBOYU47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGN1cnJlbnRJ
bmRleGluZ0RhdGEoKVtpXS5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaGFzQW55QXJy
YXlTdG9yYWdlKGluZGV4aW5nVHlwZSgpKSkKLSAgICAgICAgYXJyYXlTdG9yYWdlKCktPm1fbnVt
VmFsdWVzSW5WZWN0b3IgPSBuZXdVc2VkVmVjdG9yTGVuZ3RoOwotfQotCi12b2lkIEpTQXJyYXk6
OnNvcnQoRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIGNvbXBhcmVGdW5jdGlvbiwgQ2FsbFR5cGUg
Y2FsbFR5cGUsIGNvbnN0IENhbGxEYXRhJiBjYWxsRGF0YSkKLXsKLSAgICBBU1NFUlQoIWluU3Bh
cnNlSW5kZXhpbmdNb2RlKCkpOwotICAgIAotICAgIHN3aXRjaCAoaW5kZXhpbmdUeXBlKCkpIHsK
LSAgICBjYXNlIEFycmF5Q2xhc3M6Ci0gICAgY2FzZSBBcnJheVdpdGhVbmRlY2lkZWQ6Ci0gICAg
ICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgY2FzZSBBcnJheVdpdGhJbnQzMjoKLSAgICAgICAg
c29ydFZlY3RvcjxBcnJheVdpdGhJbnQzMj4oZXhlYywgY29tcGFyZUZ1bmN0aW9uLCBjYWxsVHlw
ZSwgY2FsbERhdGEpOwotICAgICAgICByZXR1cm47Ci0KLSAgICBjYXNlIEFycmF5V2l0aERvdWJs
ZToKLSAgICAgICAgc29ydFZlY3RvcjxBcnJheVdpdGhEb3VibGU+KGV4ZWMsIGNvbXBhcmVGdW5j
dGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBB
cnJheVdpdGhDb250aWd1b3VzOgotICAgICAgICBzb3J0VmVjdG9yPEFycmF5V2l0aENvbnRpZ3Vv
dXM+KGV4ZWMsIGNvbXBhcmVGdW5jdGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhKTsKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY2FzZSBBcnJheVdpdGhBcnJheVN0b3JhZ2U6Ci0gICAgICAgIHNvcnRW
ZWN0b3I8QXJyYXlXaXRoQXJyYXlTdG9yYWdlPihleGVjLCBjb21wYXJlRnVuY3Rpb24sIGNhbGxU
eXBlLCBjYWxsRGF0YSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgZGVmYXVsdDoK
LSAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci19Ci0KIHZvaWQg
SlNBcnJheTo6ZmlsbEFyZ0xpc3QoRXhlY1N0YXRlKiBleGVjLCBNYXJrZWRBcmd1bWVudEJ1ZmZl
ciYgYXJncykKIHsKICAgICB1bnNpZ25lZCBpID0gMDsKQEAgLTE2MzksOTUgKzExMjMsNCBAQCB2
b2lkIEpTQXJyYXk6OmNvcHlUb0FyZ3VtZW50cyhFeGVjU3RhdGUqCiAgICAgfQogfQogCi10ZW1w
bGF0ZTxJbmRleGluZ1R5cGUgYXJyYXlJbmRleGluZ1R5cGU+Ci12b2lkIEpTQXJyYXk6OmNvbXBh
Y3RGb3JTb3J0aW5nKHVuc2lnbmVkJiBudW1EZWZpbmVkLCB1bnNpZ25lZCYgbmV3UmVsZXZhbnRM
ZW5ndGgpCi17Ci0gICAgQVNTRVJUKCFpblNwYXJzZUluZGV4aW5nTW9kZSgpKTsKLSAgICBBU1NF
UlQoYXJyYXlJbmRleGluZ1R5cGUgPT0gaW5kZXhpbmdUeXBlKCkpOwotCi0gICAgdW5zaWduZWQg
bXlSZWxldmFudExlbmd0aCA9IHJlbGV2YW50TGVuZ3RoPGFycmF5SW5kZXhpbmdUeXBlPigpOwot
ICAgIAotICAgIG51bURlZmluZWQgPSAwOwotICAgIHVuc2lnbmVkIG51bVVuZGVmaW5lZCA9IDA7
Ci0gICAgICAgIAotICAgIGZvciAoOyBudW1EZWZpbmVkIDwgbXlSZWxldmFudExlbmd0aDsgKytu
dW1EZWZpbmVkKSB7Ci0gICAgICAgIEFTU0VSVChudW1EZWZpbmVkIDwgbV9idXR0ZXJmbHktPnZl
Y3Rvckxlbmd0aCgpKTsKLSAgICAgICAgaWYgKGFycmF5SW5kZXhpbmdUeXBlID09IEFycmF5V2l0
aEludDMyKSB7Ci0gICAgICAgICAgICBKU1ZhbHVlIHYgPSBtX2J1dHRlcmZseS0+Y29udGlndW91
c0ludDMyKClbbnVtRGVmaW5lZF0uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoIXYpCi0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBBU1NFUlQodi5pc0ludDMyKCkpOwotICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFycmF5SW5kZXhpbmdUeXBl
ID09IEFycmF5V2l0aERvdWJsZSkgewotICAgICAgICAgICAgZG91YmxlIHYgPSBtX2J1dHRlcmZs
eS0+Y29udGlndW91c0RvdWJsZSgpW251bURlZmluZWRdOwotICAgICAgICAgICAgaWYgKHYgIT0g
dikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0gICAgICAgIEpTVmFsdWUgdiA9IGluZGV4aW5nRGF0YTxhcnJheUluZGV4aW5nVHlwZT4o
KVtudW1EZWZpbmVkXS5nZXQoKTsKLSAgICAgICAgaWYgKCF2IHx8IHYuaXNVbmRlZmluZWQoKSkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgICAgCi0gICAgZm9yICh1bnNpZ25lZCBp
ID0gbnVtRGVmaW5lZDsgaSA8IG15UmVsZXZhbnRMZW5ndGg7ICsraSkgewotICAgICAgICBBU1NF
UlQoaSA8IG1fYnV0dGVyZmx5LT52ZWN0b3JMZW5ndGgoKSk7Ci0gICAgICAgIGlmIChhcnJheUlu
ZGV4aW5nVHlwZSA9PSBBcnJheVdpdGhJbnQzMikgewotICAgICAgICAgICAgSlNWYWx1ZSB2ID0g
bV9idXR0ZXJmbHktPmNvbnRpZ3VvdXNJbnQzMigpW2ldLmdldCgpOwotICAgICAgICAgICAgaWYg
KCF2KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQVNTRVJUKHYuaXNJ
bnQzMigpKTsKLSAgICAgICAgICAgIEFTU0VSVChudW1EZWZpbmVkIDwgbV9idXR0ZXJmbHktPnZl
Y3Rvckxlbmd0aCgpKTsKLSAgICAgICAgICAgIG1fYnV0dGVyZmx5LT5jb250aWd1b3VzSW50MzIo
KVtudW1EZWZpbmVkKytdLnNldFdpdGhvdXRXcml0ZUJhcnJpZXIodik7Ci0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJyYXlJbmRleGluZ1R5cGUgPT0gQXJy
YXlXaXRoRG91YmxlKSB7Ci0gICAgICAgICAgICBkb3VibGUgdiA9IG1fYnV0dGVyZmx5LT5jb250
aWd1b3VzRG91YmxlKClbaV07Ci0gICAgICAgICAgICBpZiAodiAhPSB2KQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQVNTRVJUKG51bURlZmluZWQgPCBtX2J1dHRlcmZs
eS0+dmVjdG9yTGVuZ3RoKCkpOwotICAgICAgICAgICAgbV9idXR0ZXJmbHktPmNvbnRpZ3VvdXNE
b3VibGUoKVtudW1EZWZpbmVkKytdID0gdjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0gICAgICAgIEpTVmFsdWUgdiA9IGluZGV4aW5nRGF0YTxhcnJheUluZGV4aW5nVHlwZT4o
KVtpXS5nZXQoKTsKLSAgICAgICAgaWYgKHYpIHsKLSAgICAgICAgICAgIGlmICh2LmlzVW5kZWZp
bmVkKCkpCi0gICAgICAgICAgICAgICAgKytudW1VbmRlZmluZWQ7Ci0gICAgICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgICAgICBBU1NFUlQobnVtRGVmaW5lZCA8IG1fYnV0dGVyZmx5LT52ZWN0
b3JMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgaW5kZXhpbmdEYXRhPGFycmF5SW5kZXhpbmdU
eXBlPigpW251bURlZmluZWQrK10uc2V0V2l0aG91dFdyaXRlQmFycmllcih2KTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgbmV3UmVsZXZhbnRMZW5ndGgg
PSBudW1EZWZpbmVkICsgbnVtVW5kZWZpbmVkOwotICAgIAotICAgIGlmIChoYXNBbnlBcnJheVN0
b3JhZ2UoYXJyYXlJbmRleGluZ1R5cGUpKQotICAgICAgICBSRUxFQVNFX0FTU0VSVCghYXJyYXlT
dG9yYWdlKCktPm1fc3BhcnNlTWFwKTsKLSAgICAKLSAgICBzd2l0Y2ggKGFycmF5SW5kZXhpbmdU
eXBlKSB7Ci0gICAgY2FzZSBBcnJheVdpdGhJbnQzMjoKLSAgICBjYXNlIEFycmF5V2l0aERvdWJs
ZToKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQobnVtRGVmaW5lZCA9PSBuZXdSZWxldmFudExlbmd0
aCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSBudW1EZWZpbmVkOyBpIDwgbmV3UmVsZXZhbnRMZW5ndGg7ICsraSkgewot
ICAgICAgICAgICAgQVNTRVJUKGkgPCBtX2J1dHRlcmZseS0+dmVjdG9yTGVuZ3RoKCkpOwotICAg
ICAgICAgICAgaW5kZXhpbmdEYXRhPGFycmF5SW5kZXhpbmdUeXBlPigpW2ldLnNldFVuZGVmaW5l
ZCgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSBuZXdSZWxldmFudExlbmd0aDsgaSA8IG15UmVsZXZhbnRMZW5ndGg7ICsraSkgewotICAg
ICAgICBBU1NFUlQoaSA8IG1fYnV0dGVyZmx5LT52ZWN0b3JMZW5ndGgoKSk7Ci0gICAgICAgIGlm
IChhcnJheUluZGV4aW5nVHlwZSA9PSBBcnJheVdpdGhEb3VibGUpCi0gICAgICAgICAgICBtX2J1
dHRlcmZseS0+Y29udGlndW91c0RvdWJsZSgpW2ldID0gUE5hTjsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgaW5kZXhpbmdEYXRhPGFycmF5SW5kZXhpbmdUeXBlPigpW2ldLmNsZWFyKCk7Ci0g
ICAgfQotCi0gICAgaWYgKGhhc0FueUFycmF5U3RvcmFnZShhcnJheUluZGV4aW5nVHlwZSkpCi0g
ICAgICAgIGFycmF5U3RvcmFnZSgpLT5tX251bVZhbHVlc0luVmVjdG9yID0gbmV3UmVsZXZhbnRM
ZW5ndGg7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvSlNBcnJheS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0pTQXJyYXkuaAkocmV2aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSlNBcnJheS5oCSh3b3JraW5nIGNvcHkpCkBAIC03MCwxMCArNzAsNiBA
QCBwdWJsaWM6CiAgICAgLy8gT0sgdG8gdXNlIG9uIG5ldyBhcnJheXMsIGJ1dCBub3QgaWYgaXQg
bWlnaHQgYmUgYSBSZWdFeHBNYXRjaEFycmF5LgogICAgIEpTX0VYUE9SVF9QUklWQVRFIGJvb2wg
c2V0TGVuZ3RoKEV4ZWNTdGF0ZSosIHVuc2lnbmVkLCBib29sIHRocm93RXhjZXB0aW9uID0gZmFs
c2UpOwogCi0gICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBzb3J0KEV4ZWNTdGF0ZSopOwotICAg
IEpTX0VYUE9SVF9QUklWQVRFIHZvaWQgc29ydChFeGVjU3RhdGUqLCBKU1ZhbHVlIGNvbXBhcmVG
dW5jdGlvbiwgQ2FsbFR5cGUsIGNvbnN0IENhbGxEYXRhJik7Ci0gICAgSlNfRVhQT1JUX1BSSVZB
VEUgdm9pZCBzb3J0TnVtZXJpYyhFeGVjU3RhdGUqLCBKU1ZhbHVlIGNvbXBhcmVGdW5jdGlvbiwg
Q2FsbFR5cGUsIGNvbnN0IENhbGxEYXRhJik7Ci0KICAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lk
IHB1c2goRXhlY1N0YXRlKiwgSlNWYWx1ZSk7CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgSlNWYWx1
ZSBwb3AoRXhlY1N0YXRlKik7CiAKQEAgLTE2MywyMCArMTU5LDggQEAgcHJpdmF0ZToKICAgICBi
b29sIHVuc2hpZnRDb3VudFdpdGhBcnJheVN0b3JhZ2UoRXhlY1N0YXRlKiwgdW5zaWduZWQgc3Rh
cnRJbmRleCwgdW5zaWduZWQgY291bnQsIEFycmF5U3RvcmFnZSopOwogICAgIGJvb2wgdW5zaGlm
dENvdW50U2xvd0Nhc2UoVk0mLCBib29sLCB1bnNpZ25lZCk7CiAKLSAgICB0ZW1wbGF0ZTxJbmRl
eGluZ1R5cGUgaW5kZXhpbmdUeXBlPgotICAgIHZvaWQgc29ydE51bWVyaWNWZWN0b3IoRXhlY1N0
YXRlKiwgSlNWYWx1ZSBjb21wYXJlRnVuY3Rpb24sIENhbGxUeXBlLCBjb25zdCBDYWxsRGF0YSYp
OwotICAgICAgICAKLSAgICB0ZW1wbGF0ZTxJbmRleGluZ1R5cGUgaW5kZXhpbmdUeXBlLCB0eXBl
bmFtZSBTdG9yYWdlVHlwZT4KLSAgICB2b2lkIHNvcnRDb21wYWN0ZWRWZWN0b3IoRXhlY1N0YXRl
KiwgQ29udGlndW91c0RhdGE8U3RvcmFnZVR5cGU+LCB1bnNpZ25lZCByZWxldmFudExlbmd0aCk7
Ci0gICAgICAgIAotICAgIHRlbXBsYXRlPEluZGV4aW5nVHlwZSBpbmRleGluZ1R5cGU+Ci0gICAg
dm9pZCBzb3J0VmVjdG9yKEV4ZWNTdGF0ZSosIEpTVmFsdWUgY29tcGFyZUZ1bmN0aW9uLCBDYWxs
VHlwZSwgY29uc3QgQ2FsbERhdGEmKTsKLQogICAgIGJvb2wgc2V0TGVuZ3RoV2l0aEFycmF5U3Rv
cmFnZShFeGVjU3RhdGUqLCB1bnNpZ25lZCBuZXdMZW5ndGgsIGJvb2wgdGhyb3dFeGNlcHRpb24s
IEFycmF5U3RvcmFnZSopOwogICAgIHZvaWQgc2V0TGVuZ3RoV3JpdGFibGUoRXhlY1N0YXRlKiwg
Ym9vbCB3cml0YWJsZSk7Ci0gICAgICAgIAotICAgIHRlbXBsYXRlPEluZGV4aW5nVHlwZSBpbmRl
eGluZ1R5cGU+Ci0gICAgdm9pZCBjb21wYWN0Rm9yU29ydGluZyh1bnNpZ25lZCYgbnVtRGVmaW5l
ZCwgdW5zaWduZWQmIG5ld1JlbGV2YW50TGVuZ3RoKTsKIH07CiAKIGlubGluZSBCdXR0ZXJmbHkq
IGNyZWF0ZUNvbnRpZ3VvdXNBcnJheUJ1dHRlcmZseShWTSYgdm0sIEpTQ2VsbCogaW50ZW5kZWRP
d25lciwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCYgdmVjdG9yTGVuZ3RoKQpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxPYmplY3QuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsT2JqZWN0LmNwcAkocmV2
aXNpb24gMTgzMTk4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxP
YmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MzgsOCArNDM4LDExIEBAIHB1dERpcmVjdFdp
dGhvdXRUcmFuc2l0aW9uKHZtLCB2bS5wcm9wZXIKICAgICAgICAgR2xvYmFsUHJvcGVydHlJbmZv
KHZtLnByb3BlcnR5TmFtZXMtPkJ1aWx0aW5Mb2dQcml2YXRlTmFtZSwgYnVpbHRpbkxvZywgRG9u
dEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkpLAogICAgICAgICBHbG9iYWxQcm9wZXJ0eUlu
Zm8odm0ucHJvcGVydHlOYW1lcy0+QXJyYXlQcml2YXRlTmFtZSwgYXJyYXlDb25zdHJ1Y3Rvciwg
RG9udEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkpLAogICAgICAgICBHbG9iYWxQcm9wZXJ0
eUluZm8odm0ucHJvcGVydHlOYW1lcy0+TnVtYmVyUHJpdmF0ZU5hbWUsIG51bWJlckNvbnN0cnVj
dG9yLCBEb250RW51bSB8IERvbnREZWxldGUgfCBSZWFkT25seSksCisgICAgICAgIEdsb2JhbFBy
b3BlcnR5SW5mbyh2bS5wcm9wZXJ0eU5hbWVzLT5TdHJpbmdQcml2YXRlTmFtZSwgc3RyaW5nQ29u
c3RydWN0b3IsIERvbnRFbnVtIHwgRG9udERlbGV0ZSB8IFJlYWRPbmx5KSwKICAgICAgICAgR2xv
YmFsUHJvcGVydHlJbmZvKHZtLnByb3BlcnR5TmFtZXMtPmFic1ByaXZhdGVOYW1lLCBwcml2YXRl
RnVuY0FicywgRG9udEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkpLAogICAgICAgICBHbG9i
YWxQcm9wZXJ0eUluZm8odm0ucHJvcGVydHlOYW1lcy0+Zmxvb3JQcml2YXRlTmFtZSwgcHJpdmF0
ZUZ1bmNGbG9vciwgRG9udEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkpLAorICAgICAgICBH
bG9iYWxQcm9wZXJ0eUluZm8odm0ucHJvcGVydHlOYW1lcy0+Z2V0UHJvdG90eXBlT2ZQcml2YXRl
TmFtZSwgcHJpdmF0ZUZ1bmNGbG9vciwgRG9udEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkp
LAorICAgICAgICBHbG9iYWxQcm9wZXJ0eUluZm8odm0ucHJvcGVydHlOYW1lcy0+Z2V0T3duUHJv
cGVydHlOYW1lc1ByaXZhdGVOYW1lLCBwcml2YXRlRnVuY0Zsb29yLCBEb250RW51bSB8IERvbnRE
ZWxldGUgfCBSZWFkT25seSksCiAgICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyh2bS5wcm9wZXJ0
eU5hbWVzLT5pc0Zpbml0ZVByaXZhdGVOYW1lLCBwcml2YXRlRnVuY0lzRmluaXRlLCBEb250RW51
bSB8IERvbnREZWxldGUgfCBSZWFkT25seSksCiAgICAgICAgIEdsb2JhbFByb3BlcnR5SW5mbyh2
bS5wcm9wZXJ0eU5hbWVzLT5hcnJheUl0ZXJhdGlvbktpbmRLZXlQcml2YXRlTmFtZSwganNOdW1i
ZXIoQXJyYXlJdGVyYXRlS2V5KSwgRG9udEVudW0gfCBEb250RGVsZXRlIHwgUmVhZE9ubHkpLAog
ICAgICAgICBHbG9iYWxQcm9wZXJ0eUluZm8odm0ucHJvcGVydHlOYW1lcy0+YXJyYXlJdGVyYXRp
b25LaW5kVmFsdWVQcml2YXRlTmFtZSwganNOdW1iZXIoQXJyYXlJdGVyYXRlVmFsdWUpLCBEb250
RW51bSB8IERvbnREZWxldGUgfCBSZWFkT25seSksCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9PYmplY3RDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvT2JqZWN0Q29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiAxODMx
OTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PYmplY3RDb25zdHJ1Y3Rvci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTk4LDYgKzk4LDkgQEAgdm9pZCBPYmplY3RDb25zdHJ1Y3Rv
cjo6ZmluaXNoQ3JlYXRpb24oVgogCiAgICAgaWYgKCFnbG9iYWxPYmplY3QtPnJ1bnRpbWVGbGFn
cygpLmlzU3ltYm9sRGlzYWJsZWQoKSkKICAgICAgICAgSlNDX05BVElWRV9GVU5DVElPTigiZ2V0
T3duUHJvcGVydHlTeW1ib2xzIiwgb2JqZWN0Q29uc3RydWN0b3JHZXRPd25Qcm9wZXJ0eVN5bWJv
bHMsIERvbnRFbnVtLCAxKTsKKworICAgIEpTQ19OQVRJVkVfRlVOQ1RJT04odm0ucHJvcGVydHlO
YW1lcy0+Z2V0UHJvdG90eXBlT2ZQcml2YXRlTmFtZSwgb2JqZWN0Q29uc3RydWN0b3JHZXRQcm90
b3R5cGVPZiwgRG9udEVudW0sIDEpOworICAgIEpTQ19OQVRJVkVfRlVOQ1RJT04odm0ucHJvcGVy
dHlOYW1lcy0+Z2V0T3duUHJvcGVydHlOYW1lc1ByaXZhdGVOYW1lLCBvYmplY3RDb25zdHJ1Y3Rv
ckdldE93blByb3BlcnR5TmFtZXMsIERvbnRFbnVtLCAxKTsKIH0KIAogYm9vbCBPYmplY3RDb25z
dHJ1Y3Rvcjo6Z2V0T3duUHJvcGVydHlTbG90KEpTT2JqZWN0KiBvYmplY3QsIEV4ZWNTdGF0ZSog
ZXhlYywgUHJvcGVydHlOYW1lIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90ICZzbG90KQpJbmRl
eDogU291cmNlL1dURi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi9DaGFuZ2VM
b2cJKHJldmlzaW9uIDE4MzI3NikKKysrIFNvdXJjZS9XVEYvQ2hhbmdlTG9nCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTUtMDQtMjEgIEdlb2ZmcmV5IEdhcmVuICA8Z2dhcmVu
QGFwcGxlLmNvbT4KKworICAgICAgICBJdCBzaG91bGRuJ3QgdGFrZSAxODQ2IGxpbmVzIG9mIGNv
ZGUgYW5kIDUgRklYTUVzIHRvIHNvcnQgYW4gYXJyYXkuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDQwMTMKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZW1vdmUgdGhpcyBjdXN0b20gdHJlZSBpbXBsZW1l
bnRhdGlvbiBiZWNhdXNlIGl0IGlzIHVudXNlZC4gKEl0IHdhcworICAgICAgICBwcmV2aW91c2x5
IHVzZWQgdG8gYWNoaWV2ZSBhIHN0YWJsZSBhcnJheSBzb3J0IGluIGNlcnRhaW4gY2FzZXMuKQor
CisgICAgICAgICogV1RGLnZjeHByb2ovV1RGLnZjeHByb2o6CisgICAgICAgICogV1RGLnZjeHBy
b2ovV1RGLnZjeHByb2ouZmlsdGVyczoKKyAgICAgICAgKiBXVEYueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvajoKKyAgICAgICAgKiB3dGYvQVZMVHJlZS5oOiBSZW1vdmVkLgorICAgICAgICAqIHd0
Zi9DTWFrZUxpc3RzLnR4dDoKKwogMjAxNS0wNC0yNCAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBs
ZS5jb20+CiAKICAgICAgICAgQ29udmVydCBPd25QdHIgYW5kIFBhc3NPd25QdHIgdXNlcyB0byBz
dGQ6OnVuaXF1ZV9wdHIKSW5kZXg6IFNvdXJjZS9XVEYvV1RGLnZjeHByb2ovV1RGLnZjeHByb2oK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dURi9XVEYudmN4cHJvai9XVEYudmN4cHJvagkocmV2aXNp
b24gMTgzMTk4KQorKysgU291cmNlL1dURi9XVEYudmN4cHJvai9XVEYudmN4cHJvagkod29ya2lu
ZyBjb3B5KQpAQCAtMTYzLDcgKzE2Myw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlx3
dGZcQXNzZXJ0aW9ucy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cd3RmXEF0b21p
Y3MuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHd0ZlxBdXRvZHJhaW5lZFBvb2wu
aCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHd0ZlxBVkxUcmVlLmgiIC8+CiAgICAg
PENsSW5jbHVkZSBJbmNsdWRlPSIuLlx3dGZcQmFnLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlx3dGZcQmFnVG9IYXNoTWFwLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIu
Llx3dGZcQml0bWFwLmgiIC8+CkluZGV4OiBTb3VyY2UvV1RGL1dURi52Y3hwcm9qL1dURi52Y3hw
cm9qLmZpbHRlcnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi9XVEYudmN4cHJvai9XVEYudmN4
cHJvai5maWx0ZXJzCShyZXZpc2lvbiAxODMxOTgpCisrKyBTb3VyY2UvV1RGL1dURi52Y3hwcm9q
L1dURi52Y3hwcm9qLmZpbHRlcnMJKHdvcmtpbmcgY29weSkKQEAgLTM4MSw5ICszODEsNiBAQAog
ICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cd3RmXEF0b21pY3MuaCI+CiAgICAgICA8RmlsdGVy
Pnd0ZjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0i
Li5cd3RmXEFWTFRyZWUuaCI+Ci0gICAgICA8RmlsdGVyPnd0ZjwvRmlsdGVyPgotICAgIDwvQ2xJ
bmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cd3RmXEJpdG1hcC5oIj4KICAgICAg
IDxGaWx0ZXI+d3RmPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkluZGV4OiBTb3VyY2UvV1RG
L1dURi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYv
V1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNvdXJj
ZS9XVEYvV1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTEw
Nyw3ICsxMDcsNiBAQAogCQlBOEE0NzM4NjE1MUE4MjVCMDA0MTIzRkYgLyogQXNzZXJ0aW9ucy5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEE0NzI1
QjE1MUE4MjVBMDA0MTIzRkYgLyogQXNzZXJ0aW9ucy5jcHAgKi87IH07CiAJCUE4QTQ3Mzg3MTUx
QTgyNUIwMDQxMjNGRiAvKiBBc3NlcnRpb25zLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBOEE0NzI1QzE1MUE4MjVBMDA0MTIzRkYgLyogQXNzZXJ0aW9u
cy5oICovOyB9OwogCQlBOEE0NzM4ODE1MUE4MjVCMDA0MTIzRkYgLyogQXRvbWljcy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThBNDcyNUQxNTFBODI1
QTAwNDEyM0ZGIC8qIEF0b21pY3MuaCAqLzsgfTsKLQkJQThBNDczODkxNTFBODI1QjAwNDEyM0ZG
IC8qIEFWTFRyZWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEE4QTQ3MjVFMTUxQTgyNUEwMDQxMjNGRiAvKiBBVkxUcmVlLmggKi87IH07CiAJCUE4QTQ3
MzhBMTUxQTgyNUIwMDQxMjNGRiAvKiBCaXRtYXAuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4QTQ3MjVGMTUxQTgyNUEwMDQxMjNGRiAvKiBCaXRtYXAu
aCAqLzsgfTsKIAkJQThBNDczOEIxNTFBODI1QjAwNDEyM0ZGIC8qIEJpdFZlY3Rvci5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEE0NzI2MDE1MUE4
MjVBMDA0MTIzRkYgLyogQml0VmVjdG9yLmNwcCAqLzsgfTsKIAkJQThBNDczOEMxNTFBODI1QjAw
NDEyM0ZGIC8qIEJpdFZlY3Rvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQThBNDcyNjExNTFBODI1QTAwNDEyM0ZGIC8qIEJpdFZlY3Rvci5oICovOyB9
OwpAQCAtMzk1LDcgKzM5NCw2IEBACiAJCUE4QTQ3MjVCMTUxQTgyNUEwMDQxMjNGRiAvKiBBc3Nl
cnRpb25zLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEFzc2VydGlv
bnMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBOEE0NzI1QzE1MUE4MjVBMDA0
MTIzRkYgLyogQXNzZXJ0aW9ucy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBB
c3NlcnRpb25zLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE4QTQ3MjVEMTUxQTgy
NUEwMDQxMjNGRiAvKiBBdG9taWNzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEF0b21pY3MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQThBNDcyNUUxNTFBODI1
QTAwNDEyM0ZGIC8qIEFWTFRyZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
QVZMVHJlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBOEE0NzI1RjE1MUE4MjVB
MDA0MTIzRkYgLyogQml0bWFwLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJp
dG1hcC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBOEE0NzI2MDE1MUE4MjVBMDA0
MTIzRkYgLyogQml0VmVjdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IEJpdFZlY3Rvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE4QTQ3MjYx
MTUxQTgyNUEwMDQxMjNGRiAvKiBCaXRWZWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gQml0VmVjdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC03MDIs
NyArNzAwLDYgQEAKIAkJCQlBOEE0NzI1RDE1MUE4MjVBMDA0MTIzRkYgLyogQXRvbWljcy5oICov
LAogCQkJCTE0Njk0MTlBMTZFQUIxMEEwMDI0RTE0NiAvKiBBdXRvZHJhaW5lZFBvb2wuaCAqLywK
IAkJCQkxNDY5NDE5QjE2RUFCMTBBMDAyNEUxNDYgLyogQXV0b2RyYWluZWRQb29sTWFjLm1tICov
LAotCQkJCUE4QTQ3MjVFMTUxQTgyNUEwMDQxMjNGRiAvKiBBVkxUcmVlLmggKi8sCiAJCQkJMEZC
MTRFMTgxODBGQTIxODAwOUI2QjREIC8qIEJhZy5oICovLAogCQkJCTBGQjE0RTFBMTgxMEUxREEw
MDlCNkI0RCAvKiBCYWdUb0hhc2hNYXAuaCAqLywKIAkJCQlBOEE0NzI1RjE1MUE4MjVBMDA0MTIz
RkYgLyogQml0bWFwLmggKi8sCkBAIC0xMDQ4LDcgKzEwNDUsNiBAQAogCQkJCUE4QTQ3NDM4MTUx
QTgyNUIwMDQxMjNGRiAvKiBBdG9taWNTdHJpbmdJbXBsLmggaW4gSGVhZGVycyAqLywKIAkJCQk5
QkQ4RjQwQjE3NkMyQjQ3MDAwMkQ4NjUgLyogQXRvbWljU3RyaW5nVGFibGUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTE0Njk0MTlDMTZFQUIxMEEwMDI0RTE0NiAvKiBBdXRvZHJhaW5lZFBvb2wuaCBp
biBIZWFkZXJzICovLAotCQkJCUE4QTQ3Mzg5MTUxQTgyNUIwMDQxMjNGRiAvKiBBVkxUcmVlLmgg
aW4gSGVhZGVycyAqLywKIAkJCQk4MTM0MDEzOTE1QjA5MkZEMDAxRkYwQjggLyogQmFzZTY0Lmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBOEE0NzNBOTE1MUE4MjVCMDA0MTIzRkYgLyogYmlnbnVtLWR0
b2EuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4QTQ3M0FCMTUxQTgyNUIwMDQxMjNGRiAvKiBiaWdu
dW0uaCBpbiBIZWFkZXJzICovLApJbmRleDogU291cmNlL1dURi93dGYvQVZMVHJlZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL0FWTFRyZWUuaAkocmV2aXNpb24gMTgzMTk4KQorKysg
U291cmNlL1dURi93dGYvQVZMVHJlZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDk2MCArMCwwIEBA
Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqCi0gKiBCYXNlZCBvbiBBYnN0cmFjdCBBVkwgVHJlZSBUZW1wbGF0ZSB2MS41IGJ5IFdh
bHQgS2FyYXMKLSAqIDxodHRwOi8vZ2VvY2l0aWVzLmNvbS93a2FyYXMvZ2VuX2NwcC9hdmxfdHJl
ZS5odG1sPi4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
Ci0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCi0gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKLSAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0g
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0g
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
Zm5kZWYgQVZMX1RSRUVfSF8KLSNkZWZpbmUgQVZMX1RSRUVfSF8KLQotI2luY2x1ZGUgPGFycmF5
PgotI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+Ci0KLW5hbWVzcGFjZSBXVEYgewotCi0vLyBI
ZXJlIGlzIHRoZSByZWZlcmVuY2UgY2xhc3MgZm9yIEJTZXQuCi0vLwotLy8gY2xhc3MgQlNldAot
Ly8gICB7Ci0vLyAgIHB1YmxpYzoKLS8vCi0vLyAgICAgY2xhc3MgQU5ZX2JpdHJlZgotLy8gICAg
ICAgewotLy8gICAgICAgcHVibGljOgotLy8gICAgICAgICBvcGVyYXRvciBib29sICgpOwotLy8g
ICAgICAgICB2b2lkIG9wZXJhdG9yID0gKGJvb2wgYik7Ci0vLyAgICAgICB9OwotLy8KLS8vICAg
ICAvLyBEb2VzIG5vdCBoYXZlIHRvIGluaXRpYWxpemUgYml0cy4KLS8vICAgICBCU2V0KCk7Ci0v
LwotLy8gICAgIC8vIE11c3QgcmV0dXJuIGEgdmFsaWQgdmFsdWUgZm9yIGluZGV4IHdoZW4gMCA8
PSBpbmRleCA8IG1heERlcHRoCi0vLyAgICAgQU5ZX2JpdHJlZiBvcGVyYXRvciBbXSAodW5zaWdu
ZWQgaW5kZXgpOwotLy8KLS8vICAgICAvLyBTZXQgYWxsIGJpdHMgdG8gMS4KLS8vICAgICB2b2lk
IHNldCgpOwotLy8KLS8vICAgICAvLyBTZXQgYWxsIGJpdHMgdG8gMC4KLS8vICAgICB2b2lkIHJl
c2V0KCk7Ci0vLyAgIH07Ci0KLXRlbXBsYXRlPHVuc2lnbmVkIG1heERlcHRoPgotY2xhc3MgQVZM
VHJlZURlZmF1bHRCU2V0IHsKLXB1YmxpYzoKLSAgICBib29sJiBvcGVyYXRvcltdKHVuc2lnbmVk
IGkpIHsgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oaSA8IG1heERlcHRoKTsgcmV0
dXJuIG1fZGF0YVtpXTsgfQotICAgIHZvaWQgc2V0KCkgeyBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbWF4RGVwdGg7ICsraSkgbV9kYXRhW2ldID0gdHJ1ZTsgfQotICAgIHZvaWQgcmVzZXQoKSB7
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXhEZXB0aDsgKytpKSBtX2RhdGFbaV0gPSBmYWxz
ZTsgfQotCi1wcml2YXRlOgotICAgIHN0ZDo6YXJyYXk8Ym9vbCwgbWF4RGVwdGg+IG1fZGF0YTsK
LX07Ci0KLS8vIEhvdyB0byBkZXRlcm1pbmUgbWF4RGVwdGg6Ci0vLyBkICBNaW5pbXVtIG51bWJl
ciBvZiBub2RlcwotLy8gMiAgMgotLy8gMyAgNAotLy8gNCAgNwotLy8gNSAgMTIKLS8vIDYgIDIw
Ci0vLyA3ICAzMwotLy8gOCAgNTQKLS8vIDkgIDg4Ci0vLyAxMCAxNDMKLS8vIDExIDIzMgotLy8g
MTIgMzc2Ci0vLyAxMyA2MDkKLS8vIDE0IDk4NgotLy8gMTUgMSw1OTYKLS8vIDE2IDIsNTgzCi0v
LyAxNyA0LDE4MAotLy8gMTggNiw3NjQKLS8vIDE5IDEwLDk0NQotLy8gMjAgMTcsNzEwCi0vLyAy
MSAyOCw2NTYKLS8vIDIyIDQ2LDM2NwotLy8gMjMgNzUsMDI0Ci0vLyAyNCAxMjEsMzkyCi0vLyAy
NSAxOTYsNDE3Ci0vLyAyNiAzMTcsODEwCi0vLyAyNyA1MTQsMjI4Ci0vLyAyOCA4MzIsMDM5Ci0v
LyAyOSAxLDM0NiwyNjgKLS8vIDMwIDIsMTc4LDMwOAotLy8gMzEgMyw1MjQsNTc3Ci0vLyAzMiA1
LDcwMiw4ODYKLS8vIDMzIDksMjI3LDQ2NAotLy8gMzQgMTQsOTMwLDM1MQotLy8gMzUgMjQsMTU3
LDgxNgotLy8gMzYgMzksMDg4LDE2OAotLy8gMzcgNjMsMjQ1LDk4NQotLy8gMzggMTAyLDMzNCwx
NTQKLS8vIDM5IDE2NSw1ODAsMTQwCi0vLyA0MCAyNjcsOTE0LDI5NQotLy8gNDEgNDMzLDQ5NCw0
MzYKLS8vIDQyIDcwMSw0MDgsNzMyCi0vLyA0MyAxLDEzNCw5MDMsMTY5Ci0vLyA0NCAxLDgzNiwz
MTEsOTAyCi0vLyA0NSAyLDk3MSwyMTUsMDcyCi0vLwotLy8gRS5nLiwgaWYsIGluIGEgcGFydGlj
dWxhciBpbnN0YW50aWF0aW9uLCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm9kZXMgaW4gYSB0cmVl
IGluc3RhbmNlIGlzIDEsMDAwLDAwMCwgdGhlIG1heGltdW0gZGVwdGggc2hvdWxkIGJlIDI4Lgot
Ly8gWW91IHBpY2sgMjggYmVjYXVzZSBNTigyOCkgaXMgODMyLDAzOSwgd2hpY2ggaXMgbGVzcyB0
aGFuIG9yIGVxdWFsIHRvIDEsMDAwLDAwMCwgYW5kIE1OKDI5KSBpcyAxLDM0NiwyNjgsIHdoaWNo
IGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAxLDAwMCwwMDAuCi0KLXRlbXBsYXRlIDxjbGFzcyBB
YnN0cmFjdG9yLCB1bnNpZ25lZCBtYXhEZXB0aCA9IDMyLCBjbGFzcyBCU2V0ID0gQVZMVHJlZURl
ZmF1bHRCU2V0PG1heERlcHRoPj4KLWNsYXNzIEFWTFRyZWUgewotcHVibGljOgotCi0gICAgdHlw
ZWRlZiB0eXBlbmFtZSBBYnN0cmFjdG9yOjprZXkga2V5OwotICAgIHR5cGVkZWYgdHlwZW5hbWUg
QWJzdHJhY3Rvcjo6aGFuZGxlIGhhbmRsZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEFic3RyYWN0
b3I6OnNpemUgc2l6ZTsKLQotICAgIGVudW0gU2VhcmNoVHlwZSB7Ci0gICAgICAgIEVRVUFMID0g
MSwKLSAgICAgICAgTEVTUyA9IDIsCi0gICAgICAgIEdSRUFURVIgPSA0LAotICAgICAgICBMRVNT
X0VRVUFMID0gRVFVQUwgfCBMRVNTLAotICAgICAgICBHUkVBVEVSX0VRVUFMID0gRVFVQUwgfCBH
UkVBVEVSCi0gICAgfTsKLQotCi0gICAgQWJzdHJhY3RvciYgYWJzdHJhY3RvcigpIHsgcmV0dXJu
IGFiczsgfQotCi0gICAgaW5saW5lIGhhbmRsZSBpbnNlcnQoaGFuZGxlIGgpOwotCi0gICAgaW5s
aW5lIGhhbmRsZSBzZWFyY2goa2V5IGssIFNlYXJjaFR5cGUgc3QgPSBFUVVBTCk7Ci0gICAgaW5s
aW5lIGhhbmRsZSBzZWFyY2hfbGVhc3QoKTsKLSAgICBpbmxpbmUgaGFuZGxlIHNlYXJjaF9ncmVh
dGVzdCgpOwotCi0gICAgaW5saW5lIGhhbmRsZSByZW1vdmUoa2V5IGspOwotCi0gICAgaW5saW5l
IGhhbmRsZSBzdWJzdChoYW5kbGUgbmV3X25vZGUpOwotCi0gICAgdm9pZCBwdXJnZSgpIHsgYWJz
LnJvb3QgPSBudWxsKCk7IH0KLQotICAgIGJvb2wgaXNfZW1wdHkoKSB7IHJldHVybiBhYnMucm9v
dCA9PSBudWxsKCk7IH0KLQotICAgIEFWTFRyZWUoKSB7IGFicy5yb290ID0gbnVsbCgpOyB9Ci0K
LSAgICBjbGFzcyBJdGVyYXRvciB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIC8vIEluaXRpYWxp
emUgZGVwdGggdG8gaW52YWxpZCB2YWx1ZSwgdG8gaW5kaWNhdGUgaXRlcmF0b3IgaXMKLSAgICAg
ICAgLy8gaW52YWxpZC4gICAoRGVwdGggaXMgemVyby1iYXNlLikKLSAgICAgICAgSXRlcmF0b3Io
KSB7IGRlcHRoID0gfjBVOyB9Ci0KLSAgICAgICAgdm9pZCBzdGFydF9pdGVyKEFWTFRyZWUgJnRy
ZWUsIGtleSBrLCBTZWFyY2hUeXBlIHN0ID0gRVFVQUwpCi0gICAgICAgIHsKLSAgICAgICAgICAg
IC8vIE1hc2sgb2YgaGlnaCBiaXQgaW4gYW4gaW50LgotICAgICAgICAgICAgY29uc3QgaW50IE1B
U0tfSElHSF9CSVQgPSAoaW50KSB+ICgofiAodW5zaWduZWQpIDApID4+IDEpOwotCi0gICAgICAg
ICAgICAvLyBTYXZlIHRoZSB0cmVlIHRoYXQgd2UncmUgZ29pbmcgdG8gaXRlcmF0ZSB0aHJvdWdo
IGluIGEKLSAgICAgICAgICAgIC8vIG1lbWJlciB2YXJpYWJsZS4KLSAgICAgICAgICAgIHRyZWVf
ID0gJnRyZWU7Ci0KLSAgICAgICAgICAgIGludCBjbXAsIHRhcmdldF9jbXA7Ci0gICAgICAgICAg
ICBoYW5kbGUgaCA9IHRyZWVfLT5hYnMucm9vdDsKLSAgICAgICAgICAgIHVuc2lnbmVkIGQgPSAw
OwotCi0gICAgICAgICAgICBkZXB0aCA9IH4wVTsKLQotICAgICAgICAgICAgaWYgKGggPT0gbnVs
bCgpKQotICAgICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5LgotICAgICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgICAgIGlmIChzdCAmIExFU1MpCi0gICAgICAgICAgICAgIC8vIEtleSBj
YW4gYmUgZ3JlYXRlciB0aGFuIGtleSBvZiBzdGFydGluZyBub2RlLgotICAgICAgICAgICAgICB0
YXJnZXRfY21wID0gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0ICYgR1JFQVRFUikKLSAgICAg
ICAgICAgICAgLy8gS2V5IGNhbiBiZSBsZXNzIHRoYW4ga2V5IG9mIHN0YXJ0aW5nIG5vZGUuCi0g
ICAgICAgICAgICAgIHRhcmdldF9jbXAgPSAtMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgLy8gS2V5IG11c3QgYmUgc2FtZSBhcyBrZXkgb2Ygc3RhcnRpbmcgbm9kZS4KLSAgICAg
ICAgICAgICAgdGFyZ2V0X2NtcCA9IDA7Ci0KLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAg
ICAgICAgICAgICBjbXAgPSBjbXBfa19uKGssIGgpOwotICAgICAgICAgICAgICAgIGlmIChjbXAg
PT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3QgJiBFUVVBTCkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gRXF1YWwgbm9kZSB3YXMgc291Z2h0IGFuZCBmb3VuZCBhcyBzdGFy
dGluZyBub2RlLgotICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBkOwotICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgY21wID0gLXRhcmdldF9jbXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0
YXJnZXRfY21wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKGNtcCBeIHRhcmdl
dF9jbXApICYgTUFTS19ISUdIX0JJVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNt
cCBhbmQgdGFyZ2V0X2NtcCBhcmUgYm90aCBuZWdhdGl2ZSBvciBib3RoIHBvc2l0aXZlLgotICAg
ICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBkOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGggPSBjbXAgPCAwID8gZ2V0X2x0KGgp
IDogZ2V0X2d0KGgpOwotICAgICAgICAgICAgICAgIGlmIChoID09IG51bGwoKSkKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgYnJhbmNoW2RdID0gY21wID4gMDsK
LSAgICAgICAgICAgICAgICBwYXRoX2hbZCsrXSA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLQotICAgICAgICB2b2lkIHN0YXJ0X2l0ZXJfbGVhc3QoQVZMVHJlZSAmdHJlZSkKLSAgICAg
ICAgewotICAgICAgICAgICAgdHJlZV8gPSAmdHJlZTsKLQotICAgICAgICAgICAgaGFuZGxlIGgg
PSB0cmVlXy0+YWJzLnJvb3Q7Ci0KLSAgICAgICAgICAgIGRlcHRoID0gfjBVOwotCi0gICAgICAg
ICAgICBicmFuY2gucmVzZXQoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGggIT0gbnVsbCgpKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKGRlcHRoICE9IH4wVSkKLSAgICAgICAgICAgICAgICAgICAg
cGF0aF9oW2RlcHRoXSA9IGg7Ci0gICAgICAgICAgICAgICAgZGVwdGgrKzsKLSAgICAgICAgICAg
ICAgICBoID0gZ2V0X2x0KGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
dm9pZCBzdGFydF9pdGVyX2dyZWF0ZXN0KEFWTFRyZWUgJnRyZWUpCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIHRyZWVfID0gJnRyZWU7Ci0KLSAgICAgICAgICAgIGhhbmRsZSBoID0gdHJlZV8tPmFi
cy5yb290OwotCi0gICAgICAgICAgICBkZXB0aCA9IH4wVTsKLQotICAgICAgICAgICAgYnJhbmNo
LnNldCgpOwotCi0gICAgICAgICAgICB3aGlsZSAoaCAhPSBudWxsKCkpIHsKLSAgICAgICAgICAg
ICAgICBpZiAoZGVwdGggIT0gfjBVKQotICAgICAgICAgICAgICAgICAgICBwYXRoX2hbZGVwdGhd
ID0gaDsKLSAgICAgICAgICAgICAgICBkZXB0aCsrOwotICAgICAgICAgICAgICAgIGggPSBnZXRf
Z3QoaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGUgb3BlcmF0
b3IqKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlcHRoID09IH4wVSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gbnVsbCgpOwotCi0gICAgICAgICAgICByZXR1cm4gZGVwdGggPT0gMCA/
IHRyZWVfLT5hYnMucm9vdCA6IHBhdGhfaFtkZXB0aCAtIDFdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgdm9pZCBvcGVyYXRvcisrKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlcHRoICE9
IH4wVSkgewotICAgICAgICAgICAgICAgIGhhbmRsZSBoID0gZ2V0X2d0KCoqdGhpcyk7Ci0gICAg
ICAgICAgICAgICAgaWYgKGggPT0gbnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZGVwdGggPSB+MFU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBkZXB0aC0tOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChicmFuY2hbZGVwdGhdKTsK
LSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmFuY2hbZGVw
dGhdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcGF0aF9oW2RlcHRoKytdID0gaDsKLSAg
ICAgICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICAgICAgaCA9
IGdldF9sdChoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoID09IG51bGwoKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyYW5jaFtkZXB0aF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaFtk
ZXB0aCsrXSA9IGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG9wZXJhdG9yLS0oKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVwdGggIT0gfjBVKSB7Ci0gICAgICAgICAgICAgICAg
aGFuZGxlIGggPSBnZXRfbHQoKip0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA9PSBudWxs
KCkpCi0gICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChkZXB0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSB+MFU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aC0tOwotICAgICAgICAgICAgICAg
ICAgICB9IHdoaWxlICghYnJhbmNoW2RlcHRoXSk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGJyYW5jaFtkZXB0aF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICAgICAgcGF0aF9oW2RlcHRoKytdID0gaDsKLSAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykg
ewotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGdldF9ndChoKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChoID09IG51bGwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaFtkZXB0aF0gPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgcGF0aF9oW2RlcHRoKytdID0gaDsKLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHZvaWQgb3BlcmF0b3IrKyhpbnQpIHsgKysoKnRoaXMpOyB9Ci0gICAgICAgIHZvaWQg
b3BlcmF0b3ItLShpbnQpIHsgLS0oKnRoaXMpOyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0KLSAgICAg
ICAgLy8gVHJlZSBiZWluZyBpdGVyYXRlZCBvdmVyLgotICAgICAgICBBVkxUcmVlICp0cmVlXzsK
LQotICAgICAgICAvLyBSZWNvcmRzIGEgcGF0aCBpbnRvIHRoZSB0cmVlLiAgSWYgYnJhbmNoW25d
IGlzIHRydWUsIGluZGljYXRlcwotICAgICAgICAvLyB0YWtlIGdyZWF0ZXIgYnJhbmNoIGZyb20g
dGhlIG50aCBub2RlIGluIHRoZSBwYXRoLCBvdGhlcndpc2UKLSAgICAgICAgLy8gdGFrZSB0aGUg
bGVzcyBicmFuY2guICBicmFuY2hbMF0gZ2l2ZXMgYnJhbmNoIGZyb20gcm9vdCwgYW5kCi0gICAg
ICAgIC8vIHNvIG9uLgotICAgICAgICBCU2V0IGJyYW5jaDsKLQotICAgICAgICAvLyBaZXJvLWJh
c2VkIGRlcHRoIG9mIHBhdGggaW50byB0cmVlLgotICAgICAgICB1bnNpZ25lZCBkZXB0aDsKLQot
ICAgICAgICAvLyBIYW5kbGVzIG9mIG5vZGVzIGluIHBhdGggZnJvbSByb290IHRvIGN1cnJlbnQg
bm9kZSAocmV0dXJuZWQgYnkgKikuCi0gICAgICAgIGhhbmRsZSBwYXRoX2hbbWF4RGVwdGggLSAx
XTsKLQotICAgICAgICBpbnQgY21wX2tfbihrZXkgaywgaGFuZGxlIGgpIHsgcmV0dXJuIHRyZWVf
LT5hYnMuY29tcGFyZV9rZXlfbm9kZShrLCBoKTsgfQotICAgICAgICBpbnQgY21wX25fbihoYW5k
bGUgaDEsIGhhbmRsZSBoMikgeyByZXR1cm4gdHJlZV8tPmFicy5jb21wYXJlX25vZGVfbm9kZSho
MSwgaDIpOyB9Ci0gICAgICAgIGhhbmRsZSBnZXRfbHQoaGFuZGxlIGgpIHsgcmV0dXJuIHRyZWVf
LT5hYnMuZ2V0X2xlc3MoaCk7IH0KLSAgICAgICAgaGFuZGxlIGdldF9ndChoYW5kbGUgaCkgeyBy
ZXR1cm4gdHJlZV8tPmFicy5nZXRfZ3JlYXRlcihoKTsgfQotICAgICAgICBoYW5kbGUgbnVsbCgp
IHsgcmV0dXJuIHRyZWVfLT5hYnMubnVsbCgpOyB9Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5
cGVuYW1lIGZ3ZF9pdGVyPgotICAgIGJvb2wgYnVpbGQoZndkX2l0ZXIgcCwgc2l6ZSBudW1fbm9k
ZXMpCi0gICAgewotICAgICAgICBpZiAobnVtX25vZGVzID09IDApIHsKLSAgICAgICAgICAgIGFi
cy5yb290ID0gbnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBHaXZlcyBwYXRoIHRvIHN1YnRyZWUgYmVpbmcgYnVpbHQuICBJZiBicmFuY2hb
Tl0gaXMgZmFsc2UsIGJyYW5jaAotICAgICAgICAvLyBsZXNzIGZyb20gdGhlIG5vZGUgYXQgZGVw
dGggTiwgaWYgdHJ1ZSBicmFuY2ggZ3JlYXRlci4KLSAgICAgICAgQlNldCBicmFuY2g7Ci0KLSAg
ICAgICAgLy8gSWYgcmVtW05dIGlzIHRydWUsIHRoZW4gZm9yIHRoZSBjdXJyZW50IHN1YnRyZWUg
YXQgZGVwdGggTiwgaXQncwotICAgICAgICAvLyBncmVhdGVyIHN1YnRyZWUgaGFzIG9uZSBtb3Jl
IG5vZGUgdGhhbiBpdCdzIGxlc3Mgc3VidHJlZS4KLSAgICAgICAgQlNldCByZW07Ci0KLSAgICAg
ICAgICAgIC8vIERlcHRoIG9mIHJvb3Qgbm9kZSBvZiBjdXJyZW50IHN1YnRyZWUuCi0gICAgICAg
IHVuc2lnbmVkIGRlcHRoID0gMDsKLQotICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG5vZGVzIGlu
IGN1cnJlbnQgc3VidHJlZS4KLSAgICAgICAgc2l6ZSBudW1fc3ViID0gbnVtX25vZGVzOwotCi0g
ICAgICAgIC8vIFRoZSBhbGdvcml0aG0gcmVsaWVzIG9uIGEgc3RhY2sgb2Ygbm9kZXMgd2hvc2Ug
bGVzcyBzdWJ0cmVlIGhhcwotICAgICAgICAvLyBiZWVuIGJ1aWx0LCBidXQgd2hvc2UgcmlnaHQg
c3VidHJlZSBoYXMgbm90IHlldCBiZWVuIGJ1aWx0LiAgVGhlCi0gICAgICAgIC8vIHN0YWNrIGlz
IGltcGxlbWVudGVkIGFzIGxpbmtlZCBsaXN0LiAgVGhlIG5vZGVzIGFyZSBsaW5rZWQKLSAgICAg
ICAgLy8gdG9nZXRoZXIgYnkgaGF2aW5nIHRoZSAiZ3JlYXRlciIgaGFuZGxlIG9mIGEgbm9kZSBz
ZXQgdG8gdGhlCi0gICAgICAgIC8vIG5leHQgbm9kZSBpbiB0aGUgbGlzdC4gICJsZXNzX3BhcmVu
dCIgaXMgdGhlIGhhbmRsZSBvZiB0aGUgZmlyc3QKLSAgICAgICAgLy8gbm9kZSBpbiB0aGUgbGlz
dC4KLSAgICAgICAgaGFuZGxlIGxlc3NfcGFyZW50ID0gbnVsbCgpOwotCi0gICAgICAgIC8vIGgg
aXMgcm9vdCBvZiBjdXJyZW50IHN1YnRyZWUsIGNoaWxkIGlzIG9uZSBvZiBpdHMgY2hpbGRyZW4u
Ci0gICAgICAgIGhhbmRsZSBoLCBjaGlsZDsKLQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAg
ICAgICB3aGlsZSAobnVtX3N1YiA+IDIpIHsKLSAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCBv
bmUgZm9yIHJvb3Qgb2Ygc3VidHJlZS4KLSAgICAgICAgICAgICAgICBudW1fc3ViLS07Ci0gICAg
ICAgICAgICAgICAgcmVtW2RlcHRoXSA9ICEhKG51bV9zdWIgJiAxKTsKLSAgICAgICAgICAgICAg
ICBicmFuY2hbZGVwdGgrK10gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBudW1fc3ViID4+PSAx
OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobnVtX3N1YiA9PSAyKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gQnVpbGQgYSBzdWJ0cmVlIHdpdGggdHdvIG5vZGVzLCBzbGFudGluZyB0
byBncmVhdGVyLgotICAgICAgICAgICAgICAgIC8vIEkgYXJiaXRyYXJpbHkgY2hvc2UgdG8gYWx3
YXlzIGhhdmUgdGhlIGV4dHJhIG5vZGUgaW4gdGhlCi0gICAgICAgICAgICAgICAgLy8gZ3JlYXRl
ciBzdWJ0cmVlIHdoZW4gdGhlcmUgaXMgYW4gb2RkIG51bWJlciBvZiBub2RlcyB0bwotICAgICAg
ICAgICAgICAgIC8vIHNwbGl0IGJldHdlZW4gdGhlIHR3byBzdWJ0cmVlcy4KLQotICAgICAgICAg
ICAgICAgIGggPSAqcDsKLSAgICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICAgICAgY2hp
bGQgPSAqcDsKLSAgICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICAgICAgc2V0X2x0KGNo
aWxkLCBudWxsKCkpOwotICAgICAgICAgICAgICAgIHNldF9ndChjaGlsZCwgbnVsbCgpKTsKLSAg
ICAgICAgICAgICAgICBzZXRfYmYoY2hpbGQsIDApOwotICAgICAgICAgICAgICAgIHNldF9ndCho
LCBjaGlsZCk7Ci0gICAgICAgICAgICAgICAgc2V0X2x0KGgsIG51bGwoKSk7Ci0gICAgICAgICAg
ICAgICAgc2V0X2JmKGgsIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gbnVtX3N1YiA9PSAx
Ci0gICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBzdWJ0cmVlIHdpdGggb25lIG5vZGUuCi0KLSAg
ICAgICAgICAgICAgICBoID0gKnA7Ci0gICAgICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAg
ICAgIHNldF9sdChoLCBudWxsKCkpOwotICAgICAgICAgICAgICAgIHNldF9ndChoLCBudWxsKCkp
OwotICAgICAgICAgICAgICAgIHNldF9iZihoLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgd2hpbGUgKGRlcHRoKSB7Ci0gICAgICAgICAgICAgICAgZGVwdGgtLTsKLSAgICAgICAg
ICAgICAgICBpZiAoIWJyYW5jaFtkZXB0aF0pCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3Zl
IGNvbXBsZXRlZCBhIGxlc3Mgc3VidHJlZS4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgICAgICAgICAvLyBXZSd2ZSBjb21wbGV0ZWQgYSBncmVhdGVyIHN1YnRyZWUsIHNv
IGF0dGFjaCBpdCB0bwotICAgICAgICAgICAgICAgIC8vIGl0cyBwYXJlbnQgKHRoYXQgaXMgbGVz
cyB0aGFuIGl0KS4gIFdlIHBvcCB0aGUgcGFyZW50Ci0gICAgICAgICAgICAgICAgLy8gb2ZmIHRo
ZSBzdGFjayBvZiBsZXNzIHBhcmVudHMuCi0gICAgICAgICAgICAgICAgY2hpbGQgPSBoOwotICAg
ICAgICAgICAgICAgIGggPSBsZXNzX3BhcmVudDsKLSAgICAgICAgICAgICAgICBsZXNzX3BhcmVu
dCA9IGdldF9ndChoKTsKLSAgICAgICAgICAgICAgICBzZXRfZ3QoaCwgY2hpbGQpOwotICAgICAg
ICAgICAgICAgIC8vIG51bV9zdWIgPSAyICogKG51bV9zdWIgLSByZW1bZGVwdGhdKSArIHJlbVtk
ZXB0aF0gKyAxCi0gICAgICAgICAgICAgICAgbnVtX3N1YiA8PD0gMTsKLSAgICAgICAgICAgICAg
ICBudW1fc3ViICs9IDEgLSByZW1bZGVwdGhdOwotICAgICAgICAgICAgICAgIGlmIChudW1fc3Vi
ICYgKG51bV9zdWIgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgLy8gbnVtX3N1YiBpcyBub3Qg
YSBwb3dlciBvZiAyCi0gICAgICAgICAgICAgICAgICAgIHNldF9iZihoLCAwKTsKLSAgICAgICAg
ICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vIG51bV9zdWIgaXMgYSBwb3dlciBv
ZiAyCi0gICAgICAgICAgICAgICAgICAgIHNldF9iZihoLCAxKTsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKG51bV9zdWIgPT0gbnVtX25vZGVzKQotICAgICAgICAgICAgICAgIC8v
IFdlJ3ZlIGNvbXBsZXRlZCB0aGUgZnVsbCB0cmVlLgotICAgICAgICAgICAgICAgIGJyZWFrOwot
Ci0gICAgICAgICAgICAvLyBUaGUgc3VidHJlZSB3ZSd2ZSBjb21wbGV0ZWQgaXMgdGhlIGxlc3Mg
c3VidHJlZSBvZiB0aGUKLSAgICAgICAgICAgIC8vIG5leHQgbm9kZSBpbiB0aGUgc2VxdWVuY2Uu
Ci0KLSAgICAgICAgICAgIGNoaWxkID0gaDsKLSAgICAgICAgICAgIGggPSAqcDsKLSAgICAgICAg
ICAgIHArKzsKLSAgICAgICAgICAgIHNldF9sdChoLCBjaGlsZCk7Ci0KLSAgICAgICAgICAgIC8v
IFB1dCBoIGludG8gc3RhY2sgb2YgbGVzcyBwYXJlbnRzLgotICAgICAgICAgICAgc2V0X2d0KGgs
IGxlc3NfcGFyZW50KTsKLSAgICAgICAgICAgIGxlc3NfcGFyZW50ID0gaDsKLQotICAgICAgICAg
ICAgLy8gUHJvY2VlZCB0byBjcmVhdGluZyBncmVhdGVyIHRoYW4gc3VidHJlZSBvZiBoLgotICAg
ICAgICAgICAgYnJhbmNoW2RlcHRoXSA9IHRydWU7Ci0gICAgICAgICAgICBudW1fc3ViICs9IHJl
bVtkZXB0aCsrXTsKLQotICAgICAgICB9IC8vIGVuZCBmb3IgKDs7KQotCi0gICAgICAgIGFicy5y
b290ID0gaDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQot
ICAgIGZyaWVuZCBjbGFzcyBJdGVyYXRvcjsKLQotICAgIC8vIENyZWF0ZSBhIGNsYXNzIHdob3Nl
IHNvbGUgcHVycG9zZSBpcyB0byB0YWtlIGFkdmFudGFnZSBvZgotICAgIC8vIHRoZSAiZW1wdHkg
bWVtYmVyIiBvcHRpbWl6YXRpb24uCi0gICAgc3RydWN0IGFic19wbHVzX3Jvb3QgOiBwdWJsaWMg
QWJzdHJhY3RvciB7Ci0gICAgICAgIC8vIFRoZSBoYW5kbGUgb2YgdGhlIHJvb3QgZWxlbWVudCBp
biB0aGUgQVZMIHRyZWUuCi0gICAgICAgIGhhbmRsZSByb290OwotICAgIH07Ci0KLSAgICBhYnNf
cGx1c19yb290IGFiczsKLQotCi0gICAgaGFuZGxlIGdldF9sdChoYW5kbGUgaCkgeyByZXR1cm4g
YWJzLmdldF9sZXNzKGgpOyB9Ci0gICAgdm9pZCBzZXRfbHQoaGFuZGxlIGgsIGhhbmRsZSBsaCkg
eyBhYnMuc2V0X2xlc3MoaCwgbGgpOyB9Ci0KLSAgICBoYW5kbGUgZ2V0X2d0KGhhbmRsZSBoKSB7
IHJldHVybiBhYnMuZ2V0X2dyZWF0ZXIoaCk7IH0KLSAgICB2b2lkIHNldF9ndChoYW5kbGUgaCwg
aGFuZGxlIGdoKSB7IGFicy5zZXRfZ3JlYXRlcihoLCBnaCk7IH0KLQotICAgIGludCBnZXRfYmYo
aGFuZGxlIGgpIHsgcmV0dXJuIGFicy5nZXRfYmFsYW5jZV9mYWN0b3IoaCk7IH0KLSAgICB2b2lk
IHNldF9iZihoYW5kbGUgaCwgaW50IGJmKSB7IGFicy5zZXRfYmFsYW5jZV9mYWN0b3IoaCwgYmYp
OyB9Ci0KLSAgICBpbnQgY21wX2tfbihrZXkgaywgaGFuZGxlIGgpIHsgcmV0dXJuIGFicy5jb21w
YXJlX2tleV9ub2RlKGssIGgpOyB9Ci0gICAgaW50IGNtcF9uX24oaGFuZGxlIGgxLCBoYW5kbGUg
aDIpIHsgcmV0dXJuIGFicy5jb21wYXJlX25vZGVfbm9kZShoMSwgaDIpOyB9Ci0KLSAgICBoYW5k
bGUgbnVsbCgpIHsgcmV0dXJuIGFicy5udWxsKCk7IH0KLQotcHJpdmF0ZToKLQotICAgIC8vIEJh
bGFuY2VzIHN1YnRyZWUsIHJldHVybnMgaGFuZGxlIG9mIHJvb3Qgbm9kZSBvZiBzdWJ0cmVlCi0g
ICAgLy8gYWZ0ZXIgYmFsYW5jaW5nLgotICAgIGhhbmRsZSBiYWxhbmNlKGhhbmRsZSBiYWxfaCkK
LSAgICB7Ci0gICAgICAgIGhhbmRsZSBkZWVwX2g7Ci0KLSAgICAgICAgLy8gRWl0aGVyIHRoZSAi
Z3JlYXRlciB0aGFuIiBvciB0aGUgImxlc3MgdGhhbiIgc3VidHJlZSBvZgotICAgICAgICAvLyB0
aGlzIG5vZGUgaGFzIHRvIGJlIDIgbGV2ZWxzIGRlZXBlciAob3IgZWxzZSBpdCB3b3VsZG4ndAot
ICAgICAgICAvLyBuZWVkIGJhbGFuY2luZykuCi0KLSAgICAgICAgaWYgKGdldF9iZihiYWxfaCkg
PiAwKSB7Ci0gICAgICAgICAgICAvLyAiR3JlYXRlciB0aGFuIiBzdWJ0cmVlIGlzIGRlZXBlci4K
LQotICAgICAgICAgICAgZGVlcF9oID0gZ2V0X2d0KGJhbF9oKTsKLQotICAgICAgICAgICAgaWYg
KGdldF9iZihkZWVwX2gpIDwgMCkgewotICAgICAgICAgICAgICAgIGhhbmRsZSBvbGRfaCA9IGJh
bF9oOwotICAgICAgICAgICAgICAgIGJhbF9oID0gZ2V0X2x0KGRlZXBfaCk7Ci0KLSAgICAgICAg
ICAgICAgICBzZXRfZ3Qob2xkX2gsIGdldF9sdChiYWxfaCkpOwotICAgICAgICAgICAgICAgIHNl
dF9sdChkZWVwX2gsIGdldF9ndChiYWxfaCkpOwotICAgICAgICAgICAgICAgIHNldF9sdChiYWxf
aCwgb2xkX2gpOwotICAgICAgICAgICAgICAgIHNldF9ndChiYWxfaCwgZGVlcF9oKTsKLQotICAg
ICAgICAgICAgICAgIGludCBiZiA9IGdldF9iZihiYWxfaCk7Ci0gICAgICAgICAgICAgICAgaWYg
KGJmICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJmID4gMCkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgc2V0X2JmKG9sZF9oLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBzZXRfYmYoZGVlcF9oLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHNldF9iZihkZWVwX2gsIDEpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0X2JmKG9sZF9oLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICBzZXRfYmYoYmFsX2gsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgICAgIHNldF9iZihvbGRfaCwgMCk7Ci0gICAgICAgICAgICAgICAgICAg
IHNldF9iZihkZWVwX2gsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgc2V0X2d0KGJhbF9oLCBnZXRfbHQoZGVlcF9oKSk7Ci0gICAg
ICAgICAgICAgICAgc2V0X2x0KGRlZXBfaCwgYmFsX2gpOwotICAgICAgICAgICAgICAgIGlmIChn
ZXRfYmYoZGVlcF9oKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9iZihkZWVwX2gs
IC0xKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKGJhbF9oLCAxKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRfYmYoZGVlcF9oLCAwKTsKLSAg
ICAgICAgICAgICAgICAgICAgc2V0X2JmKGJhbF9oLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgYmFsX2ggPSBkZWVwX2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAvLyAiTGVzcyB0aGFuIiBzdWJ0cmVlIGlzIGRlZXBlci4KLQot
ICAgICAgICAgICAgZGVlcF9oID0gZ2V0X2x0KGJhbF9oKTsKLQotICAgICAgICAgICAgaWYgKGdl
dF9iZihkZWVwX2gpID4gMCkgewotICAgICAgICAgICAgICAgIGhhbmRsZSBvbGRfaCA9IGJhbF9o
OwotICAgICAgICAgICAgICAgIGJhbF9oID0gZ2V0X2d0KGRlZXBfaCk7Ci0gICAgICAgICAgICAg
ICAgc2V0X2x0KG9sZF9oLCBnZXRfZ3QoYmFsX2gpKTsKLSAgICAgICAgICAgICAgICBzZXRfZ3Qo
ZGVlcF9oLCBnZXRfbHQoYmFsX2gpKTsKLSAgICAgICAgICAgICAgICBzZXRfZ3QoYmFsX2gsIG9s
ZF9oKTsKLSAgICAgICAgICAgICAgICBzZXRfbHQoYmFsX2gsIGRlZXBfaCk7Ci0KLSAgICAgICAg
ICAgICAgICBpbnQgYmYgPSBnZXRfYmYoYmFsX2gpOwotICAgICAgICAgICAgICAgIGlmIChiZiAh
PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiZiA8IDApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHNldF9iZihvbGRfaCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRf
YmYoZGVlcF9oLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHNldF9iZihkZWVwX2gsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHNldF9iZihvbGRfaCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgc2V0X2JmKGJhbF9oLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICBzZXRfYmYob2xkX2gsIDApOwotICAgICAgICAgICAgICAgICAgICBzZXRf
YmYoZGVlcF9oLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIHNldF9sdChiYWxfaCwgZ2V0X2d0KGRlZXBfaCkpOwotICAgICAgICAg
ICAgICAgIHNldF9ndChkZWVwX2gsIGJhbF9oKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0X2Jm
KGRlZXBfaCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZXRfYmYoZGVlcF9oLCAxKTsK
LSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKGJhbF9oLCAtMSk7Ci0gICAgICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2JmKGRlZXBfaCwgMCk7Ci0gICAgICAg
ICAgICAgICAgICAgIHNldF9iZihiYWxfaCwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIGJhbF9oID0gZGVlcF9oOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIGJhbF9oOwotICAgIH0KLQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIEFic3Ry
YWN0b3IsIHVuc2lnbmVkIG1heERlcHRoLCBjbGFzcyBCU2V0PgotaW5saW5lIHR5cGVuYW1lIEFW
TFRyZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+OjpoYW5kbGUKLUFWTFRyZWU8QWJzdHJh
Y3RvciwgbWF4RGVwdGgsIEJTZXQ+OjppbnNlcnQoaGFuZGxlIGgpCi17Ci0gICAgc2V0X2x0KGgs
IG51bGwoKSk7Ci0gICAgc2V0X2d0KGgsIG51bGwoKSk7Ci0gICAgc2V0X2JmKGgsIDApOwotCi0g
ICAgaWYgKGFicy5yb290ID09IG51bGwoKSkKLSAgICAgICAgYWJzLnJvb3QgPSBoOwotICAgIGVs
c2UgewotICAgICAgICAvLyBMYXN0IHVuYmFsYW5jZWQgbm9kZSBlbmNvdW50ZXJlZCBpbiBzZWFy
Y2ggZm9yIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgaGFuZGxlIHVuYmFsID0gbnVsbCgpOwot
ICAgICAgICAvLyBQYXJlbnQgb2YgbGFzdCB1bmJhbGFuY2VkIG5vZGUuCi0gICAgICAgIGhhbmRs
ZSBwYXJlbnRfdW5iYWwgPSBudWxsKCk7Ci0gICAgICAgIC8vIEJhbGFuY2UgZmFjdG9yIG9mIGxh
c3QgdW5iYWxhbmNlZCBub2RlLgotICAgICAgICBpbnQgdW5iYWxfYmY7Ci0KLSAgICAgICAgLy8g
WmVyby1iYXNlZCBkZXB0aCBpbiB0cmVlLgotICAgICAgICB1bnNpZ25lZCBkZXB0aCA9IDAsIHVu
YmFsX2RlcHRoID0gMDsKLQotICAgICAgICAvLyBSZWNvcmRzIGEgcGF0aCBpbnRvIHRoZSB0cmVl
LiAgSWYgYnJhbmNoW25dIGlzIHRydWUsIGluZGljYXRlcwotICAgICAgICAvLyB0YWtlIGdyZWF0
ZXIgYnJhbmNoIGZyb20gdGhlIG50aCBub2RlIGluIHRoZSBwYXRoLCBvdGhlcndpc2UKLSAgICAg
ICAgLy8gdGFrZSB0aGUgbGVzcyBicmFuY2guICBicmFuY2hbMF0gZ2l2ZXMgYnJhbmNoIGZyb20g
cm9vdCwgYW5kCi0gICAgICAgIC8vIHNvIG9uLgotICAgICAgICBCU2V0IGJyYW5jaDsKLQotICAg
ICAgICBoYW5kbGUgaGggPSBhYnMucm9vdDsKLSAgICAgICAgaGFuZGxlIHBhcmVudCA9IG51bGwo
KTsKLSAgICAgICAgaW50IGNtcDsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoZ2V0
X2JmKGhoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgdW5iYWwgPSBoaDsKLSAgICAgICAgICAg
ICAgICBwYXJlbnRfdW5iYWwgPSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgdW5iYWxfZGVwdGgg
PSBkZXB0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtcCA9IGNtcF9uX24oaCwgaGgp
OwotICAgICAgICAgICAgaWYgKGNtcCA9PSAwKQotICAgICAgICAgICAgICAgIC8vIER1cGxpY2F0
ZSBrZXkuCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhoOwotICAgICAgICAgICAgcGFyZW50ID0g
aGg7Ci0gICAgICAgICAgICBoaCA9IGNtcCA8IDAgPyBnZXRfbHQoaGgpIDogZ2V0X2d0KGhoKTsK
LSAgICAgICAgICAgIGJyYW5jaFtkZXB0aCsrXSA9IGNtcCA+IDA7Ci0gICAgICAgIH0gd2hpbGUg
KGhoICE9IG51bGwoKSk7Ci0KLSAgICAgICAgLy8gIEFkZCBub2RlIHRvIGluc2VydCBhcyBsZWFm
IG9mIHRyZWUuCi0gICAgICAgIGlmIChjbXAgPCAwKQotICAgICAgICAgICAgc2V0X2x0KHBhcmVu
dCwgaCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNldF9ndChwYXJlbnQsIGgpOwotCi0g
ICAgICAgIGRlcHRoID0gdW5iYWxfZGVwdGg7Ci0KLSAgICAgICAgaWYgKHVuYmFsID09IG51bGwo
KSkKLSAgICAgICAgICAgIGhoID0gYWJzLnJvb3Q7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgY21wID0gYnJhbmNoW2RlcHRoKytdID8gMSA6IC0xOwotICAgICAgICAgICAgdW5iYWxfYmYg
PSBnZXRfYmYodW5iYWwpOwotICAgICAgICAgICAgaWYgKGNtcCA8IDApCi0gICAgICAgICAgICAg
ICAgdW5iYWxfYmYtLTsKLSAgICAgICAgICAgIGVsc2UgIC8vIGNtcCA+IDAKLSAgICAgICAgICAg
ICAgICB1bmJhbF9iZisrOwotICAgICAgICAgICAgaGggPSBjbXAgPCAwID8gZ2V0X2x0KHVuYmFs
KSA6IGdldF9ndCh1bmJhbCk7Ci0gICAgICAgICAgICBpZiAoKHVuYmFsX2JmICE9IC0yKSAmJiAo
dW5iYWxfYmYgIT0gMikpIHsKLSAgICAgICAgICAgICAgICAvLyBObyByZWJhbGFuY2luZyBvZiB0
cmVlIGlzIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgICAgICBzZXRfYmYodW5iYWwsIHVuYmFsX2Jm
KTsKLSAgICAgICAgICAgICAgICB1bmJhbCA9IG51bGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChoaCAhPSBudWxsKCkpCi0gICAgICAgICAgICB3aGlsZSAoaCAh
PSBoaCkgewotICAgICAgICAgICAgICAgIGNtcCA9IGJyYW5jaFtkZXB0aCsrXSA/IDEgOiAtMTsK
LSAgICAgICAgICAgICAgICBpZiAoY21wIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBzZXRf
YmYoaGgsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaGggPSBnZXRfbHQoaGgpOwotICAgICAg
ICAgICAgICAgIH0gZWxzZSB7IC8vIGNtcCA+IDAKLSAgICAgICAgICAgICAgICAgICAgc2V0X2Jm
KGhoLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaGggPSBnZXRfZ3QoaGgpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICBpZiAodW5iYWwgIT0gbnVsbCgpKSB7
Ci0gICAgICAgICAgICB1bmJhbCA9IGJhbGFuY2UodW5iYWwpOwotICAgICAgICAgICAgaWYgKHBh
cmVudF91bmJhbCA9PSBudWxsKCkpCi0gICAgICAgICAgICAgICAgYWJzLnJvb3QgPSB1bmJhbDsK
LSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGRlcHRoID0gdW5iYWxfZGVwdGgg
LSAxOwotICAgICAgICAgICAgICAgIGNtcCA9IGJyYW5jaFtkZXB0aF0gPyAxIDogLTE7Ci0gICAg
ICAgICAgICAgICAgaWYgKGNtcCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHNldF9sdChwYXJl
bnRfdW5iYWwsIHVuYmFsKTsKLSAgICAgICAgICAgICAgICBlbHNlICAvLyBjbXAgPiAwCi0gICAg
ICAgICAgICAgICAgICAgIHNldF9ndChwYXJlbnRfdW5iYWwsIHVuYmFsKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBoOwotfQotCi10ZW1wbGF0ZSA8Y2xh
c3MgQWJzdHJhY3RvciwgdW5zaWduZWQgbWF4RGVwdGgsIGNsYXNzIEJTZXQ+Ci1pbmxpbmUgdHlw
ZW5hbWUgQVZMVHJlZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwgQlNldD46OmhhbmRsZQotQVZMVHJl
ZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwgQlNldD46OnNlYXJjaChrZXkgaywgdHlwZW5hbWUgQVZM
VHJlZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwgQlNldD46OlNlYXJjaFR5cGUgc3QpCi17Ci0gICAg
Y29uc3QgaW50IE1BU0tfSElHSF9CSVQgPSAoaW50KSB+ICgofiAodW5zaWduZWQpIDApID4+IDEp
OwotCi0gICAgaW50IGNtcCwgdGFyZ2V0X2NtcDsKLSAgICBoYW5kbGUgbWF0Y2hfaCA9IG51bGwo
KTsKLSAgICBoYW5kbGUgaCA9IGFicy5yb290OwotCi0gICAgaWYgKHN0ICYgTEVTUykKLSAgICAg
ICAgdGFyZ2V0X2NtcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3QgJiBHUkVBVEVSKQotICAgICAgICB0
YXJnZXRfY21wID0gLTE7Ci0gICAgZWxzZQotICAgICAgICB0YXJnZXRfY21wID0gMDsKLQotICAg
IHdoaWxlIChoICE9IG51bGwoKSkgewotICAgICAgICBjbXAgPSBjbXBfa19uKGssIGgpOwotICAg
ICAgICBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgIGlmIChzdCAmIEVRVUFMKSB7Ci0gICAg
ICAgICAgICAgICAgbWF0Y2hfaCA9IGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBjbXAgPSAtdGFyZ2V0X2NtcDsKLSAgICAgICAgfSBlbHNlIGlm
ICh0YXJnZXRfY21wICE9IDApCi0gICAgICAgICAgICBpZiAoISgoY21wIF4gdGFyZ2V0X2NtcCkg
JiBNQVNLX0hJR0hfQklUKSkKLSAgICAgICAgICAgICAgICAvLyBjbXAgYW5kIHRhcmdldF9jbXAg
YXJlIGJvdGggcG9zaXRpdmUgb3IgYm90aCBuZWdhdGl2ZS4KLSAgICAgICAgICAgICAgICBtYXRj
aF9oID0gaDsKLSAgICAgICAgaCA9IGNtcCA8IDAgPyBnZXRfbHQoaCkgOiBnZXRfZ3QoaCk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIG1hdGNoX2g7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBBYnN0cmFj
dG9yLCB1bnNpZ25lZCBtYXhEZXB0aCwgY2xhc3MgQlNldD4KLWlubGluZSB0eXBlbmFtZSBBVkxU
cmVlPEFic3RyYWN0b3IsIG1heERlcHRoLCBCU2V0Pjo6aGFuZGxlCi1BVkxUcmVlPEFic3RyYWN0
b3IsIG1heERlcHRoLCBCU2V0Pjo6c2VhcmNoX2xlYXN0KCkKLXsKLSAgICBoYW5kbGUgaCA9IGFi
cy5yb290LCBwYXJlbnQgPSBudWxsKCk7Ci0KLSAgICB3aGlsZSAoaCAhPSBudWxsKCkpIHsKLSAg
ICAgICAgcGFyZW50ID0gaDsKLSAgICAgICAgaCA9IGdldF9sdChoKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gcGFyZW50OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQWJzdHJhY3RvciwgdW5zaWduZWQg
bWF4RGVwdGgsIGNsYXNzIEJTZXQ+Ci1pbmxpbmUgdHlwZW5hbWUgQVZMVHJlZTxBYnN0cmFjdG9y
LCBtYXhEZXB0aCwgQlNldD46OmhhbmRsZQotQVZMVHJlZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwg
QlNldD46OnNlYXJjaF9ncmVhdGVzdCgpCi17Ci0gICAgaGFuZGxlIGggPSBhYnMucm9vdCwgcGFy
ZW50ID0gbnVsbCgpOwotCi0gICAgd2hpbGUgKGggIT0gbnVsbCgpKSB7Ci0gICAgICAgIHBhcmVu
dCA9IGg7Ci0gICAgICAgIGggPSBnZXRfZ3QoaCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhcmVu
dDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEFic3RyYWN0b3IsIHVuc2lnbmVkIG1heERlcHRoLCBj
bGFzcyBCU2V0PgotaW5saW5lIHR5cGVuYW1lIEFWTFRyZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgs
IEJTZXQ+OjpoYW5kbGUKLUFWTFRyZWU8QWJzdHJhY3RvciwgbWF4RGVwdGgsIEJTZXQ+OjpyZW1v
dmUoa2V5IGspCi17Ci0gICAgLy8gWmVyby1iYXNlZCBkZXB0aCBpbiB0cmVlLgotICAgIHVuc2ln
bmVkIGRlcHRoID0gMCwgcm1fZGVwdGg7Ci0KLSAgICAvLyBSZWNvcmRzIGEgcGF0aCBpbnRvIHRo
ZSB0cmVlLiAgSWYgYnJhbmNoW25dIGlzIHRydWUsIGluZGljYXRlcwotICAgIC8vIHRha2UgZ3Jl
YXRlciBicmFuY2ggZnJvbSB0aGUgbnRoIG5vZGUgaW4gdGhlIHBhdGgsIG90aGVyd2lzZQotICAg
IC8vIHRha2UgdGhlIGxlc3MgYnJhbmNoLiAgYnJhbmNoWzBdIGdpdmVzIGJyYW5jaCBmcm9tIHJv
b3QsIGFuZAotICAgIC8vIHNvIG9uLgotICAgIEJTZXQgYnJhbmNoOwotCi0gICAgaGFuZGxlIGgg
PSBhYnMucm9vdDsKLSAgICBoYW5kbGUgcGFyZW50ID0gbnVsbCgpLCBjaGlsZDsKLSAgICBpbnQg
Y21wLCBjbXBfc2hvcnRlbmVkX3N1Yl93aXRoX3BhdGggPSAwOwotCi0gICAgZm9yICg7Oykgewot
ICAgICAgICBpZiAoaCA9PSBudWxsKCkpCi0gICAgICAgICAgICAvLyBObyBub2RlIGluIHRyZWUg
d2l0aCBnaXZlbiBrZXkuCi0gICAgICAgICAgICByZXR1cm4gbnVsbCgpOwotICAgICAgICBjbXAg
PSBjbXBfa19uKGssIGgpOwotICAgICAgICBpZiAoY21wID09IDApCi0gICAgICAgICAgICAvLyBG
b3VuZCBub2RlIHRvIHJlbW92ZS4KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBwYXJlbnQg
PSBoOwotICAgICAgICBoID0gY21wIDwgMCA/IGdldF9sdChoKSA6IGdldF9ndChoKTsKLSAgICAg
ICAgYnJhbmNoW2RlcHRoKytdID0gY21wID4gMDsKLSAgICAgICAgY21wX3Nob3J0ZW5lZF9zdWJf
d2l0aF9wYXRoID0gY21wOwotICAgIH0KLSAgICBoYW5kbGUgcm0gPSBoOwotICAgIGhhbmRsZSBw
YXJlbnRfcm0gPSBwYXJlbnQ7Ci0gICAgcm1fZGVwdGggPSBkZXB0aDsKLQotICAgIC8vIElmIHRo
ZSBub2RlIHRvIHJlbW92ZSBpcyBub3QgYSBsZWFmIG5vZGUsIHdlIG5lZWQgdG8gZ2V0IGEKLSAg
ICAvLyBsZWFmIG5vZGUsIG9yIGEgbm9kZSB3aXRoIGEgc2luZ2xlIGxlYWYgYXMgaXRzIGNoaWxk
LCB0byBwdXQKLSAgICAvLyBpbiB0aGUgcGxhY2Ugb2YgdGhlIG5vZGUgdG8gcmVtb3ZlLiAgV2Ug
d2lsbCBnZXQgdGhlIGdyZWF0ZXN0Ci0gICAgLy8gbm9kZSBpbiB0aGUgbGVzcyBzdWJ0cmVlIChv
ZiB0aGUgbm9kZSB0byByZW1vdmUpLCBvciB0aGUgbGVhc3QKLSAgICAvLyBub2RlIGluIHRoZSBn
cmVhdGVyIHN1YnRyZWUuICBXZSB0YWtlIHRoZSBsZWFmIG5vZGUgZnJvbSB0aGUKLSAgICAvLyBk
ZWVwZXIgc3VidHJlZSwgaWYgdGhlcmUgaXMgb25lLgotCi0gICAgaWYgKGdldF9iZihoKSA8IDAp
IHsKLSAgICAgICAgY2hpbGQgPSBnZXRfbHQoaCk7Ci0gICAgICAgIGJyYW5jaFtkZXB0aF0gPSBm
YWxzZTsKLSAgICAgICAgY21wID0gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hpbGQgPSBn
ZXRfZ3QoaCk7Ci0gICAgICAgIGJyYW5jaFtkZXB0aF0gPSB0cnVlOwotICAgICAgICBjbXAgPSAx
OwotICAgIH0KLSAgICBkZXB0aCsrOwotCi0gICAgaWYgKGNoaWxkICE9IG51bGwoKSkgewotICAg
ICAgICBjbXAgPSAtY21wOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBwYXJlbnQgPSBoOwot
ICAgICAgICAgICAgaCA9IGNoaWxkOwotICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKLSAgICAg
ICAgICAgICAgICBjaGlsZCA9IGdldF9sdChoKTsKLSAgICAgICAgICAgICAgICBicmFuY2hbZGVw
dGhdID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxk
ID0gZ2V0X2d0KGgpOwotICAgICAgICAgICAgICAgIGJyYW5jaFtkZXB0aF0gPSB0cnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgZGVwdGgrKzsKLSAgICAgICAgfSB3aGlsZSAoY2hpbGQg
IT0gbnVsbCgpKTsKLQotICAgICAgICBpZiAocGFyZW50ID09IHJtKQotICAgICAgICAgICAgLy8g
T25seSB3ZW50IHRocm91Z2ggZG8gbG9vcCBvbmNlLiAgRGVsZXRlZCBub2RlIHdpbGwgYmUgcmVw
bGFjZWQKLSAgICAgICAgICAgIC8vIGluIHRoZSB0cmVlIHN0cnVjdHVyZSBieSBvbmUgb2YgaXRz
IGltbWVkaWF0ZSBjaGlsZHJlbi4KLSAgICAgICAgICAgIGNtcF9zaG9ydGVuZWRfc3ViX3dpdGhf
cGF0aCA9IC1jbXA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNtcF9zaG9ydGVuZWRfc3Vi
X3dpdGhfcGF0aCA9IGNtcDsKLQotICAgICAgICAvLyBHZXQgdGhlIGhhbmRsZSBvZiB0aGUgb3Bw
b3NpdGUgY2hpbGQsIHdoaWNoIG1heSBub3QgYmUgbnVsbC4KLSAgICAgICAgY2hpbGQgPSBjbXAg
PiAwID8gZ2V0X2x0KGgpIDogZ2V0X2d0KGgpOwotICAgIH0KLQotICAgIGlmIChwYXJlbnQgPT0g
bnVsbCgpKQotICAgICAgICAvLyBUaGVyZSB3ZXJlIG9ubHkgMSBvciAyIG5vZGVzIGluIHRoaXMg
dHJlZS4KLSAgICAgICAgYWJzLnJvb3QgPSBjaGlsZDsKLSAgICBlbHNlIGlmIChjbXBfc2hvcnRl
bmVkX3N1Yl93aXRoX3BhdGggPCAwKQotICAgICAgICBzZXRfbHQocGFyZW50LCBjaGlsZCk7Ci0g
ICAgZWxzZQotICAgICAgICBzZXRfZ3QocGFyZW50LCBjaGlsZCk7Ci0KLSAgICAvLyAicGF0aCIg
aXMgdGhlIHBhcmVudCBvZiB0aGUgc3VidHJlZSBiZWluZyBlbGltaW5hdGVkIG9yIHJlZHVjZWQK
LSAgICAvLyBmcm9tIGEgZGVwdGggb2YgMiB0byAxLiAgSWYgInBhdGgiIGlzIHRoZSBub2RlIHRv
IGJlIHJlbW92ZWQsIHdlCi0gICAgLy8gc2V0IHBhdGggdG8gdGhlIG5vZGUgd2UncmUgYWJvdXQg
dG8gcG9rZSBpbnRvIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICAvLyBub2RlIHRvIGJlIHJlbW92
ZWQuCi0gICAgaGFuZGxlIHBhdGggPSBwYXJlbnQgPT0gcm0gPyBoIDogcGFyZW50OwotCi0gICAg
aWYgKGggIT0gcm0pIHsKLSAgICAgICAgLy8gUG9rZSBpbiB0aGUgcmVwbGFjZW1lbnQgZm9yIHRo
ZSBub2RlIHRvIGJlIHJlbW92ZWQuCi0gICAgICAgIHNldF9sdChoLCBnZXRfbHQocm0pKTsKLSAg
ICAgICAgc2V0X2d0KGgsIGdldF9ndChybSkpOwotICAgICAgICBzZXRfYmYoaCwgZ2V0X2JmKHJt
KSk7Ci0gICAgICAgIGlmIChwYXJlbnRfcm0gPT0gbnVsbCgpKQotICAgICAgICAgICAgYWJzLnJv
b3QgPSBoOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlcHRoID0gcm1fZGVwdGggLSAx
OwotICAgICAgICAgICAgaWYgKGJyYW5jaFtkZXB0aF0pCi0gICAgICAgICAgICAgICAgc2V0X2d0
KHBhcmVudF9ybSwgaCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0X2x0
KHBhcmVudF9ybSwgaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGF0aCAhPSBudWxs
KCkpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGxpbmtlZCBsaXN0IGZyb20gdGhl
IHBhcmVudCBvZiB0aGUgcGF0aCBub2RlCi0gICAgICAgIC8vIHRvIHRoZSByb290IG5vZGUuCi0g
ICAgICAgIGggPSBhYnMucm9vdDsKLSAgICAgICAgcGFyZW50ID0gbnVsbCgpOwotICAgICAgICBk
ZXB0aCA9IDA7Ci0gICAgICAgIHdoaWxlIChoICE9IHBhdGgpIHsKLSAgICAgICAgICAgIGlmIChi
cmFuY2hbZGVwdGgrK10pIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9IGdldF9ndChoKTsKLSAg
ICAgICAgICAgICAgICBzZXRfZ3QoaCwgcGFyZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgY2hpbGQgPSBnZXRfbHQoaCk7Ci0gICAgICAgICAgICAgICAgc2V0X2x0
KGgsIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnQgPSBoOwotICAg
ICAgICAgICAgaCA9IGNoaWxkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xpbWIgZnJvbSB0
aGUgcGF0aCBub2RlIHRvIHRoZSByb290IG5vZGUgdXNpbmcgdGhlIGxpbmtlZAotICAgICAgICAv
LyBsaXN0LCByZXN0b3JpbmcgdGhlIHRyZWUgc3RydWN0dXJlIGFuZCByZWJhbGFuY2luZyBhcyBu
ZWNlc3NhcnkuCi0gICAgICAgIGJvb2wgcmVkdWNlZF9kZXB0aCA9IHRydWU7Ci0gICAgICAgIGlu
dCBiZjsKLSAgICAgICAgY21wID0gY21wX3Nob3J0ZW5lZF9zdWJfd2l0aF9wYXRoOwotICAgICAg
ICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpZiAocmVkdWNlZF9kZXB0aCkgewotICAgICAgICAg
ICAgICAgIGJmID0gZ2V0X2JmKGgpOwotICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKQotICAg
ICAgICAgICAgICAgICAgICBiZisrOwotICAgICAgICAgICAgICAgIGVsc2UgIC8vIGNtcCA+IDAK
LSAgICAgICAgICAgICAgICAgICAgYmYtLTsKLSAgICAgICAgICAgICAgICBpZiAoKGJmID09IC0y
KSB8fCAoYmYgPT0gMikpIHsKLSAgICAgICAgICAgICAgICAgICAgaCA9IGJhbGFuY2UoaCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGJmID0gZ2V0X2JmKGgpOwotICAgICAgICAgICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgICAgICAgICBzZXRfYmYoaCwgYmYpOwotICAgICAgICAgICAgICAgIHJl
ZHVjZWRfZGVwdGggPSAoYmYgPT0gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAo
cGFyZW50ID09IG51bGwoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNo
aWxkID0gaDsKLSAgICAgICAgICAgIGggPSBwYXJlbnQ7Ci0gICAgICAgICAgICBjbXAgPSBicmFu
Y2hbLS1kZXB0aF0gPyAxIDogLTE7Ci0gICAgICAgICAgICBpZiAoY21wIDwgMCkgICAgewotICAg
ICAgICAgICAgICAgIHBhcmVudCA9IGdldF9sdChoKTsKLSAgICAgICAgICAgICAgICBzZXRfbHQo
aCwgY2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQg
PSBnZXRfZ3QoaCk7Ci0gICAgICAgICAgICAgICAgc2V0X2d0KGgsIGNoaWxkKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICBhYnMucm9vdCA9IGg7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHJtOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQWJzdHJhY3RvciwgdW5zaWduZWQgbWF4RGVw
dGgsIGNsYXNzIEJTZXQ+Ci1pbmxpbmUgdHlwZW5hbWUgQVZMVHJlZTxBYnN0cmFjdG9yLCBtYXhE
ZXB0aCwgQlNldD46OmhhbmRsZQotQVZMVHJlZTxBYnN0cmFjdG9yLCBtYXhEZXB0aCwgQlNldD46
OnN1YnN0KGhhbmRsZSBuZXdfbm9kZSkKLXsKLSAgICBoYW5kbGUgaCA9IGFicy5yb290OwotICAg
IGhhbmRsZSBwYXJlbnQgPSBudWxsKCk7Ci0gICAgaW50IGNtcCwgbGFzdF9jbXA7Ci0KLSAgICAv
KiBTZWFyY2ggZm9yIG5vZGUgYWxyZWFkeSBpbiB0cmVlIHdpdGggc2FtZSBrZXkuICovCi0gICAg
Zm9yICg7OykgewotICAgICAgICBpZiAoaCA9PSBudWxsKCkpCi0gICAgICAgICAgICAvKiBObyBu
b2RlIGluIHRyZWUgd2l0aCBzYW1lIGtleSBhcyBuZXcgbm9kZS4gKi8KLSAgICAgICAgICAgIHJl
dHVybiBudWxsKCk7Ci0gICAgICAgIGNtcCA9IGNtcF9uX24obmV3X25vZGUsIGgpOwotICAgICAg
ICBpZiAoY21wID09IDApCi0gICAgICAgICAgICAvKiBGb3VuZCB0aGUgbm9kZSB0byBzdWJzdGl0
dXRlIG5ldyBvbmUgZm9yLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGxhc3RfY21w
ID0gY21wOwotICAgICAgICBwYXJlbnQgPSBoOwotICAgICAgICBoID0gY21wIDwgMCA/IGdldF9s
dChoKSA6IGdldF9ndChoKTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHRyZWUgaG91c2VrZWVwaW5n
IGZpZWxkcyBmcm9tIG5vZGUgaW4gdHJlZSB0byBuZXcgbm9kZS4gKi8KLSAgICBzZXRfbHQobmV3
X25vZGUsIGdldF9sdChoKSk7Ci0gICAgc2V0X2d0KG5ld19ub2RlLCBnZXRfZ3QoaCkpOwotICAg
IHNldF9iZihuZXdfbm9kZSwgZ2V0X2JmKGgpKTsKLQotICAgIGlmIChwYXJlbnQgPT0gbnVsbCgp
KQotICAgICAgICAvKiBOZXcgbm9kZSBpcyBhbHNvIG5ldyByb290LiAqLwotICAgICAgICBhYnMu
cm9vdCA9IG5ld19ub2RlOwotICAgIGVsc2UgewotICAgICAgICAvKiBNYWtlIHBhcmVudCBwb2lu
dCB0byBuZXcgbm9kZS4gKi8KLSAgICAgICAgaWYgKGxhc3RfY21wIDwgMCkKLSAgICAgICAgICAg
IHNldF9sdChwYXJlbnQsIG5ld19ub2RlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2V0
X2d0KHBhcmVudCwgbmV3X25vZGUpOwotICAgIH0KLQotICAgIHJldHVybiBoOwotfQotCi19Ci0K
LSNlbmRpZgpJbmRleDogU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDE4MzE5OCkKKysrIFNv
dXJjZS9XVEYvd3RmL0NNYWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNSBA
QAogc2V0KFdURl9IRUFERVJTCiAgICAgQVNDSUlDVHlwZS5oCi0gICAgQVZMVHJlZS5oCiAgICAg
QXNzZXJ0aW9ucy5oCiAgICAgQXRvbWljcy5oCiAgICAgQmFnLmgKSW5kZXg6IExheW91dFRlc3Rz
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9u
IDE4MzI2OSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDMyIEBACisyMDE1LTA0LTIxICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+
CisKKyAgICAgICAgSXQgc2hvdWxkbid0IHRha2UgMTg0NiBsaW5lcyBvZiBjb2RlIGFuZCA1IEZJ
WE1FcyB0byBzb3J0IGFuIGFycmF5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTQ0MDEzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgKiBqcy9zY3JpcHQtdGVzdHMvYXJyYXktaG9sZXMuanM6IAorICAgICAg
ICAqIGpzL2FycmF5LWhvbGVzLWV4cGVjdGVkLnR4dDogVGhpcyByZXN1bHQgbm93IG1hdGNoZXMg
RmlyZWZveC4gV2Ugc2VlCisgICAgICAgICdwZWVrYWJvbycsIHdoaWNoIGlzIGEgcHJvdG90eXBl
IHByb3BlcnR5LCByYXRoZXIgdGhhbiBhIGhvbGUsIGJlY2F1c2UKKyAgICAgICAgc29ydGluZyB1
c2VzIFtbR2V0XV0sIHdoaWNoIHNlZXMgcHJvdG90eXBlIHByb3BlcnRpZXMuCisKKyAgICAgICAg
VGhlIEVTNiBzcGVjIHNheXMgdGhhdCBzb3J0aW5nIHNob3VsZCB1c2UgW1tHZXRdXSwgc28gdGhp
cyBuZXcgcmVzdWx0CisgICAgICAgIG1hdGNoZXMgdGhlIHNwZWMgYSBsaXR0bGUgYmV0dGVyIC0t
IGFsdGhvdWdoIHRoZSBzcGVjIGFsc28gc2F5cyB0aGF0IHRoZQorICAgICAgICByZXN1bHQgb2Yg
c29ydGluZyBpcyB1bmRlZmluZWQgaW4gdGhpcyBjYXNlIGJlY2F1c2Ugb2YgdGhlIHByZXNlbmNl
IG9mCisgICAgICAgIGFuIGluZGV4ZWQgcHJvcGVydHkgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi4K
KworICAgICAgICAqIGpzL2RvbS9hcnJheS1wcm90b3R5cGUtcHJvcGVydGllcy1leHBlY3RlZC50
eHQ6IFVwZGF0ZWQgZXJyb3IgbWVzc2FnZQorICAgICAgICB0byBtYXRjaCBvdGhlciBhcnJheSBw
cm90b3R5cGUgZXJyb3IgbWVzc2FnZXMuCisKKyAgICAgICAgKiBqcy9jb21wYXJlZm4tc29ydC1z
dGFiaWxpdHktZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGpzL3NjcmlwdC10ZXN0cy9jb21wYXJl
Zm4tc29ydC1zdGFiaWxpdHkuanM6IE1hZGUgdGhpcyB0ZXN0IGJpZ2dlciBpbgorICAgICAgICBv
cmRlciB0byBkZW1vbnN0cmF0ZSB0aGF0IEZpcmVmb3ggYW5kIFNhZmFyaSB1c2UgYSBzdGFibGUg
c29ydCwgYW5kCisgICAgICAgIENocm9tZSBkb2VzIG5vdC4KKworICAgICAgICAqIGpzL3Njcmlw
dC10ZXN0cy9hcnJheS1zb3J0LXNwYXJzZS5qczoKKyAgICAgICAgKiBqcy9hcnJheS1zb3J0LXNw
YXJzZS1leHBlY3RlZC50eHQ6IEFkZGVkIHNvbWUgdGVzdHMgZm9yIHRoaW5ncyBJIGdvdAorICAg
ICAgICB3cm9uZyBpbiB0aGlzIHBhdGNoLgorCiAyMDE1LTA0LTI0ICBEb3VnIFJ1c3NlbGwgIDxk
X3J1c3NlbGxAYXBwbGUuY29tPgogCiAgICAgICAgIEFYOiByaWNoZXIgdGV4dCBjaGFuZ2Ugbm90
aWZpY2F0aW9ucyAoMTQyNzE5KQpJbmRleDogTGF5b3V0VGVzdHMvanMvYXJyYXktaG9sZXMtZXhw
ZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL2FycmF5LWhvbGVzLWV4cGVj
dGVkLnR4dAkocmV2aXNpb24gMTgzMTk4KQorKysgTGF5b3V0VGVzdHMvanMvYXJyYXktaG9sZXMt
ZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw3IEBAIFBBU1Mgc2hvd0hv
bGVzKFswLCAsIDJdLmNvbmNhdChbMywgLCA1XSkKIFBBU1Mgc2hvd0hvbGVzKFswLCAsIDIsIDNd
LnJldmVyc2UoKSkgaXMgJ1szLCAyLCBwZWVrYWJvbywgMF0nCiBQQVNTIGEgPSBbMCwgLCAyLCAz
XTsgYS5zaGlmdCgpOyBzaG93SG9sZXMoYSkgaXMgJ1twZWVrYWJvbywgMiwgM10nCiBQQVNTIHNo
b3dIb2xlcyhbMCwgLCAyLCAzXS5zbGljZSgwLCAzKSkgaXMgJ1swLCBwZWVrYWJvbywgMl0nCi1Q
QVNTIHNob3dIb2xlcyhbMCwgLCAyLCAzXS5zb3J0KCkpIGlzICdbMCwgMiwgMywgaG9sZV0nCitQ
QVNTIHNob3dIb2xlcyhbMCwgLCAyLCAzXS5zb3J0KCkpIGlzICdbMCwgMiwgMywgcGVla2Fib29d
JwogUEFTUyBzaG93SG9sZXMoWzAsIHVuZGVmaW5lZCwgMiwgM10uc29ydCgpKSBpcyAnWzAsIDIs
IDMsIHVuZGVmaW5lZF0nCiBQQVNTIGEgPSBbMCwgLCAyLCAzXTsgYS5zcGxpY2UoMiwgMywgNSwg
Nik7IHNob3dIb2xlcyhhKSBpcyAnWzAsIGhvbGUsIDUsIDZdJwogUEFTUyBhID0gWzAsICwgMiwg
M107IGEudW5zaGlmdCg0KTsgc2hvd0hvbGVzKGEpIGlzICdbNCwgMCwgcGVla2Fib28sIDIsIDNd
JwpJbmRleDogTGF5b3V0VGVzdHMvanMvYXJyYXktc29ydC1zcGFyc2UtZXhwZWN0ZWQudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL2FycmF5LXNvcnQtc3BhcnNlLWV4cGVjdGVkLnR4
dAkocmV2aXNpb24gMTgzMTk4KQorKysgTGF5b3V0VGVzdHMvanMvYXJyYXktc29ydC1zcGFyc2Ut
ZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC01LDYgKzUsMTEgQEAgT24gc3VjY2Vzcywg
eW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQQogCiBQQVNTIHRlc3RTb3J0KFssdW5kZWZpbmVk
LDAsMV0pIGlzIHRydWUKIFBBU1MgdGVzdFNvcnQoe2xlbmd0aDo0LDE6dW5kZWZpbmVkLDI6MCwz
OjF9KSBpcyB0cnVlCitQQVNTIDAgaW4gYXJyYXkgaXMgdHJ1ZQorUEFTUyAxIGluIGFycmF5IGlz
IGZhbHNlCitQQVNTIDAgaW4gYXJyYXkgaXMgdHJ1ZQorUEFTUyAxIGluIGFycmF5IGlzIGZhbHNl
CitQQVNTIDIgaW4gYXJyYXkgaXMgZmFsc2UKIFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRy
dWUKIAogVEVTVCBDT01QTEVURQpJbmRleDogTGF5b3V0VGVzdHMvanMvY29tcGFyZWZuLXNvcnQt
c3RhYmlsaXR5LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9jb21w
YXJlZm4tc29ydC1zdGFiaWxpdHktZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAxODMxOTgpCisrKyBM
YXlvdXRUZXN0cy9qcy9jb21wYXJlZm4tc29ydC1zdGFiaWxpdHktZXhwZWN0ZWQudHh0CSh3b3Jr
aW5nIGNvcHkpCkBAIC0zLDE0ICszLDIwNiBAQCBUaGlzIHRlc3RzIHRoYXQgc29ydChjb21wYXJl
Rm4pIGlzIGEgc3RhCiBPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1Mi
IG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCiAKIAotUEFTUyBhcnJbMF0g
aXMgc29ydEFyclswXQotUEFTUyBhcnJbMV0gaXMgc29ydEFyclsyXQotUEFTUyBhcnJbMl0gaXMg
c29ydEFyclsxXQotUEFTUyBhcnJbM10gaXMgc29ydEFyclszXQotUEFTUyBhcnJbMF0gaXMgc29y
dEFyclswXQotUEFTUyBhcnJbMV0gaXMgc29ydEFyclsyXQotUEFTUyBhcnJbMl0gaXMgc29ydEFy
clsxXQotUEFTUyBhcnJbM10gaXMgc29ydEFyclszXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ld
CitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFT
UyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJy
YXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ld
IGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBv
bmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tp
XQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BB
U1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFy
cmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtp
XSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMg
b25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNb
aV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQ
QVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBh
cnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlb
aV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlz
IG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVz
W2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQor
UEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1Mg
YXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5
W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBp
cyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25l
c1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0K
K1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNT
IGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJh
eVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0g
aXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9u
ZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ld
CitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFT
UyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJy
YXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ld
IGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBv
bmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tp
XQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BB
U1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFy
cmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtp
XSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMg
b25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNb
aV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQ
QVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBh
cnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlb
aV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlz
IG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVz
W2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQor
UEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5W2ldIGlzIG9uZXNbaV0KK1BBU1Mg
YXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBpcyBvbmVzW2ldCitQQVNTIGFycmF5
W2ldIGlzIG9uZXNbaV0KK1BBU1MgYXJyYXlbaV0gaXMgb25lc1tpXQorUEFTUyBhcnJheVtpXSBp
cyBvbmVzW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtj
b3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQ
QVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlz
IHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2Nv
dW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BB
U1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMg
dHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291
bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFT
UyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0
d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3Vu
dCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNT
IGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3
b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50
ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1Mg
YXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdv
c1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQg
KyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBh
cnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29z
W2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCAr
IGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFy
cmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3Nb
aV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsg
aV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJy
YXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tp
XQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBp
XSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJh
eVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ld
CitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGld
IGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5
W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0K
K1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0g
aXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlb
Y291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQor
UEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBp
cyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtj
b3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQ
QVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlz
IHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2Nv
dW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BB
U1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMg
dHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291
bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFT
UyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0
d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3Vu
dCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNT
IGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3
b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50
ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1Mg
YXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdv
c1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQg
KyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBh
cnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29z
W2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCAr
IGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFy
cmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3Nb
aV0KK1BBU1MgYXJyYXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsg
aV0gaXMgdHdvc1tpXQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJy
YXlbY291bnQgKyBpXSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tp
XQorUEFTUyBhcnJheVtjb3VudCArIGldIGlzIHR3b3NbaV0KK1BBU1MgYXJyYXlbY291bnQgKyBp
XSBpcyB0d29zW2ldCitQQVNTIGFycmF5W2NvdW50ICsgaV0gaXMgdHdvc1tpXQogUEFTUyBzdWNj
ZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQogCiBURVNUIENPTVBMRVRFCkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9kb20vYXJyYXktcHJvdG90eXBlLXByb3BlcnRpZXMtZXhwZWN0ZWQudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2pzL2RvbS9hcnJheS1wcm90b3R5cGUtcHJvcGVydGllcy1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDE4MzE5OCkKKysrIExheW91dFRlc3RzL2pzL2RvbS9hcnJheS1w
cm90b3R5cGUtcHJvcGVydGllcy1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTEyLDcg
KzEyLDcgQEAgUEFTUyBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHVuZGVmaW5lZAogUEFTUyBB
cnJheS5wcm90b3R5cGUucmV2ZXJzZS5jYWxsKHVuZGVmaW5lZCkgdGhyZXcgZXhjZXB0aW9uIFR5
cGVFcnJvcjogdW5kZWZpbmVkIGlzIG5vdCBhbiBvYmplY3QgKGV2YWx1YXRpbmcgJ0FycmF5LnBy
b3RvdHlwZS5yZXZlcnNlLmNhbGwodW5kZWZpbmVkKScpLgogUEFTUyBBcnJheS5wcm90b3R5cGUu
c2hpZnQuY2FsbCh1bmRlZmluZWQpIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5l
ZCBpcyBub3QgYW4gb2JqZWN0IChldmFsdWF0aW5nICdBcnJheS5wcm90b3R5cGUuc2hpZnQuY2Fs
bCh1bmRlZmluZWQpJykuCiBQQVNTIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHVuZGVmaW5l
ZCwgMCwgMSkgdGhyZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjogdW5kZWZpbmVkIGlzIG5vdCBhbiBv
YmplY3QgKGV2YWx1YXRpbmcgJ0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHVuZGVmaW5lZCwg
MCwgMSknKS4KLVBBU1MgQXJyYXkucHJvdG90eXBlLnNvcnQuY2FsbCh1bmRlZmluZWQpIHRocmV3
IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChldmFsdWF0
aW5nICdBcnJheS5wcm90b3R5cGUuc29ydC5jYWxsKHVuZGVmaW5lZCknKS4KK1BBU1MgQXJyYXku
cHJvdG90eXBlLnNvcnQuY2FsbCh1bmRlZmluZWQpIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6
IEFycmF5LnByb3RvdHlwZS5zb3J0IHJlcXVpcmVzIHRoYXQgfHRoaXN8IG5vdCBiZSB1bmRlZmlu
ZWQuCiBQQVNTIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbCh1bmRlZmluZWQsIDAsIDEpIHRo
cmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChldmFs
dWF0aW5nICdBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwodW5kZWZpbmVkLCAwLCAxKScpLgog
UEFTUyBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHVuZGVmaW5lZCwge30pIHRocmV3IGV4
Y2VwdGlvbiBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChldmFsdWF0aW5n
ICdBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHVuZGVmaW5lZCwge30pJykuCiBQQVNTIEFy
cmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKHVuZGVmaW5lZCwgdG9TdHJpbmcpIHRocmV3IGV4Y2Vw
dGlvbiBUeXBlRXJyb3I6IEFycmF5LnByb3RvdHlwZS5ldmVyeSByZXF1aXJlcyB0aGF0IHx0aGlz
fCBub3QgYmUgdW5kZWZpbmVkLgpJbmRleDogTGF5b3V0VGVzdHMvanMvc2NyaXB0LXRlc3RzL2Fy
cmF5LWhvbGVzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9h
cnJheS1ob2xlcy5qcwkocmV2aXNpb24gMTgzMTk4KQorKysgTGF5b3V0VGVzdHMvanMvc2NyaXB0
LXRlc3RzL2FycmF5LWhvbGVzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC04Nyw3ICs4Nyw3IEBAIHNo
b3VsZEJlKCJzaG93SG9sZXMoWzAsICwgMl0uY29uY2F0KFszLCAKIHNob3VsZEJlKCJzaG93SG9s
ZXMoWzAsICwgMiwgM10ucmV2ZXJzZSgpKSIsICInWzMsIDIsIHBlZWthYm9vLCAwXSciKTsKIHNo
b3VsZEJlKCJhID0gWzAsICwgMiwgM107IGEuc2hpZnQoKTsgc2hvd0hvbGVzKGEpIiwgIidbcGVl
a2Fib28sIDIsIDNdJyIpOwogc2hvdWxkQmUoInNob3dIb2xlcyhbMCwgLCAyLCAzXS5zbGljZSgw
LCAzKSkiLCAiJ1swLCBwZWVrYWJvbywgMl0nIik7Ci1zaG91bGRCZSgic2hvd0hvbGVzKFswLCAs
IDIsIDNdLnNvcnQoKSkiLCAiJ1swLCAyLCAzLCBob2xlXSciKTsKK3Nob3VsZEJlKCJzaG93SG9s
ZXMoWzAsICwgMiwgM10uc29ydCgpKSIsICInWzAsIDIsIDMsIHBlZWthYm9vXSciKTsKIHNob3Vs
ZEJlKCJzaG93SG9sZXMoWzAsIHVuZGVmaW5lZCwgMiwgM10uc29ydCgpKSIsICInWzAsIDIsIDMs
IHVuZGVmaW5lZF0nIik7CiBzaG91bGRCZSgiYSA9IFswLCAsIDIsIDNdOyBhLnNwbGljZSgyLCAz
LCA1LCA2KTsgc2hvd0hvbGVzKGEpIiwgIidbMCwgaG9sZSwgNSwgNl0nIik7CiBzaG91bGRCZSgi
YSA9IFswLCAsIDIsIDNdOyBhLnVuc2hpZnQoNCk7IHNob3dIb2xlcyhhKSIsICInWzQsIDAsIHBl
ZWthYm9vLCAyLCAzXSciKTsKSW5kZXg6IExheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9hcnJh
eS1zb3J0LXNwYXJzZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9zY3JpcHQtdGVz
dHMvYXJyYXktc29ydC1zcGFyc2UuanMJKHJldmlzaW9uIDE4MzE5OCkKKysrIExheW91dFRlc3Rz
L2pzL3NjcmlwdC10ZXN0cy9hcnJheS1zb3J0LXNwYXJzZS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MTAsMyArMTAsMTQgQEAgZnVuY3Rpb24gdGVzdFNvcnQoeCkKIAogc2hvdWxkQmVUcnVlKCJ0ZXN0
U29ydChbLHVuZGVmaW5lZCwwLDFdKSIpOwogc2hvdWxkQmVUcnVlKCJ0ZXN0U29ydCh7bGVuZ3Ro
OjQsMTp1bmRlZmluZWQsMjowLDM6MX0pIik7CisKK3ZhciBhcnJheSA9IFsgLCB1bmRlZmluZWQg
XTsKK2FycmF5LnNvcnQoKTsKK3Nob3VsZEJlVHJ1ZSgiMCBpbiBhcnJheSIpOworc2hvdWxkQmVG
YWxzZSgiMSBpbiBhcnJheSIpOworCit2YXIgYXJyYXkgPSBbICwgMSwgLCBdOworYXJyYXkuc29y
dCgpOworc2hvdWxkQmVUcnVlKCIwIGluIGFycmF5Iik7CitzaG91bGRCZUZhbHNlKCIxIGluIGFy
cmF5Iik7CitzaG91bGRCZUZhbHNlKCIyIGluIGFycmF5Iik7CkluZGV4OiBMYXlvdXRUZXN0cy9q
cy9zY3JpcHQtdGVzdHMvY29tcGFyZWZuLXNvcnQtc3RhYmlsaXR5LmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9jb21wYXJlZm4tc29ydC1zdGFiaWxpdHkuanMJ
KHJldmlzaW9uIDE4MzE5OCkKKysrIExheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9jb21wYXJl
Zm4tc29ydC1zdGFiaWxpdHkuanMJKHdvcmtpbmcgY29weSkKQEAgLTIsMzAgKzIsMjUgQEAgZGVz
Y3JpcHRpb24oCiAiVGhpcyB0ZXN0cyB0aGF0IHNvcnQoY29tcGFyZUZuKSBpcyBhIHN0YWJsZSBz
b3J0LiIKICk7CiAKLWZ1bmN0aW9uIGNsb25lKHNvdXJjZSwgdGFyZ2V0KSB7Ci0gICAgZm9yIChp
ID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewotICAgICAgICB0YXJnZXRbaV0gPSBzb3Vy
Y2VbaV07Ci0gICAgfQordmFyIGNvdW50ID0gMTAwOworCit2YXIgb25lcyA9IFtdOworZm9yICh2
YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCW9uZXMucHVzaChuZXcgTnVtYmVyKDEpKTsKKwor
dmFyIHR3b3MgPSBbXTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwl0d29zLnB1
c2gobmV3IE51bWJlcigyKSk7CisKK3ZhciBhcnJheSA9IFtdOworZm9yICh2YXIgaSA9IDA7IGkg
PCBjb3VudDsgKytpKSB7CisJYXJyYXkucHVzaChvbmVzW2ldKTsKKwlhcnJheS5wdXNoKHR3b3Nb
aV0pOwogfQogCi12YXIgYXJyID0gW107Ci1hcnJbMF0gPSBuZXcgTnVtYmVyKDEpOwotYXJyWzFd
ID0gbmV3IE51bWJlcigyKTsKLWFyclsyXSA9IG5ldyBOdW1iZXIoMSk7Ci1hcnJbM10gPSBuZXcg
TnVtYmVyKDIpOwotCi12YXIgc29ydEFyciA9IFtdOwotY2xvbmUoYXJyLCBzb3J0QXJyKTsKLXNv
cnRBcnIuc29ydChmdW5jdGlvbihhLGIpIHsgcmV0dXJuIGEgLSBiOyB9KTsKLQotc2hvdWxkQmUo
J2FyclswXScsICdzb3J0QXJyWzBdJyk7Ci1zaG91bGRCZSgnYXJyWzFdJywgJ3NvcnRBcnJbMl0n
KTsKLXNob3VsZEJlKCdhcnJbMl0nLCAnc29ydEFyclsxXScpOwotc2hvdWxkQmUoJ2FyclszXScs
ICdzb3J0QXJyWzNdJyk7Ci0KLS8vIEp1c3QgdHJ5IGFnYWluLi4uCi1zb3J0QXJyLnNvcnQoZnVu
Y3Rpb24oYSxiKSB7IHJldHVybiBhIC0gYjsgfSk7Ci1zaG91bGRCZSgnYXJyWzBdJywgJ3NvcnRB
cnJbMF0nKTsKLXNob3VsZEJlKCdhcnJbMV0nLCAnc29ydEFyclsyXScpOwotc2hvdWxkQmUoJ2Fy
clsyXScsICdzb3J0QXJyWzFdJyk7Ci1zaG91bGRCZSgnYXJyWzNdJywgJ3NvcnRBcnJbM10nKTsK
K2FycmF5LnNvcnQoZnVuY3Rpb24oYSxiKSB7IHJldHVybiBhIC0gYjsgfSk7Citmb3IgKHZhciBp
ID0gMDsgaSA8IGNvdW50OyArK2kpCisJc2hvdWxkQmUoJ2FycmF5W2ldJywgJ29uZXNbaV0nKTsK
KworZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCXNob3VsZEJlKCdhcnJheVtjb3Vu
dCArIGldJywgJ3R3b3NbaV0nKTsK
</data>
<flag name="review"
          id="276350"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>