library(mapscape)
library(htmlwidgets)

library(ithi.utils)
load_base_libs()
library(ithi.meta)
library(ithi.ihc)
library(ithi.figures)

Parameters

db_path <- snakemake@params$db

mapscape_input_directories = snakemake@input$mapscape_inputs
ihc_table_path <- snakemake@input$ihc_table
tils_for_cluster <- snakemake@params$tiltypes
molecular_subtype_file <- snakemake@input$molsubtypes
nclusts <- snakemake@params$nclusts
reformat_andrew_table <- function(dat, db_path, patient_id) {
    dat$patient_id <- patient_id
    dat <- subset(dat, !sample_id %in% c("Pv2", "Rec2", "Rec3"))
    dat <- dat %>% plyr::rename(c(sample_id = "plot_id", long_sample_id = "sample_id"))
    dat_remapped <- ithi.meta::remap_sample_ids(dat, db_path)
    dat_remapped$abbrev_id <- stringr::str_extract(dat_remapped$condensed_id, 
        "[A-Za-z0-9]+$")
    dat_remapped <- dat_remapped %>% plyr::rename(c(sample_id = "old_sample_id", 
        sample_key = "long_sample_id", plot_id = "old_plot_id", abbrev_id = "sample_id"))
    if ("location_id" %in% colnames(dat_remapped)) {
        dat_remapped$location_id <- dat_remapped$sample_id
    }
    return(dat_remapped)
}
annotation_colours <- ithi.figures::get_annotation_colours()
cluster_colours <- annotation_colours$til_cluster_colours
ihc_table <- fread(ihc_table_path)
tiltypes <- unlist(tils_for_cluster)
molsubtypes <- fread(molecular_subtype_file)

tilheat <- ithi.figures::plot_til_density_heatmap(ihc_table, tiltypes, nclusts, 
    molsubtypes, annotation_colours)

tilclust <- as.hclust(ComplexHeatmap::column_dend(tilheat))
clusters <- cutree(tilclust, nclusts) %>% as.data.frame %>% setNames(c("cluster")) %>% 
    tibble::rownames_to_column(var = "condensed_id")

plot_mapscape <- function(input_dir) {
    patient_id <- stringr::str_extract(input_dir, "[0-9]+$")
    
    clonal_prev = read.table(file.path(input_dir, "clonal_prevalence_table.tsv"), 
        sep = "\t", header = T)
    tree_edges = read.table(file.path(input_dir, "tree_edges.tsv"), sep = "\t", 
        header = T)
    sample_locations = read.table(file.path(input_dir, "sample_locations.tsv"), 
        sep = "\t", header = T)
    sample_locations$long_sample_id <- df_as_map(clonal_prev, sample_locations$sample_id, 
        from = "sample_id", to = "long_sample_id")
    img_ref = "/shahlab/alzhang/projects/ITH_Immune/paper/miscellaneous/FF4D00-0.8.png"
    # img_ref =
    # '~/shahlab/projects/ITH_Immune/paper/miscellaneous/FF4D00-0.8.png'
    
    clonal_prev <- reformat_andrew_table(clonal_prev, db_path, patient_id)
    
    
    sample_locations <- reformat_andrew_table(sample_locations, db_path, patient_id)
    sample_locations <- subset(sample_locations, select = c(sample_id, location_id, 
        x, y))
    
    sample_colours <- unique(subset(clonal_prev, select = c(sample_id, condensed_id)))
    sample_colours$colour <- ithi.meta::df_as_map(clusters, sample_colours$condensed_id, 
        from = "condensed_id", to = "cluster") %>% plyr::mapvalues(from = c(1, 
        2, 3), to = c("N-TIL", "S-TIL", "ES-TIL")) %>% plyr::mapvalues(from = names(cluster_colours), 
        to = unname(cluster_colours)) %>% stringr::str_extract("#[0-9A-Z]{6}")
    sample_colours$colour[is.na(sample_colours$colour)] <- "#000000"
    
    til_cluster_colours <- data.frame(cluster = names(cluster_colours), colour = stringr::str_extract(unname(cluster_colours), 
        "\\#[0-9A-Z]{6}"))
    
    clonal_prev <- subset(clonal_prev, select = c(clone_idx, long_sample_id, 
        clonal_prev, sample_id, clone_id))
    
    plot_title <- paste0("Patient ", patient_id)
    
    mapscape(clonal_prev = clonal_prev, tree_edges = tree_edges, sample_locations = sample_locations, 
        img_ref = img_ref, show_warnings = FALSE, sample_colours = sample_colours, 
        til_cluster_colours = til_cluster_colours, plot_title = plot_title)
}

Plots

htmltools::tagList(lapply(mapscape_input_directories, function(dir) {
    patient_id <- stringr::str_extract(dir, "[0-9]+$")
    print(patient_id)
    plot_mapscape(dir)
}))
[1] "1"
[1] "2"
[1] "3"
[1] "4"
[1] "7"
[1] "9"
[1] "10"
[1] "11"
[1] "12"
[1] "13"
[1] "14"
[1] "15"
[1] "16"
[1] "17"
LS0tCnRpdGxlOiAiTWFwc2NhcGUgcGxvdHMiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHRydWUKcGFyYW1zOgogIHJtZDogIm1hcHNjYXBlLlJtZCIKLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIGBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyMjIyMjIyMgU25ha2VtYWtlIGhlYWRlciAjIyMjIyMjIwpsaWJyYXJ5KG1ldGhvZHMpClNuYWtlbWFrZSA8LSBzZXRDbGFzcygKICAgICJTbmFrZW1ha2UiLAogICAgc2xvdHMgPSBjKAogICAgICAgIGlucHV0ID0gImxpc3QiLAogICAgICAgIG91dHB1dCA9ICJsaXN0IiwKICAgICAgICBwYXJhbXMgPSAibGlzdCIsCiAgICAgICAgd2lsZGNhcmRzID0gImxpc3QiLAogICAgICAgIHRocmVhZHMgPSAibnVtZXJpYyIsCiAgICAgICAgbG9nID0gImxpc3QiLAogICAgICAgIHJlc291cmNlcyA9ICJsaXN0IiwKICAgICAgICBjb25maWcgPSAibGlzdCIsCiAgICAgICAgcnVsZSA9ICJjaGFyYWN0ZXIiCiAgICApCikKc25ha2VtYWtlIDwtIFNuYWtlbWFrZSgKICAgIGlucHV0ID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL1JtZC9fc2l0ZS55bWwnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzEnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzInLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzMnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzQnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzknLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzEwJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xMScsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTInLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzEzJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xNCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTUnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzE2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xNycsICdSbWQvbWFwc2NhcGUuUm1kJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2loY190YWJsZS50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvbW9sc3VidHlwZXMudHN2JywgInNpdGVfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL1JtZC9fc2l0ZS55bWwnLCAibWFwc2NhcGVfaW5wdXRzIiA9IGMoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8yJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8zJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy80JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy83JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy85JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xMCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTEnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzEyJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xMycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTQnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzE1JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xNicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTcnKSwgIm5vdGVib29rIiA9ICdSbWQvbWFwc2NhcGUuUm1kJywgImloY190YWJsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvaWhjX3RhYmxlLnRzdicsICJtb2xzdWJ0eXBlcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvbW9sc3VidHlwZXMudHN2JyksCiAgICBvdXRwdXQgPSBsaXN0KCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy93ZWIvbWFwc2NhcGVfSE1DLm5iLmh0bWwnKSwKICAgIHBhcmFtcyA9IGxpc3QoMywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgYygnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknKSwgJ2l0aGktYW5hbHlzaXMtcGxvdF9tYXBzY2FwZXMtSE1DJywgIm5jbHVzdHMiID0gMywgInRpbHR5cGVzIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJkYiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL21ldGFkYXRhL2RiL2ltbXVuZV9wcm9qZWN0LnNxbGl0ZTMnLCAibmFtZSIgPSAnaXRoaS1hbmFseXNpcy1wbG90X21hcHNjYXBlcy1ITUMnKSwKICAgIHdpbGRjYXJkcyA9IGxpc3QoJ0hNQycsICJzYW1wbGVyIiA9ICdITUMnKSwKICAgIHRocmVhZHMgPSAxLAogICAgbG9nID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9jbHVzdHRtcC9wYXBlcmFuYWx5c2lzMi9wbG90X21hcHNjYXBlX0hNQy5sb2cnKSwKICAgIHJlc291cmNlcyA9IGxpc3QoKSwKICAgIGNvbmZpZyA9IGxpc3QoInByb3BvcnRpb25fc3ViY2xvbmFsX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2l0aC9jb21wbGV0ZS9vbGRfcHJvcG9ydGlvbl9zdWJjbG9uYWwudHN2JywgImljZ2NfbW9sZWN1bGFyX3N1YnR5cGVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9pY2djX3ByaW1hcnlfdHVtb3VyX3N1YnR5cGVzLnRzdicsICJwcmV2YWxlbmNlX3RocmVzaG9sZCIgPSAwLjAxLCAiaWdwYXJ0aXRpb25fb3V0ZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9pZ3BhcnRpdGlvbi9ydW4yMicsICJpbW10eXBlcl9sZW5ndGhzIiA9ICcxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCcsICJpbnRlcm1lZGlhdGVfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjInLCAic3BhdGlhbF9yZXN1bHRfZGlycyIgPSBsaXN0KCJlcGl0aGVsaWFsIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9zcGF0c2ltL2l0aDMvYWJjJywgInN0cm9tYWwiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL3NwYXRzaW0vaXRoNS9hYmMnKSwgImljZ2Nfbm9ybWFsaXplZF9yZWFkc19tYXRyaXgiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL09WQVVfZXhwcl9tYXRyaXgudHN2JywgIm5ldXRyYWxfb3B0aW9ucyIgPSBjKCdyZXN0cmljdCcsICdmcmVlJyksICJtbWN0bV9vdl9jb21iaW5lZF9yZXN1bHRfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2NvbWJpbmVkX292X21tY3RtL291dHB1dCcsICJtbWN0bV9vdl9jb21iaW5lZF9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2NvbWJpbmVkX292X21tY3RtL3Bsb3RzL292X3Nudi1zdl9zaWdzX211bHRpcGFuZWwucGRmJywgImxpYnJhcnlfc2l6ZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL21peGNyL21peGNyX3J1bnMvaXRoXzFfMl8zL21peGNyNS9saWJyYXJ5X3NpemVzLnRzdicsICJ2X2RpY3Rpb25hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9zdWJwcm9qZWN0cy9pbW10eXBlci9tZXRhZGF0YS9pbWd0L0hvbW9fc2FwaWVuc19UUkJWLmZhc3RhJywgIm1hc3Rlcl9icmVha3BvaW50X2ZpbGUiID0gJy9zaGFobGFiL2FtY3BoZXJzb24vcHJvamVjdHMvaXRoMy9pdGgzL25vdGVib29rcy9iZXNwb2tlL2l0aF9icmVha3BvaW50cy50c3YnLCAibWFwc2NhcGVfcGF0aWVudF9vcmRlciIgPSBjKDEsIDIsIDMsIDQsIDcsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNyksICJuZW9hbnRpZ2VuX2VkaXRpbmdfbm90ZWJvb2siID0gJ1JtZC9pbW11bm9lZGl0aW5nLlJtZCcsICJqX2RpY3Rpb25hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9zdWJwcm9qZWN0cy9pbW10eXBlci9tZXRhZGF0YS9pbWd0L0hvbW9fc2FwaWVuc19UUkJKLmZhc3RhJywgIm1vbHN1YnR5cGVfbm90ZWJvb2siID0gJ1JtZC9tb2xlY3VsYXJfc3VidHlwZXMuUm1kJywgImtub3duX3N1YnR5cGVzX21lcmdlZCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvZXhwcmVzc2lvbi9rbm93bl9zdWJ0eXBlc19tZXJnZWQudHN2JywgInhjcl9tYXBwaW5nX25vdGVib29rIiA9ICdSbWQveGNyX21hcHBpbmcuUm1kJywgInhjcl9jbG9uZXNfbm90ZWJvb2siID0gJ1JtZC94Y3JfY2xvbmVzX2FuYWx5c2lzLlJtZCcsICJjbG9uZV9icmFuY2hfbGVuZ3RoX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2l0aC9jb21wbGV0ZS9icmFuY2hfZGF0YS50c3YnLCAiZGVmYXVsdF9zYW1wbGVyIiA9ICdITUMnLCAic3BhdGlhbF9ub3RlYm9vayIgPSAnUm1kL3NwYXRpYWxfYW5hbHlzaXMuUm1kJywgImRyaXZlcl9wYXRpZW50cyIgPSBjKDEsIDIsIDMsIDQsIDcsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNyksICJ4Y3JtYXBzY2FwZV9ub3RlYm9vayIgPSAnUm1kL3hjcm1hcHNjYXBlLlJtZCcsICJwaGVub3R5cGVfdGhyZXNob2xkIiA9IDAuODUsICJsb2dkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvY2x1c3R0bXAvcGFwZXJhbmFseXNpczInLCAiZGIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgImJjcnBoeWxvX2NvcnJlbGF0aW9uc19ub3RlYm9vayIgPSAnUm1kL2Jjcl9waHlsb19jb3JyZWxhdGlvbnMuUm1kJywgIm5vdGVib29rX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViJywgImNsb25hbF9maWd1cmVfdGVtcGxhdGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy90ZW1wbGF0ZXMvY2xvbmFsX2ZpZ3VyZV80Ynk0LnN2ZycsICJpY2djX2NsaW5pY2FsIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9kb25vci5PVi1BVS50c3YnLCAibWFwc2NhcGVfbm90ZWJvb2siID0gJ1JtZC9tYXBzY2FwZS5SbWQnLCAiaWhjX3J1bjEiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2loYy9jZDhjZDNjZDIwL3ZhbGlkYXRlZF9zdGF0c193ZWlnaHRlZF9uZXcucmRhdGEnLCAieGNyX2Rpc3RhbmNlX21ldGhvZCIgPSAnaG9ybicsICJpdGhfdGlsX25vdGVib29rIiA9ICdSbWQvaXRoX3RpbF9kZW5zaXRpZXMuUm1kJywgImloY194Y3Jfc3RhdHNfbm90ZWJvb2siID0gJ1JtZC9paGNfeGNyX3N0YXRzLlJtZCcsICJuYW5vc3RyaW5nX2RhdGEiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL25hbm9zdHJpbmdfcmVzdWx0cy9pdGhfZnVsbC9xYy9saW1tYV9xdWFudGlsZS9ub3JtYWxpemVkX2V4cHJlc3Npb25fdm9hX2xhYmVsc19maWx0ZXJlZC50c3YnLCAiYmNyX2Nsb25hbF9maWd1cmVfdGVtcGxhdGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy90ZW1wbGF0ZXMvY2xvbmFsX2ZpZ3VyZV80Ynk0X25vYm90dG9tLnN2ZycsICJzbW9vdGhfdHlwZSIgPSAnZ2xtJywgInN1YnR5cGVfbWFya2VyX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vbmFub3N0cmluZy9zdWJ0eXBlX21hcmtlcnMudHN2JywgImNsb25lX3ByZXZhbGVuY2VfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaXRoL2NvbXBsZXRlL2Nsb25lX2RhdGEudHN2JywgInBhdGllbnRzX2Zvcl9jbG9uYWwiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAibW1jdG1fZmluYWxfcGF0aWVudF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvaXRoX2J5LXBhdGllbnRfd2l0aC1vdicsICJtdXRzaWdfdGlsdHlwZXMiID0gYygnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknLCAnVF9DRDhfZGVuc2l0eScsICdUX0NENF9kZW5zaXR5JywgJ1RfQ0QyMF9kZW5zaXR5JywgJ1RfUGxhc21hX2RlbnNpdHknKSwgInRjZ2FfZXhwcl9tYXRyaXgiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9UQ0dBL2V4cHJfbWF0cml4X25vcm1hbGl6ZV9zdGFuZGFyZGl6ZV9ub2R1cGxpY2F0ZXMudHN2JywgIm1tY3RtX3NhbXBsZV9hZF9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1hbmNlc3RyeS1zYW1wbGUvcGxvdHMvaXRoLWJ5LWFuY2VzdHJhbC1zYW1wbGVfc252LXN2X3NpZ3NfbXVsdGlwYW5lbC5wZGYnLCAidGV4X3Jlc291cmNlX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGV4X3Jlc291cmNlcy9ydW4yJywgImloY194Y3JfdGlsdHlwZXMiID0gYygnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknLCAnVF9DRDhfZGVuc2l0eScsICdUX0NENF9kZW5zaXR5JywgJ1RfQ0QyMF9kZW5zaXR5JywgJ1RfUGxhc21hX2RlbnNpdHknKSwgImV4YW1wbGVfYW5ub3RhdGlvbnMiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL2lncGFydGl0aW9uL3J1bjEzL2ZpbmFsX3BhcnRpdGlvbnMvaXRoMl8yL2NsdXN0OS9hbm5vdGF0aW9uc19mbGFnZ2VkLnRzdicsICJ0aWxzX2Zvcl9jbHVzdGVyIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJ0Y2dhX292X2Fubm90YXRpb25zIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvVENHQS90Y2dhX292X2Fubm90YXRpb25fc3VwMTMudHh0JywgIml0aGlfbmV1dHJhbGl0eV9zYW1wbGVzIiA9IGMoJzFfT20xJywgJzFfUk92MScsICcxX1JPdjInLCAnMV9ST3YzJywgJzFfUk92NCcsICcxX1NCd2wxJywgJzEwX1JPdjEnLCAnMTBfUk92MicsICcxMF9ST3YzJywgJzEwX1JPdjQnLCAnMTFfTE92MScsICcxMV9MT3YzJywgJzExX1B2MScsICcxMV9SY3QxJywgJzExX1JjdDInLCAnMTJfTE92MScsICcxMl9MT3YyJywgJzEyX09tMScsICcxMl9PbTInLCAnMTJfUk92MScsICcxM19PbTEnLCAnMTNfUkdybjEnLCAnMTNfUk92MScsICcxM19ST3YyJywgJzEzX1JPdjMnLCAnMTRfQmxkMScsICcxNF9DRFMxJywgJzE0X0xPdjEnLCAnMTRfT20xJywgJzE0X1JPdjEnLCAnMTVfQ0RTMScsICcxNV9MT3YxJywgJzE1X1JPdjEnLCAnMTVfUk92MicsICcxNV9TQndsMScsICcxNl9MT3YxJywgJzE2X0xPdlNmYzEnLCAnMTZfT20xJywgJzE2X1B0bjEnLCAnMTZfUk92MScsICcxN19PbTEnLCAnMTdfT20yJywgJzE3X09tMycsICcxN19PdjEnLCAnMTdfT3YyJywgJzJfT20xJywgJzJfT20yJywgJzJfUk92MScsICcyX1JPdjInLCAnM19BZG54MScsICczX09tMScsICczX1JPdjEnLCAnM19ST3YyJywgJzRfTFB2U3cxJywgJzRfUk92MScsICc0X1JPdjInLCAnNF9ST3YzJywgJzRfUk92NCcsICc3X0Jybk0nLCAnN19MT3YxJywgJzdfUlB2TScsICc5X0xPdjEnLCAnOV9MT3YyJywgJzlfT20xJywgJzlfT20yJywgJzlfUk92MScpLCAiaW1tdW5lX3ZhcmlhYmlsaXR5X25vdGVib29rIiA9ICdSbWQvaW1tdW5lX3ZhcmlhYmlsaXR5LlJtZCcsICJtbWN0bV9wYXRpZW50X2FuY2VzdHJhbF9kZXNjZW5kYW50X3Jlc3VsdF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvaXRoX2J5LXBhdGllbnQtYW5jZXN0cnkvb3V0cHV0JywgIm5jbHVzdHMiID0gMywgInZhcmlhYmlsaXR5X3R5cGUiID0gJ3N0YWJpbGl6ZScsICJjbGFzc2lmaWVyX3R5cGUiID0gJ2tubicsICJ0Y3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvVFJCL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJpbW10eXBlcl9tb2RlbHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL2ltbXR5cGVyX3Jlc3VsdHMva2xhcmVuYmVlay9hYV92ai9ncmFkYm9vc3QnLCAiYmNyX2RpdmVyc2l0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL0lHSC9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAiaWhjX3J1bjIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2loYy9jZDc5Y2QxMzhjZDY4L3ZhbGlkYXRlZF9zdGF0c193ZWlnaHRlZC5yZGF0YScsICJpbmRleF9ub3RlYm9vayIgPSAnUm1kL2luZGV4LlJtZCcsICJjY3NyaV9tYXBzY2FwZV9ub3RlYm9vayIgPSAnUm1kL21hcHNjYXBlX2Njc3JpLlJtZCcsICJ0Y2dhX2NsaW5pY2FsIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvVENHQS9zeW5hcHNlX2NsaW5BbGxfZGF0YS50c3YnLCAiZmlndXJlX2dhbGxlcnlfbm90ZWJvb2siID0gJ1JtZC9maWd1cmVzLlJtZCcsICJleGFtcGxlX21zYV9wbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9pZ3BhcnRpdGlvbi9ydW4xMy9vbGQvYWxpZ25tZW50X3Bsb3RzL21zYS9pdGgyXzIvY2x1c3Q5L2luZGVsX3JldmVyc2VkLmh0bWwnLCAiaWNnY19zcGVjaW1lbl9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9zcGVjaW1lbi50c3YnLCAibW1jdG1fZmluYWxfcGF0aWVudF9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1wYXRpZW50X3dpdGgtb3YvcGxvdHMvaXRoLWJ5LXBhdGllbnRfc252LXN2X3NpZ3NfbXVsdGlwYW5lbC5wZGYnLCAibW9sc3VidHlwZV90aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAibW1jdG1fYW5jZXN0cmFsX2Rlc2NlbmRhbnRfcmVzdWx0X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktYW5jZXN0cnktc2FtcGxlL291dHB1dCcsICJQTkdfUVVBTElUWSIgPSAzMDAsICJtdmNsdXN0X25jbHVzdCIgPSAzLCAiZHJpdmVyX2FuYWx5c2lzX25vdGVib29rIiA9ICdSbWQvZHJpdmVyX2FuYWx5c2lzLlJtZCcsICJ0aWxfY2xhc3NpZmllcl9ub3RlYm9vayIgPSAnUm1kL3RpbF9jbGFzc2lmaWVyLlJtZCcsICJtbWN0bV9zYW1wbGVfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktc2FtcGxlL3Bsb3RzL2l0aC1ieS1zYW1wbGVfc252LXN2X3NpZ3NfbXVsdGlwYW5lbC5wZGYnLCAibWFzdGVyX3ZhcmlhbnRfZmlsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX3NudnMudHN2JywgIm11dGF0aW9uX3NpZ25hdHVyZV9ub3RlYm9vayIgPSAnUm1kL211dGF0aW9uX3NpZ25hdHVyZXMuUm1kJywgImNsb25lX3RyZWVfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaXRoL2NvbXBsZXRlL3RyZWVfZGF0YS50c3YnLCAia25vd25fc3VidHlwZV9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9leHByZXNzaW9uL2FycmF5L3N1YnR5cGVzL2tub3duX3N1YnR5cGVzLnRzdicsICJuYW5vc3RyaW5nX2Fubm90YXRpb25zIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9leHByZXNzaW9uL25hbm9zdHJpbmcvcGFuY2FuY2VyX2Fubm90YXRpb25zLnRzdicsICJ3YW5nX2ZiaV9zdGF0dXMiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL25nLjM4NDktUzEyLnR4dCcsICJ5aW55aW5faW1hZ2Vfc3VtbWFyeSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkveXVhbl9oZWNyX2ltYWdlX3Jlc3VsdHMuY3N2JywgIml0aF9wcm9qZWN0X3Jlc3VsdHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvaXRoMy9kYXRhL3Jlc3VsdHMnLCAibXZjbHVzdF90aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAidGNyX2Nsb25vdHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL21peGNyL21peGNyX3J1bnMvaXRoXzFfMl8zL21peGNyNS9jbG9ub3R5cGVzL1RSQl9jbG9ub3R5cGVzX2ZpbHRlcmVkLnR4dCcsICJiY3JwaHlsb190aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScsICdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScpLCAiYmVuY2htYXJrZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2JlbmNobWFya3MvcGFwZXJhbmFseXNpczInLCAibW1jdG1fc2FtcGxlX3Jlc3VsdF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvaXRoX2J5LXNhbXBsZS9vdXRwdXQnLCAic2FkX25vdGVib29rIiA9ICdSbWQvc3BlY2llc19hYnVuZGFuY2VfZGlzdHJpYnV0aW9ucy5SbWQnLCAiYmNycGh5bG9fZXhhbXBsZXNfbm90ZWJvb2siID0gJ1JtZC9iY3JfcGh5bG9fZXhhbXBsZXMuUm1kJywgInhjcl9xY19ub3RlYm9vayIgPSAnUm1kL3JlcGxpY2F0ZXMuUm1kJywgImRyaXZlcl9tYXAiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9zdWJwcm9qZWN0cy9kcml2ZXJzL2RhdGEvZ2VuZV9saXN0X21hcHBlZC5iZWQnLCAieGNybWFwc2NhcGVfZmlsZXMiID0gYygnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzEuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8yLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMy5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzQuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS83LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvOS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzEwLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTEuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xMi5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzEzLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTQuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xNS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzE2LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTcuc3ZnJyksICJpdGhpX2NsaW5pY2FsX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL2NsaW5pY2FsX3RhYmxlXzIwMTcwODE2XzIudHh0JywgIm11bHRpdmlld2NsdXN0ZXJpbmdfbm90ZWJvb2siID0gJ1JtZC9tdWx0aXZpZXdjbHVzdGVyaW5nLlJtZCcsICJvdjEzM19mYmlfc3RhdHVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvT1YxMzMvb3YxMzNfaGdzY19mYmlfY2xhc3MudHN2JywgIm5lb2VkaXRpbmdfb3V0ZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9uZW9lZGl0aW5nL3J1bjQnLCAibWFzdGVyX2NvcHludW1iZXJfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkvbWFzdGVyX2NvcHludW1iZXJfZmlsZS50c3YnLCAibnNjYXR0ZXJzIiA9IDEsICJtYXBzY2FwZV90ZW1wbGF0ZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL3RlbXBsYXRlcy9jbG9uYWxfZmlndXJlXzRieTRfbm9ib3R0b21fdGlsY2x1c3Rlci5zdmcnLCAiaWNnY19leHByX21lbHRlZCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL0lDR0MvT1ZBVV9leHByX21lbHRlZC50c3YnLCAiYmNybWFwc2NhcGVfZmlsZXMiID0gYygnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzEuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8yLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMy5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzQuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS83LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvOS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzEwLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTEuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xMi5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzEzLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTQuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xNS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzE2LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTcuc3ZnJyksICJzaXRlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy9SbWQvX3NpdGUueW1sJywgImltYWdlX2FuYWx5c2lzX25vdGVib29rIiA9ICdSbWQvaW1hZ2VfYW5hbHlzaXMuUm1kJywgIlBOR19ERU5TSVRZIiA9IDMwMCwgIml0aF9zdGF0c19maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9pdGgvY29tcGxldGUvY2xvbmFsX21lYXN1cmVzLnRzdicsICJuYW5vc3RyaW5nX3NpZ25hdHVyZV9ub3RlYm9vayIgPSAnUm1kL25hbm9zdHJpbmdfc2lnbmF0dXJlcy5SbWQnLCAiaXRoX3N0YXRpc3RpY3Nfbm90ZWJvb2siID0gJ1JtZC9pdGhfc3RhdGlzdGljcy5SbWQnLCAidGFibGVfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMicsICJjbG9uYWxfc2FtcGxlcnMiID0gYygnSE1DJywgJ05VVFMnKSwgIm1tY3RtX3BhdGllbnRfYWRfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktcGF0aWVudC1hbmNlc3RyeS9wbG90cy9pdGgtYnktcGF0aWVudC1hbmNlc3RyeV9zbnYtc3Zfc2lnc19tdWx0aXBhbmVsLnBkZicsICJ4Y3JtYXBzY2FwZV9iY3JfcGF0aWVudF9vcmRlciIgPSBjKDksIDQsIDExLCAxNCwgMTUsIDEyLCAxLCAxMCwgMiwgMywgMTYsIDE3LCAxMywgNyksICJ0aWxzX2Zvcl92YXJpYWJpbGl0eSIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAiaXRoX3N0YXRfdHlwZXMiID0gYygnZW50cm9weScsICdwb3N0cHJvY2Vzc2VkX2RpdmVyZ2VuY2UnLCAnY29tYmluZWRfaXRoX25vcm1hbGl6ZWQnLCAncHJvcG9ydGlvbl9zdWJjbG9uYWwnKSwgInhjcm1hcHNjYXBlX3Rjcl9wYXRpZW50X29yZGVyIiA9IGMoOSwgMiwgMTUsIDEsIDEyLCAxNCwgMTEsIDE3LCAzLCA0LCAxMCwgMTMsIDE2LCA3KSwgImJjcl9jbG9ub3R5cGVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvY2xvbm90eXBlcy9JR0hfY2xvbm90eXBlc19maWx0ZXJlZC50eHQnKSwKICAgIHJ1bGUgPSAncGxvdF9tYXBzY2FwZScKKQojIyMjIyMjIyBPcmlnaW5hbCBzY3JpcHQgIyMjIyMjIyMjCgogICAgICAgICAgICAgICAgICAgICAgICBgYGAKCgpgYGB7ciBnbG9iYWxfY2h1bmtfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB0aWR5PVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpCmBgYAoKYGBge3J9CmxpYnJhcnkobWFwc2NhcGUpCmxpYnJhcnkoaHRtbHdpZGdldHMpCgpsaWJyYXJ5KGl0aGkudXRpbHMpCmxvYWRfYmFzZV9saWJzKCkKbGlicmFyeShpdGhpLm1ldGEpCmxpYnJhcnkoaXRoaS5paGMpCmxpYnJhcnkoaXRoaS5maWd1cmVzKQpgYGAKCiMjIFBhcmFtZXRlcnMKCmBgYHtyfQpkYl9wYXRoIDwtIHNuYWtlbWFrZUBwYXJhbXMkZGIKCm1hcHNjYXBlX2lucHV0X2RpcmVjdG9yaWVzID0gc25ha2VtYWtlQGlucHV0JG1hcHNjYXBlX2lucHV0cwppaGNfdGFibGVfcGF0aCA8LSBzbmFrZW1ha2VAaW5wdXQkaWhjX3RhYmxlCnRpbHNfZm9yX2NsdXN0ZXIgPC0gc25ha2VtYWtlQHBhcmFtcyR0aWx0eXBlcwptb2xlY3VsYXJfc3VidHlwZV9maWxlIDwtIHNuYWtlbWFrZUBpbnB1dCRtb2xzdWJ0eXBlcwpuY2x1c3RzIDwtIHNuYWtlbWFrZUBwYXJhbXMkbmNsdXN0cwpgYGAKCgpgYGB7cn0KcmVmb3JtYXRfYW5kcmV3X3RhYmxlIDwtIGZ1bmN0aW9uKGRhdCwgZGJfcGF0aCwgcGF0aWVudF9pZCkgewogIGRhdCRwYXRpZW50X2lkIDwtIHBhdGllbnRfaWQKICBkYXQgPC0gc3Vic2V0KGRhdCwgIXNhbXBsZV9pZCAlaW4lIGMoIlB2MiIsICJSZWMyIiwgIlJlYzMiKSkKICBkYXQgPC0gZGF0ICU+JSBwbHlyOjpyZW5hbWUoYygic2FtcGxlX2lkIj0icGxvdF9pZCIsICJsb25nX3NhbXBsZV9pZCI9InNhbXBsZV9pZCIpKQogIGRhdF9yZW1hcHBlZCA8LSBpdGhpLm1ldGE6OnJlbWFwX3NhbXBsZV9pZHMoZGF0LCBkYl9wYXRoKQogIGRhdF9yZW1hcHBlZCRhYmJyZXZfaWQgPC0gc3RyaW5ncjo6c3RyX2V4dHJhY3QoZGF0X3JlbWFwcGVkJGNvbmRlbnNlZF9pZCwgIltBLVphLXowLTldKyQiKQogIGRhdF9yZW1hcHBlZCA8LSBkYXRfcmVtYXBwZWQgJT4lIHBseXI6OnJlbmFtZShjKCJzYW1wbGVfaWQiPSJvbGRfc2FtcGxlX2lkIiwgInNhbXBsZV9rZXkiPSJsb25nX3NhbXBsZV9pZCIsICJwbG90X2lkIj0ib2xkX3Bsb3RfaWQiLCAiYWJicmV2X2lkIj0ic2FtcGxlX2lkIikpCiAgaWYgKCJsb2NhdGlvbl9pZCIgJWluJSBjb2xuYW1lcyhkYXRfcmVtYXBwZWQpKSB7CiAgICBkYXRfcmVtYXBwZWQkbG9jYXRpb25faWQgPC0gZGF0X3JlbWFwcGVkJHNhbXBsZV9pZAogIH0KICByZXR1cm4oZGF0X3JlbWFwcGVkKQp9CmBgYAoKYGBge3J9CmFubm90YXRpb25fY29sb3VycyA8LSBpdGhpLmZpZ3VyZXM6OmdldF9hbm5vdGF0aW9uX2NvbG91cnMoKQpjbHVzdGVyX2NvbG91cnMgPC0gYW5ub3RhdGlvbl9jb2xvdXJzJHRpbF9jbHVzdGVyX2NvbG91cnMKaWhjX3RhYmxlIDwtIGZyZWFkKGloY190YWJsZV9wYXRoKQp0aWx0eXBlcyA8LSB1bmxpc3QodGlsc19mb3JfY2x1c3RlcikKbW9sc3VidHlwZXMgPC0gZnJlYWQobW9sZWN1bGFyX3N1YnR5cGVfZmlsZSkKCnRpbGhlYXQgPC0gaXRoaS5maWd1cmVzOjpwbG90X3RpbF9kZW5zaXR5X2hlYXRtYXAoaWhjX3RhYmxlLCB0aWx0eXBlcywgbmNsdXN0cywgbW9sc3VidHlwZXMsIGFubm90YXRpb25fY29sb3VycykKCnRpbGNsdXN0IDwtIGFzLmhjbHVzdChDb21wbGV4SGVhdG1hcDo6Y29sdW1uX2RlbmQodGlsaGVhdCkpCmNsdXN0ZXJzIDwtIGN1dHJlZSh0aWxjbHVzdCwgbmNsdXN0cykgJT4lIGFzLmRhdGEuZnJhbWUgJT4lIHNldE5hbWVzKGMoImNsdXN0ZXIiKSkgJT4lIAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjb25kZW5zZWRfaWQiKQoKcGxvdF9tYXBzY2FwZSA8LSBmdW5jdGlvbihpbnB1dF9kaXIpIHsKICBwYXRpZW50X2lkIDwtIHN0cmluZ3I6OnN0cl9leHRyYWN0KGlucHV0X2RpciwgIlswLTldKyQiKQogIAogIGNsb25hbF9wcmV2ID0gcmVhZC50YWJsZShmaWxlLnBhdGgoaW5wdXRfZGlyLCAiY2xvbmFsX3ByZXZhbGVuY2VfdGFibGUudHN2IiksIHNlcD0nXHQnLCBoZWFkZXI9VCkKICB0cmVlX2VkZ2VzID0gcmVhZC50YWJsZShmaWxlLnBhdGgoaW5wdXRfZGlyLCAidHJlZV9lZGdlcy50c3YiKSwgc2VwPSdcdCcsIGhlYWRlcj1UKQogIHNhbXBsZV9sb2NhdGlvbnMgPSByZWFkLnRhYmxlKGZpbGUucGF0aChpbnB1dF9kaXIsICJzYW1wbGVfbG9jYXRpb25zLnRzdiIpLCBzZXA9J1x0JywgaGVhZGVyPVQpCiAgc2FtcGxlX2xvY2F0aW9ucyRsb25nX3NhbXBsZV9pZCA8LSBkZl9hc19tYXAoY2xvbmFsX3ByZXYsIHNhbXBsZV9sb2NhdGlvbnMkc2FtcGxlX2lkLCBmcm9tID0gInNhbXBsZV9pZCIsIHRvID0gImxvbmdfc2FtcGxlX2lkIikKICBpbWdfcmVmID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9taXNjZWxsYW5lb3VzL0ZGNEQwMC0wLjgucG5nJwogICNpbWdfcmVmID0gJ34vc2hhaGxhYi9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL21pc2NlbGxhbmVvdXMvRkY0RDAwLTAuOC5wbmcnCiAgCiAgY2xvbmFsX3ByZXYgPC0gcmVmb3JtYXRfYW5kcmV3X3RhYmxlKGNsb25hbF9wcmV2LCBkYl9wYXRoLCBwYXRpZW50X2lkKQogIAogIAogIHNhbXBsZV9sb2NhdGlvbnMgPC0gcmVmb3JtYXRfYW5kcmV3X3RhYmxlKHNhbXBsZV9sb2NhdGlvbnMsIGRiX3BhdGgsIHBhdGllbnRfaWQpCiAgc2FtcGxlX2xvY2F0aW9ucyA8LSBzdWJzZXQoc2FtcGxlX2xvY2F0aW9ucywgc2VsZWN0PWMoc2FtcGxlX2lkLCBsb2NhdGlvbl9pZCwgeCwgeSkpCiAgCiAgc2FtcGxlX2NvbG91cnMgPC0gdW5pcXVlKHN1YnNldChjbG9uYWxfcHJldiwgc2VsZWN0PWMoc2FtcGxlX2lkLCBjb25kZW5zZWRfaWQpKSkKICBzYW1wbGVfY29sb3VycyRjb2xvdXIgPC0gaXRoaS5tZXRhOjpkZl9hc19tYXAoY2x1c3RlcnMsIHNhbXBsZV9jb2xvdXJzJGNvbmRlbnNlZF9pZCwgZnJvbSA9ICJjb25kZW5zZWRfaWQiLCB0bz0iY2x1c3RlciIpICU+JQogICAgcGx5cjo6bWFwdmFsdWVzKGZyb20gPSBjKDEsMiwzKSwgdG8gPSBjKCJOLVRJTCIsICJTLVRJTCIsICJFUy1USUwiKSkgJT4lCiAgICBwbHlyOjptYXB2YWx1ZXMoZnJvbSA9IG5hbWVzKGNsdXN0ZXJfY29sb3VycyksIHRvID0gdW5uYW1lKGNsdXN0ZXJfY29sb3VycykpICU+JQogICAgc3RyaW5ncjo6c3RyX2V4dHJhY3QoIiNbMC05QS1aXXs2fSIpCiAgc2FtcGxlX2NvbG91cnMkY29sb3VyW2lzLm5hKHNhbXBsZV9jb2xvdXJzJGNvbG91cildIDwtICIjMDAwMDAwIgogIAogIHRpbF9jbHVzdGVyX2NvbG91cnMgPC0gZGF0YS5mcmFtZShjbHVzdGVyPW5hbWVzKGNsdXN0ZXJfY29sb3VycyksIGNvbG91cj1zdHJpbmdyOjpzdHJfZXh0cmFjdCh1bm5hbWUoY2x1c3Rlcl9jb2xvdXJzKSwgIlxcI1swLTlBLVpdezZ9IikpCiAgCiAgY2xvbmFsX3ByZXYgPC0gc3Vic2V0KGNsb25hbF9wcmV2LCBzZWxlY3Q9YyhjbG9uZV9pZHgsIGxvbmdfc2FtcGxlX2lkLCBjbG9uYWxfcHJldiwgc2FtcGxlX2lkLCBjbG9uZV9pZCkpCiAgCiAgcGxvdF90aXRsZSA8LSBwYXN0ZTAoIlBhdGllbnQgIiwgcGF0aWVudF9pZCkKICAKICBtYXBzY2FwZSgKICAgIGNsb25hbF9wcmV2ID0gY2xvbmFsX3ByZXYsCiAgICB0cmVlX2VkZ2VzID0gdHJlZV9lZGdlcywKICAgIHNhbXBsZV9sb2NhdGlvbnMgPSBzYW1wbGVfbG9jYXRpb25zLAogICAgaW1nX3JlZiA9IGltZ19yZWYsCiAgICBzaG93X3dhcm5pbmdzID0gRkFMU0UsCiAgICBzYW1wbGVfY29sb3VycyA9IHNhbXBsZV9jb2xvdXJzLAogICAgdGlsX2NsdXN0ZXJfY29sb3VycyA9IHRpbF9jbHVzdGVyX2NvbG91cnMsCiAgICBwbG90X3RpdGxlID0gcGxvdF90aXRsZSkKfQpgYGAKCiMjIFBsb3RzCgpgYGB7cn0KaHRtbHRvb2xzOjp0YWdMaXN0KGxhcHBseShtYXBzY2FwZV9pbnB1dF9kaXJlY3RvcmllcywgZnVuY3Rpb24oZGlyKSB7CiAgcGF0aWVudF9pZCA8LSBzdHJpbmdyOjpzdHJfZXh0cmFjdChkaXIsICJbMC05XSskIikKICBwcmludChwYXRpZW50X2lkKQogIHBsb3RfbWFwc2NhcGUoZGlyKQp9KSkKYGBgCg==