Data preparation script NELLS data

Libraries

# get packages needed
fpackage.check <- function(packages) { # (c) Jochem Tolsma
  lapply(packages, FUN = function(x) {
    if (!require(x, character.only = TRUE)) {
      install.packages(x, dependencies = TRUE)
      library(x, character.only = TRUE)
    }
  })
}
packages = c("tidyverse", "lubridate")
fpackage.check(packages)

NELLS combined improt

Import the NELLS datafile with selected neigbhourhood variables.

load(file =  "data_analysis/data/data_processed/nells_data/2023-05-08_nells_combined.rds")

Custum functions

All the steps in the data preparation are save in custom functions. In this section all the custom functions that we used in the data preparation are listed alphabetically.

Age

#Age from date of birth function
age_from_birth <- function(x) {
  date_list <- x %>%
    select(V9) %>%
    as.list()
  
  #replace " " and "/" with "-"
  date_list <-
    str_replace_all(date_list$V9, pattern = "/", replacement = "-")
  date_list <-
    str_replace_all(date_list, pattern = " ", replacement = "-")
  
  #extract year of birth from date of birth and remove date of birth from data.
  x$year_birth <- year(dmy(date_list))
  x$age <- 2022 - x$year_birth
 
  df <- x %>% 
    select(-V9)
  
  return(df)
}

Children

#children prep
prepare_children <- function(x) {#x =  nells_nsum
  df <- x %>%
    mutate(across(.cols = V62:V65,
                  .fns = ~ as.numeric(x = .x))) %>%
    rename(
      nr_children = V62,
      age_oldest_child = V63,
      age_youngest_child = V64,
      age_only_child = V65
    ) %>%
    mutate(oldest_child_education = ifelse(V66 == 1, 1, 0),
           only_child_education = ifelse(Q230 == 1, 1, 0),
           age_youngest_child_combined = ifelse(nr_children == 1, age_only_child, NA),
           age_youngest_child_combined = ifelse(nr_children > 1, age_youngest_child, age_youngest_child_combined),
           age_child_below12 = ifelse(age_youngest_child_combined < 13, 1, 0)
           ) 
}

Education

prepare_education <- function(x) {
  df <- x %>%
    mutate(education_completed_highest = factor(
      V28,
      levels = 1:15,
      labels = c(
        "No education",
        "Primary education",
        "lbo, vmbo-kb",
        "mavo, vmbo-gl/tl",
        "havo",
        "vwo/gymnasium",
        "mbo-kort",
        "mbo-tussen/lang",
        "hbo",
        "university bachelor",
        "university master",
        "PhD",
        "foreign, primary education",
        "foreign, secundary education",
        "foreign, tertiary education"
      )
    ),
    in_education = ifelse(V26 == 3, 0, 1),
    education_level_attend = factor(
      V27,
      levels = 1:12,
      labels = c(
        "Primary education",
        "lbo, vmbo-kb",
        "mavo, vmbo-gl/tl",
        "havo",
        "vwo/gymnasium",
        "mbo-kort",
        "mbo-tussen/lang",
        "hbo",
        "university bachelor",
        "university master",
        "PhD",
        "Foreign"
      )
    )
    )
}

Gender

#Gender recode
prepare_gender <- function(x) {
  df <- x %>%
    mutate(gender = factor(
      V10,
      levels = 1:3,
      labels = c("Male", "Female", "Other")
    ))
}

Migration age

prepare_migration_age <- function(x){
  df <- x %>% 
    mutate(migration_age = as.numeric(V18))
}

Migration background

prepare_migration <- function(x) {
  df <- x %>%
    mutate(
      V13 = as.numeric(V13),
      V14 = as.numeric(V14),
      V15 = as.numeric(V15),
      country_birth = ifelse(V13 == 130, 2, V13),
      country_birth = ifelse(country_birth == 220, 3, country_birth),
      country_birth = ifelse(country_birth > 3, 4, country_birth),
      country_birth_mother = ifelse(V14 == 130, 2, V14),
      country_birth_mother = ifelse(country_birth_mother == 220, 3, country_birth_mother),
      country_birth_mother = ifelse(country_birth_mother > 3, 4, country_birth_mother),
      country_birth_father = ifelse(V15 == 130, 2, V15),
      country_birth_father = ifelse(country_birth_father == 220, 3, country_birth_father),
      country_birth_father = ifelse(country_birth_father > 3, 4, country_birth_father),
      country_birth_fac = factor(
        country_birth,
        levels = 1:4,
        labels = c("Dutch", "Moroccan", "Turkish", "Other")
      ),
      country_birth_mother_fac = factor(
        country_birth_mother,
        levels = 1:4,
        labels = c("Dutch", "Moroccan", "Turkish", "Other")
      ),
      country_birth_father_fac = factor(
        country_birth_father,
        levels = 1:4,
        labels = c("Dutch", "Moroccan", "Turkish", "Other")
      ),
      migration_background = ifelse(
        country_birth_fac == "Dutch" &
          country_birth_mother_fac == "Dutch" |
          country_birth_father_fac == "Dutch",
        1,
        NA
      ),
      migration_background = ifelse(
        country_birth_fac == "Dutch" &
          (
            country_birth_mother_fac == "Other" |
              country_birth_father_fac == "Other"
          ),
        1,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Other" &
          (
            country_birth_mother_fac == "Other" |
              country_birth_father_fac == "Other"
          ),
        6,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Dutch" &
          (
            country_birth_mother_fac == "Moroccan" |
              country_birth_father_fac == "Moroccan"
          ),
        2,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Dutch" &
          (
            country_birth_mother_fac == "Turkish" |
              country_birth_father_fac == "Turkish"
          ),
        3,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Turkish" &
          (
            country_birth_mother_fac == "Turkish" |
              country_birth_father_fac == "Turkish"
          ),
        4,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Moroccan" &
          (
            country_birth_mother_fac == "Moroccan" |
              country_birth_father_fac == "Moroccan"
          ),
        5,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Other" &
          (
            country_birth_mother_fac == "Moroccan" |
              country_birth_father_fac == "Moroccan"
          ),
        2,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Other" &
          (
            country_birth_mother_fac == "Turkish" |
              country_birth_father_fac == "Turkish"
          ),
        3,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Turkish" &
          (
            country_birth_mother_fac == "Other" |
              country_birth_father_fac == "Other"
          ),
        4,
        migration_background
      ),
      migration_background = ifelse(
        country_birth_fac == "Moroccan" &
          (
            country_birth_mother_fac == "Other" |
              country_birth_father_fac == "Other"
          ),
        5,
        migration_background
      ),
      migration_background_fac = factor(
        migration_background,
        levels = 1:6,
        labels = c(
          "Dutch",
          "2nd gen Moroccan",
          "2nd gen Turkish",
          "1st gen Turkish",
          "1st gen Moroccan",
          "Other"
        )
      )
    )
}

Migration motive

prepare_migration_motive <- function(x) {
  df <- x %>%
    mutate(across(starts_with("V21"), ~ factor(
      .x,
      levels = 1:3,
      labels = c("Yes,strongly", "Yes, somewhwat", "None")
    ))) %>%
    rename(
      mig_motive_work_income = V21_1,
      mig_motive_study = V21_2,
      mig_motive_politics = V21_3,
      mig_motive_familiy = V21_4
    )
}

NSUM variable prep

#Rename NSUM variables
rename_nells_variables <- function(x) {
  df <- x %>%
    rename(
      knows_daan = V122_1,
      knows_kevin = V122_2,
      knows_edwin = V122_3,
      knows_albert = V122_4,
      knows_emma = V122_5,
      knows_linda = V122_6,
      knows_ingrid = V122_7,
      knows_willemina = V122_8,
      knows_mohammed = V122_9,
      knows_fatima = V122_10,
      knows_esra = V122_11,
      knows_ibrahim = V122_12,
      knows_prison = V123_1,
      knows_mbo = V123_2,
      knows_hbo = V123_3,
      knows_university = V123_4,
      knows_secundary = V123_5,
      knows_unemployed = V123_6,
      knows_secondhome = V123_7,
      knows_turkishmigration = V123_8,
      knows_moroccanmigration = V123_9,
      knows_hoofddoek = V123_10,
      knows_ramadan = V123_11
    )
}

#Midpoint recode function
midpoint_recode <- function(x) {
  case_when(x == 1 ~ 0,
            x == 2 ~ 1,
            x == 3 ~ 3,
            x == 4 ~ 8,
            x == 5 ~ 15,
            x == 6 ~ 35,
            x == 7 ~ 50)
}

#NSUM midpoint recode function
prepare_nsum <- function(x){
  df_names <- x %>% 
    select(id, starts_with("V122")) %>%
    mutate(across(starts_with("V12"), ~ midpoint_recode(.x))) %>% 
    mutate(across(starts_with("V122"), ~ ifelse(.x > 8, 11, .x))) %>% 
    rename(knows_daan_boundary = V122_1,
           knows_kevin_boundary = V122_2,
           knows_edwin_boundary = V122_3,
           knows_albert_boundary = V122_4,
           knows_emma_boundary = V122_5,
           knows_linda_boundary = V122_6,
           knows_ingrid_boundary = V122_7,
           knows_willemina_boundary = V122_8,
           knows_mohammed_boundary = V122_9,
           knows_fatima_boundary = V122_10,
           knows_esra_boundary = V122_11,
           knows_ibrahim_boundary = V122_12)
    
  
  df <- x %>% 
    mutate(across(starts_with("V12"), ~ midpoint_recode(.x))) %>% 
    mutate(knows_prison_boundary = ifelse(V123_1 > 8, 11, V123_1)) %>% 
    left_join(df_names, by = "id")
}

Partner status

prepare_partner <- function(x) {
  df <- x %>%
    mutate(
      partner_extended = factor(
        V53,
        levels = 1:4,
        labels = c(
          "Does not have a partner",
          "Has a partner, lives seperately",
          "Lives together, unmarried",
          "Married"
        )
      ),
      partner = if_else(V53 == 1, 0, 1)
    )
}

Outgroup attitudes

prepare_therm <- function(x) {
  df <-  x %>%
    mutate(across(.cols = starts_with("Q225"),
                  .fns = ~ as.numeric(.))) %>%
    rename(
      therm_dutch_maj = Q225_24,
      therm_mor = Q225_25,
      therm_tur = Q225_26
    )
}

Partner migration background

prepare_migration_partner <- function(x) {
  df <- x %>%
    mutate(
      V55 = as.numeric(V55),
      V56 = as.numeric(V56),
      V57 = as.numeric(V57),
      country_birth_partner = ifelse(V55 == 130, 2, V55),
      country_birth_partner = ifelse(country_birth_partner == 220, 3, country_birth_partner),
      country_birth_partner = ifelse(country_birth_partner > 3, 4, country_birth_partner),
      country_birth_mother_partner = ifelse(V57 == 130, 2, V57),
      country_birth_mother_partner = ifelse(
        country_birth_mother_partner == 220,
        3,
        country_birth_mother_partner
      ),
      country_birth_mother_partner = ifelse(
        country_birth_mother_partner > 3,
        4,
        country_birth_mother_partner
      ),
      country_birth_father_partner = ifelse(V56 == 130, 2, V56),
      country_birth_father_partner = ifelse(
        country_birth_father_partner == 220,
        3,
        country_birth_father_partner
      ),
      country_birth_father_partner = ifelse(
        country_birth_father_partner > 3,
        4,
        country_birth_father_partner
      ),
      country_birth_partner_fac = factor(
        country_birth_partner,
        levels = 1:4,
        labels = c("Dutch", "Moroccan", "Turkish", "Other")
      ),
      country_birth_mother_partner_fac = factor(
        country_birth_mother_partner,
        levels = 1:4,
        labels = c("Dutch", "Moroccan", "Turkish", "Other")
      ),
      country_birth_father_partner_fac = factor(
        country_birth_father_partner,
        levels = 1:4,
        labels = c("Dutch", "Moroccan", "Turkish", "Other")
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Dutch" &
          country_birth_mother_partner_fac == "Dutch" |
          country_birth_father_partner_fac == "Dutch",
        1,
        NA
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Dutch" &
          (
            country_birth_mother_partner_fac == "Other" |
              country_birth_father_partner_fac == "Other"
          ),
        1,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Other" &
          (
            country_birth_mother_partner_fac == "Other" |
              country_birth_father_partner_fac == "Other"
          ),
        6,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Dutch" &
          (
            country_birth_mother_partner_fac == "Moroccan" |
              country_birth_father_partner_fac == "Moroccan"
          ),
        2,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Dutch" &
          (
            country_birth_mother_partner_fac == "Turkish" |
              country_birth_father_partner_fac == "Turkish"
          ),
        3,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Turkish" &
          (
            country_birth_mother_partner_fac == "Turkish" |
              country_birth_father_partner_fac == "Turkish"
          ),
        4,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Moroccan" &
          (
            country_birth_mother_partner_fac == "Moroccan" |
              country_birth_father_partner_fac == "Moroccan"
          ),
        5,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Other" &
          (
            country_birth_mother_partner_fac == "Moroccan" |
              country_birth_father_partner_fac == "Moroccan"
          ),
        2,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Other" &
          (
            country_birth_mother_partner_fac == "Turkish" |
              country_birth_father_partner_fac == "Turkish"
          ),
        3,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Turkish" &
          (
            country_birth_mother_partner_fac == "Other" |
              country_birth_father_partner_fac == "Other"
          ),
        4,
        migration_background_partner
      ),
      migration_background_partner = ifelse(
        country_birth_partner_fac == "Moroccan" &
          (
            country_birth_mother_partner_fac == "Other" |
              country_birth_father_partner_fac == "Other"
          ),
        5,
        migration_background_partner
      ),
      migration_background_partner_fac = factor(
        migration_background_partner,
        levels = 1:6,
        labels = c(
          "Dutch",
          "2nd gen Moroccan",
          "2nd gen Turkish",
          "1st gen Turkish",
          "1st gen Moroccan",
          "Other"
        )
      )
    )
}

Religion

religion_prep <- function(x) {#x = nells_nsum
  df <- x %>%
    mutate(religious_denom = ifelse(as.numeric(V89) == 2, 13, as.numeric(V90)),
           religious_denom = factor(
             religious_denom,
             levels = 1:13,
             labels = c(
               "Catholic",
               "PKN (hervormd)",
               "PKN (reformed)",
               "PKN (luthers)",
               "Protestant other",
               "Islam sunni",
               "Islam shia",
               "Islam other",
               "Judaism",
               "Hindu",
               "Budhism",
               "Other",
               "None"
             )
           ),
           rel_attendance = factor(
             as.numeric(V91),
             levels = 1:7,
             labels = c(
               "Never",
               "1-2 a year",
               "3-11 a year",
               "Once a month",
               "2-3 a month",
               "Every week",
               "Multiple times a week"
             )
             )
    ) 
}

Data preparation

Prepare the data with the custom functions.

Independent and control variables

#AGE
#edit date into year
nells_nsum <- age_from_birth(nells_nsum)

#GENDER
nells_nsum<- prepare_gender(nells_nsum)
#CHILDREN
nells_nsum <- prepare_children(nells_nsum)

#EDUCATION
nells_nsum <- prepare_education(nells_nsum)

#MIGRATION BACKGROUND
nells_nsum <- prepare_migration(nells_nsum)
nells_nsum <- prepare_migration_age(nells_nsum)
nells_nsum <- prepare_migration_motive(nells_nsum)

#MIGRATION BACKGROUND PARTNER
nells_nsum <- prepare_migration_partner(nells_nsum)

#PAID WORK
nells_nsum <- prepare_paid_work(nells_nsum)

#PARTNER
nells_nsum <- prepare_partner(nells_nsum)

#RELIGION
nells_nsum <- religion_prep(nells_nsum)

#THERMOMETER
nells_nsum <- prepare_therm(nells_nsum)

##########################

NSUM variables

# Data preparation NSUM variables
nells_nsum <- prepare_nsum(nells_nsum)
nells_nsum <- rename_nells_variables(nells_nsum)

Export data

Only select the variables that we need for the analyses. Save the data as seperate .rds.

nells_nsum <- nells_nsum %>% 
  select(id,
         mun_code,
         pc_code,
         age,
         gender,
         partner_extended,
         partner,
         nr_children,
         age_oldest_child,
         age_youngest_child,
         age_youngest_child_combined,
         age_child_below12,
         age_only_child,
         oldest_child_education,
         only_child_education,
         in_education,
         education_level_attend,
         education_completed_highest,
         paid_work,
         religious_denom,
         rel_attendance,
         migration_age,
         starts_with("mig_motive"),
         contains("country_birth"),
         migration_background,
         migration_background_fac,
         migration_background_partner,
         migration_background_partner_fac,
         starts_with("therm"),
         contains("knows_"),
         ends_with("gem"),
         ends_with("pc4"),
         mean_woz_gem,
         mean_p_koop_gem)


save(nells_nsum,
        file = "data_analysis/data/data_processed/nells_data/2022-05-08_nells_nsum_data.rds")
LS0tDQp0aXRsZTogIkRhdGFwcmVwYXJhdGlvbiINCmF1dGhvcjogIlRoaWptZW4gSmVyb2Vuc2UiDQpkYXRlOiAiTGFzdCBjb21waWxlZCBvbiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmBgYA0KDQojIERhdGEgcHJlcGFyYXRpb24gc2NyaXB0IE5FTExTIGRhdGENCg0KIyMgTGlicmFyaWVzDQoNCmBgYHtyIGxpYnJhcmllcywgcmVzdWx0cz0naGlkZSd9DQojIGdldCBwYWNrYWdlcyBuZWVkZWQNCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7ICMgKGMpIEpvY2hlbSBUb2xzbWENCiAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFyZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgIH0NCiAgfSkNCn0NCnBhY2thZ2VzID0gYygidGlkeXZlcnNlIiwgImx1YnJpZGF0ZSIpDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCmBgYA0KDQojIyBORUxMUyBjb21iaW5lZCBpbXByb3QNCg0KSW1wb3J0IHRoZSBORUxMUyBkYXRhZmlsZSB3aXRoIHNlbGVjdGVkIG5laWdiaG91cmhvb2QgdmFyaWFibGVzLiANCg0KYGBge3IgZGF0YSBpbXBvcnR9DQpsb2FkKGZpbGUgPSAgImRhdGFfYW5hbHlzaXMvZGF0YS9kYXRhX3Byb2Nlc3NlZC9uZWxsc19kYXRhLzIwMjMtMDUtMDhfbmVsbHNfY29tYmluZWQucmRzIikNCmBgYA0KDQoNCiMgQ3VzdHVtIGZ1bmN0aW9ucw0KDQpBbGwgdGhlIHN0ZXBzIGluIHRoZSBkYXRhIHByZXBhcmF0aW9uIGFyZSBzYXZlIGluIGN1c3RvbSBmdW5jdGlvbnMuIEluIHRoaXMgc2VjdGlvbiBhbGwgdGhlIGN1c3RvbSBmdW5jdGlvbnMgdGhhdCB3ZSB1c2VkIGluIHRoZSBkYXRhIHByZXBhcmF0aW9uIGFyZSBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkuIA0KDQojIyBBZ2UgDQoNCmBgYHtyIGFnZSBwcmVwfQ0KI0FnZSBmcm9tIGRhdGUgb2YgYmlydGggZnVuY3Rpb24NCmFnZV9mcm9tX2JpcnRoIDwtIGZ1bmN0aW9uKHgpIHsNCiAgZGF0ZV9saXN0IDwtIHggJT4lDQogICAgc2VsZWN0KFY5KSAlPiUNCiAgICBhcy5saXN0KCkNCiAgDQogICNyZXBsYWNlICIgIiBhbmQgIi8iIHdpdGggIi0iDQogIGRhdGVfbGlzdCA8LQ0KICAgIHN0cl9yZXBsYWNlX2FsbChkYXRlX2xpc3QkVjksIHBhdHRlcm4gPSAiLyIsIHJlcGxhY2VtZW50ID0gIi0iKQ0KICBkYXRlX2xpc3QgPC0NCiAgICBzdHJfcmVwbGFjZV9hbGwoZGF0ZV9saXN0LCBwYXR0ZXJuID0gIiAiLCByZXBsYWNlbWVudCA9ICItIikNCiAgDQogICNleHRyYWN0IHllYXIgb2YgYmlydGggZnJvbSBkYXRlIG9mIGJpcnRoIGFuZCByZW1vdmUgZGF0ZSBvZiBiaXJ0aCBmcm9tIGRhdGEuDQogIHgkeWVhcl9iaXJ0aCA8LSB5ZWFyKGRteShkYXRlX2xpc3QpKQ0KICB4JGFnZSA8LSAyMDIyIC0geCR5ZWFyX2JpcnRoDQogDQogIGRmIDwtIHggJT4lIA0KICAgIHNlbGVjdCgtVjkpDQogIA0KICByZXR1cm4oZGYpDQp9DQpgYGANCg0KIyMgQ2hpbGRyZW4NCg0KYGBge3IgY2hpbGRyZW59DQojY2hpbGRyZW4gcHJlcA0KcHJlcGFyZV9jaGlsZHJlbiA8LSBmdW5jdGlvbih4KSB7I3ggPSAgbmVsbHNfbnN1bQ0KICBkZiA8LSB4ICU+JQ0KICAgIG11dGF0ZShhY3Jvc3MoLmNvbHMgPSBWNjI6VjY1LA0KICAgICAgICAgICAgICAgICAgLmZucyA9IH4gYXMubnVtZXJpYyh4ID0gLngpKSkgJT4lDQogICAgcmVuYW1lKA0KICAgICAgbnJfY2hpbGRyZW4gPSBWNjIsDQogICAgICBhZ2Vfb2xkZXN0X2NoaWxkID0gVjYzLA0KICAgICAgYWdlX3lvdW5nZXN0X2NoaWxkID0gVjY0LA0KICAgICAgYWdlX29ubHlfY2hpbGQgPSBWNjUNCiAgICApICU+JQ0KICAgIG11dGF0ZShvbGRlc3RfY2hpbGRfZWR1Y2F0aW9uID0gaWZlbHNlKFY2NiA9PSAxLCAxLCAwKSwNCiAgICAgICAgICAgb25seV9jaGlsZF9lZHVjYXRpb24gPSBpZmVsc2UoUTIzMCA9PSAxLCAxLCAwKSwNCiAgICAgICAgICAgYWdlX3lvdW5nZXN0X2NoaWxkX2NvbWJpbmVkID0gaWZlbHNlKG5yX2NoaWxkcmVuID09IDEsIGFnZV9vbmx5X2NoaWxkLCBOQSksDQogICAgICAgICAgIGFnZV95b3VuZ2VzdF9jaGlsZF9jb21iaW5lZCA9IGlmZWxzZShucl9jaGlsZHJlbiA+IDEsIGFnZV95b3VuZ2VzdF9jaGlsZCwgYWdlX3lvdW5nZXN0X2NoaWxkX2NvbWJpbmVkKSwNCiAgICAgICAgICAgYWdlX2NoaWxkX2JlbG93MTIgPSBpZmVsc2UoYWdlX3lvdW5nZXN0X2NoaWxkX2NvbWJpbmVkIDwgMTMsIDEsIDApDQogICAgICAgICAgICkgDQp9DQpgYGANCg0KIyMgRWR1Y2F0aW9uDQoNCmBgYHtyIGVkdWNhdGlvbiB9DQpwcmVwYXJlX2VkdWNhdGlvbiA8LSBmdW5jdGlvbih4KSB7DQogIGRmIDwtIHggJT4lDQogICAgbXV0YXRlKGVkdWNhdGlvbl9jb21wbGV0ZWRfaGlnaGVzdCA9IGZhY3RvcigNCiAgICAgIFYyOCwNCiAgICAgIGxldmVscyA9IDE6MTUsDQogICAgICBsYWJlbHMgPSBjKA0KICAgICAgICAiTm8gZWR1Y2F0aW9uIiwNCiAgICAgICAgIlByaW1hcnkgZWR1Y2F0aW9uIiwNCiAgICAgICAgImxibywgdm1iby1rYiIsDQogICAgICAgICJtYXZvLCB2bWJvLWdsL3RsIiwNCiAgICAgICAgImhhdm8iLA0KICAgICAgICAidndvL2d5bW5hc2l1bSIsDQogICAgICAgICJtYm8ta29ydCIsDQogICAgICAgICJtYm8tdHVzc2VuL2xhbmciLA0KICAgICAgICAiaGJvIiwNCiAgICAgICAgInVuaXZlcnNpdHkgYmFjaGVsb3IiLA0KICAgICAgICAidW5pdmVyc2l0eSBtYXN0ZXIiLA0KICAgICAgICAiUGhEIiwNCiAgICAgICAgImZvcmVpZ24sIHByaW1hcnkgZWR1Y2F0aW9uIiwNCiAgICAgICAgImZvcmVpZ24sIHNlY3VuZGFyeSBlZHVjYXRpb24iLA0KICAgICAgICAiZm9yZWlnbiwgdGVydGlhcnkgZWR1Y2F0aW9uIg0KICAgICAgKQ0KICAgICksDQogICAgaW5fZWR1Y2F0aW9uID0gaWZlbHNlKFYyNiA9PSAzLCAwLCAxKSwNCiAgICBlZHVjYXRpb25fbGV2ZWxfYXR0ZW5kID0gZmFjdG9yKA0KICAgICAgVjI3LA0KICAgICAgbGV2ZWxzID0gMToxMiwNCiAgICAgIGxhYmVscyA9IGMoDQogICAgICAgICJQcmltYXJ5IGVkdWNhdGlvbiIsDQogICAgICAgICJsYm8sIHZtYm8ta2IiLA0KICAgICAgICAibWF2bywgdm1iby1nbC90bCIsDQogICAgICAgICJoYXZvIiwNCiAgICAgICAgInZ3by9neW1uYXNpdW0iLA0KICAgICAgICAibWJvLWtvcnQiLA0KICAgICAgICAibWJvLXR1c3Nlbi9sYW5nIiwNCiAgICAgICAgImhibyIsDQogICAgICAgICJ1bml2ZXJzaXR5IGJhY2hlbG9yIiwNCiAgICAgICAgInVuaXZlcnNpdHkgbWFzdGVyIiwNCiAgICAgICAgIlBoRCIsDQogICAgICAgICJGb3JlaWduIg0KICAgICAgKQ0KICAgICkNCiAgICApDQp9DQpgYGANCg0KDQojIyBHZW5kZXINCg0KYGBge3IgZ2VuZGVyfQ0KI0dlbmRlciByZWNvZGUNCnByZXBhcmVfZ2VuZGVyIDwtIGZ1bmN0aW9uKHgpIHsNCiAgZGYgPC0geCAlPiUNCiAgICBtdXRhdGUoZ2VuZGVyID0gZmFjdG9yKA0KICAgICAgVjEwLA0KICAgICAgbGV2ZWxzID0gMTozLA0KICAgICAgbGFiZWxzID0gYygiTWFsZSIsICJGZW1hbGUiLCAiT3RoZXIiKQ0KICAgICkpDQp9DQoNCmBgYA0KDQojIyBNaWdyYXRpb24gYWdlDQoNCmBgYHtyIGFnZX0NCnByZXBhcmVfbWlncmF0aW9uX2FnZSA8LSBmdW5jdGlvbih4KXsNCiAgZGYgPC0geCAlPiUgDQogICAgbXV0YXRlKG1pZ3JhdGlvbl9hZ2UgPSBhcy5udW1lcmljKFYxOCkpDQp9DQpgYGANCg0KDQojIyBNaWdyYXRpb24gYmFja2dyb3VuZA0KDQpgYGB7ciBtaWdyYXRpb24gYmFja2dyb3VuZH0NCnByZXBhcmVfbWlncmF0aW9uIDwtIGZ1bmN0aW9uKHgpIHsNCiAgZGYgPC0geCAlPiUNCiAgICBtdXRhdGUoDQogICAgICBWMTMgPSBhcy5udW1lcmljKFYxMyksDQogICAgICBWMTQgPSBhcy5udW1lcmljKFYxNCksDQogICAgICBWMTUgPSBhcy5udW1lcmljKFYxNSksDQogICAgICBjb3VudHJ5X2JpcnRoID0gaWZlbHNlKFYxMyA9PSAxMzAsIDIsIFYxMyksDQogICAgICBjb3VudHJ5X2JpcnRoID0gaWZlbHNlKGNvdW50cnlfYmlydGggPT0gMjIwLCAzLCBjb3VudHJ5X2JpcnRoKSwNCiAgICAgIGNvdW50cnlfYmlydGggPSBpZmVsc2UoY291bnRyeV9iaXJ0aCA+IDMsIDQsIGNvdW50cnlfYmlydGgpLA0KICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXIgPSBpZmVsc2UoVjE0ID09IDEzMCwgMiwgVjE0KSwNCiAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyID0gaWZlbHNlKGNvdW50cnlfYmlydGhfbW90aGVyID09IDIyMCwgMywgY291bnRyeV9iaXJ0aF9tb3RoZXIpLA0KICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXIgPSBpZmVsc2UoY291bnRyeV9iaXJ0aF9tb3RoZXIgPiAzLCA0LCBjb3VudHJ5X2JpcnRoX21vdGhlciksDQogICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlciA9IGlmZWxzZShWMTUgPT0gMTMwLCAyLCBWMTUpLA0KICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXIgPSBpZmVsc2UoY291bnRyeV9iaXJ0aF9mYXRoZXIgPT0gMjIwLCAzLCBjb3VudHJ5X2JpcnRoX2ZhdGhlciksDQogICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlciA9IGlmZWxzZShjb3VudHJ5X2JpcnRoX2ZhdGhlciA+IDMsIDQsIGNvdW50cnlfYmlydGhfZmF0aGVyKSwNCiAgICAgIGNvdW50cnlfYmlydGhfZmFjID0gZmFjdG9yKA0KICAgICAgICBjb3VudHJ5X2JpcnRoLA0KICAgICAgICBsZXZlbHMgPSAxOjQsDQogICAgICAgIGxhYmVscyA9IGMoIkR1dGNoIiwgIk1vcm9jY2FuIiwgIlR1cmtpc2giLCAiT3RoZXIiKQ0KICAgICAgKSwNCiAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX2ZhYyA9IGZhY3RvcigNCiAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXIsDQogICAgICAgIGxldmVscyA9IDE6NCwNCiAgICAgICAgbGFiZWxzID0gYygiRHV0Y2giLCAiTW9yb2NjYW4iLCAiVHVya2lzaCIsICJPdGhlciIpDQogICAgICApLA0KICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfZmFjID0gZmFjdG9yKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlciwNCiAgICAgICAgbGV2ZWxzID0gMTo0LA0KICAgICAgICBsYWJlbHMgPSBjKCJEdXRjaCIsICJNb3JvY2NhbiIsICJUdXJraXNoIiwgIk90aGVyIikNCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZCA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9mYWMgPT0gIkR1dGNoIiAmDQogICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfZmFjID09ICJEdXRjaCIgfA0KICAgICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX2ZhYyA9PSAiRHV0Y2giLA0KICAgICAgICAxLA0KICAgICAgICBOQQ0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhYyA9PSAiRHV0Y2giICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9mYWMgPT0gIk90aGVyIiB8DQogICAgICAgICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX2ZhYyA9PSAiT3RoZXIiDQogICAgICAgICAgKSwNCiAgICAgICAgMSwNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQNCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZCA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9mYWMgPT0gIk90aGVyIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfZmFjID09ICJPdGhlciIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9mYWMgPT0gIk90aGVyIg0KICAgICAgICAgICksDQogICAgICAgIDYsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfZmFjID09ICJEdXRjaCIgJg0KICAgICAgICAgICgNCiAgICAgICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX2ZhYyA9PSAiTW9yb2NjYW4iIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfZmFjID09ICJNb3JvY2NhbiINCiAgICAgICAgICApLA0KICAgICAgICAyLA0KICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZA0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhYyA9PSAiRHV0Y2giICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9mYWMgPT0gIlR1cmtpc2giIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfZmFjID09ICJUdXJraXNoIg0KICAgICAgICAgICksDQogICAgICAgIDMsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfZmFjID09ICJUdXJraXNoIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfZmFjID09ICJUdXJraXNoIiB8DQogICAgICAgICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX2ZhYyA9PSAiVHVya2lzaCINCiAgICAgICAgICApLA0KICAgICAgICA0LA0KICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZA0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhYyA9PSAiTW9yb2NjYW4iICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9mYWMgPT0gIk1vcm9jY2FuIiB8DQogICAgICAgICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX2ZhYyA9PSAiTW9yb2NjYW4iDQogICAgICAgICAgKSwNCiAgICAgICAgNSwNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQNCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZCA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9mYWMgPT0gIk90aGVyIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfZmFjID09ICJNb3JvY2NhbiIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9mYWMgPT0gIk1vcm9jY2FuIg0KICAgICAgICAgICksDQogICAgICAgIDIsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfZmFjID09ICJPdGhlciIgJg0KICAgICAgICAgICgNCiAgICAgICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX2ZhYyA9PSAiVHVya2lzaCIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9mYWMgPT0gIlR1cmtpc2giDQogICAgICAgICAgKSwNCiAgICAgICAgMywNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQNCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZCA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9mYWMgPT0gIlR1cmtpc2giICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9mYWMgPT0gIk90aGVyIiB8DQogICAgICAgICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX2ZhYyA9PSAiT3RoZXIiDQogICAgICAgICAgKSwNCiAgICAgICAgNCwNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQNCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZCA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9mYWMgPT0gIk1vcm9jY2FuIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfZmFjID09ICJPdGhlciIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9mYWMgPT0gIk90aGVyIg0KICAgICAgICAgICksDQogICAgICAgIDUsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfZmFjID0gZmFjdG9yKA0KICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZCwNCiAgICAgICAgbGV2ZWxzID0gMTo2LA0KICAgICAgICBsYWJlbHMgPSBjKA0KICAgICAgICAgICJEdXRjaCIsDQogICAgICAgICAgIjJuZCBnZW4gTW9yb2NjYW4iLA0KICAgICAgICAgICIybmQgZ2VuIFR1cmtpc2giLA0KICAgICAgICAgICIxc3QgZ2VuIFR1cmtpc2giLA0KICAgICAgICAgICIxc3QgZ2VuIE1vcm9jY2FuIiwNCiAgICAgICAgICAiT3RoZXIiDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQp9DQpgYGANCg0KIyMgTWlncmF0aW9uIG1vdGl2ZQ0KDQpgYGB7ciBtaWdyYXRpb24gbW90aXZlfQ0KcHJlcGFyZV9taWdyYXRpb25fbW90aXZlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgZGYgPC0geCAlPiUNCiAgICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJWMjEiKSwgfiBmYWN0b3IoDQogICAgICAueCwNCiAgICAgIGxldmVscyA9IDE6MywNCiAgICAgIGxhYmVscyA9IGMoIlllcyxzdHJvbmdseSIsICJZZXMsIHNvbWV3aHdhdCIsICJOb25lIikNCiAgICApKSkgJT4lDQogICAgcmVuYW1lKA0KICAgICAgbWlnX21vdGl2ZV93b3JrX2luY29tZSA9IFYyMV8xLA0KICAgICAgbWlnX21vdGl2ZV9zdHVkeSA9IFYyMV8yLA0KICAgICAgbWlnX21vdGl2ZV9wb2xpdGljcyA9IFYyMV8zLA0KICAgICAgbWlnX21vdGl2ZV9mYW1pbGl5ID0gVjIxXzQNCiAgICApDQp9DQoNCmBgYA0KDQojIyBOU1VNIHZhcmlhYmxlIHByZXANCg0KYGBge3IgbnN1bX0NCiNSZW5hbWUgTlNVTSB2YXJpYWJsZXMNCnJlbmFtZV9uZWxsc192YXJpYWJsZXMgPC0gZnVuY3Rpb24oeCkgew0KICBkZiA8LSB4ICU+JQ0KICAgIHJlbmFtZSgNCiAgICAgIGtub3dzX2RhYW4gPSBWMTIyXzEsDQogICAgICBrbm93c19rZXZpbiA9IFYxMjJfMiwNCiAgICAgIGtub3dzX2Vkd2luID0gVjEyMl8zLA0KICAgICAga25vd3NfYWxiZXJ0ID0gVjEyMl80LA0KICAgICAga25vd3NfZW1tYSA9IFYxMjJfNSwNCiAgICAgIGtub3dzX2xpbmRhID0gVjEyMl82LA0KICAgICAga25vd3NfaW5ncmlkID0gVjEyMl83LA0KICAgICAga25vd3Nfd2lsbGVtaW5hID0gVjEyMl84LA0KICAgICAga25vd3NfbW9oYW1tZWQgPSBWMTIyXzksDQogICAgICBrbm93c19mYXRpbWEgPSBWMTIyXzEwLA0KICAgICAga25vd3NfZXNyYSA9IFYxMjJfMTEsDQogICAgICBrbm93c19pYnJhaGltID0gVjEyMl8xMiwNCiAgICAgIGtub3dzX3ByaXNvbiA9IFYxMjNfMSwNCiAgICAgIGtub3dzX21ibyA9IFYxMjNfMiwNCiAgICAgIGtub3dzX2hibyA9IFYxMjNfMywNCiAgICAgIGtub3dzX3VuaXZlcnNpdHkgPSBWMTIzXzQsDQogICAgICBrbm93c19zZWN1bmRhcnkgPSBWMTIzXzUsDQogICAgICBrbm93c191bmVtcGxveWVkID0gVjEyM182LA0KICAgICAga25vd3Nfc2Vjb25kaG9tZSA9IFYxMjNfNywNCiAgICAgIGtub3dzX3R1cmtpc2htaWdyYXRpb24gPSBWMTIzXzgsDQogICAgICBrbm93c19tb3JvY2Nhbm1pZ3JhdGlvbiA9IFYxMjNfOSwNCiAgICAgIGtub3dzX2hvb2ZkZG9layA9IFYxMjNfMTAsDQogICAgICBrbm93c19yYW1hZGFuID0gVjEyM18xMQ0KICAgICkNCn0NCg0KI01pZHBvaW50IHJlY29kZSBmdW5jdGlvbg0KbWlkcG9pbnRfcmVjb2RlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgY2FzZV93aGVuKHggPT0gMSB+IDAsDQogICAgICAgICAgICB4ID09IDIgfiAxLA0KICAgICAgICAgICAgeCA9PSAzIH4gMywNCiAgICAgICAgICAgIHggPT0gNCB+IDgsDQogICAgICAgICAgICB4ID09IDUgfiAxNSwNCiAgICAgICAgICAgIHggPT0gNiB+IDM1LA0KICAgICAgICAgICAgeCA9PSA3IH4gNTApDQp9DQoNCiNOU1VNIG1pZHBvaW50IHJlY29kZSBmdW5jdGlvbg0KcHJlcGFyZV9uc3VtIDwtIGZ1bmN0aW9uKHgpew0KICBkZl9uYW1lcyA8LSB4ICU+JSANCiAgICBzZWxlY3QoaWQsIHN0YXJ0c193aXRoKCJWMTIyIikpICU+JQ0KICAgIG11dGF0ZShhY3Jvc3Moc3RhcnRzX3dpdGgoIlYxMiIpLCB+IG1pZHBvaW50X3JlY29kZSgueCkpKSAlPiUgDQogICAgbXV0YXRlKGFjcm9zcyhzdGFydHNfd2l0aCgiVjEyMiIpLCB+IGlmZWxzZSgueCA+IDgsIDExLCAueCkpKSAlPiUgDQogICAgcmVuYW1lKGtub3dzX2RhYW5fYm91bmRhcnkgPSBWMTIyXzEsDQogICAgICAgICAgIGtub3dzX2tldmluX2JvdW5kYXJ5ID0gVjEyMl8yLA0KICAgICAgICAgICBrbm93c19lZHdpbl9ib3VuZGFyeSA9IFYxMjJfMywNCiAgICAgICAgICAga25vd3NfYWxiZXJ0X2JvdW5kYXJ5ID0gVjEyMl80LA0KICAgICAgICAgICBrbm93c19lbW1hX2JvdW5kYXJ5ID0gVjEyMl81LA0KICAgICAgICAgICBrbm93c19saW5kYV9ib3VuZGFyeSA9IFYxMjJfNiwNCiAgICAgICAgICAga25vd3NfaW5ncmlkX2JvdW5kYXJ5ID0gVjEyMl83LA0KICAgICAgICAgICBrbm93c193aWxsZW1pbmFfYm91bmRhcnkgPSBWMTIyXzgsDQogICAgICAgICAgIGtub3dzX21vaGFtbWVkX2JvdW5kYXJ5ID0gVjEyMl85LA0KICAgICAgICAgICBrbm93c19mYXRpbWFfYm91bmRhcnkgPSBWMTIyXzEwLA0KICAgICAgICAgICBrbm93c19lc3JhX2JvdW5kYXJ5ID0gVjEyMl8xMSwNCiAgICAgICAgICAga25vd3NfaWJyYWhpbV9ib3VuZGFyeSA9IFYxMjJfMTIpDQogICAgDQogIA0KICBkZiA8LSB4ICU+JSANCiAgICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJWMTIiKSwgfiBtaWRwb2ludF9yZWNvZGUoLngpKSkgJT4lIA0KICAgIG11dGF0ZShrbm93c19wcmlzb25fYm91bmRhcnkgPSBpZmVsc2UoVjEyM18xID4gOCwgMTEsIFYxMjNfMSkpICU+JSANCiAgICBsZWZ0X2pvaW4oZGZfbmFtZXMsIGJ5ID0gImlkIikNCn0NCmBgYA0KDQojIyBQYWlkIHdvcmsNCg0KYGBge3IgcGFpZCB3b3JrfQ0KI3BhaWQgd29yaw0KcHJlcGFyZV9wYWlkX3dvcmsgPC0gZnVuY3Rpb24oeCkgew0KICBkZiA8LSB4ICU+JSANCiAgICBtdXRhdGUocGFpZF93b3JrID0gaWZlbHNlKFYyOSA9PSAxLCAxLCAwKSkNCn0NCmBgYA0KDQojIyBQYXJ0bmVyIHN0YXR1cw0KDQpgYGB7ciBwYXJ0bmVyfQ0KcHJlcGFyZV9wYXJ0bmVyIDwtIGZ1bmN0aW9uKHgpIHsNCiAgZGYgPC0geCAlPiUNCiAgICBtdXRhdGUoDQogICAgICBwYXJ0bmVyX2V4dGVuZGVkID0gZmFjdG9yKA0KICAgICAgICBWNTMsDQogICAgICAgIGxldmVscyA9IDE6NCwNCiAgICAgICAgbGFiZWxzID0gYygNCiAgICAgICAgICAiRG9lcyBub3QgaGF2ZSBhIHBhcnRuZXIiLA0KICAgICAgICAgICJIYXMgYSBwYXJ0bmVyLCBsaXZlcyBzZXBlcmF0ZWx5IiwNCiAgICAgICAgICAiTGl2ZXMgdG9nZXRoZXIsIHVubWFycmllZCIsDQogICAgICAgICAgIk1hcnJpZWQiDQogICAgICAgICkNCiAgICAgICksDQogICAgICBwYXJ0bmVyID0gaWZfZWxzZShWNTMgPT0gMSwgMCwgMSkNCiAgICApDQp9DQpgYGANCg0KIyMgT3V0Z3JvdXAgYXR0aXR1ZGVzDQoNCmBgYHtyIG91dGdyb3VwIGF0dGl0ZGVzfQ0KcHJlcGFyZV90aGVybSA8LSBmdW5jdGlvbih4KSB7DQogIGRmIDwtICB4ICU+JQ0KICAgIG11dGF0ZShhY3Jvc3MoLmNvbHMgPSBzdGFydHNfd2l0aCgiUTIyNSIpLA0KICAgICAgICAgICAgICAgICAgLmZucyA9IH4gYXMubnVtZXJpYyguKSkpICU+JQ0KICAgIHJlbmFtZSgNCiAgICAgIHRoZXJtX2R1dGNoX21haiA9IFEyMjVfMjQsDQogICAgICB0aGVybV9tb3IgPSBRMjI1XzI1LA0KICAgICAgdGhlcm1fdHVyID0gUTIyNV8yNg0KICAgICkNCn0NCg0KDQpgYGANCg0KIyMgUGFydG5lciBtaWdyYXRpb24gYmFja2dyb3VuZA0KDQpgYGB7ciBwYXJ0bmVyIG1pZ3JhdGlvbiBiYWNrZ3JvdW5kfQ0KcHJlcGFyZV9taWdyYXRpb25fcGFydG5lciA8LSBmdW5jdGlvbih4KSB7DQogIGRmIDwtIHggJT4lDQogICAgbXV0YXRlKA0KICAgICAgVjU1ID0gYXMubnVtZXJpYyhWNTUpLA0KICAgICAgVjU2ID0gYXMubnVtZXJpYyhWNTYpLA0KICAgICAgVjU3ID0gYXMubnVtZXJpYyhWNTcpLA0KICAgICAgY291bnRyeV9iaXJ0aF9wYXJ0bmVyID0gaWZlbHNlKFY1NSA9PSAxMzAsIDIsIFY1NSksDQogICAgICBjb3VudHJ5X2JpcnRoX3BhcnRuZXIgPSBpZmVsc2UoY291bnRyeV9iaXJ0aF9wYXJ0bmVyID09IDIyMCwgMywgY291bnRyeV9iaXJ0aF9wYXJ0bmVyKSwNCiAgICAgIGNvdW50cnlfYmlydGhfcGFydG5lciA9IGlmZWxzZShjb3VudHJ5X2JpcnRoX3BhcnRuZXIgPiAzLCA0LCBjb3VudHJ5X2JpcnRoX3BhcnRuZXIpLA0KICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lciA9IGlmZWxzZShWNTcgPT0gMTMwLCAyLCBWNTcpLA0KICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lciA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lciA9PSAyMjAsDQogICAgICAgIDMsDQogICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX3BhcnRuZXINCiAgICAgICksDQogICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyID4gMywNCiAgICAgICAgNCwNCiAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lcg0KICAgICAgKSwNCiAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX3BhcnRuZXIgPSBpZmVsc2UoVjU2ID09IDEzMCwgMiwgVjU2KSwNCiAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX3BhcnRuZXIgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX3BhcnRuZXIgPT0gMjIwLA0KICAgICAgICAzLA0KICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9wYXJ0bmVyDQogICAgICApLA0KICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lciA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lciA+IDMsDQogICAgICAgIDQsDQogICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX3BhcnRuZXINCiAgICAgICksDQogICAgICBjb3VudHJ5X2JpcnRoX3BhcnRuZXJfZmFjID0gZmFjdG9yKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX3BhcnRuZXIsDQogICAgICAgIGxldmVscyA9IDE6NCwNCiAgICAgICAgbGFiZWxzID0gYygiRHV0Y2giLCAiTW9yb2NjYW4iLCAiVHVya2lzaCIsICJPdGhlciIpDQogICAgICApLA0KICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lcl9mYWMgPSBmYWN0b3IoDQogICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX3BhcnRuZXIsDQogICAgICAgIGxldmVscyA9IDE6NCwNCiAgICAgICAgbGFiZWxzID0gYygiRHV0Y2giLCAiTW9yb2NjYW4iLCAiVHVya2lzaCIsICJPdGhlciIpDQogICAgICApLA0KICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lcl9mYWMgPSBmYWN0b3IoDQogICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX3BhcnRuZXIsDQogICAgICAgIGxldmVscyA9IDE6NCwNCiAgICAgICAgbGFiZWxzID0gYygiRHV0Y2giLCAiTW9yb2NjYW4iLCAiVHVya2lzaCIsICJPdGhlciIpDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lciA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9wYXJ0bmVyX2ZhYyA9PSAiRHV0Y2giICYNCiAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiRHV0Y2giIHwNCiAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiRHV0Y2giLA0KICAgICAgICAxLA0KICAgICAgICBOQQ0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXIgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfcGFydG5lcl9mYWMgPT0gIkR1dGNoIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lcl9mYWMgPT0gIk90aGVyIiB8DQogICAgICAgICAgICAgIGNvdW50cnlfYmlydGhfZmF0aGVyX3BhcnRuZXJfZmFjID09ICJPdGhlciINCiAgICAgICAgICApLA0KICAgICAgICAxLA0KICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lciA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9wYXJ0bmVyX2ZhYyA9PSAiT3RoZXIiICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiT3RoZXIiIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lcl9mYWMgPT0gIk90aGVyIg0KICAgICAgICAgICksDQogICAgICAgIDYsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXINCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX3BhcnRuZXJfZmFjID09ICJEdXRjaCIgJg0KICAgICAgICAgICgNCiAgICAgICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX3BhcnRuZXJfZmFjID09ICJNb3JvY2NhbiIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiTW9yb2NjYW4iDQogICAgICAgICAgKSwNCiAgICAgICAgMiwNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lcg0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXIgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfcGFydG5lcl9mYWMgPT0gIkR1dGNoIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lcl9mYWMgPT0gIlR1cmtpc2giIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lcl9mYWMgPT0gIlR1cmtpc2giDQogICAgICAgICAgKSwNCiAgICAgICAgMywNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lcg0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXIgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfcGFydG5lcl9mYWMgPT0gIlR1cmtpc2giICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiVHVya2lzaCIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiVHVya2lzaCINCiAgICAgICAgICApLA0KICAgICAgICA0LA0KICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyDQogICAgICApLA0KICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lciA9IGlmZWxzZSgNCiAgICAgICAgY291bnRyeV9iaXJ0aF9wYXJ0bmVyX2ZhYyA9PSAiTW9yb2NjYW4iICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiTW9yb2NjYW4iIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lcl9mYWMgPT0gIk1vcm9jY2FuIg0KICAgICAgICAgICksDQogICAgICAgIDUsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXINCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX3BhcnRuZXJfZmFjID09ICJPdGhlciIgJg0KICAgICAgICAgICgNCiAgICAgICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX3BhcnRuZXJfZmFjID09ICJNb3JvY2NhbiIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiTW9yb2NjYW4iDQogICAgICAgICAgKSwNCiAgICAgICAgMiwNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lcg0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXIgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfcGFydG5lcl9mYWMgPT0gIk90aGVyIiAmDQogICAgICAgICAgKA0KICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9tb3RoZXJfcGFydG5lcl9mYWMgPT0gIlR1cmtpc2giIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lcl9mYWMgPT0gIlR1cmtpc2giDQogICAgICAgICAgKSwNCiAgICAgICAgMywNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lcg0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXIgPSBpZmVsc2UoDQogICAgICAgIGNvdW50cnlfYmlydGhfcGFydG5lcl9mYWMgPT0gIlR1cmtpc2giICYNCiAgICAgICAgICAoDQogICAgICAgICAgICBjb3VudHJ5X2JpcnRoX21vdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiT3RoZXIiIHwNCiAgICAgICAgICAgICAgY291bnRyeV9iaXJ0aF9mYXRoZXJfcGFydG5lcl9mYWMgPT0gIk90aGVyIg0KICAgICAgICAgICksDQogICAgICAgIDQsDQogICAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXINCiAgICAgICksDQogICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyID0gaWZlbHNlKA0KICAgICAgICBjb3VudHJ5X2JpcnRoX3BhcnRuZXJfZmFjID09ICJNb3JvY2NhbiIgJg0KICAgICAgICAgICgNCiAgICAgICAgICAgIGNvdW50cnlfYmlydGhfbW90aGVyX3BhcnRuZXJfZmFjID09ICJPdGhlciIgfA0KICAgICAgICAgICAgICBjb3VudHJ5X2JpcnRoX2ZhdGhlcl9wYXJ0bmVyX2ZhYyA9PSAiT3RoZXIiDQogICAgICAgICAgKSwNCiAgICAgICAgNSwNCiAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lcg0KICAgICAgKSwNCiAgICAgIG1pZ3JhdGlvbl9iYWNrZ3JvdW5kX3BhcnRuZXJfZmFjID0gZmFjdG9yKA0KICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyLA0KICAgICAgICBsZXZlbHMgPSAxOjYsDQogICAgICAgIGxhYmVscyA9IGMoDQogICAgICAgICAgIkR1dGNoIiwNCiAgICAgICAgICAiMm5kIGdlbiBNb3JvY2NhbiIsDQogICAgICAgICAgIjJuZCBnZW4gVHVya2lzaCIsDQogICAgICAgICAgIjFzdCBnZW4gVHVya2lzaCIsDQogICAgICAgICAgIjFzdCBnZW4gTW9yb2NjYW4iLA0KICAgICAgICAgICJPdGhlciINCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCn0NCmBgYA0KDQoNCg0KIyMgUmVsaWdpb24NCg0KYGBge3IgcmVsaWdpb259DQpyZWxpZ2lvbl9wcmVwIDwtIGZ1bmN0aW9uKHgpIHsjeCA9IG5lbGxzX25zdW0NCiAgZGYgPC0geCAlPiUNCiAgICBtdXRhdGUocmVsaWdpb3VzX2Rlbm9tID0gaWZlbHNlKGFzLm51bWVyaWMoVjg5KSA9PSAyLCAxMywgYXMubnVtZXJpYyhWOTApKSwNCiAgICAgICAgICAgcmVsaWdpb3VzX2Rlbm9tID0gZmFjdG9yKA0KICAgICAgICAgICAgIHJlbGlnaW91c19kZW5vbSwNCiAgICAgICAgICAgICBsZXZlbHMgPSAxOjEzLA0KICAgICAgICAgICAgIGxhYmVscyA9IGMoDQogICAgICAgICAgICAgICAiQ2F0aG9saWMiLA0KICAgICAgICAgICAgICAgIlBLTiAoaGVydm9ybWQpIiwNCiAgICAgICAgICAgICAgICJQS04gKHJlZm9ybWVkKSIsDQogICAgICAgICAgICAgICAiUEtOIChsdXRoZXJzKSIsDQogICAgICAgICAgICAgICAiUHJvdGVzdGFudCBvdGhlciIsDQogICAgICAgICAgICAgICAiSXNsYW0gc3VubmkiLA0KICAgICAgICAgICAgICAgIklzbGFtIHNoaWEiLA0KICAgICAgICAgICAgICAgIklzbGFtIG90aGVyIiwNCiAgICAgICAgICAgICAgICJKdWRhaXNtIiwNCiAgICAgICAgICAgICAgICJIaW5kdSIsDQogICAgICAgICAgICAgICAiQnVkaGlzbSIsDQogICAgICAgICAgICAgICAiT3RoZXIiLA0KICAgICAgICAgICAgICAgIk5vbmUiDQogICAgICAgICAgICAgKQ0KICAgICAgICAgICApLA0KICAgICAgICAgICByZWxfYXR0ZW5kYW5jZSA9IGZhY3RvcigNCiAgICAgICAgICAgICBhcy5udW1lcmljKFY5MSksDQogICAgICAgICAgICAgbGV2ZWxzID0gMTo3LA0KICAgICAgICAgICAgIGxhYmVscyA9IGMoDQogICAgICAgICAgICAgICAiTmV2ZXIiLA0KICAgICAgICAgICAgICAgIjEtMiBhIHllYXIiLA0KICAgICAgICAgICAgICAgIjMtMTEgYSB5ZWFyIiwNCiAgICAgICAgICAgICAgICJPbmNlIGEgbW9udGgiLA0KICAgICAgICAgICAgICAgIjItMyBhIG1vbnRoIiwNCiAgICAgICAgICAgICAgICJFdmVyeSB3ZWVrIiwNCiAgICAgICAgICAgICAgICJNdWx0aXBsZSB0aW1lcyBhIHdlZWsiDQogICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICkNCiAgICApIA0KfQ0KYGBgDQoNCiMgRGF0YSBwcmVwYXJhdGlvbg0KDQpQcmVwYXJlIHRoZSBkYXRhIHdpdGggdGhlIGN1c3RvbSBmdW5jdGlvbnMuIA0KDQojIyBJbmRlcGVuZGVudCBhbmQgY29udHJvbCB2YXJpYWJsZXMNCg0KYGBge3IgaW5kZXAgcHJlcH0NCg0KI0FHRQ0KI2VkaXQgZGF0ZSBpbnRvIHllYXINCm5lbGxzX25zdW0gPC0gYWdlX2Zyb21fYmlydGgobmVsbHNfbnN1bSkNCg0KI0dFTkRFUg0KbmVsbHNfbnN1bTwtIHByZXBhcmVfZ2VuZGVyKG5lbGxzX25zdW0pDQojQ0hJTERSRU4NCm5lbGxzX25zdW0gPC0gcHJlcGFyZV9jaGlsZHJlbihuZWxsc19uc3VtKQ0KDQojRURVQ0FUSU9ODQpuZWxsc19uc3VtIDwtIHByZXBhcmVfZWR1Y2F0aW9uKG5lbGxzX25zdW0pDQoNCiNNSUdSQVRJT04gQkFDS0dST1VORA0KbmVsbHNfbnN1bSA8LSBwcmVwYXJlX21pZ3JhdGlvbihuZWxsc19uc3VtKQ0KbmVsbHNfbnN1bSA8LSBwcmVwYXJlX21pZ3JhdGlvbl9hZ2UobmVsbHNfbnN1bSkNCm5lbGxzX25zdW0gPC0gcHJlcGFyZV9taWdyYXRpb25fbW90aXZlKG5lbGxzX25zdW0pDQoNCiNNSUdSQVRJT04gQkFDS0dST1VORCBQQVJUTkVSDQpuZWxsc19uc3VtIDwtIHByZXBhcmVfbWlncmF0aW9uX3BhcnRuZXIobmVsbHNfbnN1bSkNCg0KI1BBSUQgV09SSw0KbmVsbHNfbnN1bSA8LSBwcmVwYXJlX3BhaWRfd29yayhuZWxsc19uc3VtKQ0KDQojUEFSVE5FUg0KbmVsbHNfbnN1bSA8LSBwcmVwYXJlX3BhcnRuZXIobmVsbHNfbnN1bSkNCg0KI1JFTElHSU9ODQpuZWxsc19uc3VtIDwtIHJlbGlnaW9uX3ByZXAobmVsbHNfbnN1bSkNCg0KI1RIRVJNT01FVEVSDQpuZWxsc19uc3VtIDwtIHByZXBhcmVfdGhlcm0obmVsbHNfbnN1bSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmBgYA0KDQojIyBOU1VNIHZhcmlhYmxlcw0KDQpgYGB7ciBuc3VtIHZhcmlhYmxlcyBwcmVwfQ0KIyBEYXRhIHByZXBhcmF0aW9uIE5TVU0gdmFyaWFibGVzDQpuZWxsc19uc3VtIDwtIHByZXBhcmVfbnN1bShuZWxsc19uc3VtKQ0KbmVsbHNfbnN1bSA8LSByZW5hbWVfbmVsbHNfdmFyaWFibGVzKG5lbGxzX25zdW0pDQpgYGANCg0KIyBFeHBvcnQgZGF0YQ0KDQpPbmx5IHNlbGVjdCB0aGUgdmFyaWFibGVzIHRoYXQgd2UgbmVlZCBmb3IgdGhlIGFuYWx5c2VzLiBTYXZlIHRoZSBkYXRhIGFzIHNlcGVyYXRlIC5yZHMuIA0KDQpgYGB7ciBzZWxlY3QgYW5kIGV4cG9ydCBkYXRhfQ0KbmVsbHNfbnN1bSA8LSBuZWxsc19uc3VtICU+JSANCiAgc2VsZWN0KGlkLA0KICAgICAgICAgbXVuX2NvZGUsDQogICAgICAgICBwY19jb2RlLA0KICAgICAgICAgYWdlLA0KICAgICAgICAgZ2VuZGVyLA0KICAgICAgICAgcGFydG5lcl9leHRlbmRlZCwNCiAgICAgICAgIHBhcnRuZXIsDQogICAgICAgICBucl9jaGlsZHJlbiwNCiAgICAgICAgIGFnZV9vbGRlc3RfY2hpbGQsDQogICAgICAgICBhZ2VfeW91bmdlc3RfY2hpbGQsDQogICAgICAgICBhZ2VfeW91bmdlc3RfY2hpbGRfY29tYmluZWQsDQogICAgICAgICBhZ2VfY2hpbGRfYmVsb3cxMiwNCiAgICAgICAgIGFnZV9vbmx5X2NoaWxkLA0KICAgICAgICAgb2xkZXN0X2NoaWxkX2VkdWNhdGlvbiwNCiAgICAgICAgIG9ubHlfY2hpbGRfZWR1Y2F0aW9uLA0KICAgICAgICAgaW5fZWR1Y2F0aW9uLA0KICAgICAgICAgZWR1Y2F0aW9uX2xldmVsX2F0dGVuZCwNCiAgICAgICAgIGVkdWNhdGlvbl9jb21wbGV0ZWRfaGlnaGVzdCwNCiAgICAgICAgIHBhaWRfd29yaywNCiAgICAgICAgIHJlbGlnaW91c19kZW5vbSwNCiAgICAgICAgIHJlbF9hdHRlbmRhbmNlLA0KICAgICAgICAgbWlncmF0aW9uX2FnZSwNCiAgICAgICAgIHN0YXJ0c193aXRoKCJtaWdfbW90aXZlIiksDQogICAgICAgICBjb250YWlucygiY291bnRyeV9iaXJ0aCIpLA0KICAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmQsDQogICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9mYWMsDQogICAgICAgICBtaWdyYXRpb25fYmFja2dyb3VuZF9wYXJ0bmVyLA0KICAgICAgICAgbWlncmF0aW9uX2JhY2tncm91bmRfcGFydG5lcl9mYWMsDQogICAgICAgICBzdGFydHNfd2l0aCgidGhlcm0iKSwNCiAgICAgICAgIGNvbnRhaW5zKCJrbm93c18iKSwNCiAgICAgICAgIGVuZHNfd2l0aCgiZ2VtIiksDQogICAgICAgICBlbmRzX3dpdGgoInBjNCIpLA0KICAgICAgICAgbWVhbl93b3pfZ2VtLA0KICAgICAgICAgbWVhbl9wX2tvb3BfZ2VtKQ0KDQoNCnNhdmUobmVsbHNfbnN1bSwNCiAgICAgICAgZmlsZSA9ICJkYXRhX2FuYWx5c2lzL2RhdGEvZGF0YV9wcm9jZXNzZWQvbmVsbHNfZGF0YS8yMDIyLTA1LTA4X25lbGxzX25zdW1fZGF0YS5yZHMiKQ0KDQpgYGANCg0K


Copyright © 2024 Jeroense Thijmen