Importing and Cleaning Data Sets For Analysis

#Get rid of scientific notation
options(scipen = 999)

#loading NY Suicide Data Set 
suicide <- read.csv(file = "Vital_Statistics_Suicide.csv")

#renaming year column (weird character in front of year)
colnames(suicide)[1]<- "Year"

#removing not stated from Race.or.Ethnicity
suicide2 <- subset(suicide, Race.or.Ethnicity!= "Not Stated")

#renaming Black Non Hispanic to Black in Race.or.Ethnicity
suicide2$Race.or.Ethnicity <- ifelse(suicide2$Race.or.Ethnicity  == "Black Non Hispanic", "Black", suicide2$Race.or.Ethnicity)

#renaming Other Non Hispanic to Other in Race.or.Ethnicity
suicide2$Race.or.Ethnicity <- ifelse(suicide2$Race.or.Ethnicity  == "Other Non Hispanic", "Other", suicide2$Race.or.Ethnicity)

#renaming White Other Non Hispanic to White in Race.or.Ethnicity
suicide2$Race.or.Ethnicity <- ifelse(suicide2$Race.or.Ethnicity  == "White Non Hispanic", "White", suicide2$Race.or.Ethnicity)

#Just the totals from each of the age groups based on Year (used for ANOVA test)
suicide3 <- subset(suicide2, Age.Group == "Total")

#Summed up the results between the two regions
suicide3 <- aggregate(suicide3$Suicide.Deaths~suicide3$Year + suicide3$Race.or.Ethnicity,FUN = sum, na.rm = TRUE)

#removing data that says total, <1, 1-9 from Age.Group column
suicide2 <- subset(suicide2, Age.Group != "Total" & Age.Group != "<1" & Age.Group != "1-9")

#loading Depression Income Set
income <- read.csv(file = "depression_income.csv")

# Re-coding income labels
income$income <- ifelse(income$income == "Not classified", NA, income$income)
income$income <- ifelse(income$income == "High income", "high", ifelse (income$income == "Upper middle income", "upper-mid", ifelse (income$income == "Low income", "low", income$income)))
income$income <- ifelse(income$income =="High income: OECD", "OECD", ifelse (income$income == "Lower middle income", "lower-mid", income$income))

Table of Contents

Part 1 (Suicide Data Set)

  • Intro
  • Data Source
  • Dataset
  • Variables
  • Analysis
    • Summary Statistics
    • ANOVA Regression (ANOVA is not to be trusted as the data is not normally distributed)
    • Shapiro Test (To test if normally distributed)
    • Kruskal-Wallis Test
    • Chi Square (Better to Use Fisher Exact Test)
    • Fisher Exact Test
    • Relative Risk and Odds Ratio
    • Hypothesis Testing
    • Kolmogorov And Smirnov Test (Test if 2 samples have the same distribution)
    • Fisher’s F test (If two samples have the same variance)
    • Non-parametric Linear Correlation (Alcohol related deaths and suicide deaths)
  • Summary of Test Results
  • General Conclusions
  • Implications of Findings

Part 2 (Depression Income Data Set)

  • Intro
  • Data Source
  • Dataset
  • Variables
  • Analysis
    • Summary Statistics
    • Linear Regression (not trustable)
    • Shapiro Test (not normal)
    • Kruskal Wallis
    • Multiple Logistic Regression
  • Summary of Test Results
  • General Conclusions
  • Implications of Findings

Part 3

  • Thoughts on the Analytic Process
  • Bibliography

Part 1: The relationship between ethnicity and number of suicide deaths in NY State from 2003 - 2017

Intro

Data Source

Data Set

Variables

Analysis

Summmary Statistics

#Summmary
summary(suicide2)
##       Year         Region          Race.or.Ethnicity      Sex           
##  Min.   :2003   Length:1296        Length:1296        Length:1296       
##  1st Qu.:2007   Class :character   Class :character   Class :character  
##  Median :2011   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2011                                                           
##  3rd Qu.:2015                                                           
##  Max.   :2017                                                           
##   Age.Group         Firearm.Deaths   Alcohol.Related.Deaths Suicide.Deaths  
##  Length:1296        Min.   :  0.00   Length:1296            Min.   :  0.00  
##  Class :character   1st Qu.:  0.00   Class :character       1st Qu.:  0.00  
##  Mode  :character   Median :  0.00   Mode  :character       Median :  3.00  
##                     Mean   :  8.61                          Mean   : 17.21  
##                     3rd Qu.:  5.00                          3rd Qu.: 19.00  
##                     Max.   :130.00                          Max.   :223.00
#line plot for average suicide deaths per year and total suicide deaths per year
year_summary <- suicide2 %>%
  group_by(Year) %>%
  summarize(`Total Suicide Deaths` = sum(Suicide.Deaths),
            `Average Suicide Deaths` = mean(Suicide.Deaths))
## `summarise()` ungrouping output (override with `.groups` argument)
ggplot(year_summary, aes(x = Year, y = `Average Suicide Deaths`)) +
  geom_point() +
  geom_path() + 
  ylim(0,40) +
  theme_minimal()

ggplot(year_summary, aes(x = Year, y = `Total Suicide Deaths`)) +
  geom_point() +
  geom_path() + 
  theme_minimal()

#tables of mean number of suicide deaths 
aggregate(suicide2$Suicide.Deaths~suicide2$Race.or.Ethnicity,FUN = mean)
##   suicide2$Race.or.Ethnicity suicide2$Suicide.Deaths
## 1                      Black                1.496575
## 2                   Hispanic               32.946296
## 3                      Other                2.000000
## 4                      White               11.849530
aggregate(suicide2$Suicide.Deaths~suicide2$Race.or.Ethnicity+suicide2$Year,FUN = mean)
##    suicide2$Race.or.Ethnicity suicide2$Year suicide2$Suicide.Deaths
## 1                       Black          2003              0.03846154
## 2                    Hispanic          2003             34.61111111
## 3                       Other          2003              0.00000000
## 4                       White          2003              0.18181818
## 5                       Black          2004              0.00000000
## 6                    Hispanic          2004             34.80555556
## 7                       Other          2004              0.00000000
## 8                       White          2004              0.00000000
## 9                       Black          2005              0.00000000
## 10                   Hispanic          2005             36.44444444
## 11                      Other          2005              0.00000000
## 12                      White          2005              0.11111111
## 13                      Black          2006              0.00000000
## 14                   Hispanic          2006             36.22222222
## 15                      Other          2006              0.00000000
## 16                      White          2006              0.05882353
## 17                      Black          2007              0.07692308
## 18                   Hispanic          2007             38.55555556
## 19                      Other          2007              0.00000000
## 20                      White          2007              0.07142857
## 21                      Black          2008              0.00000000
## 22                   Hispanic          2008             38.44444444
## 23                      Other          2008              0.00000000
## 24                      White          2008              0.11764706
## 25                      Black          2009              0.00000000
## 26                   Hispanic          2009             38.63888889
## 27                      Other          2009              0.00000000
## 28                      White          2009              0.06666667
## 29                      Black          2010              0.05263158
## 30                   Hispanic          2010             41.86111111
## 31                      White          2010              0.00000000
## 32                      Black          2011              0.00000000
## 33                   Hispanic          2011             44.75000000
## 34                      Other          2011              0.50000000
## 35                      White          2011              0.23809524
## 36                      Black          2012              0.00000000
## 37                   Hispanic          2012             45.94444444
## 38                      Other          2012              0.00000000
## 39                      White          2012              0.06666667
## 40                      Black          2013              0.10000000
## 41                   Hispanic          2013             45.25000000
## 42                      Other          2013              0.00000000
## 43                      White          2013              0.05882353
## 44                      Black          2014              0.00000000
## 45                   Hispanic          2014             45.63888889
## 46                      Other          2014              0.00000000
## 47                      White          2014              0.33333333
## 48                      Black          2015              3.83333333
## 49                   Hispanic          2015              4.16666667
## 50                      Other          2015              2.69444444
## 51                      White          2015             35.19444444
## 52                      Black          2016              3.97222222
## 53                   Hispanic          2016              4.36111111
## 54                      Other          2016              2.69444444
## 55                      White          2016             34.66666667
## 56                      Black          2017              4.22222222
## 57                   Hispanic          2017              4.50000000
## 58                      Other          2017              2.63888889
## 59                      White          2017             34.50000000
#box plot
boxplot(suicide2$Suicide.Deaths~suicide2$Race.or.Ethnicity,col=c("grey25", "grey50", "grey75", "grey100"), ylab = "NUMBER OF SUICIDE DEATHS", xlab = "RACE/ETHNICITY")

#Histogram to find a high number of suicides
hist(suicide2$Suicide.Deaths, xlab = "NUMBER OF SUICIDE DEATHS", ylab = "FREQUENCY")

Based on the mean number of suicide deaths per race/ethnic group and then suicides deaths per race/ethnic group per year it appears as though Hispanic people have higher numbers of suicide deaths. Based on the box plot, it appears as though Hispanics have the highest number of suicide deaths on average. White appears to be the second largest, with Other and Black being very low. The histogram shows that the distribution of suicide deaths is not normally distributed. Based on the line plot for total suicide deaths, total suicide deaths are increasing every year. Based on the line plot for average suicide deaths, the average suicide deaths were increasing from 2003 to 2012 and then started decreasing.

ANOVA Regression (Suicide Data Set)

Null hypothesis: There is no difference in the mean number suicide deaths between different years and race/ethnicities.

Alternative hypothesis: There is a difference in the mean number of suicide deaths between different years and race/ethnicities.

#ANOVA Tests
ANOVA1 <- aov(suicide3$`suicide3$Suicide.Deaths`~ as.factor(suicide3$`suicide3$Year`) + suicide3$`suicide3$Race.or.Ethnicity`)
summary(ANOVA1)
##                                       Df   Sum Sq Mean Sq F value        Pr(>F)
## as.factor(suicide3$`suicide3$Year`)   14   142513   10179   0.052             1
## suicide3$`suicide3$Race.or.Ethnicity`  3 13606920 4535640  23.292 0.00000000581
## Residuals                             41  7983818  194727                      
##                                          
## as.factor(suicide3$`suicide3$Year`)      
## suicide3$`suicide3$Race.or.Ethnicity` ***
## Residuals                                
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ANOVA2 <- aov(suicide3$`suicide3$Suicide.Deaths`~ suicide3$`suicide3$Race.or.Ethnicity`)
summary(ANOVA2)
##                                       Df   Sum Sq Mean Sq F value
## suicide3$`suicide3$Race.or.Ethnicity`  3 13655399 4551800   30.99
## Residuals                             55  8077852  146870        
##                                                 Pr(>F)    
## suicide3$`suicide3$Race.or.Ethnicity` 0.00000000000726 ***
## Residuals                                                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#It compares the means of each group and if it is significantly different
TukeyHSD(ANOVA2)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = suicide3$`suicide3$Suicide.Deaths` ~ suicide3$`suicide3$Race.or.Ethnicity`)
## 
## $`suicide3$`suicide3$Race.or.Ethnicity``
##                        diff        lwr       upr     p adj
## Hispanic-Black  1157.266667   786.5212 1528.0122 0.0000000
## Other-Black       -8.552381  -385.8603  368.7555 0.9999213
## White-Black      222.733333  -148.0122  593.4788 0.3917449
## Other-Hispanic -1165.819048 -1543.1269 -788.5112 0.0000000
## White-Hispanic  -934.533333 -1305.2788 -563.7878 0.0000001
## White-Other      231.285714  -146.0222  608.5936 0.3738476

Interpretation: Hispanics had the highest number of suicide deaths out of all of the racial/ethnic groups. The Hispanic group had a higher number of of suicide deaths that was significantly higher than the Black, White and Other racial groups based on the p-value of effectively 0. There was no significant difference between the White, Black, and Other racial groups based on the adjusted P-values. There was no effect of year on mean number of suicide deaths (p value = 1)

Part 2: Shapiro Test (Suicide Data Set)

Null: The data is approximately normally distributed. Alternative: The data is not approximately normally distributed.

#Density plot
ggplot(suicide3, aes(x=`suicide3$Suicide.Deaths`)) +
  geom_density() +
  theme_minimal() +
  labs(x = "Suicide Deaths Per Year",
      y = "Density")

#Shapiro test
shapiro.test(suicide3$`suicide3$Suicide.Deaths`)
## 
##  Shapiro-Wilk normality test
## 
## data:  suicide3$`suicide3$Suicide.Deaths`
## W = 0.62083, p-value = 0.00000000004386

Interpretation: Based on the p-value of 0.00000000004386, we reject the null hypothesis. We can conclude that the number of suicide deaths is not normally distributed.

Part 3: Fisher’s F test (Suicide Data Set)

Null: Hispanic and Non-Hispanic people have the same variance regarding suicide deaths Alternative: Hispanic and Non-Hispanic people do not have the same variance regarding suicide deaths

#Creating the x and y for the Fisher's F test and Kolmogrov and Smirnov Test
hispanic <- subset(suicide3,suicide3$`suicide3$Race.or.Ethnicity`== "Hispanic")
nonhispanic <- subset(suicide3, suicide3$`suicide3$Race.or.Ethnicity` == "Black" | suicide3$`suicide3$Race.or.Ethnicity` == "White" | suicide3$`suicide3$Race.or.Ethnicity` == "Other")

#Fisher F test
var.test(hispanic$`suicide3$Suicide.Deaths`,nonhispanic$`suicide3$Suicide.Deaths`,alternative = c("two.sided"))
## 
##  F test to compare two variances
## 
## data:  hispanic$`suicide3$Suicide.Deaths` and nonhispanic$`suicide3$Suicide.Deaths`
## F = 3.0136, num df = 14, denom df = 43, p-value = 0.00547
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  1.377670 8.021705
## sample estimates:
## ratio of variances 
##           3.013621

Interpretation: I re-coded the race/ethnicity groups to be either hispanic or non-hispanic to preform the Fisher F test. We reject the null hypothesis that hispanic and non-hispanic groups have the same variance regarding suicide deaths based on the p-value of 0.00547.

Part 4: Kolmogrov and Smirnov Test (Suicide Data Set)

Null: Hispanic and Non-Hispanic people have the same distribution regarding suicide deaths Alternative: Hispanic and Non-Hispanic people do not have the same distribution regarding suicide deaths

#Kolmogrov and Smirnov Test
ks.test(hispanic$`suicide3$Suicide.Deaths`, nonhispanic$`suicide3$Suicide.Deaths`, alternative = c("two.sided"))
## Warning in ks.test(hispanic$`suicide3$Suicide.Deaths`,
## nonhispanic$`suicide3$Suicide.Deaths`, : cannot compute exact p-value with ties
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  hispanic$`suicide3$Suicide.Deaths` and nonhispanic$`suicide3$Suicide.Deaths`
## D = 0.90909, p-value = 0.00000001866
## alternative hypothesis: two-sided

Interpretation: Based on the p-value of 0.00000001866, we can conclude that Hispanic and Non Hispanic people do not have the same distribution regarding suicide deaths.Because the number of suicide deaths are not normally distributed and because there is an unequal distribution of the variance between hispanic and non-hispanic groups an ANOVA is not an appropriate test even though it was preformed above. A more appropriate test would be a Krustal-Wallis based on these factors.

Part 5: Kruskal-Wallis (Suicide Data Set)

Null: There is no difference in the median number of suicide deaths across the 4 ethnic groups. Alternative: There is a difference in the median number of suicide deaths across the 4 ethnic groups.

#Kruskal-Wallis test
kruskal.test(suicide3$`suicide3$Suicide.Deaths`~ suicide3$`suicide3$Race.or.Ethnicity`)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  suicide3$`suicide3$Suicide.Deaths` by suicide3$`suicide3$Race.or.Ethnicity`
## Kruskal-Wallis chi-squared = 36.655, df = 3, p-value = 0.00000005444

Interpretation: Based on the p-value of 0.00000005444, we can reject the null hypothesis. We can conclude that there is a difference in the median number of suicide deaths across the 4 ethnic groups. Similarly to the ANOVA results, there is a difference in the distribution of the number of suicide deaths among the 4 ethnic groups.

Part 6: Chi Square and Posthoc test (Suicide Data Set)

Null: The frequency of a high number of suicide deaths (>=1000) is equal among the 4 ethnic groups. Alternative: The frequency of a high number of suicide deaths (>=1000) is not equal among the 4 ethnic groups.

#Creating a column for high and low number of suicide deaths
suicide3$Suicide.hl <- ifelse(suicide3$`suicide3$Suicide.Deaths` >= 1000, "high", "low")

#Table for the number of times you see high frequency or low frequency for the 4 ethnic groups.
suicide.tab <- table(suicide3$`suicide3$Race.or.Ethnicity`, suicide3$Suicide.hl)
suicide.tab
##           
##            high low
##   Black       0  15
##   Hispanic   12   3
##   Other       0  14
##   White       3  12
#Chi-Square
chisq.test(suicide.tab)
## Warning in chisq.test(suicide.tab): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  suicide.tab
## X-squared = 33.684, df = 3, p-value = 0.000000231
#Chi-square post hoc
chisq.posthoc.test(suicide.tab)
## Warning in chisq.test(x, ...): Chi-squared approximation may be incorrect
##   Dimension     Value       high        low
## 1     Black Residuals -2.6185724  2.6185724
## 2     Black  p values  0.0706390  0.0706390
## 3  Hispanic Residuals  5.6212021 -5.6212021
## 4  Hispanic  p values  0.0000000  0.0000000
## 5     Other Residuals -2.5015147  2.5015147
## 6     Other  p values  0.0989310  0.0989310
## 7     White Residuals -0.5586288  0.5586288
## 8     White  p values  1.0000000  1.0000000

Interpretation: We reject the null hypothesis based on the p-value of 2.31e-07. We can conclude that there is a significant difference between the high and low frequencies of suicide deaths between the 4 ethnic groups. The observed suicide frequency for black people was not significantly different than what was expected (p = 0.07).The observed suicide frequency for people classified as other was not significantly different than what was expected (p = 0.09). The observed suicide frequency for white people was not significantly different than what was expected (p = 1.00). In contrast, the observed suicide frequency for hispanic people was significantly higher than what was expected (p < 0.00). However, because 3 out of 8 cells of the table have N < 5, a more appropriate test would be the Fisher Exact Test below.

Part 7: Fisher Exact Test (Suicide Data Set)

Null: The frequency of a high number of suicide deaths (>=1000) is equal among the 4 ethnic groups. Alternative: The frequency of a high number of suicide deaths (>=1000) is not equal among the 4 ethnic groups.

#Fisher test
fisher.test(suicide.tab)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  suicide.tab
## p-value = 0.00000007613
## alternative hypothesis: two.sided
#Fisher post-hoc test
fisher.multcomp(suicide.tab,p.method = "BH")
## 
##         Pairwise comparisons using Fisher's exact test for count data
## 
## data:  suicide.tab
## 
##               Black   Hispanic Other
## Hispanic 0.00003156          -     -
## Other    1.00000000 0.00003156     -
## White    0.26896552 0.00562866 0.269
## 
## P value adjustment method: BH

Interpretation: Based on the p-value of 7.613e-08, we can reject the null hypothesis and conclude that the frequency of a high number of suicides is not equal among the 4 ethnic groups. The observed suicide frequency for black people compared to hispanic people was significantly different than what was expected (p = 0.00003156).The observed suicide frequency for people classified as other was not significantly different than for people classified as black (p = 1.00). The observed suicide frequency for white people was not significantly different than what was expected compared to other groups except the hispanic group based on the observed p-values (p = 1.00). In contrast, the observed suicide frequency for hispanic people was significantly higher than what was expected for all of the groups based on the p-values observed.

Part 8: Relative Risk and Odds Ratio (Suicide Data Set)

#Hispanic versus non-Hispanic column
suicide3$Hispanic <- ifelse (suicide3$`suicide3$Race.or.Ethnicity` == "Hispanic", "Hispanic", "Non-Hispanic")

#Hispanic verus non-Hispanic table
hispanic.tab <- table(suicide3$Hispanic,suicide3$Suicide.hl)
hispanic.tab
##               
##                high low
##   Hispanic       12   3
##   Non-Hispanic    3  41
#To get proportions
prop.table(hispanic.tab)
##               
##                      high        low
##   Hispanic     0.20338983 0.05084746
##   Non-Hispanic 0.05084746 0.69491525
#To tell if there is a difference in proportions
prop.test(hispanic.tab)
## Warning in prop.test(hispanic.tab): Chi-squared approximation may be incorrect
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  hispanic.tab
## X-squared = 27.856, df = 1, p-value = 0.0000001307
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.4714308 0.9922056
## sample estimates:
##     prop 1     prop 2 
## 0.80000000 0.06818182
#To get the relative risk
prop.table(hispanic.tab)[1,1]/prop.table(hispanic.tab)[2,1]
## [1] 4
#To get the odds ratio
(prop.table(hispanic.tab)[1,1]/prop.table(hispanic.tab)[1,2])/(prop.table(hispanic.tab)[2,1]/prop.table(hispanic.tab)[2,2])
## [1] 54.66667

Interpretation: There is not an equal proportion of high frequency suicide deaths between hispanic and non-hispanic ethnic groups. The relative risk of a high frequency of suicides in a given year is 300% higher for hispanics than non-hispanic. The odds ratio is saying that the odds of a high frequency suicide in a given year attributed to hispanics is 5468% higher than it is for non-hispanics.

Part 9: Non-parametric Linear Correlation (Suicide Data Set)

Null: There is no linear relationship between suicide deaths and alcohol deaths. Alternative: There is a linear relationship between suicide deaths and alcohol deaths.

#Changing char to numeric
suicide2$Alcohol.Related.Deaths = as.numeric(suicide2$Alcohol.Related.Deaths)

#Non-parametric Linear Correlation test
cor.test(y = suicide2$Suicide.Deaths, x = suicide2$Alcohol.Related.Deaths, method = "spearman")
## Warning in cor.test.default(y = suicide2$Suicide.Deaths, x =
## suicide2$Alcohol.Related.Deaths, : Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  suicide2$Alcohol.Related.Deaths and suicide2$Suicide.Deaths
## S = 65795272, p-value < 0.00000000000000022
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.8186443
#Making graph
ggplot(suicide2, aes(x = Alcohol.Related.Deaths, y = Suicide.Deaths))+
geom_point(shape=1)+
geom_smooth(method = lm, 
            se = FALSE)
## `geom_smooth()` using formula 'y ~ x'

Interpretation: We reject the null hypothesis that there is no relationship between suicide deaths and alcohol deaths based on the p-value of < 0.00000000000000022. We can conclude that there is a significant positive relationship between suicide deaths and alcohol deaths. According to the Spearman’s row (rho), as it is above a .75 it suggests that there is a strong positive linear relationship.

Data Set

Variables

Analysis

Part 2:

Intro

Data Source

Data Set

Variables

Analysis

Summmary Statistics

summary(income)
##    country             iso3c                year        prevalence       
##  Length:6468        Length:6468        Min.   :1990   Min.   :      931  
##  Class :character   Class :character   1st Qu.:1997   1st Qu.:    73904  
##  Mode  :character   Mode  :character   Median :2004   Median :   277645  
##                                        Mean   :2004   Mean   :  4407362  
##                                        3rd Qu.:2010   3rd Qu.:  1313348  
##                                        Max.   :2017   Max.   :264455593  
##                                                                          
##     iso2c             gdp_percap         population           birth_rate   
##  Length:6468        Min.   :   239.7   Min.   :     43972   Min.   : 7.60  
##  Class :character   1st Qu.:  2158.3   1st Qu.:   1982691   1st Qu.:13.53  
##  Mode  :character   Median :  6474.6   Median :   7004332   Median :22.07  
##                     Mean   : 12649.5   Mean   :  33833353   Mean   :24.51  
##                     3rd Qu.: 17409.9   3rd Qu.:  19717848   3rd Qu.:34.55  
##                     Max.   :141442.2   Max.   :1364270000   Max.   :55.12  
##                     NA's   :2567       NA's   :2224         NA's   :2311   
##  neonat_mortal_rate    region             income         
##  Min.   : 1.00      Length:6468        Length:6468       
##  1st Qu.: 6.40      Class :character   Class :character  
##  Median :15.30      Mode  :character   Mode  :character  
##  Mean   :19.65                                           
##  3rd Qu.:30.00                                           
##  Max.   :73.10                                           
##  NA's   :2368
# Create new column for depression prevalence adjusted by population size
income$depression_prop <- income$prevalence/income$population

# This one shows that the distribution is strongly skewed right
ggplot(income) +
  geom_density(aes(x = prevalence)) +
  labs(title = "Density Plot of Depression Counts per Country per Year") +
  theme_minimal()

# When I adjust by Population size, the data is less skewed, and looks more normally distributed. 
ggplot(income) +
  geom_density(aes(x = depression_prop)) +
  labs(title = "Density Plot of Depression Proportion adjusted by Population") + 
  theme_minimal()
## Warning: Removed 2224 rows containing non-finite values (stat_density).

# Density Graph by Income bracket. 
# Possible discussion: I notice that High income: OECD countries 
ggplot(na.omit((income))) +
  geom_density(aes(x = depression_prop, fill = income), alpha = 0.5) +
  labs(title = "Density Plot of Depression Proportion adjusted by Population") + 
  theme_minimal()

# Density Graph by Region
ggplot(income) +
  geom_density(aes(x = depression_prop, fill = region), alpha = 0.5) +
  labs(title = "Density Plot of Depression Proportion adjusted by Population",
       subtitle = "Grouped by Region") + 
  theme_minimal()
## Warning: Removed 2224 rows containing non-finite values (stat_density).

#Linear Regression test
mod2 <- lm((income$depression_prop) ~ (income$gdp_percap))
summary(mod2)
## 
## Call:
## lm(formula = (income$depression_prop) ~ (income$gdp_percap))
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.023153 -0.005114 -0.001871  0.004043  0.025287 
## 
## Coefficients:
##                         Estimate     Std. Error t value            Pr(>|t|)    
## (Intercept)       0.028362851588 0.000150385026  188.60 <0.0000000000000002 ***
## income$gdp_percap 0.000000248049 0.000000007392   33.56 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.007356 on 3899 degrees of freedom
##   (2567 observations deleted due to missingness)
## Multiple R-squared:  0.2241, Adjusted R-squared:  0.2239 
## F-statistic:  1126 on 1 and 3899 DF,  p-value: < 0.00000000000000022

This Density Plot of Depression counts per country per year shows that the distribution is strongly skewed right. When I adjust by Population size, the data is less skewed, and looks more normally distributed in the Density Plot of Depression Proportion adjusted by Population. The Density Plot of Depression Proportion adjusted by Population, looks at depression prevalence adjusted by population and grouped by income level. Based on this graph, I can see that high income countries have higher population adjusted depression prevalence than the other categories. The Density Plot of Depression Proportion adjusted by Population by region has North America with the highest depression prevalence.

Part 10: Linear Regresssion (Depression Income Data Set)

Null: There is no relationship between GDP per capita and age adjusted depression prevalence Alternative: There is a relationship GDP per capita and age adjusted depression prevalence

#Linear Regression test
mod2 <- lm((income$depression_prop) ~ (income$gdp_percap))
summary(mod2)
## 
## Call:
## lm(formula = (income$depression_prop) ~ (income$gdp_percap))
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.023153 -0.005114 -0.001871  0.004043  0.025287 
## 
## Coefficients:
##                         Estimate     Std. Error t value            Pr(>|t|)    
## (Intercept)       0.028362851588 0.000150385026  188.60 <0.0000000000000002 ***
## income$gdp_percap 0.000000248049 0.000000007392   33.56 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.007356 on 3899 degrees of freedom
##   (2567 observations deleted due to missingness)
## Multiple R-squared:  0.2241, Adjusted R-squared:  0.2239 
## F-statistic:  1126 on 1 and 3899 DF,  p-value: < 0.00000000000000022

Based on the p-value of < 2.2e-16, we can reject the null hypothesis. We can conclude that there is a relationship between GDP per capita and age adjusted depression prevalence based on the p-value of p-value of < 2.2e-16. Based on the adjusted r-squared, that is effectively 0.2239, GDP per capita explains 22.39 % of the variance in depression prevalence.

Part 11: Shapiro Test (Depression Income Data Set)

Null: The residuals from our linear model of GDP per Capita on Depression Proportion is approximately normally distributed. Alternative: The residuals from our linear model of GDP per Capita on Depression Proportion is not approximately normally distributed.

#Residuals of prevalence and gdp_percap
shapiro.test(resid(mod2))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(mod2)
## W = 0.93934, p-value < 0.00000000000000022
hist(resid(mod2))

#Prevalence graph
hist(income$depression_prop)

#Q-Q plot
qqnorm(income$depression_prop)
qqline(income$depression_prop, col = "red")

Based on the p-value of < 2.2e-16, and a significance level alpha = 0.5, we would reject our null hypothesis that the residuals are normally distributed. This indicates that our model does not capture all the variance in the depression prevalence proportion. Because of this a Kruskal Wallis is more appropriate than an ANOVA test.

Part 12: Kruskal Wallis (Depression Income Data Set)

Null: There is no difference in the median depression prevalence by population across the income categories. Alternative: There is a difference in the median depression prevalence by population across the income categories.

#Krustal-Wallis
kruskal.test(income$depression_prop ~ income$income)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  income$depression_prop by income$income
## Kruskal-Wallis chi-squared = 1663.9, df = 4, p-value <
## 0.00000000000000022
#box plot
boxplot(income$depression_prop ~ income$income, xlab = "COUNTRY INCOME CATEGORY", ylab = "POPULATION ADJUSTED DEPRESSSION PREVALENCE")

Interpretation: Based on the p value of < 0.00000000000000022, we can reject the null hypothesis and conclude that there is a difference in the median depression prevalence adjusted by population across the income categories. The box plot shows that low income countries have the lowest depression prevalence adjusted by population, but high income OECD countries (examples: USA, UK, CANADA) have the highest depression prevalence adjusted by population.

Part 13: Multiple Logistic Regression (Depression Income Data Set)

Null: There is no difference in neo-natal mortality, gdp per capita, or year in the ability to predict a popluation adjusted depression prevalence above the median of 0.02945099. Alternative: There is a difference in neo-natal mortality, gdp per capita, or year in the ability to predict a population adjusted depression prevalence above the median of 0.02945099.

#Finding the median
median(income$depression_prop, na.rm = TRUE)
## [1] 0.02945099
#Making a new column
income$preval01 <- ifelse (income$depression_prop > median(income$depression_prop, na.rm = TRUE), 1, 0)

#Multiple logistic regression
mod3 <- glm(income$preval01 ~ income$year + income$gdp_percap + income$neonat_mortal_rate, family = binomial(link = "logit"))
summary(mod3)
## 
## Call:
## glm(formula = income$preval01 ~ income$year + income$gdp_percap + 
##     income$neonat_mortal_rate, family = binomial(link = "logit"))
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -4.8931  -0.7660  -0.5527   0.7474   2.0514  
## 
## Coefficients:
##                               Estimate   Std. Error z value
## (Intercept)               42.086094194 11.564852581   3.639
## income$year               -0.021620916  0.005777254  -3.742
## income$gdp_percap          0.000157756  0.000008318  18.966
## income$neonat_mortal_rate -0.013992663  0.003793449  -3.689
##                                       Pr(>|z|)    
## (Intercept)                           0.000274 ***
## income$year                           0.000182 ***
## income$gdp_percap         < 0.0000000000000002 ***
## income$neonat_mortal_rate             0.000225 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5341.1  on 3852  degrees of freedom
## Residual deviance: 3716.9  on 3849  degrees of freedom
##   (2615 observations deleted due to missingness)
## AIC: 3724.9
## 
## Number of Fisher Scoring iterations: 6
boxplot(income$gdp_percap ~ income$preval01, xlab = "DEPRESSION PREVALENCE ABOVE MEDIAN", ylab = "GDP PER CAPITA")

boxplot(income$neonat_mortal_rate ~ income$preval01, xlab = "DEPRESSION PREVALENCE ABOVE MEDIAN", ylab = "NEONATAL MORTALITY")

plot(income$depression_prop ~ income$year, xlab = "YEAR", ylab = "DEPRESSION PREVALENCE SCORE")
abline(lm(income$depression_prop ~ income$year), col = "red")

Interpretation: There is a significant effect of increasing years on population adjusted depression prevalence based on the p-value of 0.000182. The red trend line on the scatterplot indicates a very slight increase in population adjusted depression prevalence with increasing year. For GDP per capita there is a significant effect on population adjusted depression prevalence based on the p-values of < 2e-16; this is supported by the box plot. There is a significant effect of decreasing neonatal mortality rates on popluation adjusted depression prevalence based on the p-values of 0.000225 and this is also evidenced by the box plot.

Part 3: Closing Thoughts

Thoughts on the Analytic Process

Bibliography

LS0tDQp0aXRsZTogIkNhcHN0b25lIFIgUHJvamVjdCINCmF1dGhvcjogIiINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpsaWJyYXJ5KGdncGxvdDIpDQojaW5zdGFsbC5wYWNrYWdlcygiY2hpc3EucG9zdGhvYy50ZXN0IikNCmxpYnJhcnkoY2hpc3EucG9zdGhvYy50ZXN0KQ0KI2luc3RhbGwucGFja2FnZXMoIlJWQWlkZU1lbW9pcmUiKQ0KbGlicmFyeShSVkFpZGVNZW1vaXJlKQ0KYGBgDQoNCiMjIEltcG9ydGluZyBhbmQgQ2xlYW5pbmcgRGF0YSBTZXRzIEZvciBBbmFseXNpcw0KDQpgYGB7cn0NCg0KI0dldCByaWQgb2Ygc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQoNCiNsb2FkaW5nIE5ZIFN1aWNpZGUgRGF0YSBTZXQgDQpzdWljaWRlIDwtIHJlYWQuY3N2KGZpbGUgPSAiVml0YWxfU3RhdGlzdGljc19TdWljaWRlLmNzdiIpDQoNCiNyZW5hbWluZyB5ZWFyIGNvbHVtbiAod2VpcmQgY2hhcmFjdGVyIGluIGZyb250IG9mIHllYXIpDQpjb2xuYW1lcyhzdWljaWRlKVsxXTwtICJZZWFyIg0KDQojcmVtb3Zpbmcgbm90IHN0YXRlZCBmcm9tIFJhY2Uub3IuRXRobmljaXR5DQpzdWljaWRlMiA8LSBzdWJzZXQoc3VpY2lkZSwgUmFjZS5vci5FdGhuaWNpdHkhPSAiTm90IFN0YXRlZCIpDQoNCiNyZW5hbWluZyBCbGFjayBOb24gSGlzcGFuaWMgdG8gQmxhY2sgaW4gUmFjZS5vci5FdGhuaWNpdHkNCnN1aWNpZGUyJFJhY2Uub3IuRXRobmljaXR5IDwtIGlmZWxzZShzdWljaWRlMiRSYWNlLm9yLkV0aG5pY2l0eSAgPT0gIkJsYWNrIE5vbiBIaXNwYW5pYyIsICJCbGFjayIsIHN1aWNpZGUyJFJhY2Uub3IuRXRobmljaXR5KQ0KDQojcmVuYW1pbmcgT3RoZXIgTm9uIEhpc3BhbmljIHRvIE90aGVyIGluIFJhY2Uub3IuRXRobmljaXR5DQpzdWljaWRlMiRSYWNlLm9yLkV0aG5pY2l0eSA8LSBpZmVsc2Uoc3VpY2lkZTIkUmFjZS5vci5FdGhuaWNpdHkgID09ICJPdGhlciBOb24gSGlzcGFuaWMiLCAiT3RoZXIiLCBzdWljaWRlMiRSYWNlLm9yLkV0aG5pY2l0eSkNCg0KI3JlbmFtaW5nIFdoaXRlIE90aGVyIE5vbiBIaXNwYW5pYyB0byBXaGl0ZSBpbiBSYWNlLm9yLkV0aG5pY2l0eQ0Kc3VpY2lkZTIkUmFjZS5vci5FdGhuaWNpdHkgPC0gaWZlbHNlKHN1aWNpZGUyJFJhY2Uub3IuRXRobmljaXR5ICA9PSAiV2hpdGUgTm9uIEhpc3BhbmljIiwgIldoaXRlIiwgc3VpY2lkZTIkUmFjZS5vci5FdGhuaWNpdHkpDQoNCiNKdXN0IHRoZSB0b3RhbHMgZnJvbSBlYWNoIG9mIHRoZSBhZ2UgZ3JvdXBzIGJhc2VkIG9uIFllYXIgKHVzZWQgZm9yIEFOT1ZBIHRlc3QpDQpzdWljaWRlMyA8LSBzdWJzZXQoc3VpY2lkZTIsIEFnZS5Hcm91cCA9PSAiVG90YWwiKQ0KDQojU3VtbWVkIHVwIHRoZSByZXN1bHRzIGJldHdlZW4gdGhlIHR3byByZWdpb25zDQpzdWljaWRlMyA8LSBhZ2dyZWdhdGUoc3VpY2lkZTMkU3VpY2lkZS5EZWF0aHN+c3VpY2lkZTMkWWVhciArIHN1aWNpZGUzJFJhY2Uub3IuRXRobmljaXR5LEZVTiA9IHN1bSwgbmEucm0gPSBUUlVFKQ0KDQojcmVtb3ZpbmcgZGF0YSB0aGF0IHNheXMgdG90YWwsIDwxLCAxLTkgZnJvbSBBZ2UuR3JvdXAgY29sdW1uDQpzdWljaWRlMiA8LSBzdWJzZXQoc3VpY2lkZTIsIEFnZS5Hcm91cCAhPSAiVG90YWwiICYgQWdlLkdyb3VwICE9ICI8MSIgJiBBZ2UuR3JvdXAgIT0gIjEtOSIpDQoNCiNsb2FkaW5nIERlcHJlc3Npb24gSW5jb21lIFNldA0KaW5jb21lIDwtIHJlYWQuY3N2KGZpbGUgPSAiZGVwcmVzc2lvbl9pbmNvbWUuY3N2IikNCg0KIyBSZS1jb2RpbmcgaW5jb21lIGxhYmVscw0KaW5jb21lJGluY29tZSA8LSBpZmVsc2UoaW5jb21lJGluY29tZSA9PSAiTm90IGNsYXNzaWZpZWQiLCBOQSwgaW5jb21lJGluY29tZSkNCmluY29tZSRpbmNvbWUgPC0gaWZlbHNlKGluY29tZSRpbmNvbWUgPT0gIkhpZ2ggaW5jb21lIiwgImhpZ2giLCBpZmVsc2UgKGluY29tZSRpbmNvbWUgPT0gIlVwcGVyIG1pZGRsZSBpbmNvbWUiLCAidXBwZXItbWlkIiwgaWZlbHNlIChpbmNvbWUkaW5jb21lID09ICJMb3cgaW5jb21lIiwgImxvdyIsIGluY29tZSRpbmNvbWUpKSkNCmluY29tZSRpbmNvbWUgPC0gaWZlbHNlKGluY29tZSRpbmNvbWUgPT0iSGlnaCBpbmNvbWU6IE9FQ0QiLCAiT0VDRCIsIGlmZWxzZSAoaW5jb21lJGluY29tZSA9PSAiTG93ZXIgbWlkZGxlIGluY29tZSIsICJsb3dlci1taWQiLCBpbmNvbWUkaW5jb21lKSkNCg0KYGBgDQoNCg0KIyMgVGFibGUgb2YgQ29udGVudHMNCg0KIyMjIyBQYXJ0IDEgKFN1aWNpZGUgRGF0YSBTZXQpDQoqIEludHJvDQoqIERhdGEgU291cmNlIA0KKiBEYXRhc2V0DQoqIFZhcmlhYmxlcw0KKiBBbmFseXNpcyANCiAgKyBTdW1tYXJ5IFN0YXRpc3RpY3MNCiAgKyBBTk9WQSBSZWdyZXNzaW9uIChBTk9WQSBpcyBub3QgdG8gYmUgdHJ1c3RlZCBhcyB0aGUgZGF0YSBpcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQpDQogICsgU2hhcGlybyBUZXN0IChUbyB0ZXN0IGlmIG5vcm1hbGx5IGRpc3RyaWJ1dGVkKQ0KICArIEtydXNrYWwtV2FsbGlzIFRlc3QNCiAgKyBDaGkgU3F1YXJlIChCZXR0ZXIgdG8gVXNlIEZpc2hlciBFeGFjdCBUZXN0KQ0KICArIEZpc2hlciBFeGFjdCBUZXN0DQogICsgUmVsYXRpdmUgUmlzayBhbmQgT2RkcyBSYXRpbw0KICArIEh5cG90aGVzaXMgVGVzdGluZyANCiAgKyBLb2xtb2dvcm92IEFuZCBTbWlybm92IFRlc3QgKFRlc3QgaWYgMiBzYW1wbGVzIGhhdmUgdGhlIHNhbWUgZGlzdHJpYnV0aW9uKQ0KICArIEZpc2hlcuKAmXMgRiB0ZXN0IChJZiB0d28gc2FtcGxlcyBoYXZlIHRoZSBzYW1lIHZhcmlhbmNlKQ0KICArIE5vbi1wYXJhbWV0cmljIExpbmVhciBDb3JyZWxhdGlvbiAoQWxjb2hvbCByZWxhdGVkIGRlYXRocyBhbmQgc3VpY2lkZSBkZWF0aHMpDQoqIFN1bW1hcnkgb2YgVGVzdCBSZXN1bHRzDQoqIEdlbmVyYWwgQ29uY2x1c2lvbnMNCiogSW1wbGljYXRpb25zIG9mIEZpbmRpbmdzDQoNCiMjIyMgUGFydCAyIChEZXByZXNzaW9uIEluY29tZSBEYXRhIFNldCkNCiogSW50cm8NCiogRGF0YSBTb3VyY2UgDQoqIERhdGFzZXQNCiogVmFyaWFibGVzDQoqIEFuYWx5c2lzIA0KICArIFN1bW1hcnkgU3RhdGlzdGljcw0KICArIExpbmVhciBSZWdyZXNzaW9uIChub3QgdHJ1c3RhYmxlKQ0KICArIFNoYXBpcm8gVGVzdCAobm90IG5vcm1hbCkNCiAgKyBLcnVza2FsIFdhbGxpcyANCiAgKyBNdWx0aXBsZSBMb2dpc3RpYyBSZWdyZXNzaW9uDQoqIFN1bW1hcnkgb2YgVGVzdCBSZXN1bHRzDQoqIEdlbmVyYWwgQ29uY2x1c2lvbnMNCiogSW1wbGljYXRpb25zIG9mIEZpbmRpbmdzDQoNCiMjIyMgUGFydCAzIA0KKiBUaG91Z2h0cyBvbiB0aGUgQW5hbHl0aWMgUHJvY2Vzcw0KKiBCaWJsaW9ncmFwaHkNCg0KKioqDQoNCiMjIFBhcnQgMTogVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGV0aG5pY2l0eSBhbmQgbnVtYmVyIG9mIHN1aWNpZGUgZGVhdGhzIGluIE5ZIFN0YXRlIGZyb20gMjAwMyAtIDIwMTcNCg0KIyMjIEludHJvIA0KDQojIyMgRGF0YSBTb3VyY2UNCg0KIyMjIERhdGEgU2V0DQoNCiMjIyBWYXJpYWJsZXMNCg0KIyMjIEFuYWx5c2lzDQoNCiMjIyMgU3VtbW1hcnkgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiNTdW1tbWFyeQ0Kc3VtbWFyeShzdWljaWRlMikNCg0KI2xpbmUgcGxvdCBmb3IgYXZlcmFnZSBzdWljaWRlIGRlYXRocyBwZXIgeWVhciBhbmQgdG90YWwgc3VpY2lkZSBkZWF0aHMgcGVyIHllYXINCnllYXJfc3VtbWFyeSA8LSBzdWljaWRlMiAlPiUNCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIHN1bW1hcml6ZShgVG90YWwgU3VpY2lkZSBEZWF0aHNgID0gc3VtKFN1aWNpZGUuRGVhdGhzKSwNCiAgICAgICAgICAgIGBBdmVyYWdlIFN1aWNpZGUgRGVhdGhzYCA9IG1lYW4oU3VpY2lkZS5EZWF0aHMpKQ0KDQpnZ3Bsb3QoeWVhcl9zdW1tYXJ5LCBhZXMoeCA9IFllYXIsIHkgPSBgQXZlcmFnZSBTdWljaWRlIERlYXRoc2ApKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fcGF0aCgpICsgDQogIHlsaW0oMCw0MCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KZ2dwbG90KHllYXJfc3VtbWFyeSwgYWVzKHggPSBZZWFyLCB5ID0gYFRvdGFsIFN1aWNpZGUgRGVhdGhzYCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9wYXRoKCkgKyANCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KI3RhYmxlcyBvZiBtZWFuIG51bWJlciBvZiBzdWljaWRlIGRlYXRocyANCmFnZ3JlZ2F0ZShzdWljaWRlMiRTdWljaWRlLkRlYXRoc35zdWljaWRlMiRSYWNlLm9yLkV0aG5pY2l0eSxGVU4gPSBtZWFuKQ0KYWdncmVnYXRlKHN1aWNpZGUyJFN1aWNpZGUuRGVhdGhzfnN1aWNpZGUyJFJhY2Uub3IuRXRobmljaXR5K3N1aWNpZGUyJFllYXIsRlVOID0gbWVhbikNCg0KI2JveCBwbG90DQpib3hwbG90KHN1aWNpZGUyJFN1aWNpZGUuRGVhdGhzfnN1aWNpZGUyJFJhY2Uub3IuRXRobmljaXR5LGNvbD1jKCJncmV5MjUiLCAiZ3JleTUwIiwgImdyZXk3NSIsICJncmV5MTAwIiksIHlsYWIgPSAiTlVNQkVSIE9GIFNVSUNJREUgREVBVEhTIiwgeGxhYiA9ICJSQUNFL0VUSE5JQ0lUWSIpDQoNCiNIaXN0b2dyYW0gdG8gZmluZCBhIGhpZ2ggbnVtYmVyIG9mIHN1aWNpZGVzDQpoaXN0KHN1aWNpZGUyJFN1aWNpZGUuRGVhdGhzLCB4bGFiID0gIk5VTUJFUiBPRiBTVUlDSURFIERFQVRIUyIsIHlsYWIgPSAiRlJFUVVFTkNZIikNCmBgYA0KQmFzZWQgb24gdGhlIG1lYW4gbnVtYmVyIG9mIHN1aWNpZGUgZGVhdGhzIHBlciByYWNlL2V0aG5pYyBncm91cCBhbmQgdGhlbiBzdWljaWRlcyBkZWF0aHMgcGVyIHJhY2UvZXRobmljIGdyb3VwIHBlciB5ZWFyIGl0IGFwcGVhcnMgYXMgdGhvdWdoIEhpc3BhbmljIHBlb3BsZSBoYXZlIGhpZ2hlciBudW1iZXJzIG9mIHN1aWNpZGUgZGVhdGhzLiBCYXNlZCBvbiB0aGUgYm94IHBsb3QsIGl0IGFwcGVhcnMgYXMgdGhvdWdoIEhpc3BhbmljcyBoYXZlIHRoZSBoaWdoZXN0IG51bWJlciBvZiBzdWljaWRlIGRlYXRocyBvbiBhdmVyYWdlLiBXaGl0ZSBhcHBlYXJzIHRvIGJlIHRoZSBzZWNvbmQgbGFyZ2VzdCwgd2l0aCBPdGhlciBhbmQgQmxhY2sgYmVpbmcgdmVyeSBsb3cuIFRoZSBoaXN0b2dyYW0gc2hvd3MgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHN1aWNpZGUgZGVhdGhzIGlzIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4gQmFzZWQgb24gdGhlIGxpbmUgcGxvdCBmb3IgdG90YWwgc3VpY2lkZSBkZWF0aHMsIHRvdGFsIHN1aWNpZGUgZGVhdGhzIGFyZSBpbmNyZWFzaW5nIGV2ZXJ5IHllYXIuIEJhc2VkIG9uIHRoZSBsaW5lIHBsb3QgZm9yIGF2ZXJhZ2Ugc3VpY2lkZSBkZWF0aHMsIHRoZSBhdmVyYWdlIHN1aWNpZGUgZGVhdGhzIHdlcmUgaW5jcmVhc2luZyBmcm9tIDIwMDMgdG8gMjAxMiBhbmQgdGhlbiBzdGFydGVkIGRlY3JlYXNpbmcuIA0KDQojIyMjIEFOT1ZBIFJlZ3Jlc3Npb24gKFN1aWNpZGUgRGF0YSBTZXQpDQoNCk51bGwgaHlwb3RoZXNpczogVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgbWVhbiBudW1iZXIgc3VpY2lkZSBkZWF0aHMgYmV0d2VlbiBkaWZmZXJlbnQgeWVhcnMgYW5kIHJhY2UvZXRobmljaXRpZXMuDQoNCkFsdGVybmF0aXZlIGh5cG90aGVzaXM6IFRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiB0aGUgbWVhbiBudW1iZXIgb2Ygc3VpY2lkZSBkZWF0aHMgYmV0d2VlbiBkaWZmZXJlbnQgeWVhcnMgYW5kIHJhY2UvZXRobmljaXRpZXMuDQoNCmBgYHtyfQ0KI0FOT1ZBIFRlc3RzDQpBTk9WQTEgPC0gYW92KHN1aWNpZGUzJGBzdWljaWRlMyRTdWljaWRlLkRlYXRoc2B+IGFzLmZhY3RvcihzdWljaWRlMyRgc3VpY2lkZTMkWWVhcmApICsgc3VpY2lkZTMkYHN1aWNpZGUzJFJhY2Uub3IuRXRobmljaXR5YCkNCnN1bW1hcnkoQU5PVkExKQ0KDQpBTk9WQTIgPC0gYW92KHN1aWNpZGUzJGBzdWljaWRlMyRTdWljaWRlLkRlYXRoc2B+IHN1aWNpZGUzJGBzdWljaWRlMyRSYWNlLm9yLkV0aG5pY2l0eWApDQpzdW1tYXJ5KEFOT1ZBMikNCg0KI0l0IGNvbXBhcmVzIHRoZSBtZWFucyBvZiBlYWNoIGdyb3VwIGFuZCBpZiBpdCBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudA0KVHVrZXlIU0QoQU5PVkEyKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBIaXNwYW5pY3MgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBzdWljaWRlIGRlYXRocyBvdXQgb2YgYWxsIG9mIHRoZSByYWNpYWwvZXRobmljIGdyb3Vwcy4gVGhlIEhpc3BhbmljIGdyb3VwIGhhZCBhIGhpZ2hlciBudW1iZXIgb2Ygb2Ygc3VpY2lkZSBkZWF0aHMgdGhhdCB3YXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aGUgQmxhY2ssIFdoaXRlIGFuZCBPdGhlciByYWNpYWwgZ3JvdXBzIGJhc2VkIG9uIHRoZSBwLXZhbHVlIG9mIGVmZmVjdGl2ZWx5IDAuIFRoZXJlIHdhcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFdoaXRlLCBCbGFjaywgYW5kIE90aGVyIHJhY2lhbCBncm91cHMgYmFzZWQgb24gdGhlIGFkanVzdGVkIFAtdmFsdWVzLiBUaGVyZSB3YXMgbm8gZWZmZWN0IG9mIHllYXIgb24gbWVhbiBudW1iZXIgb2Ygc3VpY2lkZSBkZWF0aHMgKHAgdmFsdWUgPSAxKQ0KDQoNCiMjIyBQYXJ0IDI6IFNoYXBpcm8gVGVzdCAoU3VpY2lkZSBEYXRhIFNldCkNCg0KTnVsbDogVGhlIGRhdGEgaXMgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4NCkFsdGVybmF0aXZlOiBUaGUgZGF0YSBpcyBub3QgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KYGBge3J9DQojRGVuc2l0eSBwbG90DQpnZ3Bsb3Qoc3VpY2lkZTMsIGFlcyh4PWBzdWljaWRlMyRTdWljaWRlLkRlYXRoc2ApKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh4ID0gIlN1aWNpZGUgRGVhdGhzIFBlciBZZWFyIiwNCiAgICAgIHkgPSAiRGVuc2l0eSIpDQojU2hhcGlybyB0ZXN0DQpzaGFwaXJvLnRlc3Qoc3VpY2lkZTMkYHN1aWNpZGUzJFN1aWNpZGUuRGVhdGhzYCkNCmBgYA0KDQpJbnRlcnByZXRhdGlvbjogQmFzZWQgb24gdGhlIHAtdmFsdWUgb2YgMC4wMDAwMDAwMDAwNDM4Niwgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZSBudW1iZXIgb2Ygc3VpY2lkZSBkZWF0aHMgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiANCg0KIyMjIFBhcnQgMzogRmlzaGVyJ3MgRiB0ZXN0IChTdWljaWRlIERhdGEgU2V0KQ0KDQpOdWxsOiBIaXNwYW5pYyBhbmQgTm9uLUhpc3BhbmljIHBlb3BsZSBoYXZlIHRoZSBzYW1lIHZhcmlhbmNlIHJlZ2FyZGluZyBzdWljaWRlIGRlYXRocw0KQWx0ZXJuYXRpdmU6IEhpc3BhbmljIGFuZCBOb24tSGlzcGFuaWMgcGVvcGxlIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHZhcmlhbmNlIHJlZ2FyZGluZyBzdWljaWRlIGRlYXRocw0KDQpgYGB7cn0NCg0KI0NyZWF0aW5nIHRoZSB4IGFuZCB5IGZvciB0aGUgRmlzaGVyJ3MgRiB0ZXN0IGFuZCBLb2xtb2dyb3YgYW5kIFNtaXJub3YgVGVzdA0KaGlzcGFuaWMgPC0gc3Vic2V0KHN1aWNpZGUzLHN1aWNpZGUzJGBzdWljaWRlMyRSYWNlLm9yLkV0aG5pY2l0eWA9PSAiSGlzcGFuaWMiKQ0Kbm9uaGlzcGFuaWMgPC0gc3Vic2V0KHN1aWNpZGUzLCBzdWljaWRlMyRgc3VpY2lkZTMkUmFjZS5vci5FdGhuaWNpdHlgID09ICJCbGFjayIgfCBzdWljaWRlMyRgc3VpY2lkZTMkUmFjZS5vci5FdGhuaWNpdHlgID09ICJXaGl0ZSIgfCBzdWljaWRlMyRgc3VpY2lkZTMkUmFjZS5vci5FdGhuaWNpdHlgID09ICJPdGhlciIpDQoNCiNGaXNoZXIgRiB0ZXN0DQp2YXIudGVzdChoaXNwYW5pYyRgc3VpY2lkZTMkU3VpY2lkZS5EZWF0aHNgLG5vbmhpc3BhbmljJGBzdWljaWRlMyRTdWljaWRlLkRlYXRoc2AsYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSkNCmBgYA0KDQpJbnRlcnByZXRhdGlvbjogSSByZS1jb2RlZCB0aGUgcmFjZS9ldGhuaWNpdHkgZ3JvdXBzIHRvIGJlIGVpdGhlciBoaXNwYW5pYyBvciBub24taGlzcGFuaWMgdG8gcHJlZm9ybSB0aGUgRmlzaGVyIEYgdGVzdC4gV2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCBoaXNwYW5pYyBhbmQgbm9uLWhpc3BhbmljIGdyb3VwcyBoYXZlIHRoZSBzYW1lIHZhcmlhbmNlIHJlZ2FyZGluZyBzdWljaWRlIGRlYXRocyBiYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiAwLjAwNTQ3Lg0KDQojIyMgUGFydCA0OiBLb2xtb2dyb3YgYW5kIFNtaXJub3YgVGVzdCAoU3VpY2lkZSBEYXRhIFNldCkNCg0KTnVsbDogSGlzcGFuaWMgYW5kIE5vbi1IaXNwYW5pYyBwZW9wbGUgaGF2ZSB0aGUgc2FtZSBkaXN0cmlidXRpb24gcmVnYXJkaW5nIHN1aWNpZGUgZGVhdGhzDQpBbHRlcm5hdGl2ZTogSGlzcGFuaWMgYW5kIE5vbi1IaXNwYW5pYyBwZW9wbGUgZG8gbm90IGhhdmUgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHJlZ2FyZGluZyBzdWljaWRlIGRlYXRocw0KDQpgYGB7cn0NCiNLb2xtb2dyb3YgYW5kIFNtaXJub3YgVGVzdA0Ka3MudGVzdChoaXNwYW5pYyRgc3VpY2lkZTMkU3VpY2lkZS5EZWF0aHNgLCBub25oaXNwYW5pYyRgc3VpY2lkZTMkU3VpY2lkZS5EZWF0aHNgLCBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBCYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiAwLjAwMDAwMDAxODY2LCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBIaXNwYW5pYyBhbmQgTm9uIEhpc3BhbmljIHBlb3BsZSBkbyBub3QgaGF2ZSB0aGUgc2FtZSBkaXN0cmlidXRpb24gcmVnYXJkaW5nIHN1aWNpZGUgZGVhdGhzLkJlY2F1c2UgdGhlIG51bWJlciBvZiBzdWljaWRlIGRlYXRocyBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCBiZWNhdXNlIHRoZXJlIGlzIGFuIHVuZXF1YWwgZGlzdHJpYnV0aW9uIG9mIHRoZSB2YXJpYW5jZSBiZXR3ZWVuIGhpc3BhbmljIGFuZCBub24taGlzcGFuaWMgZ3JvdXBzIGFuIEFOT1ZBIGlzIG5vdCBhbiBhcHByb3ByaWF0ZSB0ZXN0IGV2ZW4gdGhvdWdoIGl0IHdhcyBwcmVmb3JtZWQgYWJvdmUuIEEgbW9yZSBhcHByb3ByaWF0ZSB0ZXN0IHdvdWxkIGJlIGEgS3J1c3RhbC1XYWxsaXMgYmFzZWQgb24gdGhlc2UgZmFjdG9ycy4NCg0KDQojIyMgUGFydCA1OiBLcnVza2FsLVdhbGxpcyAoU3VpY2lkZSBEYXRhIFNldCkNCg0KTnVsbDogVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgbWVkaWFuIG51bWJlciBvZiBzdWljaWRlIGRlYXRocyBhY3Jvc3MgdGhlIDQgZXRobmljIGdyb3Vwcy4NCkFsdGVybmF0aXZlOiBUaGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIG1lZGlhbiBudW1iZXIgb2Ygc3VpY2lkZSBkZWF0aHMgYWNyb3NzIHRoZSA0IGV0aG5pYyBncm91cHMuDQoNCmBgYHtyfQ0KI0tydXNrYWwtV2FsbGlzIHRlc3QNCmtydXNrYWwudGVzdChzdWljaWRlMyRgc3VpY2lkZTMkU3VpY2lkZS5EZWF0aHNgfiBzdWljaWRlMyRgc3VpY2lkZTMkUmFjZS5vci5FdGhuaWNpdHlgKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBCYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiAwLjAwMDAwMDA1NDQ0LCB3ZSBjYW4gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiB0aGUgbWVkaWFuIG51bWJlciBvZiBzdWljaWRlIGRlYXRocyBhY3Jvc3MgdGhlIDQgZXRobmljIGdyb3Vwcy4gU2ltaWxhcmx5IHRvIHRoZSBBTk9WQSByZXN1bHRzLCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIHN1aWNpZGUgZGVhdGhzIGFtb25nIHRoZSA0IGV0aG5pYyBncm91cHMuDQoNCiMjIyBQYXJ0IDY6IENoaSBTcXVhcmUgYW5kIFBvc3Rob2MgdGVzdCAoU3VpY2lkZSBEYXRhIFNldCkNCg0KTnVsbDogVGhlIGZyZXF1ZW5jeSBvZiBhIGhpZ2ggbnVtYmVyIG9mIHN1aWNpZGUgZGVhdGhzICg+PTEwMDApIGlzIGVxdWFsIGFtb25nIHRoZSA0IGV0aG5pYyBncm91cHMuDQpBbHRlcm5hdGl2ZTogVGhlIGZyZXF1ZW5jeSBvZiBhIGhpZ2ggbnVtYmVyIG9mIHN1aWNpZGUgZGVhdGhzICg+PTEwMDApIGlzIG5vdCBlcXVhbCBhbW9uZyB0aGUgNCBldGhuaWMgZ3JvdXBzLg0KDQpgYGB7cn0NCiNDcmVhdGluZyBhIGNvbHVtbiBmb3IgaGlnaCBhbmQgbG93IG51bWJlciBvZiBzdWljaWRlIGRlYXRocw0Kc3VpY2lkZTMkU3VpY2lkZS5obCA8LSBpZmVsc2Uoc3VpY2lkZTMkYHN1aWNpZGUzJFN1aWNpZGUuRGVhdGhzYCA+PSAxMDAwLCAiaGlnaCIsICJsb3ciKQ0KDQojVGFibGUgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgeW91IHNlZSBoaWdoIGZyZXF1ZW5jeSBvciBsb3cgZnJlcXVlbmN5IGZvciB0aGUgNCBldGhuaWMgZ3JvdXBzLg0Kc3VpY2lkZS50YWIgPC0gdGFibGUoc3VpY2lkZTMkYHN1aWNpZGUzJFJhY2Uub3IuRXRobmljaXR5YCwgc3VpY2lkZTMkU3VpY2lkZS5obCkNCnN1aWNpZGUudGFiDQoNCiNDaGktU3F1YXJlDQpjaGlzcS50ZXN0KHN1aWNpZGUudGFiKQ0KDQojQ2hpLXNxdWFyZSBwb3N0IGhvYw0KY2hpc3EucG9zdGhvYy50ZXN0KHN1aWNpZGUudGFiKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBXZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBiYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiAyLjMxZS0wNy4gV2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2ggYW5kIGxvdyBmcmVxdWVuY2llcyBvZiBzdWljaWRlIGRlYXRocyBiZXR3ZWVuIHRoZSA0IGV0aG5pYyBncm91cHMuIFRoZSBvYnNlcnZlZCBzdWljaWRlIGZyZXF1ZW5jeSBmb3IgYmxhY2sgcGVvcGxlIHdhcyBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgdGhhbiB3aGF0IHdhcyBleHBlY3RlZCAocCA9IDAuMDcpLlRoZSBvYnNlcnZlZCBzdWljaWRlIGZyZXF1ZW5jeSBmb3IgcGVvcGxlIGNsYXNzaWZpZWQgYXMgb3RoZXIgd2FzIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuIHdoYXQgd2FzIGV4cGVjdGVkIChwID0gMC4wOSkuIFRoZSBvYnNlcnZlZCBzdWljaWRlIGZyZXF1ZW5jeSBmb3Igd2hpdGUgcGVvcGxlIHdhcyBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgdGhhbiB3aGF0IHdhcyBleHBlY3RlZCAocCA9IDEuMDApLiBJbiBjb250cmFzdCwgdGhlIG9ic2VydmVkIHN1aWNpZGUgZnJlcXVlbmN5IGZvciBoaXNwYW5pYyBwZW9wbGUgd2FzIHNpZ25pZmljYW50bHkgaGlnaGVyIHRoYW4gd2hhdCB3YXMgZXhwZWN0ZWQgKHAgPCAwLjAwKS4gSG93ZXZlciwgYmVjYXVzZSAzIG91dCBvZiA4IGNlbGxzIG9mIHRoZSB0YWJsZSBoYXZlIE4gPCA1LCBhIG1vcmUgYXBwcm9wcmlhdGUgdGVzdCB3b3VsZCBiZSB0aGUgRmlzaGVyIEV4YWN0IFRlc3QgYmVsb3cuDQoNCiMjIyBQYXJ0IDc6IEZpc2hlciBFeGFjdCBUZXN0IChTdWljaWRlIERhdGEgU2V0KQ0KDQpOdWxsOiBUaGUgZnJlcXVlbmN5IG9mIGEgaGlnaCBudW1iZXIgb2Ygc3VpY2lkZSBkZWF0aHMgKD49MTAwMCkgaXMgZXF1YWwgYW1vbmcgdGhlIDQgZXRobmljIGdyb3Vwcy4NCkFsdGVybmF0aXZlOiBUaGUgZnJlcXVlbmN5IG9mIGEgaGlnaCBudW1iZXIgb2Ygc3VpY2lkZSBkZWF0aHMgKD49MTAwMCkgaXMgbm90IGVxdWFsIGFtb25nIHRoZSA0IGV0aG5pYyBncm91cHMuDQoNCmBgYHtyfQ0KI0Zpc2hlciB0ZXN0DQpmaXNoZXIudGVzdChzdWljaWRlLnRhYikNCg0KI0Zpc2hlciBwb3N0LWhvYyB0ZXN0DQpmaXNoZXIubXVsdGNvbXAoc3VpY2lkZS50YWIscC5tZXRob2QgPSAiQkgiKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBCYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiA3LjYxM2UtMDgsIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBhbmQgY29uY2x1ZGUgdGhhdCB0aGUgZnJlcXVlbmN5IG9mIGEgaGlnaCBudW1iZXIgb2Ygc3VpY2lkZXMgaXMgbm90IGVxdWFsIGFtb25nIHRoZSA0IGV0aG5pYyBncm91cHMuIFRoZSBvYnNlcnZlZCBzdWljaWRlIGZyZXF1ZW5jeSBmb3IgYmxhY2sgcGVvcGxlIGNvbXBhcmVkIHRvIGhpc3BhbmljIHBlb3BsZSB3YXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgdGhhbiB3aGF0IHdhcyBleHBlY3RlZCAocCA9IDAuMDAwMDMxNTYpLlRoZSBvYnNlcnZlZCBzdWljaWRlIGZyZXF1ZW5jeSBmb3IgcGVvcGxlIGNsYXNzaWZpZWQgYXMgb3RoZXIgd2FzIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuIGZvciBwZW9wbGUgY2xhc3NpZmllZCBhcyBibGFjayAocCA9IDEuMDApLiBUaGUgb2JzZXJ2ZWQgc3VpY2lkZSBmcmVxdWVuY3kgZm9yIHdoaXRlIHBlb3BsZSB3YXMgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHRoYW4gd2hhdCB3YXMgZXhwZWN0ZWQgY29tcGFyZWQgdG8gb3RoZXIgZ3JvdXBzIGV4Y2VwdCB0aGUgaGlzcGFuaWMgZ3JvdXAgYmFzZWQgb24gdGhlIG9ic2VydmVkIHAtdmFsdWVzIChwID0gMS4wMCkuIEluIGNvbnRyYXN0LCB0aGUgb2JzZXJ2ZWQgc3VpY2lkZSBmcmVxdWVuY3kgZm9yIGhpc3BhbmljIHBlb3BsZSB3YXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB3aGF0IHdhcyBleHBlY3RlZCBmb3IgYWxsIG9mIHRoZSBncm91cHMgYmFzZWQgb24gdGhlIHAtdmFsdWVzIG9ic2VydmVkLiANCg0KIyMjIFBhcnQgODogUmVsYXRpdmUgUmlzayBhbmQgT2RkcyBSYXRpbyAoU3VpY2lkZSBEYXRhIFNldCkNCg0KDQpgYGB7cn0NCiNIaXNwYW5pYyB2ZXJzdXMgbm9uLUhpc3BhbmljIGNvbHVtbg0Kc3VpY2lkZTMkSGlzcGFuaWMgPC0gaWZlbHNlIChzdWljaWRlMyRgc3VpY2lkZTMkUmFjZS5vci5FdGhuaWNpdHlgID09ICJIaXNwYW5pYyIsICJIaXNwYW5pYyIsICJOb24tSGlzcGFuaWMiKQ0KDQojSGlzcGFuaWMgdmVydXMgbm9uLUhpc3BhbmljIHRhYmxlDQpoaXNwYW5pYy50YWIgPC0gdGFibGUoc3VpY2lkZTMkSGlzcGFuaWMsc3VpY2lkZTMkU3VpY2lkZS5obCkNCmhpc3BhbmljLnRhYg0KDQojVG8gZ2V0IHByb3BvcnRpb25zDQpwcm9wLnRhYmxlKGhpc3BhbmljLnRhYikNCg0KI1RvIHRlbGwgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIHByb3BvcnRpb25zDQpwcm9wLnRlc3QoaGlzcGFuaWMudGFiKQ0KDQojVG8gZ2V0IHRoZSByZWxhdGl2ZSByaXNrDQpwcm9wLnRhYmxlKGhpc3BhbmljLnRhYilbMSwxXS9wcm9wLnRhYmxlKGhpc3BhbmljLnRhYilbMiwxXQ0KDQojVG8gZ2V0IHRoZSBvZGRzIHJhdGlvDQoocHJvcC50YWJsZShoaXNwYW5pYy50YWIpWzEsMV0vcHJvcC50YWJsZShoaXNwYW5pYy50YWIpWzEsMl0pLyhwcm9wLnRhYmxlKGhpc3BhbmljLnRhYilbMiwxXS9wcm9wLnRhYmxlKGhpc3BhbmljLnRhYilbMiwyXSkNCmBgYA0KSW50ZXJwcmV0YXRpb246IFRoZXJlIGlzIG5vdCBhbiBlcXVhbCBwcm9wb3J0aW9uIG9mIGhpZ2ggZnJlcXVlbmN5IHN1aWNpZGUgZGVhdGhzIGJldHdlZW4gaGlzcGFuaWMgYW5kIG5vbi1oaXNwYW5pYyBldGhuaWMgZ3JvdXBzLiBUaGUgcmVsYXRpdmUgcmlzayBvZiBhIGhpZ2ggZnJlcXVlbmN5IG9mIHN1aWNpZGVzIGluIGEgZ2l2ZW4geWVhciBpcyAzMDAlIGhpZ2hlciBmb3IgaGlzcGFuaWNzIHRoYW4gbm9uLWhpc3BhbmljLiBUaGUgb2RkcyByYXRpbyBpcyBzYXlpbmcgdGhhdCB0aGUgb2RkcyBvZiBhIGhpZ2ggZnJlcXVlbmN5IHN1aWNpZGUgaW4gYSBnaXZlbiB5ZWFyIGF0dHJpYnV0ZWQgdG8gaGlzcGFuaWNzIGlzIDU0NjglIGhpZ2hlciB0aGFuIGl0IGlzIGZvciBub24taGlzcGFuaWNzLiANCg0KIyMjIFBhcnQgOTogTm9uLXBhcmFtZXRyaWMgTGluZWFyIENvcnJlbGF0aW9uIChTdWljaWRlIERhdGEgU2V0KQ0KDQpOdWxsOiBUaGVyZSBpcyBubyBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gc3VpY2lkZSBkZWF0aHMgYW5kIGFsY29ob2wgZGVhdGhzLg0KQWx0ZXJuYXRpdmU6IFRoZXJlIGlzIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN1aWNpZGUgZGVhdGhzIGFuZCBhbGNvaG9sIGRlYXRocy4NCg0KYGBge3J9DQojQ2hhbmdpbmcgY2hhciB0byBudW1lcmljDQpzdWljaWRlMiRBbGNvaG9sLlJlbGF0ZWQuRGVhdGhzID0gYXMubnVtZXJpYyhzdWljaWRlMiRBbGNvaG9sLlJlbGF0ZWQuRGVhdGhzKQ0KDQojTm9uLXBhcmFtZXRyaWMgTGluZWFyIENvcnJlbGF0aW9uIHRlc3QNCmNvci50ZXN0KHkgPSBzdWljaWRlMiRTdWljaWRlLkRlYXRocywgeCA9IHN1aWNpZGUyJEFsY29ob2wuUmVsYXRlZC5EZWF0aHMsIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQoNCiNNYWtpbmcgZ3JhcGgNCmdncGxvdChzdWljaWRlMiwgYWVzKHggPSBBbGNvaG9sLlJlbGF0ZWQuRGVhdGhzLCB5ID0gU3VpY2lkZS5EZWF0aHMpKSsNCmdlb21fcG9pbnQoc2hhcGU9MSkrDQpnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgDQogICAgICAgICAgICBzZSA9IEZBTFNFKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBXZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN1aWNpZGUgZGVhdGhzIGFuZCBhbGNvaG9sIGRlYXRocyBiYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiA8IDAuMDAwMDAwMDAwMDAwMDAwMjIuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc3VpY2lkZSBkZWF0aHMgYW5kIGFsY29ob2wgZGVhdGhzLiBBY2NvcmRpbmcgdG8gdGhlIFNwZWFybWFuJ3Mgcm93IChyaG8pLCBhcyBpdCBpcyBhYm92ZSBhIC43NSBpdCBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGEgc3Ryb25nIHBvc2l0aXZlIGxpbmVhciByZWxhdGlvbnNoaXAuIA0KDQojIyMgRGF0YSBTZXQNCg0KIyMjIFZhcmlhYmxlcw0KDQojIyMgQW5hbHlzaXMNCg0KIyMgUGFydCAyOiANCg0KIyMjIEludHJvIA0KDQojIyMgRGF0YSBTb3VyY2UNCg0KIyMjIERhdGEgU2V0DQoNCiMjIyBWYXJpYWJsZXMNCg0KIyMjIEFuYWx5c2lzDQoNCiMjIyMgU3VtbW1hcnkgU3RhdGlzdGljcw0KDQpgYGB7cn0NCnN1bW1hcnkoaW5jb21lKQ0KDQojIENyZWF0ZSBuZXcgY29sdW1uIGZvciBkZXByZXNzaW9uIHByZXZhbGVuY2UgYWRqdXN0ZWQgYnkgcG9wdWxhdGlvbiBzaXplDQppbmNvbWUkZGVwcmVzc2lvbl9wcm9wIDwtIGluY29tZSRwcmV2YWxlbmNlL2luY29tZSRwb3B1bGF0aW9uDQoNCiMgVGhpcyBvbmUgc2hvd3MgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHN0cm9uZ2x5IHNrZXdlZCByaWdodA0KZ2dwbG90KGluY29tZSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBwcmV2YWxlbmNlKSkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCBvZiBEZXByZXNzaW9uIENvdW50cyBwZXIgQ291bnRyeSBwZXIgWWVhciIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgV2hlbiBJIGFkanVzdCBieSBQb3B1bGF0aW9uIHNpemUsIHRoZSBkYXRhIGlzIGxlc3Mgc2tld2VkLCBhbmQgbG9va3MgbW9yZSBub3JtYWxseSBkaXN0cmlidXRlZC4gDQpnZ3Bsb3QoaW5jb21lKSArDQogIGdlb21fZGVuc2l0eShhZXMoeCA9IGRlcHJlc3Npb25fcHJvcCkpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3Qgb2YgRGVwcmVzc2lvbiBQcm9wb3J0aW9uIGFkanVzdGVkIGJ5IFBvcHVsYXRpb24iKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBEZW5zaXR5IEdyYXBoIGJ5IEluY29tZSBicmFja2V0LiANCiMgUG9zc2libGUgZGlzY3Vzc2lvbjogSSBub3RpY2UgdGhhdCBIaWdoIGluY29tZTogT0VDRCBjb3VudHJpZXMgDQpnZ3Bsb3QobmEub21pdCgoaW5jb21lKSkpICsNCiAgZ2VvbV9kZW5zaXR5KGFlcyh4ID0gZGVwcmVzc2lvbl9wcm9wLCBmaWxsID0gaW5jb21lKSwgYWxwaGEgPSAwLjUpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3Qgb2YgRGVwcmVzc2lvbiBQcm9wb3J0aW9uIGFkanVzdGVkIGJ5IFBvcHVsYXRpb24iKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBEZW5zaXR5IEdyYXBoIGJ5IFJlZ2lvbg0KZ2dwbG90KGluY29tZSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBkZXByZXNzaW9uX3Byb3AsIGZpbGwgPSByZWdpb24pLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCBvZiBEZXByZXNzaW9uIFByb3BvcnRpb24gYWRqdXN0ZWQgYnkgUG9wdWxhdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiR3JvdXBlZCBieSBSZWdpb24iKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCg0KI0xpbmVhciBSZWdyZXNzaW9uIHRlc3QNCm1vZDIgPC0gbG0oKGluY29tZSRkZXByZXNzaW9uX3Byb3ApIH4gKGluY29tZSRnZHBfcGVyY2FwKSkNCnN1bW1hcnkobW9kMikNCmBgYA0KDQpUaGlzIERlbnNpdHkgUGxvdCBvZiBEZXByZXNzaW9uIGNvdW50cyBwZXIgY291bnRyeSBwZXIgeWVhciBzaG93cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc3Ryb25nbHkgc2tld2VkIHJpZ2h0LiBXaGVuIEkgYWRqdXN0IGJ5IFBvcHVsYXRpb24gc2l6ZSwgdGhlIGRhdGEgaXMgbGVzcyBza2V3ZWQsIGFuZCBsb29rcyBtb3JlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGluIHRoZSBEZW5zaXR5IFBsb3Qgb2YgRGVwcmVzc2lvbiBQcm9wb3J0aW9uIGFkanVzdGVkIGJ5IFBvcHVsYXRpb24uIFRoZSBEZW5zaXR5IFBsb3Qgb2YgRGVwcmVzc2lvbiBQcm9wb3J0aW9uIGFkanVzdGVkIGJ5IFBvcHVsYXRpb24sIGxvb2tzIGF0IGRlcHJlc3Npb24gcHJldmFsZW5jZSBhZGp1c3RlZCBieSBwb3B1bGF0aW9uIGFuZCBncm91cGVkIGJ5IGluY29tZSBsZXZlbC4gQmFzZWQgb24gdGhpcyBncmFwaCwgSSBjYW4gc2VlIHRoYXQgaGlnaCBpbmNvbWUgY291bnRyaWVzIGhhdmUgaGlnaGVyIHBvcHVsYXRpb24gYWRqdXN0ZWQgZGVwcmVzc2lvbiBwcmV2YWxlbmNlIHRoYW4gdGhlIG90aGVyIGNhdGVnb3JpZXMuIFRoZSBEZW5zaXR5IFBsb3Qgb2YgRGVwcmVzc2lvbiBQcm9wb3J0aW9uIGFkanVzdGVkIGJ5IFBvcHVsYXRpb24gYnkgcmVnaW9uIGhhcyBOb3J0aCBBbWVyaWNhIHdpdGggdGhlIGhpZ2hlc3QgZGVwcmVzc2lvbiBwcmV2YWxlbmNlLiAgDQoNCiMjIyMgUGFydCAxMDogTGluZWFyIFJlZ3Jlc3NzaW9uIChEZXByZXNzaW9uIEluY29tZSBEYXRhIFNldCkNCg0KTnVsbDogVGhlcmUgaXMgbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gIEdEUCBwZXIgY2FwaXRhIGFuZCBhZ2UgYWRqdXN0ZWQgZGVwcmVzc2lvbiBwcmV2YWxlbmNlDQpBbHRlcm5hdGl2ZTogVGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgR0RQIHBlciBjYXBpdGEgYW5kIGFnZSBhZGp1c3RlZCBkZXByZXNzaW9uIHByZXZhbGVuY2UNCg0KYGBge3J9DQojTGluZWFyIFJlZ3Jlc3Npb24gdGVzdA0KbW9kMiA8LSBsbSgoaW5jb21lJGRlcHJlc3Npb25fcHJvcCkgfiAoaW5jb21lJGdkcF9wZXJjYXApKQ0Kc3VtbWFyeShtb2QyKQ0KYGBgDQpCYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiA8IDIuMmUtMTYsIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gV2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBHRFAgcGVyIGNhcGl0YSBhbmQgYWdlIGFkanVzdGVkIGRlcHJlc3Npb24gcHJldmFsZW5jZSBiYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiBwLXZhbHVlIG9mIDwgMi4yZS0xNi4gQmFzZWQgb24gdGhlIGFkanVzdGVkIHItc3F1YXJlZCwgdGhhdCBpcyBlZmZlY3RpdmVseSAwLjIyMzksIEdEUCBwZXIgY2FwaXRhIGV4cGxhaW5zIDIyLjM5ICUgb2YgdGhlIHZhcmlhbmNlIGluIGRlcHJlc3Npb24gcHJldmFsZW5jZS4NCg0KIyMjIyBQYXJ0IDExOiBTaGFwaXJvIFRlc3QgKERlcHJlc3Npb24gSW5jb21lIERhdGEgU2V0KQ0KDQpOdWxsOiBUaGUgcmVzaWR1YWxzIGZyb20gb3VyIGxpbmVhciBtb2RlbCBvZiBHRFAgcGVyIENhcGl0YSBvbiBEZXByZXNzaW9uIFByb3BvcnRpb24gaXMgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4gQWx0ZXJuYXRpdmU6IFRoZSAgcmVzaWR1YWxzIGZyb20gb3VyIGxpbmVhciBtb2RlbCBvZiBHRFAgcGVyIENhcGl0YSBvbiBEZXByZXNzaW9uIFByb3BvcnRpb24gaXMgbm90IGFwcHJveGltYXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCmBgYHtyfQ0KI1Jlc2lkdWFscyBvZiBwcmV2YWxlbmNlIGFuZCBnZHBfcGVyY2FwDQpzaGFwaXJvLnRlc3QocmVzaWQobW9kMikpDQpoaXN0KHJlc2lkKG1vZDIpKQ0KDQojUHJldmFsZW5jZSBncmFwaA0KaGlzdChpbmNvbWUkZGVwcmVzc2lvbl9wcm9wKQ0KDQojUS1RIHBsb3QNCnFxbm9ybShpbmNvbWUkZGVwcmVzc2lvbl9wcm9wKQ0KcXFsaW5lKGluY29tZSRkZXByZXNzaW9uX3Byb3AsIGNvbCA9ICJyZWQiKQ0KYGBgDQpCYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiA8IDIuMmUtMTYsIGFuZCBhIHNpZ25pZmljYW5jZSBsZXZlbCBhbHBoYSA9IDAuNSwgd2Ugd291bGQgcmVqZWN0IG91ciBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBvdXIgbW9kZWwgZG9lcyBub3QgY2FwdHVyZSBhbGwgdGhlIHZhcmlhbmNlIGluIHRoZSBkZXByZXNzaW9uIHByZXZhbGVuY2UgcHJvcG9ydGlvbi4gQmVjYXVzZSBvZiB0aGlzIGEgS3J1c2thbCBXYWxsaXMgaXMgbW9yZSBhcHByb3ByaWF0ZSB0aGFuIGFuIEFOT1ZBIHRlc3QuDQoNCiMjIyMgUGFydCAxMjogS3J1c2thbCBXYWxsaXMgKERlcHJlc3Npb24gSW5jb21lIERhdGEgU2V0KQ0KDQpOdWxsOiBUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZSBtZWRpYW4gZGVwcmVzc2lvbiBwcmV2YWxlbmNlIGJ5IHBvcHVsYXRpb24gYWNyb3NzIHRoZSBpbmNvbWUgY2F0ZWdvcmllcy4NCkFsdGVybmF0aXZlOiBUaGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIG1lZGlhbiBkZXByZXNzaW9uIHByZXZhbGVuY2UgYnkgcG9wdWxhdGlvbiBhY3Jvc3MgdGhlIGluY29tZSBjYXRlZ29yaWVzLg0KDQpgYGB7cn0NCiNLcnVzdGFsLVdhbGxpcw0Ka3J1c2thbC50ZXN0KGluY29tZSRkZXByZXNzaW9uX3Byb3AgfiBpbmNvbWUkaW5jb21lKQ0KI2JveCBwbG90DQpib3hwbG90KGluY29tZSRkZXByZXNzaW9uX3Byb3AgfiBpbmNvbWUkaW5jb21lLCB4bGFiID0gIkNPVU5UUlkgSU5DT01FIENBVEVHT1JZIiwgeWxhYiA9ICJQT1BVTEFUSU9OIEFESlVTVEVEIERFUFJFU1NTSU9OIFBSRVZBTEVOQ0UiKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOiBCYXNlZCBvbiB0aGUgcCB2YWx1ZSBvZiAgPCAwLjAwMDAwMDAwMDAwMDAwMDIyLCB3ZSBjYW4gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgYW5kIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIHRoZSBtZWRpYW4gZGVwcmVzc2lvbiBwcmV2YWxlbmNlIGFkanVzdGVkIGJ5IHBvcHVsYXRpb24gYWNyb3NzIHRoZSBpbmNvbWUgY2F0ZWdvcmllcy4gVGhlIGJveCBwbG90IHNob3dzIHRoYXQgbG93IGluY29tZSBjb3VudHJpZXMgaGF2ZSB0aGUgbG93ZXN0IGRlcHJlc3Npb24gcHJldmFsZW5jZSBhZGp1c3RlZCBieSBwb3B1bGF0aW9uLCBidXQgaGlnaCBpbmNvbWUgT0VDRCBjb3VudHJpZXMgKGV4YW1wbGVzOiBVU0EsIFVLLCBDQU5BREEpIGhhdmUgdGhlIGhpZ2hlc3QgZGVwcmVzc2lvbiBwcmV2YWxlbmNlIGFkanVzdGVkIGJ5IHBvcHVsYXRpb24uIA0KDQoNCiMjIyMgUGFydCAxMzogTXVsdGlwbGUgTG9naXN0aWMgUmVncmVzc2lvbiAoRGVwcmVzc2lvbiBJbmNvbWUgRGF0YSBTZXQpDQoNCk51bGw6IFRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gbmVvLW5hdGFsIG1vcnRhbGl0eSwgZ2RwIHBlciBjYXBpdGEsIG9yIHllYXIgaW4gdGhlIGFiaWxpdHkgdG8gcHJlZGljdCBhIHBvcGx1YXRpb24gYWRqdXN0ZWQgZGVwcmVzc2lvbiBwcmV2YWxlbmNlIGFib3ZlIHRoZSBtZWRpYW4gb2YgMC4wMjk0NTA5OS4NCkFsdGVybmF0aXZlOiBUaGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gbmVvLW5hdGFsIG1vcnRhbGl0eSwgZ2RwIHBlciBjYXBpdGEsIG9yIHllYXIgaW4gdGhlIGFiaWxpdHkgdG8gcHJlZGljdCBhIHBvcHVsYXRpb24gYWRqdXN0ZWQgZGVwcmVzc2lvbiBwcmV2YWxlbmNlIGFib3ZlIHRoZSBtZWRpYW4gb2YgMC4wMjk0NTA5OS4NCg0KYGBge3J9DQojRmluZGluZyB0aGUgbWVkaWFuDQptZWRpYW4oaW5jb21lJGRlcHJlc3Npb25fcHJvcCwgbmEucm0gPSBUUlVFKQ0KDQojTWFraW5nIGEgbmV3IGNvbHVtbg0KaW5jb21lJHByZXZhbDAxIDwtIGlmZWxzZSAoaW5jb21lJGRlcHJlc3Npb25fcHJvcCA+IG1lZGlhbihpbmNvbWUkZGVwcmVzc2lvbl9wcm9wLCBuYS5ybSA9IFRSVUUpLCAxLCAwKQ0KDQojTXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbg0KbW9kMyA8LSBnbG0oaW5jb21lJHByZXZhbDAxIH4gaW5jb21lJHllYXIgKyBpbmNvbWUkZ2RwX3BlcmNhcCArIGluY29tZSRuZW9uYXRfbW9ydGFsX3JhdGUsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobW9kMykNCg0KYm94cGxvdChpbmNvbWUkZ2RwX3BlcmNhcCB+IGluY29tZSRwcmV2YWwwMSwgeGxhYiA9ICJERVBSRVNTSU9OIFBSRVZBTEVOQ0UgQUJPVkUgTUVESUFOIiwgeWxhYiA9ICJHRFAgUEVSIENBUElUQSIpDQpib3hwbG90KGluY29tZSRuZW9uYXRfbW9ydGFsX3JhdGUgfiBpbmNvbWUkcHJldmFsMDEsIHhsYWIgPSAiREVQUkVTU0lPTiBQUkVWQUxFTkNFIEFCT1ZFIE1FRElBTiIsIHlsYWIgPSAiTkVPTkFUQUwgTU9SVEFMSVRZIikNCnBsb3QoaW5jb21lJGRlcHJlc3Npb25fcHJvcCB+IGluY29tZSR5ZWFyLCB4bGFiID0gIllFQVIiLCB5bGFiID0gIkRFUFJFU1NJT04gUFJFVkFMRU5DRSBTQ09SRSIpDQphYmxpbmUobG0oaW5jb21lJGRlcHJlc3Npb25fcHJvcCB+IGluY29tZSR5ZWFyKSwgY29sID0gInJlZCIpDQpgYGANCkludGVycHJldGF0aW9uOiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiBpbmNyZWFzaW5nIHllYXJzIG9uIHBvcHVsYXRpb24gYWRqdXN0ZWQgZGVwcmVzc2lvbiBwcmV2YWxlbmNlIGJhc2VkIG9uIHRoZSBwLXZhbHVlIG9mIDAuMDAwMTgyLiBUaGUgcmVkIHRyZW5kIGxpbmUgb24gdGhlIHNjYXR0ZXJwbG90IGluZGljYXRlcyBhIHZlcnkgc2xpZ2h0IGluY3JlYXNlIGluIHBvcHVsYXRpb24gYWRqdXN0ZWQgZGVwcmVzc2lvbiBwcmV2YWxlbmNlIHdpdGggaW5jcmVhc2luZyB5ZWFyLiBGb3IgR0RQIHBlciBjYXBpdGEgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gcG9wdWxhdGlvbiBhZGp1c3RlZCBkZXByZXNzaW9uIHByZXZhbGVuY2UgYmFzZWQgb24gdGhlIHAtdmFsdWVzIG9mIDwgMmUtMTY7IHRoaXMgaXMgc3VwcG9ydGVkIGJ5IHRoZSBib3ggcGxvdC4gVGhlcmUgaXMgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgZGVjcmVhc2luZyBuZW9uYXRhbCBtb3J0YWxpdHkgcmF0ZXMgb24gcG9wbHVhdGlvbiBhZGp1c3RlZCBkZXByZXNzaW9uIHByZXZhbGVuY2UgYmFzZWQgb24gdGhlIHAtdmFsdWVzIG9mIDAuMDAwMjI1IGFuZCB0aGlzIGlzIGFsc28gZXZpZGVuY2VkIGJ5IHRoZSBib3ggcGxvdC4gDQoNCiMjIFBhcnQgMzogQ2xvc2luZyBUaG91Z2h0cw0KDQojIyMgVGhvdWdodHMgb24gdGhlIEFuYWx5dGljIFByb2Nlc3MNCg0KIyMjIEJpYmxpb2dyYXBoeQ0KDQoNCg==