install.packages("rmarkdown")
library(readxl)
library(tidyverse)
library(psych)
library(ggplot2)
library(effects)
library(dplyr)
library(rmarkdown)
library(readxl)
setwd("/Users/kimchaewon/Desktop/QRMSEMINARS/i. data/")
data <- read_excel("dataLondon.xlsx") %>%
filter(language == "EAL")
View(data)
str(data)
tibble [500 × 7] (S3: tbl_df/tbl/data.frame)
$ year : num [1:500] 202425 202425 202425 202425 202425 ...
$ country : chr [1:500] "England" "England" "England" "England" ...
$ region : chr [1:500] "London" "London" "London" "London" ...
$ localAuthority : chr [1:500] "City of London" "Camden" "Camden" "Camden" ...
$ schoolType : chr [1:500] "State-funded primary" "State-funded nursery" "State-funded primary" "State-funded secondary" ...
$ language : chr [1:500] "EAL" "EAL" "EAL" "EAL" ...
$ percentagePupils: num [1:500] 60.2 14.7 52.5 36.8 46.7 ...
data$year <- as.factor(data$year)
data$country <- as.factor(data$country)
data$region <- as.factor(data$region)
data$localAuthority <- as.factor(data$localAuthority)
data$schoolType <- as.factor(data$schoolType)
data$language <- as.factor(data$language)
data$percentagePupils <- as.numeric(data$percentagePupils)
library(dplyr)
EAL_data <- EAL_data %>%
mutate(
year = recode(year,
"202122" = "2021/22",
"202223" = "2022/23",
"202324" = "2023/24",
"202425" = "2024/25"
)
)
print(levels(EAL_data$year))
[1] "2021/22" "2022/23" "2023/24" "2024/25"
library(readr)
library(dplyr)
library(ggplot2)
overall_trend <- data %>%
group_by(year) %>%
summarise(
mean = mean(percentagePupils, na.rm = TRUE),
sd = sd(percentagePupils, na.rm = TRUE),
min = min(percentagePupils, na.rm = TRUE),
max = max(percentagePupils, na.rm = TRUE)) #na.rm = TRUE excludes the N/A data
print(overall_trend)
overall_trend <- EAL_data %>%
group_by(year) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE), .groups = "drop")
ggplot(overall_trend, aes(x = factor(year), y = mean_EAL, group = 1)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(title = "Overall EAL Proportion Trend in London (2021-2025)",
x = "Academic Year",
y = "Mean EAL Percentage (%)") +
theme_minimal() +
ylim(40, 45)

library(dplyr)
print(levels(EAL_data$year))
[1] "2021/22" "2022/23" "2023/24" "2024/25"
London_overview <- data %>%
group_by(schoolType, year) %>%
summarize(
mean = mean(percentagePupils),
sd = sd(percentagePupils),
median = median(percentagePupils),
min = min(percentagePupils),
max = max(percentagePupils)
)
print(London_overview)
View(London_overview)
library(dplyr)
library(tidyr)
print(levels(EAL_data$year))
[1] "2021/22" "2022/23" "2023/24" "2024/25"
London_overview <- EAL_data %>%
group_by(year, schoolType) %>%
summarise(mean_EAL = mean(`percentagePupils`, na.rm = TRUE), .groups = "drop")
summary_table <- London_overview %>%
pivot_wider(
names_from = schoolType,
values_from = mean_EAL
) %>%
arrange(year)
print(summary_table)
library(ggplot2)
library(dplyr)
London_overview <- EAL_data %>%
group_by(year, schoolType) %>%
summarize(
count = n(),
mean = mean(percentagePupils, na.rm = TRUE), # <-- This creates the 'mean' column
sd = sd(percentagePupils, na.rm = TRUE),
median = median(percentagePupils, na.rm = TRUE),
min = min(percentagePupils, na.rm = TRUE),
max = max(percentagePupils, na.rm = TRUE)
)
print(levels(EAL_data$year))
[1] "2021/22" "2022/23" "2023/24" "2024/25"
ggplot(London_overview, aes(x = schoolType, y = mean, fill = year)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Overall EAL Proportions by School Type and Year in London",
x = "School Type",
y = "Mean EAL Percentage (%)",
fill = "Academic Year"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ylim (0, 60)

library(dplyr)
library(readxl)
EAL_data <- data %>%
filter(language == "EAL")
EAL_summary <- EAL_data %>%
group_by(localAuthority) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE)) %>%
arrange(desc(mean_EAL))
head(EAL_summary, 10)
tail(EAL_summary, 10)
EAL_data <- data %>%
filter(language == "EAL")
EAL_summary <- EAL_data %>%
filter(!is.na(localAuthority)) %>%
group_by(localAuthority) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE)) %>%
arrange(desc(mean_EAL))
n <- nrow(EAL_summary)
middle_EAL <- EAL_summary %>%
slice(round(n/2 - 5):round(n/2 + 5))
middle_EAL
library(dplyr)
library(readxl)
desired_order <- c("Harrow", "Haringey", "Bromley")
London_EAL <- data %>%
filter(language == "EAL",
localAuthority %in% desired_order) %>%
mutate(localAuthority = factor(localAuthority, levels = desired_order)) %>%
group_by(localAuthority, year) %>%
summarise(
mean_EAL = mean(percentagePupils, na.rm = TRUE),
median_EAL = median(percentagePupils, na.rm = TRUE),
sd_EAL = sd(percentagePupils, na.rm = TRUE),.groups = "drop") %>%
arrange(localAuthority, year)
print(London_EAL)
EAL_data <- EAL_data %>%
mutate(
year = recode(year,
"202122" = "2021/22",
"202223" = "2022/23",
"202324" = "2023/24",
"202425" = "2024/25"
)
)
LA_choices <- c("Harrow", "Haringey", "Bromley")
LA_comparison <- EAL_data %>%
filter(localAuthority %in% LA_choices) %>%
group_by(localAuthority, year) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE), .groups = "drop")
ggplot(LA_comparison, aes(x = year, y = mean_EAL, group = localAuthority, color = localAuthority)) +
geom_line(linewidth = 1) +
geom_point(size = 3) +
labs(
title = "EAL Proportions of Selected Local Authorities",
x = "Academic Year",
y = "Mean EAL Percentage (%)",
color = "Local Authority"
) +
theme_minimal() +
ylim(0, NA)

library(dplyr)
library(ggplot2)
LA_choices <- c("Harrow", "Haringey", "Bromley")
LA_comparison <- EAL_data %>%
filter(localAuthority %in% LA_choices) %>%
group_by(localAuthority, schoolType, year) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE), .groups = "drop") %>%
print(LA_comparison)
View(LA_comparison)
library(dplyr)
library(ggplot2)
LA_choices <- c("Harrow", "Haringey", "Bromley")
three_LA_summary <- EAL_data %>%
filter(localAuthority %in% LA_choices) %>%
group_by(year, localAuthority, schoolType) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE), .groups = "drop")
for (LA in LA_choices) {
plot_data <- three_LA_summary %>%
filter(localAuthority == LA)
g <- ggplot(plot_data, aes(x = year, y = mean_EAL, group = schoolType, color = schoolType)) +
geom_line(linewidth = 1) +
geom_point(size = 3) +
labs(
title = paste("EAL Porportion Trends in", LA),
x = "Academic Year",
y = "Mean EAL Percentage (%)",
color = "School Type"
) +
theme_minimal() +
ylim(0, 100)
print(g)
}



library(ggplot2)
overall_trend <- EAL_data %>%
group_by(year) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE), .groups = "drop")
LA_choices <- c("Harrow", "Haringey", "Bromley")
LA_comparison <- EAL_data %>%
filter(localAuthority %in% LA_choices) %>%
group_by(localAuthority, year) %>%
summarise(mean_EAL = mean(percentagePupils, na.rm = TRUE), .groups = "drop")
ggplot(LA_comparison, aes(x = factor(year), y = mean_EAL)) +
geom_line(aes(group = localAuthority, color = localAuthority), linewidth = 1) +
geom_point(aes(group = localAuthority, color = localAuthority), size = 2) +
geom_line(data = overall_trend, aes(group = 1), color = "black", linewidth = 1.3) +
geom_point(data = overall_trend, aes(group = 1), color = "black", size = 2) +
labs(
title = "EAL Proportions: Selected LAs vs. Overall EAL Proportions in London",
subtitle = "the black line indicates the overall London trend",
x = "Academic Year",
y = "Mean EAL Percentage (%)",
color = "Local Authority"
) +
theme_minimal() +
ylim(0, NA)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInJtYXJrZG93biIpCmBgYAoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwc3ljaCkgCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShlZmZlY3RzKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJtYXJrZG93bikKYGBgCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCgpzZXR3ZCgiL1VzZXJzL2tpbWNoYWV3b24vRGVza3RvcC9RUk1TRU1JTkFSUy9pLiBkYXRhLyIpCgpkYXRhIDwtIHJlYWRfZXhjZWwoImRhdGFMb25kb24ueGxzeCIpICU+JQogIGZpbHRlcihsYW5ndWFnZSA9PSAiRUFMIikgCgpWaWV3KGRhdGEpCmBgYAoKYGBge3J9CnN0cihkYXRhKQpgYGAKYGBge3J9CmRhdGEkeWVhciA8LSBhcy5mYWN0b3IoZGF0YSR5ZWFyKQpkYXRhJGNvdW50cnkgPC0gYXMuZmFjdG9yKGRhdGEkY291bnRyeSkKZGF0YSRyZWdpb24gPC0gYXMuZmFjdG9yKGRhdGEkcmVnaW9uKQpkYXRhJGxvY2FsQXV0aG9yaXR5IDwtIGFzLmZhY3RvcihkYXRhJGxvY2FsQXV0aG9yaXR5KQpkYXRhJHNjaG9vbFR5cGUgPC0gYXMuZmFjdG9yKGRhdGEkc2Nob29sVHlwZSkKZGF0YSRsYW5ndWFnZSA8LSBhcy5mYWN0b3IoZGF0YSRsYW5ndWFnZSkKZGF0YSRwZXJjZW50YWdlUHVwaWxzIDwtIGFzLm51bWVyaWMoZGF0YSRwZXJjZW50YWdlUHVwaWxzKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKRUFMX2RhdGEgPC0gRUFMX2RhdGEgJT4lCiAgbXV0YXRlKAogICAgeWVhciA9IHJlY29kZSh5ZWFyLAogICAgICAiMjAyMTIyIiA9ICIyMDIxLzIyIiwKICAgICAgIjIwMjIyMyIgPSAiMjAyMi8yMyIsCiAgICAgICIyMDIzMjQiID0gIjIwMjMvMjQiLAogICAgICAiMjAyNDI1IiA9ICIyMDI0LzI1IgogICAgKQogICkKCnByaW50KGxldmVscyhFQUxfZGF0YSR5ZWFyKSkKYGBgCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQoKb3ZlcmFsbF90cmVuZCA8LSBkYXRhICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcmlzZSgKICAgIG1lYW4gPSBtZWFuKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksCiAgICBzZCA9IHNkKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksICAgIAogICAgbWluID0gbWluKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksICAKICAgIG1heCA9IG1heChwZXJjZW50YWdlUHVwaWxzLCBuYS5ybSA9IFRSVUUpKSAjbmEucm0gPSBUUlVFIGV4Y2x1ZGVzIHRoZSBOL0EgZGF0YQoKcHJpbnQob3ZlcmFsbF90cmVuZCkKYGBgCgpgYGB7cn0Kb3ZlcmFsbF90cmVuZCA8LSBFQUxfZGF0YSAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9FQUwgPSBtZWFuKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpCgpnZ3Bsb3Qob3ZlcmFsbF90cmVuZCwgYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBtZWFuX0VBTCwgZ3JvdXAgPSAxKSkgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBsYWJzKHRpdGxlID0gIk92ZXJhbGwgRUFMIFByb3BvcnRpb24gVHJlbmQgaW4gTG9uZG9uICgyMDIxLTIwMjUpIiwKICAgICAgIHggPSAiQWNhZGVtaWMgWWVhciIsCiAgICAgICB5ID0gIk1lYW4gRUFMIFBlcmNlbnRhZ2UgKCUpIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgeWxpbSg0MCwgNDUpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKcHJpbnQobGV2ZWxzKEVBTF9kYXRhJHllYXIpKQpMb25kb25fb3ZlcnZpZXcgPC0gZGF0YSAlPiUKICBncm91cF9ieShzY2hvb2xUeXBlLCB5ZWFyKSAlPiUKICAgc3VtbWFyaXplKAogICAgbWVhbiA9IG1lYW4ocGVyY2VudGFnZVB1cGlscyksCiAgICBzZCA9IHNkKHBlcmNlbnRhZ2VQdXBpbHMpLAogICAgbWVkaWFuID0gbWVkaWFuKHBlcmNlbnRhZ2VQdXBpbHMpLAogICAgbWluID0gbWluKHBlcmNlbnRhZ2VQdXBpbHMpLAogICAgbWF4ID0gbWF4KHBlcmNlbnRhZ2VQdXBpbHMpCiAgKQpwcmludChMb25kb25fb3ZlcnZpZXcpClZpZXcoTG9uZG9uX292ZXJ2aWV3KQpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCgpwcmludChsZXZlbHMoRUFMX2RhdGEkeWVhcikpCkxvbmRvbl9vdmVydmlldyA8LSBFQUxfZGF0YSAlPiUKICBncm91cF9ieSh5ZWFyLCBzY2hvb2xUeXBlKSAlPiUKICBzdW1tYXJpc2UobWVhbl9FQUwgPSBtZWFuKGBwZXJjZW50YWdlUHVwaWxzYCwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikKCnN1bW1hcnlfdGFibGUgPC0gTG9uZG9uX292ZXJ2aWV3ICU+JQogIHBpdm90X3dpZGVyKAogICAgbmFtZXNfZnJvbSA9IHNjaG9vbFR5cGUsCiAgICB2YWx1ZXNfZnJvbSA9IG1lYW5fRUFMCiAgKSAlPiUKICBhcnJhbmdlKHllYXIpCgpwcmludChzdW1tYXJ5X3RhYmxlKQpgYGAKCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQoKTG9uZG9uX292ZXJ2aWV3IDwtIEVBTF9kYXRhICU+JQogIGdyb3VwX2J5KHllYXIsIHNjaG9vbFR5cGUpICU+JQogICBzdW1tYXJpemUoCiAgICAgY291bnQgPSBuKCksCiAgICAgbWVhbiA9IG1lYW4ocGVyY2VudGFnZVB1cGlscywgbmEucm0gPSBUUlVFKSwgIyA8LS0gVGhpcyBjcmVhdGVzIHRoZSAnbWVhbicgY29sdW1uCiAgICAgc2QgPSBzZChwZXJjZW50YWdlUHVwaWxzLCBuYS5ybSA9IFRSVUUpLAogICAgIG1lZGlhbiA9IG1lZGlhbihwZXJjZW50YWdlUHVwaWxzLCBuYS5ybSA9IFRSVUUpLAogICAgIG1pbiA9IG1pbihwZXJjZW50YWdlUHVwaWxzLCBuYS5ybSA9IFRSVUUpLAogICAgIG1heCA9IG1heChwZXJjZW50YWdlUHVwaWxzLCBuYS5ybSA9IFRSVUUpCiAgICkKCnByaW50KGxldmVscyhFQUxfZGF0YSR5ZWFyKSkKZ2dwbG90KExvbmRvbl9vdmVydmlldywgYWVzKHggPSBzY2hvb2xUeXBlLCB5ID0gbWVhbiwgZmlsbCA9IHllYXIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJPdmVyYWxsIEVBTCBQcm9wb3J0aW9ucyBieSBTY2hvb2wgVHlwZSBhbmQgWWVhciBpbiBMb25kb24iLAogICAgeCA9ICJTY2hvb2wgVHlwZSIsCiAgICB5ID0gIk1lYW4gRUFMIFBlcmNlbnRhZ2UgKCUpIiwKICAgIGZpbGwgPSAiQWNhZGVtaWMgWWVhciIgCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArCgp5bGltICgwLCA2MCkKYGBgCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShyZWFkeGwpCgpFQUxfZGF0YSA8LSBkYXRhICU+JQogIGZpbHRlcihsYW5ndWFnZSA9PSAiRUFMIikKCkVBTF9zdW1tYXJ5IDwtIEVBTF9kYXRhICU+JQogIGdyb3VwX2J5KGxvY2FsQXV0aG9yaXR5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9FQUwgPSBtZWFuKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSkpICU+JQogIGFycmFuZ2UoZGVzYyhtZWFuX0VBTCkpCgpoZWFkKEVBTF9zdW1tYXJ5LCAxMCkKdGFpbChFQUxfc3VtbWFyeSwgMTApCmBgYAoKYGBge3J9CkVBTF9kYXRhIDwtIGRhdGEgJT4lCiAgZmlsdGVyKGxhbmd1YWdlID09ICJFQUwiKQoKRUFMX3N1bW1hcnkgPC0gRUFMX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShsb2NhbEF1dGhvcml0eSkpICU+JQogIGdyb3VwX2J5KGxvY2FsQXV0aG9yaXR5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9FQUwgPSBtZWFuKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSkpICU+JQogIGFycmFuZ2UoZGVzYyhtZWFuX0VBTCkpCgpuIDwtIG5yb3coRUFMX3N1bW1hcnkpCgptaWRkbGVfRUFMIDwtIEVBTF9zdW1tYXJ5ICU+JQogIHNsaWNlKHJvdW5kKG4vMiAtIDUpOnJvdW5kKG4vMiArIDUpKQoKbWlkZGxlX0VBTApgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWR4bCkKCmRlc2lyZWRfb3JkZXIgPC0gYygiSGFycm93IiwgIkhhcmluZ2V5IiwgIkJyb21sZXkiKQoKTG9uZG9uX0VBTCA8LSBkYXRhICU+JQogIGZpbHRlcihsYW5ndWFnZSA9PSAiRUFMIiwKICAgICAgICAgbG9jYWxBdXRob3JpdHkgJWluJSBkZXNpcmVkX29yZGVyKSAlPiUKIG11dGF0ZShsb2NhbEF1dGhvcml0eSA9IGZhY3Rvcihsb2NhbEF1dGhvcml0eSwgbGV2ZWxzID0gZGVzaXJlZF9vcmRlcikpICU+JQogIGdyb3VwX2J5KGxvY2FsQXV0aG9yaXR5LCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0VBTCA9IG1lYW4ocGVyY2VudGFnZVB1cGlscywgbmEucm0gPSBUUlVFKSwKICAgIG1lZGlhbl9FQUwgPSBtZWRpYW4ocGVyY2VudGFnZVB1cGlscywgbmEucm0gPSBUUlVFKSwKICAgIHNkX0VBTCA9IHNkKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgYXJyYW5nZShsb2NhbEF1dGhvcml0eSwgeWVhcikKCnByaW50KExvbmRvbl9FQUwpCmBgYAoKYGBge3J9CkVBTF9kYXRhIDwtIEVBTF9kYXRhICU+JQogIG11dGF0ZSgKICAgIHllYXIgPSByZWNvZGUoeWVhciwKICAgICAgIjIwMjEyMiIgPSAiMjAyMS8yMiIsCiAgICAgICIyMDIyMjMiID0gIjIwMjIvMjMiLAogICAgICAiMjAyMzI0IiA9ICIyMDIzLzI0IiwKICAgICAgIjIwMjQyNSIgPSAiMjAyNC8yNSIKICAgICkKICApCgpMQV9jaG9pY2VzIDwtIGMoIkhhcnJvdyIsICJIYXJpbmdleSIsICJCcm9tbGV5IikKTEFfY29tcGFyaXNvbiA8LSBFQUxfZGF0YSAlPiUKICBmaWx0ZXIobG9jYWxBdXRob3JpdHkgJWluJSBMQV9jaG9pY2VzKSAlPiUKICBncm91cF9ieShsb2NhbEF1dGhvcml0eSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG1lYW5fRUFMID0gbWVhbihwZXJjZW50YWdlUHVwaWxzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKQoKZ2dwbG90KExBX2NvbXBhcmlzb24sIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fRUFMLCBncm91cCA9IGxvY2FsQXV0aG9yaXR5LCBjb2xvciA9IGxvY2FsQXV0aG9yaXR5KSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAxKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFQUwgUHJvcG9ydGlvbnMgb2YgU2VsZWN0ZWQgTG9jYWwgQXV0aG9yaXRpZXMiLAogICAgeCA9ICJBY2FkZW1pYyBZZWFyIiwKICAgIHkgPSAiTWVhbiBFQUwgUGVyY2VudGFnZSAoJSkiLAogICAgY29sb3IgPSAiTG9jYWwgQXV0aG9yaXR5IgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgeWxpbSgwLCBOQSkKYGBgCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQoKTEFfY2hvaWNlcyA8LSBjKCJIYXJyb3ciLCAiSGFyaW5nZXkiLCAiQnJvbWxleSIpCgpMQV9jb21wYXJpc29uIDwtIEVBTF9kYXRhICU+JQogIGZpbHRlcihsb2NhbEF1dGhvcml0eSAlaW4lIExBX2Nob2ljZXMpICU+JQogIGdyb3VwX2J5KGxvY2FsQXV0aG9yaXR5LCBzY2hvb2xUeXBlLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9FQUwgPSBtZWFuKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQoKcHJpbnQoTEFfY29tcGFyaXNvbikKVmlldyhMQV9jb21wYXJpc29uKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCgpMQV9jaG9pY2VzIDwtIGMoIkhhcnJvdyIsICJIYXJpbmdleSIsICJCcm9tbGV5IikKCnRocmVlX0xBX3N1bW1hcnkgPC0gRUFMX2RhdGEgJT4lCiAgZmlsdGVyKGxvY2FsQXV0aG9yaXR5ICVpbiUgTEFfY2hvaWNlcykgJT4lCiAgZ3JvdXBfYnkoeWVhciwgbG9jYWxBdXRob3JpdHksIHNjaG9vbFR5cGUpICU+JQogIHN1bW1hcmlzZShtZWFuX0VBTCA9IG1lYW4ocGVyY2VudGFnZVB1cGlscywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikKCmZvciAoTEEgaW4gTEFfY2hvaWNlcykgewoKICBwbG90X2RhdGEgPC0gdGhyZWVfTEFfc3VtbWFyeSAlPiUKICAgIGZpbHRlcihsb2NhbEF1dGhvcml0eSA9PSBMQSkKICAKICBnIDwtIGdncGxvdChwbG90X2RhdGEsIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fRUFMLCBncm91cCA9IHNjaG9vbFR5cGUsIGNvbG9yID0gc2Nob29sVHlwZSkpICsKICAgIGdlb21fbGluZShsaW5ld2lkdGggPSAxKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBsYWJzKAogICAgICB0aXRsZSA9IHBhc3RlKCJFQUwgUG9ycG9ydGlvbiBUcmVuZHMgaW4iLCBMQSksIAogICAgICB4ID0gIkFjYWRlbWljIFllYXIiLAogICAgICB5ID0gIk1lYW4gRUFMIFBlcmNlbnRhZ2UgKCUpIiwKICAgICAgY29sb3IgPSAiU2Nob29sIFR5cGUiCiAgICApICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB5bGltKDAsIDEwMCkgCiAgCiAgcHJpbnQoZykKfQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpvdmVyYWxsX3RyZW5kIDwtIEVBTF9kYXRhICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcmlzZShtZWFuX0VBTCA9IG1lYW4ocGVyY2VudGFnZVB1cGlscywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikKCkxBX2Nob2ljZXMgPC0gYygiSGFycm93IiwgIkhhcmluZ2V5IiwgIkJyb21sZXkiKQpMQV9jb21wYXJpc29uIDwtIEVBTF9kYXRhICU+JQogIGZpbHRlcihsb2NhbEF1dGhvcml0eSAlaW4lIExBX2Nob2ljZXMpICU+JQogIGdyb3VwX2J5KGxvY2FsQXV0aG9yaXR5LCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9FQUwgPSBtZWFuKHBlcmNlbnRhZ2VQdXBpbHMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpCgpnZ3Bsb3QoTEFfY29tcGFyaXNvbiwgYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBtZWFuX0VBTCkpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gbG9jYWxBdXRob3JpdHksIGNvbG9yID0gbG9jYWxBdXRob3JpdHkpLCBsaW5ld2lkdGggPSAxKSArCiAgZ2VvbV9wb2ludChhZXMoZ3JvdXAgPSBsb2NhbEF1dGhvcml0eSwgY29sb3IgPSBsb2NhbEF1dGhvcml0eSksIHNpemUgPSAyKSArCiAgCiAgZ2VvbV9saW5lKGRhdGEgPSBvdmVyYWxsX3RyZW5kLCBhZXMoZ3JvdXAgPSAxKSwgY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjMpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvdmVyYWxsX3RyZW5kLCBhZXMoZ3JvdXAgPSAxKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMikgKwoKICBsYWJzKAogICAgdGl0bGUgPSAiRUFMIFByb3BvcnRpb25zOiBTZWxlY3RlZCBMQXMgdnMuIE92ZXJhbGwgRUFMIFByb3BvcnRpb25zIGluIExvbmRvbiIsCiAgICBzdWJ0aXRsZSA9ICJ0aGUgYmxhY2sgbGluZSBpbmRpY2F0ZXMgdGhlIG92ZXJhbGwgTG9uZG9uIHRyZW5kIiwKICAgIHggPSAiQWNhZGVtaWMgWWVhciIsCiAgICB5ID0gIk1lYW4gRUFMIFBlcmNlbnRhZ2UgKCUpIiwKICAgIGNvbG9yID0gIkxvY2FsIEF1dGhvcml0eSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHlsaW0oMCwgTkEpCmBgYAoK