Introduction
Tables
This is the space where I will describe the data set, my team and the
2025 season.
Table Discussion- Table 1: My team did not make the playoffs, some
stat to prove it
summary %>%
kbl() %>%
kable_styling()
|
team_name
|
mean_score
|
sd_score
|
mean_fgp
|
sd_fgp
|
mean_rebounds
|
sd_rebounds
|
mean_3ptpct
|
sd_3ptpct
|
mean_steals
|
sd_steals
|
|
Aces
|
85.52174
|
9.558566
|
45.26739
|
5.815881
|
33.78261
|
5.879959
|
35.26957
|
7.075776
|
6.804348
|
2.671825
|
|
Dream
|
76.92857
|
10.588518
|
41.27857
|
6.777565
|
35.95238
|
4.405940
|
30.82857
|
9.315926
|
7.142857
|
2.816081
|
|
Fever
|
84.50000
|
10.169898
|
45.56429
|
5.378404
|
35.09524
|
5.494163
|
34.99524
|
8.989885
|
5.880952
|
2.286785
|
|
Liberty
|
84.98077
|
9.916298
|
44.53462
|
5.609966
|
36.90385
|
5.770988
|
35.37692
|
10.057611
|
7.750000
|
2.186187
|
|
Lynx
|
82.35849
|
11.386724
|
45.20755
|
6.336459
|
33.15094
|
5.058870
|
37.80377
|
9.428760
|
8.358491
|
3.168926
|
|
Mercury
|
81.92857
|
12.597702
|
44.28333
|
7.338070
|
32.26190
|
5.392224
|
32.97143
|
10.344865
|
6.547619
|
2.120773
|
|
Mystics
|
79.30000
|
8.691876
|
43.35750
|
4.824504
|
31.85000
|
4.660527
|
36.64250
|
8.688746
|
7.275000
|
2.241651
|
|
Sky
|
77.40000
|
9.623156
|
42.44250
|
5.219878
|
36.60000
|
5.573748
|
31.73500
|
11.624191
|
7.000000
|
3.297241
|
|
Sparks
|
78.40000
|
10.567973
|
42.62750
|
6.151505
|
32.67500
|
5.520997
|
32.08750
|
10.995435
|
7.300000
|
2.775349
|
|
Storm
|
82.66667
|
9.654183
|
43.42619
|
5.385484
|
34.66667
|
6.018940
|
28.35238
|
9.027309
|
9.238095
|
3.267053
|
|
Sun
|
80.36170
|
9.893840
|
44.30000
|
5.282169
|
33.42553
|
4.619169
|
32.84043
|
11.666911
|
7.893617
|
3.285237
|
|
Wings
|
84.20000
|
11.469469
|
44.46750
|
5.238437
|
34.75000
|
4.650613
|
32.06000
|
11.754646
|
7.125000
|
2.945553
|
#making a table to show average score in a win versus average score in a loss
my_team_means %>%
kbl(caption = "2025 Los Angeles Sparks") %>%
kable_classic(full_width = F, html_font = "Cambria")
2025 Los Angeles Sparks
|
result
|
mean
|
|
Loss
|
76.6875
|
|
Win
|
85.2500
|
Histograms
Histogram discussion
#creating a histogram
p <- my_team %>%
ggplot( aes(x=team_score, fill=result)) +
geom_histogram(color = "purple", alpha = 0.6, position = 'identity') +
scale_fill_manual(values=c("purple", "yellow"))
p
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

#making side by side box plots to compare points scored in a win versus a loss
boxplot(team_score ~ result, data = my_team, notch = TRUE,
col = c("purple", "yellow"),
main = "Points scored by game result",
xlab = "Result", ylab = "Points")
## Warning in (function (z, notch = FALSE, width = NULL, varwidth = FALSE, : some
## notches went outside hinges ('box'): maybe set notch=FALSE

Histogram Discussion Winning v Losing, Side by Side, etc.
Models
\(~\)
After all models were run and model reduction was completed, my final
model is team_score = -50.4334385 + 4.044072 * field_goal_pct +
-1.6678826 * total_rebounds + 2.5656832 * three_point_field_goal_pct +
-0.0989813 * field_goal_pct:total_rebounds + 0.0609006 *
three_point_field_goal_pct:total_rebounds
This model significantly predicts team score,
F(rmodel4sum$fstatistic[1],
rmodel4sum$fstatistic[2]) =
rmodel4sum$fstatistic[1], p, adjusted R^2=
radj.r.squared
See table below for results.
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
4.044***
|
|
|
(1.221)
|
|
|
|
|
three_point_field_goal_pct
|
-1.668*
|
|
|
(0.925)
|
|
|
|
|
total_rebounds
|
2.566**
|
|
|
(1.097)
|
|
|
|
|
field_goal_pct:total_rebounds
|
-0.099**
|
|
|
(0.037)
|
|
|
|
|
three_point_field_goal_pct:total_rebounds
|
0.061**
|
|
|
(0.028)
|
|
|
|
|
Constant
|
-50.433
|
|
|
(38.164)
|
|
|
|
|
|
|
Observations
|
40
|
|
R2
|
0.503
|
|
Adjusted R2
|
0.429
|
|
Residual Std. Error
|
7.983 (df = 34)
|
|
F Statistic
|
6.869*** (df = 5; 34)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
#creating histogram of residuals
ols_plot_resid_hist(model4)

#creating versus fit plot
ols_plot_resid_fit(model4)

#creating studentized residuals plot
ols_plot_resid_stud(model4)

#creating leverage plot
ols_plot_resid_lev(model4, threshold = 3)

#creating cooks distance plot
ols_plot_cooksd_chart(model4)

#to find the median values
summary(cor_data)
## field_goal_pct total_rebounds three_point_field_goal_pct steals
## Min. :26.00 Min. :21.00 Min. :10.50 Min. : 1.0
## 1st Qu.:39.05 1st Qu.:29.00 1st Qu.:25.00 1st Qu.: 5.0
## Median :40.90 Median :33.00 Median :32.80 Median : 6.5
## Mean :42.63 Mean :32.67 Mean :32.09 Mean : 7.3
## 3rd Qu.:47.12 3rd Qu.:36.00 3rd Qu.:38.55 3rd Qu.: 9.0
## Max. :60.00 Max. :49.00 Max. :60.90 Max. :13.0
#creating new data frame for the median game
newdata=data.frame(field_goal_pct=40.90, total_rebounds = 33, three_point_field_goal_pct = 32.80, steals = 6.5)
#predicting team score with medians
predict(model4, newdata, interval = "confidence", level = 0.95)
## fit lwr upr
## 1 77.25382 74.3196 80.18804
I built the model to predict my team’s points for a game where they
achieved the median value for every variable. The predicted team score
is rprediction[1]. With 95% confidence interval,
(rprediction[2],rprediction[3])
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgNjogTG9zIEFuZ2VsZXMgU3BhcmtzIg0KYXV0aG9yOiAiQ2VhcmEgTydOZWFsIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQoNCmBgYCB7ciBzZXR1cCwgaW5jbHVkZT1GfQ0Kc2V0d2QoIkM6L1VzZXJzL2NlYXJhL09uZURyaXZlIC0gRWxvbiBVbml2ZXJzaXR5L0Rlc2t0b3AvOXN0YTMxOCIpDQoNCiNyZWFkcyBpbiB0aGUgZGF0YSBzZXQNCmRhdGEgPSByZWFkLmNzdigiV05CQV8yMDI1X2JveC1zY29yZXMuY3N2IiwgaGVhZGVyID0gVCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShvbHNycikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KYGBgDQoNCmBgYCB7ciB3cmFuZ2xpbmcsIGluY2x1ZGU9Rn0NCiNzdW1tYXJ5KGRhdGEpDQoNCiNBbGwgV05CQSB0ZWFtcyBpbmNsdWRlZCwgcmVtb3ZlIGFsbCBzdGFyIGdhbWUgc2NvcmUNCmRhdGEgPSBkYXRhICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lICE9ICJUZWFtIFdOQkEiICYgdGVhbV9uYW1lICE9ICJUZWFtIFVTQSIpDQoNCiNncm91cCBkYXRhIGJ5IHRlYW0sIGZpbmQgbWVhbiBhbmQgU0Qgb2YgYWxsIHZhcmlhYmxlcw0Kc3VtbWFyeSA9IGRhdGEgJT4lDQogIGdyb3VwX2J5KHRlYW1fbmFtZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3Njb3JlPW1lYW4odGVhbV9zY29yZSksIHNkX3Njb3JlPXNkKHRlYW1fc2NvcmUpLA0KICAgICAgICAgICAgbWVhbl9mZ3AgPSBtZWFuKGZpZWxkX2dvYWxfcGN0KSwgc2RfZmdwID0gc2QoZmllbGRfZ29hbF9wY3QpLCANCiAgICAgICAgICAgIG1lYW5fcmVib3VuZHMgPSBtZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmVib3VuZHMgPSBzZCh0b3RhbF9yZWJvdW5kcyksDQogICAgICAgICAgICBtZWFuXzNwdHBjdCA9IG1lYW4odGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpLCBzZF8zcHRwY3QgPSBzZCh0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksIA0KICAgICAgICAgICAgbWVhbl9zdGVhbHMgPSBtZWFuKHN0ZWFscyksIHNkX3N0ZWFscyA9IHNkKHN0ZWFscykpDQogIA0KI3NlbGVjdCBvbmx5IHZhcmlhYmxlcyB3ZSBuZWVkIGFuZCBmaWx0ZXIgb24gbXkgdGVhbSAgDQpteV90ZWFtID0gZGF0YSAlPiUNCiAgc2VsZWN0KHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGN0LCB0b3RhbF9yZWJvdW5kcywgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscywgdGVhbV9uYW1lLCB0ZWFtX3dpbm5lcikgJT4lIA0KICBmaWx0ZXIodGVhbV9uYW1lID09ICJTcGFya3MiKSAlPiUNCiAgbXV0YXRlKHJlc3VsdD0gY2FzZV93aGVuKHRlYW1fd2lubmVyPT1UUlVFfiJXaW4iLCB0ZWFtX3dpbm5lcj09RkFMU0V+Ikxvc3MiKSkNCiNncm91cHMgY2FzZXMgYnkgd2luIG9yIGxvc3MNCg0KI3N1bW1hcml6ZSBhbGwgdmFyaWFibGVzIHdpdGggbWVhbiBhbmQgU0QsIG5ldyBkYXRhIHNldCBjYWxsZWQgbXlfdGVhbV9tZWFucw0KbXlfdGVhbV9tZWFucyA9IG15X3RlYW0gJT4lDQogIGdyb3VwX2J5KHJlc3VsdCkgJT4lDQogIHN1bW1hcml6ZShtZWFuPW1lYW4odGVhbV9zY29yZSkpDQoNCmBgYA0KDQojIEludHJvZHVjdGlvbiANCg0KIyBUYWJsZXMNClRoaXMgaXMgdGhlIHNwYWNlIHdoZXJlIEkgd2lsbCBkZXNjcmliZSB0aGUgZGF0YSBzZXQsIG15IHRlYW0gYW5kIHRoZSAyMDI1IHNlYXNvbi4gDQoNClRhYmxlIERpc2N1c3Npb24tIA0KVGFibGUgMTogTXkgdGVhbSBkaWQgbm90IG1ha2UgdGhlIHBsYXlvZmZzLCBzb21lIHN0YXQgdG8gcHJvdmUgaXQNCg0KYGBge3IgdGFibGVzLCBpbmNsdWRlPVR9DQpzdW1tYXJ5ICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KDQojbWFraW5nIGEgdGFibGUgdG8gc2hvdyBhdmVyYWdlIHNjb3JlIGluIGEgd2luIHZlcnN1cyBhdmVyYWdlIHNjb3JlIGluIGEgbG9zcw0KbXlfdGVhbV9tZWFucyAlPiUNCiAga2JsKGNhcHRpb24gPSAiMjAyNSBMb3MgQW5nZWxlcyBTcGFya3MiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIkNhbWJyaWEiKQ0KYGBgDQoNCiMgSGlzdG9ncmFtcw0KSGlzdG9ncmFtIGRpc2N1c3Npb24NCmBgYHtyIGdyYXBocywgaW5jbHVkZT1ULCBmaWcud2lkdGg9IDUsIGZpZC5oZWlnaHQ9NH0NCiNjcmVhdGluZyBhIGhpc3RvZ3JhbSANCnAgPC0gbXlfdGVhbSAlPiUNCiAgZ2dwbG90KCBhZXMoeD10ZWFtX3Njb3JlLCBmaWxsPXJlc3VsdCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAicHVycGxlIiwgYWxwaGEgPSAwLjYsIHBvc2l0aW9uID0gJ2lkZW50aXR5JykgKyANCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygicHVycGxlIiwgInllbGxvdyIpKQ0KcA0KDQojbWFraW5nIHNpZGUgYnkgc2lkZSBib3ggcGxvdHMgdG8gY29tcGFyZSBwb2ludHMgc2NvcmVkIGluIGEgd2luIHZlcnN1cyBhIGxvc3MNCiBib3hwbG90KHRlYW1fc2NvcmUgfiByZXN1bHQsIGRhdGEgPSBteV90ZWFtLCBub3RjaCA9IFRSVUUsIA0KICAgICAgICBjb2wgPSBjKCJwdXJwbGUiLCAieWVsbG93IiksDQogICAgICAgIG1haW4gPSAiUG9pbnRzIHNjb3JlZCBieSBnYW1lIHJlc3VsdCIsDQogICAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKQ0KYGBgDQoNCkhpc3RvZ3JhbSBEaXNjdXNzaW9uDQpXaW5uaW5nIHYgTG9zaW5nLCBTaWRlIGJ5IFNpZGUsIGV0Yy4NCg0KIyBNb2RlbHMNCmBgYHtyIGZpcnN0IG9yZGVyIG1vZGVsLCBpbmNsdWRlPUZ9DQojY3JlYXRlIGFuZCBzdW1tYXJpemUgbW9kZWwgMQ0KbW9kZWwxID0gbG0odGVhbV9zY29yZX5maWVsZF9nb2FsX3BjdCArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0ICsgc3RlYWxzICsgdG90YWxfcmVib3VuZHMsIGRhdGEgPSBteV90ZWFtKSANCnN1bW1hcnkobW9kZWwxKQ0KDQojdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMNCnZpZihtb2RlbDEpDQoNCiNjcmVhdGUgbmV3IGRhdGEgZnJhbWUgdG8gdXNlIENPUiBmdW5jdGlvbg0KY29yX2RhdGEgPSBteV90ZWFtICU+JQ0KICBzZWxlY3QoZmllbGRfZ29hbF9wY3QsIHRvdGFsX3JlYm91bmRzLCB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgc3RlYWxzKQ0KDQojdG8gZ2V0IGNvcnJlbGF0aW9uIG1hdHJpeCANCmNvcihjb3JfZGF0YSkNCmBgYA0KDQoNCmBgYHtyIGludGVyYWN0aW9uIG1vZGVsLCByZXN1bHRzID0gJ2FzaXMnLCBpbmNsdWRlID0gRiwgY29tbWVudCA9IE5BfQ0KI21vZGVsMyBpcyBvdXIgaW50ZXJhY3Rpb24gbW9kZWwNCm1vZGVsMz0gbG0odGVhbV9zY29yZX4gZmllbGRfZ29hbF9wY3QqdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyBzdGVhbHMqZmllbGRfZ29hbF9wY3QgKyBmaWVsZF9nb2FsX3BjdCp0b3RhbF9yZWJvdW5kcyArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KnRvdGFsX3JlYm91bmRzICsgc3RlYWxzKnRvdGFsX3JlYm91bmRzICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Qqc3RlYWxzICtmaWVsZF9nb2FsX3BjdCArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KyB0b3RhbF9yZWJvdW5kcyArIHN0ZWFscywgZGF0YSA9IG15X3RlYW0pDQpzdW1tYXJ5KG1vZGVsMykNCg0KI2NyZWF0aW5nIG1vZGVsIDQgd2l0aCBub24tc2lnbmlmaWNhbnQgdGVybXMgcmVtb3ZlZA0KbW9kZWw0PSBsbSh0ZWFtX3Njb3JlfmZpZWxkX2dvYWxfcGN0ICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyB0b3RhbF9yZWJvdW5kcyArIGZpZWxkX2dvYWxfcGN0KnRvdGFsX3JlYm91bmRzICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QqdG90YWxfcmVib3VuZHMsIGRhdGEgPSBteV90ZWFtKSANCg0KbW9kZWw0c3VtPSBzdW1tYXJ5KG1vZGVsNCkNCg0KYGBgDQokfiQNCg0KQWZ0ZXIgYWxsIG1vZGVscyB3ZXJlIHJ1biBhbmQgbW9kZWwgcmVkdWN0aW9uIHdhcyBjb21wbGV0ZWQsIG15IGZpbmFsIG1vZGVsIGlzIA0KdGVhbV9zY29yZSA9IGByIG1vZGVsNCRjb2VmZmljaWVudHNbMV1gICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1syXWAgKiBmaWVsZF9nb2FsX3BjdCArIA0KYHIgbW9kZWw0JGNvZWZmaWNpZW50c1szXWAgKiB0b3RhbF9yZWJvdW5kcyArIGByIG1vZGVsNCRjb2VmZmljaWVudHNbNF1gICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyBgciBtb2RlbDQkY29lZmZpY2llbnRzWzVdYCAqIGZpZWxkX2dvYWxfcGN0OnRvdGFsX3JlYm91bmRzICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1s2XWAgKiB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdDp0b3RhbF9yZWJvdW5kcw0KDQpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgRihgcm1vZGVsNHN1bSRmc3RhdGlzdGljWzFdYCwgYHJtb2RlbDRzdW0kZnN0YXRpc3RpY1syXWApID0gYHJtb2RlbDRzdW0kZnN0YXRpc3RpY1sxXWAsIHAsIGFkanVzdGVkIFJeMj0gYHJhZGouci5zcXVhcmVkYA0KDQpTZWUgdGFibGUgYmVsb3cgZm9yIHJlc3VsdHMuIA0KDQpgYGAge3IsIGluY2x1ZGUgPSBULCBlY2hvPUYsIHJlc3VsdHM9ICdhc2lzJywgY29tbWVudD0gTkEsIG1lc3NhZ2UgPSBGfQ0KI2luY2x1ZGluZyBwYWNrYWdlIGZvciBBUEEgc3R5bGUgdGFibGUNCmxpYnJhcnkoc3RhcmdhemVyKQ0KI2NyZWF0aW5nIEFQQSBzdHlsZSB0YWJsZQ0Kc3RhcmdhemVyKG1vZGVsNCwgdHlwZSA9ICJodG1sIikNCmBgYA0KDQpgYGB7ciByZXNpZHVhbHN9DQoNCiNjcmVhdGluZyBoaXN0b2dyYW0gb2YgcmVzaWR1YWxzDQpvbHNfcGxvdF9yZXNpZF9oaXN0KG1vZGVsNCkNCg0KI2NyZWF0aW5nIHZlcnN1cyBmaXQgcGxvdA0Kb2xzX3Bsb3RfcmVzaWRfZml0KG1vZGVsNCkNCg0KI2NyZWF0aW5nIHN0dWRlbnRpemVkIHJlc2lkdWFscyBwbG90DQpvbHNfcGxvdF9yZXNpZF9zdHVkKG1vZGVsNCkNCg0KI2NyZWF0aW5nIGxldmVyYWdlIHBsb3QNCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDQsIHRocmVzaG9sZCA9IDMpDQoNCiNjcmVhdGluZyBjb29rcyBkaXN0YW5jZSBwbG90DQpvbHNfcGxvdF9jb29rc2RfY2hhcnQobW9kZWw0KQ0KDQpgYGANCg0KYGBge3IgcHJlZGljdGlvbn0NCiN0byBmaW5kIHRoZSBtZWRpYW4gdmFsdWVzDQpzdW1tYXJ5KGNvcl9kYXRhKQ0KDQojY3JlYXRpbmcgbmV3IGRhdGEgZnJhbWUgZm9yIHRoZSBtZWRpYW4gZ2FtZQ0KbmV3ZGF0YT1kYXRhLmZyYW1lKGZpZWxkX2dvYWxfcGN0PTQwLjkwLCB0b3RhbF9yZWJvdW5kcyA9IDMzLCB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCA9IDMyLjgwLCBzdGVhbHMgPSA2LjUpDQoNCiNwcmVkaWN0aW5nIHRlYW0gc2NvcmUgd2l0aCBtZWRpYW5zDQpwcmVkaWN0KG1vZGVsNCwgbmV3ZGF0YSwgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIGxldmVsID0gMC45NSkNCmBgYA0KDQpJIGJ1aWx0IHRoZSBtb2RlbCB0byBwcmVkaWN0IG15IHRlYW0ncyBwb2ludHMgZm9yIGEgZ2FtZSB3aGVyZSB0aGV5IGFjaGlldmVkIHRoZSBtZWRpYW4gdmFsdWUgZm9yIGV2ZXJ5IHZhcmlhYmxlLiBUaGUgcHJlZGljdGVkIHRlYW0gc2NvcmUgaXMgYHJwcmVkaWN0aW9uWzFdYC4gV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCwgKGBycHJlZGljdGlvblsyXWAsYHJwcmVkaWN0aW9uWzNdYCkNCg==