1 Introduction

Update of explore-JULES-ES-1p0.Rmd that uses the new packages and functions

We build and test gaussian process emulators, perform a sensitivity analyis, and constrain the input space of Jules.

Andy thinks there might be mileage in analysing the atmospheric growth, which is here. /home/h01/hadaw/Research/ES_PPE/Oct20

At the moment, this vignette is hampered by the fact that emulators are failing on a few of the outputs which represent change over the historical period. The emulator is fine for predicting absolute values in the modern period.

Andy would like to see timeseries of: cVeg, cSoil and nbp, npp in GtC and GtC/yr.

1.1 Preliminaries

Load libraries, functions and data.

1.2 Carbon budget data

Section 2.5 in Friedlingstein et al. describes how the land carbon sink is estimated.

1.2.1 Variables available for analysis

Load a single ensemble member to examine contents

1.3 Plot timeseries of aggregated global timeseries

1.4 Where did the model fail to run?

(“probability of run failure” Could be an interesting project - logit transformation for probability of run failure? Some other ML like SVM?

There are clear run failure thresholds in the parameters rootd_ft_io and lai_max, and quite strong visual indications that a_wl_io and bio_hum_cn matter.

NEXT, histograms of failure with the LHS value

Could try an SVM, logistic regression or similar.

1.5 Testing Gaussian Process emulators

1.5.1 NPP as a test

First, use mean NPP as an example. How does NPP respond to each parameter? NAs are removed, but zero values are still included.

1.6 Relationship between modern NPP and change since 1850.

Some outputs (e.g fLuc, fHarvest) have an almost perfect 1:1 relationship between modern value and change, some (nbp, npp, treeFrac) quite or moderately strong, and some (csoil, cveg) very weak or non-existant.

1.7 A clear threshold in the F0 parameter for NPP

It appears that this ensemble is less “clear cut” in having an output that clearly distinguishes between “failed” (or close to it), and “not failed”.

Having said that, having an F0 over a threshold seems to kill the carbon cycle, as before. Here, we’ve set a threshold of 0.9 (on the normalised scale) for F0, and we remove members of the ensemble with a larger F0 than that when we build emulators.

[1] \nbp_lnd_sum\
[1] \Carbon Mass Flux out of Atmosphere Due to Net Biospheric Production on Land\
[1] \year\
[1] \year\
[1] \nbp_lnd_mean\
[1] \Carbon Mass Flux out of Atmosphere Due to Net Biospheric Production on Land\
[1] \fLuc_lnd_sum\
[1] \Net Carbon Mass Flux into Atmosphere Due to Land-Use Change\
[1] \fLuc_lnd_mean\
[1] \Net Carbon Mass Flux into Atmosphere Due to Land-Use Change\
[1] \npp_nlim_lnd_sum\
[1] \Net Primary Production on Land as Carbon Mass Flux\
[1] \npp_nlim_lnd_mean\
[1] \Net Primary Production on Land as Carbon Mass Flux\
[1] \cSoil_lnd_sum\
[1] \carbon mass in model soil pool\
[1] \cSoil_lnd_mean\
[1] \carbon mass in model soil pool\
[1] \cVeg_lnd_sum\
[1] \carbon mass in vegetation\
[1] \cVeg_lnd_mean\
[1] \carbon mass in vegetation\
[1] \landCoverFrac_lnd_sum\
[1] \Plant Functional Type Grid Fraction\
[1] \landCoverFrac_lnd_mean\
[1] \Plant Functional Type Grid Fraction\
[1] \fHarvest_lnd_sum\
[1] \Carbon Mass Flux into Atmosphere Due to Crop Harvesting\
[1] \fHarvest_lnd_mean\
[1] \Carbon Mass Flux into Atmosphere Due to Crop Harvesting\
[1] \lai_lnd_sum\
[1] \leaf area index\
[1] \lai_lnd_mean\
[1] \leaf area index\
[1] \rh_lnd_sum\
[1] \Total Heterotrophic Respiration on Land as Carbon Mass Flux\
[1] \rh_lnd_mean\
[1] \Total Heterotrophic Respiration on Land as Carbon Mass Flux\
[1] \treeFrac_lnd_sum\
[1] \Fractional cover of each surface type\
[1] \treeFrac_lnd_mean\
[1] \Fractional cover of each surface type\
[1] \c3PftFrac_lnd_sum\
[1] \Percentage Cover by C3 Plant Functional Type\
[1] \c3PftFrac_lnd_mean\
[1] \Percentage Cover by C3 Plant Functional Type\
[1] \c4PftFrac_lnd_sum\
[1] \Percentage Cover by C3 Plant Functional Type\
[1] \c4PftFrac_lnd_mean\
[1] \Percentage Cover by C3 Plant Functional Type\
[1] \shrubFrac_lnd_sum\
[1] \Percentage Cover by Shrub\
[1] \shrubFrac_lnd_mean\
[1] \Percentage Cover by Shrub\
[1] \baresoilFrac_lnd_sum\
[1] \Bare Soil Percentage Area Coverage\
[1] \baresoilFrac_lnd_mean\
[1] \Bare Soil Percentage Area Coverage\
[1] \residualFrac_lnd_sum\
[1] \Percentage of Grid Cell That Is Land but neither Vegetation Covered nor Bare Soil\
[1] \residualFrac_lnd_mean\
[1] \Percentage of Grid Cell That Is Land but neither Vegetation Covered nor Bare Soil\

1.8 Re-examine bwl_io

A closer look at bwl_io now that the impact of f0_io has been removed shows a large number of “zero” NPP when bwl_io is at low values, which could well be the source of apparent sensitivity.

Take only higher values of bwl_io for the next round of constraints.

2 History matching and generation of new ensemble members

To use History Matching, we need to specify targets for various model outputs. We treat these targets as “observations” with an uncertainty where a model run marked as “implausible” (beyond 3sd) matches the hard boundaries previously identified by A. Wiltshire as being desirable.

Choose the centre of the (implied) uniform distribution. cs_gb.target = (3000 - 750) / 2 = 1125 cv.target = (800 - 300) / 2 = 250 npp_n_gb.target = (80 - 35) / 2 = 22.5

nbp.target = 0 (gpp.target = 75) (runoff.target = 1)

(to do: visualise implausibility of design and loo emulated values of design as histogram)

2.1 visualise the constraints

2.2 Timeseries that match the constraints.

Plot the original ensemble, plus the stuff that matches the constraints. Include anomalies. “Level 2” constraints are broad constraints produced by AW

2.3 Pairs plots of level 2 input space

These are inputs that match the level 2 constraints. Only 37 of the original 500 members match these constraints. It’s noticable how wide a region of parameter space these still come from.

We find that adding a constraint to level 2 constrains the behaviour of the soil carbon pool, but not the vegetation carbon pool. Probably not a surprise, given the Soil Carbon pool (and changes) are much larger than the vegetation carbon pool.

2.4 Emulated density pairs plot of input space that matches level 2 constraints

2.5 Constrain with Cumulative NBP

Email from ER:

Hello,

I’ve had a look for some multi-model ranges…

From the ILAMB CMIP6 pages. NBP accumulated between 1959 and 2014: (227 INM) -16.3 Gt to +106 Gt GPP 1980-2014 mean: 104-144 Gt/yr (157 INM, 159 BCC) cVeg 1996-2006 mean: 338-582 Gt (635 INM) cSoil 2000-2001 mean: 319-1760 Gt

From Spencer’s recent paper about a subset of CMIP6 models. NBP 2000-2009 mean: 0.45-2.24 Gt/yr

From Trendy 2019 ensemble, all are 1985-2014 means. NBP: 0.21-1.82 Gt/yr GPP: 107-165 Gt/yr cVeg: 335-869 Gt cSoil: 626-3595 Gt

I can update the Trendy results to the latest 2020 version and/or change the meaning period if needed.

Cheers, Eddy.

If we constrain on cumulative NBP that matched ILAMB 1959 - 2013 (the latest year in the record, we choose those ensemble members which have the lowest cumulative NBP. Many ensemble members have a higher cumulative NBP.)

newdata not named: newdata's variables are inherited from the designnewdata not named: newdata's variables are inherited from the designnewdata not named: newdata's variables are inherited from the designnewdata not named: newdata's variables are inherited from the design
[1] 13.25

2.6 How do we find outputs that are inconsistent?

It’s clear that something rules out all the “good” values of cumulative_nbp. Which output is it?

  1. There is a very strong relationship (almost 1:1) between nbp_lnd_sum and cumulative_nbp. The cumulative NBP constraint keeps the ‘modern’ nbp low, while Andy’s constraints do not.

  2. All the cumulative NBP-constrained ensemble members have low modern vegetation carbon

  3. Modern NPP and soil carbon #

2.7 Augment the design.

The function addNroyDesignPoints builds an emulator for each model output in Y. It compares the output of each emulator at a number of candidate desin points, and chooses a space-filling set of them that that are Not Ruled Out Yet (statistically close to the observation at Y_target).

2.8 Write the augmented design

The function write_jules_design here simply takes the points calculated by addNroyDesignPoints and writes them to configuration files.

2.9 Check the design

Check that the augmented design produces what we expect. New ensemble members should be somewhat constrained within the boundaries of the original design, if the comparison to data offers any constraint.

Visualise the predicted outputs at the NROY points of the old design, and the new suggested design.

2.10 Visualising the emulated outputs at the proposed new design points.

Interestingly, these aren’t perfectly within the original hard boundaries set by Andy, even though I’ve set those boundaries to be the +- 4 standard deviation threholds in the History Match. I suggest this is because there is model discrepancy, and that there is considerable wriggle room induced from emulator uncertainty.

In particular, it appears that vegetation carbon is difficult to keep high, and that many NROY proposed members have a fairly low vegetation carbon. This might need a discrepancy term, or adjusting in some other way. It certainly needs exploring, and a OAAT plot might give clues as to the parameters to choose.

2.11 Atmospheric growth

We can calculate the atmospheric growth as Fossil fuel emissions (GCB) - Ocean uptake (GCB) - net land flux (JULES NBP)

Conversely, we can calculate the land uptake as NBP = FF - ocean - ag (Do we have AG in JULES?)

some values will be clipped
null device 
          1 

2.11.1 another way to calclulate atmospheric growth

These two methods give very similar outcomes, bar an outlier.

2.11.2 Land carbon Sink?

I think to make a fair comparison, we might need to take the diff of the anomaly (or just the timeseries), as the above represents the total change since 1850, and I think all the “land sink” stuff looks at the year-to-year changes.

2.11.3 Identify parts of parameter space where the land carbon sink is at its maximum

What do these parts of parameter space tell us about what we need to do to have the model reproduce reality?

2.11.4 what parts of parameter space are the closest?

How good are the four emulators that we’ve built? Are there biases? (there’s no real evidence of this)

What do the emulators make of the design points which actually make Andy’s “hard boundary” criteria? If we leave them out, do they still place the output within the hard boundaries?

2.12 Check the emulators that produce the new design

Do a leave-one-out cross validation of points inside the hard boundaries using the wave1 fits.

Error: object 'pred_unif' not found

We see in the leave-one-out analysis that the emulator is consistently under-predicting the vegetation carbon (though the uncertainty estimate often covers the actual value).This suggests (1) that there isn’t really a huge problem with a model discrepancy (or at least that isn’t the only problem), and (2) the history matching is working as it should, and taking into account a not-great emulator.

2.13 Compare the straight km with a two-step emulator

Is a two-step emulator any better at emulating those crucial points which fall within aw’s hard boundaries? First, create a list of emulator fits.

It doesn’t appear that the two-step emulator (here plotted in red) is doing any better than the regular emulator.

Two other things I can think of to check: 1) how about using “multistart” to choose different starting conditions for optimising the emulators and 2) Using a flat prior for the mean function rather than a linear prior.

3 Exploring new constraints

Input from Eddy Robertson:

“We can assume that the majority of vegetation carbon is stored in tree trunks so, the carbon density of trees is approximately (cVeg_lnd_mean / treeFrac_lnd_mean). Although I suppose it’s possible that in the PPE the shrubs have become tree-like, so it might be interesting to plot cVeg_lnd_mean versus (shrubFrac_lnd_mean + treeFrac_lnd_mean) as well. The first question is whether cVeg_lnd_mean increases linearly with treeFrac_lnd_mean. Then if this turned out to be interesting, we could produce a treeCVeg_lnd_mean output.”

Is the range of carbon densities narrower in the “hard boundary” set?

3.1 Now that we have constraints, we can explore their effect on the output

3.2 How much does constraining an output constrain other outputs?

For example, what effect has the AW “hard boundary” constraint produced on ranges of the other (marginal) outputs? Which constraint is doing the majority of the work?

A function to find the proportion of output space that is removed (or retained) when applying a constraint.

All constraints together take the normalized range of all the outputs to a little under a half of the original range, on average. Of course, four of the inputs are constrained here, which has quite a large impact.

We can see what impacts the constraints have individually

The NBP constraint has no marginal impact

Vegetation carbon (cVeg) has the strongest impact on everything else. This is no suprise, given that so few of the ensemble members seem to simulate carbon vegetation high enough.

3.3 Writing robust, parallelised, multistart emulators

4 Direct twoStep emulator using foreach

LS0tCnRpdGxlOiAiU2Vuc2l0aXZpdHkgYW5hbHlzaXMgYW5kIGNvbnN0cmFpbnQgb2YgdGhlIHBhcmFtZXRlciBzcGFjZSBvZiBFYXJ0aCBTeXN0ZW0gY29uZmlndXJhdGlvbiBvZiBKVUxFUyIKYXV0aG9yOiAiRG91ZyBNY05lYWxsIgpkYXRlOiAiMjQvMDMvMjAyMSIKb3V0cHV0OiAKICAgIGh0bWxfbm90ZWJvb2s6CiAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgICAgICAgdG9jX2RlcHRoOiAzCiAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCi0tLQoKIyBJbnRyb2R1Y3Rpb24KVXBkYXRlIG9mIGV4cGxvcmUtSlVMRVMtRVMtMXAwLlJtZCB0aGF0IHVzZXMgdGhlIG5ldyBwYWNrYWdlcyBhbmQgZnVuY3Rpb25zCgpXZSBidWlsZCBhbmQgdGVzdCBnYXVzc2lhbiBwcm9jZXNzIGVtdWxhdG9ycywgcGVyZm9ybSBhIHNlbnNpdGl2aXR5IGFuYWx5aXMsIGFuZCBjb25zdHJhaW4gdGhlIGlucHV0IHNwYWNlIG9mIEp1bGVzLgoKCkFuZHkgdGhpbmtzIHRoZXJlIG1pZ2h0IGJlIG1pbGVhZ2UgaW4gYW5hbHlzaW5nIHRoZSBhdG1vc3BoZXJpYyBncm93dGgsIHdoaWNoIGlzIGhlcmUuCi9ob21lL2gwMS9oYWRhdy9SZXNlYXJjaC9FU19QUEUvT2N0MjAKICAKQXQgdGhlIG1vbWVudCwgdGhpcyB2aWduZXR0ZSBpcyBoYW1wZXJlZCBieSB0aGUgZmFjdCB0aGF0IGVtdWxhdG9ycyBhcmUgZmFpbGluZyBvbiBhIGZldyBvZiB0aGUgb3V0cHV0cyB3aGljaCByZXByZXNlbnQgY2hhbmdlIG92ZXIgdGhlIGhpc3RvcmljYWwgcGVyaW9kLiBUaGUgZW11bGF0b3IgaXMgZmluZSBmb3IgcHJlZGljdGluZyBhYnNvbHV0ZSB2YWx1ZXMgaW4gdGhlIG1vZGVybiBwZXJpb2QuCgpBbmR5IHdvdWxkIGxpa2UgdG8gc2VlIHRpbWVzZXJpZXMgb2Y6CmNWZWcsIGNTb2lsIGFuZCBuYnAsIG5wcCBpbiBHdEMgYW5kIEd0Qy95ci4KCiMjIFByZWxpbWluYXJpZXMKTG9hZCBsaWJyYXJpZXMsIGZ1bmN0aW9ucyBhbmQgZGF0YS4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30KIyBMb2FkIGhlbHBlciBmdW5jdGlvbnMKCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucGF0aCA9ICJmaWdzLyIsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5ncyA9IEZBTFNFKQoKIyBsb2FkIGhlbHBlciBmdW5jdGlvbnMsIGRhdGEgYW5kIGRvIHByZWxpbWluYXJ5IHByb2Nlc3Npbmcgb2YgdGhlIGVuc2VtYmxlLgpzb3VyY2UoJ0pVTEVTLUVTLTFwMC1jb21tb24uUicpCmBgYAoKCgojIyBDYXJib24gYnVkZ2V0IGRhdGEKCltTZWN0aW9uIDIuNSBpbiBGcmllZGxpbmdzdGVpbiBldCBhbC5dKGh0dHBzOi8vZXNzZC5jb3Blcm5pY3VzLm9yZy9hcnRpY2xlcy8xMi8zMjY5LzIwMjAvI3NlY3Rpb24yKSBkZXNjcmliZXMgaG93IHRoZSBsYW5kIGNhcmJvbiBzaW5rIGlzIGVzdGltYXRlZC4KYGBge3IsIGhpc3RvcmljYWwtY2FyYm9uLWJ1ZGdldCwgd2FybmluZyA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQoKI3BkZihmaWxlID0gJ2NhcmJvbl9idWRnZXQucGRmJywgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKIyBRdWVzdGlvbjogSG93IGNsb3NlbHkgc2hvdWxkIG91ciBtb2RlbCBtYXRjaCB0aGlzIGN1cnZlPyBXaGljaCBvdXRwdXQ/CiMgKE15IGd1ZXNzIGlzICdUb3RhbCBMYW5kIENhcmJvbiBhbm9tYWx5JykKaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0IDwtIHJlYWRfZXhjZWwoJ0dsb2JhbF9DYXJib25fQnVkZ2V0XzIwMjB2MS4wLnhsc3gnLCBzaGVldCA9ICJIaXN0b3JpY2FsIEJ1ZGdldCIsIHNraXAgPSAxNSwgbl9tYXggPSAyNzApCgpwYXIobWZyb3cgPSBjKDMsMikpCnlsaW0gPSBjKC0xLCA2KQoKCmxhbmRfc2lua19uZXQgPC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kIHNpbmtgIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYAoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmAsIG1haW4gPSAnZm9zc2lsIGVtaXNzaW9ucyBleGNsdWRpbmcgY2FyYm9uYXRpb24nLCB5bGFiID0gJycsCiAgICAgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYCwgbWFpbiA9ICdsYW5kIHNpbmsnLCB5bGFiID0gJycsIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgbGFuZF9zaW5rX25ldCwgY29sID0gJ3JlZCcpCgpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSAnbGFuZCBzaW5rIC0gbGFuZCB1c2UgY2hhbmdlIGVtaXNzaW9ucycsIGNvbCA9ICdyZWQnLCBsdHkgPSAnc29saWQnKQoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYCwgbWFpbiA9ICdsYW5kIHVzZSBjaGFuZ2UgZW1pc3Npb25zJywKICAgICB5bGFiID0gJycsIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgpwbG90KGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyLCBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGF0bW9zcGhlcmljIGdyb3d0aGAsIG1haW4gPSAnYXRtb3NwaGVyaWMgZ3Jvd3RoJywgeWxhYiA9ICcnLAogICAgIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBvY2VhbiBzaW5rYCwgbWFpbiA9ICdvY2VhbiBzaW5rJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgYnVkZ2V0IGltYmFsYW5jZWAsIG1haW4gPSAnYnVkZ2V0IGltYmFsYW5jZScsIHlsYWIgPSAnJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCiNkZXYub2ZmKCkKYGBgCgoKIyMjIFZhcmlhYmxlcyBhdmFpbGFibGUgZm9yIGFuYWx5c2lzCgpMb2FkIGEgc2luZ2xlIGVuc2VtYmxlIG1lbWJlciB0byBleGFtaW5lIGNvbnRlbnRzCmBgYHtyLCBsb2FkLW91dHB1dC1lbnNlbWJsZX0KZW5zbWVtYmVyIDwtICdQMDAwMC8nCgpmbG9jIDwtIHBhc3RlMChlbnNsb2Nfd2F2ZTAwLGVuc21lbWJlcikKZm4gPC0gJ0pVTEVTLUVTLTFwMF9QMDAwMF9Bbm51YWxfZ2xvYmFsLm5jJwoKIyB0ZXN0IGZpbGUKbmMgPC0gbmNfb3BlbihwYXN0ZTAoZmxvYyxmbikpCgojIFdoYXQgdmFyaWFibGVzIGFyZSBpbiB0aGUgZmlsZT8gCnZhcmxpc3QgPC0gbmMuZ2V0LnZhcmlhYmxlLmxpc3QobmMpCgpmb3IoaSBpbiAxOmxlbmd0aCh2YXJsaXN0KSl7CiAgCiAgdmFyIDwtIHZhcmxpc3RbaV0KICBwcmludCh2YXIpCiAgcHJpbnQobmNhdHRfZ2V0KG5jLHZhciwibG9uZ19uYW1lIilbWzJdXSkKfQoKCmBgYAoKCiMjIFBsb3QgdGltZXNlcmllcyBvZiBhZ2dyZWdhdGVkIGdsb2JhbCB0aW1lc2VyaWVzIAoKCmBgYHtyIHBsb3QtY2FyYm9uLWN5Y2xlLXRpbWVzZXJpZXMtcHJpbWFyeSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCiNwZGYoZmlsZSA9ICdmaWdzL3Bsb3QtY2FyYm9uLWN5Y2xlLXRpbWVzZXJpZXMtcHJpbWFyeS0xLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyKQpwYXIobWZyb3c9IGMoMyw0KSwgbGFzID0gMSkKCnBsb3Rjb2wgPC0gYyhtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgNzApKQoKeWxpbSA9IHJhbmdlKGMobnBwX2Vuc1ssMV0sIG5wcF9lbnNbLDE2NF0pKQptYXRwbG90KHllYXJzLCB0KG5wcF9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdOUFAnLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IHJhbmdlKGMoY1NvaWxfZW5zWywxXSwgY1NvaWxfZW5zWywxNjRdKSkKbWF0cGxvdCh5ZWFycywgdChjU29pbF9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdTb2lsIENhcmJvbicseGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShjKGNWZWdfZW5zWywxXSwgY1ZlZ19lbnNbLDE2NF0pKQptYXRwbG90KHllYXJzLCB0KGNWZWdfZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnVmVnZXRhdGlvbiBDYXJib24nLHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UodG90YWxfbGFuZF9jYXJib25fZW5zKQptYXRwbG90KHllYXJzLCB0KHRvdGFsX2xhbmRfY2FyYm9uX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsIAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdUb3RhbCBMYW5kIENhcmJvbicseGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCgp5bGltID0gcmFuZ2UobGFpX2xuZF9tZWFuX2VucykKbWF0cGxvdCh5ZWFycywgdChsYWlfbG5kX21lYW5fZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0xBSScsIG1haW4gPSAnTGVhZiBhcmVhIGluZGV4Jyx4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IHJhbmdlKHRyZWVGcmFjX2xuZF9tZWFuX2VucykKbWF0cGxvdCh5ZWFycywgdCh0cmVlRnJhY19sbmRfbWVhbl9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnZnJhY3Rpb24nLCBtYWluID0gJ1RyZWUgZnJhY3Rpb24nLHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2Uoc2hydWJGcmFjX2xuZF9tZWFuX2VucykKbWF0cGxvdCh5ZWFycywgdChzaHJ1YkZyYWNfbG5kX21lYW5fZW5zICksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdmcmFjdGlvbicsIG1haW4gPSAnU2hydWIgZnJhY3Rpb24nLHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gYygwLDEwMCkKbWF0cGxvdCh5ZWFycywgdChiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zICksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdmcmFjdGlvbicsIG1haW4gPSAnYmFyZSBzb2lsIGZyYWN0aW9uJyx4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IGMoLTEwLCAxMCkKbWF0cGxvdCh5ZWFycywgdChuYnBfZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwgCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05CUCcsIHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCiAgCnlsaW0gPSByYW5nZShyaF9sbmRfc3VtX2VucykKbWF0cGxvdCh5ZWFycywgdChyaF9sbmRfc3VtX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMveWVhcicsIG1haW4gPSAnSGV0ZXJvdHJvcGhpYyBSZXNwaXJhdGlvbicsIHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UoZkx1Y19sbmRfc3VtX2VucykKbWF0cGxvdCh5ZWFycywgdChmTHVjX2xuZF9zdW1fZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0Qy95ZWFyJywgbWFpbiA9ICdMYW5kIHVzZSBjaGFuZ2UgZW1pc3Npb25zJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShmSGFydmVzdF9sbmRfc3VtX2VucykKbWF0cGxvdCh5ZWFycywgdChmSGFydmVzdF9sbmRfc3VtX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMveWVhcicsIG1haW4gPSAnSGFydmVzdCBDIGZsdXggdG8gYXRtb3NwaGVyZScsIHhsYWIgPSAnJywKICAgICAgICBidHkgPSAnbicpCgojZGV2Lm9mZigpCgpgYGAKCgpgYGB7ciBwbG90LWNhcmJvbi1jeWNsZS1hbm9tYWx5LXRpbWVzZXJpZXMsIGZpZy53aWR0aCA9IDksIGZpZy5oZWlnaHQgPSA2fQoKcGFyKG1mcm93PSBjKDEsNCksIGxhcyA9IDEpCgojIHlsaW0gPSByYW5nZSgtMTAsIDEwKQojbWF0cGxvdCh5ZWFycywgdChuYnBfZW5zX2Fub20pLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAojICAgICAgICB5bGFiID0gJ05CUCBzdW0gQW5vbWFseScsIG1haW4gPSAnTkJQIEFub21hbHknLAojICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UoYyhucHBfZW5zX2Fub21bLDFdLCBucHBfZW5zX2Fub21bLDE2NF0pKQptYXRwbG90KHllYXJzLCB0KG5wcF9lbnNfYW5vbSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdOUFAgc3VtIEFub21hbHknLCBtYWluID0gJ05QUCBBbm9tYWx5JywKICAgICAgICBidHkgPSAnbicpCgp5bGltID0gcmFuZ2UoYyhjU29pbF9lbnNfYW5vbVssMV0sIGNTb2lsX2Vuc19hbm9tWywxNjRdKSkKbWF0cGxvdCh5ZWFycywgdChjU29pbF9lbnNfYW5vbSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1NvaWwgQ2FyYm9uIEFub21hbHknLAogICAgICAgIGJ0eSA9ICduJykKCnlsaW0gPSByYW5nZShjKGNWZWdfZW5zX2Fub21bLDFdLCBjVmVnX2Vuc19hbm9tWywxNjRdKSkKbWF0cGxvdCh5ZWFycywgdChjVmVnX2Vuc19hbm9tKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnVmVnZXRhdGlvbiBDYXJib24gQW5vbWFseScsCiAgICAgICAgYnR5ID0gJ24nKQoKeWxpbSA9IHJhbmdlKHRvdGFsX2xhbmRfY2FyYm9uX2Fub20pCm1hdHBsb3QoeWVhcnMsIHQodG90YWxfbGFuZF9jYXJib25fYW5vbSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1RvdGFsIExhbmQgQ2FyYm9uIEFub21hbHknLAogICAgICAgIGJ0eSA9ICduJykKCgpgYGAKCgoKIyMgV2hlcmUgZGlkIHRoZSBtb2RlbCBmYWlsIHRvIHJ1bj8KKCJwcm9iYWJpbGl0eSBvZiBydW4gZmFpbHVyZSIgQ291bGQgYmUgYW4gaW50ZXJlc3RpbmcgcHJvamVjdCAtIGxvZ2l0IHRyYW5zZm9ybWF0aW9uIGZvciBwcm9iYWJpbGl0eSBvZiBydW4gZmFpbHVyZT8gU29tZSBvdGhlciBNTCBsaWtlIFNWTT8KClRoZXJlIGFyZSBjbGVhciBydW4gZmFpbHVyZSB0aHJlc2hvbGRzIGluIHRoZSBwYXJhbWV0ZXJzIHJvb3RkX2Z0X2lvIGFuZCBsYWlfbWF4LCBhbmQgcXVpdGUgc3Ryb25nIHZpc3VhbCBpbmRpY2F0aW9ucyB0aGF0IGFfd2xfaW8gYW5kIGJpb19odW1fY24gbWF0dGVyLgoKCk5FWFQsIGhpc3RvZ3JhbXMgb2YgZmFpbHVyZSB3aXRoIHRoZSBMSFMgdmFsdWUKYGBge3IgcnVuLWZhaWx1cmUtcGFpcnMsIGZpZy53aWR0aCA9IDExLCBmaWcuaGVpZ2h0ID0gMTF9CgojIE5CLCBwbG90dGluZyB0aGUgaW52ZXJzZSBvZiB0aGlzIGRvZXNuJ3QgZ2l2ZSB5b3UgbXVjaCBpbmZvcm1hdGlvbgojcGRmKGZpbGUgPSAnZmlncy9ydW4tZmFpbHVyZS1wYWlycy5wZGYnLCB3aWR0aCA9IDExLCBoZWlnaHQgPSAxMSkKI3NpbXBsZSB3YXkKI3Bhcih4cGQgPSBUUlVFKQpwYWlycyhYX25sZXZlbDAsIAogICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBsYWJlbHMgPSAxOmQsCiAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgncmVkJywgMTUwKSwKICAgICAgZ2FwID0gMCwKICAgICAgcGNoID0gMjAsCiAgICAgIHhheHQgPSduJywgeWF4dCA9ICduJywKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMLAogICAgICBvbWEgPSBjKDAuNSwgMC41LCAwLjUsIDAuNSkpCgpyZXNldCgpCgpsZWdlbmQoJ2xlZnQnLCBsZWdlbmQgPSBwYXN0ZSgxOmQsIGNvbG5hbWVzKGxocykpLCBjZXggPSAxLjIsIGJ0eSA9ICduJykKCiNkZXYub2ZmKCkKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgojcGRmKGZpbGUgPSAnZmlncy9ydW4tZmFpbHVyZS1oaXN0cy5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSA4KQoKcGFyKG1mcm93ID0gYyg0LCA4KSwgbWFyID0gYyg0LDMsMiwxKSkKCmZvcihpIGluIDE6ZCl7CiAgCiAgaGlzdChYX25sZXZlbDBbLGldLCB4bGltID0gYygwLDEpLCBicmVha3MgPSBzZXEoZnJvbT0wLCB0byA9IDEsIGJ5ID0gMC4xKSwgY29sID0gJ2dyZXknLCBtYWluID0gJycsIHlsaW0gPSBjKDAsOSksCiAgICAgICBib3JkZXIgPSAnd2hpdGUnLCB4bGFiID0gY29sbmFtZXMoWF9ubGV2ZWwwKVtpXSwgeWxhYiA9ICcnLCBsYXMgPSAxLCBjZXgubGFiID0gMS41KQp9CgojZGV2Lm9mZigpCgpgYGAKCkNvdWxkIHRyeSBhbiBTVk0sIGxvZ2lzdGljIHJlZ3Jlc3Npb24gb3Igc2ltaWxhci4KCgojIyBUZXN0aW5nIEdhdXNzaWFuIFByb2Nlc3MgZW11bGF0b3JzCgoKIyMjIE5QUCBhcyBhIHRlc3QKRmlyc3QsIHVzZSBtZWFuIE5QUCBhcyBhbiBleGFtcGxlLiBIb3cgZG9lcyBOUFAgcmVzcG9uZCB0byBlYWNoIHBhcmFtZXRlcj8gTkFzIGFyZSByZW1vdmVkLCBidXQgemVybyB2YWx1ZXMgYXJlIHN0aWxsIGluY2x1ZGVkLgoKYGBge3IgcGxvdC1ucHAtbW9kZXJuLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKeV9sZXZlbDAgPC0gWV9sZXZlbDBbLCducHBfbmxpbV9sbmRfc3VtJ10KCnBhcihtZnJvdyA9IGMoNSw3KSwgbWFyID0gYygzLDEsMywxKSwgb21hID0gYygxLDEsNSwxKSkKZm9yKGkgaW4gMTpwKXsKICBwbG90KFhfbGV2ZWwwWyxpXSwgeV9sZXZlbDAsIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gY29sbmFtZXMoWF9sZXZlbDApW2ldKQp9Cm10ZXh0KCdOUFAnLCBvdXRlciA9IFRSVUUsIHNpZGUgPSAzLCBjZXggPSAyLCBsaW5lID0gMikKCmBgYAoKCmBgYHtyIHBsb3QtbnBwLWNoYW5nZSwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCnlhbm9tX2xldmVsMCA8LSBZQW5vbV9sZXZlbDBbLCducHBfbmxpbV9sbmRfc3VtJ10KCnBhcihtZnJvdyA9IGMoNSw3KSwgbWFyID0gYygzLDEsMywxKSwgb21hID0gYygxLDEsNSwxKSkKZm9yKGkgaW4gMTpwKXsKICBwbG90KFhfbGV2ZWwwWyxpXSwgeWFub21fbGV2ZWwwLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IGNvbG5hbWVzKFhfbGV2ZWwwKVtpXSkKfQptdGV4dCgnTlBQIGNoYW5nZSBvdmVyIHRpbWUnLCBvdXRlciA9IFRSVUUsIHNpZGUgPSAzLCBjZXggPSAyLCBsaW5lID0gMikKCmBgYAoKCiMjIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVybiBOUFAgYW5kIGNoYW5nZSBzaW5jZSAxODUwLgoKU29tZSBvdXRwdXRzIChlLmcgZkx1YywgZkhhcnZlc3QpIGhhdmUgYW4gYWxtb3N0IHBlcmZlY3QgMToxIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVybiB2YWx1ZSBhbmQgY2hhbmdlLCBzb21lICAobmJwLCBucHAsIHRyZWVGcmFjKSBxdWl0ZSBvciBtb2RlcmF0ZWx5IHN0cm9uZywgYW5kIHNvbWUgKGNzb2lsLCBjdmVnKSB2ZXJ5IHdlYWsgb3Igbm9uLWV4aXN0YW50LgpgYGB7ciBucHAtbW9kZXJuLXZzLWNoYW5nZSwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKcGFyKG1mcm93ID0gYyg0LDcpLCBtYXIgPSBjKDMsMSwzLDEpLCBvbWEgPSBjKDQsNSwxLDEpKQoKcGRhc2ggPC0gbmNvbChZX2xldmVsMCkKCmZvcihpIGluIDE6cGRhc2gpewogIAogIHlfbGV2ZWwwIDwtIFlfbGV2ZWwwWyxpXQogIHlhbm9tX2xldmVsMCA8LSBZQW5vbV9sZXZlbDBbLGldCiAgCiAgcGxvdCh5X2xldmVsMCwgeWFub21fbGV2ZWwwLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IGNvbG5hbWVzKFlfbGV2ZWwwKVtpXSkKfQoKbXRleHQodGV4dCA9ICdNb2Rlcm4gdmFsdWUnLCBzaWRlID0gMSwgbGluZSA9IDIsIG91dGVyID0gVFJVRSwgY2V4ID0gMikKbXRleHQodGV4dCA9ICdDaGFuZ2UnLCBzaWRlID0gMiwgbGluZSA9IDIsIG91dGVyID0gVFJVRSwgY2V4ID0gMikKCmBgYAoKCgojIyBBIGNsZWFyIHRocmVzaG9sZCBpbiB0aGUgRjAgcGFyYW1ldGVyIGZvciBOUFAKSXQgYXBwZWFycyB0aGF0IHRoaXMgZW5zZW1ibGUgaXMgbGVzcyAiY2xlYXIgY3V0IiBpbiBoYXZpbmcgYW4gb3V0cHV0IHRoYXQgY2xlYXJseSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gImZhaWxlZCIgKG9yIGNsb3NlIHRvIGl0KSwgYW5kICJub3QgZmFpbGVkIi4KCkhhdmluZyBzYWlkIHRoYXQsIGhhdmluZyBhbiBGMCBvdmVyIGEgdGhyZXNob2xkIHNlZW1zIHRvIGtpbGwgdGhlIGNhcmJvbiBjeWNsZSwgYXMgYmVmb3JlLiBIZXJlLCB3ZSd2ZSBzZXQgYSB0aHJlc2hvbGQgb2YgMC45IChvbiB0aGUgbm9ybWFsaXNlZCBzY2FsZSkgZm9yIEYwLCBhbmQgd2UgcmVtb3ZlIG1lbWJlcnMgb2YgdGhlIGVuc2VtYmxlIHdpdGggYSBsYXJnZXIgRjAgdGhhbiB0aGF0IHdoZW4gd2UgYnVpbGQgZW11bGF0b3JzLgoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSA4fQoKcGFyKG1mcm93ID0gYygyLDEpKQpwbG90KGxocyRmMF9pbywgZGF0bWF0WywgJ25wcF9ubGltX2xuZF9zdW0nXSwgbWFpbiA9ICdNdWx0aXBsaWNhdGlvbiBmYWN0b3InLCB4bGFiID0gJ2YwX2lvJywgeWxhYiA9ICdOUFAgc3VtJykKcGxvdChYX2xldmVsMFssJ2YwX2lvJ10sIFlfbGV2ZWwwWywgJ25wcF9ubGltX2xuZF9zdW0nXSwgeGxhYiA9ICdmMF9pbycsIG1haW4gPSAnTm9ybWFsaXplZCcsIHlsYWIgPSAnTlBQIHN1bScpCmFibGluZSh2ID0gMC45KQoKYGBgCgoKCgpgYGB7ciBmYWlsdXJlLXBhaXJzLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIGZpZy5wYXRoPSdmaWdzLycsIGRldj1jKCdwbmcnLCAncGRmJyl9CgoKbG93X25wcF9peCA8LSB3aGljaChZWywnbnBwX25saW1fbG5kX3N1bSddIDwgMWU1KQojIGNvZGUgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODE4Mjg3Mi9ob3ctdG8tdXNlLWRpZmZlcmVudC1zZXRzLW9mLWRhdGEtaW4tbG93ZXItYW5kLXVwcGVyLXBhbmVsLW9mLXBhaXJzLWZ1bmN0aW9uLWluCgoKI1ggPC0gbWF0cml4KHJ1bmlmKDMwMCksIG5jb2w9MykKI1kgPC0gbWF0cml4KGMoc29ydChydW5pZigxMDAsIDAsIDEwKSksIAojICAgICAgICAgICAgICBzb3J0KHJ1bmlmKDEwMCwgMCwgMTApKSwgCiMgICAgICAgICAgICAgIHNvcnQocnVuaWYoMTAwLCAwLCAxMCkpKSwgbmNvbD0zKQoKI3BkZihmaWxlID0gJ2ZpZ3MvcnVuLWZhaWx1cmUtcGFpcnMucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTApCngxIDwtIFhbbG93X25wcF9peCwgXQp4MiA8LSBYX25sZXZlbDAKClhZIDwtIHJiaW5kKHgxLCB4MikKCgpwYWlycyhYWSwKICAgICAgbG93ZXIucGFuZWw9ZnVuY3Rpb24oeCwgeSwgLi4uKSB7CiAgICAgICAgWHggPC0geFtzZXFfbGVuKG5yb3coeDEpKV0gIyBjb3JyZXNwb25kcyB0byBYIHN1YnNldAogICAgICAgIFh5IDwtIHlbc2VxX2xlbihucm93KHgxKSldICMgY29ycmVzcG9uZHMgdG8gWCBzdWJzZXQKICAgICAgICAjdXNyIDwtIHBhcigidXNyIik7IG9uLmV4aXQocGFyKHVzcikpCiAgICAgICAgI3Bhcih1c3IgPSBjKHJhbmdlKHgxWywgLW5jb2woeDEpXSksIHJhbmdlKHgxWywgLTFdKSkpICMgc2V0IHVwIGxpbWl0cwogICAgICAgIHBvaW50cyhYeCwgWHksIGNvbCA9IHpibHVlLCBwY2ggPSAxOSwgY2V4ID0gMC44KQogICAgICAgIyBpZihwYXIoJ21mZycpWzJdID09IDEpIGF4aXMoMikgIyBpZiBsZWZ0IHBsb3QsIGFkZCBsZWZ0IGF4aXMKICAgICAgICAjaWYocGFyKCdtZmcnKVsxXSA9PSBuY29sKHgxKSkgYXhpcygxKSAjIGlmIGJvdHRvbSBwbG90IGFkZCBib3R0b20gYXhpcwogICAgICB9LCAKICAgICAgdXBwZXIucGFuZWw9ZnVuY3Rpb24oeCwgeSwgLi4uKSB7CiAgICAgICAgWXggPC0geFsobnJvdyh4MSkgKyAxKTpsZW5ndGgoeCldICMgWSBzdWJzZXQKICAgICAgICBZeSA8LSB5Wyhucm93KHgxKSArIDEpOmxlbmd0aCh5KV0gIyBZIHN1YnNldAogICAgICAgIAogICAgICAgICNjbnRyIDwtIG91dGVyKFl4LCBZeCwgRlVOPScqJykgIyBhcmJpdHJhcnkgZnVuY3Rpb24gZm9yIGNvbnRvdXIKICAgICAgICMgdXNyIDwtIHBhcigidXNyIik7IG9uLmV4aXQocGFyKHVzcikpCiAgICAgICAgI3Bhcih1c3IgPSBjKHJhbmdlKHgyWywgLTFdKSwgcmFuZ2UoeDJbLCAtbmNvbCh4MildKSkpICMgc2V0IHVwIGxpbWl0cwogICAgICAgIHBvaW50cyhZeCwgWXksIGNvbCA9IHpyZWQsIHBjaCA9IDE5LCBjZXggPSAwLjgpCiAgICAgICAgI2NvbnRvdXIoWXgsIFl5LCBjbnRyLCBhZGQ9VFJVRSkKICAgICAgICAjaWYocGFyKCdtZmcnKVsyXSA9PSBuY29sKHgyKSkgYXhpcyg0KSAjIGlmIHJpZ2h0IHBsb3QsIGFkZCByaWdodCBheGlzCiAgICAgICAgI2lmKHBhcignbWZnJylbMV0gPT0gMSkgYXhpcygzKSAjIGlmIHRvcCBwbG90LCBhZGQgdG9wIGF4aXMKICAgICAgfSwgCiAgICAgICN0aWNrPUZBTFNFLCAjIHN1cHByZXNzIHRoZSBkZWZhdWx0IHRpY2sgbWFya3MKICAgICAgI2xpbmU9MSwKICAgICAgZ2FwID0gMCwKICAgICAgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBvbWEgPSBjKDIsIDE4LCAyLCAyKSkgIyBtb3ZlIHRoZSBkZWZhdWx0IHRpY2sgbGFiZWxzIG9mZiB0aGUgcGxvdCAKCnJlc2V0KCkKCmxlZ2VuZCgnbGVmdCcsIGxlZ2VuZCA9IHBhc3RlKDE6ZCwgY29sbmFtZXMobGhzKSksIGNleCA9IDEuMSwgYnR5ID0gJ24nKQpsZWdlbmQoJ3RvcGxlZnQnLCBwY2ggPSAxOSwgY29sID0gYyggenJlZCwgemJsdWUpLCBsZWdlbmQgPSBjKCdmYWlsZWQnLCAnemVybyBjYXJib24gY3ljbGUnKSwgYnR5ID0gJ24nLCBpbnNldCA9IDAuMDIsIGNleCA9IDEuMSApCgojZGV2Lm9mZigpCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKI3BkZihmaWxlID0gJ2ZpZ3MvcnVuLWZhaWx1cmUtaGlzdHMucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOCkKCnBhcihtZnJvdyA9IGMoNCw4KSwgbWFyID0gYyg1LDMsMiwxKSkKCmZvcihpIGluIDE6ZCl7CiAgCiAgaGlzdCh4MVssaV0sIHhsaW0gPSBjKDAsMSksIGJyZWFrcyA9IHNlcShmcm9tPTAsIHRvID0gMSwgYnkgPSAwLjEpLCBjb2wgPSB6Ymx1ZSwgbWFpbiA9ICcnLCB5bGltID0gYygwLDUwKSwKICAgICAgIGJvcmRlciA9ICd3aGl0ZScsIHhsYWIgPSBjb2xuYW1lcyhYX25sZXZlbDApW2ldLCB5bGFiID0gJycsIGxhcyA9IDEsIGNleC5sYWIgPSAxLjUpCn0KCiAgIAojZGV2Lm9mZigpCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKI3BkZihmaWxlID0gJ2ZpZ3MvcnVuLWZhaWx1cmUtaGlzdHMucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOCkKCnBhcihtZnJvdyA9IGMoNCw4KSwgbWFyID0gYyg1LDMsMiwxKSkKCmZvcihpIGluIDE6ZCl7CiAgCmhpc3QoeDJbLGldLCB4bGltID0gYygwLDEpLGJyZWFrcyA9IHNlcShmcm9tPTAsIHRvID0gMSwgYnkgPSAwLjEpLCBjb2wgPSB6cmVkLCBib3JkZXIgPSAnd2hpdGUnLAogICAgICBtYWluID0gJycsIHhsYWIgPSBjb2xuYW1lcyhYX25sZXZlbDApW2ldLCB5bGFiID0gJycsIGxhcyA9IDEsIGNleC5sYWIgPSAxLjUpCiAgCn0KCgpgYGAKCgojIyBSZS1leGFtaW5lIGJ3bF9pbwpBIGNsb3NlciBsb29rIGF0IGJ3bF9pbyBub3cgdGhhdCB0aGUgaW1wYWN0IG9mIGYwX2lvIGhhcyBiZWVuIHJlbW92ZWQgc2hvd3MgYSBsYXJnZSBudW1iZXIgb2YgInplcm8iIE5QUCB3aGVuIGJ3bF9pbyBpcyBhdCBsb3cgdmFsdWVzLCB3aGljaCBjb3VsZCB3ZWxsIGJlIHRoZSBzb3VyY2Ugb2YgYXBwYXJlbnQgc2Vuc2l0aXZpdHkuCgpUYWtlIG9ubHkgaGlnaGVyIHZhbHVlcyBvZiBid2xfaW8gZm9yIHRoZSBuZXh0IHJvdW5kIG9mIGNvbnN0cmFpbnRzLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgpwIDwtIG5jb2woWF9sZXZlbDEpCgp5X2xldmVsMSA8LSBZX2xldmVsMVssJ25wcF9ubGltX2xuZF9zdW0nXQoKcGFyKG1mcm93ID0gYyg1LDcpLCBtYXIgPSBjKDMsMSwzLDEpKQpmb3IoaSBpbiAxOnApewogIHBsb3QoWF9sZXZlbDFbLGldLCB5X2xldmVsMSwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSBjb2xuYW1lcyhYX2xldmVsMSlbaV0pCn0KCmBgYAoKCgpgYGB7cn0KCiMgV3JpdGUgYW4gZW11bGF0b3Igd3JhcHBlcgoKIyBXcml0ZSBhIGxlYXZlLW9uZS1vdXQgd3JhcHBlcgoKIyBDcmVhdGUgYSBsaXN0IG9mIGVtdWxhdG9yIGZpdHMsIGZvciBib3RoIGttIGFuZCB0d29TdGVwIG1ldGhvZHMuCiMgVXNlIG1jbGFwcGx5IHRvIGJ1aWxkIHRoZSBsaXN0cwojIHVzZSBjb2RlIGZyb20gSERFIHBhY2thZ2UKIyBNYWtlIHN1cmUgZXJyb3JzIGFyZSBoYW5kbGVkIGFkZXF1YXRlbHkuCgoKIyBDYW4gd2Ugd3JpdGUgaXQgdG8gdXNlIGFueSBlbXVsYXRvcj8gKGkuZSBrbSwgdHdvc3RlcCwgc29tZXRoaW5nIGZyb20gYW5vdGhlciBwYWNrYWdlPykKYGBgCgoKIyBIaXN0b3J5IG1hdGNoaW5nIGFuZCBnZW5lcmF0aW9uIG9mIG5ldyBlbnNlbWJsZSBtZW1iZXJzClRvIHVzZSBIaXN0b3J5IE1hdGNoaW5nLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGFyZ2V0cyBmb3IgdmFyaW91cyBtb2RlbCBvdXRwdXRzLiBXZSB0cmVhdCB0aGVzZSB0YXJnZXRzIGFzICJvYnNlcnZhdGlvbnMiIHdpdGggYW4gdW5jZXJ0YWludHkgd2hlcmUgYSBtb2RlbCBydW4gbWFya2VkIGFzICJpbXBsYXVzaWJsZSIgKGJleW9uZCAzc2QpIG1hdGNoZXMgdGhlIGhhcmQgYm91bmRhcmllcyBwcmV2aW91c2x5IGlkZW50aWZpZWQgYnkgQS4gV2lsdHNoaXJlIGFzIGJlaW5nIGRlc2lyYWJsZS4KCkNob29zZSB0aGUgY2VudHJlIG9mIHRoZSAoaW1wbGllZCkgdW5pZm9ybSBkaXN0cmlidXRpb24uCiBjc19nYi50YXJnZXQgPSAoMzAwMCAtIDc1MCkgLyAyID0gIDExMjUKIGN2LnRhcmdldCA9ICg4MDAgLSAzMDApIC8gMiA9IDI1MAogbnBwX25fZ2IudGFyZ2V0ID0gKDgwIC0gMzUpIC8gMiA9IDIyLjUKCiBuYnAudGFyZ2V0ID0gMAogKGdwcC50YXJnZXQgPSA3NSkKIChydW5vZmYudGFyZ2V0ID0gMSkKIAoodG8gZG86IHZpc3VhbGlzZSBpbXBsYXVzaWJpbGl0eSBvZiBkZXNpZ24gYW5kIGxvbyBlbXVsYXRlZCB2YWx1ZXMgb2YgZGVzaWduIGFzIGhpc3RvZ3JhbSkgCgpgYGB7cn0KCiMgbmJwICBucHAgIGNzb2lsICBjdmVnCllfbG93ZXIgPC0gYygtMTAsIDM1LCA3NTAsIDMwMCkKWV91cHBlciA8LSBjKDEwLCA4MCwgMzAwMCwgODAwKQoKIyBJJ20gZ29pbmcgdG8gc2V0IGl0IHNvIHRoYXQgKyA0c2QgYWxpZ25zIGFwcHJveGltYXRlbHkgd2l0aCB0aGUgb3JpZ2luYWwgbGltaXRzCiMgZ2l2ZW4gYnkgQW5keSBXaWx0c2hpcmUuIFRoaXMgZ2l2ZXMgcm9vbSBmb3IgdW5jZXJ0YWludHkgZnJvbSB0aGUgZW11bGF0b3IKWV90YXJnZXQgPSBZX3VwcGVyIC0gKGFicyhZX3VwcGVyIC0gKFlfbG93ZXIpKSAvIDIgKSMgYWJzKCkgdG8gZml4IHRoZSBwcm9ibGVtIHdpdGggbmVnYXRpdmUgbnVtYmVycwoKCiMgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgbGltaXRzIGFuZCB0aGUgY2VudHJhbCB0YXJnZXQKIyAodGhpcyBkaXN0YW5jZSBpcyBhc3N1bWVkIHRvIGJlIDQgc3RhbmRhcmQgZGV2aWF0aW9ucy4KWV9zZCA9IChZX3VwcGVyIC0gWV90YXJnZXQpIC8gNApuYW1lcyhZX3NkKSA9IGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpCgoKcCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkKCm9ic19zZF9saXN0ID0gYXMubGlzdChyZXAoMC4wMSxwKSkKZGlzY19saXN0ID0gIGFzLmxpc3QocmVwKDAscCkpIApkaXNjX3NkX2xpc3QgPSAgYXMubGlzdChZX3NkKQp0aHJlcyA9IDMKCm1pbnNfYXVnID0gYXBwbHkoWF9sZXZlbDFhLCAyLCBGVU4gPSBtaW4pCm1heGVzX2F1ZyA9YXBwbHkoWF9sZXZlbDFhLCAyLCBGVU4gPSBtYXgpCgojIGNvbnZlcnQgWV90YXJnZXQgZm9yIGluZ2VzdGlvbiBpbnRvIGZ1bmN0aW9uCllfdGFyZ2V0ID0gbWF0cml4KFlfdGFyZ2V0LCBucm93ID0gMSkKCmBgYAoKCiMjIHZpc3VhbGlzZSB0aGUgY29uc3RyYWludHMKYGBge3J9CgojIEhpc3RvZ3JhbSBvZiBsZXZlbCAxIGNvbnN0cmFpbnRzCmhjb2wgPSAnZGFya2dyZXknCmxjb2wgPSAnYmxhY2snCgojcGRmKGZpbGUgPSAnZmlncy9sZXZlbF8yX2NvbnN0cmFpbnRzX2hpc3RzLnBkZicsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSkKcGFyKG1mcm93ID0gYygyLDIpLCBmZyA9ICdkYXJrZ3JleScsIGxhcyA9IDEpCgoKaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbmJwX2xuZF9zdW0nXSwgY29sID0gaGNvbCwgbWFpbiA9ICdOQlAnLCB4bGFiID0gJ0d0Qy95ZWFyJykKcG9seWdvbih4ID0gYygwLCAxMDAsIDEwMCwgMCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQoKaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddLCBjb2wgPSBoY29sICwgbWFpbiA9ICdOUFAnLCB4bGFiID0gJ0d0Qy95ZWFyJykKcG9seWdvbih4ID0gYygzNSwgODAsIDgwLCAzNSksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQoKCiAgICAgICAgaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddLCBjb2wgPSBoY29sLCBtYWluID0gJ1NvaWwgQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpwb2x5Z29uKHggPSBjKDc1MCwgMzAwMCwgMzAwMCwgNzUwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJyksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJykpCgpoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSwgY29sID0gaGNvbCwgbWFpbiA9ICdWZWdldGF0aW9uIENhcmJvbicsIHhsYWIgPSAnR3RDJykKcG9seWdvbih4ID0gYygzMDAsIDgwMCwgODAwLCAzMDApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSwKICAgICAgIGJvcmRlciA9ICBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSkKCiNkZXYub2ZmKCkKCmBgYAoKCgojIyBUaW1lc2VyaWVzIHRoYXQgbWF0Y2ggdGhlIGNvbnN0cmFpbnRzLgpQbG90IHRoZSBvcmlnaW5hbCBlbnNlbWJsZSwgcGx1cyB0aGUgc3R1ZmYgdGhhdCBtYXRjaGVzIHRoZSBjb25zdHJhaW50cy4gSW5jbHVkZSBhbm9tYWxpZXMuCiJMZXZlbCAyIiBjb25zdHJhaW50cyBhcmUgYnJvYWQgY29uc3RyYWludHMgcHJvZHVjZWQgYnkgQVcKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOX0KCiMgcmVtb3ZlIHRvIGxldmVsIDFhIFJlbGF0aXZlIHRvIHRvcGxldmVsX2l4IC0gdXNlZnVsIGZvciBwbG90dGluZyBldGMuCnRvcGxldmVsX3RvX2xldmVsXzFhX2l4IDwtKHRvcGxldmVsX2l4Wy1ZX25sZXZlbDBfaXhdKVtsZXZlbDFhX2l4XQoKIyBTbyBmdXJ0aGVyIGNvbnN0cmFpbmluZyB0byBsZXZlbCAyIGNhbiBiZSBhc3NvY2lhdGVkIGJhY2sgdG8gdGhlIHRvcCBsZXZlbC4KCmxldmVsMl9peCA8LSB3aGljaChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbmJwX2xuZF9zdW0nXSA+IDAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddIDwgMzAwMCAmCiAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA+IDMwMCAmIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA8IDgwMAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgCiAgKQpgYGAKCgojIyBQYWlycyBwbG90cyBvZiBsZXZlbCAyIGlucHV0IHNwYWNlClRoZXNlIGFyZSBpbnB1dHMgdGhhdCBtYXRjaCB0aGUgbGV2ZWwgMiBjb25zdHJhaW50cy4gT25seSAzNyBvZiB0aGUgb3JpZ2luYWwgNTAwIG1lbWJlcnMgbWF0Y2ggdGhlc2UgY29uc3RyYWludHMuIEl0J3Mgbm90aWNhYmxlIGhvdyB3aWRlIGEgcmVnaW9uIG9mIHBhcmFtZXRlciBzcGFjZSB0aGVzZSBzdGlsbCBjb21lIGZyb20uCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMH0KIyBQYWlycyBwbG90IG9mIGlucHV0cyB0aGF0IG1hdGNoIHRoZSBOQlAgY29uc3RyYWludC4KCgojcGRmKGZpbGUgPSAnZmlncy9wYWlyc19sZXZlbDJfaW5wdXRzLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQpwYWlycyhYX2xldmVsMWFbbGV2ZWwyX2l4LF0sCiAgICAgIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIGxhYmVscyA9IDE6ZCwKICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCdyZWQnLCAxNTApLAogICAgICBnYXAgPSAwLAogICAgICBwY2ggPSAyMCwKICAgICAgeGF4dCA9J24nLCB5YXh0ID0gJ24nLAogICAgICBsb3dlci5wYW5lbCA9IE5VTEwsCiAgICAgIG9tYSA9IGMoMC41LCAwLjUsIDAuNSwgMC41KQopCgoKcmVzZXQoKQoKbGVnZW5kKCdsZWZ0JywgbGVnZW5kID0gcGFzdGUoMTpkLCBjb2xuYW1lcyhsaHMpKSwgY2V4ID0gMC45LCBidHkgPSAnbicsIGluc2V0ID0gMC4wNSwgMC4wNSkKCiNkZXYub2ZmKCkKCgpgYGAKCldlIGZpbmQgdGhhdCBhZGRpbmcgYSBjb25zdHJhaW50IHRvIGxldmVsIDIgY29uc3RyYWlucyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBzb2lsIGNhcmJvbiBwb29sLCBidXQgbm90IHRoZSB2ZWdldGF0aW9uIGNhcmJvbiBwb29sLiBQcm9iYWJseSBub3QgYSBzdXJwcmlzZSwgZ2l2ZW4gdGhlIFNvaWwgQ2FyYm9uIHBvb2wgKGFuZCBjaGFuZ2VzKSBhcmUgbXVjaCBsYXJnZXIgdGhhbiB0aGUgdmVnZXRhdGlvbiBjYXJib24gcG9vbC4KCmBgYHtyIHZlZ0Mtc29pbEMtY29uc3RyYWluZWQsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KI2NTb2lsX2Vuc19hbm9tIFt0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXQoKI3BkZihmaWxlID0gJ2ZpZ3MvdmVnQy1zb2lsQy1jb25zdHJhaW5lZC5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSA4KQoKcGFyKG1mcm93PSBjKDEsNCksIGxhcyA9IDEpCgpwbG90Y29sIDwtIGMobWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSkKb3ZlcnBsb3Rjb2wgPC0gYyhtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzMnLCAyMDApKQoKCnlsaW0gPSByYW5nZShjU29pbF9lbnMpCm1hdHBsb3QoeWVhcnMsIHQoY1NvaWxfZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1NvaWwnLAogICAgICAgIGJ0eSA9ICduJykKbWF0bGluZXMoIHllYXJzLCB0KChjU29pbF9lbnNbdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksY29sID0gb3ZlcnBsb3Rjb2wsICBsd2QgPSAxLjUsIGx0eSA9ICdzb2xpZCcpCgp5bGltID0gcmFuZ2UoY1NvaWxfZW5zKQptYXRwbG90KHllYXJzLCB0KGNWZWdfZW5zKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1ZlZycsCiAgICAgICAgYnR5ID0gJ24nKQptYXRsaW5lcyggeWVhcnMsIHQoKGNWZWdfZW5zW3RvcGxldmVsX3RvX2xldmVsXzFhX2l4LCBdKVtsZXZlbDJfaXgsIF0pLCBjb2wgPSBvdmVycGxvdGNvbCwgbHdkID0gMS41LCBsdHkgPSAnc29saWQnKQoKCgp5bGltID0gcmFuZ2UoY1NvaWxfZW5zX2Fub20pCm1hdHBsb3QoeWVhcnMsIHQoY1NvaWxfZW5zX2Fub20pLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBwbG90Y29sLAogICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjU29pbCBBbm9tYWx5JywKICAgICAgICBidHkgPSAnbicpCm1hdGxpbmVzKCB5ZWFycywgdCgoY1NvaWxfZW5zX2Fub21bdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXgsIF0pW2xldmVsMl9peCwgXSksY29sID0gb3ZlcnBsb3Rjb2wsIGx3ZCA9IDEuNSwgbHR5ID0gJ3NvbGlkJykKCgp5bGltID0gcmFuZ2UoY1ZlZ19lbnNfYW5vbSkKbWF0cGxvdCh5ZWFycywgdChjVmVnX2Vuc19hbm9tKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1ZlZyBBbm9tYWx5JywKICAgICAgICBidHkgPSAnbicpCm1hdGxpbmVzKCB5ZWFycywgdCgoY1ZlZ19lbnNfYW5vbVt0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXSlbbGV2ZWwyX2l4LCBdKSxjb2wgPSBvdmVycGxvdGNvbCxsd2QgPSAxLjUsIGx0eSA9ICdzb2xpZCcpCgojZGV2Lm9mZigpCgpgYGAKCgojIyBFbXVsYXRlZCBkZW5zaXR5IHBhaXJzIHBsb3Qgb2YgaW5wdXQgc3BhY2UgdGhhdCBtYXRjaGVzIGxldmVsIDIgY29uc3RyYWludHMKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgRmlyc3QgYnVpbGQgYW4gZW11bGF0b3IgbGlzdCBmb3IgdGhlIFkKCmxpc3RfWV9jb25zdF9sZXZlbDFhX3NjYWxlZCA8LSBtYXQybGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKQplbWxpc3RfWV9jb25zdF9sZXZlbDFhX3NjYWxlZCA8LSBtY2xhcHBseShYID0gbGlzdF9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkLCBGVU4gPSBrbSwgZm9ybXVsYSA9IH4uLCBkZXNpZ24gPSBYX2xldmVsMWEsIG1jLmNvcmVzID0gNCkgCgpgYGAKCgpgYGB7cn0KCiMgU2FtcGxlcyBmcm9tIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gYWNyb3NzIGFsbCBvZiBpbnB1dCBzcGFjZQpuc2FtcF91bmlmIDwtIDEwMDAwMCAgIApYX3VuaWYgPC0gc2FtcF91bmlmKG5zYW1wX3VuaWYsIG1pbnMgPSAocmVwKDAsIGQpKSwgbWF4ZXMgPSByZXAoMSxkKSkKCllfdW5pZiA8LSBtYXRyaXgobnJvdyA9IG5zYW1wX3VuaWYsIG5jb2wgPSBwKQpjb2xuYW1lcyhZX3VuaWYpIDwtIGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpCgojIEJ1aWxkIGFuIGVtdWxhdG9yIGZvciBlYWNoIG91dHB1dCBpbmRpdmlkdWFsbHkKZm9yKGkgaW4gMTpwKXsKICAjZW0gPC0ga20ofi4sIGRlc2lnbiA9IFhfbGV2ZWwxYSwgcmVzcG9uc2UgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWyxpXSkKICAjbGV2ZWwxYV9lbWxpc3RbW2ldXSA8LSBlbQogIGVtIDwtIGVtbGlzdF9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkW1tpXV0KICBwcmVkIDwtIHByZWRpY3QoZW0sIG5ld2RhdGEgPSBYX3VuaWYsIHR5cGUgPSAnVUsnKQogIFlfdW5pZlssaV0gPC0gcHJlZCRtZWFuCn0KCiMgRmluZCB0aGUgaW5wdXRzIHdoZXJlIHRoZSBtZWFuIG9mIHRoZSBlbXVsYXRlZCBvdXRwdXQgaXMgCiMgd2l0aGluIHRoZSB0b2xlcmFibGUgbGltaXRzIHNldCBieSB0aGUgbW9kZWxsZXIuCnlfdW5pZl9peF9rZXB0IDwtIHdoaWNoKFlfdW5pZlssJ25icF9sbmRfc3VtJ10gPiAwICYKICAgICAgICAgICAgICAgICAgICBZX3VuaWZbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIFlfdW5pZlssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICBZX3VuaWZbLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX3VuaWZbLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgWV91bmlmWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX3VuaWZbLCdjVmVnX2xuZF9zdW0nXSA8IDgwMAogICAgICAgICAgICAgICAgICApCiAgClhfa2VwdCA8LSBYX3VuaWZbeV91bmlmX2l4X2tlcHQsIF0KCiMgd2UndmUgcmVtb3ZlZCA4MCUgb2Ygb3VyIHByaW9yIGlucHV0IHNwYWNlCihucm93KFhfa2VwdCkgLyBuc2FtcF91bmlmKSAqIDEwMAoKCgpgYGAKCgpgYGB7cn0KeV91bmlmX2l4X3JlamVjdGVkID0gc2V0ZGlmZigxOm5zYW1wX3VuaWYsIHlfdW5pZl9peF9rZXB0KQpYX3JlamVjdGVkID0gWF91bmlmW3lfdW5pZl9peF9rZXB0LCBdCmBgYAoKYGBge3IsICBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQpwZGYoZmlsZSA9ICdmaWdzL3BhaXJzX2RlbnNfbGV2ZWwyX2ttLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQojZGV2Lm5ldyh3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKcGFyKG9tYSA9IGMoMCwwLDAsMyksIGJnID0gJ3doaXRlJykKcGFpcnMoWF9rZXB0LAogICAgICBsYWJlbHMgPSAxOmQsCiAgICAgIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gTlVMTCwgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgcGFuZWwgPSBkZnVuY191cCwKICAgICAgY2V4LmxhYmVscyA9IDEsCiAgICAgIGNvbC5heGlzID0gJ3doaXRlJywKICAgICAgZGZ1bmMuY29sID0gcmIpCgppbWFnZS5wbG90KGxlZ2VuZC5vbmx5ID0gVFJVRSwKICAgICAgICAgICB6bGltID0gYygwLDEpLAogICAgICAgICAgIGNvbCA9IHJiLAogICAgICAgICAgIGxlZ2VuZC5hcmdzID0gbGlzdCh0ZXh0ID0gJ0RlbnNpdHkgb2YgbW9kZWwgcnVucyBtYXRjaGluZyB0aGUgY3JpdGVyaWEnLCBzaWRlID0gMywgbGluZSA9IDEpLAogICAgICAgICAgIGhvcml6b250YWwgPSBUUlVFCikKCnJlc2V0KCkKCmxlZ2VuZCgnbGVmdCcsIGxlZ2VuZCA9IHBhc3RlKDE6ZCwgY29sbmFtZXMobGhzKSksIGNleCA9IDAuOSwgYnR5ID0gJ24nLCBpbnNldCA9IDAuMDUsIDAuMDUpCgpkZXYub2ZmKCkKYGBgCgoKCiMjIENvbnN0cmFpbiB3aXRoIEN1bXVsYXRpdmUgTkJQCkVtYWlsIGZyb20gRVI6CgpIZWxsbywKCknigJl2ZSBoYWQgYSBsb29rIGZvciBzb21lIG11bHRpLW1vZGVsIHJhbmdlc+KApgoKICBGcm9tIHRoZSBJTEFNQiBDTUlQNiBwYWdlcy4KICBOQlAgYWNjdW11bGF0ZWQgYmV0d2VlbiAxOTU5IGFuZCAyMDE0OiAoMjI3IElOTSkgIC0xNi4zIEd0IHRvICsxMDYgR3QKR1BQIDE5ODAtMjAxNCBtZWFuOiAxMDQtMTQ0IEd0L3lyICgxNTcgSU5NLCAxNTkgQkNDKQpjVmVnIDE5OTYtMjAwNiBtZWFuOiAzMzgtNTgyIEd0ICg2MzUgSU5NKQpjU29pbCAyMDAwLTIwMDEgbWVhbjogMzE5LTE3NjAgR3QKCkZyb20gU3BlbmNlcuKAmXMgcmVjZW50IHBhcGVyIGFib3V0IGEgc3Vic2V0IG9mIENNSVA2IG1vZGVscy4KTkJQIDIwMDAtMjAwOSBtZWFuOiAwLjQ1LTIuMjQgR3QveXIKCkZyb20gVHJlbmR5IDIwMTkgZW5zZW1ibGUsIGFsbCBhcmUgMTk4NS0yMDE0IG1lYW5zLgpOQlA6IDAuMjEtMS44MiBHdC95cgpHUFA6IDEwNy0xNjUgR3QveXIKY1ZlZzogMzM1LTg2OSBHdApjU29pbDogNjI2LTM1OTUgR3QKCkkgY2FuIHVwZGF0ZSB0aGUgVHJlbmR5IHJlc3VsdHMgdG8gdGhlIGxhdGVzdCAyMDIwIHZlcnNpb24gYW5kL29yIGNoYW5nZSB0aGUgbWVhbmluZyBwZXJpb2QgaWYgbmVlZGVkLgoKQ2hlZXJzLApFZGR5LgoKYGBge3IsIHdpZHRoID0gNywgaGVpZ2h0ID0gN30KIyBBcHBseSBzb21lIGNvbnN0cmFpbnRzIHRvIE5CUCB0byBzZWUgaG93IG11Y2ggZnVydGhlciBpdCBnZXRzIHlvdQojRnJvbSB0aGUgSUxBTUIgQ01JUDYgcGFnZXMuCiNOQlAgYWNjdW11bGF0ZWQgYmV0d2VlbiAxOTU5IGFuZCAyMDE0OiAoLTIyNyBJTk0pIC0xMDYgdG8gKzE2LjMgR3QKCgpjdW11bGF0aXZlX25icCA8LSBtYXRyaXgobnJvdyA9IG5yb3cobmJwX2VucyksIG5jb2wgPSBuY29sKG5icF9lbnMpKQoKZm9yKGkgaW4gMTpucm93KGN1bXVsYXRpdmVfbmJwKSl7CiAgCiAgY25icCA8LSBjdW1zdW0obmJwX2Vuc1tpLCBdKQogIGN1bXVsYXRpdmVfbmJwW2ksIF0gPC0gY25icAogIAp9CgpwYXIobWZyb3cgPSBjKDEsMikpCm1hdHBsb3QodChuYnBfZW5zKSwgbWFpbiA9ICdOQlAnLCB0eXBlID0gJ2wnLCB5bGFiID0gJ0d0Qy95ZWFyJywgY29sID0gcGxvdGNvbCwgeWxpbSA9IGMoLTEwLCAxMCkpCgp5bGltID0gYygtMTUwLCAyMDApCgptYXRwbG90KHllYXJzLCB0KGN1bXVsYXRpdmVfbmJwKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0geWxpbSwgY29sID0gcGxvdGNvbCwgCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2N1bXVsYXRpdmUgTkJQJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKCmBgYAoKSWYgd2UgY29uc3RyYWluIG9uIGN1bXVsYXRpdmUgTkJQIHRoYXQgbWF0Y2hlZCBJTEFNQiAxOTU5IC0gMjAxMyAodGhlIGxhdGVzdCB5ZWFyIGluIHRoZSByZWNvcmQsIHdlIGNob29zZSB0aG9zZSBlbnNlbWJsZSBtZW1iZXJzIHdoaWNoIGhhdmUgdGhlIGxvd2VzdCBjdW11bGF0aXZlIE5CUC4gTWFueSBlbnNlbWJsZSBtZW1iZXJzIGhhdmUgYSBoaWdoZXIgY3VtdWxhdGl2ZSBOQlAuKQpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmhlaWdodCA9IDd9CiMgZXh0cmFjdCBuYnAgYWNjdW11bGF0ZWQgYmV0d2VlbiAxOTU5IGFuZCAyMDE0OgoKbmJwY29sIDwtIGMobWFrZVRyYW5zcGFyZW50KCd0b21hdG8zJywgMTUwKSkKYXdjb2wgPC0gYyhtYWtlVHJhbnNwYXJlbnQoJ2JsdWUnLCAxNTApKQoKc3RhcnRfaXggPSB3aGljaCh5ZWFycyA9PSAxOTU5KQplbmRfaXggPC0gd2hpY2goeWVhcnMgPT0gMjAxMykKCgpuYnBfbW9kZXJuX2FjY3VtIDwtIGN1bXVsYXRpdmVfbmJwWywgZW5kX2l4XSAtIGN1bXVsYXRpdmVfbmJwWywgc3RhcnRfaXhdCgoKI3BhcihtZnJvdyA9IGMoMiwxKSkKI2hpc3QobmJwX21vZGVybl9hY2N1bSAsIHhsaW0gPSBjKC0xMDAsIDE1MCkpCgpuYnBfbW9kZXJuX2FjY3VtX2xldmVsMWEgPC0gbmJwX21vZGVybl9hY2N1bVt0b3BsZXZlbF90b19sZXZlbF8xYV9peF0KCiNoaXN0KG5icF9tb2Rlcm5fYWNjdW1fbGV2ZWwxYSAsIHhsaW0gPSBjKC0xMDAsIDE1MCkpCgpuYnBfYWNjdW1faXggPC0gd2hpY2gobmJwX21vZGVybl9hY2N1bV9sZXZlbDFhID4gLTE2LjMgJiAgbmJwX21vZGVybl9hY2N1bV9sZXZlbDFhIDwgMTA2KQoKeWxpbSA9IHJhbmdlKGMoLTEyMCwgMjAwKSkKCiNwZGYoZmlsZSA9ICdmaWdzL2N1bXVsYXRpdmVfbmJwX2NvbnN0cmFpbmVkLnBkZicsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNykKbWF0cGxvdCh5ZWFycywgdChjdW11bGF0aXZlX25icCksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2N1bXVsYXRpdmUgTkJQJywKICAgICAgICBidHkgPSAnbicsIGx3ZCA9IDEuNSkKbWF0bGluZXMoIHllYXJzLCB0KChjdW11bGF0aXZlX25icFt0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXSlbbmJwX2FjY3VtX2l4LCBdKSxjb2wgPSBuYnBjb2wsbHdkID0gMiwgbHR5ID0gJ3NvbGlkJykKbWF0bGluZXMoIHllYXJzLCB0KChjdW11bGF0aXZlX25icFt0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXSlbbGV2ZWwyX2l4LCBdKSxjb2wgPSBhd2NvbCxsd2QgPSAyLCBsdHkgPSAnc29saWQnKQoKbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kICA9IGMoJ0N1bXVsYXRpdmUgTkJQIGNvbnN0cmFpbnQnLCAnQVcgY29uc3RyYWludCcpLCBjb2wgPSBjKG5icGNvbCwgYXdjb2wpICwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKI2Rldi5vZmYoKQoKCmBgYAoKIyMgSG93IGRvIHdlIGZpbmQgb3V0cHV0cyB0aGF0IGFyZSBpbmNvbnNpc3RlbnQ/Ckl0J3MgY2xlYXIgdGhhdCBzb21ldGhpbmcgcnVsZXMgb3V0IGFsbCB0aGUgImdvb2QiIHZhbHVlcyBvZiBjdW11bGF0aXZlX25icC4gV2hpY2ggb3V0cHV0IGlzIGl0PyAgIAoKMSkgVGhlcmUgaXMgYSB2ZXJ5IHN0cm9uZyByZWxhdGlvbnNoaXAgKGFsbW9zdCAxOjEpIGJldHdlZW4gbmJwX2xuZF9zdW0gYW5kIGN1bXVsYXRpdmVfbmJwLiBUaGUgY3VtdWxhdGl2ZSBOQlAgY29uc3RyYWludCBrZWVwcyB0aGUgJ21vZGVybicgbmJwIGxvdywgd2hpbGUgQW5keSdzIGNvbnN0cmFpbnRzIGRvIG5vdC4KCjIpIEFsbCB0aGUgY3VtdWxhdGl2ZSBOQlAtY29uc3RyYWluZWQgZW5zZW1ibGUgbWVtYmVycyBoYXZlIGxvdyBtb2Rlcm4gdmVnZXRhdGlvbiBjYXJib24KCjMpIE1vZGVybiBOUFAgYW5kIHNvaWwgY2FyYm9uCiMKCmBgYHtyLCBmaWcud2lkdGggPSA5LCAgZmlnLmhlaWdodCA9IDl9CgpZX2NvbnN0X2xldmVsMWFfc2NhbGVkX25icCA8LSBjYmluZChZX2NvbnN0X2xldmVsMWFfc2NhbGVkLCBuYnBfbW9kZXJuX2FjY3VtX2xldmVsMWEpCgpjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkX25icCkgPC0gYyhjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSwgJ2N1bXVsYXRpdmVfbmJwJykKCm91dGNvbHMgPC0gcmVwKG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCA1MCksIG5yb3coWV9jb25zdF9sZXZlbDFhX3NjYWxlZF9uYnApKQoKb3V0Y29sc1tuYnBfYWNjdW1faXggXSA8LSBuYnBjb2wKb3V0Y29sc1tsZXZlbDJfaXhdIDwtIGF3Y29sCgojcGRmKGZpbGUgPSAnZmlncy9jdW11bGF0aXZlX25icF9jb25zdHJhaW5lZF9wYWlycy5wZGYnLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCgpwYWlycyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkX25icCwgY29sID0gb3V0Y29scywgbG93ZXIucGFuZWwgPSBOVUxMLCBwY2ggPSAxOSkKcmVzZXQoKQpsZWdlbmQoJ2JvdHRvbWxlZnQnLCBsZWdlbmQgID0gYygnQ3VtdWxhdGl2ZSBOQlAgY29uc3RyYWludCcsICdBVyBjb25zdHJhaW50JyksIGNvbCA9IGMobmJwY29sLCBhd2NvbCkgLCBwY2ggPSAxOSwgY2V4ID0gMS41LAogICAgICAgaW5zZXQgPSAwLjEpCiMgIGRldi5vZmYoKQoKYGBgCgoKIyMgQXVnbWVudCB0aGUgZGVzaWduLgpUaGUgZnVuY3Rpb24gYWRkTnJveURlc2lnblBvaW50cyBidWlsZHMgYW4gZW11bGF0b3IgZm9yIGVhY2ggbW9kZWwgb3V0cHV0IGluIFkuIEl0IGNvbXBhcmVzIHRoZSBvdXRwdXQgb2YgZWFjaCBlbXVsYXRvciBhdCBhIG51bWJlciBvZiBjYW5kaWRhdGUgZGVzaW4gcG9pbnRzLCBhbmQgY2hvb3NlcyBhIHNwYWNlLWZpbGxpbmcgc2V0IG9mIHRoZW0gdGhhdCB0aGF0IGFyZSBOb3QgUnVsZWQgT3V0IFlldCAoc3RhdGlzdGljYWxseSBjbG9zZSB0byB0aGUgb2JzZXJ2YXRpb24gYXQgWV90YXJnZXQpLgoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQojIEZpbmFsIG91dHB1dCBuZWVkcyB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2Ygb3JpZ2luYWwgTEhTLCB0aGVuIHB1dCBiYWNrIG91dCB0byBjb25mIGZpbGVzLgoKIyBUaGlzIGZ1bmN0aW9uIGFkZHMgbi5hdWcgcG90ZW50aWFsIGRlc2lnbiBwb2ludHMsIGFuZCBmaW5kcyB0aGVpciBpbXBsYXVzaWJpbGl0eQojIHNjb3JlIGluIFgubnJveQoKd2F2ZTEgPSBhZGROcm95RGVzaWduUG9pbnRzKFggPSBYX2xldmVsMWEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWSA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWV90YXJnZXQgPSBZX3RhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fYXVnID0gNTAwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc19hdWcgPSBtaW5zX2F1ZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGVzX2F1ZyA9IG1heGVzX2F1ZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NfbGlzdD1kaXNjX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjX3NkX2xpc3QgPSBkaXNjX3NkX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNfc2RfbGlzdCA9IG9ic19zZF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9hcHAgPSA1MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVwcyA9IDUwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLmNvcmVzID0gNCkKYGBgCgoKCgojIyBXcml0ZSB0aGUgYXVnbWVudGVkIGRlc2lnbgpUaGUgZnVuY3Rpb24gd3JpdGVfanVsZXNfZGVzaWduIGhlcmUgc2ltcGx5IHRha2VzIHRoZSBwb2ludHMgY2FsY3VsYXRlZCBieSBhZGROcm95RGVzaWduUG9pbnRzIGFuZCB3cml0ZXMgdGhlbSB0byBjb25maWd1cmF0aW9uIGZpbGVzLgoKYGBge3J9CgojIHRoaXMgbmVlZHMgc29ydGluZwpzb3VyY2UoJ34vbXlScGFja2FnZXMvanVsZXNSL3ZpZ25ldHRlcy9kZWZhdWx0X2p1bGVzX3BhcmFtZXRlcl9wZXJ0dXJiYXRpb25zLlInKQoKIyBFYXNpZXN0IHdheSB0byBnZW5lcmF0ZSBhIGRlc2lnbiBvZiB0aGUgcmlnaHQgc2l6ZSBpcyB0byBoYXZlIGEgImZhYyIgd2hpY2ggdGFrZXMKIyB0aGUgbmFtZXMgZnJvbSB0aGUgcGFyYW1ldGVyIGxpc3QsIGFuZCB0aGVuIG11bHRpcGxpZXMgZXZlcnl0aGluZyBieSAwLjUgb3IgMgoKdGYgPC0gJ2xfdmdfc29pbCcKIyB3ZSBkb24ndCB3YW50IGFueXRoaW5nIHRoYXQgaXMgVFJVRS9GQUxTRSB0byBiZSBpbiBmYWMKZmFjX2luaXQgPC0gbmFtZXMocGFyYW1saXN0KQpub3RfdGZfaXggPC0gd2hpY2gobmFtZXMocGFyYW1saXN0KSE9dGYpCnBhcmFtbGlzdF90cnVuYyA8LXBhcmFtbGlzdFtub3RfdGZfaXhdCgpmYWMgPC0gbmFtZXMocGFyYW1saXN0X3RydW5jKQoKbWF4ZmFjIDwtbGFwcGx5KHBhcmFtbGlzdF90cnVuYyxmdW5jdGlvbih4KSB4JG1heFt3aGljaC5tYXgoeCRtYXgpXSAvIHgkc3RhbmRhcmRbd2hpY2gubWF4KHgkbWF4KV0pCm1pbmZhYyA8LSBsYXBwbHkocGFyYW1saXN0X3RydW5jLGZ1bmN0aW9uKHgpIHgkbWluW3doaWNoLm1heCh4JG1heCldIC8geCRzdGFuZGFyZFt3aGljaC5tYXgoeCRtYXgpXSkKCgpgYGAKCgpgYGB7cn0KIyBjcmVhdGUgYSBkaXJlY3RvcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCmNvbmZkaXIgPC0gJ2NvbmZfZmlsZXNfYXVnbWVudF9KVUxFUy1FUy0xcDAnCgpkaXIuY3JlYXRlKGNvbmZkaXIpCgpYX21tIDwtIHdhdmUxJFhfbW0KCiMgVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCB3cml0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCndyaXRlX2p1bGVzX2Rlc2lnbihYX21tID0gWF9tbSwgcGFyYW1saXN0PXBhcmFtbGlzdCwgbiA9IG5yb3coWF9tbSksCiAgICAgICAgICAgICAgICAgICAgZmFjID0gZmFjLCBtaW5mYWMgPSBtaW5mYWMsIG1heGZhYyA9IG1heGZhYywKICAgICAgICAgICAgICAgICAgICB0ZiA9IHRmLAogICAgICAgICAgICAgICAgICAgIGZucHJlZml4ID0gcGFzdGUwKGNvbmZkaXIsJy9wYXJhbS1wZXJ0dXJiLVAnKSwKICAgICAgICAgICAgICAgICAgICBsaHNmbiA9IHBhc3RlMChjb25mZGlyLCcvbGhzX2V4YW1wbGUudHh0JyksCiAgICAgICAgICAgICAgICAgICAgc3RhbmZuID0gcGFzdGUwKGNvbmZkaXIsJy9zdGFucGFybXNfZXhhbXBsZS50eHQnKSwKICAgICAgICAgICAgICAgICAgICBhbGxzdGFuZm4gPSBwYXN0ZTAoY29uZmRpciwnL2FsbHN0YW5wYXJtc19leGFtcGxlLnR4dCcpLAogICAgICAgICAgICAgICAgICAgIHJuID0gMTIsCiAgICAgICAgICAgICAgICAgICAgc3RhcnRudW0gPSA0OTkpCmBgYAoKIyMgQ2hlY2sgdGhlIGRlc2lnbgpDaGVjayB0aGF0IHRoZSBhdWdtZW50ZWQgZGVzaWduIHByb2R1Y2VzIHdoYXQgd2UgZXhwZWN0LiBOZXcgZW5zZW1ibGUgbWVtYmVycyBzaG91bGQgYmUgc29tZXdoYXQgY29uc3RyYWluZWQgd2l0aGluIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBvcmlnaW5hbCBkZXNpZ24sIGlmIHRoZSBjb21wYXJpc29uIHRvIGRhdGEgb2ZmZXJzIGFueSBjb25zdHJhaW50LgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgoKWF9tbSA8LSB3YXZlMSRYX21tCgojIHBhaXJzKHJiaW5kKFgsIFhfbW0pLCB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLCBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIAojICAgICAgIGNvbCA9IGMocmVwKCdncmV5JywgbnJvdyhYKSksIHJlcCgncmVkJywgbnJvdyhYX21tKSkpLAojICAgICAgIHBjaCA9IGMocmVwKDIxLCBucm93KFgpKSwgcmVwKDIwLCBucm93KFhfbW0pKSkKIyAgICAgICApCiMgCiMgcGFyKHhwZCA9IE5BKQojIAojIGxlZ2VuZCgnYm90dG9tJywKIyAgICAgICAgbGVnZW5kID0gYygnT3JpZ2luYWwgZGVzaWduJywgJ05ldyBwb2ludHMnKSwKIyAgICAgICAgY29sID0gYygnZ3JleScsICdyZWQnKSwKIyAgICAgICAgaW5zZXQgPSAwLjE1LAojICAgICAgICBjZXggPSAxLjUsCiMgICAgICAgIHBjaCA9IGMoMjEsMjApCiMgKQoKcGFyKG9tYSA9IGMoMCwwLDAsMyksIGJnID0gJ3doaXRlJykKcGFpcnMoWF9tbSwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gZGZ1bmNfdXAsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIGRmdW5jLmNvbCA9IHJiKQoKaW1hZ2UucGxvdChsZWdlbmQub25seSA9IFRSVUUsCiAgICAgICAgICAgemxpbSA9IGMoMCwxKSwKICAgICAgICAgICBjb2wgPSByYiwKICAgICAgICAgICBsZWdlbmQuYXJncyA9IGxpc3QodGV4dCA9ICdEZW5zaXR5IG9mIG1vZGVsIHJ1bnMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhJywgc2lkZSA9IDMsIGxpbmUgPSAxKSwKICAgICAgICAgICBob3Jpem9udGFsID0gVFJVRQopCgpgYGAKCgpWaXN1YWxpc2UgdGhlIHByZWRpY3RlZCBvdXRwdXRzIGF0IHRoZSBOUk9ZIHBvaW50cyBvZiB0aGUgb2xkIGRlc2lnbiwgYW5kIHRoZSBuZXcgc3VnZ2VzdGVkIGRlc2lnbi4KYGBge3J9CllfbW1fbGlzdCA8LSB2ZWN0b3IobW9kZSA9J2xpc3QnLCBsZW5ndGggPSBsZW5ndGgod2F2ZTEkZml0X2xpc3QpKQoKZm9yKGkgaW4gMTpsZW5ndGgod2F2ZTEkZml0X2xpc3QpKXsKCnlfbW0gPC0gcHJlZGljdChvYmplY3Q9d2F2ZTEkZml0X2xpc3RbW2ldXSwgbmV3ZGF0YSA9IHdhdmUxJFhfbW0sIHR5cGUgPSAnVUsnKQoKWV9tbV9saXN0W1tpXV0gPC0geV9tbQoKfQpgYGAKCiMjIFZpc3VhbGlzaW5nIHRoZSBlbXVsYXRlZCBvdXRwdXRzIGF0IHRoZSBwcm9wb3NlZCBuZXcgZGVzaWduIHBvaW50cy4KCkludGVyZXN0aW5nbHksIHRoZXNlIGFyZW4ndCBwZXJmZWN0bHkgd2l0aGluIHRoZSBvcmlnaW5hbCBoYXJkIGJvdW5kYXJpZXMgc2V0IGJ5IEFuZHksIGV2ZW4gdGhvdWdoIEkndmUgc2V0IHRob3NlIGJvdW5kYXJpZXMgdG8gYmUgdGhlICstIDQgc3RhbmRhcmQgZGV2aWF0aW9uIHRocmVob2xkcyBpbiB0aGUgSGlzdG9yeSBNYXRjaC4gSSBzdWdnZXN0IHRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBtb2RlbCBkaXNjcmVwYW5jeSwgYW5kIHRoYXQgdGhlcmUgaXMgY29uc2lkZXJhYmxlIHdyaWdnbGUgcm9vbSBpbmR1Y2VkIGZyb20gZW11bGF0b3IgdW5jZXJ0YWludHkuCgpJbiBwYXJ0aWN1bGFyLCBpdCBhcHBlYXJzIHRoYXQgdmVnZXRhdGlvbiBjYXJib24gaXMgZGlmZmljdWx0IHRvIGtlZXAgaGlnaCwgYW5kIHRoYXQgbWFueSBOUk9ZIHByb3Bvc2VkIG1lbWJlcnMgaGF2ZSBhIGZhaXJseSBsb3cgdmVnZXRhdGlvbiBjYXJib24uIFRoaXMgbWlnaHQgbmVlZCBhIGRpc2NyZXBhbmN5IHRlcm0sIG9yIGFkanVzdGluZyBpbiBzb21lIG90aGVyIHdheS4gSXQgY2VydGFpbmx5IG5lZWRzIGV4cGxvcmluZywgYW5kIGEgT0FBVCBwbG90IG1pZ2h0IGdpdmUgY2x1ZXMgYXMgdG8gdGhlIHBhcmFtZXRlcnMgdG8gY2hvb3NlLgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4fQojIEhpc3RvZ3JhbSBvZiBsZXZlbCAxIGNvbnN0cmFpbnRzCgpwZGYoZmlsZSA9ICdmaWdzL2VtdWxhdGVkX2Rlc2lnbl9wb2ludHMucGRmJywgd2lkdGggPSA4LCBoZWlnaHQgPSA4KQpoY29sID0gJ2RhcmtncmV5JwpsY29sID0gJ2JsYWNrJwpwYXIobWZyb3cgPSBjKDIsMiksIGZnID0gJ2RhcmtncmV5JywgbGFzID0gMSwgb21hID0gYygxLDEsNCwxKSkKCmRpc2NzZCA8LSBjKGRpc2Nfc2RfbGlzdCwgcmVjdXJzaXZlID0gVFJVRSkKCmhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25icF9sbmRfc3VtJ10sIGNvbCA9IGhjb2wsIG1haW4gPSAnTkJQJywgeGxhYiA9ICdHdEMveWVhcicpCmhpc3QoWV9tbV9saXN0W1sxXV0kbWVhbiwgYWRkID0gVFJVRSwgY29sID0gJ2JsYWNrJykKcG9seWdvbih4ID0gYygtMTAsIDEwMCwgMTAwLCAtMTApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSwKICAgICAgICBib3JkZXIgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSkKcnVnKFlfdGFyZ2V0WzFdLCBjb2wgPSAnYmxhY2snKQpydWcoYyhZX3RhcmdldFsxXSArIDMqZGlzY3NkWzFdLFlfdGFyZ2V0WzFdIC0gMypkaXNjc2RbMV0pICwgY29sID0gJ3JlZCcpCgpoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10sIGNvbCA9IGhjb2wgLCBtYWluID0gJ05QUCcsIHhsYWIgPSAnR3RDL3llYXInKQpoaXN0KFlfbW1fbGlzdFtbMl1dJG1lYW4sIGFkZCA9IFRSVUUsIGNvbCA9ICdibGFjaycpCnBvbHlnb24oeCA9IGMoMzUsIDgwLCA4MCwgMzUpLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSwKICAgICAgICBib3JkZXIgPSBtYWtlVHJhbnNwYXJlbnQoJ3RvbWF0bzInKSkKcnVnKFlfdGFyZ2V0WzJdLCBjb2wgPSAnYmxhY2snKQpydWcoYyhZX3RhcmdldFsyXSArIDMqZGlzY3NkWzJdLFlfdGFyZ2V0WzJdIC0gMypkaXNjc2RbMl0pICwgY29sID0gJ3JlZCcpCgpoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10sIGNvbCA9IGhjb2wsIG1haW4gPSAnU29pbCBDYXJib24nLCB4bGFiID0gJ0d0QycpCmhpc3QoWV9tbV9saXN0W1szXV0kbWVhbiwgYWRkID0gVFJVRSwgY29sID0gJ2JsYWNrJykKcG9seWdvbih4ID0gYyg3NTAsIDMwMDAsIDMwMDAsIDc1MCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpKQpydWcoWV90YXJnZXRbM10sIGNvbCA9ICdibGFjaycpCnJ1ZyhjKFlfdGFyZ2V0WzNdICsgMypkaXNjc2RbM10sWV90YXJnZXRbM10gLSAzKmRpc2NzZFszXSkgLCBjb2wgPSAncmVkJykKCmhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddLCBjb2wgPSBoY29sLCBtYWluID0gJ1ZlZ2V0YXRpb24gQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpoaXN0KFlfbW1fbGlzdFtbNF1dJG1lYW4sIGFkZCA9IFRSVUUsIGNvbCA9ICdibGFjaycpCnBvbHlnb24oeCA9IGMoMzAwLCA4MDAsIDgwMCwgMzAwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJyksCiAgICAgICBib3JkZXIgPSAgbWFrZVRyYW5zcGFyZW50KCd0b21hdG8yJykpCnJ1ZyhZX3RhcmdldFs0XSwgY29sID0gJ2JsYWNrJykKcnVnKGMoWV90YXJnZXRbNF0gKyAzKmRpc2NzZFs0XSxZX3RhcmdldFs0XSAtIDMqZGlzY3NkWzRdKSAsIGNvbCA9ICdyZWQnKQoKcmVzZXQoKQoKbGVnZW5kKCd0b3AnLCBob3JpeiA9IFRSVUUsIGZpbGwgPSBjKGhjb2wsIG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicpLCAnYmxhY2snKSwgbGVnZW5kID0gYygncnVucycsICdjb25zdHJhaW50JywgJ2VtdWxhdGVkIGRlc2lnbiBvdXRwdXRzJyksIHRleHQuY29sID0gJ2JsYWNrJywgY2V4ID0gMSwgYnR5ID0gJ24nKQoKZGV2Lm9mZigpCgogIApgYGAKCgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTB9CiMgUGFpcnMgcGxvdCBvZiBpbnB1dHMgdGhhdCBtYXRjaCB0aGUgTkJQIGNvbnN0cmFpbnQuCgoKcGFpcnMoWF9sZXZlbDFhW25icF9hY2N1bV9peCxdLAogICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBsYWJlbHMgPSAxOmQsCiAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgncmVkJywgMTUwKSwKICAgICAgZ2FwID0gMCwKICAgICAgcGNoID0gMjAsCiAgICAgIHhheHQgPSduJywgeWF4dCA9ICduJywKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMLAogICAgICBvbWEgPSBjKDAuNSwgMC41LCAwLjUsIDAuNSkKKQoKYGBgCgoKYGBge3J9CiMgRG9lcyBOQlAgcnVsZSBvdXQgbWVtYmVycyB3aGljaCBhcmUgbm90IHJ1bGVkIG91dCBieSBBbmR5PyAKCgoKCgpgYGAKCgoKCmBgYHtyIH0KCiMgMTgzNyA8IGNTb2lsIDwgMzI1NyBQZwojIDM4MCA8IGNWZWcgPCA1MzYgUGcKIyAxMDAgPCBncHAgPCAxNTAgUGcveXIKIyAxMzMgPCBuU29pbCA8IDE1MiBQZwojIFBsdXMgZGVjYWRhbCByYW5nZXMgb2YgTkJQICgxOTYwLTIwMTkpIGZyb20gLTAuNCBQZy95ciB0byArMi42IFBnL3lyLCB3aGVyZSBOQlAgaXMgdGhlIG5ldCBmbHV4IGludG8gdGhlIGxhbmQgaW5jbHVkaW5nIGxhbmQtdXNlCiMgZW1pc3Npb25zLgoKbGV2ZWwzX2l4IDwtIHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gLTAuNCAmIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddIDwgMi42ICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddID4gMTgzNyAmIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPCAzMjU3ICYKICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddID4gMzgwICYgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddIDwgNTM2CiAgKQogIAoKYGBgCgoKCgojIyBBdG1vc3BoZXJpYyBncm93dGgKV2UgY2FuIGNhbGN1bGF0ZSB0aGUgYXRtb3NwaGVyaWMgZ3Jvd3RoIGFzIEZvc3NpbCBmdWVsIGVtaXNzaW9ucyAoR0NCKSAtIE9jZWFuIHVwdGFrZSAgKEdDQikgLSBuZXQgbGFuZCBmbHV4IChKVUxFUyBOQlApCgpDb252ZXJzZWx5LCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBsYW5kIHVwdGFrZSBhcyBOQlAgPSBGRiAtIG9jZWFuIC0gYWcgKERvIHdlIGhhdmUgQUcgaW4gSlVMRVM/KQoKYGBge3J9CgpyZXNpZCA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYG9jZWFuIHNpbmtgIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmAKCnJlc2lkX2l4IDwtIHdoaWNoKGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyICVpbiUgeWVhcnMpCgpuZWdfYWcgPC0gc3dlZXAobmJwX2VucywgMiwgcmVzaWRbcmVzaWRfaXhdLCBGVU4gPSAnKycpCgoKbWF0cGxvdCh5ZWFycywgdCgtbmVnX2FnKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0gYygwLCA4KSwgY29sID0gcGxvdGNvbCwgCiAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdhdG1vc3BoZXJpYyBncm93dGgnLCB4bGFiID0gJycsCiAgICAgICAgIGJ0eSA9ICduJywgeGxpbSA9IGMoMTk2MCwgMjAyMCkpCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBhdG1vc3BoZXJpYyBncm93dGhgLCBjb2wgPSAncmVkJykKCgpgYGAKCgojIyMgYW5vdGhlciB3YXkgdG8gY2FsY2x1bGF0ZSBhdG1vc3BoZXJpYyBncm93dGgKClRoZXNlIHR3byBtZXRob2RzIGdpdmUgdmVyeSBzaW1pbGFyIG91dGNvbWVzLCBiYXIgYW4gb3V0bGllci4KCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gN30KCmFnIDwtIG1hdHJpeChucm93ID0gbnJvdyhuYnBfZW5zKSwgbmNvbCA9IG5jb2wobmJwX2VucykpCmZvcihpIGluIDE6bnJvdyhuYnBfZW5zKSl7CiAgCiAgYWdbaSwgXSA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGZvc3NpbCBlbWlzc2lvbnMgZXhjbHVkaW5nIGNhcmJvbmF0aW9uYFtyZXNpZF9peF0gLSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYG9jZWFuIHNpbmtgW3Jlc2lkX2l4XSAtICBuYnBfZW5zW2ksIF0KICAKfQoKI3BkZih3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGZpbGUgPSAnYWcucGRmJykKbWF0cGxvdCh5ZWFycywgdChhZyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IGMoMCwgOCksIGNvbCA9ICdkYXJrcmVkJywgCiAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdhdG1vc3BoZXJpYyBncm93dGgnLCB4bGFiID0gJycsCiAgICAgICAgIGJ0eSA9ICduJywgeGxpbSA9IGMoMTk2MCwgMjAyMCkpCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBhdG1vc3BoZXJpYyBncm93dGhgLCBjb2wgPSAnYmxhY2snLCBsd2QgPTIpCiNkZXYub2ZmKCkKCmBgYAoKCgoKCiMjIyBMYW5kIGNhcmJvbiBTaW5rPwoKSSB0aGluayB0byBtYWtlIGEgZmFpciBjb21wYXJpc29uLCB3ZSBtaWdodCBuZWVkIHRvIHRha2UgdGhlIGRpZmYgb2YgdGhlIGFub21hbHkgKG9yIGp1c3QgdGhlIHRpbWVzZXJpZXMpLCBhcyB0aGUgYWJvdmUgcmVwcmVzZW50cyB0aGUgdG90YWwgY2hhbmdlIHNpbmNlIDE4NTAsIGFuZCBJIHRoaW5rIGFsbCB0aGUgImxhbmQgc2luayIgc3R1ZmYgbG9va3MgYXQgdGhlIHllYXItdG8teWVhciBjaGFuZ2VzLgoKYGBge3IgdG90YWwtbGFuZC1jYXJib24tc2luaywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CgpsYW5kc2lua19lbnMgPC0gbWF0cml4KE5BLCBucm93ID0gbnJvdyh0b3RhbF9sYW5kX2NhcmJvbl9lbnMpLCBuY29sID0gbmNvbCh0b3RhbF9sYW5kX2NhcmJvbl9lbnMpLTEpCgpmb3IoaSBpbiAxOm5yb3cobGFuZHNpbmtfZW5zKSl7CiAgCiAgbGFuZHNpbmtfZW5zW2ksIF0gPC0gZGlmZih0b3RhbF9sYW5kX2NhcmJvbl9lbnNbaSwgXSkKfQoKCnlsaW0gPSByYW5nZShsYW5kc2lua19lbnMpCm1hdHBsb3QoeWVhcnNbLTFdLCB0KGxhbmRzaW5rX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IHBsb3Rjb2wsIHhsYWIgPSAnJywKICAgICAgICB5bGFiID0gJ0d0Qy95ZWFyJywgbWFpbiA9ICdUb3RhbCBsYW5kIGNhcmJvbiBzaW5rJywKICAgICAgICBidHkgPSAnbicpCm1hdGxpbmVzKCB5ZWFyc1stMV0sIHQoKGxhbmRzaW5rX2Vuc1t0b3BsZXZlbF90b19sZXZlbF8xYV9peCwgXSlbbGV2ZWwyX2l4LCBdKSwgY29sID0gJ3RvbWF0bzMnLCBsdHkgPSAnc29saWQnKQoKbGluZXMoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYCwgY29sID0gJ2JsdWUnLCBsd2QgPSAyLCB4bGFiID0gJycpCmxlZ2VuZCgnYm90dG9tbGVmdCcsIGxlZ2VuZCA9IGMoJ1J1bGVkIG91dCcsJ2xldmVsIDFhIGNvbnN0cmFpbmVkJywnaGlzdG9yaWNhbCcpLCBjb2wgPSBjKCdibGFjaycsJ3RvbWF0bzMnLCAnYmx1ZScgKSwgbHR5ID0nc29saWQnLAogICAgICAgbHdkID0gYygxLDEsMikpCgoKYGBgCgoKIyMjIElkZW50aWZ5IHBhcnRzIG9mIHBhcmFtZXRlciBzcGFjZSB3aGVyZSB0aGUgbGFuZCBjYXJib24gc2luayBpcyBhdCBpdHMgbWF4aW11bQpXaGF0IGRvIHRoZXNlIHBhcnRzIG9mIHBhcmFtZXRlciBzcGFjZSB0ZWxsIHVzIGFib3V0IHdoYXQgd2UgbmVlZCB0byBkbyB0byBoYXZlIHRoZSBtb2RlbCByZXByb2R1Y2UgcmVhbGl0eT8KYGBge3J9CgojIEJ1aWxkIGFuIGVtdWxhdG9yIGZvciB0b3RhbCBsYW5kIGNhcmJvbiB1cHRha2UgYXQgdGhlIGVuZCBvZiB0aGUgY2VudHVyeQoKCiMgZW5zZW1ibGUgb2YgbW9kZXJuIGxhbmRzaW5rCmxhbmRzaW5rX21vZGVybl9peCA8LSB3aGljaCh5ZWFyc1stMV0gJWluJSAxOTk0OjIwMTMpCgpsYW5kc2lua19tb2Rlcm5fZW5zIDwtIChhcHBseShsYW5kc2lua19lbnNbLCBsYW5kc2lua19tb2Rlcm5faXhdLCAxLCBtZWFuKSkKCmxhbmRzaW5rX21vZGVybl9lbnNfbGV2ZWwxYSA8LSBsYW5kc2lua19tb2Rlcm5fZW5zW3RvcGxldmVsX3RvX2xldmVsXzFhX2l4XQoKIyBvYnNlcnZhdGlvbnMgb2YgbW9kZXJuIGxhbmQgc2luawoKaGlzdF9peCA8LSB3aGljaChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciAlaW4lIDE5OTQ6MjAxMykKbGFuZHNpbmtfbW9kZXJuX29icyA8LSBtZWFuKGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYFtoaXN0X2l4IF0pCgojIFRoaXMgaXMgYWxsIDQ5OSBtZW1iZXJzCmxhbmRzaW5rX21vZGVybl9lcnIgPC0gbGFuZHNpbmtfbW9kZXJuX2VucyAtIGxhbmRzaW5rX21vZGVybl9vYnMKCmxhbmRzaW5rX21vZGVybl9lcnJfbGV2ZWwxYSA8LSBsYW5kc2lua19tb2Rlcm5fZXJyW3RvcGxldmVsX3RvX2xldmVsXzFhX2l4XSMKCgoKI1tsZXZlbDJfaXgsIF0KCiMgQnVpbGQgZW11bGF0b3JzIAoKIyBJZGVudGlmeSB0aGUgcGFydHMgb2YgcGFyYW1ldGVyIHNwYWNlIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBhcmUgbG93CgoKIyBBcmUgd2UgZ2V0dGluZyBjbG9zZSBmb3IgdGhlIHJpZ2h0IHJlYXNvbnM/IFdoYXQgZWxzZSBpcyBnb2luZyB3cm9uZz8KCgoKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDZ9CgoKcGFyKG1mcm93ID0gYyg0LDgpLCBtYXIgPSBjKDMsMiwyLDEpKQpmb3IoaSBpbiAxOmQpewogIAogIHBsb3QoWF9sZXZlbDFhWywgaV0sbGFuZHNpbmtfbW9kZXJuX2Vycl9sZXZlbDFhLCApCiAgCn0KCgpgYGAKCmBgYHtyLCByZXN1bHRzID0gJ2hpZGUnfQogIAoKZml0X2xhbmRzaW5rX2VyciA8LSBrbSh+LixkZXNpZ24gPSBYX2xldmVsMWEsIHJlc3BvbnNlID0gIGxhbmRzaW5rX21vZGVybl9lcnJfbGV2ZWwxYSkKCgpgYGAKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSA4fQoKcGxvdChmaXRfbGFuZHNpbmtfZXJyKQoKYGBgCgojIyMgd2hhdCBwYXJ0cyBvZiBwYXJhbWV0ZXIgc3BhY2UgYXJlIHRoZSBjbG9zZXN0PwpgYGB7cn0KCiMgVHdvIHN0cmF0ZWdpZXMgLSBwbG90IGxhbmQgc2luayBlcnJvciBhZ2FpbnN0IHBhcmFtZXRlcnMsIGFuZCBpZGVudGlmeSBiaXRzIG9mIHBhcmFtZXRlciBzcGFjZSB3aXRoIHNtYWxsZXN0IGVycm9yCgojbG93X2Vycm9yX2l4IDwtIGxhbmRzaW5rX21vZGVybl9lcnJfbGV2ZWwxYQoKCm1pbnMgPC0gYXBwbHkoWF9sZXZlbDFhLDIsRlVOID0gbWluKQptYXhlcyA8LSBhcHBseShYX2xldmVsMWEsMixGVU4gPSBtYXgpCiAgCm5zYW1wX3VuaWYgPC0gMTAwMDAwICAKWF91bmlmIDwtIHNhbXBfdW5pZihuc2FtcF91bmlmLCBtaW5zID0gbWlucywgbWF4ZXMgPSBtYXhlcykKCnByZWRfdW5pZiA8LSBwcmVkaWN0KGZpdF9sYW5kc2lua19lcnIsIG5ld2RhdGEgPSBYX3VuaWYsIHR5cGUgPSAnVUsnKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQoKCnBhcihvbWEgPSBjKDAsMCwwLDMpLCBiZyA9ICd3aGl0ZScpCnBhaXJzKFhfbGV2ZWwxYSwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gY3BvaW50cywKICAgICAgej0gbGFuZHNpbmtfbW9kZXJuX2Vuc19sZXZlbDFhLAogICAgICBjb2wgPSBieXIsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIHBjaCA9IDIwCiAgICAgICkKCiNpbWFnZS5wbG90KGxlZ2VuZC5vbmx5ID0gVFJVRSwKIyAgICAgICAgICAgemxpbSA9IGMoMCwxKSwKIyAgICAgICAgICAgY29sID0gYmx1ZXMsCiMgICAgICAgICAgIGxlZ2VuZC5hcmdzID0gbGlzdCh0ZXh0ID0gJ0RlbnNpdHkgb2YgbW9kZWwgcnVucyBtYXRjaGluZyB0aGUgY3JpdGVyaWEnLCBzaWRlID0gMywgbGluZSA9IDEpLAojICAgICAgICAgICBob3Jpem9udGFsID0gVFJVRQojKQoKIyAgbGVnZW5kKCdsZWZ0JywgbGVnZW5kID0gcGFzdGUoMTpkLCBjb2xuYW1lcyhsaHMpKSwgY2V4ID0gMC45LCBidHkgPSAnbicpCgoKYGBgCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgoKWF9rZXB0IDwtIFhfdW5pZlthYnMocHJlZF91bmlmJG1lYW4pIDwgMSwgXSAKCnBhcihvbWEgPSBjKDAsMCwwLDMpLCBiZyA9ICd3aGl0ZScpCnBhaXJzKFhfa2VwdCwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gZGZ1bmNfdXAsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIGRmdW5jLmNvbCA9IGJsdWVzKQoKaW1hZ2UucGxvdChsZWdlbmQub25seSA9IFRSVUUsCiAgICAgICAgICAgemxpbSA9IGMoMCwxKSwKICAgICAgICAgICBjb2wgPSBibHVlcywKICAgICAgICAgICBsZWdlbmQuYXJncyA9IGxpc3QodGV4dCA9ICdEZW5zaXR5IG9mIG1vZGVsIHJ1bnMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhJywgc2lkZSA9IDMsIGxpbmUgPSAxKSwKICAgICAgICAgICBob3Jpem9udGFsID0gVFJVRQopCgpsZWdlbmQoJ2xlZnQnLCBsZWdlbmQgPSBwYXN0ZSgxOmQsIGNvbG5hbWVzKGxocykpLCBjZXggPSAwLjksIGJ0eSA9ICduJykKCgoKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDZ9CgpwYXIobWZyb3cgPSBjKDQsOCksIG1hciA9IGMoMywyLDIsMSkpCgpmb3IoaSBpbiAxOmQpewogIAogIGhpc3QoWF9rZXB0WywgaV0sIGNvbCA9ICdncmV5JywgYm9yZGVyID0gJ3doaXRlJywgCiAgICAgICAgeGxpbSA9IGMoMCwxKSwgYnJlYWtzID0gc2VxKGZyb20gPSAwLCB0byA9IDEsIGJ5ID0gMC4xKSwKICAgICAgIG1haW4gPSBjb2xuYW1lcyhYX2tlcHQpW2ldKQogIAp9CgoKYGBgCgoKCgoKSG93IGdvb2QgYXJlIHRoZSBmb3VyIGVtdWxhdG9ycyB0aGF0IHdlJ3ZlIGJ1aWx0PyBBcmUgdGhlcmUgYmlhc2VzPyAodGhlcmUncyBubyByZWFsIGV2aWRlbmNlIG9mIHRoaXMpCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtZnJvdyA9IGMoMiwyKSkKCmZvcihpIGluIDE6NCl7CiAgCmhpc3Qod2F2ZTEkcHJlZF9saXN0W1tpXV0kbWVhbiwgbWFpbiA9IGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpW2ldKQogIAp9CgoKYGBgCgoKCldoYXQgZG8gdGhlIGVtdWxhdG9ycyBtYWtlIG9mIHRoZSBkZXNpZ24gcG9pbnRzIHdoaWNoIGFjdHVhbGx5IG1ha2UgQW5keSdzICJoYXJkIGJvdW5kYXJ5IiBjcml0ZXJpYT8KSWYgd2UgbGVhdmUgdGhlbSBvdXQsIGRvIHRoZXkgc3RpbGwgcGxhY2UgdGhlIG91dHB1dCB3aXRoaW4gdGhlIGhhcmQgYm91bmRhcmllcz8KCmBgYHtyfQoKICBhd19ib3VuZGFyeV9peCA9IHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gLTEwICYKICAgICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgJgogICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSA+IDc1MCAmIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDAKICAgICkKCgoKWF9hd19ib3VuZGFyeSA9IFhfbGV2ZWwxYVthd19ib3VuZGFyeV9peCwgXQpZX2F3X2JvdW5kYXJ5ID0gWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgXQoKYGBgCgojIyBDaGVjayB0aGUgZW11bGF0b3JzIHRoYXQgcHJvZHVjZSB0aGUgbmV3IGRlc2lnbgpEbyBhIGxlYXZlLW9uZS1vdXQgY3Jvc3MgdmFsaWRhdGlvbiBvZiBwb2ludHMgaW5zaWRlIHRoZSBoYXJkIGJvdW5kYXJpZXMgdXNpbmcgdGhlIHdhdmUxIGZpdHMuCmBgYHtyfQojIHF1aWNrZXN0IHRvIGZpbmQgdGhlIGxvbyBwcmVkaWN0aW9ucyBhdCB0aGUgcmlnaHQgaW5kaWNlcwoKCmBgYAoKYGBge3J9Cgpsb29fbWVhbl9ZX2xldmVsMWEgPC0gbWF0cml4KG5yb3cgPSBucm93KFhfbGV2ZWwxYSksIG5jb2wgPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKQpsb29fc2RfWV9sZXZlbDFhIDwtIG1hdHJpeChucm93ID0gbnJvdyhYX2xldmVsMWEpLCBuY29sID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSkKICAKICBmb3IoaSBpbiAxOm5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpewoKbG9vIDwtIGxlYXZlT25lT3V0LmttKHdhdmUxJGZpdF9saXN0W1tpXV0sdHlwZSA9ICdVSycsIHRyZW5kLnJlZXN0aW0gPSBUUlVFICkKICBsb29fbWVhbl9ZX2xldmVsMWFbLGldIDwtIGxvbyRtZWFuCiAgbG9vX3NkX1lfbGV2ZWwxYVssaV0gPC0gbG9vJHNkCn0KCmBgYAoKV2Ugc2VlIGluIHRoZSBsZWF2ZS1vbmUtb3V0IGFuYWx5c2lzIHRoYXQgdGhlIGVtdWxhdG9yIGlzIGNvbnNpc3RlbnRseSB1bmRlci1wcmVkaWN0aW5nIHRoZSB2ZWdldGF0aW9uIGNhcmJvbiAodGhvdWdoIHRoZSB1bmNlcnRhaW50eSBlc3RpbWF0ZSBvZnRlbiBjb3ZlcnMgdGhlIGFjdHVhbCB2YWx1ZSkuVGhpcyBzdWdnZXN0cyAoMSkgdGhhdCB0aGVyZSBpc24ndCByZWFsbHkgYSBodWdlIHByb2JsZW0gd2l0aCBhIG1vZGVsIGRpc2NyZXBhbmN5IChvciBhdCBsZWFzdCB0aGF0IGlzbid0IHRoZSBvbmx5IHByb2JsZW0pLCBhbmQgKDIpIHRoZSBoaXN0b3J5IG1hdGNoaW5nIGlzIHdvcmtpbmcgYXMgaXQgc2hvdWxkLCBhbmQgdGFraW5nIGludG8gYWNjb3VudCBhIG5vdC1ncmVhdCBlbXVsYXRvci4KCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtZnJvdyA9IGMoMiwyKSkKCmZvcihpIGluIDE6bmNvbChsb29fbWVhbl9ZX2xldmVsMWEpKXsKICAKICBybiA8LSByYW5nZShjKGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSAtICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICwgbG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldICsgKDIqbG9vX3NkX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSkgKSkKICAKICAKICAKICBwbG90KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldLCBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0sIHlsaW0gPSBybiwgbWFpbiA9IGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpW2ldLCB4bGFiID0gJ2FjdHVhbCcsIHlsYWIgPSAncHJlZGljdGVkJykKICAKICBzZWdtZW50cyh4MCA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldLCB5MCA9IGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSAtICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICAsIHgxID0gWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgaV0gLCB5MSA9IGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSArICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICwgY29sID0gbWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSkKICBhYmxpbmUoMCwxKQogIAp9CgoKYGBgCgojIyBDb21wYXJlIHRoZSBzdHJhaWdodCBrbSB3aXRoIGEgdHdvLXN0ZXAgZW11bGF0b3IKSXMgYSB0d28tc3RlcCBlbXVsYXRvciBhbnkgYmV0dGVyIGF0IGVtdWxhdGluZyB0aG9zZSBjcnVjaWFsIHBvaW50cyB3aGljaCBmYWxsIHdpdGhpbiBhdydzIGhhcmQgYm91bmRhcmllcz8gRmlyc3QsIGNyZWF0ZSBhIGxpc3Qgb2YgZW11bGF0b3IgZml0cy4KCmBgYHtyfQoKZml0bGlzdF9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkIDwtIHZlY3Rvcihtb2RlID0gJ2xpc3QnLCBsZW5ndGggPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKQoKZm9yKGkgaW4gMTpuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLGldCiAgZml0IDwtIHR3b1N0ZXBfZ2xtbmV0KFggPSBYX2xldmVsMWEsIHkpCiAgZml0bGlzdF9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkW1tpXV0gPC0gZml0Cgp9CgoKYGBgCgpgYGB7cn0KbG9vX21lYW5fZ2xtbmV0X1lfbGV2ZWwxYSA8LSBtYXRyaXgobnJvdyA9IG5yb3coWF9sZXZlbDFhKSwgbmNvbCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpCmxvb19zZF9nbG1uZXRfWV9sZXZlbDFhIDwtIG1hdHJpeChucm93ID0gbnJvdyhYX2xldmVsMWEpLCBuY29sID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSkKICAKICBmb3IoaSBpbiAxOm5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpewoKbG9vIDwtIGxlYXZlT25lT3V0LmttKGZpdGxpc3RfWV9jb25zdF9sZXZlbDFhX3NjYWxlZFtbaV1dJGVtdWxhdG9yLHR5cGUgPSAnVUsnLCB0cmVuZC5yZWVzdGltID0gVFJVRSApCiAgbG9vX21lYW5fZ2xtbmV0X1lfbGV2ZWwxYVssaV0gPC0gbG9vJG1lYW4KICBsb29fc2RfZ2xtbmV0X1lfbGV2ZWwxYVssaV0gPC0gbG9vJHNkCn0KCmBgYAoKSXQgZG9lc24ndCBhcHBlYXIgdGhhdCB0aGUgdHdvLXN0ZXAgZW11bGF0b3IgKGhlcmUgcGxvdHRlZCBpbiByZWQpIGlzIGRvaW5nIGFueSBiZXR0ZXIgdGhhbiB0aGUgcmVndWxhciBlbXVsYXRvci4KYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4fQpwYXIobWZyb3cgPSBjKDIsMikpCgpmb3IoaSBpbiAxOm5jb2wobG9vX21lYW5fWV9sZXZlbDFhKSl7CiAgCiAgcm4gPC0gcmFuZ2UoYyhsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gLSAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAsIGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSArICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICkpCiAgCiAgCiAgCiAgcGxvdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgbG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldLCB5bGltID0gcm4sIG1haW4gPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgeGxhYiA9ICdhY3R1YWwnLCB5bGFiID0gJ3ByZWRpY3RlZCcpCiAgCiAgcG9pbnRzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldLCBsb29fbWVhbl9nbG1uZXRfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldLCBjb2wgPSAncmVkJykKICAKICAKICBzZWdtZW50cyh4MCA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldLCB5MCA9IGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSAtICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICAsIHgxID0gWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgaV0gLCB5MSA9IGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSArICgyKmxvb19zZF9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICwgY29sID0gbWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSkKICBhYmxpbmUoMCwxKQogIAp9CmBgYAoKVHdvIG90aGVyIHRoaW5ncyBJIGNhbiB0aGluayBvZiB0byBjaGVjazogMSkgaG93IGFib3V0IHVzaW5nICJtdWx0aXN0YXJ0IiB0byBjaG9vc2UgZGlmZmVyZW50IHN0YXJ0aW5nIGNvbmRpdGlvbnMgZm9yIG9wdGltaXNpbmcgdGhlIGVtdWxhdG9ycyBhbmQgMikgVXNpbmcgYSBmbGF0IHByaW9yIGZvciB0aGUgbWVhbiBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIGxpbmVhciBwcmlvci4KYGBge3J9CgpmaXRsaXN0X2ZsYXRwcmlvcl9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkIDwtIHZlY3Rvcihtb2RlID0gJ2xpc3QnLCBsZW5ndGggPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKQoKZm9yKGkgaW4gMTpuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLGldCiAgZml0IDwtIGttKGZvcm11bGEgPX4xLCBkZXNpZ24gPSBYX2xldmVsMWEsIHJlc3BvbnNlID0geSkKICBmaXRsaXN0X2ZsYXRwcmlvcl9ZX2NvbnN0X2xldmVsMWFfc2NhbGVkW1tpXV0gPC0gZml0Cgp9CgoKYGBgCgpgYGB7cn0KbG9vX21lYW5fZmxhdHByaW9yX1lfbGV2ZWwxYSA8LSBtYXRyaXgobnJvdyA9IG5yb3coWF9sZXZlbDFhKSwgbmNvbCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpCmxvb19zZF9mbGF0cHJpb3JfWV9sZXZlbDFhIDwtIG1hdHJpeChucm93ID0gbnJvdyhYX2xldmVsMWEpLCBuY29sID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSkKICAKICBmb3IoaSBpbiAxOm5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkpewoKbG9vIDwtIGxlYXZlT25lT3V0LmttKGZpdGxpc3RfZmxhdHByaW9yX1lfY29uc3RfbGV2ZWwxYV9zY2FsZWRbW2ldXSx0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUgKQogIGxvb19tZWFuX2ZsYXRwcmlvcl9ZX2xldmVsMWFbLGldIDwtIGxvbyRtZWFuCiAgbG9vX3NkX2ZsYXRwcmlvcl9ZX2xldmVsMWFbLGldIDwtIGxvbyRzZAp9CgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KcGFyKG1mcm93ID0gYygyLDIpKQoKZm9yKGkgaW4gMTpuY29sKGxvb19tZWFuX1lfbGV2ZWwxYSkpewogIAogIHJuIDwtIHJhbmdlKGMobG9vX21lYW5fWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldIC0gKDIqbG9vX3NkX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSkgLCBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gKyAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSApKQogIAogIAogIAogIHBsb3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFthd19ib3VuZGFyeV9peCwgaV0sIGxvb19tZWFuX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSwgeWxpbSA9IHJuLCBtYWluID0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIHhsYWIgPSAnYWN0dWFsJywgeWxhYiA9ICdwcmVkaWN0ZWQnKQogIAogIHBvaW50cyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgbG9vX21lYW5fZmxhdHByaW9yX1lfbGV2ZWwxYVthd19ib3VuZGFyeV9peCxpXSwgY29sID0gJ3JlZCcpCiAgCiAgCiAgc2VnbWVudHMoeDAgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2F3X2JvdW5kYXJ5X2l4LCBpXSwgeTAgPSBsb29fbWVhbl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0gLSAoMipsb29fc2RfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldKSAgLCB4MSA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbYXdfYm91bmRhcnlfaXgsIGldICwgeTEgPSBsb29fbWVhbl9mbGF0cHJpb3JfWV9sZXZlbDFhW2F3X2JvdW5kYXJ5X2l4LGldICsgKDIqbG9vX3NkX2ZsYXRwcmlvcl9ZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsaV0pICwgY29sID0gbWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDcwKSkKICBhYmxpbmUoMCwxKQogIAp9CgoKCmBgYAoKCgojIEV4cGxvcmluZyBuZXcgY29uc3RyYWludHMKSW5wdXQgZnJvbSBFZGR5IFJvYmVydHNvbjoKCiJXZSBjYW4gYXNzdW1lIHRoYXQgdGhlIG1ham9yaXR5IG9mIHZlZ2V0YXRpb24gY2FyYm9uIGlzIHN0b3JlZCBpbiB0cmVlIHRydW5rcyBzbywgdGhlIGNhcmJvbiBkZW5zaXR5IG9mIHRyZWVzIGlzIGFwcHJveGltYXRlbHkgKGNWZWdfbG5kX21lYW4gLyB0cmVlRnJhY19sbmRfbWVhbikuIEFsdGhvdWdoIEkgc3VwcG9zZSBpdCdzIHBvc3NpYmxlIHRoYXQgaW4gdGhlIFBQRSB0aGUgc2hydWJzIGhhdmUgYmVjb21lIHRyZWUtbGlrZSwgc28gaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gcGxvdCBjVmVnX2xuZF9tZWFuIHZlcnN1cyAgKHNocnViRnJhY19sbmRfbWVhbiArIHRyZWVGcmFjX2xuZF9tZWFuKSBhcyB3ZWxsLiBUaGUgZmlyc3QgcXVlc3Rpb24gaXMgd2hldGhlciBjVmVnX2xuZF9tZWFuIGluY3JlYXNlcyBsaW5lYXJseSB3aXRoIHRyZWVGcmFjX2xuZF9tZWFuLiBUaGVuIGlmIHRoaXMgdHVybmVkIG91dCB0byBiZSBpbnRlcmVzdGluZywgd2UgY291bGQgcHJvZHVjZSBhIHRyZWVDVmVnX2xuZF9tZWFuIG91dHB1dC4iCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDd9CgojcGRmKGZpbGUgPSAndmVnQ19kZW5zaXR5LnBkZicsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNikKcGxvdChZX2xldmVsMFssJ3RyZWVGcmFjX2xuZF9tZWFuJ10sWV9sZXZlbDBbLCdjVmVnX2xuZF9tZWFuJ10sIG1haW4gPSAiVmVnZXRhdGlvbiAodHJlZSkgY2FyYm9uIGRlbnNpdHksIExldmVsMCIsCiAgICAgeGxhYiA9ICd0cmVlRnJhY19sbmRfbWVhbicsIHlsYWIgID0gJ2NWZWdfbG5kX21lYW4nICkKCiNkZXYub2ZmKCkKCmBgYAoKSXMgdGhlIHJhbmdlIG9mIGNhcmJvbiBkZW5zaXRpZXMgbmFycm93ZXIgaW4gdGhlICJoYXJkIGJvdW5kYXJ5IiBzZXQ/CmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuaGVpZ2h0ID0gNn0KCllfbGV2ZWwxYV9hdyA8LSBZX2xldmVsMWFbYXdfYm91bmRhcnlfaXgsIF0KWF9sZXZlbDFhX2F3IDwtIFhfbGV2ZWwxYVthd19ib3VuZGFyeV9peCwgXQoKI3BkZihmaWxlID0gJ3ZlZ0NfZGVuc2l0eV9hdy5wZGYnLCB3aWR0aCA9IDYsIGhlaWdodCA9IDYpCnBsb3QoWV9sZXZlbDFhWywndHJlZUZyYWNfbG5kX21lYW4nXSxZX2xldmVsMWFbLCdjVmVnX2xuZF9tZWFuJ10sIG1haW4gPSAiVmVnZXRhdGlvbiAodHJlZSkgY2FyYm9uIGRlbnNpdHkiLAogICAgIHhsYWIgPSAndHJlZUZyYWNfbG5kX21lYW4nLCB5bGFiICA9ICdjVmVnX2xuZF9tZWFuJyApCgpwb2ludHMoIFlfbGV2ZWwxYV9hd1ssJ3RyZWVGcmFjX2xuZF9tZWFuJ10sWV9sZXZlbDFhX2F3WywnY1ZlZ19sbmRfbWVhbiddLCBwY2ggPSAxOSwgY29sID0gJ3JlZCcpCmxlZ2VuZCgndG9wbGVmdCcsIGxlZ2VuZCA9IGMoJ0xldmVsMWEnLCdBVyBjb25zdHJhaW50cycpLCBwY2ggPSBjKDIxLCAxOSksIGNvbCA9IGMoJ2JsYWNrJywgJ3JlZCcpKQojICAgZGV2Lm9mZigpCgoKCmBgYAoKCgoKYGBge3J9CmNfZGVuc2l0eSA8LSBZX2xldmVsMWFbLCd0cmVlRnJhY19sbmRfbWVhbiddIC8gWV9sZXZlbDFhWywnY1ZlZ19sbmRfbWVhbiddCgpoaXN0KGNfZGVuc2l0eSkKCgoKYGBgCgojIyBOb3cgdGhhdCB3ZSBoYXZlIGNvbnN0cmFpbnRzLCB3ZSBjYW4gZXhwbG9yZSB0aGVpciBlZmZlY3Qgb24gdGhlIG91dHB1dCAKCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDIwfQojIFBhaXJzIHBsb3Qgb2Ygb3V0cHV0CnlfbmFtZXNfbWVhbiA8LSBjKCduYnBfbG5kX21lYW4nLCAnZkx1Y19sbmRfbWVhbicsICducHBfbmxpbV9sbmRfbWVhbicsICdjU29pbF9sbmRfbWVhbicsCiAgICAgICAgICAgICdjVmVnX2xuZF9tZWFuJywgJ2xhbmRDb3ZlckZyYWNfbG5kX21lYW4nLCAnZkhhcnZlc3RfbG5kX21lYW4nLAogICAgICAgICAgICAnbGFpX2xuZF9tZWFuJywgJ3JoX2xuZF9tZWFuJywgJ3RyZWVGcmFjX2xuZF9tZWFuJywgJ2MzUGZ0RnJhY19sbmRfbWVhbicsIAogICAgICAgICAgICAnYzRQZnRGcmFjX2xuZF9tZWFuJywgJ3NocnViRnJhY19sbmRfbWVhbicsICdiYXJlc29pbEZyYWNfbG5kX21lYW4nKQoKWV9sZXZlbDFhX21lYW4gPC0gWV9sZXZlbDFhWyx5X25hbWVzX21lYW5dCgpwY29sIDwtIHJlcCgnYmxhY2snLCBucm93KFlfbGV2ZWwxYV9tZWFuKSkKcGNvbFthd19ib3VuZGFyeV9peF0gPC0gJ3JlZCcKcGFpcnMoWV9sZXZlbDFhX21lYW4sIGNvbCA9IHBjb2wsIGxvd2VyLnBhbmVsID0gTlVMTCwgcGNoID0gMTksIGNleC5sYWJlbHMgPSAxLjUpCgoKCgpgYGAKCiMjIEhvdyBtdWNoIGRvZXMgY29uc3RyYWluaW5nIGFuIG91dHB1dCBjb25zdHJhaW4gb3RoZXIgb3V0cHV0cz8KRm9yIGV4YW1wbGUsIHdoYXQgZWZmZWN0IGhhcyB0aGUgQVcgImhhcmQgYm91bmRhcnkiIGNvbnN0cmFpbnQgcHJvZHVjZWQgb24gcmFuZ2VzIG9mIHRoZSBvdGhlciAobWFyZ2luYWwpIG91dHB1dHM/IFdoaWNoIGNvbnN0cmFpbnQgaXMgZG9pbmcgdGhlIG1ham9yaXR5IG9mIHRoZSB3b3JrPwoKCkEgZnVuY3Rpb24gdG8gZmluZCB0aGUgcHJvcG9ydGlvbiBvZiBvdXRwdXQgc3BhY2UgdGhhdCBpcyByZW1vdmVkIChvciByZXRhaW5lZCkgd2hlbiBhcHBseWluZyBhIGNvbnN0cmFpbnQuCmBgYHtyfQoKY29uc3RyYWludF9wcm9wIDwtIGZ1bmN0aW9uKFksIGNvbnN0cmFpbnRfaXgpewogIAogIFljb25zdCA8LSBZW2NvbnN0cmFpbnRfaXgsIF0KICBZY29uc3Rfbm9ybSA8LSBub3JtYWxpemUoWWNvbnN0LCB3cnQgPSBZKQogIHJuIDwtIGFwcGx5KFljb25zdF9ub3JtLCAyLCByYW5nZSkKICBvdXQgPC0gcm4KICBvdXQKICAKfQoKCmBgYAoKYGBge3J9CllfY29uc3RyYWludF9wbG90IDwtIGZ1bmN0aW9uKGNvbnN0cmFpbnRfcmFuZ2UsIGNvbnN0cmFpbnRfY29sdW1ucywgLi4uKXsKICAjIEEgZnVuY3Rpb24gdG8gcGxvdCB0aGUgb3V0cHV0IG9mIGNvbnN0cmFpbnRfcHJvcAogIAogIHBhcihtYXIgPSBjKDEyLDQsMywyKSxsYXMgPSAyKQoKcGNvbCA9IHJlcCgnYmxhY2snLCBuY29sKGNvbnN0cmFpbnRfcmFuZ2UpKQpwY29sW2NvbnN0cmFpbnRfY29sdW1uc10gPC0gJ3JlZCcgIyBwbG90IHRoZSBvdXRwdXRzIHdoZXJlIHdlIGhhdmUgc3BlY2lmaWVkIHRoZSBjb25zdHJhaW50cyBpbiByZWQuCgpwbG90KDE6bmNvbChjb25zdHJhaW50X3JhbmdlKSxjb25zdHJhaW50X3JhbmdlWzIsXSwgeWxpbSA9IGMoMCwxKSAsIGF4ZXMgPSBGQUxTRSwgeGxhYiA9ICcnLCB5bGFiID0gJ3JhbmdlIG9mIGVuc2VtYmxlIChmcmFjdGlvbiknLCBjb2wgPSBwY29sLCBwY2ggPSAxOSwgLi4uKQpwb2ludHMoMTpuY29sKGNvbnN0cmFpbnRfcmFuZ2UpLCBjb25zdHJhaW50X3JhbmdlWzEsXSwgY29sID0gcGNvbCwgcGNoID0gMTkpCnNlZ21lbnRzKHgwID0gMTpuY29sKGNvbnN0cmFpbnRfcmFuZ2UpLCB5MCA9IGNvbnN0cmFpbnRfcmFuZ2VbMSxdLCB4MSA9IDE6bmNvbChjb25zdHJhaW50X3JhbmdlKSwgeTEgPSBjb25zdHJhaW50X3JhbmdlWzIsXSwgY29sID0gcGNvbCwgbHdkID0yICkKCmF4aXMoc2lkZSA9IDEsIGxhYmVscyA9IGNvbG5hbWVzKGNvbnN0cmFpbnRfcmFuZ2UpLCBhdCA9IDE6bmNvbChjb25zdHJhaW50X3JhbmdlKSkKYXhpcygyKQphYmxpbmUoaCA9IGMoMCwxKSwgY29sID0gJ3JlZCcpCiAgCn0KYGBgCgpBbGwgY29uc3RyYWludHMgdG9nZXRoZXIgdGFrZSB0aGUgbm9ybWFsaXplZCByYW5nZSBvZiBhbGwgdGhlIG91dHB1dHMgdG8gYSBsaXR0bGUgdW5kZXIgYSBoYWxmIG9mIHRoZSBvcmlnaW5hbCByYW5nZSwgb24gYXZlcmFnZS4gT2YgY291cnNlLCBmb3VyIG9mIHRoZSBpbnB1dHMgYXJlIGNvbnN0cmFpbmVkIGhlcmUsIHdoaWNoIGhhcyBxdWl0ZSBhIGxhcmdlIGltcGFjdC4KYGBge3J9CllfbGV2ZWwxYV9tZWFuX2F3X25vcm1fcm4gPC0gY29uc3RyYWludF9wcm9wKFkgPSBZX2xldmVsMWFfbWVhbiwgY29uc3RyYWludF9peCA9IGF3X2JvdW5kYXJ5X2l4KQptZWFuX2NvbnN0cmFpbnRfYWxsIDwtIG1lYW4oWV9sZXZlbDFhX21lYW5fYXdfbm9ybV9yblsyLCBdIC0gWV9sZXZlbDFhX21lYW5fYXdfbm9ybV9yblsxLCBdKQpZX2NvbnN0cmFpbnRfcGxvdChZX2xldmVsMWFfbWVhbl9hd19ub3JtX3JuLGNvbnN0cmFpbnRfY29sdW1ucyA9IGMoYygxLDMsNCw1KSksIG1haW4gPSBwYXN0ZSgnbWVhbiBjb25zdHJhaW5lZCByYW5nZSA9Jywgcm91bmQobWVhbl9jb25zdHJhaW50X2FsbCwzKSkpCmBgYAoKV2UgY2FuIHNlZSB3aGF0IGltcGFjdHMgdGhlIGNvbnN0cmFpbnRzIGhhdmUgaW5kaXZpZHVhbGx5CmBgYHtyfQoKbmJwX2l4IDwtIHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gLTEwKQpucHBfaXggPC0gd2hpY2goWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSA+IDM1ICYgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCApCmNTb2lsX2l4IDwtIHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddIDwgMzAwMCkKY1ZlZ19peCA8LSB3aGljaChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDApCgpgYGAKClRoZSBOQlAgY29uc3RyYWludCBoYXMgbm8gbWFyZ2luYWwgaW1wYWN0CmBgYHtyfQoKWV9sZXZlbDFhX21lYW5fbmJwX2NvbnN0IDwtIGNvbnN0cmFpbnRfcHJvcChZID0gWV9sZXZlbDFhX21lYW4sIGNvbnN0cmFpbnRfaXggPSBuYnBfaXggKQptZWFuX2NvbnN0cmFpbnRfbmJwIDwtIG1lYW4oWV9sZXZlbDFhX21lYW5fbmJwX2NvbnN0WzIsIF0gLSBZX2xldmVsMWFfbWVhbl9uYnBfY29uc3RbMSwgXSkKWV9jb25zdHJhaW50X3Bsb3QoWV9sZXZlbDFhX21lYW5fbmJwX2NvbnN0LDEsICBtYWluID0gcGFzdGUoJ21lYW4gY29uc3RyYWluZWQgcmFuZ2UgPScsIHJvdW5kKG1lYW5fY29uc3RyYWludF9uYnAsMykpKQoKYGBgCgpgYGB7cn0KCllfbGV2ZWwxYV9tZWFuX25wcF9jb25zdCA8LSBjb25zdHJhaW50X3Byb3AoWSA9IFlfbGV2ZWwxYV9tZWFuLCBjb25zdHJhaW50X2l4ID0gbnBwX2l4ICkKbWVhbl9jb25zdHJhaW50X25wcCA8LSBtZWFuKFlfbGV2ZWwxYV9tZWFuX25wcF9jb25zdFsyLCBdIC0gWV9sZXZlbDFhX21lYW5fbnBwX2NvbnN0WzEsIF0pCllfY29uc3RyYWludF9wbG90KFlfbGV2ZWwxYV9tZWFuX25wcF9jb25zdCwzLCAgbWFpbiA9IHBhc3RlKCdtZWFuIGNvbnN0cmFpbmVkIHJhbmdlID0nLCByb3VuZChtZWFuX2NvbnN0cmFpbnRfbnBwLDMpKSkKCmBgYAoKCmBgYHtyfQoKWV9sZXZlbDFhX21lYW5fY1NvaWxfY29uc3QgPC0gY29uc3RyYWludF9wcm9wKFkgPSBZX2xldmVsMWFfbWVhbiwgY29uc3RyYWludF9peCA9IGNTb2lsX2l4ICkKbWVhbl9jb25zdHJhaW50X2NTb2lsIDwtIG1lYW4oWV9sZXZlbDFhX21lYW5fY1NvaWxfY29uc3RbMiwgXSAtIFlfbGV2ZWwxYV9tZWFuX2NTb2lsX2NvbnN0WzEsIF0pCllfY29uc3RyYWludF9wbG90KFlfbGV2ZWwxYV9tZWFuX2NTb2lsX2NvbnN0LDQsICBtYWluID0gcGFzdGUoJ21lYW4gY29uc3RyYWluZWQgcmFuZ2UgPScsIHJvdW5kKG1lYW5fY29uc3RyYWludF9jU29pbCwzKSkpCgpgYGAKVmVnZXRhdGlvbiBjYXJib24gKGNWZWcpIGhhcyB0aGUgc3Ryb25nZXN0IGltcGFjdCBvbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXMgbm8gc3VwcmlzZSwgZ2l2ZW4gdGhhdCBzbyBmZXcgb2YgdGhlIGVuc2VtYmxlIG1lbWJlcnMgc2VlbSB0byBzaW11bGF0ZSBjYXJib24gdmVnZXRhdGlvbiBoaWdoIGVub3VnaC4KYGBge3J9CgpZX2xldmVsMWFfbWVhbl9jVmVnX2NvbnN0IDwtIGNvbnN0cmFpbnRfcHJvcChZID0gWV9sZXZlbDFhX21lYW4sIGNvbnN0cmFpbnRfaXggPSBjVmVnX2l4ICkKbWVhbl9jb25zdHJhaW50X2NWZWcgPC0gbWVhbihZX2xldmVsMWFfbWVhbl9jVmVnX2NvbnN0WzIsIF0gLSBZX2xldmVsMWFfbWVhbl9jVmVnX2NvbnN0WzEsIF0pCllfY29uc3RyYWludF9wbG90KFlfbGV2ZWwxYV9tZWFuX2NWZWdfY29uc3QsNSwgIG1haW4gPSBwYXN0ZSgnbWVhbiBjb25zdHJhaW5lZCByYW5nZSA9Jywgcm91bmQobWVhbl9jb25zdHJhaW50X2NWZWcsMykpKQoKYGBgCgpgYGB7cn0KCiMgd2l0aCAzIHByb2Nlc3NlcnMsIHVzaW5nIGZvcmVhY2ggcGFyYWxsZWwgcHJvY2Vzc2luZyB0YWtlcyBhcHByb3hpbWF0ZWx5IDEvMyB0aGUgdGltZSAoYXJvdW5kIDIwIHNlY29uZHMgcGVyIGVtdWxhdG9yKSBvZiBsb29waW5nIHRoZSBlbXVsYXRvciBmaXR0aW5nIGRpcmVjdGx5LiBJJ2QgaG9wZSB0aGlzIHdvdWxkIHNjYWxlIHdpdGggcHJvY2Vzc29yIG51bWJlcnMgLSBpdCdsbCBiZSB3b3J0aCB0cnlpbmcgb24gU1BJQ0UuCgojIHN5c3RlbS50aW1lKHRlc3Rsb29wX3BhciA8LSBkaXJlY3RfdHdvU3RlcF9nbG1uZXRfcGFyYWxsZWwoWD1YX2xldmVsMSwgWSA9IFlfbGV2ZWwxKSkKCmBgYAoKCiMjIFdyaXRpbmcgcm9idXN0LCBwYXJhbGxlbGlzZWQsIG11bHRpc3RhcnQgIGVtdWxhdG9ycwpgYGB7cn0KZGlyZWN0X3R3b1N0ZXBfZ2xtbmV0IDwtIGZ1bmN0aW9uKFgsIFksIC4uLil7CiAgCiAgZCA8LSBuY29sKFkpCiAgCiAgb3V0IDwtIHZlY3Rvcihtb2RlPSdsaXN0JywgbGVuZ3RoPWQpCiAgCiAgZm9yKGkgaW4gMTpkKXsKICAgIAogICAgeSA8LSBZWyxpXQogICAgCiAgICBlbSA8LSB0d29TdGVwX2dsbW5ldChYPVgsIHkgPSB5LCAuLi4pCiAgICBvdXRbaV0gPC0gZW0KIAogIH0KICAKICBvdXQKfSAKCgpgYGAKCgojIERpcmVjdCB0d29TdGVwIGVtdWxhdG9yIHVzaW5nIGZvcmVhY2gKYGBge3J9CgpsaWJyYXJ5KGRvUGFyYWxsZWwpCnJlZ2lzdGVyRG9QYXJhbGxlbChjb3JlcyA9IGRldGVjdENvcmVzKCkgLSAxKQoKZGlyZWN0X3R3b1N0ZXBfZ2xtbmV0X3BhcmFsbGVsIDwtIGZ1bmN0aW9uKFgsIFksIC4uLil7CiAgCiAgZCA8LSBuY29sKFkpCiAgCiAgb3V0IDwtIHZlY3Rvcihtb2RlPSdsaXN0JywgbGVuZ3RoPWQpCiAgCiAgZm9yZWFjaChpID0gMTpkKSAlZG9wYXIlIHsKICAgIAogICAgeSA8LSBZWyxpXQogICAgCiAgICBlbSA8LSB0d29TdGVwX2dsbW5ldChYPVgsIHkgPSB5LCAuLi4pCiAgICBvdXRbaV0gPC0gZW0KIAogIH0KICAKICBvdXQKfSAKCmBgYAoKCgpgYGB7cn0KCiMgSSBhY3R1YWxseSB3cm90ZSBjb2RlIHRvIGRvIHRoaXMgY3JlYXRlS21GaXRMaXN0LCB3aGljaCBpc24ndCBwYXJhbGxlbCBhdCB0aGUgbW9tZW50LgojIE1heWJlIG1ha2UgaXQgcGFyYWxsZWwgaW4gdGhlIG5leHQgdmVyc2lvbj8KCmxpYnJhcnkoZG9QYXJhbGxlbCkKcmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gZGV0ZWN0Q29yZXMoKSAtIDEpCgpkaXJlY3RfdHdvU3RlcF9nbG1uZXRfcGFyYWxsZWwgPC0gZnVuY3Rpb24oWCwgWSwgLi4uKXsKICAKICBkIDwtIG5jb2woWSkKICBmb3JlYWNoKGkgPSAxOmQpICVkb3BhciUgewogICAgCiAgICB5IDwtIFlbLGldCiAgICAKICAgIGVtIDwtIHR3b1N0ZXBfZ2xtbmV0KFg9WCwgeSA9IHksIC4uLikKICB9Cn0gCgoKCmBgYAoKCgpgYGB7cn0KCmxpYnJhcnkoZG9QYXJhbGxlbCkKY29yZXM9ZGV0ZWN0Q29yZXMoKQpjbCA8LSBtYWtlQ2x1c3Rlcihjb3Jlc1sxXS0xKSAjbm90IHRvIG92ZXJsb2FkIHlvdXIgY29tcHV0ZXIKcmVnaXN0ZXJEb1BhcmFsbGVsKGNsKQoKZml0bGlzdF90ZXN0IDwtIGNyZWF0ZUttRml0TGlzdFBhcmFsbGVsKFggPSBYX2xldmVsMWEsIFkgPSAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZCwgZm9ybXVsYSA9IH4uLCBtdWx0aXN0YXJ0ID0gNCkKc3RvcENsdXN0ZXIoY2wpCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gOX0KCgpwbG90KGZpdGxpc3RfdGVzdFtbNF1dKQpgYGAKCgpgYGB7cn0KCiNzdW1tYXJpc2VLbUxvbyA8LSBmdW5jdGlvbihmaXQpewogIAojICBsb28gPC0gbGVhdmVPbmVPdXQua20oZml0LCB0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUpCiAgCiMgIGxvb19tZWFuIDwtIG1lYW4obG9vJCkKICAKICAKI30KCgoKYGBgCgoKCgoKYGBge3J9CgojIHN5c3RlbS50aW1lKHRlc3Rsb29wIDwtIGRpcmVjdF90d29TdGVwX2dsbW5ldChYPVhfbGV2ZWwxLCBZX2xldmVsMSkpCgpgYGAKCgoKYGBge3J9CiMgVGVzdCBwYXJhbGxlbCBwcm9jZXNzaW5nIGFnYWluc3QgYSBmb3JlYWNoIHByb2Nlc3NpbmcgKGFuZCBtYXliZSBtY2xhcHBseT8pCgojc3lzdGVtLnRpbWUodGVzdGxvb3BfcGFyIDwtIGRpcmVjdF90d29TdGVwX2dsbW5ldF9wYXJhbGxlbChYPVhfbGV2ZWwxLCBZX2xldmVsMSkpCgoKCmBgYAoKCmBgYHtyfQplbUxpc3QgPC0gZnVuY3Rpb24oWCwgWSl7CiAgIyBDcmVhdGUgYSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgZW11bGF0ZWQKICAjIFggICAgICAgICAgICAgZGVzaWduIG1hdHJpeCB3aXRoIChucm93KSBpbnN0YW5jZXMgb2YgKG5jb2wpIGlucHV0cwogICMgWSAgICAgICAgICAgICBtYXRyaXggb2Ygb3V0cHV0cywgd2l0aCBvbmUgcm93CiAgIyAgICAgICAgICAgICAgIGZvciBlYWNoIHJvdyBvZiBYCgogIGQgPC0gbmNvbChZKQogIGVtX2xpc3QgPC0gdmVjdG9yKG1vZGU9J2xpc3QnLCBsZW5ndGg9ZCkKCiAgZm9yKGkgaW4gMTpkKXsKICAgIGVtX29iaiA8LSBOVUxMCiAgICBlbV9vYmokWCA8LSBYCiAgICBlbV9vYmokeSA8LSBZWywgaV0KICAgIGVtX2xpc3RbW2ldXSA8LSBlbV9vYmoKICB9CiAgZW1fbGlzdAp9CmBgYAoKYGBge3J9CgoKI3Rlc3QgPC0gZW1saXN0KFhfbGV2ZWwxLCBZX2xldmVsMSkKCgpgYGAKCmBgYHtyfQoKI21jbGFwcGx5KFggPSB0ZXN0LCBGVU4gPSBrbSkKCgpgYGAKCgoKYGBge3J9CgojIGZ1bmN0aW9uIGZyb20gaGRlIGZvciBkaXJlY3QgcHJlZGljdGlvbgpkaXJlY3QucHJlZCA9IGZ1bmN0aW9uIChmb3JtLCBYLCBZLCBYbmV3LCAuLi4pewogICMgRGlyZWN0bHkgYXBwbGllcyBrbSBpbiBwYXJhbGxlbCB0byBwcmVkaWN0IGVhY2ggY29sdW1uIG9mIGFuIGVuc2VtYmxlCiAgZW5zLmxpc3QgPSBlbWxpc3QoWCA9IFgsIFkgPSBZKQogIGttLmxpc3QgPSBtY2xhcHBseShlbnMubGlzdCwgRlVOID0ga20ud3JhcCwgZm9ybSA9IGZvcm0pCgogIHByZWQubGlzdCA9IG1jbGFwcGx5KGttLmxpc3QsIEZVTiA9IGttLnByZWQud3JhcCwgWG5ldyA9IGFzLm1hdHJpeChYbmV3LCBucm93ID0gMSksIHR5cGUgPSAiVUsiKQoKICBvdXQubWVhbiA9IHNhcHBseShwcmVkLmxpc3QsIEZVTj1leHRyYWN0LnByZWRtZWFuKQogIG91dC5zZCA9IHNhcHBseShwcmVkLmxpc3QsIEZVTj1leHRyYWN0LnByZWRzZCkKICByZXR1cm4obGlzdChtZWFuID0gb3V0Lm1lYW4sIHNkID0gb3V0LnNkKSkKfQoKCgpgYGAKCgoKCgoK