pacman::p_load(tidyverse,readxl, janitor)
#rm(list=ls())

1 Get files (Pertinencia)

path = "C:/Users/luisf/Dropbox/Puc-Rio/Projeto - Escola da Inteligencia/Projeto Iniciado em 2021/Fase 1 - Construcao de itens/Coeficiente de validade de conteudo/pertinência/"
files  = list.files(path=path,
               pattern = "*.xlsx")


for(file in files) {
  perpos <- which(strsplit(file, "")[[1]]==".")
  assign(
    gsub(" ","",substr(file, 1, perpos-1)), 
    read_xlsx(paste(path,file,sep="")))
}
#temp = list.files(path = "C:/Users/luisf/Dropbox/Puc-Rio/Projeto - Escola da Inteligencia/Projeto Iniciado em 2021/Fase 1 - Construcao de itens/Coeficiente de validade de conteudo/pertinência/",
#               pattern = "*.xlsx", 
#               full.names = T)
#list2env(
#  lapply(setNames(temp, make.names(gsub("*.xlsx$", "", temp))), 
#         read_xlsx), envir = .GlobalEnv)
#https://stackoverflow.com/questions/11433432/how-to-import-multiple-csv-files-at-once

2 Get files (Clareza)

path = "C:/Users/luisf/Dropbox/Puc-Rio/Projeto - Escola da Inteligencia/Projeto Iniciado em 2021/Fase 1 - Construcao de itens/Coeficiente de validade de conteudo/clareza/"
files  = list.files(path=path,
               pattern = "*.xlsx")

for(file in files) {
  perpos <- which(strsplit(file, "")[[1]]==".")
  assign(
    gsub(" ","",substr(file, 1, perpos-1)), 
    read_xlsx(paste(path,file,sep="")))
}

3 Fix environment

for(nm in ls()) {
  .tmp <- get(nm, .GlobalEnv)
  if (is.data.frame(.tmp)) {
    rm(list = nm)
    assign(tolower(paste0("ds_",iconv(nm, to = "ASCII//TRANSLIT"))), .tmp, .GlobalEnv)
  }
  rm(.tmp)
}
rm(nm)

ls()
 [1] "ds_01_clareza-autoconhecimento"                    "ds_01_pertinencia-autoconhecimento"               
 [3] "ds_02_clareza-gpe"                                 "ds_02_pertinencia-gestaopensamentoeemocoes"       
 [5] "ds_03_clareza-tomadadedecisaodoresponsavel"        "ds_03_pertinencia-tomadadedecisaodoresponsavelmod"
 [7] "ds_04_clareza-conscienciasocial"                   "ds_04_pertinencia-conscienciasocial"              
 [9] "ds_05_clareza-relacionamentointerpessoal"          "ds_05_pertinencia-relacionamentointerpessoalmod"  
[11] "ds_06_clareza-pensamentocriativo"                  "ds_06_pertinencia-pensamentocriativo"             
[13] "ds_07_clareza-determinacao"                        "ds_07_pertinencia-determinacao"                   
[15] "ds_08_clareza-lideranca"                           "ds_08_pertinencia-lideranca"                      
[17] "file"                                              "files"                                            
[19] "path"                                              "perpos"                                           

3.1 Functions

3.2 Get base with content

read_excel_allsheets <- function(filename) {
    sheets <- readxl::excel_sheets(filename) 
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    names(x) <- sheets 
    x 
}

excel_list <- read_excel_allsheets("C:/Users/luisf/Dropbox/Puc-Rio/Projeto - Escola da Inteligencia/Projeto Iniciado em 2021/Fase 1 - Construcao de itens/Coeficiente de validade de conteudo/itens_conteúdo_separado.xlsx")

list2env(setNames(excel_list, #list
                  paste0("ds_conteudo_",janitor::make_clean_names(names(excel_list)))),  
         envir=.GlobalEnv) 

3.2.1 Get ds and compute CVC CLAREZA

ajuste_cvc_clareza <- function(ds, custom_name) {

    #clean
  ds <- janitor::clean_names(ds)
  ds <- janitor::remove_empty(ds)
  
  #base criancas
  ds_c <- ds %>% select(ends_with("c"))
  juizes <- nrow(ds)
  
  #cvc criancas
  ds_c <- ds_c %>% 
    mutate(juiz = row_number()) %>% 
    summarise(across(where(is.numeric), ~ mean(.x))) %>% #medias
    t %>% 
    as.data.frame() %>% #turn on ds
    mutate(juizes = juizes) %>%  # how many specialists
    mutate(pei = (1/juizes)^juizes) %>%  #pei (constant)
    mutate(cvc = V1/5 - pei) %>%  #cvc
    rename(media=V1) %>% 
    rownames_to_column("item") %>% 
    mutate(item_number = as.numeric(gsub("\\D", "", item))) %>% 
    mutate(publico = "crianca") %>% 
    select(item, item_number, everything())

  #base pais
  ds_p <- ds %>% select(ends_with("p"))
  juizes <- nrow(ds_p)
  #cvc criancas
  ds_p <- ds_p %>% 
    mutate(juiz = row_number()) %>% 
    summarise(across(where(is.numeric), ~ mean(.x))) %>% #medias
    t %>% 
    as.data.frame() %>% #turn on ds
    mutate(juizes = juizes) %>%  # how many specialists
    mutate(pei = (1/juizes)^juizes) %>%  #pei (constant)
    mutate(cvc = V1/5 - pei) %>%  #cvc
    rename(media=V1) %>% 
    rownames_to_column("item") %>% 
    mutate(item_number = as.numeric(gsub("\\D", "", item))) %>% 
    mutate(publico = "pais") %>%     
    select(item, item_number, everything())
  
  #base professores
  ds_prof <- ds %>% select(ends_with("prof"))
  juizes <- nrow(ds_prof)
  #cvc criancas
  ds_prof <- ds_prof %>% 
    mutate(juiz = row_number()) %>% 
    summarise(across(where(is.numeric), ~ mean(.x))) %>% #medias
    t %>% 
    as.data.frame() %>% #turn on ds
    mutate(juizes = juizes) %>%  # how many specialists
    mutate(pei = (1/juizes)^juizes) %>%  #pei (constant)
    mutate(cvc = V1/5 - pei) %>%  #cvc
    rename(media=V1) %>% 
    rownames_to_column("item") %>% 
    mutate(item_number = as.numeric(gsub("\\D", "", item))) %>% 
    mutate(publico = "professores") %>% 
    select(item, item_number, everything())
  
  #merge all ds
  
  x<-left_join(ds_c, ds_p, by = "item_number")
  x<-left_join(x, ds_prof, by = "item_number")
  x <- x %>% rename(cvc_c=cvc.x, cvc_p=cvc.y, cvc_prof=cvc)
  x <- x %>% select(item, item_number, contains("cvc"))

  #global objects
  j <- assign(paste0("cvc_", custom_name), 
         x, 
         envir = .GlobalEnv)
  
  return(j)
}

3.2.2 Get ds and compute CVC PERTINENCIA

ajuste_cvc_pertinencia <- function(ds, custom_name) {

  #clean
  ds <- janitor::clean_names(ds)
  ds <- janitor::remove_empty(ds)
  
  #base criancas
  ds_c <- ds %>% select(ends_with("c"))
  juizes <- nrow(ds)
  
  #cvc criancas
  ds_c <- ds_c %>% 
    mutate(juiz = row_number()) %>% 
    summarise(across(where(is.numeric), ~ mean(.x))) %>% #medias
    t %>% 
    as.data.frame() %>% #turn on ds
    mutate(juizes = juizes) %>%  # how many specialists
    mutate(pei = (1/juizes)^juizes) %>%  #pei (constant)
    mutate(cvc = V1/5 - pei) %>%  #cvc
    rename(media=V1) %>% 
    rownames_to_column("item") %>% 
    mutate(item_number = as.numeric(gsub("\\D", "", item))) %>% 
    mutate(publico = "crianca") %>% 
    select(item, item_number, everything())
  
    #global objects
  j <- assign(paste0("cvc_", custom_name), 
         ds_c, 
         envir = .GlobalEnv)
  
  return(j) 
}

3.2.3 Def

criterio_crianca <- 0.7
criterio_pais <-  0.7
criterio_prof <-  0.7
criterio_pertinencia <-  0.7

3.3 Get content

#limpeza dos dados
ds_conteudo_autoconhecimento <- clean_names(ds_conteudo_autoconhecimento)
Error in clean_names(ds_conteudo_autoconhecimento) : 
  object 'ds_conteudo_autoconhecimento' not found

4 1 Autoconhecimento

4.1 Merge

5 2 Gestao pensamento

5.1 Merge

6 3 Tomada de decisao responsavel

ajuste_cvc_clareza(ds = `ds_03_clareza-tomadadedecisaodoresponsavel`, "clareza_tdr")
value for "which" not specified, defaulting to c("rows", "cols")
ajuste_cvc_pertinencia(ds = `ds_03_pertinencia-tomadadedecisaodoresponsavelmod`, "pertinencia_tdr")
value for "which" not specified, defaulting to c("rows", "cols")

6.1 Merge

7 4 Consciência social

ajuste_cvc_clareza(ds = `ds_04_clareza-conscienciasocial`, "clareza_consciencia")
value for "which" not specified, defaulting to c("rows", "cols")
ajuste_cvc_pertinencia(ds = `ds_04_pertinencia-conscienciasocial`, "pertinencia_consciencia")
value for "which" not specified, defaulting to c("rows", "cols")

7.1 Merge

8 5 Relacionamento interpessoal

ajuste_cvc_clareza(ds = `ds_05_clareza-relacionamentointerpessoal`, "clareza_relac")
value for "which" not specified, defaulting to c("rows", "cols")
ajuste_cvc_pertinencia(ds = `ds_05_pertinencia-relacionamentointerpessoalmod`, "pertinencia_relac")
value for "which" not specified, defaulting to c("rows", "cols")

8.1 Merge

9 6 Pensamento criativo

ajuste_cvc_clareza(ds = `ds_06_clareza-pensamentocriativo`, "clareza_pensecr")
value for "which" not specified, defaulting to c("rows", "cols")
ajuste_cvc_pertinencia(ds = `ds_06_pertinencia-pensamentocriativo`, "pertinencia_pensecr")
value for "which" not specified, defaulting to c("rows", "cols")

9.1 Merge

10 7 Determinação

ajuste_cvc_clareza(ds = `ds_07_clareza-determinacao`, "clareza_det")
value for "which" not specified, defaulting to c("rows", "cols")
ajuste_cvc_pertinencia(ds = `ds_07_pertinencia-determinacao`, "pertinencia_det")
value for "which" not specified, defaulting to c("rows", "cols")

10.1 Merge

11 8 Liderança

ajuste_cvc_clareza(ds = `ds_08_clareza-lideranca`, "clareza_lid")
value for "which" not specified, defaulting to c("rows", "cols")
ajuste_cvc_pertinencia(ds = `ds_08_pertinencia-lideranca`, "pertinencia_lid")
value for "which" not specified, defaulting to c("rows", "cols")

11.1 Merge

11.2 Função loss

x<-  bind_rows(cvc_autoconhecimento %>% mutate(teste = "autoconhecimento"),
               cvc_gpe %>% mutate(teste = "gpe"),
               cvc_tdr %>% mutate(teste = "tdr"),
               cvc_consciencia %>% mutate(teste = "consciencia"), 
               cvc_relac %>% mutate(teste = "relacionamento"),
               cvc_pensecr %>% mutate(teste = "pensamento criativo"),
               cvc_det %>% mutate(teste = "determinacao"),
               cvc_lid %>% mutate(teste = "lideranca"))

x %>% count(teste)
`ds_02_pertinencia-gestaopensamentoeemocoes` %>% select(ends_with("c")) %>% 
  t
           [,1] [,2] [,3] [,4] [,5] [,6]
emocao_1c     4    4    5    5    4    5
emocao_2c     3    5    5    5    4    5
emocao_3c     4    5    5    5    4    5
emocao_4c     4    5    5    5    5    5
emocao_5c     4    5    3    4    4    5
emocao_6c     3    4    5    4    4    5
emocao_7c     4    5    3    4    5    5
emocao_8c     4    5    5    5    5    5
emocao_9c     4    5    5    5    5    5
emocao_10c    4    5    5    5    4    5
emocao_11c    3    3    3    5    2    5
emocao_12c    4    5    5    4    5    5
emocao_13c    4    4    5    5    5    5
emocao_14c    4    5    5    5    2    5
emocao_15c    3    5    5    5    4    5
emocao_16c    4    5    3    5    4    5
emocao_17c    4    5    3    5    5    5
emocao_18c    4    5    5    4    5    5
emocao_19c    5    5    5    5    5    5
emocao_20c    4    5    5    5    3    5
emocao_21c    4    5    5    5    4    5
emocao_22c    4    5    5    5    5    5
emocao_23c    5    4    5    5    5    5
emocao_24c    5    5    3    5    5    5
emocao_25c    5    4    3    5    5    5
emocao_26c    5    4    5    5    5    5
emocao_27c    5    4    5    5    5    5
emocao_28c    4    3    5    5    3    5
emocao_29c    2    3    1    5    2    5
emocao_30c    4    5    5    5    5    5
emocao_31c    3    4    2    5    4    5
emocao_32c    3    4    5    5    2    5
emocao_33c    4    5    5    5    4    2
emocao_34c    4    5    3    5    5    5
emocao_35c    5    5    5    5    5    5
emocao_36c    5    5    5    5    5    3
emocao_37c    5    4    5    5    5    5
emocao_38c    5    4    5    5    5    5
emocao_39c    4    4    4    4    4    5
emocao_40c    5    5    4    5    5    5
emocao_41c    3    4    5    5    3    5
emocao_42c    5    5    5    5    5    5
emocao_43c    5    4    3    5    5    5
emocao_44c    5    5    5    5    4    5
emocao_45c    5    4    5    5    3    5
emocao_46c    3    3    4    5    2    5
emocao_47c    4    5    5    5    5    5
emocao_48c    5    4    5    5    5    5
emocao_49c    5    5    5    5    5    5
emocao_50c    5    5    5    5    5    5
emocao_51c    5    5    3    5    5    5
emocao_52c    3    5    5    5    3    5
emocao_53c    5    4    3    5    5    5
emocao_54c    5    5    3    5    5    5
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgLSBDVkMgRUkiDQphdXRob3I6ICJMdWlzIEFudW5jaWHDp8OjbyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge3J9DQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UscmVhZHhsLCBqYW5pdG9yKQ0KDQpgYGANCg0KYGBge3J9DQojcm0obGlzdD1scygpKQ0KYGBgDQoNCiMgR2V0IGZpbGVzIChQZXJ0aW5lbmNpYSkNCg0KYGBge3IgZ2V0IGZpbGVzIH0NCnBhdGggPSAiQzovVXNlcnMvbHVpc2YvRHJvcGJveC9QdWMtUmlvL1Byb2pldG8gLSBFc2NvbGEgZGEgSW50ZWxpZ2VuY2lhL1Byb2pldG8gSW5pY2lhZG8gZW0gMjAyMS9GYXNlIDEgLSBDb25zdHJ1Y2FvIGRlIGl0ZW5zL0NvZWZpY2llbnRlIGRlIHZhbGlkYWRlIGRlIGNvbnRldWRvL3BlcnRpbsOqbmNpYS8iDQpmaWxlcyAgPSBsaXN0LmZpbGVzKHBhdGg9cGF0aCwNCiAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4IikNCg0KDQpmb3IoZmlsZSBpbiBmaWxlcykgew0KICBwZXJwb3MgPC0gd2hpY2goc3Ryc3BsaXQoZmlsZSwgIiIpW1sxXV09PSIuIikNCiAgYXNzaWduKA0KICAgIGdzdWIoIiAiLCIiLHN1YnN0cihmaWxlLCAxLCBwZXJwb3MtMSkpLCANCiAgICByZWFkX3hsc3gocGFzdGUocGF0aCxmaWxlLHNlcD0iIikpKQ0KfQ0KI3RlbXAgPSBsaXN0LmZpbGVzKHBhdGggPSAiQzovVXNlcnMvbHVpc2YvRHJvcGJveC9QdWMtUmlvL1Byb2pldG8gLSBFc2NvbGEgZGEgSW50ZWxpZ2VuY2lhL1Byb2pldG8gSW5pY2lhZG8gZW0gMjAyMS9GYXNlIDEgLSBDb25zdHJ1Y2FvIGRlIGl0ZW5zL0NvZWZpY2llbnRlIGRlIHZhbGlkYWRlIGRlIGNvbnRldWRvL3BlcnRpbsOqbmNpYS8iLA0KIyAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4IiwgDQojICAgICAgICAgICAgICAgZnVsbC5uYW1lcyA9IFQpDQojbGlzdDJlbnYoDQojICBsYXBwbHkoc2V0TmFtZXModGVtcCwgbWFrZS5uYW1lcyhnc3ViKCIqLnhsc3gkIiwgIiIsIHRlbXApKSksIA0KIyAgICAgICAgIHJlYWRfeGxzeCksIGVudmlyID0gLkdsb2JhbEVudikNCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTQzMzQzMi9ob3ctdG8taW1wb3J0LW11bHRpcGxlLWNzdi1maWxlcy1hdC1vbmNlDQpgYGANCg0KDQojIEdldCBmaWxlcyAoQ2xhcmV6YSkNCg0KYGBge3J9DQpwYXRoID0gIkM6L1VzZXJzL2x1aXNmL0Ryb3Bib3gvUHVjLVJpby9Qcm9qZXRvIC0gRXNjb2xhIGRhIEludGVsaWdlbmNpYS9Qcm9qZXRvIEluaWNpYWRvIGVtIDIwMjEvRmFzZSAxIC0gQ29uc3RydWNhbyBkZSBpdGVucy9Db2VmaWNpZW50ZSBkZSB2YWxpZGFkZSBkZSBjb250ZXVkby9jbGFyZXphLyINCmZpbGVzICA9IGxpc3QuZmlsZXMocGF0aD1wYXRoLA0KICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLnhsc3giKQ0KDQpmb3IoZmlsZSBpbiBmaWxlcykgew0KICBwZXJwb3MgPC0gd2hpY2goc3Ryc3BsaXQoZmlsZSwgIiIpW1sxXV09PSIuIikNCiAgYXNzaWduKA0KICAgIGdzdWIoIiAiLCIiLHN1YnN0cihmaWxlLCAxLCBwZXJwb3MtMSkpLCANCiAgICByZWFkX3hsc3gocGFzdGUocGF0aCxmaWxlLHNlcD0iIikpKQ0KfQ0KYGBgDQoNCiMgRml4IGVudmlyb25tZW50DQoNCg0KYGBge3J9DQpmb3Iobm0gaW4gbHMoKSkgew0KICAudG1wIDwtIGdldChubSwgLkdsb2JhbEVudikNCiAgaWYgKGlzLmRhdGEuZnJhbWUoLnRtcCkpIHsNCiAgICBybShsaXN0ID0gbm0pDQogICAgYXNzaWduKHRvbG93ZXIocGFzdGUwKCJkc18iLGljb252KG5tLCB0byA9ICJBU0NJSS8vVFJBTlNMSVQiKSkpLCAudG1wLCAuR2xvYmFsRW52KQ0KICB9DQogIHJtKC50bXApDQp9DQpybShubSkNCg0KbHMoKQ0KYGBgDQoNCg0KIyMgRnVuY3Rpb25zDQoNCiMjIEdldCBiYXNlIHdpdGggY29udGVudA0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFIH0NCnJlYWRfZXhjZWxfYWxsc2hlZXRzIDwtIGZ1bmN0aW9uKGZpbGVuYW1lKSB7DQogICAgc2hlZXRzIDwtIHJlYWR4bDo6ZXhjZWxfc2hlZXRzKGZpbGVuYW1lKSANCiAgICB4IDwtIGxhcHBseShzaGVldHMsIGZ1bmN0aW9uKFgpIHJlYWR4bDo6cmVhZF9leGNlbChmaWxlbmFtZSwgc2hlZXQgPSBYKSkNCiAgICBuYW1lcyh4KSA8LSBzaGVldHMgDQogICAgeCANCn0NCg0KZXhjZWxfbGlzdCA8LSByZWFkX2V4Y2VsX2FsbHNoZWV0cygiQzovVXNlcnMvbHVpc2YvRHJvcGJveC9QdWMtUmlvL1Byb2pldG8gLSBFc2NvbGEgZGEgSW50ZWxpZ2VuY2lhL1Byb2pldG8gSW5pY2lhZG8gZW0gMjAyMS9GYXNlIDEgLSBDb25zdHJ1Y2FvIGRlIGl0ZW5zL0NvZWZpY2llbnRlIGRlIHZhbGlkYWRlIGRlIGNvbnRldWRvL2l0ZW5zX2NvbnRlw7pkb19zZXBhcmFkby54bHN4IikNCg0KbGlzdDJlbnYoc2V0TmFtZXMoZXhjZWxfbGlzdCwgI2xpc3QNCiAgICAgICAgICAgICAgICAgIHBhc3RlMCgiZHNfY29udGV1ZG9fIixqYW5pdG9yOjptYWtlX2NsZWFuX25hbWVzKG5hbWVzKGV4Y2VsX2xpc3QpKSkpLCAgDQogICAgICAgICBlbnZpcj0uR2xvYmFsRW52KSANCg0KYGBgDQoNCiMjIyBHZXQgZHMgYW5kIGNvbXB1dGUgQ1ZDIENMQVJFWkENCg0KYGBge3J9DQphanVzdGVfY3ZjX2NsYXJlemEgPC0gZnVuY3Rpb24oZHMsIGN1c3RvbV9uYW1lKSB7DQoNCiAgICAjY2xlYW4NCiAgZHMgPC0gamFuaXRvcjo6Y2xlYW5fbmFtZXMoZHMpDQogIGRzIDwtIGphbml0b3I6OnJlbW92ZV9lbXB0eShkcykNCiAgDQogICNiYXNlIGNyaWFuY2FzDQogIGRzX2MgPC0gZHMgJT4lIHNlbGVjdChlbmRzX3dpdGgoImMiKSkNCiAganVpemVzIDwtIG5yb3coZHMpDQogIA0KICAjY3ZjIGNyaWFuY2FzDQogIGRzX2MgPC0gZHNfYyAlPiUgDQogICAgbXV0YXRlKGp1aXogPSByb3dfbnVtYmVyKCkpICU+JSANCiAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IG1lYW4oLngpKSkgJT4lICNtZWRpYXMNCiAgICB0ICU+JSANCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lICN0dXJuIG9uIGRzDQogICAgbXV0YXRlKGp1aXplcyA9IGp1aXplcykgJT4lICAjIGhvdyBtYW55IHNwZWNpYWxpc3RzDQogICAgbXV0YXRlKHBlaSA9ICgxL2p1aXplcyleanVpemVzKSAlPiUgICNwZWkgKGNvbnN0YW50KQ0KICAgIG11dGF0ZShjdmMgPSBWMS81IC0gcGVpKSAlPiUgICNjdmMNCiAgICByZW5hbWUobWVkaWE9VjEpICU+JSANCiAgICByb3duYW1lc190b19jb2x1bW4oIml0ZW0iKSAlPiUgDQogICAgbXV0YXRlKGl0ZW1fbnVtYmVyID0gYXMubnVtZXJpYyhnc3ViKCJcXEQiLCAiIiwgaXRlbSkpKSAlPiUgDQogICAgbXV0YXRlKHB1YmxpY28gPSAiY3JpYW5jYSIpICU+JSANCiAgICBzZWxlY3QoaXRlbSwgaXRlbV9udW1iZXIsIGV2ZXJ5dGhpbmcoKSkNCg0KICAjYmFzZSBwYWlzDQogIGRzX3AgPC0gZHMgJT4lIHNlbGVjdChlbmRzX3dpdGgoInAiKSkNCiAganVpemVzIDwtIG5yb3coZHNfcCkNCiAgI2N2YyBjcmlhbmNhcw0KICBkc19wIDwtIGRzX3AgJT4lIA0KICAgIG11dGF0ZShqdWl6ID0gcm93X251bWJlcigpKSAlPiUgDQogICAgc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBtZWFuKC54KSkpICU+JSAjbWVkaWFzDQogICAgdCAlPiUgDQogICAgYXMuZGF0YS5mcmFtZSgpICU+JSAjdHVybiBvbiBkcw0KICAgIG11dGF0ZShqdWl6ZXMgPSBqdWl6ZXMpICU+JSAgIyBob3cgbWFueSBzcGVjaWFsaXN0cw0KICAgIG11dGF0ZShwZWkgPSAoMS9qdWl6ZXMpXmp1aXplcykgJT4lICAjcGVpIChjb25zdGFudCkNCiAgICBtdXRhdGUoY3ZjID0gVjEvNSAtIHBlaSkgJT4lICAjY3ZjDQogICAgcmVuYW1lKG1lZGlhPVYxKSAlPiUgDQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVtIikgJT4lIA0KICAgIG11dGF0ZShpdGVtX251bWJlciA9IGFzLm51bWVyaWMoZ3N1YigiXFxEIiwgIiIsIGl0ZW0pKSkgJT4lIA0KICAgIG11dGF0ZShwdWJsaWNvID0gInBhaXMiKSAlPiUgICAgIA0KICAgIHNlbGVjdChpdGVtLCBpdGVtX251bWJlciwgZXZlcnl0aGluZygpKQ0KICANCiAgI2Jhc2UgcHJvZmVzc29yZXMNCiAgZHNfcHJvZiA8LSBkcyAlPiUgc2VsZWN0KGVuZHNfd2l0aCgicHJvZiIpKQ0KICBqdWl6ZXMgPC0gbnJvdyhkc19wcm9mKQ0KICAjY3ZjIGNyaWFuY2FzDQogIGRzX3Byb2YgPC0gZHNfcHJvZiAlPiUgDQogICAgbXV0YXRlKGp1aXogPSByb3dfbnVtYmVyKCkpICU+JSANCiAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IG1lYW4oLngpKSkgJT4lICNtZWRpYXMNCiAgICB0ICU+JSANCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lICN0dXJuIG9uIGRzDQogICAgbXV0YXRlKGp1aXplcyA9IGp1aXplcykgJT4lICAjIGhvdyBtYW55IHNwZWNpYWxpc3RzDQogICAgbXV0YXRlKHBlaSA9ICgxL2p1aXplcyleanVpemVzKSAlPiUgICNwZWkgKGNvbnN0YW50KQ0KICAgIG11dGF0ZShjdmMgPSBWMS81IC0gcGVpKSAlPiUgICNjdmMNCiAgICByZW5hbWUobWVkaWE9VjEpICU+JSANCiAgICByb3duYW1lc190b19jb2x1bW4oIml0ZW0iKSAlPiUgDQogICAgbXV0YXRlKGl0ZW1fbnVtYmVyID0gYXMubnVtZXJpYyhnc3ViKCJcXEQiLCAiIiwgaXRlbSkpKSAlPiUgDQogICAgbXV0YXRlKHB1YmxpY28gPSAicHJvZmVzc29yZXMiKSAlPiUgDQogICAgc2VsZWN0KGl0ZW0sIGl0ZW1fbnVtYmVyLCBldmVyeXRoaW5nKCkpDQogIA0KICAjbWVyZ2UgYWxsIGRzDQogIA0KICB4PC1sZWZ0X2pvaW4oZHNfYywgZHNfcCwgYnkgPSAiaXRlbV9udW1iZXIiKQ0KICB4PC1sZWZ0X2pvaW4oeCwgZHNfcHJvZiwgYnkgPSAiaXRlbV9udW1iZXIiKQ0KICB4IDwtIHggJT4lIHJlbmFtZShjdmNfYz1jdmMueCwgY3ZjX3A9Y3ZjLnksIGN2Y19wcm9mPWN2YykNCiAgeCA8LSB4ICU+JSBzZWxlY3QoaXRlbSwgaXRlbV9udW1iZXIsIGNvbnRhaW5zKCJjdmMiKSkNCg0KICAjZ2xvYmFsIG9iamVjdHMNCiAgaiA8LSBhc3NpZ24ocGFzdGUwKCJjdmNfIiwgY3VzdG9tX25hbWUpLCANCiAgICAgICAgIHgsIA0KICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQ0KICANCiAgcmV0dXJuKGopDQp9DQpgYGANCg0KIyMjIEdldCBkcyBhbmQgY29tcHV0ZSBDVkMgUEVSVElORU5DSUENCg0KYGBge3J9DQphanVzdGVfY3ZjX3BlcnRpbmVuY2lhIDwtIGZ1bmN0aW9uKGRzLCBjdXN0b21fbmFtZSkgew0KDQogICNjbGVhbg0KICBkcyA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkcykNCiAgZHMgPC0gamFuaXRvcjo6cmVtb3ZlX2VtcHR5KGRzKQ0KICANCiAgI2Jhc2UgY3JpYW5jYXMNCiAgZHNfYyA8LSBkcyAlPiUgc2VsZWN0KGVuZHNfd2l0aCgiYyIpKQ0KICBqdWl6ZXMgPC0gbnJvdyhkcykNCiAgDQogICNjdmMgY3JpYW5jYXMNCiAgZHNfYyA8LSBkc19jICU+JSANCiAgICBtdXRhdGUoanVpeiA9IHJvd19udW1iZXIoKSkgJT4lIA0KICAgIHN1bW1hcmlzZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gbWVhbigueCkpKSAlPiUgI21lZGlhcw0KICAgIHQgJT4lIA0KICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgI3R1cm4gb24gZHMNCiAgICBtdXRhdGUoanVpemVzID0ganVpemVzKSAlPiUgICMgaG93IG1hbnkgc3BlY2lhbGlzdHMNCiAgICBtdXRhdGUocGVpID0gKDEvanVpemVzKV5qdWl6ZXMpICU+JSAgI3BlaSAoY29uc3RhbnQpDQogICAgbXV0YXRlKGN2YyA9IFYxLzUgLSBwZWkpICU+JSAgI2N2Yw0KICAgIHJlbmFtZShtZWRpYT1WMSkgJT4lIA0KICAgIHJvd25hbWVzX3RvX2NvbHVtbigiaXRlbSIpICU+JSANCiAgICBtdXRhdGUoaXRlbV9udW1iZXIgPSBhcy5udW1lcmljKGdzdWIoIlxcRCIsICIiLCBpdGVtKSkpICU+JSANCiAgICBtdXRhdGUocHVibGljbyA9ICJjcmlhbmNhIikgJT4lIA0KICAgIHNlbGVjdChpdGVtLCBpdGVtX251bWJlciwgZXZlcnl0aGluZygpKQ0KICANCiAgICAjZ2xvYmFsIG9iamVjdHMNCiAgaiA8LSBhc3NpZ24ocGFzdGUwKCJjdmNfIiwgY3VzdG9tX25hbWUpLCANCiAgICAgICAgIGRzX2MsIA0KICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQ0KICANCiAgcmV0dXJuKGopIA0KfQ0KYGBgDQoNCg0KIyMjIERlZg0KDQpgYGB7cn0NCmNyaXRlcmlvX2NyaWFuY2EgPC0gMC43DQpjcml0ZXJpb19wYWlzIDwtICAwLjcNCmNyaXRlcmlvX3Byb2YgPC0gIDAuNw0KY3JpdGVyaW9fcGVydGluZW5jaWEgPC0gIDAuNw0KYGBgDQoNCiMjIEdldCBjb250ZW50DQoNCmBgYHtyIH0NCiNsaW1wZXphIGRvcyBkYWRvcw0KZHNfY29udGV1ZG9fYXV0b2NvbmhlY2ltZW50byA8LSBjbGVhbl9uYW1lcyhkc19jb250ZXVkb19hdXRvY29uaGVjaW1lbnRvKQ0KZHNfY29udGV1ZG9fY29uc2NpZW5jaWFfc29jaWFsIDwtIGNsZWFuX25hbWVzKGRzX2NvbnRldWRvX2NvbnNjaWVuY2lhX3NvY2lhbCkNCmRzX2NvbnRldWRvX2RldGVybWluYWNhbyA8LSBjbGVhbl9uYW1lcyhkc19jb250ZXVkb19kZXRlcm1pbmFjYW8pDQpkc19jb250ZXVkb19nZXN0YW9fcGVuc2FtZW50b19lX2Vtb2NvZXMgPC0gY2xlYW5fbmFtZXMoZHNfY29udGV1ZG9fZ2VzdGFvX3BlbnNhbWVudG9fZV9lbW9jb2VzKQ0KZHNfY29udGV1ZG9fbGlkZXJhbmNhIDwtIGNsZWFuX25hbWVzKGRzX2NvbnRldWRvX2xpZGVyYW5jYSkNCmRzX2NvbnRldWRvX3BlbnNhbWVudG9fY3JpYXRpdm8gPC0gY2xlYW5fbmFtZXMoZHNfY29udGV1ZG9fcGVuc2FtZW50b19jcmlhdGl2bykNCmRzX2NvbnRldWRvX3JlbGFjaW9uYW1lbnRvX2ludGVycGVzc29hbCA8LSBjbGVhbl9uYW1lcyhkc19jb250ZXVkb19yZWxhY2lvbmFtZW50b19pbnRlcnBlc3NvYWwpDQpkc19jb250ZXVkb190b21hZGFfZGVfZGVjaXNhb19yZXNwb25zYXZlbCA8LSBjbGVhbl9uYW1lcyhkc19jb250ZXVkb190b21hZGFfZGVfZGVjaXNhb19yZXNwb25zYXZlbCkNCmBgYA0KDQojIDEgQXV0b2NvbmhlY2ltZW50byANCg0KYGBge3J9DQphanVzdGVfY3ZjX2NsYXJlemEoZHMgPSBgZHNfMDFfY2xhcmV6YS1hdXRvY29uaGVjaW1lbnRvYCwgImNsYXJlemFfYXV0byIpDQphanVzdGVfY3ZjX3BlcnRpbmVuY2lhKGRzID0gYGRzXzAxX3BlcnRpbmVuY2lhLWF1dG9jb25oZWNpbWVudG9gLCAicGVydGluZW5jaWFfYXV0byIpDQpgYGANCg0KIyMgTWVyZ2UgDQoNCmBgYHtyfQ0KaWYoZXhpc3RzKCJjdmNfYXV0b2NvbmhlY2ltZW50byIpKSBybShjdmNfYXV0b2NvbmhlY2ltZW50bykNCihjdmNfYXV0b2NvbmhlY2ltZW50byA8LSBsZWZ0X2pvaW4oY3ZjX2NsYXJlemFfYXV0bywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZjX3BlcnRpbmVuY2lhX2F1dG8sIGJ5ID0gIml0ZW1fbnVtYmVyIikgJT4lIA0KICAgIHNlbGVjdChjb250YWlucygiaXRlbSIpLCBjb250YWlucygiY3ZjIikpICU+JSANCiAgICByZW5hbWUoY3ZjX3BlcnRpbmVuY2lhID0gY3ZjKSAlPiUgDQogICAgc2VsZWN0KC1lbmRzX3dpdGgoIi55IikpICU+JSANCiAgICBpbm5lcl9qb2luKC4sIGRzX2NvbnRldWRvX2F1dG9jb25oZWNpbWVudG8sIGJ5ID0gIml0ZW1fbnVtYmVyIikgJT4lIA0KICAgIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCJjdmMiKSksIH5yb3VuZCguLDIpKSAlPiUgI3JvdW5kDQogICAgbXV0YXRlKGluY2x1aWRvID0gaWZfZWxzZShjdmNfYyA+IGNyaXRlcmlvX2NyaWFuY2EgJiBjdmNfcCA+IGNyaXRlcmlvX3BhaXMgJiBjdmNfcHJvZiA+IGNyaXRlcmlvX3Byb2YgJiBjdmNfcGVydGluZW5jaWEgPiBjcml0ZXJpb19wZXJ0aW5lbmNpYSwxLDApKSAlPiUgI2luY2x1aXI/DQogICAgc2VsZWN0KGl0ZW1fbnVtYmVyLCBjcmlhbmNhcyxwYWlzLCBwcm9mLCBjdmNfYywgY3ZjX3AsIGN2Y19wcm9mLCBjdmNfcGVydGluZW5jaWEsIGNvbXBldGVuY2lhLCBpbmNsdWlkbykgJT4lICAjb3JnYW5pemFyDQogICAgYXJyYW5nZShkZXNjKGluY2x1aWRvKSwgZGVzYyhjdmNfYyksIGRlc2MoY3ZjX3ApLCBkZXNjKGN2Y19wcm9mKSkgJT4lIA0KICAgIERUOjpkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QoDQogICAgICBwYWdlTGVuZ3RoID0gMTAwDQogICAgKSkpDQpgYGANCg0KDQojIDIgR2VzdGFvIHBlbnNhbWVudG8gDQoNCmBgYHtyfQ0KYWp1c3RlX2N2Y19jbGFyZXphKGRzID0gYGRzXzAyX2NsYXJlemEtZ3BlYCwgImNsYXJlemFfZ3BlIikNCmFqdXN0ZV9jdmNfcGVydGluZW5jaWEoZHMgPSBgZHNfMDJfcGVydGluZW5jaWEtZ2VzdGFvcGVuc2FtZW50b2VlbW9jb2VzYCwgInBlcnRpbmVuY2lhX2dwZSIpDQpgYGANCg0KIyMgTWVyZ2UgDQoNCmBgYHtyfQ0KaWYoZXhpc3RzKCJjdmNfZ3BlIikpICBybShjdmNfZ3BlKQ0KKGN2Y19ncGUgPC0gbGVmdF9qb2luKGN2Y19jbGFyZXphX2dwZSwNCiAgICAgICAgICAgICAgICAgICAgICBjdmNfcGVydGluZW5jaWFfZ3BlLCBieSA9ICJpdGVtX251bWJlciIpICU+JSANCiAgICBzZWxlY3QoY29udGFpbnMoIml0ZW0iKSwgY29udGFpbnMoImN2YyIpKSAlPiUgDQogICAgcmVuYW1lKGN2Y19wZXJ0aW5lbmNpYSA9IGN2YykgJT4lIA0KICAgIHNlbGVjdCgtZW5kc193aXRoKCIueSIpKSAlPiUgDQogICAgaW5uZXJfam9pbiguLCBkc19jb250ZXVkb19nZXN0YW9fcGVuc2FtZW50b19lX2Vtb2NvZXMsIGJ5ID0gIml0ZW1fbnVtYmVyIikgJT4lIA0KICAgIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCJjdmMiKSksIH5yb3VuZCguLDIpKSAlPiUgI3JvdW5kDQogICAgbXV0YXRlKGluY2x1aWRvID0gaWZfZWxzZShjdmNfYyA+IGNyaXRlcmlvX2NyaWFuY2EgJiBjdmNfcCA+IGNyaXRlcmlvX3BhaXMgJiBjdmNfcHJvZiA+IGNyaXRlcmlvX3Byb2YgJiBjdmNfcGVydGluZW5jaWEgPiBjcml0ZXJpb19wZXJ0aW5lbmNpYSwxLDApKSAlPiUgI2luY2x1aXI/DQogICAgc2VsZWN0KGl0ZW1fbnVtYmVyLCBjcmlhbmNhcyxwYWlzLCBwcm9mLCBjdmNfYywgY3ZjX3AsIGN2Y19wcm9mLCBjdmNfcGVydGluZW5jaWEsIGNvbXBldGVuY2lhLCBpbmNsdWlkbykgJT4lICAjb3JnYW5pemFyDQogICAgYXJyYW5nZShkZXNjKGluY2x1aWRvKSwgZGVzYyhjdmNfYyksIGRlc2MoY3ZjX3ApLCBkZXNjKGN2Y19wcm9mKSkgJT4lIA0KICAgIERUOjpkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QoDQogICAgICBwYWdlTGVuZ3RoID0gMTAwDQogICAgKSkpDQpgYGANCg0KDQoNCiMgMyBUb21hZGEgZGUgZGVjaXNhbyByZXNwb25zYXZlbCANCg0KYGBge3J9DQphanVzdGVfY3ZjX2NsYXJlemEoZHMgPSBgZHNfMDNfY2xhcmV6YS10b21hZGFkZWRlY2lzYW9kb3Jlc3BvbnNhdmVsYCwgImNsYXJlemFfdGRyIikNCmFqdXN0ZV9jdmNfcGVydGluZW5jaWEoZHMgPSBgZHNfMDNfcGVydGluZW5jaWEtdG9tYWRhZGVkZWNpc2FvZG9yZXNwb25zYXZlbG1vZGAsICJwZXJ0aW5lbmNpYV90ZHIiKQ0KYGBgDQoNCiMjIE1lcmdlIA0KDQpgYGB7cn0NCmlmKGV4aXN0cygiY3ZjX3RkciIpKSAgcm0oY3ZjX3RkcikNCihjdmNfdGRyIDwtIGxlZnRfam9pbihjdmNfY2xhcmV6YV90ZHIsDQogICAgICAgICAgICAgICAgICAgICAgY3ZjX3BlcnRpbmVuY2lhX3RkciwgYnkgPSAiaXRlbV9udW1iZXIiKSAlPiUgDQogICAgc2VsZWN0KGNvbnRhaW5zKCJpdGVtIiksIGNvbnRhaW5zKCJjdmMiKSkgJT4lIA0KICAgIHJlbmFtZShjdmNfcGVydGluZW5jaWEgPSBjdmMpICU+JSANCiAgICBzZWxlY3QoLWVuZHNfd2l0aCgiLnkiKSkgJT4lIA0KICAgIGlubmVyX2pvaW4oLiwgZHNfY29udGV1ZG9fdG9tYWRhX2RlX2RlY2lzYW9fcmVzcG9uc2F2ZWwsIGJ5ID0gIml0ZW1fbnVtYmVyIikgJT4lIA0KICAgIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCJjdmMiKSksIH5yb3VuZCguLDIpKSAlPiUgI3JvdW5kDQogICAgbXV0YXRlKGluY2x1aWRvID0gaWZfZWxzZShjdmNfYyA+IGNyaXRlcmlvX2NyaWFuY2EgJiBjdmNfcCA+IGNyaXRlcmlvX3BhaXMgJiBjdmNfcHJvZiA+IGNyaXRlcmlvX3Byb2YgJiBjdmNfcGVydGluZW5jaWEgPiBjcml0ZXJpb19wZXJ0aW5lbmNpYSwxLDApKSAlPiUgI2luY2x1aXI/DQogICAgc2VsZWN0KGl0ZW1fbnVtYmVyLCBjcmlhbmNhcyxwYWlzLCBwcm9mLCBjdmNfYywgY3ZjX3AsIGN2Y19wcm9mLCBjdmNfcGVydGluZW5jaWEsIGNvbXBldGVuY2lhLCBpbmNsdWlkbykgJT4lICAjb3JnYW5pemFyDQogICAgYXJyYW5nZShkZXNjKGluY2x1aWRvKSwgZGVzYyhjdmNfYyksIGRlc2MoY3ZjX3ApLCBkZXNjKGN2Y19wcm9mKSkgJT4lIA0KICAgIERUOjpkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QoDQogICAgICBwYWdlTGVuZ3RoID0gMTAwDQogICAgKSkpDQpgYGANCg0KDQojIDQgQ29uc2Npw6puY2lhIHNvY2lhbA0KDQpgYGB7cn0NCmFqdXN0ZV9jdmNfY2xhcmV6YShkcyA9IGBkc18wNF9jbGFyZXphLWNvbnNjaWVuY2lhc29jaWFsYCwgImNsYXJlemFfY29uc2NpZW5jaWEiKQ0KYWp1c3RlX2N2Y19wZXJ0aW5lbmNpYShkcyA9IGBkc18wNF9wZXJ0aW5lbmNpYS1jb25zY2llbmNpYXNvY2lhbGAsICJwZXJ0aW5lbmNpYV9jb25zY2llbmNpYSIpDQpgYGANCg0KIyMgTWVyZ2UgDQoNCmBgYHtyfQ0KaWYoZXhpc3RzKCJjdmNfY29uc2NpZW5jaWEiKSkgIHJtKGN2Y190ZHIpDQooY3ZjX2NvbnNjaWVuY2lhIDwtIGxlZnRfam9pbihjdmNfY2xhcmV6YV9jb25zY2llbmNpYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Y19wZXJ0aW5lbmNpYV9jb25zY2llbmNpYSwgYnkgPSAiaXRlbV9udW1iZXIiKSAlPiUgDQogICAgc2VsZWN0KGNvbnRhaW5zKCJpdGVtIiksIGNvbnRhaW5zKCJjdmMiKSkgJT4lIA0KICAgIHJlbmFtZShjdmNfcGVydGluZW5jaWEgPSBjdmMpICU+JSANCiAgICBzZWxlY3QoLWVuZHNfd2l0aCgiLnkiKSkgJT4lIA0KICAgIGlubmVyX2pvaW4oLiwgZHNfY29udGV1ZG9fY29uc2NpZW5jaWFfc29jaWFsLCBieSA9ICJpdGVtX251bWJlciIpICU+JSANCiAgICBtdXRhdGVfYXQodmFycyhjb250YWlucygiY3ZjIikpLCB+cm91bmQoLiwyKSkgJT4lICNyb3VuZA0KICAgIG11dGF0ZShpbmNsdWlkbyA9IGlmX2Vsc2UoY3ZjX2MgPiBjcml0ZXJpb19jcmlhbmNhICYgY3ZjX3AgPiBjcml0ZXJpb19wYWlzICYgY3ZjX3Byb2YgPiBjcml0ZXJpb19wcm9mICYgY3ZjX3BlcnRpbmVuY2lhID4gY3JpdGVyaW9fcGVydGluZW5jaWEsMSwwKSkgJT4lICNpbmNsdWlyPw0KICAgIHNlbGVjdChpdGVtX251bWJlciwgY3JpYW5jYXMscGFpcywgcHJvZiwgY3ZjX2MsIGN2Y19wLCBjdmNfcHJvZiwgY3ZjX3BlcnRpbmVuY2lhLCBjb21wZXRlbmNpYSwgaW5jbHVpZG8pICU+JSAgI29yZ2FuaXphcg0KICAgIGFycmFuZ2UoZGVzYyhpbmNsdWlkbyksIGRlc2MoY3ZjX2MpLCBkZXNjKGN2Y19wKSwgZGVzYyhjdmNfcHJvZikpICU+JSANCiAgICBEVDo6ZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KA0KICAgICAgcGFnZUxlbmd0aCA9IDEwMA0KICAgICkpKQ0KYGBgDQoNCiMgNSBSZWxhY2lvbmFtZW50byBpbnRlcnBlc3NvYWwNCg0KYGBge3J9DQphanVzdGVfY3ZjX2NsYXJlemEoZHMgPSBgZHNfMDVfY2xhcmV6YS1yZWxhY2lvbmFtZW50b2ludGVycGVzc29hbGAsICJjbGFyZXphX3JlbGFjIikNCmFqdXN0ZV9jdmNfcGVydGluZW5jaWEoZHMgPSBgZHNfMDVfcGVydGluZW5jaWEtcmVsYWNpb25hbWVudG9pbnRlcnBlc3NvYWxtb2RgLCAicGVydGluZW5jaWFfcmVsYWMiKQ0KYGBgDQoNCiMjIE1lcmdlIA0KDQpgYGB7cn0NCmlmKGV4aXN0cygiY3ZjX3JlbGFjIikpICBybShjdmNfcmVsYWMpDQooY3ZjX3JlbGFjIDwtIGxlZnRfam9pbihjdmNfY2xhcmV6YV9yZWxhYywNCiAgICAgICAgICAgICAgICAgICAgICAgIGN2Y19wZXJ0aW5lbmNpYV9yZWxhYywgYnkgPSAiaXRlbV9udW1iZXIiKSAlPiUgDQogICAgc2VsZWN0KGNvbnRhaW5zKCJpdGVtIiksIGNvbnRhaW5zKCJjdmMiKSkgJT4lIA0KICAgIHJlbmFtZShjdmNfcGVydGluZW5jaWEgPSBjdmMpICU+JSANCiAgICBzZWxlY3QoLWVuZHNfd2l0aCgiLnkiKSkgJT4lIA0KICAgIGlubmVyX2pvaW4oLiwgZHNfY29udGV1ZG9fcmVsYWNpb25hbWVudG9faW50ZXJwZXNzb2FsLCBieSA9ICJpdGVtX251bWJlciIpICU+JSANCiAgICBtdXRhdGVfYXQodmFycyhjb250YWlucygiY3ZjIikpLCB+cm91bmQoLiwyKSkgJT4lICNyb3VuZA0KICAgIG11dGF0ZShpbmNsdWlkbyA9IGlmX2Vsc2UoY3ZjX2MgPiBjcml0ZXJpb19jcmlhbmNhICYgY3ZjX3AgPiBjcml0ZXJpb19wYWlzICYgY3ZjX3Byb2YgPiBjcml0ZXJpb19wcm9mICYgY3ZjX3BlcnRpbmVuY2lhID4gY3JpdGVyaW9fcGVydGluZW5jaWEsMSwwKSkgJT4lICNpbmNsdWlyPw0KICAgIHNlbGVjdChpdGVtX251bWJlciwgY3JpYW5jYXMscGFpcywgcHJvZiwgY3ZjX2MsIGN2Y19wLCBjdmNfcHJvZiwgY3ZjX3BlcnRpbmVuY2lhLCBjb21wZXRlbmNpYSwgaW5jbHVpZG8pICU+JSAgI29yZ2FuaXphcg0KICAgIGFycmFuZ2UoZGVzYyhpbmNsdWlkbyksIGRlc2MoY3ZjX2MpLCBkZXNjKGN2Y19wKSwgZGVzYyhjdmNfcHJvZikpICU+JSANCiAgICBEVDo6ZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KA0KICAgICAgcGFnZUxlbmd0aCA9IDEwMA0KICAgICkpKQ0KYGBgDQojIDYgUGVuc2FtZW50byBjcmlhdGl2bw0KDQpgYGB7cn0NCmFqdXN0ZV9jdmNfY2xhcmV6YShkcyA9IGBkc18wNl9jbGFyZXphLXBlbnNhbWVudG9jcmlhdGl2b2AsICJjbGFyZXphX3BlbnNlY3IiKQ0KYWp1c3RlX2N2Y19wZXJ0aW5lbmNpYShkcyA9IGBkc18wNl9wZXJ0aW5lbmNpYS1wZW5zYW1lbnRvY3JpYXRpdm9gLCAicGVydGluZW5jaWFfcGVuc2VjciIpDQpgYGANCg0KIyMgTWVyZ2UgDQoNCmBgYHtyfQ0KaWYoZXhpc3RzKCJwZW5zZWNyIikpICBybShjdmNfcGVuc2VjcikNCihjdmNfcGVuc2VjciA8LSBsZWZ0X2pvaW4oY3ZjX2NsYXJlemFfcGVuc2VjciwNCiAgICAgICAgICBjdmNfcGVydGluZW5jaWFfcGVuc2VjciwgYnkgPSAiaXRlbV9udW1iZXIiKSAlPiUgDQogICAgc2VsZWN0KGNvbnRhaW5zKCJpdGVtIiksIGNvbnRhaW5zKCJjdmMiKSkgJT4lIA0KICAgIHJlbmFtZShjdmNfcGVydGluZW5jaWEgPSBjdmMpICU+JSANCiAgICBzZWxlY3QoLWVuZHNfd2l0aCgiLnkiKSkgJT4lIA0KICAgIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCJjdmMiKSksIH5yb3VuZCguLDIpKSAlPiUgDQogICAgaW5uZXJfam9pbiguLCBkc19jb250ZXVkb19wZW5zYW1lbnRvX2NyaWF0aXZvLCBieSA9ICJpdGVtX251bWJlciIpICU+JSANCiAgICBtdXRhdGVfYXQodmFycyhjb250YWlucygiY3ZjIikpLCB+cm91bmQoLiwyKSkgJT4lICNyb3VuZA0KICAgIG11dGF0ZShpbmNsdWlkbyA9IGlmX2Vsc2UoY3ZjX2MgPiBjcml0ZXJpb19jcmlhbmNhICYgY3ZjX3AgPiBjcml0ZXJpb19wYWlzICYgY3ZjX3Byb2YgPiBjcml0ZXJpb19wcm9mICYgY3ZjX3BlcnRpbmVuY2lhID4gY3JpdGVyaW9fcGVydGluZW5jaWEsMSwwKSkgJT4lICNpbmNsdWlyPw0KICAgIHNlbGVjdChpdGVtX251bWJlciwgY3JpYW5jYXMscGFpcywgcHJvZiwgY3ZjX2MsIGN2Y19wLCBjdmNfcHJvZiwgY3ZjX3BlcnRpbmVuY2lhLCBjb21wZXRlbmNpYSwgaW5jbHVpZG8pICU+JSAgI29yZ2FuaXphcg0KICAgIGFycmFuZ2UoZGVzYyhpbmNsdWlkbyksIGRlc2MoY3ZjX2MpLCBkZXNjKGN2Y19wKSwgZGVzYyhjdmNfcHJvZikpICU+JSANCiAgICBEVDo6ZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KA0KICAgICAgcGFnZUxlbmd0aCA9IDEwMA0KICAgICkpKQ0KYGBgDQoNCiMgNyBEZXRlcm1pbmHDp8Ojbw0KDQpgYGB7cn0NCmFqdXN0ZV9jdmNfY2xhcmV6YShkcyA9IGBkc18wN19jbGFyZXphLWRldGVybWluYWNhb2AsICJjbGFyZXphX2RldCIpDQphanVzdGVfY3ZjX3BlcnRpbmVuY2lhKGRzID0gYGRzXzA3X3BlcnRpbmVuY2lhLWRldGVybWluYWNhb2AsICJwZXJ0aW5lbmNpYV9kZXQiKQ0KYGBgDQoNCiMjIE1lcmdlIA0KDQpgYGB7cn0NCmlmKGV4aXN0cygiZGV0IikpICBybShjdmNfZGV0KQ0KKGN2Y19kZXQgPC0gbGVmdF9qb2luKGN2Y19jbGFyZXphX2RldCwNCiAgICAgICAgICBjdmNfcGVydGluZW5jaWFfZGV0LCBieSA9ICJpdGVtX251bWJlciIpICU+JSANCiAgc2VsZWN0KGNvbnRhaW5zKCJpdGVtIiksIGNvbnRhaW5zKCJjdmMiKSkgJT4lIA0KICByZW5hbWUoY3ZjX3BlcnRpbmVuY2lhID0gY3ZjKSAlPiUgDQogICAgc2VsZWN0KC1lbmRzX3dpdGgoIi55IikpICU+JSANCiAgICAgICAgaW5uZXJfam9pbiguLCBkc19jb250ZXVkb19kZXRlcm1pbmFjYW8sIGJ5ID0gIml0ZW1fbnVtYmVyIikgJT4lIA0KICAgIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCJjdmMiKSksIH5yb3VuZCguLDIpKSAlPiUgI3JvdW5kDQogICAgbXV0YXRlKGluY2x1aWRvID0gaWZfZWxzZShjdmNfYyA+IGNyaXRlcmlvX2NyaWFuY2EgJiBjdmNfcCA+IGNyaXRlcmlvX3BhaXMgJiBjdmNfcHJvZiA+IGNyaXRlcmlvX3Byb2YgJiBjdmNfcGVydGluZW5jaWEgPiBjcml0ZXJpb19wZXJ0aW5lbmNpYSwxLDApKSAlPiUgI2luY2x1aXI/DQogICAgc2VsZWN0KGl0ZW1fbnVtYmVyLCBjcmlhbmNhcyxwYWlzLCBwcm9mLCBjdmNfYywgY3ZjX3AsIGN2Y19wcm9mLCBjdmNfcGVydGluZW5jaWEsIGNvbXBldGVuY2lhLCBpbmNsdWlkbykgJT4lICAjb3JnYW5pemFyDQogICAgYXJyYW5nZShkZXNjKGluY2x1aWRvKSwgZGVzYyhjdmNfYyksIGRlc2MoY3ZjX3ApLCBkZXNjKGN2Y19wcm9mKSkgJT4lIA0KICAgIERUOjpkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QoDQogICAgICBwYWdlTGVuZ3RoID0gMTAwDQogICAgKSkpDQogIA0KDQpgYGANCg0KIyA4IExpZGVyYW7Dp2ENCg0KYGBge3J9DQphanVzdGVfY3ZjX2NsYXJlemEoZHMgPSBgZHNfMDhfY2xhcmV6YS1saWRlcmFuY2FgLCAiY2xhcmV6YV9saWQiKQ0KYWp1c3RlX2N2Y19wZXJ0aW5lbmNpYShkcyA9IGBkc18wOF9wZXJ0aW5lbmNpYS1saWRlcmFuY2FgLCAicGVydGluZW5jaWFfbGlkIikNCmBgYA0KDQojIyBNZXJnZSANCg0KYGBge3J9DQppZihleGlzdHMoImN2Y19saWQiKSkgIHJtKGN2Y19saWQpDQooY3ZjX2xpZCA8LSBsZWZ0X2pvaW4oY3ZjX2NsYXJlemFfbGlkLA0KICAgICAgICAgIGN2Y19wZXJ0aW5lbmNpYV9saWQsIGJ5ID0gIml0ZW1fbnVtYmVyIikgJT4lIA0KICBzZWxlY3QoY29udGFpbnMoIml0ZW0iKSwgY29udGFpbnMoImN2YyIpKSAlPiUgDQogIHJlbmFtZShjdmNfcGVydGluZW5jaWEgPSBjdmMpICU+JSANCiAgICBpbm5lcl9qb2luKC4sIGRzX2NvbnRldWRvX2xpZGVyYW5jYSwgYnkgPSAiaXRlbV9udW1iZXIiKSAlPiUgDQogICAgbXV0YXRlX2F0KHZhcnMoY29udGFpbnMoImN2YyIpKSwgfnJvdW5kKC4sMikpICU+JSAjcm91bmQNCiAgICBtdXRhdGUoaW5jbHVpZG8gPSBpZl9lbHNlKGN2Y19jID4gY3JpdGVyaW9fY3JpYW5jYSAmIGN2Y19wID4gY3JpdGVyaW9fcGFpcyAmIGN2Y19wcm9mID4gY3JpdGVyaW9fcHJvZiAmIGN2Y19wZXJ0aW5lbmNpYSA+IGNyaXRlcmlvX3BlcnRpbmVuY2lhLDEsMCkpICU+JSAjaW5jbHVpcj8NCiAgICBzZWxlY3QoaXRlbV9udW1iZXIsIGNyaWFuY2FzLHBhaXMsIHByb2YsIGN2Y19jLCBjdmNfcCwgY3ZjX3Byb2YsIGN2Y19wZXJ0aW5lbmNpYSwgY29tcGV0ZW5jaWEsIGluY2x1aWRvKSAlPiUgICNvcmdhbml6YXINCiAgICBhcnJhbmdlKGRlc2MoaW5jbHVpZG8pLCBkZXNjKGN2Y19jKSwgZGVzYyhjdmNfcCksIGRlc2MoY3ZjX3Byb2YpKSAlPiUgDQogICAgRFQ6OmRhdGF0YWJsZShvcHRpb25zID0gbGlzdCgNCiAgICAgIHBhZ2VMZW5ndGggPSAxMDANCiAgICApKSkNCmBgYA0KDQojIyBGdW7Dp8OjbyBsb3NzDQoNCg0KYGBge3J9DQp4PC0gIGJpbmRfcm93cyhjdmNfYXV0b2NvbmhlY2ltZW50byAlPiUgbXV0YXRlKHRlc3RlID0gImF1dG9jb25oZWNpbWVudG8iKSwNCiAgICAgICAgICAgICAgIGN2Y19ncGUgJT4lIG11dGF0ZSh0ZXN0ZSA9ICJncGUiKSwNCiAgICAgICAgICAgICAgIGN2Y190ZHIgJT4lIG11dGF0ZSh0ZXN0ZSA9ICJ0ZHIiKSwNCiAgICAgICAgICAgICAgIGN2Y19jb25zY2llbmNpYSAlPiUgbXV0YXRlKHRlc3RlID0gImNvbnNjaWVuY2lhIiksIA0KICAgICAgICAgICAgICAgY3ZjX3JlbGFjICU+JSBtdXRhdGUodGVzdGUgPSAicmVsYWNpb25hbWVudG8iKSwNCiAgICAgICAgICAgICAgIGN2Y19wZW5zZWNyICU+JSBtdXRhdGUodGVzdGUgPSAicGVuc2FtZW50byBjcmlhdGl2byIpLA0KICAgICAgICAgICAgICAgY3ZjX2RldCAlPiUgbXV0YXRlKHRlc3RlID0gImRldGVybWluYWNhbyIpLA0KICAgICAgICAgICAgICAgY3ZjX2xpZCAlPiUgbXV0YXRlKHRlc3RlID0gImxpZGVyYW5jYSIpKQ0KDQp4ICU+JSBjb3VudCh0ZXN0ZSkNCmBgYA0KDQpgYGB7cn0NCmBkc18wMl9wZXJ0aW5lbmNpYS1nZXN0YW9wZW5zYW1lbnRvZWVtb2NvZXNgICU+JSBzZWxlY3QoZW5kc193aXRoKCJjIikpICU+JSANCiAgdA0KYGBgDQoNCg0K