The dataset I am using to conduct my research is from data.gov, the United States Government’s open data site. The dataset is Alleghany County employee salaries from 2022 and includes annual salary, regular pay, incentive pay, and gross pay for employees under the County Executive. It also includes employees’ department, job title, gender, ethnicity, and pay status. My hypotheses are as follows:

Null Hypothesis: There is no significant difference in the likelihood of being terminated between individuals identifying as racial or gender minorities and those identifying as White or male.

Alternative Hypothesis: There is a significant difference in the likelihood of being terminated between individuals identifying as racial or gender minorities and those identifying as White or male.

rm(list=ls()) 

library(dplyr)
library(ggplot2)

salary <- read.csv("~/Desktop/redacted-2022-december-31-wprdc.csv")
head(salary) 
str(salary) 
'data.frame':   6280 obs. of  18 variables:
 $ FIRST_NAME      : chr  "CATHERINE" "KEVIN J" "JOY M" "ELIZABETH S" ...
 $ LAST_NAME       : chr  "ABALO" "ABBOTT" "ABBOTT" "ABRAHAM" ...
 $ Combo.Name      : chr  "ABALO, CATHERINE" "ABBOTT, KEVIN J" "ABBOTT, JOY M" "ABRAHAM, ELIZABETH S" ...
 $ DEPARTMENT      : chr  "Kane Regional Centers" "Emergency Management" "Kane Regional Centers" "Parks" ...
 $ JOB_TITLE       : chr  "NURSING ASSISTANT" "FIRE INSTRUCTOR - PART TIME" "COOK" "SEASONAL AIDE" ...
 $ ELECTED_OFFICIAL: int  0 0 0 0 0 0 0 0 0 0 ...
 $ DATE_STARTED    : chr  "4/8/2010" "6/11/2018" "2/14/1999" "5/26/2022" ...
 $ SEX             : chr  "F" "M" "F" "F" ...
 $ ETHNICITY       : chr  "Black" "White (Not of Hispanic Origin)" "White (Not of Hispanic Origin)" "White (Not of Hispanic Origin)" ...
 $ ORIG_START      : chr  "7/6/2009" "6/11/2018" "2/2/1998" "5/26/2022" ...
 $ DATE_TERM       : chr  "" "" "" "9/5/2022" ...
 $ PAY_STATUS      : chr  "Active" "Active" "Active" "Terminated" ...
 $ ANNUAL_SALARY   : chr  " 41,581.07 " " 30,576.00 " " 40,761.76 " " 39,936.00 " ...
 $ REGULAR_PAY     : chr  " 40,740.50 " " 378.00 " " 44,015.85 " " 6,488.00 " ...
 $ OVERTIME_PAY    : chr  " 23,416.98 " " -   " " 1,923.77 " " -   " ...
 $ INCENTIVE_PAY   : chr  " 125.00 " " -   " " 225.00 " " 100.00 " ...
 $ GROSS_PAY       : chr  " 64,282.48 " " 378.00 " " 46,164.62 " " 6,588.00 " ...
 $ X               : chr  "" "" "" "" ...
dim(salary) 
[1] 6280   18
summary(salary) 
  FIRST_NAME         LAST_NAME          Combo.Name         DEPARTMENT         JOB_TITLE        
 Length:6280        Length:6280        Length:6280        Length:6280        Length:6280       
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
 ELECTED_OFFICIAL    DATE_STARTED           SEX             ETHNICITY          ORIG_START       
 Min.   :0.0000000   Length:6280        Length:6280        Length:6280        Length:6280       
 1st Qu.:0.0000000   Class :character   Class :character   Class :character   Class :character  
 Median :0.0000000   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 Mean   :0.0009554                                                                              
 3rd Qu.:0.0000000                                                                              
 Max.   :1.0000000                                                                              
  DATE_TERM          PAY_STATUS        ANNUAL_SALARY      REGULAR_PAY        OVERTIME_PAY      
 Length:6280        Length:6280        Length:6280        Length:6280        Length:6280       
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
 INCENTIVE_PAY       GROSS_PAY              X            
 Length:6280        Length:6280        Length:6280       
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
                                                         
                                                         
                                                         

Dropping unnecessary columns. dropping personal information for privacy reasons!

salary <- salary %>% select(-1,-2,-3,-6)

Visuals

ggplot(data = salary, aes(x = ETHNICITY, y = ANNUAL_SALARY, fill = ETHNICITY)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(y = "Annual Salary",
       title = "Annual Salary by Ethnicity")


#y axis is mess because annual salary is characters not numeric

#since my y-axis had too big of numbers, I am going to try and use the log of annual salary

class(salary$ANNUAL_SALARY)
[1] "character"
#character

salary$ANNUAL_SALARY <- as.numeric(gsub("\\$|,", "", salary$ANNUAL_SALARY))
#changing to numeric

salary$salary_log <- log(salary$ANNUAL_SALARY)
#using fixed numerical salary 
#ggplot(data = salary, aes(x = ETHNICITY, y = ANNUAL_SALARY, fill = ETHNICITY)) +
  #geom_bar(stat = "identity", position = "dodge") +
  #labs(y = "Annual Salary",
       #title = "Annual Salary by Ethnicity")

#originally used bar chart but switched to gem_col and grouped by ethnicity and found the average salary

avg_salary <- salary %>%
  group_by(ETHNICITY) %>%
  summarise(avg_salary = mean(ANNUAL_SALARY, na.rm = TRUE))


ggplot(avg_salary, aes(x = ETHNICITY, y = avg_salary, fill = ETHNICITY)) +
  geom_col() +
  labs(y = "Average Annual Salary",
       title = "Average Annual Salary by Ethnicity")

Bar graph for gender

#ggplot(data = salary, aes(x = SEX, y = ANNUAL_SALARY, fill = SEX)) +
  #geom_bar(stat = "identity", position = "dodge") +
  #labs(y = "Annual Salary",
       #title = "Annual Salary by Sex")

#originally used bar chart but switched to gem_col and grouped by sex and found the average salary

avg_salary_sex <- salary %>%
  group_by(SEX) %>%
  summarise(avg_salary = mean(ANNUAL_SALARY, na.rm = TRUE))

ggplot(avg_salary_sex, aes(x = SEX, y = avg_salary, fill = SEX)) +
  geom_col() +
  labs(y = "Average Annual Salary",
       title = "Average Annual Salary by Sex")

Exploring other visuals with active pay (experimentation)

library(ggplot2)

summary_data <- salary %>%
  group_by(ETHNICITY, PAY_STATUS) %>%
  summarise(count = n())
`summarise()` has grouped output by 'ETHNICITY'. You can override using the `.groups` argument.
ggplot(data = summary_data, aes(x = "", y = count, fill = PAY_STATUS)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  facet_wrap(~ ETHNICITY) +  #separate pie charts 
  labs(title = "Distribution of Active Pay Status by Ethnicity") +
  theme_void()



#the White category appears as a full pie chart while the other categories appear as small slivers, it is probably because the White category has significantly more observations compared to the other categories. This imbalance in the distribution of observations can lead to differences in the appearance of the pie chart slices.

Density plot for pay status


#scientific notation
  options(scipen = 999)



ggplot(salary, aes(x = ANNUAL_SALARY, fill = PAY_STATUS)) +
  geom_density(alpha = 0.5) +
  labs(x = "Annual Salary", y = "Density", fill = "Active Pay Status") +
  scale_fill_manual(values = c("Active" = "blue", "Terminated" = "red")) +
  theme_minimal()

Changing gender and race and pay status into binary

#race
salary$ETHNICITY[salary$ETHNICITY== "White (Not of Hispanic Origin)"] <- 0
salary$ETHNICITY[salary$ETHNICITY== "Black"] <- 1
salary$ETHNICITY[salary$ETHNICITY== "American Indian/Alaskan Native"] <- 1
salary$ETHNICITY[salary$ETHNICITY== "Hispanic"] <- 1
salary$ETHNICITY[salary$ETHNICITY== "Asian or Pacific Islander"] <- 1
salary$ETHNICITY[salary$ETHNICITY== "Two or More Races"] <- 1

#gender
salary$SEX[salary$SEX== "M"] <- 0
salary$SEX[salary$SEX== "F"] <- 1

#pay status
salary$PAY_STATUS[salary$PAY_STATUS == "Active"] <- 0
salary$PAY_STATUS[salary$PAY_STATUS == "Terminated"] <- 1

SPLIT DATA– TRAINING AND TEST

# Set seed for reproducibility
set.seed(42)

# Split data into training and testing sets
split <- 0.75
rows  <- nrow(salary)

train.entries <- sample(rows, rows*split) # We have already set split as 0.75

model.train <- salary[train.entries, ]
model.valid  <- salary[-train.entries,  ]

Regression


model.train$PAY_STATUS <- as.numeric(model.train$PAY_STATUS)
model.valid$PAY_STATUS <- as.numeric(model.valid$PAY_STATUS)


model.train$SEX <- factor(model.train$SEX)
model.train$ETHNICITY <- factor(model.train$ETHNICITY)

model.valid$SEX <- factor(model.valid$SEX)
model.valid$ETHNICITY <- factor(model.valid$ETHNICITY)


model <- glm(PAY_STATUS ~ SEX + ETHNICITY + ANNUAL_SALARY, data = model.train, family = binomial)


summary(model)

Call:
glm(formula = PAY_STATUS ~ SEX + ETHNICITY + ANNUAL_SALARY, family = binomial, 
    data = model.train)

Coefficients:
                  Estimate   Std. Error z value             Pr(>|z|)    
(Intercept)    0.406737941  0.130549863   3.116              0.00184 ** 
SEX1           0.118293921  0.076221464   1.552              0.12067    
ETHNICITY1    -0.189988072  0.098528610  -1.928              0.05382 .  
ANNUAL_SALARY -0.000035030  0.000002355 -14.876 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 4752.3  on 4709  degrees of freedom
Residual deviance: 4448.1  on 4706  degrees of freedom
AIC: 4456.1

Number of Fisher Scoring iterations: 5
str(model.valid$SEX)
 Factor w/ 2 levels "0","1": 2 2 2 1 2 2 2 2 2 1 ...
#factor
str(model.valid$ETHNICITY)
 Factor w/ 2 levels "0","1": 2 2 1 1 1 1 1 2 1 1 ...
#factor

#making predictions
probabilities <- predict(model, newdata = model.valid, type = "response")

CONFUSION MATRIX

predicted <- ifelse(probabilities < 0.5, 1, 0)
conf_matrix <- table(predicted, model.valid$PAY_STATUS)
conf_matrix
         
predicted    0    1
        0    1    6
        1 1262  301
#predicted 


# 1- terminated
# under predicted 0 1 -- 0 (-) 1 (+) 

That’s how we can interpret a Confusion Matrix:

         Actual
         +   -  

Predicted + TP FP - FN TN

TP (True Positive): survived TN (True Negative): not survived FP (False Positive): predicted as survived but didn’t actually survive FN (False Negative): predicted as not survived but did actually survive

The Confusion Matrix can be used to calculate the accuracy of the model:

# Calculate accuracy
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
accuracy
[1] 0.1923567
#.1923567

20% accuracy

I used a confusion matrix to gauge the efficacy of my model. Initially, my model accurately predicted the termination of 301 individuals, aligning with the actual outcomes. Similarly, it correctly anticipated the continued employment of one individual, aligning with the actual outcomes again. However, the discrepancy arises in the false positives and negatives: my model projected 1,262 workers to be terminated when they were still active and misjudged six active workers as terminated. Consequently, the model’s accuracy is 20%, indicating its inadequacy. This limitation may come from the limited variables utilized, necessitating a more comprehensive dataset encompassing factors like seniority, industry affiliations, and the potential influence of COVID-19 and the pandemic. Despite leveraging the available data to the best of my ability, the results underscore the imperative for additional information to conduct a thorough and precise analysis.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKVGhlIGRhdGFzZXQgSSBhbSB1c2luZyB0byBjb25kdWN0IG15IHJlc2VhcmNoIGlzIGZyb20gZGF0YS5nb3YsIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnTigJlzIG9wZW4gZGF0YSBzaXRlLiBUaGUgZGF0YXNldCBpcyBBbGxlZ2hhbnkgQ291bnR5IGVtcGxveWVlIHNhbGFyaWVzIGZyb20gMjAyMiBhbmQgaW5jbHVkZXMgYW5udWFsIHNhbGFyeSwgcmVndWxhciBwYXksIGluY2VudGl2ZSBwYXksIGFuZCBncm9zcyBwYXkgZm9yIGVtcGxveWVlcyB1bmRlciB0aGUgQ291bnR5IEV4ZWN1dGl2ZS4gSXQgYWxzbyBpbmNsdWRlcyBlbXBsb3llZXMnIGRlcGFydG1lbnQsIGpvYiB0aXRsZSwgZ2VuZGVyLCBldGhuaWNpdHksIGFuZCBwYXkgc3RhdHVzLiBNeSBoeXBvdGhlc2VzIGFyZSBhcyBmb2xsb3dzOgoKTnVsbCBIeXBvdGhlc2lzOiAgVGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgbGlrZWxpaG9vZCBvZiBiZWluZyB0ZXJtaW5hdGVkIGJldHdlZW4gaW5kaXZpZHVhbHMgaWRlbnRpZnlpbmcgYXMgcmFjaWFsIG9yIGdlbmRlciBtaW5vcml0aWVzIGFuZCB0aG9zZSBpZGVudGlmeWluZyBhcyBXaGl0ZSBvciBtYWxlLgoKQWx0ZXJuYXRpdmUgSHlwb3RoZXNpczogIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgbGlrZWxpaG9vZCBvZiBiZWluZyB0ZXJtaW5hdGVkIGJldHdlZW4gaW5kaXZpZHVhbHMgaWRlbnRpZnlpbmcgYXMgcmFjaWFsIG9yIGdlbmRlciBtaW5vcml0aWVzIGFuZCB0aG9zZSBpZGVudGlmeWluZyBhcyBXaGl0ZSBvciBtYWxlLgpgYGB7cn0Kcm0obGlzdD1scygpKSAKCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKCnNhbGFyeSA8LSByZWFkLmNzdigifi9EZXNrdG9wL3JlZGFjdGVkLTIwMjItZGVjZW1iZXItMzEtd3ByZGMuY3N2IikKCmBgYAoKYGBge3J9CmhlYWQoc2FsYXJ5KSAKc3RyKHNhbGFyeSkgCmRpbShzYWxhcnkpIApzdW1tYXJ5KHNhbGFyeSkgCmBgYAoKRHJvcHBpbmcgdW5uZWNlc3NhcnkgY29sdW1ucy4gZHJvcHBpbmcgcGVyc29uYWwgaW5mb3JtYXRpb24gZm9yIHByaXZhY3kgcmVhc29ucyEKYGBge3J9CnNhbGFyeSA8LSBzYWxhcnkgJT4lIHNlbGVjdCgtMSwtMiwtMywtNikKYGBgCgoKVmlzdWFscwpgYGB7cn0KZ2dwbG90KGRhdGEgPSBzYWxhcnksIGFlcyh4ID0gRVRITklDSVRZLCB5ID0gQU5OVUFMX1NBTEFSWSwgZmlsbCA9IEVUSE5JQ0lUWSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh5ID0gIkFubnVhbCBTYWxhcnkiLAogICAgICAgdGl0bGUgPSAiQW5udWFsIFNhbGFyeSBieSBFdGhuaWNpdHkiKQoKI3kgYXhpcyBpcyBtZXNzIGJlY2F1c2UgYW5udWFsIHNhbGFyeSBpcyBjaGFyYWN0ZXJzIG5vdCBudW1lcmljCmBgYApgYGB7cn0KCiNzaW5jZSBteSB5LWF4aXMgaGFkIHRvbyBiaWcgb2YgbnVtYmVycywgSSBhbSBnb2luZyB0byB0cnkgYW5kIHVzZSB0aGUgbG9nIG9mIGFubnVhbCBzYWxhcnkKCmNsYXNzKHNhbGFyeSRBTk5VQUxfU0FMQVJZKQojY2hhcmFjdGVyCgpzYWxhcnkkQU5OVUFMX1NBTEFSWSA8LSBhcy5udW1lcmljKGdzdWIoIlxcJHwsIiwgIiIsIHNhbGFyeSRBTk5VQUxfU0FMQVJZKSkKI2NoYW5naW5nIHRvIG51bWVyaWMKCnNhbGFyeSRzYWxhcnlfbG9nIDwtIGxvZyhzYWxhcnkkQU5OVUFMX1NBTEFSWSkKYGBgCgoKCmBgYHtyfQojdXNpbmcgZml4ZWQgbnVtZXJpY2FsIHNhbGFyeSAKI2dncGxvdChkYXRhID0gc2FsYXJ5LCBhZXMoeCA9IEVUSE5JQ0lUWSwgeSA9IEFOTlVBTF9TQUxBUlksIGZpbGwgPSBFVEhOSUNJVFkpKSArCiAgI2dlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAjbGFicyh5ID0gIkFubnVhbCBTYWxhcnkiLAogICAgICAgI3RpdGxlID0gIkFubnVhbCBTYWxhcnkgYnkgRXRobmljaXR5IikKCiNvcmlnaW5hbGx5IHVzZWQgYmFyIGNoYXJ0IGJ1dCBzd2l0Y2hlZCB0byBnZW1fY29sIGFuZCBncm91cGVkIGJ5IGV0aG5pY2l0eSBhbmQgZm91bmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5Cgphdmdfc2FsYXJ5IDwtIHNhbGFyeSAlPiUKICBncm91cF9ieShFVEhOSUNJVFkpICU+JQogIHN1bW1hcmlzZShhdmdfc2FsYXJ5ID0gbWVhbihBTk5VQUxfU0FMQVJZLCBuYS5ybSA9IFRSVUUpKQoKCmdncGxvdChhdmdfc2FsYXJ5LCBhZXMoeCA9IEVUSE5JQ0lUWSwgeSA9IGF2Z19zYWxhcnksIGZpbGwgPSBFVEhOSUNJVFkpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicyh5ID0gIkF2ZXJhZ2UgQW5udWFsIFNhbGFyeSIsCiAgICAgICB0aXRsZSA9ICJBdmVyYWdlIEFubnVhbCBTYWxhcnkgYnkgRXRobmljaXR5IikKCmBgYAoKQmFyIGdyYXBoIGZvciBnZW5kZXIKYGBge3J9CiNnZ3Bsb3QoZGF0YSA9IHNhbGFyeSwgYWVzKHggPSBTRVgsIHkgPSBBTk5VQUxfU0FMQVJZLCBmaWxsID0gU0VYKSkgKwogICNnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgI2xhYnMoeSA9ICJBbm51YWwgU2FsYXJ5IiwKICAgICAgICN0aXRsZSA9ICJBbm51YWwgU2FsYXJ5IGJ5IFNleCIpCgojb3JpZ2luYWxseSB1c2VkIGJhciBjaGFydCBidXQgc3dpdGNoZWQgdG8gZ2VtX2NvbCBhbmQgZ3JvdXBlZCBieSBzZXggYW5kIGZvdW5kIHRoZSBhdmVyYWdlIHNhbGFyeQoKYXZnX3NhbGFyeV9zZXggPC0gc2FsYXJ5ICU+JQogIGdyb3VwX2J5KFNFWCkgJT4lCiAgc3VtbWFyaXNlKGF2Z19zYWxhcnkgPSBtZWFuKEFOTlVBTF9TQUxBUlksIG5hLnJtID0gVFJVRSkpCgpnZ3Bsb3QoYXZnX3NhbGFyeV9zZXgsIGFlcyh4ID0gU0VYLCB5ID0gYXZnX3NhbGFyeSwgZmlsbCA9IFNFWCkpICsKICBnZW9tX2NvbCgpICsKICBsYWJzKHkgPSAiQXZlcmFnZSBBbm51YWwgU2FsYXJ5IiwKICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgQW5udWFsIFNhbGFyeSBieSBTZXgiKQoKYGBgCkV4cGxvcmluZyBvdGhlciB2aXN1YWxzIHdpdGggYWN0aXZlIHBheSAoZXhwZXJpbWVudGF0aW9uKQpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKc3VtbWFyeV9kYXRhIDwtIHNhbGFyeSAlPiUKICBncm91cF9ieShFVEhOSUNJVFksIFBBWV9TVEFUVVMpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCmdncGxvdChkYXRhID0gc3VtbWFyeV9kYXRhLCBhZXMoeCA9ICIiLCB5ID0gY291bnQsIGZpbGwgPSBQQVlfU1RBVFVTKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKwogIGZhY2V0X3dyYXAofiBFVEhOSUNJVFkpICsgICNzZXBhcmF0ZSBwaWUgY2hhcnRzIAogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEFjdGl2ZSBQYXkgU3RhdHVzIGJ5IEV0aG5pY2l0eSIpICsKICB0aGVtZV92b2lkKCkKCgojdGhlIFdoaXRlIGNhdGVnb3J5IGFwcGVhcnMgYXMgYSBmdWxsIHBpZSBjaGFydCB3aGlsZSB0aGUgb3RoZXIgY2F0ZWdvcmllcyBhcHBlYXIgYXMgc21hbGwgc2xpdmVycywgaXQgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGUgV2hpdGUgY2F0ZWdvcnkgaGFzIHNpZ25pZmljYW50bHkgbW9yZSBvYnNlcnZhdGlvbnMgY29tcGFyZWQgdG8gdGhlIG90aGVyIGNhdGVnb3JpZXMuIFRoaXMgaW1iYWxhbmNlIGluIHRoZSBkaXN0cmlidXRpb24gb2Ygb2JzZXJ2YXRpb25zIGNhbiBsZWFkIHRvIGRpZmZlcmVuY2VzIGluIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwaWUgY2hhcnQgc2xpY2VzLgoKYGBgCkRlbnNpdHkgcGxvdCBmb3IgcGF5IHN0YXR1cwpgYGB7cn0KCiNzY2llbnRpZmljIG5vdGF0aW9uCiAgb3B0aW9ucyhzY2lwZW4gPSA5OTkpCgoKCmdncGxvdChzYWxhcnksIGFlcyh4ID0gQU5OVUFMX1NBTEFSWSwgZmlsbCA9IFBBWV9TVEFUVVMpKSArCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArCiAgbGFicyh4ID0gIkFubnVhbCBTYWxhcnkiLCB5ID0gIkRlbnNpdHkiLCBmaWxsID0gIkFjdGl2ZSBQYXkgU3RhdHVzIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkFjdGl2ZSIgPSAiYmx1ZSIsICJUZXJtaW5hdGVkIiA9ICJyZWQiKSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgpDaGFuZ2luZyBnZW5kZXIgYW5kIHJhY2UgYW5kIHBheSBzdGF0dXMgaW50byBiaW5hcnkKYGBge3J9CiNyYWNlCnNhbGFyeSRFVEhOSUNJVFlbc2FsYXJ5JEVUSE5JQ0lUWT09ICJXaGl0ZSAoTm90IG9mIEhpc3BhbmljIE9yaWdpbikiXSA8LSAwCnNhbGFyeSRFVEhOSUNJVFlbc2FsYXJ5JEVUSE5JQ0lUWT09ICJCbGFjayJdIDwtIDEKc2FsYXJ5JEVUSE5JQ0lUWVtzYWxhcnkkRVRITklDSVRZPT0gIkFtZXJpY2FuIEluZGlhbi9BbGFza2FuIE5hdGl2ZSJdIDwtIDEKc2FsYXJ5JEVUSE5JQ0lUWVtzYWxhcnkkRVRITklDSVRZPT0gIkhpc3BhbmljIl0gPC0gMQpzYWxhcnkkRVRITklDSVRZW3NhbGFyeSRFVEhOSUNJVFk9PSAiQXNpYW4gb3IgUGFjaWZpYyBJc2xhbmRlciJdIDwtIDEKc2FsYXJ5JEVUSE5JQ0lUWVtzYWxhcnkkRVRITklDSVRZPT0gIlR3byBvciBNb3JlIFJhY2VzIl0gPC0gMQoKI2dlbmRlcgpzYWxhcnkkU0VYW3NhbGFyeSRTRVg9PSAiTSJdIDwtIDAKc2FsYXJ5JFNFWFtzYWxhcnkkU0VYPT0gIkYiXSA8LSAxCgojcGF5IHN0YXR1cwpzYWxhcnkkUEFZX1NUQVRVU1tzYWxhcnkkUEFZX1NUQVRVUyA9PSAiQWN0aXZlIl0gPC0gMApzYWxhcnkkUEFZX1NUQVRVU1tzYWxhcnkkUEFZX1NUQVRVUyA9PSAiVGVybWluYXRlZCJdIDwtIDEKCmBgYApTUExJVCBEQVRBLS0gVFJBSU5JTkcgQU5EIFRFU1QKYGBge3J9CiMgU2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCg0MikKCiMgU3BsaXQgZGF0YSBpbnRvIHRyYWluaW5nIGFuZCB0ZXN0aW5nIHNldHMKc3BsaXQgPC0gMC43NQpyb3dzICA8LSBucm93KHNhbGFyeSkKCnRyYWluLmVudHJpZXMgPC0gc2FtcGxlKHJvd3MsIHJvd3Mqc3BsaXQpICMgV2UgaGF2ZSBhbHJlYWR5IHNldCBzcGxpdCBhcyAwLjc1Cgptb2RlbC50cmFpbiA8LSBzYWxhcnlbdHJhaW4uZW50cmllcywgXQptb2RlbC52YWxpZCAgPC0gc2FsYXJ5Wy10cmFpbi5lbnRyaWVzLCAgXQpgYGAKClJlZ3Jlc3Npb24KYGBge3J9Cgptb2RlbC50cmFpbiRQQVlfU1RBVFVTIDwtIGFzLm51bWVyaWMobW9kZWwudHJhaW4kUEFZX1NUQVRVUykKbW9kZWwudmFsaWQkUEFZX1NUQVRVUyA8LSBhcy5udW1lcmljKG1vZGVsLnZhbGlkJFBBWV9TVEFUVVMpCgoKbW9kZWwudHJhaW4kU0VYIDwtIGZhY3Rvcihtb2RlbC50cmFpbiRTRVgpCm1vZGVsLnRyYWluJEVUSE5JQ0lUWSA8LSBmYWN0b3IobW9kZWwudHJhaW4kRVRITklDSVRZKQoKbW9kZWwudmFsaWQkU0VYIDwtIGZhY3Rvcihtb2RlbC52YWxpZCRTRVgpCm1vZGVsLnZhbGlkJEVUSE5JQ0lUWSA8LSBmYWN0b3IobW9kZWwudmFsaWQkRVRITklDSVRZKQoKCm1vZGVsIDwtIGdsbShQQVlfU1RBVFVTIH4gU0VYICsgRVRITklDSVRZICsgQU5OVUFMX1NBTEFSWSwgZGF0YSA9IG1vZGVsLnRyYWluLCBmYW1pbHkgPSBiaW5vbWlhbCkKCgpzdW1tYXJ5KG1vZGVsKQoKYGBgCgpgYGB7cn0Kc3RyKG1vZGVsLnZhbGlkJFNFWCkKI2ZhY3RvcgpzdHIobW9kZWwudmFsaWQkRVRITklDSVRZKQojZmFjdG9yCgojbWFraW5nIHByZWRpY3Rpb25zCnByb2JhYmlsaXRpZXMgPC0gcHJlZGljdChtb2RlbCwgbmV3ZGF0YSA9IG1vZGVsLnZhbGlkLCB0eXBlID0gInJlc3BvbnNlIikKCmBgYAoKCkNPTkZVU0lPTiBNQVRSSVgKYGBge3J9CnByZWRpY3RlZCA8LSBpZmVsc2UocHJvYmFiaWxpdGllcyA8IDAuNSwgMSwgMCkKY29uZl9tYXRyaXggPC0gdGFibGUocHJlZGljdGVkLCBtb2RlbC52YWxpZCRQQVlfU1RBVFVTKQpjb25mX21hdHJpeAoKI3ByZWRpY3RlZCAKCgojIDEtIHRlcm1pbmF0ZWQKIyB1bmRlciBwcmVkaWN0ZWQgMCAxIC0tIDAgKC0pIDEgKCspIApgYGAKClRoYXQncyBob3cgd2UgY2FuIGludGVycHJldCBhIENvbmZ1c2lvbiBNYXRyaXg6CgogICAgICAgICAgICAgQWN0dWFsCiAgICAgICAgICAgICArICAgLSAgClByZWRpY3RlZCArICBUUCAgRlAKICAgICAgICAgIC0gIEZOICBUTgoKVFAgKFRydWUgUG9zaXRpdmUpOiBzdXJ2aXZlZApUTiAoVHJ1ZSBOZWdhdGl2ZSk6IG5vdCBzdXJ2aXZlZApGUCAoRmFsc2UgUG9zaXRpdmUpOiBwcmVkaWN0ZWQgYXMgc3Vydml2ZWQgYnV0IGRpZG4ndCBhY3R1YWxseSBzdXJ2aXZlCkZOIChGYWxzZSBOZWdhdGl2ZSk6IHByZWRpY3RlZCBhcyBub3Qgc3Vydml2ZWQgYnV0IGRpZCBhY3R1YWxseSBzdXJ2aXZlCgoKVGhlIENvbmZ1c2lvbiBNYXRyaXggY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBgYWNjdXJhY3lgIG9mIHRoZSBtb2RlbDoKYGBge3J9CiMgQ2FsY3VsYXRlIGFjY3VyYWN5CmFjY3VyYWN5IDwtIHN1bShkaWFnKGNvbmZfbWF0cml4KSkgLyBzdW0oY29uZl9tYXRyaXgpCmFjY3VyYWN5CiMuMTkyMzU2NwpgYGAKCjIwJSBhY2N1cmFjeSAKCgpJIHVzZWQgYSBjb25mdXNpb24gbWF0cml4IHRvIGdhdWdlIHRoZSBlZmZpY2FjeSBvZiBteSBtb2RlbC4gSW5pdGlhbGx5LCBteSBtb2RlbCBhY2N1cmF0ZWx5IHByZWRpY3RlZCB0aGUgdGVybWluYXRpb24gb2YgMzAxIGluZGl2aWR1YWxzLCBhbGlnbmluZyB3aXRoIHRoZSBhY3R1YWwgb3V0Y29tZXMuIFNpbWlsYXJseSwgaXQgY29ycmVjdGx5IGFudGljaXBhdGVkIHRoZSBjb250aW51ZWQgZW1wbG95bWVudCBvZiBvbmUgaW5kaXZpZHVhbCwgYWxpZ25pbmcgd2l0aCB0aGUgYWN0dWFsIG91dGNvbWVzIGFnYWluLiBIb3dldmVyLCB0aGUgZGlzY3JlcGFuY3kgYXJpc2VzIGluIHRoZSBmYWxzZSBwb3NpdGl2ZXMgYW5kIG5lZ2F0aXZlczogbXkgbW9kZWwgcHJvamVjdGVkIDEsMjYyIHdvcmtlcnMgdG8gYmUgdGVybWluYXRlZCB3aGVuIHRoZXkgd2VyZSBzdGlsbCBhY3RpdmUgYW5kIG1pc2p1ZGdlZCBzaXggYWN0aXZlIHdvcmtlcnMgYXMgdGVybWluYXRlZC4gQ29uc2VxdWVudGx5LCB0aGUgbW9kZWwncyBhY2N1cmFjeSBpcyAyMCUsIGluZGljYXRpbmcgaXRzIGluYWRlcXVhY3kuIFRoaXMgbGltaXRhdGlvbiBtYXkgY29tZSBmcm9tIHRoZSBsaW1pdGVkIHZhcmlhYmxlcyB1dGlsaXplZCwgbmVjZXNzaXRhdGluZyBhIG1vcmUgY29tcHJlaGVuc2l2ZSBkYXRhc2V0IGVuY29tcGFzc2luZyBmYWN0b3JzIGxpa2Ugc2VuaW9yaXR5LCBpbmR1c3RyeSBhZmZpbGlhdGlvbnMsIGFuZCB0aGUgcG90ZW50aWFsIGluZmx1ZW5jZSBvZiBDT1ZJRC0xOSBhbmQgdGhlIHBhbmRlbWljLiBEZXNwaXRlIGxldmVyYWdpbmcgdGhlIGF2YWlsYWJsZSBkYXRhIHRvIHRoZSBiZXN0IG9mIG15IGFiaWxpdHksIHRoZSByZXN1bHRzIHVuZGVyc2NvcmUgdGhlIGltcGVyYXRpdmUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gY29uZHVjdCBhIHRob3JvdWdoIGFuZCBwcmVjaXNlIGFuYWx5c2lzLgo=