1 Introduction
Daily cyclist counts on New York City’s East River bridges provide
valuable insight into transportation patterns, recreational activity,
and how environmental conditions influence urban mobility. In last
week’s analysis, a standard Poisson model was used to examine how
continuous measures of temperature and precipitation affected cyclist
counts on the Manhattan Bridge. While the initial findings highlighted
clear relationships between weather and cycling behavior, the data also
showed signs of overdispersion, indicating that the variability in
cyclist counts may not be fully captured by a basic Poisson
framework.
To address this, the current study refines the analysis by
re-engineering key predictor variables and applying a dispersed Poisson
approach. Rather than treating high and low temperatures separately,
daily temperature is summarized using a single average temperature
variable (AvgTemp), offering a more stable and interpretable measure of
overall weather conditions. Precipitation is also simplified: because
the data contain many zero-rainfall days and a small number of positive
rainfall values, precipitation is converted into a binary indicator
(NewPrecip) distinguishing dry days from days with any measurable
rainfall. These modifications help create a more realistic
representation of how weather influences cyclist behavior.
The primary research question guiding this revised analysis is:
How do average temperature and precipitation status influence daily
cyclist counts on the Manhattan Bridge when accounting for potential
overdispersion in the data?
To answer this question, we conduct exploratory data analysis, fit
Poisson and quasi-Poisson regression models, evaluate the estimated
dispersion parameter, and visualize how expected cyclist counts vary
across temperature and precipitation conditions. This approach provides
a clearer and more robust understanding of how key environmental factors
shape daily cycling activity.
2 Description of Dataset
The dataset originates from the Traffic Information Management System
(TIMS), which collects automated bicycle counts across New York City’s
East River bridges. The data are summarized on a daily basis, where each
observation represents the total number of cyclists crossing the bridges
in a 24-hour period, along with corresponding weather conditions for
that day. These data provide a snapshot of how cycling activity
fluctuates with environmental factors such as temperature and
rainfall.
There are 5 original exploratory variables in the data set:
- Day (numerical) — an index we created to represent the sequence of
observations (1, 2, …, n)
- LowTemp (numerical) - lowest temperature
- Precipitation (numerical) - amount of precipitation
- HighTemp (numerical) - highest temperature
- Total (numerical) - total number of cyclists per 24 hours on the
Brooklyn Bridge, Manhattan Bridge, Williamsburg Bridge, and Queensboro
Bridge
We engineered two new variables:
- AvgTemp = (HighTemp + LowTemp) / 2
- NewPrecip = 0 if Precipitation = 0, otherwise 1
Our response variable is:
- ManhattanBridge (numerical) - total number of cyclists per 24 hours
crossing the Manhattan Bridge
Assumptions and Conditions for Poisson
Regression:
Count response variable: The dependent variable must represent counts
(non-negative integers), such as the number of cyclists crossing a
bridge per day.
Independence of observations: Each observation (daily count) is
assumed to be independent of the others.
Equidispersion: The mean and variance of the response variable are
approximately equal. Overdispersion (variance greater than mean) can
indicate model misfit and may require a quasi-Poisson or negative
binomial adjustment.
Log-linearity: The logarithm of the expected count is a linear
function of the predictor variables.
No excessive zeros: Poisson regression assumes the count data are not
dominated by zeros (zero-inflated models would be used otherwise).
Explanatory variables measured without error: Predictor variables
(e.g., temperature, precipitation) are assumed to be observed
accurately.
3 Exploratory Data Analysis
To begin, we will make a frequency distribution histogram for our
variable, Precipiation, to understand the behavior of the variable
before modeling.
ggplot(data, aes(x = Precipitation)) +
geom_histogram(binwidth = 0.1, fill = "steelblue", color = "black") +
labs(
title = "Distribution of Precipitation",
x = "Precipitation (inches)",
y = "Frequency"
)

The histogram of precipitation clearly shows a highly skewed and
imbalanced distribution. The vast majority of observations fall at 0
inches, meaning most days in the dataset experienced no rainfall at all.
This is evident from the tall bar at zero, which dramatically outweighs
the frequency of all other values. In contrast, the days with measurable
rainfall are both rare and widely dispersed, with only a handful of
observations scattered across various positive precipitation amounts
(e.g., 0.1, 0.3, 0.7, 1.2 inches). None of these positive values occur
frequently enough to form meaningful clusters.
This extreme right skew indicates that precipitation behaves almost
like a binary variable in practice: the important distinction is simply
whether it rained or not, rather than the exact amount. Because of this
structure, treating precipitation as a continuous predictor would do
little to improve model accuracy and could introduce instability due to
the influence of a few outlying high-rainfall days. The histogram
therefore justifies discretizing precipitation into a binary
indicator—NewPrecip = 0 for no rain and 1 for any rain—which better
reflects the underlying pattern in the data and aligns with how weather
affects cyclist behavior.
We next discretize Precipitation to assess for this.
id.rain = which(data$Precipitation > 0)
NewPrecip = data$Precipitation
NewPrecip[id.rain] = 1
NewPrecip[-id.rain] = 0
data$NewPrecip = NewPrecip
In this code chunk, we convert the original precipitation variable
into a simple binary indicator. Any day with precipitation greater than
zero is coded as 1, and days with no precipitation are coded as 0. This
creates the new variable NewPrecip, which simplifies the analysis by
focusing on whether it rained or not—important because the original
precipitation data are highly skewed with many zero values.
4 Poisson Regression Modeling
We build both the regular Poisson and Quasi-Poisson regression models
and extract the dispersion parameter to decide which model should be
used as a working model.
4.2 Visual Comparisons
Next, we create a visualization to show how the predictors in our
final model relate to the actual number of cyclists on the Manhattan
Bridge. We define two comparison groups based on precipitation
status:
Dry days: NewPrecip = 0
Rainy days: NewPrecip = 1
For a grid of average temperatures spanning the observed range, we
compute the model-based predicted log counts, then exponentiate them to
obtain predicted cyclist counts. Plotting these curves side-by-side (dry
vs. rainy) across temperature illustrates how warmer conditions raise
expected volume and how any precipitation consistently lowers expected
counts at each temperature level
## Final model assumed fitted as:
## final_model <- glm(ManhattanBridge ~ AvgTemp + NewPrecip,
## family = quasipoisson, data = data)
par(mar = c(5, 5, 4, 2)) # bottom, left, top, right
par(cex.lab = 1.2, cex.axis = 1, cex.main = 1.2)
co <- coef(quasi.model.02)
# Temperature grid across observed range
temps <- seq(min(data$AvgTemp, na.rm = TRUE),
max(data$AvgTemp, na.rm = TRUE), length.out = 200)
# Linear predictors by precipitation status
eta_dry <- co["(Intercept)"] + co["AvgTemp"]*temps + co["NewPrecip"]*0
eta_wet <- co["(Intercept)"] + co["AvgTemp"]*temps + co["NewPrecip"]*1
# Expected cyclist counts
mu_dry <- exp(eta_dry)
mu_wet <- exp(eta_wet)
# Plot (base R), styled like the class example
ylim_max <- max(mu_dry, mu_wet, na.rm = TRUE)
plot(temps, mu_dry, type = "l", lty = 1,
ylim = c(0, ylim_max),
xlab = "Average Temperature (°F)",
ylab = "Expected Manhattan Bridge Cyclists",
main = "Expected Cyclist Counts by AvgTemp and Precipitation")
lines(temps, mu_wet, lty = 2)
legend("topleft",
c("Dry day (NewPrecip = 0)", "Rain day (NewPrecip = 1)"),
lty = c(1, 2), bty = "n", cex = 0.9)

The plot displays the expected number of cyclists crossing the
Manhattan Bridge as a function of average daily temperature, with
separate curves shown for dry days (NewPrecip = 0) and rainy days
(NewPrecip = 1). The expected counts were generated by exponentiating
the fitted quasi-Poisson regression equation using a sequence of
temperatures from 45°F to 75°F.
The visualization highlights two clear patterns. First, cyclist
counts increase steadily with increasing average temperature. Warmer
days are associated with substantially higher predicted cycling volumes,
consistent with the positive and significant coefficient for AvgTemp in
the regression model. Second, daily precipitation has a marked negative
effect on cycling levels. Across all temperatures, the predicted counts
on rainy days lie well below those on dry days, illustrating the
substantial decrease in cyclist activity when any precipitation
occurs.
Overall, the graph reinforces the statistical findings from the final
quasi-Poisson model: average temperature is positively associated with
cyclist counts, while rainfall significantly reduces expected bridge
usage.
5 Conclusion
In this extended analysis of daily cyclist activity on the Manhattan
Bridge, we evaluated how average temperature and precipitation influence
cycling behavior under a dispersed Poisson framework. By engineering two
key predictor variables—AvgTemp to summarize overall daily temperature,
and NewPrecip to distinguish between dry and rainy days—we captured the
primary weather-related factors that shape daily cyclist counts. After
fitting both a standard Poisson model and a dispersed Poisson model, the
estimated dispersion parameter indicated severe overdispersion in the
raw Poisson fit, with values exceeding 300. This confirmed that the
regular Poisson assumptions were not appropriate for the data, and that
the quasi-Poisson model was the correct working model for inference.
The quasi-Poisson results demonstrated clear, intuitive effects.
AvgTemp had a strong, positive association with cyclist counts: warmer
days consistently led to higher expected volumes of bridge crossings. In
contrast, precipitation significantly decreased cyclist activity; even a
small amount of rainfall corresponded to a large reduction in expected
counts. The Day variable, included initially to assess underlying
trends, was not statistically significant and was removed from the final
model. The simplified model therefore focused on the two predictors with
meaningful influence.
The visual comparison of predicted cyclist counts further supported
these findings. The expected counts rose steadily with increasing
average temperature, while the predicted curve for rainy days remained
consistently lower than that of dry days across the entire temperature
range. This illustrates how weather conditions jointly shape rider
behavior: favorable temperatures encourage cycling, while rain sharply
suppresses it.
Overall, the quasi-Poisson modeling approach provided a more accurate
and reliable picture of cyclist behavior on the Manhattan Bridge by
accounting for overdispersion in the data. The results highlight the
substantial role that daily weather conditions play in influencing
cycling patterns and offer valuable insight for city planners seeking to
anticipate and accommodate fluctuations in bicycle traffic.
LS0tDQp0aXRsZTogIlF1YW50aWZ5aW5nIHRoZSBFZmZlY3Qgb2YgVGVtcGVyYXR1cmUgYW5kIFByZWNpcGl0YXRpb24gb24gTWFuaGF0dGFuIEJyaWRnZSBDeWNsaXN0IFRyYWZmaWMiDQphdXRob3I6ICJMdWtlIFZvbG0iDQpkYXRlOiAiMjAyNS0xMC0xMCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vICAgIyBudW1iZXJpbmcgc2VjdGlvbiBoZWFkaW5ncw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcyAgICAgIyBUT0Mgc3ViaGVhZGluZyBjb2xsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgIyBhbGxvdyB0byBkb3dubG9hZCBjb21wbGV0ZSBSTWFya2Rvd24gc291cmNlIGNvZGUNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMgICAgICMgc2Nyb2xsaW5nIHRleHQgb2YgdGhlIGRvY3VtZW50DQogICAgdGhlbWU6IGx1bWVuICAgICAgICAgICAjIHZpc3VhbCB0aGVtZSBmb3IgSFRNTCBkb2N1bWVudCBvbmx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbyAgICAgICAjIGNvZGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGx3ZXsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGJvb3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KHBhbmRlcikNCg0KIyBTZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCiMgUmVhZCBpbiBkYXRhIChkcm9wIGZpcnN0IGNvbHVtbiBpZiBpdCdzIGp1c3QgYW4gaW5kZXgvSUQpDQpzZXR3ZCgiQzovVXNlcnMvdm9sbTEvT25lRHJpdmUvRGVza3RvcC9TVEEzMjEgbmV3IikNCmRhdGEgPC0gcmVhZF9leGNlbCgidzA5LUFzc2lnbkRhdGFzZXQueGxzeCIpDQojIEdsb2JhbCBjaHVuayBvcHRpb25zDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLCAgICAgICMgc2hvdyBjb2RlDQogIHdhcm5pbmcgPSBGQUxTRSwgICMgc3VwcHJlc3Mgd2FybmluZ3MNCiAgbWVzc2FnZSA9IEZBTFNFLCAgIyBzdXBwcmVzcyBtZXNzYWdlcw0KICByZXN1bHRzID0gVFJVRSwgICAjIHNob3cgcmVzdWx0cw0KICBjb21tZW50ID0gTkEgICAgICAjIGNsZWFuZXIgb3V0cHV0IChubyAiIyMiIHByZWZpeCkNCikNCmBgYA0KDQojIDEgSW50cm9kdWN0aW9uDQoNCkRhaWx5IGN5Y2xpc3QgY291bnRzIG9uIE5ldyBZb3JrIENpdHnigJlzIEVhc3QgUml2ZXIgYnJpZGdlcyBwcm92aWRlIHZhbHVhYmxlIGluc2lnaHQgaW50byB0cmFuc3BvcnRhdGlvbiBwYXR0ZXJucywgcmVjcmVhdGlvbmFsIGFjdGl2aXR5LCBhbmQgaG93IGVudmlyb25tZW50YWwgY29uZGl0aW9ucyBpbmZsdWVuY2UgdXJiYW4gbW9iaWxpdHkuIEluIGxhc3Qgd2Vla+KAmXMgYW5hbHlzaXMsIGEgc3RhbmRhcmQgUG9pc3NvbiBtb2RlbCB3YXMgdXNlZCB0byBleGFtaW5lIGhvdyBjb250aW51b3VzIG1lYXN1cmVzIG9mIHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9uIGFmZmVjdGVkIGN5Y2xpc3QgY291bnRzIG9uIHRoZSBNYW5oYXR0YW4gQnJpZGdlLiBXaGlsZSB0aGUgaW5pdGlhbCBmaW5kaW5ncyBoaWdobGlnaHRlZCBjbGVhciByZWxhdGlvbnNoaXBzIGJldHdlZW4gd2VhdGhlciBhbmQgY3ljbGluZyBiZWhhdmlvciwgdGhlIGRhdGEgYWxzbyBzaG93ZWQgc2lnbnMgb2Ygb3ZlcmRpc3BlcnNpb24sIGluZGljYXRpbmcgdGhhdCB0aGUgdmFyaWFiaWxpdHkgaW4gY3ljbGlzdCBjb3VudHMgbWF5IG5vdCBiZSBmdWxseSBjYXB0dXJlZCBieSBhIGJhc2ljIFBvaXNzb24gZnJhbWV3b3JrLg0KDQpUbyBhZGRyZXNzIHRoaXMsIHRoZSBjdXJyZW50IHN0dWR5IHJlZmluZXMgdGhlIGFuYWx5c2lzIGJ5IHJlLWVuZ2luZWVyaW5nIGtleSBwcmVkaWN0b3IgdmFyaWFibGVzIGFuZCBhcHBseWluZyBhIGRpc3BlcnNlZCBQb2lzc29uIGFwcHJvYWNoLiBSYXRoZXIgdGhhbiB0cmVhdGluZyBoaWdoIGFuZCBsb3cgdGVtcGVyYXR1cmVzIHNlcGFyYXRlbHksIGRhaWx5IHRlbXBlcmF0dXJlIGlzIHN1bW1hcml6ZWQgdXNpbmcgYSBzaW5nbGUgYXZlcmFnZSB0ZW1wZXJhdHVyZSB2YXJpYWJsZSAoQXZnVGVtcCksIG9mZmVyaW5nIGEgbW9yZSBzdGFibGUgYW5kIGludGVycHJldGFibGUgbWVhc3VyZSBvZiBvdmVyYWxsIHdlYXRoZXIgY29uZGl0aW9ucy4gUHJlY2lwaXRhdGlvbiBpcyBhbHNvIHNpbXBsaWZpZWQ6IGJlY2F1c2UgdGhlIGRhdGEgY29udGFpbiBtYW55IHplcm8tcmFpbmZhbGwgZGF5cyBhbmQgYSBzbWFsbCBudW1iZXIgb2YgcG9zaXRpdmUgcmFpbmZhbGwgdmFsdWVzLCBwcmVjaXBpdGF0aW9uIGlzIGNvbnZlcnRlZCBpbnRvIGEgYmluYXJ5IGluZGljYXRvciAoTmV3UHJlY2lwKSBkaXN0aW5ndWlzaGluZyBkcnkgZGF5cyBmcm9tIGRheXMgd2l0aCBhbnkgbWVhc3VyYWJsZSByYWluZmFsbC4gVGhlc2UgbW9kaWZpY2F0aW9ucyBoZWxwIGNyZWF0ZSBhIG1vcmUgcmVhbGlzdGljIHJlcHJlc2VudGF0aW9uIG9mIGhvdyB3ZWF0aGVyIGluZmx1ZW5jZXMgY3ljbGlzdCBiZWhhdmlvci4NCg0KVGhlIHByaW1hcnkgcmVzZWFyY2ggcXVlc3Rpb24gZ3VpZGluZyB0aGlzIHJldmlzZWQgYW5hbHlzaXMgaXM6DQoNCkhvdyBkbyBhdmVyYWdlIHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9uIHN0YXR1cyBpbmZsdWVuY2UgZGFpbHkgY3ljbGlzdCBjb3VudHMgb24gdGhlIE1hbmhhdHRhbiBCcmlkZ2Ugd2hlbiBhY2NvdW50aW5nIGZvciBwb3RlbnRpYWwgb3ZlcmRpc3BlcnNpb24gaW4gdGhlIGRhdGE/DQoNClRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCB3ZSBjb25kdWN0IGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMsIGZpdCBQb2lzc29uIGFuZCBxdWFzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLCBldmFsdWF0ZSB0aGUgZXN0aW1hdGVkIGRpc3BlcnNpb24gcGFyYW1ldGVyLCBhbmQgdmlzdWFsaXplIGhvdyBleHBlY3RlZCBjeWNsaXN0IGNvdW50cyB2YXJ5IGFjcm9zcyB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiBjb25kaXRpb25zLiBUaGlzIGFwcHJvYWNoIHByb3ZpZGVzIGEgY2xlYXJlciBhbmQgbW9yZSByb2J1c3QgdW5kZXJzdGFuZGluZyBvZiBob3cga2V5IGVudmlyb25tZW50YWwgZmFjdG9ycyBzaGFwZSBkYWlseSBjeWNsaW5nIGFjdGl2aXR5Lg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YXNldA0KDQpUaGUgZGF0YXNldCBvcmlnaW5hdGVzIGZyb20gdGhlIFRyYWZmaWMgSW5mb3JtYXRpb24gTWFuYWdlbWVudCBTeXN0ZW0gKFRJTVMpLCB3aGljaCBjb2xsZWN0cyBhdXRvbWF0ZWQgYmljeWNsZSBjb3VudHMgYWNyb3NzIE5ldyBZb3JrIENpdHnigJlzIEVhc3QgUml2ZXIgYnJpZGdlcy4gVGhlIGRhdGEgYXJlIHN1bW1hcml6ZWQgb24gYSBkYWlseSBiYXNpcywgd2hlcmUgZWFjaCBvYnNlcnZhdGlvbiByZXByZXNlbnRzIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgY3Jvc3NpbmcgdGhlIGJyaWRnZXMgaW4gYSAyNC1ob3VyIHBlcmlvZCwgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIHdlYXRoZXIgY29uZGl0aW9ucyBmb3IgdGhhdCBkYXkuIFRoZXNlIGRhdGEgcHJvdmlkZSBhIHNuYXBzaG90IG9mIGhvdyBjeWNsaW5nIGFjdGl2aXR5IGZsdWN0dWF0ZXMgd2l0aCBlbnZpcm9ubWVudGFsIGZhY3RvcnMgc3VjaCBhcyB0ZW1wZXJhdHVyZSBhbmQgcmFpbmZhbGwuDQoNClRoZXJlIGFyZSA1IG9yaWdpbmFsIGV4cGxvcmF0b3J5IHZhcmlhYmxlcyBpbiB0aGUgZGF0YSBzZXQ6DQoNCiogRGF5IChudW1lcmljYWwpIOKAlCBhbiBpbmRleCB3ZSBjcmVhdGVkIHRvIHJlcHJlc2VudCB0aGUgc2VxdWVuY2Ugb2Ygb2JzZXJ2YXRpb25zICgxLCAyLCDigKYsIG4pDQoqIExvd1RlbXAgKG51bWVyaWNhbCkgLSBsb3dlc3QgdGVtcGVyYXR1cmUNCiogUHJlY2lwaXRhdGlvbiAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uDQoqIEhpZ2hUZW1wIChudW1lcmljYWwpIC0gaGlnaGVzdCB0ZW1wZXJhdHVyZSANCiogVG90YWwgKG51bWVyaWNhbCkgLSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgcGVyIDI0IGhvdXJzIG9uIHRoZSBCcm9va2x5biBCcmlkZ2UsIE1hbmhhdHRhbiBCcmlkZ2UsIFdpbGxpYW1zYnVyZyBCcmlkZ2UsIGFuZCBRdWVlbnNib3JvIEJyaWRnZQ0KDQpXZSBlbmdpbmVlcmVkIHR3byBuZXcgdmFyaWFibGVzOg0KDQoqIEF2Z1RlbXAgPSAoSGlnaFRlbXAgKyBMb3dUZW1wKSAvIDINCiogTmV3UHJlY2lwID0gMCBpZiBQcmVjaXBpdGF0aW9uID0gMCwgb3RoZXJ3aXNlIDENCg0KT3VyIHJlc3BvbnNlIHZhcmlhYmxlIGlzOg0KDQoqIE1hbmhhdHRhbkJyaWRnZSAobnVtZXJpY2FsKSAtIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBwZXIgMjQgaG91cnMgY3Jvc3NpbmcgdGhlIE1hbmhhdHRhbiBCcmlkZ2UNCg0KKipBc3N1bXB0aW9ucyBhbmQgQ29uZGl0aW9ucyBmb3IgUG9pc3NvbiBSZWdyZXNzaW9uOioqDQoNCkNvdW50IHJlc3BvbnNlIHZhcmlhYmxlOiBUaGUgZGVwZW5kZW50IHZhcmlhYmxlIG11c3QgcmVwcmVzZW50IGNvdW50cyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKSwgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIGNyb3NzaW5nIGEgYnJpZGdlIHBlciBkYXkuDQoNCkluZGVwZW5kZW5jZSBvZiBvYnNlcnZhdGlvbnM6IEVhY2ggb2JzZXJ2YXRpb24gKGRhaWx5IGNvdW50KSBpcyBhc3N1bWVkIHRvIGJlIGluZGVwZW5kZW50IG9mIHRoZSBvdGhlcnMuDQoNCkVxdWlkaXNwZXJzaW9uOiBUaGUgbWVhbiBhbmQgdmFyaWFuY2Ugb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLiBPdmVyZGlzcGVyc2lvbiAodmFyaWFuY2UgZ3JlYXRlciB0aGFuIG1lYW4pIGNhbiBpbmRpY2F0ZSBtb2RlbCBtaXNmaXQgYW5kIG1heSByZXF1aXJlIGEgcXVhc2ktUG9pc3NvbiBvciBuZWdhdGl2ZSBiaW5vbWlhbCBhZGp1c3RtZW50Lg0KDQpMb2ctbGluZWFyaXR5OiBUaGUgbG9nYXJpdGhtIG9mIHRoZSBleHBlY3RlZCBjb3VudCBpcyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcy4NCg0KTm8gZXhjZXNzaXZlIHplcm9zOiBQb2lzc29uIHJlZ3Jlc3Npb24gYXNzdW1lcyB0aGUgY291bnQgZGF0YSBhcmUgbm90IGRvbWluYXRlZCBieSB6ZXJvcyAoemVyby1pbmZsYXRlZCBtb2RlbHMgd291bGQgYmUgdXNlZCBvdGhlcndpc2UpLg0KDQpFeHBsYW5hdG9yeSB2YXJpYWJsZXMgbWVhc3VyZWQgd2l0aG91dCBlcnJvcjogUHJlZGljdG9yIHZhcmlhYmxlcyAoZS5nLiwgdGVtcGVyYXR1cmUsIHByZWNpcGl0YXRpb24pIGFyZSBhc3N1bWVkIHRvIGJlIG9ic2VydmVkIGFjY3VyYXRlbHkuDQoNCiMgMyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzDQoNClRvIGJlZ2luLCB3ZSB3aWxsIG1ha2UgYSBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIGhpc3RvZ3JhbSBmb3Igb3VyIHZhcmlhYmxlLCBQcmVjaXBpYXRpb24sIHRvIHVuZGVyc3RhbmQgdGhlIGJlaGF2aW9yIG9mIHRoZSB2YXJpYWJsZSBiZWZvcmUgbW9kZWxpbmcuDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBQcmVjaXBpdGF0aW9uKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSwgZmlsbCA9ICJzdGVlbGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgUHJlY2lwaXRhdGlvbiIsDQogICAgeCA9ICJQcmVjaXBpdGF0aW9uIChpbmNoZXMpIiwNCiAgICB5ID0gIkZyZXF1ZW5jeSINCiAgKQ0KDQpgYGANCg0KVGhlIGhpc3RvZ3JhbSBvZiBwcmVjaXBpdGF0aW9uIGNsZWFybHkgc2hvd3MgYSBoaWdobHkgc2tld2VkIGFuZCBpbWJhbGFuY2VkIGRpc3RyaWJ1dGlvbi4gVGhlIHZhc3QgbWFqb3JpdHkgb2Ygb2JzZXJ2YXRpb25zIGZhbGwgYXQgMCBpbmNoZXMsIG1lYW5pbmcgbW9zdCBkYXlzIGluIHRoZSBkYXRhc2V0IGV4cGVyaWVuY2VkIG5vIHJhaW5mYWxsIGF0IGFsbC4gVGhpcyBpcyBldmlkZW50IGZyb20gdGhlIHRhbGwgYmFyIGF0IHplcm8sIHdoaWNoIGRyYW1hdGljYWxseSBvdXR3ZWlnaHMgdGhlIGZyZXF1ZW5jeSBvZiBhbGwgb3RoZXIgdmFsdWVzLiBJbiBjb250cmFzdCwgdGhlIGRheXMgd2l0aCBtZWFzdXJhYmxlIHJhaW5mYWxsIGFyZSBib3RoIHJhcmUgYW5kIHdpZGVseSBkaXNwZXJzZWQsIHdpdGggb25seSBhIGhhbmRmdWwgb2Ygb2JzZXJ2YXRpb25zIHNjYXR0ZXJlZCBhY3Jvc3MgdmFyaW91cyBwb3NpdGl2ZSBwcmVjaXBpdGF0aW9uIGFtb3VudHMgKGUuZy4sIDAuMSwgMC4zLCAwLjcsIDEuMiBpbmNoZXMpLiBOb25lIG9mIHRoZXNlIHBvc2l0aXZlIHZhbHVlcyBvY2N1ciBmcmVxdWVudGx5IGVub3VnaCB0byBmb3JtIG1lYW5pbmdmdWwgY2x1c3RlcnMuDQoNClRoaXMgZXh0cmVtZSByaWdodCBza2V3IGluZGljYXRlcyB0aGF0IHByZWNpcGl0YXRpb24gYmVoYXZlcyBhbG1vc3QgbGlrZSBhIGJpbmFyeSB2YXJpYWJsZSBpbiBwcmFjdGljZTogdGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiBpcyBzaW1wbHkgd2hldGhlciBpdCByYWluZWQgb3Igbm90LCByYXRoZXIgdGhhbiB0aGUgZXhhY3QgYW1vdW50LiBCZWNhdXNlIG9mIHRoaXMgc3RydWN0dXJlLCB0cmVhdGluZyBwcmVjaXBpdGF0aW9uIGFzIGEgY29udGludW91cyBwcmVkaWN0b3Igd291bGQgZG8gbGl0dGxlIHRvIGltcHJvdmUgbW9kZWwgYWNjdXJhY3kgYW5kIGNvdWxkIGludHJvZHVjZSBpbnN0YWJpbGl0eSBkdWUgdG8gdGhlIGluZmx1ZW5jZSBvZiBhIGZldyBvdXRseWluZyBoaWdoLXJhaW5mYWxsIGRheXMuIFRoZSBoaXN0b2dyYW0gdGhlcmVmb3JlIGp1c3RpZmllcyBkaXNjcmV0aXppbmcgcHJlY2lwaXRhdGlvbiBpbnRvIGEgYmluYXJ5IGluZGljYXRvcuKAlE5ld1ByZWNpcCA9IDAgZm9yIG5vIHJhaW4gYW5kIDEgZm9yIGFueSByYWlu4oCUd2hpY2ggYmV0dGVyIHJlZmxlY3RzIHRoZSB1bmRlcmx5aW5nIHBhdHRlcm4gaW4gdGhlIGRhdGEgYW5kIGFsaWducyB3aXRoIGhvdyB3ZWF0aGVyIGFmZmVjdHMgY3ljbGlzdCBiZWhhdmlvci4NCg0KV2UgbmV4dCBkaXNjcmV0aXplIFByZWNpcGl0YXRpb24gdG8gYXNzZXNzIGZvciB0aGlzLg0KDQpgYGB7cn0NCg0KaWQucmFpbiAgID0gd2hpY2goZGF0YSRQcmVjaXBpdGF0aW9uID4gMCkNCk5ld1ByZWNpcCA9IGRhdGEkUHJlY2lwaXRhdGlvbg0KTmV3UHJlY2lwW2lkLnJhaW5dID0gMQ0KTmV3UHJlY2lwWy1pZC5yYWluXSA9IDANCmRhdGEkTmV3UHJlY2lwID0gTmV3UHJlY2lwDQoNCmBgYA0KDQpJbiB0aGlzIGNvZGUgY2h1bmssIHdlIGNvbnZlcnQgdGhlIG9yaWdpbmFsIHByZWNpcGl0YXRpb24gdmFyaWFibGUgaW50byBhIHNpbXBsZSBiaW5hcnkgaW5kaWNhdG9yLiBBbnkgZGF5IHdpdGggcHJlY2lwaXRhdGlvbiBncmVhdGVyIHRoYW4gemVybyBpcyBjb2RlZCBhcyAxLCBhbmQgZGF5cyB3aXRoIG5vIHByZWNpcGl0YXRpb24gYXJlIGNvZGVkIGFzIDAuIFRoaXMgY3JlYXRlcyB0aGUgbmV3IHZhcmlhYmxlIE5ld1ByZWNpcCwgd2hpY2ggc2ltcGxpZmllcyB0aGUgYW5hbHlzaXMgYnkgZm9jdXNpbmcgb24gd2hldGhlciBpdCByYWluZWQgb3Igbm904oCUaW1wb3J0YW50IGJlY2F1c2UgdGhlIG9yaWdpbmFsIHByZWNpcGl0YXRpb24gZGF0YSBhcmUgaGlnaGx5IHNrZXdlZCB3aXRoIG1hbnkgemVybyB2YWx1ZXMuDQoNCiMgNCBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWxpbmcNCg0KV2UgYnVpbGQgYm90aCB0aGUgcmVndWxhciBQb2lzc29uIGFuZCBRdWFzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIGFuZCBleHRyYWN0IHRoZSBkaXNwZXJzaW9uIHBhcmFtZXRlciB0byBkZWNpZGUgd2hpY2ggbW9kZWwgc2hvdWxkIGJlIHVzZWQgYXMgYSB3b3JraW5nIG1vZGVsLg0KDQojIyA0LjEgRXh0cmFjdGluZyBEaXNwZXJzaW9uIEluZGV4DQoNCldlIGNhbGN1bGF0ZSB0aGUgZXN0aW1hdGVkIGRpc3BlcnNpb24gdmFsdWUgdXNpbmcgYm90aCBQZWFyc29uIHJlc2lkdWFscyBhbmQgZGV2aWFuY2UgcmVzaWR1YWxzLiBJbiBwcmFjdGljZSwgUuKAmXMgYnVpbHQtaW4gZGlzcGVyc2lvbiBlc3RpbWF0ZSBpcyBiYXNlZCBvbiB0aGUgUGVhcnNvbiByZXNpZHVhbHMsIHdoaWNoIGl0IHVzZXMgdG8gYXBwcm94aW1hdGUgaG93IG11Y2ggdGhlIGRhdGEgZGV2aWF0ZSBmcm9tIHRoZSBhc3N1bXB0aW9ucyBvZiBhIHN0YW5kYXJkIFBvaXNzb24gbW9kZWwuDQoNCmBgYHtyfQ0KDQojIEF2Z1RlbXAgPSAoSGlnaFRlbXAgKyBMb3dUZW1wKS8yDQpkYXRhJEF2Z1RlbXAgPC0gKGRhdGEkSGlnaFRlbXAgKyBkYXRhJExvd1RlbXApIC8gMg0KDQojIERpc2NyZXRpemUgUHJlY2lwaXRhdGlvbjogTmV3UHJlY2lwID0gMCBpZiAwLCAxIGlmID4gMA0KaWQucmFpbiA8LSB3aGljaChkYXRhJFByZWNpcGl0YXRpb24gPiAwKQ0KTmV3UHJlY2lwIDwtIHJlcCgwLCBucm93KGRhdGEpKQ0KTmV3UHJlY2lwW2lkLnJhaW5dIDwtIDENCmRhdGEkTmV3UHJlY2lwIDwtIE5ld1ByZWNpcA0KDQojIERheSBpbmRleCAoMSwgMiwgLi4uLCBuKS4gSWYgeW91IHByZWZlciBjYWxlbmRhciBpbmZvLCBzd2FwIGZvciBhcy5pbnRlZ2VyKGZhY3RvcihEYXRlKSkuDQpkYXRhJERheSA8LSBzZXFfbGVuKG5yb3coZGF0YSkpDQoNCiMgLS0tIFBvaXNzb24gbW9kZWwgKE1hbmhhdHRhbkJyaWRnZSBjb3VudHMpIC0tLQ0KcG9pc19tb2QgPC0gZ2xtKE1hbmhhdHRhbkJyaWRnZSB+IERheSArIEF2Z1RlbXAgKyBOZXdQcmVjaXAsDQogICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gZGF0YSkNCg0KIyBQcmVkaWN0ZWQgbWVhbiBhbmQgZGlzcGVyc2lvbiBlc3RpbWF0ZXMNCnloYXQgPC0gcG9pc19tb2QkZml0dGVkLnZhbHVlcw0KcGVhcnNvbl9yZXNpZCA8LSAoZGF0YSRNYW5oYXR0YW5CcmlkZ2UgLSB5aGF0KSAvIHNxcnQoeWhhdCkNClBlYXJzb24uZGlzcCA8LSBzdW0ocGVhcnNvbl9yZXNpZF4yKSAvIHBvaXNfbW9kJGRmLnJlc2lkdWFsDQpEZXZpYW5jZS5kaXNwIDwtIHBvaXNfbW9kJGRldmlhbmNlIC8gcG9pc19tb2QkZGYucmVzaWR1YWwNCg0KIyBUaWR5IGxpdHRsZSB0YWJsZSBmb3IgZGlzcGVyc2lvbg0KZGlzcF90YWIgPC0gZGF0YS5mcmFtZShQZWFyc29uLmRpc3AgPSBQZWFyc29uLmRpc3AsDQogICAgICAgICAgICAgICAgICAgICAgIERldmlhbmNlLmRpc3AgPSBEZXZpYW5jZS5kaXNwKQ0Ka25pdHI6OmthYmxlKGRpc3BfdGFiLCBjYXB0aW9uID0gIkVzdGltYXRlZCBkaXNwZXJzaW9uIChQb2lzc29uIGZpdCkiKQ0KDQojIC0tLSBRdWFzaS1Qb2lzc29uIG1vZGVsIChzYW1lIG1lYW4sIFNFcyBzY2FsZWQgYnkgZGlzcGVyc2lvbikgLS0tDQpxcG9pc19tb2QgPC0gZ2xtKE1hbmhhdHRhbkJyaWRnZSB+IERheSArIEF2Z1RlbXAgKyBOZXdQcmVjaXAsDQogICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGRhdGEpDQoNCmtuaXRyOjprYWJsZShzdW1tYXJ5KHFwb2lzX21vZCkkY29lZiwNCiAgICAgICAgICAgICBjYXB0aW9uID0gIlF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBjb2VmZmljaWVudHMgKE1hbmhhdHRhbiBCcmlkZ2UpIikNCg0KYGBgDQoNClRoZSBkaXNwZXJzaW9uIHJlc3VsdHMgc2hvdyBleHRyZW1lbHkgaGlnaCB2YWx1ZXMgZm9yIGJvdGggdGhlIFBlYXJzb24gZGlzcGVyc2lvbiBpbmRleCAoMzI2LjExKSBhbmQgdGhlIGRldmlhbmNlIGRpc3BlcnNpb24gaW5kZXggKDMzNi42OSksIGluZGljYXRpbmcgc2V2ZXJlIG92ZXJkaXNwZXJzaW9uIGluIHRoZSBQb2lzc29uIG1vZGVsLiBVbmRlciB0aGUgUG9pc3NvbiBhc3N1bXB0aW9uLCB0aGUgdmFyaWFuY2Ugc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIG1lYW4sIHByb2R1Y2luZyBhIGRpc3BlcnNpb24gdmFsdWUgY2xvc2UgdG8gMS4gRXZlbiBtb2Rlc3QgZGV2aWF0aW9uc+KAlHZhbHVlcyBhcm91bmQgMiBvciAz4oCUc2lnbmFsIHRoYXQgdGhlIFBvaXNzb24gbW9kZWwgbWF5IG5vdCBmaXQgd2VsbC4gSGVyZSwgdGhlIGVzdGltYXRlZCBkaXNwZXJzaW9uIGlzIG1vcmUgdGhhbiAzMDAgdGltZXMgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQsIG1lYW5pbmcgdGhlIHZhcmlhYmlsaXR5IGluIGN5Y2xpc3QgY291bnRzIGlzIGZhciBncmVhdGVyIHRoYW4gd2hhdCBhIHN0YW5kYXJkIFBvaXNzb24gbW9kZWwgY2FuIGFjY29tbW9kYXRlLiBUaGlzIGxldmVsIG9mIG92ZXJkaXNwZXJzaW9uIGltcGxpZXMgdGhhdCB0aGUgUG9pc3NvbiBtb2RlbCBkcmFtYXRpY2FsbHkgdW5kZXJzdGF0ZXMgdGhlIHVuY2VydGFpbnR5IGluIHRoZSBkYXRhLCBsZWFkaW5nIHRvIHVucmVsaWFibGUgc3RhbmRhcmQgZXJyb3JzIGFuZCBtaXNsZWFkaW5nIHAtdmFsdWVzLiBUaGVyZWZvcmUsIHRoZSBxdWFzaS1Qb2lzc29uIG1vZGVsLCB3aGljaCBhZGp1c3RzIGZvciBleGNlc3MgdmFyaWFuY2UgYnkgc2NhbGluZyB0aGUgc3RhbmRhcmQgZXJyb3JzLCBpcyBjbGVhcmx5IHRoZSBtb3JlIGFwcHJvcHJpYXRlIG1vZGVsaW5nIGNob2ljZSBmb3IgdGhpcyBkYXRhc2V0Lg0KDQpOZXh0LCB3ZSBzdW1tYXJpemUgdGhlIGluZmVyZW50aWFsIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuDQoNCmBgYHtyfQ0KDQpxdWFzaS5tb2RlbCA8LSBnbG0oTWFuaGF0dGFuQnJpZGdlIH4gRGF5ICsgQXZnVGVtcCArIE5ld1ByZWNpcCwgDQogICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGRhdGEpICANCnN1bW1hcnkocXVhc2kubW9kZWwgKQ0KDQpTRS5xdWFzaS5wb2lzID0gc3VtbWFyeShxdWFzaS5tb2RlbCkkY29lZg0Ka2FibGUoU0UucXVhc2kucG9pcywgY2FwdGlvbiA9ICJTdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgcXVhc2ktcG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIikNCg0KYGBgDQoNClRoZSBxdWFzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gcmVzdWx0cyByZXZlYWwgaG93IGF2ZXJhZ2UgdGVtcGVyYXR1cmUsIHByZWNpcGl0YXRpb24gc3RhdHVzLCBhbmQgZGF5LXRvLWRheSB2YXJpYXRpb24gaW5mbHVlbmNlIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgY3Jvc3NpbmcgdGhlIE1hbmhhdHRhbiBCcmlkZ2UuIA0KDQpUaGUgY29lZmZpY2llbnQgZm9yIERheSBpcyBzbWFsbCBhbmQgc3RhdGlzdGljYWxseSBpbnNpZ25pZmljYW50ICjOsiA9IOKIkjAuMDAzMCwgcCA9IDAuNjQ5KSwgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgZGF5LXRvLWRheSB0cmVuZCBpbiBjeWNsaXN0IGNvdW50cyBhZnRlciBhY2NvdW50aW5nIGZvciB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbi4gVGhpcyBzdWdnZXN0cyB0aGF0IGxvbmctdGVybSBvciBzZXF1ZW50aWFsIGVmZmVjdHMgYXJlIG5vdCBhIG1ham9yIGRyaXZlciBvZiB2YXJpYXRpb24gaW4gdXNhZ2UgZHVyaW5nIHRoZSBwZXJpb2Qgc3R1ZGllZC4NCg0KQXZlcmFnZSB0ZW1wZXJhdHVyZSAoQXZnVGVtcCkgaXMgYSBzdHJvbmcgcG9zaXRpdmUgcHJlZGljdG9yIG9mIGN5Y2xpbmcgYWN0aXZpdHkgKM6yID0gMC4wMjk2LCBwIDwgMC4wMDEpLiBJbnRlcnByZXRlZCBvbiB0aGUgbG9nIHNjYWxlLCBob2xkaW5nIGFsbCBlbHNlIGNvbnN0YW50LCBlYWNoIG9uZS1kZWdyZWUgaW5jcmVhc2UgaW4gYXZlcmFnZSB0ZW1wZXJhdHVyZSByYWlzZXMgdGhlIGV4cGVjdGVkIGN5Y2xpc3QgY291bnQgYnkgYXBwcm94aW1hdGVseSAzJSAoc2luY2UgZXhwKDAuMDI5Nikg4omIIDEuMDMpLiBUaGlzIGFsaWducyB3aXRoIGludHVpdGl2ZSBleHBlY3RhdGlvbnMgdGhhdCB3YXJtZXIgd2VhdGhlciBlbmNvdXJhZ2VzIG1vcmUgY3ljbGluZy4NCg0KVGhlIHByZWNpcGl0YXRpb24gaW5kaWNhdG9yIChOZXdQcmVjaXApIGhhcyBhIHNpZ25pZmljYW50IG5lZ2F0aXZlIGVmZmVjdCBvbiBjeWNsaXN0IGNvdW50cyAozrIgPSDiiJIwLjI3NjUsIHAgPSAwLjAyMikuIE9uIGRheXMgd2l0aCBhbnkgcHJlY2lwaXRhdGlvbiwgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBjeWNsaXN0cyBkZWNyZWFzZXMgYnkgYWJvdXQgMjQlIGNvbXBhcmVkIHRvIGNvbXBsZXRlbHkgZHJ5IGRheXMgKGV4cCjiiJIwLjI3NjUpIOKJiCAwLjc2KS4gVGhpcyBzdWJzdGFudGlhbCBkcm9wIHJlZmxlY3RzIHRoZSBzdHJvbmcgaW5mbHVlbmNlIG9mIHJhaW5mYWxsIG9uIGN5Y2xpbmcgYmVoYXZpb3IuDQoNCk92ZXJhbGwsIHRoZSBxdWFzaS1Qb2lzc29uIG1vZGVsIGluZGljYXRlcyB0aGF0IGF2ZXJhZ2UgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24gbWVhbmluZ2Z1bGx5IGltcGFjdCBNYW5oYXR0YW4gQnJpZGdlIGN5Y2xpbmcgY291bnRzLCB3aGlsZSBkYWlseSB0cmVuZHMgZG8gbm90IGNvbnRyaWJ1dGUgc2lnbmlmaWNhbnRseSB0byB2YXJpYXRpb24uDQoNClRoZSBlc3RpbWF0ZWQgZGlzcGVyc2lvbiBpbmRleCBpcyAzMjYuMTEgYmFzZWQgb24gdGhlIFBlYXJzb24gcmVzaWR1YWxzLg0KDQpJbiBvdXIgZmluYWwgbW9kZWwsIHdlIHdpbGwgZHJvcCBEYXkgYmVjYXVzZSBpdCB3YXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFdlIHJlZml0IHRoZSBxdWFzaS1Qb2lzc29uIG1vZGVsIGFmdGVyIGRyb3BwaW5nIERheS4NCg0KYGBge3J9DQoNCnF1YXNpLm1vZGVsLjAyID0gZ2xtKE1hbmhhdHRhbkJyaWRnZSB+IEF2Z1RlbXAgKyBOZXdQcmVjaXAsIA0KICAgICAgICAgICAgICAgICBmYW1pbHkgPSBxdWFzaXBvaXNzb24sIGRhdGEgPSBkYXRhKQ0KDQprYWJsZShzdW1tYXJ5KHF1YXNpLm1vZGVsLjAyKSRjb2VmLCBjYXB0aW9uID0gIkluZmVyZW50aWFsIHN0YXRpc3RpY3Mgb2YgDQp0aGUgUG9pc3NvbiByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyAgaW4gdGhlIGZpbmFsIHdvcmtpbmcgbW9kZWwuIikNCg0KYGBgDQoNClRoZSBmaW5hbCBxdWFzaS1Qb2lzc29uIG1vZGVsIGluZGljYXRlcyB0aGF0IEF2Z1RlbXAgYW5kIE5ld1ByZWNpcCBhcmUgYm90aCBzaWduaWZpY2FudCBwcmVkaWN0b3JzIG9mIGRhaWx5IGN5Y2xpc3QgY291bnRzIG9uIHRoZSBNYW5oYXR0YW4gQnJpZGdlLiBBdmdUZW1wIGhhcyBhIHBvc2l0aXZlIGFuZCBoaWdobHkgc2lnbmlmaWNhbnQgZWZmZWN0IChFc3RpbWF0ZSA9IDAuMDI4MywgcCA8IDAuMDAxKSwgbWVhbmluZyB3YXJtZXIgZGF5cyBhcmUgYXNzb2NpYXRlZCB3aXRoIGluY3JlYXNlZCBjeWNsaXN0IGFjdGl2aXR5LiBOZXdQcmVjaXAgaGFzIGEgc2lnbmlmaWNhbnQgbmVnYXRpdmUgZWZmZWN0IChFc3RpbWF0ZSA9IOKIkjAuMjg2LCBwID0gMC4wMTUpLCBzaG93aW5nIHRoYXQgZGF5cyB3aXRoIGFueSBwcmVjaXBpdGF0aW9uIGhhdmUgc3Vic3RhbnRpYWxseSBsb3dlciBjeWNsaXN0IGNvdW50cyBjb21wYXJlZCB0byBkcnkgZGF5cy4gT3ZlcmFsbCwgdGVtcGVyYXR1cmUgaW5jcmVhc2VzIGN5Y2xpbmcgYWN0aXZpdHksIHdoaWxlIHByZWNpcGl0YXRpb24gc3VwcHJlc3NlcyBpdC4NCg0KIyA0LjIgVmlzdWFsIENvbXBhcmlzb25zDQoNCk5leHQsIHdlIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gdG8gc2hvdyBob3cgdGhlIHByZWRpY3RvcnMgaW4gb3VyIGZpbmFsIG1vZGVsIHJlbGF0ZSB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgTWFuaGF0dGFuIEJyaWRnZS4gV2UgZGVmaW5lIHR3byBjb21wYXJpc29uIGdyb3VwcyBiYXNlZCBvbiBwcmVjaXBpdGF0aW9uIHN0YXR1czoNCg0KRHJ5IGRheXM6IE5ld1ByZWNpcCA9IDANCg0KUmFpbnkgZGF5czogTmV3UHJlY2lwID0gMQ0KDQpGb3IgYSBncmlkIG9mIGF2ZXJhZ2UgdGVtcGVyYXR1cmVzIHNwYW5uaW5nIHRoZSBvYnNlcnZlZCByYW5nZSwgd2UgY29tcHV0ZSB0aGUgbW9kZWwtYmFzZWQgcHJlZGljdGVkIGxvZyBjb3VudHMsIHRoZW4gZXhwb25lbnRpYXRlIHRoZW0gdG8gb2J0YWluIHByZWRpY3RlZCBjeWNsaXN0IGNvdW50cy4gUGxvdHRpbmcgdGhlc2UgY3VydmVzIHNpZGUtYnktc2lkZSAoZHJ5IHZzLiByYWlueSkgYWNyb3NzIHRlbXBlcmF0dXJlIGlsbHVzdHJhdGVzIGhvdyB3YXJtZXIgY29uZGl0aW9ucyByYWlzZSBleHBlY3RlZCB2b2x1bWUgYW5kIGhvdyBhbnkgcHJlY2lwaXRhdGlvbiBjb25zaXN0ZW50bHkgbG93ZXJzIGV4cGVjdGVkIGNvdW50cyBhdCBlYWNoIHRlbXBlcmF0dXJlIGxldmVsDQoNCmBgYHtyfQ0KDQojIyBGaW5hbCBtb2RlbCBhc3N1bWVkIGZpdHRlZCBhczoNCiMjIGZpbmFsX21vZGVsIDwtIGdsbShNYW5oYXR0YW5CcmlkZ2UgfiBBdmdUZW1wICsgTmV3UHJlY2lwLA0KIyMgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGRhdGEpDQpwYXIobWFyID0gYyg1LCA1LCA0LCAyKSkgICMgYm90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0DQpwYXIoY2V4LmxhYiA9IDEuMiwgY2V4LmF4aXMgPSAxLCBjZXgubWFpbiA9IDEuMikNCg0KY28gPC0gY29lZihxdWFzaS5tb2RlbC4wMikNCg0KIyBUZW1wZXJhdHVyZSBncmlkIGFjcm9zcyBvYnNlcnZlZCByYW5nZQ0KdGVtcHMgPC0gc2VxKG1pbihkYXRhJEF2Z1RlbXAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgbWF4KGRhdGEkQXZnVGVtcCwgbmEucm0gPSBUUlVFKSwgbGVuZ3RoLm91dCA9IDIwMCkNCg0KIyBMaW5lYXIgcHJlZGljdG9ycyBieSBwcmVjaXBpdGF0aW9uIHN0YXR1cw0KZXRhX2RyeSAgPC0gY29bIihJbnRlcmNlcHQpIl0gKyBjb1siQXZnVGVtcCJdKnRlbXBzICsgY29bIk5ld1ByZWNpcCJdKjANCmV0YV93ZXQgIDwtIGNvWyIoSW50ZXJjZXB0KSJdICsgY29bIkF2Z1RlbXAiXSp0ZW1wcyArIGNvWyJOZXdQcmVjaXAiXSoxDQoNCiMgRXhwZWN0ZWQgY3ljbGlzdCBjb3VudHMNCm11X2RyeSA8LSBleHAoZXRhX2RyeSkNCm11X3dldCA8LSBleHAoZXRhX3dldCkNCg0KIyBQbG90IChiYXNlIFIpLCBzdHlsZWQgbGlrZSB0aGUgY2xhc3MgZXhhbXBsZQ0KeWxpbV9tYXggPC0gbWF4KG11X2RyeSwgbXVfd2V0LCBuYS5ybSA9IFRSVUUpDQpwbG90KHRlbXBzLCBtdV9kcnksIHR5cGUgPSAibCIsIGx0eSA9IDEsDQogICAgIHlsaW0gPSBjKDAsIHlsaW1fbWF4KSwNCiAgICAgeGxhYiA9ICJBdmVyYWdlIFRlbXBlcmF0dXJlICjCsEYpIiwNCiAgICAgeWxhYiA9ICJFeHBlY3RlZCBNYW5oYXR0YW4gQnJpZGdlIEN5Y2xpc3RzIiwNCiAgICAgbWFpbiA9ICJFeHBlY3RlZCBDeWNsaXN0IENvdW50cyBieSBBdmdUZW1wIGFuZCBQcmVjaXBpdGF0aW9uIikNCmxpbmVzKHRlbXBzLCBtdV93ZXQsIGx0eSA9IDIpDQoNCmxlZ2VuZCgidG9wbGVmdCIsDQogICAgICAgYygiRHJ5IGRheSAoTmV3UHJlY2lwID0gMCkiLCAiUmFpbiBkYXkgKE5ld1ByZWNpcCA9IDEpIiksDQogICAgICAgbHR5ID0gYygxLCAyKSwgYnR5ID0gIm4iLCBjZXggPSAwLjkpDQoNCmBgYA0KDQpUaGUgcGxvdCBkaXNwbGF5cyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGN5Y2xpc3RzIGNyb3NzaW5nIHRoZSBNYW5oYXR0YW4gQnJpZGdlIGFzIGEgZnVuY3Rpb24gb2YgYXZlcmFnZSBkYWlseSB0ZW1wZXJhdHVyZSwgd2l0aCBzZXBhcmF0ZSBjdXJ2ZXMgc2hvd24gZm9yIGRyeSBkYXlzIChOZXdQcmVjaXAgPSAwKSBhbmQgcmFpbnkgZGF5cyAoTmV3UHJlY2lwID0gMSkuIFRoZSBleHBlY3RlZCBjb3VudHMgd2VyZSBnZW5lcmF0ZWQgYnkgZXhwb25lbnRpYXRpbmcgdGhlIGZpdHRlZCBxdWFzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gZXF1YXRpb24gdXNpbmcgYSBzZXF1ZW5jZSBvZiB0ZW1wZXJhdHVyZXMgZnJvbSA0NcKwRiB0byA3NcKwRi4NCg0KVGhlIHZpc3VhbGl6YXRpb24gaGlnaGxpZ2h0cyB0d28gY2xlYXIgcGF0dGVybnMuIEZpcnN0LCBjeWNsaXN0IGNvdW50cyBpbmNyZWFzZSBzdGVhZGlseSB3aXRoIGluY3JlYXNpbmcgYXZlcmFnZSB0ZW1wZXJhdHVyZS4gV2FybWVyIGRheXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBzdWJzdGFudGlhbGx5IGhpZ2hlciBwcmVkaWN0ZWQgY3ljbGluZyB2b2x1bWVzLCBjb25zaXN0ZW50IHdpdGggdGhlIHBvc2l0aXZlIGFuZCBzaWduaWZpY2FudCBjb2VmZmljaWVudCBmb3IgQXZnVGVtcCBpbiB0aGUgcmVncmVzc2lvbiBtb2RlbC4gU2Vjb25kLCBkYWlseSBwcmVjaXBpdGF0aW9uIGhhcyBhIG1hcmtlZCBuZWdhdGl2ZSBlZmZlY3Qgb24gY3ljbGluZyBsZXZlbHMuIEFjcm9zcyBhbGwgdGVtcGVyYXR1cmVzLCB0aGUgcHJlZGljdGVkIGNvdW50cyBvbiByYWlueSBkYXlzIGxpZSB3ZWxsIGJlbG93IHRob3NlIG9uIGRyeSBkYXlzLCBpbGx1c3RyYXRpbmcgdGhlIHN1YnN0YW50aWFsIGRlY3JlYXNlIGluIGN5Y2xpc3QgYWN0aXZpdHkgd2hlbiBhbnkgcHJlY2lwaXRhdGlvbiBvY2N1cnMuDQoNCk92ZXJhbGwsIHRoZSBncmFwaCByZWluZm9yY2VzIHRoZSBzdGF0aXN0aWNhbCBmaW5kaW5ncyBmcm9tIHRoZSBmaW5hbCBxdWFzaS1Qb2lzc29uIG1vZGVsOiBhdmVyYWdlIHRlbXBlcmF0dXJlIGlzIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIGN5Y2xpc3QgY291bnRzLCB3aGlsZSByYWluZmFsbCBzaWduaWZpY2FudGx5IHJlZHVjZXMgZXhwZWN0ZWQgYnJpZGdlIHVzYWdlLg0KDQojIDUgQ29uY2x1c2lvbg0KDQpJbiB0aGlzIGV4dGVuZGVkIGFuYWx5c2lzIG9mIGRhaWx5IGN5Y2xpc3QgYWN0aXZpdHkgb24gdGhlIE1hbmhhdHRhbiBCcmlkZ2UsIHdlIGV2YWx1YXRlZCBob3cgYXZlcmFnZSB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiBpbmZsdWVuY2UgY3ljbGluZyBiZWhhdmlvciB1bmRlciBhIGRpc3BlcnNlZCBQb2lzc29uIGZyYW1ld29yay4gQnkgZW5naW5lZXJpbmcgdHdvIGtleSBwcmVkaWN0b3IgdmFyaWFibGVz4oCUQXZnVGVtcCB0byBzdW1tYXJpemUgb3ZlcmFsbCBkYWlseSB0ZW1wZXJhdHVyZSwgYW5kIE5ld1ByZWNpcCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRyeSBhbmQgcmFpbnkgZGF5c+KAlHdlIGNhcHR1cmVkIHRoZSBwcmltYXJ5IHdlYXRoZXItcmVsYXRlZCBmYWN0b3JzIHRoYXQgc2hhcGUgZGFpbHkgY3ljbGlzdCBjb3VudHMuIEFmdGVyIGZpdHRpbmcgYm90aCBhIHN0YW5kYXJkIFBvaXNzb24gbW9kZWwgYW5kIGEgZGlzcGVyc2VkIFBvaXNzb24gbW9kZWwsIHRoZSBlc3RpbWF0ZWQgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgaW5kaWNhdGVkIHNldmVyZSBvdmVyZGlzcGVyc2lvbiBpbiB0aGUgcmF3IFBvaXNzb24gZml0LCB3aXRoIHZhbHVlcyBleGNlZWRpbmcgMzAwLiBUaGlzIGNvbmZpcm1lZCB0aGF0IHRoZSByZWd1bGFyIFBvaXNzb24gYXNzdW1wdGlvbnMgd2VyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBkYXRhLCBhbmQgdGhhdCB0aGUgcXVhc2ktUG9pc3NvbiBtb2RlbCB3YXMgdGhlIGNvcnJlY3Qgd29ya2luZyBtb2RlbCBmb3IgaW5mZXJlbmNlLg0KDQpUaGUgcXVhc2ktUG9pc3NvbiByZXN1bHRzIGRlbW9uc3RyYXRlZCBjbGVhciwgaW50dWl0aXZlIGVmZmVjdHMuIEF2Z1RlbXAgaGFkIGEgc3Ryb25nLCBwb3NpdGl2ZSBhc3NvY2lhdGlvbiB3aXRoIGN5Y2xpc3QgY291bnRzOiB3YXJtZXIgZGF5cyBjb25zaXN0ZW50bHkgbGVkIHRvIGhpZ2hlciBleHBlY3RlZCB2b2x1bWVzIG9mIGJyaWRnZSBjcm9zc2luZ3MuIEluIGNvbnRyYXN0LCBwcmVjaXBpdGF0aW9uIHNpZ25pZmljYW50bHkgZGVjcmVhc2VkIGN5Y2xpc3QgYWN0aXZpdHk7IGV2ZW4gYSBzbWFsbCBhbW91bnQgb2YgcmFpbmZhbGwgY29ycmVzcG9uZGVkIHRvIGEgbGFyZ2UgcmVkdWN0aW9uIGluIGV4cGVjdGVkIGNvdW50cy4gVGhlIERheSB2YXJpYWJsZSwgaW5jbHVkZWQgaW5pdGlhbGx5IHRvIGFzc2VzcyB1bmRlcmx5aW5nIHRyZW5kcywgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFuZCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbCBtb2RlbC4gVGhlIHNpbXBsaWZpZWQgbW9kZWwgdGhlcmVmb3JlIGZvY3VzZWQgb24gdGhlIHR3byBwcmVkaWN0b3JzIHdpdGggbWVhbmluZ2Z1bCBpbmZsdWVuY2UuDQoNClRoZSB2aXN1YWwgY29tcGFyaXNvbiBvZiBwcmVkaWN0ZWQgY3ljbGlzdCBjb3VudHMgZnVydGhlciBzdXBwb3J0ZWQgdGhlc2UgZmluZGluZ3MuIFRoZSBleHBlY3RlZCBjb3VudHMgcm9zZSBzdGVhZGlseSB3aXRoIGluY3JlYXNpbmcgYXZlcmFnZSB0ZW1wZXJhdHVyZSwgd2hpbGUgdGhlIHByZWRpY3RlZCBjdXJ2ZSBmb3IgcmFpbnkgZGF5cyByZW1haW5lZCBjb25zaXN0ZW50bHkgbG93ZXIgdGhhbiB0aGF0IG9mIGRyeSBkYXlzIGFjcm9zcyB0aGUgZW50aXJlIHRlbXBlcmF0dXJlIHJhbmdlLiBUaGlzIGlsbHVzdHJhdGVzIGhvdyB3ZWF0aGVyIGNvbmRpdGlvbnMgam9pbnRseSBzaGFwZSByaWRlciBiZWhhdmlvcjogZmF2b3JhYmxlIHRlbXBlcmF0dXJlcyBlbmNvdXJhZ2UgY3ljbGluZywgd2hpbGUgcmFpbiBzaGFycGx5IHN1cHByZXNzZXMgaXQuDQoNCk92ZXJhbGwsIHRoZSBxdWFzaS1Qb2lzc29uIG1vZGVsaW5nIGFwcHJvYWNoIHByb3ZpZGVkIGEgbW9yZSBhY2N1cmF0ZSBhbmQgcmVsaWFibGUgcGljdHVyZSBvZiBjeWNsaXN0IGJlaGF2aW9yIG9uIHRoZSBNYW5oYXR0YW4gQnJpZGdlIGJ5IGFjY291bnRpbmcgZm9yIG92ZXJkaXNwZXJzaW9uIGluIHRoZSBkYXRhLiBUaGUgcmVzdWx0cyBoaWdobGlnaHQgdGhlIHN1YnN0YW50aWFsIHJvbGUgdGhhdCBkYWlseSB3ZWF0aGVyIGNvbmRpdGlvbnMgcGxheSBpbiBpbmZsdWVuY2luZyBjeWNsaW5nIHBhdHRlcm5zIGFuZCBvZmZlciB2YWx1YWJsZSBpbnNpZ2h0IGZvciBjaXR5IHBsYW5uZXJzIHNlZWtpbmcgdG8gYW50aWNpcGF0ZSBhbmQgYWNjb21tb2RhdGUgZmx1Y3R1YXRpb25zIGluIGJpY3ljbGUgdHJhZmZpYy4=