library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────── tidyverse 1.3.0 ──
✓ tibble  3.0.6     ✓ purrr   0.3.4
✓ tidyr   1.1.2     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.1
── Conflicts ─────────── tidyverse_conflicts() ──
x purrr::%@%()         masks rlang::%@%()
x purrr::as_function() masks rlang::as_function()
x dplyr::collapse()    masks IRanges::collapse()
x dplyr::combine()     masks Biobase::combine(), BiocGenerics::combine()
x dplyr::count()       masks matrixStats::count()
x dplyr::desc()        masks IRanges::desc()
x tidyr::expand()      masks S4Vectors::expand()
x rlang::exprs()       masks Biobase::exprs()
x dplyr::filter()      masks stats::filter()
x dplyr::first()       masks S4Vectors::first()
x purrr::flatten()     masks rlang::flatten()
x purrr::flatten_chr() masks rlang::flatten_chr()
x purrr::flatten_dbl() masks rlang::flatten_dbl()
x purrr::flatten_int() masks rlang::flatten_int()
x purrr::flatten_lgl() masks rlang::flatten_lgl()
x purrr::flatten_raw() masks rlang::flatten_raw()
x purrr::invoke()      masks rlang::invoke()
x dplyr::lag()         masks stats::lag()
x purrr::list_along()  masks rlang::list_along()
x purrr::modify()      masks rlang::modify()
x ggplot2::Position()  masks BiocGenerics::Position(), base::Position()
x purrr::prepend()     masks rlang::prepend()
x purrr::reduce()      masks GenomicRanges::reduce(), IRanges::reduce()
x dplyr::rename()      masks S4Vectors::rename()
x purrr::simplify()    masks DelayedArray::simplify()
x dplyr::slice()       masks IRanges::slice()
x purrr::splice()      masks rlang::splice()
PrctCellExpringGene <- function(object, genes, group.by = "all"){
  if(group.by == "all"){
    prct = unlist(lapply(genes,calc_helper, object=object))
    result = data.frame(Markers = genes, Cell_proportion = prct)
    return(result)
  }
  
  else{        
    list = SplitObject(object, group.by)
    factors = names(list)
    
    results = lapply(list, PrctCellExpringGene, genes=genes)
    for(i in 1:length(factors)){
      results[[i]]$Feature = factors[i]
    }
    combined = do.call("rbind", results)
    return(combined)
  }
}

calc_helper <- function(object,genes){
  counts = object[['RNA']]@counts
  ncells = ncol(counts)
  if(genes %in% row.names(counts)){
    sum(counts[genes,]>0)/ncells
  }else{return(NA)}
}

part one

genes_10 <- genes_10prct$Markers
Error: object 'genes_10prct' not found

PART TWO

Order slender cells with trajectory analysis

tryp_subset <- subset(tryp, subset = cluster == c("LS A", "LS B"))
longer object length is not a multiple of shorter object lengthlonger object length is not a multiple of shorter object length
tryp_subset <- subset(tryp, subset = cluster == c("LS A", "LS B"))
longer object length is not a multiple of shorter object lengthlonger object length is not a multiple of shorter object length
tryp_subset <- RunUMAP(tryp_subset, dims = 1:8, reduction = "pca", min.dist = 0.1)
12:55:33 UMAP embedding parameters a = 1.577 b = 0.8951
12:55:33 Read 996 rows and found 8 numeric columns
12:55:33 Using Annoy for neighbor search, n_neighbors = 30
12:55:33 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:55:33 Writing NN index file to temp file /var/folders/rd/tjq29jm572b7j_j3fg5k_s340000gn/T//RtmpyjyWIo/file14b5387342dd
12:55:33 Searching Annoy index using 1 thread, search_k = 3000
12:55:33 Annoy recall = 100%
12:55:34 Commencing smooth kNN distance calibration using 1 thread
12:55:36 Initializing from normalized Laplacian + noise
12:55:36 Commencing optimization for 500 epochs, with 40024 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:55:38 Optimization finished
tryp_subset <- subset(tryp, subset = cluster == c("LS A", "LS B"))
longer object length is not a multiple of shorter object lengthlonger object length is not a multiple of shorter object length
tryp_subset <- RunUMAP(tryp_subset, dims = 1:8, reduction = "pca", min.dist = 0.1)
12:55:39 UMAP embedding parameters a = 1.577 b = 0.8951
12:55:39 Read 996 rows and found 8 numeric columns
12:55:39 Using Annoy for neighbor search, n_neighbors = 30
12:55:39 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:55:39 Writing NN index file to temp file /var/folders/rd/tjq29jm572b7j_j3fg5k_s340000gn/T//RtmpyjyWIo/file14b5172ad81f
12:55:39 Searching Annoy index using 1 thread, search_k = 3000
12:55:39 Annoy recall = 100%
12:55:40 Commencing smooth kNN distance calibration using 1 thread
12:55:42 Initializing from normalized Laplacian + noise
12:55:42 Commencing optimization for 500 epochs, with 40024 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:55:45 Optimization finished
DimPlot(tryp_subset, reduction = "umap", label = FALSE,
        label.size = 4,
        pt.size = 0.5, group.by = "Phase", cols = mycolours) + UMAP_theme
Error: Insufficient values in manual scale. 5 needed but only 4 provided.
Run `rlang::last_error()` to see where the error occurred.

Trajectory inference with slingshot

lines(SlingshotDataSet(sce), col = "black", lwd = 2)
Error in plot.xy(xy.coords(x, y), type = type, ...) : 
  plot.new has not been called yet

PART THREE

Conduct peudotime analysis with the cycling cells, in my data the slender clusters

plot(rd, pch=16, col = mycolours[as.factor(tryp_subset$Phase)] ) +
  theme(panel.border = element_blank(), panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), panel.background = element_blank(),
        plot.title = element_text(size = 10, face = "bold"), axis.text.x = element_text(size = 8), axis.title.x = element_text(size = 9), axis.title.y = element_text(size = 9), axis.text.y =  element_text(size = 8))
NULL

plot(rd, pch=16, col = mycolours[as.factor(tryp_subset$Phase)] ) + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = “black”), panel.background = element_blank(), plot.title = element_text(size = 10, face = “bold”), axis.text.x = element_text(size = 8), axis.title.x = element_text(size = 9), axis.title.y = element_text(size = 9), axis.text.y = element_text(size = 8))

lines(x=pcc\(s[order(pcc\)lambda),1], y=pcc\(s[order(pcc\)lambda),2], col=“black”, lwd=2)

gamList <- fitGAM(counts, pseudotime=pseudoT, cellWeights=cWeights, nknots=5)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~39m 14s      
  |+                                                 | 2 % ~28m 37s      
  |++                                                | 3 % ~21m 54s      
  |++                                                | 4 % ~18m 55s      
  |+++                                               | 5 % ~17m 16s      
  |+++                                               | 6 % ~15m 28s      
  |++++                                              | 7 % ~14m 47s      
  |++++                                              | 8 % ~14m 19s      
  |+++++                                             | 9 % ~13m 23s      
  |+++++                                             | 10% ~12m 41s      
  |++++++                                            | 11% ~12m 05s      
  |++++++                                            | 12% ~11m 28s      
  |+++++++                                           | 13% ~11m 19s      
  |+++++++                                           | 14% ~10m 58s      
  |++++++++                                          | 15% ~10m 36s      
  |++++++++                                          | 16% ~10m 19s      
  |+++++++++                                         | 17% ~10m 21s      
  |+++++++++                                         | 18% ~10m 01s      
  |++++++++++                                        | 19% ~10m 53s      
  |++++++++++                                        | 20% ~10m 40s      
  |+++++++++++                                       | 21% ~10m 23s      
  |+++++++++++                                       | 22% ~10m 10s      
  |++++++++++++                                      | 23% ~09m 55s      
  |++++++++++++                                      | 24% ~10m 22s      
  |+++++++++++++                                     | 25% ~10m 22s      
  |+++++++++++++                                     | 26% ~10m 03s      
  |++++++++++++++                                    | 27% ~09m 49s      
  |++++++++++++++                                    | 28% ~09m 31s      
  |+++++++++++++++                                   | 29% ~09m 20s      
  |+++++++++++++++                                   | 30% ~09m 04s      
  |++++++++++++++++                                  | 31% ~08m 50s      
  |++++++++++++++++                                  | 32% ~08m 38s      
  |+++++++++++++++++                                 | 33% ~08m 24s      
  |+++++++++++++++++                                 | 34% ~08m 16s      
  |++++++++++++++++++                                | 35% ~08m 03s      
  |++++++++++++++++++                                | 36% ~07m 52s      
  |+++++++++++++++++++                               | 37% ~07m 46s      
  |+++++++++++++++++++                               | 38% ~07m 34s      
  |++++++++++++++++++++                              | 39% ~07m 23s      
  |++++++++++++++++++++                              | 40% ~07m 11s      
  |+++++++++++++++++++++                             | 41% ~07m 00s      
  |+++++++++++++++++++++                             | 42% ~06m 49s      
  |++++++++++++++++++++++                            | 43% ~06m 39s      
  |++++++++++++++++++++++                            | 44% ~06m 29s      
  |+++++++++++++++++++++++                           | 45% ~06m 27s      
  |+++++++++++++++++++++++                           | 46% ~06m 28s      
  |++++++++++++++++++++++++                          | 47% ~06m 20s      
  |++++++++++++++++++++++++                          | 48% ~06m 10s      
  |+++++++++++++++++++++++++                         | 49% ~05m 60s      
  |+++++++++++++++++++++++++                         | 50% ~05m 51s      
  |++++++++++++++++++++++++++                        | 51% ~05m 41s      
  |++++++++++++++++++++++++++                        | 52% ~05m 32s      
  |+++++++++++++++++++++++++++                       | 53% ~05m 23s      
  |+++++++++++++++++++++++++++                       | 54% ~05m 15s      
  |++++++++++++++++++++++++++++                      | 55% ~05m 33s      
  |++++++++++++++++++++++++++++                      | 56% ~05m 23s      
  |+++++++++++++++++++++++++++++                     | 57% ~05m 17s      
  |+++++++++++++++++++++++++++++                     | 58% ~05m 09s      
  |++++++++++++++++++++++++++++++                    | 59% ~05m 01s      
  |++++++++++++++++++++++++++++++                    | 60% ~04m 52s      
  |+++++++++++++++++++++++++++++++                   | 61% ~04m 44s      
  |+++++++++++++++++++++++++++++++                   | 62% ~04m 41s      
  |++++++++++++++++++++++++++++++++                  | 63% ~04m 35s      
  |++++++++++++++++++++++++++++++++                  | 64% ~04m 26s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~04m 18s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~04m 10s      
  |++++++++++++++++++++++++++++++++++                | 67% ~04m 02s      
  |++++++++++++++++++++++++++++++++++                | 68% ~03m 53s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~03m 45s      
  |+++++++++++++++++++++++++++++++++++               | 70% ~03m 39s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~03m 31s      
  |++++++++++++++++++++++++++++++++++++              | 72% ~03m 29s      
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03m 28s      
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03m 26s      
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03m 23s      
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03m 19s      
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03m 18s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03m 15s      
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03m 05s      
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02m 57s      
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02m 47s      
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02m 37s      
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02m 28s      
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02m 18s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02m 09s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01m 60s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01m 51s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01m 42s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01m 33s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01m 24s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01m 15s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01m 07s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~58s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~50s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~41s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~33s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~25s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=15m 09s

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiQ2VsbCBjeWNsaW5nIGFuYWx5c2lzIG9mIGJsb29kc3RyZWFtIGZvciB0cnlwYW5vc29tYSBicnVjZWkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHByaW5jdXJ2ZSkKbGlicmFyeSh0cmFkZVNlcSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGNsdXN0ZXJFeHBlcmltZW50KQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShkcGx5cikKbGlicmFyeShybGFuZykKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdncmlkZ2VzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzbGluZ3Nob3QpCmxpYnJhcnkoZ2dyaWRnZXMpCgojIFJlcXVpcmUgYmFyIGhlaWdodCBtYXAgZnVuY3Rpb24gZm9yIG9uZSBoZWF0bWFwLCBwcm92aWRlZCBzZXBlcmF0ZWx5IAoKIyBQbG90dGluZyB0aGVtZSBmb3IgZ3JhcGggYXN0aGV0aWNzClVNQVBfdGhlbWUgPC0gdGhlbWUoYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3Qoc2l6ZT0wLjUsbGluZXR5cGU9InNvbGlkIixjb2xvcj0iYmxhY2siKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC4wNSwgdmp1c3QgPSAtOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSAgZWxlbWVudF9ibGFuaygpLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCmBgYHtyfQpQcmN0Q2VsbEV4cHJpbmdHZW5lIDwtIGZ1bmN0aW9uKG9iamVjdCwgZ2VuZXMsIGdyb3VwLmJ5ID0gImFsbCIpewogIGlmKGdyb3VwLmJ5ID09ICJhbGwiKXsKICAgIHByY3QgPSB1bmxpc3QobGFwcGx5KGdlbmVzLGNhbGNfaGVscGVyLCBvYmplY3Q9b2JqZWN0KSkKICAgIHJlc3VsdCA9IGRhdGEuZnJhbWUoTWFya2VycyA9IGdlbmVzLCBDZWxsX3Byb3BvcnRpb24gPSBwcmN0KQogICAgcmV0dXJuKHJlc3VsdCkKICB9CiAgCiAgZWxzZXsgICAgICAgIAogICAgbGlzdCA9IFNwbGl0T2JqZWN0KG9iamVjdCwgZ3JvdXAuYnkpCiAgICBmYWN0b3JzID0gbmFtZXMobGlzdCkKICAgIAogICAgcmVzdWx0cyA9IGxhcHBseShsaXN0LCBQcmN0Q2VsbEV4cHJpbmdHZW5lLCBnZW5lcz1nZW5lcykKICAgIGZvcihpIGluIDE6bGVuZ3RoKGZhY3RvcnMpKXsKICAgICAgcmVzdWx0c1tbaV1dJEZlYXR1cmUgPSBmYWN0b3JzW2ldCiAgICB9CiAgICBjb21iaW5lZCA9IGRvLmNhbGwoInJiaW5kIiwgcmVzdWx0cykKICAgIHJldHVybihjb21iaW5lZCkKICB9Cn0KCmNhbGNfaGVscGVyIDwtIGZ1bmN0aW9uKG9iamVjdCxnZW5lcyl7CiAgY291bnRzID0gb2JqZWN0W1snUk5BJ11dQGNvdW50cwogIG5jZWxscyA9IG5jb2woY291bnRzKQogIGlmKGdlbmVzICVpbiUgcm93Lm5hbWVzKGNvdW50cykpewogICAgc3VtKGNvdW50c1tnZW5lcyxdPjApL25jZWxscwogIH1lbHNle3JldHVybihOQSl9Cn0KYGBgCgojIyMgcGFydCBvbmUgIyMjCgpgYGB7cn0KIyMgQXNzaWduIGNlbGwgY3ljbGUgc3RhZ2UgdXNpbmcgbWFya2VyIGdlbmVzCkNlbGxfY3ljbGVfcmVndWxhdGVkX2dlbmVzIDwtIHJlYWQuZGVsaW0oIkNlbGxfY3ljbGVfcmVndWxhdGVkX2dlbmVzLnR4dCIpCgojIyBDYW4gdXNlIHRoZSBwcm92aWRlZCBpbnRlZ3JhdGVkIHNldXJhdCBvYmplY3Qgb3Igb3V0cHV0IGZyb20gc2NyaXB0ICJXVF9kaWZmZXJlbnRpYXRpb25fc2NSTkEtc2VxIgpsb2FkKCJXVF9pbnRlZ3JhdGVkX3NldXJhdF9vYmplY3QiKQojIFJlbmFtZSBvYmplY3QgCnRyeXAgPC0gV1QuaW50ZWdyYXRlZApEaW1QbG90KHRyeXApCmBgYAoKCmBgYHtyfQojIEdldCBhbGwgdGhlIGdlbmVzIGlkZW50aWZpZWQgaW4gdGhlIGRhdGEgc2V0IHRoYXQgYXJlIGRldGVjdGVkIGluIGF0bGVhc3QgMTAlIG9mIHRoZSBjZWxscwpnZW5lcyA8LSB0cnlwQGFzc2F5c1tbImludGVncmF0ZWQiXV1AZGF0YQpnZW5lcyA8LSBnZW5lc0BEaW1uYW1lc1tbMV1dCmNlbGxfcHJjdCA8LSBQcmN0Q2VsbEV4cHJpbmdHZW5lKHRyeXAsIGdlbmVzID0gZ2VuZXMsIGdyb3VwLmJ5ID0gImFsbCIpCmdlbmVzXzEwcHJjdCA8LSBzdWJzZXQoY2VsbF9wcmN0LCBzdWJzZXQgPSBjZWxsX3ByY3QkQ2VsbF9wcm9wb3J0aW9uID4gMC4xKQpnZW5lc18xMCA8LSBnZW5lc18xMHByY3QkTWFya2VycwoKIyBHZXQgbGlzdCBvZiBtYXJrZXIgZ2VuZXMgcHJlc2VudCBpbiBhdGxlYXN0IDEwJSBjZWxscyBmb3IgZWFjaCBwaGFzZQoKQ2VsbF9jeWNsZV9yZWd1bGF0ZWRfZ2VuZXMgPC0gcmVhZC5kZWxpbSgiUEFUSC9DZWxsX2N5Y2xlX3JlZ3VsYXRlZF9nZW5lcy50eHQiKQoKcy5nZW5lcyA8LSBzdWJzZXQoQ2VsbF9jeWNsZV9yZWd1bGF0ZWRfZ2VuZXMsIENlbGxfY3ljbGVfcmVndWxhdGVkX2dlbmVzJFMucGhhc2UgJWluJSBnZW5lc18xMCkKcy5nZW5lcyA8LSBzLmdlbmVzJFMucGhhc2UKCmcybS5nZW5lcyA8LSBzdWJzZXQoQ2VsbF9jeWNsZV9yZWd1bGF0ZWRfZ2VuZXMsIENlbGxfY3ljbGVfcmVndWxhdGVkX2dlbmVzJEcyLk0ucGhhc2UgJWluJSBnZW5lc18xMCkKZzJtLmdlbmVzIDwtIGcybS5nZW5lcyRHMi5NLnBoYXNlCgplYXJseS5nMS5nZW5lcyA8LSBzdWJzZXQoQ2VsbF9jeWNsZV9yZWd1bGF0ZWRfZ2VuZXMsIENlbGxfY3ljbGVfcmVndWxhdGVkX2dlbmVzJEVhcmx5LkcxICVpbiUgZ2VuZXNfMTApCmVhcmx5LmcxLmdlbmVzIDwtIGVhcmx5LmcxLmdlbmVzJEVhcmx5LkcxCgpsYXRlLmcxLmdlbmVzIDwtIHN1YnNldChDZWxsX2N5Y2xlX3JlZ3VsYXRlZF9nZW5lcywgQ2VsbF9jeWNsZV9yZWd1bGF0ZWRfZ2VuZXMkTGF0ZS5HMSAlaW4lIGdlbmVzXzEwKQpsYXRlLmcxLmdlbmVzIDwtIGxhdGUuZzEuZ2VuZXMkTGF0ZS5HMQoKYGBgCgpgYGB7cn0KIyBDYWxjdWxhdGUgYW4gZXhwcmVzc2lvbiBzY29yZSBmb3IgZWFjaCBwaGFzZSBhbmQgc2F2ZSBpdCB0byB0aGUgc2V1cmF0IG9iamVjdAp0cnlwIDwtIE1ldGFGZWF0dXJlKHRyeXAsIGZlYXR1cmVzID0gcy5nZW5lcywgbWV0YS5uYW1lID0gIlMuYWdncmVnYXRlIikKdHJ5cCA8LSBNZXRhRmVhdHVyZSh0cnlwLCBmZWF0dXJlcyA9IGcybS5nZW5lcywgbWV0YS5uYW1lID0gIkcyTS5hZ2dyZWdhdGUiKQp0cnlwIDwtIE1ldGFGZWF0dXJlKHRyeXAsIGZlYXR1cmVzID0gZWFybHkuZzEuZ2VuZXMsIG1ldGEubmFtZSA9ICJFYXJseS5HMS5hZ2dyZWdhdGUiKQp0cnlwIDwtIE1ldGFGZWF0dXJlKHRyeXAsIGZlYXR1cmVzID0gbGF0ZS5nMS5nZW5lcywgbWV0YS5uYW1lID0gIkxhdGUuRzEuYWdncmVnYXRlIikKCiMgQ3JlYXQgYW5kIGRhdGFmcmFtZSB3aXRoIHRoZSBleHByZXNzaW9uIHNjb3JlIG9mIGVhY2ggY2VsbCBhbmQgZWFjaCBwaGFzZQpkZiA8LSBkYXRhLmZyYW1lKHRyeXBAbWV0YS5kYXRhW1siUy5hZ2dyZWdhdGUiXV0sIHRyeXBAbWV0YS5kYXRhW1siRzJNLmFnZ3JlZ2F0ZSJdXSwgdHJ5cEBtZXRhLmRhdGFbWyJFYXJseS5HMS5hZ2dyZWdhdGUiXV0sIHRyeXBAbWV0YS5kYXRhW1siTGF0ZS5HMS5hZ2dyZWdhdGUiXV0pCmNvbG5hbWVzKGRmKSA8LSBjKCJTIiwgIkcyTSIsICJFYXJseSBHMSIsICJMYXRlIEcxIikKcm93bmFtZXMoZGYpIDwtIHRyeXBAYXNzYXlzW1siaW50ZWdyYXRlZCJdXUBkYXRhQERpbW5hbWVzW1syXV0KIyBGaW5kIHJhdGlvIGJldHdlZW4gdGhlIHNjb3JlIGFuZCBhdmVyYWdlCmRmJFMucmF0aW8gPC0gZGYkUyAvIG1lYW4oZGYkUykKZGYkRzJNLnJhdGlvIDwtIGRmJEcyTSAvIG1lYW4oZGYkRzJNKQpkZiRFYXJseV9HMS5yYXRpbyA8LSBkZiRgRWFybHkgRzFgIC8gbWVhbihkZiRgRWFybHkgRzFgKQpkZiRMYXRlX0cxLnJhdGlvIDwtIGRmJGBMYXRlIEcxYCAvIG1lYW4oZGYkYExhdGUgRzFgKQoKIyBGaW5kIHRoZSB0b3Agc2NvcmluZyBwaGFzZSBvZiBlYWNoIGNlbGwsIHdpdGggRkMgPiAxLjUuIAphc3NpZ25tZW50cyA8LSBhcHBseSgKICBYID0gZGZbLCA1OjhdLAogIE1BUkdJTiA9IDEsCiAgRlVOID0gZnVuY3Rpb24oc2NvcmVzLCBmaXJzdCA9ICdTJywgc2Vjb25kID0gJ0cyTScsIHRoaXJkID0gIkVhcmx5IEcxIiwgZm91cnRoID0gIkxhdGUgRzEiLCBudWxsID0gJ05vbi1jeWNsaW5nJykgewogICAgaWYgKGFsbChzY29yZXMgPCAxLjUpKSB7CiAgICAgIHJldHVybihudWxsKQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxlbmd0aCh3aGljaCh4ID0gc2NvcmVzID09IG1heChzY29yZXMpKSkgPiAxKSB7CiAgICAgICAgcmV0dXJuKCdVbmRlY2lkZWQnKQogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybihjKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3VydGgpW3doaWNoKHggPSBzY29yZXMgPT0gbWF4KHNjb3JlcykpXSkKICAgICAgfQogICAgfQogIH0gICAgCikKCmRmJFBoYXNlIDwtIGFzc2lnbm1lbnRzCmRmJENsdXN0ZXIgPC0gdHJ5cEBhY3RpdmUuaWRlbnQKCmhlYWQoZGYpCgojd3JpdGUuY3N2KGRmLCBmaWxlID0gIkNlbGxfY3ljbGVfcGhhc2Vfc2NvcmVzLmNzdiIpCgpgYGAKCmBgYHtyfQpteWNvbG91cnMgPC0gYygiI2Y4NzY2ZCIsICIjN2NhZTAwIiwgIiMwMWJmYzQiLCAiZ3JleSIsICIjYzc3Y2ZmIikKdHJ5cCRQaGFzZSA8LSBhcy52ZWN0b3IoYXNzaWdubWVudHMpCnAgPC0gRGltUGxvdChvYmplY3QgPSB0cnlwLCBncm91cC5ieSA9ICJQaGFzZSIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgcHQuc2l6ZSA9IDAuNSwgY29scyA9IG15Y29sb3VycykgKyBVTUFQX3RoZW1lCnBbWzFdXSRsYXllcnNbWzFdXSRhZXNfcGFyYW1zJGFscGhhID0gMC44CnBbWzFdXSRsYXllcnNbWzFdXSRhZXNfcGFyYW1zJHNoYXBlID0gMTYKcAoKI3BkZihmaWxlID0gImN5Y2xlX1dUX3VtYXAucGRmIiwgd2lkdGggPSAzLjcsIGhlaWdodCA9IDIuNSkKI3AKI2Rldi5vZmYoKQpgYGAKCmBgYHtyfQoKY2VsbF9wcm9wb3J0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUodHJ5cCRQaGFzZSwgdHJ5cEBhY3RpdmUuaWRlbnQpLCBtYXJnaW4gPSAyKSkKd3JpdGUuY3N2KGNlbGxfcHJvcG9ydGlvbnMsIGZpbGUgPSAiY2VsbF9wcm9wb3J0aW9uc19waGFzZV9tdXRhbnRfaW50ZWdyYXRpb25fdGVzdGluZ19yZXBsaWNhdGUuY3N2IikKCmdncGxvdChkYXRhPWNlbGxfcHJvcG9ydGlvbnMsIGFlcyh4PWNlbGxfcHJvcG9ydGlvbnMkVmFyMiwgeT1jZWxsX3Byb3BvcnRpb25zJEZyZXEsIGZpbGw9Y2VsbF9wcm9wb3J0aW9ucyRWYXIxKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGNvbG9yPSJibGFjayIpICsgbGFicyh4PSJzYW1wbGUiLCB5PSJQcm9wb3J0aW9uIG9mIENlbGxzIiwgZmlsbD0iQ2x1c3RlciIpCgoKYGBgCgpgYGB7cn0KCiMjIEhlYXRtYXAgZm9yIGN5Y2xpbmcgZ2VuZXMKCmN5Y2xpbmdfZ2VuZXMgPC0gYyhhcy5jaGFyYWN0ZXIoZWFybHkuZzEuZ2VuZXMpLCBhcy5jaGFyYWN0ZXIobGF0ZS5nMS5nZW5lcyksIGFzLmNoYXJhY3RlcihzLmdlbmVzKSwgYXMuY2hhcmFjdGVyKGcybS5nZW5lcykpCmRmX29yZGVyIDwtIGZhY3RvcihkZiRQaGFzZSwgbGV2ZWxzID0gYygiRWFybHkgRzEiLCAiTGF0ZSBHMSIsICJTIiwgIkcyTSIsICJOb24tY3ljbGluZyIpKQoKZGYgPC0gZGZbb3JkZXIoZGYkQ2x1c3RlciwgZGZfb3JkZXIpLCBdCgpjZWxsX29yZGVyIDwtIHJvd25hbWVzKGRmKQpsZXZlbHModHJ5cCRQaGFzZSkgPC0gYygiRWFybHkgRzEiLCAiTGF0ZSBHMSIsICJTIiwgIkcyTSIsICJOb24tY3ljbGluZyIpCgojIyBGdW5jdGlvbiBpbiBzZXBlcmF0ZSBmaWxlIApwIDwtIERvTXVsdGlCYXJIZWF0bWFwKHRyeXAsIGZlYXR1cmVzID0gY3ljbGluZ19nZW5lcywgbGFiZWwgPSBGQUxTRSwgZHJhdy5saW5lcyA9IFRSVUUsIGFzc2F5ID0gImludGVncmF0ZWQiLCBhZGRpdGlvbmFsLmdyb3VwLmJ5ID0gIlBoYXNlIikKcAoKI3BkZihmaWxlID0gIkhlYXRtYXBfV1RfaW50X2N5Y2xpbmdfZ2VuZXNfYmFyLnBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNikKI3AKI2Rldi5vZmYoKQoKYGBgCgojIyMjIyMgUEFSVCBUV08gIyMjIyMjIwoKIyBPcmRlciBzbGVuZGVyIGNlbGxzIHdpdGggdHJhamVjdG9yeSBhbmFseXNpcwoKYGBge3J9CnRyeXBAbWV0YS5kYXRhW1siY2x1c3RlciJdXSA8LSBhcy5jaGFyYWN0ZXIodHJ5cEBhY3RpdmUuaWRlbnQpCgp0cnlwX3N1YnNldCA8LSBzdWJzZXQodHJ5cCwgc3Vic2V0ID0gY2x1c3RlciA9PSBjKCJMUyBBIiwgIkxTIEIiKSkKCnRyeXBfc3Vic2V0IDwtIFJ1blVNQVAodHJ5cF9zdWJzZXQsIGRpbXMgPSAxOjgsIHJlZHVjdGlvbiA9ICJwY2EiLCBtaW4uZGlzdCA9IDAuMSkKCkRpbVBsb3QodHJ5cF9zdWJzZXQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBGQUxTRSwKICAgICAgICBsYWJlbC5zaXplID0gNCwKICAgICAgICBwdC5zaXplID0gMC41LCBncm91cC5ieSA9ICJQaGFzZSIsIGNvbHMgPSBteWNvbG91cnMpICsgVU1BUF90aGVtZQpgYGAKCiMjIyBUcmFqZWN0b3J5IGluZmVyZW5jZSB3aXRoIHNsaW5nc2hvdAoKYGBge3J9CiMgY29udmVydCB0byBzY2UKc2NlIDwtIGFzLlNpbmdsZUNlbGxFeHBlcmltZW50KHRyeXBfc3Vic2V0LCBhc3NheSA9ICJpbnRlZ3JhdGVkIikKCiMgUnVuIHNsaW5nc2hvdCwgc2V0dGluZyB0aGUgc3RhcnRpbmcgY2x1c3RlcgpzY2UgPC0gc2xpbmdzaG90KHNjZSwgcmVkdWNlZERpbSA9ICdVTUFQJywgY2x1c3RlckxhYmVscyA9IHNjZUBjb2xEYXRhQGxpc3REYXRhW1siUGhhc2UiXV0sIHN0YXJ0LmNsdXMgPSAiTGF0ZSBHMSIsIGVuZC5jbHVzID0gYygiTm9uLWN5Y2xpbmciKSwgc2hyaW5rID0gMSkKCiMjIFBsb3RzCnNjZSRQaGFzZSA8LSBhcy5mYWN0b3Ioc2NlJFBoYXNlKQojcGRmKGZpbGUgPSAiV1Rfc2xlbmRlcl9waGFzZV91bWFwLnBkZiIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0LjUpCnBsb3QocmVkdWNlZERpbXMoc2NlKSRVTUFQLCBjb2wgPSBteWNvbG91cnNbc2NlJFBoYXNlXSwgcGNoID0gMTYsIGNleCA9IDAuNSwgYnR5PSdsJywgYXhlcyA9IEZBTFNFLCBhbm4gPSBGQUxTRSkgKyBsaW5lcyhTbGluZ3Nob3REYXRhU2V0KHNjZSksIGNvbCA9ICJibGFjayIsIGx3ZCA9IDIpCiNkZXYub2ZmKCkgICAKCgpgYGAKCgpgYGB7cn0KClBzZXVkb3RpbWUgPC1zY2Ukc2xpbmdQc2V1ZG90aW1lXzEgCmRmMiA8LSBkYXRhLmZyYW1lKHRyeXBfc3Vic2V0QG1ldGEuZGF0YVtbIlMuYWdncmVnYXRlIl1dLCB0cnlwX3N1YnNldEBtZXRhLmRhdGFbWyJHMk0uYWdncmVnYXRlIl1dLCB0cnlwX3N1YnNldEBtZXRhLmRhdGFbWyJFYXJseS5HMS5hZ2dyZWdhdGUiXV0sIHRyeXBfc3Vic2V0QG1ldGEuZGF0YVtbIkxhdGUuRzEuYWdncmVnYXRlIl1dKQpjb2xuYW1lcyhkZjIpIDwtIGMoIlMiLCAiRzJNIiwgIkVhcmx5IEcxIiwgIkxhdGUgRzEiKQpyb3duYW1lcyhkZjIpIDwtIHRyeXBfc3Vic2V0QGFzc2F5c1tbImludGVncmF0ZWQiXV1AZGF0YUBEaW1uYW1lc1tbMl1dCgpkZjIkUGhhc2UgPC0gdHJ5cF9zdWJzZXQkUGhhc2UKZGYyJFBzZXVkb3RpbWUgPC0gc2NlJHNsaW5nUHNldWRvdGltZV8xIAoKZGYyIDwtIGRmMiAlPiUKICBtdXRhdGUoUGhhc2U9IGZjdF9yZWxldmVsKFBoYXNlLCBsZXZlbHMgPSAiTm9uLWN5Y2xpbmciLCAiRWFybHkgRzEiLCAgIkcyTSIsICJTIiwgIkxhdGUgRzEiKSkKZ2dwbG90KGRmMiwgYWVzKFBzZXVkb3RpbWUsIFBoYXNlLCBmaWxsID0gUGhhc2UpKSArIGdlb21fZGVuc2l0eV9yaWRnZXMoKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5IiwgIiNmODc2NmQiLCAiIzdjYWUwMCIsICIjYzc3Y2ZmIiwgIiMwMWJmYzQiKSkgKyB0aGVtZV9idygpICsKICB5bGFiKCJOdW1iZXIgb2YgY2VsbHMiKSArIE5vTGVnZW5kKCkKCgpgYGAKCgojIyMjIyMjIFBBUlQgVEhSRUUgIyMjIyMjIwoKIyMgQ29uZHVjdCBwZXVkb3RpbWUgYW5hbHlzaXMgd2l0aCB0aGUgY3ljbGluZyBjZWxscywgaW4gbXkgZGF0YSB0aGUgc2xlbmRlciBjbHVzdGVycwoKYGBge3J9CiMjIENvbmR1Y3QgcGV1ZG90aW1lIGFuYWx5c2lzIHdpdGggdGhlIGN5Y2xpbmcgY2VsbHMsIGluIG15IGRhdGEgdGhlIHNsZW5kZXIgY2x1c3RlcnMKCnRyeXBfc3Vic2V0IDwtIHN1YnNldCh0cnlwX3N1YnNldCwgc3Vic2V0ID0gUGhhc2UgIT0gYygiTm9uLWN5Y2xpbmciKSkKCiMgRmluZCB0b3AgdmFyaWFibGUgZ2VuZXMgZm9yIHNsZW5kZXJzIG9ubHkKdHJ5cF9zdWJzZXQgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXModHJ5cF9zdWJzZXQsIG5mZWF0dXJlcyA9IDIwMDAsIGFzc2F5ID0gImludGVncmF0ZWQiKQpzbGVuZGVyX3ZhcmlhYmxlX2dlbmVzIDwtIHRyeXBfc3Vic2V0QGFzc2F5c1tbImludGVncmF0ZWQiXV1AdmFyLmZlYXR1cmVzCndyaXRlLmNzdihzbGVuZGVyX3ZhcmlhYmxlX2dlbmVzLCBmaWxlID0gInNsZW5kZXJfdmFyaWFibGVfZ2VuZXMuY3N2IikKCiMgUmVwZWF0IFBDQSBhbmFseXNpcyB3aXRoIHRoZXNlIHZhcmlhYmxlIGdlbmVzCnRyeXBfc3Vic2V0ICA8LSBSdW5QQ0EodHJ5cF9zdWJzZXQsIHZlcmJvc2UgPSBGQUxTRSkKCnRyeXBfc3Vic2V0IDwtIFJ1blVNQVAodHJ5cF9zdWJzZXQsIGRpbXMgPSAxOjEyLCByZWR1Y3Rpb24gPSAicGNhIiwgbWluLmRpc3QgPSAwLjEpCm15Y29sb3VycyA8LSBjKCIjZjg3NjZkIiwgIiM3Y2FlMDAiLCAiIzAxYmZjNCIsICIjYzc3Y2ZmIikKCnAgPC0gRGltUGxvdCh0cnlwX3N1YnNldCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IEZBTFNFLAogICAgICAgIGxhYmVsLnNpemUgPSA0LAogICAgICAgIHB0LnNpemUgPSAwLjUsIGdyb3VwLmJ5ID0gIlBoYXNlIiwgY29scyA9IG15Y29sb3VycykgKyBVTUFQX3RoZW1lCnAKCiNwZGYoZmlsZSA9ICJVTUFQX3NsZW5kZXJfY3ljbGluZ19zdWJzZXRfcGhhc2UucGRmIiwgd2lkdGggPSAyLjIsIGhlaWdodCA9IDIpCiNwCiNkZXYub2ZmKCkKCmBgYAoKCgpgYGB7cn0KCiMjIEdldCBVTUFQIGRpbXMKcmQgPC0gdHJ5cF9zdWJzZXRAcmVkdWN0aW9uc1tbInVtYXAiXV1AY2VsbC5lbWJlZGRpbmdzCgpwbG90KHJkLCBwY2g9MTYsIGNvbCA9IG15Y29sb3Vyc1thcy5mYWN0b3IodHJ5cF9zdWJzZXQkUGhhc2UpXSApICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBheGlzLnRleHQueSA9ICBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQoKIyBEcmF3IGEgc2VwZXJhdGUgY3VydmUgZm9yIHRyYWplY3RvcnkgaW5mZXJlbmNlIApwY2MgPC0gcHJpbmNpcGFsX2N1cnZlKHJkLCBzbW9vdGhlcj0icGVyaW9kaWNfbG93ZXNzIikKI2FkZCBsaW5lIHRvIHBsb3QKbGluZXMoeD1wY2Mkc1tvcmRlcihwY2MkbGFtYmRhKSwxXSwgeT1wY2Mkc1tvcmRlcihwY2MkbGFtYmRhKSwyXSwgY29sPSJibGFjayIsIGx3ZD0yKQoKCgpgYGAKCnBsb3QocmQsIHBjaD0xNiwgY29sID0gbXljb2xvdXJzW2FzLmZhY3Rvcih0cnlwX3N1YnNldCRQaGFzZSldICkgKwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIGF4aXMudGV4dC55ID0gIGVsZW1lbnRfdGV4dChzaXplID0gOCkpCgpsaW5lcyh4PXBjYyRzW29yZGVyKHBjYyRsYW1iZGEpLDFdLCB5PXBjYyRzW29yZGVyKHBjYyRsYW1iZGEpLDJdLCBjb2w9ImJsYWNrIiwgbHdkPTIpCgoKYGBge3J9CmNvbG9ycyA8LSByZXYoY29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKDExLCdTcGVjdHJhbCcpWy02XSkoMTAwKSkKcGxvdGNvbCA8LSBjb2xvcnNbY3V0KHBjYyRsYW1iZGEsIGJyZWFrcz0xMDApXQoKZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHJkKQoKZGF0YSRwc2V1ZG90aW1lIDwtIHBjYyRsYW1iZGEKcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBVTUFQXzEsIHkgPSBVTUFQXzIsIGNvbG9yID0gcHNldWRvdGltZSkpICsgZ2VvbV9wb2ludChzaXplID0gMSkgKyBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9ycykgKwogIGdlb21fcGF0aCh4PXBjYyRzW29yZGVyKHBjYyRsYW1iZGEpLDFdLCB5PXBjYyRzW29yZGVyKHBjYyRsYW1iZGEpLDJdLCBjb2xvciA9ICJibGFjayIsIGx3ZCA9IDEpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIiksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgYXhpcy50ZXh0LnkgPSAgZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKCnAKCiNwZGYoZmlsZSA9ICJVTUFQX2N5Y2xpbmdfc2xlbmRlcl9wc2V1ZG90aW1lX3ByaW5jdXJlLnBkZiIsIHdpZHRoID0gMy4xLCBoZWlnaHQgPSAyKQojcAojZGV2Lm9mZigpICAgICAKYGBgCgpgYGB7cn0KIyBmaXQgc21vb3RoZXJzIG9uIHJhdyBkYXRhCm5Qb2ludHNDbHVzIDwtIDUwCmNvdW50cyA8LSBhcy5tYXRyaXgodHJ5cF9zdWJzZXRAYXNzYXlzW1siUk5BIl1dQGNvdW50cykKY1dlaWdodHMgPC0gcmVwKDEsbmNvbChjb3VudHMpKQpwc2V1ZG9UIDwtIG1hdHJpeChwY2MkbGFtYmRhLG5yb3c9bmNvbChjb3VudHMpLG5jb2w9MSkKZ2FtTGlzdCA8LSBmaXRHQU0oY291bnRzLCBwc2V1ZG90aW1lPXBzZXVkb1QsIGNlbGxXZWlnaHRzPWNXZWlnaHRzLCBua25vdHM9NSkKc2F2ZShnYW1MaXN0LCBmaWxlID0gInNsZW5kZXJzX0dBTSIpCmBgYAoKCmBgYHtyfQojIFRlc3QgZm9yIGFzc29jaWF0aW9uIG9mIGV4cHJlc3Npb24gd2l0aCB0aGUgdHJhamVjdG9yeQphc3NvY1Rlc3RSZXNfY2VsbEN5Y2xlIDwtIGFzc29jaWF0aW9uVGVzdChnYW1MaXN0KQphc3NvYy5nZW5lcyA8LSBzdWJzZXQoYXNzb2NUZXN0UmVzX2NlbGxDeWNsZSwgcHZhbHVlIDwgMC4wNSkKYXNzb2MuZ2VuZXMKCmFzc29jLmdlbmVzIDwtIHN1YnNldChhc3NvYy5nZW5lcywgbWVhbkxvZ0ZDID4gMC4zMDEpCmFzc29jLmdlbmVzCmFzc29jLmdlbmVzIDwtIHJvd25hbWVzKGFzc29jLmdlbmVzKQojd3JpdGUuY3N2KGFzc29jLmdlbmVzLCBmaWxlID0gImNjX2Fzc29fZ2VuZXMuY3N2IikKI3dyaXRlLmNzdihhc3NvY1Rlc3RSZXNfY2VsbEN5Y2xlLCBmaWxlID0gImFzc29jVGVzdFJlc19jZWxsQ3ljbGUuY3N2IikKYGBgCgpgYGB7cn0KIyBBZGQgcGhhc2UgaW5mbyB0byBvYmplY3QKZ2FtTGlzdCRwaGFzZSA8LSB0cnlwX3N1YnNldCRQaGFzZQoKI3BkZihmaWxlID0gIkNZQzhfY2VsbF9jeWNsZV9zbW9vdGgucGRmIiwgd2lkdGggPSAxLjgsIGhlaWdodCA9IDEuNSkKcGxvdFNtb290aGVycyhnYW1MaXN0LCBjb3VudHMsIGdlbmUgPSAiVGJydWNlaS0tLVRiOTI3LjcuMTU5MCIsIGx3ZCA9IDAuNzUsIHNhbXBsZSA9IDEsIGFscGhhID0gMC41LCBwb2ludENvbCA9ICJwaGFzZSIpICsKICBsYWJzKHRpdGxlID0gIkNZQzgiKSArIE5vTGVnZW5kKCkgKyAKICBzY2FsZV94X3JldmVyc2UoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJib2xkIiksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgYXhpcy50ZXh0LnkgPSAgZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKI2Rldi5vZmYoKQpgYGAKCmBgYHtyfQoKbGlicmFyeShDb21wbGV4SGVhdG1hcCkKY2x1c1BhdF9zbGVuZGVyIDwtIGNsdXN0ZXJFeHByZXNzaW9uUGF0dGVybnMoZ2FtTGlzdCwgblBvaW50cyA9IG5Qb2ludHNDbHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBhc3NvYy5nZW5lcykKCiNFeHRyYWN0IGxpbmVhZ2UgZGF0YQp5aGF0X2xpbjEgPC0gYXMuZGF0YS5mcmFtZShjbHVzUGF0X3NsZW5kZXIkeWhhdFNjYWxlZCkKeWhhdF9saW4xIDwtIHloYXRfbGluMVsgLDE6NTBdCmNvbG5hbWVzKHloYXRfbGluMSkgPC0gc3ViKCJsMTp0IiwgIiIsIGNvbG5hbWVzKHloYXRfbGluMSkpCnloYXRfbGluMSA8LSB5aGF0X2xpbjFbIG9yZGVyKHJvdy5uYW1lcyh5aGF0X2xpbjEpKSwgXQp5aGF0X2xpbjEgPC15aGF0X2xpbjFbICwgb3JkZXIoc2VxX2xlbihuY29sKHloYXRfbGluMSkpKV0KeWhhdF9saW4xJHBvc2l0aW9uIDwtIGNvbG5hbWVzKHloYXRfbGluMSlbYXBwbHkoeWhhdF9saW4xLDEsd2hpY2gubWF4KV0KeWhhdF9saW4xIDwtIHloYXRfbGluMVtvcmRlcih5aGF0X2xpbjEkcG9zaXRpb24pLCBdCmRhdGFfY2VsbCA8LSBhcy5tYXRyaXgoeWhhdF9saW4xWywgMTo1MF0pCgojTm90ZSBhbm5vdGF0aW9ucyB3ZXJlIGdlbmVyYXRlZCBtYW51YWwgaW4gZXhjZWwKI2hhMiA8LSByb3dBbm5vdGF0aW9uKGdlbmVzID0gYW5ub19tYXJrKGF0ID0gQ0NnZW5lcyRQb3NpdGlvbiwgbGFiZWxzID0gQ0NnZW5lcyROYW1lLCBzaWRlID0gImxlZnQiKSkKCmNvbG9ycyA8LSBzZXROYW1lcyhjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoMTEsJ1NwZWN0cmFsJylbLTZdKSg1MCksIDE6NTApCmhhIDwtIEhlYXRtYXBBbm5vdGF0aW9uKHBzZXVkb3RpbWUgPSAxOjUwLCBjb2wgPSBsaXN0KHBzZXVkb3RpbWUgPSBjb2xvcnMpLCAgc2hvd19sZWdlbmQgPSBGQUxTRSkKI3BkZihmaWxlID0gIkNlbGxjeWNlX25ld19oZWF0bWFwLnBkZiIsIGhlaWdodCA9IDcsIHdpZHRoID0gNSkKSGVhdG1hcChkYXRhX2NlbGwsIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCBzaG93X2NvbHVtbl9uYW1lcyA9IEZBTFNFLCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgdG9wX2Fubm90YXRpb24gPSBoYSwgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBUUlVFLCBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QodGl0bGUgPSAiZXhwcmVzc2lvbiIpLCBzaG93X3Jvd19uYW1lcyA9IEZBTFNFKQojZGV2Lm9mZigpCgoKYGBgCgoKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=