## Modified version of mapscape. Cannot be put into the same package as some
## of the components conflict
library(xcrmapscape)
library(htmlwidgets)

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

Parameters

db_path <- snakemake@params$db

mapscape_input_directories = snakemake@input$mapscape_inputs
xcr_table_path <- snakemake@input$xcr_table
show_full_track <- (snakemake@params$track_option == "full")
full_page_mode <- (snakemake@params$page_mode == "full")
segment_type <- snakemake@params$segment_type

clone_tree_file <- snakemake@input$clone_tree_file
clone_prevalence_file <- snakemake@input$clone_prevalence_file
clone_branch_length_file <- snakemake@input$clone_branch_length_file
db <- src_sqlite(db_path, create = FALSE)
andrew_map <- collect(tbl(db, "andrew_map"))
distance_method <- "horn"

tree_branch_data <- read_clone_tree_data(clone_tree_file, clone_branch_length_file, 
    clone_prevalence_file, db_path)
xcr_table <- read_clonotypes(xcr_table_path, duplicates = FALSE, db_path)

Read 36.1% of 304822 rows
Read 85.3% of 304822 rows
Read 304822 rows and 18 (of 18) columns from 0.070 GB file in 00:00:05
annotation_colours <- ithi.figures::get_annotation_colours()
tcr_segment_type <- "TRB"
bcr_segment_type <- "IGH"

patients <- unique(xcr_table$patient_id)

id_type <- "condensed_id"

dists <- lapply(patients, function(patient) {
    tcr_clonotypes <- subset(xcr_table, type == tcr_segment_type & patient_id == 
        patient)
    bcr_clonotypes <- subset(xcr_table, type == bcr_segment_type & patient_id == 
        patient)
    tcr_cross_table <- ithi.xcr::cross_tabulate(tcr_clonotypes, id_type = id_type)
    bcr_cross_table <- ithi.xcr::cross_tabulate(bcr_clonotypes, id_type = id_type)
    
    cross_tables <- list(tcr = tcr_cross_table, bcr = bcr_cross_table)
    
    distance_matrices <- lapply(cross_tables, function(cross_table) {
        distmat <- ithi.xcr::compute_immune_distance_matrix(cross_table, method = distance_method)
        mat <- as.matrix(distmat)
        return(mat)
    })
    return(distance_matrices)
})
tcr_dists <- lapply(dists, function(x) x$tcr)
bcr_dists <- lapply(dists, function(x) x$bcr)

xcr_dists <- tibble::tibble(patient_id = patients, tcr = tcr_dists, bcr = bcr_dists)
xcr_dists$patient_id <- factor(xcr_dists$patient_id)
xcr_dists <- xcr_dists[order(xcr_dists$patient_id), ]


trees <- lapply(tree_branch_data, function(x) x$tree)
prevalences <- plyr::rbind.fill(lapply(tree_branch_data, function(x) x$prevalence_dat))
branch_lengths <- plyr::rbind.fill(lapply(tree_branch_data, function(x) x$branch_dat))

ccfs <- ithi.clones::compute_ccf(prevalences, trees, id_type = id_type)
ccfs_labeled <- merge(ccfs, branch_lengths, by = c("label", "node", "patient_id"))

## Need non-normalized distances
clone_dists <- ithi.clones::clone_distances(ccfs_labeled, normalize = FALSE, 
    id_type = "condensed_id")

clone_dists$patient_id <- factor(clone_dists$patient_id)

total_dists <- inner_join(clone_dists, xcr_dists)


pairwise_similarities <- plyr::rbind.fill(lapply(1:nrow(total_dists), function(i) {
    clone_distmat <- total_dists[i, ]$dist_clones_weighted[[1]]
    tcr_distmat <- total_dists[i, ]$tcr[[1]]
    bcr_distmat <- total_dists[i, ]$bcr[[1]]
    
    inputs <- list(clone_distmat, tcr_distmat, bcr_distmat)
    names(inputs) <- c("clones", "tcr", "bcr")
    
    patient_id <- total_dists[i, ]$patient_id
    
    pairwise_sims <- cbind(patient_id = patient_id, ithi.supp:::compute_overlap_similarities(inputs))
    return(pairwise_sims)
}))
pairwise_similarities$patient_id <- factor(pairwise_similarities$patient_id)

dissimilarity_matrices <- dplyr::bind_rows(lapply(1:nrow(total_dists), function(i) {
    clone_distmat <- total_dists[i, ]$dist_clones_weighted[[1]]
    tcr_distmat <- total_dists[i, ]$tcr[[1]]
    bcr_distmat <- total_dists[i, ]$bcr[[1]]
    patient_id <- total_dists[i, ]$patient_id
    
    inputs <- list(clone_distmat, tcr_distmat, bcr_distmat)
    names(inputs) <- c("clones", "tcr", "bcr")
    
    matrices_subset <- ithi.supp:::compute_overlap_matrices(inputs)
    names(matrices_subset) <- names(inputs)
    
    tibble(patient_id = patient_id, clones = list(matrices_subset$clones), tcr = list(matrices_subset$tcr), 
        bcr = list(matrices_subset$bcr))
}))

segment_name <- plyr::mapvalues(segment_type, from = c("TRB", "IGH"), to = c("tcr", 
    "bcr"))

stats <- plyr::rbind.fill(lapply(1:nrow(dissimilarity_matrices), function(i) {
    row <- dissimilarity_matrices[i, ]
    xcrmat <- dissimilarity_matrices[, segment_name][[1]][[i]]
    clonemat <- dissimilarity_matrices$clones[[i]]
    
    manttest <- vegan::mantel(xcrmat, clonemat, method = "pearson")
    data.frame(patient_id = row$patient_id, p.value = manttest$signif, stat = manttest$statistic)
}))
plot_xcrmapscape <- function(clonal_prev, sample_locations, tree_edges, chord_data, 
    track_data, resize_factor, plot_title, full_page_mode, pvalue) {
    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'
    
    if (!full_page_mode) {
        xcrmapscape::xcrmapscape(clonal_prev = clonal_prev, tree_edges = tree_edges, 
            sample_locations = sample_locations, img_ref = img_ref, show_warnings = FALSE, 
            chord_data = chord_data, track_data = track_data, resize_factor = resize_factor, 
            plot_title = plot_title, phylo_stroke_width = "5px", phylo_stroke_color = "#000000", 
            legendTitleHeight = 26, centerSize = 0.6, treeRelativeSize = 0, 
            titleScaleFactor = 28, pvalue = pvalue)
    } else {
        xcrmapscape::xcrmapscape(clonal_prev = clonal_prev, tree_edges = tree_edges, 
            sample_locations = sample_locations, img_ref = img_ref, show_warnings = FALSE, 
            chord_data = chord_data, track_data = track_data, resize_factor = resize_factor, 
            plot_title = plot_title, phylo_stroke_width = "1px", phylo_stroke_color = "#9E9A9A", 
            legendTitleHeight = 16, centerSize = 0.5, treeRelativeSize = 0.33, 
            titleScaleFactor = 40, pvalue = pvalue)
    }
}
intersect_table <- compute_overlap_table(xcr_table, segment_type = segment_type, 
    prevalence_option = "clones", id_type = "condensed_id")
intersect_table$patient1 <- ithi.meta::map_id(intersect_table$sample1, from = "condensed_id", 
    to = "patient_id", db_path)
intersect_table$patient2 <- ithi.meta::map_id(intersect_table$sample2, from = "condensed_id", 
    to = "patient_id", db_path)

intersect_table <- subset(intersect_table, patient1 == patient2)

clonotype_table <- subset(xcr_table, type == segment_type)
clonotype_counts <- clonotype_table %>% group_by(condensed_id, patient_id) %>% 
    summarise(n = n()) %>% plyr::rename(c(condensed_id = "label", n = "len"))
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)
}

export_cydney_inputs <- function(xcr_table, patient_id, mapscape_base_dir = "/Users/alzhang/shahlab/projects/ITH_Immune/paper/results/intermediates/run2/mapscape_postprocessed_HMC", 
    outdir) {
    patient_tmp <- patient_id
    clonotypes_sub <- xcr_table[(xcr_table$type == segment_type) & (xcr_table$patient_id == 
        as.numeric(patient_tmp)), ]
    clonotypes_sub$condensed_id <- factor(clonotypes_sub$condensed_id)
    cross_table <- ithi.xcr::cross_tabulate(clonotypes_sub, id_type = "condensed_id")
    colnames(cross_table) <- str_replace(colnames(cross_table), "^[0-9]+_", 
        "")
    
    bin_cross_table <- cross_table
    bin_cross_table[bin_cross_table > 0] <- 1
    coln <- colnames(cross_table)
    
    cross_summary <- bin_cross_table %>% group_by_(.dots = coln) %>% summarise(n_shared_clonotypes = n())
    
    dir <- file.path(mapscape_base_dir, patient_id)
    
    clonal_prev = read.table(file.path(dir, "clonal_prevalence_table.tsv"), 
        sep = "\t", header = T)
    tree_edges = read.table(file.path(dir, "tree_edges.tsv"), sep = "\t", header = T)
    
    root <- tree_edges$source[!(tree_edges$source %in% tree_edges$target)]
    tree_edges <- subset(tree_edges, source != root)
    clonal_prev <- reformat_andrew_table(clonal_prev, db_path, patient_id)
    # clonal_prev <- subset(clonal_prev, long_sample_id %in% sample_ids)
    
    clonal_prev_short <- subset(clonal_prev, !duplicate, select = c(patient_id, 
        clone_id, clone_idx, condensed_id, site_id, clonal_prev))
    
    if (!dir.exists(outdir)) {
        dir.create(outdir)
        
        clone_file_output <- file.path(outdir, "clone_prevalences.tsv")
        tree_edges_output <- file.path(outdir, "tree_edges.tsv")
        intersect_output <- file.path(outdir, "intersect.tsv")
        
        write.table(clonal_prev_short, file = clone_file_output, sep = "\t", 
            quote = FALSE, row.names = FALSE, col.names = TRUE)
        write.table(tree_edges, file = tree_edges_output, sep = "\t", quote = FALSE, 
            row.names = FALSE, col.names = TRUE)
        write.table(cross_summary, file = intersect_output, sep = "\t", quote = FALSE, 
            row.names = FALSE, col.names = TRUE)
    }
}

Plots

htmltools::tagList(lapply(mapscape_input_directories, function(dir) {
    patient_id <- stringr::str_extract(dir, "[0-9]+$")
    df <- subset(intersect_table, patient1 == patient_id)
    clonal_prev = read.table(file.path(dir, "clonal_prevalence_table.tsv"), 
        sep = "\t", header = T)
    tree_edges = read.table(file.path(dir, "tree_edges.tsv"), sep = "\t", header = T)
    
    root <- tree_edges$source[!(tree_edges$source %in% tree_edges$target)]
    tree_edges <- subset(tree_edges, source != root)
    
    sample_locations = read.table(file.path(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")
    
    clonal_prev <- reformat_andrew_table(clonal_prev, db_path, patient_id)
    sample_locations <- reformat_andrew_table(sample_locations, db_path, patient_id)
    
    # df <- merge(df, subset(andrew_map, select=c(sample_key, sample_id)),
    # by.x=c('sample1'), by.y=c('sample_key')) %>%
    # plyr::rename(c('sample_id'='sample_id1')) df <- merge(df,
    # subset(andrew_map, select=c(sample_key, sample_id)), by.x=c('sample2'),
    # by.y=c('sample_key')) %>% plyr::rename(c('sample_id'='sample_id2'))
    
    clonotype_counts_sub <- clonotype_counts[as.character(clonotype_counts$patient_id) == 
        patient_id, ]
    
    patient_tmp <- patient_id
    
    clonotypes_sub <- xcr_table[(xcr_table$type == segment_type) & (xcr_table$patient_id == 
        as.numeric(patient_tmp)), ]
    clonotypes_sub$condensed_id <- factor(clonotypes_sub$condensed_id)
    cross_table <- ithi.xcr::cross_tabulate(clonotypes_sub, id_type = "condensed_id")
    
    # df$sample1 <- df$sample_id1 df$sample2 <- df$sample_id2
    
    sample_ids <- intersect(clonal_prev$long_sample_id, unique(df$sample1))
    
    if (length(sample_ids) == 0) {
        return(NULL)
    }
    
    df <- subset(df, (sample1 %in% sample_ids) & (sample2 %in% sample_ids))
    df$sample1 <- factor(df$sample1, levels = sample_ids)
    df$sample2 <- factor(df$sample2, levels = sample_ids)
    df <- df[order(df$sample1), ]
    
    ## IF YOU ONLY WANT THE INTERSECTION TO BE SHOWN, JUST SET CLONOTYPE TABLE TO
    ## NULL Otherwise set it to clonotype_counts_sub
    if (show_full_track) {
        res <- ithi.figures::format_xcrcircos_data(df, clonotype_counts = clonotype_counts_sub, 
            cross_table = cross_table)
    } else {
        res <- ithi.figures::format_xcrcircos_data(df, clonotype_counts = NULL)
    }
    chord_data <- res$chords
    track_data <- as.data.frame(res$tracks)
    
    resize_factor <- min(sum(track_data$len)/max(track_data$len) * 1/nrow(track_data), 
        0.9)
    
    clonal_prev <- subset(clonal_prev, long_sample_id %in% sample_ids)
    sample_locations <- subset(sample_locations, sample_id %in% clonal_prev$sample_id)
    
    if (!full_page_mode) {
        plot_title <- paste0("Patient ", patient_id)
    } else {
        plot_title <- ""
    }
    
    pvalue <- subset(stats, patient_id == patient_tmp)$p.value
    
    ## TODO: Extract pvalues from XCR-clone correlation
    
    print(patient_id)
    plot_xcrmapscape(clonal_prev, sample_locations, tree_edges, chord_data = chord_data, 
        track_data = track_data, resize_factor = resize_factor, plot_title = plot_title, 
        full_page_mode = full_page_mode, pvalue = round(pvalue, 3))
}))
[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"
LS0tCnRpdGxlOiAiWENSLU1hcHNjYXBlIHBsb3RzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB0cnVlCnBhcmFtczoKICBybWQ6ICJ4Y3JtYXBzY2FwZS5SbWQiCi0tLQogICAgICAgICAgICAgICAgICAgICAgICBgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMjIyMjIyMjIFNuYWtlbWFrZSBoZWFkZXIgIyMjIyMjIyMKbGlicmFyeShtZXRob2RzKQpTbmFrZW1ha2UgPC0gc2V0Q2xhc3MoCiAgICAiU25ha2VtYWtlIiwKICAgIHNsb3RzID0gYygKICAgICAgICBpbnB1dCA9ICJsaXN0IiwKICAgICAgICBvdXRwdXQgPSAibGlzdCIsCiAgICAgICAgcGFyYW1zID0gImxpc3QiLAogICAgICAgIHdpbGRjYXJkcyA9ICJsaXN0IiwKICAgICAgICB0aHJlYWRzID0gIm51bWVyaWMiLAogICAgICAgIGxvZyA9ICJsaXN0IiwKICAgICAgICByZXNvdXJjZXMgPSAibGlzdCIsCiAgICAgICAgY29uZmlnID0gImxpc3QiLAogICAgICAgIHJ1bGUgPSAiY2hhcmFjdGVyIgogICAgKQopCnNuYWtlbWFrZSA8LSBTbmFrZW1ha2UoCiAgICBpbnB1dCA9IGxpc3QoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8yJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8zJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy80JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy83JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy85JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xMCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTEnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzEyJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xMycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTQnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzE1JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xNicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIveGNyX3RhYmxlLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvdHJlZV9kYXRhLnRzdicsICdSbWQveGNybWFwc2NhcGUuUm1kJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy9SbWQvX3NpdGUueW1sJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9icmFuY2hfZGF0YS50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2Nsb25lX2RhdGEudHN2JywgIm1hcHNjYXBlX2lucHV0cyIgPSBjKCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMScsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvNCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvNycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvOScsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTAnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzExJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xMicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTMnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzE0JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9tYXBzY2FwZV9wb3N0cHJvY2Vzc2VkX0hNQy8xNScsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvbWFwc2NhcGVfcG9zdHByb2Nlc3NlZF9ITUMvMTYnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DLzE3JyksICJ4Y3JfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3hjcl90YWJsZS50c3YnLCAiY2xvbmVfdHJlZV9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvdHJlZV9kYXRhLnRzdicsICJub3RlYm9vayIgPSAnUm1kL3hjcm1hcHNjYXBlLlJtZCcsICJzaXRlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy9SbWQvX3NpdGUueW1sJywgImNsb25lX2JyYW5jaF9sZW5ndGhfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2JyYW5jaF9kYXRhLnRzdicsICJjbG9uZV9wcmV2YWxlbmNlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9jbG9uZV9kYXRhLnRzdicpLAogICAgb3V0cHV0ID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViL3hjcm1hcHNjYXBlX2Z1bGwubmIuaHRtbCcpLAogICAgcGFyYW1zID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL21ldGFkYXRhL2RiL2ltbXVuZV9wcm9qZWN0LnNxbGl0ZTMnLCAnaXRoaS1hbmFseXNpcy1wbG90X3hjcm1hcHNjYXBlcy1mdWxsJywgJ2Z1bGwnLCAnVFJCJywgJ3NocmluaycsICJkYiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL21ldGFkYXRhL2RiL2ltbXVuZV9wcm9qZWN0LnNxbGl0ZTMnLCAibmFtZSIgPSAnaXRoaS1hbmFseXNpcy1wbG90X3hjcm1hcHNjYXBlcy1mdWxsJywgInBhZ2VfbW9kZSIgPSAnc2hyaW5rJywgInNlZ21lbnRfdHlwZSIgPSAnVFJCJywgInRyYWNrX29wdGlvbiIgPSAnZnVsbCcpLAogICAgd2lsZGNhcmRzID0gbGlzdCgpLAogICAgdGhyZWFkcyA9IDEsCiAgICBsb2cgPSBsaXN0KCcvc2hhaGxhYi9hbHpoYW5nL2NsdXN0dG1wL3BhcGVyYW5hbHlzaXMyL3Bsb3RfeGNybWFwc2NhcGVfZnVsbC5sb2cnKSwKICAgIHJlc291cmNlcyA9IGxpc3QoKSwKICAgIGNvbmZpZyA9IGxpc3QoInRpbG1hcHNjYXBlX2ZpbGVzIiA9IGMoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxtYXBzY2FwZS8xLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvdGlsbWFwc2NhcGUvMi5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3RpbG1hcHNjYXBlLzMuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxtYXBzY2FwZS80LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvdGlsbWFwc2NhcGUvNy5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3RpbG1hcHNjYXBlLzkuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxtYXBzY2FwZS8xMC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3RpbG1hcHNjYXBlLzExLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvdGlsbWFwc2NhcGUvMTIuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxtYXBzY2FwZS8xMy5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3RpbG1hcHNjYXBlLzE0LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvdGlsbWFwc2NhcGUvMTUuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxtYXBzY2FwZS8xNi5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3RpbG1hcHNjYXBlLzE3LnN2ZycpLCAiaW1tdW5lX3ZhcmlhYmlsaXR5X25vdGVib29rIiA9ICdSbWQvaW1tdW5lX3ZhcmlhYmlsaXR5LlJtZCcsICJiY3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvSUdIL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJkcml2ZXJfbWFwIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvc3VicHJvamVjdHMvZHJpdmVycy9kYXRhL2dlbmVfbGlzdF9tYXBwZWQuYmVkJywgInhjcl9xY19ub3RlYm9vayIgPSAnUm1kL3JlcGxpY2F0ZXMuUm1kJywgIm5hbm9zdHJpbmdfZGF0YSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbmFub3N0cmluZ19yZXN1bHRzL2l0aF9mdWxsL3FjL2xpbW1hX3F1YW50aWxlL25vcm1hbGl6ZWRfZXhwcmVzc2lvbl92b2FfbGFiZWxzX2ZpbHRlcmVkLnRzdicsICJiZW5jaG1hcmtkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvYmVuY2htYXJrcy9wYXBlcmFuYWx5c2lzMicsICJpY2djX2V4cHJfbWVsdGVkIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9PVkFVX2V4cHJfbWVsdGVkLnRzdicsICJsb2dkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvY2x1c3R0bXAvcGFwZXJhbmFseXNpczInLCAieGNybWFwc2NhcGVfYmNyX3BhdGllbnRfb3JkZXIiID0gYyg5LCA0LCAxMiwgMSwgMTUsIDE0LCAxMSwgMTAsIDIsIDE3LCAxMywgMywgMTYsIDcpLCAiZHJpdmVyX2FuYWx5c2lzX25vdGVib29rIiA9ICdSbWQvZHJpdmVyX2FuYWx5c2lzLlJtZCcsICJrbm93bl9zdWJ0eXBlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvc3VidHlwZXMva25vd25fc3VidHlwZXMudHN2JywgImV4YW1wbGVfYW5ub3RhdGlvbnMiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL2lncGFydGl0aW9uL3J1bjEzL2ZpbmFsX3BhcnRpdGlvbnMvaXRoMl8yL2NsdXN0OS9hbm5vdGF0aW9uc19mbGFnZ2VkLnRzdicsICJ4Y3JfbWFwcGluZ19ub3RlYm9vayIgPSAnUm1kL3hjcl9tYXBwaW5nLlJtZCcsICJqX2RpY3Rpb25hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9zdWJwcm9qZWN0cy9pbW10eXBlci9tZXRhZGF0YS9pbWd0L0hvbW9fc2FwaWVuc19UUkJKLmZhc3RhJywgIm5hbm9zdHJpbmdfc2lnbmF0dXJlX25vdGVib29rIiA9ICdSbWQvbmFub3N0cmluZ19zaWduYXR1cmVzLlJtZCcsICJuYW5vc3RyaW5nX2Fubm90YXRpb25zIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9leHByZXNzaW9uL25hbm9zdHJpbmcvcGFuY2FuY2VyX2Fubm90YXRpb25zLnRzdicsICJ0aHVtYm5haWwyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9leHRyYV9wbG90cy8xNV9ST3YyL3RodW1ibmFpbF9pbWFnZS50aWZmJywgImtub3duX3N1YnR5cGVzX21lcmdlZCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvZXhwcmVzc2lvbi9rbm93bl9zdWJ0eXBlc19tZXJnZWQudHN2JywgIm5vdGVib29rX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViJywgImJjcnBoeWxvX2V4YW1wbGVzX25vdGVib29rIiA9ICdSbWQvYmNyX3BoeWxvX2V4YW1wbGVzLlJtZCcsICJjbG9uYWxfc2FtcGxlcnMiID0gYygnSE1DJywgJ05VVFMnKSwgInByb3BvcnRpb25fc3ViY2xvbmFsX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2l0aC9jb21wbGV0ZS9vbGRfcHJvcG9ydGlvbl9zdWJjbG9uYWwudHN2JywgInRpbHNfZm9yX3ZhcmlhYmlsaXR5IiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJtYXN0ZXJfYnJlYWtwb2ludF9maWxlIiA9ICcvc2hhaGxhYi9hbWNwaGVyc29uL3Byb2plY3RzL2l0aDMvaXRoMy9ub3RlYm9va3MvYmVzcG9rZS9pdGhfYnJlYWtwb2ludHMudHN2JywgIm1tY3RtX3NhbXBsZV9yZXN1bHRfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1zYW1wbGUvb3V0cHV0JywgIm1tY3RtX3BhdGllbnRfYWRfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktcGF0aWVudC1hbmNlc3RyeS9wbG90cy9pdGgtYnktcGF0aWVudC1hbmNlc3RyeV9zbnYtc3Zfc2lnc19tdWx0aXBhbmVsLnBkZicsICJpbW10eXBlcl9tb2RlbHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL2ltbXR5cGVyX3Jlc3VsdHMva2xhcmVuYmVlay9hYV92ai9ncmFkYm9vc3QnLCAidl9kaWN0aW9uYXJ5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvc3VicHJvamVjdHMvaW1tdHlwZXIvbWV0YWRhdGEvaW1ndC9Ib21vX3NhcGllbnNfVFJCVi5mYXN0YScsICJpbWFnZV9zdW1tYXJ5X2ZpbGUyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvaXRoaS95dWFuX2hlY3JfaW1hZ2VfcmVzdWx0c18yLmNzdicsICJwYXRpZW50c19mb3JfY2xvbmFsIiA9IGMoMSwgMiwgMywgNCwgNywgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3KSwgIm1tY3RtX3NhbXBsZV9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1zYW1wbGUvcGxvdHMvaXRoLWJ5LXNhbXBsZV9zbnYtc3Zfc2lnc19tdWx0aXBhbmVsLnBkZicsICJuc2NhdHRlcnMiID0gMSwgInBoZW5vdHlwZV90aHJlc2hvbGQiID0gMC44NSwgInlpbnlpbl9pbWFnZV9zdW1tYXJ5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvaXRoaS95dWFuX2hlY3JfaW1hZ2VfcmVzdWx0cy5jc3YnLCAibGlicmFyeV9zaXplcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L2xpYnJhcnlfc2l6ZXMudHN2JywgImloY194Y3Jfc3RhdHNfbm90ZWJvb2siID0gJ1JtZC9paGNfeGNyX3N0YXRzLlJtZCcsICJpdGhfdGlsX25vdGVib29rIiA9ICdSbWQvaXRoX3RpbF9kZW5zaXRpZXMuUm1kJywgIm11dHNpZ190aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScsICdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScpLCAibWFwc2NhcGVfbm90ZWJvb2siID0gJ1JtZC9tYXBzY2FwZS5SbWQnLCAib3YxMzNfZmJpX3N0YXR1cyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL09WMTMzL292MTMzX2hnc2NfZmJpX2NsYXNzLnRzdicsICJtdWx0aXZpZXdjbHVzdGVyaW5nX25vdGVib29rIiA9ICdSbWQvbXVsdGl2aWV3Y2x1c3RlcmluZy5SbWQnLCAidGFibGVfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMicsICJtbWN0bV9vdl9jb21iaW5lZF9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2NvbWJpbmVkX292X21tY3RtL3Bsb3RzL292X3Nudi1zdl9zaWdzX211bHRpcGFuZWwucGRmJywgImltYWdlX2FuYWx5c2lzX25vdGVib29rIiA9ICdSbWQvaW1hZ2VfYW5hbHlzaXMuUm1kJywgImJjcnBoeWxvX3RpbHR5cGVzIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JywgJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICJQTkdfREVOU0lUWSIgPSAzMDAsICJjbG9uZV9icmFuY2hfbGVuZ3RoX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2l0aC9jb21wbGV0ZS9icmFuY2hfZGF0YS50c3YnLCAiY2xvbmVfcHJldmFsZW5jZV9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9pdGgvY29tcGxldGUvY2xvbmVfZGF0YS50c3YnLCAibW1jdG1fYW5jZXN0cmFsX2Rlc2NlbmRhbnRfcmVzdWx0X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktYW5jZXN0cnktc2FtcGxlL291dHB1dCcsICJ4Y3JfZGlzdGFuY2VfbWV0aG9kIiA9ICdob3JuJywgIm11dGF0aW9uX3NpZ25hdHVyZV9ub3RlYm9vayIgPSAnUm1kL211dGF0aW9uX3NpZ25hdHVyZXMuUm1kJywgImNjc3JpX21hcHNjYXBlX25vdGVib29rIiA9ICdSbWQvbWFwc2NhcGVfY2NzcmkuUm1kJywgIml0aGlfbmV1dHJhbGl0eV9zYW1wbGVzIiA9IGMoJzFfT20xJywgJzFfUk92MScsICcxX1JPdjInLCAnMV9ST3YzJywgJzFfUk92NCcsICcxX1NCd2wxJywgJzEwX1JPdjEnLCAnMTBfUk92MicsICcxMF9ST3YzJywgJzEwX1JPdjQnLCAnMTFfTE92MScsICcxMV9MT3YzJywgJzExX1B2MScsICcxMV9SY3QxJywgJzExX1JjdDInLCAnMTJfTE92MScsICcxMl9MT3YyJywgJzEyX09tMScsICcxMl9PbTInLCAnMTJfUk92MScsICcxM19PbTEnLCAnMTNfUkdybjEnLCAnMTNfUk92MScsICcxM19ST3YyJywgJzEzX1JPdjMnLCAnMTRfQmxkMScsICcxNF9DRFMxJywgJzE0X0xPdjEnLCAnMTRfT20xJywgJzE0X1JPdjEnLCAnMTVfQ0RTMScsICcxNV9MT3YxJywgJzE1X1JPdjEnLCAnMTVfUk92MicsICcxNV9TQndsMScsICcxNl9MT3YxJywgJzE2X0xPdlNmYzEnLCAnMTZfT20xJywgJzE2X1B0bjEnLCAnMTZfUk92MScsICcxN19PbTEnLCAnMTdfT20yJywgJzE3X09tMycsICcxN19PdjEnLCAnMTdfT3YyJywgJzJfT20xJywgJzJfT20yJywgJzJfUk92MScsICcyX1JPdjInLCAnM19BZG54MScsICczX09tMScsICczX1JPdjEnLCAnM19ST3YyJywgJzRfTFB2U3cxJywgJzRfUk92MScsICc0X1JPdjInLCAnNF9ST3YzJywgJzRfUk92NCcsICc3X0Jybk0nLCAnN19MT3YxJywgJzdfUlB2TScsICc5X0xPdjEnLCAnOV9MT3YyJywgJzlfT20xJywgJzlfT20yJywgJzlfUk92MScpLCAidmFyaWFiaWxpdHlfdHlwZSIgPSAnc3RhYmlsaXplJywgImZpZ3VyZV9nYWxsZXJ5X25vdGVib29rIiA9ICdSbWQvZmlndXJlcy5SbWQnLCAibmVvZWRpdGluZ19vdXRkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL25lb2VkaXRpbmcvcnVuNCcsICJ4Y3JtYXBzY2FwZV90Y3JfcGF0aWVudF9vcmRlciIgPSBjKDksIDE1LCAxNywgMSwgMTQsIDIsIDEyLCAzLCA0LCAxMywgMTEsIDE2LCAxMCwgNyksICJ4Y3JfY2xvbmVzX25vdGVib29rIiA9ICdSbWQveGNyX2Nsb25lc19hbmFseXNpcy5SbWQnLCAiZGIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgInRpbHNfZm9yX2NsdXN0ZXIiID0gYygnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknKSwgInRjZ2FfY2xpbmljYWwiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9UQ0dBL3N5bmFwc2VfY2xpbkFsbF9kYXRhLnRzdicsICJQTkdfUVVBTElUWSIgPSAzMDAsICJwcmV2YWxlbmNlX3RocmVzaG9sZCIgPSAwLjAxLCAidGlsX2NsYXNzaWZpZXJfbm90ZWJvb2siID0gJ1JtZC90aWxfY2xhc3NpZmllci5SbWQnLCAic21vb3RoX3R5cGUiID0gJ2dsbScsICJkcml2ZXJfcGF0aWVudHMiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAiZXhhbXBsZV9tc2FfcGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvaWdwYXJ0aXRpb24vcnVuMTMvb2xkL2FsaWdubWVudF9wbG90cy9tc2EvaXRoMl8yL2NsdXN0OS9pbmRlbF9yZXZlcnNlZC5odG1sJywgInNwYXRpYWxfbm90ZWJvb2siID0gJ1JtZC9zcGF0aWFsX2FuYWx5c2lzLlJtZCcsICJjbG9uZV90cmVlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2l0aC9jb21wbGV0ZS90cmVlX2RhdGEudHN2JywgInRjZ2FfZXhwcl9tYXRyaXgiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9UQ0dBL2V4cHJfbWF0cml4X25vcm1hbGl6ZV9zdGFuZGFyZGl6ZV9ub2R1cGxpY2F0ZXMudHN2JywgImRlZmF1bHRfc2FtcGxlciIgPSAnSE1DJywgIml0aF9zdGF0c19maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9pdGgvY29tcGxldGUvY2xvbmFsX21lYXN1cmVzLnRzdicsICJ0aHVtYm5haWwxIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9leHRyYV9wbG90cy8xMV9SY3QyL3RodW1ibmFpbF9pbWFnZS50aWZmJywgInNhZF9ub3RlYm9vayIgPSAnUm1kL3NwZWNpZXNfYWJ1bmRhbmNlX2Rpc3RyaWJ1dGlvbnMuUm1kJywgImljZ2Nfbm9ybWFsaXplZF9yZWFkc19tYXRyaXgiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL09WQVVfZXhwcl9tYXRyaXgudHN2JywgInhjcm1hcHNjYXBlX25vdGVib29rIiA9ICdSbWQveGNybWFwc2NhcGUuUm1kJywgIm1tY3RtX292X2NvbWJpbmVkX3Jlc3VsdF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvY29tYmluZWRfb3ZfbW1jdG0vb3V0cHV0JywgInRleF9yZXNvdXJjZV9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RleF9yZXNvdXJjZXMvcnVuMicsICJpY2djX3NwZWNpbWVuX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL3NwZWNpbWVuLnRzdicsICJpbnRlcm1lZGlhdGVfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjInLCAiaW1hZ2Vfc3VtbWFyeV9maWxlMSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkveXVhbl9oZWNyX2ltYWdlX3Jlc3VsdHMuY3N2JywgInpvb20yIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9leHRyYV9wbG90cy8xN19PbTEvem9vbWVkX2ltYWdlLnRpZmYnLCAidGh1bWJuYWlsMyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvZXh0cmFfcGxvdHMvMTdfT20xL3RodW1ibmFpbF9pbWFnZS50aWZmJywgIndhbmdfZmJpX3N0YXR1cyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL0lDR0MvbmcuMzg0OS1TMTIudHh0JywgIm5ldXRyYWxfb3B0aW9ucyIgPSBjKCdyZXN0cmljdCcsICdmcmVlJyksICJpdGhfc3RhdGlzdGljc19ub3RlYm9vayIgPSAnUm1kL2l0aF9zdGF0aXN0aWNzLlJtZCcsICJjbGFzc2lmaWVyX3R5cGUiID0gJ2tubicsICJpbmRleF9ub3RlYm9vayIgPSAnUm1kL2luZGV4LlJtZCcsICJuZW9hbnRpZ2VuX2VkaXRpbmdfbm90ZWJvb2siID0gJ1JtZC9pbW11bm9lZGl0aW5nLlJtZCcsICJpdGhpX2NsaW5pY2FsX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL2NsaW5pY2FsX3RhYmxlXzIwMTcwODE2XzIudHh0JywgImlncGFydGl0aW9uX291dGRpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvaWdwYXJ0aXRpb24vcnVuMjInLCAic2l0ZV9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvYW5hbHlzaXMvUm1kL19zaXRlLnltbCcsICJ6b29tMSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvZXh0cmFfcGxvdHMvMTFfUmN0Mi96b29tZWRfaW1hZ2UudGlmZicsICJ4Y3JtYXBzY2FwZV9maWxlcyIgPSBjKCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzIuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8zLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzcuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS85LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTAuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzEyLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTMuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzE1LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTYuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xNy5zdmcnKSwgInRjcl9kaXZlcnNpdHkiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL21peGNyL21peGNyX3J1bnMvaXRoXzFfMl8zL21peGNyNS9wb3N0cHJvY2Vzcy9UUkIvcG9zdGZpbHRlcl9kaXZlcnNpdHlfc3RhdHMvZGl2ZXJzaXR5LnN0cmljdC5yZXNhbXBsZWQudHh0JywgIm1hc3Rlcl9jb3B5bnVtYmVyX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL21hc3Rlcl9jb3B5bnVtYmVyX2ZpbGUudHN2JywgImJjcl9jbG9ub3R5cGVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvY2xvbm90eXBlcy9JR0hfY2xvbm90eXBlc19maWx0ZXJlZC50eHQnLCAibW1jdG1fcGF0aWVudF9hbmNlc3RyYWxfZGVzY2VuZGFudF9yZXN1bHRfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1wYXRpZW50LWFuY2VzdHJ5L291dHB1dCcsICJtYXN0ZXJfdmFyaWFudF9maWxlIiA9ICcvc2hhaGxhYi9hbWNwaGVyc29uL3Byb2plY3RzL2l0aDMvaXRoMy9ub3RlYm9va3MvYmVzcG9rZS9pdGhfc252cy50c3YnLCAiY2xvbmFsX2ZpZ3VyZV90ZW1wbGF0ZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL3RlbXBsYXRlcy9jbG9uYWxfZmlndXJlXzRieTQuc3ZnJywgImltbXR5cGVyX2xlbmd0aHMiID0gJzExIDEyIDEzIDE0IDE1IDE2IDE3IDE4JywgImltYWdlX2FuYWx5c2lzX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvaWNyX3NwYXRpYWwvcnVuNS9ob3RzcG90cycsICJpdGhfcHJvamVjdF9yZXN1bHRzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL2l0aDMvZGF0YS9yZXN1bHRzJywgInRjZ2Ffb3ZfYW5ub3RhdGlvbnMiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9UQ0dBL3RjZ2Ffb3ZfYW5ub3RhdGlvbl9zdXAxMy50eHQnLCAiaWhjX3J1bjIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2loYy9jZDc5Y2QxMzhjZDY4L3ZhbGlkYXRlZF9zdGF0c193ZWlnaHRlZC5yZGF0YScsICJiY3JfY2xvbmFsX2ZpZ3VyZV90ZW1wbGF0ZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL3RlbXBsYXRlcy9jbG9uYWxfZmlndXJlXzRieTRfbm9ib3R0b20uc3ZnJywgImljZ2NfbW9sZWN1bGFyX3N1YnR5cGVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9pY2djX3ByaW1hcnlfdHVtb3VyX3N1YnR5cGVzLnRzdicsICJtb2xzdWJ0eXBlX25vdGVib29rIiA9ICdSbWQvbW9sZWN1bGFyX3N1YnR5cGVzLlJtZCcsICJtb2xzdWJ0eXBlX3RpbHR5cGVzIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJtbWN0bV9maW5hbF9wYXRpZW50X3NpZ3Bsb3QiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvaXRoX2J5LXBhdGllbnRfd2l0aC1vdi9wbG90cy9pdGgtYnktcGF0aWVudF9zbnYtc3Zfc2lnc19tdWx0aXBhbmVsLnBkZicsICJtbWN0bV9zYW1wbGVfYWRfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktYW5jZXN0cnktc2FtcGxlL3Bsb3RzL2l0aC1ieS1hbmNlc3RyYWwtc2FtcGxlX3Nudi1zdl9zaWdzX211bHRpcGFuZWwucGRmJywgImloY194Y3JfdGlsdHlwZXMiID0gYygnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknLCAnVF9DRDhfZGVuc2l0eScsICdUX0NENF9kZW5zaXR5JywgJ1RfQ0QyMF9kZW5zaXR5JywgJ1RfUGxhc21hX2RlbnNpdHknKSwgIm1hcHNjYXBlX3RlbXBsYXRlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvYW5hbHlzaXMvdGVtcGxhdGVzL2Nsb25hbF9maWd1cmVfNGJ5NF9ub2JvdHRvbV90aWxjbHVzdGVyLnN2ZycsICJtbWN0bV9maW5hbF9wYXRpZW50X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktcGF0aWVudF93aXRoLW92JywgIml0aF9zdGF0X3R5cGVzIiA9IGMoJ2VudHJvcHknLCAncG9zdHByb2Nlc3NlZF9kaXZlcmdlbmNlJywgJ2NvbWJpbmVkX2l0aF9ub3JtYWxpemVkJywgJ3Byb3BvcnRpb25fc3ViY2xvbmFsJyksICJzcGF0aWFsX3Jlc3VsdF9kaXJzIiA9IGxpc3QoImVwaXRoZWxpYWwiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL3NwYXRzaW0vaXRoMy9hYmMnLCAic3Ryb21hbCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvc3BhdHNpbS9pdGg1L2FiYycpLCAibXZjbHVzdF90aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAiaWNnY19jbGluaWNhbCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL0lDR0MvZG9ub3IuT1YtQVUudHN2JywgInRjcl9jbG9ub3R5cGVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvY2xvbm90eXBlcy9UUkJfY2xvbm90eXBlc19maWx0ZXJlZC50eHQnLCAibWFwc2NhcGVfcGF0aWVudF9vcmRlciIgPSBjKDEsIDIsIDMsIDQsIDcsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNyksICJpaGNfcnVuMSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaWhjL2NkOGNkM2NkMjAvdmFsaWRhdGVkX3N0YXRzX3dlaWdodGVkX25ldy5yZGF0YScsICJiY3JtYXBzY2FwZV9maWxlcyIgPSBjKCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzIuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8zLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzcuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS85LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTAuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzEyLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTMuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzE1LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTYuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xNy5zdmcnKSwgIm5jbHVzdHMiID0gMywgInN1YnR5cGVfbWFya2VyX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vbmFub3N0cmluZy9zdWJ0eXBlX21hcmtlcnMudHN2JywgIm12Y2x1c3RfbmNsdXN0IiA9IDMsICJiY3JwaHlsb19jb3JyZWxhdGlvbnNfbm90ZWJvb2siID0gJ1JtZC9iY3JfcGh5bG9fY29ycmVsYXRpb25zLlJtZCcpLAogICAgcnVsZSA9ICdwbG90X3hjcm1hcHNjYXBlX2Z1bGwnCikKIyMjIyMjIyMgT3JpZ2luYWwgc2NyaXB0ICMjIyMjIyMjIwoKICAgICAgICAgICAgICAgICAgICAgICAgYGBgCgoKYGBge3IgZ2xvYmFsX2NodW5rX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgdGlkeT1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQpgYGAKCmBgYHtyfQojIyBNb2RpZmllZCB2ZXJzaW9uIG9mIG1hcHNjYXBlLiBDYW5ub3QgYmUgcHV0IGludG8gdGhlIHNhbWUgcGFja2FnZSBhcyBzb21lIG9mIHRoZSBjb21wb25lbnRzIGNvbmZsaWN0CmxpYnJhcnkoeGNybWFwc2NhcGUpCmxpYnJhcnkoaHRtbHdpZGdldHMpCgpsaWJyYXJ5KGl0aGkudXRpbHMpCmxvYWRfYmFzZV9saWJzKCkKbGlicmFyeShpdGhpLm1ldGEpCmxpYnJhcnkoaXRoaS5paGMpCmxpYnJhcnkoaXRoaS54Y3IpCmxpYnJhcnkoaXRoaS5maWd1cmVzKQpsaWJyYXJ5KGl0aGkuY2xvbmVzKQpgYGAKCiMjIFBhcmFtZXRlcnMKCmBgYHtyfQpkYl9wYXRoIDwtIHNuYWtlbWFrZUBwYXJhbXMkZGIKCm1hcHNjYXBlX2lucHV0X2RpcmVjdG9yaWVzID0gc25ha2VtYWtlQGlucHV0JG1hcHNjYXBlX2lucHV0cwp4Y3JfdGFibGVfcGF0aCA8LSBzbmFrZW1ha2VAaW5wdXQkeGNyX3RhYmxlCnNob3dfZnVsbF90cmFjayA8LSAoc25ha2VtYWtlQHBhcmFtcyR0cmFja19vcHRpb24gPT0gImZ1bGwiKQpmdWxsX3BhZ2VfbW9kZSA8LSAoc25ha2VtYWtlQHBhcmFtcyRwYWdlX21vZGUgPT0gImZ1bGwiKQpzZWdtZW50X3R5cGUgPC0gc25ha2VtYWtlQHBhcmFtcyRzZWdtZW50X3R5cGUKCmNsb25lX3RyZWVfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkY2xvbmVfdHJlZV9maWxlCmNsb25lX3ByZXZhbGVuY2VfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkY2xvbmVfcHJldmFsZW5jZV9maWxlCmNsb25lX2JyYW5jaF9sZW5ndGhfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkY2xvbmVfYnJhbmNoX2xlbmd0aF9maWxlCmBgYAoKYGBge3J9CmRiIDwtIHNyY19zcWxpdGUoZGJfcGF0aCwgY3JlYXRlPUZBTFNFKQphbmRyZXdfbWFwIDwtIGNvbGxlY3QodGJsKGRiLCAiYW5kcmV3X21hcCIpKQpgYGAKCmBgYHtyfQpkaXN0YW5jZV9tZXRob2QgPC0gImhvcm4iCgp0cmVlX2JyYW5jaF9kYXRhIDwtIHJlYWRfY2xvbmVfdHJlZV9kYXRhKGNsb25lX3RyZWVfZmlsZSwgY2xvbmVfYnJhbmNoX2xlbmd0aF9maWxlLCBjbG9uZV9wcmV2YWxlbmNlX2ZpbGUsIGRiX3BhdGgpCnhjcl90YWJsZSA8LSByZWFkX2Nsb25vdHlwZXMoeGNyX3RhYmxlX3BhdGgsIGR1cGxpY2F0ZXMgPSBGQUxTRSwgZGJfcGF0aCkKYGBgCgoKYGBge3J9CmFubm90YXRpb25fY29sb3VycyA8LSBpdGhpLmZpZ3VyZXM6OmdldF9hbm5vdGF0aW9uX2NvbG91cnMoKQp0Y3Jfc2VnbWVudF90eXBlIDwtICJUUkIiCmJjcl9zZWdtZW50X3R5cGUgPC0gIklHSCIKCnBhdGllbnRzIDwtIHVuaXF1ZSh4Y3JfdGFibGUkcGF0aWVudF9pZCkKCmlkX3R5cGUgPC0gImNvbmRlbnNlZF9pZCIKCmRpc3RzIDwtIGxhcHBseShwYXRpZW50cywgZnVuY3Rpb24ocGF0aWVudCkgewogIHRjcl9jbG9ub3R5cGVzIDwtIHN1YnNldCh4Y3JfdGFibGUsIHR5cGUgPT0gdGNyX3NlZ21lbnRfdHlwZSAmIHBhdGllbnRfaWQgPT0gcGF0aWVudCkKICBiY3JfY2xvbm90eXBlcyA8LSBzdWJzZXQoeGNyX3RhYmxlLCB0eXBlID09IGJjcl9zZWdtZW50X3R5cGUgJiBwYXRpZW50X2lkID09IHBhdGllbnQpCiAgdGNyX2Nyb3NzX3RhYmxlIDwtIGl0aGkueGNyOjpjcm9zc190YWJ1bGF0ZSh0Y3JfY2xvbm90eXBlcywgaWRfdHlwZSA9IGlkX3R5cGUpCiAgYmNyX2Nyb3NzX3RhYmxlIDwtIGl0aGkueGNyOjpjcm9zc190YWJ1bGF0ZShiY3JfY2xvbm90eXBlcywgaWRfdHlwZSA9IGlkX3R5cGUpCiAgCiAgY3Jvc3NfdGFibGVzIDwtIGxpc3QodGNyPXRjcl9jcm9zc190YWJsZSwgYmNyPWJjcl9jcm9zc190YWJsZSkKICAKICBkaXN0YW5jZV9tYXRyaWNlcyA8LSBsYXBwbHkoY3Jvc3NfdGFibGVzLCBmdW5jdGlvbihjcm9zc190YWJsZSkgewogICAgZGlzdG1hdCA8LSBpdGhpLnhjcjo6Y29tcHV0ZV9pbW11bmVfZGlzdGFuY2VfbWF0cml4KGNyb3NzX3RhYmxlLCBtZXRob2QgPSBkaXN0YW5jZV9tZXRob2QpCiAgICBtYXQgPC0gYXMubWF0cml4KGRpc3RtYXQpCiAgICByZXR1cm4obWF0KQogIH0pCiAgcmV0dXJuKGRpc3RhbmNlX21hdHJpY2VzKQp9KQp0Y3JfZGlzdHMgPC0gbGFwcGx5KGRpc3RzLCBmdW5jdGlvbih4KSB4JHRjcikKYmNyX2Rpc3RzIDwtIGxhcHBseShkaXN0cywgZnVuY3Rpb24oeCkgeCRiY3IpCgp4Y3JfZGlzdHMgPC0gdGliYmxlOjp0aWJibGUocGF0aWVudF9pZCA9IHBhdGllbnRzLCB0Y3I9dGNyX2Rpc3RzLCBiY3I9YmNyX2Rpc3RzKQp4Y3JfZGlzdHMkcGF0aWVudF9pZCA8LSBmYWN0b3IoeGNyX2Rpc3RzJHBhdGllbnRfaWQpCnhjcl9kaXN0cyA8LSB4Y3JfZGlzdHNbb3JkZXIoeGNyX2Rpc3RzJHBhdGllbnRfaWQpLF0KCgp0cmVlcyA8LSBsYXBwbHkodHJlZV9icmFuY2hfZGF0YSwgZnVuY3Rpb24oeCkgeCR0cmVlKQpwcmV2YWxlbmNlcyA8LSBwbHlyOjpyYmluZC5maWxsKGxhcHBseSh0cmVlX2JyYW5jaF9kYXRhLCBmdW5jdGlvbih4KSB4JHByZXZhbGVuY2VfZGF0KSkKYnJhbmNoX2xlbmd0aHMgPC0gcGx5cjo6cmJpbmQuZmlsbChsYXBwbHkodHJlZV9icmFuY2hfZGF0YSwgZnVuY3Rpb24oeCkgeCRicmFuY2hfZGF0KSkKCmNjZnMgPC0gaXRoaS5jbG9uZXM6OmNvbXB1dGVfY2NmKHByZXZhbGVuY2VzLCB0cmVlcywgaWRfdHlwZSA9IGlkX3R5cGUpCmNjZnNfbGFiZWxlZCA8LSBtZXJnZShjY2ZzLCBicmFuY2hfbGVuZ3RocywgYnk9YygibGFiZWwiLCAibm9kZSIsICJwYXRpZW50X2lkIikpCgojIyBOZWVkIG5vbi1ub3JtYWxpemVkIGRpc3RhbmNlcwpjbG9uZV9kaXN0cyA8LSBpdGhpLmNsb25lczo6Y2xvbmVfZGlzdGFuY2VzKGNjZnNfbGFiZWxlZCwgbm9ybWFsaXplID0gRkFMU0UsIGlkX3R5cGUgPSAiY29uZGVuc2VkX2lkIikKCmNsb25lX2Rpc3RzJHBhdGllbnRfaWQgPC0gZmFjdG9yKGNsb25lX2Rpc3RzJHBhdGllbnRfaWQpCgp0b3RhbF9kaXN0cyA8LSBpbm5lcl9qb2luKGNsb25lX2Rpc3RzLCB4Y3JfZGlzdHMpCgoKcGFpcndpc2Vfc2ltaWxhcml0aWVzIDwtIHBseXI6OnJiaW5kLmZpbGwobGFwcGx5KDE6bnJvdyh0b3RhbF9kaXN0cyksIGZ1bmN0aW9uKGkpIHsKICBjbG9uZV9kaXN0bWF0IDwtIHRvdGFsX2Rpc3RzW2ksXSRkaXN0X2Nsb25lc193ZWlnaHRlZFtbMV1dCiAgdGNyX2Rpc3RtYXQgPC0gdG90YWxfZGlzdHNbaSxdJHRjcltbMV1dCiAgYmNyX2Rpc3RtYXQgPC0gdG90YWxfZGlzdHNbaSxdJGJjcltbMV1dCiAgCiAgaW5wdXRzIDwtIGxpc3QoY2xvbmVfZGlzdG1hdCwgdGNyX2Rpc3RtYXQsIGJjcl9kaXN0bWF0KQogIG5hbWVzKGlucHV0cykgPC0gYygiY2xvbmVzIiwgInRjciIsICJiY3IiKQogIAogIHBhdGllbnRfaWQgPC0gdG90YWxfZGlzdHNbaSxdJHBhdGllbnRfaWQKICAKICBwYWlyd2lzZV9zaW1zIDwtIGNiaW5kKHBhdGllbnRfaWQ9cGF0aWVudF9pZCwgaXRoaS5zdXBwOjo6Y29tcHV0ZV9vdmVybGFwX3NpbWlsYXJpdGllcyhpbnB1dHMpKQogIHJldHVybihwYWlyd2lzZV9zaW1zKQp9KSkKcGFpcndpc2Vfc2ltaWxhcml0aWVzJHBhdGllbnRfaWQgPC0gZmFjdG9yKHBhaXJ3aXNlX3NpbWlsYXJpdGllcyRwYXRpZW50X2lkKQoKZGlzc2ltaWxhcml0eV9tYXRyaWNlcyA8LSBkcGx5cjo6YmluZF9yb3dzKGxhcHBseSgxOm5yb3codG90YWxfZGlzdHMpLCBmdW5jdGlvbihpKSB7CiAgY2xvbmVfZGlzdG1hdCA8LSB0b3RhbF9kaXN0c1tpLF0kZGlzdF9jbG9uZXNfd2VpZ2h0ZWRbWzFdXQogIHRjcl9kaXN0bWF0IDwtIHRvdGFsX2Rpc3RzW2ksXSR0Y3JbWzFdXQogIGJjcl9kaXN0bWF0IDwtIHRvdGFsX2Rpc3RzW2ksXSRiY3JbWzFdXQogIHBhdGllbnRfaWQgPC0gdG90YWxfZGlzdHNbaSxdJHBhdGllbnRfaWQKICAKICBpbnB1dHMgPC0gbGlzdChjbG9uZV9kaXN0bWF0LCB0Y3JfZGlzdG1hdCwgYmNyX2Rpc3RtYXQpCiAgbmFtZXMoaW5wdXRzKSA8LSBjKCJjbG9uZXMiLCAidGNyIiwgImJjciIpCiAgCiAgbWF0cmljZXNfc3Vic2V0IDwtIGl0aGkuc3VwcDo6OmNvbXB1dGVfb3ZlcmxhcF9tYXRyaWNlcyhpbnB1dHMpCiAgbmFtZXMobWF0cmljZXNfc3Vic2V0KSA8LSBuYW1lcyhpbnB1dHMpCiAgCiAgdGliYmxlKHBhdGllbnRfaWQ9cGF0aWVudF9pZCwgY2xvbmVzPWxpc3QobWF0cmljZXNfc3Vic2V0JGNsb25lcyksIHRjcj1saXN0KG1hdHJpY2VzX3N1YnNldCR0Y3IpLCBiY3I9bGlzdChtYXRyaWNlc19zdWJzZXQkYmNyKSkKfSkpCgpzZWdtZW50X25hbWUgPC0gcGx5cjo6bWFwdmFsdWVzKHNlZ21lbnRfdHlwZSwgZnJvbSA9IGMoIlRSQiIsICJJR0giKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byA9IGMoInRjciIsICJiY3IiKSkKCnN0YXRzIDwtIHBseXI6OnJiaW5kLmZpbGwobGFwcGx5KDE6bnJvdyhkaXNzaW1pbGFyaXR5X21hdHJpY2VzKSwgZnVuY3Rpb24oaSkgewogIHJvdyA8LSBkaXNzaW1pbGFyaXR5X21hdHJpY2VzW2ksXQogIHhjcm1hdCA8LSBkaXNzaW1pbGFyaXR5X21hdHJpY2VzWyxzZWdtZW50X25hbWVdW1sxXV1bW2ldXQogIGNsb25lbWF0IDwtIGRpc3NpbWlsYXJpdHlfbWF0cmljZXMkY2xvbmVzW1tpXV0KICAKICBtYW50dGVzdCA8LSB2ZWdhbjo6bWFudGVsKHhjcm1hdCwgY2xvbmVtYXQsbWV0aG9kID0gInBlYXJzb24iKQogIGRhdGEuZnJhbWUocGF0aWVudF9pZD1yb3ckcGF0aWVudF9pZCwgcC52YWx1ZT1tYW50dGVzdCRzaWduaWYsIHN0YXQ9bWFudHRlc3Qkc3RhdGlzdGljKQp9KSkKYGBgCgpgYGB7cn0KcGxvdF94Y3JtYXBzY2FwZSA8LSBmdW5jdGlvbihjbG9uYWxfcHJldiwgc2FtcGxlX2xvY2F0aW9ucywgdHJlZV9lZGdlcywgY2hvcmRfZGF0YSwgdHJhY2tfZGF0YSwgcmVzaXplX2ZhY3RvciwgcGxvdF90aXRsZSwgZnVsbF9wYWdlX21vZGUsIHB2YWx1ZSkgewogIGltZ19yZWYgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL21pc2NlbGxhbmVvdXMvRkY0RDAwLTAuOC5wbmcnCiAgI2ltZ19yZWYgPSAnfi9zaGFobGFiL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvbWlzY2VsbGFuZW91cy9GRjREMDAtMC44LnBuZycKICAKICBpZiAoIWZ1bGxfcGFnZV9tb2RlKSB7CiAgICB4Y3JtYXBzY2FwZTo6eGNybWFwc2NhcGUoCiAgICAgIGNsb25hbF9wcmV2ID0gY2xvbmFsX3ByZXYsCiAgICAgIHRyZWVfZWRnZXMgPSB0cmVlX2VkZ2VzLAogICAgICBzYW1wbGVfbG9jYXRpb25zID0gc2FtcGxlX2xvY2F0aW9ucywKICAgICAgaW1nX3JlZiA9IGltZ19yZWYsCiAgICAgIHNob3dfd2FybmluZ3MgPSBGQUxTRSwKICAgICAgY2hvcmRfZGF0YSA9IGNob3JkX2RhdGEsCiAgICAgIHRyYWNrX2RhdGEgPSB0cmFja19kYXRhLAogICAgICByZXNpemVfZmFjdG9yID0gcmVzaXplX2ZhY3RvciwKICAgICAgcGxvdF90aXRsZSA9IHBsb3RfdGl0bGUsCiAgICAgIHBoeWxvX3N0cm9rZV93aWR0aCA9ICc1cHgnLAogICAgICBwaHlsb19zdHJva2VfY29sb3IgPSAnIzAwMDAwMCcsCiAgICAgIGxlZ2VuZFRpdGxlSGVpZ2h0ID0gMjYsCiAgICAgIGNlbnRlclNpemUgPSAwLjYsCiAgICAgIHRyZWVSZWxhdGl2ZVNpemUgPSAwLAogICAgICB0aXRsZVNjYWxlRmFjdG9yID0gMjgsCiAgICAgIHB2YWx1ZSA9IHB2YWx1ZSkKICB9IGVsc2UgewogICAgeGNybWFwc2NhcGU6Onhjcm1hcHNjYXBlKAogICAgICBjbG9uYWxfcHJldiA9IGNsb25hbF9wcmV2LAogICAgICB0cmVlX2VkZ2VzID0gdHJlZV9lZGdlcywKICAgICAgc2FtcGxlX2xvY2F0aW9ucyA9IHNhbXBsZV9sb2NhdGlvbnMsCiAgICAgIGltZ19yZWYgPSBpbWdfcmVmLAogICAgICBzaG93X3dhcm5pbmdzID0gRkFMU0UsCiAgICAgIGNob3JkX2RhdGEgPSBjaG9yZF9kYXRhLAogICAgICB0cmFja19kYXRhID0gdHJhY2tfZGF0YSwKICAgICAgcmVzaXplX2ZhY3RvciA9IHJlc2l6ZV9mYWN0b3IsCiAgICAgIHBsb3RfdGl0bGUgPSBwbG90X3RpdGxlLAogICAgICBwaHlsb19zdHJva2Vfd2lkdGggPSAnMXB4JywKICAgICAgcGh5bG9fc3Ryb2tlX2NvbG9yID0gJyM5RTlBOUEnLAogICAgICBsZWdlbmRUaXRsZUhlaWdodCA9IDE2LAogICAgICBjZW50ZXJTaXplID0gMC41LAogICAgICB0cmVlUmVsYXRpdmVTaXplID0gMC4zMywKICAgICAgdGl0bGVTY2FsZUZhY3RvciA9IDQwLCAKICAgICAgcHZhbHVlID0gcHZhbHVlKQogIH0KfQpgYGAKCmBgYHtyfQppbnRlcnNlY3RfdGFibGUgPC0gY29tcHV0ZV9vdmVybGFwX3RhYmxlKHhjcl90YWJsZSwgc2VnbWVudF90eXBlID0gc2VnbWVudF90eXBlLCBwcmV2YWxlbmNlX29wdGlvbiA9ICJjbG9uZXMiLCBpZF90eXBlID0gImNvbmRlbnNlZF9pZCIpCmludGVyc2VjdF90YWJsZSRwYXRpZW50MSA8LSBpdGhpLm1ldGE6Om1hcF9pZChpbnRlcnNlY3RfdGFibGUkc2FtcGxlMSwgZnJvbSA9ICJjb25kZW5zZWRfaWQiLCB0bz0icGF0aWVudF9pZCIsIGRiX3BhdGgpCmludGVyc2VjdF90YWJsZSRwYXRpZW50MiA8LSBpdGhpLm1ldGE6Om1hcF9pZChpbnRlcnNlY3RfdGFibGUkc2FtcGxlMiwgZnJvbSA9ICJjb25kZW5zZWRfaWQiLCB0bz0icGF0aWVudF9pZCIsIGRiX3BhdGgpCgppbnRlcnNlY3RfdGFibGUgPC0gc3Vic2V0KGludGVyc2VjdF90YWJsZSwgcGF0aWVudDEgPT0gcGF0aWVudDIpCgpjbG9ub3R5cGVfdGFibGUgPC0gc3Vic2V0KHhjcl90YWJsZSwgdHlwZSA9PSBzZWdtZW50X3R5cGUpCmNsb25vdHlwZV9jb3VudHMgPC0gY2xvbm90eXBlX3RhYmxlICU+JSBncm91cF9ieShjb25kZW5zZWRfaWQsIHBhdGllbnRfaWQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSBwbHlyOjpyZW5hbWUoYygiY29uZGVuc2VkX2lkIj0ibGFiZWwiLCAibiI9ImxlbiIpKQpgYGAKCmBgYHtyfQpyZWZvcm1hdF9hbmRyZXdfdGFibGUgPC0gZnVuY3Rpb24oZGF0LCBkYl9wYXRoLCBwYXRpZW50X2lkKSB7CiAgZGF0JHBhdGllbnRfaWQgPC0gcGF0aWVudF9pZAogIGRhdCA8LSBzdWJzZXQoZGF0LCAhc2FtcGxlX2lkICVpbiUgYygiUHYyIiwgIlJlYzIiLCAiUmVjMyIpKQogIGRhdCA8LSBkYXQgJT4lIHBseXI6OnJlbmFtZShjKCJzYW1wbGVfaWQiPSJwbG90X2lkIiwgImxvbmdfc2FtcGxlX2lkIj0ic2FtcGxlX2lkIikpCiAgZGF0X3JlbWFwcGVkIDwtIGl0aGkubWV0YTo6cmVtYXBfc2FtcGxlX2lkcyhkYXQsIGRiX3BhdGgpCiAgZGF0X3JlbWFwcGVkJGFiYnJldl9pZCA8LSBzdHJpbmdyOjpzdHJfZXh0cmFjdChkYXRfcmVtYXBwZWQkY29uZGVuc2VkX2lkLCAiW0EtWmEtejAtOV0rJCIpCiAgZGF0X3JlbWFwcGVkIDwtIGRhdF9yZW1hcHBlZCAlPiUgcGx5cjo6cmVuYW1lKGMoInNhbXBsZV9pZCI9Im9sZF9zYW1wbGVfaWQiLCAic2FtcGxlX2tleSI9Imxvbmdfc2FtcGxlX2lkIiwgInBsb3RfaWQiPSJvbGRfcGxvdF9pZCIsICJhYmJyZXZfaWQiPSJzYW1wbGVfaWQiKSkKICBpZiAoImxvY2F0aW9uX2lkIiAlaW4lIGNvbG5hbWVzKGRhdF9yZW1hcHBlZCkpIHsKICAgIGRhdF9yZW1hcHBlZCRsb2NhdGlvbl9pZCA8LSBkYXRfcmVtYXBwZWQkc2FtcGxlX2lkCiAgfQogIHJldHVybihkYXRfcmVtYXBwZWQpCn0KCmV4cG9ydF9jeWRuZXlfaW5wdXRzIDwtIGZ1bmN0aW9uKHhjcl90YWJsZSwgcGF0aWVudF9pZCwgbWFwc2NhcGVfYmFzZV9kaXIgPSAiL1VzZXJzL2Fsemhhbmcvc2hhaGxhYi9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL21hcHNjYXBlX3Bvc3Rwcm9jZXNzZWRfSE1DIiwgb3V0ZGlyKSB7CiAgcGF0aWVudF90bXAgPC0gcGF0aWVudF9pZAogIGNsb25vdHlwZXNfc3ViIDwtIHhjcl90YWJsZVsoeGNyX3RhYmxlJHR5cGUgPT0gc2VnbWVudF90eXBlKSAmICh4Y3JfdGFibGUkcGF0aWVudF9pZCA9PSBhcy5udW1lcmljKHBhdGllbnRfdG1wKSksXQogIGNsb25vdHlwZXNfc3ViJGNvbmRlbnNlZF9pZCA8LSBmYWN0b3IoY2xvbm90eXBlc19zdWIkY29uZGVuc2VkX2lkKQogIGNyb3NzX3RhYmxlIDwtIGl0aGkueGNyOjpjcm9zc190YWJ1bGF0ZShjbG9ub3R5cGVzX3N1YiwgaWRfdHlwZSA9ICJjb25kZW5zZWRfaWQiKQogIGNvbG5hbWVzKGNyb3NzX3RhYmxlKSA8LSBzdHJfcmVwbGFjZShjb2xuYW1lcyhjcm9zc190YWJsZSksICJeWzAtOV0rXyIsICIiKQogIAogIGJpbl9jcm9zc190YWJsZSA8LSBjcm9zc190YWJsZQogIGJpbl9jcm9zc190YWJsZVtiaW5fY3Jvc3NfdGFibGUgPiAwXSA8LSAxCiAgY29sbiA8LSBjb2xuYW1lcyhjcm9zc190YWJsZSkKICAKICBjcm9zc19zdW1tYXJ5IDwtIGJpbl9jcm9zc190YWJsZSAlPiUgZ3JvdXBfYnlfKC5kb3RzID0gY29sbikgJT4lIHN1bW1hcmlzZShuX3NoYXJlZF9jbG9ub3R5cGVzPW4oKSkKICAKICBkaXIgPC0gZmlsZS5wYXRoKG1hcHNjYXBlX2Jhc2VfZGlyLCBwYXRpZW50X2lkKQogIAogIGNsb25hbF9wcmV2ID0gcmVhZC50YWJsZShmaWxlLnBhdGgoZGlyLCAiY2xvbmFsX3ByZXZhbGVuY2VfdGFibGUudHN2IiksIHNlcD0nXHQnLCBoZWFkZXI9VCkKICB0cmVlX2VkZ2VzID0gcmVhZC50YWJsZShmaWxlLnBhdGgoZGlyLCAidHJlZV9lZGdlcy50c3YiKSwgc2VwPSdcdCcsIGhlYWRlcj1UKQogIAogIHJvb3QgPC0gdHJlZV9lZGdlcyRzb3VyY2VbISh0cmVlX2VkZ2VzJHNvdXJjZSAlaW4lIHRyZWVfZWRnZXMkdGFyZ2V0KV0KICB0cmVlX2VkZ2VzIDwtIHN1YnNldCh0cmVlX2VkZ2VzLCBzb3VyY2UgIT0gcm9vdCkKICBjbG9uYWxfcHJldiA8LSByZWZvcm1hdF9hbmRyZXdfdGFibGUoY2xvbmFsX3ByZXYsIGRiX3BhdGgsIHBhdGllbnRfaWQpCiAgI2Nsb25hbF9wcmV2IDwtIHN1YnNldChjbG9uYWxfcHJldiwgbG9uZ19zYW1wbGVfaWQgJWluJSBzYW1wbGVfaWRzKQogIAogIGNsb25hbF9wcmV2X3Nob3J0IDwtIHN1YnNldChjbG9uYWxfcHJldiwgIWR1cGxpY2F0ZSwgc2VsZWN0PWMocGF0aWVudF9pZCwgY2xvbmVfaWQsIGNsb25lX2lkeCwgY29uZGVuc2VkX2lkLCBzaXRlX2lkLCBjbG9uYWxfcHJldikpCiAgCiAgaWYgKCFkaXIuZXhpc3RzKG91dGRpcikpIHsKICAgIGRpci5jcmVhdGUob3V0ZGlyKQogICAgCiAgICBjbG9uZV9maWxlX291dHB1dCA8LSBmaWxlLnBhdGgob3V0ZGlyLCAiY2xvbmVfcHJldmFsZW5jZXMudHN2IikKICAgIHRyZWVfZWRnZXNfb3V0cHV0IDwtIGZpbGUucGF0aChvdXRkaXIsICJ0cmVlX2VkZ2VzLnRzdiIpCiAgICBpbnRlcnNlY3Rfb3V0cHV0IDwtIGZpbGUucGF0aChvdXRkaXIsICJpbnRlcnNlY3QudHN2IikKICAgIAogICAgd3JpdGUudGFibGUoY2xvbmFsX3ByZXZfc2hvcnQsIGZpbGUgPSBjbG9uZV9maWxlX291dHB1dCwgc2VwPSJcdCIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSkKICAgIHdyaXRlLnRhYmxlKHRyZWVfZWRnZXMsIGZpbGUgPSB0cmVlX2VkZ2VzX291dHB1dCwgc2VwPSJcdCIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSkKICAgIHdyaXRlLnRhYmxlKGNyb3NzX3N1bW1hcnksIGZpbGUgPSBpbnRlcnNlY3Rfb3V0cHV0LCBzZXA9Ilx0IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFKQogIH0KfQpgYGAKCiMjIFBsb3RzCgpgYGB7cn0KaHRtbHRvb2xzOjp0YWdMaXN0KGxhcHBseShtYXBzY2FwZV9pbnB1dF9kaXJlY3RvcmllcywgZnVuY3Rpb24oZGlyKSB7CiAgcGF0aWVudF9pZCA8LSBzdHJpbmdyOjpzdHJfZXh0cmFjdChkaXIsICJbMC05XSskIikKICBkZiA8LSBzdWJzZXQoaW50ZXJzZWN0X3RhYmxlLCBwYXRpZW50MSA9PSBwYXRpZW50X2lkKQogIGNsb25hbF9wcmV2ID0gcmVhZC50YWJsZShmaWxlLnBhdGgoZGlyLCAiY2xvbmFsX3ByZXZhbGVuY2VfdGFibGUudHN2IiksIHNlcD0nXHQnLCBoZWFkZXI9VCkKICB0cmVlX2VkZ2VzID0gcmVhZC50YWJsZShmaWxlLnBhdGgoZGlyLCAidHJlZV9lZGdlcy50c3YiKSwgc2VwPSdcdCcsIGhlYWRlcj1UKQogIAogIHJvb3QgPC0gdHJlZV9lZGdlcyRzb3VyY2VbISh0cmVlX2VkZ2VzJHNvdXJjZSAlaW4lIHRyZWVfZWRnZXMkdGFyZ2V0KV0KICB0cmVlX2VkZ2VzIDwtIHN1YnNldCh0cmVlX2VkZ2VzLCBzb3VyY2UgIT0gcm9vdCkKICAKICBzYW1wbGVfbG9jYXRpb25zID0gcmVhZC50YWJsZShmaWxlLnBhdGgoZGlyLCAic2FtcGxlX2xvY2F0aW9ucy50c3YiKSwgc2VwPSdcdCcsIGhlYWRlcj1UKQogIHNhbXBsZV9sb2NhdGlvbnMkbG9uZ19zYW1wbGVfaWQgPC0gZGZfYXNfbWFwKGNsb25hbF9wcmV2LCBzYW1wbGVfbG9jYXRpb25zJHNhbXBsZV9pZCwgZnJvbSA9ICJzYW1wbGVfaWQiLCB0byA9ICJsb25nX3NhbXBsZV9pZCIpCiAgCiAgY2xvbmFsX3ByZXYgPC0gcmVmb3JtYXRfYW5kcmV3X3RhYmxlKGNsb25hbF9wcmV2LCBkYl9wYXRoLCBwYXRpZW50X2lkKQogIHNhbXBsZV9sb2NhdGlvbnMgPC0gcmVmb3JtYXRfYW5kcmV3X3RhYmxlKHNhbXBsZV9sb2NhdGlvbnMsIGRiX3BhdGgsIHBhdGllbnRfaWQpCiAgCiAgI2RmIDwtIG1lcmdlKGRmLCBzdWJzZXQoYW5kcmV3X21hcCwgc2VsZWN0PWMoc2FtcGxlX2tleSwgc2FtcGxlX2lkKSksIGJ5Lng9Yygic2FtcGxlMSIpLCBieS55PWMoInNhbXBsZV9rZXkiKSkgJT4lIHBseXI6OnJlbmFtZShjKCJzYW1wbGVfaWQiPSJzYW1wbGVfaWQxIikpCiAgI2RmIDwtIG1lcmdlKGRmLCBzdWJzZXQoYW5kcmV3X21hcCwgc2VsZWN0PWMoc2FtcGxlX2tleSwgc2FtcGxlX2lkKSksIGJ5Lng9Yygic2FtcGxlMiIpLCBieS55PWMoInNhbXBsZV9rZXkiKSkgJT4lIHBseXI6OnJlbmFtZShjKCJzYW1wbGVfaWQiPSJzYW1wbGVfaWQyIikpCiAgCiAgY2xvbm90eXBlX2NvdW50c19zdWIgPC0gY2xvbm90eXBlX2NvdW50c1thcy5jaGFyYWN0ZXIoY2xvbm90eXBlX2NvdW50cyRwYXRpZW50X2lkKSA9PSBwYXRpZW50X2lkLF0KICAKICBwYXRpZW50X3RtcCA8LSBwYXRpZW50X2lkCiAgCiAgY2xvbm90eXBlc19zdWIgPC0geGNyX3RhYmxlWyh4Y3JfdGFibGUkdHlwZSA9PSBzZWdtZW50X3R5cGUpICYgKHhjcl90YWJsZSRwYXRpZW50X2lkID09IGFzLm51bWVyaWMocGF0aWVudF90bXApKSxdCiAgY2xvbm90eXBlc19zdWIkY29uZGVuc2VkX2lkIDwtIGZhY3RvcihjbG9ub3R5cGVzX3N1YiRjb25kZW5zZWRfaWQpCiAgY3Jvc3NfdGFibGUgPC0gaXRoaS54Y3I6OmNyb3NzX3RhYnVsYXRlKGNsb25vdHlwZXNfc3ViLCBpZF90eXBlID0gImNvbmRlbnNlZF9pZCIpCiAgCiAgI2RmJHNhbXBsZTEgPC0gZGYkc2FtcGxlX2lkMQogICNkZiRzYW1wbGUyIDwtIGRmJHNhbXBsZV9pZDIKICAKICBzYW1wbGVfaWRzIDwtIGludGVyc2VjdChjbG9uYWxfcHJldiRsb25nX3NhbXBsZV9pZCwgdW5pcXVlKGRmJHNhbXBsZTEpKQogIAogIGlmIChsZW5ndGgoc2FtcGxlX2lkcykgPT0gMCkgewogICAgcmV0dXJuKE5VTEwpCiAgfQogIAogIGRmIDwtIHN1YnNldChkZiwgKHNhbXBsZTEgJWluJSBzYW1wbGVfaWRzKSAmIChzYW1wbGUyICVpbiUgc2FtcGxlX2lkcykpCiAgZGYkc2FtcGxlMSA8LSBmYWN0b3IoZGYkc2FtcGxlMSwgbGV2ZWxzID0gc2FtcGxlX2lkcykKICBkZiRzYW1wbGUyIDwtIGZhY3RvcihkZiRzYW1wbGUyLCBsZXZlbHMgPSBzYW1wbGVfaWRzKQogIGRmIDwtIGRmW29yZGVyKGRmJHNhbXBsZTEpLF0KICAKICAjIyBJRiBZT1UgT05MWSBXQU5UIFRIRSBJTlRFUlNFQ1RJT04gVE8gQkUgU0hPV04sIEpVU1QgU0VUIENMT05PVFlQRSBUQUJMRSBUTyBOVUxMCiAgIyMgT3RoZXJ3aXNlIHNldCBpdCB0byBjbG9ub3R5cGVfY291bnRzX3N1YgogIGlmIChzaG93X2Z1bGxfdHJhY2spIHsKICAgIHJlcyA8LSBpdGhpLmZpZ3VyZXM6OmZvcm1hdF94Y3JjaXJjb3NfZGF0YShkZiwgY2xvbm90eXBlX2NvdW50cyA9IGNsb25vdHlwZV9jb3VudHNfc3ViLCBjcm9zc190YWJsZSA9IGNyb3NzX3RhYmxlKQogIH0gZWxzZSB7CiAgICByZXMgPC0gaXRoaS5maWd1cmVzOjpmb3JtYXRfeGNyY2lyY29zX2RhdGEoZGYsIGNsb25vdHlwZV9jb3VudHMgPSBOVUxMKQogIH0KICBjaG9yZF9kYXRhIDwtIHJlcyRjaG9yZHMKICB0cmFja19kYXRhIDwtIGFzLmRhdGEuZnJhbWUocmVzJHRyYWNrcykKICAKICByZXNpemVfZmFjdG9yIDwtIG1pbihzdW0odHJhY2tfZGF0YSRsZW4pL21heCh0cmFja19kYXRhJGxlbikgKiAxL25yb3codHJhY2tfZGF0YSksIDAuOSkKICAKICBjbG9uYWxfcHJldiA8LSBzdWJzZXQoY2xvbmFsX3ByZXYsIGxvbmdfc2FtcGxlX2lkICVpbiUgc2FtcGxlX2lkcykKICBzYW1wbGVfbG9jYXRpb25zIDwtIHN1YnNldChzYW1wbGVfbG9jYXRpb25zLCBzYW1wbGVfaWQgJWluJSBjbG9uYWxfcHJldiRzYW1wbGVfaWQpCiAgCiAgaWYgKCFmdWxsX3BhZ2VfbW9kZSkgewogICAgcGxvdF90aXRsZSA8LSBwYXN0ZTAoIlBhdGllbnQgIiwgcGF0aWVudF9pZCkKICB9IGVsc2UgewogICAgcGxvdF90aXRsZSA8LSAiIgogIH0KICAKICBwdmFsdWUgPC0gc3Vic2V0KHN0YXRzLCBwYXRpZW50X2lkID09IHBhdGllbnRfdG1wKSRwLnZhbHVlCiAgCiAgIyMgVE9ETzogRXh0cmFjdCBwdmFsdWVzIGZyb20gWENSLWNsb25lIGNvcnJlbGF0aW9uCiAgCiAgcHJpbnQocGF0aWVudF9pZCkKICBwbG90X3hjcm1hcHNjYXBlKGNsb25hbF9wcmV2LCBzYW1wbGVfbG9jYXRpb25zLCB0cmVlX2VkZ2VzLCBjaG9yZF9kYXRhID0gY2hvcmRfZGF0YSwgdHJhY2tfZGF0YSA9IHRyYWNrX2RhdGEsIHJlc2l6ZV9mYWN0b3IgPSByZXNpemVfZmFjdG9yLCBwbG90X3RpdGxlID0gcGxvdF90aXRsZSwgZnVsbF9wYWdlX21vZGUgPSBmdWxsX3BhZ2VfbW9kZSwgcHZhbHVlID0gcm91bmQocHZhbHVlLCAzKSkKfSkpCmBgYAo=