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