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.1 Extracting Dispersion Index

We calculate the estimated dispersion value using both Pearson residuals and deviance residuals. In practice, R’s built-in dispersion estimate is based on the Pearson residuals, which it uses to approximate how much the data deviate from the assumptions of a standard Poisson model.

# AvgTemp = (HighTemp + LowTemp)/2
data$AvgTemp <- (data$HighTemp + data$LowTemp) / 2

# Discretize Precipitation: NewPrecip = 0 if 0, 1 if > 0
id.rain <- which(data$Precipitation > 0)
NewPrecip <- rep(0, nrow(data))
NewPrecip[id.rain] <- 1
data$NewPrecip <- NewPrecip

# Day index (1, 2, ..., n). If you prefer calendar info, swap for as.integer(factor(Date)).
data$Day <- seq_len(nrow(data))

# --- Poisson model (ManhattanBridge counts) ---
pois_mod <- glm(ManhattanBridge ~ Day + AvgTemp + NewPrecip,
                family = poisson(link = "log"), data = data)

# Predicted mean and dispersion estimates
yhat <- pois_mod$fitted.values
pearson_resid <- (data$ManhattanBridge - yhat) / sqrt(yhat)
Pearson.disp <- sum(pearson_resid^2) / pois_mod$df.residual
Deviance.disp <- pois_mod$deviance / pois_mod$df.residual

# Tidy little table for dispersion
disp_tab <- data.frame(Pearson.disp = Pearson.disp,
                       Deviance.disp = Deviance.disp)
knitr::kable(disp_tab, caption = "Estimated dispersion (Poisson fit)")
Estimated dispersion (Poisson fit)
Pearson.disp Deviance.disp
326.1144 336.6871
# --- Quasi-Poisson model (same mean, SEs scaled by dispersion) ---
qpois_mod <- glm(ManhattanBridge ~ Day + AvgTemp + NewPrecip,
                 family = quasipoisson, data = data)

knitr::kable(summary(qpois_mod)$coef,
             caption = "Quasi-Poisson regression coefficients (Manhattan Bridge)")
Quasi-Poisson regression coefficients (Manhattan Bridge)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.7958375 0.3724002 18.2487500 0.0000000
Day -0.0030259 0.0065783 -0.4599783 0.6493554
AvgTemp 0.0295903 0.0065617 4.5095289 0.0001227
NewPrecip -0.2764622 0.1132013 -2.4422176 0.0217057

The dispersion results show extremely high values for both the Pearson dispersion index (326.11) and the deviance dispersion index (336.69), indicating severe overdispersion in the Poisson model. Under the Poisson assumption, the variance should be approximately equal to the mean, producing a dispersion value close to 1. Even modest deviations—values around 2 or 3—signal that the Poisson model may not fit well. Here, the estimated dispersion is more than 300 times larger than expected, meaning the variability in cyclist counts is far greater than what a standard Poisson model can accommodate. This level of overdispersion implies that the Poisson model dramatically understates the uncertainty in the data, leading to unreliable standard errors and misleading p-values. Therefore, the quasi-Poisson model, which adjusts for excess variance by scaling the standard errors, is clearly the more appropriate modeling choice for this dataset.

Next, we summarize the inferential statistics about the regression coefficients in the following table.

quasi.model <- glm(ManhattanBridge ~ Day + AvgTemp + NewPrecip, 
                 family = quasipoisson, data = data)  
summary(quasi.model )

Call:
glm(formula = ManhattanBridge ~ Day + AvgTemp + NewPrecip, family = quasipoisson, 
    data = data)

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  6.795837   0.372400  18.249 2.42e-16 ***
Day         -0.003026   0.006578  -0.460 0.649355    
AvgTemp      0.029590   0.006562   4.510 0.000123 ***
NewPrecip   -0.276462   0.113201  -2.442 0.021706 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for quasipoisson family taken to be 326.1148)

    Null deviance: 20980.3  on 29  degrees of freedom
Residual deviance:  8753.9  on 26  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 4
SE.quasi.pois = summary(quasi.model)$coef
kable(SE.quasi.pois, caption = "Summary statistics of quasi-poisson regression model")
Summary statistics of quasi-poisson regression model
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.7958375 0.3724002 18.2487500 0.0000000
Day -0.0030259 0.0065783 -0.4599783 0.6493554
AvgTemp 0.0295903 0.0065617 4.5095289 0.0001227
NewPrecip -0.2764622 0.1132013 -2.4422176 0.0217057

The quasi-Poisson regression results reveal how average temperature, precipitation status, and day-to-day variation influence the number of cyclists crossing the Manhattan Bridge.

The coefficient for Day is small and statistically insignificant (β = −0.0030, p = 0.649), indicating that there is no meaningful day-to-day trend in cyclist counts after accounting for temperature and precipitation. This suggests that long-term or sequential effects are not a major driver of variation in usage during the period studied.

Average temperature (AvgTemp) is a strong positive predictor of cycling activity (β = 0.0296, p < 0.001). Interpreted on the log scale, holding all else constant, each one-degree increase in average temperature raises the expected cyclist count by approximately 3% (since exp(0.0296) ≈ 1.03). This aligns with intuitive expectations that warmer weather encourages more cycling.

The precipitation indicator (NewPrecip) has a significant negative effect on cyclist counts (β = −0.2765, p = 0.022). On days with any precipitation, the expected number of cyclists decreases by about 24% compared to completely dry days (exp(−0.2765) ≈ 0.76). This substantial drop reflects the strong influence of rainfall on cycling behavior.

Overall, the quasi-Poisson model indicates that average temperature and precipitation meaningfully impact Manhattan Bridge cycling counts, while daily trends do not contribute significantly to variation.

The estimated dispersion index is 326.11 based on the Pearson residuals.

In our final model, we will drop Day because it was not statistically significant. We refit the quasi-Poisson model after dropping Day.

quasi.model.02 = glm(ManhattanBridge ~ AvgTemp + NewPrecip, 
                 family = quasipoisson, data = data)

kable(summary(quasi.model.02)$coef, caption = "Inferential statistics of 
the Poisson regression coefficients  in the final working model.")
Inferential statistics of the Poisson regression coefficients in the final working model.
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.8265361 0.3623033 18.842050 0.0000000
AvgTemp 0.0283012 0.0058694 4.821823 0.0000492
NewPrecip -0.2859083 0.1097976 -2.603957 0.0147972

The final quasi-Poisson model indicates that AvgTemp and NewPrecip are both significant predictors of daily cyclist counts on the Manhattan Bridge. AvgTemp has a positive and highly significant effect (Estimate = 0.0283, p < 0.001), meaning warmer days are associated with increased cyclist activity. NewPrecip has a significant negative effect (Estimate = −0.286, p = 0.015), showing that days with any precipitation have substantially lower cyclist counts compared to dry days. Overall, temperature increases cycling activity, while precipitation suppresses it.

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=