1 Introduction

In this project, I will be using both bootstrap sampling methods, bootstrap cases and bootstrap residuals, to find the confidence intervals for my main effects and their interaction term, which are number of Cars Derailed and Track Damage. The problem I am trying to solve is the Equipment Damage in train accidents. I want to see if Track Damage and number of Cars Derailed can predict the amount of Equipment Damage in these accidents.

2 Materials

The data set I chose was Railroad Accidents in the U.S. in 2010. The data was collected via safetydata.fra.dot.gov.

2.1 Description of Data Set

These are all of the variables in the data set. There is sufficient information for addressing the research question because our sample size is very large and we have all of the variables we need. Our “created” variable will be CarsDer:TrkDamg, which is an interaction term between Cars Derailed and Track Damage.

  • Railroad (categorical) - name of railroad
  • Month (categorical)
  • Day (categorical) - days of the week labeled 1 through 7
  • State (categorical)
  • County (categorical)
  • Track Type (categorical)
  • Track Management (categorical)
  • Accident Type (categorical)
  • Accident Cause (categorical)
  • Equipment Damage (numerical) - amount of money spent on damages
  • Track Damage (numerical) - amount of money spent on track repair
  • Killed (numerical) - number of people killed from accident
  • Injured (numerical) - number of people injured from accident
  • RREquip (categorical) - type of train
  • Speed (numerical) - mph the train was going at during impact
  • Locomotives Derailed (numerical) - the number of locomotives derailed
  • Cars Derailed (numerical) - the number of Cars Derailed

2.2 Potential Data Challenges

This data set is from 2010, so these statistics may be outdated. We could face the potential problem of our findings not translating to that of train accidents in 2025.

3 Methodology and Analysis

To begin, I’ll make a pairwise scatter plot of all the numerical variables in order to nail down wihc variables to test. I’ll perform a forward variable selection to make sure all of the necessary variables are used. With this forward selection, I’ll be finding the inferential statistics of my regression coefficients. This allows us to know if all of the variables are statistically significant, and provide us with our multiple linear regression equation. Then, I’ll be performing a residual analysis to determine if the assumptions for normality are met. If the assumptions are not met, I’ll make a Box-Cox transformation to fit the model and I will use bootstrap sampling as a remedy for this. We will then look at different goodness-of-fit measures for my model and make a selection on the final model. With the final model, I’ll perform bootstrap records and bootstrap residuals. We will then compare the results of the regular model and the bootstrap results.

4 Results and Conclusions

In this note, I will be performing all of the appropriate tests that I mentioned above. We will begin with a pairwise scatter plot.

4.1 Pairwise Scatter Plot of Numerical Variables

This scatter plot allows us to nail down which variables to focus in on because we see which ones correlate with Equipment Damage.

library(psych)

# Keep only numeric columns
numData <- myData[, sapply(myData, is.numeric)]

# Pairwise scatterplot
pairs.panels(
  numData,
  pch = 21,
  main = "Pair-wise Scatter Plot of numerical variables",
  cex.main = 1.1
)

The only two variables with a decent correlation with Equipment Damage are Cars Derailed (r = .66) and Track Damage (r = .48). These will be the variables that we perform our forward variable selection with.

4.2 Forward Variable Selection

First, I’ll start by finding the inferential statistics of Track Damage because it was the weakest of the two correlations. The goal is to find if it’s statistically significant and if it’s R-squared is good enough to explain our variation in Equipment Damage.

4.2.1 Track Damage

# Simple Linear Regression
model1 <- lm(EqpDamg ~ TrkDamg, data = myData)

# Summary of the model
summary(model1)

Call:
lm(formula = EqpDamg ~ TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-2243114   -36613   -25161    -8330  3164839 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.516e+04  4.454e+03   7.895 4.24e-15 ***
TrkDamg     1.144e+00  4.121e-02  27.763  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 218500 on 2619 degrees of freedom
Multiple R-squared:  0.2274,    Adjusted R-squared:  0.2271 
F-statistic: 770.8 on 1 and 2619 DF,  p-value: < 2.2e-16

Track Damage is statistically significant. (p = 0). Each dollar of Track Damage increases Equipment Damage by $1.14. We will keep this variable in our model, but we will go ahead and test Cars Derailed as well, because Track Damage only explains 22.74% of the variation in Equipment Damage (R² = 0.2274).

4.2.2 Cars Derailed and Track Damage

Now, we’ll take a look at the inferential statistics of the Cars Derailed variable, with our previous variable.

# Multiple Linear Regression
model2 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)

# Summary of the model
summary(model2)

Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1019731   -48772     9400    32944  3143734 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.988e+04  4.001e+03  -4.968 7.19e-07 ***
CarsDer      2.538e+04  7.260e+02  34.961  < 2e-16 ***
TrkDamg      5.387e-01  3.819e-02  14.108  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 180500 on 2618 degrees of freedom
Multiple R-squared:  0.4733,    Adjusted R-squared:  0.4729 
F-statistic:  1176 on 2 and 2618 DF,  p-value: < 2.2e-16

This model looks better than that of 4.1.1. Both variables are statistically significant, and this new model explains 47.29% of the variation in Equipment Damage (R² = .4729). Each additional car derailed (p = 0) increases Equipment Damage by about $25k on average, holding Track Damage constant. Each dollar of Track Damage (p = 0) increases Equipment Damage by about $0.54 on average, holding Cars Derailed constant.

4.2.3 Main Effects with Interaction Term

There is a possibility that a single derailed car causes more damage if the track is already badly damaged. If that’s the case, then an interaction term would be needed in this model. I am going to perform one last inferential statistics test, this time with an interaction term.

# Model 3: CarsDer + TrkDamg + CarsDer:TrkDamg
model3 <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

# Summary of the model
summary(model3)

Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1084820   -37763    -3774    11799  3144550 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     3.401e+03  3.974e+03   0.856    0.392    
CarsDer         1.735e+04  8.114e+02  21.382   <2e-16 ***
TrkDamg         7.346e-02  4.398e-02   1.670    0.095 .  
CarsDer:TrkDamg 4.165e-02  2.268e-03  18.363   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 169900 on 2617 degrees of freedom
Multiple R-squared:  0.5334,    Adjusted R-squared:  0.5329 
F-statistic: 997.3 on 3 and 2617 DF,  p-value: < 2.2e-16

Our interaction model is definitely the best out of the three. For each additional car derailed (p = 0), Equipment Damage increases by about $17,350 on average, holding Track Damage constant. This is a strong effect.For each dollar of Track Damage (p = .095), Equipment Damage increases by about $0.073 on average, holding Cars Derailed constant. The effect is weak and only borderline significant. The interaction (p = 0) is highly significant. This means the effect of Track Damage on Equipment Damage depends on the number of Cars Derailed (and vice versa). This will be the model we proceed with.

4.3 Residual Analysis

In this section, we’ll be performing a residual analysis with our chosen multiple linear regression (MLR) model.

# Residual diagnostic plots
par(mfrow = c(2,2))
plot(model3)

par(mfrow = c(1,1))  # reset

The Residuals vs Fitted plot does not have a flat red line. Residuals are larger and more spread out at higher fitted values, suggesting heteroscedasticity (not constant variance). There are extreme outliers at 981 and 1858

The residuals in the Q-Q plot deviate strongly from the straight line, especially in the upper tail. This suggests non-normality of the residuals. There are outliers at 793 and 1858.

In the Scale-Location plot, residual spread increases with fitted values, confirming no constant variance once again. The model fits smaller damages better than larger damages.

In the Residuals vs Leverage plot, 77, 1414, and 2586 have high leverage and high residuals. These cases have influence on the model fit.

In summary, the assumptions are not met. The residuals are non-normal, there is not constant variance, and there are influential outliers. It looks like the issue of heteroscedasticity outweighs the issue of the few outliers, so we will perform a Box-Cox transformation to fit the model.

4.4 Box-Cox Transformation

In this note, I’ll create a Box-Cox transformation with Model 3 (the main effects and interaction term). This will stabilize the variance and improve our residuals.

library(MASS)

# Shift the response to make all values positive
myData$EqpDamg_pos <- myData$EqpDamg + abs(min(myData$EqpDamg)) + 1

# Fit Model 3: CarsDer + TrkDamg + interaction
model3_pos <- lm(EqpDamg_pos ~ CarsDer * TrkDamg, data = myData)
# Box-Cox transformation
bc <- boxcox(model3_pos,
             lambda = seq(-2, 2, 0.1),
             lambda.lab = "Lambda",
             ylab = "Log-Likelihood",
             main = "Box-Cox Transformation for Model 3")

# Identify lambda that maximizes log-likelihood
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
[1] 0.2222222

Here is a quick summary of what this plot shows:

  • x-axis (λ): the power transformation applied to your response variable Y

  • y-axis: log-likelihood of the regression model under each λ

  • solid line: shows how well the model fits at each λ.

  • dotted vertical line: the estimated “best” λ (maximizes log-likelihood).

  • horizontal dashed line (95%): confidence interval range — any λ within that range is considered statistically reasonable.

Our result was λ = 0.222. This suggests that the response variable is highly skewed, and a log transformation is necessary. In this next code chunk, we will be applying the transformation and refitting the model.

# Shift the response to make all values positive
myData$EqpDamg_pos <- myData$EqpDamg + abs(min(myData$EqpDamg)) + 1

# Apply Box-Cox transformation with lambda = 0.22
lambda_opt <- 0.22
myData$EqpDamg_trans <- myData$EqpDamg_pos^lambda_opt

# Fit interaction model with transformed response
model3_trans <- lm(EqpDamg_trans ~ CarsDer * TrkDamg, data = myData)

# Model summary
summary(model3_trans)

Call:
lm(formula = EqpDamg_trans ~ CarsDer * TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-25.5956  -1.8140   0.4437   1.9688  18.7263 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      7.047e+00  8.108e-02  86.909  < 2e-16 ***
CarsDer          4.042e-01  1.656e-02  24.414  < 2e-16 ***
TrkDamg          3.508e-06  8.974e-07   3.909 9.52e-05 ***
CarsDer:TrkDamg -2.464e-08  4.628e-08  -0.532    0.594    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.467 on 2617 degrees of freedom
Multiple R-squared:  0.3147,    Adjusted R-squared:  0.3139 
F-statistic: 400.6 on 3 and 2617 DF,  p-value: < 2.2e-16

In our transformed model, our R² is much smaller than the raw model, with 31.29% of the variation in transformed Equipment Damage being explained by the variables. But, our residual standard error, 3.467, is significantly smaller compared to the previous model. All of the coefficients are still significant. Each additional car derailed (p = 0) increases transformed Equipment Damage by about 0.40 units (holding Track Damage constant). Track Damage (p = 0) has a small but statistically significant positive effect on transformed damage. In the transformed model, our interaction term (p = 0.6) is not statistically significant. Despite this term not being significant, we will be keeping it in the model for interpretability purposes. Even though the R² value is much lower, we will stick with this model in order to keep variance stabilized.

4.5 Bootstrap Methods

We will now be using two different bootstrap methods: cases and residuals.

4.5.1 Bootstrap Cases

Let’s run bootstrap cases with the transformed model to find the confidence intervals for our regression coefficients.

## Fit final model (with interaction; remove * if you only want main effects)
mlr_model <- lm(EqpDamg_trans ~ CarsDer * TrkDamg, data = myData)

## Number of bootstrap replicates
B <- 1000       

## Extract dimensions
num.p <- length(coef(mlr_model))  # number of parameters in the model
smpl.n <- nrow(myData)            # sample size

## Zero matrix to store bootstrap coefficients 
coef.mtrx <- matrix(0, nrow = B, ncol = num.p)

## Bootstrap loop
for (i in 1:B){
  bootc.id <- sample(1:smpl.n, smpl.n, replace = TRUE)  # resample cases
  mlr_model_btc <- lm(EqpDamg_trans ~ CarsDer * TrkDamg, 
                      data = myData[bootc.id, ])     
  coef.mtrx[i, ] <- coef(mlr_model_btc)  # store bootstrap coefficients    
}

## Label columns with coefficient names
colnames(coef.mtrx) <- names(coef(mlr_model))

## Save original OLS coefficients
coef_orig <- coef(mlr_model)

## Define histogram function
boot.hist <- function(cmtrx, bt.coef.mtrx, var.id, var.nm){
  x_seq <- seq(min(bt.coef.mtrx[, var.id]),
               max(bt.coef.mtrx[, var.id]), length = 300)

  y_norm <- dnorm(x_seq,
                  mean(bt.coef.mtrx[, var.id]),
                  sd(bt.coef.mtrx[, var.id]))

  highestbar <- max(hist(bt.coef.mtrx[, var.id], plot = FALSE)$density)
  ylimit <- max(c(y_norm, highestbar))

  hist(bt.coef.mtrx[, var.id],
       probability = TRUE,
       main = var.nm,
       xlab = "",
       col = "azure1",
       ylim = c(0, ylimit),
       border = "lightseagreen")

  lines(x_seq, y_norm, col = "red3", lwd = 2)
  lines(density(bt.coef.mtrx[, var.id], adjust = 2), col = "blue", lwd = 2)

  abline(v = cmtrx[var.id], col = "darkgreen", lwd = 2, lty = 2)

  legend("topright",
         legend = c("Normal approx", "Kernel density", "OLS coefficient"),
         col = c("red3", "blue", "darkgreen"),
         lty = c(1,1,2), lwd = 2, bty = "n")
}

## Plot histograms for each coefficient
par(mfrow = c(2,2))  # 2x2 grid for 4 coefficients
boot.hist(coef_orig, coef.mtrx, 1, "Intercept")
boot.hist(coef_orig, coef.mtrx, 2, "CarsDer")
boot.hist(coef_orig, coef.mtrx, 3, "TrkDamg")
boot.hist(coef_orig, coef.mtrx, 4, "CarsDer:TrkDamg")

par(mfrow = c(1,1))  # reset

## Bootstrap confidence intervals
num.p <- ncol(coef.mtrx)
btc.ci <- character(num.p)
btc.wd <- numeric(num.p)

for (i in 1:num.p){
  lci.025 <- quantile(coef.mtrx[, i], 0.025, type = 2)
  uci.975 <- quantile(coef.mtrx[, i], 0.975, type = 2)
  btc.wd[i] <- uci.975 - lci.025
  btc.ci[i] <- paste0("[", round(lci.025, 4), ", ", round(uci.975, 4), "]")
}

btc_results <- data.frame(
  Coefficient = colnames(coef.mtrx),
  Estimate = round(apply(coef.mtrx, 2, mean), 4),
  `95% CI` = btc.ci,
  Width = round(btc.wd, 4)
)

kable(btc_results, caption = "Bootstrap Coefficient Estimates and 95% CIs")
Bootstrap Coefficient Estimates and 95% CIs
Coefficient Estimate X95..CI Width
(Intercept) (Intercept) 7.0283 [6.8055, 7.27] 0.4645
CarsDer CarsDer 0.4097 [0.3234, 0.4879] 0.1645
TrkDamg TrkDamg 0.0000 [0, 0] 0.0000
CarsDer:TrkDamg CarsDer:TrkDamg 0.0000 [0, 0] 0.0000

The bootstrap analysis reinforces the earlier regression results. The intercept is stable, with a narrow 95% confidence interval well above zero, suggesting a reliable baseline level of transformed damage. The number of Cars Derailed is the dominant predictor, with an estimate around 0.41 and a tight confidence interval [0.33, 0.49], providing strong evidence that derailments consistently increase damage. In contrast, Track Damage hows an extremely small effect that rounds to zero in the summary, indicating its influence is negligible compared to Cars Derailed. Likewise, the interaction term’s bootstrap confidence interval collapses to 0, confirming it does not contribute meaningfully. Overall, the bootstrap results highlight that Equipment Damage is driven almost entirely by the number of Cars Derailed, with little to no additional explanatory power from Track Damage or the interaction.

4.5.2 Residual Bootstrap Regression

Now, we will perform the bootstrap regression method, Compared to the cases technique, this method is much more robust. It resamples rows of the data set with replacement.

hist(sort(mlr_model$residuals), n = 40,
     xlab = "Residuals",
     col = "lightblue",
     border = "navy",
     main = "Histogram of Residuals")

Here is the histogram of our residuals. As expected, it is not normally distributed.

## Final model (with interaction; remove * if you only want main effects)
mlr_model <- lm(EqpDamg_trans ~ CarsDer * TrkDamg, data = myData)

## Residuals
model.resid <- mlr_model$residuals

## Number of bootstrap replicates
B <- 1000
num.p <- length(coef(mlr_model))   # number of parameters
samp.n <- nrow(myData)             # sample size

## Zero matrix to store bootstrap coefficients
btr.mtrx <- matrix(0, nrow = B, ncol = num.p)
colnames(btr.mtrx) <- names(coef(mlr_model))

## Bootstrap loop
for (i in 1:B){
  # Bootstrap response values = fitted + resampled residuals
  bt.response <- mlr_model$fitted.values +
                 sample(model.resid, samp.n, replace = TRUE)

  # Add bootstrap response to data
  myData$bt.response <- bt.response

  # Refit model with bootstrap response
  btr.model <- lm(bt.response ~ CarsDer * TrkDamg, data = myData)

  # Store bootstrap coefficients
  btr.mtrx[i, ] <- coef(btr.model)
}

## Inspect results
head(btr.mtrx)
     (Intercept)   CarsDer      TrkDamg CarsDer:TrkDamg
[1,]    6.963507 0.4278439 4.468685e-06   -8.602684e-08
[2,]    6.892562 0.4313595 2.316918e-06   -1.209087e-08
[3,]    7.104123 0.4295606 2.657571e-06   -4.243206e-08
[4,]    7.215222 0.3905643 2.615681e-06    1.940970e-08
[5,]    7.035613 0.4097809 4.631840e-06   -8.736683e-08
[6,]    7.026921 0.4023421 3.482149e-06   -7.678797e-10
apply(btr.mtrx, 2, mean)   # bootstrap mean estimates
    (Intercept)         CarsDer         TrkDamg CarsDer:TrkDamg 
   7.046363e+00    4.046779e-01    3.518416e-06   -2.475642e-08 
apply(btr.mtrx, 2, sd)     # bootstrap standard errors
    (Intercept)         CarsDer         TrkDamg CarsDer:TrkDamg 
   8.019326e-02    1.641608e-02    9.145254e-07    4.724174e-08 
boot.hist <- function(bt.coef.mtrx, var.id, var.nm){
  ## bt.coef.mtrx = matrix of bootstrap coefficient estimates
  ## var.id = column index of coefficient (1 = Intercept, 2 = CarsDer, etc.)
  ## var.nm = variable name for plot title

  # sequence for normal curve
  x_seq <- seq(min(bt.coef.mtrx[, var.id]),
               max(bt.coef.mtrx[, var.id]),
               length = 300)

  # normal density based on bootstrap mean and sd
  y_norm <- dnorm(x_seq,
                  mean(bt.coef.mtrx[, var.id]),
                  sd(bt.coef.mtrx[, var.id]))

  # determine y-axis limit
  highestbar <- max(hist(bt.coef.mtrx[, var.id], plot = FALSE)$density)
  ylimit <- max(c(y_norm, highestbar))

  # histogram
  hist(bt.coef.mtrx[, var.id],
       probability = TRUE,
       main = var.nm,
       xlab = "",
       col = "azure1",
       ylim = c(0, ylimit),
       border = "lightseagreen")

  # add normal density curve
  lines(x_seq, y_norm, col = "red3", lwd = 2)

  # add kernel density curve
  lines(density(bt.coef.mtrx[, var.id], adjust = 2),
        col = "blue", lwd = 2)
}
par(mfrow = c(2,2))  # 2x2 grid for 4 coefficients
boot.hist(bt.coef.mtrx = btr.mtrx, var.id = 1, var.nm = "Intercept")
boot.hist(bt.coef.mtrx = btr.mtrx, var.id = 2, var.nm = "CarsDer")
boot.hist(bt.coef.mtrx = btr.mtrx, var.id = 3, var.nm = "TrkDamg")
boot.hist(bt.coef.mtrx = btr.mtrx, var.id = 4, var.nm = "CarsDer:TrkDamg")

par(mfrow = c(1,1))  # reset layout

The bootstrap histograms indicate that the model’s coefficient estimates are stable across resamples. The intercept is centered near 7, providing a consistent baseline for the transformed measure of Equipment Damage. The coefficient for CarsDer is tightly clustered around 0.40, reinforcing that the number of Cars Derailed is the primary and most reliable predictor of damage. In contrast, the coefficient for TrkDamg is very close to zero, and the interaction term (CarsDer:TrkDamg) is also centered at zero, suggesting that these variables do not contribute meaningfully once CarsDer is included. Overall, the bootstrap results confirm that Equipment Damage is driven mainly by the number of derailed cars, while Track Damage and its interaction with CarsDer have little to no explanatory value. Let’s finish off our boostrapping with regression confidence intervals.

## number of parameters (coefficients)
num.p <- ncol(btr.mtrx)

## store CIs and widths
btr.ci <- character(num.p)
btr.wd <- numeric(num.p)

for (i in 1:num.p){
  lci.025 <- quantile(btr.mtrx[, i], 0.025, type = 2)
  uci.975 <- quantile(btr.mtrx[, i], 0.975, type = 2)
  btr.wd[i] <- uci.975 - lci.025
  btr.ci[i] <- paste0("[", round(lci.025, 4), ", ", round(uci.975, 4), "]")
}

## original OLS coefficients
coef_orig <- coef(mlr_model)

## results table
btr_results <- data.frame(
  Coefficient = names(coef_orig),
  Estimate = round(coef_orig, 4),
  `95% CI` = btr.ci,
  Width = round(btr.wd, 4)
)

kable(btr_results, caption = "Regression Coefficients with 95% Residual Bootstrap CI")
Regression Coefficients with 95% Residual Bootstrap CI
Coefficient Estimate X95..CI Width
(Intercept) (Intercept) 7.0467 [6.8948, 7.2126] 0.3178
CarsDer CarsDer 0.4042 [0.3705, 0.4359] 0.0654
TrkDamg TrkDamg 0.0000 [0, 0] 0.0000
CarsDer:TrkDamg CarsDer:TrkDamg 0.0000 [0, 0] 0.0000

The residual bootstrap results confirm the main findings of your model. The intercept is estimated at about 7.05, with a fairly narrow 95% confidence interval [6.89, 7.21], showing it is stable and well estimated. The coefficient for CarsDer is also highly precise, averaging around 0.40 with a very tight confidence interval [0.37, 0.44]; this reinforces that the number of Cars Derailed is the strongest and most reliable predictor of Equipment Damage. In contrast, both TrkDamg and the CarsDer:TrkDamg interaction collapse to zero, with their bootstrap confidence intervals also equal to [0, 0], meaning they provide no meaningful explanatory power in this model. Overall, the residual bootstrap analysis underscores that Equipment Damage is overwhelmingly explained by the number of derailed cars, while Track Damage and its interaction contribute essentially nothing once CarsDer is included.

#5 Combining and Comparing

Now that we’ve created a handful of models, let’s put all the inferential statistics into a single table and compare.

## OLS coefficients with p-values
cmtrx <- summary(mlr_model)$coefficients  # Estimate, Std. Error, t value, Pr(>|t|)

## Combine with bootstrap CIs
final_results <- cbind(
  round(cmtrx, 4),                # OLS inferential stats
  `Case Bootstrap 95% CI` = btc.ci,
  `Residual Bootstrap 95% CI` = btr.ci
)

## Output clean table
kable(as.data.frame(final_results),
      caption = "Final Combined Inferential Statistics: p-values and Bootstrap CIs")
Final Combined Inferential Statistics: p-values and Bootstrap CIs
Estimate Std. Error t value Pr(>|t|) Case Bootstrap 95% CI Residual Bootstrap 95% CI
(Intercept) 7.0467 0.0811 86.9086 0 [6.8055, 7.27] [6.8948, 7.2126]
CarsDer 0.4042 0.0166 24.4144 0 [0.3234, 0.4879] [0.3705, 0.4359]
TrkDamg 0 0 3.9086 1e-04 [0, 0] [0, 0]
CarsDer:TrkDamg 0 0 -0.5324 0.5945 [0, 0] [0, 0]

This combined table shows how the classical regression results and both bootstrap approaches line up. The intercept is highly significant (t = 86.9, p < 0.001), with both the case bootstrap CI [6.81, 7.28] and residual bootstrap CI [6.89, 7.21] confirming a stable and positive baseline for transformed Equipment Damage. The coefficient for Cars Derailed is also very strong and precise (estimate ≈ 0.40, t = 24.4, p < 0.001), and both bootstrap methods give tight confidence intervals that exclude zero, reinforcing it as the key predictor. By contrast, Track Damage has a small but statistically significant t-test result (p = 0.0001), yet both bootstrap methods collapse its confidence interval to [0, 0], suggesting the classical test may be picking up noise rather than a meaningful effect. Finally, the Cars Derailed × Track Damage interaction is clearly not significant (p = 0.59) and both bootstrap CIs confirm it contributes nothing. Overall, all three inferential approaches converge on the conclusion that Cars Derailed is the only variable with a consistent and meaningful effect, while Track Damage and its interaction with derailments are negligible once the model is properly checked with bootstrapping.

6 Conclusion

The main finding of this project is that Equipment Damage in train accidents is overwhelmingly explained by the number of Cars Derailed. Both traditional regression and bootstrap methods confirmed that Cars Derailed is a highly significant predictor with tight confidence intervals, while Track Damage and its interaction with derailments consistently collapsed to zero in the bootstrap analysis. This means that, although Track Damage shows a weak effect in classical tests, it does not meaningfully improve prediction once more robust methods are used.

A drawback of this analysis is that the data are from 2010, meaning the findings may not fully represent the current landscape of train accidents. In addition, the models are limited to the variables available in the dataset and do not account for other potential factors such as maintenance practices, weather, or train load. Residual analysis also showed influential outliers and evidence of heteroscedasticity, which led us to a Box-Cox transformation. While this improved variance stabilization, it came at the cost of a lower R², showing that some complexity in the data remains unexplained. Future work could improve the model by incorporating more recent data, testing additional predictors, and exploring nonlinear or mixed-effects approaches to better capture variability.

In terms of application, this model can be used to help rail safety analysts and policymakers prioritize accident prevention and resource allocation. Since the number of Cars Derailed is the clearest driver of Equipment Damage, mitigation strategies should focus on reducing derailments, such as through improved inspection protocols, better track maintenance, and enhanced braking systems. Although Track Damage itself was not a reliable predictor in this study, it remains an important cost component in practice, so combining predictive models with engineering assessments could give decision-makers a fuller picture. Overall, the analysis shows how statistical modeling can inform data-driven strategies to minimize losses from train accidents.

7 References

safetydata.fra.dot.gov

LS0tDQp0aXRsZTogIkNhbiBUcmFjayBEYW1hZ2UgYW5kIENhcnMgRGVyYWlsZWQgUHJlZGljdCBFcXVpcG1lbnQgRGFtYWdlIGluIFRyYWluIEFjY2lkZW50cz8iDQphdXRob3I6ICJMdWtlIFZvbG0iDQpkYXRlOiAiMjAyNS0wOS0yOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vICAgIyBudW1iZXJpbmcgc2VjdGlvbiBoZWFkaW5ncw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcyAgICAgIyBUT0Mgc3ViaGVhZGluZyBjb2xsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgIyBhbGxvdyB0byBkb3dubG9hZCBjb21wbGV0ZSBSTWFya2Rvd24gc291cmNlIGNvZGUNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMgICAgICMgc2Nyb2xsaW5nIHRleHQgb2YgdGhlIGRvY3VtZW50DQogICAgdGhlbWU6IGx1bWVuICAgICAgICAgICAjIHZpc3VhbCB0aGVtZSBmb3IgSFRNTCBkb2N1bWVudCBvbmx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbyAgICAgICAjIGNvZGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGJvb3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCg0KIyBTZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IE9OQ0UNCnNldHdkKCJDOi9Vc2Vycy92b2xtMS9PbmVEcml2ZS9EZXNrdG9wL1NUQTMyMSBuZXciKQ0KDQojIFJlYWQgaW4gZGF0YSAoZHJvcCBmaXJzdCBjb2x1bW4gaWYgaXQncyBqdXN0IGFuIGluZGV4L0lEKQ0KbXlEYXRhIDwtIHJlYWRfZXhjZWwoInRyYWluX2FjY18yMDEwICgxKS54bHMiKQ0KbXlkYXRhIDwtIG15RGF0YVssIC0xXQ0KDQojIEdsb2JhbCBjaHVuayBvcHRpb25zDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLCAgICAgICMgc2hvdyBjb2RlDQogIHdhcm5pbmcgPSBGQUxTRSwgICMgc3VwcHJlc3Mgd2FybmluZ3MNCiAgbWVzc2FnZSA9IEZBTFNFLCAgIyBzdXBwcmVzcyBtZXNzYWdlcw0KICByZXN1bHRzID0gVFJVRSwgICAjIHNob3cgcmVzdWx0cw0KICBjb21tZW50ID0gTkEgICAgICAjIGNsZWFuZXIgb3V0cHV0IChubyAiIyMiIHByZWZpeCkNCikNCmBgYA0KDQoNCiMgMSBJbnRyb2R1Y3Rpb24NCg0KSW4gdGhpcyBwcm9qZWN0LCBJIHdpbGwgYmUgdXNpbmcgYm90aCBib290c3RyYXAgc2FtcGxpbmcgbWV0aG9kcywgYm9vdHN0cmFwIGNhc2VzIGFuZCBib290c3RyYXAgcmVzaWR1YWxzLCB0byBmaW5kIHRoZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgbXkgbWFpbiBlZmZlY3RzIGFuZCB0aGVpciBpbnRlcmFjdGlvbiB0ZXJtLCB3aGljaCBhcmUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZS4gVGhlIHByb2JsZW0gSSBhbSB0cnlpbmcgdG8gc29sdmUgaXMgdGhlIEVxdWlwbWVudCBEYW1hZ2UgaW4gdHJhaW4gYWNjaWRlbnRzLiBJIHdhbnQgdG8gc2VlIGlmIFRyYWNrIERhbWFnZSBhbmQgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgY2FuIHByZWRpY3QgdGhlIGFtb3VudCBvZiBFcXVpcG1lbnQgRGFtYWdlIGluIHRoZXNlIGFjY2lkZW50cy4gDQoNCiMgMiBNYXRlcmlhbHMNCg0KVGhlIGRhdGEgc2V0IEkgY2hvc2Ugd2FzIFJhaWxyb2FkIEFjY2lkZW50cyBpbiB0aGUgVS5TLiBpbiAyMDEwLiBUaGUgZGF0YSB3YXMgY29sbGVjdGVkIHZpYSBzYWZldHlkYXRhLmZyYS5kb3QuZ292Lg0KDQojIyAyLjEgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KVGhlc2UgYXJlIGFsbCBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldC4gVGhlcmUgaXMgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBmb3IgYWRkcmVzc2luZyB0aGUgcmVzZWFyY2ggcXVlc3Rpb24gYmVjYXVzZSBvdXIgc2FtcGxlIHNpemUgaXMgdmVyeSBsYXJnZSBhbmQgd2UgaGF2ZSBhbGwgb2YgdGhlIHZhcmlhYmxlcyB3ZSBuZWVkLiBPdXIgImNyZWF0ZWQiIHZhcmlhYmxlIHdpbGwgYmUgQ2Fyc0RlcjpUcmtEYW1nLCB3aGljaCBpcyBhbiBpbnRlcmFjdGlvbiB0ZXJtIGJldHdlZW4gQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlLg0KDQogKiBSYWlscm9hZCAoY2F0ZWdvcmljYWwpIC0gbmFtZSBvZiByYWlscm9hZA0KICAqIE1vbnRoIChjYXRlZ29yaWNhbCkNCiAgKiBEYXkgKGNhdGVnb3JpY2FsKSAtIGRheXMgb2YgdGhlIHdlZWsgbGFiZWxlZCAxIHRocm91Z2ggNw0KICAqIFN0YXRlIChjYXRlZ29yaWNhbCkNCiAgKiBDb3VudHkgKGNhdGVnb3JpY2FsKQ0KICAqIFRyYWNrIFR5cGUgKGNhdGVnb3JpY2FsKQ0KICAqIFRyYWNrIE1hbmFnZW1lbnQgKGNhdGVnb3JpY2FsKQ0KICAqIEFjY2lkZW50IFR5cGUgKGNhdGVnb3JpY2FsKQ0KICAqIEFjY2lkZW50IENhdXNlIChjYXRlZ29yaWNhbCkNCiAgKiBFcXVpcG1lbnQgRGFtYWdlIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIGRhbWFnZXMNCiAgKiBUcmFjayBEYW1hZ2UgKG51bWVyaWNhbCkgLSBhbW91bnQgb2YgbW9uZXkgc3BlbnQgb24gdHJhY2sgcmVwYWlyDQogICogS2lsbGVkIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBraWxsZWQgZnJvbSBhY2NpZGVudA0KICAqIEluanVyZWQgKG51bWVyaWNhbCkgLSBudW1iZXIgb2YgcGVvcGxlIGluanVyZWQgZnJvbSBhY2NpZGVudA0KICAqIFJSRXF1aXAgKGNhdGVnb3JpY2FsKSAtIHR5cGUgb2YgdHJhaW4NCiAgKiBTcGVlZCAobnVtZXJpY2FsKSAtIG1waCB0aGUgdHJhaW4gd2FzIGdvaW5nIGF0IGR1cmluZyBpbXBhY3QNCiAgKiBMb2NvbW90aXZlcyBEZXJhaWxlZCAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgbG9jb21vdGl2ZXMgZGVyYWlsZWQNCiAgKiBDYXJzIERlcmFpbGVkIChudW1lcmljYWwpIC0gdGhlIG51bWJlciBvZiBDYXJzIERlcmFpbGVkDQogIA0KIyMgMi4yIFBvdGVudGlhbCBEYXRhIENoYWxsZW5nZXMNCg0KVGhpcyBkYXRhIHNldCBpcyBmcm9tIDIwMTAsIHNvIHRoZXNlIHN0YXRpc3RpY3MgbWF5IGJlIG91dGRhdGVkLiBXZSBjb3VsZCBmYWNlIHRoZSBwb3RlbnRpYWwgcHJvYmxlbSBvZiBvdXIgZmluZGluZ3Mgbm90IHRyYW5zbGF0aW5nIHRvIHRoYXQgb2YgdHJhaW4gYWNjaWRlbnRzIGluIDIwMjUuDQoNCiMgMyBNZXRob2RvbG9neSBhbmQgQW5hbHlzaXMNCg0KVG8gYmVnaW4sIEknbGwgbWFrZSBhIHBhaXJ3aXNlIHNjYXR0ZXIgcGxvdCBvZiBhbGwgdGhlIG51bWVyaWNhbCB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gbmFpbCBkb3duIHdpaGMgdmFyaWFibGVzIHRvIHRlc3QuIEknbGwgcGVyZm9ybSBhIGZvcndhcmQgdmFyaWFibGUgc2VsZWN0aW9uIHRvIG1ha2Ugc3VyZSBhbGwgb2YgdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgYXJlIHVzZWQuIFdpdGggdGhpcyBmb3J3YXJkIHNlbGVjdGlvbiwgSSdsbCBiZSBmaW5kaW5nIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIG15IHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLiBUaGlzIGFsbG93cyB1cyB0byBrbm93IGlmIGFsbCBvZiB0aGUgdmFyaWFibGVzIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBhbmQgcHJvdmlkZSB1cyB3aXRoIG91ciBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBlcXVhdGlvbi4gVGhlbiwgSSdsbCBiZSBwZXJmb3JtaW5nIGEgcmVzaWR1YWwgYW5hbHlzaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhc3N1bXB0aW9ucyBmb3Igbm9ybWFsaXR5IGFyZSBtZXQuIElmIHRoZSBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldCwgSSdsbCBtYWtlIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiB0byBmaXQgdGhlIG1vZGVsIGFuZCBJIHdpbGwgdXNlIGJvb3RzdHJhcCBzYW1wbGluZyBhcyBhIHJlbWVkeSBmb3IgdGhpcy4gV2Ugd2lsbCB0aGVuIGxvb2sgYXQgZGlmZmVyZW50IGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBmb3IgbXkgbW9kZWwgYW5kIG1ha2UgYSBzZWxlY3Rpb24gb24gdGhlIGZpbmFsIG1vZGVsLiBXaXRoIHRoZSBmaW5hbCBtb2RlbCwgSSdsbCBwZXJmb3JtIGJvb3RzdHJhcCByZWNvcmRzIGFuZCBib290c3RyYXAgcmVzaWR1YWxzLiBXZSB3aWxsIHRoZW4gY29tcGFyZSB0aGUgcmVzdWx0cyBvZiB0aGUgcmVndWxhciBtb2RlbCBhbmQgdGhlIGJvb3RzdHJhcCByZXN1bHRzLiANCg0KIyA0IFJlc3VsdHMgYW5kIENvbmNsdXNpb25zDQoNCkluIHRoaXMgbm90ZSwgSSB3aWxsIGJlIHBlcmZvcm1pbmcgYWxsIG9mIHRoZSBhcHByb3ByaWF0ZSB0ZXN0cyB0aGF0IEkgbWVudGlvbmVkIGFib3ZlLiBXZSB3aWxsIGJlZ2luIHdpdGggYSBwYWlyd2lzZSBzY2F0dGVyIHBsb3QuDQoNCiMjIDQuMSBQYWlyd2lzZSBTY2F0dGVyIFBsb3Qgb2YgTnVtZXJpY2FsIFZhcmlhYmxlcw0KDQpUaGlzIHNjYXR0ZXIgcGxvdCBhbGxvd3MgdXMgdG8gbmFpbCBkb3duIHdoaWNoIHZhcmlhYmxlcyB0byBmb2N1cyBpbiBvbiBiZWNhdXNlIHdlIHNlZSB3aGljaCBvbmVzIGNvcnJlbGF0ZSB3aXRoIEVxdWlwbWVudCBEYW1hZ2UuIA0KDQpgYGB7ciBwYWlyd2lzZSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQ0KbGlicmFyeShwc3ljaCkNCg0KIyBLZWVwIG9ubHkgbnVtZXJpYyBjb2x1bW5zDQpudW1EYXRhIDwtIG15RGF0YVssIHNhcHBseShteURhdGEsIGlzLm51bWVyaWMpXQ0KDQojIFBhaXJ3aXNlIHNjYXR0ZXJwbG90DQpwYWlycy5wYW5lbHMoDQogIG51bURhdGEsDQogIHBjaCA9IDIxLA0KICBtYWluID0gIlBhaXItd2lzZSBTY2F0dGVyIFBsb3Qgb2YgbnVtZXJpY2FsIHZhcmlhYmxlcyIsDQogIGNleC5tYWluID0gMS4xDQopDQpgYGANCg0KVGhlIG9ubHkgdHdvIHZhcmlhYmxlcyB3aXRoIGEgZGVjZW50IGNvcnJlbGF0aW9uIHdpdGggRXF1aXBtZW50IERhbWFnZSBhcmUgQ2FycyBEZXJhaWxlZCAociA9IC42NikgYW5kIFRyYWNrIERhbWFnZSAociA9IC40OCkuIFRoZXNlIHdpbGwgYmUgdGhlIHZhcmlhYmxlcyB0aGF0IHdlIHBlcmZvcm0gb3VyIGZvcndhcmQgdmFyaWFibGUgc2VsZWN0aW9uIHdpdGguDQoNCiMjIDQuMiBGb3J3YXJkIFZhcmlhYmxlIFNlbGVjdGlvbg0KDQpGaXJzdCwgSSdsbCBzdGFydCBieSBmaW5kaW5nIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIFRyYWNrIERhbWFnZSBiZWNhdXNlIGl0IHdhcyB0aGUgd2Vha2VzdCBvZiB0aGUgdHdvIGNvcnJlbGF0aW9ucy4gVGhlIGdvYWwgaXMgdG8gZmluZCBpZiBpdCdzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYW5kIGlmIGl0J3MgUi1zcXVhcmVkIGlzIGdvb2QgZW5vdWdoIHRvIGV4cGxhaW4gb3VyIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlLiANCg0KIyMjIDQuMi4xIFRyYWNrIERhbWFnZQ0KDQpgYGB7cn0NCiMgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uDQptb2RlbDEgPC0gbG0oRXFwRGFtZyB+IFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwxKQ0KYGBgDQoNClRyYWNrIERhbWFnZSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiAocCA9IDApLiBFYWNoIGRvbGxhciBvZiBUcmFjayBEYW1hZ2UgaW5jcmVhc2VzIEVxdWlwbWVudCBEYW1hZ2UgYnkgJDEuMTQuIFdlIHdpbGwga2VlcCB0aGlzIHZhcmlhYmxlIGluIG91ciBtb2RlbCwgYnV0IHdlIHdpbGwgZ28gYWhlYWQgYW5kIHRlc3QgQ2FycyBEZXJhaWxlZCBhcyB3ZWxsLCBiZWNhdXNlIFRyYWNrIERhbWFnZSBvbmx5IGV4cGxhaW5zIDIyLjc0JSBvZiB0aGUgdmFyaWF0aW9uIGluIEVxdWlwbWVudCBEYW1hZ2UgKFLCsiA9IDAuMjI3NCkuDQoNCiMjIyA0LjIuMiBDYXJzIERlcmFpbGVkIGFuZCBUcmFjayBEYW1hZ2UNCg0KTm93LCB3ZSdsbCB0YWtlIGEgbG9vayBhdCB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyBvZiB0aGUgQ2FycyBEZXJhaWxlZCB2YXJpYWJsZSwgd2l0aCBvdXIgcHJldmlvdXMgdmFyaWFibGUuDQoNCmBgYHtyfQ0KIyBNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbg0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBTdW1tYXJ5IG9mIHRoZSBtb2RlbA0Kc3VtbWFyeShtb2RlbDIpDQpgYGANCg0KVGhpcyBtb2RlbCBsb29rcyBiZXR0ZXIgdGhhbiB0aGF0IG9mIDQuMS4xLiBCb3RoIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYW5kIHRoaXMgbmV3IG1vZGVsIGV4cGxhaW5zIDQ3LjI5JSBvZiB0aGUgdmFyaWF0aW9uIGluIEVxdWlwbWVudCBEYW1hZ2UgKFLCsiA9IC40NzI5KS4gRWFjaCBhZGRpdGlvbmFsIGNhciBkZXJhaWxlZCAocCA9IDApIGluY3JlYXNlcyBFcXVpcG1lbnQgRGFtYWdlIGJ5IGFib3V0IFwkMjVrIG9uIGF2ZXJhZ2UsIGhvbGRpbmcgVHJhY2sgRGFtYWdlIGNvbnN0YW50LiBFYWNoIGRvbGxhciBvZiBUcmFjayBEYW1hZ2UgKHAgPSAwKSBpbmNyZWFzZXMgRXF1aXBtZW50IERhbWFnZSBieSBhYm91dCAkMC41NCBvbiBhdmVyYWdlLCBob2xkaW5nIENhcnMgRGVyYWlsZWQgY29uc3RhbnQuDQoNCiMjIyA0LjIuMyBNYWluIEVmZmVjdHMgd2l0aCBJbnRlcmFjdGlvbiBUZXJtDQoNClRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHNpbmdsZSBkZXJhaWxlZCBjYXIgY2F1c2VzIG1vcmUgZGFtYWdlIGlmIHRoZSB0cmFjayBpcyBhbHJlYWR5IGJhZGx5IGRhbWFnZWQuIElmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiBhbiBpbnRlcmFjdGlvbiB0ZXJtIHdvdWxkIGJlIG5lZWRlZCBpbiB0aGlzIG1vZGVsLiBJIGFtIGdvaW5nIHRvIHBlcmZvcm0gb25lIGxhc3QgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyB0ZXN0LCB0aGlzIHRpbWUgd2l0aCBhbiBpbnRlcmFjdGlvbiB0ZXJtLiANCg0KYGBge3J9DQojIE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nDQptb2RlbDMgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMykNCmBgYA0KDQpPdXIgaW50ZXJhY3Rpb24gbW9kZWwgaXMgZGVmaW5pdGVseSB0aGUgYmVzdCBvdXQgb2YgdGhlIHRocmVlLiBGb3IgZWFjaCBhZGRpdGlvbmFsIGNhciBkZXJhaWxlZCAocCA9IDApLCBFcXVpcG1lbnQgRGFtYWdlIGluY3JlYXNlcyBieSBhYm91dCBcJDE3LDM1MCBvbiBhdmVyYWdlLCBob2xkaW5nIFRyYWNrIERhbWFnZSBjb25zdGFudC4gVGhpcyBpcyBhIHN0cm9uZyBlZmZlY3QuRm9yIGVhY2ggZG9sbGFyIG9mIFRyYWNrIERhbWFnZSAocCA9IC4wOTUpLCBFcXVpcG1lbnQgRGFtYWdlIGluY3JlYXNlcyBieSBhYm91dCAkMC4wNzMgb24gYXZlcmFnZSwgaG9sZGluZyBDYXJzIERlcmFpbGVkIGNvbnN0YW50LiBUaGUgZWZmZWN0IGlzIHdlYWsgYW5kIG9ubHkgYm9yZGVybGluZSBzaWduaWZpY2FudC4gVGhlIGludGVyYWN0aW9uIChwID0gMCkgaXMgaGlnaGx5IHNpZ25pZmljYW50LiBUaGlzIG1lYW5zIHRoZSBlZmZlY3Qgb2YgVHJhY2sgRGFtYWdlIG9uIEVxdWlwbWVudCBEYW1hZ2UgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgKGFuZCB2aWNlIHZlcnNhKS4gVGhpcyB3aWxsIGJlIHRoZSBtb2RlbCB3ZSBwcm9jZWVkIHdpdGguDQoNCiMjIDQuMyBSZXNpZHVhbCBBbmFseXNpcw0KDQpJbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIGJlIHBlcmZvcm1pbmcgYSByZXNpZHVhbCBhbmFseXNpcyB3aXRoIG91ciBjaG9zZW4gbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gKE1MUikgbW9kZWwuIA0KDQpgYGB7cn0NCiMgUmVzaWR1YWwgZGlhZ25vc3RpYyBwbG90cw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDMpDQpwYXIobWZyb3cgPSBjKDEsMSkpICAjIHJlc2V0DQpgYGANCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBkb2VzIG5vdCBoYXZlIGEgZmxhdCByZWQgbGluZS4gUmVzaWR1YWxzIGFyZSBsYXJnZXIgYW5kIG1vcmUgc3ByZWFkIG91dCBhdCBoaWdoZXIgZml0dGVkIHZhbHVlcywgc3VnZ2VzdGluZyBoZXRlcm9zY2VkYXN0aWNpdHkgKG5vdCBjb25zdGFudCB2YXJpYW5jZSkuIFRoZXJlIGFyZSBleHRyZW1lIG91dGxpZXJzIGF0IDk4MSBhbmQgMTg1OA0KDQpUaGUgcmVzaWR1YWxzIGluIHRoZSBRLVEgcGxvdCBkZXZpYXRlIHN0cm9uZ2x5IGZyb20gdGhlIHN0cmFpZ2h0IGxpbmUsIGVzcGVjaWFsbHkgaW4gdGhlIHVwcGVyIHRhaWwuIFRoaXMgc3VnZ2VzdHMgbm9uLW5vcm1hbGl0eSBvZiB0aGUgcmVzaWR1YWxzLiBUaGVyZSBhcmUgb3V0bGllcnMgYXQgNzkzIGFuZCAxODU4LiANCg0KSW4gdGhlIFNjYWxlLUxvY2F0aW9uIHBsb3QsIHJlc2lkdWFsIHNwcmVhZCBpbmNyZWFzZXMgd2l0aCBmaXR0ZWQgdmFsdWVzLCBjb25maXJtaW5nIG5vIGNvbnN0YW50IHZhcmlhbmNlIG9uY2UgYWdhaW4uIFRoZSBtb2RlbCBmaXRzIHNtYWxsZXIgZGFtYWdlcyBiZXR0ZXIgdGhhbiBsYXJnZXIgZGFtYWdlcy4NCg0KSW4gdGhlIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBwbG90LCA3NywgMTQxNCwgYW5kIDI1ODYgaGF2ZSBoaWdoIGxldmVyYWdlIGFuZCBoaWdoIHJlc2lkdWFscy4gVGhlc2UgY2FzZXMgaGF2ZSBpbmZsdWVuY2Ugb24gdGhlIG1vZGVsIGZpdC4NCg0KSW4gc3VtbWFyeSwgdGhlIGFzc3VtcHRpb25zIGFyZSBub3QgbWV0LiBUaGUgcmVzaWR1YWxzIGFyZSBub24tbm9ybWFsLCB0aGVyZSBpcyBub3QgY29uc3RhbnQgdmFyaWFuY2UsIGFuZCB0aGVyZSBhcmUgaW5mbHVlbnRpYWwgb3V0bGllcnMuIEl0IGxvb2tzIGxpa2UgdGhlIGlzc3VlIG9mIGhldGVyb3NjZWRhc3RpY2l0eSBvdXR3ZWlnaHMgdGhlIGlzc3VlIG9mIHRoZSBmZXcgb3V0bGllcnMsIHNvIHdlIHdpbGwgcGVyZm9ybSBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24gdG8gZml0IHRoZSBtb2RlbC4gDQoNCiMjIDQuNCBCb3gtQ294IFRyYW5zZm9ybWF0aW9uDQoNCkluIHRoaXMgbm90ZSwgSSdsbCBjcmVhdGUgYSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uIHdpdGggTW9kZWwgMyAodGhlIG1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb24gdGVybSkuIFRoaXMgd2lsbCBzdGFiaWxpemUgdGhlIHZhcmlhbmNlIGFuZCBpbXByb3ZlIG91ciByZXNpZHVhbHMuIA0KDQpgYGB7cn0NCg0KbGlicmFyeShNQVNTKQ0KDQojIFNoaWZ0IHRoZSByZXNwb25zZSB0byBtYWtlIGFsbCB2YWx1ZXMgcG9zaXRpdmUNCm15RGF0YSRFcXBEYW1nX3BvcyA8LSBteURhdGEkRXFwRGFtZyArIGFicyhtaW4obXlEYXRhJEVxcERhbWcpKSArIDENCg0KIyBGaXQgTW9kZWwgMzogQ2Fyc0RlciArIFRya0RhbWcgKyBpbnRlcmFjdGlvbg0KbW9kZWwzX3BvcyA8LSBsbShFcXBEYW1nX3BvcyB+IENhcnNEZXIgKiBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KIyBCb3gtQ294IHRyYW5zZm9ybWF0aW9uDQpiYyA8LSBib3hjb3gobW9kZWwzX3BvcywNCiAgICAgICAgICAgICBsYW1iZGEgPSBzZXEoLTIsIDIsIDAuMSksDQogICAgICAgICAgICAgbGFtYmRhLmxhYiA9ICJMYW1iZGEiLA0KICAgICAgICAgICAgIHlsYWIgPSAiTG9nLUxpa2VsaWhvb2QiLA0KICAgICAgICAgICAgIG1haW4gPSAiQm94LUNveCBUcmFuc2Zvcm1hdGlvbiBmb3IgTW9kZWwgMyIpDQoNCiMgSWRlbnRpZnkgbGFtYmRhIHRoYXQgbWF4aW1pemVzIGxvZy1saWtlbGlob29kDQpsYW1iZGFfb3B0IDwtIGJjJHhbd2hpY2gubWF4KGJjJHkpXQ0KbGFtYmRhX29wdA0KYGBgDQoNCkhlcmUgaXMgYSBxdWljayBzdW1tYXJ5IG9mIHdoYXQgdGhpcyBwbG90IHNob3dzOg0KDQoqIHgtYXhpcyAozrspOiB0aGUgcG93ZXIgdHJhbnNmb3JtYXRpb24gYXBwbGllZCB0byB5b3VyIHJlc3BvbnNlIHZhcmlhYmxlIFkNCg0KKiB5LWF4aXM6IGxvZy1saWtlbGlob29kIG9mIHRoZSByZWdyZXNzaW9uIG1vZGVsIHVuZGVyIGVhY2ggzrsNCg0KKiBzb2xpZCBsaW5lOiBzaG93cyBob3cgd2VsbCB0aGUgbW9kZWwgZml0cyBhdCBlYWNoIM67Lg0KDQoqIGRvdHRlZCB2ZXJ0aWNhbCBsaW5lOiB0aGUgZXN0aW1hdGVkIOKAnGJlc3TigJ0gzrsgKG1heGltaXplcyBsb2ctbGlrZWxpaG9vZCkuDQoNCiogaG9yaXpvbnRhbCBkYXNoZWQgbGluZSAoOTUlKTogY29uZmlkZW5jZSBpbnRlcnZhbCByYW5nZSDigJQgYW55IM67IHdpdGhpbiB0aGF0IHJhbmdlIGlzIGNvbnNpZGVyZWQgc3RhdGlzdGljYWxseSByZWFzb25hYmxlLg0KDQpPdXIgcmVzdWx0IHdhcyDOuyA9IDAuMjIyLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGhpZ2hseSBza2V3ZWQsIGFuZCBhIGxvZyB0cmFuc2Zvcm1hdGlvbiBpcyBuZWNlc3NhcnkuIEluIHRoaXMgbmV4dCBjb2RlIGNodW5rLCB3ZSB3aWxsIGJlIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBhbmQgcmVmaXR0aW5nIHRoZSBtb2RlbC4gDQoNCmBgYHtyfQ0KDQojIFNoaWZ0IHRoZSByZXNwb25zZSB0byBtYWtlIGFsbCB2YWx1ZXMgcG9zaXRpdmUNCm15RGF0YSRFcXBEYW1nX3BvcyA8LSBteURhdGEkRXFwRGFtZyArIGFicyhtaW4obXlEYXRhJEVxcERhbWcpKSArIDENCg0KIyBBcHBseSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uIHdpdGggbGFtYmRhID0gMC4yMg0KbGFtYmRhX29wdCA8LSAwLjIyDQpteURhdGEkRXFwRGFtZ190cmFucyA8LSBteURhdGEkRXFwRGFtZ19wb3NebGFtYmRhX29wdA0KDQojIEZpdCBpbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHRyYW5zZm9ybWVkIHJlc3BvbnNlDQptb2RlbDNfdHJhbnMgPC0gbG0oRXFwRGFtZ190cmFucyB+IENhcnNEZXIgKiBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIE1vZGVsIHN1bW1hcnkNCnN1bW1hcnkobW9kZWwzX3RyYW5zKQ0KYGBgDQoNCkluIG91ciB0cmFuc2Zvcm1lZCBtb2RlbCwgb3VyIFLCsiBpcyBtdWNoIHNtYWxsZXIgdGhhbiB0aGUgcmF3IG1vZGVsLCB3aXRoIDMxLjI5JSBvZiB0aGUgdmFyaWF0aW9uIGluIHRyYW5zZm9ybWVkIEVxdWlwbWVudCBEYW1hZ2UgYmVpbmcgZXhwbGFpbmVkIGJ5IHRoZSB2YXJpYWJsZXMuIEJ1dCwgb3VyIHJlc2lkdWFsIHN0YW5kYXJkIGVycm9yLCAzLjQ2NywgaXMgc2lnbmlmaWNhbnRseSBzbWFsbGVyIGNvbXBhcmVkIHRvIHRoZSBwcmV2aW91cyBtb2RlbC4gQWxsIG9mIHRoZSBjb2VmZmljaWVudHMgYXJlIHN0aWxsIHNpZ25pZmljYW50LiBFYWNoIGFkZGl0aW9uYWwgY2FyIGRlcmFpbGVkIChwID0gMCkgaW5jcmVhc2VzIHRyYW5zZm9ybWVkIEVxdWlwbWVudCBEYW1hZ2UgYnkgYWJvdXQgMC40MCB1bml0cyAoaG9sZGluZyBUcmFjayBEYW1hZ2UgY29uc3RhbnQpLiBUcmFjayBEYW1hZ2UgKHAgPSAwKSBoYXMgYSBzbWFsbCBidXQgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwb3NpdGl2ZSBlZmZlY3Qgb24gdHJhbnNmb3JtZWQgZGFtYWdlLiBJbiB0aGUgdHJhbnNmb3JtZWQgbW9kZWwsIG91ciBpbnRlcmFjdGlvbiB0ZXJtIChwID0gMC42KSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gRGVzcGl0ZSB0aGlzIHRlcm0gbm90IGJlaW5nIHNpZ25pZmljYW50LCB3ZSB3aWxsIGJlIGtlZXBpbmcgaXQgaW4gdGhlIG1vZGVsIGZvciBpbnRlcnByZXRhYmlsaXR5IHB1cnBvc2VzLiBFdmVuIHRob3VnaCB0aGUgUsKyIHZhbHVlIGlzIG11Y2ggbG93ZXIsIHdlIHdpbGwgc3RpY2sgd2l0aCB0aGlzIG1vZGVsIGluIG9yZGVyIHRvIGtlZXAgdmFyaWFuY2Ugc3RhYmlsaXplZC4gDQoNCiMjIDQuNSBCb290c3RyYXAgTWV0aG9kcw0KDQpXZSB3aWxsIG5vdyBiZSB1c2luZyB0d28gZGlmZmVyZW50IGJvb3RzdHJhcCBtZXRob2RzOiBjYXNlcyBhbmQgcmVzaWR1YWxzLiANCg0KIyMjIDQuNS4xIEJvb3RzdHJhcCBDYXNlcw0KDQpMZXQncyBydW4gYm9vdHN0cmFwIGNhc2VzIHdpdGggdGhlIHRyYW5zZm9ybWVkIG1vZGVsIHRvIGZpbmQgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBvdXIgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIA0KDQpgYGB7cn0NCiMjIEZpdCBmaW5hbCBtb2RlbCAod2l0aCBpbnRlcmFjdGlvbjsgcmVtb3ZlICogaWYgeW91IG9ubHkgd2FudCBtYWluIGVmZmVjdHMpDQptbHJfbW9kZWwgPC0gbG0oRXFwRGFtZ190cmFucyB+IENhcnNEZXIgKiBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIyBOdW1iZXIgb2YgYm9vdHN0cmFwIHJlcGxpY2F0ZXMNCkIgPC0gMTAwMCAgICAgICANCg0KIyMgRXh0cmFjdCBkaW1lbnNpb25zDQpudW0ucCA8LSBsZW5ndGgoY29lZihtbHJfbW9kZWwpKSAgIyBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgbW9kZWwNCnNtcGwubiA8LSBucm93KG15RGF0YSkgICAgICAgICAgICAjIHNhbXBsZSBzaXplDQoNCiMjIFplcm8gbWF0cml4IHRvIHN0b3JlIGJvb3RzdHJhcCBjb2VmZmljaWVudHMgDQpjb2VmLm10cnggPC0gbWF0cml4KDAsIG5yb3cgPSBCLCBuY29sID0gbnVtLnApDQoNCiMjIEJvb3RzdHJhcCBsb29wDQpmb3IgKGkgaW4gMTpCKXsNCiAgYm9vdGMuaWQgPC0gc2FtcGxlKDE6c21wbC5uLCBzbXBsLm4sIHJlcGxhY2UgPSBUUlVFKSAgIyByZXNhbXBsZSBjYXNlcw0KICBtbHJfbW9kZWxfYnRjIDwtIGxtKEVxcERhbWdfdHJhbnMgfiBDYXJzRGVyICogVHJrRGFtZywgDQogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG15RGF0YVtib290Yy5pZCwgXSkgICAgIA0KICBjb2VmLm10cnhbaSwgXSA8LSBjb2VmKG1scl9tb2RlbF9idGMpICAjIHN0b3JlIGJvb3RzdHJhcCBjb2VmZmljaWVudHMgICAgDQp9DQoNCiMjIExhYmVsIGNvbHVtbnMgd2l0aCBjb2VmZmljaWVudCBuYW1lcw0KY29sbmFtZXMoY29lZi5tdHJ4KSA8LSBuYW1lcyhjb2VmKG1scl9tb2RlbCkpDQoNCiMjIFNhdmUgb3JpZ2luYWwgT0xTIGNvZWZmaWNpZW50cw0KY29lZl9vcmlnIDwtIGNvZWYobWxyX21vZGVsKQ0KDQojIyBEZWZpbmUgaGlzdG9ncmFtIGZ1bmN0aW9uDQpib290Lmhpc3QgPC0gZnVuY3Rpb24oY210cngsIGJ0LmNvZWYubXRyeCwgdmFyLmlkLCB2YXIubm0pew0KICB4X3NlcSA8LSBzZXEobWluKGJ0LmNvZWYubXRyeFssIHZhci5pZF0pLA0KICAgICAgICAgICAgICAgbWF4KGJ0LmNvZWYubXRyeFssIHZhci5pZF0pLCBsZW5ndGggPSAzMDApDQoNCiAgeV9ub3JtIDwtIGRub3JtKHhfc2VxLA0KICAgICAgICAgICAgICAgICAgbWVhbihidC5jb2VmLm10cnhbLCB2YXIuaWRdKSwNCiAgICAgICAgICAgICAgICAgIHNkKGJ0LmNvZWYubXRyeFssIHZhci5pZF0pKQ0KDQogIGhpZ2hlc3RiYXIgPC0gbWF4KGhpc3QoYnQuY29lZi5tdHJ4WywgdmFyLmlkXSwgcGxvdCA9IEZBTFNFKSRkZW5zaXR5KQ0KICB5bGltaXQgPC0gbWF4KGMoeV9ub3JtLCBoaWdoZXN0YmFyKSkNCg0KICBoaXN0KGJ0LmNvZWYubXRyeFssIHZhci5pZF0sDQogICAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICAgIG1haW4gPSB2YXIubm0sDQogICAgICAgeGxhYiA9ICIiLA0KICAgICAgIGNvbCA9ICJhenVyZTEiLA0KICAgICAgIHlsaW0gPSBjKDAsIHlsaW1pdCksDQogICAgICAgYm9yZGVyID0gImxpZ2h0c2VhZ3JlZW4iKQ0KDQogIGxpbmVzKHhfc2VxLCB5X25vcm0sIGNvbCA9ICJyZWQzIiwgbHdkID0gMikNCiAgbGluZXMoZGVuc2l0eShidC5jb2VmLm10cnhbLCB2YXIuaWRdLCBhZGp1c3QgPSAyKSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQogIGFibGluZSh2ID0gY210cnhbdmFyLmlkXSwgY29sID0gImRhcmtncmVlbiIsIGx3ZCA9IDIsIGx0eSA9IDIpDQoNCiAgbGVnZW5kKCJ0b3ByaWdodCIsDQogICAgICAgICBsZWdlbmQgPSBjKCJOb3JtYWwgYXBwcm94IiwgIktlcm5lbCBkZW5zaXR5IiwgIk9MUyBjb2VmZmljaWVudCIpLA0KICAgICAgICAgY29sID0gYygicmVkMyIsICJibHVlIiwgImRhcmtncmVlbiIpLA0KICAgICAgICAgbHR5ID0gYygxLDEsMiksIGx3ZCA9IDIsIGJ0eSA9ICJuIikNCn0NCg0KIyMgUGxvdCBoaXN0b2dyYW1zIGZvciBlYWNoIGNvZWZmaWNpZW50DQpwYXIobWZyb3cgPSBjKDIsMikpICAjIDJ4MiBncmlkIGZvciA0IGNvZWZmaWNpZW50cw0KYm9vdC5oaXN0KGNvZWZfb3JpZywgY29lZi5tdHJ4LCAxLCAiSW50ZXJjZXB0IikNCmJvb3QuaGlzdChjb2VmX29yaWcsIGNvZWYubXRyeCwgMiwgIkNhcnNEZXIiKQ0KYm9vdC5oaXN0KGNvZWZfb3JpZywgY29lZi5tdHJ4LCAzLCAiVHJrRGFtZyIpDQpib290Lmhpc3QoY29lZl9vcmlnLCBjb2VmLm10cngsIDQsICJDYXJzRGVyOlRya0RhbWciKQ0KcGFyKG1mcm93ID0gYygxLDEpKSAgIyByZXNldA0KDQojIyBCb290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMNCm51bS5wIDwtIG5jb2woY29lZi5tdHJ4KQ0KYnRjLmNpIDwtIGNoYXJhY3RlcihudW0ucCkNCmJ0Yy53ZCA8LSBudW1lcmljKG51bS5wKQ0KDQpmb3IgKGkgaW4gMTpudW0ucCl7DQogIGxjaS4wMjUgPC0gcXVhbnRpbGUoY29lZi5tdHJ4WywgaV0sIDAuMDI1LCB0eXBlID0gMikNCiAgdWNpLjk3NSA8LSBxdWFudGlsZShjb2VmLm10cnhbLCBpXSwgMC45NzUsIHR5cGUgPSAyKQ0KICBidGMud2RbaV0gPC0gdWNpLjk3NSAtIGxjaS4wMjUNCiAgYnRjLmNpW2ldIDwtIHBhc3RlMCgiWyIsIHJvdW5kKGxjaS4wMjUsIDQpLCAiLCAiLCByb3VuZCh1Y2kuOTc1LCA0KSwgIl0iKQ0KfQ0KDQpidGNfcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBDb2VmZmljaWVudCA9IGNvbG5hbWVzKGNvZWYubXRyeCksDQogIEVzdGltYXRlID0gcm91bmQoYXBwbHkoY29lZi5tdHJ4LCAyLCBtZWFuKSwgNCksDQogIGA5NSUgQ0lgID0gYnRjLmNpLA0KICBXaWR0aCA9IHJvdW5kKGJ0Yy53ZCwgNCkNCikNCg0Ka2FibGUoYnRjX3Jlc3VsdHMsIGNhcHRpb24gPSAiQm9vdHN0cmFwIENvZWZmaWNpZW50IEVzdGltYXRlcyBhbmQgOTUlIENJcyIpDQpgYGANCg0KVGhlIGJvb3RzdHJhcCBhbmFseXNpcyByZWluZm9yY2VzIHRoZSBlYXJsaWVyIHJlZ3Jlc3Npb24gcmVzdWx0cy4gVGhlIGludGVyY2VwdCBpcyBzdGFibGUsIHdpdGggYSBuYXJyb3cgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgd2VsbCBhYm92ZSB6ZXJvLCBzdWdnZXN0aW5nIGEgcmVsaWFibGUgYmFzZWxpbmUgbGV2ZWwgb2YgdHJhbnNmb3JtZWQgZGFtYWdlLiBUaGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgaXMgdGhlIGRvbWluYW50IHByZWRpY3Rvciwgd2l0aCBhbiBlc3RpbWF0ZSBhcm91bmQgMC40MSBhbmQgYSB0aWdodCBjb25maWRlbmNlIGludGVydmFsIFswLjMzLCAwLjQ5XSwgcHJvdmlkaW5nIHN0cm9uZyBldmlkZW5jZSB0aGF0IGRlcmFpbG1lbnRzIGNvbnNpc3RlbnRseSBpbmNyZWFzZSBkYW1hZ2UuIEluIGNvbnRyYXN0LCBUcmFjayBEYW1hZ2UgaG93cyBhbiBleHRyZW1lbHkgc21hbGwgZWZmZWN0IHRoYXQgcm91bmRzIHRvIHplcm8gaW4gdGhlIHN1bW1hcnksIGluZGljYXRpbmcgaXRzIGluZmx1ZW5jZSBpcyBuZWdsaWdpYmxlIGNvbXBhcmVkIHRvIENhcnMgRGVyYWlsZWQuIExpa2V3aXNlLCB0aGUgaW50ZXJhY3Rpb24gdGVybSdzIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIGNvbGxhcHNlcyB0byAwLCBjb25maXJtaW5nIGl0IGRvZXMgbm90IGNvbnRyaWJ1dGUgbWVhbmluZ2Z1bGx5LiBPdmVyYWxsLCB0aGUgYm9vdHN0cmFwIHJlc3VsdHMgaGlnaGxpZ2h0IHRoYXQgRXF1aXBtZW50IERhbWFnZSBpcyBkcml2ZW4gYWxtb3N0IGVudGlyZWx5IGJ5IHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZCwgd2l0aCBsaXR0bGUgdG8gbm8gYWRkaXRpb25hbCBleHBsYW5hdG9yeSBwb3dlciBmcm9tIFRyYWNrIERhbWFnZSBvciB0aGUgaW50ZXJhY3Rpb24uDQoNCiMjIyA0LjUuMiBSZXNpZHVhbCBCb290c3RyYXAgUmVncmVzc2lvbg0KDQpOb3csIHdlIHdpbGwgcGVyZm9ybSB0aGUgYm9vdHN0cmFwIHJlZ3Jlc3Npb24gbWV0aG9kLCBDb21wYXJlZCB0byB0aGUgY2FzZXMgdGVjaG5pcXVlLCB0aGlzIG1ldGhvZCBpcyBtdWNoIG1vcmUgcm9idXN0LiBJdCByZXNhbXBsZXMgcm93cyBvZiB0aGUgZGF0YSBzZXQgd2l0aCByZXBsYWNlbWVudC4gDQoNCmBgYHtyfQ0KDQpoaXN0KHNvcnQobWxyX21vZGVsJHJlc2lkdWFscyksIG4gPSA0MCwNCiAgICAgeGxhYiA9ICJSZXNpZHVhbHMiLA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgYm9yZGVyID0gIm5hdnkiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBvZiBSZXNpZHVhbHMiKQ0KYGBgDQoNCkhlcmUgaXMgdGhlIGhpc3RvZ3JhbSBvZiBvdXIgcmVzaWR1YWxzLiBBcyBleHBlY3RlZCwgaXQgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KDQpgYGB7cn0NCg0KIyMgRmluYWwgbW9kZWwgKHdpdGggaW50ZXJhY3Rpb247IHJlbW92ZSAqIGlmIHlvdSBvbmx5IHdhbnQgbWFpbiBlZmZlY3RzKQ0KbWxyX21vZGVsIDwtIGxtKEVxcERhbWdfdHJhbnMgfiBDYXJzRGVyICogVHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyMgUmVzaWR1YWxzDQptb2RlbC5yZXNpZCA8LSBtbHJfbW9kZWwkcmVzaWR1YWxzDQoNCiMjIE51bWJlciBvZiBib290c3RyYXAgcmVwbGljYXRlcw0KQiA8LSAxMDAwDQpudW0ucCA8LSBsZW5ndGgoY29lZihtbHJfbW9kZWwpKSAgICMgbnVtYmVyIG9mIHBhcmFtZXRlcnMNCnNhbXAubiA8LSBucm93KG15RGF0YSkgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZQ0KDQojIyBaZXJvIG1hdHJpeCB0byBzdG9yZSBib290c3RyYXAgY29lZmZpY2llbnRzDQpidHIubXRyeCA8LSBtYXRyaXgoMCwgbnJvdyA9IEIsIG5jb2wgPSBudW0ucCkNCmNvbG5hbWVzKGJ0ci5tdHJ4KSA8LSBuYW1lcyhjb2VmKG1scl9tb2RlbCkpDQoNCiMjIEJvb3RzdHJhcCBsb29wDQpmb3IgKGkgaW4gMTpCKXsNCiAgIyBCb290c3RyYXAgcmVzcG9uc2UgdmFsdWVzID0gZml0dGVkICsgcmVzYW1wbGVkIHJlc2lkdWFscw0KICBidC5yZXNwb25zZSA8LSBtbHJfbW9kZWwkZml0dGVkLnZhbHVlcyArDQogICAgICAgICAgICAgICAgIHNhbXBsZShtb2RlbC5yZXNpZCwgc2FtcC5uLCByZXBsYWNlID0gVFJVRSkNCg0KICAjIEFkZCBib290c3RyYXAgcmVzcG9uc2UgdG8gZGF0YQ0KICBteURhdGEkYnQucmVzcG9uc2UgPC0gYnQucmVzcG9uc2UNCg0KICAjIFJlZml0IG1vZGVsIHdpdGggYm9vdHN0cmFwIHJlc3BvbnNlDQogIGJ0ci5tb2RlbCA8LSBsbShidC5yZXNwb25zZSB+IENhcnNEZXIgKiBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQogICMgU3RvcmUgYm9vdHN0cmFwIGNvZWZmaWNpZW50cw0KICBidHIubXRyeFtpLCBdIDwtIGNvZWYoYnRyLm1vZGVsKQ0KfQ0KDQojIyBJbnNwZWN0IHJlc3VsdHMNCmhlYWQoYnRyLm10cngpDQphcHBseShidHIubXRyeCwgMiwgbWVhbikgICAjIGJvb3RzdHJhcCBtZWFuIGVzdGltYXRlcw0KYXBwbHkoYnRyLm10cngsIDIsIHNkKSAgICAgIyBib290c3RyYXAgc3RhbmRhcmQgZXJyb3JzDQpib290Lmhpc3QgPC0gZnVuY3Rpb24oYnQuY29lZi5tdHJ4LCB2YXIuaWQsIHZhci5ubSl7DQogICMjIGJ0LmNvZWYubXRyeCA9IG1hdHJpeCBvZiBib290c3RyYXAgY29lZmZpY2llbnQgZXN0aW1hdGVzDQogICMjIHZhci5pZCA9IGNvbHVtbiBpbmRleCBvZiBjb2VmZmljaWVudCAoMSA9IEludGVyY2VwdCwgMiA9IENhcnNEZXIsIGV0Yy4pDQogICMjIHZhci5ubSA9IHZhcmlhYmxlIG5hbWUgZm9yIHBsb3QgdGl0bGUNCg0KICAjIHNlcXVlbmNlIGZvciBub3JtYWwgY3VydmUNCiAgeF9zZXEgPC0gc2VxKG1pbihidC5jb2VmLm10cnhbLCB2YXIuaWRdKSwNCiAgICAgICAgICAgICAgIG1heChidC5jb2VmLm10cnhbLCB2YXIuaWRdKSwNCiAgICAgICAgICAgICAgIGxlbmd0aCA9IDMwMCkNCg0KICAjIG5vcm1hbCBkZW5zaXR5IGJhc2VkIG9uIGJvb3RzdHJhcCBtZWFuIGFuZCBzZA0KICB5X25vcm0gPC0gZG5vcm0oeF9zZXEsDQogICAgICAgICAgICAgICAgICBtZWFuKGJ0LmNvZWYubXRyeFssIHZhci5pZF0pLA0KICAgICAgICAgICAgICAgICAgc2QoYnQuY29lZi5tdHJ4WywgdmFyLmlkXSkpDQoNCiAgIyBkZXRlcm1pbmUgeS1heGlzIGxpbWl0DQogIGhpZ2hlc3RiYXIgPC0gbWF4KGhpc3QoYnQuY29lZi5tdHJ4WywgdmFyLmlkXSwgcGxvdCA9IEZBTFNFKSRkZW5zaXR5KQ0KICB5bGltaXQgPC0gbWF4KGMoeV9ub3JtLCBoaWdoZXN0YmFyKSkNCg0KICAjIGhpc3RvZ3JhbQ0KICBoaXN0KGJ0LmNvZWYubXRyeFssIHZhci5pZF0sDQogICAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICAgIG1haW4gPSB2YXIubm0sDQogICAgICAgeGxhYiA9ICIiLA0KICAgICAgIGNvbCA9ICJhenVyZTEiLA0KICAgICAgIHlsaW0gPSBjKDAsIHlsaW1pdCksDQogICAgICAgYm9yZGVyID0gImxpZ2h0c2VhZ3JlZW4iKQ0KDQogICMgYWRkIG5vcm1hbCBkZW5zaXR5IGN1cnZlDQogIGxpbmVzKHhfc2VxLCB5X25vcm0sIGNvbCA9ICJyZWQzIiwgbHdkID0gMikNCg0KICAjIGFkZCBrZXJuZWwgZGVuc2l0eSBjdXJ2ZQ0KICBsaW5lcyhkZW5zaXR5KGJ0LmNvZWYubXRyeFssIHZhci5pZF0sIGFkanVzdCA9IDIpLA0KICAgICAgICBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIpDQp9DQpwYXIobWZyb3cgPSBjKDIsMikpICAjIDJ4MiBncmlkIGZvciA0IGNvZWZmaWNpZW50cw0KYm9vdC5oaXN0KGJ0LmNvZWYubXRyeCA9IGJ0ci5tdHJ4LCB2YXIuaWQgPSAxLCB2YXIubm0gPSAiSW50ZXJjZXB0IikNCmJvb3QuaGlzdChidC5jb2VmLm10cnggPSBidHIubXRyeCwgdmFyLmlkID0gMiwgdmFyLm5tID0gIkNhcnNEZXIiKQ0KYm9vdC5oaXN0KGJ0LmNvZWYubXRyeCA9IGJ0ci5tdHJ4LCB2YXIuaWQgPSAzLCB2YXIubm0gPSAiVHJrRGFtZyIpDQpib290Lmhpc3QoYnQuY29lZi5tdHJ4ID0gYnRyLm10cngsIHZhci5pZCA9IDQsIHZhci5ubSA9ICJDYXJzRGVyOlRya0RhbWciKQ0KcGFyKG1mcm93ID0gYygxLDEpKSAgIyByZXNldCBsYXlvdXQNCmBgYA0KDQpUaGUgYm9vdHN0cmFwIGhpc3RvZ3JhbXMgaW5kaWNhdGUgdGhhdCB0aGUgbW9kZWzigJlzIGNvZWZmaWNpZW50IGVzdGltYXRlcyBhcmUgc3RhYmxlIGFjcm9zcyByZXNhbXBsZXMuIFRoZSBpbnRlcmNlcHQgaXMgY2VudGVyZWQgbmVhciA3LCBwcm92aWRpbmcgYSBjb25zaXN0ZW50IGJhc2VsaW5lIGZvciB0aGUgdHJhbnNmb3JtZWQgbWVhc3VyZSBvZiBFcXVpcG1lbnQgRGFtYWdlLiBUaGUgY29lZmZpY2llbnQgZm9yIENhcnNEZXIgaXMgdGlnaHRseSBjbHVzdGVyZWQgYXJvdW5kIDAuNDAsIHJlaW5mb3JjaW5nIHRoYXQgdGhlIG51bWJlciBvZiBDYXJzIERlcmFpbGVkIGlzIHRoZSBwcmltYXJ5IGFuZCBtb3N0IHJlbGlhYmxlIHByZWRpY3RvciBvZiBkYW1hZ2UuIEluIGNvbnRyYXN0LCB0aGUgY29lZmZpY2llbnQgZm9yIFRya0RhbWcgaXMgdmVyeSBjbG9zZSB0byB6ZXJvLCBhbmQgdGhlIGludGVyYWN0aW9uIHRlcm0gKENhcnNEZXI6VHJrRGFtZykgaXMgYWxzbyBjZW50ZXJlZCBhdCB6ZXJvLCBzdWdnZXN0aW5nIHRoYXQgdGhlc2UgdmFyaWFibGVzIGRvIG5vdCBjb250cmlidXRlIG1lYW5pbmdmdWxseSBvbmNlIENhcnNEZXIgaXMgaW5jbHVkZWQuIE92ZXJhbGwsIHRoZSBib290c3RyYXAgcmVzdWx0cyBjb25maXJtIHRoYXQgRXF1aXBtZW50IERhbWFnZSBpcyBkcml2ZW4gbWFpbmx5IGJ5IHRoZSBudW1iZXIgb2YgZGVyYWlsZWQgY2Fycywgd2hpbGUgVHJhY2sgRGFtYWdlIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBDYXJzRGVyIGhhdmUgbGl0dGxlIHRvIG5vIGV4cGxhbmF0b3J5IHZhbHVlLiBMZXQncyBmaW5pc2ggb2ZmIG91ciBib29zdHJhcHBpbmcgd2l0aCByZWdyZXNzaW9uIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLg0KDQpgYGB7cn0NCiMjIG51bWJlciBvZiBwYXJhbWV0ZXJzIChjb2VmZmljaWVudHMpDQpudW0ucCA8LSBuY29sKGJ0ci5tdHJ4KQ0KDQojIyBzdG9yZSBDSXMgYW5kIHdpZHRocw0KYnRyLmNpIDwtIGNoYXJhY3RlcihudW0ucCkNCmJ0ci53ZCA8LSBudW1lcmljKG51bS5wKQ0KDQpmb3IgKGkgaW4gMTpudW0ucCl7DQogIGxjaS4wMjUgPC0gcXVhbnRpbGUoYnRyLm10cnhbLCBpXSwgMC4wMjUsIHR5cGUgPSAyKQ0KICB1Y2kuOTc1IDwtIHF1YW50aWxlKGJ0ci5tdHJ4WywgaV0sIDAuOTc1LCB0eXBlID0gMikNCiAgYnRyLndkW2ldIDwtIHVjaS45NzUgLSBsY2kuMDI1DQogIGJ0ci5jaVtpXSA8LSBwYXN0ZTAoIlsiLCByb3VuZChsY2kuMDI1LCA0KSwgIiwgIiwgcm91bmQodWNpLjk3NSwgNCksICJdIikNCn0NCg0KIyMgb3JpZ2luYWwgT0xTIGNvZWZmaWNpZW50cw0KY29lZl9vcmlnIDwtIGNvZWYobWxyX21vZGVsKQ0KDQojIyByZXN1bHRzIHRhYmxlDQpidHJfcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBDb2VmZmljaWVudCA9IG5hbWVzKGNvZWZfb3JpZyksDQogIEVzdGltYXRlID0gcm91bmQoY29lZl9vcmlnLCA0KSwNCiAgYDk1JSBDSWAgPSBidHIuY2ksDQogIFdpZHRoID0gcm91bmQoYnRyLndkLCA0KQ0KKQ0KDQprYWJsZShidHJfcmVzdWx0cywgY2FwdGlvbiA9ICJSZWdyZXNzaW9uIENvZWZmaWNpZW50cyB3aXRoIDk1JSBSZXNpZHVhbCBCb290c3RyYXAgQ0kiKQ0KYGBgDQoNClRoZSByZXNpZHVhbCBib290c3RyYXAgcmVzdWx0cyBjb25maXJtIHRoZSBtYWluIGZpbmRpbmdzIG9mIHlvdXIgbW9kZWwuIFRoZSBpbnRlcmNlcHQgaXMgZXN0aW1hdGVkIGF0IGFib3V0IDcuMDUsIHdpdGggYSBmYWlybHkgbmFycm93IDk1JSBjb25maWRlbmNlIGludGVydmFsIFs2Ljg5LCA3LjIxXSwgc2hvd2luZyBpdCBpcyBzdGFibGUgYW5kIHdlbGwgZXN0aW1hdGVkLiBUaGUgY29lZmZpY2llbnQgZm9yIENhcnNEZXIgaXMgYWxzbyBoaWdobHkgcHJlY2lzZSwgYXZlcmFnaW5nIGFyb3VuZCAwLjQwIHdpdGggYSB2ZXJ5IHRpZ2h0IGNvbmZpZGVuY2UgaW50ZXJ2YWwgWzAuMzcsIDAuNDRdOyB0aGlzIHJlaW5mb3JjZXMgdGhhdCB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgaXMgdGhlIHN0cm9uZ2VzdCBhbmQgbW9zdCByZWxpYWJsZSBwcmVkaWN0b3Igb2YgRXF1aXBtZW50IERhbWFnZS4gSW4gY29udHJhc3QsIGJvdGggVHJrRGFtZyBhbmQgdGhlIENhcnNEZXI6VHJrRGFtZyBpbnRlcmFjdGlvbiBjb2xsYXBzZSB0byB6ZXJvLCB3aXRoIHRoZWlyIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBhbHNvIGVxdWFsIHRvIFswLCAwXSwgbWVhbmluZyB0aGV5IHByb3ZpZGUgbm8gbWVhbmluZ2Z1bCBleHBsYW5hdG9yeSBwb3dlciBpbiB0aGlzIG1vZGVsLiBPdmVyYWxsLCB0aGUgcmVzaWR1YWwgYm9vdHN0cmFwIGFuYWx5c2lzIHVuZGVyc2NvcmVzIHRoYXQgRXF1aXBtZW50IERhbWFnZSBpcyBvdmVyd2hlbG1pbmdseSBleHBsYWluZWQgYnkgdGhlIG51bWJlciBvZiBkZXJhaWxlZCBjYXJzLCB3aGlsZSBUcmFjayBEYW1hZ2UgYW5kIGl0cyBpbnRlcmFjdGlvbiBjb250cmlidXRlIGVzc2VudGlhbGx5IG5vdGhpbmcgb25jZSBDYXJzRGVyIGlzIGluY2x1ZGVkLg0KDQojNSBDb21iaW5pbmcgYW5kIENvbXBhcmluZw0KDQpOb3cgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgaGFuZGZ1bCBvZiBtb2RlbHMsIGxldCdzIHB1dCBhbGwgdGhlIGluZmVyZW50aWFsIHN0YXRpc3RpY3MgaW50byBhIHNpbmdsZSB0YWJsZSBhbmQgY29tcGFyZS4gDQoNCmBgYHtyfQ0KIyMgT0xTIGNvZWZmaWNpZW50cyB3aXRoIHAtdmFsdWVzDQpjbXRyeCA8LSBzdW1tYXJ5KG1scl9tb2RlbCkkY29lZmZpY2llbnRzICAjIEVzdGltYXRlLCBTdGQuIEVycm9yLCB0IHZhbHVlLCBQcig+fHR8KQ0KDQojIyBDb21iaW5lIHdpdGggYm9vdHN0cmFwIENJcw0KZmluYWxfcmVzdWx0cyA8LSBjYmluZCgNCiAgcm91bmQoY210cngsIDQpLCAgICAgICAgICAgICAgICAjIE9MUyBpbmZlcmVudGlhbCBzdGF0cw0KICBgQ2FzZSBCb290c3RyYXAgOTUlIENJYCA9IGJ0Yy5jaSwNCiAgYFJlc2lkdWFsIEJvb3RzdHJhcCA5NSUgQ0lgID0gYnRyLmNpDQopDQoNCiMjIE91dHB1dCBjbGVhbiB0YWJsZQ0Ka2FibGUoYXMuZGF0YS5mcmFtZShmaW5hbF9yZXN1bHRzKSwNCiAgICAgIGNhcHRpb24gPSAiRmluYWwgQ29tYmluZWQgSW5mZXJlbnRpYWwgU3RhdGlzdGljczogcC12YWx1ZXMgYW5kIEJvb3RzdHJhcCBDSXMiKQ0KYGBgDQoNClRoaXMgY29tYmluZWQgdGFibGUgc2hvd3MgaG93IHRoZSBjbGFzc2ljYWwgcmVncmVzc2lvbiByZXN1bHRzIGFuZCBib3RoIGJvb3RzdHJhcCBhcHByb2FjaGVzIGxpbmUgdXAuIFRoZSBpbnRlcmNlcHQgaXMgaGlnaGx5IHNpZ25pZmljYW50ICh0ID0gODYuOSwgcCA8IDAuMDAxKSwgd2l0aCBib3RoIHRoZSBjYXNlIGJvb3RzdHJhcCBDSSBbNi44MSwgNy4yOF0gYW5kIHJlc2lkdWFsIGJvb3RzdHJhcCBDSSBbNi44OSwgNy4yMV0gY29uZmlybWluZyBhIHN0YWJsZSBhbmQgcG9zaXRpdmUgYmFzZWxpbmUgZm9yIHRyYW5zZm9ybWVkIEVxdWlwbWVudCBEYW1hZ2UuIFRoZSBjb2VmZmljaWVudCBmb3IgQ2FycyBEZXJhaWxlZCBpcyBhbHNvIHZlcnkgc3Ryb25nIGFuZCBwcmVjaXNlIChlc3RpbWF0ZSDiiYggMC40MCwgdCA9IDI0LjQsIHAgPCAwLjAwMSksIGFuZCBib3RoIGJvb3RzdHJhcCBtZXRob2RzIGdpdmUgdGlnaHQgY29uZmlkZW5jZSBpbnRlcnZhbHMgdGhhdCBleGNsdWRlIHplcm8sIHJlaW5mb3JjaW5nIGl0IGFzIHRoZSBrZXkgcHJlZGljdG9yLiBCeSBjb250cmFzdCwgVHJhY2sgRGFtYWdlIGhhcyBhIHNtYWxsIGJ1dCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHQtdGVzdCByZXN1bHQgKHAgPSAwLjAwMDEpLCB5ZXQgYm90aCBib290c3RyYXAgbWV0aG9kcyBjb2xsYXBzZSBpdHMgY29uZmlkZW5jZSBpbnRlcnZhbCB0byBbMCwgMF0sIHN1Z2dlc3RpbmcgdGhlIGNsYXNzaWNhbCB0ZXN0IG1heSBiZSBwaWNraW5nIHVwIG5vaXNlIHJhdGhlciB0aGFuIGEgbWVhbmluZ2Z1bCBlZmZlY3QuIEZpbmFsbHksIHRoZSBDYXJzIERlcmFpbGVkIMOXIFRyYWNrIERhbWFnZSBpbnRlcmFjdGlvbiBpcyBjbGVhcmx5IG5vdCBzaWduaWZpY2FudCAocCA9IDAuNTkpIGFuZCBib3RoIGJvb3RzdHJhcCBDSXMgY29uZmlybSBpdCBjb250cmlidXRlcyBub3RoaW5nLiBPdmVyYWxsLCBhbGwgdGhyZWUgaW5mZXJlbnRpYWwgYXBwcm9hY2hlcyBjb252ZXJnZSBvbiB0aGUgY29uY2x1c2lvbiB0aGF0IENhcnMgRGVyYWlsZWQgaXMgdGhlIG9ubHkgdmFyaWFibGUgd2l0aCBhIGNvbnNpc3RlbnQgYW5kIG1lYW5pbmdmdWwgZWZmZWN0LCB3aGlsZSBUcmFjayBEYW1hZ2UgYW5kIGl0cyBpbnRlcmFjdGlvbiB3aXRoIGRlcmFpbG1lbnRzIGFyZSBuZWdsaWdpYmxlIG9uY2UgdGhlIG1vZGVsIGlzIHByb3Blcmx5IGNoZWNrZWQgd2l0aCBib290c3RyYXBwaW5nLg0KDQojIDYgQ29uY2x1c2lvbg0KDQpUaGUgbWFpbiBmaW5kaW5nIG9mIHRoaXMgcHJvamVjdCBpcyB0aGF0IEVxdWlwbWVudCBEYW1hZ2UgaW4gdHJhaW4gYWNjaWRlbnRzIGlzIG92ZXJ3aGVsbWluZ2x5IGV4cGxhaW5lZCBieSB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQuIEJvdGggdHJhZGl0aW9uYWwgcmVncmVzc2lvbiBhbmQgYm9vdHN0cmFwIG1ldGhvZHMgY29uZmlybWVkIHRoYXQgQ2FycyBEZXJhaWxlZCBpcyBhIGhpZ2hseSBzaWduaWZpY2FudCBwcmVkaWN0b3Igd2l0aCB0aWdodCBjb25maWRlbmNlIGludGVydmFscywgd2hpbGUgVHJhY2sgRGFtYWdlIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBkZXJhaWxtZW50cyBjb25zaXN0ZW50bHkgY29sbGFwc2VkIHRvIHplcm8gaW4gdGhlIGJvb3RzdHJhcCBhbmFseXNpcy4gVGhpcyBtZWFucyB0aGF0LCBhbHRob3VnaCBUcmFjayBEYW1hZ2Ugc2hvd3MgYSB3ZWFrIGVmZmVjdCBpbiBjbGFzc2ljYWwgdGVzdHMsIGl0IGRvZXMgbm90IG1lYW5pbmdmdWxseSBpbXByb3ZlIHByZWRpY3Rpb24gb25jZSBtb3JlIHJvYnVzdCBtZXRob2RzIGFyZSB1c2VkLg0KDQpBIGRyYXdiYWNrIG9mIHRoaXMgYW5hbHlzaXMgaXMgdGhhdCB0aGUgZGF0YSBhcmUgZnJvbSAyMDEwLCBtZWFuaW5nIHRoZSBmaW5kaW5ncyBtYXkgbm90IGZ1bGx5IHJlcHJlc2VudCB0aGUgY3VycmVudCBsYW5kc2NhcGUgb2YgdHJhaW4gYWNjaWRlbnRzLiBJbiBhZGRpdGlvbiwgdGhlIG1vZGVscyBhcmUgbGltaXRlZCB0byB0aGUgdmFyaWFibGVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YXNldCBhbmQgZG8gbm90IGFjY291bnQgZm9yIG90aGVyIHBvdGVudGlhbCBmYWN0b3JzIHN1Y2ggYXMgbWFpbnRlbmFuY2UgcHJhY3RpY2VzLCB3ZWF0aGVyLCBvciB0cmFpbiBsb2FkLiBSZXNpZHVhbCBhbmFseXNpcyBhbHNvIHNob3dlZCBpbmZsdWVudGlhbCBvdXRsaWVycyBhbmQgZXZpZGVuY2Ugb2YgaGV0ZXJvc2NlZGFzdGljaXR5LCB3aGljaCBsZWQgdXMgdG8gYSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uLiBXaGlsZSB0aGlzIGltcHJvdmVkIHZhcmlhbmNlIHN0YWJpbGl6YXRpb24sIGl0IGNhbWUgYXQgdGhlIGNvc3Qgb2YgYSBsb3dlciBSwrIsIHNob3dpbmcgdGhhdCBzb21lIGNvbXBsZXhpdHkgaW4gdGhlIGRhdGEgcmVtYWlucyB1bmV4cGxhaW5lZC4gRnV0dXJlIHdvcmsgY291bGQgaW1wcm92ZSB0aGUgbW9kZWwgYnkgaW5jb3Jwb3JhdGluZyBtb3JlIHJlY2VudCBkYXRhLCB0ZXN0aW5nIGFkZGl0aW9uYWwgcHJlZGljdG9ycywgYW5kIGV4cGxvcmluZyBub25saW5lYXIgb3IgbWl4ZWQtZWZmZWN0cyBhcHByb2FjaGVzIHRvIGJldHRlciBjYXB0dXJlIHZhcmlhYmlsaXR5Lg0KDQpJbiB0ZXJtcyBvZiBhcHBsaWNhdGlvbiwgdGhpcyBtb2RlbCBjYW4gYmUgdXNlZCB0byBoZWxwIHJhaWwgc2FmZXR5IGFuYWx5c3RzIGFuZCBwb2xpY3ltYWtlcnMgcHJpb3JpdGl6ZSBhY2NpZGVudCBwcmV2ZW50aW9uIGFuZCByZXNvdXJjZSBhbGxvY2F0aW9uLiBTaW5jZSB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgaXMgdGhlIGNsZWFyZXN0IGRyaXZlciBvZiBFcXVpcG1lbnQgRGFtYWdlLCBtaXRpZ2F0aW9uIHN0cmF0ZWdpZXMgc2hvdWxkIGZvY3VzIG9uIHJlZHVjaW5nIGRlcmFpbG1lbnRzLCBzdWNoIGFzIHRocm91Z2ggaW1wcm92ZWQgaW5zcGVjdGlvbiBwcm90b2NvbHMsIGJldHRlciB0cmFjayBtYWludGVuYW5jZSwgYW5kIGVuaGFuY2VkIGJyYWtpbmcgc3lzdGVtcy4gQWx0aG91Z2ggVHJhY2sgRGFtYWdlIGl0c2VsZiB3YXMgbm90IGEgcmVsaWFibGUgcHJlZGljdG9yIGluIHRoaXMgc3R1ZHksIGl0IHJlbWFpbnMgYW4gaW1wb3J0YW50IGNvc3QgY29tcG9uZW50IGluIHByYWN0aWNlLCBzbyBjb21iaW5pbmcgcHJlZGljdGl2ZSBtb2RlbHMgd2l0aCBlbmdpbmVlcmluZyBhc3Nlc3NtZW50cyBjb3VsZCBnaXZlIGRlY2lzaW9uLW1ha2VycyBhIGZ1bGxlciBwaWN0dXJlLiBPdmVyYWxsLCB0aGUgYW5hbHlzaXMgc2hvd3MgaG93IHN0YXRpc3RpY2FsIG1vZGVsaW5nIGNhbiBpbmZvcm0gZGF0YS1kcml2ZW4gc3RyYXRlZ2llcyB0byBtaW5pbWl6ZSBsb3NzZXMgZnJvbSB0cmFpbiBhY2NpZGVudHMuDQoNCiMgNyBSZWZlcmVuY2VzDQoNCnNhZmV0eWRhdGEuZnJhLmRvdC5nb3Y=