LISS

  • We use 14 waves : [2008,2021]
  • We use 14.580 unique respondents
  • We use 99.495 respondent-wave combinations
  • We use 231.020 confidant-respondent-wave combinations

Dependent variables

Core Discussion Network

We would like to concentrate on your closest contacts now, to form a picture of the social relationships that people have.
It is easier to answer these types of questions by considering concrete persons.
For that reason, we ask that you list a number of persons close to you. If you wish, you can enter nicknames or initials, as long as you can remember who they refer to.
Most people discuss important things with other people.
If you look back on the last six months, with whom did you discuss important things?
Please enter their first names below (to a maximum of 5).

Figure 4. CDN

Figure 4. CDN


CDN homogeneity

Operationalization 1.

To measure the degree of homogeneity within the CDN we use the (reversed) Krackhard and Stern’s E-I index (Krackhardt and Stern 1988). This measure captures the relative prevalence of between-group ties (\(E\)) and within-group ties (\(I\)). It can thus be interpreted as a measure of network segregation.

E-I Index: \(EI = - \frac{E-I}{E+I}\)

We use a reversed version, so higher scores indicate more homogeneity:

  • 1 is maximum homogeneity
  • -1 is maximum heterogeneity

For Figure 4:

  • Color homogeneity = \(- \frac{2-3}{2+3}\) = +0.2.
  • Shape homogeneity = \(- \frac{3-2}{2+3}\) = -0.2.

Operationalization 2.

Similarity Index

S Index = \(S = 2*(\frac{\Sigma_j sim^z_{ij}}{\Sigma_j}) - 1\),
where \(sim^z_{ij} = 1 - \frac{|z_i - z_j|}{r_z}\).

Higer scores indicate more homogeneity/similarity:

  • 1 is maximum similarity
  • -1 is maximum dissimilarity

Independent variables

  • Education:
    • low (primary, vmbo)
    • medium (MBO, HAVO, VWO)
    • Professional college (HBO)
    • University
  • Gender:
    • male
    • female
  • Age:
    • birth year
    • five year categories
  • Ethnicity:
    • native Dutch
    • non-western
    • western

Representivity

LISS representative with respect to eductional level measured in five categories?

load(file = "./data/liss_merged_core_file_v3_0921.Rdata")

sample_val <- NA
sample_val[1] <- (table(liss_wide$oplcat.11))[1]
sample_val[2] <- (table(liss_wide$oplcat.11))[2]
sample_val[3] <- (table(liss_wide$oplcat.11))[3] + (table(liss_wide$oplcat.11))[4]
sample_val[4] <- (table(liss_wide$oplcat.11))[5]
sample_val[5] <- (table(liss_wide$oplcat.11))[6]


# cbs https://opendata.cbs.nl/#/CBS/nl/dataset/82816NED/table?ts=1646133108517
datacbs <- c(1265, 2847, 5211, 3122, 1850)
levels(datacbs) <- c("primair", "vmbo", "havo/vwo/mbo", "hbo", "wo")
# round(datacbs / sum(datacbs),2)
pop_val <- datacbs/sum(datacbs)

test <- chisq.test(x = sample_val, p = pop_val, rescale.p = TRUE)
test_data <- data.frame(round(test$observed), round(test$expected), c("primair", "vmbo", "havo/vwo/mbo",
    "hbo", "wo"))
names(test_data) <- c("observed (LISS)", "expected (CBS)", "levels")
test_data
test

rm(list = ls())
#>   observed (LISS) expected (CBS)       levels
#> 1             510            619      primair
#> 2            1424           1393         vmbo
#> 3            2460           2550 havo/vwo/mbo
#> 4            1732           1528          hbo
#> 5             869            905           wo
#> 
#>  Chi-squared test for given probabilities
#> 
#> data:  sample_val
#> X-squared = 51.825, df = 4, p-value = 1.501e-10

Nope, but nothing really problematic.


Some data wrangling

load(file="./data/liss_jca_jochem_V2.rds")


liss_long %>%
  mutate(#size
        #cdn_size = 5 - rowSums(is.na(cbind(alter_id_1, alter_id_2, alter_id_3, alter_id_4, alter_id_5))),
        cdn_size = 5 - rowSums(is.na(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5))),
        #education
        opl_y = recode(as.numeric(oplmet), '1' = 6, '2'=10, '3'= 11.5, '4' = 10.5, '5' = 15, '6'=16, '8'=4, .default=-1 ),
        opl_y = na_if(opl_y, -1), 
        opl4 = recode(as.numeric(oplmet), '1' = 1, '2'=1, '3'= 2, '4' = 2, '5' = 3, '6'=4, .default=-1 ),
        opl4 = na_if(opl4, -1), 
        opl4 = structure(opl4, labels=c("low", "medium", "high1", "high2")),
         across(c(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5), ~as.numeric(.x), .names = "{.col}_opl4"),
         across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~recode(.x, '4'=1, '6'=1, '10'=2, '10.5'=2, '11.5'=2 , '15'=3, '16' = 4, .default=-1)),
         across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~na_if(.x, -1)),
        educ_I = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)==opl4,na.rm=T),
         educ_E = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)!=opl4,na.rm=T),
         educ_EI =  - ((educ_E - educ_I) / (educ_E + educ_I)),
         cdn_neduc_h = rowSums(cbind(educ_recode_alter1, educ_recode_alter2, educ_recode_alter3, educ_recode_alter4, educ_recode_alter5)==16, na.rm=T),
        cdn_size_educ = 5 - rowSums(is.na(cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5))), 
        educ_sim = 2*(1- rowSums(abs((cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5) - opl_y)/12), na.rm=T)/cdn_size_educ)-1,
        
        
        #gender   
         gender_alter1 = replace_na(gender_alter1, -1),
         gender_alter2 = replace_na(gender_alter2, -1),
         gender_alter3 = replace_na(gender_alter3, -1),
         gender_alter4 = replace_na(gender_alter4, -1),
         gender_alter5 = replace_na(gender_alter5, -1),
         cdn_ngender_2 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==2, na.rm=T),
         cdn_ngender_1 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==1, na.rm=T),
         gender_I = ifelse(geslacht==2, cdn_ngender_2, cdn_ngender_1),
         gender_E = ifelse(geslacht==1, cdn_ngender_2, cdn_ngender_1),
         gender_EI =  - ((gender_E - gender_I) / (gender_E + gender_I)),
        
        #age
        across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, 14)),
        across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~as.integer(.x)),
        leeftijd_cat13 = as.integer(cut(as.numeric(liss_long$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))),
        leeftijd_I = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)==leeftijd_cat13, na.rm=T),
        leeftijd_E = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)!=leeftijd_cat13, na.rm=T),
        leeftijd_EI =  - ((leeftijd_E - leeftijd_I) / (leeftijd_E + leeftijd_I)),
        
        cdn_size_age = 5 - rowSums(is.na(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5))), 
        across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~recode(.x, '1'=15, '2'=18, '3'=23, '4'=28, '5'=33 , '6'=38, '7' = 43,'8'= 48, '9'=53, '10'=58, '11'=63, '12'=68, '13'=75, .default=-1)),
         across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, -1)),
        leeftijd_sim = 2*(1 - rowSums(abs((cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5) - as.numeric(liss_long$leeftijd))/75), na.rm=T)/cdn_size_age)-1,
        
        
        
        #etni
        etni3 = recode(as.numeric(origin), '0' = 1, '101'=2, '102'= 3, '201' = 2, '202' = 3, '999'=-1, .default=-1 ),
        etni3 = na_if(etni3, -1), 
        etni3 = structure(etni3, labels=c("D", "W", "NW")),
         across(c(origin_alter1,origin_alter2,origin_alter3,origin_alter4,origin_alter5), ~as.numeric(.x), .names = "{.col}_etni3"),
         across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~recode(.x, '1'=1, '2'=3, '3'=3, '4'=3, '5'=3 , '6'=2, '7' = 3, '8' = 2, '9' = -1, .default=-1)),
         across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~na_if(.x, -1)),
         etni_I = rowSums(cbind(origin_alter1_etni3, origin_alter2_etni3, origin_alter3_etni3, origin_alter4_etni3 ,origin_alter5_etni3)==etni3, na.rm=T),
         etni_E = rowSums(cbind(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3)!=etni3, na.rm=T),
         etni_EI =  - ((etni_E - etni_I) / (etni_E + etni_I)),
        
          ego_id = nomem_encr) %>%
  #filter(!is.na(pol_int))   %>%
  select(ego_id,  survey_wave, leeftijd, leeftijd_cat13,  opl4, geslacht, etni3, cdn_size, cdn_size_educ, cdn_size_age, educ_EI,educ_sim,gender_EI, leeftijd_EI, leeftijd_sim, etni_EI ) -> datajt

#make similar dataset for non-kin. dus gooi alle alters weg met rel_alter - 1 2,3,4,5
# quickest would probably be to go from wide to long, select and go back to wide. but...

attributes(liss_wide$rel_alter1.1)

liss_long %>%
  mutate(across(c(rel_alter1,rel_alter2,rel_alter3,rel_alter4,rel_alter5), ~replace_na(.x, -1)),
         #alter_id_1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, alter_id_1), 
         #alter_id_2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, alter_id_2), 
         #alter_id_3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, alter_id_3), 
         #alter_id_4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, alter_id_4), 
         #alter_id_5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, alter_id_5), 
         
         educ_recode_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, educ_recode_alter1), 
         educ_recode_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, educ_recode_alter2), 
         educ_recode_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, educ_recode_alter3), 
         educ_recode_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, educ_recode_alter4), 
         educ_recode_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, educ_recode_alter5), 
         
         gender_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, gender_alter1), 
         gender_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, gender_alter2), 
         gender_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, gender_alter3), 
         gender_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, gender_alter4), 
         gender_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, gender_alter5),
         
         origin_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, origin_alter1), 
         origin_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, origin_alter2), 
         origin_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, origin_alter3), 
         origin_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, origin_alter4), 
         origin_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, origin_alter5),
         
         age_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, age_alter1), 
         age_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, age_alter2), 
         age_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, age_alter3), 
         age_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, age_alter4), 
         age_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, age_alter5),
         
         
         ) %>%


  mutate(#size
        #cdn_size = 5 - rowSums(is.na(cbind(alter_id_1, alter_id_2, alter_id_3, alter_id_4, alter_id_5))),
        cdn_size = 5 - rowSums(is.na(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5))),
        #education
        opl_y = recode(as.numeric(oplmet), '1' = 6, '2'=10, '3'= 11.5, '4' = 10.5, '5' = 15, '6'=16, '8'=4, .default=-1 ),
        opl_y = na_if(opl_y, -1), 
        opl4 = recode(as.numeric(oplmet), '1' = 1, '2'=1, '3'= 2, '4' = 2, '5' = 3, '6'=4, .default=-1 ),
        opl4 = na_if(opl4, -1), 
        opl4 = structure(opl4, labels=c("low", "medium", "high1", "high2")),
         across(c(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5), ~as.numeric(.x), .names = "{.col}_opl4"),
         across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~recode(.x, '4'=1, '6'=1, '10'=2, '10.5'=2, '11.5'=2 , '15'=3, '16' = 4, .default=-1)),
         across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~na_if(.x, -1)),
        educ_I = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)==opl4,na.rm=T),
         educ_E = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)!=opl4,na.rm=T),
         educ_EI =  - ((educ_E - educ_I) / (educ_E + educ_I)),
         cdn_neduc_h = rowSums(cbind(educ_recode_alter1, educ_recode_alter2, educ_recode_alter3, educ_recode_alter4, educ_recode_alter5)==16, na.rm=T),
        cdn_size_educ = 5 - rowSums(is.na(cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5))), 
        educ_sim = 2*(1- rowSums(abs((cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5) - opl_y)/12), na.rm=T)/cdn_size_educ)-1,
        
        
        #gender   
         gender_alter1 = replace_na(gender_alter1, -1),
         gender_alter2 = replace_na(gender_alter2, -1),
         gender_alter3 = replace_na(gender_alter3, -1),
         gender_alter4 = replace_na(gender_alter4, -1),
         gender_alter5 = replace_na(gender_alter5, -1),
         cdn_ngender_2 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==2, na.rm=T),
         cdn_ngender_1 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==1, na.rm=T),
         gender_I = ifelse(geslacht==2, cdn_ngender_2, cdn_ngender_1),
         gender_E = ifelse(geslacht==1, cdn_ngender_2, cdn_ngender_1),
         gender_EI =  - ((gender_E - gender_I) / (gender_E + gender_I)),
        
        #age
        across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, 14)),
        across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~as.integer(.x)),
        leeftijd_cat13 = as.integer(cut(as.numeric(liss_long$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))),
        leeftijd_I = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)==leeftijd_cat13, na.rm=T),
        leeftijd_E = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)!=leeftijd_cat13, na.rm=T),
        leeftijd_EI =  - ((leeftijd_E - leeftijd_I) / (leeftijd_E + leeftijd_I)),
        
        cdn_size_age = 5 - rowSums(is.na(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5))), 
        across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~recode(.x, '1'=15, '2'=18, '3'=23, '4'=28, '5'=33 , '6'=38, '7' = 43,'8'= 48, '9'=53, '10'=58, '11'=63, '12'=68, '13'=75, .default=-1)),
         across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, -1)),
        leeftijd_sim = 2*( 1 - rowSums(abs((cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5) - as.numeric(liss_long$leeftijd))/75), na.rm=T)/cdn_size_age)-1,
        
        
        
        #etni
        etni3 = recode(as.numeric(origin), '0' = 1, '101'=2, '102'= 3, '201' = 2, '202' = 3, '999'=-1, .default=-1 ),
        etni3 = na_if(etni3, -1), 
        etni3 = structure(etni3, labels=c("D", "W", "NW")),
         across(c(origin_alter1,origin_alter2,origin_alter3,origin_alter4,origin_alter5), ~as.numeric(.x), .names = "{.col}_etni3"),
         across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~recode(.x, '1'=1, '2'=3, '3'=3, '4'=3, '5'=3 , '6'=2, '7' = 3, '8' = 2, '9' = -1, .default=-1)),
         across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~na_if(.x, -1)),
         etni_I = rowSums(cbind(origin_alter1_etni3, origin_alter2_etni3, origin_alter3_etni3, origin_alter4_etni3 ,origin_alter5_etni3)==etni3, na.rm=T),
         etni_E = rowSums(cbind(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3)!=etni3, na.rm=T),
         etni_EI =  - ((etni_E - etni_I) / (etni_E + etni_I)),
        
          ego_id = nomem_encr) %>%
  #filter(!is.na(pol_int))   %>%
  select(ego_id,  survey_wave, leeftijd, leeftijd_cat13,  opl4, geslacht, etni3, cdn_size, cdn_size_educ, cdn_size_age, educ_EI,educ_sim,gender_EI, leeftijd_EI, leeftijd_sim, etni_EI )  -> datajt_nk




test <- cut(as.numeric(liss_long$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))
#levels(test)

save(datajt, file="./data/datajt.rda")
save(datajt_nk, file="./data/datajt_nk.rda")

#cor.test(datajt$educ_EI, datajt$educ_sim)
#cor.test(datajt$leeftijd_EI, datajt$leeftijd_sim)

#hist(datajt$leeftijd_sim)

#rm(list=ls())  

References

Krackhardt, David, and Robert N Stern. 1988. “Informal Networks and Organizational Crises: An Experimental Simulation.” Social Psychology Quarterly, 123–40.
LS0tDQp0aXRsZTogIlNvY2lhbCBzZWdyZWdhdGlvbiBpbiBDb3JlIERpc2N1c3Npb24gTmV0d29ya3MiDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQotLS0NCg0KYGBge3IgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KbGlicmFyeShrbml0cikNCm9wdHNfY2h1bmskc2V0KHRpZHkub3B0cz1saXN0KHdpZHRoLmN1dG9mZj0xMDApLHRpZHk9VFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsY29tbWVudCA9ICIjPiIsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0UsIGNsYXNzLnNvdXJjZT1jKCJ0ZXN0IiksIGNsYXNzLm91dHB1dD1jKCJ0ZXN0MiIpKQ0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkNCnJnbDo6c2V0dXBLbml0cigpDQpgYGANCg0KYGBge3IgY29sb3JpemUsIGVjaG89RkFMU0V9DQpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikgew0KICBpZiAoa25pdHI6OmlzX2xhdGV4X291dHB1dCgpKSB7DQogICAgc3ByaW50ZigiXFx0ZXh0Y29sb3J7JXN9eyVzfSIsIGNvbG9yLCB4KQ0KICB9IGVsc2UgaWYgKGtuaXRyOjppc19odG1sX291dHB1dCgpKSB7DQogICAgc3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCANCiAgICAgICAgICAgIHgpDQogIH0gZWxzZSB4DQp9DQoNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KYGBge2NzcyBzdHlsZSBzZXR0aW5ncywgZWNobyA9IEZBTFNFfQ0KYmxvY2txdW90ZSB7DQogICAgcGFkZGluZzogMTBweCAyMHB4Ow0KICAgIG1hcmdpbjogMCAwIDIwcHg7DQogICAgZm9udC1zaXplOiAxNHB4Ow0KICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2VlZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LDI1NSwyMjQsMSk7DQp9DQoNCi50ZXN0IHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIG92ZXJmbG93LXg6IGF1dG87DQogIG1hcmdpbjogMHB4Ow0KfQ0KDQoudGVzdDIgew0KICBtYXgtaGVpZ2h0OiAzMDBweDsNCiAgb3ZlcmZsb3cteTogYXV0bzsNCiAgb3ZlcmZsb3cteDogYXV0bzsNCiAgbWFyZ2luOiAwcHg7DQogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICBjb2xvcjogcmdiKDIwMSwgNzYsIDc2KTsNCn0NCg0KDQpoMSwgLmgxLCBoMiwgLmgyLCBoMywgLmgzIHsNCiAgbWFyZ2luLXRvcDogMjRweDsNCn0NCg0KDQpgYGANCg0KYGBge3IsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsNCiAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFyZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgIH0NCiAgfSkNCn0NCg0KDQpgYGANCg0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQpwYWNrYWdlcyA9IGMoInRpZHl2ZXJzZSIsICJoYXZlbiIsICJIbWlzYyIsICJwbG90bHkiKQ0KDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCg0KYGBgDQoNCi0tLSANCg0KIyBMSVNTICANCg0KDQo8YSBocmVmPSJodHRwczovL3d3dy5saXNzZGF0YS5ubC8iPg0KICA8aW1nIHNyYz0ibGlzc2xvZ29fMC5wbmciPg0KICA8L2E+DQoNCi0gV2UgdXNlICoqMTQgd2F2ZXMqKiA6IFsyMDA4LDIwMjFdICANCi0gV2UgdXNlICoqMTQuNTgwKiogdW5pcXVlIHJlc3BvbmRlbnRzICANCi0gV2UgdXNlICoqOTkuNDk1KiogcmVzcG9uZGVudC13YXZlIGNvbWJpbmF0aW9ucyAgDQotIFdlIHVzZSAqKjIzMS4wMjAqKiBjb25maWRhbnQtcmVzcG9uZGVudC13YXZlIGNvbWJpbmF0aW9ucyAgDQoNCi0tLSAgDQoNCiMjIERlcGVuZGVudCB2YXJpYWJsZXMNCg0KIyMjICoqQ29yZSBEaXNjdXNzaW9uIE5ldHdvcmsqKg0KIA0KPiBXZSB3b3VsZCBsaWtlIHRvIGNvbmNlbnRyYXRlIG9uIHlvdXIgY2xvc2VzdCBjb250YWN0cyBub3csIHRvIGZvcm0gYSBwaWN0dXJlIG9mIHRoZSBzb2NpYWwgcmVsYXRpb25zaGlwcyB0aGF0IHBlb3BsZSBoYXZlLiAgDQo+IEl0IGlzIGVhc2llciB0byBhbnN3ZXIgdGhlc2UgdHlwZXMgb2YgcXVlc3Rpb25zIGJ5IGNvbnNpZGVyaW5nIGNvbmNyZXRlIHBlcnNvbnMuICANCj4gRm9yIHRoYXQgcmVhc29uLCB3ZSBhc2sgdGhhdCB5b3UgbGlzdCBhIG51bWJlciBvZiBwZXJzb25zIGNsb3NlIHRvIHlvdS4gSWYgeW91IHdpc2gsIHlvdSBjYW4gZW50ZXIgbmlja25hbWVzIG9yIGluaXRpYWxzLCBhcyBsb25nIGFzIHlvdSBjYW4gcmVtZW1iZXIgd2hvIHRoZXkgcmVmZXIgdG8uICANCj4gTW9zdCBwZW9wbGUgZGlzY3VzcyBpbXBvcnRhbnQgdGhpbmdzIHdpdGggb3RoZXIgcGVvcGxlLiAgDQo+IElmIHlvdSBsb29rIGJhY2sgb24gdGhlIGxhc3Qgc2l4IG1vbnRocywgd2l0aCB3aG9tIGRpZCB5b3UgZGlzY3VzcyBpbXBvcnRhbnQgdGhpbmdzPyAgDQo+IFBsZWFzZSBlbnRlciB0aGVpciBmaXJzdCBuYW1lcyBiZWxvdyAodG8gYSBtYXhpbXVtIG9mIDUpLiAgDQoNCg0KYGBge3IgY2RuLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJGaWd1cmUgNC4gQ0ROIiwgb3V0LndpZHRoID0gJzUwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi9lZ29uZXQucG5nIikNCmBgYA0KPGJyPiANCg0KIyMjICoqQ0ROIGhvbW9nZW5laXR5KiogDQoNCipPcGVyYXRpb25hbGl6YXRpb24gMS4qIA0KDQpUbyBtZWFzdXJlIHRoZSBkZWdyZWUgb2YgaG9tb2dlbmVpdHkgd2l0aGluIHRoZSBDRE4gd2UgdXNlIHRoZSAocmV2ZXJzZWQpIEtyYWNraGFyZCBhbmQgU3Rlcm4ncyBFLUkgaW5kZXggW0BrcmFja2hhcmR0MTk4OF0uIFRoaXMgbWVhc3VyZSBjYXB0dXJlcyB0aGUgcmVsYXRpdmUgcHJldmFsZW5jZSBvZiBiZXR3ZWVuLWdyb3VwIHRpZXMgKCRFJCkgYW5kIHdpdGhpbi1ncm91cCB0aWVzICgkSSQpLiBJdCBjYW4gdGh1cyBiZSBpbnRlcnByZXRlZCBhcyBhIG1lYXN1cmUgb2YgbmV0d29yayBzZWdyZWdhdGlvbi4gIA0KDQpFLUkgSW5kZXg6ICRFSSA9IC0gXGZyYWN7RS1JfXtFK0l9JCAgDQoNCldlIHVzZSBhIHJldmVyc2VkIHZlcnNpb24sIHNvIGhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbW9yZSBob21vZ2VuZWl0eTogDQoNCi0gMSBpcyBtYXhpbXVtIGhvbW9nZW5laXR5ICANCi0gLTEgaXMgbWF4aW11bSBoZXRlcm9nZW5laXR5ICANCg0KDQpGb3IgRmlndXJlIDQ6ICANCg0KKiBDb2xvciBob21vZ2VuZWl0eSA9ICQtIFxmcmFjezItM317MiszfSQgPSArMC4yLiAgDQoqIFNoYXBlIGhvbW9nZW5laXR5ID0gJC0gXGZyYWN7My0yfXsyKzN9JCA9IC0wLjIuICANCg0KKk9wZXJhdGlvbmFsaXphdGlvbiAyLioNCg0KU2ltaWxhcml0eSBJbmRleA0KDQpTIEluZGV4ID0gJFMgPSAyKihcZnJhY3tcU2lnbWFfaiBzaW1eel97aWp9fXtcU2lnbWFfan0pIC0gMSQsICANCndoZXJlICRzaW1eel97aWp9ID0gMSAtIFxmcmFje3x6X2kgLSB6X2p8fXtyX3p9JC4gIA0KDQpIaWdlciBzY29yZXMgaW5kaWNhdGUgbW9yZSBob21vZ2VuZWl0eS9zaW1pbGFyaXR5OiAgDQoNCi0gMSBpcyBtYXhpbXVtIHNpbWlsYXJpdHkgIA0KLSAtMSBpcyBtYXhpbXVtIGRpc3NpbWlsYXJpdHkgIA0KDQoNCi0tLSAgDQoNCiMjIEluZGVwZW5kZW50IHZhcmlhYmxlcw0KDQotIEVkdWNhdGlvbjogDQogICAgKiBsb3cgKHByaW1hcnksIHZtYm8pICANCiAgICAqIG1lZGl1bSAoTUJPLCBIQVZPLCBWV08pICANCiAgICAqIFByb2Zlc3Npb25hbCBjb2xsZWdlIChIQk8pICANCiAgICAqIFVuaXZlcnNpdHkgICANCi0gR2VuZGVyOg0KICAgICogbWFsZSAgDQogICAgKiBmZW1hbGUgIA0KLSBBZ2U6IA0KICAgICogYmlydGggeWVhciAgDQogICAgKiBmaXZlIHllYXIgY2F0ZWdvcmllcyAgDQotIEV0aG5pY2l0eTogIA0KICAgICogbmF0aXZlIER1dGNoICANCiAgICAqIG5vbi13ZXN0ZXJuICANCiAgICAqIHdlc3Rlcm4gIA0KDQoNCi0tLSAgDQoNCiMjIFJlcHJlc2VudGl2aXR5DQoNCjwhLS0tDQpUaGlqbWVuLCBob3cgZG8gSSBrbm93IGVnbyBwYXJ0aWNpcGF0ZWQ/OiBqdXN0IHNlbGVjdCBvbiBtaXNzaW5ncw0KaG93IGRvIEkga25vdyB0aGF0IGFuIGFsdGVyIGlzIG1lbnRpb25lZD86IGNoZWNrIGFsdGVyX2lkIE5BDQotLS0+DQoNCkxJU1MgcmVwcmVzZW50YXRpdmUgd2l0aCByZXNwZWN0IHRvIGVkdWN0aW9uYWwgbGV2ZWwgbWVhc3VyZWQgaW4gZml2ZSBjYXRlZ29yaWVzPyANCg0KYGBge3IsIGVjaG89VFJVRSwgcmVzdWx0cz0naG9sZCd9DQoNCmxvYWQoZmlsZT0iLi9kYXRhL2xpc3NfbWVyZ2VkX2NvcmVfZmlsZV92M18wOTIxLlJkYXRhIikNCg0Kc2FtcGxlX3ZhbCA8LSBOQQ0Kc2FtcGxlX3ZhbFsxXSA8LSAodGFibGUobGlzc193aWRlJG9wbGNhdC4xMSkpWzFdDQpzYW1wbGVfdmFsWzJdIDwtICh0YWJsZShsaXNzX3dpZGUkb3BsY2F0LjExKSlbMl0NCnNhbXBsZV92YWxbM10gPC0gKHRhYmxlKGxpc3Nfd2lkZSRvcGxjYXQuMTEpKVszXSArICh0YWJsZShsaXNzX3dpZGUkb3BsY2F0LjExKSlbNF0NCnNhbXBsZV92YWxbNF0gPC0gKHRhYmxlKGxpc3Nfd2lkZSRvcGxjYXQuMTEpKVs1XQ0Kc2FtcGxlX3ZhbFs1XSA8LSAodGFibGUobGlzc193aWRlJG9wbGNhdC4xMSkpWzZdDQoNCg0KI2NicyBodHRwczovL29wZW5kYXRhLmNicy5ubC8jL0NCUy9ubC9kYXRhc2V0LzgyODE2TkVEL3RhYmxlP3RzPTE2NDYxMzMxMDg1MTcNCmRhdGFjYnMgPC0gYygxMjY1LAkyODQ3LAk1MjExLAkzMTIyLAkxODUwKQ0KbGV2ZWxzKGRhdGFjYnMpIDwtIGMoInByaW1haXIiLCAidm1ibyIsICJoYXZvL3Z3by9tYm8iLCAiaGJvIiwgIndvIikNCiNyb3VuZChkYXRhY2JzIC8gc3VtKGRhdGFjYnMpLDIpDQpwb3BfdmFsIDwtIGRhdGFjYnMgLyBzdW0oZGF0YWNicykNCg0KdGVzdCA8LSBjaGlzcS50ZXN0KHg9c2FtcGxlX3ZhbCwgcD1wb3BfdmFsLCByZXNjYWxlLnAgPSBUUlVFKQ0KdGVzdF9kYXRhIDwtIGRhdGEuZnJhbWUocm91bmQodGVzdCRvYnNlcnZlZCkscm91bmQodGVzdCRleHBlY3RlZCksIGMoInByaW1haXIiLCAidm1ibyIsICJoYXZvL3Z3by9tYm8iLCAiaGJvIiwgIndvIikpDQpuYW1lcyh0ZXN0X2RhdGEpIDwtIGMoIm9ic2VydmVkIChMSVNTKSIsICJleHBlY3RlZCAoQ0JTKSIsICJsZXZlbHMiKQ0KdGVzdF9kYXRhDQp0ZXN0DQoNCnJtKGxpc3Q9bHMoKSkNCmBgYA0KDQpOb3BlLCBidXQgbm90aGluZyByZWFsbHkgcHJvYmxlbWF0aWMuIA0KDQotLS0gIA0KDQo8IS0tLQ0KIyMgRGF0YSBwcmVwLiANCg0KV2UgcHJlcGFyZWQgdHdvIGRhdGFzZXRzLCBvbmUgaW4gd2hpY2ggd2UgaW5jbHVkZWQgYWxsIGFsdGVycyBhbmQgb25lIGluIHdoaWNoIHdlIGV4Y2x1ZGVkIGtpbi1hbHRlcnMuIA0KVGhpcyBwcmVzZW50YXRpb24gd2Ugd2lsbCB1c2UgaW5mb21yYXRpb24gb24gYWxsIGFsdGVycy4gDQotLS0+IA0KDQojIFNvbWUgZGF0YSB3cmFuZ2xpbmcgIA0KDQpgYGB7ciwgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KDQpsb2FkKGZpbGU9Ii4vZGF0YS9saXNzX2pjYV9qb2NoZW1fVjIucmRzIikNCg0KDQpsaXNzX2xvbmcgJT4lDQogIG11dGF0ZSgjc2l6ZQ0KICAgICAgICAjY2RuX3NpemUgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChhbHRlcl9pZF8xLCBhbHRlcl9pZF8yLCBhbHRlcl9pZF8zLCBhbHRlcl9pZF80LCBhbHRlcl9pZF81KSkpLA0KICAgICAgICBjZG5fc2l6ZSA9IDUgLSByb3dTdW1zKGlzLm5hKGNiaW5kKGdlbmRlcl9hbHRlcjEsIGdlbmRlcl9hbHRlcjIsIGdlbmRlcl9hbHRlcjMsIGdlbmRlcl9hbHRlcjQsIGdlbmRlcl9hbHRlcjUpKSksDQogICAgICAgICNlZHVjYXRpb24NCiAgICAgICAgb3BsX3kgPSByZWNvZGUoYXMubnVtZXJpYyhvcGxtZXQpLCAnMScgPSA2LCAnMic9MTAsICczJz0gMTEuNSwgJzQnID0gMTAuNSwgJzUnID0gMTUsICc2Jz0xNiwgJzgnPTQsIC5kZWZhdWx0PS0xICksDQogICAgICAgIG9wbF95ID0gbmFfaWYob3BsX3ksIC0xKSwgDQogICAgICAgIG9wbDQgPSByZWNvZGUoYXMubnVtZXJpYyhvcGxtZXQpLCAnMScgPSAxLCAnMic9MSwgJzMnPSAyLCAnNCcgPSAyLCAnNScgPSAzLCAnNic9NCwgLmRlZmF1bHQ9LTEgKSwNCiAgICAgICAgb3BsNCA9IG5hX2lmKG9wbDQsIC0xKSwgDQogICAgICAgIG9wbDQgPSBzdHJ1Y3R1cmUob3BsNCwgbGFiZWxzPWMoImxvdyIsICJtZWRpdW0iLCAiaGlnaDEiLCAiaGlnaDIiKSksDQogICAgICAgICBhY3Jvc3MoYyhlZHVjX3JlY29kZV9hbHRlcjEsZWR1Y19yZWNvZGVfYWx0ZXIyLGVkdWNfcmVjb2RlX2FsdGVyMyxlZHVjX3JlY29kZV9hbHRlcjQsZWR1Y19yZWNvZGVfYWx0ZXI1KSwgfmFzLm51bWVyaWMoLngpLCAubmFtZXMgPSAiey5jb2x9X29wbDQiKSwNCiAgICAgICAgIGFjcm9zcyhjKGVkdWNfcmVjb2RlX2FsdGVyMV9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyMl9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyM19vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNF9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNV9vcGw0KSwgfnJlY29kZSgueCwgJzQnPTEsICc2Jz0xLCAnMTAnPTIsICcxMC41Jz0yLCAnMTEuNSc9MiAsICcxNSc9MywgJzE2JyA9IDQsIC5kZWZhdWx0PS0xKSksDQogICAgICAgICBhY3Jvc3MoYyhlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCksIH5uYV9pZigueCwgLTEpKSwNCiAgICAgICAgZWR1Y19JID0gcm93U3VtcyhjYmluZChlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCk9PW9wbDQsbmEucm09VCksDQogICAgICAgICBlZHVjX0UgPSByb3dTdW1zKGNiaW5kKGVkdWNfcmVjb2RlX2FsdGVyMV9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyMl9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyM19vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNF9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNV9vcGw0KSE9b3BsNCxuYS5ybT1UKSwNCiAgICAgICAgIGVkdWNfRUkgPSAgLSAoKGVkdWNfRSAtIGVkdWNfSSkgLyAoZWR1Y19FICsgZWR1Y19JKSksDQogICAgICAgICBjZG5fbmVkdWNfaCA9IHJvd1N1bXMoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxLCBlZHVjX3JlY29kZV9hbHRlcjIsIGVkdWNfcmVjb2RlX2FsdGVyMywgZWR1Y19yZWNvZGVfYWx0ZXI0LCBlZHVjX3JlY29kZV9hbHRlcjUpPT0xNiwgbmEucm09VCksDQogICAgICAgIGNkbl9zaXplX2VkdWMgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChlZHVjX3JlY29kZV9hbHRlcjEsZWR1Y19yZWNvZGVfYWx0ZXIyLGVkdWNfcmVjb2RlX2FsdGVyMyxlZHVjX3JlY29kZV9hbHRlcjQsZWR1Y19yZWNvZGVfYWx0ZXI1KSkpLCANCiAgICAgICAgZWR1Y19zaW0gPSAyKigxLSByb3dTdW1zKGFicygoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxLGVkdWNfcmVjb2RlX2FsdGVyMixlZHVjX3JlY29kZV9hbHRlcjMsZWR1Y19yZWNvZGVfYWx0ZXI0LGVkdWNfcmVjb2RlX2FsdGVyNSkgLSBvcGxfeSkvMTIpLCBuYS5ybT1UKS9jZG5fc2l6ZV9lZHVjKS0xLA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgICNnZW5kZXIgICANCiAgICAgICAgIGdlbmRlcl9hbHRlcjEgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjEsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjIgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjIsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjMgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjMsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjQgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjQsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjUgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjUsIC0xKSwNCiAgICAgICAgIGNkbl9uZ2VuZGVyXzIgPSByb3dTdW1zKGNiaW5kKGdlbmRlcl9hbHRlcjEsIGdlbmRlcl9hbHRlcjIsIGdlbmRlcl9hbHRlcjMsIGdlbmRlcl9hbHRlcjQsIGdlbmRlcl9hbHRlcjUpPT0yLCBuYS5ybT1UKSwNCiAgICAgICAgIGNkbl9uZ2VuZGVyXzEgPSByb3dTdW1zKGNiaW5kKGdlbmRlcl9hbHRlcjEsIGdlbmRlcl9hbHRlcjIsIGdlbmRlcl9hbHRlcjMsIGdlbmRlcl9hbHRlcjQsIGdlbmRlcl9hbHRlcjUpPT0xLCBuYS5ybT1UKSwNCiAgICAgICAgIGdlbmRlcl9JID0gaWZlbHNlKGdlc2xhY2h0PT0yLCBjZG5fbmdlbmRlcl8yLCBjZG5fbmdlbmRlcl8xKSwNCiAgICAgICAgIGdlbmRlcl9FID0gaWZlbHNlKGdlc2xhY2h0PT0xLCBjZG5fbmdlbmRlcl8yLCBjZG5fbmdlbmRlcl8xKSwNCiAgICAgICAgIGdlbmRlcl9FSSA9ICAtICgoZ2VuZGVyX0UgLSBnZW5kZXJfSSkgLyAoZ2VuZGVyX0UgKyBnZW5kZXJfSSkpLA0KICAgICAgICANCiAgICAgICAgI2FnZQ0KICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfm5hX2lmKC54LCAxNCkpLA0KICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfmFzLmludGVnZXIoLngpKSwNCiAgICAgICAgbGVlZnRpamRfY2F0MTMgPSBhcy5pbnRlZ2VyKGN1dChhcy5udW1lcmljKGxpc3NfbG9uZyRsZWVmdGlqZCksYnJlYWtzID0gYygtSW5mLCAxNSwgMjAsIDI1LCAzMCwgMzUsIDQwLDQ1LDUwLDU1LDYwLDY1LDcwLCBJbmYpKSksDQogICAgICAgIGxlZWZ0aWpkX0kgPSByb3dTdW1zKGNiaW5kKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpPT1sZWVmdGlqZF9jYXQxMywgbmEucm09VCksDQogICAgICAgIGxlZWZ0aWpkX0UgPSByb3dTdW1zKGNiaW5kKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpIT1sZWVmdGlqZF9jYXQxMywgbmEucm09VCksDQogICAgICAgIGxlZWZ0aWpkX0VJID0gIC0gKChsZWVmdGlqZF9FIC0gbGVlZnRpamRfSSkgLyAobGVlZnRpamRfRSArIGxlZWZ0aWpkX0kpKSwNCiAgICAgICAgDQogICAgICAgIGNkbl9zaXplX2FnZSA9IDUgLSByb3dTdW1zKGlzLm5hKGNiaW5kKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpKSksIA0KICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfnJlY29kZSgueCwgJzEnPTE1LCAnMic9MTgsICczJz0yMywgJzQnPTI4LCAnNSc9MzMgLCAnNic9MzgsICc3JyA9IDQzLCc4Jz0gNDgsICc5Jz01MywgJzEwJz01OCwgJzExJz02MywgJzEyJz02OCwgJzEzJz03NSwgLmRlZmF1bHQ9LTEpKSwNCiAgICAgICAgIGFjcm9zcyhjKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpLCB+bmFfaWYoLngsIC0xKSksDQogICAgICAgIGxlZWZ0aWpkX3NpbSA9IDIqKDEgLSByb3dTdW1zKGFicygoY2JpbmQoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSkgLSBhcy5udW1lcmljKGxpc3NfbG9uZyRsZWVmdGlqZCkpLzc1KSwgbmEucm09VCkvY2RuX3NpemVfYWdlKS0xLA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICAjZXRuaQ0KICAgICAgICBldG5pMyA9IHJlY29kZShhcy5udW1lcmljKG9yaWdpbiksICcwJyA9IDEsICcxMDEnPTIsICcxMDInPSAzLCAnMjAxJyA9IDIsICcyMDInID0gMywgJzk5OSc9LTEsIC5kZWZhdWx0PS0xICksDQogICAgICAgIGV0bmkzID0gbmFfaWYoZXRuaTMsIC0xKSwgDQogICAgICAgIGV0bmkzID0gc3RydWN0dXJlKGV0bmkzLCBsYWJlbHM9YygiRCIsICJXIiwgIk5XIikpLA0KICAgICAgICAgYWNyb3NzKGMob3JpZ2luX2FsdGVyMSxvcmlnaW5fYWx0ZXIyLG9yaWdpbl9hbHRlcjMsb3JpZ2luX2FsdGVyNCxvcmlnaW5fYWx0ZXI1KSwgfmFzLm51bWVyaWMoLngpLCAubmFtZXMgPSAiey5jb2x9X2V0bmkzIiksDQogICAgICAgICBhY3Jvc3MoYyhvcmlnaW5fYWx0ZXIxX2V0bmkzLG9yaWdpbl9hbHRlcjJfZXRuaTMsb3JpZ2luX2FsdGVyM19ldG5pMyxvcmlnaW5fYWx0ZXI0X2V0bmkzLG9yaWdpbl9hbHRlcjVfZXRuaTMpLCB+cmVjb2RlKC54LCAnMSc9MSwgJzInPTMsICczJz0zLCAnNCc9MywgJzUnPTMgLCAnNic9MiwgJzcnID0gMywgJzgnID0gMiwgJzknID0gLTEsIC5kZWZhdWx0PS0xKSksDQogICAgICAgICBhY3Jvc3MoYyhvcmlnaW5fYWx0ZXIxX2V0bmkzLG9yaWdpbl9hbHRlcjJfZXRuaTMsb3JpZ2luX2FsdGVyM19ldG5pMyxvcmlnaW5fYWx0ZXI0X2V0bmkzLG9yaWdpbl9hbHRlcjVfZXRuaTMpLCB+bmFfaWYoLngsIC0xKSksDQogICAgICAgICBldG5pX0kgPSByb3dTdW1zKGNiaW5kKG9yaWdpbl9hbHRlcjFfZXRuaTMsIG9yaWdpbl9hbHRlcjJfZXRuaTMsIG9yaWdpbl9hbHRlcjNfZXRuaTMsIG9yaWdpbl9hbHRlcjRfZXRuaTMgLG9yaWdpbl9hbHRlcjVfZXRuaTMpPT1ldG5pMywgbmEucm09VCksDQogICAgICAgICBldG5pX0UgPSByb3dTdW1zKGNiaW5kKG9yaWdpbl9hbHRlcjFfZXRuaTMsb3JpZ2luX2FsdGVyMl9ldG5pMyxvcmlnaW5fYWx0ZXIzX2V0bmkzLG9yaWdpbl9hbHRlcjRfZXRuaTMsb3JpZ2luX2FsdGVyNV9ldG5pMykhPWV0bmkzLCBuYS5ybT1UKSwNCiAgICAgICAgIGV0bmlfRUkgPSAgLSAoKGV0bmlfRSAtIGV0bmlfSSkgLyAoZXRuaV9FICsgZXRuaV9JKSksDQogICAgICAgIA0KICAgICAgICAgIGVnb19pZCA9IG5vbWVtX2VuY3IpICU+JQ0KICAjZmlsdGVyKCFpcy5uYShwb2xfaW50KSkgICAlPiUNCiAgc2VsZWN0KGVnb19pZCwgIHN1cnZleV93YXZlLCBsZWVmdGlqZCwgbGVlZnRpamRfY2F0MTMsICBvcGw0LCBnZXNsYWNodCwgZXRuaTMsIGNkbl9zaXplLCBjZG5fc2l6ZV9lZHVjLCBjZG5fc2l6ZV9hZ2UsIGVkdWNfRUksZWR1Y19zaW0sZ2VuZGVyX0VJLCBsZWVmdGlqZF9FSSwgbGVlZnRpamRfc2ltLCBldG5pX0VJICkgLT4gZGF0YWp0DQoNCiNtYWtlIHNpbWlsYXIgZGF0YXNldCBmb3Igbm9uLWtpbi4gZHVzIGdvb2kgYWxsZSBhbHRlcnMgd2VnIG1ldCByZWxfYWx0ZXIgLSAxIDIsMyw0LDUNCiMgcXVpY2tlc3Qgd291bGQgcHJvYmFibHkgYmUgdG8gZ28gZnJvbSB3aWRlIHRvIGxvbmcsIHNlbGVjdCBhbmQgZ28gYmFjayB0byB3aWRlLiBidXQuLi4NCg0KYXR0cmlidXRlcyhsaXNzX3dpZGUkcmVsX2FsdGVyMS4xKQ0KDQpsaXNzX2xvbmcgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyhyZWxfYWx0ZXIxLHJlbF9hbHRlcjIscmVsX2FsdGVyMyxyZWxfYWx0ZXI0LHJlbF9hbHRlcjUpLCB+cmVwbGFjZV9uYSgueCwgLTEpKSwNCiAgICAgICAgICNhbHRlcl9pZF8xID0gaWZlbHNlKHJlbF9hbHRlcjE+MCAmIHJlbF9hbHRlcjE8NiwgTkEsIGFsdGVyX2lkXzEpLCANCiAgICAgICAgICNhbHRlcl9pZF8yID0gaWZlbHNlKHJlbF9hbHRlcjI+MCAmIHJlbF9hbHRlcjI8NiwgTkEsIGFsdGVyX2lkXzIpLCANCiAgICAgICAgICNhbHRlcl9pZF8zID0gaWZlbHNlKHJlbF9hbHRlcjM+MCAmIHJlbF9hbHRlcjM8NiwgTkEsIGFsdGVyX2lkXzMpLCANCiAgICAgICAgICNhbHRlcl9pZF80ID0gaWZlbHNlKHJlbF9hbHRlcjQ+MCAmIHJlbF9hbHRlcjQ8NiwgTkEsIGFsdGVyX2lkXzQpLCANCiAgICAgICAgICNhbHRlcl9pZF81ID0gaWZlbHNlKHJlbF9hbHRlcjU+MCAmIHJlbF9hbHRlcjU8NiwgTkEsIGFsdGVyX2lkXzUpLCANCiAgICAgICAgIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXIxID0gaWZlbHNlKHJlbF9hbHRlcjE+MCAmIHJlbF9hbHRlcjE8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyMSksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXIyID0gaWZlbHNlKHJlbF9hbHRlcjI+MCAmIHJlbF9hbHRlcjI8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyMiksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXIzID0gaWZlbHNlKHJlbF9hbHRlcjM+MCAmIHJlbF9hbHRlcjM8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyMyksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXI0ID0gaWZlbHNlKHJlbF9hbHRlcjQ+MCAmIHJlbF9hbHRlcjQ8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyNCksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXI1ID0gaWZlbHNlKHJlbF9hbHRlcjU+MCAmIHJlbF9hbHRlcjU8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyNSksIA0KICAgICAgICAgDQogICAgICAgICBnZW5kZXJfYWx0ZXIxID0gaWZlbHNlKHJlbF9hbHRlcjE+MCAmIHJlbF9hbHRlcjE8NiwgTkEsIGdlbmRlcl9hbHRlcjEpLCANCiAgICAgICAgIGdlbmRlcl9hbHRlcjIgPSBpZmVsc2UocmVsX2FsdGVyMj4wICYgcmVsX2FsdGVyMjw2LCBOQSwgZ2VuZGVyX2FsdGVyMiksIA0KICAgICAgICAgZ2VuZGVyX2FsdGVyMyA9IGlmZWxzZShyZWxfYWx0ZXIzPjAgJiByZWxfYWx0ZXIzPDYsIE5BLCBnZW5kZXJfYWx0ZXIzKSwgDQogICAgICAgICBnZW5kZXJfYWx0ZXI0ID0gaWZlbHNlKHJlbF9hbHRlcjQ+MCAmIHJlbF9hbHRlcjQ8NiwgTkEsIGdlbmRlcl9hbHRlcjQpLCANCiAgICAgICAgIGdlbmRlcl9hbHRlcjUgPSBpZmVsc2UocmVsX2FsdGVyNT4wICYgcmVsX2FsdGVyNTw2LCBOQSwgZ2VuZGVyX2FsdGVyNSksDQogICAgICAgICANCiAgICAgICAgIG9yaWdpbl9hbHRlcjEgPSBpZmVsc2UocmVsX2FsdGVyMT4wICYgcmVsX2FsdGVyMTw2LCBOQSwgb3JpZ2luX2FsdGVyMSksIA0KICAgICAgICAgb3JpZ2luX2FsdGVyMiA9IGlmZWxzZShyZWxfYWx0ZXIyPjAgJiByZWxfYWx0ZXIyPDYsIE5BLCBvcmlnaW5fYWx0ZXIyKSwgDQogICAgICAgICBvcmlnaW5fYWx0ZXIzID0gaWZlbHNlKHJlbF9hbHRlcjM+MCAmIHJlbF9hbHRlcjM8NiwgTkEsIG9yaWdpbl9hbHRlcjMpLCANCiAgICAgICAgIG9yaWdpbl9hbHRlcjQgPSBpZmVsc2UocmVsX2FsdGVyND4wICYgcmVsX2FsdGVyNDw2LCBOQSwgb3JpZ2luX2FsdGVyNCksIA0KICAgICAgICAgb3JpZ2luX2FsdGVyNSA9IGlmZWxzZShyZWxfYWx0ZXI1PjAgJiByZWxfYWx0ZXI1PDYsIE5BLCBvcmlnaW5fYWx0ZXI1KSwNCiAgICAgICAgIA0KICAgICAgICAgYWdlX2FsdGVyMSA9IGlmZWxzZShyZWxfYWx0ZXIxPjAgJiByZWxfYWx0ZXIxPDYsIE5BLCBhZ2VfYWx0ZXIxKSwgDQogICAgICAgICBhZ2VfYWx0ZXIyID0gaWZlbHNlKHJlbF9hbHRlcjI+MCAmIHJlbF9hbHRlcjI8NiwgTkEsIGFnZV9hbHRlcjIpLCANCiAgICAgICAgIGFnZV9hbHRlcjMgPSBpZmVsc2UocmVsX2FsdGVyMz4wICYgcmVsX2FsdGVyMzw2LCBOQSwgYWdlX2FsdGVyMyksIA0KICAgICAgICAgYWdlX2FsdGVyNCA9IGlmZWxzZShyZWxfYWx0ZXI0PjAgJiByZWxfYWx0ZXI0PDYsIE5BLCBhZ2VfYWx0ZXI0KSwgDQogICAgICAgICBhZ2VfYWx0ZXI1ID0gaWZlbHNlKHJlbF9hbHRlcjU+MCAmIHJlbF9hbHRlcjU8NiwgTkEsIGFnZV9hbHRlcjUpLA0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICAgICkgJT4lDQoNCg0KICBtdXRhdGUoI3NpemUNCiAgICAgICAgI2Nkbl9zaXplID0gNSAtIHJvd1N1bXMoaXMubmEoY2JpbmQoYWx0ZXJfaWRfMSwgYWx0ZXJfaWRfMiwgYWx0ZXJfaWRfMywgYWx0ZXJfaWRfNCwgYWx0ZXJfaWRfNSkpKSwNCiAgICAgICAgY2RuX3NpemUgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChnZW5kZXJfYWx0ZXIxLCBnZW5kZXJfYWx0ZXIyLCBnZW5kZXJfYWx0ZXIzLCBnZW5kZXJfYWx0ZXI0LCBnZW5kZXJfYWx0ZXI1KSkpLA0KICAgICAgICAjZWR1Y2F0aW9uDQogICAgICAgIG9wbF95ID0gcmVjb2RlKGFzLm51bWVyaWMob3BsbWV0KSwgJzEnID0gNiwgJzInPTEwLCAnMyc9IDExLjUsICc0JyA9IDEwLjUsICc1JyA9IDE1LCAnNic9MTYsICc4Jz00LCAuZGVmYXVsdD0tMSApLA0KICAgICAgICBvcGxfeSA9IG5hX2lmKG9wbF95LCAtMSksIA0KICAgICAgICBvcGw0ID0gcmVjb2RlKGFzLm51bWVyaWMob3BsbWV0KSwgJzEnID0gMSwgJzInPTEsICczJz0gMiwgJzQnID0gMiwgJzUnID0gMywgJzYnPTQsIC5kZWZhdWx0PS0xICksDQogICAgICAgIG9wbDQgPSBuYV9pZihvcGw0LCAtMSksIA0KICAgICAgICBvcGw0ID0gc3RydWN0dXJlKG9wbDQsIGxhYmVscz1jKCJsb3ciLCAibWVkaXVtIiwgImhpZ2gxIiwgImhpZ2gyIikpLA0KICAgICAgICAgYWNyb3NzKGMoZWR1Y19yZWNvZGVfYWx0ZXIxLGVkdWNfcmVjb2RlX2FsdGVyMixlZHVjX3JlY29kZV9hbHRlcjMsZWR1Y19yZWNvZGVfYWx0ZXI0LGVkdWNfcmVjb2RlX2FsdGVyNSksIH5hcy5udW1lcmljKC54KSwgLm5hbWVzID0gInsuY29sfV9vcGw0IiksDQogICAgICAgICBhY3Jvc3MoYyhlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCksIH5yZWNvZGUoLngsICc0Jz0xLCAnNic9MSwgJzEwJz0yLCAnMTAuNSc9MiwgJzExLjUnPTIgLCAnMTUnPTMsICcxNicgPSA0LCAuZGVmYXVsdD0tMSkpLA0KICAgICAgICAgYWNyb3NzKGMoZWR1Y19yZWNvZGVfYWx0ZXIxX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIyX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIzX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI0X29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI1X29wbDQpLCB+bmFfaWYoLngsIC0xKSksDQogICAgICAgIGVkdWNfSSA9IHJvd1N1bXMoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIyX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIzX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI0X29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI1X29wbDQpPT1vcGw0LG5hLnJtPVQpLA0KICAgICAgICAgZWR1Y19FID0gcm93U3VtcyhjYmluZChlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCkhPW9wbDQsbmEucm09VCksDQogICAgICAgICBlZHVjX0VJID0gIC0gKChlZHVjX0UgLSBlZHVjX0kpIC8gKGVkdWNfRSArIGVkdWNfSSkpLA0KICAgICAgICAgY2RuX25lZHVjX2ggPSByb3dTdW1zKGNiaW5kKGVkdWNfcmVjb2RlX2FsdGVyMSwgZWR1Y19yZWNvZGVfYWx0ZXIyLCBlZHVjX3JlY29kZV9hbHRlcjMsIGVkdWNfcmVjb2RlX2FsdGVyNCwgZWR1Y19yZWNvZGVfYWx0ZXI1KT09MTYsIG5hLnJtPVQpLA0KICAgICAgICBjZG5fc2l6ZV9lZHVjID0gNSAtIHJvd1N1bXMoaXMubmEoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxLGVkdWNfcmVjb2RlX2FsdGVyMixlZHVjX3JlY29kZV9hbHRlcjMsZWR1Y19yZWNvZGVfYWx0ZXI0LGVkdWNfcmVjb2RlX2FsdGVyNSkpKSwgDQogICAgICAgIGVkdWNfc2ltID0gMiooMS0gcm93U3VtcyhhYnMoKGNiaW5kKGVkdWNfcmVjb2RlX2FsdGVyMSxlZHVjX3JlY29kZV9hbHRlcjIsZWR1Y19yZWNvZGVfYWx0ZXIzLGVkdWNfcmVjb2RlX2FsdGVyNCxlZHVjX3JlY29kZV9hbHRlcjUpIC0gb3BsX3kpLzEyKSwgbmEucm09VCkvY2RuX3NpemVfZWR1YyktMSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICAjZ2VuZGVyICAgDQogICAgICAgICBnZW5kZXJfYWx0ZXIxID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXIxLCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXIyID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXIyLCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXIzID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXIzLCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXI0ID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXI0LCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXI1ID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXI1LCAtMSksDQogICAgICAgICBjZG5fbmdlbmRlcl8yID0gcm93U3VtcyhjYmluZChnZW5kZXJfYWx0ZXIxLCBnZW5kZXJfYWx0ZXIyLCBnZW5kZXJfYWx0ZXIzLCBnZW5kZXJfYWx0ZXI0LCBnZW5kZXJfYWx0ZXI1KT09MiwgbmEucm09VCksDQogICAgICAgICBjZG5fbmdlbmRlcl8xID0gcm93U3VtcyhjYmluZChnZW5kZXJfYWx0ZXIxLCBnZW5kZXJfYWx0ZXIyLCBnZW5kZXJfYWx0ZXIzLCBnZW5kZXJfYWx0ZXI0LCBnZW5kZXJfYWx0ZXI1KT09MSwgbmEucm09VCksDQogICAgICAgICBnZW5kZXJfSSA9IGlmZWxzZShnZXNsYWNodD09MiwgY2RuX25nZW5kZXJfMiwgY2RuX25nZW5kZXJfMSksDQogICAgICAgICBnZW5kZXJfRSA9IGlmZWxzZShnZXNsYWNodD09MSwgY2RuX25nZW5kZXJfMiwgY2RuX25nZW5kZXJfMSksDQogICAgICAgICBnZW5kZXJfRUkgPSAgLSAoKGdlbmRlcl9FIC0gZ2VuZGVyX0kpIC8gKGdlbmRlcl9FICsgZ2VuZGVyX0kpKSwNCiAgICAgICAgDQogICAgICAgICNhZ2UNCiAgICAgICAgYWNyb3NzKGMoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSksIH5uYV9pZigueCwgMTQpKSwNCiAgICAgICAgYWNyb3NzKGMoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSksIH5hcy5pbnRlZ2VyKC54KSksDQogICAgICAgIGxlZWZ0aWpkX2NhdDEzID0gYXMuaW50ZWdlcihjdXQoYXMubnVtZXJpYyhsaXNzX2xvbmckbGVlZnRpamQpLGJyZWFrcyA9IGMoLUluZiwgMTUsIDIwLCAyNSwgMzAsIDM1LCA0MCw0NSw1MCw1NSw2MCw2NSw3MCwgSW5mKSkpLA0KICAgICAgICBsZWVmdGlqZF9JID0gcm93U3VtcyhjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KT09bGVlZnRpamRfY2F0MTMsIG5hLnJtPVQpLA0KICAgICAgICBsZWVmdGlqZF9FID0gcm93U3VtcyhjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSE9bGVlZnRpamRfY2F0MTMsIG5hLnJtPVQpLA0KICAgICAgICBsZWVmdGlqZF9FSSA9ICAtICgobGVlZnRpamRfRSAtIGxlZWZ0aWpkX0kpIC8gKGxlZWZ0aWpkX0UgKyBsZWVmdGlqZF9JKSksDQogICAgICAgIA0KICAgICAgICBjZG5fc2l6ZV9hZ2UgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSkpLCANCiAgICAgICAgYWNyb3NzKGMoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSksIH5yZWNvZGUoLngsICcxJz0xNSwgJzInPTE4LCAnMyc9MjMsICc0Jz0yOCwgJzUnPTMzICwgJzYnPTM4LCAnNycgPSA0MywnOCc9IDQ4LCAnOSc9NTMsICcxMCc9NTgsICcxMSc9NjMsICcxMic9NjgsICcxMyc9NzUsIC5kZWZhdWx0PS0xKSksDQogICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfm5hX2lmKC54LCAtMSkpLA0KICAgICAgICBsZWVmdGlqZF9zaW0gPSAyKiggMSAtIHJvd1N1bXMoYWJzKChjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSAtIGFzLm51bWVyaWMobGlzc19sb25nJGxlZWZ0aWpkKSkvNzUpLCBuYS5ybT1UKS9jZG5fc2l6ZV9hZ2UpLTEsDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgICNldG5pDQogICAgICAgIGV0bmkzID0gcmVjb2RlKGFzLm51bWVyaWMob3JpZ2luKSwgJzAnID0gMSwgJzEwMSc9MiwgJzEwMic9IDMsICcyMDEnID0gMiwgJzIwMicgPSAzLCAnOTk5Jz0tMSwgLmRlZmF1bHQ9LTEgKSwNCiAgICAgICAgZXRuaTMgPSBuYV9pZihldG5pMywgLTEpLCANCiAgICAgICAgZXRuaTMgPSBzdHJ1Y3R1cmUoZXRuaTMsIGxhYmVscz1jKCJEIiwgIlciLCAiTlciKSksDQogICAgICAgICBhY3Jvc3MoYyhvcmlnaW5fYWx0ZXIxLG9yaWdpbl9hbHRlcjIsb3JpZ2luX2FsdGVyMyxvcmlnaW5fYWx0ZXI0LG9yaWdpbl9hbHRlcjUpLCB+YXMubnVtZXJpYygueCksIC5uYW1lcyA9ICJ7LmNvbH1fZXRuaTMiKSwNCiAgICAgICAgIGFjcm9zcyhjKG9yaWdpbl9hbHRlcjFfZXRuaTMsb3JpZ2luX2FsdGVyMl9ldG5pMyxvcmlnaW5fYWx0ZXIzX2V0bmkzLG9yaWdpbl9hbHRlcjRfZXRuaTMsb3JpZ2luX2FsdGVyNV9ldG5pMyksIH5yZWNvZGUoLngsICcxJz0xLCAnMic9MywgJzMnPTMsICc0Jz0zLCAnNSc9MyAsICc2Jz0yLCAnNycgPSAzLCAnOCcgPSAyLCAnOScgPSAtMSwgLmRlZmF1bHQ9LTEpKSwNCiAgICAgICAgIGFjcm9zcyhjKG9yaWdpbl9hbHRlcjFfZXRuaTMsb3JpZ2luX2FsdGVyMl9ldG5pMyxvcmlnaW5fYWx0ZXIzX2V0bmkzLG9yaWdpbl9hbHRlcjRfZXRuaTMsb3JpZ2luX2FsdGVyNV9ldG5pMyksIH5uYV9pZigueCwgLTEpKSwNCiAgICAgICAgIGV0bmlfSSA9IHJvd1N1bXMoY2JpbmQob3JpZ2luX2FsdGVyMV9ldG5pMywgb3JpZ2luX2FsdGVyMl9ldG5pMywgb3JpZ2luX2FsdGVyM19ldG5pMywgb3JpZ2luX2FsdGVyNF9ldG5pMyAsb3JpZ2luX2FsdGVyNV9ldG5pMyk9PWV0bmkzLCBuYS5ybT1UKSwNCiAgICAgICAgIGV0bmlfRSA9IHJvd1N1bXMoY2JpbmQob3JpZ2luX2FsdGVyMV9ldG5pMyxvcmlnaW5fYWx0ZXIyX2V0bmkzLG9yaWdpbl9hbHRlcjNfZXRuaTMsb3JpZ2luX2FsdGVyNF9ldG5pMyxvcmlnaW5fYWx0ZXI1X2V0bmkzKSE9ZXRuaTMsIG5hLnJtPVQpLA0KICAgICAgICAgZXRuaV9FSSA9ICAtICgoZXRuaV9FIC0gZXRuaV9JKSAvIChldG5pX0UgKyBldG5pX0kpKSwNCiAgICAgICAgDQogICAgICAgICAgZWdvX2lkID0gbm9tZW1fZW5jcikgJT4lDQogICNmaWx0ZXIoIWlzLm5hKHBvbF9pbnQpKSAgICU+JQ0KICBzZWxlY3QoZWdvX2lkLCAgc3VydmV5X3dhdmUsIGxlZWZ0aWpkLCBsZWVmdGlqZF9jYXQxMywgIG9wbDQsIGdlc2xhY2h0LCBldG5pMywgY2RuX3NpemUsIGNkbl9zaXplX2VkdWMsIGNkbl9zaXplX2FnZSwgZWR1Y19FSSxlZHVjX3NpbSxnZW5kZXJfRUksIGxlZWZ0aWpkX0VJLCBsZWVmdGlqZF9zaW0sIGV0bmlfRUkgKSAgLT4gZGF0YWp0X25rDQoNCg0KDQoNCnRlc3QgPC0gY3V0KGFzLm51bWVyaWMobGlzc19sb25nJGxlZWZ0aWpkKSxicmVha3MgPSBjKC1JbmYsIDE1LCAyMCwgMjUsIDMwLCAzNSwgNDAsNDUsNTAsNTUsNjAsNjUsNzAsIEluZikpDQojbGV2ZWxzKHRlc3QpDQoNCnNhdmUoZGF0YWp0LCBmaWxlPSIuL2RhdGEvZGF0YWp0LnJkYSIpDQpzYXZlKGRhdGFqdF9uaywgZmlsZT0iLi9kYXRhL2RhdGFqdF9uay5yZGEiKQ0KDQojY29yLnRlc3QoZGF0YWp0JGVkdWNfRUksIGRhdGFqdCRlZHVjX3NpbSkNCiNjb3IudGVzdChkYXRhanQkbGVlZnRpamRfRUksIGRhdGFqdCRsZWVmdGlqZF9zaW0pDQoNCiNoaXN0KGRhdGFqdCRsZWVmdGlqZF9zaW0pDQoNCiNybShsaXN0PWxzKCkpICANCmBgYA0KDQotLS0gDQoNCiMgUmVmZXJlbmNlcw0K


Copyright © 2022 Jochem Tolsma