Introduction
Sports betting markets offer an interesting way to examine how public
behavior relates to game outcomes. In this project, I study whether
betting distribution data, specifically the percentage of bets and the
percentage of money placed on each team, help explain whether a team
covers the point spread in NFL regular season games. The betting
percentages used in this analysis were manually scraped from Vegas
Insider’s website because they are not available in a format that can be
directly imported into R. As a result, each game required individual
data collection and preprocessing. The final dataset includes betting
distribution information for 197 regular season games. Using this data,
logistic regression models are applied to compare the predictive value
of public betting volume and betting handle, both individually and
jointly. Because each game contributes two team-level observations
(entered side and reciprocal side), results should be interpreted as
team-level associations rather than fully independent game outcomes.
Public Money Model
A logistic regression model was fit to examine whether the percentage
of public money (Money %), also known as the betting handle percentage,
placed on a team predicts whether that team covers the spread (1 =
covered, 0 = did not cover).
##
## Call:
## glm(formula = covered ~ `Money %`, family = binomial(), data = public_df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.1080 0.3076 -0.351 0.725
## `Money %` 0.2161 0.5812 0.372 0.710
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 546.20 on 393 degrees of freedom
## Residual deviance: 546.06 on 392 degrees of freedom
## AIC: 550.06
##
## Number of Fisher Scoring iterations: 3
## (Intercept) `Money %`
## 0.8975957 1.2411905
The estimated coefficient for Money % was 0.216 (SE = 0.581, z =
0.372, p = 0.710). This coefficient is not statistically significant,
indicating no evidence that the percentage of public money is associated
with covering the spread.
Exponentiating the coefficient yields an odds ratio of 1.24. This
suggests that a one-unit increase in Money % is associated with a 24%
increase in the odds of covering, holding everything else constant.
However, because the effect is not statistically significant, this
apparent increase is likely due to random variation rather than a real
betting edge.
Model fit statistics further support the lack of predictive power.
The residual deviance (546.06) is nearly identical to the null deviance
(546.20), indicating that adding Money % does not meaningfully improve
the model over an intercept-only model. The AIC of 550.06 similarly
suggests no improvement in fit.
Public Bets Model
A logistic regression model was fit to evaluate whether the
percentage of bets (Bets %), placed on a team is associated with the
likelihood that the team covers the spread.
##
## Call:
## glm(formula = covered ~ `Bets %`, family = binomial(), data = public_df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.6363 0.3195 1.991 0.0464 *
## `Bets %` -1.2726 0.6061 -2.100 0.0358 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 546.20 on 393 degrees of freedom
## Residual deviance: 541.74 on 392 degrees of freedom
## AIC: 545.74
##
## Number of Fisher Scoring iterations: 4
## (Intercept) `Bets %`
## 1.8894810 0.2801012
The coefficient for Bets % is −1.273 (SE = 0.606, z = −2.10, p =
0.036), which is statistically significant at the 5% level. This
indicates a meaningful negative relationship between the share of bets
and covering the spread.
Exponentiating the coefficient gives an odds ratio of approximately
0.28. This means that, holding everything else constant, a one-unit
increase in Bets % is associated with a 72% decrease in the odds of
covering the spread. In practical terms, teams receiving a higher share
of public bets are significantly less likely to cover.
Model fit statistics suggest modest improvement over the null model.
The residual deviance (541.74) is lower than the null deviance (546.20),
and the AIC decreases to 545.74, indicating that Bets % provides
additional explanatory power compared to an intercept-only model.
Multiple Logistic Regression Model
While Bets % showed a statistically significant negative association
with covering, Money % was not statistically significant when modeled on
its own, suggesting that handle alone may not fully explain spread
outcomes. However, these two variables capture different aspects of
betting behavior. Bets % reflects public betting volume, while Money %
reflects where larger wagers are placed. These are likely correlated.
Typically, the “sharp” bettors place larger wagers on games with a low
Bets %, which could make the two variables go in opposite
directions.
To better understand their combined influence, a multiple logistic
regression model including both Bets % and Money % was fit. This
approach allows each variable’s effect to be evaluated while controlling
for the other, providing a clearer picture of how public sentiment and
betting capital jointly relate to covering the spread
##
## Call:
## glm(formula = covered ~ `Money %` + `Bets %`, family = binomial(),
## data = public_df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.3416 0.3396 1.006 0.31444
## `Money %` 2.1767 0.8509 2.558 0.01053 *
## `Bets %` -2.8600 0.8768 -3.262 0.00111 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 546.20 on 393 degrees of freedom
## Residual deviance: 534.93 on 391 degrees of freedom
## AIC: 540.93
##
## Number of Fisher Scoring iterations: 4
## (Intercept) `Money %` `Bets %`
## 1.40725509 8.81712411 0.05727003
A multiple logistic regression model including both Money % and Bets
% was fit to predict whether a team covers the spread. When both
variables are included, each becomes statistically significant, but with
effects in opposite directions (as predicted).
Holding Bets % constant, Money % has a positive and statistically
significant effect (p = 0.011). The estimated odds ratio of 8.82
suggests that teams receiving a larger share of the betting handle are
much more likely to cover the spread. This result is notable given that
Money % was not statistically significant when modeled on its own,
indicating that its effect becomes clear only after controlling for
public betting volume.
In contrast, Bets % has a strong negative and statistically
significant effect (p = 0.001). The odds ratio of 0.057 implies that
teams attracting a higher share of public bets are substantially less
likely to cover, consistent with a fade-the-public effect.
Overall, the combined model improves fit relative to the null model,
with the AIC decreasing to 540.93. These results highlight the
importance of separating public betting behavior from where betting
capital is concentrated when evaluating spread outcomes.
Final Model
We chose the multiple logistic regression model because it controls
for the strong relationship between Bets % and Money %, improves model
fit, and provides clearer interpretation of public versus sharp betting
behavior. The combined model captures effects that were not visible in
the single-predictor models.
Low Bets and High Money Subset
To explore situations where public exposure is low but betting
confidence is relatively high, a low-exposure indicator was created for
games with low Bets % (< 35%) and higher Money % (> 35%). This
group represents teams receiving relatively few bets but a
disproportionate share of the betting handle.
## # A tibble: 2 × 3
## low_exposure cover_rate n
## <lgl> <dbl> <int>
## 1 FALSE 0.482 363
## 2 TRUE 0.710 31
Teams in the low-exposure group covered the spread at a rate of
70.97% (22 of 31 games), compared to a 48.21% cover rate for all other
games. This difference is substantial and aligns closely with the
multiple logistic regression results, where Money % had a positive
effect and Bets % had a negative effect.
Although the low-exposure sample size is small (n = 31), the elevated
cover rate suggests that teams with low public attention but meaningful
money support tend to outperform the spread. This pattern is consistent
with a sharp-money or contrarian betting signal and provides an
intuitive, group-based confirmation of the model-based findings.
Visualization
To visualize the combined effects of public betting volume and
betting handle, predicted probabilities from the multiple logistic
regression model are plotted across values of Bets % and Money %. The
heatmap illustrates how the likelihood of covering the spread changes
jointly with these two variables, providing an intuitive representation
of the model’s estimated relationships.
Red indicates lower predicted probability of covering and green
indicates higher predicted probability of covering.

ONLY Low Bets Exposure Rate
This analysis focuses solely on Bets % to isolate the effect of
public betting volume without conditioning on Money %.
## # A tibble: 2 × 3
## low_exposure cover_rate n
## <lgl> <dbl> <int>
## 1 FALSE 0.469 307
## 2 TRUE 0.609 87
In the 2025 NFL regular season, about 61% of teams with a Bets % of
less than 35% covered the spread. In sample, this subset shows a large
edge over the books. But, with a sample size of only 87, variance is
still a very real issue.
Conclusion and Recommendations
The multiple logistic regression model was determined to be the
strongest of the three models considered; however, several important
limitations remain. First, betting distribution data were only available
for 197 of the 272 regular season games, which restricts the
completeness of the analysis. In future seasons, scraping betting data
on a weekly basis would ensure full coverage and improve the reliability
of the results.
Additionally, the timing of data collection was not fully consistent.
In some cases, betting percentages were recorded prior to kickoff, while
in others they were collected after games had concluded. Because
thousands of live bets are placed during games, pregame percentages may
not fully reflect total market activity, introducing additional noise
into the analysis.
Finally, there are unavoidable sources of variance that cannot be
captured by the model. In-game injuries, unexpected performance changes,
coaching decisions, and other random shocks can significantly affect
outcomes but are inherently unpredictable at betting time. These factors
help explain why even well-performing models are unlikely to sustain
extremely high win rates over time.
Despite these limitations, the results suggest that separating public
betting volume from betting handle provides meaningful insight into
spread outcomes. Future work incorporating more complete data and
consistent collection methods could further refine the model and better
evaluate the persistence of any observed betting edge.
LS0tDQp0aXRsZTogIkhvdyBQdWJsaWMgQmV0dGluZyBhbmQgTW9uZXkgRGlzdHJpYnV0aW9uIFJlbGF0ZSB0byBDb3ZlcmluZyB0aGUgU3ByZWFkIGluIHRoZSBORkwiDQphdXRob3I6ICJMdWtlIFZvbG0iDQpkYXRlOiAiMjAyNi0wMS0wNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vICAgIyBudW1iZXJpbmcgc2VjdGlvbiBoZWFkaW5ncw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcyAgICAgIyBUT0Mgc3ViaGVhZGluZyBjb2xsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgIyBhbGxvdyB0byBkb3dubG9hZCBjb21wbGV0ZSBSTWFya2Rvd24gc291cmNlIGNvZGUNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMgICAgICMgc2Nyb2xsaW5nIHRleHQgb2YgdGhlIGRvY3VtZW50DQogICAgdGhlbWU6IGx1bWVuICAgICAgICAgICAjIHZpc3VhbCB0aGVtZSBmb3IgSFRNTCBkb2N1bWVudCBvbmx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbyAgICAgICAjIGNvZGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIHsNCiAgbGlzdC1zdHlsZTogdXBwZXItcm9tYW47DQogIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQogIGJhY2tncm91bmQtcG9zaXRpb246IDA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGJvb3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KcHVibGljIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3ZvbG0xL09uZURyaXZlL0Rlc2t0b3AvRm9vdGJhbGwvMjAyNS5wdWJsaWMubW9uZXkueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KdG9fcHJvcCA8LSBmdW5jdGlvbih4KXsNCnggPC0gYXMuY2hhcmFjdGVyKHgpDQp4IDwtIHN0cl9yZXBsYWNlX2FsbCh4LCAiJSIsICIiKQ0KeCA8LSBzdHJfdHJpbSh4KQ0KeCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoeCkpDQppZmVsc2UoIWlzLm5hKHgpICYgeCA+IDEsIHgvMTAwLCB4KQ0KfQ0KDQpwdWJsaWNfaGFsZiA8LSBwdWJsaWMgJT4lDQogIG11dGF0ZSgNCiAgICBnYW1lX2lkID0gcm93X251bWJlcigpLA0KICAgIGNvdmVyZWQgPSBpZl9lbHNlKA0KICAgICAgdG9sb3dlcih0cmltd3MoYFdvbj9gKSkgPT0gInllcyIsDQogICAgICAxTCwNCiAgICAgIDBMDQogICAgKSwNCiAgICBgQmV0cyAlYCAgPSB0b19wcm9wKGBCZXRzICVgKSwNCiAgICBgTW9uZXkgJWAgPSB0b19wcm9wKGBNb25leSAlYCkNCiAgKQ0KDQpwdWJsaWNfcmVjaXAgPC0gcHVibGljX2hhbGYgJT4lDQptdXRhdGUoDQpgQmV0cyAlYCA9IDEgLSBgQmV0cyAlYCwNCmBNb25leSAlYCA9IDEgLSBgTW9uZXkgJWAsDQpjb3ZlcmVkID0gMUwgLSBjb3ZlcmVkDQopDQoNCnB1YmxpY19oYWxmIDwtIHB1YmxpY19oYWxmICU+JSBtdXRhdGUoc2lkZSA9ICJlbnRlcmVkIikNCnB1YmxpY19yZWNpcCA8LSBwdWJsaWNfcmVjaXAgJT4lIG11dGF0ZShzaWRlID0gInJlY2lwcm9jYWwiKQ0KDQpwdWJsaWNfZGYgPC0gYmluZF9yb3dzKHB1YmxpY19oYWxmLCBwdWJsaWNfcmVjaXApDQoNCnB1YmxpY19kZiAlPiUgY291bnQoZ2FtZV9pZCkgJT4lIGNvdW50KG4pDQoNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpTcG9ydHMgYmV0dGluZyBtYXJrZXRzIG9mZmVyIGFuIGludGVyZXN0aW5nIHdheSB0byBleGFtaW5lIGhvdyBwdWJsaWMgYmVoYXZpb3IgcmVsYXRlcyB0byBnYW1lIG91dGNvbWVzLiBJbiB0aGlzIHByb2plY3QsIEkgc3R1ZHkgd2hldGhlciBiZXR0aW5nIGRpc3RyaWJ1dGlvbiBkYXRhLCBzcGVjaWZpY2FsbHkgdGhlIHBlcmNlbnRhZ2Ugb2YgYmV0cyBhbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgbW9uZXkgcGxhY2VkIG9uIGVhY2ggdGVhbSwgaGVscCBleHBsYWluIHdoZXRoZXIgYSB0ZWFtIGNvdmVycyB0aGUgcG9pbnQgc3ByZWFkIGluIE5GTCByZWd1bGFyIHNlYXNvbiBnYW1lcy4gVGhlIGJldHRpbmcgcGVyY2VudGFnZXMgdXNlZCBpbiB0aGlzIGFuYWx5c2lzIHdlcmUgbWFudWFsbHkgc2NyYXBlZCBmcm9tIFZlZ2FzIEluc2lkZXLigJlzIHdlYnNpdGUgYmVjYXVzZSB0aGV5IGFyZSBub3QgYXZhaWxhYmxlIGluIGEgZm9ybWF0IHRoYXQgY2FuIGJlIGRpcmVjdGx5IGltcG9ydGVkIGludG8gUi4gQXMgYSByZXN1bHQsIGVhY2ggZ2FtZSByZXF1aXJlZCBpbmRpdmlkdWFsIGRhdGEgY29sbGVjdGlvbiBhbmQgcHJlcHJvY2Vzc2luZy4gVGhlIGZpbmFsIGRhdGFzZXQgaW5jbHVkZXMgYmV0dGluZyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24gZm9yIDE5NyByZWd1bGFyIHNlYXNvbiBnYW1lcy4gVXNpbmcgdGhpcyBkYXRhLCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVscyBhcmUgYXBwbGllZCB0byBjb21wYXJlIHRoZSBwcmVkaWN0aXZlIHZhbHVlIG9mIHB1YmxpYyBiZXR0aW5nIHZvbHVtZSBhbmQgYmV0dGluZyBoYW5kbGUsIGJvdGggaW5kaXZpZHVhbGx5IGFuZCBqb2ludGx5LiBCZWNhdXNlIGVhY2ggZ2FtZSBjb250cmlidXRlcyB0d28gdGVhbS1sZXZlbCBvYnNlcnZhdGlvbnMgKGVudGVyZWQgc2lkZSBhbmQgcmVjaXByb2NhbCBzaWRlKSwgcmVzdWx0cyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGVhbS1sZXZlbCBhc3NvY2lhdGlvbnMgcmF0aGVyIHRoYW4gZnVsbHkgaW5kZXBlbmRlbnQgZ2FtZSBvdXRjb21lcy4NCg0KIyBQdWJsaWMgTW9uZXkgTW9kZWwNCg0KQSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdhcyBmaXQgdG8gZXhhbWluZSB3aGV0aGVyIHRoZSBwZXJjZW50YWdlIG9mIHB1YmxpYyBtb25leSAoTW9uZXkgJSksIGFsc28ga25vd24gYXMgdGhlIGJldHRpbmcgaGFuZGxlIHBlcmNlbnRhZ2UsIHBsYWNlZCBvbiBhIHRlYW0gcHJlZGljdHMgd2hldGhlciB0aGF0IHRlYW0gY292ZXJzIHRoZSBzcHJlYWQgKDEgPSBjb3ZlcmVkLCAwID0gZGlkIG5vdCBjb3ZlcikuDQoNCmBgYHtyfQ0KDQpmaXRfbW9uZXkgPC0gZ2xtKGNvdmVyZWQgfiBgTW9uZXkgJWAsIGRhdGEgPSBwdWJsaWNfZGYsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tYXJ5KGZpdF9tb25leSkNCg0KIyBPZGRzIHJhdGlvIGZvciBhICsxLjAwIGNoYW5nZSBpbiBNb25leSUgKGkuZS4sICsxMDAgcGVyY2VudGFnZSBwb2ludHMpDQpleHAoY29lZihmaXRfbW9uZXkpKQ0KYGBgDQoNClRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnQgZm9yIE1vbmV5ICUgd2FzIDAuMjE2IChTRSA9IDAuNTgxLCB6ID0gMC4zNzIsIHAgPSAwLjcxMCkuIFRoaXMgY29lZmZpY2llbnQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGluZGljYXRpbmcgbm8gZXZpZGVuY2UgdGhhdCB0aGUgcGVyY2VudGFnZSBvZiBwdWJsaWMgbW9uZXkgaXMgYXNzb2NpYXRlZCB3aXRoIGNvdmVyaW5nIHRoZSBzcHJlYWQuDQoNCkV4cG9uZW50aWF0aW5nIHRoZSBjb2VmZmljaWVudCB5aWVsZHMgYW4gb2RkcyByYXRpbyBvZiAxLjI0LiBUaGlzIHN1Z2dlc3RzIHRoYXQgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBNb25leSAlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIDI0JSBpbmNyZWFzZSBpbiB0aGUgb2RkcyBvZiBjb3ZlcmluZywgaG9sZGluZyBldmVyeXRoaW5nIGVsc2UgY29uc3RhbnQuIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgdGhpcyBhcHBhcmVudCBpbmNyZWFzZSBpcyBsaWtlbHkgZHVlIHRvIHJhbmRvbSB2YXJpYXRpb24gcmF0aGVyIHRoYW4gYSByZWFsIGJldHRpbmcgZWRnZS4NCg0KTW9kZWwgZml0IHN0YXRpc3RpY3MgZnVydGhlciBzdXBwb3J0IHRoZSBsYWNrIG9mIHByZWRpY3RpdmUgcG93ZXIuIFRoZSByZXNpZHVhbCBkZXZpYW5jZSAoNTQ2LjA2KSBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSBudWxsIGRldmlhbmNlICg1NDYuMjApLCBpbmRpY2F0aW5nIHRoYXQgYWRkaW5nIE1vbmV5ICUgZG9lcyBub3QgbWVhbmluZ2Z1bGx5IGltcHJvdmUgdGhlIG1vZGVsIG92ZXIgYW4gaW50ZXJjZXB0LW9ubHkgbW9kZWwuIFRoZSBBSUMgb2YgNTUwLjA2IHNpbWlsYXJseSBzdWdnZXN0cyBubyBpbXByb3ZlbWVudCBpbiBmaXQuDQoNCiMgUHVibGljIEJldHMgTW9kZWwNCg0KQSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdhcyBmaXQgdG8gZXZhbHVhdGUgd2hldGhlciB0aGUgcGVyY2VudGFnZSBvZiBiZXRzIChCZXRzICUpLCBwbGFjZWQgb24gYSB0ZWFtIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB0ZWFtIGNvdmVycyB0aGUgc3ByZWFkLiANCg0KYGBge3J9DQoNCmZpdF9iZXRzIDwtIGdsbShjb3ZlcmVkIH4gYEJldHMgJWAsIGRhdGEgPSBwdWJsaWNfZGYsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tYXJ5KGZpdF9iZXRzKQ0KZXhwKGNvZWYoZml0X2JldHMpKSAjIG9kZHMgcmF0aW9zDQpgYGANCg0KVGhlIGNvZWZmaWNpZW50IGZvciBCZXRzICUgaXMg4oiSMS4yNzMgKFNFID0gMC42MDYsIHogPSDiiJIyLjEwLCBwID0gMC4wMzYpLCB3aGljaCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IHRoZSA1JSBsZXZlbC4gVGhpcyBpbmRpY2F0ZXMgYSBtZWFuaW5nZnVsIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBzaGFyZSBvZiBiZXRzIGFuZCBjb3ZlcmluZyB0aGUgc3ByZWFkLg0KDQpFeHBvbmVudGlhdGluZyB0aGUgY29lZmZpY2llbnQgZ2l2ZXMgYW4gb2RkcyByYXRpbyBvZiBhcHByb3hpbWF0ZWx5IDAuMjguIFRoaXMgbWVhbnMgdGhhdCwgaG9sZGluZyBldmVyeXRoaW5nIGVsc2UgY29uc3RhbnQsIGEgb25lLXVuaXQgaW5jcmVhc2UgaW4gQmV0cyAlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIDcyJSBkZWNyZWFzZSBpbiB0aGUgb2RkcyBvZiBjb3ZlcmluZyB0aGUgc3ByZWFkLiBJbiBwcmFjdGljYWwgdGVybXMsIHRlYW1zIHJlY2VpdmluZyBhIGhpZ2hlciBzaGFyZSBvZiBwdWJsaWMgYmV0cyBhcmUgc2lnbmlmaWNhbnRseSBsZXNzIGxpa2VseSB0byBjb3Zlci4NCg0KTW9kZWwgZml0IHN0YXRpc3RpY3Mgc3VnZ2VzdCBtb2Rlc3QgaW1wcm92ZW1lbnQgb3ZlciB0aGUgbnVsbCBtb2RlbC4gVGhlIHJlc2lkdWFsIGRldmlhbmNlICg1NDEuNzQpIGlzIGxvd2VyIHRoYW4gdGhlIG51bGwgZGV2aWFuY2UgKDU0Ni4yMCksIGFuZCB0aGUgQUlDIGRlY3JlYXNlcyB0byA1NDUuNzQsIGluZGljYXRpbmcgdGhhdCBCZXRzICUgcHJvdmlkZXMgYWRkaXRpb25hbCBleHBsYW5hdG9yeSBwb3dlciBjb21wYXJlZCB0byBhbiBpbnRlcmNlcHQtb25seSBtb2RlbC4NCg0KIyBNdWx0aXBsZSBMb2dpc3RpYyBSZWdyZXNzaW9uIE1vZGVsDQoNCldoaWxlIEJldHMgJSBzaG93ZWQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG5lZ2F0aXZlIGFzc29jaWF0aW9uIHdpdGggY292ZXJpbmcsIE1vbmV5ICUgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdoZW4gbW9kZWxlZCBvbiBpdHMgb3duLCBzdWdnZXN0aW5nIHRoYXQgaGFuZGxlIGFsb25lIG1heSBub3QgZnVsbHkgZXhwbGFpbiBzcHJlYWQgb3V0Y29tZXMuIEhvd2V2ZXIsIHRoZXNlIHR3byB2YXJpYWJsZXMgY2FwdHVyZSBkaWZmZXJlbnQgYXNwZWN0cyBvZiBiZXR0aW5nIGJlaGF2aW9yLiBCZXRzICUgcmVmbGVjdHMgcHVibGljIGJldHRpbmcgdm9sdW1lLCB3aGlsZSBNb25leSAlIHJlZmxlY3RzIHdoZXJlIGxhcmdlciB3YWdlcnMgYXJlIHBsYWNlZC4gVGhlc2UgYXJlIGxpa2VseSBjb3JyZWxhdGVkLiBUeXBpY2FsbHksIHRoZSAic2hhcnAiIGJldHRvcnMgcGxhY2UgbGFyZ2VyIHdhZ2VycyBvbiBnYW1lcyB3aXRoIGEgbG93IEJldHMgJSwgd2hpY2ggY291bGQgbWFrZSB0aGUgdHdvIHZhcmlhYmxlcyBnbyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zLg0KDQpUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGVpciBjb21iaW5lZCBpbmZsdWVuY2UsIGEgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBpbmNsdWRpbmcgYm90aCBCZXRzICUgYW5kIE1vbmV5ICUgd2FzIGZpdC4gVGhpcyBhcHByb2FjaCBhbGxvd3MgZWFjaCB2YXJpYWJsZeKAmXMgZWZmZWN0IHRvIGJlIGV2YWx1YXRlZCB3aGlsZSBjb250cm9sbGluZyBmb3IgdGhlIG90aGVyLCBwcm92aWRpbmcgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHB1YmxpYyBzZW50aW1lbnQgYW5kIGJldHRpbmcgY2FwaXRhbCBqb2ludGx5IHJlbGF0ZSB0byBjb3ZlcmluZyB0aGUgc3ByZWFkDQoNCmBgYHtyfQ0KDQpmaXRfYm90aCA8LSBnbG0oY292ZXJlZCB+IGBNb25leSAlYCArIGBCZXRzICVgLCBkYXRhID0gcHVibGljX2RmLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbWFyeShmaXRfYm90aCkNCmV4cChjb2VmKGZpdF9ib3RoKSkNCg0KYGBgDQoNCkEgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBpbmNsdWRpbmcgYm90aCBNb25leSAlIGFuZCBCZXRzICUgd2FzIGZpdCB0byBwcmVkaWN0IHdoZXRoZXIgYSB0ZWFtIGNvdmVycyB0aGUgc3ByZWFkLiBXaGVuIGJvdGggdmFyaWFibGVzIGFyZSBpbmNsdWRlZCwgZWFjaCBiZWNvbWVzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGJ1dCB3aXRoIGVmZmVjdHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyAoYXMgcHJlZGljdGVkKS4NCg0KSG9sZGluZyBCZXRzICUgY29uc3RhbnQsIE1vbmV5ICUgaGFzIGEgcG9zaXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IChwID0gMC4wMTEpLiBUaGUgZXN0aW1hdGVkIG9kZHMgcmF0aW8gb2YgOC44MiBzdWdnZXN0cyB0aGF0IHRlYW1zIHJlY2VpdmluZyBhIGxhcmdlciBzaGFyZSBvZiB0aGUgYmV0dGluZyBoYW5kbGUgYXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gY292ZXIgdGhlIHNwcmVhZC4gVGhpcyByZXN1bHQgaXMgbm90YWJsZSBnaXZlbiB0aGF0IE1vbmV5ICUgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdoZW4gbW9kZWxlZCBvbiBpdHMgb3duLCBpbmRpY2F0aW5nIHRoYXQgaXRzIGVmZmVjdCBiZWNvbWVzIGNsZWFyIG9ubHkgYWZ0ZXIgY29udHJvbGxpbmcgZm9yIHB1YmxpYyBiZXR0aW5nIHZvbHVtZS4NCg0KSW4gY29udHJhc3QsIEJldHMgJSBoYXMgYSBzdHJvbmcgbmVnYXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IChwID0gMC4wMDEpLiBUaGUgb2RkcyByYXRpbyBvZiAwLjA1NyBpbXBsaWVzIHRoYXQgdGVhbXMgYXR0cmFjdGluZyBhIGhpZ2hlciBzaGFyZSBvZiBwdWJsaWMgYmV0cyBhcmUgc3Vic3RhbnRpYWxseSBsZXNzIGxpa2VseSB0byBjb3ZlciwgY29uc2lzdGVudCB3aXRoIGEgZmFkZS10aGUtcHVibGljIGVmZmVjdC4NCg0KT3ZlcmFsbCwgdGhlIGNvbWJpbmVkIG1vZGVsIGltcHJvdmVzIGZpdCByZWxhdGl2ZSB0byB0aGUgbnVsbCBtb2RlbCwgd2l0aCB0aGUgQUlDIGRlY3JlYXNpbmcgdG8gNTQwLjkzLiBUaGVzZSByZXN1bHRzIGhpZ2hsaWdodCB0aGUgaW1wb3J0YW5jZSBvZiBzZXBhcmF0aW5nIHB1YmxpYyBiZXR0aW5nIGJlaGF2aW9yIGZyb20gd2hlcmUgYmV0dGluZyBjYXBpdGFsIGlzIGNvbmNlbnRyYXRlZCB3aGVuIGV2YWx1YXRpbmcgc3ByZWFkIG91dGNvbWVzLg0KDQojIEZpbmFsIE1vZGVsDQoNCldlIGNob3NlIHRoZSBtdWx0aXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGJlY2F1c2UgaXQgY29udHJvbHMgZm9yIHRoZSBzdHJvbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gQmV0cyAlIGFuZCBNb25leSAlLCBpbXByb3ZlcyBtb2RlbCBmaXQsIGFuZCBwcm92aWRlcyBjbGVhcmVyIGludGVycHJldGF0aW9uIG9mIHB1YmxpYyB2ZXJzdXMgc2hhcnAgYmV0dGluZyBiZWhhdmlvci4gVGhlIGNvbWJpbmVkIG1vZGVsIGNhcHR1cmVzIGVmZmVjdHMgdGhhdCB3ZXJlIG5vdCB2aXNpYmxlIGluIHRoZSBzaW5nbGUtcHJlZGljdG9yIG1vZGVscy4NCg0KIyBMb3cgQmV0cyBhbmQgSGlnaCBNb25leSBTdWJzZXQNCg0KVG8gZXhwbG9yZSBzaXR1YXRpb25zIHdoZXJlIHB1YmxpYyBleHBvc3VyZSBpcyBsb3cgYnV0IGJldHRpbmcgY29uZmlkZW5jZSBpcyByZWxhdGl2ZWx5IGhpZ2gsIGEgbG93LWV4cG9zdXJlIGluZGljYXRvciB3YXMgY3JlYXRlZCBmb3IgZ2FtZXMgd2l0aCBsb3cgQmV0cyAlICg8IDM1JSkgYW5kIGhpZ2hlciBNb25leSAlICg+IDM1JSkuIFRoaXMgZ3JvdXAgcmVwcmVzZW50cyB0ZWFtcyByZWNlaXZpbmcgcmVsYXRpdmVseSBmZXcgYmV0cyBidXQgYSBkaXNwcm9wb3J0aW9uYXRlIHNoYXJlIG9mIHRoZSBiZXR0aW5nIGhhbmRsZS4NCg0KYGBge3J9DQoNCnB1YmxpY19kZiA8LSBwdWJsaWNfZGYgJT4lDQptdXRhdGUoDQpsb3dfYmV0cyA9IGBCZXRzICVgIDwgMC4zNSwNCmxvd19tb25leSA9IGBNb25leSAlYCA+IDAuMzUsDQpsb3dfZXhwb3N1cmUgPSBsb3dfYmV0cyAmIGxvd19tb25leQ0KKQ0KDQpwdWJsaWNfZGYgJT4lDQpncm91cF9ieShsb3dfZXhwb3N1cmUpICU+JQ0Kc3VtbWFyaXNlKGNvdmVyX3JhdGUgPSBtZWFuKGNvdmVyZWQpLCBuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKQ0KDQpgYGANCg0KVGVhbXMgaW4gdGhlIGxvdy1leHBvc3VyZSBncm91cCBjb3ZlcmVkIHRoZSBzcHJlYWQgYXQgYSByYXRlIG9mIDcwLjk3JSAoMjIgb2YgMzEgZ2FtZXMpLCBjb21wYXJlZCB0byBhIDQ4LjIxJSBjb3ZlciByYXRlIGZvciBhbGwgb3RoZXIgZ2FtZXMuIFRoaXMgZGlmZmVyZW5jZSBpcyBzdWJzdGFudGlhbCBhbmQgYWxpZ25zIGNsb3NlbHkgd2l0aCB0aGUgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiByZXN1bHRzLCB3aGVyZSBNb25leSAlIGhhZCBhIHBvc2l0aXZlIGVmZmVjdCBhbmQgQmV0cyAlIGhhZCBhIG5lZ2F0aXZlIGVmZmVjdC4NCg0KQWx0aG91Z2ggdGhlIGxvdy1leHBvc3VyZSBzYW1wbGUgc2l6ZSBpcyBzbWFsbCAobiA9IDMxKSwgdGhlIGVsZXZhdGVkIGNvdmVyIHJhdGUgc3VnZ2VzdHMgdGhhdCB0ZWFtcyB3aXRoIGxvdyBwdWJsaWMgYXR0ZW50aW9uIGJ1dCBtZWFuaW5nZnVsIG1vbmV5IHN1cHBvcnQgdGVuZCB0byBvdXRwZXJmb3JtIHRoZSBzcHJlYWQuIFRoaXMgcGF0dGVybiBpcyBjb25zaXN0ZW50IHdpdGggYSBzaGFycC1tb25leSBvciBjb250cmFyaWFuIGJldHRpbmcgc2lnbmFsIGFuZCBwcm92aWRlcyBhbiBpbnR1aXRpdmUsIGdyb3VwLWJhc2VkIGNvbmZpcm1hdGlvbiBvZiB0aGUgbW9kZWwtYmFzZWQgZmluZGluZ3MuDQoNCiMgVmlzdWFsaXphdGlvbg0KDQpUbyB2aXN1YWxpemUgdGhlIGNvbWJpbmVkIGVmZmVjdHMgb2YgcHVibGljIGJldHRpbmcgdm9sdW1lIGFuZCBiZXR0aW5nIGhhbmRsZSwgcHJlZGljdGVkIHByb2JhYmlsaXRpZXMgZnJvbSB0aGUgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBhcmUgcGxvdHRlZCBhY3Jvc3MgdmFsdWVzIG9mIEJldHMgJSBhbmQgTW9uZXkgJS4gVGhlIGhlYXRtYXAgaWxsdXN0cmF0ZXMgaG93IHRoZSBsaWtlbGlob29kIG9mIGNvdmVyaW5nIHRoZSBzcHJlYWQgY2hhbmdlcyBqb2ludGx5IHdpdGggdGhlc2UgdHdvIHZhcmlhYmxlcywgcHJvdmlkaW5nIGFuIGludHVpdGl2ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWzigJlzIGVzdGltYXRlZCByZWxhdGlvbnNoaXBzLg0KDQpSZWQgaW5kaWNhdGVzIGxvd2VyIHByZWRpY3RlZCBwcm9iYWJpbGl0eSBvZiBjb3ZlcmluZyBhbmQgZ3JlZW4gaW5kaWNhdGVzIGhpZ2hlciBwcmVkaWN0ZWQgcHJvYmFiaWxpdHkgb2YgY292ZXJpbmcuDQoNCmBgYHtyIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgQ3JlYXRlIHByZWRpY3Rpb24gZ3JpZCBmcm9tIHRoZSBtdWx0aXBsZSBsb2dpc3RpYyBtb2RlbA0KZ3JpZDIgPC0gZXhwYW5kLmdyaWQoDQogICJCZXRzICUiICA9IHNlcShtaW4ocHVibGljX2RmJGBCZXRzICVgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICBtYXgocHVibGljX2RmJGBCZXRzICVgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICBsZW5ndGgub3V0ID0gMTUwKSwNCiAgIk1vbmV5ICUiID0gc2VxKG1pbihwdWJsaWNfZGYkYE1vbmV5ICVgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICBtYXgocHVibGljX2RmJGBNb25leSAlYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDE1MCksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCg0KIyBQcmVkaWN0ZWQgcHJvYmFiaWxpdGllcw0KZ3JpZDIkcHJlZCA8LSBwcmVkaWN0KGZpdF9ib3RoLCBuZXdkYXRhID0gZ3JpZDIsIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQojIFBsb3Qgc21vb3RoZWQgaGVhdG1hcA0KZ2dwbG90KGdyaWQyLCBhZXMoeCA9IGBCZXRzICVgLCB5ID0gYE1vbmV5ICVgLCBmaWxsID0gcHJlZCkpICsNCiAgZ2VvbV90aWxlKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oDQogICAgY29sb3JzID0gYygiI2MwMzkyYiIsICIjZjRkMDNmIiwgIiMxZTg0NDkiKSwNCiAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjQwLCAwLjUwLCAwLjYwKSksDQogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLA0KICAgIG5hbWUgPSAiUChDb3ZlcikiDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlByZWRpY3RlZCBQcm9iYWJpbGl0eSBvZiBDb3ZlcmluZyIsDQogICAgeCA9ICJCZXRzICUiLA0KICAgIHkgPSAiTW9uZXkgJSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCINCiAgKQ0KYGBgDQoNCiMgT05MWSBMb3cgQmV0cyBFeHBvc3VyZSBSYXRlDQoNClRoaXMgYW5hbHlzaXMgZm9jdXNlcyBzb2xlbHkgb24gQmV0cyAlIHRvIGlzb2xhdGUgdGhlIGVmZmVjdCBvZiBwdWJsaWMgYmV0dGluZyB2b2x1bWUgd2l0aG91dCBjb25kaXRpb25pbmcgb24gTW9uZXkgJS4NCg0KYGBge3J9DQoNCnB1YmxpY19kZiA8LSBwdWJsaWNfZGYgJT4lDQptdXRhdGUoDQpsb3dfYmV0cyA9IGBCZXRzICVgIDwgMC4zNSwNCmxvd19leHBvc3VyZSA9IGxvd19iZXRzDQopDQoNCnB1YmxpY19kZiAlPiUNCmdyb3VwX2J5KGxvd19leHBvc3VyZSkgJT4lDQpzdW1tYXJpc2UoY292ZXJfcmF0ZSA9IG1lYW4oY292ZXJlZCksIG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpDQoNCmBgYA0KDQpJbiB0aGUgMjAyNSBORkwgcmVndWxhciBzZWFzb24sIGFib3V0IDYxJSBvZiB0ZWFtcyB3aXRoIGEgQmV0cyAlIG9mIGxlc3MgdGhhbiAzNSUgY292ZXJlZCB0aGUgc3ByZWFkLiBJbiBzYW1wbGUsIHRoaXMgc3Vic2V0IHNob3dzIGEgbGFyZ2UgZWRnZSBvdmVyIHRoZSBib29rcy4gQnV0LCB3aXRoIGEgc2FtcGxlIHNpemUgb2Ygb25seSA4NywgdmFyaWFuY2UgaXMgc3RpbGwgYSB2ZXJ5IHJlYWwgaXNzdWUuIA0KDQojIENvbmNsdXNpb24gYW5kIFJlY29tbWVuZGF0aW9ucw0KDQpUaGUgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3YXMgZGV0ZXJtaW5lZCB0byBiZSB0aGUgc3Ryb25nZXN0IG9mIHRoZSB0aHJlZSBtb2RlbHMgY29uc2lkZXJlZDsgaG93ZXZlciwgc2V2ZXJhbCBpbXBvcnRhbnQgbGltaXRhdGlvbnMgcmVtYWluLiBGaXJzdCwgYmV0dGluZyBkaXN0cmlidXRpb24gZGF0YSB3ZXJlIG9ubHkgYXZhaWxhYmxlIGZvciAxOTcgb2YgdGhlIDI3MiByZWd1bGFyIHNlYXNvbiBnYW1lcywgd2hpY2ggcmVzdHJpY3RzIHRoZSBjb21wbGV0ZW5lc3Mgb2YgdGhlIGFuYWx5c2lzLiBJbiBmdXR1cmUgc2Vhc29ucywgc2NyYXBpbmcgYmV0dGluZyBkYXRhIG9uIGEgd2Vla2x5IGJhc2lzIHdvdWxkIGVuc3VyZSBmdWxsIGNvdmVyYWdlIGFuZCBpbXByb3ZlIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgcmVzdWx0cy4NCg0KQWRkaXRpb25hbGx5LCB0aGUgdGltaW5nIG9mIGRhdGEgY29sbGVjdGlvbiB3YXMgbm90IGZ1bGx5IGNvbnNpc3RlbnQuIEluIHNvbWUgY2FzZXMsIGJldHRpbmcgcGVyY2VudGFnZXMgd2VyZSByZWNvcmRlZCBwcmlvciB0byBraWNrb2ZmLCB3aGlsZSBpbiBvdGhlcnMgdGhleSB3ZXJlIGNvbGxlY3RlZCBhZnRlciBnYW1lcyBoYWQgY29uY2x1ZGVkLiBCZWNhdXNlIHRob3VzYW5kcyBvZiBsaXZlIGJldHMgYXJlIHBsYWNlZCBkdXJpbmcgZ2FtZXMsIHByZWdhbWUgcGVyY2VudGFnZXMgbWF5IG5vdCBmdWxseSByZWZsZWN0IHRvdGFsIG1hcmtldCBhY3Rpdml0eSwgaW50cm9kdWNpbmcgYWRkaXRpb25hbCBub2lzZSBpbnRvIHRoZSBhbmFseXNpcy4NCg0KRmluYWxseSwgdGhlcmUgYXJlIHVuYXZvaWRhYmxlIHNvdXJjZXMgb2YgdmFyaWFuY2UgdGhhdCBjYW5ub3QgYmUgY2FwdHVyZWQgYnkgdGhlIG1vZGVsLiBJbi1nYW1lIGluanVyaWVzLCB1bmV4cGVjdGVkIHBlcmZvcm1hbmNlIGNoYW5nZXMsIGNvYWNoaW5nIGRlY2lzaW9ucywgYW5kIG90aGVyIHJhbmRvbSBzaG9ja3MgY2FuIHNpZ25pZmljYW50bHkgYWZmZWN0IG91dGNvbWVzIGJ1dCBhcmUgaW5oZXJlbnRseSB1bnByZWRpY3RhYmxlIGF0IGJldHRpbmcgdGltZS4gVGhlc2UgZmFjdG9ycyBoZWxwIGV4cGxhaW4gd2h5IGV2ZW4gd2VsbC1wZXJmb3JtaW5nIG1vZGVscyBhcmUgdW5saWtlbHkgdG8gc3VzdGFpbiBleHRyZW1lbHkgaGlnaCB3aW4gcmF0ZXMgb3ZlciB0aW1lLg0KDQpEZXNwaXRlIHRoZXNlIGxpbWl0YXRpb25zLCB0aGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgc2VwYXJhdGluZyBwdWJsaWMgYmV0dGluZyB2b2x1bWUgZnJvbSBiZXR0aW5nIGhhbmRsZSBwcm92aWRlcyBtZWFuaW5nZnVsIGluc2lnaHQgaW50byBzcHJlYWQgb3V0Y29tZXMuIEZ1dHVyZSB3b3JrIGluY29ycG9yYXRpbmcgbW9yZSBjb21wbGV0ZSBkYXRhIGFuZCBjb25zaXN0ZW50IGNvbGxlY3Rpb24gbWV0aG9kcyBjb3VsZCBmdXJ0aGVyIHJlZmluZSB0aGUgbW9kZWwgYW5kIGJldHRlciBldmFsdWF0ZSB0aGUgcGVyc2lzdGVuY2Ugb2YgYW55IG9ic2VydmVkIGJldHRpbmcgZWRnZS4=