This analysis explores how people spend their time based on the Indian Time Use Survey. We’ll look at everything from sleep and work to socializing and chores, breaking it down by age, gender, and location.

First up, let’s get the data loaded and prepped. We’ll be grouping hundreds of specific activities into broader, more understandable categories to make the analysis easier. The categorizations are based on the UN’s International Classification of Activities for Time Use Statistics (ICATUS 2016).

1 Overall Time Use Patterns

1.1 Average Sleep Over the Ages

This chart shows how our average sleep duration changes as we age. Notice the decline during adolescence, followed by a more gradual change throughout adulthood.

sleep_vs_age_plot <- timeuse_df %>%
  filter(activity == "Sleep", age < 90, age >= 6) %>%
  group_by(person_id, age, mult) %>%
  summarise(total_sleep_mins = sum(duration_mins, na.rm = TRUE),
            .groups = 'drop') %>%
  group_by(age) %>%
  summarise(avg_sleep_weighted_mins = weighted.mean(total_sleep_mins, w = mult, na.rm = TRUE)) %>%
  mutate(avg_sleep_hours = avg_sleep_weighted_mins / 60) %>%
  ggplot(aes(x = age, y = avg_sleep_hours)) +
  geom_smooth(
    method = "loess",
    se = TRUE,
    color = "black",
    fill = "gray80"
  ) +
  scale_y_continuous(limits = c(8, 13), breaks = seq(8, 13, by = 1)) +
  scale_x_continuous(breaks = seq(0, 90, by = 10), limits = c(6, 95)) +
  labs(
    title = "Average daily sleep across the ages",
    x = "Age",
    y = "Average Sleep (hours per day)",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(
      family = "ath",
      face = "bold",
      size = 18,
      margin = margin(b = 20)
    ),
    plot.caption = element_text(
      family = "ath",
      size = 10,
      color = "gray50"
    ),
    axis.title = element_text(family = "ath", size = 12)
  )

sleep_vs_age_plot
## `geom_smooth()` using formula = 'y ~ x'

# --- Essential Sleep Only ---

night_sleep_vs_age_plot <- timeuse_df %>%
  filter(activity_code == "Night sleep/essential sleep", age < 90, age >= 6) %>%
  group_by(person_id, age, mult) %>%
  summarise(total_sleep_mins = sum(duration_mins, na.rm = TRUE),
            .groups = 'drop') %>%
  group_by(age) %>%
  summarise(avg_sleep_weighted_mins = weighted.mean(total_sleep_mins, w = mult, na.rm = TRUE)) %>%
  mutate(avg_sleep_hours = avg_sleep_weighted_mins / 60) %>%
  ggplot(aes(x = age, y = avg_sleep_hours)) +
  geom_smooth(
    method = "loess",
    se = TRUE,
    color = "navy", # Changed color to distinguish from the other plot
    fill = "lightblue"
  ) +
  scale_y_continuous(limits = c(7, 12), breaks = seq(7, 12, by = 1)) + # Adjusted limits for this data
  scale_x_continuous(breaks = seq(0, 90, by = 10), limits = c(6, 95)) +
  labs(
    title = "Average daily 'Night Sleep / Essential Sleep' across the ages",
    x = "Age",
    y = "Average Essential Sleep (hours per day)",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(
      family = "ath",
      face = "bold",
      size = 18,
      margin = margin(b = 10) # Adjusted margin
    ),
    plot.subtitle = element_text(
      family = "ath",
      size = 14,
      margin = margin(b = 20),
      color = "gray40"
    ),
    plot.caption = element_text(
      family = "ath",
      size = 10,
      color = "gray50"
    ),
    axis.title = element_text(family = "ath", size = 12)
  )

night_sleep_vs_age_plot
## `geom_smooth()` using formula = 'y ~ x'

1.2 Difference in Activities by Gender

This “dumbbell” plot highlights the activities with the largest gender gaps across the entire population. It’s immediately clear that women handle a much larger share of unpaid domestic and caregiving work.

person_activity_totals <- timeuse_df %>%
  filter(!is.na(activity) & activity != "Unclassified", gender %in% c("male", "female")) %>%
  group_by(person_id, gender, mult, activity) %>%
  summarise(total_duration_mins = sum(duration_mins, na.rm = TRUE), .groups = 'drop')

gender_summary_participants <- person_activity_totals %>%
  group_by(gender, activity) %>%
  summarise(
    avg_hours_participants = weighted.mean(total_duration_mins, w = mult, na.rm = TRUE) / 60,
    .groups = 'drop'
  )

gender_summary_wide <- gender_summary_participants %>%
  pivot_wider(names_from = gender, values_from = avg_hours_participants) %>%
  mutate(gap = female - male) %>%
  mutate(gap = case_when(
    is.na(male) ~ female,
    is.na(female) ~ -male,
    TRUE ~ gap
  )) %>%
  filter(!is.na(gap)) %>%
  slice_max(order_by = abs(gap), n = 15) %>%
  mutate(activity = fct_reorder(activity, gap))

gender_gap_plot <- ggplot(gender_summary_wide, aes(y = activity)) +
  geom_segment(aes(x = male, xend = female), color = "gray", linewidth = 1.5, alpha = 0.5) +
  geom_point(aes(x = female, color = "Female"), size = 4) +
  geom_point(aes(x = male, color = "Male"), size = 4) +
  theme_fivethirtyeight() +
  scale_x_continuous(labels = format_hours_minutes, breaks = pretty_breaks(n = 5)) +
  scale_color_manual(name = "", values = c("Female" = "#0072B2", "Male" = "#D55E00")) +
  labs(
    title = "Unpaid work accounts for the largest gender gap in time use",
    subtitle = "Comparing average daily hours for male and female participants",
    x = "Average Hours Per Day (for participants)",
    y = "",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 16, margin = margin(b = 10), hjust = 0.5),
    plot.subtitle = element_text(family = "ath", size = 14, margin = margin(b = 20), color = "gray40", hjust = 0.5),
    legend.position = "top"
  )

gender_gap_plot

1.3 Rural-Urban Divide in Daily Time Use

person_activity_totals_sector <- timeuse_df %>%
  filter(!is.na(activity) & activity != "Unclassified") %>%
  group_by(person_id, sector, mult, activity) %>%
  summarise(total_duration_mins = sum(duration_mins, na.rm = TRUE), .groups = 'drop')

sector_summary_participants <- person_activity_totals_sector %>%
  group_by(sector, activity) %>%
  summarise(
    avg_hours_participants = weighted.mean(total_duration_mins, w = mult, na.rm = TRUE) / 60,
    .groups = 'drop'
  )

sector_summary_wide <- sector_summary_participants %>%
  pivot_wider(names_from = sector, values_from = avg_hours_participants) %>%
  mutate(gap = Urban - Rural) %>%
  mutate(gap = case_when(
    is.na(Urban) ~ -Rural,
    is.na(Rural) ~ Urban,
    TRUE ~ gap
  )) %>%
  filter(!is.na(gap)) %>%
  slice_max(order_by = abs(gap), n = 15) %>%
  mutate(activity = fct_reorder(activity, gap))

sector_gap_plot <- ggplot(sector_summary_wide, aes(y = activity)) +
  geom_segment(aes(x = Rural, xend = Urban), color = "gray", linewidth = 1.5, alpha = 0.5) +
  geom_point(aes(x = Urban, color = "Urban"), size = 4) +
  geom_point(aes(x = Rural, color = "Rural"), size = 4) +
  theme_fivethirtyeight() +
  scale_x_continuous(labels = format_hours_minutes, breaks = pretty_breaks(n = 5)) +
  scale_color_manual(name = "", values = c("Urban" = "#0072B2", "Rural" = "#D55E00")) +
  labs(
    title = "Rural-urban divide in daily time use",
    subtitle = "Comparing activities with the largest urban-rural disparities for participants",
    x = "Average Hours Per Day (for participants)",
    y = "",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 16, margin = margin(b = 10), hjust = 0.5),
    plot.subtitle = element_text(family = "ath", size = 14, margin = margin(b = 20), color = "gray40", hjust = 0.5),
    legend.position = "top"
  )

sector_gap_plot

1.4 A Day in the Life Across Age Groups

high_level_summary <- timeuse_df %>%
  filter(!is.na(activity) & activity != "Unclassified") %>%
  mutate(
    activity_group = case_when(
      activity == "Sleep" ~ "Sleep",
      activity %in% c("Eating & Drinking", "Personal Hygiene & Health", "Receiving Care") ~ "Personal Care",
      activity %in% c("Formal Employment", "Household Enterprise (Goods)", "Household Enterprise (Services)", "Work-Related Training", "Seeking Employment", "Setting up a Business") ~ "Paid Work",
      activity %in% c("Food & Meal Management", "Cleaning & Maintenance", "Childcare & Instruction", "Shopping", "Agriculture & Fishing (Own-Use)", "Community Volunteering", "Direct Volunteering") ~ "Unpaid Work & Care",
      activity %in% c("Formal Education", "Homework", "Additional Study") ~ "Learning",
      TRUE ~ "Leisure, Social & Travel"
    )
  )

person_activity_group_summary <- high_level_summary %>%
  group_by(person_id, activity_group) %>%
  summarise(total_duration = sum(duration_mins, na.rm = TRUE), .groups = "drop")

stacking_order <- c("Sleep", "Personal Care", "Paid Work", "Unpaid Work & Care", "Learning", "Leisure, Social & Travel")

all_persons_age_group <- high_level_summary %>%
  mutate(age_group = cut(
    age,
    breaks = c(5, 14, 24, 59, Inf),
    labels = c("Children (6-14)", "Youth (15-24)", "Adults (25-59)", "Seniors (60+)"),
    right = TRUE, include.lowest = TRUE
  )) %>%
  filter(!is.na(age_group)) %>%
  distinct(person_id, age_group, mult)

age_group_summary_total <- all_persons_age_group %>%
  tidyr::crossing(activity_group = unique(person_activity_group_summary$activity_group)) %>%
  left_join(person_activity_group_summary, by = c("person_id", "activity_group")) %>%
  mutate(total_duration = ifelse(is.na(total_duration), 0, total_duration)) %>%
  group_by(age_group, activity_group) %>%
  summarise(avg_hours = weighted.mean(total_duration, w = mult, na.rm = TRUE) / 60,
            .groups = "drop") %>%
  mutate(activity_group = factor(activity_group, levels = stacking_order))

age_strips_plot_total <- ggplot(age_group_summary_total,
                       aes(x = age_group, y = avg_hours, fill = activity_group)) +
  geom_col(position = "fill", colour = "transparent") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "Dark2", name = "") +
  labs(
    title = "Share of a 24-hour Day for All Population, by Age Group",
    x = "", y = "Percentage of Day", caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    legend.position = "bottom"
  )

all_persons_age_gender_group <- high_level_summary %>%
  filter(gender %in% c("male", "female")) %>%
  mutate(age_group = cut(
    age,
    breaks = c(5, 14, 24, 59, Inf),
    labels = c("Children (6-14)", "Youth (15-24)", "Adults (25-59)", "Seniors (60+)"),
    right = TRUE, include.lowest = TRUE
  )) %>%
  filter(!is.na(age_group)) %>%
  distinct(person_id, age_group, gender, mult)

age_gender_group_summary <- all_persons_age_gender_group %>%
  tidyr::crossing(activity_group = unique(person_activity_group_summary$activity_group)) %>%
  left_join(person_activity_group_summary, by = c("person_id", "activity_group")) %>%
  mutate(total_duration = ifelse(is.na(total_duration), 0, total_duration)) %>%
  group_by(age_group, gender, activity_group) %>%
  summarise(avg_hours = weighted.mean(total_duration, w = mult, na.rm = TRUE) / 60,
            .groups = "drop") %>%
  mutate(activity_group = factor(activity_group, levels = stacking_order))

# --- MALES ---

age_strips_plot_male <- age_gender_group_summary %>%
  filter(gender == "male") %>%
  ggplot(aes(x = age_group, y = avg_hours, fill = activity_group)) +
  geom_col(position = "fill", colour = "transparent") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "Dark2", name = "") +
  labs(
    title = "Share of a 24-hour Day for Males, by Age Group",
    x = "", y = "Percentage of Day", caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    legend.position = "bottom"
  )

# --- FEMALES ---

age_strips_plot_female <- age_gender_group_summary %>%
  filter(gender == "female") %>%
  ggplot(aes(x = age_group, y = avg_hours, fill = activity_group)) +
  geom_col(position = "fill", colour = "transparent") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "Dark2", name = "") +
  labs(
    title = "Share of a 24-hour Day for Females, by Age Group",
    x = "", y = "Percentage of Day", caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    legend.position = "bottom"
  )

all_persons_age_sector_group <- high_level_summary %>%
  mutate(age_group = cut(
    age,
    breaks = c(5, 14, 24, 59, Inf),
    labels = c("Children (6-14)", "Youth (15-24)", "Adults (25-59)", "Seniors (60+)"),
    right = TRUE, include.lowest = TRUE
  )) %>%
  filter(!is.na(age_group)) %>%
  distinct(person_id, age_group, sector, mult)

age_sector_group_summary <- all_persons_age_sector_group %>%
  tidyr::crossing(activity_group = unique(person_activity_group_summary$activity_group)) %>%
  left_join(person_activity_group_summary, by = c("person_id", "activity_group")) %>%
  mutate(total_duration = ifelse(is.na(total_duration), 0, total_duration)) %>%
  group_by(age_group, sector, activity_group) %>%
  summarise(avg_hours = weighted.mean(total_duration, w = mult, na.rm = TRUE) / 60,
            .groups = "drop") %>%
  mutate(activity_group = factor(activity_group, levels = stacking_order))


# --- Plot for Rural Population ---
age_strips_plot_rural <- age_sector_group_summary %>%
  filter(sector == "Rural") %>%
  ggplot(aes(x = age_group, y = avg_hours, fill = activity_group)) +
  geom_col(position = "fill", colour = "transparent") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "Dark2", name = "") +
  labs(
    title = "Share of a 24-hour Day for Rural Population, by Age Group",
    x = "", y = "Percentage of Day", caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    legend.position = "bottom"
  )

# --- Plot for Urban Population ---
age_strips_plot_urban <- age_sector_group_summary %>%
  filter(sector == "Urban") %>%
  ggplot(aes(x = age_group, y = avg_hours, fill = activity_group)) +
  geom_col(position = "fill", colour = "transparent") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "Dark2", name = "") +
  labs(
    title = "Share of a 24-hour Day for Urban Population, by Age Group",
    x = "", y = "Percentage of Day", caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    legend.position = "bottom"
  )

# --- Display the new plots ---
age_strips_plot_rural

age_strips_plot_urban

age_strips_plot_total

age_strips_plot_male

age_strips_plot_female

activity_colors <- c(
  "Sleep" = "#1B9E77",
  "Personal Care" = "#D95F02",
  "Paid Work" = "#7570B3",
  "Unpaid Work & Care" = "#E7298A",
  "Learning" = "#666666FF", # Changed this from green to blue
  "Leisure, Social & Travel" = "#E6AB02"
)

combined_gender_strips_plot <- age_gender_group_summary %>%
  mutate(gender = str_to_title(gender)) %>%
  ggplot(aes(x = gender, y = avg_hours, fill = activity_group)) +
  geom_col(
    position = "fill", 
    width = 0.8,
    color = "white",
    linewidth = 0.2
  ) +
  facet_wrap(~ age_group, nrow = 1) +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    breaks = seq(0, 1, by = 0.1)
  ) +
  # Use scale_fill_manual to apply our custom colors
  scale_fill_manual(values = activity_colors, name = "Activity Group:") +
  labs(
    title = "Share of a 24-Hour Day, by Gender and Age",
    subtitle = "A comparison of how males and females spend their time across ages",
    x = NULL,
    y = "Percentage of Day",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    plot.subtitle = element_text(family = "ath", size = 14, margin = margin(b = 20), color = "gray40"),
    legend.position = "bottom",
    strip.text = element_text(face = "bold", size = 12),
    axis.text.x = element_text(size = 11, face = "bold")
  )

# Display the plot
combined_gender_strips_plot

2 Focus on Children & Youth (Ages 6-24)

This section tracks how children and youth spend their time.

2.1 Top 15 Activities for Youth

person_daily_totals_youth <- timeuse_df %>%
  filter(age >= 6 & age <= 24, !is.na(activity), activity != "Unclassified", gender %in% c("male", "female")) %>%
  group_by(person_id, gender, mult, activity) %>%
  summarise(total_duration_mins = sum(duration_mins, na.rm = TRUE), .groups = 'drop')

youth_gender_summary_participants <- person_daily_totals_youth %>%
  group_by(gender, activity) %>%
  summarise(avg_hours = weighted.mean(total_duration_mins, w = mult, na.rm = TRUE) / 60,
            .groups = 'drop')

youth_gender_summary_wide <- youth_gender_summary_participants %>%
  pivot_wider(names_from = gender, values_from = avg_hours) %>%
  mutate(
    male = ifelse(is.na(male), 0, male),
    female = ifelse(is.na(female), 0, female),
    total_time = female + male
    ) %>%
  slice_max(order_by = total_time, n = 15) %>%
  mutate(activity = fct_reorder(activity, total_time))

youth_dumbbell_plot <- ggplot(youth_gender_summary_wide, aes(y = activity)) +
  geom_segment(
    aes(x = male, xend = female),
    color = "gray",
    linewidth = 1.5,
    alpha = 0.5
  ) +
  geom_point(aes(x = female, color = "Female"), size = 4) +
  geom_point(aes(x = male, color = "Male"), size = 4) +
  theme_fivethirtyeight() +
  scale_x_continuous(labels = format_hours_minutes, breaks = pretty_breaks(n = 5)) +
  scale_color_manual(name = "",
                       values = c("Female" = "#0072B2", "Male" = "#D55E00")) +
  labs(
    title = "Top Time-Consuming Activities for Youth (Ages 6-24)",
    subtitle = "Comparing average daily hours for male and female participants",
    x = "Average Hours Per Day (for participants)",
    y = "",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(
      family = "ath",
      size = 16,
      margin = margin(b = 10),
      hjust = 0.5
    ),
    plot.subtitle = element_text(
      family = "ath",
      size = 14,
      margin = margin(b = 20),
      color = "gray40",
      hjust = 0.5
    ),
    legend.position = "top"
  )

youth_dumbbell_plot

2.4 Combined Comparison

youth_activities <- c(
  "Formal Education",
  "Homework",
  "Additional Study",
  "Food & Meal Management",
  "Cleaning & Maintenance",
  "Socializing & Communication",
  "Mass Media",
  "Sports & Exercise",
  "Hobbies & Games"
)

# 1. First, SUM the total time per person for each activity
person_daily_totals <- timeuse_df %>%
  filter(
    age >= 6 & age <= 24,
    activity %in% youth_activities,
    gender %in% c("male", "female")
    ) %>%
  group_by(person_id, age, gender, sector, activity, mult) %>%
  summarise(total_activity_mins = sum(duration_mins, na.rm = TRUE), .groups = 'drop')

# 2. Now, average those daily totals
youth_summary <- person_daily_totals %>%
  group_by(age, gender, sector, activity) %>%
  summarise(avg_hours = weighted.mean(total_activity_mins, w = mult, na.rm = TRUE) / 60,
            .groups = "drop")


# --- Plot for Rural Youth (Corrected) ---
rural_youth_plot <- youth_summary %>%
  filter(sector == "Rural") %>%
  ggplot(aes(x = age, y = avg_hours, color = gender)) +
  geom_smooth(se = FALSE, size = 1.2) +
  facet_wrap(~ activity, ncol = 3, scales = "free_y") +
  scale_color_manual(name = "Gender:", values = c("female" = "#0072B2", "male" = "#D55E00")) +
  scale_y_continuous(labels = format_hours_minutes, breaks = pretty_breaks(n = 3)) +
  labs(
    title = "Activity Trends for Rural Youth (Ages 6-24)",
    subtitle = "Comparing total daily time use between male and female participants.",
    x = "Age (years)",
    y = "Average Hours Per Day (for participants)",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath", color = "gray20"),
    plot.title = element_text(size = 26, face = "bold", margin = margin(b = 10), hjust = 0),
    plot.subtitle = element_text(size = 18, margin = margin(b = 25), color = "gray40", hjust = 0),
    plot.caption = element_text(size = 12, color = "gray50"),
    strip.text = element_text(face = "bold", size = 12, hjust = 0.5),
    axis.title = element_text(size = 14),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "bottom"
  )

# --- Plot for Urban Youth (Corrected) ---
urban_youth_plot <- youth_summary %>%
  filter(sector == "Urban") %>%
  ggplot(aes(x = age, y = avg_hours, color = gender)) +
  geom_smooth(se = FALSE, size = 1.2) +
  facet_wrap(~ activity, ncol = 3, scales = "free_y") +
  scale_color_manual(name = "Gender:", values = c("female" = "#0072B2", "male" = "#D55E00")) +
  scale_y_continuous(labels = format_hours_minutes, breaks = pretty_breaks(n = 3)) +
  labs(
    title = "Activity Trends for Urban Youth (Ages 6-24)",
    subtitle = "Comparing total daily time use between male and female participants.",
    x = "Age (years)",
    y = "Average Hours Per Day (for participants)",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  theme(
    text = element_text(family = "ath", color = "gray20"),
    plot.title = element_text(size = 26, face = "bold", margin = margin(b = 10), hjust = 0),
    plot.subtitle = element_text(size = 18, margin = margin(b = 25), color = "gray40", hjust = 0),
    plot.caption = element_text(size = 12, color = "gray50"),
    strip.text = element_text(face = "bold", size = 12, hjust = 0.5),
    axis.title = element_text(size = 14),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "bottom"
  )

rural_youth_plot
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

urban_youth_plot
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

3 Exports and Download

dir.create("exports", showWarnings = FALSE)

export_theme <- theme(
  plot.title = element_text(size = 58),
  plot.subtitle = element_text(size = 42),
  plot.caption = element_text(size = 24),
  axis.title = element_text(size = 38),
  axis.text = element_text(size = 28),
  legend.text = element_text(size = 28),
  legend.title = element_text(size = 26),
  strip.text = element_text(size = 38)
)

ggsave(filename = "exports/01_sleep_vs_age.png",
       plot = sleep_vs_age_plot + export_theme,
       width = 10, height = 8, dpi = 300, units = "in")
## `geom_smooth()` using formula = 'y ~ x'
ggsave(filename = "exports/02_gender_gap_top15.png",
       plot = gender_gap_plot + export_theme,
       width = 10, height = 10, dpi = 300, units = "in")

ggsave(filename = "exports/03_sector_gap_top15.png",
       plot = sector_gap_plot + export_theme,
       width = 10, height = 10, dpi = 300, units = "in")

ggsave(filename = "exports/04_age_strips_total.png",
       plot = age_strips_plot_total + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")

ggsave(filename = "exports/05_age_strips_male.png",
       plot = age_strips_plot_male + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")

ggsave(filename = "exports/06_age_strips_female.png",
       plot = age_strips_plot_female + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")

ggsave(filename = "exports/07_youth_top15_dumbbell.png",
       plot = youth_dumbbell_plot + export_theme,
       width = 10, height = 10, dpi = 300, units = "in")

ggsave(filename = "exports/08_youth_trends_by_gender.png",
       plot = youth_gender_trends_plot + export_theme,
       width = 12, height = 10, dpi = 300, units = "in")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggsave(filename = "exports/09_youth_trends_by_sector.png",
       plot = youth_sector_trends_plot + export_theme,
       width = 12, height = 10, dpi = 300, units = "in")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggsave(filename = "exports/10_rural_youth_trends.png",
       plot = rural_youth_plot + export_theme,
       width = 12, height = 10, dpi = 300, units = "in")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggsave(filename = "exports/11_urban_youth_trends.png",
       plot = urban_youth_plot + export_theme,
       width = 12, height = 10, dpi = 300, units = "in")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggsave(filename = "exports/12_age_strips_rural.png",
       plot = age_strips_plot_rural + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")

ggsave(filename = "exports/13_age_strips_urban.png",
       plot = age_strips_plot_urban + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")

ggsave(filename = "exports/14_essential_sleep.png",
       plot = night_sleep_vs_age_plot + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")
## `geom_smooth()` using formula = 'y ~ x'
ggsave(filename = "exports/15_combined_gender_age_strips.png",
       plot = combined_gender_strips_plot + export_theme,
       width = 12, height = 9, dpi = 300, units = "in")
zip_file <- "time_use_analysis_bundle.zip"
files_to_zip <- c(
  list.files("exports", full.names = TRUE, pattern = "\\.png$"),
  "time-use-analysis.Rmd"
)

zip::zip(zipfile = zip_file, files = files_to_zip, mode = "cherry-pick")

download_file(
  path = zip_file,
  output_name = "Download Analysis Bundle (ZIP)",
  button_label = "Download Bundle",
  button_type = "success",
  has_icon = TRUE,
  icon = "fa fa-download",
  self_contained = TRUE
)
LS0tCnRpdGxlOiAiVGltZSBVc2UgQW5hbHlzaXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IHJlYWRhYmxlCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGZpZ193aWR0aDogMTAKICAgIGZpZ19oZWlnaHQ6IDgKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAga2VlcF9tZDogZmFsc2UKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpUaGlzIGFuYWx5c2lzIGV4cGxvcmVzIGhvdyBwZW9wbGUgc3BlbmQgdGhlaXIgdGltZSBiYXNlZCBvbiB0aGUgSW5kaWFuIFRpbWUgVXNlIFN1cnZleS4gV2UnbGwgbG9vayBhdCBldmVyeXRoaW5nIGZyb20gc2xlZXAgYW5kIHdvcmsgdG8gc29jaWFsaXppbmcgYW5kIGNob3JlcywgYnJlYWtpbmcgaXQgZG93biBieSBhZ2UsIGdlbmRlciwgYW5kIGxvY2F0aW9uLgoKRmlyc3QgdXAsIGxldCdzIGdldCB0aGUgZGF0YSBsb2FkZWQgYW5kIHByZXBwZWQuIFdlJ2xsIGJlIGdyb3VwaW5nIGh1bmRyZWRzIG9mIHNwZWNpZmljIGFjdGl2aXRpZXMgaW50byBicm9hZGVyLCBtb3JlIHVuZGVyc3RhbmRhYmxlIGNhdGVnb3JpZXMgdG8gbWFrZSB0aGUgYW5hbHlzaXMgZWFzaWVyLiBUaGUgY2F0ZWdvcml6YXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgW1VOJ3MgSW50ZXJuYXRpb25hbCBDbGFzc2lmaWNhdGlvbiBvZiBBY3Rpdml0aWVzIGZvciBUaW1lIFVzZSBTdGF0aXN0aWNzIChJQ0FUVVMgMjAxNildKGh0dHBzOi8vdW5zdGF0cy51bi5vcmcvdW5zZC9nZW5kZXIvdGltZXVzZS8yMzAxMjAxOSUyMElDQVRVUy5wZGYpLgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoYXJyb3cpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkoc2hvd3RleHQpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZ3RleHQpCmxpYnJhcnkoZ2x1ZSkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoemlwKQpsaWJyYXJ5KGRvd25sb2FkdGhpcykKCmZvbnRfYWRkX2dvb2dsZSgiQXRraW5zb24gSHlwZXJsZWdpYmxlIiwgImF0aCIpCnNob3d0ZXh0X2F1dG8oKQoKZm9ybWF0X2hvdXJzX21pbnV0ZXMgPC0gZnVuY3Rpb24oeCkgewogIG91dCA8LSByZXAoTkFfY2hhcmFjdGVyXywgbGVuZ3RoKHgpKQogIHZhbGlkX2luZGljZXMgPC0gIWlzLm5hKHgpCiAgaWYgKCFhbnkodmFsaWRfaW5kaWNlcykpIHsKICAgIHJldHVybihvdXQpCiAgfQogIHZhbGlkX3ggPC0geFt2YWxpZF9pbmRpY2VzXQogIGhvdXJzIDwtIGZsb29yKHZhbGlkX3gpCiAgbWludXRlcyA8LSByb3VuZCgodmFsaWRfeCAlJSAxKSAqIDYwKQogIGlzXzYwIDwtIG1pbnV0ZXMgPT0gNjAKICBob3Vyc1tpc182MF0gPC0gaG91cnNbaXNfNjBdICsgMQogIG1pbnV0ZXNbaXNfNjBdIDwtIDAKICBmb3JtYXR0ZWRfc3RyaW5ncyA8LSBjYXNlX3doZW4oCiAgICBob3VycyA8IDEgfiBzcHJpbnRmKCIlZG0iLCBhcy5pbnRlZ2VyKG1pbnV0ZXMpKSwKICAgIG1pbnV0ZXMgPT0gMCB+IHNwcmludGYoIiVkaCIsIGFzLmludGVnZXIoaG91cnMpKSwKICAgIFRSVUUgfiBzcHJpbnRmKCIlZGggJTAyZG0iLCBhcy5pbnRlZ2VyKGhvdXJzKSwgYXMuaW50ZWdlcihtaW51dGVzKSkKICApCiAgb3V0W3ZhbGlkX2luZGljZXNdIDwtIGZvcm1hdHRlZF9zdHJpbmdzCiAgcmV0dXJuKG91dCkKfQoKCnRyeUNhdGNoKHsKICB0aW1ldXNlX2RmIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoInRpbWV1c2UucGFycXVldCIpCiAgcHJpbnQoIlN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIHRpbWV1c2UucGFycXVldCBmaWxlLiIpCn0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogIHByaW50KAogICAgIkVycm9yIGxvYWRpbmcgcGFycXVldCBmaWxlLiBNYWtlIHN1cmUgdGhlIGZpbGUgJ3RpbWV1c2UucGFycXVldCcgaXMgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeS4iCiAgKQogIHByaW50KGUpCn0pCgpjYWxjdWxhdGVfZHVyYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsKICBkZiAlPiUKICAgIG11dGF0ZSgKICAgICAgc3RhcnRfc2VjcyA9IGx1YnJpZGF0ZTo6cGVyaW9kX3RvX3NlY29uZHMobHVicmlkYXRlOjpobSh0aW1lX2Zyb20pKSwKICAgICAgZW5kX3NlY3MgPSBsdWJyaWRhdGU6OnBlcmlvZF90b19zZWNvbmRzKGx1YnJpZGF0ZTo6aG0odGltZV90bykpLAogICAgICBkdXJhdGlvbl9taW5zID0gKGVuZF9zZWNzIC0gc3RhcnRfc2VjcykgLyA2MCwKICAgICAgZHVyYXRpb25fbWlucyA9IGlmZWxzZShkdXJhdGlvbl9taW5zIDwgMCwgZHVyYXRpb25fbWlucyArIDE0NDAsIGR1cmF0aW9uX21pbnMpCiAgICApCn0KCnRpbWV1c2VfZGYgPC0gY2FsY3VsYXRlX2R1cmF0aW9uKHRpbWV1c2VfZGYpCgp0aW1ldXNlX2RmIDwtIHRpbWV1c2VfZGYgJT4lCiAgbXV0YXRlKAogICAgYWN0aXZpdHkgPSBjYXNlX3doZW4oCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJFbXBsb3ltZW50IGluIGNvcnBvcmF0aW9ucywgZ292ZXJubWVudCBhbmQgbm9uLXByb2ZpdCBpbnN0aXR1dGlvbnMiCiAgICAgICkgfiAiRm9ybWFsIEVtcGxveW1lbnQiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiR3Jvd2luZyBvZiBjcm9wcyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJSYWlzaW5nIGFuaW1hbHMgZm9yIHRoZSBtYXJrZXQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiRm9yZXN0cnkgYW5kIGxvZ2dpbmcgZm9yIHRoZSBtYXJrZXQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiRmlzaGluZyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJBcXVhY3VsdHVyZSBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJNaW5pbmcgYW5kIHF1YXJyeWluZyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJNYWtpbmcgYW5kIHByb2Nlc3NpbmcgZ29vZHMgZm9yIHRoZSBtYXJrZXQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiQ29uc3RydWN0aW9uIGFjdGl2aXRpZXMgZm9yIHRoZSBtYXJrZXQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGVtcGxveW1lbnQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIHRvIHByb2R1Y2UgZ29vZHMiCiAgICAgICkgfiAiSG91c2Vob2xkIEVudGVycHJpc2UgKEdvb2RzKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJWZW5kaW5nIGFuZCB0cmFkaW5nIG9mIGdvb2RzIGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIlByb3ZpZGluZyBwYWlkIHJlcGFpciwgaW5zdGFsbGF0aW9uLCBtYWludGVuYW5jZSBhbmQgZGlzcG9zYWwgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiUHJvdmlkaW5nIHBhaWQgYnVzaW5lc3MgYW5kIHByb2Zlc3Npb25hbCBzZXJ2aWNlcyBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJUcmFuc3BvcnRpbmcgZ29vZHMgYW5kIHBhc3NlbmdlcnMgZm9yIHBheSBvciBwcm9maXQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiUHJvdmlkaW5nIHBhaWQgcGVyc29uYWwgY2FyZSBzZXJ2aWNlcyBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJQcm92aWRpbmcgcGFpZCBkb21lc3RpYyBzZXJ2aWNlcyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBlbXBsb3ltZW50IGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyBwcm92aWRpbmcgc2VydmljZXMiCiAgICAgICkgfiAiSG91c2Vob2xkIEVudGVycHJpc2UgKFNlcnZpY2VzKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJBY3Rpdml0aWVzIGFuY2lsbGFyeSB0byBlbXBsb3ltZW50IiwKICAgICAgICAiQnJlYWtzIGR1cmluZyB3b3JraW5nIHRpbWUgd2l0aGluIGVtcGxveW1lbnQiCiAgICAgICkgfiAiQW5jaWxsYXJ5ICYgQnJlYWtzIChXb3JrKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJUcmFpbmluZyBhbmQgc3R1ZGllcyBpbiByZWxhdGlvbiB0byBlbXBsb3ltZW50IikgfiAiV29yay1SZWxhdGVkIFRyYWluaW5nIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIlNlZWtpbmcgZW1wbG95bWVudCIpIH4gIlNlZWtpbmcgRW1wbG95bWVudCIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJTZXR0aW5nIHVwIGEgYnVzaW5lc3MiKSB+ICJTZXR0aW5nIHVwIGEgQnVzaW5lc3MiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiRW1wbG95bWVudC1yZWxhdGVkIHRyYXZlbCIsICJDb21tdXRpbmciKSB+ICJUcmF2ZWwgKFdvcmspIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkdyb3dpbmcgY3JvcHMgYW5kIGtpdGNoZW4gZ2FyZGVuaW5nLCBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkZhcm1pbmcgb2YgYW5pbWFscyBhbmQgcHJvZHVjdGlvbiBvZiBhbmltYWwgcHJvZHVjdHMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJIdW50aW5nLCB0cmFwcGluZyBhbmQgcHJvZHVjdGlvbiBvZiBhbmltYWwgc2tpbnMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJGb3Jlc3RyeSBhbmQgbG9nZ2luZyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkdhdGhlcmluZyB3aWxkIHByb2R1Y3RzIGZvciBvd24gZmluYWwgdXNlIiwKICAgICAgICAiRmlzaGluZyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkFxdWFjdWx0dXJlIGZvciBvd24gZmluYWwgdXNlIiwKICAgICAgICAiTWluaW5nIGFuZCBxdWFycnlpbmcgZm9yIG93biBmaW5hbCB1c2UiCiAgICAgICkgfiAiQWdyaWN1bHR1cmUgJiBGaXNoaW5nIChPd24tVXNlKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJNYWtpbmcsIHByb2Nlc3NpbmcgZm9vZCBwcm9kdWN0cywgYmV2ZXJhZ2VzIGFuZCB0b2JhY2NvIGZvciBvd24gZmluYWwgdXNlIiwKICAgICAgICAiTWFraW5nLCBwcm9jZXNzaW5nIHRleHRpbGVzLCB3ZWFyaW5nIGFwcGFyZWwsIGxlYXRoZXIgYW5kIHJlbGF0ZWQgcHJvZHVjdHMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJNYWtpbmcsIHByb2Nlc3Npbmcgb2Ygd29vZCBhbmQgYmFyayBwcm9kdWN0cyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIk1ha2luZywgcHJvY2Vzc2luZyBicmlja3MsIGNvbmNyZXRlIHNsYWJzLCBob2xsb3cgYmxvY2tzLCB0aWxlcyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIk1ha2luZywgcHJvY2Vzc2luZyBoZXJiYWwgYW5kIG1lZGljaW5hbCBwcmVwYXJhdGlvbnMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJNYWtpbmcsIHByb2Nlc3NpbmcgbWV0YWxzIGFuZCBtZXRhbCBwcm9kdWN0cyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIk1ha2luZywgcHJvY2Vzc2luZyBvZiBwcm9kdWN0cyB1c2luZyBvdGhlciBtYXRlcmlhbHMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJBY3F1aXJpbmcgc3VwcGxpZXMgYW5kIGRpc3Bvc2luZyBvZiBwcm9kdWN0cyBhbmQgb3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIG1ha2luZyBhbmQgcHJvY2Vzc2luZyBnb29kcyBmb3Igb3duIGZpbmFsIHVzZSIKICAgICAgKSB+ICJQcm9jZXNzaW5nIEdvb2RzIChPd24tVXNlKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJDb25zdHJ1Y3Rpb24gYWN0aXZpdGllcyBmb3Igb3duIGZpbmFsIHVzZSIpIH4gIkNvbnN0cnVjdGlvbiAoT3duLVVzZSkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiR2F0aGVyaW5nIGZpcmV3b29kIGFuZCBvdGhlciBuYXR1cmFsIHByb2R1Y3RzIHVzZWQgYXMgZnVlbCBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkZldGNoaW5nIHdhdGVyIGZyb20gbmF0dXJhbCBhbmQgb3RoZXIgc291cmNlcyBmb3Igb3duIGZpbmFsIHVzZSIKICAgICAgKSB+ICJDb2xsZWN0aW5nIFdhdGVyICYgRnVlbCAoT3duLVVzZSkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZywgbW92aW5nLCB0cmFuc3BvcnRpbmcgb3IgYWNjb21wYW55aW5nIGdvb2RzIG9yIHBlcnNvbnMgcmVsYXRlZCB0byBvd24tdXNlIHByb2R1Y3Rpb24gb2YgZ29vZHMiCiAgICAgICkgfiAiVHJhdmVsIChPd24tVXNlIFByb2R1Y3Rpb24pIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlByZXBhcmluZyBtZWFscy9zbmFja3MiLAogICAgICAgICJTZXJ2aW5nIG1lYWxzL3NuYWNrcyIsCiAgICAgICAgIkNsZWFuaW5nIHVwIGFmdGVyIGZvb2QgcHJlcGFyYXRpb24vbWVhbHMvc25hY2tzIiwKICAgICAgICAiU3RvcmluZywgYXJyYW5naW5nLCBwcmVzZXJ2aW5nIGZvb2Qgc3RvY2tzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGZvb2QgYW5kIG1lYWxzIG1hbmFnZW1lbnQgYW5kIHByZXBhcmF0aW9uIgogICAgICApIH4gIkZvb2QgJiBNZWFsIE1hbmFnZW1lbnQiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiSW5kb29yIGNsZWFuaW5nIiwKICAgICAgICAiT3V0ZG9vciBjbGVhbmluZyIsCiAgICAgICAgIlJlY3ljbGluZyBhbmQgZGlzcG9zYWwgb2YgZ2FyYmFnZSIsCiAgICAgICAgIlVwa2VlcCBvZiBpbmRvb3Ivb3V0ZG9vciBwbGFudHMsIGhlZGdlcywgZ2FyZGVuLCBncm91bmRzLCBsYW5kc2NhcGUsIGV0Yy4iLAogICAgICAgICJUZW5kaW5nIGZ1cm5hY2UsIGJvaWxlciwgZmlyZXBsYWNlIGZvciBoZWF0aW5nIGFuZCB3YXRlciBzdXBwbHkiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY2xlYW5pbmcgYW5kIHVwa2VlcCBvZiBkd2VsbGluZyBhbmQgc3Vycm91bmRpbmdzIgogICAgICApIH4gIkNsZWFuaW5nICYgTWFpbnRlbmFuY2UiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiRG8taXQteW91cnNlbGYgaW1wcm92ZW1lbnQsIG1haW50ZW5hbmNlIGFuZCByZXBhaXIgb2Ygb3duIGR3ZWxsaW5nIiwKICAgICAgICAiSW5zdGFsbGF0aW9uLCBzZXJ2aWNpbmcgYW5kIHJlcGFpciBvZiBwZXJzb25hbCBhbmQgaG91c2Vob2xkIGdvb2RzIGluY2x1ZGluZyBJQ1QgZXF1aXBtZW50IiwKICAgICAgICAiVmVoaWNsZSBtYWludGVuYW5jZSBhbmQgcmVwYWlycyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBkby1pdC15b3Vyc2VsZiBkZWNvcmF0aW9uLCBtYWludGVuYW5jZSBhbmQgcmVwYWlyIgogICAgICApIH4gIkRJWSBNYWludGVuYW5jZSAmIFJlcGFpciIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJIYW5kL21hY2hpbmUtd2FzaGluZyIsCiAgICAgICAgIkRyeWluZyB0ZXh0aWxlcyBhbmQgY2xvdGhpbmciLAogICAgICAgICJJcm9uaW5nL3ByZXNzaW5nL2ZvbGRpbmciLAogICAgICAgICJNZW5kaW5nL3JlcGFpcmluZyBhbmQgY2FyZSBvZiBjbG90aGVzIGFuZCBzaG9lczsgY2xlYW5pbmcgYW5kIHBvbGlzaGluZyBzaG9lcyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjYXJlIG9mIHRleHRpbGVzIGFuZCBmb290d2VhciIKICAgICAgKSB+ICJUZXh0aWxlcyAmIEZvb3R3ZWFyIENhcmUiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiUGF5aW5nIGhvdXNlaG9sZCBiaWxscyIsCiAgICAgICAgIkJ1ZGdldGluZywgcGxhbm5pbmcsIG9yZ2FuaXppbmcgZHV0aWVzIGFuZCBhY3Rpdml0aWVzIGluIHRoZSBob3VzZWhvbGQiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gaG91c2Vob2xkIG1hbmFnZW1lbnQiCiAgICAgICkgfiAiSG91c2Vob2xkIE1hbmFnZW1lbnQiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiRGFpbHkgcGV0IGNhcmUiLAogICAgICAgICJVc2luZyB2ZXRlcmluYXJ5IGNhcmUgb3Igb3RoZXIgcGV0IGNhcmUgc2VydmljZXMgKGdyb29taW5nLCBzdGFibGluZywgaG9saWRheSBvciBkYXkgY2FyZSkiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gcGV0IGNhcmUiCiAgICAgICkgfiAiUGV0IENhcmUiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiU2hvcHBpbmcgZm9yL3B1cmNoYXNpbmcgb2YgZ29vZHMgYW5kIHJlbGF0ZWQgYWN0aXZpdGllcyIsCiAgICAgICAgIlNob3BwaW5nIGZvci9hdmFpbGluZyBvZiBzZXJ2aWNlcyBhbmQgcmVsYXRlZCBhY3Rpdml0eSIKICAgICAgKSB+ICJTaG9wcGluZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJUcmF2ZWxsaW5nLCBtb3ZpbmcsIHRyYW5zcG9ydGluZyBvciBhY2NvbXBhbnlpbmcgZ29vZHMgb3IgcGVyc29ucyByZWxhdGVkIHRvIHVucGFpZCBkb21lc3RpYyBzZXJ2aWNlcyBmb3IgaG91c2Vob2xkIG1lbWJlcnMiCiAgICAgICkgfiAiVHJhdmVsIChEb21lc3RpYyBTZXJ2aWNlcykiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiT3RoZXIgdW5wYWlkIGRvbWVzdGljIHNlcnZpY2VzIGZvciBob3VzZWhvbGQgbWVtYmVycyIpIH4gIk90aGVyIERvbWVzdGljIFNlcnZpY2VzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkNhcmluZyBmb3IgY2hpbGRyZW4gaW5jbHVkaW5nIGZlZWRpbmcsIGNsZWFuaW5nLCBwaHlzaWNhbCBjYXJlIiwKICAgICAgICAiUHJvdmlkaW5nIG1lZGljYWwgY2FyZSB0byBjaGlsZHJlbiIsCiAgICAgICAgIkluc3RydWN0aW5nLCB0ZWFjaGluZywgdHJhaW5pbmcsIGhlbHBpbmcgY2hpbGRyZW4iLAogICAgICAgICJUYWxraW5nIHdpdGggYW5kIHJlYWRpbmcgdG8gY2hpbGRyZW4iLAogICAgICAgICJQbGF5aW5nIGFuZCBzcG9ydHMgd2l0aCBjaGlsZHJlbiIsCiAgICAgICAgIk1pbmRpbmcgY2hpbGRyZW4gKHBhc3NpdmUgY2FyZSkiLAogICAgICAgICJNZWV0aW5ncyBhbmQgYXJyYW5nZW1lbnRzIHdpdGggc2Nob29scyBhbmQgY2hpbGQgY2FyZSBzZXJ2aWNlIHByb3ZpZGVycyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjaGlsZGNhcmUgYW5kIGluc3RydWN0aW9uIgogICAgICApIH4gIkNoaWxkY2FyZSAmIEluc3RydWN0aW9uIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkFzc2lzdGluZyBkZXBlbmRlbnQgYWR1bHRzIHdpdGggdGFza3Mgb2YgZGFpbHkgbGl2aW5nIiwKICAgICAgICAiQXNzaXN0aW5nIGRlcGVuZGVudCBhZHVsdHMgd2l0aCBtZWRpY2FsIGNhcmUiLAogICAgICAgICJBc3Npc3RpbmcgZGVwZW5kZW50IGFkdWx0cyB3aXRoIGZvcm1zLCBhZG1pbmlzdHJhdGlvbiwgYWNjb3VudHMiLAogICAgICAgICJBZmZlY3RpdmUvZW1vdGlvbmFsIHN1cHBvcnQgZm9yIGRlcGVuZGVudCBhZHVsdHMiLAogICAgICAgICJQYXNzaXZlIGNhcmUgb2YgZGVwZW5kZW50IGFkdWx0IiwKICAgICAgICAiTWVldGluZ3MgYW5kIGFycmFuZ2VtZW50cyB3aXRoIGFkdWx0IGNhcmUgc2VydmljZSBwcm92aWRlcnMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY2FyZSBmb3IgZGVwZW5kZW50IGFkdWx0cyIKICAgICAgKSB+ICJDYXJlIGZvciBEZXBlbmRlbnQgQWR1bHRzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkZlZWRpbmcsIGNsZWFuaW5nLCBwaHlzaWNhbCBjYXJlIGZvciBub24tZGVwZW5kZW50IGFkdWx0IGhvdXNlaG9sZCBtZW1iZXJzIGluY2x1ZGluZyBmb3IgdGVtcG9yYXJ5IGlsbG5lc3MiLAogICAgICAgICJBZmZlY3RpdmUvZW1vdGlvbmFsIHN1cHBvcnQgZm9yIG5vbi1kZXBlbmRlbnQgYWR1bHQgaG91c2Vob2xkIG1lbWJlcnMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY2FyZSBmb3Igbm9uLWRlcGVuZGVudCBhZHVsdCBob3VzZWhvbGQgbWVtYmVycyIKICAgICAgKSB+ICJIZWxwIHRvIE5vbi1EZXBlbmRlbnQgQWR1bHRzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlRyYXZlbGxpbmcgcmVsYXRlZCB0byBjYXJlLWdpdmluZyBzZXJ2aWNlcyBmb3IgaG91c2Vob2xkIG1lbWJlcnMiLAogICAgICAgICJBY2NvbXBhbnlpbmcgb3duIGNoaWxkcmVuIiwKICAgICAgICAiQWNjb21wYW55aW5nIGRlcGVuZGVudCBhZHVsdHMiLAogICAgICAgICJBY2NvbXBhbnlpbmcgbm9uLWRlcGVuZGVudCBhZHVsdCBob3VzZWhvbGQgbWVtYmVycyIKICAgICAgKSB+ICJUcmF2ZWwgKENhcmVnaXZpbmcpIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byB1bnBhaWQgY2FyZWdpdmluZyBzZXJ2aWNlcyBmb3IgaG91c2Vob2xkIG1lbWJlcnMiCiAgICAgICkgfiAiT3RoZXIgQ2FyZWdpdmluZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIGhvdXNlaG9sZCBtYWludGVuYW5jZSwgbWFuYWdlbWVudCwgY29uc3RydWN0aW9uLCByZW5vdmF0aW9uIGFuZCByZXBhaXIiLAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIHNob3BwaW5nL3B1cmNoYXNpbmcgZ29vZHMgYW5kIHNlcnZpY2VzIiwKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBjaGlsZGNhcmUgYW5kIGluc3RydWN0aW9uIiwKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBjYXJlIGZvciBhZHVsdHMiLAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIGFjdGl2aXRpZXMgaW4gZW50ZXJwcmlzZXMgb3duZWQgYnkgb3RoZXIgaG91c2Vob2xkcyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBkaXJlY3QgdW5wYWlkIHZvbHVudGVlcmluZyBmb3Igb3RoZXIgaG91c2Vob2xkcyIKICAgICAgKSB+ICJEaXJlY3QgVm9sdW50ZWVyaW5nIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlVucGFpZCB2b2x1bnRlZXIgd29yayBvbiByb2FkL2J1aWxkaW5nIHJlcGFpciwgY2xlYXJpbmcgYW5kIHByZXBhcmluZyBsYW5kLCBjbGVhbmluZyAoc3RyZWV0cywgbWFya2V0cywgZXRjLiksIGFuZCBjb25zdHJ1Y3Rpb24iLAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIHByZXBhcmluZy9zZXJ2aW5nIG1lYWxzLCBjbGVhbmluZyB1cCIsCiAgICAgICAgIlVucGFpZCB2b2x1bnRlZXIgY3VsdHVyYWwgYWN0aXZpdGllcywgcmVjcmVhdGlvbiBhbmQgc3BvcnRzIGFjdGl2aXRpZXMiLAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIG9mZmljZS9hZG1pbmlzdHJhdGl2ZSB3b3JrIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGNvbW11bml0eS0gYW5kIG9yZ2FuaXphdGlvbmJhc2VkIHVucGFpZCB2b2x1bnRlZXJpbmciCiAgICAgICkgfiAiQ29tbXVuaXR5IFZvbHVudGVlcmluZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJVbnBhaWQgdHJhaW5lZSB3b3JrIGFuZCByZWxhdGVkIGFjdGl2aXRpZXMiKSB+ICJUcmFpbmVlIFdvcmsiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZyB0aW1lIHJlbGF0ZWQgdG8gdW5wYWlkIHZvbHVudGVlciwgdHJhaW5lZSBhbmQgb3RoZXIgdW5wYWlkIHdvcmsiCiAgICAgICkgfiAiVHJhdmVsIChWb2x1bnRlZXJpbmcpIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIk90aGVyIHVucGFpZCB3b3JrIGFjdGl2aXRpZXMiKSB+ICJPdGhlciBVbnBhaWQgV29yayIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJTY2hvb2wvdW5pdmVyc2l0eSBhdHRlbmRhbmNlIiwKICAgICAgICAiRXh0cmEtY3VycmljdWxhciBhY3Rpdml0aWVzIiwKICAgICAgICAiQnJlYWtzIGF0IHBsYWNlIG9mIGZvcm1hbCBlZHVjYXRpb24iLAogICAgICAgICJTZWxmLXN0dWR5IGZvciBkaXN0YW5jZSBlZHVjYXRpb24gY291cnNlIHdvcmsgKHZpZGVvLCBhdWRpbywgb25saW5lKSIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBmb3JtYWwgZWR1Y2F0aW9uIgogICAgICApIH4gIkZvcm1hbCBFZHVjYXRpb24iLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiSG9tZXdvcmssIGJlaW5nIHR1dG9yZWQsIGNvdXJzZSByZXZpZXcsIHJlc2VhcmNoIGFuZCBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gZm9ybWFsIGVkdWNhdGlvbiIKICAgICAgKSB+ICJIb21ld29yayIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJBZGRpdGlvbmFsIHN0dWR5LCBub24tZm9ybWFsIGVkdWNhdGlvbiBhbmQgY291cnNlcyIpIH4gIkFkZGl0aW9uYWwgU3R1ZHkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiVHJhdmVsbGluZyB0aW1lIHJlbGF0ZWQgdG8gbGVhcm5pbmciKSB+ICJUcmF2ZWwgKExlYXJuaW5nKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gbGVhcm5pbmciKSB+ICJPdGhlciBMZWFybmluZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJUYWxraW5nLCBjb252ZXJzaW5nLCBjaGF0dGluZyIsCiAgICAgICAgIlNvY2lhbGl6aW5nL2dldHRpbmcgdG9nZXRoZXIvZ2F0aGVyaW5nIGFjdGl2aXRpZXMiLAogICAgICAgICJSZWFkaW5nIGFuZCB3cml0aW5nIG1haWwgKGluY2x1ZGluZyBlbWFpbCkiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gc29jaWFsaXppbmcgYW5kIGNvbW11bmljYXRpb24iCiAgICAgICkgfiAiU29jaWFsaXppbmcgJiBDb21tdW5pY2F0aW9uIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlBhcnRpY2lwYXRpbmcgaW4gY29tbXVuaXR5IGNlbGVicmF0aW9ucyBvZiBjdWx0dXJhbC9oaXN0b3JpYyBldmVudHMiLAogICAgICAgICJQYXJ0aWNpcGF0aW5nIGluIGNvbW11bml0eSByaXRlcy9ldmVudHMgKG5vbi1yZWxpZ2lvdXMpIG9mIHdlZGRpbmdzLCBmdW5lcmFscywgYmlydGhzIGFuZCBzaW1pbGFyIHJpdGVzLW9mcGFzc2FnZSIsCiAgICAgICAgIlBhcnRpY2lwYXRpbmcgaW4gY29tbXVuaXR5IHNvY2lhbCBmdW5jdGlvbnMgKG11c2ljLCBkYW5jZSwgZXRjLikiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY29tbXVuaXR5IHBhcnRpY2lwYXRpb24iCiAgICAgICkgfiAiQ29tbXVuaXR5IEV2ZW50cyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJJbnZvbHZlbWVudCBpbiBjaXZpYyBhbmQgcmVsYXRlZCByZXNwb25zaWJpbGl0aWVzIikgfiAiQ2l2aWMgUmVzcG9uc2liaWxpdGllcyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJQcml2YXRlIHByYXllciwgbWVkaXRhdGlvbiBhbmQgb3RoZXIgc3Bpcml0dWFsIGFjdGl2aXRpZXMiLAogICAgICAgICJQYXJ0aWNpcGF0aW5nIGluIGNvbGxlY3RpdmUgcmVsaWdpb3VzIHByYWN0aWNlIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIHJlbGlnaW91cyBwcmFjdGljZSIKICAgICAgKSB+ICJSZWxpZ2lvdXMgUHJhY3RpY2VzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlRyYXZlbGxpbmcgdGltZSByZWxhdGVkIHRvIHNvY2lhbGl6aW5nIGFuZCBjb21tdW5pY2F0aW9uLCBjb21tdW5pdHkgcGFydGljaXBhdGlvbiBhbmQgcmVsaWdpb3VzIHByYWN0aWNlIgogICAgICApIH4gIlRyYXZlbCAoU29jaWFsL0NvbW11bml0eSkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiQXR0ZW5kYW5jZSBhdCBvcmdhbml6ZWQvbWFzcyBjdWx0dXJhbCBldmVudHMgYW5kIHNob3dzIiwKICAgICAgICAiQXR0ZW5kYW5jZSBhdCBwYXJrcy9nYXJkZW5zIiwKICAgICAgICAiQXR0ZW5kYW5jZSBhdCBzcG9ydHMgZXZlbnRzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGF0dGVuZGFuY2UgYXQgY3VsdHVyYWwsIGVudGVydGFpbm1lbnQgYW5kIHNwb3J0cyBldmVudHMiCiAgICAgICkgfiAiQXR0ZW5kaW5nIEV2ZW50cyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJWaXN1YWwsIGxpdGVyYXJ5IGFuZCBwZXJmb3JtaW5nIGFydHMgKGFzIGhvYmJ5KSIsCiAgICAgICAgIkhvYmJpZXMiLAogICAgICAgICJQbGF5aW5nIGdhbWVzIGFuZCBvdGhlciBwYXN0aW1lIGFjdGl2aXRpZXMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY3VsdHVyYWwgcGFydGljaXBhdGlvbiwgaG9iYmllcywgZ2FtZXMiCiAgICAgICkgfiAiSG9iYmllcyAmIEdhbWVzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIlBhcnRpY2lwYXRpbmcgaW4gc3BvcnRzIiwgIkV4ZXJjaXNpbmciKSB+ICJTcG9ydHMgJiBFeGVyY2lzZSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJSZWFkaW5nIGZvciBsZWlzdXJlIiwKICAgICAgICAiV2F0Y2hpbmcvbGlzdGVuaW5nIHRvIHRlbGV2aXNpb24gYW5kIHZpZGVvIiwKICAgICAgICAiTGlzdGVuaW5nIHRvIHJhZGlvIGFuZCBhdWRpbyBkZXZpY2VzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIG1hc3MgbWVkaWEgdXNlIgogICAgICApIH4gIk1hc3MgTWVkaWEiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiQWN0aXZpdGllcyBhc3NvY2lhdGVkIHdpdGggcmVmbGVjdGluZywgcmVzdGluZywgcmVsYXhpbmciKSB+ICJSZXN0aW5nICYgUmVsYXhpbmciLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZyB0aW1lIHJlbGF0ZWQgdG8gY3VsdHVyZSwgbGVpc3VyZSwgbWFzcy1tZWRpYSBhbmQgc3BvcnRzIHByYWN0aWNlcyIKICAgICAgKSB+ICJUcmF2ZWwgKExlaXN1cmUpIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjdWx0dXJlLCBsZWlzdXJlLCBtYXNzLW1lZGlhIGFuZCBzcG9ydHMgcHJhY3RpY2VzIiwKICAgICAgICAiQ3VsdHVyZSwgbGVpc3VyZSwgbWFzcy1tZWRpYSBhbmQgc3BvcnRzIHByYWN0aWNlcyIKICAgICAgKSB+ICJPdGhlciBMZWlzdXJlIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIk5pZ2h0IHNsZWVwL2Vzc2VudGlhbCBzbGVlcCIsCiAgICAgICAgIkluY2lkZW50YWwgc2xlZXAvbmFwcyIsCiAgICAgICAgIlNsZWVwbGVzc25lc3MiLAogICAgICAgICJPdGhlciBzbGVlcCBhbmQgcmVsYXRlZCBhY3Rpdml0aWVzIgogICAgICApIH4gIlNsZWVwIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIkVhdGluZyBtZWFscy9zbmFjayIsICJEcmlua2luZyBvdGhlciB0aGFuIHdpdGggbWVhbCBvciBzbmFjayIpIH4gIkVhdGluZyAmIERyaW5raW5nIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlBlcnNvbmFsIGh5Z2llbmUgYW5kIGNhcmUiLAogICAgICAgICJIZWFsdGgvbWVkaWNhbCBjYXJlIHRvIG9uZXNlbGYiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gcGVyc29uYWwgaHlnaWVuZSBhbmQgY2FyZSIKICAgICAgKSB+ICJQZXJzb25hbCBIeWdpZW5lICYgSGVhbHRoIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlJlY2VpdmluZyBwZXJzb25hbCBjYXJlIGZyb20gb3RoZXJzIiwKICAgICAgICAiUmVjZWl2aW5nIGhlYWx0aC9tZWRpY2FsIGNhcmUgZnJvbSBvdGhlcnMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gcmVjZWl2aW5nIHBlcnNvbmFsIGFuZCBoZWFsdGgvbWVkaWNhbCBjYXJlIgogICAgICApIH4gIlJlY2VpdmluZyBDYXJlIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIlRyYXZlbGxpbmcgdGltZSByZWxhdGVkIHRvIHNlbGYtY2FyZSBhbmQgbWFpbnRlbmFuY2UgYWN0aXZpdGllcyIpIH4gIlRyYXZlbCAoU2VsZi1DYXJlKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJPdGhlciBzZWxmLWNhcmUgYW5kIG1haW50ZW5hbmNlIGFjdGl2aXRpZXMiKSB+ICJPdGhlciBTZWxmLUNhcmUiLAogICAgICBUUlVFIH4gIlVuY2xhc3NpZmllZCIKICAgICkKICApCmBgYAoKIyBPdmVyYWxsIFRpbWUgVXNlIFBhdHRlcm5zCgojIyBBdmVyYWdlIFNsZWVwIE92ZXIgdGhlIEFnZXMKClRoaXMgY2hhcnQgc2hvd3MgaG93IG91ciBhdmVyYWdlIHNsZWVwIGR1cmF0aW9uIGNoYW5nZXMgYXMgd2UgYWdlLiBOb3RpY2UgdGhlIGRlY2xpbmUgZHVyaW5nIGFkb2xlc2NlbmNlLCBmb2xsb3dlZCBieSBhIG1vcmUgZ3JhZHVhbCBjaGFuZ2UgdGhyb3VnaG91dCBhZHVsdGhvb2QuCgpgYGB7ciBzbGVlcC1hZ2UtcGxvdCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9CnNsZWVwX3ZzX2FnZV9wbG90IDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJTbGVlcCIsIGFnZSA8IDkwLCBhZ2UgPj0gNikgJT4lCiAgZ3JvdXBfYnkocGVyc29uX2lkLCBhZ2UsIG11bHQpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9zbGVlcF9taW5zID0gc3VtKGR1cmF0aW9uX21pbnMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIGdyb3VwX2J5KGFnZSkgJT4lCiAgc3VtbWFyaXNlKGF2Z19zbGVlcF93ZWlnaHRlZF9taW5zID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9zbGVlcF9taW5zLCB3ID0gbXVsdCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgbXV0YXRlKGF2Z19zbGVlcF9ob3VycyA9IGF2Z19zbGVlcF93ZWlnaHRlZF9taW5zIC8gNjApICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGF2Z19zbGVlcF9ob3VycykpICsKICBnZW9tX3Ntb290aCgKICAgIG1ldGhvZCA9ICJsb2VzcyIsCiAgICBzZSA9IFRSVUUsCiAgICBjb2xvciA9ICJibGFjayIsCiAgICBmaWxsID0gImdyYXk4MCIKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg4LCAxMyksIGJyZWFrcyA9IHNlcSg4LCAxMywgYnkgPSAxKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOTAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDYsIDk1KSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJBdmVyYWdlIGRhaWx5IHNsZWVwIGFjcm9zcyB0aGUgYWdlcyIsCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIkF2ZXJhZ2UgU2xlZXAgKGhvdXJzIHBlciBkYXkpIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDE4LAogICAgICBtYXJnaW4gPSBtYXJnaW4oYiA9IDIwKQogICAgKSwKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFtaWx5ID0gImF0aCIsCiAgICAgIHNpemUgPSAxMCwKICAgICAgY29sb3IgPSAiZ3JheTUwIgogICAgKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMikKICApCgpzbGVlcF92c19hZ2VfcGxvdAoKIyAtLS0gRXNzZW50aWFsIFNsZWVwIE9ubHkgLS0tCgpuaWdodF9zbGVlcF92c19hZ2VfcGxvdCA8LSB0aW1ldXNlX2RmICU+JQogIGZpbHRlcihhY3Rpdml0eV9jb2RlID09ICJOaWdodCBzbGVlcC9lc3NlbnRpYWwgc2xlZXAiLCBhZ2UgPCA5MCwgYWdlID49IDYpICU+JQogIGdyb3VwX2J5KHBlcnNvbl9pZCwgYWdlLCBtdWx0KSAlPiUKICBzdW1tYXJpc2UodG90YWxfc2xlZXBfbWlucyA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBncm91cF9ieShhZ2UpICU+JQogIHN1bW1hcmlzZShhdmdfc2xlZXBfd2VpZ2h0ZWRfbWlucyA9IHdlaWdodGVkLm1lYW4odG90YWxfc2xlZXBfbWlucywgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkpICU+JQogIG11dGF0ZShhdmdfc2xlZXBfaG91cnMgPSBhdmdfc2xlZXBfd2VpZ2h0ZWRfbWlucyAvIDYwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBhdmdfc2xlZXBfaG91cnMpKSArCiAgZ2VvbV9zbW9vdGgoCiAgICBtZXRob2QgPSAibG9lc3MiLAogICAgc2UgPSBUUlVFLAogICAgY29sb3IgPSAibmF2eSIsICMgQ2hhbmdlZCBjb2xvciB0byBkaXN0aW5ndWlzaCBmcm9tIHRoZSBvdGhlciBwbG90CiAgICBmaWxsID0gImxpZ2h0Ymx1ZSIKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg3LCAxMiksIGJyZWFrcyA9IHNlcSg3LCAxMiwgYnkgPSAxKSkgKyAjIEFkanVzdGVkIGxpbWl0cyBmb3IgdGhpcyBkYXRhCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA5MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoNiwgOTUpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkF2ZXJhZ2UgZGFpbHkgJ05pZ2h0IFNsZWVwIC8gRXNzZW50aWFsIFNsZWVwJyBhY3Jvc3MgdGhlIGFnZXMiLAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJBdmVyYWdlIEVzc2VudGlhbCBTbGVlcCAoaG91cnMgcGVyIGRheSkiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE1vU1BJIFRpbWUgVXNlIFN1cnZleSwgMjAyNCIKICApICsKICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTgsCiAgICAgIG1hcmdpbiA9IG1hcmdpbihiID0gMTApICMgQWRqdXN0ZWQgbWFyZ2luCiAgICApLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFtaWx5ID0gImF0aCIsCiAgICAgIHNpemUgPSAxNCwKICAgICAgbWFyZ2luID0gbWFyZ2luKGIgPSAyMCksCiAgICAgIGNvbG9yID0gImdyYXk0MCIKICAgICksCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBzaXplID0gMTAsCiAgICAgIGNvbG9yID0gImdyYXk1MCIKICAgICksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTIpCiAgKQoKbmlnaHRfc2xlZXBfdnNfYWdlX3Bsb3QKYGBgCgojIyBEaWZmZXJlbmNlIGluIEFjdGl2aXRpZXMgYnkgR2VuZGVyCgpUaGlzICJkdW1iYmVsbCIgcGxvdCBoaWdobGlnaHRzIHRoZSBhY3Rpdml0aWVzIHdpdGggdGhlIGxhcmdlc3QgZ2VuZGVyIGdhcHMgYWNyb3NzIHRoZSBlbnRpcmUgcG9wdWxhdGlvbi4gSXQncyBpbW1lZGlhdGVseSBjbGVhciB0aGF0IHdvbWVuIGhhbmRsZSBhIG11Y2ggbGFyZ2VyIHNoYXJlIG9mIHVucGFpZCBkb21lc3RpYyBhbmQgY2FyZWdpdmluZyB3b3JrLgoKYGBge3IgZ2VuZGVyLWdhcC1wbG90LCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9CnBlcnNvbl9hY3Rpdml0eV90b3RhbHMgPC0gdGltZXVzZV9kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKGFjdGl2aXR5KSAmIGFjdGl2aXR5ICE9ICJVbmNsYXNzaWZpZWQiLCBnZW5kZXIgJWluJSBjKCJtYWxlIiwgImZlbWFsZSIpKSAlPiUKICBncm91cF9ieShwZXJzb25faWQsIGdlbmRlciwgbXVsdCwgYWN0aXZpdHkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9kdXJhdGlvbl9taW5zID0gc3VtKGR1cmF0aW9uX21pbnMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAnZHJvcCcpCgpnZW5kZXJfc3VtbWFyeV9wYXJ0aWNpcGFudHMgPC0gcGVyc29uX2FjdGl2aXR5X3RvdGFscyAlPiUKICBncm91cF9ieShnZW5kZXIsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UoCiAgICBhdmdfaG91cnNfcGFydGljaXBhbnRzID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9kdXJhdGlvbl9taW5zLCB3ID0gbXVsdCwgbmEucm0gPSBUUlVFKSAvIDYwLAogICAgLmdyb3VwcyA9ICdkcm9wJwogICkKCmdlbmRlcl9zdW1tYXJ5X3dpZGUgPC0gZ2VuZGVyX3N1bW1hcnlfcGFydGljaXBhbnRzICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBnZW5kZXIsIHZhbHVlc19mcm9tID0gYXZnX2hvdXJzX3BhcnRpY2lwYW50cykgJT4lCiAgbXV0YXRlKGdhcCA9IGZlbWFsZSAtIG1hbGUpICU+JQogIG11dGF0ZShnYXAgPSBjYXNlX3doZW4oCiAgICBpcy5uYShtYWxlKSB+IGZlbWFsZSwKICAgIGlzLm5hKGZlbWFsZSkgfiAtbWFsZSwKICAgIFRSVUUgfiBnYXAKICApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGdhcCkpICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IGFicyhnYXApLCBuID0gMTUpICU+JQogIG11dGF0ZShhY3Rpdml0eSA9IGZjdF9yZW9yZGVyKGFjdGl2aXR5LCBnYXApKQoKZ2VuZGVyX2dhcF9wbG90IDwtIGdncGxvdChnZW5kZXJfc3VtbWFyeV93aWRlLCBhZXMoeSA9IGFjdGl2aXR5KSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IG1hbGUsIHhlbmQgPSBmZW1hbGUpLCBjb2xvciA9ICJncmF5IiwgbGluZXdpZHRoID0gMS41LCBhbHBoYSA9IDAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBmZW1hbGUsIGNvbG9yID0gIkZlbWFsZSIpLCBzaXplID0gNCkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBtYWxlLCBjb2xvciA9ICJNYWxlIiksIHNpemUgPSA0KSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBmb3JtYXRfaG91cnNfbWludXRlcywgYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuID0gNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCJGZW1hbGUiID0gIiMwMDcyQjIiLCAiTWFsZSIgPSAiI0Q1NUUwMCIpKSArCiAgbGFicygKICAgIHRpdGxlID0gIlVucGFpZCB3b3JrIGFjY291bnRzIGZvciB0aGUgbGFyZ2VzdCBnZW5kZXIgZ2FwIGluIHRpbWUgdXNlIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyBhdmVyYWdlIGRhaWx5IGhvdXJzIGZvciBtYWxlIGFuZCBmZW1hbGUgcGFydGljaXBhbnRzIiwKICAgIHggPSAiQXZlcmFnZSBIb3VycyBQZXIgRGF5IChmb3IgcGFydGljaXBhbnRzKSIsCiAgICB5ID0gIiIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTYsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApLCBoanVzdCA9IDAuNSksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTQsIG1hcmdpbiA9IG1hcmdpbihiID0gMjApLCBjb2xvciA9ICJncmF5NDAiLCBoanVzdCA9IDAuNSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIgogICkKCmdlbmRlcl9nYXBfcGxvdApgYGAKCiMjIFJ1cmFsLVVyYmFuIERpdmlkZSBpbiBEYWlseSBUaW1lIFVzZQoKYGBge3Igc2VjdG9yLWdhcC1wbG90LCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9CnBlcnNvbl9hY3Rpdml0eV90b3RhbHNfc2VjdG9yIDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKCFpcy5uYShhY3Rpdml0eSkgJiBhY3Rpdml0eSAhPSAiVW5jbGFzc2lmaWVkIikgJT4lCiAgZ3JvdXBfYnkocGVyc29uX2lkLCBzZWN0b3IsIG11bHQsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UodG90YWxfZHVyYXRpb25fbWlucyA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKc2VjdG9yX3N1bW1hcnlfcGFydGljaXBhbnRzIDwtIHBlcnNvbl9hY3Rpdml0eV90b3RhbHNfc2VjdG9yICU+JQogIGdyb3VwX2J5KHNlY3RvciwgYWN0aXZpdHkpICU+JQogIHN1bW1hcmlzZSgKICAgIGF2Z19ob3Vyc19wYXJ0aWNpcGFudHMgPSB3ZWlnaHRlZC5tZWFuKHRvdGFsX2R1cmF0aW9uX21pbnMsIHcgPSBtdWx0LCBuYS5ybSA9IFRSVUUpIC8gNjAsCiAgICAuZ3JvdXBzID0gJ2Ryb3AnCiAgKQoKc2VjdG9yX3N1bW1hcnlfd2lkZSA8LSBzZWN0b3Jfc3VtbWFyeV9wYXJ0aWNpcGFudHMgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNlY3RvciwgdmFsdWVzX2Zyb20gPSBhdmdfaG91cnNfcGFydGljaXBhbnRzKSAlPiUKICBtdXRhdGUoZ2FwID0gVXJiYW4gLSBSdXJhbCkgJT4lCiAgbXV0YXRlKGdhcCA9IGNhc2Vfd2hlbigKICAgIGlzLm5hKFVyYmFuKSB+IC1SdXJhbCwKICAgIGlzLm5hKFJ1cmFsKSB+IFVyYmFuLAogICAgVFJVRSB+IGdhcAogICkpICU+JQogIGZpbHRlcighaXMubmEoZ2FwKSkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gYWJzKGdhcCksIG4gPSAxNSkgJT4lCiAgbXV0YXRlKGFjdGl2aXR5ID0gZmN0X3Jlb3JkZXIoYWN0aXZpdHksIGdhcCkpCgpzZWN0b3JfZ2FwX3Bsb3QgPC0gZ2dwbG90KHNlY3Rvcl9zdW1tYXJ5X3dpZGUsIGFlcyh5ID0gYWN0aXZpdHkpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gUnVyYWwsIHhlbmQgPSBVcmJhbiksIGNvbG9yID0gImdyYXkiLCBsaW5ld2lkdGggPSAxLjUsIGFscGhhID0gMC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IFVyYmFuLCBjb2xvciA9ICJVcmJhbiIpLCBzaXplID0gNCkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBSdXJhbCwgY29sb3IgPSAiUnVyYWwiKSwgc2l6ZSA9IDQpICsKICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGZvcm1hdF9ob3Vyc19taW51dGVzLCBicmVha3MgPSBwcmV0dHlfYnJlYWtzKG4gPSA1KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoIlVyYmFuIiA9ICIjMDA3MkIyIiwgIlJ1cmFsIiA9ICIjRDU1RTAwIikpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUnVyYWwtdXJiYW4gZGl2aWRlIGluIGRhaWx5IHRpbWUgdXNlIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyBhY3Rpdml0aWVzIHdpdGggdGhlIGxhcmdlc3QgdXJiYW4tcnVyYWwgZGlzcGFyaXRpZXMgZm9yIHBhcnRpY2lwYW50cyIsCiAgICB4ID0gIkF2ZXJhZ2UgSG91cnMgUGVyIERheSAoZm9yIHBhcnRpY2lwYW50cykiLAogICAgeSA9ICIiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE1vU1BJIFRpbWUgVXNlIFN1cnZleSwgMjAyNCIKICApICsKICB0aGVtZSgKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDE2LCBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKSwgaGp1c3QgPSAwLjUpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDE0LCBtYXJnaW4gPSBtYXJnaW4oYiA9IDIwKSwgY29sb3IgPSAiZ3JheTQwIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIKICApCgpzZWN0b3JfZ2FwX3Bsb3QKYGBgCgojIyBBIERheSBpbiB0aGUgTGlmZSBBY3Jvc3MgQWdlIEdyb3VwcwoKYGBge3IgYWdlLXN0cmlwcy1wbG90LCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KaGlnaF9sZXZlbF9zdW1tYXJ5IDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKCFpcy5uYShhY3Rpdml0eSkgJiBhY3Rpdml0eSAhPSAiVW5jbGFzc2lmaWVkIikgJT4lCiAgbXV0YXRlKAogICAgYWN0aXZpdHlfZ3JvdXAgPSBjYXNlX3doZW4oCiAgICAgIGFjdGl2aXR5ID09ICJTbGVlcCIgfiAiU2xlZXAiLAogICAgICBhY3Rpdml0eSAlaW4lIGMoIkVhdGluZyAmIERyaW5raW5nIiwgIlBlcnNvbmFsIEh5Z2llbmUgJiBIZWFsdGgiLCAiUmVjZWl2aW5nIENhcmUiKSB+ICJQZXJzb25hbCBDYXJlIiwKICAgICAgYWN0aXZpdHkgJWluJSBjKCJGb3JtYWwgRW1wbG95bWVudCIsICJIb3VzZWhvbGQgRW50ZXJwcmlzZSAoR29vZHMpIiwgIkhvdXNlaG9sZCBFbnRlcnByaXNlIChTZXJ2aWNlcykiLCAiV29yay1SZWxhdGVkIFRyYWluaW5nIiwgIlNlZWtpbmcgRW1wbG95bWVudCIsICJTZXR0aW5nIHVwIGEgQnVzaW5lc3MiKSB+ICJQYWlkIFdvcmsiLAogICAgICBhY3Rpdml0eSAlaW4lIGMoIkZvb2QgJiBNZWFsIE1hbmFnZW1lbnQiLCAiQ2xlYW5pbmcgJiBNYWludGVuYW5jZSIsICJDaGlsZGNhcmUgJiBJbnN0cnVjdGlvbiIsICJTaG9wcGluZyIsICJBZ3JpY3VsdHVyZSAmIEZpc2hpbmcgKE93bi1Vc2UpIiwgIkNvbW11bml0eSBWb2x1bnRlZXJpbmciLCAiRGlyZWN0IFZvbHVudGVlcmluZyIpIH4gIlVucGFpZCBXb3JrICYgQ2FyZSIsCiAgICAgIGFjdGl2aXR5ICVpbiUgYygiRm9ybWFsIEVkdWNhdGlvbiIsICJIb21ld29yayIsICJBZGRpdGlvbmFsIFN0dWR5IikgfiAiTGVhcm5pbmciLAogICAgICBUUlVFIH4gIkxlaXN1cmUsIFNvY2lhbCAmIFRyYXZlbCIKICAgICkKICApCgpwZXJzb25fYWN0aXZpdHlfZ3JvdXBfc3VtbWFyeSA8LSBoaWdoX2xldmVsX3N1bW1hcnkgJT4lCiAgZ3JvdXBfYnkocGVyc29uX2lkLCBhY3Rpdml0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2R1cmF0aW9uID0gc3VtKGR1cmF0aW9uX21pbnMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpCgpzdGFja2luZ19vcmRlciA8LSBjKCJTbGVlcCIsICJQZXJzb25hbCBDYXJlIiwgIlBhaWQgV29yayIsICJVbnBhaWQgV29yayAmIENhcmUiLCAiTGVhcm5pbmciLCAiTGVpc3VyZSwgU29jaWFsICYgVHJhdmVsIikKCmFsbF9wZXJzb25zX2FnZV9ncm91cCA8LSBoaWdoX2xldmVsX3N1bW1hcnkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9IGN1dCgKICAgIGFnZSwKICAgIGJyZWFrcyA9IGMoNSwgMTQsIDI0LCA1OSwgSW5mKSwKICAgIGxhYmVscyA9IGMoIkNoaWxkcmVuICg2LTE0KSIsICJZb3V0aCAoMTUtMjQpIiwgIkFkdWx0cyAoMjUtNTkpIiwgIlNlbmlvcnMgKDYwKykiKSwKICAgIHJpZ2h0ID0gVFJVRSwgaW5jbHVkZS5sb3dlc3QgPSBUUlVFCiAgKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2VfZ3JvdXApKSAlPiUKICBkaXN0aW5jdChwZXJzb25faWQsIGFnZV9ncm91cCwgbXVsdCkKCmFnZV9ncm91cF9zdW1tYXJ5X3RvdGFsIDwtIGFsbF9wZXJzb25zX2FnZV9ncm91cCAlPiUKICB0aWR5cjo6Y3Jvc3NpbmcoYWN0aXZpdHlfZ3JvdXAgPSB1bmlxdWUocGVyc29uX2FjdGl2aXR5X2dyb3VwX3N1bW1hcnkkYWN0aXZpdHlfZ3JvdXApKSAlPiUKICBsZWZ0X2pvaW4ocGVyc29uX2FjdGl2aXR5X2dyb3VwX3N1bW1hcnksIGJ5ID0gYygicGVyc29uX2lkIiwgImFjdGl2aXR5X2dyb3VwIikpICU+JQogIG11dGF0ZSh0b3RhbF9kdXJhdGlvbiA9IGlmZWxzZShpcy5uYSh0b3RhbF9kdXJhdGlvbiksIDAsIHRvdGFsX2R1cmF0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBhY3Rpdml0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXNlKGF2Z19ob3VycyA9IHdlaWdodGVkLm1lYW4odG90YWxfZHVyYXRpb24sIHcgPSBtdWx0LCBuYS5ybSA9IFRSVUUpIC8gNjAsCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShhY3Rpdml0eV9ncm91cCA9IGZhY3RvcihhY3Rpdml0eV9ncm91cCwgbGV2ZWxzID0gc3RhY2tpbmdfb3JkZXIpKQoKYWdlX3N0cmlwc19wbG90X3RvdGFsIDwtIGdncGxvdChhZ2VfZ3JvdXBfc3VtbWFyeV90b3RhbCwKICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGFnZV9ncm91cCwgeSA9IGF2Z19ob3VycywgZmlsbCA9IGFjdGl2aXR5X2dyb3VwKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvdXIgPSAidHJhbnNwYXJlbnQiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gIiIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiU2hhcmUgb2YgYSAyNC1ob3VyIERheSBmb3IgQWxsIFBvcHVsYXRpb24sIGJ5IEFnZSBHcm91cCIsCiAgICB4ID0gIiIsIHkgPSAiUGVyY2VudGFnZSBvZiBEYXkiLCBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIHRoZW1lX2ZpdmV0aGlydHllaWdodCgpICsKICB0aGVtZSgKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDIwLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIgogICkKCmFsbF9wZXJzb25zX2FnZV9nZW5kZXJfZ3JvdXAgPC0gaGlnaF9sZXZlbF9zdW1tYXJ5ICU+JQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCJtYWxlIiwgImZlbWFsZSIpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gY3V0KAogICAgYWdlLAogICAgYnJlYWtzID0gYyg1LCAxNCwgMjQsIDU5LCBJbmYpLAogICAgbGFiZWxzID0gYygiQ2hpbGRyZW4gKDYtMTQpIiwgIllvdXRoICgxNS0yNCkiLCAiQWR1bHRzICgyNS01OSkiLCAiU2VuaW9ycyAoNjArKSIpLAogICAgcmlnaHQgPSBUUlVFLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUKICApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZV9ncm91cCkpICU+JQogIGRpc3RpbmN0KHBlcnNvbl9pZCwgYWdlX2dyb3VwLCBnZW5kZXIsIG11bHQpCgphZ2VfZ2VuZGVyX2dyb3VwX3N1bW1hcnkgPC0gYWxsX3BlcnNvbnNfYWdlX2dlbmRlcl9ncm91cCAlPiUKICB0aWR5cjo6Y3Jvc3NpbmcoYWN0aXZpdHlfZ3JvdXAgPSB1bmlxdWUocGVyc29uX2FjdGl2aXR5X2dyb3VwX3N1bW1hcnkkYWN0aXZpdHlfZ3JvdXApKSAlPiUKICBsZWZ0X2pvaW4ocGVyc29uX2FjdGl2aXR5X2dyb3VwX3N1bW1hcnksIGJ5ID0gYygicGVyc29uX2lkIiwgImFjdGl2aXR5X2dyb3VwIikpICU+JQogIG11dGF0ZSh0b3RhbF9kdXJhdGlvbiA9IGlmZWxzZShpcy5uYSh0b3RhbF9kdXJhdGlvbiksIDAsIHRvdGFsX2R1cmF0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBnZW5kZXIsIGFjdGl2aXR5X2dyb3VwKSAlPiUKICBzdW1tYXJpc2UoYXZnX2hvdXJzID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9kdXJhdGlvbiwgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwKICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgbXV0YXRlKGFjdGl2aXR5X2dyb3VwID0gZmFjdG9yKGFjdGl2aXR5X2dyb3VwLCBsZXZlbHMgPSBzdGFja2luZ19vcmRlcikpCgojIC0tLSBNQUxFUyAtLS0KCmFnZV9zdHJpcHNfcGxvdF9tYWxlIDwtIGFnZV9nZW5kZXJfZ3JvdXBfc3VtbWFyeSAlPiUKICBmaWx0ZXIoZ2VuZGVyID09ICJtYWxlIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gYXZnX2hvdXJzLCBmaWxsID0gYWN0aXZpdHlfZ3JvdXApKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZmlsbCIsIGNvbG91ciA9ICJ0cmFuc3BhcmVudCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTaGFyZSBvZiBhIDI0LWhvdXIgRGF5IGZvciBNYWxlcywgYnkgQWdlIEdyb3VwIiwKICAgIHggPSAiIiwgeSA9ICJQZXJjZW50YWdlIG9mIERheSIsIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMjAsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iCiAgKQoKIyAtLS0gRkVNQUxFUyAtLS0KCmFnZV9zdHJpcHNfcGxvdF9mZW1hbGUgPC0gYWdlX2dlbmRlcl9ncm91cF9zdW1tYXJ5ICU+JQogIGZpbHRlcihnZW5kZXIgPT0gImZlbWFsZSIpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZV9ncm91cCwgeSA9IGF2Z19ob3VycywgZmlsbCA9IGFjdGl2aXR5X2dyb3VwKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvdXIgPSAidHJhbnNwYXJlbnQiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gIiIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiU2hhcmUgb2YgYSAyNC1ob3VyIERheSBmb3IgRmVtYWxlcywgYnkgQWdlIEdyb3VwIiwKICAgIHggPSAiIiwgeSA9ICJQZXJjZW50YWdlIG9mIERheSIsIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMjAsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iCiAgKQoKYWxsX3BlcnNvbnNfYWdlX3NlY3Rvcl9ncm91cCA8LSBoaWdoX2xldmVsX3N1bW1hcnkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9IGN1dCgKICAgIGFnZSwKICAgIGJyZWFrcyA9IGMoNSwgMTQsIDI0LCA1OSwgSW5mKSwKICAgIGxhYmVscyA9IGMoIkNoaWxkcmVuICg2LTE0KSIsICJZb3V0aCAoMTUtMjQpIiwgIkFkdWx0cyAoMjUtNTkpIiwgIlNlbmlvcnMgKDYwKykiKSwKICAgIHJpZ2h0ID0gVFJVRSwgaW5jbHVkZS5sb3dlc3QgPSBUUlVFCiAgKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2VfZ3JvdXApKSAlPiUKICBkaXN0aW5jdChwZXJzb25faWQsIGFnZV9ncm91cCwgc2VjdG9yLCBtdWx0KQoKYWdlX3NlY3Rvcl9ncm91cF9zdW1tYXJ5IDwtIGFsbF9wZXJzb25zX2FnZV9zZWN0b3JfZ3JvdXAgJT4lCiAgdGlkeXI6OmNyb3NzaW5nKGFjdGl2aXR5X2dyb3VwID0gdW5pcXVlKHBlcnNvbl9hY3Rpdml0eV9ncm91cF9zdW1tYXJ5JGFjdGl2aXR5X2dyb3VwKSkgJT4lCiAgbGVmdF9qb2luKHBlcnNvbl9hY3Rpdml0eV9ncm91cF9zdW1tYXJ5LCBieSA9IGMoInBlcnNvbl9pZCIsICJhY3Rpdml0eV9ncm91cCIpKSAlPiUKICBtdXRhdGUodG90YWxfZHVyYXRpb24gPSBpZmVsc2UoaXMubmEodG90YWxfZHVyYXRpb24pLCAwLCB0b3RhbF9kdXJhdGlvbikpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgc2VjdG9yLCBhY3Rpdml0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXNlKGF2Z19ob3VycyA9IHdlaWdodGVkLm1lYW4odG90YWxfZHVyYXRpb24sIHcgPSBtdWx0LCBuYS5ybSA9IFRSVUUpIC8gNjAsCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShhY3Rpdml0eV9ncm91cCA9IGZhY3RvcihhY3Rpdml0eV9ncm91cCwgbGV2ZWxzID0gc3RhY2tpbmdfb3JkZXIpKQoKCiMgLS0tIFBsb3QgZm9yIFJ1cmFsIFBvcHVsYXRpb24gLS0tCmFnZV9zdHJpcHNfcGxvdF9ydXJhbCA8LSBhZ2Vfc2VjdG9yX2dyb3VwX3N1bW1hcnkgJT4lCiAgZmlsdGVyKHNlY3RvciA9PSAiUnVyYWwiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBhdmdfaG91cnMsIGZpbGwgPSBhY3Rpdml0eV9ncm91cCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3VyID0gInRyYW5zcGFyZW50IikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgbmFtZSA9ICIiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlNoYXJlIG9mIGEgMjQtaG91ciBEYXkgZm9yIFJ1cmFsIFBvcHVsYXRpb24sIGJ5IEFnZSBHcm91cCIsCiAgICB4ID0gIiIsIHkgPSAiUGVyY2VudGFnZSBvZiBEYXkiLCBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIHRoZW1lX2ZpdmV0aGlydHllaWdodCgpICsKICB0aGVtZSgKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDIwLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIgogICkKCiMgLS0tIFBsb3QgZm9yIFVyYmFuIFBvcHVsYXRpb24gLS0tCmFnZV9zdHJpcHNfcGxvdF91cmJhbiA8LSBhZ2Vfc2VjdG9yX2dyb3VwX3N1bW1hcnkgJT4lCiAgZmlsdGVyKHNlY3RvciA9PSAiVXJiYW4iKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBhdmdfaG91cnMsIGZpbGwgPSBhY3Rpdml0eV9ncm91cCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3VyID0gInRyYW5zcGFyZW50IikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgbmFtZSA9ICIiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlNoYXJlIG9mIGEgMjQtaG91ciBEYXkgZm9yIFVyYmFuIFBvcHVsYXRpb24sIGJ5IEFnZSBHcm91cCIsCiAgICB4ID0gIiIsIHkgPSAiUGVyY2VudGFnZSBvZiBEYXkiLCBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIHRoZW1lX2ZpdmV0aGlydHllaWdodCgpICsKICB0aGVtZSgKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDIwLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIgogICkKCiMgLS0tIERpc3BsYXkgdGhlIG5ldyBwbG90cyAtLS0KYWdlX3N0cmlwc19wbG90X3J1cmFsCmFnZV9zdHJpcHNfcGxvdF91cmJhbgoKYWdlX3N0cmlwc19wbG90X3RvdGFsCmFnZV9zdHJpcHNfcGxvdF9tYWxlCmFnZV9zdHJpcHNfcGxvdF9mZW1hbGUKCmFjdGl2aXR5X2NvbG9ycyA8LSBjKAogICJTbGVlcCIgPSAiIzFCOUU3NyIsCiAgIlBlcnNvbmFsIENhcmUiID0gIiNEOTVGMDIiLAogICJQYWlkIFdvcmsiID0gIiM3NTcwQjMiLAogICJVbnBhaWQgV29yayAmIENhcmUiID0gIiNFNzI5OEEiLAogICJMZWFybmluZyIgPSAiIzY2NjY2NkZGIiwgIyBDaGFuZ2VkIHRoaXMgZnJvbSBncmVlbiB0byBibHVlCiAgIkxlaXN1cmUsIFNvY2lhbCAmIFRyYXZlbCIgPSAiI0U2QUIwMiIKKQoKY29tYmluZWRfZ2VuZGVyX3N0cmlwc19wbG90IDwtIGFnZV9nZW5kZXJfZ3JvdXBfc3VtbWFyeSAlPiUKICBtdXRhdGUoZ2VuZGVyID0gc3RyX3RvX3RpdGxlKGdlbmRlcikpICU+JQogIGdncGxvdChhZXMoeCA9IGdlbmRlciwgeSA9IGF2Z19ob3VycywgZmlsbCA9IGFjdGl2aXR5X2dyb3VwKSkgKwogIGdlb21fY29sKAogICAgcG9zaXRpb24gPSAiZmlsbCIsIAogICAgd2lkdGggPSAwLjgsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBsaW5ld2lkdGggPSAwLjIKICApICsKICBmYWNldF93cmFwKH4gYWdlX2dyb3VwLCBucm93ID0gMSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwKICAgIGJyZWFrcyA9IHNlcSgwLCAxLCBieSA9IDAuMSkKICApICsKICAjIFVzZSBzY2FsZV9maWxsX21hbnVhbCB0byBhcHBseSBvdXIgY3VzdG9tIGNvbG9ycwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGFjdGl2aXR5X2NvbG9ycywgbmFtZSA9ICJBY3Rpdml0eSBHcm91cDoiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlNoYXJlIG9mIGEgMjQtSG91ciBEYXksIGJ5IEdlbmRlciBhbmQgQWdlIiwKICAgIHN1YnRpdGxlID0gIkEgY29tcGFyaXNvbiBvZiBob3cgbWFsZXMgYW5kIGZlbWFsZXMgc3BlbmQgdGhlaXIgdGltZSBhY3Jvc3MgYWdlcyIsCiAgICB4ID0gTlVMTCwKICAgIHkgPSAiUGVyY2VudGFnZSBvZiBEYXkiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE1vU1BJIFRpbWUgVXNlIFN1cnZleSwgMjAyNCIKICApICsKICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAyMCwgbWFyZ2luID0gbWFyZ2luKGIgPSAxMCkpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDE0LCBtYXJnaW4gPSBtYXJnaW4oYiA9IDIwKSwgY29sb3IgPSAiZ3JheTQwIiksCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIikKICApCgojIERpc3BsYXkgdGhlIHBsb3QKY29tYmluZWRfZ2VuZGVyX3N0cmlwc19wbG90CmBgYAoKIyBGb2N1cyBvbiBDaGlsZHJlbiAmIFlvdXRoIChBZ2VzIDYtMjQpCgpUaGlzIHNlY3Rpb24gdHJhY2tzIGhvdyBjaGlsZHJlbiBhbmQgeW91dGggc3BlbmQgdGhlaXIgdGltZS4KCiMjIFRvcCAxNSBBY3Rpdml0aWVzIGZvciBZb3V0aAoKYGBge3IgeW91dGgtZHVtYmJlbGwtcGxvdCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQpwZXJzb25fZGFpbHlfdG90YWxzX3lvdXRoIDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKGFnZSA+PSA2ICYgYWdlIDw9IDI0LCAhaXMubmEoYWN0aXZpdHkpLCBhY3Rpdml0eSAhPSAiVW5jbGFzc2lmaWVkIiwgZ2VuZGVyICVpbiUgYygibWFsZSIsICJmZW1hbGUiKSkgJT4lCiAgZ3JvdXBfYnkocGVyc29uX2lkLCBnZW5kZXIsIG11bHQsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UodG90YWxfZHVyYXRpb25fbWlucyA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKeW91dGhfZ2VuZGVyX3N1bW1hcnlfcGFydGljaXBhbnRzIDwtIHBlcnNvbl9kYWlseV90b3RhbHNfeW91dGggJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLCBhY3Rpdml0eSkgJT4lCiAgc3VtbWFyaXNlKGF2Z19ob3VycyA9IHdlaWdodGVkLm1lYW4odG90YWxfZHVyYXRpb25fbWlucywgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwKICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykKCnlvdXRoX2dlbmRlcl9zdW1tYXJ5X3dpZGUgPC0geW91dGhfZ2VuZGVyX3N1bW1hcnlfcGFydGljaXBhbnRzICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBnZW5kZXIsIHZhbHVlc19mcm9tID0gYXZnX2hvdXJzKSAlPiUKICBtdXRhdGUoCiAgICBtYWxlID0gaWZlbHNlKGlzLm5hKG1hbGUpLCAwLCBtYWxlKSwKICAgIGZlbWFsZSA9IGlmZWxzZShpcy5uYShmZW1hbGUpLCAwLCBmZW1hbGUpLAogICAgdG90YWxfdGltZSA9IGZlbWFsZSArIG1hbGUKICAgICkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gdG90YWxfdGltZSwgbiA9IDE1KSAlPiUKICBtdXRhdGUoYWN0aXZpdHkgPSBmY3RfcmVvcmRlcihhY3Rpdml0eSwgdG90YWxfdGltZSkpCgp5b3V0aF9kdW1iYmVsbF9wbG90IDwtIGdncGxvdCh5b3V0aF9nZW5kZXJfc3VtbWFyeV93aWRlLCBhZXMoeSA9IGFjdGl2aXR5KSkgKwogIGdlb21fc2VnbWVudCgKICAgIGFlcyh4ID0gbWFsZSwgeGVuZCA9IGZlbWFsZSksCiAgICBjb2xvciA9ICJncmF5IiwKICAgIGxpbmV3aWR0aCA9IDEuNSwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGZlbWFsZSwgY29sb3IgPSAiRmVtYWxlIiksIHNpemUgPSA0KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IG1hbGUsIGNvbG9yID0gIk1hbGUiKSwgc2l6ZSA9IDQpICsKICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGZvcm1hdF9ob3Vyc19taW51dGVzLCBicmVha3MgPSBwcmV0dHlfYnJlYWtzKG4gPSA1KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiRmVtYWxlIiA9ICIjMDA3MkIyIiwgIk1hbGUiID0gIiNENTVFMDAiKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJUb3AgVGltZS1Db25zdW1pbmcgQWN0aXZpdGllcyBmb3IgWW91dGggKEFnZXMgNi0yNCkiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaW5nIGF2ZXJhZ2UgZGFpbHkgaG91cnMgZm9yIG1hbGUgYW5kIGZlbWFsZSBwYXJ0aWNpcGFudHMiLAogICAgeCA9ICJBdmVyYWdlIEhvdXJzIFBlciBEYXkgKGZvciBwYXJ0aWNpcGFudHMpIiwKICAgIHkgPSAiIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBzaXplID0gMTYsCiAgICAgIG1hcmdpbiA9IG1hcmdpbihiID0gMTApLAogICAgICBoanVzdCA9IDAuNQogICAgKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBzaXplID0gMTQsCiAgICAgIG1hcmdpbiA9IG1hcmdpbihiID0gMjApLAogICAgICBjb2xvciA9ICJncmF5NDAiLAogICAgICBoanVzdCA9IDAuNQogICAgKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiCiAgKQoKeW91dGhfZHVtYmJlbGxfcGxvdApgYGAKCiMjIFlvdXRoIEFjdGl2aXR5IFRyZW5kcyBieSBHZW5kZXIKCkdlbmRlciBnYXBzIGluIHVucGFpZCB3b3JrIGVtZXJnZSBlYXJseS4KCmBgYHtyIHlvdXRoLWdlbmRlci10cmVuZHMtcGxvdCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEyfQp5b3V0aF9hY3Rpdml0aWVzIDwtIGMoCiAgIkZvcm1hbCBFZHVjYXRpb24iLCAiSG9tZXdvcmsiLCAiQWRkaXRpb25hbCBTdHVkeSIsICJGb29kICYgTWVhbCBNYW5hZ2VtZW50IiwKICAiQ2xlYW5pbmcgJiBNYWludGVuYW5jZSIsICJTb2NpYWxpemluZyAmIENvbW11bmljYXRpb24iLCAiTWFzcyBNZWRpYSIsCiAgIlNwb3J0cyAmIEV4ZXJjaXNlIiwgIkhvYmJpZXMgJiBHYW1lcyIKKQoKIyAxLiBGaXJzdCwgU1VNIHRoZSB0b3RhbCB0aW1lIHBlciBwZXJzb24gZm9yIGVhY2ggYWN0aXZpdHkKcGVyc29uX2RhaWx5X3RvdGFsc195b3V0aCA8LSB0aW1ldXNlX2RmICU+JQogIGZpbHRlcigKICAgIGFnZSA+PSA2ICYgYWdlIDw9IDI0LAogICAgYWN0aXZpdHkgJWluJSB5b3V0aF9hY3Rpdml0aWVzLAogICAgZ2VuZGVyICVpbiUgYygibWFsZSIsICJmZW1hbGUiKQogICkgJT4lCiAgZ3JvdXBfYnkocGVyc29uX2lkLCBhZ2UsIGdlbmRlciwgc2VjdG9yLCBhY3Rpdml0eSwgbXVsdCkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2FjdGl2aXR5X21pbnMgPSBzdW0oZHVyYXRpb25fbWlucywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykKCiMgMi4gTm93LCBhdmVyYWdlIHRob3NlIGRhaWx5IHRvdGFscyBmb3IgcGFydGljaXBhbnRzCnlvdXRoX3N1bW1hcnkgPC0gcGVyc29uX2RhaWx5X3RvdGFsc195b3V0aCAlPiUKICBncm91cF9ieShhZ2UsIGdlbmRlciwgc2VjdG9yLCBhY3Rpdml0eSkgJT4lCiAgc3VtbWFyaXNlKGF2Z19ob3VycyA9IHdlaWdodGVkLm1lYW4odG90YWxfYWN0aXZpdHlfbWlucywgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwKICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikKCgp5b3V0aF9nZW5kZXJfdHJlbmRzX3Bsb3QgPC0gZ2dwbG90KHlvdXRoX3N1bW1hcnksIGFlcyh4ID0gYWdlLCB5ID0gYXZnX2hvdXJzLCBjb2xvciA9IGdlbmRlcikpICsKICBnZW9tX3Ntb290aChzZSA9IEZBTFNFLCBzaXplID0gMS4yKSArCiAgZmFjZXRfd3JhcCggfiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gMykgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmb3JtYXRfaG91cnNfbWludXRlcywgYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuID0gNCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImZlbWFsZSIgPSAiIzAwNzJCMiIsICJtYWxlIiA9ICIjRDU1RTAwIikpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQXZlcmFnZSBkYWlseSBob3VycyBvbiBrZXkgYWN0aXZpdGllcyBmb3IgYWdlcyA2LTI0LCBieSBnZW5kZXIiLAogICAgeCA9ICJBZ2UgKHllYXJzKSIsCiAgICB5ID0gIkF2ZXJhZ2UgSG91cnMgUGVyIERheSIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgc2l6ZSA9IDIwLAogICAgICBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKQogICAgKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDExLCBoanVzdCA9IDApLAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIKICApCgp5b3V0aF9nZW5kZXJfdHJlbmRzX3Bsb3QKYGBgCgojIyBZb3V0aCBBY3Rpdml0eSBUcmVuZHMgYnkgU2VjdG9yIChVcmJhbiB2cy4gUnVyYWwpCgpgYGB7ciB5b3V0aC1zZWN0b3ItdHJlbmRzLXBsb3QsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMn0KYWxsX3lvdXRoX2J5X3NlY3RvciA8LSB0aW1ldXNlX2RmICU+JQogIGZpbHRlcihhZ2UgPj0gNiAmIGFnZSA8PSAyNCkgJT4lCiAgZGlzdGluY3QocGVyc29uX2lkLCBhZ2UsIHNlY3RvciwgbXVsdCkKCnlvdXRoX3BlcnNvbl9zdW1tYXJ5X3NlY3RvciA8LSB0aW1ldXNlX2RmICU+JQogIGZpbHRlcihhZ2UgPj0gNiAmIGFnZSA8PSAyNCwgYWN0aXZpdHkgJWluJSB5b3V0aF9hY3Rpdml0aWVzKSAlPiUKICBncm91cF9ieShwZXJzb25faWQsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UodG90YWxfZHVyYXRpb25fbWlucyA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKQoKeW91dGhfc2VjdG9yX3N1bW1hcnkgPC0gYWxsX3lvdXRoX2J5X3NlY3RvciAlPiUKICB0aWR5cjo6Y3Jvc3NpbmcoYWN0aXZpdHkgPSB5b3V0aF9hY3Rpdml0aWVzKSAlPiUKICBsZWZ0X2pvaW4oeW91dGhfcGVyc29uX3N1bW1hcnlfc2VjdG9yLCBieSA9IGMoInBlcnNvbl9pZCIsICJhY3Rpdml0eSIpKSAlPiUKICBtdXRhdGUodG90YWxfZHVyYXRpb25fbWlucyA9IGlmZWxzZShpcy5uYSh0b3RhbF9kdXJhdGlvbl9taW5zKSwgMCwgdG90YWxfZHVyYXRpb25fbWlucykpICU+JQogIGdyb3VwX2J5KGFnZSwgc2VjdG9yLCBhY3Rpdml0eSkgJT4lCiAgc3VtbWFyaXNlKGF2Z19ob3VycyA9IHdlaWdodGVkLm1lYW4odG90YWxfZHVyYXRpb25fbWlucywgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwKICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikKCgp5b3V0aF9zZWN0b3JfdHJlbmRzX3Bsb3QgPC0gZ2dwbG90KHlvdXRoX3NlY3Rvcl9zdW1tYXJ5LCBhZXMoeCA9IGFnZSwgeSA9IGF2Z19ob3VycywgY29sb3IgPSBzZWN0b3IpKSArCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSwgc2l6ZSA9IDEuMikgKwogIGZhY2V0X3dyYXAofiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gMykgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmb3JtYXRfaG91cnNfbWludXRlcywgYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuID0gNCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJTZWN0b3IiLCB2YWx1ZXMgPSBjKCJVcmJhbiIgPSAiIzAwNzJCMiIsICJSdXJhbCIgPSAiI0Q1NUUwMCIpKSArCiAgbGFicygKICAgIHRpdGxlID0gIlVyYmFuIHZzLiBSdXJhbCBUaW1lIFVzZSBmb3IgQWdlcyA2LTI0IiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyBhdmVyYWdlIGRhaWx5IGhvdXJzIHNwZW50IG9uIGtleSBhY3Rpdml0aWVzIGJ5IHNlY3RvciIsCiAgICB4ID0gIkFnZSAoeWVhcnMpIiwgeSA9ICJBdmVyYWdlIEhvdXJzIFBlciBEYXkiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE1vU1BJIFRpbWUgVXNlIFN1cnZleSwgMjAyNCIKICApICsKICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAyMCwgbWFyZ2luID0gbWFyZ2luKGIgPSAxMCkpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDE0LCBtYXJnaW4gPSBtYXJnaW4oYiA9IDIwKSwgY29sb3IgPSAiZ3JheTQwIiksCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMSwgaGp1c3QgPSAwKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iCiAgKQoKeW91dGhfc2VjdG9yX3RyZW5kc19wbG90CmBgYAoKIyMgQ29tYmluZWQgQ29tcGFyaXNvbgoKYGBge3J9CnlvdXRoX2FjdGl2aXRpZXMgPC0gYygKICAiRm9ybWFsIEVkdWNhdGlvbiIsCiAgIkhvbWV3b3JrIiwKICAiQWRkaXRpb25hbCBTdHVkeSIsCiAgIkZvb2QgJiBNZWFsIE1hbmFnZW1lbnQiLAogICJDbGVhbmluZyAmIE1haW50ZW5hbmNlIiwKICAiU29jaWFsaXppbmcgJiBDb21tdW5pY2F0aW9uIiwKICAiTWFzcyBNZWRpYSIsCiAgIlNwb3J0cyAmIEV4ZXJjaXNlIiwKICAiSG9iYmllcyAmIEdhbWVzIgopCgojIDEuIEZpcnN0LCBTVU0gdGhlIHRvdGFsIHRpbWUgcGVyIHBlcnNvbiBmb3IgZWFjaCBhY3Rpdml0eQpwZXJzb25fZGFpbHlfdG90YWxzIDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKAogICAgYWdlID49IDYgJiBhZ2UgPD0gMjQsCiAgICBhY3Rpdml0eSAlaW4lIHlvdXRoX2FjdGl2aXRpZXMsCiAgICBnZW5kZXIgJWluJSBjKCJtYWxlIiwgImZlbWFsZSIpCiAgICApICU+JQogIGdyb3VwX2J5KHBlcnNvbl9pZCwgYWdlLCBnZW5kZXIsIHNlY3RvciwgYWN0aXZpdHksIG11bHQpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9hY3Rpdml0eV9taW5zID0gc3VtKGR1cmF0aW9uX21pbnMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAnZHJvcCcpCgojIDIuIE5vdywgYXZlcmFnZSB0aG9zZSBkYWlseSB0b3RhbHMKeW91dGhfc3VtbWFyeSA8LSBwZXJzb25fZGFpbHlfdG90YWxzICU+JQogIGdyb3VwX2J5KGFnZSwgZ2VuZGVyLCBzZWN0b3IsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UoYXZnX2hvdXJzID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9hY3Rpdml0eV9taW5zLCB3ID0gbXVsdCwgbmEucm0gPSBUUlVFKSAvIDYwLAogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKQoKCiMgLS0tIFBsb3QgZm9yIFJ1cmFsIFlvdXRoIChDb3JyZWN0ZWQpIC0tLQpydXJhbF95b3V0aF9wbG90IDwtIHlvdXRoX3N1bW1hcnkgJT4lCiAgZmlsdGVyKHNlY3RvciA9PSAiUnVyYWwiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBhdmdfaG91cnMsIGNvbG9yID0gZ2VuZGVyKSkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UsIHNpemUgPSAxLjIpICsKICBmYWNldF93cmFwKH4gYWN0aXZpdHksIG5jb2wgPSAzLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkdlbmRlcjoiLCB2YWx1ZXMgPSBjKCJmZW1hbGUiID0gIiMwMDcyQjIiLCAibWFsZSIgPSAiI0Q1NUUwMCIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZvcm1hdF9ob3Vyc19taW51dGVzLCBicmVha3MgPSBwcmV0dHlfYnJlYWtzKG4gPSAzKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJBY3Rpdml0eSBUcmVuZHMgZm9yIFJ1cmFsIFlvdXRoIChBZ2VzIDYtMjQpIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyB0b3RhbCBkYWlseSB0aW1lIHVzZSBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBwYXJ0aWNpcGFudHMuIiwKICAgIHggPSAiQWdlICh5ZWFycykiLAogICAgeSA9ICJBdmVyYWdlIEhvdXJzIFBlciBEYXkgKGZvciBwYXJ0aWNpcGFudHMpIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgY29sb3IgPSAiZ3JheTIwIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiwgZmFjZSA9ICJib2xkIiwgbWFyZ2luID0gbWFyZ2luKGIgPSAxMCksIGhqdXN0ID0gMCksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgbWFyZ2luID0gbWFyZ2luKGIgPSAyNSksIGNvbG9yID0gImdyYXk0MCIsIGhqdXN0ID0gMCksCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJncmF5NTAiKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyLCBoanVzdCA9IDAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIKICApCgojIC0tLSBQbG90IGZvciBVcmJhbiBZb3V0aCAoQ29ycmVjdGVkKSAtLS0KdXJiYW5feW91dGhfcGxvdCA8LSB5b3V0aF9zdW1tYXJ5ICU+JQogIGZpbHRlcihzZWN0b3IgPT0gIlVyYmFuIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gYXZnX2hvdXJzLCBjb2xvciA9IGdlbmRlcikpICsKICBnZW9tX3Ntb290aChzZSA9IEZBTFNFLCBzaXplID0gMS4yKSArCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBuY29sID0gMywgc2NhbGVzID0gImZyZWVfeSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJHZW5kZXI6IiwgdmFsdWVzID0gYygiZmVtYWxlIiA9ICIjMDA3MkIyIiwgIm1hbGUiID0gIiNENTVFMDAiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmb3JtYXRfaG91cnNfbWludXRlcywgYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuID0gMykpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQWN0aXZpdHkgVHJlbmRzIGZvciBVcmJhbiBZb3V0aCAoQWdlcyA2LTI0KSIsCiAgICBzdWJ0aXRsZSA9ICJDb21wYXJpbmcgdG90YWwgZGFpbHkgdGltZSB1c2UgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgcGFydGljaXBhbnRzLiIsCiAgICB4ID0gIkFnZSAoeWVhcnMpIiwKICAgIHkgPSAiQXZlcmFnZSBIb3VycyBQZXIgRGF5IChmb3IgcGFydGljaXBhbnRzKSIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIHRoZW1lX2ZpdmV0aGlydHllaWdodCgpICsKICB0aGVtZSgKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIGNvbG9yID0gImdyYXkyMCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYsIGZhY2UgPSAiYm9sZCIsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApLCBoanVzdCA9IDApLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIG1hcmdpbiA9IG1hcmdpbihiID0gMjUpLCBjb2xvciA9ICJncmF5NDAiLCBoanVzdCA9IDApLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiZ3JheTUwIiksCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiwgaGp1c3QgPSAwLjUpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iCiAgKQoKcnVyYWxfeW91dGhfcGxvdAp1cmJhbl95b3V0aF9wbG90CmBgYAoKIyBFeHBvcnRzIGFuZCBEb3dubG9hZAoKYGBge3Igc2F2ZS1hbGwtcGxvdHMsIGluY2x1ZGU9VFJVRX0KZGlyLmNyZWF0ZSgiZXhwb3J0cyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQoKZXhwb3J0X3RoZW1lIDwtIHRoZW1lKAogIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDU4KSwKICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MiksCiAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzgpLAogIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksCiAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzgpCikKCmdnc2F2ZShmaWxlbmFtZSA9ICJleHBvcnRzLzAxX3NsZWVwX3ZzX2FnZS5wbmciLAogICAgICAgcGxvdCA9IHNsZWVwX3ZzX2FnZV9wbG90ICsgZXhwb3J0X3RoZW1lLAogICAgICAgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiZXhwb3J0cy8wMl9nZW5kZXJfZ2FwX3RvcDE1LnBuZyIsCiAgICAgICBwbG90ID0gZ2VuZGVyX2dhcF9wbG90ICsgZXhwb3J0X3RoZW1lLAogICAgICAgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGZpbGVuYW1lID0gImV4cG9ydHMvMDNfc2VjdG9yX2dhcF90b3AxNS5wbmciLAogICAgICAgcGxvdCA9IHNlY3Rvcl9nYXBfcGxvdCArIGV4cG9ydF90aGVtZSwKICAgICAgIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIikKCmdnc2F2ZShmaWxlbmFtZSA9ICJleHBvcnRzLzA0X2FnZV9zdHJpcHNfdG90YWwucG5nIiwKICAgICAgIHBsb3QgPSBhZ2Vfc3RyaXBzX3Bsb3RfdG90YWwgKyBleHBvcnRfdGhlbWUsCiAgICAgICB3aWR0aCA9IDEyLCBoZWlnaHQgPSA5LCBkcGkgPSAzMDAsIHVuaXRzID0gImluIikKCmdnc2F2ZShmaWxlbmFtZSA9ICJleHBvcnRzLzA1X2FnZV9zdHJpcHNfbWFsZS5wbmciLAogICAgICAgcGxvdCA9IGFnZV9zdHJpcHNfcGxvdF9tYWxlICsgZXhwb3J0X3RoZW1lLAogICAgICAgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOSwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiZXhwb3J0cy8wNl9hZ2Vfc3RyaXBzX2ZlbWFsZS5wbmciLAogICAgICAgcGxvdCA9IGFnZV9zdHJpcHNfcGxvdF9mZW1hbGUgKyBleHBvcnRfdGhlbWUsCiAgICAgICB3aWR0aCA9IDEyLCBoZWlnaHQgPSA5LCBkcGkgPSAzMDAsIHVuaXRzID0gImluIikKCmdnc2F2ZShmaWxlbmFtZSA9ICJleHBvcnRzLzA3X3lvdXRoX3RvcDE1X2R1bWJiZWxsLnBuZyIsCiAgICAgICBwbG90ID0geW91dGhfZHVtYmJlbGxfcGxvdCArIGV4cG9ydF90aGVtZSwKICAgICAgIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIikKCmdnc2F2ZShmaWxlbmFtZSA9ICJleHBvcnRzLzA4X3lvdXRoX3RyZW5kc19ieV9nZW5kZXIucG5nIiwKICAgICAgIHBsb3QgPSB5b3V0aF9nZW5kZXJfdHJlbmRzX3Bsb3QgKyBleHBvcnRfdGhlbWUsCiAgICAgICB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiZXhwb3J0cy8wOV95b3V0aF90cmVuZHNfYnlfc2VjdG9yLnBuZyIsCiAgICAgICBwbG90ID0geW91dGhfc2VjdG9yX3RyZW5kc19wbG90ICsgZXhwb3J0X3RoZW1lLAogICAgICAgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGZpbGVuYW1lID0gImV4cG9ydHMvMTBfcnVyYWxfeW91dGhfdHJlbmRzLnBuZyIsCiAgICAgICBwbG90ID0gcnVyYWxfeW91dGhfcGxvdCArIGV4cG9ydF90aGVtZSwKICAgICAgIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIikKCmdnc2F2ZShmaWxlbmFtZSA9ICJleHBvcnRzLzExX3VyYmFuX3lvdXRoX3RyZW5kcy5wbmciLAogICAgICAgcGxvdCA9IHVyYmFuX3lvdXRoX3Bsb3QgKyBleHBvcnRfdGhlbWUsCiAgICAgICB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiZXhwb3J0cy8xMl9hZ2Vfc3RyaXBzX3J1cmFsLnBuZyIsCiAgICAgICBwbG90ID0gYWdlX3N0cmlwc19wbG90X3J1cmFsICsgZXhwb3J0X3RoZW1lLAogICAgICAgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOSwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiZXhwb3J0cy8xM19hZ2Vfc3RyaXBzX3VyYmFuLnBuZyIsCiAgICAgICBwbG90ID0gYWdlX3N0cmlwc19wbG90X3VyYmFuICsgZXhwb3J0X3RoZW1lLAogICAgICAgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOSwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiZXhwb3J0cy8xNF9lc3NlbnRpYWxfc2xlZXAucG5nIiwKICAgICAgIHBsb3QgPSBuaWdodF9zbGVlcF92c19hZ2VfcGxvdCArIGV4cG9ydF90aGVtZSwKICAgICAgIHdpZHRoID0gMTIsIGhlaWdodCA9IDksIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGZpbGVuYW1lID0gImV4cG9ydHMvMTVfY29tYmluZWRfZ2VuZGVyX2FnZV9zdHJpcHMucG5nIiwKICAgICAgIHBsb3QgPSBjb21iaW5lZF9nZW5kZXJfc3RyaXBzX3Bsb3QgKyBleHBvcnRfdGhlbWUsCiAgICAgICB3aWR0aCA9IDEyLCBoZWlnaHQgPSA5LCBkcGkgPSAzMDAsIHVuaXRzID0gImluIikKYGBgCgpgYGB7ciBjcmVhdGUtemlwLWFuZC1kb3dubG9hZCwgaW5jbHVkZT1UUlVFfQp6aXBfZmlsZSA8LSAidGltZV91c2VfYW5hbHlzaXNfYnVuZGxlLnppcCIKZmlsZXNfdG9femlwIDwtIGMoCiAgbGlzdC5maWxlcygiZXhwb3J0cyIsIGZ1bGwubmFtZXMgPSBUUlVFLCBwYXR0ZXJuID0gIlxcLnBuZyQiKSwKICAidGltZS11c2UtYW5hbHlzaXMuUm1kIgopCgp6aXA6OnppcCh6aXBmaWxlID0gemlwX2ZpbGUsIGZpbGVzID0gZmlsZXNfdG9femlwLCBtb2RlID0gImNoZXJyeS1waWNrIikKCmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9IHppcF9maWxlLAogIG91dHB1dF9uYW1lID0gIkRvd25sb2FkIEFuYWx5c2lzIEJ1bmRsZSAoWklQKSIsCiAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIEJ1bmRsZSIsCiAgYnV0dG9uX3R5cGUgPSAic3VjY2VzcyIsCiAgaGFzX2ljb24gPSBUUlVFLAogIGljb24gPSAiZmEgZmEtZG93bmxvYWQiLAogIHNlbGZfY29udGFpbmVkID0gVFJVRQopCmBgYAo=