data=read_excel("E:\\datasets for programming\\Final Excel REsponses for PHD (2).xlsx",sheet = 'Sheet3')
New names:
data1=read_excel("E:\\datasets for programming\\Final Excel REsponses for PHD (2).xlsx")
New names:
# Cronbach's ALpha for Awareness of FL
library(psych)
Warning: package ‘psych’ was built under R version 4.4.3
Awareness_alpha = psych::alpha(data1[,c(48:77)]) 
ifelse(Awareness_alpha$total[,1] > 0.75 , 'Likert items hang together in well manner','No Redundancy')
[1] "Likert items hang together in well manner"
Awareness_alpha$total[,1]
[1] 0.9743263
Investment_conideration_alpha=psych::alpha(data1[,c(34:39)])
ifelse(Investment_conideration_alpha$total[,1] > 0.75 ,'Likert items of investment consideration hang together in well manner', 'No redudancy')
[1] "Likert items of investment consideration hang together in well manner"
Investment_conideration_alpha$total[,1]
[1] 0.8280706
Major_investment_alpha$total[,1]
[1] 0.6387958
Investment_challange_alpha$total[,1] # Acceptable
[1] 0.6004277

is os found that there is no statistically significant difference in Financial Literacy Score distributions across the maratial status

from the above plot we can infer that the average finincial literacy score for those womens whose working experience is Up to 5y, 6-10y, above 15y is almost same. And due to unfulfillement of required assumption of parametric test, i have moved to non parametric kruskal wallis test which suggest that, there is no statistically significant difference between FL score for women with different level of work experience.

ggplot(data, aes(x =data[[31]])) +
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
  geom_vline(aes(xintercept = mean(data[[31]])), 
             color = "red", linetype = "dashed", size = 1.2) +
  labs(x = "Sector status", y = "Investment consideration Score", title = "Score by Sector Status")+
  facet_wrap(~data[[11]])
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
Please use `linewidth` instead.

CA Interpretation :

Here’s how to interpret the plot and the summary output:

Inertia (Explained Variance): The summary output will show you how much of the total “inertia” (which is related to the χ 2 statistic) is explained by each dimension (axis).

Dimension 1 (Dim 1) likely accounts for the vast majority of the inertia (~80-90%). Looking at the plot, this horizontal axis clearly separates preferences, running from LeastPreferred on the left to Preferred and HighlyPreferred on the right. It represents the primary axis of “dislike vs. like.”

Dimension 2 (Dim 2) accounts for a smaller portion of the inertia. This vertical axis helps separate the categories further.

Interpreting the Biplot:

Safe/Low Risk is positioned very closely to Preferred and HighlyPreferred. This indicates a strong association; people who prefer safe/low-risk investments also tend to rate them as preferred or highly preferred.

High Risk is positioned far out on the left, very close to LeastPreferred and DontKnow. This shows a strong association where high-risk investments are seen as the least preferred. The proximity to “DontKnow” might suggest uncertainty or aversion.

Moderate Risk and Traditional are located closer to the center (origin) and near Neutral. This suggests their preference profiles are less extreme and more average compared to the high and low-risk categories. “Traditional” in particular seems to have a fairly neutral, slightly varied preference profile.

Overall Story: The analysis paints a clear picture. The primary factor driving investment preference is the level of risk. Safe/Low-risk options are strongly and positively preferred, while High-risk options are strongly disliked. Moderate and traditional options fall in the middle, eliciting a more neutral or average response.

library(corrplot)
Warning: package ‘corrplot’ was built under R version 4.4.3corrplot 0.95 loaded
residual=chi_sq_result$residuals
print("standardized Residuals:");print(round(residual,2))
[1] "standardized Residuals:"
     DontKnow LeastPreferred Neutral Preferred HighlyPreferred
[1,]     8.52           3.48   -1.36     -5.46           -3.92
[2,]     0.49          -6.19    4.89      2.52           -2.99
[3,]    -5.67           0.65   -2.01      3.61            3.13
[4,]    -0.49           3.40   -1.79     -3.26            2.94
# Visualize the residuals using corrplot
# Positive residuals are in blue, negative are in red.
# The size and color intensity of the circle correspond to the magnitude of the residual.

corrplot(residual,is.cor=FALSE,
         method = "color", # Display as colored cells
         tl.col = "black",
         addCoef.col = "black", # Add the residual values on the plot
         number.cex = 0.8)

NA
NA

The key to interpretation is the “rule of 2”:

A standardized residual greater than 2 means the observed count in that cell is significantly higher than what we’d expect if there were no association.

A standardized residual less than -2 means the observed count is significantly lower than expected.

Values between -2 and 2 are considered within the range of random chance.


# Major Invest Objectives
Major_Objectives=rbind(table(data1[[16]]),table(data1[[17]]),table(data1[[18]]),table(data1[[19]]),
      table(data1[[20]]),table(data1[[21]]),table(data1[[22]]),table(data1[[23]]))
rownames(Major_Objectives)=c('Wealth Creation','Earn regular Return','Meet unanticipated e',
               'Children/Self education','Children/self Marriage','Old age Plannig',
               'Reduce Tax Burden','House Purchase')
Major_Objectives
                          1   2   3
Wealth Creation         304 106  29
Earn regular Return     184 148 107
Meet unanticipated e    110 195 134
Children/Self education 146 129 164
Children/self Marriage  165 149 125
Old age Plannig         194 136 109
Reduce Tax Burden       133 145 161
House Purchase          163 112 164
# Ordinary INvest objectives
Ordinary_Objectuves=rbind(table(data1[[25]]),table(data1[[26]]),table(data1[[27]]),table(data1[[28]]),
      table(data1[[29]]),table(data1[[30]]))
Warning: number of columns of result is not a multiple of vector length (arg 1)
rownames(Ordinary_Objectuves)=c('Make Earning/ part of income','Have a flow of income','Anticipated future needs',
               'Build reserve for unseen contigencies','Build assets[Land,Gold]','Save Tax')

Ordinary_Objectuves
                                        1   2  3  4  5   6   7
Make Earning/ part of income          246  82 40 10 53   8 246
Have a flow of income                 241 148 21 16 13 241 148
Anticipated future needs              182 122 96 13 26 182 122
Build reserve for unseen contigencies 122 147 90 10 31   9  30
Build assets[Land,Gold]               223 111 70 24 11 223 111
Save Tax                              150 121 68 26  6  65   3
Total_Major_invest_obj_score=rowSums(Major_Objectives)
Total_Ordi_invest_obj_score=rowSums(Ordinary_Objectuves)



# Visualisation of total score
barplot(Major_Objectives[,1],col='green',ylim=c(0,1000))

barplot(Major_Objectives[,2],col='red',ylim=c(0,1000))

barplot(Major_Objectives[,3],col='orange',ylim=c(0,1000))


chisq_major=chisq.test(Major_Objectives[,-1])

S=svd(Major_Objectives)
chisq.test(Ordinary_Objectuves[,-1])      # implies there is an association between investment objectives

    Pearson's Chi-squared test

data:  Ordinary_Objectuves[, -1]
X-squared = 877.81, df = 25, p-value < 2.2e-16
# Weighted overall investment objectives
data$Overall_invest_Obj_score=8*data1[[24]] + 6*data1[[31]]


# Correspondence Analysis (CA)

#Visual way to map association between type of investment objectives and ranking.


library(FactoMineR)
library(factoextra)

ca_result1 <- CA(as.matrix(Major_Objectives[-1,]), graph=TRUE)

fviz_ca_biplot(ca_result1)
Registered S3 methods overwritten by 'car':
  method       from
  hist.boot    FSA 
  confint.boot FSA 

ca_result2 <- CA(as.matrix(Ordinary_Objectuves[-1,]), graph=TRUE)

fviz_ca_biplot(ca_result2)

NA
NA
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KDQpkYXRhPXJlYWRfZXhjZWwoIkU6XFxkYXRhc2V0cyBmb3IgcHJvZ3JhbW1pbmdcXEZpbmFsIEV4Y2VsIFJFc3BvbnNlcyBmb3IgUEhEICgyKS54bHN4IixzaGVldCA9ICdTaGVldDMnKQ0Kc3RyKGRhdGEpDQoNClZpZXcoZGF0YS5mcmFtZShOTyA9IHNlcV9hbG9uZyhjb2xuYW1lcyhkYXRhKSksTmFtZT1jb2xuYW1lcyhkYXRhKSkpDQpgYGANCg0KDQpgYGB7cn0NCmRhdGExPXJlYWRfZXhjZWwoIkU6XFxkYXRhc2V0cyBmb3IgcHJvZ3JhbW1pbmdcXEZpbmFsIEV4Y2VsIFJFc3BvbnNlcyBmb3IgUEhEICgyKS54bHN4IikNClZpZXcoZGF0YS5mcmFtZShObz1zZXFfYWxvbmcoY29sbmFtZXMoZGF0YTEpKSxOYW1lPWNvbG5hbWVzKGRhdGExKSkpDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyBDcm9uYmFjaCdzIEFMcGhhIGZvciBBd2FyZW5lc3Mgb2YgRkwNCmxpYnJhcnkocHN5Y2gpDQpBd2FyZW5lc3NfYWxwaGEgPSBwc3ljaDo6YWxwaGEoZGF0YTFbLGMoNDg6NzcpXSkgDQppZmVsc2UoQXdhcmVuZXNzX2FscGhhJHRvdGFsWywxXSA+IDAuNzUgLCAnTGlrZXJ0IGl0ZW1zIGhhbmcgdG9nZXRoZXIgaW4gd2VsbCBtYW5uZXInLCdObyBSZWR1bmRhbmN5JykNCkF3YXJlbmVzc19hbHBoYSR0b3RhbFssMV0NCg0KDQoNCkludmVzdG1lbnRfY29uaWRlcmF0aW9uX2FscGhhPXBzeWNoOjphbHBoYShkYXRhMVssYygzNDozOSldKQ0KaWZlbHNlKEludmVzdG1lbnRfY29uaWRlcmF0aW9uX2FscGhhJHRvdGFsWywxXSA+IDAuNzUgLCdMaWtlcnQgaXRlbXMgb2YgaW52ZXN0bWVudCBjb25zaWRlcmF0aW9uIGhhbmcgdG9nZXRoZXIgaW4gd2VsbCBtYW5uZXInLCAnTm8gcmVkdWRhbmN5JykNCkludmVzdG1lbnRfY29uaWRlcmF0aW9uX2FscGhhJHRvdGFsWywxXQ0KYGBgDQoNCg0KYGBge3J9DQojIENyb25iYWNoJ3MgQUxwaGEgZm9yIE1ham9yIEludmVzdG1lbnQgb2YgRkwNCmxpYnJhcnkocHN5Y2gpDQpNYWpvcl9pbnZlc3RtZW50X2FscGhhID0gcHN5Y2g6OmFscGhhKGRhdGExWyxjKDE3OjIzKV0pIA0KaWZlbHNlKE1ham9yX2ludmVzdG1lbnRfYWxwaGEkdG90YWxbLDFdID4gMC43NSAsICdMaWtlcnQgaXRlbXMgaGFuZyB0b2dldGhlciBpbiB3ZWxsIG1hbm5lcicsJ05vIFJlZHVuZGFuY3knKQ0KTWFqb3JfaW52ZXN0bWVudF9hbHBoYSR0b3RhbFssMV0NCmBgYA0KDQoNCg0KYGBge3J9DQojIENyb25iYWNoJ3MgQUxwaGEgZm9yIEludmVzdG1lbnQgQ2hhbGxhbmdlIG9mIEZMDQoNCkludmVzdG1lbnRfY2hhbGxhbmdlX2FscGhhID0gcHN5Y2g6OmFscGhhKGRhdGExWyxjKDEwNToxMTApXSkgDQppZmVsc2UoSW52ZXN0bWVudF9jaGFsbGFuZ2VfYWxwaGEkdG90YWxbLDFdID4gMC43NSAsICdMaWtlcnQgaXRlbXMgaGFuZyB0b2dldGhlciBpbiB3ZWxsIG1hbm5lcicsJ05vIFJlZHVuZGFuY3knKQ0KSW52ZXN0bWVudF9jaGFsbGFuZ2VfYWxwaGEkdG90YWxbLDFdICMgQWNjZXB0YWJsZQ0KDQpgYGANCg0KYGBge3J9DQojIFNvY2lvIEVjb25vbWljIEZhY3RvciBNYXJpdGlhbCBTdGF0dXMgYXNzb2NpYXRlIHdpdGggRkwgYW1vbmcgTk1VIFdXDQojIHdpbGNveC50ZXN0KGNvbG5hbWVzKGRhdGFbLDI0XSl+Y29sbmFtZXMoZGF0YVssM10pLGRhdGEpDQprcnVza2FsLnRlc3QoZGF0YVtbMjRdXX5hcy5mYWN0b3IoZGF0YVtbM11dKSkNCg0KdGFibGUoYXMuZmFjdG9yKGRhdGFbWzNdXSkpDQoNCmJveHBsb3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1szXV0pLA0KICAgICAgICBtYWluID0gIlNjb3JlIGJ5IE1hcmF0aWFsIFN0YXR1cyIsDQogICAgICAgIHhsYWIgPSAiTWFyYXRpYWwgU3RhdHVzIiwgeWxhYiA9ICJTY29yZSIsIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQojIEV2ZW4gaWYgcCA+IDAuMDUsIHlvdSBtaWdodCBzdGlsbCB3YW50IHRvIGNoZWNrIHRoZSBtYWduaXR1ZGUgb2YgZGlmZmVyZW5jZXMuIEZvciBLcnVza2Fs4oCTV2FsbGlzLCB5b3UgY2FuIHVzZSBldGEtc3F1YXJlZCBvciBlcHNpbG9uLXNxdWFyZWQuIEV4YW1wbGU6DQoNCiMgaW5zdGFsbC5wYWNrYWdlcygicmNvbXBhbmlvbiIpDQpsaWJyYXJ5KHJjb21wYW5pb24pDQprcnVza2FsVGVzdCA8LSBrcnVza2FsLnRlc3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1szXV0pKQ0KcmNvbXBhbmlvbjo6ZXRhU3F1YXJlZChrcnVza2FsVGVzdCwgYW5vdmEgPSBGQUxTRSkNCg0KDQojIE9wdGlvbmFsIOKAkyBEdW5u4oCZcyBwb3N0aG9jIGZvciBwYWlyd2lzZSBjb21wYXJpc29uDQoNCiMgaW5zdGFsbC5wYWNrYWdlcygiRlNBIikNCmxpYnJhcnkoRlNBKQ0KZHVublRlc3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1szXV0pLCBtZXRob2Q9ImJvbmZlcnJvbmkiKQ0KDQojIFZpc3VhbGl6YXRpb24NCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBhcy5mYWN0b3IoZGF0YVtbM11dKSwgeSA9IGRhdGFbWzI0XV0sIGZpbGwgPSBhcy5mYWN0b3IoZGF0YVtbM11dKSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHggPSAiTWFyaXRhbCBTdGF0dXMiLCB5ID0gIlNjb3JlIiwgdGl0bGUgPSAiRkwgU2NvcmUgdy5yLnQgTWFyaXRhbCBTdGF0dXMiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCmlzIG9zIGZvdW5kIHRoYXQgdGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluICBGaW5hbmNpYWwgTGl0ZXJhY3kgU2NvcmUgZGlzdHJpYnV0aW9ucyBhY3Jvc3MgdGhlIG1hcmF0aWFsIHN0YXR1cw0KDQpgYGB7cn0NCiMgU29jaW8gRWNvbm9taWMgRmFjdG9yIE1hcml0aWFsIFN0YXR1cyBhc3NvY2lhdGUgd2l0aCBGTCBhbW9uZyBOTVUgV1cNCiMgd2lsY294LnRlc3QoY29sbmFtZXMoZGF0YVssMjRdKX5jb2xuYW1lcyhkYXRhWyw2XSksZGF0YSkNCmtydXNrYWwudGVzdChkYXRhW1syNF1dfmFzLmZhY3RvcihkYXRhW1s2XV0pKSAgIyBtb3JlIHRoYW4gMiBsZXZlbHMNCg0KdGFibGUoYXMuZmFjdG9yKGRhdGFbWzZdXSkpDQoNCmJveHBsb3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1s2XV0pLA0KICAgICAgICBtYWluID0gIlNjb3JlIGJ5IEdlbmRlciIsDQogICAgICAgIHhsYWIgPSAiV29yayBFeHBlcmllbmNlIiwgeWxhYiA9ICJTY29yZSIsIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQojIEV2ZW4gaWYgcCA+IDAuMDUsIHlvdSBtaWdodCBzdGlsbCB3YW50IHRvIGNoZWNrIHRoZSBtYWduaXR1ZGUgb2YgZGlmZmVyZW5jZXMuIEZvciBLcnVza2Fs4oCTV2FsbGlzLCB5b3UgY2FuIHVzZSBldGEtc3F1YXJlZCBvciBlcHNpbG9uLXNxdWFyZWQuIEV4YW1wbGU6DQoNCiMgaW5zdGFsbC5wYWNrYWdlcygicmNvbXBhbmlvbiIpDQpsaWJyYXJ5KHJjb21wYW5pb24pDQprcnVza2FsVGVzdCA8LSBrcnVza2FsLnRlc3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1s2XV0pKQ0KIyByY29tcGFuaW9uOjpldGFTcXVhcmVkKGtydXNrYWxUZXN0LCBhbm92YSA9IEZBTFNFKQ0KDQoNCiMgT3B0aW9uYWwg4oCTIER1bm7igJlzIHBvc3Rob2MgZm9yIHBhaXJ3aXNlIGNvbXBhcmlzb24NCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJGU0EiKQ0KbGlicmFyeShGU0EpDQpkdW5uVGVzdChkYXRhW1syNF1dIH4gYXMuZmFjdG9yKGRhdGFbWzZdXSksIG1ldGhvZD0iYm9uZmVycm9uaSIpDQoNCiMgVmlzdWFsaXphdGlvbg0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihkYXRhW1s2XV0pLCB5ID0gZGF0YVtbMjRdXSwgZmlsbCA9IGFzLmZhY3RvcihkYXRhW1s2XV0pKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnMoeCA9ICJXb3JrIEV4cGVyaWVuY2UiLCB5ID0gIkZMIFNjb3JlIiwgdGl0bGUgPSAiRkwgU2NvcmUgdy5yLnQgd29ya2luZyBFeHBlcmllbmNlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpmcm9tIHRoZSBhYm92ZSBwbG90IHdlIGNhbiBpbmZlciB0aGF0IHRoZSBhdmVyYWdlIGZpbmluY2lhbCBsaXRlcmFjeSBzY29yZSBmb3IgdGhvc2Ugd29tZW5zIHdob3NlIHdvcmtpbmcgZXhwZXJpZW5jZSBpcyBVcCB0byA1eSwgNi0xMHksIGFib3ZlIDE1eSBpcyBhbG1vc3Qgc2FtZS4gDQpBbmQgZHVlIHRvIHVuZnVsZmlsbGVtZW50IG9mIHJlcXVpcmVkIGFzc3VtcHRpb24gb2YgcGFyYW1ldHJpYyB0ZXN0LCBpIGhhdmUgbW92ZWQgdG8gbm9uIHBhcmFtZXRyaWMga3J1c2thbCB3YWxsaXMgdGVzdCB3aGljaCBzdWdnZXN0IHRoYXQsIHRoZXJlIGlzIG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIEZMIHNjb3JlIGZvciB3b21lbiB3aXRoIGRpZmZlcmVudCBsZXZlbCBvZiB3b3JrIGV4cGVyaWVuY2UuDQoNCmBgYHtyfQ0KIyBTb2NpbyBFY29ub21pYyBGYWN0b3IgTWFyaXRpYWwgU3RhdHVzIGFzc29jaWF0ZSB3aXRoIEludmVzdG1lbnQgQmVoYXZpb3VyIGFtb25nIE5NVSBXVw0KIyB3aWxjb3gudGVzdChjb2xuYW1lcyhkYXRhWywyNF0pfmNvbG5hbWVzKGRhdGFbLDZdKSxkYXRhKQ0Ka3J1c2thbC50ZXN0KGRhdGFbWzMxXV1+YXMuZmFjdG9yKGRhdGFbWzNdXSkpICAjIG1vcmUgdGhhbiAyIGxldmVscw0KDQp0YWJsZShhcy5mYWN0b3IoZGF0YVtbM11dKSkNCg0KYm94cGxvdChkYXRhW1szMV1dIH4gYXMuZmFjdG9yKGRhdGFbWzNdXSksDQogICAgICAgIG1haW4gPSAiU2NvcmUgYnkgR2VuZGVyIiwNCiAgICAgICAgeGxhYiA9ICJNYXJpdGlhbCBTdGF0dXMiLCB5bGFiID0gIlNjb3JlIiwgY29sID0gImxpZ2h0Ymx1ZSIpDQoNCiMgRXZlbiBpZiBwID4gMC4wNSwgeW91IG1pZ2h0IHN0aWxsIHdhbnQgdG8gY2hlY2sgdGhlIG1hZ25pdHVkZSBvZiBkaWZmZXJlbmNlcy4gRm9yIEtydXNrYWzigJNXYWxsaXMsIHlvdSBjYW4gdXNlIGV0YS1zcXVhcmVkIG9yIGVwc2lsb24tc3F1YXJlZC4gRXhhbXBsZToNCg0KDQoNCiMgaW5zdGFsbC5wYWNrYWdlcygicmNvbXBhbmlvbiIpDQpsaWJyYXJ5KHJjb21wYW5pb24pDQprcnVza2FsVGVzdCA8LSBrcnVza2FsLnRlc3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1szXV0pKQ0KIyByY29tcGFuaW9uOjpldGFTcXVhcmVkKGtydXNrYWxUZXN0LCBhbm92YSA9IEZBTFNFKQ0KDQoNCiMgT3B0aW9uYWwg4oCTIER1bm7igJlzIHBvc3Rob2MgZm9yIHBhaXJ3aXNlIGNvbXBhcmlzb24NCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJGU0EiKQ0KbGlicmFyeShGU0EpDQpkdW5uVGVzdChkYXRhW1szMV1dIH4gYXMuZmFjdG9yKGRhdGFbWzNdXSksIG1ldGhvZD0iYm9uZmVycm9uaSIpDQoNCiMgVmlzdWFsaXphdGlvbg0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihkYXRhW1szXV0pLCB5ID0gZGF0YVtbMzFdXSwgZmlsbCA9IGFzLmZhY3RvcihkYXRhW1szXV0pKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnMoeCA9ICJNYXJ0aWFsIHN0YXR1cyIsIHkgPSAiU2NvcmUiLCB0aXRsZSA9ICJTY29yZSBieSBNYXJpdGFsIFN0YXR1cyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpgYGB7cn0NCiMgU29jaW8gRWNvbm9taWMgRmFjdG9yIFNlY3RvciBTdGF0dXMgYXNzb2NpYXRlIHdpdGggSW52ZXN0bWVudCBCZWhhdmlvdXIgYW1vbmcgTk1VIFdXDQojIHdpbGNveC50ZXN0KGNvbG5hbWVzKGRhdGFbLDMxXSl+Y29sbmFtZXMoZGF0YVssMTFdKSxkYXRhKQ0Ka3J1c2thbC50ZXN0KGRhdGFbWzMxXV1+YXMuZmFjdG9yKGRhdGFbWzExXV0pKSAgIyBtb3JlIHRoYW4gMiBsZXZlbHMNCg0KdGFibGUoYXMuZmFjdG9yKGRhdGFbWzExXV0pKQ0KDQpib3hwbG90KGRhdGFbWzMxXV0gfiBhcy5mYWN0b3IoZGF0YVtbMTFdXSksDQogICAgICAgIG1haW4gPSAiU2NvcmUgYnkgR2VuZGVyIiwNCiAgICAgICAgeGxhYiA9ICJTZWN0b3IgU3RhdHVzIiwgeWxhYiA9ICJTY29yZSIsIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQojIEV2ZW4gaWYgcCA+IDAuMDUsIHlvdSBtaWdodCBzdGlsbCB3YW50IHRvIGNoZWNrIHRoZSBtYWduaXR1ZGUgb2YgZGlmZmVyZW5jZXMuIEZvciBLcnVza2Fs4oCTV2FsbGlzLCB5b3UgY2FuIHVzZSBldGEtc3F1YXJlZCBvciBlcHNpbG9uLXNxdWFyZWQuIEV4YW1wbGU6DQoNCg0KDQojIGluc3RhbGwucGFja2FnZXMoInJjb21wYW5pb24iKQ0KbGlicmFyeShyY29tcGFuaW9uKQ0Ka3J1c2thbFRlc3QgPC0ga3J1c2thbC50ZXN0KGRhdGFbWzI0XV0gfiBhcy5mYWN0b3IoZGF0YVtbM11dKSkNCiMgcmNvbXBhbmlvbjo6ZXRhU3F1YXJlZChrcnVza2FsVGVzdCwgYW5vdmEgPSBGQUxTRSkNCg0KDQojIE9wdGlvbmFsIOKAkyBEdW5u4oCZcyBwb3N0aG9jIGZvciBwYWlyd2lzZSBjb21wYXJpc29uDQoNCiMgaW5zdGFsbC5wYWNrYWdlcygiRlNBIikNCmxpYnJhcnkoRlNBKQ0KZHVublRlc3QoZGF0YVtbMzFdXSB+IGFzLmZhY3RvcihkYXRhW1sxMV1dKSwgbWV0aG9kPSJib25mZXJyb25pIikNCg0KIyBWaXN1YWxpemF0aW9uDQoNCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gYXMuZmFjdG9yKGRhdGFbWzExXV0pLCB5ID0gZGF0YVtbMzFdXSwgZmlsbCA9IGFzLmZhY3RvcihkYXRhW1sxMV1dKSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHggPSAiU2VjdG9yIHN0YXR1cyIsIHkgPSAiU2NvcmUiLCB0aXRsZSA9ICJGTCBTY29yZSB3LnIudCByZXNpZGVudGlhbCBzZWN0b3IiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgU29jaW8gRWNvbm9taWMgRmFjdG9yIFNlY3RvciBTdGF0dXMgYXNzb2NpYXRlIHdpdGggSW52ZXN0bWVudCBCZWhhdmlvdXIgYW1vbmcgTk1VIFdXDQojIHdpbGNveC50ZXN0KGNvbG5hbWVzKGRhdGFbLDMxXSl+Y29sbmFtZXMoZGF0YVssMTFdKSxkYXRhKQ0Ka3J1c2thbC50ZXN0KGRhdGFbWzMxXV1+YXMuZmFjdG9yKGRhdGFbWzddXSkpICAjIG1vcmUgdGhhbiAyIGxldmVscw0KDQp0YWJsZShhcy5mYWN0b3IoZGF0YVtbN11dKSkNCg0KYm94cGxvdChkYXRhW1szMV1dIH4gYXMuZmFjdG9yKGRhdGFbWzddXSksDQogICAgICAgIG1haW4gPSAiU2NvcmUgd2l0aCByZXNwZWN0IHRvIHdvcmtpbmcgc2VjdG9yIiwNCiAgICAgICAgeGxhYiA9ICJTZWN0b3IgU3RhdHVzIiwgeWxhYiA9ICJTY29yZSIsIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQojIEV2ZW4gaWYgcCA+IDAuMDUsIHlvdSBtaWdodCBzdGlsbCB3YW50IHRvIGNoZWNrIHRoZSBtYWduaXR1ZGUgb2YgZGlmZmVyZW5jZXMuIEZvciBLcnVza2Fs4oCTV2FsbGlzLCB5b3UgY2FuIHVzZSBldGEtc3F1YXJlZCBvciBlcHNpbG9uLXNxdWFyZWQuIEV4YW1wbGU6DQoNCg0KDQojIGluc3RhbGwucGFja2FnZXMoInJjb21wYW5pb24iKQ0KI2xpYnJhcnkocmNvbXBhbmlvbikNCiNrcnVza2FsVGVzdCA8LSBrcnVza2FsLnRlc3QoZGF0YVtbMjRdXSB+IGFzLmZhY3RvcihkYXRhW1szXV0pKQ0KIyByY29tcGFuaW9uOjpldGFTcXVhcmVkKGtydXNrYWxUZXN0LCBhbm92YSA9IEZBTFNFKQ0KDQoNCiMgT3B0aW9uYWwg4oCTIER1bm7igJlzIHBvc3Rob2MgZm9yIHBhaXJ3aXNlIGNvbXBhcmlzb24NCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJGU0EiKQ0KbGlicmFyeShGU0EpDQpkdW5uVGVzdChkYXRhW1szMV1dIH4gYXMuZmFjdG9yKGRhdGFbWzddXSksIG1ldGhvZD0iYm9uZmVycm9uaSIpDQoNCiMgVmlzdWFsaXphdGlvbg0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihkYXRhW1s3XV0pLCB5ID0gZGF0YVtbMzFdXSwgZmlsbCA9IGFzLmZhY3RvcihkYXRhW1s3XV0pKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnMoeCA9ICJPY2N1cGF0aW9uYWwgc3RhdHVzIiwgeSA9ICJTY29yZSIsIHRpdGxlID0gIkZMIFNjb3JlIHcuci50IG9jY3VwYXRpb25hbCBzdGF0dXMiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KDQpgYGB7ciBIMDR9DQoNCndpbGNveC50ZXN0KGRhdGFbWzMxXV1+YXMuZmFjdG9yKGRhdGFbWzExXV0pKSAgIyBtb3JlIHRoYW4gMiBsZXZlbHMNCmxpYnJhcnkobGF0dGljZSkNCg0KWD1kYXRhW1szMV1dO3k9ZGF0YVtbMTFdXQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPWRhdGFbWzMxXV0pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKGRhdGFbWzMxXV0pKSwgDQogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEuMikgKw0KICBsYWJzKHggPSAiU2VjdG9yIHN0YXR1cyIsIHkgPSAiSW52ZXN0bWVudCBjb25zaWRlcmF0aW9uIFNjb3JlIiwgdGl0bGUgPSAiU2NvcmUgYnkgU2VjdG9yIFN0YXR1cyIpKw0KICBmYWNldF93cmFwKH5kYXRhW1sxMV1dKQ0KDQpgYGANCg0KDQpgYGB7ciAgSDA1fQ0KZGF0YSRJbnZlc3RfYmVoYXZpb3IgPC0gTlVMTA0KZGF0YSRJbnZlc3RfYmVoYXZpb3IgPSA3KmRhdGExW1s5MF1dICsgNSpkYXRhMVtbOTZdXSszKmRhdGExW1sxMDBdXSArMypkYXRhMVtbMTA0XV0gDQpkYXRhW1szMl1dDQoNCnNoYXBpcm8udGVzdChkYXRhW1szMl1dKQ0KDQojIENyZWF0ZSB0aGUgZGF0YSBmcmFtZQ0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgUmlza1R5cGUgPSBjKA0KICAgIHJlcCgiU2FmZS9Mb3cgUmlzayIsIDcpLA0KICAgIHJlcCgiTW9kZXJhdGUgUmlzayIsIDUpLA0KICAgIHJlcCgiSGlnaCBSaXNrIiwgMyksDQogICAgcmVwKCJUcmFkaXRpb25hbCIsIDMpDQogICksDQogIEZpbmFuY2lhbFByb2R1Y3QgPSBjKA0KICAgICJTYXZpbmdzIEFjY291bnQiLCAiQmFuayBGaXhlZCBEZXBvc2l0IiwgIlB1YmxpYyBQcm92aWRlbnQgRnVuZCIsIA0KICAgICJOYXRpb25hbCBTYXZpbmdzIENlcnRpZmljYXRlIiwgIlBvc3QgT2ZmaWNlIFNhdmluZ3MiLCANCiAgICAiR292ZXJubWVudCBTZWN1cml0aWVzIiwgIlJlY3VycmluZyBEZXBvc2l0IiwNCiAgICAiTXV0dWFsIEZ1bmRzIiwgIkluc3VyYW5jZSIsICJEZWJlbnR1cmVzIiwgIkJvbmRzIiwgIlByZWZlcmVuY2UgU2hhcmVzIiwNCiAgICAiRXF1aXR5IFNoYXJlIE1hcmtldCIsICJDb21tb2RpdGllcyBNYXJrZXQiLCAiRm9yZXggTWFya2V0IiwNCiAgICAiUmVhbCBFc3RhdGUgLyBQcm9wZXJ0eSIsICJHb2xkIC8gU2lsdmVyIiwgIkNoaXQgRnVuZHMiDQogICksDQogIERvbnRLbm93ID0gYygNCiAgICAzMywgMTcsIDcxLCA4NSwgMTgsIDM3LCAzNiwNCiAgICAyNywgODMsIDQyLCAxMDcsIDM2LA0KICAgIDU5LCAxMDQsIDEyNywNCiAgICA3NiwgMTYsIDc5DQogICksDQogIExlYXN0UHJlZmVycmVkID0gYygNCiAgICAyMSwgNTEsIDU0LCA4NywgODIsIDkxLCA5NiwNCiAgICAyMywgMTksIDQyLCA2NCwgNjYsDQogICAgNTgsIDk4LCA5NCwNCiAgICAxMDksIDM1LCAxMDYNCiAgKSwNCiAgTmV1dHJhbCA9IGMoDQogICAgNjgsIDQwLCA4OCwgMTAxLCAxNTIsIDc5LCA3MywNCiAgICA1NSwgODksIDE3OSwgMTA5LCAxMjYsDQogICAgNzgsIDk3LCA4MiwNCiAgICA1OCwgNjYsIDEyNw0KICApLA0KICBQcmVmZXJyZWQgPSBjKA0KICAgIDEyNCwgMTczLCAxMDUsIDQ5LCA2MCwgODIsIDgxLA0KICAgIDE2MiwgMTA1LCA0MCwgNjUsIDg3LA0KICAgIDc5LCA0MiwgNDQsDQogICAgNjIsIDk0LCA0NQ0KICApLA0KICBIaWdobHlQcmVmZXJyZWQgPSBjKA0KICAgIDEyMiwgODUsIDQ4LCA0NCwgNTQsIDc3LCA2NCwNCiAgICA4MiwgNzAsIDIxLCAyMSwgNTMsDQogICAgODcsIDI1LCAxOSwNCiAgICA2MSwgMTU1LCA5DQogICkNCikNCg0KIyBDaGVjayBzdHJ1Y3R1cmUNCnN0cihkZikNCg0KIyBQcmV2aWV3IGZpcnN0IHJvd3MNCmhlYWQoZGYpDQpjb2xuYW1lcyhkZikNCg0KIyBTdXBwb3NlIHlvdXIgZGF0YSBmcmFtZSBpcyBkZiB3aXRoIGNvbHVtbnM6IA0KIyBSaXNrVHlwZSwgRmluYW5jaWFsUHJvZHVjdCwgRG9udEtub3csIExlYXN0UHJlZiwgTmV1dHJhbCwgUHJlZmVycmVkLCBIaWdobHlQcmVmZXJyZWQNCg0KIyBDb2xsYXBzZSBjb3VudHMgYWNyb3NzIHByb2R1Y3RzIHdpdGhpbiBlYWNoIHJpc2sgdHlwZToNCmRmX3Jpc2sgPC0gYWdncmVnYXRlKGNiaW5kKERvbnRLbm93LCBMZWFzdFByZWZlcnJlZCwgTmV1dHJhbCwgUHJlZmVycmVkLCBIaWdobHlQcmVmZXJyZWQpIH4gUmlza1R5cGUsIGRhdGEgPSBkZixGVU49c3VtKQ0KDQojIExvb2sgYXQgdGhlIHJlc3VsdA0KcHJpbnQoZGZfcmlzaykNCiMgQ29udmVydCB0byBtYXRyaXgNCnByZWZfbWF0cml4IDwtIGFzLm1hdHJpeChkZl9yaXNrWywtMV0pDQpyb3duYW1lcyhwcmVmX21hdHJpeCkgPC0gZGZfcmlzayRSaXNrVHlwZQ0KDQojIFBlcmZvcm0gY2hpLXNxdWFyZSB0ZXN0DQpjaGlzcS50ZXN0KHByZWZfbWF0cml4KQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KDQpkZl9jb2xsYXBzZWQgPC0gZGYgJT4lDQogIGdyb3VwX2J5KFJpc2tUeXBlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICdEb250S25vdycgPSBzdW0oRG9udEtub3cpLA0KICAgICdMZWFzdFByZWZlcnJlZCcgPSBzdW0oTGVhc3RQcmVmZXJyZWQpLA0KICAgICdOZXV0cmFsJyA9IHN1bShOZXV0cmFsKSwNCiAgICAnUHJlZmVycmVkJyA9IHN1bShQcmVmZXJyZWQpLA0KICAgICdIaWdobHlQcmVmZXJyZWQnID0gc3VtKEhpZ2hseVByZWZlcnJlZCksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCmRmX2NvbGxhcHNlZA0KDQpjaGlfc3FfcmVzdWx0PWNoaXNxLnRlc3QoZGZfY29sbGFwc2VkWywtMV0pIA0KIyBUaGVyZSBpcyBhIGhpZ2hseSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIFJpc2tUeXBlIGFuZCB0aGUgbGV2ZWwgb2YgcHJlZmVyZW5jZS4gVGhlIHR3byB2YXJpYWJsZXMgYXJlIG5vdCBpbmRlcGVuZGVudC4NCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBDb3JyZXNwb25kZW5jZSBBbmFseXNpcyAoQ0EpDQoNCiNWaXN1YWwgd2F5IHRvIG1hcCBhc3NvY2lhdGlvbiBiZXR3ZWVuIHJpc2sgdHlwZXMgYW5kIHByZWZlcmVuY2VzLg0KDQojSGVscHMgaW50ZXJwcmV0IHdoaWNoIHJpc2sgY2F0ZWdvcnkgbGVhbnMgdG93YXJkIHdoaWNoIHByZWZlcmVuY2UuDQoNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCg0KY2FfcmVzdWx0IDwtIENBKGFzLm1hdHJpeChkZl9jb2xsYXBzZWRbLC0xXSksIGdyYXBoPVRSVUUpDQpmdml6X2NhX2JpcGxvdChjYV9yZXN1bHQpDQoNCg0KDQpgYGANCg0KQ0EgSW50ZXJwcmV0YXRpb24gOg0KDQpIZXJl4oCZcyBob3cgdG8gaW50ZXJwcmV0IHRoZSBwbG90IGFuZCB0aGUgc3VtbWFyeSBvdXRwdXQ6DQoNCkluZXJ0aWEgKEV4cGxhaW5lZCBWYXJpYW5jZSk6IFRoZSBzdW1tYXJ5IG91dHB1dCB3aWxsIHNob3cgeW91IGhvdyBtdWNoIG9mIHRoZSB0b3RhbCAiaW5lcnRpYSIgKHdoaWNoIGlzIHJlbGF0ZWQgdG8gdGhlIM+HIA0KMg0KICBzdGF0aXN0aWMpIGlzIGV4cGxhaW5lZCBieSBlYWNoIGRpbWVuc2lvbiAoYXhpcykuDQoNCkRpbWVuc2lvbiAxIChEaW0gMSkgbGlrZWx5IGFjY291bnRzIGZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgaW5lcnRpYSAofjgwLTkwJSkuIExvb2tpbmcgYXQgdGhlIHBsb3QsIHRoaXMgaG9yaXpvbnRhbCBheGlzIGNsZWFybHkgc2VwYXJhdGVzIHByZWZlcmVuY2VzLCBydW5uaW5nIGZyb20gTGVhc3RQcmVmZXJyZWQgb24gdGhlIGxlZnQgdG8gUHJlZmVycmVkIGFuZCBIaWdobHlQcmVmZXJyZWQgb24gdGhlIHJpZ2h0LiBJdCByZXByZXNlbnRzIHRoZSBwcmltYXJ5IGF4aXMgb2YgImRpc2xpa2UgdnMuIGxpa2UuIg0KDQpEaW1lbnNpb24gMiAoRGltIDIpIGFjY291bnRzIGZvciBhIHNtYWxsZXIgcG9ydGlvbiBvZiB0aGUgaW5lcnRpYS4gVGhpcyB2ZXJ0aWNhbCBheGlzIGhlbHBzIHNlcGFyYXRlIHRoZSBjYXRlZ29yaWVzIGZ1cnRoZXIuDQoNCkludGVycHJldGluZyB0aGUgQmlwbG90Og0KDQpTYWZlL0xvdyBSaXNrIGlzIHBvc2l0aW9uZWQgdmVyeSBjbG9zZWx5IHRvIFByZWZlcnJlZCBhbmQgSGlnaGx5UHJlZmVycmVkLiBUaGlzIGluZGljYXRlcyBhIHN0cm9uZyBhc3NvY2lhdGlvbjsgcGVvcGxlIHdobyBwcmVmZXIgc2FmZS9sb3ctcmlzayBpbnZlc3RtZW50cyBhbHNvIHRlbmQgdG8gcmF0ZSB0aGVtIGFzIHByZWZlcnJlZCBvciBoaWdobHkgcHJlZmVycmVkLg0KDQpIaWdoIFJpc2sgaXMgcG9zaXRpb25lZCBmYXIgb3V0IG9uIHRoZSBsZWZ0LCB2ZXJ5IGNsb3NlIHRvIExlYXN0UHJlZmVycmVkIGFuZCBEb250S25vdy4gVGhpcyBzaG93cyBhIHN0cm9uZyBhc3NvY2lhdGlvbiB3aGVyZSBoaWdoLXJpc2sgaW52ZXN0bWVudHMgYXJlIHNlZW4gYXMgdGhlIGxlYXN0IHByZWZlcnJlZC4gVGhlIHByb3hpbWl0eSB0byAiRG9udEtub3ciIG1pZ2h0IHN1Z2dlc3QgdW5jZXJ0YWludHkgb3IgYXZlcnNpb24uDQoNCk1vZGVyYXRlIFJpc2sgYW5kIFRyYWRpdGlvbmFsIGFyZSBsb2NhdGVkIGNsb3NlciB0byB0aGUgY2VudGVyIChvcmlnaW4pIGFuZCBuZWFyIE5ldXRyYWwuIFRoaXMgc3VnZ2VzdHMgdGhlaXIgcHJlZmVyZW5jZSBwcm9maWxlcyBhcmUgbGVzcyBleHRyZW1lIGFuZCBtb3JlIGF2ZXJhZ2UgY29tcGFyZWQgdG8gdGhlIGhpZ2ggYW5kIGxvdy1yaXNrIGNhdGVnb3JpZXMuICJUcmFkaXRpb25hbCIgaW4gcGFydGljdWxhciBzZWVtcyB0byBoYXZlIGEgZmFpcmx5IG5ldXRyYWwsIHNsaWdodGx5IHZhcmllZCBwcmVmZXJlbmNlIHByb2ZpbGUuDQoNCk92ZXJhbGwgU3Rvcnk6IFRoZSBhbmFseXNpcyBwYWludHMgYSBjbGVhciBwaWN0dXJlLiBUaGUgcHJpbWFyeSBmYWN0b3IgZHJpdmluZyBpbnZlc3RtZW50IHByZWZlcmVuY2UgaXMgdGhlIGxldmVsIG9mIHJpc2suIFNhZmUvTG93LXJpc2sgb3B0aW9ucyBhcmUgc3Ryb25nbHkgYW5kIHBvc2l0aXZlbHkgcHJlZmVycmVkLCB3aGlsZSBIaWdoLXJpc2sgb3B0aW9ucyBhcmUgc3Ryb25nbHkgZGlzbGlrZWQuIE1vZGVyYXRlIGFuZCB0cmFkaXRpb25hbCBvcHRpb25zIGZhbGwgaW4gdGhlIG1pZGRsZSwgZWxpY2l0aW5nIGEgbW9yZSBuZXV0cmFsIG9yIGF2ZXJhZ2UgcmVzcG9uc2UuDQoNCg0KYGBge3IgU3RhbmRhcmRpemVkIFJlc2lkdWFscyBpbiBSfQ0KbGlicmFyeShjb3JycGxvdCkNCg0KcmVzaWR1YWw9Y2hpX3NxX3Jlc3VsdCRyZXNpZHVhbHMNCnByaW50KCJzdGFuZGFyZGl6ZWQgUmVzaWR1YWxzOiIpO3ByaW50KHJvdW5kKHJlc2lkdWFsLDIpKQ0KDQojIFZpc3VhbGl6ZSB0aGUgcmVzaWR1YWxzIHVzaW5nIGNvcnJwbG90DQojIFBvc2l0aXZlIHJlc2lkdWFscyBhcmUgaW4gYmx1ZSwgbmVnYXRpdmUgYXJlIGluIHJlZC4NCiMgVGhlIHNpemUgYW5kIGNvbG9yIGludGVuc2l0eSBvZiB0aGUgY2lyY2xlIGNvcnJlc3BvbmQgdG8gdGhlIG1hZ25pdHVkZSBvZiB0aGUgcmVzaWR1YWwuDQoNCmNvcnJwbG90KHJlc2lkdWFsLGlzLmNvcj1GQUxTRSwNCiAgICAgICAgIG1ldGhvZCA9ICJjb2xvciIsICMgRGlzcGxheSBhcyBjb2xvcmVkIGNlbGxzDQogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLA0KICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCB0aGUgcmVzaWR1YWwgdmFsdWVzIG9uIHRoZSBwbG90DQogICAgICAgICBudW1iZXIuY2V4ID0gMC44KQ0KDQoNCmBgYA0KVGhlIGtleSB0byBpbnRlcnByZXRhdGlvbiBpcyB0aGUgInJ1bGUgb2YgMiI6DQoNCkEgc3RhbmRhcmRpemVkIHJlc2lkdWFsIGdyZWF0ZXIgdGhhbiAyIG1lYW5zIHRoZSBvYnNlcnZlZCBjb3VudCBpbiB0aGF0IGNlbGwgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB3aGF0IHdlJ2QgZXhwZWN0IGlmIHRoZXJlIHdlcmUgbm8gYXNzb2NpYXRpb24uDQoNCkEgc3RhbmRhcmRpemVkIHJlc2lkdWFsIGxlc3MgdGhhbiAtMiBtZWFucyB0aGUgb2JzZXJ2ZWQgY291bnQgaXMgc2lnbmlmaWNhbnRseSBsb3dlciB0aGFuIGV4cGVjdGVkLg0KDQpWYWx1ZXMgYmV0d2VlbiAtMiBhbmQgMiBhcmUgY29uc2lkZXJlZCB3aXRoaW4gdGhlIHJhbmdlIG9mIHJhbmRvbSBjaGFuY2UuDQoNCg0KDQpgYGB7ciAgSDAgMyBhZ2FpbiBib2xkbmVzcyBpbiBiZWhhdmlvdXJ9DQoNCiMgTWFqb3IgSW52ZXN0IE9iamVjdGl2ZXMNCk1ham9yX09iamVjdGl2ZXM9cmJpbmQodGFibGUoZGF0YTFbWzE2XV0pLHRhYmxlKGRhdGExW1sxN11dKSx0YWJsZShkYXRhMVtbMThdXSksdGFibGUoZGF0YTFbWzE5XV0pLA0KICAgICAgdGFibGUoZGF0YTFbWzIwXV0pLHRhYmxlKGRhdGExW1syMV1dKSx0YWJsZShkYXRhMVtbMjJdXSksdGFibGUoZGF0YTFbWzIzXV0pKQ0Kcm93bmFtZXMoTWFqb3JfT2JqZWN0aXZlcyk9YygnV2VhbHRoIENyZWF0aW9uJywnRWFybiByZWd1bGFyIFJldHVybicsJ01lZXQgdW5hbnRpY2lwYXRlZCBlJywNCiAgICAgICAgICAgICAgICdDaGlsZHJlbi9TZWxmIGVkdWNhdGlvbicsJ0NoaWxkcmVuL3NlbGYgTWFycmlhZ2UnLCdPbGQgYWdlIFBsYW5uaWcnLA0KICAgICAgICAgICAgICAgJ1JlZHVjZSBUYXggQnVyZGVuJywnSG91c2UgUHVyY2hhc2UnKQ0KTWFqb3JfT2JqZWN0aXZlcw0KDQojIE9yZGluYXJ5IElOdmVzdCBvYmplY3RpdmVzDQpPcmRpbmFyeV9PYmplY3R1dmVzPXJiaW5kKHRhYmxlKGRhdGExW1syNV1dKSx0YWJsZShkYXRhMVtbMjZdXSksdGFibGUoZGF0YTFbWzI3XV0pLHRhYmxlKGRhdGExW1syOF1dKSwNCiAgICAgIHRhYmxlKGRhdGExW1syOV1dKSx0YWJsZShkYXRhMVtbMzBdXSkpDQpyb3duYW1lcyhPcmRpbmFyeV9PYmplY3R1dmVzKT1jKCdNYWtlIEVhcm5pbmcvIHBhcnQgb2YgaW5jb21lJywnSGF2ZSBhIGZsb3cgb2YgaW5jb21lJywnQW50aWNpcGF0ZWQgZnV0dXJlIG5lZWRzJywNCiAgICAgICAgICAgICAgICdCdWlsZCByZXNlcnZlIGZvciB1bnNlZW4gY29udGlnZW5jaWVzJywnQnVpbGQgYXNzZXRzW0xhbmQsR29sZF0nLCdTYXZlIFRheCcpDQoNCk9yZGluYXJ5X09iamVjdHV2ZXMNCg0KVG90YWxfTWFqb3JfaW52ZXN0X29ial9zY29yZT1yb3dTdW1zKE1ham9yX09iamVjdGl2ZXMpDQpUb3RhbF9PcmRpX2ludmVzdF9vYmpfc2NvcmU9cm93U3VtcyhPcmRpbmFyeV9PYmplY3R1dmVzKQ0KDQoNCg0KIyBWaXN1YWxpc2F0aW9uIG9mIHRvdGFsIHNjb3JlDQpiYXJwbG90KE1ham9yX09iamVjdGl2ZXNbLDFdLGNvbD0nZ3JlZW4nLHlsaW09YygwLDEwMDApKQ0KYmFycGxvdChNYWpvcl9PYmplY3RpdmVzWywyXSxjb2w9J3JlZCcseWxpbT1jKDAsMTAwMCkpDQpiYXJwbG90KE1ham9yX09iamVjdGl2ZXNbLDNdLGNvbD0nb3JhbmdlJyx5bGltPWMoMCwxMDAwKSkNCg0KY2hpc3FfbWFqb3I9Y2hpc3EudGVzdChNYWpvcl9PYmplY3RpdmVzWywtMV0pDQoNClM9c3ZkKE1ham9yX09iamVjdGl2ZXMpDQpjaGlzcS50ZXN0KE9yZGluYXJ5X09iamVjdHV2ZXNbLC0xXSkgICAgICAjIGltcGxpZXMgdGhlcmUgaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBpbnZlc3RtZW50IG9iamVjdGl2ZXMNCg0KIyBXZWlnaHRlZCBvdmVyYWxsIGludmVzdG1lbnQgb2JqZWN0aXZlcw0KZGF0YSRPdmVyYWxsX2ludmVzdF9PYmpfc2NvcmU9OCpkYXRhMVtbMjRdXSArIDYqZGF0YTFbWzMxXV0NCg0KDQojIENvcnJlc3BvbmRlbmNlIEFuYWx5c2lzIChDQSkNCg0KI1Zpc3VhbCB3YXkgdG8gbWFwIGFzc29jaWF0aW9uIGJldHdlZW4gdHlwZSBvZiBpbnZlc3RtZW50IG9iamVjdGl2ZXMgYW5kIHJhbmtpbmcuDQoNCg0KbGlicmFyeShGYWN0b01pbmVSKQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KDQpjYV9yZXN1bHQxIDwtIENBKGFzLm1hdHJpeChNYWpvcl9PYmplY3RpdmVzWy0xLF0pLCBncmFwaD1UUlVFKQ0KZnZpel9jYV9iaXBsb3QoY2FfcmVzdWx0MSkNCg0KDQpjYV9yZXN1bHQyIDwtIENBKGFzLm1hdHJpeChPcmRpbmFyeV9PYmplY3R1dmVzWy0xLF0pLCBncmFwaD1UUlVFKQ0KZnZpel9jYV9iaXBsb3QoY2FfcmVzdWx0MikNCg0KDQpgYGANCg0K