1 A version of Kajal’s R markdown document with some more minor changes

1.1 Libraries

In this version of Kajal’s document, I will repeat each step with some changes to see if I can make things a little easier for future modification.

I will therefore leave Kajal’s work unchanged and follow each block with an alternative.

1.4 Create counts table

## Note: importing `abundance.h5` is typically faster than `abundance.tsv`
## reading in files with read_tsv
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 
## transcripts missing from tx2gene: 14613
## summarizing abundance
## summarizing counts
## summarizing length
## [1] 34431

This is a potentially important difference in how I and Kajal treated the data. This is because I created the expressionset without using ‘lengthScaledTPM’, but let tximport use the raw counts so that the various normalizations are not affected. E.g. using these scaled numbers results in less variance in the data and may lead to some confusion for the downstream tools (edger/limma/deseq/etc). On the other hand, it may lead to cleaner plots, I am not sure.

1.5 Create DESeqDataSet

Not sure what this is actually doing

## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
## design formula are characters, converting to factors
## using just counts from tximport
## [1] 34431

1.6 My version of the above

## The biomart annotations file already exists, loading from it.
## Reading the sample metadata.
## The sample definitions comprises: 39 rows(samples) and 8 columns(metadata fields).
## Reading count tables.
## Using the transcript to gene mapping.
## Reading kallisto data with tximport.
## Finished reading count data.
## Matched 34431 annotations and counts.
## Bringing together the count matrix and gene information.
## The mapped IDs are not the rownames of your gene information, changing them now.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 34431 rows and 39 columns.
## Using a subset expression.
## There were 39, now there are 30 samples.

1.9 My Barplot of counts

##    condition      min      1st   median     mean      3rd      max
## 1:        NS 14327794 16797487 17086171 18433743 17427077 25536756
## 2:       LPS 14788518 17005543 18507594 19201561 20567000 26005826
## 3:        LA 16014957 18662352 19800400 21804785 23207183 35215275
## 4:        LP 15864738 17917203 19813259 20710341 22113833 28681140

1.11 Median Pairwise Correlation

## Performing correlation.

## Performing correlation.

1.13 PCA

##   propVar cumPropVar cond.R2 batch.R2
## 1   28.82      28.82   69.66    25.21
## 2   13.93      42.75   41.92    44.39
## 3   10.96      53.71   73.10    18.68
## 4    7.39      61.10    9.06    75.08
## 5    5.80      66.90    5.43    78.47
##   propVar cumPropVar cond.R2 batch.R2
## 1   28.82      28.82   69.66    30.95
## 2   13.93      42.75   41.92    46.07
## 3   10.96      53.71   73.10    20.98
## 4    7.39      61.10    9.06    80.68
## 5    5.80      66.90    5.43    91.16
##   propVar cumPropVar cond.R2 batch.R2
## 1   19.48      19.48   63.12    32.88
## 2   11.01      30.49   26.93    54.19
## 3    6.91      37.40    1.42    70.89
## 4    5.79      43.19    2.32    70.10
## 5    5.08      48.27    4.32    81.90
##   propVar cumPropVar cond.R2 batch.R2
## 1   19.48      19.48   63.12    35.52
## 2   11.01      30.49   26.93    53.86
## 3    6.91      37.40    1.42    88.21
## 4    5.79      43.19    2.32    94.87
## 5    5.08      48.27    4.32    82.44

1.14 Plot PC1 v PC2

## This function will replace the expt$expressionset slot with:
## log2(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 21885 low-count genes (12546 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 841 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Not putting labels on the plot.

## This function will replace the expt$expressionset slot with:
## log2(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 22066 low-count genes (12365 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 644 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Not putting labels on the plot.

1.15 Euclidian Distance Heat Map

1.16 Correct for Patient in Limma model

##   propVar cumPropVar cond.R2 batch.R2
## 1   36.04      36.04   95.47     5.38
## 2   17.81      53.85   91.87     6.83
## 3    8.05      61.90   29.00    25.52
## 4    5.39      67.29   78.12    21.01
## 5    3.06      70.35    9.63     8.75
##   propVar cumPropVar cond.R2 batch.R2
## 1   36.04      36.04   95.47        0
## 2   17.81      53.85   91.87        0
## 3    8.05      61.90   29.00        0
## 4    5.39      67.29   78.12        0
## 5    3.06      70.35    9.63        0
## [1] 34431    30
##   propVar cumPropVar cond.R2 batch.R2
## 1   23.26      23.26   95.02    13.72
## 2    8.03      31.29   18.28    26.78
## 3    6.01      37.30   81.15    22.10
## 4    4.60      41.90   13.36     4.61
## 5    4.35      46.25    6.15    28.65
##   propVar cumPropVar cond.R2 batch.R2
## 1   23.26      23.26   95.02        0
## 2    8.03      31.29   18.28        0
## 3    6.01      37.30   81.15        0
## 4    4.60      41.90   13.36        0
## 5    4.35      46.25    6.15        0

1.17 Plot PC1 and PC2 with patient correction

1.21 M_LPS v M_NS

eBayes finds an F-statistic from the set of t-statistics for that gene

Limit list to genes with an adjusted p value < 0.05

## [1] 4840

Filter out rows with less than 2-fold change (log2 fold change of > 1)

## [1] 1350

Filter out rows with less than 4-fold change (log2 fold change of > 2)

## [1] 431

Make an MA plot

Annotate sigGenes list using Biomart

## Cache found

1.22 M_LPS v M_LA

## [1] 955
## [1] 256
## [1] 57

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.23 M_LPS v M_LP

## [1] 1993
## [1] 489
## [1] 91

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.24 M_LP v M_NS

## [1] 4603
## [1] 1422
## [1] 448

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.25 M_LA v M_NS

## [1] 4922
## [1] 1493
## [1] 478

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

##GM_LPS v. GM_NS

## [1] 653
## [1] 260
## [1] 99

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.26 GM_LPS v GM_LP

This contrast was written in the opposite order as the others, I think this is the reason some of my plots keep looking backwards/upsidedown… I am going to comment out the original line and rewrite it so that it is identical in order to what I found in: M_LP.M_LP.contr.mat.

## [1] 350
## [1] 126
## [1] 28

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.27 GM_LPS v GM_LA

I think I observe the same flipping here.

## [1] 12
## [1] 7
## [1] 1

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.28 Barplots of Fold-Changes, e.g. Figure 3C/D

It appears to me that these figures are created by merging the M/GM tables for the LP-LPS and LA-LPS contrasts, taking the top ~20 for the M table, and plotting the log2FC on the linear scale. I believe I can trivially modify this to add the logFC / t-stat. The caveat will be that doing this gives me a log2 error bar, not linear… My inclination therefore is to just plot the logFC rather than convert it to linear, but whatever.

1.28.1 Figure 3C top-left

Kajal’s variables to create this are…

  1. M_LPS.M_LP.topTab
  2. GM_LPS.GM_LP.topTab

These were passed to biomart to get the gene names rather than ensembl IDs. I am going to be lazy and just copy/paste Kajal’s code for these tasks.

Having done the top-left piece of this, it seems to me that if you are going to take the top 20 genes and exclude based on the M-CSF adjusted p-value, perhaps you should also exclude based on the GM-CSF adjusted p-value, but the way this was done, only the M is used. In its current state, I am only using the M as per the figures in their current state.

Note, that if you want error bars from the standard error, then it is waaaay easier to stay on the log2 scale rather than convert back to linear because the math for converting the standard error back to linear is weird. If the table had a few more parameters in it, I could do it without struggling, but it doesn’t.

## Cache found
colnames(desc)=c("ID", "Symbol", "Description", "Type")
fig3c_lp_df <- merge(fig3c_lp_df, desc, by="ID", all.x=TRUE)

tl_order_idx <- order(fig3c_lp_df[["logFC.x"]], decreasing=TRUE)
fig3c_tl_df <- fig3c_lp_df[tl_order_idx, ]
sig_idx <- fig3c_tl_df[["adj.P.Val.x"]] <= 0.05
fig3c_tl_df <- head(fig3c_tl_df[sig_idx, ], n=25)
fig3c_tl_df <- fig3c_tl_df[, wanted_columns]
colnames(fig3c_tl_df) <- renamed_columns
rownames(fig3c_tl_df) <- fig3c_tl_df[["ID"]]
fig3c_tl_df[["ID"]] <- NULL
fig3c_tl_df[["m_lfcerr"]] <- fig3c_tl_df[["m_logfc"]] / fig3c_tl_df[["m_t"]]
fig3c_tl_df[["gm_lfcerr"]] <- fig3c_tl_df[["gm_logfc"]] / fig3c_tl_df[["gm_t"]]

fig3c_tl_m <- fig3c_tl_df[, c("m_logfc", "symbol", "m_lfcerr")]
fig3c_tl_m[["type"]] <- "m"
colnames(fig3c_tl_m) <- c("logfc", "symbol", "lfcerr", "type")
fig3c_tl_gm <- fig3c_tl_df[, c("gm_logfc", "symbol", "gm_lfcerr")]
fig3c_tl_gm[["type"]] <- "gm"
colnames(fig3c_tl_gm) <- c("logfc", "symbol", "lfcerr", "type")
melted_fig3c_tl <- rbind(fig3c_tl_m, fig3c_tl_gm)
melted_fig3c_tl[["symbol"]] <- factor(melted_fig3c_tl[["symbol"]],
                                      levels=fig3c_tl_m[["symbol"]])
melted_fig3c_tl[["type"]] <- factor(melted_fig3c_tl[["type"]],
                                    levels=c("m", "gm"))

p <- ggplot(data=melted_fig3c_tl, aes(x=symbol, y=logfc, fill=type)) +
    geom_bar(stat="identity", color="black", position=position_dodge())+
    scale_fill_manual(values=c("cornflowerblue", "darkgrey")) +
    geom_errorbar(aes(ymin=logfc-lfcerr, ymax=logfc+lfcerr), width=.2,
                  position=position_dodge(.9)) +
    theme_minimal() +
    theme(axis.text.x=element_text(angle=45, hjust=1, vjust=0.5))
p

1.28.3 Figure 3C top-right

The right side of the plot is LA rather than LP, otherwise this is the same.

## Cache found
colnames(desc)=c("ID", "Symbol", "Description", "Type")
fig3c_la_df <- merge(fig3c_la_df, desc, by="ID", all.x=TRUE)

tr_order_idx <- order(fig3c_la_df[["logFC.x"]], decreasing=TRUE)
fig3c_tr_df <- fig3c_la_df[tr_order_idx, ]
sig_idx <- fig3c_tr_df[["adj.P.Val.x"]] <= 0.05
fig3c_tr_df <- head(fig3c_tr_df[sig_idx, ], n=25)
fig3c_tr_df <- fig3c_tr_df[, wanted_columns]
colnames(fig3c_tr_df) <- renamed_columns
rownames(fig3c_tr_df) <- fig3c_tr_df[["ID"]]
fig3c_tr_df[["ID"]] <- NULL
fig3c_tr_df[["m_lfcerr"]] <- fig3c_tr_df[["m_logfc"]] / fig3c_tr_df[["m_t"]]
fig3c_tr_df[["gm_lfcerr"]] <- fig3c_tr_df[["gm_logfc"]] / fig3c_tr_df[["gm_t"]]

fig3c_tr_m <- fig3c_tr_df[, c("m_logfc", "symbol", "m_lfcerr")]
fig3c_tr_m[["type"]] <- "m"
colnames(fig3c_tr_m) <- c("logfc", "symbol", "lfcerr", "type")
fig3c_tr_gm <- fig3c_tr_df[, c("gm_logfc", "symbol", "gm_lfcerr")]
fig3c_tr_gm[["type"]] <- "gm"
colnames(fig3c_tr_gm) <- c("logfc", "symbol", "lfcerr", "type")
melted_fig3c_tr <- rbind(fig3c_tr_m, fig3c_tr_gm)
melted_fig3c_tr[["symbol"]] <- factor(melted_fig3c_tr[["symbol"]],
                                      levels=fig3c_tr_m[["symbol"]])
melted_fig3c_tr[["type"]] <- factor(melted_fig3c_tr[["type"]],
                                    levels=c("m", "gm"))

p <- ggplot(data=melted_fig3c_tr, aes(x=symbol, y=logfc, fill=type)) +
    geom_bar(stat="identity", color="black", position=position_dodge())+
    scale_fill_manual(values=c("cornflowerblue", "darkgrey")) +
    geom_errorbar(aes(ymin=logfc-lfcerr, ymax=logfc+lfcerr), width=.2,
                  position=position_dodge(.9)) +
    theme_minimal() +
    theme(axis.text.x=element_text(angle=45, hjust=1, vjust=0.5))
p

1.30 Volcano Plots

M_LPS v M_LA

##                ID  logFC AveExpr      t   P.Value adj.P.Val     B
## 1 ENSG00000139112  1.346   6.583 11.281 1.346e-12 1.730e-08 18.74
## 2 ENSG00000095794  2.802   6.009 10.697 5.130e-12 3.298e-08 17.42
## 3 ENSG00000132906  2.466   4.467  9.520 8.693e-11 2.235e-07 14.62
## 4 ENSG00000124466  5.662   1.526  9.775 4.642e-11 1.492e-07 14.59
## 5 ENSG00000163235  2.390   4.942  9.241 1.745e-10 3.739e-07 13.98
## 6 ENSG00000068305 -1.155   6.819 -9.117 2.391e-10 4.392e-07 13.67

## png 
##   3
## png 
##   2

M_LPS v M_LP

##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

1.31 Rich Factor Graphs

1.32 GO terms shared LA LP

2 Volcano plot M_LPS_4 v M_LP_4

2.1 Figure 3B top-left

##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

2.1.1 The number of up significant genes

## [1] 232
## [1] "ENSG00000121966" "ENSG00000182568" "ENSG00000176595" "ENSG00000198814"
## [5] "ENSG00000112394" "ENSG00000109321"

2.1.2 The number of down significant genes

## [1] 257
## [1] "ENSG00000166068" "ENSG00000089041" "ENSG00000140968" "ENSG00000196449"
## [5] "ENSG00000181915" "ENSG00000104549"

3 Volcano plot M_LPS_4 v M_LA_4

3.1 Figure 3B top-right

##                ID  logFC AveExpr      t   P.Value adj.P.Val     B
## 1 ENSG00000139112  1.346   6.583 11.281 1.346e-12 1.730e-08 18.74
## 2 ENSG00000095794  2.802   6.009 10.697 5.130e-12 3.298e-08 17.42
## 3 ENSG00000132906  2.466   4.467  9.520 8.693e-11 2.235e-07 14.62
## 4 ENSG00000124466  5.662   1.526  9.775 4.642e-11 1.492e-07 14.59
## 5 ENSG00000163235  2.390   4.942  9.241 1.745e-10 3.739e-07 13.98
## 6 ENSG00000068305 -1.155   6.819 -9.117 2.391e-10 4.392e-07 13.67

## png 
##   3
## png 
##   2

3.1.1 The number of up significant genes

## [1] 128
## [1] "ENSG00000139112" "ENSG00000095794" "ENSG00000132906" "ENSG00000124466"
## [5] "ENSG00000163235" "ENSG00000164674"

3.1.2 The number of down significant genes

## [1] 128
## [1] "ENSG00000068305" "ENSG00000140968" "ENSG00000125657" "ENSG00000089041"
## [5] "ENSG00000149635" "ENSG00000117525"

4 Volcano plot GM_LPS_4 v GM_LA_4

4.1 Figure 3B bottom-right

##                ID   logFC AveExpr      t   P.Value adj.P.Val     B
## 1 ENSG00000163235  1.6278  4.9419  6.048 1.005e-06  0.006463 5.477
## 2 ENSG00000099625  1.9849  0.7463  6.726 1.459e-07  0.001876 4.817
## 3 ENSG00000108702 -1.4830  2.3455 -5.497 4.914e-06  0.021061 4.032
## 4 ENSG00000095794  1.3592  6.0086  5.201 1.155e-05  0.026752 3.310
## 5 ENSG00000071205 -0.6386  5.8815 -5.174 1.248e-05  0.026752 3.245
## 6 ENSG00000166886 -1.0612  4.2945 -5.092 1.584e-05  0.029088 2.971

## png 
##   3
## png 
##   2

4.1.1 The number of up significant genes

## [1] 5
## [1] "ENSG00000163235" "ENSG00000099625" "ENSG00000095794" "ENSG00000197555"
## [5] "ENSG00000128422"

4.1.2 The number of down significant genes

## [1] 2
## [1] "ENSG00000108702" "ENSG00000166886"

5 Volcano plot GM_LPS_4 v GM_LP_4

5.1 Figure 3B bottom-left

So, it appears I get the inverse of what is in the figure. Did the contrast get reversed?

I went back to the section which defines this, it has the heading ‘GM_LPS_v_GM_LP’ and the contrast appears to me to be correct. At least it is written like this:

GM_LPS.GM_LP.contr.mat <- makeContrasts(GM_LPSvGM_LP=((condGM_LPS-condGM_NS)-(condGM_LP-condGM_NS)), levels=v$design)

My inclination is therefore that this got flipped?

##                ID logFC AveExpr     t   P.Value adj.P.Val      B
## 1 ENSG00000163235 2.244  4.9419 8.405 1.501e-09 1.609e-05 11.866
## 2 ENSG00000095794 2.099  6.0086 8.059 3.753e-09 1.609e-05 10.995
## 3 ENSG00000099625 2.359  0.7463 8.098 3.377e-09 1.609e-05  9.933
## 4 ENSG00000120875 3.357  4.0494 7.671 1.065e-08 3.425e-05  9.931
## 5 ENSG00000188042 2.337  5.0272 6.987 7.011e-08 1.663e-04  8.154
## 6 ENSG00000197872 1.919  5.9633 6.909 8.739e-08 1.663e-04  7.939

## png 
##   3
## png 
##   2

5.1.1 The number of up significant genes

## [1] 104
## [1] "ENSG00000163235" "ENSG00000095794" "ENSG00000099625" "ENSG00000120875"
## [5] "ENSG00000188042" "ENSG00000197872"

5.1.2 The number of down significant genes

## [1] 22
## [1] "ENSG00000089041" "ENSG00000108702" "ENSG00000136997" "ENSG00000105810"
## [5] "ENSG00000181856" "ENSG00000244398"
LS0tCnRpdGxlOiAiSHVtYW4gTWFjcm9waGFnZXM6IE0tQ1NGIHYgR00tQ1NGOiBMUFMsIExQUytBZGVub3NpbmUsIExQUytQR0UyIgphdXRob3I6ICJLYWphbCBIYW1pZHphZGVoIGFuZCBhdGIiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiIgp2ZXIgPC0gIjIwMjAwMzMwIgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCiMjcm1kX2ZpbGUgPC0gIjAzX2V4cHJlc3Npb25faW5mZWN0aW9uXzIwMTgwODIyLlJtZCIKYGBgCgojIEEgdmVyc2lvbiBvZiBLYWphbCdzIFIgbWFya2Rvd24gZG9jdW1lbnQgd2l0aCBzb21lIG1vcmUgbWlub3IgY2hhbmdlcwoKIyMgTGlicmFyaWVzCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRldnRvb2xzKQpsaWJyYXJ5KHR4aW1wb3J0KQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KERFU2VxMikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoY2JjYlNFUSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoVmVubmVyYWJsZSkKbGlicmFyeShlZGdlUikKbGlicmFyeShjYWxpYnJhdGUpCmxpYnJhcnkoc2NhbGVzKQpgYGAKCkluIHRoaXMgdmVyc2lvbiBvZiBLYWphbCdzIGRvY3VtZW50LCBJIHdpbGwgcmVwZWF0IGVhY2ggc3RlcCB3aXRoIHNvbWUgY2hhbmdlcwp0byBzZWUgaWYgSSBjYW4gbWFrZSB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyIGZvciBmdXR1cmUgbW9kaWZpY2F0aW9uLgoKSSB3aWxsIHRoZXJlZm9yZSBsZWF2ZSBLYWphbCdzIHdvcmsgdW5jaGFuZ2VkIGFuZCBmb2xsb3cgZWFjaCBibG9jayB3aXRoIGFuIGFsdGVybmF0aXZlLgoKIyMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5LCBpbXBvcnQgbWV0YWRhdGEgYW5kIGFidW5kYW5jZSBmaWxlcwoKYGBge3IgcmVhZF9kYXRhfQpkZXNpZ24gPC0gcmVhZC50YWJsZSgnTWV0YURhdGEgb25seSA0IGhvdXIudHh0JywgaGVhZGVyPVQsIHNlcD0nXHQnKQpkZXNpZ25bWyJQYXRpZW50Il1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJQYXRpZW50Il1dKQpkZXNpZ25bWyJTdGltdWxhdGlvbiJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siU3RpbXVsYXRpb24iXV0pCmRlc2lnbltbIkJhdGNoIl1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJCYXRjaCJdXSkKZGVzaWduW1siR3Jvd3RoIl1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJHcm93dGgiXV0pCmZpbGVzIDwtIGZpbGUucGF0aCgia2FsbGlzdG8gYWJ1bmRhbmNlIGZpbGVzLyIsIGRlc2lnbiRIUEdMLklkZW50aWZpZXIsICJhYnVuZGFuY2UudHN2IikKbmFtZXMoZmlsZXMpIDwtIHBhc3RlMCgiSFBHTDA5IiwgYygxMjozMSwgNDI6NjApKQpyb3duYW1lcyhkZXNpZ24pIDwtIGRlc2lnbltbMV1dCgpzdGltX2Rlc2lnbl9pZHggPC0gZGVzaWduW1siU3RpbXVsYXRpb24iXV0gIT0gIk5TIgpzdGltX2Rlc2lnbiA8LSBkZXNpZ25bc3RpbV9kZXNpZ25faWR4LCBdCmBgYAoKIyMgQ29udmVydCB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSUQKCmBgYHtyIGVuc2VtYmx9CmVuc2VtYmwgPC0gdXNlTWFydCgiRU5TRU1CTF9NQVJUX0VOU0VNQkwiLCBkYXRhc2V0PSJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiLCBob3N0PSJ1c2Vhc3QuZW5zZW1ibC5vcmciKQp0eDJnZW5lIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIsICJjaHJvbW9zb21lX25hbWUiKSwgbWFydD1lbnNlbWJsKQpnb29kX2lkeCA8LSBncmVwbCh4PXR4MmdlbmVbWyJjaHJvbW9zb21lX25hbWUiXV0sIHBhdHRlcm49Il5bWzphbG51bTpdXXsxLDJ9JCIpCmdvb2Rfb25lcyA8LSB0eDJnZW5lW2dvb2RfaWR4LCAtM10KYGBgCgojIyBDcmVhdGUgY291bnRzIHRhYmxlCgpgYGB7cn0KdHhpLmthbGxpc3RvLnRzdiA8LSB0eGltcG9ydChmaWxlcywgdHlwZT0ia2FsbGlzdG8iLCB0eDJnZW5lPWdvb2Rfb25lcywgY291bnRzRnJvbUFidW5kYW5jZT0ibGVuZ3RoU2NhbGVkVFBNIikKbnJvdyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKCndyaXRlLnRhYmxlKHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fQ0RTXzIwMTgwNzExLnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fMjAxODA3MTEuY3N2Iiwgcm93Lm5hbWVzPVQsIHF1b3RlPUYpCgpzdGltX2NvdW50cyA8LSB0eGkua2FsbGlzdG8udHN2JGNvdW50cwpzdGltX2NvdW50c19pZHggPC0gY29sbmFtZXMoc3RpbV9jb3VudHMpICVpbiUgcm93bmFtZXMoc3RpbV9kZXNpZ24pCnN0aW1fY291bnRzIDwtIHN0aW1fY291bnRzWywgc3RpbV9jb3VudHNfaWR4XQpgYGAKClRoaXMgaXMgYSBwb3RlbnRpYWxseSBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpbiBob3cgSSBhbmQgS2FqYWwgdHJlYXRlZCB0aGUgZGF0YS4KVGhpcyBpcyBiZWNhdXNlIEkgY3JlYXRlZCB0aGUgZXhwcmVzc2lvbnNldCB3aXRob3V0IHVzaW5nICdsZW5ndGhTY2FsZWRUUE0nLApidXQgbGV0IHR4aW1wb3J0IHVzZSB0aGUgcmF3IGNvdW50cyBzbyB0aGF0IHRoZSB2YXJpb3VzIG5vcm1hbGl6YXRpb25zIGFyZSBub3QKYWZmZWN0ZWQuICBFLmcuIHVzaW5nIHRoZXNlIHNjYWxlZCBudW1iZXJzIHJlc3VsdHMgaW4gbGVzcyB2YXJpYW5jZSBpbiB0aGUgZGF0YQphbmQgbWF5IGxlYWQgdG8gc29tZSBjb25mdXNpb24gZm9yIHRoZSBkb3duc3RyZWFtIHRvb2xzCihlZGdlci9saW1tYS9kZXNlcS9ldGMpLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heSBsZWFkIHRvIGNsZWFuZXIgcGxvdHMsIEkgYW0Kbm90IHN1cmUuCgojIyBDcmVhdGUgREVTZXFEYXRhU2V0CgpOb3Qgc3VyZSB3aGF0IHRoaXMgaXMgYWN0dWFsbHkgZG9pbmcKCmBgYHtyIGRlc2VxX2Rkc30KZGYgPC0gZGF0YS5mcmFtZShjb25kaXRpb249cGFzdGUoZGVzaWduJEhQR0wuSWRlbnRpZmllciwgZGVzaWduJEdyb3d0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduJFN0aW11bGF0aW9uLCBkZXNpZ24kUGF0aWVudCwgc2VwPSJfIikpCnJvd25hbWVzKGRmKT1jb2xuYW1lcyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKZGRzIDwtIERFU2VxRGF0YVNldEZyb21UeGltcG9ydCh0eGkua2FsbGlzdG8udHN2LCBkZiwgfmNvbmRpdGlvbikKbnJvdyhkZHMpCgpkZHNfc3RpbSA8LSBkZHNbLCByb3duYW1lcyhzdGltX2Rlc2lnbildCmBgYAoKIyMgTXkgdmVyc2lvbiBvZiB0aGUgYWJvdmUKCmBgYHtyIGF0Yl9yZWFkX2RhdGF9Cm15X2Rlc2lnbiA8LSBkZXNpZ24Kcm93bmFtZXMobXlfZGVzaWduKSA8LSBkZXNpZ25bWzFdXQpteV9kZXNpZ25bWyJjb25kaXRpb24iXV0gPC0gbXlfZGVzaWduW1siU3RpbXVsYXRpb24iXV0KbXlfZGVzaWduW1siZmlsZSJdXSA8LSBnbHVlOjpnbHVlKCJwcmVwcm9jZXNzaW5nL3tyb3duYW1lcyhteV9kZXNpZ24pfS9hYnVuZGFuY2UudHN2IikKY29sbmFtZXMobXlfZGVzaWduKSA8LSB0b2xvd2VyKGNvbG5hbWVzKG15X2Rlc2lnbikpCmdlbmVfaW5mbyA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoaG9zdD0idXNlYXN0LmVuc2VtYmwub3JnIikkYW5ub3RhdGlvbgpyb3duYW1lcyhnZW5lX2luZm8pIDwtIG1ha2UubmFtZXMoZ2VuZV9pbmZvW1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWU9VFJVRSkKdHhfZ2VuZV9tYXAgPC0gZ2VuZV9pbmZvWywgYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQpoc19leHB0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPW15X2Rlc2lnbiwgZ2VuZV9pbmZvPWdlbmVfaW5mbywgdHhfZ2VuZV9tYXA9dHhfZ2VuZV9tYXApCmhzX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhoc19leHB0LCBmYWN0PSJncm93dGgiKQoKc3RpbV9leHB0IDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldD0ic3RpbXVsYXRpb24hPSdOUyciKQpgYGAKCiMjIEJhciBQbG90IG9mIENvdW50cwoKYGBge3IgYmFycGxvdH0KcGFyKG1hcj1jKDEwLCA0LjUsIDMuNSwgMSkpCnBhcihvbWE9YygwLCAwLCAwLCAwKSkKYmFycGxvdChjb2xTdW1zKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbGFzPTMsIG1haW49J1JhdyBDb3VudHMgQnkgU2FtcGxlJykKCmJhcnBsb3QoY29sU3VtcyhzdGltX2NvdW50cyksIGxhcz0zLCBtYWluPSdSYXcgQ291bnRzIEJ5IFNhbXBsZScpCmBgYAoKIyMgQm94IFBsb3Qgb2YgQ291bnRzCgpgYGB7ciBjb3VudF9iYXJwbG90fQpkZHMgPC0gZXN0aW1hdGVTaXplRmFjdG9ycyhkZHMpCm5jdHMgPC0gY291bnRzKGRkcywgbm9ybWFsaXplZD1UUlVFKQp5IDwtIGxvZyhuY3RzICsgMSkKCnBhcihtYXI9Yyg1LCA1LCAyLCAxKSkKcGFyKG9tYT1jKDAsIDAsIDAsIDApKQpib3hwbG90KHksIG5hbWVzPWNvbG5hbWVzKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbGFzPTMsIG1haW49J1BlciBTYW1wbGUgTG9nIG9mIFNpemUtZmFjdG9yIENvdW50cycpCgpkZHNfc3RpbSA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19zdGltKQpzdGltX25jdHMgPC0gY291bnRzKGRkc19zdGltLCBub3JtYWxpemVkPVRSVUUpCnN0aW1feSA8LSBsb2coc3RpbV9uY3RzICsgMSkKCnBhcihtYXI9Yyg1LCA1LCAyLCAxKSkKcGFyKG9tYT1jKDAsIDAsIDAsIDApKQpib3hwbG90KHN0aW1feSwgbmFtZXM9Y29sbmFtZXMoc3RpbV9jb3VudHMpLCBsYXM9MywKICAgICAgICBtYWluPSdQZXIgU2FtcGxlIExvZyBvZiBTaXplLWZhY3RvciBDb3VudHMnKQpgYGAKCmBgYHtyIG15X2JveHBsb3R9CmJveHBsb3QgPC0gcGxvdF9ib3hwbG90KGhzX2V4cHQpCmJveHBsb3QKYGBgCgojIyBNeSBCYXJwbG90IG9mIGNvdW50cwoKYGBge3IgbXlfYmFycGxvdH0KbGlic2l6ZSA8LSBwbG90X2xpYnNpemUoaHNfZXhwdCkKbGlic2l6ZSRwbG90CmxpYnNpemUkc3VtbWFyeQoKcGxvdF9saWJzaXplKHN0aW1fZXhwdCkkcGxvdApgYGAKCiMjIEhlYXRtYXAgb2YgUGVhcnNvbiBDb3JyZWxhdGlvbgoKYGBge3IgY29yaGVhdH0KZGF0Q29yIDwtIGNvcih0eGkua2FsbGlzdG8udHN2JGNvdW50cykKaGVhdG1hcC4yKGRhdENvciwgUm93dj1OQSwgQ29sdj1OQSwKICAgICAgICAgIG1hcmdpbnM9YygxMCwgMTApLAogICAgICAgICAgbGFiUm93PWRmJGNvbmRpdGlvbiwKICAgICAgICAgIGxhYkNvbD1kZiRjb25kaXRpb24sCiAgICAgICAgICBkZW5kcm9ncmFtPSJub25lIiwKICAgICAgICAgIHNjYWxlPSJub25lIiwKICAgICAgICAgIHRyYWNlPSJub25lIiwKICAgICAgICAgIHNydENvbD00NSwgbWFpbj0nUGVhcnNvbiBDb3JyZWxhdGlvbicpCgpzdGltX2RhdENvciA8LSBjb3Ioc3RpbV9jb3VudHMpCmhlYXRtYXAuMihzdGltX2RhdENvciwgUm93dj1OQSwgQ29sdj1OQSwKICAgICAgICAgIG1hcmdpbnM9YygxMCwgMTApLAogICAgICAgICAgbGFiUm93PWRmJGNvbmRpdGlvbiwKICAgICAgICAgIGxhYkNvbD1kZiRjb25kaXRpb24sCiAgICAgICAgICBkZW5kcm9ncmFtPSJub25lIiwKICAgICAgICAgIHNjYWxlPSJub25lIiwKICAgICAgICAgIHRyYWNlPSJub25lIiwKICAgICAgICAgIHNydENvbD00NSwgbWFpbj0nUGVhcnNvbiBDb3JyZWxhdGlvbicpCmBgYAoKYGBge3IgbXlfY29yaGVhdH0KcGxvdF9jb3JoZWF0KGhzX2V4cHQpJHBsb3QKCnBsb3RfY29yaGVhdChzdGltX2V4cHQpJHBsb3QKYGBgCgojIyBNZWRpYW4gUGFpcndpc2UgQ29ycmVsYXRpb24KCmBgYHtyIHNtY30KY29yTSA8LSBtYXRyaXhTdGF0czo6cm93TWVkaWFucyhjb3IodHhpLmthbGxpc3RvLnRzdiRjb3VudHMpKQpxcyA8LSBxdWFudGlsZShjb3JNLCBwPWMoMSwgMykvNCkKaXFyIDwtIGRpZmYocXMpCm91dExpbWl0IDwtIHFzWzFdIC0gMS41ICogaXFyCnlsaW0gPC0gYyhwbWluKG1pbihjb3JNKSwgb3V0TGltaXQpLCBtYXgoY29yTSkpCmNvbmQgPC0gcGFzdGUoZGVzaWduJEdyb3d0aCwgZGVzaWduJFN0aW11bGF0aW9uLCBzZXA9Il8iKQpjb2wgPC0gaWZlbHNlKGNvbmQ9PSJNX05TIiwgImdyYXk2MCIsCiAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQUyIsICJkZWVwcGluazMiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09Ik1fTEEiLCAiZGFya3NlYWdyZWVuMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09Ik1fTFAiLCAibGF2ZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTlMiLCAibGlnaHRwaW5rMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTFBTIiwgIm1vY2Nhc2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTEEiLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTFAiLCAic3ByaW5nZ3JlZW40IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsdWUyIikpKSkpKSkpCnBhcihtYXI9Yyg1LCA0LjUsIDIsIDEpKQpwbG90KGNvck0sIHhheHQ9Im4iLCB5bGltPXlsaW0sIHlsYWI9Ik1lZGlhbiBQYWlyd2lzZSBDb3JyZWxhdGlvbiIsIHhsYWI9IiIsIG1haW49IiIsIGNvbD1jb2wsIHBjaD0xNiwgY2V4PTEuNSkKYXhpcyhzaWRlPTEsIGF0PXNlcShhbG9uZz1jb3JNKSwgbGFiZWxzPWNvbG5hbWVzKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbGFzPTIpCmFibGluZShoPW91dExpbWl0LCBsdHk9MikKYWJsaW5lKHY9MTpuY29sKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbHR5PTMsIGNvbD0iYmxhY2siKQoKc3RpbV9jb3JNIDwtIG1hdHJpeFN0YXRzOjpyb3dNZWRpYW5zKGNvcihzdGltX2NvdW50cykpCnN0aW1fcXMgPC0gcXVhbnRpbGUoc3RpbV9jb3JNLCBwPWMoMSwgMykvNCkKc3RpbV9pcXIgPC0gZGlmZihzdGltX3FzKQpzdGltX291dExpbWl0IDwtIHN0aW1fcXNbMV0gLSAoMS41ICogaXFyKQpzdGltX3lsaW0gPC0gYyhwbWluKG1pbihzdGltX2Nvck0pLCBzdGltX291dExpbWl0KSwgbWF4KHN0aW1fY29yTSkpCnN0aW1fY29uZCA8LSBwYXN0ZShzdGltX2Rlc2lnbiRHcm93dGgsIHN0aW1fZGVzaWduJFN0aW11bGF0aW9uLCBzZXA9Il8iKQpjb2wgPC0gaWZlbHNlKGNvbmQ9PSJNX05TIiwgImdyYXk2MCIsCiAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQUyIsICJkZWVwcGluazMiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09Ik1fTEEiLCAiZGFya3NlYWdyZWVuMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09Ik1fTFAiLCAibGF2ZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTlMiLCAibGlnaHRwaW5rMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTFBTIiwgIm1vY2Nhc2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTEEiLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iR01fTFAiLCAic3ByaW5nZ3JlZW40IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsdWUyIikpKSkpKSkpCnBhcihtYXI9Yyg1LCA0LjUsIDIsIDEpKQpwbG90KHN0aW1fY29yTSwgeGF4dD0ibiIsIHlsaW09eWxpbSwgeWxhYj0iTWVkaWFuIFBhaXJ3aXNlIENvcnJlbGF0aW9uIiwgeGxhYj0iIiwgbWFpbj0iIiwgY29sPWNvbCwgcGNoPTE2LCBjZXg9MS41KQpheGlzKHNpZGU9MSwgYXQ9c2VxKGFsb25nPXN0aW1fY29yTSksIGxhYmVscz1jb2xuYW1lcyhzdGltX2NvdW50cyksIGxhcz0yKQphYmxpbmUoaD1zdGltX291dExpbWl0LCBsdHk9MikKYWJsaW5lKHY9MTpuY29sKHN0aW1fY291bnRzKSwgbHR5PTMsIGNvbD0iYmxhY2siKQpgYGAKCmBgYHtyIG15X3NtY30KcGxvdF9zbShoc19leHB0KSRwbG90CgpwbG90X3NtKHN0aW1fZXhwdCkkcGxvdApgYGAKCiMjIEZpbHRlciBhbmQgTm9ybWFsaXplIENvdW50cwoKYGBge3J9CmZpbHRlckNvdW50cyA9IGZ1bmN0aW9uIChjb3VudHMsIGxpYi5zaXplID0gTlVMTCwgdGhyZXNoID0gMSwgbWluU2FtcGxlcyA9IDIpIHsKICBjcG1zIDwtIDJebG9nMkNQTShjb3VudHMsIGxpYi5zaXplID0gbGliLnNpemUpJHkKICBrZWVwIDwtIHJvd1N1bXMoY3BtcyA+IHRocmVzaCkgPj0gbWluU2FtcGxlcwogIGNvdW50cyA8LSBjb3VudHNba2VlcCwgXQogIGNvdW50cwp9Cgp4X3RhYmxlIDwtIHRhYmxlKGRlc2lnbiRTdGltdWxhdGlvbikKZGltKHR4aS5rYWxsaXN0by50c3YkY291bnRzKQoKY291bnRzIDwtIGZpbHRlckNvdW50cyh0eGkua2FsbGlzdG8udHN2JGNvdW50cywgdGhyZXNoPTEsIG1pblNhbXBsZXM9bWluKHhfdGFibGUpKQpkaW0oY291bnRzKQpjb3VudHNTdWJRIDwtIHFOb3JtKGNvdW50cykKeCA8LSBsb2cyQ1BNKGNvdW50c1N1YlEpCnMgPC0gbWFrZVNWRCh4JHkpCgpzdGltX3RhYmxlIDwtIHRhYmxlKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKQpzdGltX2NvdW50cyA8LSBmaWx0ZXJDb3VudHMoc3RpbV9jb3VudHMsIHRocmVzaD0xLCBtaW5TYW1wbGVzPW1pbihzdGltX3RhYmxlKSkKZGltKHN0aW1fY291bnRzKQpzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCnN0aW1feCA8LSBsb2cyQ1BNKHN0aW1fY291bnRzU3ViUSkKc3RpbV9zIDwtIG1ha2VTVkQoc3RpbV94JHkpCmBgYAoKIyMgUENBCgpgYGB7cn0KY2JjYlNFUTo6cGNSZXMocyR2LCBzJGQsIGNvbmQsIGRlc2lnbiRCYXRjaClbMTo1LCBdCmNiY2JTRVE6OnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kUGF0aWVudClbMTo1LCBdCgpjYmNiU0VROjpwY1JlcyhzdGltX3Mkdiwgc3RpbV9zJGQsIHN0aW1fY29uZCwgc3RpbV9kZXNpZ24kQmF0Y2gpWzE6NSwgXQpjYmNiU0VROjpwY1JlcyhzdGltX3Mkdiwgc3RpbV9zJGQsIHN0aW1fY29uZCwgc3RpbV9kZXNpZ24kUGF0aWVudClbMTo1LCBdCmBgYAoKIyMgUGxvdCBQQzEgdiBQQzIKCmBgYHtyIG9yaWdpbmFsX3BjYX0KY29uZG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kU3RpbXVsYXRpb24pKQpjb25kbnVtIDwtIGlmZWxzZShjb25kbnVtPT00LCAiZ3JlZW4iLAogICAgICAgICAgIGlmZWxzZShjb25kbnVtPT0zLCAibGlnaHRibHVlIiwKICAgICAgICAgICBpZmVsc2UoY29uZG51bT09MiwgInBpbmsiLAogICAgICAgICAgIGlmZWxzZShjb25kbnVtPT0xLCAicHVycGxlIiwgImJsYWNrIikpKSkKcGF0bnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRQYXRpZW50KSkKcGF0bnVtIDwtIGlmZWxzZShwYXRudW09PTQsIDIxLAogICAgICAgICAgaWZlbHNlKHBhdG51bT09MywgMjIsCiAgICAgICAgICBpZmVsc2UocGF0bnVtPT0yLCAyMywKICAgICAgICAgIGlmZWxzZShwYXRudW09PTEsIDI0LAogICAgICAgICAgaWZlbHNlKHBhdG51bT09NSwgMjUsIDEpKSkpKQpjYmNiU0VROjpwbG90UEMocyR2LCBzJGQsIGNvbD0iYmxhY2siLCBwY2g9cGF0bnVtLCBiZz1jb25kbnVtKQpsZWdlbmQoeD0wLjIsIHk9MC4yLCBsZWdlbmQ9dW5pcXVlKGRlc2lnbiRTdGltdWxhdGlvbiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsImxpZ2h0Ymx1ZSIsInBpbmsiLCJwdXJwbGUiKSwgcHQuY2V4PTEuNSwgY2V4PTAuNSwgYnR5PSJuIikKbGVnZW5kKHg9MC4yLCB5PS0wLjEsIGxlZ2VuZD11bmlxdWUoZGVzaWduJFBhdGllbnQpLCBwY2g9dW5pcXVlKHBhdG51bSksIGNvbD0wLAogICAgICAgcHQuYmc9ImdyYXk5MCIsIHB0LmNleD0xLjUsIGNleD0wLjUsIGJ0eT0ibiIpCgpzdGltX2NvbmRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24pKQpzdGltX2NvbmRudW0gPC0gaWZlbHNlKHN0aW1fY29uZG51bT09NCwgImdyZWVuIiwKICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0zLCAibGlnaHRibHVlIiwKICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0yLCAicGluayIsCiAgICAgICAgICAgaWZlbHNlKHN0aW1fY29uZG51bT09MSwgInB1cnBsZSIsICJibGFjayIpKSkpCnN0aW1fcGF0bnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJFBhdGllbnQpKQpzdGltX3BhdG51bSA8LSBpZmVsc2Uoc3RpbV9wYXRudW09PTQsIDIxLAogICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0zLCAyMiwKICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09MiwgMjMsCiAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTEsIDI0LAogICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT01LCAyNSwgMSkpKSkpCmNiY2JTRVE6OnBsb3RQQyhzdGltX3Mkdiwgc3RpbV9zJGQsIGNvbD0iYmxhY2siLCBwY2g9c3RpbV9wYXRudW0sIGJnPXN0aW1fY29uZG51bSkKbGVnZW5kKHg9MC4yLCB5PTAuMiwgbGVnZW5kPXVuaXF1ZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsImxpZ2h0Ymx1ZSIsInBpbmsiLCJwdXJwbGUiKSwgcHQuY2V4PTEuNSwgY2V4PTAuNSwgYnR5PSJuIikKbGVnZW5kKHg9MC4yLCB5PS0wLjEsIGxlZ2VuZD11bmlxdWUoc3RpbV9kZXNpZ24kUGF0aWVudCksIHBjaD11bmlxdWUoc3RpbV9wYXRudW0pLCBjb2w9MCwKICAgICAgIHB0LmJnPSJncmF5OTAiLCBwdC5jZXg9MS41LCBjZXg9MC41LCBidHk9Im4iKQpgYGAKCmBgYHtyIG15X3BjYX0KaHNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCBub3JtPSJxdWFudCIsIGZpbHRlcj0iY2JjYiIsIHRyYW5zZm9ybT0ibG9nMiIpCm15X3BjYSA8LSBwbG90X3BjYShoc19ub3JtLCBwbG90X2xhYmVscz1GQUxTRSwgY2lzPU5VTEwpCm15X3BjYSRwbG90Cgpoc3N0aW1fbm9ybSA8LSBub3JtYWxpemVfZXhwdChzdGltX2V4cHQsIG5vcm09InF1YW50IiwgZmlsdGVyPSJjYmNiIiwgdHJhbnNmb3JtPSJsb2cyIikKc3RpbV9wY2EgPC0gcGxvdF9wY2EoaHNzdGltX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFLCBjaXM9TlVMTCkKc3RpbV9wY2EkcGxvdApgYGAKCiMjIEV1Y2xpZGlhbiBEaXN0YW5jZSBIZWF0IE1hcAoKYGBge3IgZGlzaGVhdH0KZGlzdHMgPC0gZGlzdCh0KGNvdW50cykpCm1hdCA8LSBhcy5tYXRyaXgoZGlzdHMpCnJvd25hbWVzKG1hdCkgPC0gY29sbmFtZXMobWF0KSA8LSBjb25kCmhtY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCg5LCAiR25CdSIpKSgxMDApCnZlYy5wYXRpZW50IDwtIHJhaW5ib3cobmxldmVscyhkZXNpZ24kUGF0aWVudCksIHN0YXJ0PTAsIGVuZD0uOCkKcGF0aWVudC5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKICAgIHBhdGllbnQuY29sb3JbaV0gPC0gdmVjLnBhdGllbnRbZGVzaWduJFBhdGllbnRbaV09PWxldmVscyhkZXNpZ24kUGF0aWVudCldCnZlYy5jb25kaXRpb24gPC0gYygiZ3JlZW4iLCAibGlnaHRibHVlIiwgInBpbmsiLCAicHVycGxlIikKY29uZGl0aW9uLmNvbG9yIDwtIHJlcCgwLCBsZW5ndGgoZGVzaWduJFN0aW11bGF0aW9uKSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRTdGltdWxhdGlvbikpCiAgICBjb25kaXRpb24uY29sb3JbaV0gPC0gdmVjLmNvbmRpdGlvbltkZXNpZ24kU3RpbXVsYXRpb25baV09PWxldmVscyhkZXNpZ24kU3RpbXVsYXRpb24pXQoKaGVhdG1hcCA8LSBoZWF0bWFwLjIobWF0LCB0cmFjZT0ibm9uZSIsIGNvbCA9IHJldihobWNvbCksIG1hcmdpbj1jKDExLCAxMSksIENvbFNpZGVDb2xvcnM9Y29uZGl0aW9uLmNvbG9yLAogICAgICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzPXBhdGllbnQuY29sb3IsIGtleT0iRkFMU0UiLCBzcnRDb2w9NDUpCgpzdGltX2Rpc3RzIDwtIGRpc3QodChzdGltX2NvdW50cykpCnN0aW1fbWF0IDwtIGFzLm1hdHJpeChzdGltX2Rpc3RzKQpyb3duYW1lcyhzdGltX21hdCkgPC0gY29sbmFtZXMoc3RpbV9tYXQpIDwtIHN0aW1fY29uZApzdGltX2htY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCg5LCAiR25CdSIpKSgxMDApCnN0aW1fdmVjLnBhdGllbnQgPC0gcmFpbmJvdyhubGV2ZWxzKHN0aW1fZGVzaWduJFBhdGllbnQpLCBzdGFydD0wLCBlbmQ9LjgpCnN0aW1fcGF0aWVudC5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKHN0aW1fZGVzaWduJFBhdGllbnQpKQpmb3IgKGkgaW4gMTpsZW5ndGgoc3RpbV9kZXNpZ24kUGF0aWVudCkpCiAgICBzdGltX3BhdGllbnQuY29sb3JbaV0gPC0gc3RpbV92ZWMucGF0aWVudFtzdGltX2Rlc2lnbiRQYXRpZW50W2ldPT1sZXZlbHMoc3RpbV9kZXNpZ24kUGF0aWVudCldCnN0aW1fdmVjLmNvbmRpdGlvbiA8LSBjKCJncmVlbiIsICJsaWdodGJsdWUiLCAicGluayIsICJwdXJwbGUiKQpzdGltX2NvbmRpdGlvbi5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKZm9yIChpIGluIDE6bGVuZ3RoKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKICAgIHN0aW1fY29uZGl0aW9uLmNvbG9yW2ldIDwtIHN0aW1fdmVjLmNvbmRpdGlvbltzdGltX2Rlc2lnbiRTdGltdWxhdGlvbltpXT09bGV2ZWxzKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKV0KaGVhdG1hcCA8LSBoZWF0bWFwLjIoc3RpbV9tYXQsIHRyYWNlPSJub25lIiwgY29sID0gcmV2KGhtY29sKSwgbWFyZ2luPWMoMTEsIDExKSwKICAgICAgICAgICAgICAgICAgICAgQ29sU2lkZUNvbG9ycz1zdGltX2NvbmRpdGlvbi5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgUm93U2lkZUNvbG9ycz1zdGltX3BhdGllbnQuY29sb3IsIGtleT0iRkFMU0UiLCBzcnRDb2w9NDUpCmBgYAoKYGBge3IgbXlfZGlzaGVhdH0KbXlfZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQoaHNfbm9ybSkKCnN0aW1fZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQoaHNzdGltX25vcm0pCmBgYAoKIyMgQ29ycmVjdCBmb3IgUGF0aWVudCBpbiBMaW1tYSBtb2RlbAoKYGBge3J9Cm1vZCA8LSBtb2RlbC5tYXRyaXgofmRlc2lnbiRQYXRpZW50KQp2IDwtIHZvb20oY291bnRzU3ViUSwgbW9kKQpmaXQgPC0gbG1GaXQodikKbmV3RGF0YSA8LSByZXNpZHVhbHMoZml0LCB2KQpzIDwtIG1ha2VTVkQobmV3RGF0YSkKcGNSZXMocyR2LCBzJGQsIGNvbmQsIGRlc2lnbiRCYXRjaClbMTo1LCBdCnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kUGF0aWVudClbMTo1LCBdCgpzdGltX3RhYmxlIDwtIHRhYmxlKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKQpzdGltX2NvdW50cyA8LSBmaWx0ZXJDb3VudHMoc3RpbV9jb3VudHMsIHRocmVzaD0yLCBtaW5TYW1wbGVzPW1pbihzdGltX3RhYmxlKSkKZGltKHN0aW1fY291bnRzKQpzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCnN0aW1fbW9kIDwtIG1vZGVsLm1hdHJpeCh+c3RpbV9kZXNpZ24kUGF0aWVudCkKc3RpbV92IDwtIHZvb20oc3RpbV9jb3VudHNTdWJRLCBzdGltX21vZCkKc3RpbV9maXQgPC0gbG1GaXQoc3RpbV92KQpzdGltX25ld0RhdGEgPC0gcmVzaWR1YWxzKHN0aW1fZml0LCBzdGltX3YpCnN0aW1fcyA8LSBtYWtlU1ZEKHN0aW1fbmV3RGF0YSkKcGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJEJhdGNoKVsxOjUsIF0KcGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJFBhdGllbnQpWzE6NSwgXQpgYGAKCiMjIFBsb3QgUEMxIGFuZCBQQzIgd2l0aCBwYXRpZW50IGNvcnJlY3Rpb24KCmBgYHtyfQpncm9udW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGVzaWduJEdyb3d0aCkpCmdyb251bSA8LSBpZmVsc2UoZ3JvbnVtPT0yLCAxOSwKICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JvbnVtPT0xLCAxNSwgMSkpCnBhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kUGF0aWVudCkpCnBhdG51bSA8LSBpZmVsc2UocGF0bnVtPT0xLCAicGluayIsCiAgICAgICAgICAgICAgICBpZmVsc2UocGF0bnVtPT0yLCAiZ3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocGF0bnVtPT0zLCAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwYXRudW09PTQsICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwYXRudW09PTUsICJibGFjayIsICJvcmFuZ2UiKSkpKSkKc2FtcGxlbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRTdGltdWxhdGlvbikpCnNhbXBsZW51bSA8LSBpZmVsc2Uoc2FtcGxlbnVtPT00LCAiZ3JlZW4iLAogICAgICAgICAgICAgICAgaWZlbHNlKHNhbXBsZW51bT09MywgImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2FtcGxlbnVtPT0xLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2FtcGxlbnVtPT0yLCAieWVsbG93IiwgImdyZXkiKSkpKQpwbG90UEMocyR2LCBzJGQsIHBjaD1ncm9udW0sIGNvbD1zYW1wbGVudW0sIGNleD0yKQpsZWdlbmQoeD0wLjA1LCB5PTAuMywgbGVnZW5kPWMoIk5TIiwgIkxQUyIsICJMUCIsICJMQSIpLCBwY2g9MjIsIGNvbD0wLAogICAgICAgcHQuYmc9YygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIsICJ5ZWxsb3ciKSwgcHQuY2V4PTEuNSwgY2V4PTEsIGJ0eT0ibiIpCmxlZ2VuZCh4PTAuMDUsIHk9MC4xLCBsZWdlbmQ9dW5pcXVlKGRlc2lnbiRHcm93dGgpLCBwY2g9dW5pcXVlKGdyb251bSksIGNvbD0iYmxhY2siLAogICAgICAgcHQuYmc9ImJsYWNrIiwgcHQuY2V4PTEuMCwgY2V4PTEsIGJ0eT0ibiIpCgpzdGltX2dyb251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihzdGltX2Rlc2lnbiRHcm93dGgpKQpzdGltX2dyb251bSA8LSBpZmVsc2Uoc3RpbV9ncm9udW09PTIsIDE5LAogICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9ncm9udW09PTEsIDE1LCAxKSkKc3RpbV9wYXRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kUGF0aWVudCkpCnN0aW1fcGF0bnVtIDwtIGlmZWxzZShzdGltX3BhdG51bT09MSwgInBpbmsiLAogICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0yLCAiZ3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTMsICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT00LCAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTUsICJibGFjayIsICJvcmFuZ2UiKSkpKSkKc3RpbV9zYW1wbGVudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24pKQpzdGltX3NhbXBsZW51bSA8LSBpZmVsc2Uoc3RpbV9zYW1wbGVudW09PTMsICJncmVlbiIsCiAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9zYW1wbGVudW09PTIsICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fc2FtcGxlbnVtPT0xLCAiYmxhY2siLCAiZ3JleSIpKSkKcGxvdFBDKHN0aW1fcyR2LCBzdGltX3MkZCwgcGNoPXN0aW1fZ3JvbnVtLCBjb2w9c3RpbV9zYW1wbGVudW0sIGNleD0yKQpsZWdlbmQoeD0wLjA1LCB5PTAuMywgbGVnZW5kPWMoIkxQUyIsICJMUCIsICJMQSIpLCBwY2g9MjIsIGNvbD0wLAogICAgICAgcHQuYmc9YygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIsICJ5ZWxsb3ciKSwgcHQuY2V4PTEuNSwgY2V4PTEsIGJ0eT0ibiIpCmxlZ2VuZCh4PTAuMDUsIHk9MC4xLCBsZWdlbmQ9dW5pcXVlKHN0aW1fZGVzaWduJEdyb3d0aCksIHBjaD11bmlxdWUoc3RpbV9ncm9udW0pLCBjb2w9ImJsYWNrIiwKICAgICAgIHB0LmJnPSJibGFjayIsIHB0LmNleD0xLjAsIGNleD0xLCBidHk9Im4iKQpgYGAKCiMjIE15IEZpZ3VyZSAzQQoKYGBge3IgbXlfcGNhMn0KIyNzdGltX2NvdW50cyA8LSBmaWx0ZXJDb3VudHMoc3RpbV9jb3VudHMsIHRocmVzaD0xLCBtaW5TYW1wbGVzPW1pbih4KSkKIyNkaW0oc3RpbV9jb3VudHMpCiMjc3RpbV9jb3VudHNTdWJRIDwtIHFOb3JtKHN0aW1fY291bnRzKQojI3N0aW1feCA8LSBsb2cyQ1BNKHN0aW1fY291bnRzU3ViUSkKIyNzdGltX3MgPC0gbWFrZVNWRChzdGltX3gkeSkKaHNzIDwtIHNldF9leHB0X2JhdGNoZXMoc3RpbV9leHB0LCBmYWN0PSJwYXRpZW50IikKaHNzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzcywgZmlsdGVyPVRSVUUpKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCBub3JtPSJxdWFudCIpKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCBjb252ZXJ0PSJjcG0iKSkKaHNzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzcywgdHJhbnNmb3JtPSJsb2cyIikpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIGJhdGNoPSJsaW1tYSIpKQpoc3MgPC0gc20oc2V0X2V4cHRfYmF0Y2hlcyhoc3MsIGZhY3Q9Imdyb3d0aCIpKQpwbG90X3BjYShoc3MsIHBsb3RfbGFiZWxzPUZBTFNFKSRwbG90CmBgYAoKIyMgSGVhdG1hcCB3aXRoIHBhdGllbnQgY29ycmVjdGlvbj8/CgpgYGB7cn0KZGlzdHMgPC0gZGlzdCh0KG5ld0RhdGEpKQptYXQgPC0gYXMubWF0cml4KGRpc3RzKQpyb3duYW1lcyhtYXQpIDwtIGNvbG5hbWVzKG1hdCkgPC0gY29uZApoZWF0bWFwIDwtIGhlYXRtYXAuMihtYXQsIHRyYWNlPSJub25lIiwgY29sID0gcmV2KGhtY29sKSwgbWFyZ2luPWMoMTEsIDExKSwKICAgICAgICAgICAgICAgICAgICAgQ29sU2lkZUNvbG9ycz1jb25kaXRpb24uY29sb3IsCiAgICAgICAgICAgICAgICAgICAgIFJvd1NpZGVDb2xvcnM9cGF0aWVudC5jb2xvciwga2V5PSJGQUxTRSIsIHNydENvbD00NSkKYGBgCgojIyBERSBhbmFseXNpcwoKYGBge3J9CmNvdW50c1N1YlEgPC0gcU5vcm0oY291bnRzKQpwYXRpZW50IDwtIGRlc2lnbiRQYXRpZW50Cm1vZCA8LSBtb2RlbC5tYXRyaXgofjArY29uZCtwYXRpZW50LCBkYXRhPWRlc2lnbikKdiA8LSB2b29tKGNvdW50c1N1YlEsIG1vZCwgcGxvdD1UUlVFKQpmaXQgPC0gbG1GaXQodikKYGBgCgojIyBNX0xQUyB2IE1fTlMKCmVCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKCmBgYHtyfQpNX0xQUy5NX05TLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTFBTdk1fTlM9KGNvbmRNX0xQUy1jb25kTV9OUyksIGxldmVscz12JGRlc2lnbikKTV9MUFMuTV9OUy5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIE1fTFBTLk1fTlMuY29udHIubWF0KQpNX0xQUy5NX05TLmViIDwtIGVCYXllcyhNX0xQUy5NX05TLmZpdCkKTV9MUFMuTV9OUy50b3BUYWIgPC0gdG9wVGFibGUoTV9MUFMuTV9OUy5lYiwgY29lZj0iTV9MUFN2TV9OUyIsIG51bWJlcj1ucm93KHYkRSkpCk1fTFBTLk1fTlMudG9wVGFiIDwtIGNiaW5kKHJvd25hbWVzKE1fTFBTLk1fTlMudG9wVGFiKSwgTV9MUFMuTV9OUy50b3BUYWIpCmNvbG5hbWVzKE1fTFBTLk1fTlMudG9wVGFiKSA8LSBjKCJJRCIsICJsb2dGQyIsICJBdmVFeHByIiwgInQiLCAiUC5WYWx1ZSIsICJhZGouUC5WYWwiLCAiQiIpCnJvd25hbWVzKE1fTFBTLk1fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xQUy5NX05TLnRvcFRhYikpCgpscHNfbnNfdGFibGUgPC0gInRvcFRhYl9NX0xQU3ZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiCndyaXRlLmNzdihNX0xQUy5NX05TLnRvcFRhYiwgZmlsZT1scHNfbnNfdGFibGUsCiAgICAgICAgICByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQpgYGAKCkxpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXMgPC0gTV9MUFMuTV9OUy50b3BUYWJbTV9MUFMuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChNX0xQUy5NX05TLnNpZ0dlbmVzJElEKQpgYGAKCkZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKCmBgYHtyfQpNX0xQUy5NX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTFBTLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoTV9MUFMuTV9OUy5zaWdHZW5lc0ZvbGQxJElEKQpgYGAKCkZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKCmBgYHtyfQpNX0xQUy5NX05TLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KE1fTFBTLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoTV9MUFMuTV9OUy5zaWdHZW5lc0ZvbGQyJElEKQpgYGAKCk1ha2UgYW4gTUEgcGxvdAoKYGBge3J9CnNlbCA8LSBNX0xQUy5NX05TLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBNX0xQUy5NX05TLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iTV9MUFN2TV9OUyBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCwgXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKYGBgCgpBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKCmBgYHtyfQpNX0xQUy5NX05TLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTlMuc2lnR2VuZXNbb3JkZXIoLU1fTFBTLk1fTlMuc2lnR2VuZXMkbG9nRkMpLCBdCgpzaWdHZW5lcyA8LSBNX0xQUy5NX05TLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLCB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHX0xQUyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFR19MUFMgPC0gc3Vic2V0KERFR19MUFMsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHX0xQUyA8LSBERUdfTFBTW29yZGVyKC1ERUdfTFBTJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHX0xQUyA8LSBzdWJzZXQoREVHX0xQUywgYWJzKERFR19MUFMkbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHX0xQUywgIkRFR19NX0xQU3ZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VFJVRSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKd3JpdGUuY3N2KERFR19MUFMsICJERUdfTV9MUFN2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCmBgYAoKIyMgTV9MUFMgdiBNX0xBCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKTV9MUFMuTV9MQS5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhNX0xQU3ZNX0xBPSgoY29uZE1fTEEtY29uZE1fTlMpLShjb25kTV9MUFMtY29uZE1fTlMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCk1fTFBTLk1fTEEuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQUy5NX0xBLmNvbnRyLm1hdCkKTV9MUFMuTV9MQS5lYiA8LSBlQmF5ZXMoTV9MUFMuTV9MQS5maXQpCk1fTFBTLk1fTEEudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFBTLk1fTEEuZWIsIGNvZWY9Ik1fTFBTdk1fTEEiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQUy5NX0xBLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQUy5NX0xBLnRvcFRhYiksIE1fTFBTLk1fTEEudG9wVGFiKQpjb2xuYW1lcyhNX0xQUy5NX0xBLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQUy5NX0xBLnRvcFRhYikgPC0gYygxOm5yb3coTV9MUFMuTV9MQS50b3BUYWIpKQoKbHBzX2xhX3RhYmxlIDwtICJ0b3BUYWJfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2Igp3cml0ZS5jc3YoTV9MUFMuTV9MQS50b3BUYWIsIGZpbGU9bHBzX2xhX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKTV9MUFMuTV9MQS5zaWdHZW5lcyA8LSBNX0xQUy5NX0xBLnRvcFRhYltNX0xQUy5NX0xBLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKE1fTFBTLk1fTEEuc2lnR2VuZXMkSUQpCiMjWzFdIDYxNwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCk1fTFBTLk1fTEEuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUFMuTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQUy5NX0xBLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDI0MAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTFBTLk1fTEEuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUFMuTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQUy5NX0xBLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDY5CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gTV9MUFMuTV9MQS50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MUFMuTV9MQS50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTFBTdk1fTEEgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnBuZyIsIHdpZHRoPTcwMCwKICAgICAgICAgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpNX0xQUy5NX0xBLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTEEuc2lnR2VuZXNbb3JkZXIoLU1fTFBTLk1fTEEuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBNX0xQUy5NX0xBLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUcgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUcgPC0gc3Vic2V0KERFRywgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUcgPC0gREVHW29yZGVyKC1ERUckbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUcgPC0gc3Vic2V0KERFRywgYWJzKERFRyRsb2dGQyk+MSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUcsICJERUdfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHLCAiREVHX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIE1fTFBTIHYgTV9MUAoKYGBge3J9CiNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCk1fTFBTLk1fTFAuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MUFN2TV9MUD0oKGNvbmRNX0xQLWNvbmRNX05TKS0oY29uZE1fTFBTLWNvbmRNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQpNX0xQUy5NX0xQLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MUFMuTV9MUC5jb250ci5tYXQpCk1fTFBTLk1fTFAuZWIgPC0gZUJheWVzKE1fTFBTLk1fTFAuZml0KQpNX0xQUy5NX0xQLnRvcFRhYiA8LSB0b3BUYWJsZShNX0xQUy5NX0xQLmViLCBjb2VmPSJNX0xQU3ZNX0xQIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MUFMuTV9MUC50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoTV9MUFMuTV9MUC50b3BUYWIpLCBNX0xQUy5NX0xQLnRvcFRhYikKY29sbmFtZXMoTV9MUFMuTV9MUC50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoTV9MUFMuTV9MUC50b3BUYWIpIDwtIGMoMTpucm93KE1fTFBTLk1fTFAudG9wVGFiKSkKCmxwc19scF90YWJsZSA8LSAidG9wVGFiX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LmNzdiIKd3JpdGUuY3N2KE1fTFBTLk1fTFAudG9wVGFiLCBmaWxlPWxwc19scF90YWJsZSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1Ck1fTFBTLk1fTFAuc2lnR2VuZXMgPC0gTV9MUFMuTV9MUC50b3BUYWJbTV9MUFMuTV9MUC50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChNX0xQUy5NX0xQLnNpZ0dlbmVzJElEKQojI1sxXSAxNDczCgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKTV9MUFMuTV9MUC5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChNX0xQUy5NX0xQLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKE1fTFBTLk1fTFAuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gNDY3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKTV9MUFMuTV9MUC5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChNX0xQUy5NX0xQLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKE1fTFBTLk1fTFAuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gMTI1CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gTV9MUFMuTV9MUC50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MUFMuTV9MUC50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksIi8iLGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xQU3ZNX0xQIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKCmRldi5jb3B5KHBuZywgIk1BcGxvdF9NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5wbmciLCB3aWR0aD03MDAsCiAgICAgICAgIGhlaWdodD03MDApCmRldi5vZmYoKQoKTV9MUFMuTV9MUC5zaWdHZW5lcyA8LSBNX0xQUy5NX0xQLnNpZ0dlbmVzW29yZGVyKC1NX0xQUy5NX0xQLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gTV9MUFMuTV9MUC5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUcgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUcgPC0gc3Vic2V0KERFRywgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUcgPC0gREVHW29yZGVyKC1ERUckbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUcgPC0gc3Vic2V0KERFRywgYWJzKERFRyRsb2dGQyk+MSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUcsICJERUdfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHLCAiREVHX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIE1fTFAgdiBNX05TCgpgYGB7cn0KIyNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCk1fTFAuTV9OUy5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhNX0xQdk1fTlM9KGNvbmRNX0xQLWNvbmRNX05TKSwgbGV2ZWxzPXYkZGVzaWduKQpNX0xQLk1fTlMuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQLk1fTlMuY29udHIubWF0KQpNX0xQLk1fTlMuZWIgPC0gZUJheWVzKE1fTFAuTV9OUy5maXQpCk1fTFAuTV9OUy50b3BUYWIgPC0gdG9wVGFibGUoTV9MUC5NX05TLmViLCBjb2VmPSJNX0xQdk1fTlMiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQLk1fTlMudG9wVGFiIDwtIGNiaW5kKHJvd25hbWVzKE1fTFAuTV9OUy50b3BUYWIpLCBNX0xQLk1fTlMudG9wVGFiKQpjb2xuYW1lcyhNX0xQLk1fTlMudG9wVGFiKSA8LSBjKCJJRCIsICJsb2dGQyIsICJBdmVFeHByIiwgInQiLCAiUC5WYWx1ZSIsICJhZGouUC5WYWwiLCAiQiIpCnJvd25hbWVzKE1fTFAuTV9OUy50b3BUYWIpIDwtIGMoMTpucm93KE1fTFAuTV9OUy50b3BUYWIpKQoKbHBfbnNfdGFibGUgPC0gInRvcFRhYl9NX0xQdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDE4LmNzdiIKd3JpdGUuY3N2KE1fTFAuTV9OUy50b3BUYWIsIGZpbGU9bHBfbnNfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpNX0xQLk1fTlMuc2lnR2VuZXMgPC0gTV9MUC5NX05TLnRvcFRhYltNX0xQLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoTV9MUC5NX05TLnNpZ0dlbmVzJElEKQojI1sxXSA0Mzg2CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKTV9MUC5NX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTFAuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQLk1fTlMuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMTQ1NQoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTFAuTV9OUy5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChNX0xQLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoTV9MUC5NX05TLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDUxOQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIE1fTFAuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MUC5NX05TLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iTV9MUHZNX05TIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfTV9MUHZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAxOC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfTV9MUHZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAxOC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQoKTV9MUC5NX05TLnNpZ0dlbmVzIDwtIE1fTFAuTV9OUy5zaWdHZW5lc1tvcmRlcigtTV9MUC5NX05TLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gTV9MUC5NX05TLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFR19MUDQgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUdfTFA0IDwtIHN1YnNldChERUdfTFA0LCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksCiAgICAgICAgICAgICAgICAgIEZTPSIvdCIpCkRFR19MUDQgPC0gREVHX0xQNFtvcmRlcigtREVHX0xQNCRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFR19MUDQgPC0gc3Vic2V0KERFR19MUDQsIGFicyhERUdfTFA0JGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFR19MUDQsICJERUdfTV9MUHZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAxOC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VCwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCndyaXRlLmNzdihERUdfTFA0LCAiREVHX01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTguY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCmBgYAoKIyMgTV9MQSB2IE1fTlMKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xBLk1fTlMuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MQXZNX05TPShjb25kTV9MQS1jb25kTV9OUyksIGxldmVscz12JGRlc2lnbikKTV9MQS5NX05TLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MQS5NX05TLmNvbnRyLm1hdCkKTV9MQS5NX05TLmViIDwtIGVCYXllcyhNX0xBLk1fTlMuZml0KQpNX0xBLk1fTlMudG9wVGFiIDwtIHRvcFRhYmxlKE1fTEEuTV9OUy5lYiwgY29lZj0iTV9MQXZNX05TIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MQS5NX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xBLk1fTlMudG9wVGFiKSwgTV9MQS5NX05TLnRvcFRhYikKY29sbmFtZXMoTV9MQS5NX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xBLk1fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xBLk1fTlMudG9wVGFiKSkKCmxhX25zX3RhYmxlIDwtICJ0b3BUYWJfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiCndyaXRlLmNzdihNX0xBLk1fTlMudG9wVGFiLCBmaWxlPWxhX25zX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKTV9MQS5NX05TLnNpZ0dlbmVzIDwtIE1fTEEuTV9OUy50b3BUYWJbTV9MQS5NX05TLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKE1fTEEuTV9OUy5zaWdHZW5lcyRJRCkKIyNbMV0gNjE3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKTV9MQS5NX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTEEuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xBLk1fTlMuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMjQwCgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKTV9MQS5NX05TLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KE1fTEEuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xBLk1fTlMuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gNjkKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBNX0xBLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTEEuTV9OUy50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTEF2TV9OUyBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCwgXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgIk1BcGxvdF9NX0xBdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKCmRldi5jb3B5KHBuZywgIk1BcGxvdF9NX0xBdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpNX0xBLk1fTlMuc2lnR2VuZXMgPC0gTV9MQS5NX05TLnNpZ0dlbmVzW29yZGVyKC1NX0xBLk1fTlMuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBNX0xBLk1fTlMuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHX0xBNCA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFR19MQTQgPC0gc3Vic2V0KERFR19MQTQsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwKICAgICAgICAgICAgICAgICAgRlM9Ii90IikKREVHX0xBNCA8LSBERUdfTEE0W29yZGVyKC1ERUdfTEE0JGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHX0xBNCA8LSBzdWJzZXQoREVHX0xBNCwgYWJzKERFR19MQTQkbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHX0xBNCwgIkRFR19NX0xBdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFR19MQTQsICJERUdfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojI0dNX0xQUyB2LiBHTV9OUwoKYGBge3J9CiNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCkdNX0xQUy5HTV9OUy5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhHTV9MUFN2R01fTlM9KGNvbmRHTV9MUFMtY29uZEdNX05TKSwgbGV2ZWxzPXYkZGVzaWduKQpHTV9MUFMuR01fTlMuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBHTV9MUFMuR01fTlMuY29udHIubWF0KQpHTV9MUFMuR01fTlMuZWIgPC0gZUJheWVzKEdNX0xQUy5HTV9OUy5maXQpCkdNX0xQUy5HTV9OUy50b3BUYWIgPC0gdG9wVGFibGUoR01fTFBTLkdNX05TLmViLCBjb2VmPSJHTV9MUFN2R01fTlMiLCBudW1iZXI9bnJvdyh2JEUpKQpHTV9MUFMuR01fTlMudG9wVGFiIDwtIGNiaW5kKHJvd25hbWVzKEdNX0xQUy5HTV9OUy50b3BUYWIpLCBHTV9MUFMuR01fTlMudG9wVGFiKQpjb2xuYW1lcyhHTV9MUFMuR01fTlMudG9wVGFiKSA8LSBjKCJJRCIsICJsb2dGQyIsICJBdmVFeHByIiwgInQiLCAiUC5WYWx1ZSIsICJhZGouUC5WYWwiLCAiQiIpCnJvd25hbWVzKEdNX0xQUy5HTV9OUy50b3BUYWIpIDwtIGMoMTpucm93KEdNX0xQUy5HTV9OUy50b3BUYWIpKQoKZ21fbHBzX25zX3RhYmxlIDwtICJ0b3BUYWJfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiCndyaXRlLmNzdihHTV9MUFMuR01fTlMudG9wVGFiLCBmaWxlPSBnbV9scHNfbnNfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpHTV9MUFMuR01fTlMuc2lnR2VuZXMgPC0gR01fTFBTLkdNX05TLnRvcFRhYltHTV9MUFMuR01fTlMudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoR01fTFBTLkdNX05TLnNpZ0dlbmVzJElEKQojI1sxXSAzMDIKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpHTV9MUFMuR01fTlMuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoR01fTFBTLkdNX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKEdNX0xQUy5HTV9OUy5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAxOTcKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpHTV9MUFMuR01fTlMuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoR01fTFBTLkdNX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKEdNX0xQUy5HTV9OUy5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSAxMDEKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBHTV9MUFMuR01fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIEdNX0xQUy5HTV9OUy50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49IkdNX0xQU3ZHTV9OUyBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCwgXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgIk1BcGxvdF9HTV9MUFN2R01fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKCmRldi5jb3B5KHBuZywgIk1BcGxvdF9HTV9MUFN2R01fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpHTV9MUFMuR01fTlMuc2lnR2VuZXMgPC0gR01fTFBTLkdNX05TLnNpZ0dlbmVzW29yZGVyKC1HTV9MUFMuR01fTlMuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBHTV9MUFMuR01fTlMuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiREVHX0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHLCAiREVHX0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIEdNX0xQUyB2IEdNX0xQCgpUaGlzIGNvbnRyYXN0IHdhcyB3cml0dGVuIGluIHRoZSBvcHBvc2l0ZSBvcmRlciBhcyB0aGUgb3RoZXJzLCBJIHRoaW5rIHRoaXMgaXMKdGhlIHJlYXNvbiBzb21lIG9mIG15IHBsb3RzIGtlZXAgbG9va2luZyBiYWNrd2FyZHMvdXBzaWRlZG93bi4uLiAgSSBhbSBnb2luZyB0bwpjb21tZW50IG91dCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgcmV3cml0ZSBpdCBzbyB0aGF0IGl0IGlzIGlkZW50aWNhbCBpbiBvcmRlciB0bwp3aGF0IEkgZm91bmQgaW46IE1fTFAuTV9MUC5jb250ci5tYXQuCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKCiMjIEhlcmUgaXMgdGhlIG9yaWdpbmFsIGxpbmUKIyMgbG9vayBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgIHYgICAgICAgICAgICAgICAgICAgICB2CiMjR01fTFBTLkdNX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKEdNX0xQU3ZHTV9MUD0oKGNvbmRHTV9MUFMtY29uZEdNX05TKS0oY29uZEdNX0xQLWNvbmRHTV9OUykpLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCiMjCgojIyBBbmQgaGVyZSBpcyBteSB2ZXJzaW9uOgojIyBsb29rIGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+ICB2ICAgICAgICAgICAgICAgICAgICAgdgpHTV9MUFMuR01fTFAuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX0xQPSgoY29uZEdNX0xQLWNvbmRHTV9OUyktKGNvbmRHTV9MUFMtY29uZEdNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCiMjIEVuZCBvZiBteSBjaGFuZ2UuCgpHTV9MUFMuR01fTFAuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBHTV9MUFMuR01fTFAuY29udHIubWF0KQpHTV9MUFMuR01fTFAuZWIgPC0gZUJheWVzKEdNX0xQUy5HTV9MUC5maXQpCkdNX0xQUy5HTV9MUC50b3BUYWIgPC0gdG9wVGFibGUoR01fTFBTLkdNX0xQLmViLCBjb2VmPSJHTV9MUFN2R01fTFAiLCBudW1iZXI9bnJvdyh2JEUpKQpHTV9MUFMuR01fTFAudG9wVGFiIDwtIGNiaW5kKHJvd25hbWVzKEdNX0xQUy5HTV9MUC50b3BUYWIpLCBHTV9MUFMuR01fTFAudG9wVGFiKQpjb2xuYW1lcyhHTV9MUFMuR01fTFAudG9wVGFiKSA8LSBjKCJJRCIsICJsb2dGQyIsICJBdmVFeHByIiwgInQiLCAiUC5WYWx1ZSIsICJhZGouUC5WYWwiLCAiQiIpCnJvd25hbWVzKEdNX0xQUy5HTV9MUC50b3BUYWIpIDwtIGMoMTpucm93KEdNX0xQUy5HTV9MUC50b3BUYWIpKQoKZ21fbHBzX2xwX3RhYmxlIDwtICJ0b3BUYWJfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAyMy5jc3YiCndyaXRlLmNzdihHTV9MUFMuR01fTFAudG9wVGFiLCBmaWxlPWdtX2xwc19scF90YWJsZSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1CkdNX0xQUy5HTV9MUC5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTFAudG9wVGFiW0dNX0xQUy5HTV9MUC50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChHTV9MUFMuR01fTFAuc2lnR2VuZXMkSUQpCiMjWzFdIDE5NAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCkdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChHTV9MUFMuR01fTFAuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoR01fTFBTLkdNX0xQLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDExNAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCkdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChHTV9MUFMuR01fTFAuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoR01fTFBTLkdNX0xQLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDI3CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gR01fTFBTLkdNX0xQLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBHTV9MUFMuR01fTFAudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJHTV9MUFN2R01fTFAgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wbmciLCB3aWR0aD03MDAsCiAgICAgICAgIGhlaWdodD03MDApCmRldi5vZmYoKQoKR01fTFBTLkdNX0xQLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MUC5zaWdHZW5lc1tvcmRlcigtR01fTFBTLkdNX0xQLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xQLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFRyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFRyA8LSBzdWJzZXQoREVHLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFRyA8LSBERUdbb3JkZXIoLURFRyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFRyA8LSBzdWJzZXQoREVHLCBhYnMoREVHJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgIkRFR19HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsCiAgICAgICAgICByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBHTV9MUFMgdiBHTV9MQQoKSSB0aGluayBJIG9ic2VydmUgdGhlIHNhbWUgZmxpcHBpbmcgaGVyZS4KCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQojI0dNX0xQUy5HTV9MQS5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhHTV9MUFN2R01fTEE9KChjb25kR01fTFBTLWNvbmRHTV9OUyktKGNvbmRHTV9MQS1jb25kR01fTlMpKSwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQpHTV9MUFMuR01fTEEuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX0xBPSgoY29uZEdNX0xBLWNvbmRHTV9OUyktKGNvbmRHTV9MUFMtY29uZEdNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCiMjIEVuZCBvZiBteSBjaGFuZ2UKR01fTFBTLkdNX0xBLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX0xBLmNvbnRyLm1hdCkKR01fTFBTLkdNX0xBLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTEEuZml0KQpHTV9MUFMuR01fTEEudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9MQS5lYiwgY29lZj0iR01fTFBTdkdNX0xBIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX0xBLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTEEudG9wVGFiKSwgR01fTFBTLkdNX0xBLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX0xBLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTEEudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTEEudG9wVGFiKSkKCmdtX2xwc19sYV90YWJsZSA8LSAidG9wVGFiX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMjMuY3N2Igp3cml0ZS5jc3YoR01fTFBTLkdNX0xBLnRvcFRhYiwgZmlsZT1nbV9scHNfbGFfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpHTV9MUFMuR01fTEEuc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xBLnRvcFRhYltHTV9MUFMuR01fTEEudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoR01fTFBTLkdNX0xBLnNpZ0dlbmVzJElEKQojI1sxXSAxNwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCkdNX0xQUy5HTV9MQS5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChHTV9MUFMuR01fTEEuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoR01fTFBTLkdNX0xBLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDE1CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKR01fTFBTLkdNX0xBLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KEdNX0xQUy5HTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChHTV9MUFMuR01fTEEuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gNwoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIEdNX0xQUy5HTV9MQS50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gR01fTFBTLkdNX0xBLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJHTV9MUFN2R01fTEEgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgIk1BcGxvdF9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKCmRldi5jb3B5KHBuZywgIk1BcGxvdF9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpHTV9MUFMuR01fTEEuc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xBLnNpZ0dlbmVzW29yZGVyKC1HTV9MUFMuR01fTEEuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBHTV9MUFMuR01fTEEuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiREVHX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHLCAiREVHX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIEJhcnBsb3RzIG9mIEZvbGQtQ2hhbmdlcywgZS5nLiBGaWd1cmUgM0MvRAoKSXQgYXBwZWFycyB0byBtZSB0aGF0IHRoZXNlIGZpZ3VyZXMgYXJlIGNyZWF0ZWQgYnkgbWVyZ2luZyB0aGUgTS9HTSB0YWJsZXMgZm9yCnRoZSBMUC1MUFMgYW5kIExBLUxQUyBjb250cmFzdHMsIHRha2luZyB0aGUgdG9wIH4yMCBmb3IgdGhlIE0gdGFibGUsIGFuZApwbG90dGluZyB0aGUgbG9nMkZDIG9uIHRoZSBsaW5lYXIgc2NhbGUuICBJIGJlbGlldmUgSSBjYW4gdHJpdmlhbGx5IG1vZGlmeSB0aGlzCnRvIGFkZCB0aGUgbG9nRkMgLyB0LXN0YXQuICBUaGUgY2F2ZWF0IHdpbGwgYmUgdGhhdCBkb2luZyB0aGlzIGdpdmVzIG1lIGEgbG9nMgplcnJvciBiYXIsIG5vdCBsaW5lYXIuLi4gIE15IGluY2xpbmF0aW9uIHRoZXJlZm9yZSBpcyB0byBqdXN0IHBsb3QgdGhlIGxvZ0ZDCnJhdGhlciB0aGFuIGNvbnZlcnQgaXQgdG8gbGluZWFyLCBidXQgd2hhdGV2ZXIuCgojIyMgRmlndXJlIDNDIHRvcC1sZWZ0CgpLYWphbCdzIHZhcmlhYmxlcyB0byBjcmVhdGUgdGhpcyBhcmUuLi4KCjEuICBNX0xQUy5NX0xQLnRvcFRhYgoyLiAgR01fTFBTLkdNX0xQLnRvcFRhYgoKVGhlc2Ugd2VyZSBwYXNzZWQgdG8gYmlvbWFydCB0byBnZXQgdGhlIGdlbmUgbmFtZXMgcmF0aGVyIHRoYW4gZW5zZW1ibCBJRHMuCkkgYW0gZ29pbmcgdG8gYmUgbGF6eSBhbmQganVzdCBjb3B5L3Bhc3RlIEthamFsJ3MgY29kZSBmb3IgdGhlc2UgdGFza3MuCgpIYXZpbmcgZG9uZSB0aGUgdG9wLWxlZnQgcGllY2Ugb2YgdGhpcywgaXQgc2VlbXMgdG8gbWUgdGhhdCBpZiB5b3UgYXJlIGdvaW5nIHRvCnRha2UgdGhlIHRvcCAyMCBnZW5lcyBhbmQgZXhjbHVkZSBiYXNlZCBvbiB0aGUgTS1DU0YgYWRqdXN0ZWQgcC12YWx1ZSwgcGVyaGFwcwp5b3Ugc2hvdWxkIGFsc28gZXhjbHVkZSBiYXNlZCBvbiB0aGUgR00tQ1NGIGFkanVzdGVkIHAtdmFsdWUsIGJ1dCB0aGUgd2F5IHRoaXMKd2FzIGRvbmUsIG9ubHkgdGhlIE0gaXMgdXNlZC4gIEluIGl0cyBjdXJyZW50IHN0YXRlLCBJIGFtIG9ubHkgdXNpbmcgdGhlIE0gYXMKcGVyIHRoZSBmaWd1cmVzIGluIHRoZWlyIGN1cnJlbnQgc3RhdGUuCgpOb3RlLCB0aGF0IGlmIHlvdSB3YW50IGVycm9yIGJhcnMgZnJvbSB0aGUgc3RhbmRhcmQgZXJyb3IsIHRoZW4gaXQgaXMgd2FhYWF5CmVhc2llciB0byBzdGF5IG9uIHRoZSBsb2cyIHNjYWxlIHJhdGhlciB0aGFuIGNvbnZlcnQgYmFjayB0byBsaW5lYXIgYmVjYXVzZSB0aGUKbWF0aCBmb3IgY29udmVydGluZyB0aGUgc3RhbmRhcmQgZXJyb3IgYmFjayB0byBsaW5lYXIgaXMgd2VpcmQuICBJZiB0aGUgdGFibGUKaGFkIGEgZmV3IG1vcmUgcGFyYW1ldGVycyBpbiBpdCwgSSBjb3VsZCBkbyBpdCB3aXRob3V0IHN0cnVnZ2xpbmcsIGJ1dCBpdCBkb2Vzbid0LgoKYGBge3IgZmlnM2NfdG9wbGVmdH0KbGlicmFyeShnZ3Bsb3QyKQp3YW50ZWRfY29sdW1ucyA8LSBjKCJJRCIsICJsb2dGQy54IiwgImxvZ0ZDLnkiLCAidC54IiwgInQueSIsICJTeW1ib2wiKQpyZW5hbWVkX2NvbHVtbnMgPC0gYygiSUQiLCAibV9sb2dmYyIsICJnbV9sb2dmYyIsICJtX3QiLCAiZ21fdCIsICJzeW1ib2wiKQoKZmlnM2NfbHBfZGYgPC0gbWVyZ2UoTV9MUFMuTV9MUC50b3BUYWIsIEdNX0xQUy5HTV9MUC50b3BUYWIsIGJ5PSJJRCIpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9ZmlnM2NfbHBfZGZbWyJJRCJdXSwgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCmZpZzNjX2xwX2RmIDwtIG1lcmdlKGZpZzNjX2xwX2RmLCBkZXNjLCBieT0iSUQiLCBhbGwueD1UUlVFKQoKdGxfb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzNjX2xwX2RmW1sibG9nRkMueCJdXSwgZGVjcmVhc2luZz1UUlVFKQpmaWczY190bF9kZiA8LSBmaWczY19scF9kZlt0bF9vcmRlcl9pZHgsIF0Kc2lnX2lkeCA8LSBmaWczY190bF9kZltbImFkai5QLlZhbC54Il1dIDw9IDAuMDUKZmlnM2NfdGxfZGYgPC0gaGVhZChmaWczY190bF9kZltzaWdfaWR4LCBdLCBuPTI1KQpmaWczY190bF9kZiA8LSBmaWczY190bF9kZlssIHdhbnRlZF9jb2x1bW5zXQpjb2xuYW1lcyhmaWczY190bF9kZikgPC0gcmVuYW1lZF9jb2x1bW5zCnJvd25hbWVzKGZpZzNjX3RsX2RmKSA8LSBmaWczY190bF9kZltbIklEIl1dCmZpZzNjX3RsX2RmW1siSUQiXV0gPC0gTlVMTApmaWczY190bF9kZltbIm1fbGZjZXJyIl1dIDwtIGZpZzNjX3RsX2RmW1sibV9sb2dmYyJdXSAvIGZpZzNjX3RsX2RmW1sibV90Il1dCmZpZzNjX3RsX2RmW1siZ21fbGZjZXJyIl1dIDwtIGZpZzNjX3RsX2RmW1siZ21fbG9nZmMiXV0gLyBmaWczY190bF9kZltbImdtX3QiXV0KCmZpZzNjX3RsX20gPC0gZmlnM2NfdGxfZGZbLCBjKCJtX2xvZ2ZjIiwgInN5bWJvbCIsICJtX2xmY2VyciIpXQpmaWczY190bF9tW1sidHlwZSJdXSA8LSAibSIKY29sbmFtZXMoZmlnM2NfdGxfbSkgPC0gYygibG9nZmMiLCAic3ltYm9sIiwgImxmY2VyciIsICJ0eXBlIikKZmlnM2NfdGxfZ20gPC0gZmlnM2NfdGxfZGZbLCBjKCJnbV9sb2dmYyIsICJzeW1ib2wiLCAiZ21fbGZjZXJyIildCmZpZzNjX3RsX2dtW1sidHlwZSJdXSA8LSAiZ20iCmNvbG5hbWVzKGZpZzNjX3RsX2dtKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQptZWx0ZWRfZmlnM2NfdGwgPC0gcmJpbmQoZmlnM2NfdGxfbSwgZmlnM2NfdGxfZ20pCm1lbHRlZF9maWczY190bFtbInN5bWJvbCJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzNjX3RsW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1maWczY190bF9tW1sic3ltYm9sIl1dKQptZWx0ZWRfZmlnM2NfdGxbWyJ0eXBlIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfdGxbWyJ0eXBlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygibSIsICJnbSIpKQoKcCA8LSBnZ3Bsb3QoZGF0YT1tZWx0ZWRfZmlnM2NfdGwsIGFlcyh4PXN5bWJvbCwgeT1sb2dmYywgZmlsbD10eXBlKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJjb3JuZmxvd2VyYmx1ZSIsICJkYXJrZ3JleSIpKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjLWxmY2VyciwgeW1heD1sb2dmYytsZmNlcnIpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKIyMjIEZpZ3VyZSAzQyBib3R0b20tbGVmdAoKYGBge3IgZmlnM0NfYm90dG9tbGVmdH0KYmxfb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzNjX2xwX2RmW1sibG9nRkMueCJdXSwgZGVjcmVhc2luZz1GQUxTRSkKZmlnM2NfYmxfZGYgPC0gZmlnM2NfbHBfZGZbYmxfb3JkZXJfaWR4LCBdCnNpZ19pZHggPC0gZmlnM2NfYmxfZGZbWyJhZGouUC5WYWwueCJdXSA8PSAwLjA1CmZpZzNjX2JsX2RmIDwtIGhlYWQoZmlnM2NfYmxfZGZbc2lnX2lkeCwgXSwgbj0yMCkKZmlnM2NfYmxfZGYgPC0gZmlnM2NfYmxfZGZbLCB3YW50ZWRfY29sdW1uc10KY29sbmFtZXMoZmlnM2NfYmxfZGYpIDwtIHJlbmFtZWRfY29sdW1ucwojI3Jvd25hbWVzKGZpZzNjX2JsX2RmKSA8LSBmaWczY19ibF9kZltbIklEIl1dCmZpZzNjX2JsX2RmW1siSUQiXV0gPC0gTlVMTApmaWczY19ibF9kZltbIm1fbGZjZXJyIl1dIDwtIGZpZzNjX2JsX2RmW1sibV9sb2dmYyJdXSAvIGZpZzNjX2JsX2RmW1sibV90Il1dCmZpZzNjX2JsX2RmW1siZ21fbGZjZXJyIl1dIDwtIGZpZzNjX2JsX2RmW1siZ21fbG9nZmMiXV0gLyBmaWczY19ibF9kZltbImdtX3QiXV0KCmZpZzNjX2JsX20gPC0gZmlnM2NfYmxfZGZbLCBjKCJtX2xvZ2ZjIiwgInN5bWJvbCIsICJtX2xmY2VyciIpXQpmaWczY19ibF9tW1sidHlwZSJdXSA8LSAibSIKY29sbmFtZXMoZmlnM2NfYmxfbSkgPC0gYygibG9nZmMiLCAic3ltYm9sIiwgImxmY2VyciIsICJ0eXBlIikKZmlnM2NfYmxfZ20gPC0gZmlnM2NfYmxfZGZbLCBjKCJnbV9sb2dmYyIsICJzeW1ib2wiLCAiZ21fbGZjZXJyIildCmZpZzNjX2JsX2dtW1sidHlwZSJdXSA8LSAiZ20iCmNvbG5hbWVzKGZpZzNjX2JsX2dtKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQptZWx0ZWRfZmlnM2NfYmwgPC0gcmJpbmQoZmlnM2NfYmxfbSwgZmlnM2NfYmxfZ20pCm1lbHRlZF9maWczY19ibFtbInN5bWJvbCJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzNjX2JsW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1maWczY19ibF9tW1sic3ltYm9sIl1dKQptZWx0ZWRfZmlnM2NfYmxbWyJ0eXBlIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfYmxbWyJ0eXBlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygibSIsICJnbSIpKQoKcCA8LSBnZ3Bsb3QoZGF0YT1tZWx0ZWRfZmlnM2NfYmwsIGFlcyh4PXN5bWJvbCwgeT1sb2dmYywgZmlsbD10eXBlKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJjb3JuZmxvd2VyYmx1ZSIsICJkYXJrZ3JleSIpKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjLWxmY2VyciwgeW1heD1sb2dmYytsZmNlcnIpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKIyMjIEZpZ3VyZSAzQyB0b3AtcmlnaHQKClRoZSByaWdodCBzaWRlIG9mIHRoZSBwbG90IGlzIExBIHJhdGhlciB0aGFuIExQLCBvdGhlcndpc2UgdGhpcyBpcyB0aGUgc2FtZS4KCmBgYHtyIGZpZzNjX3RvcHJpZ2h0fQp3YW50ZWRfY29sdW1ucyA8LSBjKCJJRCIsICJsb2dGQy54IiwgImxvZ0ZDLnkiLCAidC54IiwgInQueSIsICJTeW1ib2wiKQpyZW5hbWVkX2NvbHVtbnMgPC0gYygiSUQiLCAibV9sb2dmYyIsICJnbV9sb2dmYyIsICJtX3QiLCAiZ21fdCIsICJzeW1ib2wiKQoKZmlnM2NfbGFfZGYgPC0gbWVyZ2UoTV9MUFMuTV9MQS50b3BUYWIsIEdNX0xQUy5HTV9MQS50b3BUYWIsIGJ5PSJJRCIpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9ZmlnM2NfbGFfZGZbWyJJRCJdXSwgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCmZpZzNjX2xhX2RmIDwtIG1lcmdlKGZpZzNjX2xhX2RmLCBkZXNjLCBieT0iSUQiLCBhbGwueD1UUlVFKQoKdHJfb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzNjX2xhX2RmW1sibG9nRkMueCJdXSwgZGVjcmVhc2luZz1UUlVFKQpmaWczY190cl9kZiA8LSBmaWczY19sYV9kZlt0cl9vcmRlcl9pZHgsIF0Kc2lnX2lkeCA8LSBmaWczY190cl9kZltbImFkai5QLlZhbC54Il1dIDw9IDAuMDUKZmlnM2NfdHJfZGYgPC0gaGVhZChmaWczY190cl9kZltzaWdfaWR4LCBdLCBuPTI1KQpmaWczY190cl9kZiA8LSBmaWczY190cl9kZlssIHdhbnRlZF9jb2x1bW5zXQpjb2xuYW1lcyhmaWczY190cl9kZikgPC0gcmVuYW1lZF9jb2x1bW5zCnJvd25hbWVzKGZpZzNjX3RyX2RmKSA8LSBmaWczY190cl9kZltbIklEIl1dCmZpZzNjX3RyX2RmW1siSUQiXV0gPC0gTlVMTApmaWczY190cl9kZltbIm1fbGZjZXJyIl1dIDwtIGZpZzNjX3RyX2RmW1sibV9sb2dmYyJdXSAvIGZpZzNjX3RyX2RmW1sibV90Il1dCmZpZzNjX3RyX2RmW1siZ21fbGZjZXJyIl1dIDwtIGZpZzNjX3RyX2RmW1siZ21fbG9nZmMiXV0gLyBmaWczY190cl9kZltbImdtX3QiXV0KCmZpZzNjX3RyX20gPC0gZmlnM2NfdHJfZGZbLCBjKCJtX2xvZ2ZjIiwgInN5bWJvbCIsICJtX2xmY2VyciIpXQpmaWczY190cl9tW1sidHlwZSJdXSA8LSAibSIKY29sbmFtZXMoZmlnM2NfdHJfbSkgPC0gYygibG9nZmMiLCAic3ltYm9sIiwgImxmY2VyciIsICJ0eXBlIikKZmlnM2NfdHJfZ20gPC0gZmlnM2NfdHJfZGZbLCBjKCJnbV9sb2dmYyIsICJzeW1ib2wiLCAiZ21fbGZjZXJyIildCmZpZzNjX3RyX2dtW1sidHlwZSJdXSA8LSAiZ20iCmNvbG5hbWVzKGZpZzNjX3RyX2dtKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQptZWx0ZWRfZmlnM2NfdHIgPC0gcmJpbmQoZmlnM2NfdHJfbSwgZmlnM2NfdHJfZ20pCm1lbHRlZF9maWczY190cltbInN5bWJvbCJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzNjX3RyW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1maWczY190cl9tW1sic3ltYm9sIl1dKQptZWx0ZWRfZmlnM2NfdHJbWyJ0eXBlIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfdHJbWyJ0eXBlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygibSIsICJnbSIpKQoKcCA8LSBnZ3Bsb3QoZGF0YT1tZWx0ZWRfZmlnM2NfdHIsIGFlcyh4PXN5bWJvbCwgeT1sb2dmYywgZmlsbD10eXBlKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJjb3JuZmxvd2VyYmx1ZSIsICJkYXJrZ3JleSIpKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjLWxmY2VyciwgeW1heD1sb2dmYytsZmNlcnIpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKIyMjIEZpZ3VyZSAzQyBib3R0b20tcmlnaHQKCmBgYHtyIGZpZzNDX2JvdHRvbXJpZ2h0fQpicl9vcmRlcl9pZHggPC0gb3JkZXIoZmlnM2NfbGFfZGZbWyJsb2dGQy54Il1dLCBkZWNyZWFzaW5nPUZBTFNFKQpmaWczY19icl9kZiA8LSBmaWczY19sYV9kZlticl9vcmRlcl9pZHgsIF0Kc2lnX2lkeCA8LSBmaWczY19icl9kZltbImFkai5QLlZhbC54Il1dIDw9IDAuMDUKZmlnM2NfYnJfZGYgPC0gaGVhZChmaWczY19icl9kZltzaWdfaWR4LCBdLCBuPTIwKQpmaWczY19icl9kZiA8LSBmaWczY19icl9kZlssIHdhbnRlZF9jb2x1bW5zXQpjb2xuYW1lcyhmaWczY19icl9kZikgPC0gcmVuYW1lZF9jb2x1bW5zCiMjcm93bmFtZXMoZmlnM2NfYmxfZGYpIDwtIGZpZzNjX2JsX2RmW1siSUQiXV0KZmlnM2NfYnJfZGZbWyJJRCJdXSA8LSBOVUxMCmZpZzNjX2JyX2RmW1sibV9sZmNlcnIiXV0gPC0gZmlnM2NfYnJfZGZbWyJtX2xvZ2ZjIl1dIC8gZmlnM2NfYnJfZGZbWyJtX3QiXV0KZmlnM2NfYnJfZGZbWyJnbV9sZmNlcnIiXV0gPC0gZmlnM2NfYnJfZGZbWyJnbV9sb2dmYyJdXSAvIGZpZzNjX2JyX2RmW1siZ21fdCJdXQoKZmlnM2NfYnJfbSA8LSBmaWczY19icl9kZlssIGMoIm1fbG9nZmMiLCAic3ltYm9sIiwgIm1fbGZjZXJyIildCmZpZzNjX2JyX21bWyJ0eXBlIl1dIDwtICJtIgpjb2xuYW1lcyhmaWczY19icl9tKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQpmaWczY19icl9nbSA8LSBmaWczY19icl9kZlssIGMoImdtX2xvZ2ZjIiwgInN5bWJvbCIsICJnbV9sZmNlcnIiKV0KZmlnM2NfYnJfZ21bWyJ0eXBlIl1dIDwtICJnbSIKY29sbmFtZXMoZmlnM2NfYnJfZ20pIDwtIGMoImxvZ2ZjIiwgInN5bWJvbCIsICJsZmNlcnIiLCAidHlwZSIpCm1lbHRlZF9maWczY19iciA8LSByYmluZChmaWczY19icl9tLCBmaWczY19icl9nbSkKbWVsdGVkX2ZpZzNjX2JyW1sic3ltYm9sIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfYnJbWyJzeW1ib2wiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWZpZzNjX2JyX21bWyJzeW1ib2wiXV0pCm1lbHRlZF9maWczY19icltbInR5cGUiXV0gPC0gZmFjdG9yKG1lbHRlZF9maWczY19icltbInR5cGUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJtIiwgImdtIikpCgpwIDwtIGdncGxvdChkYXRhPW1lbHRlZF9maWczY19iciwgYWVzKHg9c3ltYm9sLCB5PWxvZ2ZjLCBmaWxsPXR5cGUpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImNvcm5mbG93ZXJibHVlIiwgImRhcmtncmV5IikpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG9nZmMtbGZjZXJyLCB5bWF4PWxvZ2ZjK2xmY2VyciksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTAuNSkpCnAKYGBgCgoKCiMjIFZlbm4gRGlhZ3JhbSBvZiBzaGFyZWQgREVHIGJldHdlZW4gTS1DU0YgTFBTIHYgTEEgdiBMUAoKVXByZWd1bGF0ZWQgZ2VuZXMgY29tcGFyZWQgdG8gTlMKCmBgYHtyfQp2X2RhdGEgPC0gbGlzdChERUdfTEE0W0RFR19MQTQkbG9nRkMgPjAsIF0kSUQsCiAgICAgICAgICAgICAgIERFR19MUDRbREVHX0xQNCRsb2dGQyA+MCwgXSRJRCwKICAgICAgICAgICAgICAgREVHX0xQU1tERUdfTFBTJGxvZ0ZDID4wLCBdJElEKQp2X2RhdGEgPC0gVmVubih2X2RhdGEsIFNldE5hbWVzPWMoIkxQUytBZG8iLCAiTFBTK1BHRTIiLCAiTFBTIiksIG51bWJlck9mU2V0cz0zKQpwbG90KHZfZGF0YSwgZG9XZWlnaHRzPUZBTFNFKQojI2Rldi5jb3B5KHBuZywgIlZlbm5EaWFncmFtIFVwcmVndWxhdGVkIExQUyBMQSBMUCIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKIyNkZXYub2ZmKCk7CmBgYAoKRG93bnJlZ3VsYXRlZCBnZW5lcyBjb21wYXJlZCB0byBOUwoKYGBge3J9CnZfZGF0YSA8LSBsaXN0KERFR19MQTRbREVHX0xBNCRsb2dGQyA8MCwgXSRJRCwKICAgICAgICAgICAgICAgREVHX0xQNFtERUdfTFA0JGxvZ0ZDIDwwLCBdJElELAogICAgICAgICAgICAgICBERUdfTFBTW0RFR19MUFMkbG9nRkMgPDAsIF0kSUQpCnZfZGF0YSA8LSBWZW5uKHZfZGF0YSwgU2V0TmFtZXM9YygiTFBTK0FkbyIsICJMUFMrUEdFMiIsICJMUFMiKSwgbnVtYmVyT2ZTZXRzPTMpCnBsb3Qodl9kYXRhLCBkb1dlaWdodHM9RkFMU0UpCiMjZGV2LmNvcHkocG5nLCAiVmVubkRpYWdyYW0gRG93bnJlZ3VsYXRlZCBMUFMgTEEgTFAiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCiMjZGV2Lm9mZigpOwpgYGAKCiMjIFZvbGNhbm8gUGxvdHMKCk1fTFBTIHYgTV9MQQoKCmBgYHtyIHByZXZpb3VzX3ZvbGNhbm99CnJlcyA8LSByZWFkLmNzdihscHNfbGFfdGFibGUpCiMjcmVzIDwtIHJlYWQudGFibGUoInRvcFRhYl9NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLCBoZWFkZXI9VFJVRSkKaGVhZChyZXMpCndpdGgocmVzLCBwbG90KGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwKICAgICAgICAgICAgICAgbWFpbj0iVm9sY2FubyBwbG90IE1fTFBTIHYgTV9MQSIsIHhsaW09YygtNywgNykpKQoKIyMgQWRkIGNvbG9yZWQgcG9pbnRzOiByZWQgaWYgcGFkajwwLjA1LCBvcmFuZ2Ugb2YgbG9nMkZDPjEsIGdyZWVuIGlmIGJvdGgpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSApLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idmlvbGV0cmVkMiIpKQp3aXRoKHN1YnNldChyZXMsIGFicyhsb2dGQyk+MSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3RfTV9MUFNfdl9NX0xBLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCmBgYAoKTV9MUFMgdiBNX0xQCgpgYGB7ciB1bmV2YWxfdm9sY2Fub30KcmVzIDwtIHJlYWQuY3N2KCJ0b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwgaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTFAiLCB4bGltPWMoLTcsIDcpKSkKCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQyk+MSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCmRldi5jb3B5KHBuZywgIlZvbGNhbm9QbG90X01fTFBTX3ZfTV9MUC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIFJpY2ggRmFjdG9yIEdyYXBocwoKIyMgR08gdGVybXMgc2hhcmVkIExBIExQCgpgYGB7cn0KR09TaGFyZWRwYXRod2F5cyA8LSByZWFkLnRhYmxlKCJHTyBNRiBGRFIgLjA1IFRPUCA1IG9ubHktMi50eHQiLCBoZWFkZXI9VFJVRSwgc2VwPSdcdCcpCkdPU2hhcmVkcGF0aHdheXMgPC0gR09TaGFyZWRwYXRod2F5c1tvcmRlcihHT1NoYXJlZHBhdGh3YXlzJHAuVmFsdWUsIGRlY3JlYXNpbmc9VFJVRSksIF0KCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDE4LCAzLCA4KSkKcGxvdChHT1NoYXJlZHBhdGh3YXlzJFJpY2guRmFjdG9yLCBjKDE6NSksIGF4ZXM9RiwKICAgICBwYW5lbC5maXJzdD1hYmxpbmUoaD0xOjUsIHY9c2VxKDAuMSwgMC42LCAwLjEpLCBjb2w9ImdyZXk5MCIpLAogICAgIGNleD1hcy5udW1lcmljKEdPU2hhcmVkcGF0aHdheXMkR2VuZS5OdW1iZXIpLzQsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhHT1NoYXJlZHBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC4wNCkpCmF4aXMoc2lkZT0yLCBhdD0xOjUsIGxhYmVscz1hcy5jaGFyYWN0ZXIoR09TaGFyZWRwYXRod2F5cyRHZW5lU2V0KSwgbGFzPTIsIGNleC5heGlzPTAuNSkKYXhpcyhzaWRlPTEsIHRpY2s9R09TaGFyZWRwYXRod2F5c1tbIlJpY2guRmFjdG9yIl1dKQpgYGAKCiMjIyBLRUdHIExBCgpgYGB7ciwgZXZhbD1GQUxTRX0KTEFwYXRod2F5cyA8LSByZWFkLnRhYmxlKCJDeXRvc2NhcGUgUGF0aHdheXMvTEEgdiBMUFMudHh0IiwgaGVhZGVyPVRSVUUsIHNlcD0nXHQnKQpMQXBhdGh3YXlzIDwtIExBcGF0aHdheXNbb3JkZXIoTEFwYXRod2F5cyRwLlZhbHVlLCBkZWNyZWFzaW5nPVRSVUUpLCBdCiNwbG90IHggdi4geSwgY2hhbmdlIHNpemUsIGFzc2lnbiBjb2xvciB0byBwLXZhbHVlCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDE4LCAzLCA4KSkKcGxvdChMQXBhdGh3YXlzJFJpY2guRmFjdG9yLCBjKDE6MjgpLCBheGVzPUYsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MToyOCwgdj1zZXEoMC4xLCAwLjQsIDAuMSksIGNvbD0iZ3JleTkwIiksCiAgICAgY2V4PWFzLm51bWVyaWMoTEFwYXRod2F5cyRHZW5lLk51bWJlcikvMTAsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhMQXBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC40KSkKYXhpcyhzaWRlPTIsIGF0PTE6MjgsIGxhYmVscz1hcy5jaGFyYWN0ZXIoTEFwYXRod2F5cyRQYXRod2F5KSwgbGFzPTIsIGNleC5heGlzPTAuOCkKYXhpcyhzaWRlPTEsIHRpY2s9TEFwYXRod2F5cyRSaWNoLkZhY3RvciwgcG9zPTAuNCkKYGBgCgojIyMgR08gTEEKCmBgYHtyLCBldmFsPUZBTFNFfQpHT0xBcGF0aHdheXMgPC0gcmVhZC50YWJsZSgiQ3l0b3NjYXBlIFBhdGh3YXlzL0dPIEJQIExBIHdob2xlIG5ldHdvcmsudHh0IiwgaGVhZGVyPVRSVUUsIHNlcD0nXHQnKQpHT0xBcGF0aHdheXMgPC0gR09MQXBhdGh3YXlzW29yZGVyKEdPTEFwYXRod2F5cyRwLlZhbHVlLCBkZWNyZWFzaW5nPVRSVUUpLCBdCiMjcGxvdCB4IHYuIHksIGNoYW5nZSBzaXplLCBhc3NpZ24gY29sb3IgdG8gcC12YWx1ZQpjb2xvclJhbXAgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJ0dXJxdW9pc2UxIiwgIm1lZGl1bWJsdWUiKSkoNTApCnBhcihtYXI9Yyg1LCAyMCwgMywgOCkpCnBsb3QoR09MQXBhdGh3YXlzJFJpY2guRmFjdG9yLCBjKDE6NTcpLCBheGVzPUYsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MTo1Nywgdj1zZXEoMC4xLCAwLjUsIDAuMSksIGNvbD0iZ3JleTkwIiksCiAgICAgY2V4PWFzLm51bWVyaWMoR09MQXBhdGh3YXlzJEdlbmUuTnVtYmVyKS8xMCwKICAgICBjb2w9Y29sb3JSYW1wW2N1dChhcy5udW1lcmljKEdPTEFwYXRod2F5cyRwLlZhbHVlKSwgYnJlYWtzPTUwKV0sCiAgICAgcGNoPTIwLCB5bGFiPSIgIiwgeGxhYj0iUmljaCBGYWN0b3IiLCBtYWluPSJQYXRod2F5cyBFbnJpY2hlZCIsCiAgICAgeGxpbT1jKDAsIDAuNSkpCmF4aXMoc2lkZT0yLGF0PTE6NTcsIGxhYmVscz1hcy5jaGFyYWN0ZXIoR09MQXBhdGh3YXlzJFBhdGh3YXkpLCBsYXM9MiwgY2V4LmF4aXM9MC44KQpheGlzKHNpZGU9MSwgdGljaz1HT0xBcGF0aHdheXMkUmljaC5GYWN0b3IsIHBvcz0wLjQpCmBgYAoKIyMjIEdPIExQCgpgYGB7ciwgZXZhbD1GQUxTRX0KR09MUHBhdGh3YXlzIDwtIHJlYWQudGFibGUoIkN5dG9zY2FwZSBQYXRod2F5cy9HT19CUF9MUHZMUFMudHh0IiwgaGVhZGVyPVRSVUUsIHNlcD0nXHQnKQpHT0xQcGF0aHdheXMgPC0gR09MUHBhdGh3YXlzW29yZGVyKEdPTFBwYXRod2F5cyRwLlZhbHVlLCBkZWNyZWFzaW5nPVRSVUUpLCBdCgpjb2xvclJhbXAgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJ0dXJxdW9pc2UxIiwgIm1lZGl1bWJsdWUiKSkoNTApCnBhcihtYXI9Yyg1LCAxOCwgMywgOCkpCnBsb3QoR09MUHBhdGh3YXlzJFJpY2guRmFjdG9yLCBjKDE6MzUpLCBheGVzPUYsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MTozNSwgdj1zZXEoMC4xLCAwLjYsIDAuMSksIGNvbD0iZ3JleTkwIiksCiAgICAgY2V4PWFzLm51bWVyaWMoR09MUHBhdGh3YXlzJEdlbmUuTnVtYmVyKS8yMCwKICAgICBjb2w9Y29sb3JSYW1wW2N1dChhcy5udW1lcmljKEdPTFBwYXRod2F5cyRwLlZhbHVlKSwgYnJlYWtzPTUwKV0sCiAgICAgcGNoPTIwLCB5bGFiPSIgIiwgeGxhYj0iUmljaCBGYWN0b3IiLCBtYWluPSJQYXRod2F5cyBFbnJpY2hlZCIsCiAgICAgeGxpbT1jKDAsIDAuNikpCmF4aXMoc2lkZT0yLCBhdD0xOjM1LCBsYWJlbHM9YXMuY2hhcmFjdGVyKEdPTFBwYXRod2F5cyRQYXRod2F5KSwgbGFzPTIsIGNleC5heGlzPTAuNSkKYXhpcyhzaWRlPTEsIHRpY2s9R09MUHBhdGh3YXlzJFJpY2guRmFjdG9yLCBwb3M9MC40KQpgYGAKCiMgVm9sY2FubyBwbG90IE1fTFBTXzQgdiBNX0xQXzQKCiMjIEZpZ3VyZSAzQiB0b3AtbGVmdAoKYGBge3IgZmlyc3Rfdm9sY2Fub30KcmVzIDwtIHJlYWQuY3N2KCJ0b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwKICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgcGNoPTIwLCBtYWluPSJWb2xjYW5vIHBsb3QgTV9MUFMgdiBNX0xQIiwgeGxpbT1jKC03LCA3KSkpCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpPjEpLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9Im9yYW5nZSIpKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgJiBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLAogICAgICAgICAgICBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJWb2xjYW5vUGxvdF9NX0xQU192c19NX0xQLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgdXAgc2lnbmlmaWNhbnQgZ2VuZXMKCmBgYHtyIHByaW50X251bWJlcnNfdXAxfQpzaWdfdXBfaWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA+IDEKc3VtKHNpZ191cF9pZHgpCnNpZ191cF9pZHMgPC0gcmVzW3NpZ191cF9pZHgsICJJRCJdCmhlYWQoc2lnX3VwX2lkcykKYGBgCgojIyMgVGhlIG51bWJlciBvZiBkb3duIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX2Rvd24xfQpzaWdfZG93bl9pZHggPC0gcmVzWywgImFkai5QLlZhbCJdIDwgMC4wNSAmIHJlc1ssICJsb2dGQyJdIDwgLTEKc3VtKHNpZ19kb3duX2lkeCkKc2lnX2Rvd25faWRzIDwtIHJlc1tzaWdfZG93bl9pZHgsICJJRCJdCmhlYWQoc2lnX2Rvd25faWRzKQpgYGAKCiMgVm9sY2FubyBwbG90IE1fTFBTXzQgdiBNX0xBXzQKCiMjIEZpZ3VyZSAzQiB0b3AtcmlnaHQKCmBgYHtyIHNlY29uZF92b2xjYW5vfQojI3JlcyA8LSByZWFkLnRhYmxlKCJ0b3BUYWJfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwKIyMgICAgICAgICAgICAgICAgICBoZWFkZXI9VFJVRSkKcmVzIDwtIHJlYWQuY3N2KGxwc19sYV90YWJsZSkKaGVhZChyZXMpCndpdGgocmVzLCBwbG90KGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwKICAgICAgICAgICAgICAgbWFpbj0iVm9sY2FubyBwbG90IE1fTFBTIHYgTV9MQSIsIHhsaW09YygtNywgNykpKQojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwKICAgICAgICAgICAgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3RfTV9MUFNfdl9NX0xBLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgdXAgc2lnbmlmaWNhbnQgZ2VuZXMKCmBgYHtyIHByaW50X251bWJlcnNfdXAyfQpzaWdfdXBfaWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA+IDEKc3VtKHNpZ191cF9pZHgpCnNpZ191cF9pZHMgPC0gcmVzW3NpZ191cF9pZHgsICJJRCJdCmhlYWQoc2lnX3VwX2lkcykKYGBgCgojIyMgVGhlIG51bWJlciBvZiBkb3duIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX2Rvd24yfQpzaWdfZG93bl9pZHggPC0gcmVzWywgImFkai5QLlZhbCJdIDwgMC4wNSAmIHJlc1ssICJsb2dGQyJdIDwgLTEKc3VtKHNpZ19kb3duX2lkeCkKc2lnX2Rvd25faWRzIDwtIHJlc1tzaWdfZG93bl9pZHgsICJJRCJdCmhlYWQoc2lnX2Rvd25faWRzKQpgYGAKCiMgVm9sY2FubyBwbG90IEdNX0xQU180IHYgR01fTEFfNAoKIyMgRmlndXJlIDNCIGJvdHRvbS1yaWdodAoKYGBge3IgdGhpcmRfdm9sY2Fub30KcmVzIDwtIHJlYWQuY3N2KGdtX2xwc19sYV90YWJsZSkKIyNyZXMgPC0gcmVhZC50YWJsZSgiR01fTFBTIHYgR01fTEEvdG9wVGFiX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMjMudHh0IiwKIyNoZWFkZXI9VFJVRSkKaGVhZChyZXMpCndpdGgocmVzLCBwbG90KGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwKICAgICAgICAgICAgICAgbWFpbj0iVm9sY2FubyBwbG90IEdNX0xQU180IHYgR01fTEFfNCIsIHhsaW09YygtNywgNykpKQojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3QgR01fTFBTIHYgR01fTEEiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIyBUaGUgbnVtYmVyIG9mIHVwIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX3VwM30Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQpoZWFkKHNpZ191cF9pZHMpCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgZG93biBzaWduaWZpY2FudCBnZW5lcwoKYGBge3IgcHJpbnRfbnVtYmVyc19kb3duM30Kc2lnX2Rvd25faWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA8IC0xCnN1bShzaWdfZG93bl9pZHgpCnNpZ19kb3duX2lkcyA8LSByZXNbc2lnX2Rvd25faWR4LCAiSUQiXQpoZWFkKHNpZ19kb3duX2lkcykKYGBgCgojIFZvbGNhbm8gcGxvdCBHTV9MUFNfNCB2IEdNX0xQXzQKCiMjIEZpZ3VyZSAzQiBib3R0b20tbGVmdAoKU28sIGl0IGFwcGVhcnMgSSBnZXQgdGhlIGludmVyc2Ugb2Ygd2hhdCBpcyBpbiB0aGUgZmlndXJlLiAgRGlkIHRoZSBjb250cmFzdCBnZXQgcmV2ZXJzZWQ/CgpJIHdlbnQgYmFjayB0byB0aGUgc2VjdGlvbiB3aGljaCBkZWZpbmVzIHRoaXMsIGl0IGhhcyB0aGUgaGVhZGluZwonR01fTFBTX3ZfR01fTFAnIGFuZCB0aGUgY29udHJhc3QgYXBwZWFycyB0byBtZSB0byBiZSBjb3JyZWN0LiAgQXQgbGVhc3QgaXQgaXMKd3JpdHRlbiBsaWtlIHRoaXM6Cgo8Y29kZT4KR01fTFBTLkdNX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKEdNX0xQU3ZHTV9MUD0oKGNvbmRHTV9MUFMtY29uZEdNX05TKS0oY29uZEdNX0xQLWNvbmRHTV9OUykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQo8L2NvZGU+CgpNeSBpbmNsaW5hdGlvbiBpcyB0aGVyZWZvcmUgdGhhdCB0aGlzIGdvdCBmbGlwcGVkPwoKYGBge3IgZm91cnRoX3ZvbGNhbm99CiMjcmVzIDwtIHJlYWQudGFibGUoInRvcFRhYl9HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLnR4dCIsCiMjICAgICAgICAgICAgICAgICAgaGVhZGVyPVRSVUUpCnJlcyA8LSByZWFkLmNzdihnbV9scHNfbHBfdGFibGUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBHTV9MUFMgdiBHTV9MUCIsIHhsaW09YygtNywgNykpKQojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3QgR01fTFBTIHYgR01fTFAiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIyBUaGUgbnVtYmVyIG9mIHVwIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX3VwNH0Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQpoZWFkKHNpZ191cF9pZHMpCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgZG93biBzaWduaWZpY2FudCBnZW5lcwoKYGBge3IgcHJpbnRfbnVtYmVyc19kb3duNH0Kc2lnX2Rvd25faWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA8IC0xCnN1bShzaWdfZG93bl9pZHgpCnNpZ19kb3duX2lkcyA8LSByZXNbc2lnX2Rvd25faWR4LCAiSUQiXQpoZWFkKHNpZ19kb3duX2lkcykKYGBgCg==