Data

Agents’ vaccination status for selected time steps

FINAL = Simulation results Weight: a_100_b_113_c_311_d_131

data <- syn_ind_urb_empID_sch_smedia_teen_coord
lt_step <- c(12,15,20,49)
lt_run <- 1:5
str_weight <- "a_100_b_113_c_311_d_131"

abm_df_vax <- list()

for (i in 1:length(lt_step)) {
  df <- data
  for (j in 1:length(lt_run)) {
    path_name = sprintf(
      "plot/11_model_0409_verification_validation/finl_%s/agent_step%s_weight_%s_7_days (%s).csv", 
      str_weight, lt_step[i], str_weight, lt_run[j])
    print(path_name)
    tt <- read.csv(path_name) %>% select(ind_id, vax_status) %>% 
      setnames(old="vax_status", new = sprintf("step%s_r%s",lt_step[i],lt_run[j]))
    df <- left_join(df, tt, by=c("ind_id"="ind_id"))
  }
  abm_df_vax[[i]] <- df
}

names(abm_df_vax) <- sprintf("step_%01d",lt_step)

i=5
lt_run <- 1:5
df <- data

for (j in lt_run) {
  path_name = sprintf(
      "plot/11_model_0409_verification_validation/finl_%s/agent_simplified_weight_%s_7_days (1%s).csv", 
      str_weight, str_weight, lt_run[j])
  print(path_name)
  tt <- read.csv(path_name) %>% select(ind_id, vax_status) %>% 
    setnames(old="vax_status", new = sprintf("step%s_r%s",73,lt_run[j]))
  df <- left_join(df, tt, by=c("ind_id"="ind_id"))
}

abm_df_vax[["step_73"]] <- df

Analysis

MAP1: process map, vax rate, Vaccinated ind. point

Grid preparation

cell_size = 2500
# create grid covers studyarea 
c_grid <- c_county %>% st_make_grid(cellsize = cell_size) %>% st_as_sf()  ## unit = m; 52*41=2132 CELLS
c_grid <- c_grid[lengths(st_intersects(c_county, c_grid))>0, ]
c_grid["idx"] <- sprintf("idx_%04d", 1:nrow(c_grid))

# individual agent location and count ind. in each grid
data <- syn_ind_urb_empID_sch_smedia_teen_coord[c("long","lat")] %>% 
  st_as_sf(., coords = c("long","lat"), crs=4326) %>% 
  st_transform(., crs = st_crs(c_grid))
c_grid["n_pop"] <- lengths(st_intersects(c_grid, data))

# count vaccined ind in each step
lt_step <- c(12,15,20,49,73)
lt_label_1 <- sprintf("avg_vax_s%s", lt_step)
lt_label_2 <- sprintf("p_avg_vax_s%s", lt_step)
n_run = 5

for (i in 1:length(lt_step)) {
  df <- c_grid[c("idx","n_pop")]
  x <- abm_df_vax[[i]]
  
  for (j in 1:n_run) {
    temp <- sprintf("vax_s%s_r%s", lt_step[i], j)
    
    tt <- x[c(18,19,19+j)] %>% setnames(., new=c("long","lat","vaxed")) %>% filter(vaxed == 1) %>% 
      st_as_sf(., coords = c("long","lat"), crs=4326) %>% 
      st_transform(., crs = st_crs(c_grid))
    df[temp] <- lengths(st_intersects(df, tt))
  }
  
  st_geometry(df) <- NULL
  df[lt_label_1[i]] <- round(apply(df[,3:7], 1, mean))
  df[lt_label_2[i]] <- round(100 * df[,8] / df["n_pop"],2)
  df[is.na(df)] <- 0
  
  
  c_grid <- left_join(c_grid, df[,c("idx",lt_label_1[i], lt_label_2[i])], by=c("idx"="idx"))
}
# save result 
c_grid_pvax <- c_grid

Plot

## PLOT ## Vaccination Rate 
n=40
p_alpha = 0.6
p_palette = "GnBu"
brks = seq(0, 100, length = n+1)

pdf(sprintf("plot/05_grid_vaxrate_process_%s.pdf", cell_size), width = 10, height = 5)
par(mfrow=c(1,4), oma=c(5,4,0,0)+0.1, mar=c(0,0,1,1)+0.1, bty="n") 
i=1
p1 <- tm_shape(c_grid_pvax) + 
  tm_polygons(col = as.character(lt_label_2[[i]]), border.alpha = 0, 
              palette = p_palette, alpha = p_alpha, breaks = brks) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  # tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_2[[i]], legend.show = F, frame = F)

i=2
p2 <- tm_shape(c_grid_pvax) + 
  tm_polygons(col = as.character(lt_label_2[[i]]), border.alpha = 0, 
              palette = p_palette, alpha = p_alpha, breaks = brks) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  # tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_2[[i]], legend.show = F, frame = F)

i=3
p3 <- tm_shape(c_grid_pvax) + 
  tm_polygons(col = as.character(lt_label_2[[i]]), border.alpha = 0, 
              palette = p_palette, alpha = p_alpha, breaks = brks) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  # tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_2[[i]], legend.show = F, frame = F)

i=4
p4 <- tm_shape(c_grid_pvax) + 
  tm_polygons(col = as.character(lt_label_2[[i]]), border.alpha = 0, 
              palette = p_palette, alpha = p_alpha, breaks = brks) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  # tm_shape(c_urban) + tm_polygons(alpha = 0) +
  tm_layout(main.title =lt_label_2[[i]], legend.show = F, frame = F)

i=5  ## legend
p5 <- tm_shape(c_grid_pvax) + 
  tm_polygons(col = as.character(lt_label_2[[i]]), border.alpha = 0, 
              palette = p_palette, alpha = p_alpha, breaks = brks) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  tm_layout(main.title =lt_label_2[[i]], legend.show = T, frame = F, legend.outside = T)

tmap_arrange(p1, p2, p3, p4, p5, widths = c(0.5,0.5), nrow = 1)
dev.off()


## PLOT ## n of Vaccinated Individuals
n=50
p_alpha = 0.6
cols = mako(n=(n),alpha =1, begin = 1, end = 0)
brks = seq(0, 7000, length = n+1)

pdf(sprintf("plot/06_grid_vaxabs_process_%s.pdf", cell_size), width = 10, height = 5)

i=1
data <- c_grid_pvax[lt_label_1[i]] %>% filter(get(lt_label_1[[i]])>0)
p1 <- tm_shape(c_county) + tm_polygons(alpha = 0) + 
  tm_shape(data) + 
  tm_polygons(col = lt_label_1[i], breaks = brks, palette = cols, border.alpha = 0) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_1[[i]], legend.show = F, frame = F, title.size = 0.5)

i=2
data <- c_grid_pvax[lt_label_1[i]] %>% filter(get(lt_label_1[[i]])>0)
p2 <- tm_shape(c_county) + tm_polygons(alpha = 0) + 
  tm_shape(data) + 
  tm_polygons(col = lt_label_1[i], breaks = brks, palette = cols, border.alpha = 0) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_1[[i]], legend.show = F, frame = F, title.size = 0.5)

i=3
data <- c_grid_pvax[lt_label_1[i]] %>% filter(get(lt_label_1[[i]])>0)
p3 <- tm_shape(c_county) + tm_polygons(alpha = 0) + 
  tm_shape(data) + 
  tm_polygons(col = lt_label_1[i], breaks = brks, palette = cols, border.alpha = 0) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_1[[i]], legend.show = F, frame = F, title.size = 0.5)

i=4
data <- c_grid_pvax[lt_label_1[i]] %>% filter(get(lt_label_1[[i]])>0)
p4 <- tm_shape(c_county) + tm_polygons(alpha = 0) + 
  tm_shape(data) + 
  tm_polygons(col = lt_label_1[i], breaks = brks, palette = cols, border.alpha = 0) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_1[[i]], legend.show = F, frame = F, title.size = 0.5)

i=5  ## legend
data <- c_grid_pvax[lt_label_1[i]] %>% filter(get(lt_label_1[[i]])>0)
p5 <- tm_shape(c_county) + tm_polygons(alpha = 0) + 
  tm_shape(data) + 
  tm_polygons(col = lt_label_1[i], breaks = brks, palette = cols, border.alpha = 0) + 
  tm_shape(c_county) + tm_polygons(alpha = 0) +
  tm_shape(c_urban) + tm_polygons(alpha = 0) + 
  tm_layout(main.title =lt_label_1[[i]], legend.show = T, frame = F, title.size = 0.5, legend.outside = T)

tmap_arrange(p1, p2, p3, p4, p5, widths = c(0.5,0.5), nrow = 1)
dev.off()

MAP2: Census block group

# prepare averaging data 
data <- abm_df_vax[["step_73"]] %>% 
  st_as_sf(., coords = c("long","lat"), crs=4326) %>% 
  st_transform(., st_crs(c_county))

df <- c_bgroup
# all individual/agent (n=127584)
df["n_pop"] <- lengths(st_intersects(df, data))

lt_label <- sprintf("step73_r%01d",1:5)
lt_label_1 <- sprintf("step73_nvax_r%01d",1:5)

for (i in 1:length(lt_label)) {
  tt <- data %>% filter(get(lt_label[i])==1)
  df[as.character(lt_label_1[i])] <- lengths(st_intersects(df, tt))
}


ttt <- df[c("GEOID",lt_label_1)]
st_geometry(ttt) <- NULL
ttt["step73_nvax_mean"] <- round(apply(ttt[lt_label_1], 1, mean))

df <- left_join(df, ttt[c("GEOID","step73_nvax_mean")], by=c("GEOID"="GEOID"))
df["step73_pvax_mean"] <- round(100 * df$step73_nvax_mean / df$n_pop, 2)
df <- na.omit(df)

pdf("plot/07_cbgrou_pred_vaxrate_a_100_b_113_c_311_d_131.pdf")
tm_shape(c_county) + tm_polygons(col=NA, alpha = 0) + 
  tm_shape(df) + tm_polygons(col = "step73_pvax_mean", palette = "GnBu", alpha = 0.7, 
                           border.alpha = 0, lwd = 0.1) + 
  tm_shape(c_urban) + tm_polygons(alpha = 0, border.col = "black", lwd = 0.1) + 
  tm_shape(c_county) + tm_polygons(alpha = 0, border.col = "black", lwd = 0.5) + 
  tm_layout(legend.show = T, frame = FALSE, legend.outside = T) + 
  tm_compass(position = c("left", "top"), north = 0) + tm_scale_bar(position = c("left", "top"), width = 0.15) 
dev.off()


## test 
data <- df[df$step73_pvax_mean>69, ]
tm_shape(data) + tm_polygons(col = "step73_pvax_mean", palette = "GnBu", alpha = 0.7, 
                           border.alpha = 0.1, lwd = 0.1)

#"GnBu"
LS0tDQp0aXRsZTogIlIgKDMvMykgQUJNIFJlc3VsdCBBbmFseXNpczogTWFwcGluZyBWYWNjaW5hdGVkIEFnZW50cyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgRGF0YSANCiMjIEFnZW50cycgdmFjY2luYXRpb24gc3RhdHVzIGZvciBzZWxlY3RlZCB0aW1lIHN0ZXBzDQpGSU5BTCA9IFNpbXVsYXRpb24gcmVzdWx0cyANCldlaWdodDogYV8xMDBfYl8xMTNfY18zMTFfZF8xMzENCmBgYHtyfQ0KZGF0YSA8LSBzeW5faW5kX3VyYl9lbXBJRF9zY2hfc21lZGlhX3RlZW5fY29vcmQNCmx0X3N0ZXAgPC0gYygxMiwxNSwyMCw0OSkNCmx0X3J1biA8LSAxOjUNCnN0cl93ZWlnaHQgPC0gImFfMTAwX2JfMTEzX2NfMzExX2RfMTMxIg0KDQphYm1fZGZfdmF4IDwtIGxpc3QoKQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobHRfc3RlcCkpIHsNCiAgZGYgPC0gZGF0YQ0KICBmb3IgKGogaW4gMTpsZW5ndGgobHRfcnVuKSkgew0KICAgIHBhdGhfbmFtZSA9IHNwcmludGYoDQogICAgICAicGxvdC8xMV9tb2RlbF8wNDA5X3ZlcmlmaWNhdGlvbl92YWxpZGF0aW9uL2ZpbmxfJXMvYWdlbnRfc3RlcCVzX3dlaWdodF8lc183X2RheXMgKCVzKS5jc3YiLCANCiAgICAgIHN0cl93ZWlnaHQsIGx0X3N0ZXBbaV0sIHN0cl93ZWlnaHQsIGx0X3J1bltqXSkNCiAgICBwcmludChwYXRoX25hbWUpDQogICAgdHQgPC0gcmVhZC5jc3YocGF0aF9uYW1lKSAlPiUgc2VsZWN0KGluZF9pZCwgdmF4X3N0YXR1cykgJT4lIA0KICAgICAgc2V0bmFtZXMob2xkPSJ2YXhfc3RhdHVzIiwgbmV3ID0gc3ByaW50Zigic3RlcCVzX3IlcyIsbHRfc3RlcFtpXSxsdF9ydW5bal0pKQ0KICAgIGRmIDwtIGxlZnRfam9pbihkZiwgdHQsIGJ5PWMoImluZF9pZCI9ImluZF9pZCIpKQ0KICB9DQogIGFibV9kZl92YXhbW2ldXSA8LSBkZg0KfQ0KDQpuYW1lcyhhYm1fZGZfdmF4KSA8LSBzcHJpbnRmKCJzdGVwXyUwMWQiLGx0X3N0ZXApDQoNCmk9NQ0KbHRfcnVuIDwtIDE6NQ0KZGYgPC0gZGF0YQ0KDQpmb3IgKGogaW4gbHRfcnVuKSB7DQogIHBhdGhfbmFtZSA9IHNwcmludGYoDQogICAgICAicGxvdC8xMV9tb2RlbF8wNDA5X3ZlcmlmaWNhdGlvbl92YWxpZGF0aW9uL2ZpbmxfJXMvYWdlbnRfc2ltcGxpZmllZF93ZWlnaHRfJXNfN19kYXlzICgxJXMpLmNzdiIsIA0KICAgICAgc3RyX3dlaWdodCwgc3RyX3dlaWdodCwgbHRfcnVuW2pdKQ0KICBwcmludChwYXRoX25hbWUpDQogIHR0IDwtIHJlYWQuY3N2KHBhdGhfbmFtZSkgJT4lIHNlbGVjdChpbmRfaWQsIHZheF9zdGF0dXMpICU+JSANCiAgICBzZXRuYW1lcyhvbGQ9InZheF9zdGF0dXMiLCBuZXcgPSBzcHJpbnRmKCJzdGVwJXNfciVzIiw3MyxsdF9ydW5bal0pKQ0KICBkZiA8LSBsZWZ0X2pvaW4oZGYsIHR0LCBieT1jKCJpbmRfaWQiPSJpbmRfaWQiKSkNCn0NCg0KYWJtX2RmX3ZheFtbInN0ZXBfNzMiXV0gPC0gZGYNCmBgYA0KDQojIEFuYWx5c2lzDQojIyBNQVAxOiBwcm9jZXNzIG1hcCwgdmF4IHJhdGUsIFZhY2NpbmF0ZWQgaW5kLiBwb2ludCANCiMjIyBHcmlkIHByZXBhcmF0aW9uDQpgYGB7cn0NCmNlbGxfc2l6ZSA9IDI1MDANCiMgY3JlYXRlIGdyaWQgY292ZXJzIHN0dWR5YXJlYSANCmNfZ3JpZCA8LSBjX2NvdW50eSAlPiUgc3RfbWFrZV9ncmlkKGNlbGxzaXplID0gY2VsbF9zaXplKSAlPiUgc3RfYXNfc2YoKSAgIyMgdW5pdCA9IG07IDUyKjQxPTIxMzIgQ0VMTFMNCmNfZ3JpZCA8LSBjX2dyaWRbbGVuZ3RocyhzdF9pbnRlcnNlY3RzKGNfY291bnR5LCBjX2dyaWQpKT4wLCBdDQpjX2dyaWRbImlkeCJdIDwtIHNwcmludGYoImlkeF8lMDRkIiwgMTpucm93KGNfZ3JpZCkpDQoNCiMgaW5kaXZpZHVhbCBhZ2VudCBsb2NhdGlvbiBhbmQgY291bnQgaW5kLiBpbiBlYWNoIGdyaWQNCmRhdGEgPC0gc3luX2luZF91cmJfZW1wSURfc2NoX3NtZWRpYV90ZWVuX2Nvb3JkW2MoImxvbmciLCJsYXQiKV0gJT4lIA0KICBzdF9hc19zZiguLCBjb29yZHMgPSBjKCJsb25nIiwibGF0IiksIGNycz00MzI2KSAlPiUgDQogIHN0X3RyYW5zZm9ybSguLCBjcnMgPSBzdF9jcnMoY19ncmlkKSkNCmNfZ3JpZFsibl9wb3AiXSA8LSBsZW5ndGhzKHN0X2ludGVyc2VjdHMoY19ncmlkLCBkYXRhKSkNCg0KIyBjb3VudCB2YWNjaW5lZCBpbmQgaW4gZWFjaCBzdGVwDQpsdF9zdGVwIDwtIGMoMTIsMTUsMjAsNDksNzMpDQpsdF9sYWJlbF8xIDwtIHNwcmludGYoImF2Z192YXhfcyVzIiwgbHRfc3RlcCkNCmx0X2xhYmVsXzIgPC0gc3ByaW50ZigicF9hdmdfdmF4X3MlcyIsIGx0X3N0ZXApDQpuX3J1biA9IDUNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGx0X3N0ZXApKSB7DQogIGRmIDwtIGNfZ3JpZFtjKCJpZHgiLCJuX3BvcCIpXQ0KICB4IDwtIGFibV9kZl92YXhbW2ldXQ0KICANCiAgZm9yIChqIGluIDE6bl9ydW4pIHsNCiAgICB0ZW1wIDwtIHNwcmludGYoInZheF9zJXNfciVzIiwgbHRfc3RlcFtpXSwgaikNCiAgICANCiAgICB0dCA8LSB4W2MoMTgsMTksMTkraildICU+JSBzZXRuYW1lcyguLCBuZXc9YygibG9uZyIsImxhdCIsInZheGVkIikpICU+JSBmaWx0ZXIodmF4ZWQgPT0gMSkgJT4lIA0KICAgICAgc3RfYXNfc2YoLiwgY29vcmRzID0gYygibG9uZyIsImxhdCIpLCBjcnM9NDMyNikgJT4lIA0KICAgICAgc3RfdHJhbnNmb3JtKC4sIGNycyA9IHN0X2NycyhjX2dyaWQpKQ0KICAgIGRmW3RlbXBdIDwtIGxlbmd0aHMoc3RfaW50ZXJzZWN0cyhkZiwgdHQpKQ0KICB9DQogIA0KICBzdF9nZW9tZXRyeShkZikgPC0gTlVMTA0KICBkZltsdF9sYWJlbF8xW2ldXSA8LSByb3VuZChhcHBseShkZlssMzo3XSwgMSwgbWVhbikpDQogIGRmW2x0X2xhYmVsXzJbaV1dIDwtIHJvdW5kKDEwMCAqIGRmWyw4XSAvIGRmWyJuX3BvcCJdLDIpDQogIGRmW2lzLm5hKGRmKV0gPC0gMA0KICANCiAgDQogIGNfZ3JpZCA8LSBsZWZ0X2pvaW4oY19ncmlkLCBkZlssYygiaWR4IixsdF9sYWJlbF8xW2ldLCBsdF9sYWJlbF8yW2ldKV0sIGJ5PWMoImlkeCI9ImlkeCIpKQ0KfQ0KIyBzYXZlIHJlc3VsdCANCmNfZ3JpZF9wdmF4IDwtIGNfZ3JpZA0KYGBgDQoNCiMjIyBQbG90DQpgYGB7cn0NCiMjIFBMT1QgIyMgVmFjY2luYXRpb24gUmF0ZSANCm49NDANCnBfYWxwaGEgPSAwLjYNCnBfcGFsZXR0ZSA9ICJHbkJ1Ig0KYnJrcyA9IHNlcSgwLCAxMDAsIGxlbmd0aCA9IG4rMSkNCg0KcGRmKHNwcmludGYoInBsb3QvMDVfZ3JpZF92YXhyYXRlX3Byb2Nlc3NfJXMucGRmIiwgY2VsbF9zaXplKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSkNCnBhcihtZnJvdz1jKDEsNCksIG9tYT1jKDUsNCwwLDApKzAuMSwgbWFyPWMoMCwwLDEsMSkrMC4xLCBidHk9Im4iKSANCmk9MQ0KcDEgPC0gdG1fc2hhcGUoY19ncmlkX3B2YXgpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9IGFzLmNoYXJhY3RlcihsdF9sYWJlbF8yW1tpXV0pLCBib3JkZXIuYWxwaGEgPSAwLCANCiAgICAgICAgICAgICAgcGFsZXR0ZSA9IHBfcGFsZXR0ZSwgYWxwaGEgPSBwX2FscGhhLCBicmVha3MgPSBicmtzKSArIA0KICB0bV9zaGFwZShjX2NvdW50eSkgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsNCiAgIyB0bV9zaGFwZShjX3VyYmFuKSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKyANCiAgdG1fbGF5b3V0KG1haW4udGl0bGUgPWx0X2xhYmVsXzJbW2ldXSwgbGVnZW5kLnNob3cgPSBGLCBmcmFtZSA9IEYpDQoNCmk9Mg0KcDIgPC0gdG1fc2hhcGUoY19ncmlkX3B2YXgpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9IGFzLmNoYXJhY3RlcihsdF9sYWJlbF8yW1tpXV0pLCBib3JkZXIuYWxwaGEgPSAwLCANCiAgICAgICAgICAgICAgcGFsZXR0ZSA9IHBfcGFsZXR0ZSwgYWxwaGEgPSBwX2FscGhhLCBicmVha3MgPSBicmtzKSArIA0KICB0bV9zaGFwZShjX2NvdW50eSkgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsNCiAgIyB0bV9zaGFwZShjX3VyYmFuKSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKyANCiAgdG1fbGF5b3V0KG1haW4udGl0bGUgPWx0X2xhYmVsXzJbW2ldXSwgbGVnZW5kLnNob3cgPSBGLCBmcmFtZSA9IEYpDQoNCmk9Mw0KcDMgPC0gdG1fc2hhcGUoY19ncmlkX3B2YXgpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9IGFzLmNoYXJhY3RlcihsdF9sYWJlbF8yW1tpXV0pLCBib3JkZXIuYWxwaGEgPSAwLCANCiAgICAgICAgICAgICAgcGFsZXR0ZSA9IHBfcGFsZXR0ZSwgYWxwaGEgPSBwX2FscGhhLCBicmVha3MgPSBicmtzKSArIA0KICB0bV9zaGFwZShjX2NvdW50eSkgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsNCiAgIyB0bV9zaGFwZShjX3VyYmFuKSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKyANCiAgdG1fbGF5b3V0KG1haW4udGl0bGUgPWx0X2xhYmVsXzJbW2ldXSwgbGVnZW5kLnNob3cgPSBGLCBmcmFtZSA9IEYpDQoNCmk9NA0KcDQgPC0gdG1fc2hhcGUoY19ncmlkX3B2YXgpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9IGFzLmNoYXJhY3RlcihsdF9sYWJlbF8yW1tpXV0pLCBib3JkZXIuYWxwaGEgPSAwLCANCiAgICAgICAgICAgICAgcGFsZXR0ZSA9IHBfcGFsZXR0ZSwgYWxwaGEgPSBwX2FscGhhLCBicmVha3MgPSBicmtzKSArIA0KICB0bV9zaGFwZShjX2NvdW50eSkgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsNCiAgIyB0bV9zaGFwZShjX3VyYmFuKSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKw0KICB0bV9sYXlvdXQobWFpbi50aXRsZSA9bHRfbGFiZWxfMltbaV1dLCBsZWdlbmQuc2hvdyA9IEYsIGZyYW1lID0gRikNCg0KaT01ICAjIyBsZWdlbmQNCnA1IDwtIHRtX3NoYXBlKGNfZ3JpZF9wdmF4KSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSBhcy5jaGFyYWN0ZXIobHRfbGFiZWxfMltbaV1dKSwgYm9yZGVyLmFscGhhID0gMCwgDQogICAgICAgICAgICAgIHBhbGV0dGUgPSBwX3BhbGV0dGUsIGFscGhhID0gcF9hbHBoYSwgYnJlYWtzID0gYnJrcykgKyANCiAgdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlID1sdF9sYWJlbF8yW1tpXV0sIGxlZ2VuZC5zaG93ID0gVCwgZnJhbWUgPSBGLCBsZWdlbmQub3V0c2lkZSA9IFQpDQoNCnRtYXBfYXJyYW5nZShwMSwgcDIsIHAzLCBwNCwgcDUsIHdpZHRocyA9IGMoMC41LDAuNSksIG5yb3cgPSAxKQ0KZGV2Lm9mZigpDQoNCg0KIyMgUExPVCAjIyBuIG9mIFZhY2NpbmF0ZWQgSW5kaXZpZHVhbHMNCm49NTANCnBfYWxwaGEgPSAwLjYNCmNvbHMgPSBtYWtvKG49KG4pLGFscGhhID0xLCBiZWdpbiA9IDEsIGVuZCA9IDApDQpicmtzID0gc2VxKDAsIDcwMDAsIGxlbmd0aCA9IG4rMSkNCg0KcGRmKHNwcmludGYoInBsb3QvMDZfZ3JpZF92YXhhYnNfcHJvY2Vzc18lcy5wZGYiLCBjZWxsX3NpemUpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQ0KDQppPTENCmRhdGEgPC0gY19ncmlkX3B2YXhbbHRfbGFiZWxfMVtpXV0gJT4lIGZpbHRlcihnZXQobHRfbGFiZWxfMVtbaV1dKT4wKQ0KcDEgPC0gdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArIA0KICB0bV9zaGFwZShkYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSBsdF9sYWJlbF8xW2ldLCBicmVha3MgPSBicmtzLCBwYWxldHRlID0gY29scywgYm9yZGVyLmFscGhhID0gMCkgKyANCiAgdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArDQogIHRtX3NoYXBlKGNfdXJiYW4pICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArIA0KICB0bV9sYXlvdXQobWFpbi50aXRsZSA9bHRfbGFiZWxfMVtbaV1dLCBsZWdlbmQuc2hvdyA9IEYsIGZyYW1lID0gRiwgdGl0bGUuc2l6ZSA9IDAuNSkNCg0KaT0yDQpkYXRhIDwtIGNfZ3JpZF9wdmF4W2x0X2xhYmVsXzFbaV1dICU+JSBmaWx0ZXIoZ2V0KGx0X2xhYmVsXzFbW2ldXSk+MCkNCnAyIDwtIHRtX3NoYXBlKGNfY291bnR5KSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKyANCiAgdG1fc2hhcGUoZGF0YSkgKyANCiAgdG1fcG9seWdvbnMoY29sID0gbHRfbGFiZWxfMVtpXSwgYnJlYWtzID0gYnJrcywgcGFsZXR0ZSA9IGNvbHMsIGJvcmRlci5hbHBoYSA9IDApICsgDQogIHRtX3NoYXBlKGNfY291bnR5KSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKw0KICB0bV9zaGFwZShjX3VyYmFuKSArIHRtX3BvbHlnb25zKGFscGhhID0gMCkgKyANCiAgdG1fbGF5b3V0KG1haW4udGl0bGUgPWx0X2xhYmVsXzFbW2ldXSwgbGVnZW5kLnNob3cgPSBGLCBmcmFtZSA9IEYsIHRpdGxlLnNpemUgPSAwLjUpDQoNCmk9Mw0KZGF0YSA8LSBjX2dyaWRfcHZheFtsdF9sYWJlbF8xW2ldXSAlPiUgZmlsdGVyKGdldChsdF9sYWJlbF8xW1tpXV0pPjApDQpwMyA8LSB0bV9zaGFwZShjX2NvdW50eSkgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsgDQogIHRtX3NoYXBlKGRhdGEpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9IGx0X2xhYmVsXzFbaV0sIGJyZWFrcyA9IGJya3MsIHBhbGV0dGUgPSBjb2xzLCBib3JkZXIuYWxwaGEgPSAwKSArIA0KICB0bV9zaGFwZShjX2NvdW50eSkgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsNCiAgdG1fc2hhcGUoY191cmJhbikgKyB0bV9wb2x5Z29ucyhhbHBoYSA9IDApICsgDQogIHRtX2xheW91dChtYWluLnRpdGxlID1sdF9sYWJlbF8xW1tpXV0sIGxlZ2VuZC5zaG93ID0gRiwgZnJhbWUgPSBGLCB0aXRsZS5zaXplID0gMC41KQ0KDQppPTQNCmRhdGEgPC0gY19ncmlkX3B2YXhbbHRfbGFiZWxfMVtpXV0gJT4lIGZpbHRlcihnZXQobHRfbGFiZWxfMVtbaV1dKT4wKQ0KcDQgPC0gdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArIA0KICB0bV9zaGFwZShkYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSBsdF9sYWJlbF8xW2ldLCBicmVha3MgPSBicmtzLCBwYWxldHRlID0gY29scywgYm9yZGVyLmFscGhhID0gMCkgKyANCiAgdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArDQogIHRtX3NoYXBlKGNfdXJiYW4pICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArIA0KICB0bV9sYXlvdXQobWFpbi50aXRsZSA9bHRfbGFiZWxfMVtbaV1dLCBsZWdlbmQuc2hvdyA9IEYsIGZyYW1lID0gRiwgdGl0bGUuc2l6ZSA9IDAuNSkNCg0KaT01ICAjIyBsZWdlbmQNCmRhdGEgPC0gY19ncmlkX3B2YXhbbHRfbGFiZWxfMVtpXV0gJT4lIGZpbHRlcihnZXQobHRfbGFiZWxfMVtbaV1dKT4wKQ0KcDUgPC0gdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArIA0KICB0bV9zaGFwZShkYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSBsdF9sYWJlbF8xW2ldLCBicmVha3MgPSBicmtzLCBwYWxldHRlID0gY29scywgYm9yZGVyLmFscGhhID0gMCkgKyANCiAgdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArDQogIHRtX3NoYXBlKGNfdXJiYW4pICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwKSArIA0KICB0bV9sYXlvdXQobWFpbi50aXRsZSA9bHRfbGFiZWxfMVtbaV1dLCBsZWdlbmQuc2hvdyA9IFQsIGZyYW1lID0gRiwgdGl0bGUuc2l6ZSA9IDAuNSwgbGVnZW5kLm91dHNpZGUgPSBUKQ0KDQp0bWFwX2FycmFuZ2UocDEsIHAyLCBwMywgcDQsIHA1LCB3aWR0aHMgPSBjKDAuNSwwLjUpLCBucm93ID0gMSkNCmRldi5vZmYoKQ0KDQoNCmBgYA0KDQoNCiMjIE1BUDI6IENlbnN1cyBibG9jayBncm91cCANCmBgYHtyfQ0KIyBwcmVwYXJlIGF2ZXJhZ2luZyBkYXRhIA0KZGF0YSA8LSBhYm1fZGZfdmF4W1sic3RlcF83MyJdXSAlPiUgDQogIHN0X2FzX3NmKC4sIGNvb3JkcyA9IGMoImxvbmciLCJsYXQiKSwgY3JzPTQzMjYpICU+JSANCiAgc3RfdHJhbnNmb3JtKC4sIHN0X2NycyhjX2NvdW50eSkpDQoNCmRmIDwtIGNfYmdyb3VwDQojIGFsbCBpbmRpdmlkdWFsL2FnZW50IChuPTEyNzU4NCkNCmRmWyJuX3BvcCJdIDwtIGxlbmd0aHMoc3RfaW50ZXJzZWN0cyhkZiwgZGF0YSkpDQoNCmx0X2xhYmVsIDwtIHNwcmludGYoInN0ZXA3M19yJTAxZCIsMTo1KQ0KbHRfbGFiZWxfMSA8LSBzcHJpbnRmKCJzdGVwNzNfbnZheF9yJTAxZCIsMTo1KQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobHRfbGFiZWwpKSB7DQogIHR0IDwtIGRhdGEgJT4lIGZpbHRlcihnZXQobHRfbGFiZWxbaV0pPT0xKQ0KICBkZlthcy5jaGFyYWN0ZXIobHRfbGFiZWxfMVtpXSldIDwtIGxlbmd0aHMoc3RfaW50ZXJzZWN0cyhkZiwgdHQpKQ0KfQ0KDQoNCnR0dCA8LSBkZltjKCJHRU9JRCIsbHRfbGFiZWxfMSldDQpzdF9nZW9tZXRyeSh0dHQpIDwtIE5VTEwNCnR0dFsic3RlcDczX252YXhfbWVhbiJdIDwtIHJvdW5kKGFwcGx5KHR0dFtsdF9sYWJlbF8xXSwgMSwgbWVhbikpDQoNCmRmIDwtIGxlZnRfam9pbihkZiwgdHR0W2MoIkdFT0lEIiwic3RlcDczX252YXhfbWVhbiIpXSwgYnk9YygiR0VPSUQiPSJHRU9JRCIpKQ0KZGZbInN0ZXA3M19wdmF4X21lYW4iXSA8LSByb3VuZCgxMDAgKiBkZiRzdGVwNzNfbnZheF9tZWFuIC8gZGYkbl9wb3AsIDIpDQpkZiA8LSBuYS5vbWl0KGRmKQ0KDQpwZGYoInBsb3QvMDdfY2Jncm91X3ByZWRfdmF4cmF0ZV9hXzEwMF9iXzExM19jXzMxMV9kXzEzMS5wZGYiKQ0KdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoY29sPU5BLCBhbHBoYSA9IDApICsgDQogIHRtX3NoYXBlKGRmKSArIHRtX3BvbHlnb25zKGNvbCA9ICJzdGVwNzNfcHZheF9tZWFuIiwgcGFsZXR0ZSA9ICJHbkJ1IiwgYWxwaGEgPSAwLjcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLmFscGhhID0gMCwgbHdkID0gMC4xKSArIA0KICB0bV9zaGFwZShjX3VyYmFuKSArIHRtX3BvbHlnb25zKGFscGhhID0gMCwgYm9yZGVyLmNvbCA9ICJibGFjayIsIGx3ZCA9IDAuMSkgKyANCiAgdG1fc2hhcGUoY19jb3VudHkpICsgdG1fcG9seWdvbnMoYWxwaGEgPSAwLCBib3JkZXIuY29sID0gImJsYWNrIiwgbHdkID0gMC41KSArIA0KICB0bV9sYXlvdXQobGVnZW5kLnNob3cgPSBULCBmcmFtZSA9IEZBTFNFLCBsZWdlbmQub3V0c2lkZSA9IFQpICsgDQogIHRtX2NvbXBhc3MocG9zaXRpb24gPSBjKCJsZWZ0IiwgInRvcCIpLCBub3J0aCA9IDApICsgdG1fc2NhbGVfYmFyKHBvc2l0aW9uID0gYygibGVmdCIsICJ0b3AiKSwgd2lkdGggPSAwLjE1KSANCmRldi5vZmYoKQ0KDQoNCiMjIHRlc3QgDQpkYXRhIDwtIGRmW2RmJHN0ZXA3M19wdmF4X21lYW4+NjksIF0NCnRtX3NoYXBlKGRhdGEpICsgdG1fcG9seWdvbnMoY29sID0gInN0ZXA3M19wdmF4X21lYW4iLCBwYWxldHRlID0gIkduQnUiLCBhbHBoYSA9IDAuNywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIuYWxwaGEgPSAwLjEsIGx3ZCA9IDAuMSkNCg0KIyJHbkJ1Ig0KYGBgDQoNCg==