Notes

Introduction

The laboratory soil incubation is a commonly used technique for understanding soil carbon dynamics. Soil carbon is a heterogeneous mixture of organic matter, some of which persists in the soil for months or years, while some persists for centuries or millenia. The persistence of soil carbon can be understood through the concept of different “pools” of carbon that are defined by the mechanism by which they persist in the soil and are characterized by distinct age distributions.

Natural abundance radiocarbon provides information about carbon dynamics on the scale of centuries to millenia, while insight into decadal scale dynamics can be gained from tracing the pulse of radiocarbon introduced into the biosphere from nuclear weapons testing (“bomb-C”) in the mid-20th century. The bomb-C pulse peaked in the atmosphere in the 1950s (Fig. 1), but due to differential rates of abiotic incorporation and biological processing, the peak is lagged in time and dampened in soils. The relative enrichment in bomb-C in different pools of soil carbon is a useful tool for inferring the relative rate at which carbon enters and leaves the pool, and for a homogenous pool it is functionally equivalent to the intrinsic decomposition rate.

Extracting and measuring the radiocarbon content of specific soil carbon pools is hampered by spatial and temporal heterogeneity of the mechanisms that lead to soil carbon persistence, such as physical occlusion in aggregates, association with minerals, or thermodynamics. Defining soil carbon pools empirically with techniques such as density, size, or resistance to chemical attack can be useful, but these methods also introduce artifacts and likely result in mixtures of pools with different age distributions. In contrast, although they also introduce artifacts due to disturbance and potential alteration of the microbial community, laboratory soil incubations make use of the same fractionation agent as is found in situ: the microbial community. Measuring the radiocarbon signal of CO2 (Δ14C-CO2) released in laboratory incubations of bulk soils is a powerful tool for understanding the relative processing rate of carbon in soil (or transit time) as it provides an integrated measure of the weighted contribution to the release flux from pools of soil carbon with distinct processing rates.

Interpreting Δ14C-CO2 from laboratory soil incubations requires the use of a model. However, parameterizing these models is challenging, both due to the uncertainty of the persistence mechanisms themselves as well as a lack of observational constraints. Radiocarbon observations at a single point in time are very useful, but due to the curvature of the bomb-C peak there are two points in time with the same atmospheric radiocarbon value which leads to multiple model solutions. Adding observations of Δ14C-CO2 at more than one point in time can greatly reduce model uncertainty by adding additioanl constraints.

Soil archives have already proven to be a valuable source of data for constraining soil carbon models by providing time series of the change in soil carbon 14C content. The promise of improving models further by obtaining 14C-CO2 measurements from archived soils is tantalizing, but first the possible effects of air-drying and rewetting, as well as the effect of the duration of storage, must be quantified.

Air-drying and rewetting of soils stimulates the release of CO2…[expand]

We designed an experiment to assess these effects, preliminary results of which are presented in the following report.

Hypotheses and conceptual understanding

If the null hypothesis is disproved, i.e. air-drying and rewetting (air-dry) or air-drying, rewetting, and storage (air-dry + storage) have a significant effect on Δ14C-CO2 relative to control samples, there are two possible outcomes: enrichment of the respiration flux or depletion.

In a simple two-pool soil carbon model, the treatment effect can be conceptualized as a relative change in the contribution of “slower” or “faster” cycling carbon to the respiration flux observed in control samples.

Trajectories of the change in Δ14C over time for “slow” and “fast” soil carbon pools are shown below (Fig. 1) in relationship to the Δ14C of the atmosphere and respired CO2 for a theoretical model system.

Fig 1a. Modeled trajectories of Δ14C over time in soil carbon pools (fast, slow, respiration flux) in relationship to observed atmospheric Δ14C

Caption: Modeled curves derived from a conceptual two-pool parallel model system in which inputs are partitioned between faster and more slowly cycling pools without any tranfers between the pools. Carbon stocks and pool sizes are based on density fraction data for the Hainich Forest (Schrumpf et al. 2013); decomposition rates are chosen to be realistic but are arbitrary. Atmospheric Δ14C data up to the year 2015 are from Graven et al. (2017), while data points beyond 2015 use the extrapolation method from Sierra (2018). All atmospheric data is for the northern hemisphere (zone 2).

The simplest two-pool model is a parallel system: one in which carbon entering the soil is partitioned between the two pools without any transfers from one pool to the other. However, even in this simple system, the same treatment effect can result in either enrichment or depletion depending on the year the sample was collected. The direction of change will be dependent on system dynamics, specifically the intrinsic decomposition rates of the slow and fast pools, while in more complicated sytems the amount of mixing between the pools will play a role as well. Potential treatment effects for the same parallel two-pool model system shown in Fig. 1 are shown below at two points in time (Fig. 2).

Fig 1b. Potential shifts in Δ14C of respired CO2 in response to air-drying and rewetting, or air-drying and rewetting + storage

Caption: Blue and magenta lines show modeled trajectories of Δ14C in fast and slow cycling soil carbon pools (same model as Fig 1), and Δ14C of respired CO2 is shown in yellow. Solid circles show hypothetical observations of 14C or respired CO2 from control incubations, while the open symbols represent two possible scenarios in which 14C-CO2 shifts due to increased contribution from the fast pool (open circles), or shifts due to increassed contribution from the slow pool (open squares). Due to the crossing of the blue and magenta lines in 2009, increased contribution of the slow pool to respiration following treatment leads to relative depletion of 14C-CO2 in 1991, but relative enrichment of 14C-CO2 in 2019, while the opposite is observed for increased fast pool contribution.

In the above plot (Fig. 2), increased contribution from the slow pool leads to depletion in Δ14C of respiration relative to the control observation in 1991 but relative enrichment in 2019.

Methods and materials

Radiocarbon corrections

Although differences were small, radiocarbon data for archived samples were first corrected for decay since the year of collection before assessing treatment effects.

Decay correction formula:

1000((FMeyearsampled+19508267)1)

where FM is the fraction modern, and 8267 is the inverse of the product of the natural log of two and the true half life of 14C (5730 y).

Results

Respiration rates

Experiment 1 (air-dry + storage treatment)

Respiration rates increased dramatically following rewetting for the air-dry + storage treatment in comparison to control samples, similar to what has been observed in other air-dry/rewetting studies [cite]. However, the magnitude and timing of the peak in respiration rates was significantly different between grassland and forest sites [statistics; other forest/grassland studies for comparison?] (Fig. 3).

Among the air-dry + storage samples, respiration rates were more than twice as high in grassland soils than in forest soils, reaching a maximum of 3.8 mg CO2 g soil C-1 d-1 after 92 h, followed by a sharp decline. Mean respiration rates in forest sites peaked at 1.5 mg CO2 g soil C-1 d-1 after 166 h, followed by a much more gradual decline than in grassland sites. Control samples responded more weakly and more gradually to rewetting, although as in the treatment samples respiration was greater in grassland soils than in forest soils. Peak respiration rates for control incubations were 1.9 and 0.6 mg CO2 g soil C-1 d-1 after 115 h for grassland and forest soils, respectively.

Experiment 2 (air-dry treatment, 2019 samples)

Respiration rates for the air-dry only treatment samples showed a similarly dramatic increase in comparison to the controls as was observed for the air-dry + storage treatment samples in Experiment 1. However, unlike the air-dry + storage treatment, peak respiration rates were not significantly different (p > 0.05) between forest and grassland soils in Experiment 2, peaking at 3.0 and 3.3 mg CO2 g soil C-1 d-1 after 95 h for grassland and forest soils, respectively (Fig. 3).

Fig. 2. Respiration rates for Experiment 1 (air-dry + storage treatment) and Experiment 2 (air-dry only treatment)

Caption: Top panel shows data from Experiment 1 (air-dry + storage treatment), bottom panel shows data from Experiment 2 (air-dry only treatment). Vertical gray line demarcates the pre-incubation period from the equilibrium respiration period. Points show measurements and lines show trends in mean respiration rates. Shaded ribbons represent the standard error. The final measurement points for a few samples which took >18 days to reach CO2 targets are excluded for display reasons. Respiration rates for those samples remained flat. Note that CO2 concentrations for control sample incubations in Experiment 1 were only measured once during the pre-incubation period, so rates are shown as the cumulative average. For purposes of comparison, Supplemental Figure 1 shows all data plotted with pre-incubation respiration rates calculated as a cumulative average.

Supplemental respiration rates figure:

Supplemental Fig 1. Respiration rates for Experiment 1 and Experiment 2 shown with all pre-incubation data calculated as cumulative averages

Caption: CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period, in contrast to daily measurements for all other samples. Pre-incubation respiration rates are shown here calculated as cumulative averages for the purpose of fair comparison across all treatments.

Radiocarbon data

Pre-incubation versus equilibrium respiration 14C-CO2

Despite the significant differences in respiration, and in contrast to hypothesis 1, we did not observe significant differences between 14C-CO2 respired during the pre-incubation period and 14C-CO2 respired during the equilibrium respiration period: neither for the air-dry + storage treatment nor for the air-dry treatment alone (Fig. 5). The interactions with land use was not significant nor was the interaction with experiment, so all data were pooled for statistical analysis.

Fig. 3. Pre-incubation period Δ14C against equilibrium respiration period Δ14C

Caption: Points are means of laboratory duplicates and error bars are the min and max (except for Experiment 1 control samples, which were not replicated). Note that pre-incubation Δ14C was not measured for the Experiment 1 control samples; additionally samples from three of the forest plots of the Experiment 1 treatment samples (air-dry + storage) failed to accumulate enough CO2 during the pre-incubation period to measure 14C. The outlier point with the substantially depleted pre-incubation Δ14C is from Experiment 2 (control).

Note the one outlier (forest, control) for which the pre-incubation CO2 was substantially depleted relative to equilibrium period respiration. However, even when this outlier was included in the statistical analysis the difference between pre-incubation 14C-CO2 and equilibrium 14C-CO2 was not significant. For clarity, this point will be excluded from the future plots. Due to lower respiration rates during pre-incubation, only three of the six forest samples in Experiment 1 generated enough CO2 to measure radiocarbon, and additionally, it was not possible to compare pre-incubation and equilibrium respiration 14C-CO2 for the control samples in Experiment 1 since pre-incubation 14C-CO2 was not measured for these samples in 2011.

Treatment effects on observed equilibrium period 14C-CO2

Relative to the controls the air-dry + storage treatment (Experiment 1, open squares in Fig. 5) led to enrichment in grassland samples, but depletion in forest samples. In contrast, the air-dry only treatment (Experiment 2, open circles, Fig. 5) led to enrichment for both forest and grassland samples (2019 points). Treatment effects on 14C-CO2 were signifcant for both forests and grassland soils in Experiment 1 (2011 points, Fig 5), and significant for grassland samples but not forest samples in Experiment 2 (2019 points, Fig. 5). The absolute mean difference in 14C-CO2 between control and treatment samples was greater in grassland samples (21.4‰) than in forest samples (12.1‰) for both experiments.

Mean 14C-CO2 showed enrichment relative to the atmosphere for all samples in both experiments. Control sample 14C-CO2 respired from grassland soils was generally closer to the atmosphere than that from forest soil controls, but the difference from the atmosphere (ΔΔ14C) increased slightly between 2011 and 2019 in grassland soils while it stayed about the same in forest soils.

Fig 4. Treatment effect on observed Δ14C-CO2 over time (Experiments 1 and 2)

Caption: Filled circles show 14C-CO2 observed for control samples, while open symbols show 14C-CO2 observed for treament samples (open squares = air-dry + storage treatment, Experiment 1; open circles = air-dry only treatment, Experiment 2). Arrows show the direction of change in 14C-CO2 relative to the controls. Points are means and error bars show 2x standard error. The gray line shows Δ14C of the atmosphere.

Effect of cumulative respired carbon on 14C-CO2

[maybe expand with stats for other explanatory factors? e.g. texture, N content, change in moisture upon rewetting, etc…]

We looked at the possible effect of the difference in the amount of carbon respired (mg CO2-C g soil C-1) on the differences between control and treatment 14C-CO2 using a linear regression model, but it was not significant overall. When data from Experiment 1 and Experiment 2 were considered separately, we observed a slight positive trend between the difference in respired carbon and the difference in 14C-CO2 within Experiment 2, but it was only marginally significant (p = 0.063).

Supplementary Fig. 2. Change in 14C-CO2 in relation to cumulative soil carbon respired

Caption: Note that pre-incubation Δ14C was not measured for the 2011 control samples. Limits exclude outlier point (HEW22 control pre-incubation) for improved legibility. [Not planning to include this figure in the main text as I think it is difficult to interpret].

Treatment effect on 14C-CO2 for all samples (Experiments 1, 2, and 3)

Difference between control and treatment samples from all experiments show that treatment effects, i.e. air-drying followed by rewetting or air-drying followed by storage and subsequent rewetting, typically result in changes in 14C-CO2 between ±20‰ to ±40‰, with the majority within ±20‰. These difference are equivalent to the decline in atmospheric radiocarbon over 5 and 10 years, respectively, during the period of 2000 to 2020. The samples from Tennessee (magenta points) are an exception. However, these points do not show only bomb-C enrichment, but rather the results of exposure to a localized plume of 14C enriched CO2 from a nearby incinerator four years prior to sample collection (Trumbore et al., 2002). Treatment 14C-CO2 for these highly enriched samples were more depleted relative to the controls than were the samples only labeled with bomb-C.

Grassland samples tend to be above 1:1 line, while forest samples are generally below, regardless of origin. One exception to this trend is the three German forest samples that are above 1:1 line, which were analyzed in 2019 (air-dry only treatment).

Fig. 5. Effect of air-drying and rewetting + storage on 14C-CO2

Caption: Points show data from all three experiments. Points are the mean of laboratory replicates (for replicated samples); error bars are 2x standard error of the mean. Solid line is 1:1, while the dashed and dotted lines show differences of ±20‰ and ±$40‰, equivalent to the decline in atmospheric CO2 over 5 and 10 years respectively during the period of 2000 to 2020.

Storage duration effect on 14C-CO2 (Experiment 3)

There does not seem to be evidence for a storage duration effect in the samples that only contain bomb-C, although the trend in the differences due to treatment for the highly enriched samples from Oak Ridge, TN suggest losses of the most recently fixed carbon over the duration of storage. These samples were included primarily because it was assumed that they would be more sensitive to potential losses of recently fixed carbon, as the label should only be present in this pool of soil C.

Fig. 6. Change in 14C-CO2 in relation to storage duration

Caption: Points show data from both Experiment 1 (in black) and Experiment 3 (all other points). Dashed and dotted lines show a difference of 20‰ and 40‰, equivalent to the atmospheric decline over five and 10 years respectively for the period 2000 to 2020. Position of points jittered to avoid overplotting; storage duration has been rounded down to the nearest whole year.

The trend in the differences due to treatment for the highly enriched samples from Oak Ridge, TN suggest losses of the most recently fixed carbon over the duration of storage. The TN samples were included primarily because it was assumed that they would be more sensitive to potential losses of recently fixed carbon, as the label should only be present in this pool of soil C. However, in contrast, there does not seem to be evidence for a storage duration effect in the samples that only contain bomb-C.

Discussion

Random notes here…

Effect of C respired

LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBQcm9qZWN0IgphdXRob3I6ICJKLiBCZWVtLU1pbGxlciIKZGF0ZTogIjMwIEFwciAyMDIwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGNzczogY3VzdG9tLmNzcwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgY3NzOiBjdXN0b20uY3NzCmhlYWRlcl9pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQogIC0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBkZXYgPSAnY2Fpcm9fcGRmJykKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoU29pbFIpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkob3Blbnhsc3gpCmxpYnJhcnkoSVNSYUQpCmBgYAojIyBOb3RlcwoqIFRoaXMgd29ya2Jvb2sgaXMgaW50ZW5kZWQgdG8gbG9hZCBhbmQgcHJlcGFyZSB0aGUga2V5IGRhdGEgZm9yIGFuYWx5c2lzIGZvciB0aGUgYXJjaGl2ZSBpbmN1YmF0aW9uIHByb2plY3QuCiogaW4gZ2VuZXJhbCwgdGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2Ygc2NyaXB0ICIuL3NyYy9hcmNfaW5jX21hc3Rlci5SIgoqIGFsbCBjb2RlIGNodW5rIG9wdGlvbnMgYXJlIHNldCB0byAiZWNobyA9IEZBTFNFIjsgc2VlIHJhdyAuUm1kIGZpbGUgZm9yIGRhdGEgd3JhbmdsaW5nIGNvZGUuCgojIEludHJvZHVjdGlvbgpUaGUgbGFib3JhdG9yeSBzb2lsIGluY3ViYXRpb24gaXMgYSBjb21tb25seSB1c2VkIHRlY2huaXF1ZSBmb3IgdW5kZXJzdGFuZGluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gU29pbCBjYXJib24gaXMgYSBoZXRlcm9nZW5lb3VzIG1peHR1cmUgb2Ygb3JnYW5pYyBtYXR0ZXIsIHNvbWUgb2Ygd2hpY2ggcGVyc2lzdHMgaW4gdGhlIHNvaWwgZm9yIG1vbnRocyBvciB5ZWFycywgd2hpbGUgc29tZSBwZXJzaXN0cyBmb3IgY2VudHVyaWVzIG9yIG1pbGxlbmlhLiBUaGUgcGVyc2lzdGVuY2Ugb2Ygc29pbCBjYXJib24gY2FuIGJlIHVuZGVyc3Rvb2QgdGhyb3VnaCB0aGUgY29uY2VwdCBvZiBkaWZmZXJlbnQgInBvb2xzIiBvZiBjYXJib24gdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZXkgcGVyc2lzdCBpbiB0aGUgc29pbCBhbmQgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgZGlzdGluY3QgYWdlIGRpc3RyaWJ1dGlvbnMuIAoKTmF0dXJhbCBhYnVuZGFuY2UgcmFkaW9jYXJib24gcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgY2FyYm9uIGR5bmFtaWNzIG9uIHRoZSBzY2FsZSBvZiBjZW50dXJpZXMgdG8gbWlsbGVuaWEsIHdoaWxlIGluc2lnaHQgaW50byBkZWNhZGFsIHNjYWxlIGR5bmFtaWNzIGNhbiBiZSBnYWluZWQgZnJvbSB0cmFjaW5nIHRoZSBwdWxzZSBvZiByYWRpb2NhcmJvbiBpbnRyb2R1Y2VkIGludG8gdGhlIGJpb3NwaGVyZSBmcm9tIG51Y2xlYXIgd2VhcG9ucyB0ZXN0aW5nICgiYm9tYi1DIikgaW4gdGhlIG1pZC0yMF50aF4gY2VudHVyeS4gVGhlIGJvbWItQyBwdWxzZSBwZWFrZWQgaW4gdGhlIGF0bW9zcGhlcmUgaW4gdGhlIDE5NTBzIChGaWcuIDEpLCBidXQgZHVlIHRvIGRpZmZlcmVudGlhbCByYXRlcyBvZiBhYmlvdGljIGluY29ycG9yYXRpb24gYW5kIGJpb2xvZ2ljYWwgcHJvY2Vzc2luZywgdGhlIHBlYWsgaXMgbGFnZ2VkIGluIHRpbWUgYW5kIGRhbXBlbmVkIGluIHNvaWxzLiBUaGUgcmVsYXRpdmUgZW5yaWNobWVudCBpbiBib21iLUMgaW4gZGlmZmVyZW50IHBvb2xzIG9mIHNvaWwgY2FyYm9uIGlzIGEgdXNlZnVsIHRvb2wgZm9yIGluZmVycmluZyB0aGUgcmVsYXRpdmUgcmF0ZSBhdCB3aGljaCBjYXJib24gZW50ZXJzIGFuZCBsZWF2ZXMgdGhlIHBvb2wsIGFuZCBmb3IgYSBob21vZ2Vub3VzIHBvb2wgaXQgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGludHJpbnNpYyBkZWNvbXBvc2l0aW9uIHJhdGUuCgpFeHRyYWN0aW5nIGFuZCBtZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIGNvbnRlbnQgb2Ygc3BlY2lmaWMgc29pbCBjYXJib24gcG9vbHMgaXMgaGFtcGVyZWQgYnkgc3BhdGlhbCBhbmQgdGVtcG9yYWwgaGV0ZXJvZ2VuZWl0eSBvZiB0aGUgbWVjaGFuaXNtcyB0aGF0IGxlYWQgdG8gc29pbCBjYXJib24gcGVyc2lzdGVuY2UsIHN1Y2ggYXMgcGh5c2ljYWwgb2NjbHVzaW9uIGluIGFnZ3JlZ2F0ZXMsIGFzc29jaWF0aW9uIHdpdGggbWluZXJhbHMsIG9yIHRoZXJtb2R5bmFtaWNzLiBEZWZpbmluZyBzb2lsIGNhcmJvbiBwb29scyBlbXBpcmljYWxseSB3aXRoIHRlY2huaXF1ZXMgc3VjaCBhcyBkZW5zaXR5LCBzaXplLCBvciByZXNpc3RhbmNlIHRvIGNoZW1pY2FsIGF0dGFjayBjYW4gYmUgdXNlZnVsLCBidXQgdGhlc2UgbWV0aG9kcyBhbHNvIGludHJvZHVjZSBhcnRpZmFjdHMgYW5kIGxpa2VseSByZXN1bHQgaW4gbWl4dHVyZXMgb2YgcG9vbHMgd2l0aCBkaWZmZXJlbnQgYWdlIGRpc3RyaWJ1dGlvbnMuIEluIGNvbnRyYXN0LCBhbHRob3VnaCB0aGV5IGFsc28gaW50cm9kdWNlIGFydGlmYWN0cyBkdWUgdG8gZGlzdHVyYmFuY2UgYW5kIHBvdGVudGlhbCBhbHRlcmF0aW9uIG9mIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LCBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgbWFrZSB1c2Ugb2YgdGhlIHNhbWUgZnJhY3Rpb25hdGlvbiBhZ2VudCBhcyBpcyBmb3VuZCAqaW4gc2l0dSo6IHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LiBNZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIHNpZ25hbCBvZiBDT34yfiAoJFxEZWx0YSReMTReQy1DT34yfikgcmVsZWFzZWQgaW4gbGFib3JhdG9yeSBpbmN1YmF0aW9ucyBvZiBidWxrIHNvaWxzIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpdmUgcHJvY2Vzc2luZyByYXRlIG9mIGNhcmJvbiBpbiBzb2lsIChvciB0cmFuc2l0IHRpbWUpIGFzIGl0IHByb3ZpZGVzIGFuIGludGVncmF0ZWQgbWVhc3VyZSBvZiB0aGUgd2VpZ2h0ZWQgY29udHJpYnV0aW9uIHRvIHRoZSByZWxlYXNlIGZsdXggZnJvbSBwb29scyBvZiBzb2lsIGNhcmJvbiB3aXRoIGRpc3RpbmN0IHByb2Nlc3NpbmcgcmF0ZXMuIAoKSW50ZXJwcmV0aW5nICRcRGVsdGEkXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIG1vZGVsLiBIb3dldmVyLCBwYXJhbWV0ZXJpemluZyB0aGVzZSBtb2RlbHMgaXMgY2hhbGxlbmdpbmcsIGJvdGggZHVlIHRvIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtcyB0aGVtc2VsdmVzIGFzIHdlbGwgYXMgYSBsYWNrIG9mIG9ic2VydmF0aW9uYWwgY29uc3RyYWludHMuIFJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lIGFyZSB2ZXJ5IHVzZWZ1bCwgYnV0IGR1ZSB0byB0aGUgY3VydmF0dXJlIG9mIHRoZSBib21iLUMgcGVhayB0aGVyZSBhcmUgdHdvIHBvaW50cyBpbiB0aW1lIHdpdGggdGhlIHNhbWUgYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gdmFsdWUgd2hpY2ggbGVhZHMgdG8gbXVsdGlwbGUgbW9kZWwgc29sdXRpb25zLiBBZGRpbmcgb2JzZXJ2YXRpb25zIG9mICRcRGVsdGEkXjE0XkMtQ09+Mn4gYXQgbW9yZSB0aGFuIG9uZSBwb2ludCBpbiB0aW1lIGNhbiBncmVhdGx5IHJlZHVjZSBtb2RlbCB1bmNlcnRhaW50eSBieSBhZGRpbmcgYWRkaXRpb2FubCBjb25zdHJhaW50cy4KClNvaWwgYXJjaGl2ZXMgaGF2ZSBhbHJlYWR5IHByb3ZlbiB0byBiZSBhIHZhbHVhYmxlIHNvdXJjZSBvZiBkYXRhIGZvciBjb25zdHJhaW5pbmcgc29pbCBjYXJib24gbW9kZWxzIGJ5IHByb3ZpZGluZyB0aW1lIHNlcmllcyBvZiB0aGUgY2hhbmdlIGluIHNvaWwgY2FyYm9uIF4xNF5DIGNvbnRlbnQuIFRoZSBwcm9taXNlIG9mIGltcHJvdmluZyBtb2RlbHMgZnVydGhlciBieSBvYnRhaW5pbmcgXjE0XkMtQ09+Mn4gbWVhc3VyZW1lbnRzIGZyb20gYXJjaGl2ZWQgc29pbHMgaXMgdGFudGFsaXppbmcsIGJ1dCBmaXJzdCB0aGUgcG9zc2libGUgZWZmZWN0cyBvZiBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcsIGFzIHdlbGwgYXMgdGhlIGVmZmVjdCBvZiB0aGUgZHVyYXRpb24gb2Ygc3RvcmFnZSwgbXVzdCBiZSBxdWFudGlmaWVkLgoKQWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nIG9mIHNvaWxzIHN0aW11bGF0ZXMgdGhlIHJlbGVhc2Ugb2YgQ09+Mn4uLi5bZXhwYW5kXSAKCldlIGRlc2lnbmVkIGFuIGV4cGVyaW1lbnQgdG8gYXNzZXNzIHRoZXNlIGVmZmVjdHMsIHByZWxpbWluYXJ5IHJlc3VsdHMgb2Ygd2hpY2ggYXJlIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHJlcG9ydC4KCiMgSHlwb3RoZXNlcyBhbmQgY29uY2VwdHVhbCB1bmRlcnN0YW5kaW5nCklmIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgZGlzcHJvdmVkLCBpLmUuIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyAoYWlyLWRyeSkgb3IgYWlyLWRyeWluZywgcmV3ZXR0aW5nLCBhbmQgc3RvcmFnZSAoYWlyLWRyeSArIHN0b3JhZ2UpIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiByZWxhdGl2ZSB0byBjb250cm9sIHNhbXBsZXMsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgb3V0Y29tZXM6IGVucmljaG1lbnQgb2YgdGhlIHJlc3BpcmF0aW9uIGZsdXggb3IgZGVwbGV0aW9uLiAKCkluIGEgc2ltcGxlIHR3by1wb29sIHNvaWwgY2FyYm9uIG1vZGVsLCB0aGUgdHJlYXRtZW50IGVmZmVjdCBjYW4gYmUgY29uY2VwdHVhbGl6ZWQgYXMgYSByZWxhdGl2ZSBjaGFuZ2UgaW4gdGhlIGNvbnRyaWJ1dGlvbiBvZiAic2xvd2VyIiBvciAiZmFzdGVyIiBjeWNsaW5nIGNhcmJvbiB0byB0aGUgcmVzcGlyYXRpb24gZmx1eCBvYnNlcnZlZCBpbiBjb250cm9sIHNhbXBsZXMuCgpUcmFqZWN0b3JpZXMgb2YgdGhlIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBmb3IgInNsb3ciIGFuZCAiZmFzdCIgc29pbCBjYXJib24gcG9vbHMgYXJlIHNob3duIGJlbG93IChGaWcuIDEpIGluIHJlbGF0aW9uc2hpcCB0byB0aGUgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBhbmQgcmVzcGlyZWQgQ09+Mn4gZm9yIGEgdGhlb3JldGljYWwgbW9kZWwgc3lzdGVtLgoKYGBge3IgY29uY2VwdHVhbC1tb2RlbC1jYWxjcywgaW5jbHVkZSA9IEZBTFNFfQojIGluaXRpYWwgcGFyYW1ldGVyIHNldApEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQp5cnMgPC0gRGF0bSREYXRlCgojIGhlbHBlciBmeHMKbGFtYmRhIDwtICgxLzgyNjcpCgprIDwtIGZ1bmN0aW9uKEZtKSB7CiAgKEZtKmxhbWJkYSkvKDEtRm0pCn0KZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KZm1fMTRjIDwtIGZ1bmN0aW9uKGZtLCBkYXRlKSB7CiAgKGZtKmV4cChsYW1iZGEqKDE5NTAgLSBkYXRlKSkgLSAxKSoxMDAwCn0KCiMgZm9yZXN0cwpmLmMgPC0gMzguOTYxMDQgIyBmb3Jlc3QgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGZvcmVzdCBDICA9IDI0IGcga2deLTEpOyBuYiBAIHNzID0gc3VtKC0xKnNvbHZlKEEpJSolYyhmLmluKmYuZ2FtLCBmLmluKigxLWYuZ2FtKSkpCmYuaW4gPC0gMSAjIGlucHV0cyAoMTIuNT1tZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIGdDIHlyLTEsIDIwMTEgaW5jdWJhdGlvbiBkYXRhKTsgdHJ5IG11Y2ggbGVzcy4uLgpmLmZyYyA8LSAuMSAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIEhhaW5pY2ggMC01LCBmcmVlIGxpZ2h0KQpmLkNmYXN0IDwtIGYuZnJjKmYuYwpmLkNzbG93IDwtIGYuYy1mLkNmYXN0CmYua2Zhc3QgPC0gMS82ICMgdW5rbm93bgpmLmtzbG93IDwtIDEvMTAwICMgdW5rbm93bgpmLmZhc3QuZm0gPC0gZm0oZi5rZmFzdCkKZi5zbG93LmZtIDwtIGZtKGYua3Nsb3cpCmYuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZi5mYXN0LmZtLCBmLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKZi5nYW0gPC0gKGYuYypmLkNmYXN0KmYua2Zhc3QpLyhmLmMqZi5DZmFzdCpmLmtmYXN0K2YuYypmLkNzbG93KmYua3Nsb3cpICMgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChwcm9wb3J0aW9uIHRvIGZhc3QgcG9vbCwgZnVuY3Rpb24gb2Yga3MpCiAgCiMgIyBncmFzc2xhbmRzCiMgZy5jIDwtIDQyICMgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGdyYXNzbGFuZCBDIGcga2deLTEpCiMgZy5pbiA8LSA2My40ICMgaW5wdXRzIChtZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIDIwMTEgaW5jdWJhdGlvbiBkYXRhKQojIGcuZnJjIDwtIC4zICMgQy1zdG9jayBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgKGZyb20gU2NocnVtcGYgMjAxMywgYXZlcmFnZSBvZiBMYWNxdWV2aWxsZSwgRWFzdGVyIEJ1c2gsIEJ1Z2FjLCAwLTUsIGZyZWUgbGlnaHQpCiMgZy5DZmFzdCA8LSBnLmZyYypnLmMKIyBnLkNzbG93IDwtIGcuYy1nLkNmYXN0CiMgZy5rZmFzdCA8LSAxLzEwICMgdW5rbm93bgojIGcua3Nsb3cgPC0gMS8xMDAgIyB1bmtub3duCiMgZy5mYXN0LmZtIDwtIGZtKGcua2Zhc3QpCiMgZy5zbG93LmZtIDwtIGZtKGcua3Nsb3cpCiMgZy5GMF9EZWx0YTE0QyA8LSBmbV8xNGMoYyhnLmZhc3QuZm0sIGcuc2xvdy5mbSksIGRhdGUgPSBjKDE5MDAsIDE5MDApKQojIGcuZ2FtIDwtIChnLmMqZy5DZmFzdCpnLmtmYXN0KS8oZy5jKmcuQ2Zhc3QqZy5rZmFzdCtnLmMqZy5Dc2xvdypnLmtzbG93KSAjIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAocHJvcG9ydGlvbiB0byBmYXN0IHBvb2wsIGZ1bmN0aW9uIG9mIGtzKQoKIyAycG9vbCBwYXJhbGxlbCBtb2RlbCwgZm9yZXN0cwpmLjJwIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IHlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gYyhmLmtmYXN0LCBmLmtzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhmLkNmYXN0LCBmLkNzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gZi5GMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gZi5pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IGYuZ2FtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0pCgpmLjJwLkMxNCA8LSBnZXRGMTQoZi4ycCkKZi4ycC5IUiA8LSBnZXRGMTRSKGYuMnApCmYuMnAuQ3RvdCA8LSBnZXRDKGYuMnApCgojIHNvbHZlIGZvciBzdGVhZHktc3RhdGUgQyBzdG9ja3MKQSA8LSAtMSpkaWFnKGMoZi5rZmFzdCwgZi5rc2xvdykpCnN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQoKZi4ycC5DMTQuZGYgPC0gZGF0YS5mcmFtZSgKICB5ZWFycyA9IHJlcChEYXRtJERhdGUsIDQpLAogIGQxNEMgPSBjKGYuMnAuQzE0WywxXSwgZi4ycC5DMTRbLDJdLCBmLjJwLkhSLCBEYXRtJE5IYzE0KSwKICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgZWFjaCA9IG5yb3coZi4ycC5DMTQpKQogICkKCiMgIyBQbG90IEMgc3RvY2tzIHRvIGNvbmZpcm0gZmxhdAojIHBsb3QoeXJzLCB4bGltID0gYygxOTAwLDIwMjIpLCB5bGltID0gYygwLDYwKSkKIyBsaW5lcyh5cnMsIGYuMnAuQ3RvdFssIDFdLCBjb2wgPSAyKQojIGxpbmVzKHlycywgZi4ycC5DdG90WywgMl0sIGNvbCA9IDQpCgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCm9icy5wdHMgPC0gZGF0YS5mcmFtZShwb29sID0gcmVwKCJyZXNwaXJhdGlvbiIsIDYpLAogICAgICAgICAgICAgICAgICAgICAgeWVhcnMgPSByZXAoYygxOTkxLDIwMTkpLDMpLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMobWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDE5OTAgJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDE5OTIgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDIwMTggJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDIwMjAgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YXRpb24gPSByZXAoYygiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDIpKQpvYnMucHRzLnIgPC0gb2JzLnB0c1tvYnMucHRzJE9ic2VydmF0aW9uID09ICJjb250cm9sIiwgXQpgYGAKCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMX0KZ2dwbG90KGYuMnAuQzE0LmRmLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4gPC0gMSl9YGEuIE1vZGVsZWQgdHJhamVjdG9yaWVzIG9mICRcRGVsdGEkXjE0XkMgb3ZlciB0aW1lIGluIHNvaWwgY2FyYm9uIHBvb2xzIChmYXN0LCBzbG93LCByZXNwaXJhdGlvbiBmbHV4KSBpbiByZWxhdGlvbnNoaXAgdG8gb2JzZXJ2ZWQgYXRtb3NwaGVyaWMgJFxEZWx0YSReMTReQyoqCgo+KkNhcHRpb246KiBNb2RlbGVkIGN1cnZlcyBkZXJpdmVkIGZyb20gYSBjb25jZXB0dWFsIHR3by1wb29sIHBhcmFsbGVsIG1vZGVsIHN5c3RlbSBpbiB3aGljaCBpbnB1dHMgYXJlIHBhcnRpdGlvbmVkIGJldHdlZW4gZmFzdGVyIGFuZCBtb3JlIHNsb3dseSBjeWNsaW5nIHBvb2xzIHdpdGhvdXQgYW55IHRyYW5mZXJzIGJldHdlZW4gdGhlIHBvb2xzLiBDYXJib24gc3RvY2tzIGFuZCBwb29sIHNpemVzIGFyZSBiYXNlZCBvbiBkZW5zaXR5IGZyYWN0aW9uIGRhdGEgZm9yIHRoZSBIYWluaWNoIEZvcmVzdCAoU2NocnVtcGYgZXQgYWwuIDIwMTMpOyBkZWNvbXBvc2l0aW9uIHJhdGVzIGFyZSBjaG9zZW4gdG8gYmUgcmVhbGlzdGljIGJ1dCBhcmUgYXJiaXRyYXJ5LiBBdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DIGRhdGEgdXAgdG8gdGhlIHllYXIgMjAxNSBhcmUgZnJvbSBHcmF2ZW4gZXQgYWwuICgyMDE3KSwgd2hpbGUgZGF0YSBwb2ludHMgYmV5b25kIDIwMTUgdXNlIHRoZSBleHRyYXBvbGF0aW9uIG1ldGhvZCBmcm9tIFNpZXJyYSAoMjAxOCkuIEFsbCBhdG1vc3BoZXJpYyBkYXRhIGlzIGZvciB0aGUgbm9ydGhlcm4gaGVtaXNwaGVyZSAoem9uZSAyKS4KClRoZSBzaW1wbGVzdCB0d28tcG9vbCBtb2RlbCBpcyBhIHBhcmFsbGVsIHN5c3RlbTogb25lIGluIHdoaWNoIGNhcmJvbiBlbnRlcmluZyB0aGUgc29pbCBpcyBwYXJ0aXRpb25lZCBiZXR3ZWVuIHRoZSB0d28gcG9vbHMgd2l0aG91dCBhbnkgdHJhbnNmZXJzIGZyb20gb25lIHBvb2wgdG8gdGhlIG90aGVyLiBIb3dldmVyLCBldmVuIGluIHRoaXMgc2ltcGxlIHN5c3RlbSwgdGhlIHNhbWUgdHJlYXRtZW50IGVmZmVjdCBjYW4gcmVzdWx0IGluIGVpdGhlciBlbnJpY2htZW50IG9yIGRlcGxldGlvbiBkZXBlbmRpbmcgb24gdGhlIHllYXIgdGhlIHNhbXBsZSB3YXMgY29sbGVjdGVkLiBUaGUgZGlyZWN0aW9uIG9mIGNoYW5nZSB3aWxsIGJlIGRlcGVuZGVudCBvbiBzeXN0ZW0gZHluYW1pY3MsIHNwZWNpZmljYWxseSB0aGUgaW50cmluc2ljIGRlY29tcG9zaXRpb24gcmF0ZXMgb2YgdGhlIHNsb3cgYW5kIGZhc3QgcG9vbHMsIHdoaWxlIGluIG1vcmUgY29tcGxpY2F0ZWQgc3l0ZW1zIHRoZSBhbW91bnQgb2YgbWl4aW5nIGJldHdlZW4gdGhlIHBvb2xzIHdpbGwgcGxheSBhIHJvbGUgYXMgd2VsbC4gUG90ZW50aWFsIHRyZWF0bWVudCBlZmZlY3RzIGZvciB0aGUgc2FtZSBwYXJhbGxlbCB0d28tcG9vbCBtb2RlbCBzeXN0ZW0gc2hvd24gaW4gRmlnLiAxIGFyZSBzaG93biBiZWxvdyBhdCB0d28gcG9pbnRzIGluIHRpbWUgKEZpZy4gMikuCgpgYGB7ciBjb25jZXB0dWFsLW1vZGVsLWZpZzFifQojIHpvb20gKHcvIGF0bSwgdG8gMjAyMikKZi4ycC5DMTQuZGYgJT4lIAogIGZpbHRlcih5ZWFycyA+IDE5ODcpICU+JQogIGZpbHRlcihwb29sICE9ICJhdG0iKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwb29sKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG9icy5wdHMsIGFlcyh5ZWFycywgZDE0Yywgc2hhcGUgPSBPYnNlcnZhdGlvbiksIGNvbG9yID0gIiNGRkMxMDciLCBzdHJva2UgPSAxLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiksCiAgICBsYWJlbHMgPSBjKCJhdG0iID0gImF0bW9zcGhlcmUiLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiZmFzdCIsCiAgICAgICAgICAgICAgICJzbG93IiA9ICJzbG93IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoCiAgICBuYW1lID0gIk9ic2VydmVkIHJlc3BpcmF0aW9uIiwKICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIgPSAwLAogICAgICAgICAgICAgICAiaW5jcmVhc2VkIGZhc3QgcG9vbCBjb250cmlidXRpb24iID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyNjUpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4pfWBiLiBQb3RlbnRpYWwgc2hpZnRzIGluICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaW4gcmVzcG9uc2UgdG8gYWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nLCBvciBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcgKyBzdG9yYWdlKioKCj4qQ2FwdGlvbjoqIEJsdWUgYW5kIG1hZ2VudGEgbGluZXMgc2hvdyBtb2RlbGVkIHRyYWplY3RvcmllcyBvZiAkXERlbHRhJF4xNF5DIGluIGZhc3QgYW5kIHNsb3cgY3ljbGluZyBzb2lsIGNhcmJvbiBwb29scyAoc2FtZSBtb2RlbCBhcyBGaWcgMSksIGFuZCAkXERlbHRhJF4xNF5DIG9mIHJlc3BpcmVkIENPfjJ+IGlzIHNob3duIGluIHllbGxvdy4gU29saWQgY2lyY2xlcyBzaG93IGh5cG90aGV0aWNhbCBvYnNlcnZhdGlvbnMgb2YgXjE0XkMgb3IgcmVzcGlyZWQgQ09+Mn4gZnJvbSBjb250cm9sIGluY3ViYXRpb25zLCB3aGlsZSB0aGUgb3BlbiBzeW1ib2xzIHJlcHJlc2VudCB0d28gcG9zc2libGUgc2NlbmFyaW9zIGluIHdoaWNoIF4xNF5DLUNPfjJ+IHNoaWZ0cyBkdWUgdG8gaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmYXN0IHBvb2wgKG9wZW4gY2lyY2xlcyksIG9yIHNoaWZ0cyBkdWUgdG8gaW5jcmVhc3NlZCBjb250cmlidXRpb24gZnJvbSB0aGUgc2xvdyBwb29sIChvcGVuIHNxdWFyZXMpLiBEdWUgdG8gdGhlIGNyb3NzaW5nIG9mIHRoZSBibHVlIGFuZCBtYWdlbnRhIGxpbmVzIGluIDIwMDksIGluY3JlYXNlZCBjb250cmlidXRpb24gb2YgdGhlIHNsb3cgcG9vbCB0byByZXNwaXJhdGlvbiBmb2xsb3dpbmcgdHJlYXRtZW50IGxlYWRzIHRvIHJlbGF0aXZlIGRlcGxldGlvbiBvZiBeMTReQy1DT34yfiBpbiAxOTkxLCBidXQgcmVsYXRpdmUgZW5yaWNobWVudCBvZiBeMTReQy1DT34yfiBpbiAyMDE5LCB3aGlsZSB0aGUgb3Bwb3NpdGUgaXMgb2JzZXJ2ZWQgZm9yIGluY3JlYXNlZCBmYXN0IHBvb2wgY29udHJpYnV0aW9uLgoKSW4gdGhlIGFib3ZlIHBsb3QgKEZpZy4gMiksIGluY3JlYXNlZCBjb250cmlidXRpb24gZnJvbSB0aGUgc2xvdyBwb29sIGxlYWRzIHRvIGRlcGxldGlvbiBpbiAkXERlbHRhJF4xNF5DIG9mIHJlc3BpcmF0aW9uIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sIG9ic2VydmF0aW9uIGluIDE5OTEgYnV0IHJlbGF0aXZlIGVucmljaG1lbnQgaW4gMjAxOS4KCiMgTWV0aG9kcyBhbmQgbWF0ZXJpYWxzCgoqUmFkaW9jYXJib24gY29ycmVjdGlvbnMqCgpBbHRob3VnaCBkaWZmZXJlbmNlcyB3ZXJlIHNtYWxsLCByYWRpb2NhcmJvbiBkYXRhIGZvciBhcmNoaXZlZCBzYW1wbGVzIHdlcmUgZmlyc3QgY29ycmVjdGVkIGZvciBkZWNheSBzaW5jZSB0aGUgeWVhciBvZiBjb2xsZWN0aW9uIGJlZm9yZSBhc3Nlc3NpbmcgdHJlYXRtZW50IGVmZmVjdHMuCgpEZWNheSBjb3JyZWN0aW9uIGZvcm11bGE6CiQkMTAwMCBcY2RvdCBcbGVmdCggKEZNIFxjZG90IGVee1xmcmFjey15ZWFyX3tzYW1wbGVkfSArIDE5NTB9ezgyNjd9fSkgLSAxIFxyaWdodCkkJAoKd2hlcmUgRk0gaXMgdGhlIGZyYWN0aW9uIG1vZGVybiwgYW5kIDgyNjcgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIG5hdHVyYWwgbG9nIG9mIHR3byBhbmQgdGhlIHRydWUgaGFsZiBsaWZlIG9mIF4xNF5DICg1NzMwIHkpLgoKYGBge3IgMTRDIGhlbHBlciBmeHN9CiMgNS4gQ3JlYXRlIGhlbHBlciBmdW5jdGlvbnMKIyBkZWNheSBjb3JyZWN0aW9uIGZ1bmN0aW9uICAKZGVjYXkuY29yci5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGZyYWN0aW9uX21vZGVybikgewogIGlmZWxzZShpcy5uYShmcmFjdGlvbl9tb2Rlcm4pLCBOQSwgMTAwMCooKGZyYWN0aW9uX21vZGVybipleHAoKC15ZWFyX3NhbXBsZWQgKyAxOTUwKS84MjY3KSktMSkpCn0KCiMgZDE0QyB0byBmcmFjdGlvbiBtb2Rlcm4gZnVuY3Rpb24KZDE0Yy5mbS5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGQxNGMpIHsKICAoKGQxNGMgLyAxMDAwKSArIDEpIC8gZXhwKDAuMDAwMTIwOTcgKiAoMTk1MCAtIHllYXJfc2FtcGxlZCkpCiAgfQoKIyBkZWZpbmUgaGVscGVyIGZ1bmN0aW9uIGZvciBzdHJpcHBpbmcgb3V0ICJOQSIgYW5kIG5vbi1FeHBsb3JhdG9yaWVzIGRhdGEKZXh0cmEuY2xlYW4uZnggPC0gZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkZlt3aGljaChncmVwbCgiSEVHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJIRVciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIlNFRyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VXIiwgZGYkUHJvYmUpKSwgXQogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIF0gCiAgfQogIGl4IDwtIHdoaWNoKGlzLm5hKGRmJEYxNEMpICYgaXMubmEoZGYkYOKIhjE0Qy4o4oCwKWApKQogIGlmKGxlbmd0aChpeCkgPiAxKSB7CiAgICBkZiA8LSBkZlstaXgsIF0KICB9CiAgcmV0dXJuKGRmKQp9CgojIGV4dHJhY3Qgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIHNlcGFyYXRlbHkKdG1lLjE0Yy5meCA8LSBmdW5jdGlvbihkZikgewogIGRmJFNhbXBsZU5hbWUgPC0gZGYkUHJvYmUKICBkZiRQZXJpb2QgPC0gImluYyIKICBpZihsZW5ndGgoZ3JlcCgiRXhwZXJpbWVudCIsIG5hbWVzKGRmKSkpID4gMCkgewogICAgIGRmIDwtIGRmW3doaWNoKGRmJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdIAogIH0KICByZXR1cm4oZGYpCn0KYGBgCgoKYGBge3IgcmVhZCB3aWRlIHRzIGRhdGF9CiMgMS4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSAoZXhwZXJpbWVudCAxKSBhbmQgc3RvcmFnZSBkdXJhdGlvbiAoZXhwZXJpbWVudCAzKSBjb250cm9sIHNhbXBsZXMsIGFuZCBjb252ZXJ0IGZyb20gIndpZGUiIHRvICJsb25nIiBmb3JtYXQgc28gYXMgdG8gbWF0Y2ggb3RoZXIgZGF0YS4gCiMgUmVhZCBhaXItZHJ5ICsgc3RvcmFnZSByZXNwaXJhdGlvbiBjb250cm9sIGRhdGEKYXJjaGl2ZS5jdGwudHMud2lkZSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQxLWZsdXgvYXJjLWluY194cGxyX2FyYy1zdG9yYWdlLXQxLWZsdXhfMjAyMC0wNC0yOS5jc3YiKQoKIyBDb252ZXJ0IHRpbWUgZGF0YSBmcm9tIHdpZGUgdG8gbG9uZwphcmNoaXZlLmN0bC50cy5kIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX3RpbWVfZCIpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0aW1lcG9pbnRfY210diIsCiAgICAgICAgICAgICAgIG5hbWVzX3ByZWZpeCA9ICJpbmNfdGltZV9kXyIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ0aW1lX2QiKQojIHNvcnQgYnkgdGltZXBvaW50X2NtdHYKYXJjaGl2ZS5jdGwudHMuZCA8LSBkYXRhLmZyYW1lKGFyY2hpdmUuY3RsLnRzLmRbb3JkZXIoYXJjaGl2ZS5jdGwudHMuZCR0aW1lcG9pbnRfY210diksXSkKCiMgQ29udmVydCBtZ0NPMiBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBzZWxlY3QoYXJjaGl2ZS5jdGwudHMud2lkZSwgc3RhcnRzX3dpdGgoImluY19tZ0NPMl9qYXJfIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY19tZ0NPMl9qYXJfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIm1nQ08yX2phciIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5jbzIgPC0gYXJjaGl2ZS5jdGwudHMuY28yW29yZGVyKGFyY2hpdmUuY3RsLnRzLmNvMiR0aW1lcG9pbnRfY210diksXQoKIyBhc3NlbWJsZSBpbiBsb25nIGRhdGFmcmFtZSAKYXJjaGl2ZS5jdGwudHMgPC0gZGF0YS5mcmFtZShJRCA9IHJlcCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCksIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9ICJpbmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVwb2ludF9jbXR2ID0gcmVwKHNlcShmcm9tID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gNSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggPSBsZW5ndGgoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfZCA9IGFyY2hpdmUuY3RsLnRzLmQkdGltZV9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nQ08yX2phciA9IGFyY2hpdmUuY3RsLnRzLmNvMiRtZ0NPMl9qYXIpCgojIGFkZCBwcmVpbmN1YmF0aW9uIGRhdGEKYXJjaGl2ZS5jdGwudHMucHJlIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbMTpsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSUQiLCAicHJlaW5jX3RpbWVfZCIsICJwcmVpbmNfbWdDTzJfamFyIildCmFyY2hpdmUuY3RsLnRzLnByZSA8LSByZW5hbWUoYXJjaGl2ZS5jdGwudHMucHJlLCB0aW1lX2QgPSBwcmVpbmNfdGltZV9kLCBtZ0NPMl9qYXIgPSBwcmVpbmNfbWdDTzJfamFyKQphcmNoaXZlLmN0bC50cy5wcmUkdGltZXBvaW50X2NtdHYgPC0gMQphcmNoaXZlLmN0bC50cy5wcmUkUGVyaW9kIDwtICJwcmUiCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2RfY210diA8LSBhcmNoaXZlLmN0bC50cy5wcmUkdGltZV9kCiAgCiMgQ2FsY3VsYXRlIHRpbWVfZF9jbXR2CmFyY2hpdmUuY3RsLnRzIDwtIGJpbmRfcm93cygKICBsYXBwbHkoCiAgICBzcGxpdChhcmNoaXZlLmN0bC50cywgYXJjaGl2ZS5jdGwudHMkdGltZXBvaW50X2NtdHYpLAogICAgZnVuY3Rpb24oeCkgewogICAgICB4JHRpbWVfZF9jbXR2IDwtIHgkdGltZV9kICsgCiAgICAgICAgYXJjaGl2ZS5jdGwudHMucHJlW21hdGNoKHgkSUQsIGFyY2hpdmUuY3RsLnRzLnByZSRJRCksICJ0aW1lX2QiXQogICAgICByZXR1cm4oeCkKICAgIH0KICAgICkKICApCgojIHJiaW5kIHByZWluYyBhbmQgaW5jIGRhdGEKYXJjaGl2ZS5jdGwudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHMucHJlLCBhcmNoaXZlLmN0bC50cykKCiMgYWRkIFNhbXBsZU5hbWUgY29sdW1uIGFuZCByZXN0b3JlIEV4cGVyaW1lbnQgY29sdW1uCmFyY2hpdmUuY3RsLnRzJFNhbXBsZU5hbWUgPC0gYXJjaGl2ZS5jdGwudHMkSUQKYXJjaGl2ZS5jdGwudHMkRXhwZXJpbWVudCA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgIkV4cGVyaW1lbnQiXQoKIyByZW1vdmUgaW50ZXJtZWRpYXRlIGZpbGVzCnJtKGFyY2hpdmUuY3RsLnRzLmQsIGFyY2hpdmUuY3RsLnRzLmNvMiwgYXJjaGl2ZS5jdGwudHMucHJlKQpgYGAKCmBgYHtyIHJlYWQtbG9uZy10cy1kYXRhfQojIDIuIExvYWQgZmx1eCBkYXRhIGZyb20gYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcyBhbmQgZnJvbSBhaXItZHJ5IGV4cGVyaW1lbnQgKGN0bCAmIHRyZWF0bWVudCksIEMgJiBOIGRhdGEgZm9yIGFsbCB0aGUgRXhwbG9yYXRvcmllcyBzYW1wbGVzIChtZWFzdXJlZCBpbiAyMDExKSwgYW5kIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgZGF0YSBmb3IgYWxsIGV4cGVyaW1lbnRzLgojIFJlYWQgWHBsciBDIGFuZCBOIGRhdGEKeHBsci5jbiA8LSByZWFkLmNzdigiLi4vZGF0YS9leHRlcm5hbC9leHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfc29pbGNuXzIwMTEvMTcwNDA3X0NOX2NvbmNlbnRyYXRpb25zX0V4cGxvcmF0b3JpZXNfRVBfUGxvdHNfMjAxMS5jc3YiKQoKIyBSZWFkIFhwbHIgMTRDIGRhdGEgZm9yIGNvbnRyb2wgc2FtcGxlcyAoInRtZSIgYW5kICJhcmMiIEV4cGVyaW1lbnRzKQp4cGxyLmN0bC5pc28gPC0gcmVhZC54bHN4KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMtY28yXzIwMTEvMTcwMjI4XzE0Q19SZXNwaXJhdGlvbi54bHN4IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBzYW1wbGVzCmphcmluZm8uYXJjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDItamFySW5mby9qYXJfaW5mb3JtYXRpb24uY3N2IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIGFpci1kcnkgZGF0YQpqYXJpbmZvLnJld2V0IDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYWlyLWRyeS0yMDE5LXdoYy9haXItZHJ5LTIwMTktd2hjXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIHN0b3JhZ2UgZHVyYXRpb24gdHJlYXRtZW50IHNhbXBsZXMKIyByZW1vdmUgdW5pdCByb3cgYW5kIGNvbnZlcnQgdG8gYXBwcm9wcmlhdGUgdHlwZXMKamFyaW5mby50bWUgPC0gdHlwZS5jb252ZXJ0KHJlYWQueGxzeCgiLi4vZGF0YS9yYXcvbGFiX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0wNy0zMC9BcmNJbmNfSW5jRGF0YV8yMDE4Lnhsc3giLCBzaGVldCA9IDEpWy0xLCBdKQoKIyBSZWFkIER1a2UgaXNvIGFuZCBmbHV4IGRhdGEKdG1lLmN0bC5kdWsgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLWR1a2UvYXJjLXRtZS1kdWtlXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBTaWVycmEgTmV2YWRhIChKdW4ncykgc29pbCBkYXRhCnRtZS5jdGwuc29pbC5zcmEgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXNpZXJyYS9hcmMtdG1lLXNpZXJyYS1zb2lsXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBPYWsgUmlkZ2UgQyBkYXRhCnRtZS5jdGwub3JubCA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtb3JubC9hcmMtdG1lLW9ybmxfMjAyMC0wNC0zMC5jc3YiKQoKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGRhdGEKYXJjaGl2ZS5hcmMudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1mbHV4L2FyY2hpdmUtZmx1eC10Ml8yMDIwLTA0LTI0LmNzdiIpCgojIFJlYWQgY29udHJvbCByZXNwaXJhdGlvbiBkYXRhIGZyb20gMjAxOSBhaXItZHJ5IGV4cGVyaW1lbnQKcmV3ZXQuY3RsLnRzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvZnJlc2gtMjAxOS1mbHV4L2ZyZXNoLTIwMTktZmx1eF8yMDIwLTA0LTI0LmNzdiIpCgojIFJlYWQgdHJlYXRtZW50IHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5kcnkudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9kcmllZC0yMDE5LWZsdXgvZHJpZWQtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBTaWVycmEgTmV2YWRhIChKdW4ncykgZmx1eCBkYXRhCnRtZS5jdGwuZmx4LnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLWZsdXhfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIHN0b3JhZ2UgZHVyYXRpb24gcmVzcGlyYXRpb24gZGF0YQp0bWUudHJ0LnRzIDwtIHJiaW5kKHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS10Mi1mbHV4L2FyYy10bWUtdDItZmx1eC0xXzIwMjAtMDQtMjcuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTJfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpKQoKIyBSZWFkIG1pc2NlbGxhbmVvdXMgc3RvcmFnZSB0cmVhdG1lbnQgZGF0YQp0bWUubWlzYyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtbWlzYy9hcmMtdG1lLW1pc2MtaXNvXzIwMjAtMDQtMjkuY3N2IikKYGBgCgpgYGB7ciBzdW1tYXJpemUgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIDMuIENvbWJpbmUgYW5kIHN1bW1hcml6ZSBkYXRhIGluIGxvbmcgZm9ybWF0IHRvIGNhbGN1bGF0ZSByZXNwaXJhdGlvbiByYXRlcyBhbmQgcGxvdCBvdmVyIHRpbWUKIyBOQjogc2V0ICJpbmNsdWRlIiB0byBmYWxzZSB0byBzdXBwcmVzcyBiaW5kX3Jvd3Mgd2FybmluZyBhYm91dCBjb2VyY2luZyBmYWN0b3IgdG8gY2hhcgojIHJlbW92ZSBmb3JtdWxhX2NoZWNrIGNvbHVtbnMKaW52aXNpYmxlKGxpc3QyZW52KGxhcHBseShsaXN0KGFyY2hpdmUuYXJjLnRzID0gYXJjaGl2ZS5hcmMudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuY3RsLnRzID0gcmV3ZXQuY3RsLnRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld2V0LmRyeS50cyA9IHJld2V0LmRyeS50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS50cnQudHMgPSB0bWUudHJ0LnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4JGZvcm11bGFfY2hlY2sgPC0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgIGVudmlyID0gLkdsb2JhbEVudikKICAgICAgICAgICkKCiMgQWRkIFRyZWF0bWVudCBjb2x1bW5zIHRvIGVhY2ggZGF0YXNldAphcmNoaXZlLmFyYy50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphcmNoaXZlLmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS50cnQudHMkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpyZXdldC5jdGwudHMkVHJlYXRtZW50IDwtICJjb250cm9sIgpyZXdldC5kcnkudHMkVHJlYXRtZW50IDwtICJhaXItZHJ5IgoKIyBjb21iaW5lIHJld2V0IGRhdGEKcmV3ZXQudHMgPC0gcmJpbmQocmV3ZXQuY3RsLnRzLCByZXdldC5kcnkudHMpCnJld2V0LnRzJEV4cGVyaW1lbnQgPC0gInJld2V0IgoKIyBhZGQgc29pbCBkcnkgd3QgZGF0YQphcmNoaXZlLmFyYy50cyRkd19nIDwtIGphcmluZm8uYXJjW21hdGNoKGFyY2hpdmUuYXJjLnRzJFNhbXBsZU5hbWUsIGphcmluZm8uYXJjJFNhbXBsZSksICJTb2lsLmRyeS53ZWlnaHRfLmcuIl0KYXJjaGl2ZS5jdGwudHMkZHdfZyA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgImRyeV9zb2lsX3d0X2NvcnJlY3RlZF9nIl0KcmV3ZXQudHMgPC0gbWVyZ2UocmV3ZXQudHMsIGphcmluZm8ucmV3ZXRbICwgYygiSUQiLCAiVHJlYXRtZW50IiwgImR3X2ciKV0sIGJ5ID0gYygiSUQiLCAiVHJlYXRtZW50IikpCnRtZS50cnQudHMgPC0gbWVyZ2UodG1lLnRydC50cywgamFyaW5mby50bWVbICwgYygiTnIuIiwgImRyeS5zb2lsIildLCBieS54ID0gIlNhbXBsZU5hbWUiLCBieS55ID0gIk5yLiIpCmNvbG5hbWVzKHRtZS50cnQudHMpW3doaWNoKG5hbWVzKHRtZS50cnQudHMpID09ICJkcnkuc29pbCIpXSA8LSAiZHdfZyIKCiMgYWRkIGV4cGVyaW1lbnQgY29sIHRvIGFyY2hpdmUuYXJjLnRzLCBzdG9yYWdlLnRydC50cwphcmNoaXZlLmFyYy50cyRFeHBlcmltZW50IDwtICJhcmMiCnRtZS50cnQudHMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyBjb21iaW5lIGFyY2hpdmUgZGF0YSBhbmQgRXhwbG9yYXRvcmllcyBzdG9yYWdlIGR1cmF0aW9uIGRhdGEKYXJjaGl2ZS50cyA8LSByYmluZChhcmNoaXZlLmN0bC50c1t3aGljaChhcmNoaXZlLmN0bC50cyRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSwgCiAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZS5hcmMudHNbICwgbmFtZXMoYXJjaGl2ZS5jdGwudHMpXSkKdG1lLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdLAogICAgICAgICAgICAgICAgdG1lLnRydC50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQoKIyBiaW5kIHRtZS5jdGwuZmx4LnNyYSBkYXRhIHRvIHRtZS50cwojIGFsbCBvdGhlciB0bWUuZmx4IGRhdGEgaXMgYWxyZWFkeSBzdW1tYXJpemVkCnRtZS5jdGwuZmx4LnNyYSRFeHBlcmltZW50IDwtICJ0bWUiCnRtZS5jdGwuZmx4LnNyYSRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS5jdGwuZmx4LnNyYSRkd19nIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godG1lLmN0bC5mbHguc3JhJEphcl9JRCwgdG1lLmN0bC5zb2lsLnNyYSRKYXJfSUQpLCAiZHdfZyJdCnRtZS50cyA8LSByYmluZCh0bWUudHMsIHRtZS5jdGwuZmx4LnNyYVsgLCBuYW1lcyh0bWUudHMpXSkKCiMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIkV4cGVyaW1lbnQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIsICJ0aW1lcG9pbnRfY210diIsICAidGltZV9kIiwgInRpbWVfZF9jbXR2IiwgIm1nQ08yX2phciIsICJkd19nIikKaW52aXNpYmxlKGxhcHBseShsaXN0KGFyY2hpdmUudHMgPSBhcmNoaXZlLnRzLAogICAgICAgICAgICAgICAgICAgICAgcmV3ZXQudHMgPSByZXdldC50cywKICAgICAgICAgICAgICAgICAgICAgIHRtZS50cyksCiAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgIGlmZWxzZSghaXMubmEobWF0Y2gobm1zLCBuYW1lcyh4KSkpLCAieWVzIiwgIm5vIikKICAgICAgIH0KICAgICAgICkpCgojIGNvbWJpbmUgYWxsIGRhdGEgYW5kIHJlbW92ZSB0aW1lIHBvaW50cyB3aXRob3V0IENPMiBtZWFzdXJlbWVudHMKdHMgPC0gYmluZF9yb3dzKGFyY2hpdmUudHNbICwgbm1zXSwgcmV3ZXQudHNbICwgbm1zXSwgdG1lLnRzWyAsIG5tc10pCmlmKGxlbmd0aCh3aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSkgPiAwKSB7CiAgdHMgPC0gdHNbLXdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpLCBdCn0KCiMgYWRkIEMgY29udGVudAojIHhwbHIKdHMkZ0NfZ1MgPC0geHBsci5jblttYXRjaCh0cyRJRCwgeHBsci5jbiRFUF9QbG90aWQpLCAiVG90YWxfQyJdKjEwXi0zCiMgZHVrZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLmR1a1ttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5kdWskSUQpLCAiQ19nX2tnIl0qMTBeLTMKIyBzaWVycmFzCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwuc29pbC5zcmEkSUQpLCAiZ0Nfa2dTIl0qMTBeLTMKIyBvYWsgcmlkZ2UKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5vcm5sW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLm9ybmwkSUQpLCAiQ19nX2tnIl0qMTBeLTMKCiMgYWRkIFR5cGUKdHMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCB0cyRJRCksICJHIiwgIkYiKQoKIyBjYWxjdWxhdGUgQ08yIHJlc3BpcmF0aW9uIGluIG1nQ08yLUMgcGVyIGcgc29pbCBDCiMgTkI6IDEyLzQ0ID0gbWFzcyByYXRpbyBvZiBDIGluIENPMgp0cyRtZ0NPMi5DX2dDIDwtICh0cyRtZ0NPMl9qYXIqKDEyLzQ0KSkvKHRzJGR3X2cqdHMkZ0NfZ1MpCnRzJG1nQ08yLkNfZ0NfZCA8LSB0cyRtZ0NPMi5DX2dDL3RzJHRpbWVfZAoKIyBzdW1tYXJpemUgQ08yIHJlbGVhc2UgZGF0YSBmb3IgZWFjaCB0aW1lcG9pbnQsIGJ5IGV4cGVyaW1lbnQsIHRyZWF0bWVudCwgYW5kIHR5cGUKdHMuYXZnIDwtIGRhdGEuZnJhbWUobmEub21pdCh0cykgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2KSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkpCgojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRwMC5mIDwtIGZ1bmN0aW9uKGRmKSB7CiAgdHAwIDwtIGRmWzEsIF0KICB0cDBbICwgLXdoaWNoKG5hbWVzKHRwMCkgPT0gIkV4cGVyaW1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHJlYXRtZW50IiB8IG5hbWVzKHRwMCkgPT0gIlR5cGUiIHwgbmFtZXModHAwKSA9PSAibiIpXSA8LSAwCiAgcmJpbmQodHAwLCBkZikKfQp0cy5hdmckdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZyRUcmVhdG1lbnQsIHRzLmF2ZyRFeHBlcmltZW50KQp0cy5hdmcgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZywgdHMuYXZnJHRyZWF0LkV4cCksIGZ1bmN0aW9uKHgpIHsKICBsYXBwbHkoc3BsaXQoeCwgeCRUeXBlKSwgdHAwLmYpCiAgfSkKdHMuYXZnIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnLCBiaW5kX3Jvd3MpKQoKIyByZXN0b3JlIGNsYXNzZXMKdHMuYXZnIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KHRzLmF2ZywgdHlwZS5jb252ZXJ0KSkKYGBgCgojIFJlc3VsdHMKIyMgUmVzcGlyYXRpb24gcmF0ZXMKCmBgYHtyIHJlc3AtcmF0ZS1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIHJld2V0IG1heCByZXNwIHJhdGVzCnQudGVzdCgKICB0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kIl0sdHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAiU2FtcGxlTmFtZSJdLCBtYXgsIG5hLnJtID0gVFJVRSksCiAgdGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIlNhbXBsZU5hbWUiXSwgbWF4LCBuYS5ybSA9IFRSVUUpKQpgYGAKCipFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCkqCgpSZXNwaXJhdGlvbiByYXRlcyBpbmNyZWFzZWQgZHJhbWF0aWNhbGx5IGZvbGxvd2luZyByZXdldHRpbmcgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgaW4gY29tcGFyaXNvbiB0byBjb250cm9sIHNhbXBsZXMsIHNpbWlsYXIgdG8gd2hhdCBoYXMgYmVlbiBvYnNlcnZlZCBpbiBvdGhlciBhaXItZHJ5L3Jld2V0dGluZyBzdHVkaWVzIFtjaXRlXS4gSG93ZXZlciwgdGhlIG1hZ25pdHVkZSBhbmQgdGltaW5nIG9mIHRoZSBwZWFrIGluIHJlc3BpcmF0aW9uIHJhdGVzIHdhcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBiZXR3ZWVuIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNpdGVzIFtzdGF0aXN0aWNzOyBvdGhlciBmb3Jlc3QvZ3Jhc3NsYW5kIHN0dWRpZXMgZm9yIGNvbXBhcmlzb24/XSAqKihGaWcuIDMpKiouCgpBbW9uZyB0aGUgYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcywgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBtb3JlIHRoYW4gdHdpY2UgYXMgaGlnaCBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMsIHJlYWNoaW5nIGEgbWF4aW11bSBvZiBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCwgZm9sbG93ZWQgYnkgYSBzaGFycCBkZWNsaW5lLiBNZWFuIHJlc3BpcmF0aW9uIHJhdGVzIGluIGZvcmVzdCBzaXRlcyBwZWFrZWQgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGgsIGZvbGxvd2VkIGJ5IGEgbXVjaCBtb3JlIGdyYWR1YWwgZGVjbGluZSB0aGFuIGluIGdyYXNzbGFuZCBzaXRlcy4gQ29udHJvbCBzYW1wbGVzIHJlc3BvbmRlZCBtb3JlIHdlYWtseSBhbmQgbW9yZSBncmFkdWFsbHkgdG8gcmV3ZXR0aW5nLCBhbHRob3VnaCBhcyBpbiB0aGUgdHJlYXRtZW50IHNhbXBsZXMgcmVzcGlyYXRpb24gd2FzIGdyZWF0ZXIgaW4gZ3Jhc3NsYW5kIHNvaWxzIHRoYW4gaW4gZm9yZXN0IHNvaWxzLiBQZWFrIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBjb250cm9sIGluY3ViYXRpb25zIHdlcmUgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIGFuZCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGggZm9yIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNvaWxzLCByZXNwZWN0aXZlbHkuCgoqRXhwZXJpbWVudCAyIChhaXItZHJ5IHRyZWF0bWVudCwgMjAxOSBzYW1wbGVzKSoKClJlc3BpcmF0aW9uIHJhdGVzIGZvciB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCBzYW1wbGVzIHNob3dlZCBhIHNpbWlsYXJseSBkcmFtYXRpYyBpbmNyZWFzZSBpbiBjb21wYXJpc29uIHRvIHRoZSBjb250cm9scyBhcyB3YXMgb2JzZXJ2ZWQgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgc2FtcGxlcyBpbiBFeHBlcmltZW50IDEuIEhvd2V2ZXIsIHVubGlrZSB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBwZWFrIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChwID4gMC4wNSkgYmV0d2VlbiBmb3Jlc3QgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDIsIHBlYWtpbmcgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAuMCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseSAqKihGaWcuIDMpKiouCgpgYGB7ciBDTzItcmVzcC1yYXRlc30KIyBwbG90dGVkIGFzIG1lYXN1cmVkCnRzLmF2ZyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0LCBjb2xvcj0iZ3JheSIpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIjIwMTEiLCAicmV3ZXQiID0gIjIwMTkiKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gJ1N0ZC4gRXJyLicsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAuMikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAnZGFzaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImRhc2hlZCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxKSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGRheXMpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnLiBgciB7KGZpZy5uICsgMSl9YC4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSBhbmQgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KSoqCgo+KkNhcHRpb246KiBUb3AgcGFuZWwgc2hvd3MgZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSwgYm90dG9tIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBFeHBlcmltZW50IDIgKGFpci1kcnkgb25seSB0cmVhdG1lbnQpLiBWZXJ0aWNhbCBncmF5IGxpbmUgZGVtYXJjYXRlcyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZyb20gdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZC4gUG9pbnRzIHNob3cgbWVhc3VyZW1lbnRzIGFuZCBsaW5lcyBzaG93IHRyZW5kcyBpbiBtZWFuIHJlc3BpcmF0aW9uIHJhdGVzLiBTaGFkZWQgcmliYm9ucyByZXByZXNlbnQgdGhlIHN0YW5kYXJkIGVycm9yLiBUaGUgZmluYWwgbWVhc3VyZW1lbnQgcG9pbnRzIGZvciBhIGZldyBzYW1wbGVzIHdoaWNoIHRvb2sgPjE4IGRheXMgdG8gcmVhY2ggQ09+Mn4gdGFyZ2V0cyBhcmUgZXhjbHVkZWQgZm9yIGRpc3BsYXkgcmVhc29ucy4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIHRob3NlIHNhbXBsZXMgcmVtYWluZWQgZmxhdC4gTm90ZSB0aGF0IENPfjJ+IGNvbmNlbnRyYXRpb25zIGZvciBjb250cm9sIHNhbXBsZSBpbmN1YmF0aW9ucyBpbiBFeHBlcmltZW50IDEgd2VyZSBvbmx5IG1lYXN1cmVkIG9uY2UgZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QsIHNvIHJhdGVzIGFyZSBzaG93biBhcyB0aGUgY3VtdWxhdGl2ZSBhdmVyYWdlLiBGb3IgcHVycG9zZXMgb2YgY29tcGFyaXNvbiwgU3VwcGxlbWVudGFsIEZpZ3VyZSAxIHNob3dzIGFsbCBkYXRhIHBsb3R0ZWQgd2l0aCBwcmUtaW5jdWJhdGlvbiByZXNwaXJhdGlvbiByYXRlcyBjYWxjdWxhdGVkIGFzIGEgY3VtdWxhdGl2ZSBhdmVyYWdlLgoKKlN1cHBsZW1lbnRhbCByZXNwaXJhdGlvbiByYXRlcyBmaWd1cmU6KgoKYGBge3IgQ08yLWZsdXgtcGxvdHMtU0l9CiMgTm90ZTogdGhpcyBjb2RlIHBsb3RzIGRhdGEgd2l0aCBwcmUtaW5jdWJhdGlvbiBvYnNlcnZhdGlvbnMgYXZlcmFnZWQKIyBQbG90IHJlc3AgcmF0ZXMgb3ZlciB0aW1lCnRzLnByZSA8LSB0c1t0cyRQZXJpb2QgPT0gInByZSIsIF0KdHMucHJlLmF2ZyA8LSB0cy5wcmUgJT4lCiAgZmlsdGVyKHRpbWVfZF9jbXR2ID4gMy41KSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgU2FtcGxlTmFtZSwgbWdDTzIuQ19nQywgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4pLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShtZ0NPMi5DX2dDX2QgPSBtZ0NPMi5DX2dDX21lYW4vdGltZV9kX2NtdHZfbWVhbikgJT4lCiAgc2VsZWN0KC1TYW1wbGVOYW1lLCAtbWdDTzIuQ19nQ19tZWFuLCBFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHZfbWVhbikgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkKCnRzLmluYy5hdmcgPC0gdHMgJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2KSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkKCmNvbG5hbWVzKHRzLnByZS5hdmcpW3doaWNoKG5hbWVzKHRzLnByZS5hdmcpICVpbiUgYygidGltZXBvaW50X2NtdHZfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW5fbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW5fc2QiKSldIDwtIGMoInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9zZCIpCgp0cy5wcmUuYXZnIDwtIHRzLnByZS5hdmdbICwgLXdoaWNoKCFuYW1lcyh0cy5wcmUuYXZnKSAlaW4lIG5hbWVzKHRzLmluYy5hdmcpKV0KCnRzLmF2ZzIgPC0gZGF0YS5mcmFtZShyYmluZCh0cy5wcmUuYXZnLCB0cy5pbmMuYXZnKSkKdHMuYXZnMiA8LSB0cy5hdmcyW2NvbXBsZXRlLmNhc2VzKHRzLmF2ZzIpLCBdCgojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRzLmF2ZzIkdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZzIkVHJlYXRtZW50LCB0cy5hdmcyJEV4cGVyaW1lbnQpCnRzLmF2ZzIgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZzIsIHRzLmF2ZzIkdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcyIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnMiwgYmluZF9yb3dzKSkKCiMgcmVzdG9yZSBjbGFzc2VzCnRzLmF2ZzIgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnMiwgdHlwZS5jb252ZXJ0KSkKCiMgcGxvdAp0cy5hdmcyICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZF9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfZF9tZWFuKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQsIGNvbG9yPSJncmF5IikgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbCwgeW1heCA9IHNlX3Nsb3BlX3UsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZGFzaGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipTdXBwbGVtZW50YWwgRmlnIGByIHsoc2ZpZy5uIDwtIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzaG93biB3aXRoIGFsbCBwcmUtaW5jdWJhdGlvbiBkYXRhIGNhbGN1bGF0ZWQgYXMgY3VtdWxhdGl2ZSBhdmVyYWdlcyoqCgo+KkNhcHRpb246KiBDT34yfiBjb25jZW50cmF0aW9ucyBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcyB3ZXJlIG9ubHkgbWVhc3VyZWQgb25jZSBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCwgaW4gY29udHJhc3QgdG8gZGFpbHkgbWVhc3VyZW1lbnRzIGZvciBhbGwgb3RoZXIgc2FtcGxlcy4gUHJlLWluY3ViYXRpb24gcmVzcGlyYXRpb24gcmF0ZXMgYXJlIHNob3duIGhlcmUgY2FsY3VsYXRlZCBhcyBjdW11bGF0aXZlIGF2ZXJhZ2VzIGZvciB0aGUgcHVycG9zZSBvZiBmYWlyIGNvbXBhcmlzb24gYWNyb3NzIGFsbCB0cmVhdG1lbnRzLgoKCiMjIFJhZGlvY2FyYm9uIGRhdGEKCmBgYHtyIGxvYWQgYW1zLWplbmEtaW5nZXN0IGZ4fQojIDEuIFJlYWQgaW4gaXNvdG9wZSBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzCiMgRmlyc3QgbG9hZCBoZWxwZXIgZnVuY3Rpb24gJ3JlYWRfamVuYV9hbXNfcmVzdWx0cy5SIgpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkIGlzbyBkYXRhfQojIDIuIE5leHQgcmVhZCBpbiBkYXRhIGZyb20gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGluICdkYXRhL3JhdycKIyBpZGVudGlmeSBzdWJkaXJlY3RvcmllcyBpbiAncmF3JyBkaXJlY3Rvcnkgd2l0aCAiYW1zX2plbmEiIGluIG5hbWUKYW1zX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmFtc19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoYW1zX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewogIHJlYWRfamVuYV9hbXNfcmVzdWx0cyhhbXNfamVuYV9yZXN1bHRzX2RpcnNbaV0pCn0pCm5hbWVzKGFtc19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIpCmBgYAoKYGBge3IgYXJjIGFuZCByZXdldCBleHBlcmltZW50IHRlbXBsYXRlfQojIDMuIENyZWF0ZSBhICJ0aWR5IiBzdHlsZSB0ZW1wbGF0ZSBmb3IgdGhlIGRhdGEsIGkuZS4gdmFyaWFibGVzIGluIGNvbHVtbnMuIAojIEtleSB2YXJpYWJsZXMgYXJlIGFzIGZvbGxvd3M6CiMgICAqIFNhbXBsZU5hbWUgKGluY29ycG9yYXRlcyBsYWIgcmVwIGFuZCB0cmVhdG1lbnQsIGUuZy4gIkhFRzEwLTFfZHJ5IikKIyAgICogSUQgKHBsb3QgSURzLCBlLmcuIGZvciAiSEVHMTAiIGZvciBFeHBsb3JhdG9yeSBzYW1wbGVzKQojICAgKiBUcmVhdG1lbnQgKDMgdHJlYXRtZW50czogYWlyLWRyeSwgYWlyLWRyeSArIHN0b3JhZ2UsIHN0b3JhZ2UgZHVyYXRpb247ICsgY29udHJvbHMpCiMgICAqIFR5cGUgKDIgbGV2ZWxzOiBGID0gZm9yZXN0LCBHID0gZ3Jhc3NsYW5kKQojICAgKiBQZXJpb2QgKGluY3ViYXRpb24gcGVyaW9kLCAyIGxldmVsczogcHJlID0gcHJlaW5jdWJhdGlvbiwgaW5jID0gZXF1aWxpYnJpdW0gaW5jdWJhdGlvbikKIyAgICogRXhwZXJpbWVudCAoMyBsZXZlbHM6IGFyYyA9IGFpci1kcnkgKyBzdG9yYWdlLCByZXdldCA9IGFpci1kcnkvcmV3ZXQsIHRpbWUgPSBzdG9yYWdlIGR1cmF0aW9uKQojIAojICogT2JzZXJ2YXRpb25hbCBjb2x1bW5zIGluY2x1ZGU6CiMgICAqIGQxNGMgKCRcRGVsdGEkXjE0XkMtQ09+Mn4pCiMgICAqIGQxM2MgKCRcZGVsdGEkXjEzXkMtQ09+Mn4pCiMgICAqIENfZ19rZyAoQyBjb250ZW50KQojICAgKiBkd19nIChkcnkgd2VpZ2h0KQojICAgKiBtZ0NPMi5DX2dTIChtZyBDT34yfi1DIHJlc3BpcmVkIGdeLTFeIHNvaWwgUGVyaW9kXi0xXikKIyAgICogdGltZV9kIChkYXlzIGluIGluY3ViYXRpb24gcGVyaW9kIHByaW9yIHRvIG1lYXN1cmVtZW50KQojICAgKiBkSDJPX2dyYXYgKHBlcmNlbnQgY2hhbmdlIGluIGdyYXZpbWV0cmljIHdhdGVyIGNvbnRlbnQgZHVlIHRvIGxhYm9yYXRvcnkgbW9pc3R1cmUgYWRqdXN0bWVudCkKIyAgICogZEgyT193aGMgKHBlcmNlbnQgY2hhbmdlIGluIHdhdGVyIGhvbGRpbmcgY2FwYWNpdHkgZHVlIHRvIGxhYm9yYXRvcnkgbW9pc3R1cmUgYWRqdXN0bWVudCkKICAKdW5pcXVlLmlkLm4gPC0gYyhsZW5ndGgodW5pcXVlKGFyY2hpdmUudHNbYXJjaGl2ZS50cyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHJld2V0LmN0bC50cyRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShyZXdldC5kcnkudHMkU2FtcGxlTmFtZSkpKQpwcmUuMTRjIDwtIGRhdGEuZnJhbWUoU2FtcGxlTmFtZSA9IGMoYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkpCnByZS4xNGMkSUQgPC0gc3Vic3RyKHByZS4xNGMkU2FtcGxlTmFtZSwgMSwgNSkKcHJlLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS4xNGMkSUQpLCAiRyIsICJGIikKcHJlLjE0YyRFeHBlcmltZW50IDwtIGMocmVwKCJhcmMiLCB1bmlxdWUuaWQublsxXSArIHVuaXF1ZS5pZC5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoInJld2V0IiwgdW5pcXVlLmlkLm5bM10gKyB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkVHJlYXRtZW50IDwtIGMocmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSArIHN0b3JhZ2UiLCB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bM10pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSIsIHVuaXF1ZS5pZC5uWzRdKSkKcHJlLjE0YyRQZXJpb2QgPC0gInByZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYgYXMgZHVwbGljYXRlIG9mIHByZS1pbmMgZGYsIGJ1dCB0ZXN0IHRoYXQgaXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGZpcnN0CmlmKG5yb3cocHJlLjE0YykgPT0gc3VtKHVuaXF1ZS5pZC5uKSAmIG5jb2wocHJlLjE0YykgPT0gNikgewogIGluYy4xNGMgPC0gcHJlLjE0YwogIGluYy4xNGMkUGVyaW9kIDwtICJpbmMiCn0gZWxzZSB7CiAgInByZS4xNGMgZGF0YSBmcmFtZSBtYWxmb3JtZWQiCn0KYWxsLjE0Yy50ZW1wbGF0ZSA8LSByYmluZChwcmUuMTRjLCBpbmMuMTRjKQpgYGAKCmBgYHtyIHRtZSBleHBlcmltZW50IHRlbXBsYXRlfQp1bmlxdWUuaWQudG1lLm4gPC0gYyhsZW5ndGgodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLm9ybmwkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGVbYXJjaGl2ZS5jdGwudHMud2lkZSRFeHBlcmltZW50ID09ICJ0bWUiLCAiSUQiXSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpKQpwcmUudG1lLmN0bCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5kdWskU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUubWlzYyRTYW1wbGVOYW1lKSksICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSkpCnByZS50bWUuY3RsJFNpdGUgPC0gYyhyZXAoIkR1a2UiLCB1bmlxdWUuaWQudG1lLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJPUk5MIiwgdW5pcXVlLmlkLnRtZS5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiU2llcnJhIiwgdW5pcXVlLmlkLnRtZS5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgibWlzYyIsIHVuaXF1ZS5pZC50bWUubls0XSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIlhwbHIiLCB1bmlxdWUuaWQudG1lLm5bNV0pKQoKCiMgRHVrZSwgT1JOTCwgbWlzYywgYW5kIFhwbHIgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwgCiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAibWlzYyIgfAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIklEIl0gPC0gYXMuY2hhcmFjdGVyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIlNhbXBsZU5hbWUiXSkKCiMgU2llcnJhIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSA8LQogIHN1YnN0cihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2FtcGxlTmFtZSJdLCAxMCwgMTEpCgojIHN1YmRpdmlkZSBPUk5MIGludG8gV0IgYW5kIFRWQQpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIlRWQSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiSUQiXSksICJUZW5uZXNzZWUgVmFsbGV5IiwgIldhbGtlciBCcmFuY2giKQoKIyBzdWJkaXZpZGUgU2llcnJhIGludG8gTXVzaWNrIGFuZCBTaGF2ZXIKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiU2llcnJhIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIk0iLCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSksICJNdXNpY2siLCAiU2hhdmVyIikKCiMgYWRkIHRyZWF0bWVudCBjb2wKcHJlLnRtZS5jdGwkVHJlYXRtZW50IDwtICJjb250cm9sIgoKcHJlLnRtZS50cnQgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gdW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpCnByZS50bWUudHJ0JElEIDwtIHN1YnN0cihwcmUudG1lLnRydCRTYW1wbGVOYW1lLCAxLCBuY2hhcihhcy5jaGFyYWN0ZXIocHJlLnRtZS50cnQkU2FtcGxlTmFtZSkpLTIpCnByZS50bWUudHJ0IDwtIHJiaW5kKHByZS50bWUudHJ0LCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiwgYygiSUQiLCAiU2FtcGxlTmFtZSIpXSkKcHJlLnRtZS50cnQkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpwcmUudG1lLnRydCRTaXRlIDwtIHByZS50bWUuY3RsW21hdGNoKHByZS50bWUudHJ0JElELCBwcmUudG1lLmN0bCRJRCksICJTaXRlIl0KCnByZS50bWUuMTRjIDwtIHJiaW5kKHByZS50bWUuY3RsLCBwcmUudG1lLnRydCkKcHJlLnRtZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUudG1lLjE0YyRTYW1wbGVOYW1lKSwgIkciLCAiRiIpCnByZS50bWUuMTRjJFBlcmlvZCA8LSAicHJlIgpwcmUudG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmCmluYy50bWUuMTRjIDwtIHByZS50bWUuMTRjCmluYy50bWUuMTRjJFBlcmlvZCA8LSAiaW5jIgp0bWUuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS50bWUuMTRjLCBpbmMudG1lLjE0YykKYGBgCgpgYGB7ciBjb21iaW5lIHNvaWwgb2JzIGRhdGF9CiMgNC4gU3VtbWFyaXplIG9ic2VydmF0aW9uYWwgZGF0YSBmcm9tIHRpbWVzZXJpZXMgZGF0YSBieSB1bmlxdWUgSURzIChTYW1wbGVOYW1lKQojIHN1bW1hcml6ZSB0aW1lIGFuZCBjbzIgZGF0YSBieSBleHBlcmltZW50LCBwZXJpb2QsIHRyZWF0bWVudCwgYW5kIHNhbXBsZSBuYW1lCnRzLmVwc24uYXZnIDwtIHRzICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUsIGdDX2dTLCBkd19nLCBtZ0NPMi5DX2dDLCB0aW1lX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgSUQsIFBlcmlvZCwgVHJlYXRtZW50LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWF4ID0gbWF4KSwgbmEucm0gPSBUUlVFKQp0cy5lcHNuLmF2ZyA8LSByZW5hbWVfYXQodHMuZXBzbi5hdmcsIHZhcnMoY29udGFpbnMoJ21heCcpKSwgbGlzdCh+c3ViKCJfbWF4IiwgIiIsIC4pKSkKYGBgCgpgYGB7ciBjbGVhbiB1cCAxNEMgZGF0YX0KIyA2LiBDbGVhbiB1cCBeMTReQyBkYXRhIGFuZCBhZGQgZXh0ZXJuYWwgZGF0YSBwb2ludHMgKHRtZSBleHBlcmltZW50LCBYcGxyIGNvbnRyb2wgc2FtcGxlcykKIyBOZWVkIHRvIGFkZCBTYW1wbGVOYW1lIGNvbCBhbmQgdmFyaWFibGUgY29sdW1ucyBUcmVhdG1lbnQsIFBlcmlvZCwgYW5kIEV4cGVyaW1lbnQgdG8gYWxsIGRhdGEgZnJhbWVzIGluIGFtc19yZXN1bHRzX2xzIAoKIyBGaXJzdCBhZGQgMTRDIGFuZCAxM0MgZGF0YSBmcm9tIEV4cGxvcmF0b3JpZXMgY29udHJvbCBzYW1wbGVzIHRvIGFtc19yZXN1bHRzX2xzCiMgbm90ZSB0aGF0IG5laXRoZXIgMTNDIG5vciAxNEMgd2FzIG1lYXN1cmVkIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0aGVzZSBzYW1wbGVzCiMgZ2V0IG5hbWVzIGZvciBhbXNfcmVzdWx0cyBkYXRhIGZyYW1lcwpyZXN1bHRzLjE0Yy5ubXMgPC0gbmFtZXMoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgKQojIGdldCBuYW1lcyBmb3IgcmVsZXZhbnQgRXhwZXJpbWVudC9UcmVhdG1lbnQvUGVyaW9kIGNvbWJpbmF0aW9uCmFyY19jdGxfaW5jX1NOIDwtIGFzLmNoYXJhY3RlcihhbGwuMTRjLnRlbXBsYXRlW2FsbC4xNGMudGVtcGxhdGUkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMudGVtcGxhdGUkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFsbC4xNGMudGVtcGxhdGUkUGVyaW9kID09ICJpbmMiLCAiU2FtcGxlTmFtZSJdKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHVubGlzdChsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24oeCkgdW5saXN0KGxhcHBseSh4LCAiW1siLCAiUHJvYmUiKSkpKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHRtZV9jdGxfaW5jX3hwbHJfU05bZ3JlcCgiSEUiLCB0bWVfY3RsX2luY194cGxyX1NOKV0KaWYobGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pID09IDE0KSB7CiAgdG1lX2N0bF9pbmNfeHBscl9TTiA8LSB1bmlxdWUoc3Vic3RyKHRtZV9jdGxfaW5jX3hwbHJfU04sIDEsIG5jaGFyKHRtZV9jdGxfaW5jX3hwbHJfU04pLTIpKQp9CgojIGFkZCBzdWJsaXN0IGZvciBFeHBsb3JhdG9yaWVzIDIwMTEgKGNvbnRyb2wpIGRhdGEgYW5kIGRhdGEgZnJhbWVzIGZvciBhYm92ZSBzdWJzZXRzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChhcmNfY3RsX2luY19TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pLCBuY29sID0gbGVuZ3RoKHJlc3VsdHMuMTRjLm5tcykpKQoKIyBhZGQgbmFtZXMgYW5kIGZpbGwgU2FtcGxlTmFtZXMgZm9yIG5ldyBkYXRhIGZyYW1lcwphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseShhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbih4KSB7CiAgbmFtZXMoeCkgPC0gcmVzdWx0cy4xNGMubm1zCiAgcmV0dXJuKHgpCiAgfSkgCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmNbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIGFyY19jdGxfaW5jX1NOCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsclsgLCBjKCJTYW1wbGVOYW1lIiwiUHJvYmUiKV0gPC0gdG1lX2N0bF9pbmNfeHBscl9TTgoKIyBmaWxsIDE0QyBkYXRhCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkYOKIhjE0Qy4o4oCwKWAgPC0geHBsci5jdGwuaXNvW21hdGNoKGRmJFByb2JlLCB4cGxyLmN0bC5pc28kRVBfUGxvdGlkKSwgIjE0Y19DTzIiXQogIGRmJFRyZWF0bWVudCA8LSAiY29udHJvbCIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCn0pCgojIGFkZCBFeHBlcmltZW50CmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHIkRXhwZXJpbWVudCA8LSAidG1lIgoKCiMgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTAtMTJgIGFuZCBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0xMS0wOWAKIyBgQmVlbS1NaWxsZXJfNC54bHN4YCwgYEJlZW0tTWlsbGVyXzUueGxzeGA7IGBCZWVtLU1pbGxlcl82Lnhsc3hgLCBgQmVlbS1NaWxsZXJfNy54bHN4YAojIEFkZCB0cmVhdG1lbnQsIGV4cGVyaW1lbnQsIHBlcmlvZCBjb2xzCiMgRXhwZXJpbWVudCA9IHRtZQojIFRyZWF0bWVudCA9IHN0b3JhZ2UgZHVyYXRpb24KIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHNbMToyXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24obHMpIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICBkZiRFeHBlcmltZW50IDwtICJ0bWUiCiAgZGYkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgogIGRmJFBlcmlvZCA8LSAiaW5jIgogIHJldHVybihkZikKICB9KQopCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YAojIGBCZWVtLU1pbGxlcl85Lnhsc3hgCiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRTYW1wbGVOYW1lIDwtIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQcm9iZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFBlcmlvZCA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkCiMgQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUGVyaW9kIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgCiMgYFJvc3RfMzEtMi54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYywgcHJlIChTRVcxMS0yLTIpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFByb2JlLCAxLCA5KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRFeHBlcmltZW50IDwtICJhcmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzI6OSwgIlBlcmlvZCJdIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzEwLCAiUGVyaW9kIl0gPC0gInByZSIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgCiMgUm9zdF80Ny54bHN4IAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGNvbnRyb2wKIyBQZXJpb2QgPSBwcmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFByb2JlLCAxLCA3KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFRyZWF0bWVudCA8LSAiY29udHJvbCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQZXJpb2QgPC0gInByZSIKIyBSb3N0XzUwLnhsc3gKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUGVyaW9kIDwtICJpbmMiCiMgUm9zdF81Mi54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gYWlyLWRyeQojIFBlcmlvZCA9IHByZSwgaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSwgMSwgMTEpCnByZS5peCA8LSB3aGljaChncmVwbCgiUFJFIiwgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4W3ByZS5peCwgIlBlcmlvZCJdIDwtICJwcmUiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3hbLXByZS5peCwgIlBlcmlvZCJdIDwtICJpbmMiCmBgYAoKYGBge3IgY29tYmluZSAxNEMgc29pbCBvYnMgZGF0YX0KIyA3LiBDb21iaW5lIGRhdGEuCiMgZmxhdHRlbiBsaXN0IGFuZCByZW1vdmUgQU1TIGJsYW5rcywgTkEgc2FtcGxlcywgYW5kIG5vbi1FeHBsb3JhdG9yeSBkYXRhCmFtc19yZXN1bHRzX2FyY19yZXdldCA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMzo3XSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYmluZF9yb3dzKGxhcHBseShhbXNfcmVzdWx0c19hcmNfcmV3ZXQsIGZ1bmN0aW9uKHgpIGV4dHJhLmNsZWFuLmZ4KHgpKSkKCiMgZmxhdHRlbiBleHRlcm5hbCBkYXRhIGxpc3QKYW1zX3Jlc3VsdHNfdG1lIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1tjKDE6Miw3KV0sIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCB0bWUuMTRjLmZ4KSkKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfdG1lLCBmdW5jdGlvbih4KSBiaW5kX3Jvd3MoeCkpKQoKIyBjdXQgb3V0IG5vbi1yZWxldmFudCBBTVMgcmVzdWx0cyBjb2x1bW5zCm5tcy5hbXMudmFycyA8LSBjKCJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIiwKICAgICAgICAgICAgICAgICAiU2FtcGxlTmFtZSIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgIkV4cGVyaW1lbnQiKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQoKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGFtc19yZXN1bHRzX3RtZS5kZlsgLCBubXMuYW1zLnZhcnNdCmNvbG5hbWVzKGFtc19yZXN1bHRzX3RtZS5kZikgPC0gYygiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiLCBubXMuYW1zLnZhcnNbNTo4XSkKYW1zX3Jlc3VsdHNfdG1lLmRmJElEIDwtIHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTIpCmFtc19yZXN1bHRzX3RtZS5kZiRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGFtc19yZXN1bHRzX3RtZS5kZiRJRCksICJHIiwgIkYiKQoKIyBtZXJnZSBhcmMgYW5kIHJld2V0IDE0QyBkYXRhIHdpdGggdGVtcGxhdGUKaWYobnJvdyhtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkpID09IG5yb3coYWxsLjE0Yy50ZW1wbGF0ZSkpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZiwgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2Ugc29pbCBvYnMgZGF0YSB3aXRoIDE0YyBkYXRhCmlmKG5yb3cobWVyZ2UoYWxsLjE0YywgdHMuZXBzbi5hdmcsIGJ5ID0gYygiU2FtcGxlTmFtZSIsICJQZXJpb2QiKSkpID09IG5yb3coYWxsLjE0YykpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBhbGwueCA9IFRSVUUpCn0gZWxzZSB7CiAgY2F0KCJkdXBsaWNhdGUgc2FtcGxlIG1lcmdlIGVycm9yIikKfQoKIyBtZXJnZSB0bWUgMTRDIGRhdGEgd2l0aCB0ZW1wbGF0ZSBhbmQgdHMuZXBzbi5hdmcKdG1lLjE0YyA8LSBtZXJnZSh0bWUuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c190bWUuZGYsIGFsbC54ID0gVFJVRSkKCiMgYWRkIGN0bCBzYW1wbGUgMTRDIGRhdGEgdG8gdG1lLjE0YwojIGZpcnN0IHJlbW92ZSBOQSB2YWx1ZXMKdG1lLjE0Yy5jbGVhbiA8LSB0bWUuMTRjW3doaWNoKCFpcy5uYSh0bWUuMTRjJGQxNGMpIHwgIWlzLm5hKHRtZS4xNGMkZm0pKSwgXQojIGRlZmluZSBtZXJnZSBmeAp0bWUubXJnLmZ4IDwtIGZ1bmN0aW9uKHgsIHkpIHsKICBtcmcubm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIpCiAgdmFyLm5tcyA8LSBjKCJZZWFyU2FtcGxlZCIsICJTaXRlIiwgIkhvcml6b24iLCAgImQxNGMiLCAiZm0iKQogIGlmKGxlbmd0aChncmVwKCJmbSIsIG5hbWVzKHkpKSkgPiAwKSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tcyldKQogIH0gZWxzZSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tc1sxOjRdKV0pCiAgICBkZiRmbSA8LSBOQQogIH0KICByZXR1cm4oZGYpCn0KCnRtZS4xNGMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShsaXN0KHRtZS5jdGwuZHVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5mbHguc3JhW3doaWNoKCFpcy5uYSh0bWUuY3RsLmZseC5zcmEkZDE0YykpLCBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5vcm5sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLm1pc2MpLCBmdW5jdGlvbihpKSB0bWUubXJnLmZ4KHRtZS4xNGMsIGkpKSkKCiMgYWRkIHN0b3JhZ2UgZHVyYXRpb24gZGF0YSBmb3IgdHJlYXRtZW50IHNhbXBsZXMgYW5hbHl6ZWQgZXh0ZXJuYWxseQp0bWUuMTRjLmRmJFR5cGUgPC0gIkYiCgojIGFkZCBZZWFyU2FtcGxlZCBmb3IgdG1lLjE0Yy5jbGVhbiBzYW1wbGVzCmZvcihpIGluIDE6bnJvdyh0bWUuMTRjLmNsZWFuKSkgewogIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiRHVrZSIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOAogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlhwbHIiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMTEKICB9IGVsc2UgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJTaWVycmEiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDkKICB9IGVsc2UgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA0CiAgfQp9CgojIEFkZCBIb3Jpem9uIHRvIHRtZS4xNGMuY2xlYW4KdG1lLjE0Yy5jbGVhbiRIb3Jpem9uIDwtIGlmZWxzZSh0bWUuMTRjLmNsZWFuJElEID09ICJNQiIgfCB0bWUuMTRjLmNsZWFuJElEID09ICJTQiIsICJCIiwgIkEiKQoKIyBjb21iaW5lIHRtZSBkYXRhCnRtZS4xNGMgPC0gYmluZF9yb3dzKHRtZS4xNGMuY2xlYW5bICwgbmFtZXModG1lLjE0Yy5kZildLCB0bWUuMTRjLmRmKQp0bWUuMTRjJEV4cGVyaW1lbnQgPC0gInRtZSIKCiMgcmVtb3ZlIG91dGxpZXIgKE1BLTEpCiMgKioqIE5lZWQgdG8gY2xhcmlmeSBtZXRob2QgZm9yIGRldGVybWluaW5nIHRoYXQgdGhpcyBpcyBhbiBvdXRsaWVyICoqKiAKdG1lLjE0YyA8LSB0bWUuMTRjWy13aGljaCh0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIk1BLTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVc0OS0xIiB8IHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiSEVXMjYtMSIpLCBdCgoKIyBBZGQgbWlzc2luZyB2YXJpYWJsZSBjb2x1bW5zIHRvIGFsbC4xNGMKIyBhZGQgWWVhclNhbXBsZWQgY29sdW1uCmFsbC4xNGMkWWVhclNhbXBsZWQgPC0gaWZlbHNlKGFsbC4xNGMkRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSkKCiMgYWRkIFNpdGUgYW5kIEhvcml6b24gY29sdW1ucwphbGwuMTRjJFNpdGUgPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGFsbC4xNGMkSUQpLCAiSGFpbmljaCIsICJTY2hvcmZoZWlkZSIpCmFsbC4xNGMkSG9yaXpvbiA8LSAiQSIKCgojIGNvbWJpbmUgdG1lLjE0YyBhbmQgYWxsLjE0YyBpbnRvIGEgbGlzdCBhbmQgY2FsY3VsYXRlIGZyYWN0aW9uIG1vZGVybiBmcm9tIGQxNEMgYXMgbmVlZGVkCmFsbC4xNGMubHMgPC0gbGFwcGx5KGxpc3QodG1lLjE0YywgYWxsLjE0YyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZm0gPC0gaWZlbHNlKGlzLm5hKGRmJGZtKSwKICAgICAgICAgICAgICAgICAgZDE0Yy5mbS5meChkZiRZZWFyU2FtcGxlZCwgZGYkZDE0YyksCiAgICAgICAgICAgICAgICAgIGRmJGZtKQogIGRmJGQxNGNfY29yciA8LSBkZWNheS5jb3JyLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRmbSkKICByZXR1cm4oZGYpCn0pCgphbGwuMTRjLnN1bSA8LSBsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBkZi5zdW0gPC0gc2VsZWN0KGRmLCAtU2FtcGxlTmFtZSkgJT4lCiAgICBncm91cF9ieShJRCwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFNpdGUsIEhvcml6b24sIFllYXJTYW1wbGVkKSAlPiUKICAgIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgbWF4ID0gbWF4LCBtaW4gPSBtaW4pLCBuYS5ybSA9IFRSVUUpCiAgZGYuc3VtW21hcHBseShpcy5pbmZpbml0ZSwgZGYuc3VtKV0gPC0gTkEKICByZXR1cm4oZGYuc3VtKQp9KQphbGwuMTRjLnN1bSA8LSByYXBwbHkoYWxsLjE0Yy5zdW0sIGYgPSBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmFuKHgpLCBOQSAsIHgpLCBob3cgPSAicmVwbGFjZSIpCmFsbC4xNGMuc3VtLmRmIDwtIGJpbmRfcm93cyhhbGwuMTRjLnN1bSkKCiMgcmVtb3ZlIHVubmVjZXNzYXJ5IG9iamVjdHMKYGBgCgpgYGB7ciBjb3VudHMgZm9yIGNoZWNraW5nIHBsb3RzLCBpbmNsdWRlID0gRkFMU0V9CiMgOC4gQ291bnQgbnVtYmVyIG9mIF4xNF5DIG9ic2VydmF0aW9ucyBmb3IgY2hlY2tpbmcgcGxvdHMuCiMgY291bnQgIWlzLm5hKDE0QykgY2FzZXMgYnkgU2FtcGxlTmFtZQphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGNvdW50KCkKIyBieSBJRAphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGRpc3RpbmN0KElEKSAlPiUKICBjb3VudCgpCmBgYAoKKlByZS1pbmN1YmF0aW9uIHZlcnN1cyBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBeMTReQy1DT34yfioKCkRlc3BpdGUgdGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIHJlc3BpcmF0aW9uLCBhbmQgaW4gY29udHJhc3QgdG8gaHlwb3RoZXNpcyAxLCB3ZSBkaWQgbm90IG9ic2VydmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBeMTReQy1DT34yfiByZXNwaXJlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBhbmQgXjE0XkMtQ09+Mn4gcmVzcGlyZWQgZHVyaW5nIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2Q6IG5laXRoZXIgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgbm9yIGZvciB0aGUgYWlyLWRyeSB0cmVhdG1lbnQgYWxvbmUgKiooRmlnLiA1KSoqLiBUaGUgaW50ZXJhY3Rpb25zIHdpdGggbGFuZCB1c2Ugd2FzIG5vdCBzaWduaWZpY2FudCBub3Igd2FzIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGV4cGVyaW1lbnQsIHNvIGFsbCBkYXRhIHdlcmUgcG9vbGVkIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcy4KCmBgYHtyIHByZS1pbmMtMTRjLXBsb3R9CmFsbC4xNGMucHJlLmluYyA8LSBtZXJnZShhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gInByZSIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxNGNfY29ycl9tZWFuIiwgImQxNGNfY29ycl9taW4iLCAiZDE0Y19jb3JyX21heCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKYWxsLjE0Yy5wcmUuaW5jJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnByZS5pbmMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCmFsbC4xNGMucHJlLmluYyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9wcmUsIGQxNGNfY29ycl9tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5faW5jLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9wcmUsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X3ByZSwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgeGxhYihleHByZXNzaW9uKCdQcmUtaW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5uICsgMn1gLiBQcmUtaW5jdWJhdGlvbiBwZXJpb2QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnMgb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGFuZCBlcnJvciBiYXJzIGFyZSB0aGUgbWluIGFuZCBtYXggKGV4Y2VwdCBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcywgd2hpY2ggd2VyZSBub3QgcmVwbGljYXRlZCkuIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DIHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzOyBhZGRpdGlvbmFsbHkgc2FtcGxlcyBmcm9tIHRocmVlIG9mIHRoZSBmb3Jlc3QgcGxvdHMgb2YgdGhlIEV4cGVyaW1lbnQgMSB0cmVhdG1lbnQgc2FtcGxlcyAoYWlyLWRyeSArIHN0b3JhZ2UpIGZhaWxlZCB0byBhY2N1bXVsYXRlIGVub3VnaCBDT34yfiBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCB0byBtZWFzdXJlIF4xNF5DLiBUaGUgb3V0bGllciBwb2ludCB3aXRoIHRoZSBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgaXMgZnJvbSBFeHBlcmltZW50IDIgKGNvbnRyb2wpLgoKTm90ZSB0aGUgb25lIG91dGxpZXIgKGZvcmVzdCwgY29udHJvbCkgZm9yIHdoaWNoIHRoZSBwcmUtaW5jdWJhdGlvbiBDT34yfiB3YXMgc3Vic3RhbnRpYWxseSBkZXBsZXRlZCByZWxhdGl2ZSB0byBlcXVpbGlicml1bSBwZXJpb2QgcmVzcGlyYXRpb24uIEhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGlzIG91dGxpZXIgd2FzIGluY2x1ZGVkIGluIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IGFuZCBlcXVpbGlicml1bSBeMTReQy1DT34yfiB3YXMgbm90IHNpZ25pZmljYW50LiBGb3IgY2xhcml0eSwgdGhpcyBwb2ludCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGZ1dHVyZSBwbG90cy4gRHVlIHRvIGxvd2VyIHJlc3BpcmF0aW9uIHJhdGVzIGR1cmluZyBwcmUtaW5jdWJhdGlvbiwgb25seSB0aHJlZSBvZiB0aGUgc2l4IGZvcmVzdCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMSBnZW5lcmF0ZWQgZW5vdWdoIENPfjJ+IHRvIG1lYXN1cmUgcmFkaW9jYXJib24sIGFuZCBhZGRpdGlvbmFsbHksIGl0IHdhcyBub3QgcG9zc2libGUgdG8gY29tcGFyZSBwcmUtaW5jdWJhdGlvbiBhbmQgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gXjE0XkMtQ09+Mn4gZm9yIHRoZSBjb250cm9sIHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIHNpbmNlIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZXNlIHNhbXBsZXMgaW4gMjAxMS4KCmBgYHtyIHByZS1lcXUtMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJFeHBlcmltZW50IiwgIlRyZWF0bWVudCIsICJUeXBlIiwgImQxNGNfY29yciIsICJtZ0NPMi5DX2dDIikKYXJjLnJld2V0LnByZS4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgICAgIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAicHJlIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbWVyZ2UoYXJjLnJld2V0LnByZS4xNGMsIGFyYy5yZXdldC5pbmMuMTRjLCBieSA9IGoudmFyc1sxOjVdLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQoKYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyMgbG9vayBhdCBpbnRlcmFjdGlvbnMKIyBFeHBlcmltZW50IDEKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgbnMKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKCiMgRXhwZXJpbWVudCAyCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlICogVHJlYXRtZW50IHNpZ25pZmljYW50IGR1ZSB0byBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBidXQgZGlzYXBwZWFycyB3aGVuIGV4Y2x1ZGVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW3doaWNoKGFyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0YyRJRCAhPSAiSEVXMjIiKSwgXSkpCgojIGNvbWJpbmVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCBhcmMucmV3ZXQuMTRjKSkgIyBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCAKICAgICAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCBdKSkgIyB3L28gSEVXMjIKCiMgdC50ZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9wcmUsIGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX2luYykgIyB3LyBIRVcyMgp0LnRlc3QoYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9wcmUiXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX2luYyJdKSAjIHcvbyBIRVcyMgpybShqLnZhcnMpCmBgYAoKKlRyZWF0bWVudCBlZmZlY3RzIG9uIG9ic2VydmVkIGVxdWlsaWJyaXVtIHBlcmlvZCBeMTReQy1DT34yfioKCmBgYHtyIGN0bC10cnQtZGlmcywgaW5jbHVkZSA9IEZBTFNFfQojIGF2ZXJhZ2UgY29udHJvbCBhbmQgdHJlYXRtZW50IGRhdGEKIyByZW1vdmUgSEVXMjIgY29udHJvbCBwcmUKIyBub3RlIHRoYXQgdXBwZXIvbG93ZXIgbGltaXRzID0gMnhTRQphbGwuMTRjLnN1bTIgPC0gYWxsLjE0Yy5sc1tbMl1dICU+JQogIG11dGF0ZShJRC50cmVhdC5QZXJpb2QgPSBwYXN0ZShJRCwgVHJlYXRtZW50LCBQZXJpb2QpKSAlPiUKICBmaWx0ZXIoSUQudHJlYXQuUGVyaW9kICE9ICJIRVcyMiBjb250cm9sIHByZSIpICU+JQogIHNlbGVjdChUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgWWVhclNhbXBsZWQsIGQxNGNfY29yciwgbWdDTzIuQ19nQykgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkKSAlPiUKICBhZGRfY291bnQoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkMTRjX2NvcnJfc2UgPSBkMTRjX2NvcnJfc2Qvbl9tZWFuLAogICAgICAgICBkMTRjX2NvcnJfdSA9IGQxNGNfY29ycl9tZWFuICsgZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIGQxNGNfY29ycl9sID0gZDE0Y19jb3JyX21lYW4gLSBkMTRjX2NvcnJfc2UqMiwKICAgICAgICAgbWdDTzIuQ19nQ19zZSA9IG1nQ08yLkNfZ0Nfc2Qvbl9tZWFuLAogICAgICAgICBtZ0NPMi5DX2dDX3UgPSBtZ0NPMi5DX2dDX21lYW4gKyBtZ0NPMi5DX2dDX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0NfbCA9IG1nQ08yLkNfZ0NfbWVhbiAtIG1nQ08yLkNfZ0Nfc2UqMikgCgphbGwuMTRjLnN1bTIkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsInRyZWF0bWVudCIpCgojIHN1bW1hcml6ZQp0cnQuY3RsLmRmIDwtIG1lcmdlKAogIGFsbC4xNGMuc3VtMlt3aGljaChhbGwuMTRjLnN1bTIkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0yJFBlcmlvZCA9PSAiaW5jIiksIGMoIlR5cGUiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibl9tZWFuIildLAogIGFsbC4xNGMuc3VtMlt3aGljaChhbGwuMTRjLnN1bTIkdHJlYXQuYmkgIT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0yJFBlcmlvZCA9PSAiaW5jIiksIGMoIlR5cGUiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibl9tZWFuIildLAogIGJ5ID0gYygiVHlwZSIsICJFeHBlcmltZW50IiksCiAgc3VmZml4ZXMgPSBjKCIuY3RsIiwgIi50cnQiKSkKdHJ0LmN0bC5kZiRkaWYgPC0gdHJ0LmN0bC5kZiRkMTRjX2NvcnJfbWVhbi5jdGwgLSB0cnQuY3RsLmRmJGQxNGNfY29ycl9tZWFuLnRydAp0cnQuY3RsLmRmJGRpZi5zZSA8LSBzYXBwbHkoc3BsaXQodHJ0LmN0bC5kZiwgMTpucm93KHRydC5jdGwuZGYpKSwgZnVuY3Rpb24oeCkgewogIHNxcnQoc3VtKCh4JGQxNGNfY29ycl9zZC5jdGwpXjIvc3FydCh4JG5fbWVhbi5jdGwpLAogICAgICAoeCRkMTRjX2NvcnJfc2QudHJ0KV4yL3NxcnQoeCRuX21lYW4udHJ0KSkpCiAgfSkKYGBgCgpSZWxhdGl2ZSB0byB0aGUgY29udHJvbHMgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCAoRXhwZXJpbWVudCAxLCBvcGVuIHNxdWFyZXMgaW4gKipGaWcuIDUqKikgbGVkIHRvIGVucmljaG1lbnQgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCBkZXBsZXRpb24gaW4gZm9yZXN0IHNhbXBsZXMuIEluIGNvbnRyYXN0LCB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCAoRXhwZXJpbWVudCAyLCBvcGVuIGNpcmNsZXMsICoqRmlnLiA1KiopIGxlZCB0byBlbnJpY2htZW50IGZvciBib3RoIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNhbXBsZXMgKDIwMTkgcG9pbnRzKS4gVHJlYXRtZW50IGVmZmVjdHMgb24gXjE0XkMtQ09+Mn4gd2VyZSBzaWduaWZjYW50IGZvciBib3RoIGZvcmVzdHMgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDEgKDIwMTEgcG9pbnRzLCAqKkZpZyA1KiopLCBhbmQgc2lnbmlmaWNhbnQgZm9yIGdyYXNzbGFuZCBzYW1wbGVzIGJ1dCBub3QgZm9yZXN0IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAyICgyMDE5IHBvaW50cywgKipGaWcuIDUqKikuIFRoZSBhYnNvbHV0ZSBtZWFuIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc2FtcGxlcyAoYHIge3JvdW5kKG1lYW4oYWJzKHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0pKSwgMSl9YOKAsCkgdGhhbiBpbiBmb3Jlc3Qgc2FtcGxlcyAoYHIge3JvdW5kKG1lYW4oYWJzKHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0pKSwgMSl9YOKAsCkgZm9yIGJvdGggZXhwZXJpbWVudHMuIAoKTWVhbiBeMTReQy1DT34yfiBzaG93ZWQgZW5yaWNobWVudCByZWxhdGl2ZSB0byB0aGUgYXRtb3NwaGVyZSBmb3IgYWxsIHNhbXBsZXMgaW4gYm90aCBleHBlcmltZW50cy4gQ29udHJvbCBzYW1wbGUgXjE0XkMtQ09+Mn4gcmVzcGlyZWQgZnJvbSBncmFzc2xhbmQgc29pbHMgd2FzIGdlbmVyYWxseSBjbG9zZXIgdG8gdGhlIGF0bW9zcGhlcmUgdGhhbiB0aGF0IGZyb20gZm9yZXN0IHNvaWwgY29udHJvbHMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBhdG1vc3BoZXJlICgkXERlbHRhJCRcRGVsdGEkXjE0XkMpIGluY3JlYXNlZCBzbGlnaHRseSBiZXR3ZWVuIDIwMTEgYW5kIDIwMTkgaW4gZ3Jhc3NsYW5kIHNvaWxzIHdoaWxlIGl0IHN0YXllZCBhYm91dCB0aGUgc2FtZSBpbiBmb3Jlc3Qgc29pbHMuIAoKYGBge3IgdHJlYXRtZW50IGVmZmVjdHMgYnkgdGltZX0KIyBmaXJzdCBsb2FkIGF0bW9zcGhlcmljIGRhdGEgZnJvbSBJU1JhRCBhbmQgYmluZCBmdXR1cmUgcHJvamVjdGlvbgpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQoKIyAjIGNvZGUgZm9yIHBsb3R0aW5nIGRhdGEgYnkgSUQKIyBhbGwuMTRjLnN1bSAlPiUKIyAgIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQojICAgZmlsdGVyKCFncmVwbCgiUyIsIElEKSkgJT4lCiMgICBtdXRhdGUoeWVhci5JRCA9IHBhc3RlKFllYXJTYW1wbGVkLCBJRCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMpICsKIyAgIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLklEKSwgCiMgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAibGFzdCIpLAojICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDEzLCAyMDE2LCAyMDE5KSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiMgICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF93cmFwKH4gSUQsIG5jb2wgPSAzKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3Qgb3ZlciB0aW1lLCBhdmVyYWdlZCBieSBUeXBlCmFsbC4xNGMuc3VtMiAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoeWVhci5UeXBlID0gcGFzdGUoWWVhclNhbXBsZWQsIFR5cGUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEuNSkgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLlR5cGUpLCAKICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAiZmlyc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjUsCiAgICBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTMsIDIwMTYsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKIyBGaWcuIDEgc2hvd3MgdGhlIGRpcmVjdGlvbiBvZiBtZWFuIHRyZWF0bWVudCBlZmZlY3RzIG92ZXIgdGltZSBpbiByZWZlcmVuY2UgdG8gdGhlIGF0bW9zcGhlcmUgKGdyYXkgbGluZSkuIFBvaW50cyBhcmUgbWVhbnMgKG4gPSAxMiBmb3IgMjAxMSB0cmVhdG1lbnQgcG9pbnRzLCBuID0gOSBmb3IgMjAxMSBjb250cm9sIHBvaW50czsgbiA9IDYgZm9yIGFsbCAyMDE5IHBvaW50cyk7IGVycm9yIGJhcnMgPSAyeCBzdGQuIGVyci4gb2YgdGhlIG1lYW4uCgojIGNhbGMgZGVsdGEgZGVsdGEKYWxsLjE0Yy5zdW0yJGF0bTE0YyA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0yJFllYXJTYW1wbGVkID09IDIwMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdG1bd2hpY2goRGF0bSREYXRlID09IDIwMTEuNSksICJOSGMxNCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRtW3doaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpLCAiTkhjMTQiXSkKYWxsLjE0Yy5zdW0yJGRkMTRjIDwtIGFsbC4xNGMuc3VtMiRkMTRjX2NvcnJfbWVhbiAtIGFsbC4xNGMuc3VtMiRhdG0xNGMKIyBhbGwuMTRjLnN1bTIgJT4lCiMgICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKIyAgIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSkgJT4lCiMgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oZGQxNGMpKQpgYGAKPioqRmlnIGByIHtmaWcubiArIDN9YC4gVHJlYXRtZW50IGVmZmVjdCBvbiBvYnNlcnZlZCAkXERlbHRhJF4xNF5DLUNPfjJ+IG92ZXIgdGltZSAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgY29udHJvbCBzYW1wbGVzLCB3aGlsZSBvcGVuIHN5bWJvbHMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgdHJlYW1lbnQgc2FtcGxlcyAob3BlbiBzcXVhcmVzID0gYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBFeHBlcmltZW50IDE7IG9wZW4gY2lyY2xlcyA9IGFpci1kcnkgb25seSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMikuIEFycm93cyBzaG93IHRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIGluIF4xNF5DLUNPfjJ+IHJlbGF0aXZlIHRvIHRoZSBjb250cm9scy4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IDJ4IHN0YW5kYXJkIGVycm9yLiBUaGUgZ3JheSBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUuCgpgYGB7ciBzaWRlLWJ5LXNpZGUgcGxvdCwgaW5jbHVkZSA9IEZBTFNFfQojIHBsb3QgYXMgc2lkZS1ieS1zaWRlIG1lYW5zIHcvIDJ4U0UKIyB3aWxsIGNoYW5nZSB0byA5NSVDSXMgYXQgc29tZSBwb2ludCwgYnV0IG5lZWQgdG8gY2FsY3VsYXRlIHRlc3Qgc3RhdGlzdGljIHdpdGggYXBwcm9wcmlhdGUgZGYKYWxsLjE0Yy5zdW0yICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIGdncGxvdCguLCBhZXModHJlYXQuYmksIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl91LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNikpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgoqRWZmZWN0IG9mIGN1bXVsYXRpdmUgcmVzcGlyZWQgY2FyYm9uIG9uIF4xNF5DLUNPfjJ+KgoKYGBge3IgY3RsLXRydC1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIGNhbGN1bGF0ZSBkaWZzIGN0bC10cnQsIGxvb2sgYXQgZWZmZWN0IG9mIEMgcmVzcAphcmMucmV3ZXQuaW5jLjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LmluYy4xNGMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKYXJjLnJld2V0LmluYy4xNGMuc3VtIDwtIGFyYy5yZXdldC5pbmMuMTRjICU+JQogIGdyb3VwX2J5KElELCBFeHBlcmltZW50LCBUeXBlLCB0cmVhdC5iaSkgJT4lCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSkKCmoudmFycyA8LSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyIiwgIm1nQ08yLkNfZ0MiKQphcmMucmV3ZXQuMTRjLmN0bC50cnQgPC0gbGVmdF9qb2luKAogIGFyYy5yZXdldC5pbmMuMTRjLnN1bVthcmMucmV3ZXQuaW5jLjE0Yy5zdW0kdHJlYXQuYmkgPT0gImNvbnRyb2wiLCBqLnZhcnNdLAogIGFyYy5yZXdldC5pbmMuMTRjLnN1bVthcmMucmV3ZXQuaW5jLjE0Yy5zdW0kdHJlYXQuYmkgIT0gImNvbnRyb2wiLCBqLnZhcnNdLAogIGJ5ID0gYyhqLnZhcnNbMTozXSksCiAgc3VmZml4ID0gYygiLmN0bCIsICIudHJ0IikpCgoKYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfZGlmIDwtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRkMTRjX2NvcnIuY3RsIC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfY29yci50cnQKYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGNfZGlmIDwtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRtZ0NPMi5DX2dDLmN0bCAtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRtZ0NPMi5DX2dDLnRydAoKIyMgTG9vayBhdCBlZmZlY3Qgb2YgY19kaWYgYnkgZXhwZXJpbWVudCBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlCiMgYWlyLWRyeSArIHN0b3JhZ2UKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKIyBlZmZlY3Qgb2YgY19kaWYgb24gZDE0Y19kaWYgbnM7IGludGVyYWN0aW9uIGFsc28gbnMKCiMgcmV3ZXQKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKQojIGVmZmVjdCBvZiBjX2RpZiBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChwID0gMC4wNjMyKQoKIyBMb29rIGF0IGVmZmVjdCBvZiBjX2RpZiBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlIG92ZXJhbGwKc3VtbWFyeShsbShkMTRjX2RpZiB+IFR5cGUgKiBjX2RpZiAqIEV4cGVyaW1lbnQsIGFyYy5yZXdldC4xNGMuY3RsLnRydCkpCiMgbm8gc2lnbmlmaWNhbmNlIG9mIGNfZGlmIG92ZXJhbGwKcm0oai52YXJzKQpgYGAKCmBgYHtyIHBsb3QtY2RpZi1kMTRjLCBpbmNsdWRlID0gRkFMU0V9CmdncGxvdChhcmMucmV3ZXQuMTRjLmN0bC50cnQsIGFlcyhjX2RpZiwgZDE0Y19kaWYsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBFeHBlcmltZW50KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpbbWF5YmUgZXhwYW5kIHdpdGggc3RhdHMgZm9yIG90aGVyIGV4cGxhbmF0b3J5IGZhY3RvcnM/IGUuZy4gdGV4dHVyZSwgTiBjb250ZW50LCBjaGFuZ2UgaW4gbW9pc3R1cmUgdXBvbiByZXdldHRpbmcsIGV0Yy4uLl0KCldlIGxvb2tlZCBhdCB0aGUgcG9zc2libGUgZWZmZWN0IG9mIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBhbW91bnQgb2YgY2FyYm9uIHJlc3BpcmVkIChtZyBDT34yfi1DIGcgc29pbCBDXi0xXikgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY29udHJvbCBhbmQgdHJlYXRtZW50IF4xNF5DLUNPfjJ+IHVzaW5nIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwsIGJ1dCBpdCB3YXMgbm90IHNpZ25pZmljYW50IG92ZXJhbGwuIFdoZW4gZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSBhbmQgRXhwZXJpbWVudCAyIHdlcmUgY29uc2lkZXJlZCBzZXBhcmF0ZWx5LCB3ZSBvYnNlcnZlZCBhIHNsaWdodCBwb3NpdGl2ZSB0cmVuZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbmNlIGluIHJlc3BpcmVkIGNhcmJvbiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gd2l0aGluIEV4cGVyaW1lbnQgMiwgYnV0IGl0IHdhcyBvbmx5IG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgKHAgPSBgciB7cm91bmQoc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKSRjb2VmWzIsNF0sMyl9YCkuIAoKYGBge3IgcGxvdC0xNGMtYnktYy1yZXNwfQojIDEwLiBQbG90ICRcRGVsdGEkXjE0XkMgYWdhaW5zdCBwcm9wb3J0aW9uIG9mIHNvaWwgQyByZXNwaXJlZCBieSBleHBlcmltZW50LCBsYW5kIGNvdmVyLCBhbmQgc2FtcGxpbmcgcGVyaW9kLgojIGNvbGxhcHNlIHRyZWF0bWVudCB2YXJpYWJsZSBpbnRvIGJpbmFyeSBjb250cm9sL3RyZWF0bWVudAphbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0uZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCiMgSEVXMjIgY29udHJvbCBwcmUgcG9pbnQgZXhjbHVkZWQgdG8gbWFrZSBmaWd1cmUgbW9yZSByZWFkYWJsZSAKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZShJRC50cmVhdCA9IHBhc3RlKElELCBUcmVhdG1lbnQpKSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQudHJlYXQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBJRC50cmVhdCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX21pbiwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1NhbXBsaW5nIHBlcmlvZCAodHJlYXRtZW50KScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygxNiwgMTcsIDEsIDIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjb250cm9sIHByZSIgPSAncHJlLWluY3ViYXRpb25cbihjb250cm9sKScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihjb250cm9sKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkIEMgKG1nQ08nWzJdKictQycqJyBnIHNvaWwgQydeLTEqJyknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpKQpgYGAKCj4qKlN1cHBsZW1lbnRhcnkgRmlnLiBgciB7c2ZpZy5uICsgMX1gLiBDaGFuZ2UgaW4gXjE0XkMtQ09+Mn4gaW4gcmVsYXRpb24gdG8gY3VtdWxhdGl2ZSBzb2lsIGNhcmJvbiByZXNwaXJlZCoqCgo+KkNhcHRpb246KiBOb3RlIHRoYXQgcHJlLWluY3ViYXRpb24gJFxEZWx0YSReMTReQyB3YXMgbm90IG1lYXN1cmVkIGZvciB0aGUgMjAxMSBjb250cm9sIHNhbXBsZXMuIExpbWl0cyBleGNsdWRlIG91dGxpZXIgcG9pbnQgKEhFVzIyIGNvbnRyb2wgcHJlLWluY3ViYXRpb24pIGZvciBpbXByb3ZlZCBsZWdpYmlsaXR5LiBbTm90IHBsYW5uaW5nIHRvIGluY2x1ZGUgdGhpcyBmaWd1cmUgaW4gdGhlIG1haW4gdGV4dCBhcyBJIHRoaW5rIGl0IGlzIGRpZmZpY3VsdCB0byBpbnRlcnByZXRdLgoKYGBge3IgcGxvdCBDIHJlc3AgdnMgMTRDIGF2ZXJhZ2VkIGJ5IGxhbmQgdXNlIGFuZCB0cmVhdG1lbnQsIGluY2x1ZGUgPSBGQUxTRX0KIyBBbHRlcm5hdGUgQy1yZXNwIHggMTRjIGZpZzogZGF0YSBhdmVyYWdlZCBieSBsYW5kIHVzZSBhbmQgdHJlYXRtZW50IHdpdGhpbiBzYW1wbGluZyBwZXJpb2RzCmFsbC4xNGMuc3VtMiAlPiUKICBtdXRhdGUodHJlYXQuUGVyaW9kID0gcGFzdGUodHJlYXQuYmksIFBlcmlvZCkpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IFRyZWF0bWVudCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfdSwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfdSwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKIyMgVHJlYXRtZW50IGVmZmVjdCBvbiBeMTReQy1DT34yfiBmb3IgYWxsIHNhbXBsZXMgKEV4cGVyaW1lbnRzIDEsIDIsIGFuZCAzKQoKRGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBzYW1wbGVzIGZyb20gYWxsIGV4cGVyaW1lbnRzIHNob3cgdGhhdCB0cmVhdG1lbnQgZWZmZWN0cywgaS5lLiBhaXItZHJ5aW5nIGZvbGxvd2VkIGJ5IHJld2V0dGluZyBvciBhaXItZHJ5aW5nIGZvbGxvd2VkIGJ5IHN0b3JhZ2UgYW5kIHN1YnNlcXVlbnQgcmV3ZXR0aW5nLCB0eXBpY2FsbHkgcmVzdWx0IGluIGNoYW5nZXMgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiDCsTIw4oCwIHRvIMKxNDDigLAsIHdpdGggdGhlIG1ham9yaXR5IHdpdGhpbiDCsTIw4oCwLiBUaGVzZSBkaWZmZXJlbmNlIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluIGF0bW9zcGhlcmljIHJhZGlvY2FyYm9uIG92ZXIgNSBhbmQgMTAgeWVhcnMsIHJlc3BlY3RpdmVseSwgZHVyaW5nIHRoZSBwZXJpb2Qgb2YgMjAwMCB0byAyMDIwLiBUaGUgc2FtcGxlcyBmcm9tIFRlbm5lc3NlZSAobWFnZW50YSBwb2ludHMpIGFyZSBhbiBleGNlcHRpb24uIEhvd2V2ZXIsIHRoZXNlIHBvaW50cyBkbyBub3Qgc2hvdyBvbmx5IGJvbWItQyBlbnJpY2htZW50LCBidXQgcmF0aGVyIHRoZSByZXN1bHRzIG9mIGV4cG9zdXJlIHRvIGEgbG9jYWxpemVkIHBsdW1lIG9mIF4xNF5DIGVucmljaGVkIENPfjJ+IGZyb20gYSBuZWFyYnkgaW5jaW5lcmF0b3IgZm91ciB5ZWFycyBwcmlvciB0byBzYW1wbGUgY29sbGVjdGlvbiAoVHJ1bWJvcmUgZXQgYWwuLCAyMDAyKS4gVHJlYXRtZW50IF4xNF5DLUNPfjJ+IGZvciB0aGVzZSBoaWdobHkgZW5yaWNoZWQgc2FtcGxlcyB3ZXJlIG1vcmUgZGVwbGV0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2xzIHRoYW4gd2VyZSB0aGUgc2FtcGxlcyBvbmx5IGxhYmVsZWQgd2l0aCBib21iLUMuCgpHcmFzc2xhbmQgc2FtcGxlcyB0ZW5kIHRvIGJlIGFib3ZlIDE6MSBsaW5lLCB3aGlsZSBmb3Jlc3Qgc2FtcGxlcyBhcmUgZ2VuZXJhbGx5IGJlbG93LCByZWdhcmRsZXNzIG9mIG9yaWdpbi4gT25lIGV4Y2VwdGlvbiB0byB0aGlzIHRyZW5kIGlzIHRoZSB0aHJlZSBHZXJtYW4gZm9yZXN0IHNhbXBsZXMgdGhhdCBhcmUgYWJvdmUgMToxIGxpbmUsIHdoaWNoIHdlcmUgYW5hbHl6ZWQgaW4gMjAxOSAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCkuCmBgYHtyIHBsb3QgY3RsIHZzIHRydH0KIyBQbG90IG9uIDE6MSBsaW5lIHcvIGRpYWdvbmFsIGxpbmVzIHNob3dpbmcg4oCwIG9mZnNldHMKIyBmaXJzdCBjb2xsYXBzZSBzaXRlcyBmb3IgYmV0dGVyIHZpc3VhbHMKYWxsLjE0Yy5jdGwudHJ0ICU+JQogIGZpbHRlcihIb3Jpem9uID09ICJBIikgJT4lCiAgbXV0YXRlKExvY2F0aW9uID0gcmVjb2RlKFNpdGUsICEhIWxvYykpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gTG9jYXRpb24sIHNoYXBlID0gVHlwZSkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5fdHJ0LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfY29ycl9taW5fY3RsLCAKICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UsIE5DJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EnID0gJyNGRkMxMDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCwgTUEnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UsIFROJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeGxhYihleHByZXNzaW9uKCdDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKCiMgZm9yIHBsb3R0aW5nIHdpdGggY29sb3IgPSBUeXBlIChjdXJyZW50bHkgc3VwcHJlc3NlZCkKIyBhbGwuMTRjLmN0bC50cnQgJT4lCiMgICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQojICAgbXV0YXRlKExvY2F0aW9uID0gZmFjdG9yKHJlY29kZShTaXRlLCAhISFsb2MpLCBleGNsdWRlID0gVFJVRSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9jdGwsIGQxNGNfY29ycl9tZWFuX3RydCwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IExvY2F0aW9uKSkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdGRhc2giKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5fdHJ0LCAKIyAgICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X3RydCwgCiMgICAgICAgICBjb2xvciA9IFR5cGUpLCAKIyAgICAgd2lkdGggPSAuMjUpICsKIyAgIGdlb21fZXJyb3JiYXJoKAojICAgICBhZXMoeG1pbiA9IGQxNGNfY29ycl9taW5fY3RsLCAKIyAgICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X2N0bCwgCiMgICAgICAgICBjb2xvciA9IFR5cGUpLCAKIyAgICAgaGVpZ2h0ID0gLjkpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYihleHByZXNzaW9uKCdUcmVhdG1lbnQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKIyAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAo+KipGaWcuIGByIHtmaWcubiArIDR9YC4gRWZmZWN0IG9mIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyArIHN0b3JhZ2Ugb24gXjE0XkMtQ09+Mn4qKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgZGF0YSBmcm9tIGFsbCB0aHJlZSBleHBlcmltZW50cy4gUG9pbnRzIGFyZSB0aGUgbWVhbiBvZiBsYWJvcmF0b3J5IHJlcGxpY2F0ZXMgKGZvciByZXBsaWNhdGVkIHNhbXBsZXMpOyBlcnJvciBiYXJzIGFyZSAyeCBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhbi4gU29saWQgbGluZSBpcyAxOjEsIHdoaWxlIHRoZSBkYXNoZWQgYW5kIGRvdHRlZCBsaW5lcyBzaG93IGRpZmZlcmVuY2VzIG9mIMKxMjDigLAgYW5kIMKxJDQw4oCwLCBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluIGF0bW9zcGhlcmljIENPfjJ+IG92ZXIgNSBhbmQgMTAgeWVhcnMgcmVzcGVjdGl2ZWx5IGR1cmluZyB0aGUgcGVyaW9kIG9mIDIwMDAgdG8gMjAyMC4KCiMjIFN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IG9uIF4xNF5DLUNPfjJ+IChFeHBlcmltZW50IDMpCgpUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGV2aWRlbmNlIGZvciBhIHN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IGluIHRoZSBzYW1wbGVzIHRoYXQgb25seSBjb250YWluIGJvbWItQywgYWx0aG91Z2ggdGhlIHRyZW5kIGluIHRoZSBkaWZmZXJlbmNlcyBkdWUgdG8gdHJlYXRtZW50IGZvciB0aGUgaGlnaGx5IGVucmljaGVkIHNhbXBsZXMgZnJvbSBPYWsgUmlkZ2UsIFROIHN1Z2dlc3QgbG9zc2VzIG9mIHRoZSBtb3N0IHJlY2VudGx5IGZpeGVkIGNhcmJvbiBvdmVyIHRoZSBkdXJhdGlvbiBvZiBzdG9yYWdlLiBUaGVzZSBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDLiAKYGBge3J9CiMgRmlsdGVyIGRhdGEgdG8gImluYyIsIHNwbGl0IGJ5IGJpbmFyeSB0cmVhdG1lbnQgdmFyaWFibGUsIHRoZW4gbWVyZ2UKYWxsLjE0Yy5jdGwgPC0gYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdCmFsbC4xNGMuY3RsIDwtIHJlbmFtZV9hdChhbGwuMTRjLmN0bCwgdmFycyhjb250YWlucygnZDE0YycpKSwgbGlzdCh+cGFzdGUwKC4sICJfY3RsIikpKQphbGwuMTRjLnRydCA8LSBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgXQphbGwuMTRjLnRydCA8LSByZW5hbWVfYXQoYWxsLjE0Yy50cnQsIHZhcnMoY29udGFpbnMoJ2QxNGMnKSksIGxpc3QofnBhc3RlMCguLCAiX3RydCIpKSkKYWxsLjE0Yy5jdGwudHJ0IDwtIGlubmVyX2pvaW4oZGF0YS5mcmFtZShhbGwuMTRjLmN0bCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShhbGwuMTRjLnRydCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiU2l0ZSIsICJIb3Jpem9uIikpCgojIEZpcnN0IGFkZCBZZWFyU2FtcGxlZCBhbmQgWWVhck1lYXN1cmVkIGNvbHVtbnMKYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkIDwtIHVubGlzdChhbGwuMTRjLnN1bS5kZlttYXRjaChhbGwuMTRjLmN0bC50cnQkSUQsIGFsbC4xNGMuc3VtLmRmJElEKSwgIlllYXJTYW1wbGVkIl0pCiMgY29ycmVjdCBhcmNoaXZlIHNhbXBsZSBZZWFyU2FtcGxlZAphbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gImFyYyIgJiBhbGwuMTRjLmN0bC50cnQkU2l0ZSA9PSAiSGFpbmljaCIsICJZZWFyU2FtcGxlZCJdIDwtIDIwMTEKCiMgYWRkIHllYXIgbWVhc3VyZWQgY29sdW1uLCBtb2RpZnkgZm9yIHRtZS5taXNjIHNhbXBsZXMsIHJld2V0IHNhbXBsZXMKYWxsLjE0Yy5jdGwudHJ0JFllYXJNZWFzdXJlZCA8LSAyMDE4CmFsbC4xNGMuY3RsLnRydFthbGwuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCAiWWVhck1lYXN1cmVkIl0gPC0gMjAxOQphbGwuMTRjLmN0bC50cnRbd2hpY2goYWxsLjE0Yy5jdGwudHJ0JElEICVpbiUgdG1lLm1pc2MkSUQpLCAiWWVhck1lYXN1cmVkIl0gPC0gMjAwOQoKIyBjYWxjdWxhdGUgc3RvcmFnZSBkdXJhdGlvbiBudW1lcmljYWxseSBhbmQgYXMgZmFjdG9yCmFsbC4xNGMuY3RsLnRydCR0bWUgPC0gdW5saXN0KGFsbC4xNGMuY3RsLnRydCRZZWFyTWVhc3VyZWQgLSBhbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQpCmFsbC4xNGMuY3RsLnRydCR0bWUuZiA8LSBmYWN0b3IoYWxsLjE0Yy5jdGwudHJ0JHRtZSkKCiMgYWRkIGRpZmZlcmVuY2UgY29sdW1uCiMgKGV4cHJlc3NlZCBhcyBkaWZmZXJlbmNlIG9mIG1lYW5zKQphbGwuMTRjLmN0bC50cnQkY3RsLnRydC5kMTQgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX2N0bCAtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl90cnQKCiMgIyBhZGQgYXRtIDE0QyBmb3IgeWVhciBzYW1wbGVkIGFuZCBjYWxjdWxhdGUgZGVsdGEtZGVsdGEKIyBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQgPC0gRGF0bVttYXRjaChhbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQsIGZsb29yKERhdG0kRGF0ZSkpLCAiTkhjMTQiXQojIGFsbC4xNGMuY3RsLnRydCRkZC5jdGwgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX2N0bCAtIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZAojIGFsbC4xNGMuY3RsLnRydCRkZC50cnQgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX3RydCAtIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZAojIGFsbC4xNGMuY3RsLnRydCRjdGwudHJ0LmRkMTQgPC0gYWxsLjE0Yy5jdGwudHJ0JGRkLmN0bCAtIGFsbC4xNGMuY3RsLnRydCRkZC50cnQKCiMgbGlzdCBvZiBsb2NhdGlvbnMgZm9yIHJlY29kaW5nCmxvYyA8LSBsaXN0KAogICAgIkR1a2UiID0gIkR1a2UsIE5DIiwKICAgICJIb3dsYW5kIiA9ICJIb3dsYW5kLCBNRSIsCiAgICAiSGFydmFyZCIgPSAiSGFydmFyZCwgTUEiLAogICAgIkhhaW5pY2giID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiU2Nob3JmaGVpZGUiID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiTXVzaWNrIiA9ICJTaWVycmEgTmV2YWRhLCBDQSIsCiAgICAiU2hhdmVyIiA9ICJTaWVycmEgTmV2YWRhLCBDQSIsCiAgICAiV2Fsa2VyIEJyYW5jaCIgPSAiT2FrIFJpZGdlLCBUTiIsCiAgICAiVGVubmVzc2VlIFZhbGxleSIgPSAiT2FrIFJpZGdlLCBUTiIpCgojIFBsb3Qgc3RvcmFnZSBkdXJhdGlvbgpzdXBwcmVzc1dhcm5pbmdzKAogIGFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJyZXdldCIpICU+JQogIHNlbGVjdChUeXBlLCB0bWUuZiwgU2l0ZSwgY3RsLnRydC5kMTQsIHRtZSkgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgdG1lLmYsIFNpdGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRpZl9zZSA9IGN0bC50cnQuZDE0X3NkL25fbWVhbiwKICAgICAgICAgZGlmX3UgPSBjdGwudHJ0LmQxNF9tZWFuICsgZGlmX3NlKjIsCiAgICAgICAgIGRpZl9sID0gY3RsLnRydC5kMTRfbWVhbiAtIGRpZl9zZSoyKSAlPiUKICBtdXRhdGUoTG9jYXRpb24gPSBmYWN0b3IocmVjb2RlKFNpdGUsICEhIWxvYyksIGV4Y2x1ZGUgPSBUUlVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0bWVfbWVhbiwgY3RsLnRydC5kMTRfbWVhbiwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAuNywgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkaWZfbCwKICAgICAgICB5bWF4ID0gZGlmX3UsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLAogICAgd2lkdGggPSAuNywKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UsIE5DJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EnID0gJyNGRkMxMDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCwgTUEnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UsIFROJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeWxhYihleHByZXNzaW9uKCdDb250cm9sIC0gVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlN0b3JhZ2UgZHVyYXRpb24gKHllYXJzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogICkKYGBgCgo+KipGaWcuIGByIHtmaWcubiArIDV9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIHN0b3JhZ2UgZHVyYXRpb24qKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgZGF0YSBmcm9tIGJvdGggRXhwZXJpbWVudCAxIChpbiBibGFjaykgYW5kIEV4cGVyaW1lbnQgMyAoYWxsIG90aGVyIHBvaW50cykuIERhc2hlZCBhbmQgZG90dGVkIGxpbmVzIHNob3cgYSBkaWZmZXJlbmNlIG9mIDIw4oCwIGFuZCA0MOKAsCwgZXF1aXZhbGVudCB0byB0aGUgYXRtb3NwaGVyaWMgZGVjbGluZSBvdmVyIGZpdmUgYW5kIDEwIHllYXJzIHJlc3BlY3RpdmVseSBmb3IgdGhlIHBlcmlvZCAyMDAwIHRvIDIwMjAuIFBvc2l0aW9uIG9mIHBvaW50cyBqaXR0ZXJlZCB0byBhdm9pZCBvdmVycGxvdHRpbmc7IHN0b3JhZ2UgZHVyYXRpb24gaGFzIGJlZW4gcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IHdob2xlIHllYXIuCgpUaGUgdHJlbmQgaW4gdGhlIGRpZmZlcmVuY2VzIGR1ZSB0byB0cmVhdG1lbnQgZm9yIHRoZSBoaWdobHkgZW5yaWNoZWQgc2FtcGxlcyBmcm9tIE9hayBSaWRnZSwgVE4gc3VnZ2VzdCBsb3NzZXMgb2YgdGhlIG1vc3QgcmVjZW50bHkgZml4ZWQgY2FyYm9uIG92ZXIgdGhlIGR1cmF0aW9uIG9mIHN0b3JhZ2UuIFRoZSBUTiBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDLiBIb3dldmVyLCBpbiBjb250cmFzdCwgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBldmlkZW5jZSBmb3IgYSBzdG9yYWdlIGR1cmF0aW9uIGVmZmVjdCBpbiB0aGUgc2FtcGxlcyB0aGF0IG9ubHkgY29udGFpbiBib21iLUMuCgoKIyBEaXNjdXNzaW9uCgoqUmFuZG9tIG5vdGVzIGhlcmUuLi4qCgoqRWZmZWN0IG9mIEMgcmVzcGlyZWQqCmBgYHtyIHNvbS0xNGMtY2FsY3MsIGluY2x1ZGUgPSBGQUxTRX0KIyByZWFkIDE0QyBTT00gZGF0YQpleHAuc29tMTRjIDwtIHJlYWQueGxzeCgiLi4vZGF0YS9leHRlcm5hbC9leHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLXNvbV8yMDExLzE3MDIyOF8xNENfU09NLnhsc3giKQpleHAuc29tMTRjICU+JSAKICBmaWx0ZXIoRXhwbG9yYXRvcnkgIT0gIkEiKSAlPiUKICBncm91cF9ieShFeHBsb3JhdG9yeSwgVHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW4gPSBtZWFuKGAxNENfU09NYCkpCmBgYAo=