Important Notes
- Children dataset contains ONLY children aged 0-6
years
- All analyses use proper population weights
(coefin/10,000)
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
library(scales)
# Update these paths to your local file locations
data_adult <- read.csv("C:/Users/satya/OneDrive - Politecnico di Milano/Joint Folder - Pekerti & Fratesi/cardiff_periodabroad/cardiff_project/analysis/data/avq2023_sub_adult.csv")
data_children <- read.csv("C:/Users/satya/OneDrive - Politecnico di Milano/Joint Folder - Pekerti & Fratesi/cardiff_periodabroad/cardiff_project/analysis/data/avq2023_sub_children.csv")
data_hh <- read.csv("C:/Users/satya/OneDrive - Politecnico di Milano/Joint Folder - Pekerti & Fratesi/cardiff_periodabroad/cardiff_project/analysis/data/avq2023_sub_hh.csv")
# Create weights (divide coefin by 10,000)
data_adult$weight <- data_adult$coefin / 10000
data_children$weight <- data_children$coefin / 10000
cat("Adult dataset dimensions:", dim(data_adult), "\n")
Adult dataset dimensions: 36844 127
cat("Children dataset dimensions:", dim(data_children), "\n")
Children dataset dimensions: 1925 24
cat("Household dataset dimensions:", dim(data_hh), "\n\n")
Household dataset dimensions: 18565 7
cat("Weighted populations:\n")
Weighted populations:
cat("Adults (15+):", format(sum(data_adult$weight), big.mark=","), "\n")
Adults (15+): 51,121,050
cat("Children (0-6):", format(sum(data_children$weight), big.mark=","), "\n")
Children (0-6): 3,006,816
# Region names mapping
region_names <- c(
'10' = "Piemonte", '20' = "Valle d'Aosta", '30' = "Liguria",
'41' = "Lombardia", '42' = "Provincia Autonoma Bolzano/Bozen",
'50' = "Provincia Autonoma Trento", '60' = "Veneto", '70' = "Friuli-Venezia Giulia",
'80' = "Emilia-Romagna", '90' = "Toscana", '100' = "Umbria",
'110' = "Marche", '120' = "Lazio", '130' = "Abruzzo",
'140' = "Molise", '150' = "Campania", '160' = "Puglia",
'170' = "Basilicata", '180' = "Calabria", '190' = "Sicilia", '200' = "Sardegna"
)
# Ripartizione mapping
rip_names <- c(
'1' = "Nord-Ovest", '2' = "Nord-Est", '3' = "Centro",
'4' = "Sud", '5' = "Isole"
)
# Add to adult data
data_adult <- data_adult %>%
mutate(
region_name = region_names[as.character(reg)],
rip_name = rip_names[as.character(rip)]
)
Data Description
This analysis uses the AVQ (Aspetti della Vita Quotidiana)
2023 survey data from ISTAT with proper population
weights (coefin variable divided by 10,000).
Dataset Overview
- Adult dataset: 36,844 individuals aged 15+
(weighted population: 51.1 million)
- Household dataset: 18,565 households (weighted:
26.2 million households)
- Children dataset: 1,925 children aged 0-6
years only (weighted population: 3.0
million)
Important Note: The children dataset contains
only children aged 0-6 years, not all children aged
0-14. This is specifically focused on the pre-school age range.
Geographic Coverage: - National level (Italy) -
Regional breakdown: 21 regions - Macro-area classification
(Ripartizioni): - Nord-Ovest (Northwest) - Nord-Est (Northeast) - Centro
(Center) - Sud (South) - Isole (Islands)
Weighting: All results use the ISTAT survey weights
(coefin/10,000) to provide population-representative estimates.
1. Family Size Distribution (Weighted)
# Get household weights (from household head)
household_weights <- data_adult %>%
filter(demo_relpar == 1) %>%
select(hhid, weight, reg, rip)
# Count family size
family_size <- data_adult %>%
group_by(hhid) %>%
summarise(family_size = n()) %>%
left_join(household_weights, by = "hhid")
total_households <- sum(family_size$weight, na.rm = TRUE)
cat("=== ITALY ===\n")
=== ITALY ===
cat("Total weighted households:", format(total_households, big.mark=","), "\n\n")
Total weighted households: 26,201,432
# Weighted distribution
family_size_dist <- family_size %>%
group_by(family_size) %>%
summarise(
households = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(percentage = households / total_households * 100)
print(family_size_dist)
# Weighted average
weighted_avg <- sum(family_size$family_size * family_size$weight, na.rm = TRUE) /
sum(family_size$weight, na.rm = TRUE)
cat("\nWeighted average family size:", round(weighted_avg, 2), "\n")
Weighted average family size: 1.95
# Lombardy
cat("\n=== LOMBARDY ===\n")
=== LOMBARDY ===
lombardy_families <- family_size %>% filter(reg == 41)
total_lom <- sum(lombardy_families$weight, na.rm = TRUE)
cat("Total weighted households:", format(total_lom, big.mark=","), "\n\n")
Total weighted households: 230,150
lom_dist <- lombardy_families %>%
group_by(family_size) %>%
summarise(
households = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(percentage = households / total_lom * 100)
print(lom_dist)
weighted_avg_lom <- sum(lombardy_families$family_size * lombardy_families$weight, na.rm = TRUE) /
sum(lombardy_families$weight, na.rm = TRUE)
cat("\nWeighted average family size:", round(weighted_avg_lom, 2), "\n")
Weighted average family size: 1.94
Visualization
# Italy
p1 <- ggplot(family_size_dist, aes(x = factor(family_size), y = households/1e6)) +
geom_col(fill = "steelblue") +
geom_text(aes(label = sprintf("%.2fM", households/1e6)), vjust = -0.5, size = 3) +
labs(title = "Family Size Distribution - Italy (Weighted)",
x = "Family Size (members)", y = "Households (millions)") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
# Lombardy
p2 <- ggplot(lom_dist, aes(x = factor(family_size), y = households/1e3)) +
geom_col(fill = "coral") +
geom_text(aes(label = sprintf("%.0fK", households/1e3)), vjust = -0.5, size = 3) +
labs(title = "Family Size Distribution - Lombardy (Weighted)",
x = "Family Size (members)", y = "Households (thousands)") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
gridExtra::grid.arrange(p1, p2, ncol = 2)

2. North vs South Comparison (Weighted)
# Add macro area
family_size <- family_size %>%
mutate(macro_area = case_when(
rip %in% c(1, 2) ~ "North",
rip == 3 ~ "Center",
rip %in% c(4, 5) ~ "South"
))
# Macro area statistics
macro_stats <- family_size %>%
filter(!is.na(macro_area)) %>%
group_by(macro_area) %>%
summarise(
avg_size = sum(family_size * weight, na.rm = TRUE) / sum(weight, na.rm = TRUE),
households = sum(weight, na.rm = TRUE),
.groups = "drop"
)
cat("=== Macro Area Comparison ===\n")
=== Macro Area Comparison ===
print(macro_stats)
# By ripartizione
rip_stats <- family_size %>%
filter(!is.na(rip)) %>%
group_by(rip) %>%
summarise(
avg_size = sum(family_size * weight, na.rm = TRUE) / sum(weight, na.rm = TRUE),
households = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(rip_name = rip_names[as.character(rip)])
cat("\n=== By Ripartizione ===\n")
=== By Ripartizione ===
print(rip_stats)
Visualization
ggplot(rip_stats, aes(x = reorder(rip_name, -avg_size), y = avg_size)) +
geom_col(aes(fill = rip_name)) +
geom_hline(yintercept = weighted_avg, linetype = "dashed", color = "black") +
geom_text(aes(label = sprintf("%.2f", avg_size)), vjust = -0.5, fontface = "bold") +
annotate("text", x = 5, y = weighted_avg + 0.05, label = "National Average", size = 3) +
labs(title = "Average Family Size by Ripartizione (Weighted)",
x = "", y = "Average Family Size (members)") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 15, hjust = 1))

3. Female Employment Rate (Weighted)
# Working-age females (15-64)
working_age_females <- data_adult %>%
filter(demo_female == 1, demo_age >= 15, demo_age <= 64)
total_females <- sum(working_age_females$weight, na.rm = TRUE)
employed_females <- sum(working_age_females$weight[working_age_females$demo_empl == 1], na.rm = TRUE)
emp_rate_italy <- employed_females / total_females * 100
cat("=== ITALY ===\n")
=== ITALY ===
cat("Employment Rate:", round(emp_rate_italy, 2), "%\n")
Employment Rate: 51.14 %
cat("Employed females:", format(employed_females, big.mark=","), "\n")
Employed females: 9,472,721
cat("Working-age females:", format(total_females, big.mark=","), "\n")
Working-age females: 18,523,550
# Lombardy
lom_females <- working_age_females %>% filter(reg == 41)
total_lom_fem <- sum(lom_females$weight, na.rm = TRUE)
employed_lom <- sum(lom_females$weight[lom_females$demo_empl == 1], na.rm = TRUE)
emp_rate_lom <- employed_lom / total_lom_fem * 100
cat("\n=== LOMBARDY ===\n")
=== LOMBARDY ===
cat("Employment Rate:", round(emp_rate_lom, 2), "%\n")
Employment Rate: 66.62 %
cat("Employed females:", format(employed_lom, big.mark=","), "\n")
Employed females: 112,350.4
cat("Working-age females:", format(total_lom_fem, big.mark=","), "\n")
Working-age females: 168,637.8
# By Ripartizione
emp_by_rip <- working_age_females %>%
group_by(rip) %>%
summarise(
employed = sum(weight[demo_empl == 1], na.rm = TRUE),
total = sum(weight, na.rm = TRUE),
rate = employed / total * 100,
.groups = "drop"
) %>%
mutate(rip_name = rip_names[as.character(rip)])
cat("\n=== By Ripartizione ===\n")
=== By Ripartizione ===
print(emp_by_rip)
Visualization
ggplot(emp_by_rip, aes(x = reorder(rip_name, -rate), y = rate)) +
geom_col(aes(fill = rip_name)) +
geom_hline(yintercept = emp_rate_italy, linetype = "dashed", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", rate)), vjust = -0.5, fontface = "bold") +
annotate("text", x = 5, y = emp_rate_italy + 2, label = "National Average", size = 3) +
labs(title = "Female Employment Rate (15-64) by Ripartizione (Weighted)",
x = "", y = "Employment Rate (%)") +
ylim(0, 70) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 15, hjust = 1))

4. Distribution of Children per Family (Weighted)
Note: Children dataset contains only ages 0-6
# Household info
household_info <- data_adult %>%
filter(demo_relpar == 1) %>%
select(hhid, weight, reg, rip)
# Count children per family
children_per_family <- data_children %>%
group_by(profam) %>%
summarise(
n_children = n(),
coefin = first(coefin),
.groups = "drop"
) %>%
mutate(weight = coefin / 10000) %>%
rename(hhid = profam) %>%
left_join(
data_adult %>% filter(demo_relpar == 1) %>%
select(hhid, reg, rip) %>% distinct(),
by = "hhid"
)
total_fam_children <- sum(children_per_family$weight, na.rm = TRUE)
cat("=== ITALY - Families with Children (0-6) ===\n")
=== ITALY - Families with Children (0-6) ===
cat("Total families:", format(total_fam_children, big.mark=","), "\n\n")
Total families: 2,397,253
children_dist <- children_per_family %>%
group_by(n_children) %>%
summarise(
families = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(percentage = families / total_fam_children * 100)
print(children_dist)
weighted_avg_children <- sum(children_per_family$n_children * children_per_family$weight, na.rm = TRUE) /
sum(children_per_family$weight, na.rm = TRUE)
cat("\nWeighted average:", round(weighted_avg_children, 2), "children per family\n")
Weighted average: 1.25 children per family
# Lombardy
lom_children_fam <- children_per_family %>% filter(reg == 41)
total_lom_fam <- sum(lom_children_fam$weight, na.rm = TRUE)
cat("\n=== LOMBARDY - Families with Children (0-6) ===\n")
=== LOMBARDY - Families with Children (0-6) ===
cat("Total families:", format(total_lom_fam, big.mark=","), "\n\n")
Total families: 27,147.6
lom_children_dist <- lom_children_fam %>%
group_by(n_children) %>%
summarise(
families = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(percentage = families / total_lom_fam * 100)
print(lom_children_dist)
weighted_avg_lom_child <- sum(lom_children_fam$n_children * lom_children_fam$weight, na.rm = TRUE) /
sum(lom_children_fam$weight, na.rm = TRUE)
cat("\nWeighted average:", round(weighted_avg_lom_child, 2), "children per family\n")
Weighted average: 1.33 children per family
# All families (including those without children 0-6)
all_families <- household_info %>%
left_join(children_per_family %>% select(hhid, n_children), by = "hhid") %>%
mutate(n_children = ifelse(is.na(n_children), 0, n_children))
total_all_fam <- sum(all_families$weight, na.rm = TRUE)
cat("\n=== ALL FAMILIES (including without children 0-6) ===\n")
=== ALL FAMILIES (including without children 0-6) ===
cat("Total families:", format(total_all_fam, big.mark=","), "\n\n")
Total families: 26,201,432
all_children_dist <- all_families %>%
group_by(n_children) %>%
summarise(
families = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(percentage = families / total_all_fam * 100)
print(head(all_children_dist, 6))
Visualization
p1 <- ggplot(children_dist, aes(x = factor(n_children), y = families/1e3)) +
geom_col(fill = "steelblue") +
geom_text(aes(label = sprintf("%.0fK", families/1e3)), vjust = -0.5, size = 3) +
labs(title = "Children per Family - Among Families with Children (Weighted)",
x = "Number of Children (0-6)", y = "Families (thousands)") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
p2 <- ggplot(head(all_children_dist, 5), aes(x = factor(n_children), y = families/1e6)) +
geom_col(fill = "coral") +
geom_text(aes(label = sprintf("%.2fM", families/1e6)), vjust = -0.5, size = 3) +
labs(title = "Children per Family - All Families (Weighted)",
x = "Number of Children (0-6)", y = "Families (millions)") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
gridExtra::grid.arrange(p1, p2, ncol = 2)

5. Working Mothers (Weighted)
# Employed females aged 15-64
employed_females_data <- data_adult %>%
filter(demo_female == 1, demo_empl == 1, demo_age >= 15, demo_age <= 64)
total_emp_women <- sum(employed_females_data$weight, na.rm = TRUE)
working_mothers <- sum(employed_females_data$weight[employed_females_data$demo_mother == 1], na.rm = TRUE)
mothers_share_italy <- working_mothers / total_emp_women * 100
cat("=== ITALY ===\n")
=== ITALY ===
cat("Total employed women:", format(total_emp_women, big.mark=","), "\n")
Total employed women: 9,472,721
cat("Working mothers:", format(working_mothers, big.mark=","), "\n")
Working mothers: 6,337,612
cat("Share:", round(mothers_share_italy, 2), "%\n")
Share: 66.9 %
# Lombardy
lom_emp <- employed_females_data %>% filter(reg == 41)
total_lom_emp <- sum(lom_emp$weight, na.rm = TRUE)
lom_mothers <- sum(lom_emp$weight[lom_emp$demo_mother == 1], na.rm = TRUE)
mothers_share_lom <- lom_mothers / total_lom_emp * 100
cat("\n=== LOMBARDY ===\n")
=== LOMBARDY ===
cat("Total employed women:", format(total_lom_emp, big.mark=","), "\n")
Total employed women: 112,350.4
cat("Working mothers:", format(lom_mothers, big.mark=","), "\n")
Working mothers: 74,324.23
cat("Share:", round(mothers_share_lom, 2), "%\n")
Share: 66.15 %
# By Ripartizione
mothers_by_rip <- employed_females_data %>%
group_by(rip) %>%
summarise(
working_mothers = sum(weight[demo_mother == 1], na.rm = TRUE),
total_employed = sum(weight, na.rm = TRUE),
share = working_mothers / total_employed * 100,
.groups = "drop"
) %>%
mutate(rip_name = rip_names[as.character(rip)])
cat("\n=== By Ripartizione ===\n")
=== By Ripartizione ===
print(mothers_by_rip)
Visualization
ggplot(mothers_by_rip, aes(x = reorder(rip_name, -share), y = share)) +
geom_col(aes(fill = rip_name)) +
geom_hline(yintercept = mothers_share_italy, linetype = "dashed", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", share)), vjust = -0.5, fontface = "bold") +
annotate("text", x = 5, y = mothers_share_italy + 1.5, label = "National Average", size = 3) +
labs(title = "Working Mothers Among Employed Women by Ripartizione (Weighted)",
x = "", y = "Share of Working Mothers (%)") +
ylim(0, 80) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 15, hjust = 1))

6. Pre-School Attendance (Weighted)
Note: Children dataset contains ONLY ages 0-6
total_children <- sum(data_children$weight, na.rm = TRUE)
# Merge with household info
children_with_region <- data_children %>%
left_join(
data_adult %>% filter(demo_relpar == 1) %>%
select(hhid, reg, rip) %>% distinct(),
by = c("profam" = "hhid")
)
# Formal childcare
attending_formal <- sum(children_with_region$weight[children_with_region$childcare_formal == 1], na.rm = TRUE)
not_attending <- sum(children_with_region$weight[children_with_region$childcare_formal == 0], na.rm = TRUE)
attendance_rate <- attending_formal / total_children * 100
cat("=== ITALY ===\n")
=== ITALY ===
cat("Total children (0-6):", format(total_children, big.mark=","), "\n")
Total children (0-6): 3,006,816
cat("Children in formal childcare:", format(attending_formal, big.mark=","), "\n")
Children in formal childcare: 1,613,274
cat("Children not in formal childcare:", format(not_attending, big.mark=","), "\n")
Children not in formal childcare: 1,393,543
cat("Attendance rate:", round(attendance_rate, 2), "%\n")
Attendance rate: 53.65 %
# By type of care
care_types <- children_with_region %>%
group_by(care_enrolled) %>%
summarise(
children = sum(weight, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
percentage = children / total_children * 100,
care_type = case_when(
care_enrolled == 1 ~ "Asilo Nido (Nursery, 0-2)",
care_enrolled == 14 ~ "Not enrolled",
care_enrolled == 15 ~ "Scuola Infanzia (Kindergarten, 3-5)",
care_enrolled == 16 ~ "Scuola Primaria (Primary, 6+)",
TRUE ~ as.character(care_enrolled)
)
)
cat("\n=== By Type of Care ===\n")
=== By Type of Care ===
print(care_types %>% select(care_type, children, percentage))
# Pre-school specific
preschool_rate <- sum(children_with_region$weight[children_with_region$care_enrolled %in% c(1, 15)], na.rm = TRUE) /
total_children * 100
cat("\nPre-school (Asilo Nido + Scuola Infanzia) rate:", round(preschool_rate, 2), "%\n")
Pre-school (Asilo Nido + Scuola Infanzia) rate: 70.47 %
# Lombardy
lom_children <- children_with_region %>% filter(reg == 41)
total_lom_child <- sum(lom_children$weight, na.rm = TRUE)
lom_attending <- sum(lom_children$weight[lom_children$childcare_formal == 1], na.rm = TRUE)
lom_attendance <- lom_attending / total_lom_child * 100
cat("\n=== LOMBARDY ===\n")
=== LOMBARDY ===
cat("Total children (0-6):", format(total_lom_child, big.mark=","), "\n")
Total children (0-6): 36,075.57
cat("Children in formal childcare:", format(lom_attending, big.mark=","), "\n")
Children in formal childcare: 16,995.04
cat("Attendance rate:", round(lom_attendance, 2), "%\n")
Attendance rate: 47.11 %
# By Ripartizione
attendance_by_rip <- children_with_region %>%
group_by(rip) %>%
summarise(
attending = sum(weight[childcare_formal == 1], na.rm = TRUE),
total = sum(weight, na.rm = TRUE),
rate = attending / total * 100,
.groups = "drop"
) %>%
mutate(rip_name = rip_names[as.character(rip)])
cat("\n=== By Ripartizione ===\n")
=== By Ripartizione ===
print(attendance_by_rip)
Visualization
ggplot(attendance_by_rip, aes(x = reorder(rip_name, -rate), y = rate)) +
geom_col(aes(fill = rip_name)) +
geom_hline(yintercept = attendance_rate, linetype = "dashed", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", rate)), vjust = -0.5, fontface = "bold") +
annotate("text", x = 5, y = attendance_rate + 2, label = "National Average", size = 3) +
labs(title = "Pre-School Attendance Rate by Ripartizione (Children 0-6, Weighted)",
x = "", y = "Attendance Rate (%)") +
ylim(0, 70) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 15, hjust = 1))

Summary Statistics Table
summary_data <- data.frame(
Indicator = c(
"Total households (millions)",
"Average family size (Italy)",
"Average family size (Lombardy)",
"Average family size (North)",
"Average family size (South)",
"Female employment rate - Italy (%)",
"Female employment rate - Lombardy (%)",
"Female employment rate - North (%)",
"Female employment rate - South (%)",
"Working mothers share - Italy (%)",
"Working mothers share - Sud (%)",
"Pre-school attendance - Italy (%)",
"Pre-school attendance - Lombardy (%)",
"Children (0-6) per family (with children)"
),
Value = c(
round(total_households/1e6, 2),
round(weighted_avg, 2),
round(weighted_avg_lom, 2),
round(macro_stats$avg_size[macro_stats$macro_area == "North"], 2),
round(macro_stats$avg_size[macro_stats$macro_area == "South"], 2),
round(emp_rate_italy, 2),
round(emp_rate_lom, 2),
round(mean(emp_by_rip$rate[emp_by_rip$rip %in% c(1,2)]), 2),
round(mean(emp_by_rip$rate[emp_by_rip$rip %in% c(4,5)]), 2),
round(mothers_share_italy, 2),
round(mothers_by_rip$share[mothers_by_rip$rip == 4], 2),
round(attendance_rate, 2),
round(lom_attendance, 2),
round(weighted_avg_children, 2)
)
)
kable(summary_data, caption = "Key Indicators Summary (Weighted)")
Key Indicators Summary (Weighted)
| Indicator |
Value |
| Total households (millions) |
26.20 |
| Average family size (Italy) |
1.95 |
| Average family size (Lombardy) |
1.94 |
| Average family size (North) |
1.90 |
| Average family size (South) |
2.05 |
| Female employment rate - Italy (%) |
51.14 |
| Female employment rate - Lombardy (%) |
66.62 |
| Female employment rate - North (%) |
60.70 |
| Female employment rate - South (%) |
35.13 |
| Working mothers share - Italy (%) |
66.90 |
| Working mothers share - Sud (%) |
73.69 |
| Pre-school attendance - Italy (%) |
53.65 |
| Pre-school attendance - Lombardy (%) |
47.11 |
| Children (0-6) per family (with children) |
1.25 |
Report generated: 2025-11-20
All analyses use proper population weights
(coefin/10,000)
Points of Discussion
- The AVQ survey doesn’t have any questions regarding religious stance
or conservativeness. I was thinking that maybe this can be proxied with
Euroskepticism?
There is a question asking about ‘how much do you believe in:
European Parliament?’
There are also several questions asking the perception of several
disorders on their community, such as:
How safe do you feel walking on the street when it’s dark and
you’re alone in the area where you live?
In the area where you live, how often do you see: people using
drugs
In the area where you live, how often do you see: people dealing
drugs
In the area where you live, how often do you see: prostitutes
looking for clients
In the area where you live, how often do you see: acts of
vandalism against public property (broken phone booths, trash bins,
etc.)
In the area where you live, how often do you see: vagrants,
people with no fixed address -
LS0tDQp0aXRsZTogIkh1Z2dpbnMgQnJpZWZpbmcgLSAyMDI1LzExLzE5Ig0Kc3VidGl0bGU6ICJEYXRhIERlc2NyaXB0aW9uIGFuZCBQcmVsaW1pbmFyeSBBbmFseXNpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIyBJbXBvcnRhbnQgTm90ZXMNCg0KMS4gKipDaGlsZHJlbiBkYXRhc2V0IGNvbnRhaW5zIE9OTFkgY2hpbGRyZW4gYWdlZCAwLTYgeWVhcnMqKg0KMi4gKipBbGwgYW5hbHlzZXMgdXNlIHByb3BlciBwb3B1bGF0aW9uIHdlaWdodHMqKiAoY29lZmluLzEwLDAwMCkNCg0KYGBge3IgbG9hZF9saWJyYXJpZXN9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KYGBge3IgbG9hZF9kYXRhfQ0KIyBVcGRhdGUgdGhlc2UgcGF0aHMgdG8geW91ciBsb2NhbCBmaWxlIGxvY2F0aW9ucw0KZGF0YV9hZHVsdCA8LSByZWFkLmNzdigiQzovVXNlcnMvc2F0eWEvT25lRHJpdmUgLSBQb2xpdGVjbmljbyBkaSBNaWxhbm8vSm9pbnQgRm9sZGVyIC0gUGVrZXJ0aSAmIEZyYXRlc2kvY2FyZGlmZl9wZXJpb2RhYnJvYWQvY2FyZGlmZl9wcm9qZWN0L2FuYWx5c2lzL2RhdGEvYXZxMjAyM19zdWJfYWR1bHQuY3N2IikNCmRhdGFfY2hpbGRyZW4gPC0gcmVhZC5jc3YoIkM6L1VzZXJzL3NhdHlhL09uZURyaXZlIC0gUG9saXRlY25pY28gZGkgTWlsYW5vL0pvaW50IEZvbGRlciAtIFBla2VydGkgJiBGcmF0ZXNpL2NhcmRpZmZfcGVyaW9kYWJyb2FkL2NhcmRpZmZfcHJvamVjdC9hbmFseXNpcy9kYXRhL2F2cTIwMjNfc3ViX2NoaWxkcmVuLmNzdiIpDQpkYXRhX2hoIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9zYXR5YS9PbmVEcml2ZSAtIFBvbGl0ZWNuaWNvIGRpIE1pbGFuby9Kb2ludCBGb2xkZXIgLSBQZWtlcnRpICYgRnJhdGVzaS9jYXJkaWZmX3BlcmlvZGFicm9hZC9jYXJkaWZmX3Byb2plY3QvYW5hbHlzaXMvZGF0YS9hdnEyMDIzX3N1Yl9oaC5jc3YiKQ0KDQojIENyZWF0ZSB3ZWlnaHRzIChkaXZpZGUgY29lZmluIGJ5IDEwLDAwMCkNCmRhdGFfYWR1bHQkd2VpZ2h0IDwtIGRhdGFfYWR1bHQkY29lZmluIC8gMTAwMDANCmRhdGFfY2hpbGRyZW4kd2VpZ2h0IDwtIGRhdGFfY2hpbGRyZW4kY29lZmluIC8gMTAwMDANCmBgYA0KDQpgYGB7ciBkYXRhX292ZXJ2aWV3fQ0KY2F0KCJBZHVsdCBkYXRhc2V0IGRpbWVuc2lvbnM6IiwgZGltKGRhdGFfYWR1bHQpLCAiXG4iKQ0KY2F0KCJDaGlsZHJlbiBkYXRhc2V0IGRpbWVuc2lvbnM6IiwgZGltKGRhdGFfY2hpbGRyZW4pLCAiXG4iKQ0KY2F0KCJIb3VzZWhvbGQgZGF0YXNldCBkaW1lbnNpb25zOiIsIGRpbShkYXRhX2hoKSwgIlxuXG4iKQ0KDQpjYXQoIldlaWdodGVkIHBvcHVsYXRpb25zOlxuIikNCmNhdCgiQWR1bHRzICgxNSspOiIsIGZvcm1hdChzdW0oZGF0YV9hZHVsdCR3ZWlnaHQpLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KY2F0KCJDaGlsZHJlbiAoMC02KToiLCBmb3JtYXQoc3VtKGRhdGFfY2hpbGRyZW4kd2VpZ2h0KSwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmBgYA0KDQpgYGB7ciByZWdpb25fbWFwcGluZ30NCiMgUmVnaW9uIG5hbWVzIG1hcHBpbmcNCnJlZ2lvbl9uYW1lcyA8LSBjKA0KICAnMTAnID0gIlBpZW1vbnRlIiwgJzIwJyA9ICJWYWxsZSBkJ0Fvc3RhIiwgJzMwJyA9ICJMaWd1cmlhIiwNCiAgJzQxJyA9ICJMb21iYXJkaWEiLCAnNDInID0gIlByb3ZpbmNpYSBBdXRvbm9tYSBCb2x6YW5vL0JvemVuIiwNCiAgJzUwJyA9ICJQcm92aW5jaWEgQXV0b25vbWEgVHJlbnRvIiwgJzYwJyA9ICJWZW5ldG8iLCAnNzAnID0gIkZyaXVsaS1WZW5lemlhIEdpdWxpYSIsDQogICc4MCcgPSAiRW1pbGlhLVJvbWFnbmEiLCAnOTAnID0gIlRvc2NhbmEiLCAnMTAwJyA9ICJVbWJyaWEiLA0KICAnMTEwJyA9ICJNYXJjaGUiLCAnMTIwJyA9ICJMYXppbyIsICcxMzAnID0gIkFicnV6em8iLA0KICAnMTQwJyA9ICJNb2xpc2UiLCAnMTUwJyA9ICJDYW1wYW5pYSIsICcxNjAnID0gIlB1Z2xpYSIsDQogICcxNzAnID0gIkJhc2lsaWNhdGEiLCAnMTgwJyA9ICJDYWxhYnJpYSIsICcxOTAnID0gIlNpY2lsaWEiLCAnMjAwJyA9ICJTYXJkZWduYSINCikNCg0KIyBSaXBhcnRpemlvbmUgbWFwcGluZw0KcmlwX25hbWVzIDwtIGMoDQogICcxJyA9ICJOb3JkLU92ZXN0IiwgJzInID0gIk5vcmQtRXN0IiwgJzMnID0gIkNlbnRybyIsDQogICc0JyA9ICJTdWQiLCAnNScgPSAiSXNvbGUiDQopDQoNCiMgQWRkIHRvIGFkdWx0IGRhdGENCmRhdGFfYWR1bHQgPC0gZGF0YV9hZHVsdCAlPiUNCiAgbXV0YXRlKA0KICAgIHJlZ2lvbl9uYW1lID0gcmVnaW9uX25hbWVzW2FzLmNoYXJhY3RlcihyZWcpXSwNCiAgICByaXBfbmFtZSA9IHJpcF9uYW1lc1thcy5jaGFyYWN0ZXIocmlwKV0NCiAgKQ0KYGBgDQoNCiMgRGF0YSBEZXNjcmlwdGlvbg0KDQpUaGlzIGFuYWx5c2lzIHVzZXMgdGhlICoqQVZRIChBc3BldHRpIGRlbGxhIFZpdGEgUXVvdGlkaWFuYSkgMjAyMyoqIHN1cnZleSBkYXRhIGZyb20gSVNUQVQgd2l0aCAqKnByb3BlciBwb3B1bGF0aW9uIHdlaWdodHMqKiAoY29lZmluIHZhcmlhYmxlIGRpdmlkZWQgYnkgMTAsMDAwKS4NCg0KIyMgRGF0YXNldCBPdmVydmlldw0KDQotICoqQWR1bHQgZGF0YXNldCoqOiAzNiw4NDQgaW5kaXZpZHVhbHMgYWdlZCAxNSsgKHdlaWdodGVkIHBvcHVsYXRpb246ICoqNTEuMSBtaWxsaW9uKiopDQotICoqSG91c2Vob2xkIGRhdGFzZXQqKjogMTgsNTY1IGhvdXNlaG9sZHMgKHdlaWdodGVkOiAqKjI2LjIgbWlsbGlvbiBob3VzZWhvbGRzKiopDQotICoqQ2hpbGRyZW4gZGF0YXNldCoqOiAxLDkyNSBjaGlsZHJlbiAqKmFnZWQgMC02IHllYXJzIG9ubHkqKiAod2VpZ2h0ZWQgcG9wdWxhdGlvbjogKiozLjAgbWlsbGlvbioqKQ0KDQoqKkltcG9ydGFudCBOb3RlKio6IFRoZSBjaGlsZHJlbiBkYXRhc2V0IGNvbnRhaW5zICoqb25seSBjaGlsZHJlbiBhZ2VkIDAtNiB5ZWFycyoqLCBub3QgYWxsIGNoaWxkcmVuIGFnZWQgMC0xNC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgZm9jdXNlZCBvbiB0aGUgcHJlLXNjaG9vbCBhZ2UgcmFuZ2UuDQoNCioqR2VvZ3JhcGhpYyBDb3ZlcmFnZToqKg0KLSBOYXRpb25hbCBsZXZlbCAoSXRhbHkpDQotIFJlZ2lvbmFsIGJyZWFrZG93bjogMjEgcmVnaW9ucw0KLSBNYWNyby1hcmVhIGNsYXNzaWZpY2F0aW9uIChSaXBhcnRpemlvbmkpOg0KICAtIE5vcmQtT3Zlc3QgKE5vcnRod2VzdCkNCiAgLSBOb3JkLUVzdCAoTm9ydGhlYXN0KQ0KICAtIENlbnRybyAoQ2VudGVyKQ0KICAtIFN1ZCAoU291dGgpDQogIC0gSXNvbGUgKElzbGFuZHMpDQoNCioqV2VpZ2h0aW5nKio6IEFsbCByZXN1bHRzIHVzZSB0aGUgSVNUQVQgc3VydmV5IHdlaWdodHMgKGNvZWZpbi8xMCwwMDApIHRvIHByb3ZpZGUgcG9wdWxhdGlvbi1yZXByZXNlbnRhdGl2ZSBlc3RpbWF0ZXMuDQoNCi0tLQ0KDQojIDEuIEZhbWlseSBTaXplIERpc3RyaWJ1dGlvbiAoV2VpZ2h0ZWQpDQoNCmBgYHtyIGZhbWlseV9zaXplfQ0KIyBHZXQgaG91c2Vob2xkIHdlaWdodHMgKGZyb20gaG91c2Vob2xkIGhlYWQpDQpob3VzZWhvbGRfd2VpZ2h0cyA8LSBkYXRhX2FkdWx0ICU+JQ0KICBmaWx0ZXIoZGVtb19yZWxwYXIgPT0gMSkgJT4lDQogIHNlbGVjdChoaGlkLCB3ZWlnaHQsIHJlZywgcmlwKQ0KDQojIENvdW50IGZhbWlseSBzaXplDQpmYW1pbHlfc2l6ZSA8LSBkYXRhX2FkdWx0ICU+JQ0KICBncm91cF9ieShoaGlkKSAlPiUNCiAgc3VtbWFyaXNlKGZhbWlseV9zaXplID0gbigpKSAlPiUNCiAgbGVmdF9qb2luKGhvdXNlaG9sZF93ZWlnaHRzLCBieSA9ICJoaGlkIikNCg0KdG90YWxfaG91c2Vob2xkcyA8LSBzdW0oZmFtaWx5X3NpemUkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQoNCmNhdCgiPT09IElUQUxZID09PVxuIikNCmNhdCgiVG90YWwgd2VpZ2h0ZWQgaG91c2Vob2xkczoiLCBmb3JtYXQodG90YWxfaG91c2Vob2xkcywgYmlnLm1hcms9IiwiKSwgIlxuXG4iKQ0KDQojIFdlaWdodGVkIGRpc3RyaWJ1dGlvbg0KZmFtaWx5X3NpemVfZGlzdCA8LSBmYW1pbHlfc2l6ZSAlPiUNCiAgZ3JvdXBfYnkoZmFtaWx5X3NpemUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgaG91c2Vob2xkcyA9IHN1bSh3ZWlnaHQsIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUocGVyY2VudGFnZSA9IGhvdXNlaG9sZHMgLyB0b3RhbF9ob3VzZWhvbGRzICogMTAwKQ0KDQpwcmludChmYW1pbHlfc2l6ZV9kaXN0KQ0KDQojIFdlaWdodGVkIGF2ZXJhZ2UNCndlaWdodGVkX2F2ZyA8LSBzdW0oZmFtaWx5X3NpemUkZmFtaWx5X3NpemUgKiBmYW1pbHlfc2l6ZSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkgLyANCiAgICAgICAgICAgICAgICBzdW0oZmFtaWx5X3NpemUkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQpjYXQoIlxuV2VpZ2h0ZWQgYXZlcmFnZSBmYW1pbHkgc2l6ZToiLCByb3VuZCh3ZWlnaHRlZF9hdmcsIDIpLCAiXG4iKQ0KDQojIExvbWJhcmR5DQpjYXQoIlxuPT09IExPTUJBUkRZID09PVxuIikNCmxvbWJhcmR5X2ZhbWlsaWVzIDwtIGZhbWlseV9zaXplICU+JSBmaWx0ZXIocmVnID09IDQxKQ0KdG90YWxfbG9tIDwtIHN1bShsb21iYXJkeV9mYW1pbGllcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiVG90YWwgd2VpZ2h0ZWQgaG91c2Vob2xkczoiLCBmb3JtYXQodG90YWxfbG9tLCBiaWcubWFyaz0iLCIpLCAiXG5cbiIpDQoNCmxvbV9kaXN0IDwtIGxvbWJhcmR5X2ZhbWlsaWVzICU+JQ0KICBncm91cF9ieShmYW1pbHlfc2l6ZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBob3VzZWhvbGRzID0gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gaG91c2Vob2xkcyAvIHRvdGFsX2xvbSAqIDEwMCkNCg0KcHJpbnQobG9tX2Rpc3QpDQoNCndlaWdodGVkX2F2Z19sb20gPC0gc3VtKGxvbWJhcmR5X2ZhbWlsaWVzJGZhbWlseV9zaXplICogbG9tYmFyZHlfZmFtaWxpZXMkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpIC8gDQogICAgICAgICAgICAgICAgICAgIHN1bShsb21iYXJkeV9mYW1pbGllcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiXG5XZWlnaHRlZCBhdmVyYWdlIGZhbWlseSBzaXplOiIsIHJvdW5kKHdlaWdodGVkX2F2Z19sb20sIDIpLCAiXG4iKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIGZhbWlseV9zaXplX3Bsb3QsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD01fQ0KIyBJdGFseQ0KcDEgPC0gZ2dwbG90KGZhbWlseV9zaXplX2Rpc3QsIGFlcyh4ID0gZmFjdG9yKGZhbWlseV9zaXplKSwgeSA9IGhvdXNlaG9sZHMvMWU2KSkgKw0KICBnZW9tX2NvbChmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMmZNIiwgaG91c2Vob2xkcy8xZTYpKSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICBsYWJzKHRpdGxlID0gIkZhbWlseSBTaXplIERpc3RyaWJ1dGlvbiAtIEl0YWx5IChXZWlnaHRlZCkiLA0KICAgICAgIHggPSAiRmFtaWx5IFNpemUgKG1lbWJlcnMpIiwgeSA9ICJIb3VzZWhvbGRzIChtaWxsaW9ucykiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpDQoNCiMgTG9tYmFyZHkNCnAyIDwtIGdncGxvdChsb21fZGlzdCwgYWVzKHggPSBmYWN0b3IoZmFtaWx5X3NpemUpLCB5ID0gaG91c2Vob2xkcy8xZTMpKSArDQogIGdlb21fY29sKGZpbGwgPSAiY29yYWwiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjBmSyIsIGhvdXNlaG9sZHMvMWUzKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJGYW1pbHkgU2l6ZSBEaXN0cmlidXRpb24gLSBMb21iYXJkeSAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIkZhbWlseSBTaXplIChtZW1iZXJzKSIsIHkgPSAiSG91c2Vob2xkcyAodGhvdXNhbmRzKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkNCg0KZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sID0gMikNCmBgYA0KDQotLS0NCg0KIyAyLiBOb3J0aCB2cyBTb3V0aCBDb21wYXJpc29uIChXZWlnaHRlZCkNCg0KYGBge3Igbm9ydGhfc291dGh9DQojIEFkZCBtYWNybyBhcmVhDQpmYW1pbHlfc2l6ZSA8LSBmYW1pbHlfc2l6ZSAlPiUNCiAgbXV0YXRlKG1hY3JvX2FyZWEgPSBjYXNlX3doZW4oDQogICAgcmlwICVpbiUgYygxLCAyKSB+ICJOb3J0aCIsDQogICAgcmlwID09IDMgfiAiQ2VudGVyIiwNCiAgICByaXAgJWluJSBjKDQsIDUpIH4gIlNvdXRoIg0KICApKQ0KDQojIE1hY3JvIGFyZWEgc3RhdGlzdGljcw0KbWFjcm9fc3RhdHMgPC0gZmFtaWx5X3NpemUgJT4lDQogIGZpbHRlcighaXMubmEobWFjcm9fYXJlYSkpICU+JQ0KICBncm91cF9ieShtYWNyb19hcmVhKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGF2Z19zaXplID0gc3VtKGZhbWlseV9zaXplICogd2VpZ2h0LCBuYS5ybSA9IFRSVUUpIC8gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICBob3VzZWhvbGRzID0gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KY2F0KCI9PT0gTWFjcm8gQXJlYSBDb21wYXJpc29uID09PVxuIikNCnByaW50KG1hY3JvX3N0YXRzKQ0KDQojIEJ5IHJpcGFydGl6aW9uZQ0KcmlwX3N0YXRzIDwtIGZhbWlseV9zaXplICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHJpcCkpICU+JQ0KICBncm91cF9ieShyaXApICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX3NpemUgPSBzdW0oZmFtaWx5X3NpemUgKiB3ZWlnaHQsIG5hLnJtID0gVFJVRSkgLyBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIGhvdXNlaG9sZHMgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHJpcF9uYW1lID0gcmlwX25hbWVzW2FzLmNoYXJhY3RlcihyaXApXSkNCg0KY2F0KCJcbj09PSBCeSBSaXBhcnRpemlvbmUgPT09XG4iKQ0KcHJpbnQocmlwX3N0YXRzKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIG5vcnRoX3NvdXRoX3Bsb3QsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQ0KZ2dwbG90KHJpcF9zdGF0cywgYWVzKHggPSByZW9yZGVyKHJpcF9uYW1lLCAtYXZnX3NpemUpLCB5ID0gYXZnX3NpemUpKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gcmlwX25hbWUpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHdlaWdodGVkX2F2ZywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjJmIiwgYXZnX3NpemUpKSwgdmp1c3QgPSAtMC41LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSA1LCB5ID0gd2VpZ2h0ZWRfYXZnICsgMC4wNSwgbGFiZWwgPSAiTmF0aW9uYWwgQXZlcmFnZSIsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBGYW1pbHkgU2l6ZSBieSBSaXBhcnRpemlvbmUgKFdlaWdodGVkKSIsDQogICAgICAgeCA9ICIiLCB5ID0gIkF2ZXJhZ2UgRmFtaWx5IFNpemUgKG1lbWJlcnMpIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLS0tDQoNCiMgMy4gRmVtYWxlIEVtcGxveW1lbnQgUmF0ZSAoV2VpZ2h0ZWQpDQoNCmBgYHtyIGZlbWFsZV9lbXBsb3ltZW50fQ0KIyBXb3JraW5nLWFnZSBmZW1hbGVzICgxNS02NCkNCndvcmtpbmdfYWdlX2ZlbWFsZXMgPC0gZGF0YV9hZHVsdCAlPiUNCiAgZmlsdGVyKGRlbW9fZmVtYWxlID09IDEsIGRlbW9fYWdlID49IDE1LCBkZW1vX2FnZSA8PSA2NCkNCg0KdG90YWxfZmVtYWxlcyA8LSBzdW0od29ya2luZ19hZ2VfZmVtYWxlcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmVtcGxveWVkX2ZlbWFsZXMgPC0gc3VtKHdvcmtpbmdfYWdlX2ZlbWFsZXMkd2VpZ2h0W3dvcmtpbmdfYWdlX2ZlbWFsZXMkZGVtb19lbXBsID09IDFdLCBuYS5ybSA9IFRSVUUpDQoNCmVtcF9yYXRlX2l0YWx5IDwtIGVtcGxveWVkX2ZlbWFsZXMgLyB0b3RhbF9mZW1hbGVzICogMTAwDQoNCmNhdCgiPT09IElUQUxZID09PVxuIikNCmNhdCgiRW1wbG95bWVudCBSYXRlOiIsIHJvdW5kKGVtcF9yYXRlX2l0YWx5LCAyKSwgIiVcbiIpDQpjYXQoIkVtcGxveWVkIGZlbWFsZXM6IiwgZm9ybWF0KGVtcGxveWVkX2ZlbWFsZXMsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIldvcmtpbmctYWdlIGZlbWFsZXM6IiwgZm9ybWF0KHRvdGFsX2ZlbWFsZXMsIGJpZy5tYXJrPSIsIiksICJcbiIpDQoNCiMgTG9tYmFyZHkNCmxvbV9mZW1hbGVzIDwtIHdvcmtpbmdfYWdlX2ZlbWFsZXMgJT4lIGZpbHRlcihyZWcgPT0gNDEpDQp0b3RhbF9sb21fZmVtIDwtIHN1bShsb21fZmVtYWxlcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmVtcGxveWVkX2xvbSA8LSBzdW0obG9tX2ZlbWFsZXMkd2VpZ2h0W2xvbV9mZW1hbGVzJGRlbW9fZW1wbCA9PSAxXSwgbmEucm0gPSBUUlVFKQ0KZW1wX3JhdGVfbG9tIDwtIGVtcGxveWVkX2xvbSAvIHRvdGFsX2xvbV9mZW0gKiAxMDANCg0KY2F0KCJcbj09PSBMT01CQVJEWSA9PT1cbiIpDQpjYXQoIkVtcGxveW1lbnQgUmF0ZToiLCByb3VuZChlbXBfcmF0ZV9sb20sIDIpLCAiJVxuIikNCmNhdCgiRW1wbG95ZWQgZmVtYWxlczoiLCBmb3JtYXQoZW1wbG95ZWRfbG9tLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KY2F0KCJXb3JraW5nLWFnZSBmZW1hbGVzOiIsIGZvcm1hdCh0b3RhbF9sb21fZmVtLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KDQojIEJ5IFJpcGFydGl6aW9uZQ0KZW1wX2J5X3JpcCA8LSB3b3JraW5nX2FnZV9mZW1hbGVzICU+JQ0KICBncm91cF9ieShyaXApICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZW1wbG95ZWQgPSBzdW0od2VpZ2h0W2RlbW9fZW1wbCA9PSAxXSwgbmEucm0gPSBUUlVFKSwNCiAgICB0b3RhbCA9IHN1bSh3ZWlnaHQsIG5hLnJtID0gVFJVRSksDQogICAgcmF0ZSA9IGVtcGxveWVkIC8gdG90YWwgKiAxMDAsDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUocmlwX25hbWUgPSByaXBfbmFtZXNbYXMuY2hhcmFjdGVyKHJpcCldKQ0KDQpjYXQoIlxuPT09IEJ5IFJpcGFydGl6aW9uZSA9PT1cbiIpDQpwcmludChlbXBfYnlfcmlwKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIGVtcGxveW1lbnRfcGxvdCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9DQpnZ3Bsb3QoZW1wX2J5X3JpcCwgYWVzKHggPSByZW9yZGVyKHJpcF9uYW1lLCAtcmF0ZSksIHkgPSByYXRlKSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IHJpcF9uYW1lKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBlbXBfcmF0ZV9pdGFseSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjFmJSUiLCByYXRlKSksIHZqdXN0ID0gLTAuNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gNSwgeSA9IGVtcF9yYXRlX2l0YWx5ICsgMiwgbGFiZWwgPSAiTmF0aW9uYWwgQXZlcmFnZSIsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiRmVtYWxlIEVtcGxveW1lbnQgUmF0ZSAoMTUtNjQpIGJ5IFJpcGFydGl6aW9uZSAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiRW1wbG95bWVudCBSYXRlICglKSIpICsNCiAgeWxpbSgwLCA3MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLS0tDQoNCiMgNC4gRGlzdHJpYnV0aW9uIG9mIENoaWxkcmVuIHBlciBGYW1pbHkgKFdlaWdodGVkKQ0KDQoqKk5vdGUqKjogQ2hpbGRyZW4gZGF0YXNldCBjb250YWlucyBvbmx5IGFnZXMgMC02DQoNCmBgYHtyIGNoaWxkcmVuX2Rpc3RyaWJ1dGlvbn0NCiMgSG91c2Vob2xkIGluZm8NCmhvdXNlaG9sZF9pbmZvIDwtIGRhdGFfYWR1bHQgJT4lDQogIGZpbHRlcihkZW1vX3JlbHBhciA9PSAxKSAlPiUNCiAgc2VsZWN0KGhoaWQsIHdlaWdodCwgcmVnLCByaXApDQoNCiMgQ291bnQgY2hpbGRyZW4gcGVyIGZhbWlseQ0KY2hpbGRyZW5fcGVyX2ZhbWlseSA8LSBkYXRhX2NoaWxkcmVuICU+JQ0KICBncm91cF9ieShwcm9mYW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbl9jaGlsZHJlbiA9IG4oKSwNCiAgICBjb2VmaW4gPSBmaXJzdChjb2VmaW4pLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHdlaWdodCA9IGNvZWZpbiAvIDEwMDAwKSAlPiUNCiAgcmVuYW1lKGhoaWQgPSBwcm9mYW0pICU+JQ0KICBsZWZ0X2pvaW4oDQogICAgZGF0YV9hZHVsdCAlPiUgZmlsdGVyKGRlbW9fcmVscGFyID09IDEpICU+JSANCiAgICAgIHNlbGVjdChoaGlkLCByZWcsIHJpcCkgJT4lIGRpc3RpbmN0KCksDQogICAgYnkgPSAiaGhpZCINCiAgKQ0KDQp0b3RhbF9mYW1fY2hpbGRyZW4gPC0gc3VtKGNoaWxkcmVuX3Blcl9mYW1pbHkkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQoNCmNhdCgiPT09IElUQUxZIC0gRmFtaWxpZXMgd2l0aCBDaGlsZHJlbiAoMC02KSA9PT1cbiIpDQpjYXQoIlRvdGFsIGZhbWlsaWVzOiIsIGZvcm1hdCh0b3RhbF9mYW1fY2hpbGRyZW4sIGJpZy5tYXJrPSIsIiksICJcblxuIikNCg0KY2hpbGRyZW5fZGlzdCA8LSBjaGlsZHJlbl9wZXJfZmFtaWx5ICU+JQ0KICBncm91cF9ieShuX2NoaWxkcmVuKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGZhbWlsaWVzID0gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gZmFtaWxpZXMgLyB0b3RhbF9mYW1fY2hpbGRyZW4gKiAxMDApDQoNCnByaW50KGNoaWxkcmVuX2Rpc3QpDQoNCndlaWdodGVkX2F2Z19jaGlsZHJlbiA8LSBzdW0oY2hpbGRyZW5fcGVyX2ZhbWlseSRuX2NoaWxkcmVuICogY2hpbGRyZW5fcGVyX2ZhbWlseSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkgLyANCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY2hpbGRyZW5fcGVyX2ZhbWlseSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiXG5XZWlnaHRlZCBhdmVyYWdlOiIsIHJvdW5kKHdlaWdodGVkX2F2Z19jaGlsZHJlbiwgMiksICJjaGlsZHJlbiBwZXIgZmFtaWx5XG4iKQ0KDQojIExvbWJhcmR5DQpsb21fY2hpbGRyZW5fZmFtIDwtIGNoaWxkcmVuX3Blcl9mYW1pbHkgJT4lIGZpbHRlcihyZWcgPT0gNDEpDQp0b3RhbF9sb21fZmFtIDwtIHN1bShsb21fY2hpbGRyZW5fZmFtJHdlaWdodCwgbmEucm0gPSBUUlVFKQ0KDQpjYXQoIlxuPT09IExPTUJBUkRZIC0gRmFtaWxpZXMgd2l0aCBDaGlsZHJlbiAoMC02KSA9PT1cbiIpDQpjYXQoIlRvdGFsIGZhbWlsaWVzOiIsIGZvcm1hdCh0b3RhbF9sb21fZmFtLCBiaWcubWFyaz0iLCIpLCAiXG5cbiIpDQoNCmxvbV9jaGlsZHJlbl9kaXN0IDwtIGxvbV9jaGlsZHJlbl9mYW0gJT4lDQogIGdyb3VwX2J5KG5fY2hpbGRyZW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZmFtaWxpZXMgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSBmYW1pbGllcyAvIHRvdGFsX2xvbV9mYW0gKiAxMDApDQoNCnByaW50KGxvbV9jaGlsZHJlbl9kaXN0KQ0KDQp3ZWlnaHRlZF9hdmdfbG9tX2NoaWxkIDwtIHN1bShsb21fY2hpbGRyZW5fZmFtJG5fY2hpbGRyZW4gKiBsb21fY2hpbGRyZW5fZmFtJHdlaWdodCwgbmEucm0gPSBUUlVFKSAvIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0obG9tX2NoaWxkcmVuX2ZhbSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiXG5XZWlnaHRlZCBhdmVyYWdlOiIsIHJvdW5kKHdlaWdodGVkX2F2Z19sb21fY2hpbGQsIDIpLCAiY2hpbGRyZW4gcGVyIGZhbWlseVxuIikNCg0KIyBBbGwgZmFtaWxpZXMgKGluY2x1ZGluZyB0aG9zZSB3aXRob3V0IGNoaWxkcmVuIDAtNikNCmFsbF9mYW1pbGllcyA8LSBob3VzZWhvbGRfaW5mbyAlPiUNCiAgbGVmdF9qb2luKGNoaWxkcmVuX3Blcl9mYW1pbHkgJT4lIHNlbGVjdChoaGlkLCBuX2NoaWxkcmVuKSwgYnkgPSAiaGhpZCIpICU+JQ0KICBtdXRhdGUobl9jaGlsZHJlbiA9IGlmZWxzZShpcy5uYShuX2NoaWxkcmVuKSwgMCwgbl9jaGlsZHJlbikpDQoNCnRvdGFsX2FsbF9mYW0gPC0gc3VtKGFsbF9mYW1pbGllcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCg0KY2F0KCJcbj09PSBBTEwgRkFNSUxJRVMgKGluY2x1ZGluZyB3aXRob3V0IGNoaWxkcmVuIDAtNikgPT09XG4iKQ0KY2F0KCJUb3RhbCBmYW1pbGllczoiLCBmb3JtYXQodG90YWxfYWxsX2ZhbSwgYmlnLm1hcms9IiwiKSwgIlxuXG4iKQ0KDQphbGxfY2hpbGRyZW5fZGlzdCA8LSBhbGxfZmFtaWxpZXMgJT4lDQogIGdyb3VwX2J5KG5fY2hpbGRyZW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZmFtaWxpZXMgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSBmYW1pbGllcyAvIHRvdGFsX2FsbF9mYW0gKiAxMDApDQoNCnByaW50KGhlYWQoYWxsX2NoaWxkcmVuX2Rpc3QsIDYpKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIGNoaWxkcmVuX3Bsb3QsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD01fQ0KcDEgPC0gZ2dwbG90KGNoaWxkcmVuX2Rpc3QsIGFlcyh4ID0gZmFjdG9yKG5fY2hpbGRyZW4pLCB5ID0gZmFtaWxpZXMvMWUzKSkgKw0KICBnZW9tX2NvbChmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMGZLIiwgZmFtaWxpZXMvMWUzKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJDaGlsZHJlbiBwZXIgRmFtaWx5IC0gQW1vbmcgRmFtaWxpZXMgd2l0aCBDaGlsZHJlbiAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBDaGlsZHJlbiAoMC02KSIsIHkgPSAiRmFtaWxpZXMgKHRob3VzYW5kcykiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpDQoNCnAyIDwtIGdncGxvdChoZWFkKGFsbF9jaGlsZHJlbl9kaXN0LCA1KSwgYWVzKHggPSBmYWN0b3Iobl9jaGlsZHJlbiksIHkgPSBmYW1pbGllcy8xZTYpKSArDQogIGdlb21fY29sKGZpbGwgPSAiY29yYWwiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjJmTSIsIGZhbWlsaWVzLzFlNikpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiQ2hpbGRyZW4gcGVyIEZhbWlseSAtIEFsbCBGYW1pbGllcyAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBDaGlsZHJlbiAoMC02KSIsIHkgPSAiRmFtaWxpZXMgKG1pbGxpb25zKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkNCg0KZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sID0gMikNCmBgYA0KDQotLS0NCg0KIyA1LiBXb3JraW5nIE1vdGhlcnMgKFdlaWdodGVkKQ0KDQpgYGB7ciB3b3JraW5nX21vdGhlcnN9DQojIEVtcGxveWVkIGZlbWFsZXMgYWdlZCAxNS02NA0KZW1wbG95ZWRfZmVtYWxlc19kYXRhIDwtIGRhdGFfYWR1bHQgJT4lDQogIGZpbHRlcihkZW1vX2ZlbWFsZSA9PSAxLCBkZW1vX2VtcGwgPT0gMSwgZGVtb19hZ2UgPj0gMTUsIGRlbW9fYWdlIDw9IDY0KQ0KDQp0b3RhbF9lbXBfd29tZW4gPC0gc3VtKGVtcGxveWVkX2ZlbWFsZXNfZGF0YSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCndvcmtpbmdfbW90aGVycyA8LSBzdW0oZW1wbG95ZWRfZmVtYWxlc19kYXRhJHdlaWdodFtlbXBsb3llZF9mZW1hbGVzX2RhdGEkZGVtb19tb3RoZXIgPT0gMV0sIG5hLnJtID0gVFJVRSkNCg0KbW90aGVyc19zaGFyZV9pdGFseSA8LSB3b3JraW5nX21vdGhlcnMgLyB0b3RhbF9lbXBfd29tZW4gKiAxMDANCg0KY2F0KCI9PT0gSVRBTFkgPT09XG4iKQ0KY2F0KCJUb3RhbCBlbXBsb3llZCB3b21lbjoiLCBmb3JtYXQodG90YWxfZW1wX3dvbWVuLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KY2F0KCJXb3JraW5nIG1vdGhlcnM6IiwgZm9ybWF0KHdvcmtpbmdfbW90aGVycywgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiU2hhcmU6Iiwgcm91bmQobW90aGVyc19zaGFyZV9pdGFseSwgMiksICIlXG4iKQ0KDQojIExvbWJhcmR5DQpsb21fZW1wIDwtIGVtcGxveWVkX2ZlbWFsZXNfZGF0YSAlPiUgZmlsdGVyKHJlZyA9PSA0MSkNCnRvdGFsX2xvbV9lbXAgPC0gc3VtKGxvbV9lbXAkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQpsb21fbW90aGVycyA8LSBzdW0obG9tX2VtcCR3ZWlnaHRbbG9tX2VtcCRkZW1vX21vdGhlciA9PSAxXSwgbmEucm0gPSBUUlVFKQ0KbW90aGVyc19zaGFyZV9sb20gPC0gbG9tX21vdGhlcnMgLyB0b3RhbF9sb21fZW1wICogMTAwDQoNCmNhdCgiXG49PT0gTE9NQkFSRFkgPT09XG4iKQ0KY2F0KCJUb3RhbCBlbXBsb3llZCB3b21lbjoiLCBmb3JtYXQodG90YWxfbG9tX2VtcCwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiV29ya2luZyBtb3RoZXJzOiIsIGZvcm1hdChsb21fbW90aGVycywgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiU2hhcmU6Iiwgcm91bmQobW90aGVyc19zaGFyZV9sb20sIDIpLCAiJVxuIikNCg0KIyBCeSBSaXBhcnRpemlvbmUNCm1vdGhlcnNfYnlfcmlwIDwtIGVtcGxveWVkX2ZlbWFsZXNfZGF0YSAlPiUNCiAgZ3JvdXBfYnkocmlwKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHdvcmtpbmdfbW90aGVycyA9IHN1bSh3ZWlnaHRbZGVtb19tb3RoZXIgPT0gMV0sIG5hLnJtID0gVFJVRSksDQogICAgdG90YWxfZW1wbG95ZWQgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIHNoYXJlID0gd29ya2luZ19tb3RoZXJzIC8gdG90YWxfZW1wbG95ZWQgKiAxMDAsDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUocmlwX25hbWUgPSByaXBfbmFtZXNbYXMuY2hhcmFjdGVyKHJpcCldKQ0KDQpjYXQoIlxuPT09IEJ5IFJpcGFydGl6aW9uZSA9PT1cbiIpDQpwcmludChtb3RoZXJzX2J5X3JpcCkNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbg0KDQpgYGB7ciBtb3RoZXJzX3Bsb3QsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQ0KZ2dwbG90KG1vdGhlcnNfYnlfcmlwLCBhZXMoeCA9IHJlb3JkZXIocmlwX25hbWUsIC1zaGFyZSksIHkgPSBzaGFyZSkpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSByaXBfbmFtZSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW90aGVyc19zaGFyZV9pdGFseSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjFmJSUiLCBzaGFyZSkpLCB2anVzdCA9IC0wLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDUsIHkgPSBtb3RoZXJzX3NoYXJlX2l0YWx5ICsgMS41LCBsYWJlbCA9ICJOYXRpb25hbCBBdmVyYWdlIiwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJXb3JraW5nIE1vdGhlcnMgQW1vbmcgRW1wbG95ZWQgV29tZW4gYnkgUmlwYXJ0aXppb25lIChXZWlnaHRlZCkiLA0KICAgICAgIHggPSAiIiwgeSA9ICJTaGFyZSBvZiBXb3JraW5nIE1vdGhlcnMgKCUpIikgKw0KICB5bGltKDAsIDgwKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAxNSwgaGp1c3QgPSAxKSkNCmBgYA0KDQotLS0NCg0KIyA2LiBQcmUtU2Nob29sIEF0dGVuZGFuY2UgKFdlaWdodGVkKQ0KDQoqKk5vdGUqKjogQ2hpbGRyZW4gZGF0YXNldCBjb250YWlucyBPTkxZIGFnZXMgMC02DQoNCmBgYHtyIHByZXNjaG9vbH0NCnRvdGFsX2NoaWxkcmVuIDwtIHN1bShkYXRhX2NoaWxkcmVuJHdlaWdodCwgbmEucm0gPSBUUlVFKQ0KDQojIE1lcmdlIHdpdGggaG91c2Vob2xkIGluZm8NCmNoaWxkcmVuX3dpdGhfcmVnaW9uIDwtIGRhdGFfY2hpbGRyZW4gJT4lDQogIGxlZnRfam9pbigNCiAgICBkYXRhX2FkdWx0ICU+JSBmaWx0ZXIoZGVtb19yZWxwYXIgPT0gMSkgJT4lIA0KICAgICAgc2VsZWN0KGhoaWQsIHJlZywgcmlwKSAlPiUgZGlzdGluY3QoKSwNCiAgICBieSA9IGMoInByb2ZhbSIgPSAiaGhpZCIpDQogICkNCg0KIyBGb3JtYWwgY2hpbGRjYXJlDQphdHRlbmRpbmdfZm9ybWFsIDwtIHN1bShjaGlsZHJlbl93aXRoX3JlZ2lvbiR3ZWlnaHRbY2hpbGRyZW5fd2l0aF9yZWdpb24kY2hpbGRjYXJlX2Zvcm1hbCA9PSAxXSwgbmEucm0gPSBUUlVFKQ0Kbm90X2F0dGVuZGluZyA8LSBzdW0oY2hpbGRyZW5fd2l0aF9yZWdpb24kd2VpZ2h0W2NoaWxkcmVuX3dpdGhfcmVnaW9uJGNoaWxkY2FyZV9mb3JtYWwgPT0gMF0sIG5hLnJtID0gVFJVRSkNCg0KYXR0ZW5kYW5jZV9yYXRlIDwtIGF0dGVuZGluZ19mb3JtYWwgLyB0b3RhbF9jaGlsZHJlbiAqIDEwMA0KDQpjYXQoIj09PSBJVEFMWSA9PT1cbiIpDQpjYXQoIlRvdGFsIGNoaWxkcmVuICgwLTYpOiIsIGZvcm1hdCh0b3RhbF9jaGlsZHJlbiwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiQ2hpbGRyZW4gaW4gZm9ybWFsIGNoaWxkY2FyZToiLCBmb3JtYXQoYXR0ZW5kaW5nX2Zvcm1hbCwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiQ2hpbGRyZW4gbm90IGluIGZvcm1hbCBjaGlsZGNhcmU6IiwgZm9ybWF0KG5vdF9hdHRlbmRpbmcsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIkF0dGVuZGFuY2UgcmF0ZToiLCByb3VuZChhdHRlbmRhbmNlX3JhdGUsIDIpLCAiJVxuIikNCg0KIyBCeSB0eXBlIG9mIGNhcmUNCmNhcmVfdHlwZXMgPC0gY2hpbGRyZW5fd2l0aF9yZWdpb24gJT4lDQogIGdyb3VwX2J5KGNhcmVfZW5yb2xsZWQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgY2hpbGRyZW4gPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHBlcmNlbnRhZ2UgPSBjaGlsZHJlbiAvIHRvdGFsX2NoaWxkcmVuICogMTAwLA0KICAgIGNhcmVfdHlwZSA9IGNhc2Vfd2hlbigNCiAgICAgIGNhcmVfZW5yb2xsZWQgPT0gMSB+ICJBc2lsbyBOaWRvIChOdXJzZXJ5LCAwLTIpIiwNCiAgICAgIGNhcmVfZW5yb2xsZWQgPT0gMTQgfiAiTm90IGVucm9sbGVkIiwNCiAgICAgIGNhcmVfZW5yb2xsZWQgPT0gMTUgfiAiU2N1b2xhIEluZmFuemlhIChLaW5kZXJnYXJ0ZW4sIDMtNSkiLA0KICAgICAgY2FyZV9lbnJvbGxlZCA9PSAxNiB+ICJTY3VvbGEgUHJpbWFyaWEgKFByaW1hcnksIDYrKSIsDQogICAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKGNhcmVfZW5yb2xsZWQpDQogICAgKQ0KICApDQoNCmNhdCgiXG49PT0gQnkgVHlwZSBvZiBDYXJlID09PVxuIikNCnByaW50KGNhcmVfdHlwZXMgJT4lIHNlbGVjdChjYXJlX3R5cGUsIGNoaWxkcmVuLCBwZXJjZW50YWdlKSkNCg0KIyBQcmUtc2Nob29sIHNwZWNpZmljDQpwcmVzY2hvb2xfcmF0ZSA8LSBzdW0oY2hpbGRyZW5fd2l0aF9yZWdpb24kd2VpZ2h0W2NoaWxkcmVuX3dpdGhfcmVnaW9uJGNhcmVfZW5yb2xsZWQgJWluJSBjKDEsIDE1KV0sIG5hLnJtID0gVFJVRSkgLyANCiAgICAgICAgICAgICAgICAgIHRvdGFsX2NoaWxkcmVuICogMTAwDQpjYXQoIlxuUHJlLXNjaG9vbCAoQXNpbG8gTmlkbyArIFNjdW9sYSBJbmZhbnppYSkgcmF0ZToiLCByb3VuZChwcmVzY2hvb2xfcmF0ZSwgMiksICIlXG4iKQ0KDQojIExvbWJhcmR5DQpsb21fY2hpbGRyZW4gPC0gY2hpbGRyZW5fd2l0aF9yZWdpb24gJT4lIGZpbHRlcihyZWcgPT0gNDEpDQp0b3RhbF9sb21fY2hpbGQgPC0gc3VtKGxvbV9jaGlsZHJlbiR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmxvbV9hdHRlbmRpbmcgPC0gc3VtKGxvbV9jaGlsZHJlbiR3ZWlnaHRbbG9tX2NoaWxkcmVuJGNoaWxkY2FyZV9mb3JtYWwgPT0gMV0sIG5hLnJtID0gVFJVRSkNCmxvbV9hdHRlbmRhbmNlIDwtIGxvbV9hdHRlbmRpbmcgLyB0b3RhbF9sb21fY2hpbGQgKiAxMDANCg0KY2F0KCJcbj09PSBMT01CQVJEWSA9PT1cbiIpDQpjYXQoIlRvdGFsIGNoaWxkcmVuICgwLTYpOiIsIGZvcm1hdCh0b3RhbF9sb21fY2hpbGQsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIkNoaWxkcmVuIGluIGZvcm1hbCBjaGlsZGNhcmU6IiwgZm9ybWF0KGxvbV9hdHRlbmRpbmcsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIkF0dGVuZGFuY2UgcmF0ZToiLCByb3VuZChsb21fYXR0ZW5kYW5jZSwgMiksICIlXG4iKQ0KDQojIEJ5IFJpcGFydGl6aW9uZQ0KYXR0ZW5kYW5jZV9ieV9yaXAgPC0gY2hpbGRyZW5fd2l0aF9yZWdpb24gJT4lDQogIGdyb3VwX2J5KHJpcCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBhdHRlbmRpbmcgPSBzdW0od2VpZ2h0W2NoaWxkY2FyZV9mb3JtYWwgPT0gMV0sIG5hLnJtID0gVFJVRSksDQogICAgdG90YWwgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIHJhdGUgPSBhdHRlbmRpbmcgLyB0b3RhbCAqIDEwMCwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShyaXBfbmFtZSA9IHJpcF9uYW1lc1thcy5jaGFyYWN0ZXIocmlwKV0pDQoNCmNhdCgiXG49PT0gQnkgUmlwYXJ0aXppb25lID09PVxuIikNCnByaW50KGF0dGVuZGFuY2VfYnlfcmlwKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIHByZXNjaG9vbF9wbG90LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0NCmdncGxvdChhdHRlbmRhbmNlX2J5X3JpcCwgYWVzKHggPSByZW9yZGVyKHJpcF9uYW1lLCAtcmF0ZSksIHkgPSByYXRlKSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IHJpcF9uYW1lKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdHRlbmRhbmNlX3JhdGUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3ByaW50ZigiJS4xZiUlIiwgcmF0ZSkpLCB2anVzdCA9IC0wLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDUsIHkgPSBhdHRlbmRhbmNlX3JhdGUgKyAyLCBsYWJlbCA9ICJOYXRpb25hbCBBdmVyYWdlIiwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJQcmUtU2Nob29sIEF0dGVuZGFuY2UgUmF0ZSBieSBSaXBhcnRpemlvbmUgKENoaWxkcmVuIDAtNiwgV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiQXR0ZW5kYW5jZSBSYXRlICglKSIpICsNCiAgeWxpbSgwLCA3MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLS0tDQoNCiMgU3VtbWFyeSBTdGF0aXN0aWNzIFRhYmxlDQoNCmBgYHtyIHN1bW1hcnlfdGFibGV9DQpzdW1tYXJ5X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgSW5kaWNhdG9yID0gYygNCiAgICAiVG90YWwgaG91c2Vob2xkcyAobWlsbGlvbnMpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoSXRhbHkpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoTG9tYmFyZHkpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoTm9ydGgpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoU291dGgpIiwNCiAgICAiRmVtYWxlIGVtcGxveW1lbnQgcmF0ZSAtIEl0YWx5ICglKSIsDQogICAgIkZlbWFsZSBlbXBsb3ltZW50IHJhdGUgLSBMb21iYXJkeSAoJSkiLA0KICAgICJGZW1hbGUgZW1wbG95bWVudCByYXRlIC0gTm9ydGggKCUpIiwNCiAgICAiRmVtYWxlIGVtcGxveW1lbnQgcmF0ZSAtIFNvdXRoICglKSIsDQogICAgIldvcmtpbmcgbW90aGVycyBzaGFyZSAtIEl0YWx5ICglKSIsDQogICAgIldvcmtpbmcgbW90aGVycyBzaGFyZSAtIFN1ZCAoJSkiLA0KICAgICJQcmUtc2Nob29sIGF0dGVuZGFuY2UgLSBJdGFseSAoJSkiLA0KICAgICJQcmUtc2Nob29sIGF0dGVuZGFuY2UgLSBMb21iYXJkeSAoJSkiLA0KICAgICJDaGlsZHJlbiAoMC02KSBwZXIgZmFtaWx5ICh3aXRoIGNoaWxkcmVuKSINCiAgKSwNCiAgVmFsdWUgPSBjKA0KICAgIHJvdW5kKHRvdGFsX2hvdXNlaG9sZHMvMWU2LCAyKSwNCiAgICByb3VuZCh3ZWlnaHRlZF9hdmcsIDIpLA0KICAgIHJvdW5kKHdlaWdodGVkX2F2Z19sb20sIDIpLA0KICAgIHJvdW5kKG1hY3JvX3N0YXRzJGF2Z19zaXplW21hY3JvX3N0YXRzJG1hY3JvX2FyZWEgPT0gIk5vcnRoIl0sIDIpLA0KICAgIHJvdW5kKG1hY3JvX3N0YXRzJGF2Z19zaXplW21hY3JvX3N0YXRzJG1hY3JvX2FyZWEgPT0gIlNvdXRoIl0sIDIpLA0KICAgIHJvdW5kKGVtcF9yYXRlX2l0YWx5LCAyKSwNCiAgICByb3VuZChlbXBfcmF0ZV9sb20sIDIpLA0KICAgIHJvdW5kKG1lYW4oZW1wX2J5X3JpcCRyYXRlW2VtcF9ieV9yaXAkcmlwICVpbiUgYygxLDIpXSksIDIpLA0KICAgIHJvdW5kKG1lYW4oZW1wX2J5X3JpcCRyYXRlW2VtcF9ieV9yaXAkcmlwICVpbiUgYyg0LDUpXSksIDIpLA0KICAgIHJvdW5kKG1vdGhlcnNfc2hhcmVfaXRhbHksIDIpLA0KICAgIHJvdW5kKG1vdGhlcnNfYnlfcmlwJHNoYXJlW21vdGhlcnNfYnlfcmlwJHJpcCA9PSA0XSwgMiksDQogICAgcm91bmQoYXR0ZW5kYW5jZV9yYXRlLCAyKSwNCiAgICByb3VuZChsb21fYXR0ZW5kYW5jZSwgMiksDQogICAgcm91bmQod2VpZ2h0ZWRfYXZnX2NoaWxkcmVuLCAyKQ0KICApDQopDQoNCmthYmxlKHN1bW1hcnlfZGF0YSwgY2FwdGlvbiA9ICJLZXkgSW5kaWNhdG9ycyBTdW1tYXJ5IChXZWlnaHRlZCkiKQ0KYGBgDQoNCi0tLQ0KDQoqUmVwb3J0IGdlbmVyYXRlZDogYHIgU3lzLkRhdGUoKWAqDQoNCipBbGwgYW5hbHlzZXMgdXNlIHByb3BlciBwb3B1bGF0aW9uIHdlaWdodHMgKGNvZWZpbi8xMCwwMDApKg0KDQoNCiMgUG9pbnRzIG9mIERpc2N1c3Npb24NCg0KMS4gVGhlIEFWUSBzdXJ2ZXkgZG9lc24ndCBoYXZlIGFueSBxdWVzdGlvbnMgcmVnYXJkaW5nIHJlbGlnaW91cyBzdGFuY2Ugb3IgY29uc2VydmF0aXZlbmVzcy4gSSB3YXMgdGhpbmtpbmcgdGhhdCBtYXliZSB0aGlzIGNhbiBiZSBwcm94aWVkIHdpdGggRXVyb3NrZXB0aWNpc20/DQoNCiAgYS4gVGhlcmUgaXMgYSBxdWVzdGlvbiBhc2tpbmcgYWJvdXQgJ2hvdyBtdWNoIGRvIHlvdSBiZWxpZXZlIGluOiBFdXJvcGVhbiBQYXJsaWFtZW50PycNCiAgDQogIGIuIFRoZXJlIGFyZSBhbHNvIHNldmVyYWwgcXVlc3Rpb25zIGFza2luZyB0aGUgcGVyY2VwdGlvbiBvZiBzZXZlcmFsIGRpc29yZGVycyBvbiB0aGVpciBjb21tdW5pdHksIHN1Y2ggYXM6DQogIA0KICAtIEhvdyBzYWZlIGRvIHlvdSBmZWVsIHdhbGtpbmcgb24gdGhlIHN0cmVldCB3aGVuIGl0J3MgZGFyayBhbmQgeW91J3JlIGFsb25lIGluIHRoZSBhcmVhIHdoZXJlIHlvdSBsaXZlPw0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IHBlb3BsZSB1c2luZyBkcnVncw0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IHBlb3BsZSBkZWFsaW5nIGRydWdzDQogIA0KICAtIEluIHRoZSBhcmVhIHdoZXJlIHlvdSBsaXZlLCBob3cgb2Z0ZW4gZG8geW91IHNlZTogcHJvc3RpdHV0ZXMgbG9va2luZyBmb3IgY2xpZW50cw0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IGFjdHMgb2YgdmFuZGFsaXNtIGFnYWluc3QgcHVibGljIHByb3BlcnR5IChicm9rZW4gcGhvbmUgYm9vdGhzLCB0cmFzaCBiaW5zLCBldGMuKQ0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IHZhZ3JhbnRzLCBwZW9wbGUgd2l0aCBubyBmaXhlZCBhZGRyZXNzICAtIA==