Introduction
The RMS Titanic was a British luxury passenger liner that sank during
its maiden voyage en route to New York City from Southampton, England,
killing about 1,500 passengers and ship personnel. It is one of the most
famous tragedies in modern history, it inspired numerous stories,
several films, and a musical and has been the subject of much
scholarship and scientific speculation.
This report will continue the scientific exploration of the Titanic.
The estimated 2,224 passengers all have their own stories of escape or
death in the wreck. It is believed, however, that studying the
underlying information about these passengers can provide insight on why
certain people survived.
RMS Titanic
Data Source
The data set used in this report is sourced from Kaggle.com. It was
orignially created for a machine learning competition hosted by Kaggle.
The link for this data set is https://www.kaggle.com/c/titanic. The data is originally
split into seperate train and testing data sets for purposes of the
competition. The train data is used in this report for more observations
and the complete set of variables.
The data was uploaded to a GitHub repository for perpetual online
access. This report will source the data from this repository (URL, https://raw.githubusercontent.com/ncbrechbill/STA321/refs/heads/main/STA321/titanic.csv)
This data contains 891 observations on 12 variables. Any observations
of N/A in variables of interest will be removed. The variables are:
- PassengerID: A unique identifier
- Survived: The survival status of the passenger (0 =
No, 1 = Yes)
- Pclass: The passengers ticket class (1st, 2nd, or
3rd)
- Name: The passengers name
- Sex: The passengers sex
- Age: The passengers age in years
- sibSp: Number of siblings/spouse aboard
- Parch: Number of parents/children aboard
- Ticket: Passenger’s ticket number
- Fare: Passengers boarding fare in USD
- Cabin: The passengers cabin
- Embarked: Location which passenger embarked (C =
Cherbourg, Q = Queenstown, S = Southampton)
url = "https://raw.githubusercontent.com/ncbrechbill/STA321/refs/heads/main/STA321/titanic.csv"
titanic <- read.csv(url)
data <- na.omit(select(titanic, Survived, Age, Sex, Pclass))
data$Pclass <- as.factor(data$Pclass)
Research Question
In many retellings of the Titanic’s story, the excerpt arises of
“Women and Children first” when loading the lifeboats for escape. This
suggests that age could factor greatly into one’s survival of the
catastrophe. This report investigates the relationship between a
passenger’s age and their likelihood of survival on the Titanic. To
address this, a simple logistic regression model is applied, with
survival (survived vs. not survived) as the binary outcome variable and
passenger age as the predictor. This approach allows us to evaluate
whether age significantly affected survival odds, estimate the direction
and magnitude of the effect, and assess the model’s ability to explain
variation in survival outcomes.
Exploratory Data
Analysis
Under simple logistic regression, only one variable is examined, and
thus, a simple check of the variable distribution provides insight to
any issues of skew.
Analysis
The histogram suggests slight right-skew, which is to be expected
with age distributions in most situations. No transformation will be
applied.
The frequency of survival does not imply a class imbalance that would
result in bias.
Logistic Regression
Model
Standard Model
With non-survival coded = 0, this level is the reference level used
by R, and survival = 1 is the event level.
#Build GLM
s.logit = glm(Survived ~ Age,
family = binomial(link = "logit"), # family is the binomial, logit(p) = log(p/(1-p))!
data = data)
result = summary(s.logit)
pander(result)
| (Intercept) |
-0.05672 |
0.1736 |
-0.3268 |
0.7438 |
| Age |
-0.01096 |
0.00533 |
-2.057 |
0.03969 |
(Dispersion parameter for binomial family taken to be 1 )
| Null deviance: |
964.5 on 713 degrees of freedom |
| Residual deviance: |
960.2 on 712 degrees of freedom |
pander(confint(s.logit))
| (Intercept) |
-0.3971 |
0.2841 |
| Age |
-0.02151 |
-0.0005832 |
Age shows a negative relationship with a passengers survival with
coefficient \(\beta_1\) = -0.01096 , p
= 0.03969. This is supported by the \(\beta_1\) 95% confidence interval of
[-0.02151, -0.0005832], which excludes the null value zero.
Odds Ratio Model
For more practical use, the coefficient has been transformed into an
odds ratio.
# Odds ratio
model.coef.stats = summary(s.logit)$coef
odds.ratio = exp(coef(s.logit))
out.stats = cbind(model.coef.stats, odds.ratio = odds.ratio)
pander(out.stats,caption = "Simple Logistic Regression Model with Odds Ratios")
Simple Logistic Regression Model with Odds Ratios
| (Intercept) |
-0.05672 |
0.1736 |
-0.3268 |
0.7438 |
0.9449 |
| Age |
-0.01096 |
0.00533 |
-2.057 |
0.03969 |
0.9891 |
The odds ratio of survival by age is 98.9%. This indicates that every
year of age reduces one’s odds by 1.1%. This may not
make a great difference for people a few years apart, but certainly
indicates a difference between a child and an elder.
Analysis
While a statistically significant relationship could be found, it is
apparent that age alone is not a strong predictor of one’s odds of
surviving this catastrophe. The slight drop in deviance suggests that
age can be an useful predictor, however it is likely not the only
predictor that would predict a passengers fate. Further research using
multiple logistic regression will likely find that multiple factors,
including age, are important to predicting one’s survival.
Application
Using the logistic regression model, we can determine a few
hypethetical passenger’s odds of survival at different ages. This helps
conceptualize the differences between these ages, assuming age the only
cause of difference in survival odds.
# Create a new dataframe with some example ages
new_passengers <- data.frame(Age = c(5, 20, 30, 50, 70))
# Predict probabilities of survival
pred_probs <- predict(s.logit, newdata = new_passengers, type = "response")
# Convert probabilities to odds
pred_odds <- pred_probs / (1 - pred_probs)
# Combine results into a summary table
predictions <- data.frame(
Age = new_passengers$Age,
Probability_of_Survival = round(pred_probs, 3),
Odds_of_Survival = round(pred_odds, 3)
)
pander(print(predictions))
Age Probability_of_Survival Odds_of_Survival 1 5 0.472 0.894 2 20
0.431 0.759 3 30 0.405 0.680 4 50 0.353 0.546 5 70 0.305 0.439
| 5 |
0.472 |
0.894 |
| 20 |
0.431 |
0.759 |
| 30 |
0.405 |
0.68 |
| 50 |
0.353 |
0.546 |
| 70 |
0.305 |
0.439 |
Discussion
Age was found to have an impact on a passengers odds of survival.
Every year of age of a passenger decreased the odds of their survival by
1.1%. It is important to notes that survival of this
tragedy has many complex factors to consider. It is expected, however,
that age will be likely to persist with a negative relationship to
survival odds. It may also be worth noting that the relationship may not
be entirely linear, and that survival factors may change at certain
ages. For example, the youngest passenger aboard was Master Assad
Alexander Thomas at about 4 months old. This passenger survived, but
their survival was certainly dependent on those around them, and not
their own actions. Consider the ages which a child may be seen as
“independent”, though certainly not capable of their own survival (such
as 1 year old Miss. Maria (“Mary”) Nakid.)
Multiple Logistic
Regression
Standard Model
As before, survival is coded as the event level. As a qualitative
factor, passenger class was coded with first class as the baseline.
#Build GLM
m.logit = glm(Survived ~ Age + Sex + Pclass,
family = binomial(link = "logit"), # family is the binomial, logit(p) = log(p/(1-p))!
data = data)
mresult = summary(m.logit)
pander(mresult)
| (Intercept) |
3.777 |
0.4011 |
9.416 |
4.682e-21 |
| Age |
-0.03699 |
0.007656 |
-4.831 |
1.359e-06 |
| Sexmale |
-2.523 |
0.2074 |
-12.16 |
4.811e-34 |
| Pclass2 |
-1.31 |
0.2781 |
-4.71 |
2.472e-06 |
| Pclass3 |
-2.581 |
0.2814 |
-9.169 |
4.761e-20 |
(Dispersion parameter for binomial family taken to be 1 )
| Null deviance: |
964.5 on 713 degrees of freedom |
| Residual deviance: |
647.3 on 709 degrees of freedom |
pander(confint(m.logit))
| (Intercept) |
3.015 |
4.589 |
| Age |
-0.05229 |
-0.02223 |
| Sexmale |
-2.939 |
-2.125 |
| Pclass2 |
-1.863 |
-0.7718 |
| Pclass3 |
-3.147 |
-2.042 |
Odds-Ratio Model
Odds-ratio conversions allow for easier interpretation.
# Odds ratio
m.model.coef.stats = summary(m.logit)$coef
m.odds.ratio = exp(coef(m.logit))
m.out.stats = cbind(m.model.coef.stats, odds.ratio = m.odds.ratio)
pander(m.out.stats,caption = "Multiple Logistic Regression Model with Odds Ratios")
Multiple Logistic Regression Model with Odds Ratios
| (Intercept) |
3.777 |
0.4011 |
9.416 |
4.682e-21 |
43.69 |
| Age |
-0.03699 |
0.007656 |
-4.831 |
1.359e-06 |
0.9637 |
| Sexmale |
-2.523 |
0.2074 |
-12.16 |
4.811e-34 |
0.08024 |
| Pclass2 |
-1.31 |
0.2781 |
-4.71 |
2.472e-06 |
0.2699 |
| Pclass3 |
-2.581 |
0.2814 |
-9.169 |
4.761e-20 |
0.07573 |
Discussion
All predictors were found to be significant. Every year of age would
reduce a passengers odds of survival by about 4%. Being male reduced
odds of survival by about 92%. Compared to first class passengers, 2nd
class passengers had 73% reduced odds of survival, and 3rd class
passengers had 93% reduced odds of survival.
LS0tDQp0aXRsZTogIkxvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWxzOiBUaXRhbmljIg0KYXV0aG9yOiAiTm9haCBCcmVjaGJpbGwiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19oZWlnaHQ6IDYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDIwcHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQo8L3N0eWxlPg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICBsaWJyYXJ5KHBhbmRlcikNCn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoZSBSTVMgVGl0YW5pYyB3YXMgYSBCcml0aXNoIGx1eHVyeSBwYXNzZW5nZXIgbGluZXIgdGhhdCBzYW5rIGR1cmluZyBpdHMgbWFpZGVuIHZveWFnZSBlbiByb3V0ZSB0byBOZXcgWW9yayBDaXR5IGZyb20gU291dGhhbXB0b24sIEVuZ2xhbmQsIGtpbGxpbmcgYWJvdXQgMSw1MDAgcGFzc2VuZ2VycyBhbmQgc2hpcCBwZXJzb25uZWwuIEl0IGlzIG9uZSBvZiB0aGUgbW9zdCBmYW1vdXMgdHJhZ2VkaWVzIGluIG1vZGVybiBoaXN0b3J5LCBpdCBpbnNwaXJlZCBudW1lcm91cyBzdG9yaWVzLCBzZXZlcmFsIGZpbG1zLCBhbmQgYSBtdXNpY2FsIGFuZCBoYXMgYmVlbiB0aGUgc3ViamVjdCBvZiBtdWNoIHNjaG9sYXJzaGlwIGFuZCBzY2llbnRpZmljIHNwZWN1bGF0aW9uLg0KDQpUaGlzIHJlcG9ydCB3aWxsIGNvbnRpbnVlIHRoZSBzY2llbnRpZmljIGV4cGxvcmF0aW9uIG9mIHRoZSBUaXRhbmljLiBUaGUgZXN0aW1hdGVkIDIsMjI0IHBhc3NlbmdlcnMgYWxsIGhhdmUgdGhlaXIgb3duIHN0b3JpZXMgb2YgZXNjYXBlIG9yIGRlYXRoIGluIHRoZSB3cmVjay4gSXQgaXMgYmVsaWV2ZWQsIGhvd2V2ZXIsIHRoYXQgc3R1ZHlpbmcgdGhlIHVuZGVybHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgcGFzc2VuZ2VycyBjYW4gcHJvdmlkZSBpbnNpZ2h0IG9uIHdoeSBjZXJ0YWluIHBlb3BsZSBzdXJ2aXZlZC4NCg0KIVtSTVMgVGl0YW5pY10oaW1hZ2VzL2NsaXBib2FyZC0yMDQxNzY4NDIyLnBuZykNCg0KIyBEYXRhIFNvdXJjZQ0KDQpUaGUgZGF0YSBzZXQgdXNlZCBpbiB0aGlzIHJlcG9ydCBpcyBzb3VyY2VkIGZyb20gS2FnZ2xlLmNvbS4gSXQgd2FzIG9yaWduaWFsbHkgY3JlYXRlZCBmb3IgYSBtYWNoaW5lIGxlYXJuaW5nIGNvbXBldGl0aW9uIGhvc3RlZCBieSBLYWdnbGUuIFRoZSBsaW5rIGZvciB0aGlzIGRhdGEgc2V0IGlzIDxodHRwczovL3d3dy5rYWdnbGUuY29tL2MvdGl0YW5pYz4uIFRoZSBkYXRhIGlzIG9yaWdpbmFsbHkgc3BsaXQgaW50byBzZXBlcmF0ZSB0cmFpbiBhbmQgdGVzdGluZyBkYXRhIHNldHMgZm9yIHB1cnBvc2VzIG9mIHRoZSBjb21wZXRpdGlvbi4gVGhlIHRyYWluIGRhdGEgaXMgdXNlZCBpbiB0aGlzIHJlcG9ydCBmb3IgbW9yZSBvYnNlcnZhdGlvbnMgYW5kIHRoZSBjb21wbGV0ZSBzZXQgb2YgdmFyaWFibGVzLg0KDQpUaGUgZGF0YSB3YXMgdXBsb2FkZWQgdG8gYSBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgcGVycGV0dWFsIG9ubGluZSBhY2Nlc3MuIFRoaXMgcmVwb3J0IHdpbGwgc291cmNlIHRoZSBkYXRhIGZyb20gdGhpcyByZXBvc2l0b3J5IChVUkwsIDxodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbmNicmVjaGJpbGwvU1RBMzIxL3JlZnMvaGVhZHMvbWFpbi9TVEEzMjEvdGl0YW5pYy5jc3Y+KQ0KDQpUaGlzIGRhdGEgY29udGFpbnMgODkxIG9ic2VydmF0aW9ucyBvbiAxMiB2YXJpYWJsZXMuIEFueSBvYnNlcnZhdGlvbnMgb2YgTi9BIGluIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCB3aWxsIGJlIHJlbW92ZWQuIFRoZSB2YXJpYWJsZXMgYXJlOg0KDQoxLiAgKipQYXNzZW5nZXJJRCoqOiBBIHVuaXF1ZSBpZGVudGlmaWVyDQoyLiAgKipTdXJ2aXZlZCoqOiBUaGUgc3Vydml2YWwgc3RhdHVzIG9mIHRoZSBwYXNzZW5nZXIgKDAgPSBObywgMSA9IFllcykNCjMuICAqKlBjbGFzcyoqOiBUaGUgcGFzc2VuZ2VycyB0aWNrZXQgY2xhc3MgKDFzdCwgMm5kLCBvciAzcmQpDQo0LiAgKipOYW1lKio6IFRoZSBwYXNzZW5nZXJzIG5hbWUNCjUuICAqKlNleCoqOiBUaGUgcGFzc2VuZ2VycyBzZXgNCjYuICAqKkFnZSoqOiBUaGUgcGFzc2VuZ2VycyBhZ2UgaW4geWVhcnMNCjcuICAqKnNpYlNwKio6IE51bWJlciBvZiBzaWJsaW5ncy9zcG91c2UgYWJvYXJkDQo4LiAgKipQYXJjaCoqOiBOdW1iZXIgb2YgcGFyZW50cy9jaGlsZHJlbiBhYm9hcmQNCjkuICAqKlRpY2tldCoqOiBQYXNzZW5nZXIncyB0aWNrZXQgbnVtYmVyDQoxMC4gKipGYXJlKio6IFBhc3NlbmdlcnMgYm9hcmRpbmcgZmFyZSBpbiBVU0QNCjExLiAqKkNhYmluKio6IFRoZSBwYXNzZW5nZXJzIGNhYmluDQoxMi4gKipFbWJhcmtlZCoqOiBMb2NhdGlvbiB3aGljaCBwYXNzZW5nZXIgZW1iYXJrZWQgKEMgPSBDaGVyYm91cmcsIFEgPSBRdWVlbnN0b3duLCBTID0gU291dGhhbXB0b24pDQoNCmBgYHtyfQ0KdXJsID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9uY2JyZWNoYmlsbC9TVEEzMjEvcmVmcy9oZWFkcy9tYWluL1NUQTMyMS90aXRhbmljLmNzdiINCnRpdGFuaWMgPC0gcmVhZC5jc3YodXJsKQ0KZGF0YSA8LSBuYS5vbWl0KHNlbGVjdCh0aXRhbmljLCBTdXJ2aXZlZCwgQWdlLCBTZXgsIFBjbGFzcykpDQpkYXRhJFBjbGFzcyA8LSBhcy5mYWN0b3IoZGF0YSRQY2xhc3MpDQpgYGANCg0KIyBSZXNlYXJjaCBRdWVzdGlvbg0KDQpJbiBtYW55IHJldGVsbGluZ3Mgb2YgdGhlIFRpdGFuaWMncyBzdG9yeSwgdGhlIGV4Y2VycHQgYXJpc2VzIG9mICJXb21lbiBhbmQgQ2hpbGRyZW4gZmlyc3QiIHdoZW4gbG9hZGluZyB0aGUgbGlmZWJvYXRzIGZvciBlc2NhcGUuIFRoaXMgc3VnZ2VzdHMgdGhhdCBhZ2UgY291bGQgZmFjdG9yIGdyZWF0bHkgaW50byBvbmUncyBzdXJ2aXZhbCBvZiB0aGUgY2F0YXN0cm9waGUuIFRoaXMgcmVwb3J0IGludmVzdGlnYXRlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBwYXNzZW5nZXLigJlzIGFnZSBhbmQgdGhlaXIgbGlrZWxpaG9vZCBvZiBzdXJ2aXZhbCBvbiB0aGUgVGl0YW5pYy4gVG8gYWRkcmVzcyB0aGlzLCBhIHNpbXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGlzIGFwcGxpZWQsIHdpdGggc3Vydml2YWwgKHN1cnZpdmVkIHZzLiBub3Qgc3Vydml2ZWQpIGFzIHRoZSBiaW5hcnkgb3V0Y29tZSB2YXJpYWJsZSBhbmQgcGFzc2VuZ2VyIGFnZSBhcyB0aGUgcHJlZGljdG9yLiBUaGlzIGFwcHJvYWNoIGFsbG93cyB1cyB0byBldmFsdWF0ZSB3aGV0aGVyIGFnZSBzaWduaWZpY2FudGx5IGFmZmVjdGVkIHN1cnZpdmFsIG9kZHMsIGVzdGltYXRlIHRoZSBkaXJlY3Rpb24gYW5kIG1hZ25pdHVkZSBvZiB0aGUgZWZmZWN0LCBhbmQgYXNzZXNzIHRoZSBtb2RlbOKAmXMgYWJpbGl0eSB0byBleHBsYWluIHZhcmlhdGlvbiBpbiBzdXJ2aXZhbCBvdXRjb21lcy4NCg0KIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzDQoNClVuZGVyIHNpbXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uLCBvbmx5IG9uZSB2YXJpYWJsZSBpcyBleGFtaW5lZCwgYW5kIHRodXMsIGEgc2ltcGxlIGNoZWNrIG9mIHRoZSB2YXJpYWJsZSBkaXN0cmlidXRpb24gcHJvdmlkZXMgaW5zaWdodCB0byBhbnkgaXNzdWVzIG9mIHNrZXcuDQoNCiMjIEZpZ3VyZXMNCg0KYGBge3J9DQojSGlzdG9ncmFtIGZvciByZXNwb25zZSBkaXN0cmlidXRpb24NCmhpc3QoZGF0YSRBZ2UsIHByb2JhYmlsaXR5ID0gVFJVRSwgDQogICAgIG1haW4gPSAiQWdlIERpc3RyaWJ1dGlvbiIsIA0KICAgICB4bGFiPSJBZ2UiLCANCiAgICAgY29sID0gImxpZ2h0Z3JheSIsIA0KICAgICBib3JkZXI9ImJsYWNrIikNCmxpbmVzKGRlbnNpdHkoZGF0YSRBZ2UsIGFkanVzdD0yKSwgY29sPSJtYXJvb24iKSANCnBhbmRlcihzdW1tYXJ5KGRhdGEkQWdlKSkNCg0KDQoNCmxhYmVsIDwtIGZhY3RvcihkYXRhJFN1cnZpdmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkRpZCBOb3QgU3Vydml2ZSIsICJTdXJ2aXZlZCIpKQ0Kc3VtbWFyeV90YWJsZSA8LSBjYmluZCgNCiAgRnJlcXVlbmN5ID0gdGFibGUobGFiZWwpLA0KICBQcm9wb3J0aW9uID0gcHJvcC50YWJsZSh0YWJsZShsYWJlbCkpKQ0KDQpwYW5kZXIoc3VtbWFyeV90YWJsZSkNCmBgYA0KDQojIyBBbmFseXNpcw0KDQpUaGUgaGlzdG9ncmFtIHN1Z2dlc3RzIHNsaWdodCByaWdodC1za2V3LCB3aGljaCBpcyB0byBiZSBleHBlY3RlZCB3aXRoIGFnZSBkaXN0cmlidXRpb25zIGluIG1vc3Qgc2l0dWF0aW9ucy4gTm8gdHJhbnNmb3JtYXRpb24gd2lsbCBiZSBhcHBsaWVkLg0KDQpUaGUgZnJlcXVlbmN5IG9mIHN1cnZpdmFsIGRvZXMgbm90IGltcGx5IGEgY2xhc3MgaW1iYWxhbmNlIHRoYXQgd291bGQgcmVzdWx0IGluIGJpYXMuDQoNCiMgTG9naXN0aWMgUmVncmVzc2lvbiBNb2RlbA0KDQojIyBTdGFuZGFyZCBNb2RlbA0KDQpXaXRoIG5vbi1zdXJ2aXZhbCBjb2RlZCA9IDAsIHRoaXMgbGV2ZWwgaXMgdGhlIHJlZmVyZW5jZSBsZXZlbCB1c2VkIGJ5IFIsIGFuZCBzdXJ2aXZhbCA9IDEgaXMgdGhlIGV2ZW50IGxldmVsLg0KDQpgYGB7cn0NCiNCdWlsZCBHTE0NCnMubG9naXQgPSBnbG0oU3Vydml2ZWQgfiBBZ2UsIA0KICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksICAjIGZhbWlseSBpcyB0aGUgYmlub21pYWwsIGxvZ2l0KHApID0gbG9nKHAvKDEtcCkpIQ0KICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCnJlc3VsdCA9IHN1bW1hcnkocy5sb2dpdCkNCnBhbmRlcihyZXN1bHQpDQpwYW5kZXIoY29uZmludChzLmxvZ2l0KSkNCmBgYA0KDQpBZ2Ugc2hvd3MgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgd2l0aCBhIHBhc3NlbmdlcnMgc3Vydml2YWwgd2l0aCBjb2VmZmljaWVudCAkXGJldGFfMSQgPSAtMC4wMTA5NiAsIHAgPSAwLjAzOTY5LiBUaGlzIGlzIHN1cHBvcnRlZCBieSB0aGUgJFxiZXRhXzEkIDk1JSBjb25maWRlbmNlIGludGVydmFsIG9mIFstMC4wMjE1MSwgLTAuMDAwNTgzMl0sIHdoaWNoIGV4Y2x1ZGVzIHRoZSBudWxsIHZhbHVlIHplcm8uDQoNCiMjIE9kZHMgUmF0aW8gTW9kZWwNCg0KRm9yIG1vcmUgcHJhY3RpY2FsIHVzZSwgdGhlIGNvZWZmaWNpZW50IGhhcyBiZWVuIHRyYW5zZm9ybWVkIGludG8gYW4gb2RkcyByYXRpby4NCg0KYGBge3J9DQojIE9kZHMgcmF0aW8NCm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KHMubG9naXQpJGNvZWYNCm9kZHMucmF0aW8gPSBleHAoY29lZihzLmxvZ2l0KSkNCm91dC5zdGF0cyA9IGNiaW5kKG1vZGVsLmNvZWYuc3RhdHMsIG9kZHMucmF0aW8gPSBvZGRzLnJhdGlvKSAgICAgICAgICAgICAgICAgDQpwYW5kZXIob3V0LnN0YXRzLGNhcHRpb24gPSAiU2ltcGxlIExvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWwgd2l0aCBPZGRzIFJhdGlvcyIpDQpgYGANCg0KVGhlIG9kZHMgcmF0aW8gb2Ygc3Vydml2YWwgYnkgYWdlIGlzIDk4LjklLiBUaGlzIGluZGljYXRlcyB0aGF0IGV2ZXJ5IHllYXIgb2YgYWdlIHJlZHVjZXMgb25lJ3Mgb2RkcyBieSAqKjEuMSUqKi4gVGhpcyBtYXkgbm90IG1ha2UgYSBncmVhdCBkaWZmZXJlbmNlIGZvciBwZW9wbGUgYSBmZXcgeWVhcnMgYXBhcnQsIGJ1dCBjZXJ0YWlubHkgaW5kaWNhdGVzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY2hpbGQgYW5kIGFuIGVsZGVyLg0KDQojIyBBbmFseXNpcw0KDQpXaGlsZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGNvdWxkIGJlIGZvdW5kLCBpdCBpcyBhcHBhcmVudCB0aGF0IGFnZSBhbG9uZSBpcyBub3QgYSBzdHJvbmcgcHJlZGljdG9yIG9mIG9uZSdzIG9kZHMgb2Ygc3Vydml2aW5nIHRoaXMgY2F0YXN0cm9waGUuIFRoZSBzbGlnaHQgZHJvcCBpbiBkZXZpYW5jZSBzdWdnZXN0cyB0aGF0IGFnZSBjYW4gYmUgYW4gdXNlZnVsIHByZWRpY3RvciwgaG93ZXZlciBpdCBpcyBsaWtlbHkgbm90IHRoZSBvbmx5IHByZWRpY3RvciB0aGF0IHdvdWxkIHByZWRpY3QgYSBwYXNzZW5nZXJzIGZhdGUuIEZ1cnRoZXIgcmVzZWFyY2ggdXNpbmcgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiB3aWxsIGxpa2VseSBmaW5kIHRoYXQgbXVsdGlwbGUgZmFjdG9ycywgaW5jbHVkaW5nIGFnZSwgYXJlIGltcG9ydGFudCB0byBwcmVkaWN0aW5nIG9uZSdzIHN1cnZpdmFsLg0KDQojIyBBcHBsaWNhdGlvbg0KDQpVc2luZyB0aGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCwgd2UgY2FuIGRldGVybWluZSBhIGZldyBoeXBldGhldGljYWwgcGFzc2VuZ2VyJ3Mgb2RkcyBvZiBzdXJ2aXZhbCBhdCBkaWZmZXJlbnQgYWdlcy4gVGhpcyBoZWxwcyBjb25jZXB0dWFsaXplIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIGFnZXMsIGFzc3VtaW5nIGFnZSB0aGUgb25seSBjYXVzZSBvZiBkaWZmZXJlbmNlIGluIHN1cnZpdmFsIG9kZHMuDQoNCmBgYHtyfQ0KIyBDcmVhdGUgYSBuZXcgZGF0YWZyYW1lIHdpdGggc29tZSBleGFtcGxlIGFnZXMNCm5ld19wYXNzZW5nZXJzIDwtIGRhdGEuZnJhbWUoQWdlID0gYyg1LCAyMCwgMzAsIDUwLCA3MCkpDQoNCiMgUHJlZGljdCBwcm9iYWJpbGl0aWVzIG9mIHN1cnZpdmFsDQpwcmVkX3Byb2JzIDwtIHByZWRpY3Qocy5sb2dpdCwgbmV3ZGF0YSA9IG5ld19wYXNzZW5nZXJzLCB0eXBlID0gInJlc3BvbnNlIikNCg0KIyBDb252ZXJ0IHByb2JhYmlsaXRpZXMgdG8gb2Rkcw0KcHJlZF9vZGRzIDwtIHByZWRfcHJvYnMgLyAoMSAtIHByZWRfcHJvYnMpDQoNCiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBzdW1tYXJ5IHRhYmxlDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKA0KICBBZ2UgPSBuZXdfcGFzc2VuZ2VycyRBZ2UsDQogIFByb2JhYmlsaXR5X29mX1N1cnZpdmFsID0gcm91bmQocHJlZF9wcm9icywgMyksDQogIE9kZHNfb2ZfU3Vydml2YWwgPSByb3VuZChwcmVkX29kZHMsIDMpDQopDQoNCnBhbmRlcihwcmludChwcmVkaWN0aW9ucykpDQpgYGANCg0KIyMgRGlzY3Vzc2lvbg0KDQpBZ2Ugd2FzIGZvdW5kIHRvIGhhdmUgYW4gaW1wYWN0IG9uIGEgcGFzc2VuZ2VycyBvZGRzIG9mIHN1cnZpdmFsLiBFdmVyeSB5ZWFyIG9mIGFnZSBvZiBhIHBhc3NlbmdlciBkZWNyZWFzZWQgdGhlIG9kZHMgb2YgdGhlaXIgc3Vydml2YWwgYnkgKioxLjElKiouIEl0IGlzIGltcG9ydGFudCB0byBub3RlcyB0aGF0IHN1cnZpdmFsIG9mIHRoaXMgdHJhZ2VkeSBoYXMgbWFueSBjb21wbGV4IGZhY3RvcnMgdG8gY29uc2lkZXIuIEl0IGlzIGV4cGVjdGVkLCBob3dldmVyLCB0aGF0IGFnZSB3aWxsIGJlIGxpa2VseSB0byBwZXJzaXN0IHdpdGggYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgdG8gc3Vydml2YWwgb2Rkcy4gSXQgbWF5IGFsc28gYmUgd29ydGggbm90aW5nIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBtYXkgbm90IGJlIGVudGlyZWx5IGxpbmVhciwgYW5kIHRoYXQgc3Vydml2YWwgZmFjdG9ycyBtYXkgY2hhbmdlIGF0IGNlcnRhaW4gYWdlcy4gRm9yIGV4YW1wbGUsIHRoZSB5b3VuZ2VzdCBwYXNzZW5nZXIgYWJvYXJkIHdhcyBNYXN0ZXIgQXNzYWQgQWxleGFuZGVyIFRob21hcyBhdCBhYm91dCA0IG1vbnRocyBvbGQuIFRoaXMgcGFzc2VuZ2VyIHN1cnZpdmVkLCBidXQgdGhlaXIgc3Vydml2YWwgd2FzIGNlcnRhaW5seSBkZXBlbmRlbnQgb24gdGhvc2UgYXJvdW5kIHRoZW0sIGFuZCBub3QgdGhlaXIgb3duIGFjdGlvbnMuIENvbnNpZGVyIHRoZSBhZ2VzIHdoaWNoIGEgY2hpbGQgbWF5IGJlIHNlZW4gYXMgImluZGVwZW5kZW50IiwgdGhvdWdoIGNlcnRhaW5seSBub3QgY2FwYWJsZSBvZiB0aGVpciBvd24gc3Vydml2YWwgKHN1Y2ggYXMgMSB5ZWFyIG9sZCBNaXNzLiBNYXJpYSAoIk1hcnkiKSBOYWtpZC4pDQoNCiMgTXVsdGlwbGUgTG9naXN0aWMgUmVncmVzc2lvbg0KDQojIyBTdGFuZGFyZCBNb2RlbA0KDQpBcyBiZWZvcmUsIHN1cnZpdmFsIGlzIGNvZGVkIGFzIHRoZSBldmVudCBsZXZlbC4gQXMgYSBxdWFsaXRhdGl2ZSBmYWN0b3IsIHBhc3NlbmdlciBjbGFzcyB3YXMgY29kZWQgd2l0aCBmaXJzdCBjbGFzcyBhcyB0aGUgYmFzZWxpbmUuDQoNCmBgYHtyfQ0KI0J1aWxkIEdMTQ0KbS5sb2dpdCA9IGdsbShTdXJ2aXZlZCB+IEFnZSArIFNleCArIFBjbGFzcywgDQogICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwgICMgZmFtaWx5IGlzIHRoZSBiaW5vbWlhbCwgbG9naXQocCkgPSBsb2cocC8oMS1wKSkhDQogICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KbXJlc3VsdCA9IHN1bW1hcnkobS5sb2dpdCkNCnBhbmRlcihtcmVzdWx0KQ0KcGFuZGVyKGNvbmZpbnQobS5sb2dpdCkpDQpgYGANCg0KIyMgT2Rkcy1SYXRpbyBNb2RlbA0KDQpPZGRzLXJhdGlvIGNvbnZlcnNpb25zIGFsbG93IGZvciBlYXNpZXIgaW50ZXJwcmV0YXRpb24uDQoNCmBgYHtyfQ0KIyBPZGRzIHJhdGlvDQptLm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KG0ubG9naXQpJGNvZWYNCm0ub2Rkcy5yYXRpbyA9IGV4cChjb2VmKG0ubG9naXQpKQ0KbS5vdXQuc3RhdHMgPSBjYmluZChtLm1vZGVsLmNvZWYuc3RhdHMsIG9kZHMucmF0aW8gPSBtLm9kZHMucmF0aW8pICAgICAgICAgICAgICAgICANCnBhbmRlcihtLm91dC5zdGF0cyxjYXB0aW9uID0gIk11bHRpcGxlIExvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWwgd2l0aCBPZGRzIFJhdGlvcyIpDQpgYGANCg0KIyMgRGlzY3Vzc2lvbg0KDQpBbGwgcHJlZGljdG9ycyB3ZXJlIGZvdW5kIHRvIGJlIHNpZ25pZmljYW50LiBFdmVyeSB5ZWFyIG9mIGFnZSB3b3VsZCByZWR1Y2UgYSBwYXNzZW5nZXJzIG9kZHMgb2Ygc3Vydml2YWwgYnkgYWJvdXQgNCUuIEJlaW5nIG1hbGUgcmVkdWNlZCBvZGRzIG9mIHN1cnZpdmFsIGJ5IGFib3V0IDkyJS4gQ29tcGFyZWQgdG8gZmlyc3QgY2xhc3MgcGFzc2VuZ2VycywgMm5kIGNsYXNzIHBhc3NlbmdlcnMgaGFkIDczJSByZWR1Y2VkIG9kZHMgb2Ygc3Vydml2YWwsIGFuZCAzcmQgY2xhc3MgcGFzc2VuZ2VycyBoYWQgOTMlIHJlZHVjZWQgb2RkcyBvZiBzdXJ2aXZhbC4NCg==