IRWMH <- read.csv("D:/R course/Practicing/Mental health vs remote work/IRWMH.csv")
summary(IRWMH)
Employee_ID Age Gender Job_Role
Length:5000 Min. :22.00 Length:5000 Length:5000
Class :character 1st Qu.:31.00 Class :character Class :character
Mode :character Median :41.00 Mode :character Mode :character
Mean :40.99
3rd Qu.:51.00
Max. :60.00
Industry Years_of_Experience Work_Location
Length:5000 Min. : 1.00 Length:5000
Class :character 1st Qu.: 9.00 Class :character
Mode :character Median :18.00 Mode :character
Mean :17.81
3rd Qu.:26.00
Max. :35.00
Hours_Worked_Per_Week Number_of_Virtual_Meetings Work_Life_Balance_Rating
Min. :20.00 Min. : 0.000 Min. :1.000
1st Qu.:29.00 1st Qu.: 4.000 1st Qu.:2.000
Median :40.00 Median : 8.000 Median :3.000
Mean :39.61 Mean : 7.559 Mean :2.984
3rd Qu.:50.00 3rd Qu.:12.000 3rd Qu.:4.000
Max. :60.00 Max. :15.000 Max. :5.000
Stress_Level Mental_Health_Condition Access_to_Mental_Health_Resources
Length:5000 Length:5000 Length:5000
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
Productivity_Change Social_Isolation_Rating Satisfaction_with_Remote_Work
Length:5000 Min. :1.000 Length:5000
Class :character 1st Qu.:2.000 Class :character
Mode :character Median :3.000 Mode :character
Mean :2.994
3rd Qu.:4.000
Max. :5.000
Company_Support_for_Remote_Work Physical_Activity Sleep_Quality
Min. :1.000 Length:5000 Length:5000
1st Qu.:2.000 Class :character Class :character
Median :3.000 Mode :character Mode :character
Mean :3.008
3rd Qu.:4.000
Max. :5.000
Region
Length:5000
Class :character
Mode :character
IRWMH$Age_Group <- cut(
IRWMH$Age,
breaks = c(20, 30, 40, 50, 60), # Define the breakpoints for age groups
labels = c("21-30", "31-40", "41-50", "51-60"), # Set labels for each age group
right = TRUE # Include the right endpoint in intervals (e.g., 30 is included in 21-30)
)
age_group_counts <- table(IRWMH$Age_Group)
print(age_group_counts)
21-30 31-40 41-50 51-60
1170 1239 1321 1270
table(IRWMH$Gender)
Female Male Non-binary Prefer not to say
1274 1270 1214 1242
table(IRWMH$Job_Role)
Data Scientist Designer HR Marketing
696 723 716 683
Project Manager Sales Software Engineer
738 733 711
table(IRWMH$Industry)
Consulting Education Finance Healthcare IT
680 690 747 728 746
Manufacturing Retail
683 726
table(IRWMH$Work_Location)
Hybrid Onsite Remote
1649 1637 1714
table(IRWMH$Work_Life_Balance_Rating)
1 2 3 4 5
1023 967 1053 980 977
table(IRWMH$Stress_Level)
High Low Medium
1686 1645 1669
table(IRWMH$Mental_Health_Condition)
Anxiety Burnout Depression None
1278 1280 1246 1196
table(IRWMH$Access_to_Mental_Health_Resources)
No Yes
2553 2447
table(IRWMH$Productivity_Change)
Decrease Increase No Change
1737 1586 1677
table(IRWMH$Social_Isolation_Rating)
1 2 3 4 5
953 1066 992 1037 952
table(IRWMH$Satisfaction_with_Remote_Work)
Neutral Satisfied Unsatisfied
1648 1675 1677
table(IRWMH$Company_Support_for_Remote_Work)
1 2 3 4 5
967 985 1077 984 987
table(IRWMH$Physical_Activity)
Daily None Weekly
1616 1629 1755
table(IRWMH$Sleep_Quality)
Average Good Poor
1628 1687 1685
table(IRWMH$Region)
Africa Asia Europe North America Oceania
860 829 840 777 867
South America
827
table(IRWMH$Experience_Group)
< table of extent 0 >
average_hours_by_job_function <- IRWMH %>%
group_by(Job_Role) %>% # Group data by Job_Role
summarise(Average_Hours = mean(Hours_Worked_Per_Week, na.rm = TRUE))
print(average_hours_by_job_function)
IRWMH <- data.frame(
Job_Role = rep(c("Data Scientist", "Designer", "HR", "Marketing",
"Project Manager", "Sales", "Software Engineer"), each = 30),
Hours_Worked_Per_Week = c(
rnorm(30, mean = 38.95402, sd = 1), # Data Scientist
rnorm(30, mean = 38.88105, sd = 1), # Designer
rnorm(30, mean = 39.66061, sd = 1), # HR
rnorm(30, mean = 39.73499, sd = 1), # Marketing
rnorm(30, mean = 39.92276, sd = 1), # Project Manager
rnorm(30, mean = 39.86085, sd = 1), # Sales
rnorm(30, mean = 40.27145, sd = 1) # Software Engineer
)
)
anova_model <- aov(Hours_Worked_Per_Week ~ Job_Role, data = IRWMH)
summary(anova_model)
Df Sum Sq Mean Sq F value Pr(>F)
Job_Role 6 63.35 10.559 10.51 3.82e-10 ***
Residuals 203 204.05 1.005
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
IRWMH <- read.csv("D:/R course/Practicing/Mental health vs remote work/IRWMH.csv")
average_wlb_by_job_function <- IRWMH %>%
group_by(Job_Role) %>% # Group data by Job_Role
summarise(Average_rating = mean(Work_Life_Balance_Rating, na.rm = TRUE))
print(average_wlb_by_job_function)
average_vm_by_job_function <- IRWMH %>%
group_by(Job_Role) %>% # Group data by Job_Role
summarise(Average_vm = mean(Number_of_Virtual_Meetings, na.rm = TRUE))
print(average_vm_by_job_function)
average_cs_by_job_function <- IRWMH %>%
group_by(Job_Role) %>% # Group data by Job_Role
summarise(Average_cs = mean(Company_Support_for_Remote_Work, na.rm = TRUE))
print(average_cs_by_job_function)
average_wlb_by_job_function <- IRWMH %>%
group_by(Region) %>% # Group data by Region
summarise(Average_wlb = mean(Work_Life_Balance_Rating, na.rm = TRUE))
print(average_wlb_by_job_function)
average_wpw_by_job_function <- IRWMH %>%
group_by(Region) %>% # Group data by Region
summarise(Average_wpw = mean(Hours_Worked_Per_Week, na.rm = TRUE))
print(average_wpw_by_job_function)
sleep_quality_percentages <- IRWMH %>%
group_by(Region, Sleep_Quality) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Region, Sleep_Quality)
print(sleep_quality_percentages)
ggplot(sleep_quality_percentages, aes(x = Region, y = Percentage, fill = Sleep_Quality)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Sleep Quality Ratings by Region",
x = "Region",
y = "Percentage of Sleep Quality Ratings") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

stress_level_percentages <- IRWMH %>%
group_by(Region, Stress_Level) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Region, Stress_Level)
print(stress_level_percentages)
ggplot(stress_level_percentages, aes(x = Region, y = Percentage, fill = Stress_Level)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Stress Level Ratings by Region",
x = "Region",
y = "Percentage of Stress Level Ratings") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

stress_level_percentages <- IRWMH %>%
group_by(Job_Role, Stress_Level) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Job_Role, Stress_Level)
print(stress_level_percentages)
ggplot(stress_level_percentages, aes(x = Job_Role, y = Percentage, fill = Stress_Level)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Stress Level Ratings by Job Role",
x = "Job_Role",
y = "Percentage of Stress Level Ratings") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

# Define the data
work_modes <- c(Hybrid = 1649, Onsite = 1637, Remote = 1714)
# Calculate percentages
percentages <- round((work_modes / sum(work_modes)) * 100, 1)
# Define labels with percentages
labels <- paste(names(work_modes), "\n", percentages, "%", sep = "")
# Create a pie chart with percentages
pie(work_modes, labels = labels,
main = "Distribution of Work Modes",
col = c("skyblue", "orange", "green")) # Optional: Customize colors

NA
NA
# Define the data
experience_counts <- c("1-10" = 1473, "11-20" = 1386, "21-30" = 1488, "31-40" = 653)
# Calculate percentages
percentages <- round((experience_counts / sum(experience_counts)) * 100, 1)
# Define labels with percentages
labels <- paste(names(experience_counts), "\n", percentages, "%", sep = "")
# Create a pie chart with percentages
pie(experience_counts, labels = labels,
main = "Distribution of Employees by Job Experience",
col = c("skyblue", "orange", "green", "purple")) # Customize colors as desired

work_mode_percentages <- IRWMH %>%
group_by(Job_Role, Work_Location) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Job_Role, Work_Location)
print(work_mode_percentages)
ggplot(work_mode_percentages, aes(x = Job_Role, y = Percentage, fill = Work_Location)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Work Location Type by Job Role",
x = "Job_Role",
y = "Percentage of Location Types") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

stress_level_percentages <- IRWMH %>%
group_by(Work_Location, Stress_Level) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Work_Location, Stress_Level)
print(stress_level_percentages)
ggplot(stress_level_percentages, aes(x = Work_Location, y = Percentage, fill = Stress_Level)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Different Stress Level by Work Location",
x = "Work Location",
y = "Percentage of Stress Level") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

virtual_meetings_summary <- IRWMH %>%
group_by(Job_Role) %>%
summarise(Total_Virtual_Meetings = sum(Number_of_Virtual_Meetings, na.rm = TRUE)) %>%
arrange(desc(Total_Virtual_Meetings))
print(virtual_meetings_summary)
mental_health_condition_percentages <- IRWMH %>%
group_by(Job_Role, Mental_Health_Condition) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Job_Role, Mental_Health_Condition)
print(mental_health_condition_percentages)
ggplot(mental_health_condition_percentages, aes(x = Job_Role, y = Percentage, fill = Mental_Health_Condition)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Different Mental Health Condition by Job Role",
x = "Job Role",
y = "Mental Health Condition") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

mental_health_condition_percentages <- IRWMH %>%
group_by(Gender, Mental_Health_Condition) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Gender, Mental_Health_Condition)
print(mental_health_condition_percentages)
ggplot(mental_health_condition_percentages, aes(x = Gender, y = Percentage, fill = Mental_Health_Condition)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percentage of Different Mental Health Condition by Gender",
x = "Gender",
y = "Mental Health Condition") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

job_role_by_gender_summary <- IRWMH %>%
group_by(Gender, Job_Role) %>%
summarise(Count = n(), .groups = 'drop') %>%
arrange(Gender, Job_Role)
print(job_role_by_gender_summary)
ggplot(job_role_by_gender_summary, aes(x = Gender, y = Count, fill = Job_Role)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Number of Different Job Roles by Gender",
x = "Gender",
y = "Job Role") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

productivity_change_percentages <- IRWMH %>%
group_by(Stress_Level, Productivity_Change) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Stress_Level, Productivity_Change)
print(productivity_change_percentages)
ggplot(productivity_change_percentages, aes(x = Stress_Level, y = Percentage, fill = Productivity_Change)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Productivity Change due to Stress Level",
x = "Stress Level",
y = "Productivity Change") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

productivity_change_percentages <- IRWMH %>%
group_by(Sleep_Quality, Productivity_Change) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Sleep_Quality, Productivity_Change)
print(productivity_change_percentages)
ggplot(productivity_change_percentages, aes(x = Sleep_Quality, y = Percentage, fill = Productivity_Change)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Productivity Change according to Sleep Quality",
x = "Sleep Quality",
y = "Productivity Change") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

# Create a contingency table
contingency_table <- table(productivity_change_percentages$Sleep_Quality, productivity_change_percentages$Productivity_Change)
fisher_test <- fisher.test(contingency_table)
# View the results
print(fisher_test)
Fisher's Exact Test for Count Data
data: contingency_table
p-value = 1
alternative hypothesis: two.sided
satisfaction_with_remote_work_percentages <- IRWMH %>%
group_by(Job_Role, Satisfaction_with_Remote_Work) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
arrange(Job_Role, Satisfaction_with_Remote_Work)
print(satisfaction_with_remote_work_percentages)
ggplot(satisfaction_with_remote_work_percentages, aes(x = Job_Role, y = Percentage, fill = Satisfaction_with_Remote_Work)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Satisfaction with Remote Work by Job Role",
x = "Job Role",
y = "Satisfaction Level") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

ggplot(satisfaction_with_remote_work_percentages, aes(x = Job_Role, y = Count, fill = Satisfaction_with_Remote_Work)) +
geom_violin(trim = FALSE) + # Creates the violin plot
geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
labs(
title = "satisfaction_with_remote_work",
x = "Job Role",
y = "Satisfaction_with_Remote_Work"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Rotates x-axis labels for better readability
scale_fill_brewer(palette = "Set3")

# Create a data frame with the provided data
data <- data.frame(
Profession = c("Data Scientist", "Designer", "HR", "Marketing",
"Project Manager", "Sales", "Software Engineer"),
Avg_Hours_Worked = c(38.95402, 38.88105, 39.66061, 39.73499,
39.92276, 39.86085, 40.27145),
Work_Life_Balance_Rating = c(3.007184, 2.966805, 2.930168,
2.945827, 2.960705, 3.043656, 3.033755)
)
# Calculate the Pearson correlation coefficient between Avg_Hours_Worked and Work_Life_Balance_Rating
correlation <- cor(data$Avg_Hours_Worked, data$Work_Life_Balance_Rating)
print(paste("Correlation coefficient between average hours worked and work-life balance rating:", round(correlation, 4)))
[1] "Correlation coefficient between average hours worked and work-life balance rating: 0.2232"
# Optional: Visualize the relationship with a scatter plot
ggplot(data, aes(x = Avg_Hours_Worked, y = Work_Life_Balance_Rating, label = Profession)) +
geom_point(size = 3, color = "blue") +
geom_text(vjust = -0.5, hjust = 0.5) + # Adds profession labels near points
labs(
title = "Relationship Between Average Hours Worked and Work-Life Balance Rating",
x = "Average Hours Worked",
y = "Work-Life Balance Rating"
) +
theme_minimal()

job_role_by_industry_summary <- IRWMH %>%
group_by(Industry, Job_Role) %>%
summarise(Count = n(), .groups = 'drop') %>%
arrange(Industry, Job_Role)
print(job_role_by_industry_summary)
ggplot(job_role_by_industry_summary, aes(x = Industry, y = Count, fill = Job_Role)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Number of Different Job Roles by Industry",
x = "Industry",
y = "Job Role") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

acmh_by_industry_summary <- IRWMH %>%
group_by(Industry, Access_to_Mental_Health_Resources) %>%
summarise(Count = n(), .groups = 'drop') %>%
arrange(Industry, Access_to_Mental_Health_Resources)
print(acmh_by_industry_summary)
ggplot(acmh_by_industry_summary, aes(x = Industry, y = Count, fill = Access_to_Mental_Health_Resources)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Access to Mental Health by Industry",
x = "Industry",
y = "Access to Mental Health") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

ggplot(IRWMH, aes(x = Job_Role, y = Age, fill = Job_Role)) +
geom_violin(trim = FALSE) + # Creates the violin plot
geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
labs(
title = "Age Distribution by Job Role",
x = "Job Role",
y = "Age"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Rotates x-axis labels for better readability
scale_fill_brewer(palette = "Set3") # Optional: customize the color palette

average_age_by_job <- IRWMH %>%
group_by(Job_Role) %>%
summarise(Average_Age = mean(Age, na.rm = TRUE)) # Calculate the mean age
# Display the results
print(average_age_by_job)
ggplot(IRWMH, aes(x = Job_Role, y = Years_of_Experience, fill = Job_Role)) +
geom_violin(trim = FALSE) + # Creates the violin plot
geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
labs(
title = "Experience Distribution by Job Role",
x = "Job Role",
y = "Years of Experience"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Rotates x-axis labels for better readability
scale_fill_brewer(palette = "Set3") # Optional: customize the color palette

IRWMH$Stress_Level <- factor(IRWMH$Stress_Level, ordered = TRUE, levels = c("Low", "Medium", "High"))
# Remove rows with missing values
data_clean <- IRWMH %>%
filter(!is.na(Stress_Level), !is.na(Hours_Worked_Per_Week))
# Perform ordinal logistic regression
model_stress_ordinal <- polr(Stress_Level ~ Hours_Worked_Per_Week, data = data_clean, method = "logistic")
# View the summary of the model
summary(model_stress_ordinal)
Re-fitting to get Hessian
Call:
polr(formula = Stress_Level ~ Hours_Worked_Per_Week, data = data_clean,
method = "logistic")
Coefficients:
Value Std. Error t value
Hours_Worked_Per_Week 0.002565 0.002192 1.17
Intercepts:
Value Std. Error t value
Low|Medium -0.6113 0.0917 -6.6647
Medium|High 0.7775 0.0920 8.4525
Residual Deviance: 10984.24
AIC: 10990.24
IRWMH <- read.csv("D:/R course/Practicing/Mental health vs remote work/IRWMH.csv")
model <- lm(Number_of_Virtual_Meetings ~ Hours_Worked_Per_Week, data = IRWMH)
# Check the model summary
summary(model)
Call:
lm(formula = Number_of_Virtual_Meetings ~ Hours_Worked_Per_Week,
data = IRWMH)
Residuals:
Min 1Q Median 3Q Max
-7.5943 -3.5943 0.4111 4.4093 7.4777
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.630367 0.228640 33.373 <2e-16 ***
Hours_Worked_Per_Week -0.001802 0.005529 -0.326 0.745
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.637 on 4998 degrees of freedom
Multiple R-squared: 2.124e-05, Adjusted R-squared: -0.0001788
F-statistic: 0.1062 on 1 and 4998 DF, p-value: 0.7446
# Plot with regression line
plot(IRWMH$Hours_Worked_Per_Week, IRWMH$Number_of_Virtual_Meetings,
main = "Regression Analysis",
xlab = "Hours Worked Per Week",
ylab = "Number of Virtual Meetings",
pch = 19, col = "blue")
abline(model, col = "red", lwd = 2)
# Add the regression line
abline(model, col = "red", lwd = 2)

stress_level_by_work_location_summary <- IRWMH %>%
group_by(Work_Location, Stress_Level) %>%
summarise(Count = n(), .groups = 'drop') %>%
arrange(Work_Location, Stress_Level)
print(stress_level_by_work_location_summary)
ggplot(stress_level_by_work_location_summary, aes(x = Work_Location, y = Count, fill = Stress_Level)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Stress Level by Job Location",
x = "Work Location",
y = "Stress Level") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")

cs_by_industry_summary <- IRWMH %>%
group_by(Industry, Company_Support_for_Remote_Work) %>%
summarise(Count = n(), .groups = 'drop') %>%
arrange(Industry, Company_Support_for_Remote_Work)
print(cs_by_industry_summary)
average_cs_by_industry <- IRWMH %>%
group_by(Industry) %>%
summarise(Average_CS = mean(Company_Support_for_Remote_Work, na.rm = TRUE))
# Display the results
print(average_cs_by_industry)
ggplot(IRWMH, aes(x = Industry, y = Company_Support_for_Remote_Work, fill = Industry)) +
geom_violin(trim = FALSE) + # Creates the violin plot
geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
labs(
title = "Company Support for Remote Work by Industry",
x = "Industry",
y = "Company Support Rating"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Rotates x-axis labels for better readability
scale_fill_brewer(palette = "Set3")

average_csr_by_region <- IRWMH %>%
group_by(Region) %>%
summarise(Average_CSR = mean(Company_Support_for_Remote_Work, na.rm = TRUE))
# Display the results
print(average_csr_by_region)
average_sir_by_region <- IRWMH %>%
group_by(Region) %>%
summarise(Average_SIR = mean(Social_Isolation_Rating, na.rm = TRUE))
# Display the results
print(average_sir_by_region)
# Data: Average Company Support Rating by Region
company_support <- c(3.010465, 2.965018, 2.964286, 3.037323, 3.055363, 3.014510)
# Data: Average Social Isolation Rating by Region
social_isolation <- c(2.987209, 2.980700, 2.936905, 3.011583, 3.065744, 2.979444)
# Data: Region Names
regions <- c("Africa", "Asia", "Europe", "North America", "Oceania", "South America")
# Create a data frame
data <- data.frame(Region = regions, Company_Support = company_support, Social_Isolation = social_isolation)
# Perform linear regression
model <- lm(Social_Isolation ~ Company_Support, data = data)
# Summary of the regression model
summary(model)
Call:
lm(formula = Social_Isolation ~ Company_Support, data = data)
Residuals:
1 2 3 4 5 6
-0.009011 0.029661 -0.013406 -0.011337 0.024890 -0.020797
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.003419 0.871723 0.004 0.9971
Company_Support 0.994132 0.289800 3.430 0.0265 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02409 on 4 degrees of freedom
Multiple R-squared: 0.7463, Adjusted R-squared: 0.6829
F-statistic: 11.77 on 1 and 4 DF, p-value: 0.02653
# Plotting the data points
plot(data$Company_Support, data$Social_Isolation,
main = "Regression of Social Isolation on Company Support",
xlab = "Average Company Support Rating",
ylab = "Average Social Isolation Rating",
pch = 19, col = "blue")
# Add regression line
abline(model, col = "red", lwd = 2)

LS0tDQp0aXRsZTogIkVmZmVjdCBvZiBNZW50YWwgSGVhbHRoIG9uIFJlbW90ZSBXb3JrIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCmBgYHtyfQ0KSVJXTUggPC0gcmVhZC5jc3YoIkQ6L1IgY291cnNlL1ByYWN0aWNpbmcvTWVudGFsIGhlYWx0aCB2cyByZW1vdGUgd29yay9JUldNSC5jc3YiKQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoSVJXTUgpDQpgYGANCmBgYHtyfQ0KSVJXTUgkQWdlX0dyb3VwIDwtIGN1dCgNCiAgICAgSVJXTUgkQWdlLA0KICAgICBicmVha3MgPSBjKDIwLCAzMCwgNDAsIDUwLCA2MCksICMgRGVmaW5lIHRoZSBicmVha3BvaW50cyBmb3IgYWdlIGdyb3Vwcw0KICAgIGxhYmVscyA9IGMoIjIxLTMwIiwgIjMxLTQwIiwgIjQxLTUwIiwgIjUxLTYwIiksICMgU2V0IGxhYmVscyBmb3IgZWFjaCBhZ2UgZ3JvdXANCiAgICAgcmlnaHQgPSBUUlVFICMgSW5jbHVkZSB0aGUgcmlnaHQgZW5kcG9pbnQgaW4gaW50ZXJ2YWxzIChlLmcuLCAzMCBpcyBpbmNsdWRlZCBpbiAyMS0zMCkNCiApDQphZ2VfZ3JvdXBfY291bnRzIDwtIHRhYmxlKElSV01IJEFnZV9Hcm91cCkNCnByaW50KGFnZV9ncm91cF9jb3VudHMpDQpgYGANCmBgYHtyfQ0KdGFibGUoSVJXTUgkR2VuZGVyKQ0KYGBgDQpgYGB7cn0NCnRhYmxlKElSV01IJEpvYl9Sb2xlKQ0KdGFibGUoSVJXTUgkSW5kdXN0cnkpDQpgYGANCmBgYHtyfQ0KdGFibGUoSVJXTUgkV29ya19Mb2NhdGlvbikNCnRhYmxlKElSV01IJFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZykNCnRhYmxlKElSV01IJFN0cmVzc19MZXZlbCkNCnRhYmxlKElSV01IJE1lbnRhbF9IZWFsdGhfQ29uZGl0aW9uKQ0KdGFibGUoSVJXTUgkQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKQ0KdGFibGUoSVJXTUgkUHJvZHVjdGl2aXR5X0NoYW5nZSkNCnRhYmxlKElSV01IJFNvY2lhbF9Jc29sYXRpb25fUmF0aW5nKQ0KdGFibGUoSVJXTUgkU2F0aXNmYWN0aW9uX3dpdGhfUmVtb3RlX1dvcmspDQp0YWJsZShJUldNSCRDb21wYW55X1N1cHBvcnRfZm9yX1JlbW90ZV9Xb3JrKQ0KdGFibGUoSVJXTUgkUGh5c2ljYWxfQWN0aXZpdHkpDQp0YWJsZShJUldNSCRTbGVlcF9RdWFsaXR5KQ0KdGFibGUoSVJXTUgkUmVnaW9uKQ0KdGFibGUoSVJXTUgkRXhwZXJpZW5jZV9Hcm91cCkNCmBgYA0KYGBge3J9DQphdmVyYWdlX2hvdXJzX2J5X2pvYl9mdW5jdGlvbiA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUpICU+JSAjIEdyb3VwIGRhdGEgYnkgSm9iX1JvbGUNCiAgICAgc3VtbWFyaXNlKEF2ZXJhZ2VfSG91cnMgPSBtZWFuKEhvdXJzX1dvcmtlZF9QZXJfV2VlaywgbmEucm0gPSBUUlVFKSkNCnByaW50KGF2ZXJhZ2VfaG91cnNfYnlfam9iX2Z1bmN0aW9uKQ0KYGBgDQpgYGB7cn0NCklSV01IIDwtIGRhdGEuZnJhbWUoDQogICAgIEpvYl9Sb2xlID0gcmVwKGMoIkRhdGEgU2NpZW50aXN0IiwgIkRlc2lnbmVyIiwgIkhSIiwgIk1hcmtldGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJQcm9qZWN0IE1hbmFnZXIiLCAiU2FsZXMiLCAiU29mdHdhcmUgRW5naW5lZXIiKSwgZWFjaCA9IDMwKSwNCiAgICAgSG91cnNfV29ya2VkX1Blcl9XZWVrID0gYygNCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzguOTU0MDIsIHNkID0gMSksICMgRGF0YSBTY2llbnRpc3QNCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzguODgxMDUsIHNkID0gMSksICMgRGVzaWduZXINCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzkuNjYwNjEsIHNkID0gMSksICMgSFINCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzkuNzM0OTksIHNkID0gMSksICMgTWFya2V0aW5nDQogICAgICAgICBybm9ybSgzMCwgbWVhbiA9IDM5LjkyMjc2LCBzZCA9IDEpLCAjIFByb2plY3QgTWFuYWdlcg0KICAgICAgICAgcm5vcm0oMzAsIG1lYW4gPSAzOS44NjA4NSwgc2QgPSAxKSwgIyBTYWxlcw0KICAgICAgICAgcm5vcm0oMzAsIG1lYW4gPSA0MC4yNzE0NSwgc2QgPSAxKSAgIyBTb2Z0d2FyZSBFbmdpbmVlcg0KICAgICApDQogKQ0KIGFub3ZhX21vZGVsIDwtIGFvdihIb3Vyc19Xb3JrZWRfUGVyX1dlZWsgfiBKb2JfUm9sZSwgZGF0YSA9IElSV01IKQ0KIHN1bW1hcnkoYW5vdmFfbW9kZWwpDQpgYGANCmBgYHtyfQ0KSVJXTUggPC0gcmVhZC5jc3YoIkQ6L1IgY291cnNlL1ByYWN0aWNpbmcvTWVudGFsIGhlYWx0aCB2cyByZW1vdGUgd29yay9JUldNSC5jc3YiKQ0KYXZlcmFnZV93bGJfYnlfam9iX2Z1bmN0aW9uIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShKb2JfUm9sZSkgJT4lICMgR3JvdXAgZGF0YSBieSBKb2JfUm9sZQ0KICAgICBzdW1tYXJpc2UoQXZlcmFnZV9yYXRpbmcgPSBtZWFuKFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZywgbmEucm0gPSBUUlVFKSkNCnByaW50KGF2ZXJhZ2Vfd2xiX2J5X2pvYl9mdW5jdGlvbikNCmBgYA0KYGBge3J9DQphdmVyYWdlX3ZtX2J5X2pvYl9mdW5jdGlvbiA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUpICU+JSAjIEdyb3VwIGRhdGEgYnkgSm9iX1JvbGUNCiAgICAgc3VtbWFyaXNlKEF2ZXJhZ2Vfdm0gPSBtZWFuKE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLCBuYS5ybSA9IFRSVUUpKQ0KcHJpbnQoYXZlcmFnZV92bV9ieV9qb2JfZnVuY3Rpb24pDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9jc19ieV9qb2JfZnVuY3Rpb24gPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KEpvYl9Sb2xlKSAlPiUgIyBHcm91cCBkYXRhIGJ5IEpvYl9Sb2xlDQogICAgIHN1bW1hcmlzZShBdmVyYWdlX2NzID0gbWVhbihDb21wYW55X1N1cHBvcnRfZm9yX1JlbW90ZV9Xb3JrLCBuYS5ybSA9IFRSVUUpKQ0KcHJpbnQoYXZlcmFnZV9jc19ieV9qb2JfZnVuY3Rpb24pDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV93bGJfYnlfam9iX2Z1bmN0aW9uIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShSZWdpb24pICU+JSAjIEdyb3VwIGRhdGEgYnkgUmVnaW9uDQogICAgIHN1bW1hcmlzZShBdmVyYWdlX3dsYiA9IG1lYW4oV29ya19MaWZlX0JhbGFuY2VfUmF0aW5nLCBuYS5ybSA9IFRSVUUpKQ0KcHJpbnQoYXZlcmFnZV93bGJfYnlfam9iX2Z1bmN0aW9uKQ0KYGBgDQpgYGB7cn0NCmF2ZXJhZ2Vfd3B3X2J5X2pvYl9mdW5jdGlvbiA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoUmVnaW9uKSAlPiUgIyBHcm91cCBkYXRhIGJ5IFJlZ2lvbg0KICAgICBzdW1tYXJpc2UoQXZlcmFnZV93cHcgPSBtZWFuKEhvdXJzX1dvcmtlZF9QZXJfV2VlaywgbmEucm0gPSBUUlVFKSkNCnByaW50KGF2ZXJhZ2Vfd3B3X2J5X2pvYl9mdW5jdGlvbikNCmBgYA0KYGBge3J9DQpzbGVlcF9xdWFsaXR5X3BlcmNlbnRhZ2VzIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShSZWdpb24sIFNsZWVwX1F1YWxpdHkpICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoUmVnaW9uLCBTbGVlcF9RdWFsaXR5KQ0KcHJpbnQoc2xlZXBfcXVhbGl0eV9wZXJjZW50YWdlcykNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChzbGVlcF9xdWFsaXR5X3BlcmNlbnRhZ2VzLCBhZXMoeCA9IFJlZ2lvbiwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBTbGVlcF9RdWFsaXR5KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBTbGVlcCBRdWFsaXR5IFJhdGluZ3MgYnkgUmVnaW9uIiwNCiAgICAgICB4ID0gIlJlZ2lvbiIsDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFNsZWVwIFF1YWxpdHkgUmF0aW5ncyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikNCmBgYA0KYGBge3J9DQpzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFJlZ2lvbiwgU3RyZXNzX0xldmVsKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgbXV0YXRlKFBlcmNlbnRhZ2UgPSBDb3VudCAvIHN1bShDb3VudCkgKiAxMDApICU+JQ0KICAgICBhcnJhbmdlKFJlZ2lvbiwgU3RyZXNzX0xldmVsKQ0KcHJpbnQoc3RyZXNzX2xldmVsX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMsIGFlcyh4ID0gUmVnaW9uLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFN0cmVzc19MZXZlbCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgU3RyZXNzIExldmVsIFJhdGluZ3MgYnkgUmVnaW9uIiwNCiAgICAgICB4ID0gIlJlZ2lvbiIsDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFN0cmVzcyBMZXZlbCBSYXRpbmdzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCnN0cmVzc19sZXZlbF9wZXJjZW50YWdlcyA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUsIFN0cmVzc19MZXZlbCkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIG11dGF0ZShQZXJjZW50YWdlID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwKSAlPiUNCiAgICAgYXJyYW5nZShKb2JfUm9sZSwgU3RyZXNzX0xldmVsKQ0KcHJpbnQoc3RyZXNzX2xldmVsX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMsIGFlcyh4ID0gSm9iX1JvbGUsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gU3RyZXNzX0xldmVsKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBTdHJlc3MgTGV2ZWwgUmF0aW5ncyBieSBKb2IgUm9sZSIsDQogICAgICAgeCA9ICJKb2JfUm9sZSIsDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFN0cmVzcyBMZXZlbCBSYXRpbmdzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCiMgRGVmaW5lIHRoZSBkYXRhDQp3b3JrX21vZGVzIDwtIGMoSHlicmlkID0gMTY0OSwgT25zaXRlID0gMTYzNywgUmVtb3RlID0gMTcxNCkNCg0KIyBDYWxjdWxhdGUgcGVyY2VudGFnZXMNCnBlcmNlbnRhZ2VzIDwtIHJvdW5kKCh3b3JrX21vZGVzIC8gc3VtKHdvcmtfbW9kZXMpKSAqIDEwMCwgMSkNCg0KIyBEZWZpbmUgbGFiZWxzIHdpdGggcGVyY2VudGFnZXMNCmxhYmVscyA8LSBwYXN0ZShuYW1lcyh3b3JrX21vZGVzKSwgIlxuIiwgcGVyY2VudGFnZXMsICIlIiwgc2VwID0gIiIpDQoNCiMgQ3JlYXRlIGEgcGllIGNoYXJ0IHdpdGggcGVyY2VudGFnZXMNCnBpZSh3b3JrX21vZGVzLCBsYWJlbHMgPSBsYWJlbHMsIA0KICAgIG1haW4gPSAiRGlzdHJpYnV0aW9uIG9mIFdvcmsgTW9kZXMiLA0KICAgIGNvbCA9IGMoInNreWJsdWUiLCAib3JhbmdlIiwgImdyZWVuIikpICAjIE9wdGlvbmFsOiBDdXN0b21pemUgY29sb3JzDQoNCg0KYGBgDQpgYGB7cn0NCiMgRGVmaW5lIHRoZSBkYXRhDQpleHBlcmllbmNlX2NvdW50cyA8LSBjKCIxLTEwIiA9IDE0NzMsICIxMS0yMCIgPSAxMzg2LCAiMjEtMzAiID0gMTQ4OCwgIjMxLTQwIiA9IDY1MykNCg0KIyBDYWxjdWxhdGUgcGVyY2VudGFnZXMNCnBlcmNlbnRhZ2VzIDwtIHJvdW5kKChleHBlcmllbmNlX2NvdW50cyAvIHN1bShleHBlcmllbmNlX2NvdW50cykpICogMTAwLCAxKQ0KDQojIERlZmluZSBsYWJlbHMgd2l0aCBwZXJjZW50YWdlcw0KbGFiZWxzIDwtIHBhc3RlKG5hbWVzKGV4cGVyaWVuY2VfY291bnRzKSwgIlxuIiwgcGVyY2VudGFnZXMsICIlIiwgc2VwID0gIiIpDQoNCiMgQ3JlYXRlIGEgcGllIGNoYXJ0IHdpdGggcGVyY2VudGFnZXMNCnBpZShleHBlcmllbmNlX2NvdW50cywgbGFiZWxzID0gbGFiZWxzLCANCiAgICBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBFbXBsb3llZXMgYnkgSm9iIEV4cGVyaWVuY2UiLA0KICAgIGNvbCA9IGMoInNreWJsdWUiLCAib3JhbmdlIiwgImdyZWVuIiwgInB1cnBsZSIpKSAgIyBDdXN0b21pemUgY29sb3JzIGFzIGRlc2lyZWQNCg0KYGBgDQpgYGB7cn0NCndvcmtfbW9kZV9wZXJjZW50YWdlcyA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUsIFdvcmtfTG9jYXRpb24pICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoSm9iX1JvbGUsIFdvcmtfTG9jYXRpb24pDQpwcmludCh3b3JrX21vZGVfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHdvcmtfbW9kZV9wZXJjZW50YWdlcywgYWVzKHggPSBKb2JfUm9sZSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBXb3JrX0xvY2F0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBXb3JrIExvY2F0aW9uIFR5cGUgYnkgSm9iIFJvbGUiLA0KICAgICAgIHggPSAiSm9iX1JvbGUiLA0KICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBMb2NhdGlvbiBUeXBlcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikNCmBgYA0KYGBge3J9DQpzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFdvcmtfTG9jYXRpb24sIFN0cmVzc19MZXZlbCkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIG11dGF0ZShQZXJjZW50YWdlID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwKSAlPiUNCiAgICAgYXJyYW5nZShXb3JrX0xvY2F0aW9uLCBTdHJlc3NfTGV2ZWwpDQpwcmludChzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHN0cmVzc19sZXZlbF9wZXJjZW50YWdlcywgYWVzKHggPSBXb3JrX0xvY2F0aW9uLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFN0cmVzc19MZXZlbCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRGlmZmVyZW50IFN0cmVzcyBMZXZlbCBieSBXb3JrIExvY2F0aW9uIiwNCiAgICAgICB4ID0gIldvcmsgTG9jYXRpb24iLA0KICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBTdHJlc3MgTGV2ZWwiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KdmlydHVhbF9tZWV0aW5nc19zdW1tYXJ5IDwtIElSV01IICU+JQ0KICBncm91cF9ieShKb2JfUm9sZSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9WaXJ0dWFsX01lZXRpbmdzID0gc3VtKE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKFRvdGFsX1ZpcnR1YWxfTWVldGluZ3MpKQ0KcHJpbnQodmlydHVhbF9tZWV0aW5nc19zdW1tYXJ5KQ0KYGBgDQpgYGB7cn0NCm1lbnRhbF9oZWFsdGhfY29uZGl0aW9uX3BlcmNlbnRhZ2VzIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShKb2JfUm9sZSwgTWVudGFsX0hlYWx0aF9Db25kaXRpb24pICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoSm9iX1JvbGUsIE1lbnRhbF9IZWFsdGhfQ29uZGl0aW9uKQ0KcHJpbnQobWVudGFsX2hlYWx0aF9jb25kaXRpb25fcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KG1lbnRhbF9oZWFsdGhfY29uZGl0aW9uX3BlcmNlbnRhZ2VzLCBhZXMoeCA9IEpvYl9Sb2xlLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IE1lbnRhbF9IZWFsdGhfQ29uZGl0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBEaWZmZXJlbnQgTWVudGFsIEhlYWx0aCBDb25kaXRpb24gYnkgSm9iIFJvbGUiLA0KICAgICAgIHggPSAiSm9iIFJvbGUiLA0KICAgICAgIHkgPSAiTWVudGFsIEhlYWx0aCBDb25kaXRpb24iKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KbWVudGFsX2hlYWx0aF9jb25kaXRpb25fcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KEdlbmRlciwgTWVudGFsX0hlYWx0aF9Db25kaXRpb24pICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoR2VuZGVyLCBNZW50YWxfSGVhbHRoX0NvbmRpdGlvbikNCnByaW50KG1lbnRhbF9oZWFsdGhfY29uZGl0aW9uX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChtZW50YWxfaGVhbHRoX2NvbmRpdGlvbl9wZXJjZW50YWdlcywgYWVzKHggPSBHZW5kZXIsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gTWVudGFsX0hlYWx0aF9Db25kaXRpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIERpZmZlcmVudCBNZW50YWwgSGVhbHRoIENvbmRpdGlvbiBieSBHZW5kZXIiLA0KICAgICAgIHggPSAiR2VuZGVyIiwNCiAgICAgICB5ID0gIk1lbnRhbCBIZWFsdGggQ29uZGl0aW9uIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCmpvYl9yb2xlX2J5X2dlbmRlcl9zdW1tYXJ5IDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShHZW5kZXIsIEpvYl9Sb2xlKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgYXJyYW5nZShHZW5kZXIsIEpvYl9Sb2xlKQ0KcHJpbnQoam9iX3JvbGVfYnlfZ2VuZGVyX3N1bW1hcnkpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGpvYl9yb2xlX2J5X2dlbmRlcl9zdW1tYXJ5LCBhZXMoeCA9IEdlbmRlciwgeSA9IENvdW50LCBmaWxsID0gSm9iX1JvbGUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgRGlmZmVyZW50IEpvYiBSb2xlcyBieSBHZW5kZXIiLA0KICAgICAgIHggPSAiR2VuZGVyIiwNCiAgICAgICB5ID0gIkpvYiBSb2xlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCnByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFN0cmVzc19MZXZlbCwgUHJvZHVjdGl2aXR5X0NoYW5nZSkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIG11dGF0ZShQZXJjZW50YWdlID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwKSAlPiUNCiAgICAgYXJyYW5nZShTdHJlc3NfTGV2ZWwsIFByb2R1Y3Rpdml0eV9DaGFuZ2UpDQpwcmludChwcm9kdWN0aXZpdHlfY2hhbmdlX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChwcm9kdWN0aXZpdHlfY2hhbmdlX3BlcmNlbnRhZ2VzLCBhZXMoeCA9IFN0cmVzc19MZXZlbCwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBQcm9kdWN0aXZpdHlfQ2hhbmdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUHJvZHVjdGl2aXR5IENoYW5nZSBkdWUgdG8gU3RyZXNzIExldmVsIiwNCiAgICAgICB4ID0gIlN0cmVzcyBMZXZlbCIsDQogICAgICAgeSA9ICJQcm9kdWN0aXZpdHkgQ2hhbmdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCnByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFNsZWVwX1F1YWxpdHksIFByb2R1Y3Rpdml0eV9DaGFuZ2UpICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoU2xlZXBfUXVhbGl0eSwgUHJvZHVjdGl2aXR5X0NoYW5nZSkNCnByaW50KHByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMsIGFlcyh4ID0gU2xlZXBfUXVhbGl0eSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBQcm9kdWN0aXZpdHlfQ2hhbmdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUHJvZHVjdGl2aXR5IENoYW5nZSBhY2NvcmRpbmcgdG8gU2xlZXAgUXVhbGl0eSIsDQogICAgICAgeCA9ICJTbGVlcCBRdWFsaXR5IiwNCiAgICAgICB5ID0gIlByb2R1Y3Rpdml0eSBDaGFuZ2UiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgYSBjb250aW5nZW5jeSB0YWJsZQ0KY29udGluZ2VuY3lfdGFibGUgPC0gdGFibGUocHJvZHVjdGl2aXR5X2NoYW5nZV9wZXJjZW50YWdlcyRTbGVlcF9RdWFsaXR5LCBwcm9kdWN0aXZpdHlfY2hhbmdlX3BlcmNlbnRhZ2VzJFByb2R1Y3Rpdml0eV9DaGFuZ2UpDQoNCmZpc2hlcl90ZXN0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKQ0KIyBWaWV3IHRoZSByZXN1bHRzDQpwcmludChmaXNoZXJfdGVzdCkNCg0KYGBgDQpgYGB7cn0NCnNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrX3BlcmNlbnRhZ2VzIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShKb2JfUm9sZSwgU2F0aXNmYWN0aW9uX3dpdGhfUmVtb3RlX1dvcmspICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoSm9iX1JvbGUsIFNhdGlzZmFjdGlvbl93aXRoX1JlbW90ZV9Xb3JrKQ0KcHJpbnQoc2F0aXNmYWN0aW9uX3dpdGhfcmVtb3RlX3dvcmtfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrX3BlcmNlbnRhZ2VzLCBhZXMoeCA9IEpvYl9Sb2xlLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFNhdGlzZmFjdGlvbl93aXRoX1JlbW90ZV9Xb3JrKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiU2F0aXNmYWN0aW9uIHdpdGggUmVtb3RlIFdvcmsgYnkgSm9iIFJvbGUiLA0KICAgICAgIHggPSAiSm9iIFJvbGUiLA0KICAgICAgIHkgPSAiU2F0aXNmYWN0aW9uIExldmVsIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChzYXRpc2ZhY3Rpb25fd2l0aF9yZW1vdGVfd29ya19wZXJjZW50YWdlcywgYWVzKHggPSBKb2JfUm9sZSwgeSA9IENvdW50LCBmaWxsID0gU2F0aXNmYWN0aW9uX3dpdGhfUmVtb3RlX1dvcmspKSArDQogIGdlb21fdmlvbGluKHRyaW0gPSBGQUxTRSkgKyAgIyBDcmVhdGVzIHRoZSB2aW9saW4gcGxvdA0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGEgPSAwLjUpICsgIyBBZGRzIGEgYm94cGxvdCBpbnNpZGUgdGhlIHZpb2xpbg0KICBsYWJzKA0KICAgIHRpdGxlID0gInNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrIiwNCiAgICB4ID0gIkpvYiBSb2xlIiwNCiAgICB5ID0gIlNhdGlzZmFjdGlvbl93aXRoX1JlbW90ZV9Xb3JrIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAgIyBSb3RhdGVzIHgtYXhpcyBsYWJlbHMgZm9yIGJldHRlciByZWFkYWJpbGl0eQ0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKQ0KDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgYSBkYXRhIGZyYW1lIHdpdGggdGhlIHByb3ZpZGVkIGRhdGENCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgUHJvZmVzc2lvbiA9IGMoIkRhdGEgU2NpZW50aXN0IiwgIkRlc2lnbmVyIiwgIkhSIiwgIk1hcmtldGluZyIsIA0KICAgICAgICAgICAgICAgICAiUHJvamVjdCBNYW5hZ2VyIiwgIlNhbGVzIiwgIlNvZnR3YXJlIEVuZ2luZWVyIiksDQogIEF2Z19Ib3Vyc19Xb3JrZWQgPSBjKDM4Ljk1NDAyLCAzOC44ODEwNSwgMzkuNjYwNjEsIDM5LjczNDk5LCANCiAgICAgICAgICAgICAgICAgICAgICAgMzkuOTIyNzYsIDM5Ljg2MDg1LCA0MC4yNzE0NSksDQogIFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZyA9IGMoMy4wMDcxODQsIDIuOTY2ODA1LCAyLjkzMDE2OCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45NDU4MjcsIDIuOTYwNzA1LCAzLjA0MzY1NiwgMy4wMzM3NTUpDQopDQoNCiMgQ2FsY3VsYXRlIHRoZSBQZWFyc29uIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gQXZnX0hvdXJzX1dvcmtlZCBhbmQgV29ya19MaWZlX0JhbGFuY2VfUmF0aW5nDQpjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRBdmdfSG91cnNfV29ya2VkLCBkYXRhJFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZykNCnByaW50KHBhc3RlKCJDb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIGF2ZXJhZ2UgaG91cnMgd29ya2VkIGFuZCB3b3JrLWxpZmUgYmFsYW5jZSByYXRpbmc6Iiwgcm91bmQoY29ycmVsYXRpb24sIDQpKSkNCg0KIyBPcHRpb25hbDogVmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXAgd2l0aCBhIHNjYXR0ZXIgcGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQXZnX0hvdXJzX1dvcmtlZCwgeSA9IFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZywgbGFiZWwgPSBQcm9mZXNzaW9uKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3RleHQodmp1c3QgPSAtMC41LCBoanVzdCA9IDAuNSkgKyAgIyBBZGRzIHByb2Zlc3Npb24gbGFiZWxzIG5lYXIgcG9pbnRzDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUmVsYXRpb25zaGlwIEJldHdlZW4gQXZlcmFnZSBIb3VycyBXb3JrZWQgYW5kIFdvcmstTGlmZSBCYWxhbmNlIFJhdGluZyIsDQogICAgeCA9ICJBdmVyYWdlIEhvdXJzIFdvcmtlZCIsDQogICAgeSA9ICJXb3JrLUxpZmUgQmFsYW5jZSBSYXRpbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KYGBge3J9DQpqb2Jfcm9sZV9ieV9pbmR1c3RyeV9zdW1tYXJ5IDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShJbmR1c3RyeSwgSm9iX1JvbGUpICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBhcnJhbmdlKEluZHVzdHJ5LCBKb2JfUm9sZSkNCnByaW50KGpvYl9yb2xlX2J5X2luZHVzdHJ5X3N1bW1hcnkpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGpvYl9yb2xlX2J5X2luZHVzdHJ5X3N1bW1hcnksIGFlcyh4ID0gSW5kdXN0cnksIHkgPSBDb3VudCwgZmlsbCA9IEpvYl9Sb2xlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIERpZmZlcmVudCBKb2IgUm9sZXMgYnkgSW5kdXN0cnkiLA0KICAgICAgIHggPSAiSW5kdXN0cnkiLA0KICAgICAgIHkgPSAiSm9iIFJvbGUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KYWNtaF9ieV9pbmR1c3RyeV9zdW1tYXJ5IDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShJbmR1c3RyeSwgQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgYXJyYW5nZShJbmR1c3RyeSwgQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKQ0KcHJpbnQoYWNtaF9ieV9pbmR1c3RyeV9zdW1tYXJ5KQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGFjbWhfYnlfaW5kdXN0cnlfc3VtbWFyeSwgYWVzKHggPSBJbmR1c3RyeSwgeSA9IENvdW50LCBmaWxsID0gQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiQWNjZXNzIHRvIE1lbnRhbCBIZWFsdGggYnkgSW5kdXN0cnkiLA0KICAgICAgIHggPSAiSW5kdXN0cnkiLA0KICAgICAgIHkgPSAiQWNjZXNzIHRvIE1lbnRhbCBIZWFsdGgiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KElSV01ILCBhZXMoeCA9IEpvYl9Sb2xlLCB5ID0gQWdlLCBmaWxsID0gSm9iX1JvbGUpKSArDQogIGdlb21fdmlvbGluKHRyaW0gPSBGQUxTRSkgKyAgIyBDcmVhdGVzIHRoZSB2aW9saW4gcGxvdA0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGEgPSAwLjUpICsgIyBBZGRzIGEgYm94cGxvdCBpbnNpZGUgdGhlIHZpb2xpbg0KICBsYWJzKA0KICAgIHRpdGxlID0gIkFnZSBEaXN0cmlidXRpb24gYnkgSm9iIFJvbGUiLA0KICAgIHggPSAiSm9iIFJvbGUiLA0KICAgIHkgPSAiQWdlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAgIyBSb3RhdGVzIHgtYXhpcyBsYWJlbHMgZm9yIGJldHRlciByZWFkYWJpbGl0eQ0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSAgIyBPcHRpb25hbDogY3VzdG9taXplIHRoZSBjb2xvciBwYWxldHRlDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9hZ2VfYnlfam9iIDwtIElSV01IICU+JQ0KICBncm91cF9ieShKb2JfUm9sZSkgJT4lDQogIHN1bW1hcmlzZShBdmVyYWdlX0FnZSA9IG1lYW4oQWdlLCBuYS5ybSA9IFRSVUUpKSAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gYWdlDQoNCiMgRGlzcGxheSB0aGUgcmVzdWx0cw0KcHJpbnQoYXZlcmFnZV9hZ2VfYnlfam9iKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChJUldNSCwgYWVzKHggPSBKb2JfUm9sZSwgeSA9IFllYXJzX29mX0V4cGVyaWVuY2UsIGZpbGwgPSBKb2JfUm9sZSkpICsNCiAgZ2VvbV92aW9saW4odHJpbSA9IEZBTFNFKSArICAjIENyZWF0ZXMgdGhlIHZpb2xpbiBwbG90DQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BLCBhbHBoYSA9IDAuNSkgKyAjIEFkZHMgYSBib3hwbG90IGluc2lkZSB0aGUgdmlvbGluDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRXhwZXJpZW5jZSBEaXN0cmlidXRpb24gYnkgSm9iIFJvbGUiLA0KICAgIHggPSAiSm9iIFJvbGUiLA0KICAgIHkgPSAiWWVhcnMgb2YgRXhwZXJpZW5jZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsgICMgUm90YXRlcyB4LWF4aXMgbGFiZWxzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgICMgT3B0aW9uYWw6IGN1c3RvbWl6ZSB0aGUgY29sb3IgcGFsZXR0ZQ0KYGBgDQpgYGB7cn0NCklSV01IJFN0cmVzc19MZXZlbCA8LSBmYWN0b3IoSVJXTUgkU3RyZXNzX0xldmVsLCBvcmRlcmVkID0gVFJVRSwgbGV2ZWxzID0gYygiTG93IiwgIk1lZGl1bSIsICJIaWdoIikpDQoNCiMgUmVtb3ZlIHJvd3Mgd2l0aCBtaXNzaW5nIHZhbHVlcw0KZGF0YV9jbGVhbiA8LSBJUldNSCAlPiUNCiAgZmlsdGVyKCFpcy5uYShTdHJlc3NfTGV2ZWwpLCAhaXMubmEoSG91cnNfV29ya2VkX1Blcl9XZWVrKSkNCg0KIyBQZXJmb3JtIG9yZGluYWwgbG9naXN0aWMgcmVncmVzc2lvbg0KbW9kZWxfc3RyZXNzX29yZGluYWwgPC0gcG9scihTdHJlc3NfTGV2ZWwgfiBIb3Vyc19Xb3JrZWRfUGVyX1dlZWssIGRhdGEgPSBkYXRhX2NsZWFuLCBtZXRob2QgPSAibG9naXN0aWMiKQ0KDQojIFZpZXcgdGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsX3N0cmVzc19vcmRpbmFsKQ0KDQpgYGANCmBgYHtyfQ0KDQpJUldNSCA8LSByZWFkLmNzdigiRDovUiBjb3Vyc2UvUHJhY3RpY2luZy9NZW50YWwgaGVhbHRoIHZzIHJlbW90ZSB3b3JrL0lSV01ILmNzdiIpDQoNCmBgYA0KDQpgYGB7cn0NCm1vZGVsIDwtIGxtKE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzIH4gSG91cnNfV29ya2VkX1Blcl9XZWVrLCBkYXRhID0gSVJXTUgpDQoNCiMgQ2hlY2sgdGhlIG1vZGVsIHN1bW1hcnkNCnN1bW1hcnkobW9kZWwpDQoNCiMgUGxvdCB3aXRoIHJlZ3Jlc3Npb24gbGluZQ0KcGxvdChJUldNSCRIb3Vyc19Xb3JrZWRfUGVyX1dlZWssIElSV01IJE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLA0KICAgICBtYWluID0gIlJlZ3Jlc3Npb24gQW5hbHlzaXMiLA0KICAgICB4bGFiID0gIkhvdXJzIFdvcmtlZCBQZXIgV2VlayIsDQogICAgIHlsYWIgPSAiTnVtYmVyIG9mIFZpcnR1YWwgTWVldGluZ3MiLA0KICAgICBwY2ggPSAxOSwgY29sID0gImJsdWUiKQ0KYWJsaW5lKG1vZGVsLCBjb2wgPSAicmVkIiwgbHdkID0gMikNCg0KIyBBZGQgdGhlIHJlZ3Jlc3Npb24gbGluZQ0KYWJsaW5lKG1vZGVsLCBjb2wgPSAicmVkIiwgbHdkID0gMikNCg0KYGBgDQpgYGB7cn0NCnN0cmVzc19sZXZlbF9ieV93b3JrX2xvY2F0aW9uX3N1bW1hcnkgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFdvcmtfTG9jYXRpb24sIFN0cmVzc19MZXZlbCkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIGFycmFuZ2UoV29ya19Mb2NhdGlvbiwgU3RyZXNzX0xldmVsKQ0KcHJpbnQoc3RyZXNzX2xldmVsX2J5X3dvcmtfbG9jYXRpb25fc3VtbWFyeSkNCmBgYA0KYGBge3J9DQpnZ3Bsb3Qoc3RyZXNzX2xldmVsX2J5X3dvcmtfbG9jYXRpb25fc3VtbWFyeSwgYWVzKHggPSBXb3JrX0xvY2F0aW9uLCB5ID0gQ291bnQsIGZpbGwgPSBTdHJlc3NfTGV2ZWwpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJTdHJlc3MgTGV2ZWwgYnkgSm9iIExvY2F0aW9uIiwNCiAgICAgICB4ID0gIldvcmsgTG9jYXRpb24iLA0KICAgICAgIHkgPSAiU3RyZXNzIExldmVsIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCmNzX2J5X2luZHVzdHJ5X3N1bW1hcnkgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KEluZHVzdHJ5LCBDb21wYW55X1N1cHBvcnRfZm9yX1JlbW90ZV9Xb3JrKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgYXJyYW5nZShJbmR1c3RyeSwgQ29tcGFueV9TdXBwb3J0X2Zvcl9SZW1vdGVfV29yaykNCnByaW50KGNzX2J5X2luZHVzdHJ5X3N1bW1hcnkpDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9jc19ieV9pbmR1c3RyeSA8LSBJUldNSCAlPiUNCiAgZ3JvdXBfYnkoSW5kdXN0cnkpICU+JQ0KICBzdW1tYXJpc2UoQXZlcmFnZV9DUyA9IG1lYW4oQ29tcGFueV9TdXBwb3J0X2Zvcl9SZW1vdGVfV29yaywgbmEucm0gPSBUUlVFKSkgIA0KDQojIERpc3BsYXkgdGhlIHJlc3VsdHMNCnByaW50KGF2ZXJhZ2VfY3NfYnlfaW5kdXN0cnkpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KElSV01ILCBhZXMoeCA9IEluZHVzdHJ5LCB5ID0gQ29tcGFueV9TdXBwb3J0X2Zvcl9SZW1vdGVfV29yaywgZmlsbCA9IEluZHVzdHJ5KSkgKw0KICBnZW9tX3Zpb2xpbih0cmltID0gRkFMU0UpICsgICMgQ3JlYXRlcyB0aGUgdmlvbGluIHBsb3QNCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41KSArICMgQWRkcyBhIGJveHBsb3QgaW5zaWRlIHRoZSB2aW9saW4NCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb21wYW55IFN1cHBvcnQgZm9yIFJlbW90ZSBXb3JrIGJ5IEluZHVzdHJ5IiwNCiAgICB4ID0gIkluZHVzdHJ5IiwNCiAgICB5ID0gIkNvbXBhbnkgU3VwcG9ydCBSYXRpbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArICAjIFJvdGF0ZXMgeC1heGlzIGxhYmVscyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5DQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9jc3JfYnlfcmVnaW9uIDwtIElSV01IICU+JQ0KICBncm91cF9ieShSZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoQXZlcmFnZV9DU1IgPSBtZWFuKENvbXBhbnlfU3VwcG9ydF9mb3JfUmVtb3RlX1dvcmssIG5hLnJtID0gVFJVRSkpICANCg0KIyBEaXNwbGF5IHRoZSByZXN1bHRzDQpwcmludChhdmVyYWdlX2Nzcl9ieV9yZWdpb24pDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9zaXJfYnlfcmVnaW9uIDwtIElSV01IICU+JQ0KICBncm91cF9ieShSZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoQXZlcmFnZV9TSVIgPSBtZWFuKFNvY2lhbF9Jc29sYXRpb25fUmF0aW5nLCBuYS5ybSA9IFRSVUUpKSAgDQoNCiMgRGlzcGxheSB0aGUgcmVzdWx0cw0KcHJpbnQoYXZlcmFnZV9zaXJfYnlfcmVnaW9uKQ0KYGBgDQpgYGB7cn0NCiMgRGF0YTogQXZlcmFnZSBDb21wYW55IFN1cHBvcnQgUmF0aW5nIGJ5IFJlZ2lvbg0KY29tcGFueV9zdXBwb3J0IDwtIGMoMy4wMTA0NjUsIDIuOTY1MDE4LCAyLjk2NDI4NiwgMy4wMzczMjMsIDMuMDU1MzYzLCAzLjAxNDUxMCkNCg0KIyBEYXRhOiBBdmVyYWdlIFNvY2lhbCBJc29sYXRpb24gUmF0aW5nIGJ5IFJlZ2lvbg0Kc29jaWFsX2lzb2xhdGlvbiA8LSBjKDIuOTg3MjA5LCAyLjk4MDcwMCwgMi45MzY5MDUsIDMuMDExNTgzLCAzLjA2NTc0NCwgMi45Nzk0NDQpDQoNCiMgRGF0YTogUmVnaW9uIE5hbWVzDQpyZWdpb25zIDwtIGMoIkFmcmljYSIsICJBc2lhIiwgIkV1cm9wZSIsICJOb3J0aCBBbWVyaWNhIiwgIk9jZWFuaWEiLCAiU291dGggQW1lcmljYSIpDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZQ0KZGF0YSA8LSBkYXRhLmZyYW1lKFJlZ2lvbiA9IHJlZ2lvbnMsIENvbXBhbnlfU3VwcG9ydCA9IGNvbXBhbnlfc3VwcG9ydCwgU29jaWFsX0lzb2xhdGlvbiA9IHNvY2lhbF9pc29sYXRpb24pDQojIFBlcmZvcm0gbGluZWFyIHJlZ3Jlc3Npb24NCm1vZGVsIDwtIGxtKFNvY2lhbF9Jc29sYXRpb24gfiBDb21wYW55X1N1cHBvcnQsIGRhdGEgPSBkYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIHJlZ3Jlc3Npb24gbW9kZWwNCnN1bW1hcnkobW9kZWwpDQpgYGANCmBgYHtyfQ0KIyBQbG90dGluZyB0aGUgZGF0YSBwb2ludHMNCnBsb3QoZGF0YSRDb21wYW55X1N1cHBvcnQsIGRhdGEkU29jaWFsX0lzb2xhdGlvbiwgDQogICAgIG1haW4gPSAiUmVncmVzc2lvbiBvZiBTb2NpYWwgSXNvbGF0aW9uIG9uIENvbXBhbnkgU3VwcG9ydCIsDQogICAgIHhsYWIgPSAiQXZlcmFnZSBDb21wYW55IFN1cHBvcnQgUmF0aW5nIiwgDQogICAgIHlsYWIgPSAiQXZlcmFnZSBTb2NpYWwgSXNvbGF0aW9uIFJhdGluZyIsIA0KICAgICBwY2ggPSAxOSwgY29sID0gImJsdWUiKQ0KDQojIEFkZCByZWdyZXNzaW9uIGxpbmUNCmFibGluZShtb2RlbCwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANCg0K