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

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

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

1.27 GM_LPS v GM_LA

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

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

1.29 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.30 Rich Factor Graphs

1.31 GO terms shared LA LP

2 Volcano plot M_LPS_4 v M_LP_4

##                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

3 Volcano plot M_LPS_4 v M_LA_4

##                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

4 Volcano plot GM_LPS_4 v GM_LA_4

##                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

5 Volcano plot GM_LPS_4 v GM_LP_4

##                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
LS0tCnRpdGxlOiAiSHVtYW4gTWFjcm9waGFnZXM6IE0tQ1NGIHYgR00tQ1NGOiBMUFMsIExQUytBZGVub3NpbmUsIExQUytQR0UyIgphdXRob3I6ICJLYWphbCBIYW1pZHphZGVoIGFuZCBhdGIiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiIgp2ZXIgPC0gIjIwMjAwMzMwIgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCiMjcm1kX2ZpbGUgPC0gIjAzX2V4cHJlc3Npb25faW5mZWN0aW9uXzIwMTgwODIyLlJtZCIKYGBgCgojIEEgdmVyc2lvbiBvZiBLYWphbCdzIFIgbWFya2Rvd24gZG9jdW1lbnQgd2l0aCBzb21lIG1vcmUgbWlub3IgY2hhbmdlcwoKIyMgTGlicmFyaWVzCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRldnRvb2xzKQpsaWJyYXJ5KHR4aW1wb3J0KQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KERFU2VxMikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoY2JjYlNFUSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoVmVubmVyYWJsZSkKbGlicmFyeShlZGdlUikKbGlicmFyeShjYWxpYnJhdGUpCmxpYnJhcnkoc2NhbGVzKQpgYGAKCkluIHRoaXMgdmVyc2lvbiBvZiBLYWphbCdzIGRvY3VtZW50LCBJIHdpbGwgcmVwZWF0IGVhY2ggc3RlcCB3aXRoIHNvbWUgY2hhbmdlcwp0byBzZWUgaWYgSSBjYW4gbWFrZSB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyIGZvciBmdXR1cmUgbW9kaWZpY2F0aW9uLgoKSSB3aWxsIHRoZXJlZm9yZSBsZWF2ZSBLYWphbCdzIHdvcmsgdW5jaGFuZ2VkIGFuZCBmb2xsb3cgZWFjaCBibG9jayB3aXRoIGFuIGFsdGVybmF0aXZlLgoKIyMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5LCBpbXBvcnQgbWV0YWRhdGEgYW5kIGFidW5kYW5jZSBmaWxlcwoKYGBge3IgcmVhZF9kYXRhfQpkZXNpZ24gPC0gcmVhZC50YWJsZSgnTWV0YURhdGEgb25seSA0IGhvdXIudHh0JywgaGVhZGVyPVQsIHNlcD0nXHQnKQpkZXNpZ25bWyJQYXRpZW50Il1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJQYXRpZW50Il1dKQpkZXNpZ25bWyJTdGltdWxhdGlvbiJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siU3RpbXVsYXRpb24iXV0pCmRlc2lnbltbIkJhdGNoIl1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJCYXRjaCJdXSkKZGVzaWduW1siR3Jvd3RoIl1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJHcm93dGgiXV0pCmZpbGVzIDwtIGZpbGUucGF0aCgia2FsbGlzdG8gYWJ1bmRhbmNlIGZpbGVzLyIsIGRlc2lnbiRIUEdMLklkZW50aWZpZXIsICJhYnVuZGFuY2UudHN2IikKbmFtZXMoZmlsZXMpIDwtIHBhc3RlMCgiSFBHTDA5IiwgYygxMjozMSwgNDI6NjApKQpyb3duYW1lcyhkZXNpZ24pIDwtIGRlc2lnbltbMV1dCgpzdGltX2Rlc2lnbl9pZHggPC0gZGVzaWduW1siU3RpbXVsYXRpb24iXV0gIT0gIk5TIgpzdGltX2Rlc2lnbiA8LSBkZXNpZ25bc3RpbV9kZXNpZ25faWR4LCBdCmBgYAoKIyMgQ29udmVydCB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSUQKCmBgYHtyIGVuc2VtYmx9CmVuc2VtYmwgPC0gdXNlTWFydCgiRU5TRU1CTF9NQVJUX0VOU0VNQkwiLCBkYXRhc2V0PSJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiLCBob3N0PSJ1c2Vhc3QuZW5zZW1ibC5vcmciKQp0eDJnZW5lIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIsICJjaHJvbW9zb21lX25hbWUiKSwgbWFydD1lbnNlbWJsKQpnb29kX2lkeCA8LSBncmVwbCh4PXR4MmdlbmVbWyJjaHJvbW9zb21lX25hbWUiXV0sIHBhdHRlcm49Il5bWzphbG51bTpdXXsxLDJ9JCIpCmdvb2Rfb25lcyA8LSB0eDJnZW5lW2dvb2RfaWR4LCAtM10KYGBgCgojIyBDcmVhdGUgY291bnRzIHRhYmxlCgpgYGB7cn0KdHhpLmthbGxpc3RvLnRzdiA8LSB0eGltcG9ydChmaWxlcywgdHlwZT0ia2FsbGlzdG8iLCB0eDJnZW5lPWdvb2Rfb25lcywgY291bnRzRnJvbUFidW5kYW5jZT0ibGVuZ3RoU2NhbGVkVFBNIikKbnJvdyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKCndyaXRlLnRhYmxlKHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fQ0RTXzIwMTgwNzExLnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fMjAxODA3MTEuY3N2Iiwgcm93Lm5hbWVzPVQsIHF1b3RlPUYpCgpzdGltX2NvdW50cyA8LSB0eGkua2FsbGlzdG8udHN2JGNvdW50cwpzdGltX2NvdW50c19pZHggPC0gY29sbmFtZXMoc3RpbV9jb3VudHMpICVpbiUgcm93bmFtZXMoc3RpbV9kZXNpZ24pCnN0aW1fY291bnRzIDwtIHN0aW1fY291bnRzWywgc3RpbV9jb3VudHNfaWR4XQpgYGAKClRoaXMgaXMgYSBwb3RlbnRpYWxseSBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpbiBob3cgSSBhbmQgS2FqYWwgdHJlYXRlZCB0aGUgZGF0YS4KVGhpcyBpcyBiZWNhdXNlIEkgY3JlYXRlZCB0aGUgZXhwcmVzc2lvbnNldCB3aXRob3V0IHVzaW5nICdsZW5ndGhTY2FsZWRUUE0nLApidXQgbGV0IHR4aW1wb3J0IHVzZSB0aGUgcmF3IGNvdW50cyBzbyB0aGF0IHRoZSB2YXJpb3VzIG5vcm1hbGl6YXRpb25zIGFyZSBub3QKYWZmZWN0ZWQuICBFLmcuIHVzaW5nIHRoZXNlIHNjYWxlZCBudW1iZXJzIHJlc3VsdHMgaW4gbGVzcyB2YXJpYW5jZSBpbiB0aGUgZGF0YQphbmQgbWF5IGxlYWQgdG8gc29tZSBjb25mdXNpb24gZm9yIHRoZSBkb3duc3RyZWFtIHRvb2xzCihlZGdlci9saW1tYS9kZXNlcS9ldGMpLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heSBsZWFkIHRvIGNsZWFuZXIgcGxvdHMsIEkgYW0Kbm90IHN1cmUuCgojIyBDcmVhdGUgREVTZXFEYXRhU2V0CgpOb3Qgc3VyZSB3aGF0IHRoaXMgaXMgYWN0dWFsbHkgZG9pbmcKCmBgYHtyIGRlc2VxX2Rkc30KZGYgPC0gZGF0YS5mcmFtZShjb25kaXRpb249cGFzdGUoZGVzaWduJEhQR0wuSWRlbnRpZmllciwgZGVzaWduJEdyb3d0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduJFN0aW11bGF0aW9uLCBkZXNpZ24kUGF0aWVudCwgc2VwPSJfIikpCnJvd25hbWVzKGRmKT1jb2xuYW1lcyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKZGRzIDwtIERFU2VxRGF0YVNldEZyb21UeGltcG9ydCh0eGkua2FsbGlzdG8udHN2LCBkZiwgfmNvbmRpdGlvbikKbnJvdyhkZHMpCgpkZHNfc3RpbSA8LSBkZHNbLCByb3duYW1lcyhzdGltX2Rlc2lnbildCmBgYAoKIyMgTXkgdmVyc2lvbiBvZiB0aGUgYWJvdmUKCmBgYHtyIGF0Yl9yZWFkX2RhdGF9Cm15X2Rlc2lnbiA8LSBkZXNpZ24Kcm93bmFtZXMobXlfZGVzaWduKSA8LSBkZXNpZ25bWzFdXQpteV9kZXNpZ25bWyJjb25kaXRpb24iXV0gPC0gbXlfZGVzaWduW1siU3RpbXVsYXRpb24iXV0KbXlfZGVzaWduW1siZmlsZSJdXSA8LSBnbHVlOjpnbHVlKCJwcmVwcm9jZXNzaW5nL3tyb3duYW1lcyhteV9kZXNpZ24pfS9hYnVuZGFuY2UudHN2IikKY29sbmFtZXMobXlfZGVzaWduKSA8LSB0b2xvd2VyKGNvbG5hbWVzKG15X2Rlc2lnbikpCmdlbmVfaW5mbyA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoaG9zdD0idXNlYXN0LmVuc2VtYmwub3JnIikkYW5ub3RhdGlvbgpyb3duYW1lcyhnZW5lX2luZm8pIDwtIG1ha2UubmFtZXMoZ2VuZV9pbmZvW1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWU9VFJVRSkKdHhfZ2VuZV9tYXAgPC0gZ2VuZV9pbmZvWywgYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQpoc19leHB0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPW15X2Rlc2lnbiwgZ2VuZV9pbmZvPWdlbmVfaW5mbywgdHhfZ2VuZV9tYXA9dHhfZ2VuZV9tYXApCmhzX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhoc19leHB0LCBmYWN0PSJncm93dGgiKQoKc3RpbV9leHB0IDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldD0ic3RpbXVsYXRpb24hPSdOUyciKQpgYGAKCiMjIEJhciBQbG90IG9mIENvdW50cwoKYGBge3IgYmFycGxvdH0KcGFyKG1hcj1jKDEwLCA0LjUsIDMuNSwgMSkpCnBhcihvbWE9YygwLCAwLCAwLCAwKSkKYmFycGxvdChjb2xTdW1zKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbGFzPTMsIG1haW49J1JhdyBDb3VudHMgQnkgU2FtcGxlJykKCmJhcnBsb3QoY29sU3VtcyhzdGltX2NvdW50cyksIGxhcz0zLCBtYWluPSdSYXcgQ291bnRzIEJ5IFNhbXBsZScpCmBgYAoKIyMgQm94IFBsb3Qgb2YgQ291bnRzCgpgYGB7ciBjb3VudF9iYXJwbG90fQpkZHMgPC0gZXN0aW1hdGVTaXplRmFjdG9ycyhkZHMpCm5jdHMgPC0gY291bnRzKGRkcywgbm9ybWFsaXplZD1UUlVFKQp5IDwtIGxvZyhuY3RzICsgMSkKCnBhcihtYXI9Yyg1LCA1LCAyLCAxKSkKcGFyKG9tYT1jKDAsIDAsIDAsIDApKQpib3hwbG90KHksIG5hbWVzPWNvbG5hbWVzKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbGFzPTMsIG1haW49J1BlciBTYW1wbGUgTG9nIG9mIFNpemUtZmFjdG9yIENvdW50cycpCgpkZHNfc3RpbSA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19zdGltKQpzdGltX25jdHMgPC0gY291bnRzKGRkc19zdGltLCBub3JtYWxpemVkPVRSVUUpCnN0aW1feSA8LSBsb2coc3RpbV9uY3RzICsgMSkKCnBhcihtYXI9Yyg1LCA1LCAyLCAxKSkKcGFyKG9tYT1jKDAsIDAsIDAsIDApKQpib3hwbG90KHN0aW1feSwgbmFtZXM9Y29sbmFtZXMoc3RpbV9jb3VudHMpLCBsYXM9MywKICAgICAgICBtYWluPSdQZXIgU2FtcGxlIExvZyBvZiBTaXplLWZhY3RvciBDb3VudHMnKQpgYGAKCmBgYHtyIG15X2JveHBsb3R9CmJveHBsb3QgPC0gcGxvdF9ib3hwbG90KGhzX2V4cHQpCmJveHBsb3QKYGBgCgojIyBNeSBCYXJwbG90IG9mIGNvdW50cwoKYGBge3IgbXlfYmFycGxvdH0KbGlic2l6ZSA8LSBwbG90X2xpYnNpemUoaHNfZXhwdCkKbGlic2l6ZSRwbG90CmxpYnNpemUkc3VtbWFyeQoKcGxvdF9saWJzaXplKHN0aW1fZXhwdCkkcGxvdApgYGAKCiMjIEhlYXRtYXAgb2YgUGVhcnNvbiBDb3JyZWxhdGlvbgoKYGBge3IgY29yaGVhdH0KZGF0Q29yIDwtIGNvcih0eGkua2FsbGlzdG8udHN2JGNvdW50cykKaGVhdG1hcC4yKGRhdENvciwgUm93dj1OQSwgQ29sdj1OQSwKICAgICAgICAgIG1hcmdpbnM9YygxMCwgMTApLAogICAgICAgICAgbGFiUm93PWRmJGNvbmRpdGlvbiwKICAgICAgICAgIGxhYkNvbD1kZiRjb25kaXRpb24sCiAgICAgICAgICBkZW5kcm9ncmFtPSJub25lIiwKICAgICAgICAgIHNjYWxlPSJub25lIiwKICAgICAgICAgIHRyYWNlPSJub25lIiwKICAgICAgICAgIHNydENvbD00NSwgbWFpbj0nUGVhcnNvbiBDb3JyZWxhdGlvbicpCgoKc3RpbV9kYXRDb3IgPC0gY29yKHN0aW1fY291bnRzKQpoZWF0bWFwLjIoc3RpbV9kYXRDb3IsIFJvd3Y9TkEsIENvbHY9TkEsCiAgICAgICAgICBtYXJnaW5zPWMoMTAsIDEwKSwKICAgICAgICAgIGxhYlJvdz1kZiRjb25kaXRpb24sCiAgICAgICAgICBsYWJDb2w9ZGYkY29uZGl0aW9uLAogICAgICAgICAgZGVuZHJvZ3JhbT0ibm9uZSIsCiAgICAgICAgICBzY2FsZT0ibm9uZSIsCiAgICAgICAgICB0cmFjZT0ibm9uZSIsCiAgICAgICAgICBzcnRDb2w9NDUsIG1haW49J1BlYXJzb24gQ29ycmVsYXRpb24nKQpgYGAKCmBgYHtyIG15X2NvcmhlYXR9CnBsb3RfY29yaGVhdChoc19leHB0KSRwbG90CgpwbG90X2NvcmhlYXQoc3RpbV9leHB0KSRwbG90CmBgYAoKIyMgTWVkaWFuIFBhaXJ3aXNlIENvcnJlbGF0aW9uCgpgYGB7ciBzbWN9CmNvck0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoY29yKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSkKcXMgPC0gcXVhbnRpbGUoY29yTSwgcD1jKDEsIDMpLzQpCmlxciA8LSBkaWZmKHFzKQpvdXRMaW1pdCA8LSBxc1sxXSAtIDEuNSAqIGlxcgp5bGltIDwtIGMocG1pbihtaW4oY29yTSksIG91dExpbWl0KSwgbWF4KGNvck0pKQpjb25kIDwtIHBhc3RlKGRlc2lnbiRHcm93dGgsIGRlc2lnbiRTdGltdWxhdGlvbiwgc2VwPSJfIikKY29sIDwtIGlmZWxzZShjb25kPT0iTV9OUyIsICJncmF5NjAiLAogICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iTV9MUFMiLCAiZGVlcHBpbmszIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xBIiwgImRhcmtzZWFncmVlbjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQIiwgImxhdmVuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX05TIiwgImxpZ2h0cGluazEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQUyIsICJtb2NjYXNpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xBIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQIiwgInNwcmluZ2dyZWVuNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibHVlMiIpKSkpKSkpKQpwYXIobWFyPWMoNSwgNC41LCAyLCAxKSkKcGxvdChjb3JNLCB4YXh0PSJuIiwgeWxpbT15bGltLCB5bGFiPSJNZWRpYW4gUGFpcndpc2UgQ29ycmVsYXRpb24iLCB4bGFiPSIiLCBtYWluPSIiLCBjb2w9Y29sLCBwY2g9MTYsIGNleD0xLjUpCmF4aXMoc2lkZT0xLCBhdD1zZXEoYWxvbmc9Y29yTSksIGxhYmVscz1jb2xuYW1lcyh0eGkua2FsbGlzdG8udHN2JGNvdW50cyksIGxhcz0yKQphYmxpbmUoaD1vdXRMaW1pdCwgbHR5PTIpCmFibGluZSh2PTE6bmNvbCh0eGkua2FsbGlzdG8udHN2JGNvdW50cyksIGx0eT0zLCBjb2w9ImJsYWNrIikKCnN0aW1fY29yTSA8LSBtYXRyaXhTdGF0czo6cm93TWVkaWFucyhjb3Ioc3RpbV9jb3VudHMpKQpzdGltX3FzIDwtIHF1YW50aWxlKHN0aW1fY29yTSwgcD1jKDEsIDMpLzQpCnN0aW1faXFyIDwtIGRpZmYoc3RpbV9xcykKc3RpbV9vdXRMaW1pdCA8LSBzdGltX3FzWzFdIC0gKDEuNSAqIGlxcikKc3RpbV95bGltIDwtIGMocG1pbihtaW4oc3RpbV9jb3JNKSwgc3RpbV9vdXRMaW1pdCksIG1heChzdGltX2Nvck0pKQpzdGltX2NvbmQgPC0gcGFzdGUoc3RpbV9kZXNpZ24kR3Jvd3RoLCBzdGltX2Rlc2lnbiRTdGltdWxhdGlvbiwgc2VwPSJfIikKY29sIDwtIGlmZWxzZShjb25kPT0iTV9OUyIsICJncmF5NjAiLAogICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iTV9MUFMiLCAiZGVlcHBpbmszIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xBIiwgImRhcmtzZWFncmVlbjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQIiwgImxhdmVuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX05TIiwgImxpZ2h0cGluazEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQUyIsICJtb2NjYXNpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xBIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQIiwgInNwcmluZ2dyZWVuNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibHVlMiIpKSkpKSkpKQpwYXIobWFyPWMoNSwgNC41LCAyLCAxKSkKcGxvdChzdGltX2Nvck0sIHhheHQ9Im4iLCB5bGltPXlsaW0sIHlsYWI9Ik1lZGlhbiBQYWlyd2lzZSBDb3JyZWxhdGlvbiIsIHhsYWI9IiIsIG1haW49IiIsIGNvbD1jb2wsIHBjaD0xNiwgY2V4PTEuNSkKYXhpcyhzaWRlPTEsIGF0PXNlcShhbG9uZz1zdGltX2Nvck0pLCBsYWJlbHM9Y29sbmFtZXMoc3RpbV9jb3VudHMpLCBsYXM9MikKYWJsaW5lKGg9c3RpbV9vdXRMaW1pdCwgbHR5PTIpCmFibGluZSh2PTE6bmNvbChzdGltX2NvdW50cyksIGx0eT0zLCBjb2w9ImJsYWNrIikKYGBgCgpgYGB7ciBteV9zbWN9CnBsb3Rfc20oaHNfZXhwdCkkcGxvdAoKcGxvdF9zbShzdGltX2V4cHQpJHBsb3QKYGBgCgojIyBGaWx0ZXIgYW5kIE5vcm1hbGl6ZSBDb3VudHMKCmBgYHtyfQpmaWx0ZXJDb3VudHMgPSBmdW5jdGlvbiAoY291bnRzLCBsaWIuc2l6ZSA9IE5VTEwsIHRocmVzaCA9IDEsIG1pblNhbXBsZXMgPSAyKSB7CiAgY3BtcyA8LSAyXmxvZzJDUE0oY291bnRzLCBsaWIuc2l6ZSA9IGxpYi5zaXplKSR5CiAga2VlcCA8LSByb3dTdW1zKGNwbXMgPiB0aHJlc2gpID49IG1pblNhbXBsZXMKICBjb3VudHMgPC0gY291bnRzW2tlZXAsIF0KICBjb3VudHMKfQp4X3RhYmxlIDwtIHRhYmxlKGRlc2lnbiRTdGltdWxhdGlvbikKZGltKHR4aS5rYWxsaXN0by50c3YkY291bnRzKQoKY291bnRzIDwtIGZpbHRlckNvdW50cyh0eGkua2FsbGlzdG8udHN2JGNvdW50cywgdGhyZXNoPTEsIG1pblNhbXBsZXM9bWluKHhfdGFibGUpKQpkaW0oY291bnRzKQpjb3VudHNTdWJRIDwtIHFOb3JtKGNvdW50cykKeCA8LSBsb2cyQ1BNKGNvdW50c1N1YlEpCnMgPC0gbWFrZVNWRCh4JHkpCgpzdGltX3RhYmxlIDwtIHRhYmxlKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKQpzdGltX2NvdW50cyA8LSBmaWx0ZXJDb3VudHMoc3RpbV9jb3VudHMsIHRocmVzaD0xLCBtaW5TYW1wbGVzPW1pbihzdGltX3RhYmxlKSkKZGltKHN0aW1fY291bnRzKQpzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCnN0aW1feCA8LSBsb2cyQ1BNKHN0aW1fY291bnRzU3ViUSkKc3RpbV9zIDwtIG1ha2VTVkQoc3RpbV94JHkpCmBgYAoKIyMgUENBCgpgYGB7cn0KY2JjYlNFUTo6cGNSZXMocyR2LCBzJGQsIGNvbmQsIGRlc2lnbiRCYXRjaClbMTo1LCBdCmNiY2JTRVE6OnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kUGF0aWVudClbMTo1LCBdCgpjYmNiU0VROjpwY1JlcyhzdGltX3Mkdiwgc3RpbV9zJGQsIHN0aW1fY29uZCwgc3RpbV9kZXNpZ24kQmF0Y2gpWzE6NSwgXQpjYmNiU0VROjpwY1JlcyhzdGltX3Mkdiwgc3RpbV9zJGQsIHN0aW1fY29uZCwgc3RpbV9kZXNpZ24kUGF0aWVudClbMTo1LCBdCmBgYAoKIyMgUGxvdCBQQzEgdiBQQzIKCmBgYHtyIG9yaWdpbmFsX3BjYX0KY29uZG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kU3RpbXVsYXRpb24pKQpjb25kbnVtIDwtIGlmZWxzZShjb25kbnVtPT00LCAiZ3JlZW4iLAogICAgICAgICAgIGlmZWxzZShjb25kbnVtPT0zLCAibGlnaHRibHVlIiwKICAgICAgICAgICBpZmVsc2UoY29uZG51bT09MiwgInBpbmsiLAogICAgICAgICAgIGlmZWxzZShjb25kbnVtPT0xLCAicHVycGxlIiwgImJsYWNrIikpKSkKcGF0bnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRQYXRpZW50KSkKcGF0bnVtIDwtIGlmZWxzZShwYXRudW09PTQsIDIxLAogICAgICAgICAgaWZlbHNlKHBhdG51bT09MywgMjIsCiAgICAgICAgICBpZmVsc2UocGF0bnVtPT0yLCAyMywKICAgICAgICAgIGlmZWxzZShwYXRudW09PTEsIDI0LAogICAgICAgICAgaWZlbHNlKHBhdG51bT09NSwgMjUsIDEpKSkpKQpjYmNiU0VROjpwbG90UEMocyR2LCBzJGQsIGNvbD0iYmxhY2siLCBwY2g9cGF0bnVtLCBiZz1jb25kbnVtKQpsZWdlbmQoeD0wLjIsIHk9MC4yLCBsZWdlbmQ9dW5pcXVlKGRlc2lnbiRTdGltdWxhdGlvbiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsImxpZ2h0Ymx1ZSIsInBpbmsiLCJwdXJwbGUiKSwgcHQuY2V4PTEuNSwgY2V4PTAuNSwgYnR5PSJuIikKbGVnZW5kKHg9MC4yLCB5PS0wLjEsIGxlZ2VuZD11bmlxdWUoZGVzaWduJFBhdGllbnQpLCBwY2g9dW5pcXVlKHBhdG51bSksIGNvbD0wLAogICAgICAgcHQuYmc9ImdyYXk5MCIsIHB0LmNleD0xLjUsIGNleD0wLjUsIGJ0eT0ibiIpCgpzdGltX2NvbmRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24pKQpzdGltX2NvbmRudW0gPC0gaWZlbHNlKHN0aW1fY29uZG51bT09NCwgImdyZWVuIiwKICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0zLCAibGlnaHRibHVlIiwKICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0yLCAicGluayIsCiAgICAgICAgICAgaWZlbHNlKHN0aW1fY29uZG51bT09MSwgInB1cnBsZSIsICJibGFjayIpKSkpCnN0aW1fcGF0bnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJFBhdGllbnQpKQpzdGltX3BhdG51bSA8LSBpZmVsc2Uoc3RpbV9wYXRudW09PTQsIDIxLAogICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0zLCAyMiwKICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09MiwgMjMsCiAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTEsIDI0LAogICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT01LCAyNSwgMSkpKSkpCmNiY2JTRVE6OnBsb3RQQyhzdGltX3Mkdiwgc3RpbV9zJGQsIGNvbD0iYmxhY2siLCBwY2g9c3RpbV9wYXRudW0sIGJnPXN0aW1fY29uZG51bSkKbGVnZW5kKHg9MC4yLCB5PTAuMiwgbGVnZW5kPXVuaXF1ZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsImxpZ2h0Ymx1ZSIsInBpbmsiLCJwdXJwbGUiKSwgcHQuY2V4PTEuNSwgY2V4PTAuNSwgYnR5PSJuIikKbGVnZW5kKHg9MC4yLCB5PS0wLjEsIGxlZ2VuZD11bmlxdWUoc3RpbV9kZXNpZ24kUGF0aWVudCksIHBjaD11bmlxdWUoc3RpbV9wYXRudW0pLCBjb2w9MCwKICAgICAgIHB0LmJnPSJncmF5OTAiLCBwdC5jZXg9MS41LCBjZXg9MC41LCBidHk9Im4iKQpgYGAKCmBgYHtyIG15X3BjYX0KaHNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCBub3JtPSJxdWFudCIsIGZpbHRlcj0iY2JjYiIsIHRyYW5zZm9ybT0ibG9nMiIpCm15X3BjYSA8LSBwbG90X3BjYShoc19ub3JtLCBwbG90X2xhYmVscz1GQUxTRSwgY2lzPU5VTEwpCm15X3BjYSRwbG90Cgpoc3N0aW1fbm9ybSA8LSBub3JtYWxpemVfZXhwdChzdGltX2V4cHQsIG5vcm09InF1YW50IiwgZmlsdGVyPSJjYmNiIiwgdHJhbnNmb3JtPSJsb2cyIikKc3RpbV9wY2EgPC0gcGxvdF9wY2EoaHNzdGltX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFLCBjaXM9TlVMTCkKc3RpbV9wY2EkcGxvdApgYGAKCiMjIEV1Y2xpZGlhbiBEaXN0YW5jZSBIZWF0IE1hcAoKYGBge3IgZGlzaGVhdH0KZGlzdHMgPC0gZGlzdCh0KGNvdW50cykpCm1hdCA8LSBhcy5tYXRyaXgoZGlzdHMpCnJvd25hbWVzKG1hdCkgPC0gY29sbmFtZXMobWF0KSA8LSBjb25kCmhtY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCg5LCAiR25CdSIpKSgxMDApCnZlYy5wYXRpZW50IDwtIHJhaW5ib3cobmxldmVscyhkZXNpZ24kUGF0aWVudCksIHN0YXJ0PTAsIGVuZD0uOCkKcGF0aWVudC5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKICAgIHBhdGllbnQuY29sb3JbaV0gPC0gdmVjLnBhdGllbnRbZGVzaWduJFBhdGllbnRbaV09PWxldmVscyhkZXNpZ24kUGF0aWVudCldCnZlYy5jb25kaXRpb24gPC0gYygiZ3JlZW4iLCAibGlnaHRibHVlIiwgInBpbmsiLCAicHVycGxlIikKY29uZGl0aW9uLmNvbG9yIDwtIHJlcCgwLCBsZW5ndGgoZGVzaWduJFN0aW11bGF0aW9uKSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRTdGltdWxhdGlvbikpCiAgICBjb25kaXRpb24uY29sb3JbaV0gPC0gdmVjLmNvbmRpdGlvbltkZXNpZ24kU3RpbXVsYXRpb25baV09PWxldmVscyhkZXNpZ24kU3RpbXVsYXRpb24pXQoKaGVhdG1hcCA8LSBoZWF0bWFwLjIobWF0LCB0cmFjZT0ibm9uZSIsIGNvbCA9IHJldihobWNvbCksIG1hcmdpbj1jKDExLCAxMSksIENvbFNpZGVDb2xvcnM9Y29uZGl0aW9uLmNvbG9yLAogICAgICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzPXBhdGllbnQuY29sb3IsIGtleT0iRkFMU0UiLCBzcnRDb2w9NDUpCgpzdGltX2Rpc3RzIDwtIGRpc3QodChzdGltX2NvdW50cykpCnN0aW1fbWF0IDwtIGFzLm1hdHJpeChzdGltX2Rpc3RzKQpyb3duYW1lcyhzdGltX21hdCkgPC0gY29sbmFtZXMoc3RpbV9tYXQpIDwtIHN0aW1fY29uZApzdGltX2htY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCg5LCAiR25CdSIpKSgxMDApCnN0aW1fdmVjLnBhdGllbnQgPC0gcmFpbmJvdyhubGV2ZWxzKHN0aW1fZGVzaWduJFBhdGllbnQpLCBzdGFydD0wLCBlbmQ9LjgpCnN0aW1fcGF0aWVudC5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKHN0aW1fZGVzaWduJFBhdGllbnQpKQpmb3IgKGkgaW4gMTpsZW5ndGgoc3RpbV9kZXNpZ24kUGF0aWVudCkpCiAgICBzdGltX3BhdGllbnQuY29sb3JbaV0gPC0gc3RpbV92ZWMucGF0aWVudFtzdGltX2Rlc2lnbiRQYXRpZW50W2ldPT1sZXZlbHMoc3RpbV9kZXNpZ24kUGF0aWVudCldCnN0aW1fdmVjLmNvbmRpdGlvbiA8LSBjKCJncmVlbiIsICJsaWdodGJsdWUiLCAicGluayIsICJwdXJwbGUiKQpzdGltX2NvbmRpdGlvbi5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKZm9yIChpIGluIDE6bGVuZ3RoKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKICAgIHN0aW1fY29uZGl0aW9uLmNvbG9yW2ldIDwtIHN0aW1fdmVjLmNvbmRpdGlvbltzdGltX2Rlc2lnbiRTdGltdWxhdGlvbltpXT09bGV2ZWxzKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKV0KaGVhdG1hcCA8LSBoZWF0bWFwLjIoc3RpbV9tYXQsIHRyYWNlPSJub25lIiwgY29sID0gcmV2KGhtY29sKSwgbWFyZ2luPWMoMTEsIDExKSwKICAgICAgICAgICAgICAgICAgICAgQ29sU2lkZUNvbG9ycz1zdGltX2NvbmRpdGlvbi5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgUm93U2lkZUNvbG9ycz1zdGltX3BhdGllbnQuY29sb3IsIGtleT0iRkFMU0UiLCBzcnRDb2w9NDUpCmBgYAoKYGBge3IgbXlfZGlzaGVhdH0KbXlfZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQoaHNfbm9ybSkKCnN0aW1fZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQoaHNzdGltX25vcm0pCmBgYAoKIyMgQ29ycmVjdCBmb3IgUGF0aWVudCBpbiBMaW1tYSBtb2RlbAoKYGBge3J9Cm1vZCA8LSBtb2RlbC5tYXRyaXgofmRlc2lnbiRQYXRpZW50KQp2IDwtIHZvb20oY291bnRzU3ViUSwgbW9kKQpmaXQgPC0gbG1GaXQodikKbmV3RGF0YSA8LSByZXNpZHVhbHMoZml0LCB2KQpzIDwtIG1ha2VTVkQobmV3RGF0YSkKcGNSZXMocyR2LCBzJGQsIGNvbmQsIGRlc2lnbiRCYXRjaClbMTo1LCBdCnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kUGF0aWVudClbMTo1LCBdCgpzdGltX3RhYmxlIDwtIHRhYmxlKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKQpzdGltX2NvdW50cyA8LSBmaWx0ZXJDb3VudHMoc3RpbV9jb3VudHMsIHRocmVzaD0yLCBtaW5TYW1wbGVzPW1pbihzdGltX3RhYmxlKSkKZGltKHN0aW1fY291bnRzKQpzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCnN0aW1fbW9kIDwtIG1vZGVsLm1hdHJpeCh+c3RpbV9kZXNpZ24kUGF0aWVudCkKc3RpbV92IDwtIHZvb20oc3RpbV9jb3VudHNTdWJRLCBzdGltX21vZCkKc3RpbV9maXQgPC0gbG1GaXQoc3RpbV92KQpzdGltX25ld0RhdGEgPC0gcmVzaWR1YWxzKHN0aW1fZml0LCBzdGltX3YpCnN0aW1fcyA8LSBtYWtlU1ZEKHN0aW1fbmV3RGF0YSkKcGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJEJhdGNoKVsxOjUsIF0KcGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJFBhdGllbnQpWzE6NSwgXQpgYGAKCiMjIFBsb3QgUEMxIGFuZCBQQzIgd2l0aCBwYXRpZW50IGNvcnJlY3Rpb24KCmBgYHtyfQpncm9udW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGVzaWduJEdyb3d0aCkpCmdyb251bSA8LSBpZmVsc2UoZ3JvbnVtPT0yLCAxOSwKICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JvbnVtPT0xLCAxNSwgMSkpCnBhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kUGF0aWVudCkpCnBhdG51bSA8LSBpZmVsc2UocGF0bnVtPT0xLCAicGluayIsCiAgICAgICAgICAgICAgICBpZmVsc2UocGF0bnVtPT0yLCAiZ3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocGF0bnVtPT0zLCAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwYXRudW09PTQsICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwYXRudW09PTUsICJibGFjayIsICJvcmFuZ2UiKSkpKSkKc2FtcGxlbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRTdGltdWxhdGlvbikpCnNhbXBsZW51bSA8LSBpZmVsc2Uoc2FtcGxlbnVtPT00LCAiZ3JlZW4iLAogICAgICAgICAgICAgICAgaWZlbHNlKHNhbXBsZW51bT09MywgImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2FtcGxlbnVtPT0xLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2FtcGxlbnVtPT0yLCAieWVsbG93IiwgImdyZXkiKSkpKQpwbG90UEMocyR2LCBzJGQsIHBjaD1ncm9udW0sIGNvbD1zYW1wbGVudW0sIGNleD0yKQpsZWdlbmQoeD0wLjA1LCB5PTAuMywgbGVnZW5kPWMoIk5TIiwgIkxQUyIsICJMUCIsICJMQSIpLCBwY2g9MjIsIGNvbD0wLAogICAgICAgcHQuYmc9YygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIsICJ5ZWxsb3ciKSwgcHQuY2V4PTEuNSwgY2V4PTEsIGJ0eT0ibiIpCmxlZ2VuZCh4PTAuMDUsIHk9MC4xLCBsZWdlbmQ9dW5pcXVlKGRlc2lnbiRHcm93dGgpLCBwY2g9dW5pcXVlKGdyb251bSksIGNvbD0iYmxhY2siLAogICAgICAgcHQuYmc9ImJsYWNrIiwgcHQuY2V4PTEuMCwgY2V4PTEsIGJ0eT0ibiIpCgoKc3RpbV9ncm9udW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kR3Jvd3RoKSkKc3RpbV9ncm9udW0gPC0gaWZlbHNlKHN0aW1fZ3JvbnVtPT0yLCAxOSwKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fZ3JvbnVtPT0xLCAxNSwgMSkpCnN0aW1fcGF0bnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJFBhdGllbnQpKQpzdGltX3BhdG51bSA8LSBpZmVsc2Uoc3RpbV9wYXRudW09PTEsICJwaW5rIiwKICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09MiwgImdyZWVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0zLCAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09NCwgInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT01LCAiYmxhY2siLCAib3JhbmdlIikpKSkpCnN0aW1fc2FtcGxlbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKc3RpbV9zYW1wbGVudW0gPC0gaWZlbHNlKHN0aW1fc2FtcGxlbnVtPT0zLCAiZ3JlZW4iLAogICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fc2FtcGxlbnVtPT0yLCAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3NhbXBsZW51bT09MSwgImJsYWNrIiwgImdyZXkiKSkpCnBsb3RQQyhzdGltX3Mkdiwgc3RpbV9zJGQsIHBjaD1zdGltX2dyb251bSwgY29sPXN0aW1fc2FtcGxlbnVtLCBjZXg9MikKbGVnZW5kKHg9MC4wNSwgeT0wLjMsIGxlZ2VuZD1jKCJMUFMiLCAiTFAiLCAiTEEiKSwgcGNoPTIyLCBjb2w9MCwKICAgICAgIHB0LmJnPWMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siLCAieWVsbG93IiksIHB0LmNleD0xLjUsIGNleD0xLCBidHk9Im4iKQpsZWdlbmQoeD0wLjA1LCB5PTAuMSwgbGVnZW5kPXVuaXF1ZShzdGltX2Rlc2lnbiRHcm93dGgpLCBwY2g9dW5pcXVlKHN0aW1fZ3JvbnVtKSwgY29sPSJibGFjayIsCiAgICAgICBwdC5iZz0iYmxhY2siLCBwdC5jZXg9MS4wLCBjZXg9MSwgYnR5PSJuIikKYGBgCgojIyBNeSBGaWd1cmUgM0EKCmBgYHtyIG15X3BjYTJ9CiMjc3RpbV9jb3VudHMgPC0gZmlsdGVyQ291bnRzKHN0aW1fY291bnRzLCB0aHJlc2g9MSwgbWluU2FtcGxlcz1taW4oeCkpCiMjZGltKHN0aW1fY291bnRzKQojI3N0aW1fY291bnRzU3ViUSA8LSBxTm9ybShzdGltX2NvdW50cykKIyNzdGltX3ggPC0gbG9nMkNQTShzdGltX2NvdW50c1N1YlEpCiMjc3RpbV9zIDwtIG1ha2VTVkQoc3RpbV94JHkpCmhzcyA8LSBzZXRfZXhwdF9iYXRjaGVzKHN0aW1fZXhwdCwgZmFjdD0icGF0aWVudCIpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIGZpbHRlcj1UUlVFKSkKaHNzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzcywgbm9ybT0icXVhbnQiKSkKaHNzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzcywgY29udmVydD0iY3BtIikpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIHRyYW5zZm9ybT0ibG9nMiIpKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCBiYXRjaD0ibGltbWEiKSkKaHNzIDwtIHNtKHNldF9leHB0X2JhdGNoZXMoaHNzLCBmYWN0PSJncm93dGgiKSkKcGxvdF9wY2EoaHNzLCBwbG90X2xhYmVscz1GQUxTRSkkcGxvdApgYGAKCiMjIEhlYXRtYXAgd2l0aCBwYXRpZW50IGNvcnJlY3Rpb24/PwoKYGBge3J9CmRpc3RzIDwtIGRpc3QodChuZXdEYXRhKSkKbWF0IDwtIGFzLm1hdHJpeChkaXN0cykKcm93bmFtZXMobWF0KSA8LSBjb2xuYW1lcyhtYXQpIDwtIGNvbmQKaGVhdG1hcCA8LSBoZWF0bWFwLjIobWF0LCB0cmFjZT0ibm9uZSIsIGNvbCA9IHJldihobWNvbCksIG1hcmdpbj1jKDExLCAxMSksCiAgICAgICAgICAgICAgICAgICAgIENvbFNpZGVDb2xvcnM9Y29uZGl0aW9uLmNvbG9yLAogICAgICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzPXBhdGllbnQuY29sb3IsIGtleT0iRkFMU0UiLCBzcnRDb2w9NDUpCmBgYAoKIyMgREUgYW5hbHlzaXMKCmBgYHtyfQpjb3VudHNTdWJRIDwtIHFOb3JtKGNvdW50cykKcGF0aWVudCA8LSBkZXNpZ24kUGF0aWVudAptb2QgPC0gbW9kZWwubWF0cml4KH4wK2NvbmQrcGF0aWVudCwgZGF0YT1kZXNpZ24pCnYgPC0gdm9vbShjb3VudHNTdWJRLCBtb2QsIHBsb3Q9VFJVRSkKZml0IDwtIGxtRml0KHYpCmBgYAoKIyMgTV9MUFMgdiBNX05TCgplQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCgpgYGB7cn0KTV9MUFMuTV9OUy5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhNX0xQU3ZNX05TPShjb25kTV9MUFMtY29uZE1fTlMpLCBsZXZlbHM9diRkZXNpZ24pCk1fTFBTLk1fTlMuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQUy5NX05TLmNvbnRyLm1hdCkKTV9MUFMuTV9OUy5lYiA8LSBlQmF5ZXMoTV9MUFMuTV9OUy5maXQpCk1fTFBTLk1fTlMudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFBTLk1fTlMuZWIsIGNvZWY9Ik1fTFBTdk1fTlMiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQUy5NX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQUy5NX05TLnRvcFRhYiksIE1fTFBTLk1fTlMudG9wVGFiKQpjb2xuYW1lcyhNX0xQUy5NX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQUy5NX05TLnRvcFRhYikgPC0gYygxOm5yb3coTV9MUFMuTV9OUy50b3BUYWIpKQoKbHBzX25zX3RhYmxlIDwtICJ0b3BUYWJfTV9MUFN2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Igp3cml0ZS5jc3YoTV9MUFMuTV9OUy50b3BUYWIsIGZpbGU9bHBzX25zX3RhYmxlLAogICAgICAgICAgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKYGBgCgpMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKCmBgYHtyfQpNX0xQUy5NX05TLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTlMudG9wVGFiW01fTFBTLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoTV9MUFMuTV9OUy5zaWdHZW5lcyRJRCkKYGBgCgpGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCgpgYGB7cn0KTV9MUFMuTV9OUy5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChNX0xQUy5NX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKE1fTFBTLk1fTlMuc2lnR2VuZXNGb2xkMSRJRCkKYGBgCgpGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCgpgYGB7cn0KTV9MUFMuTV9OUy5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChNX0xQUy5NX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKE1fTFBTLk1fTlMuc2lnR2VuZXNGb2xkMiRJRCkKYGBgCgpNYWtlIGFuIE1BIHBsb3QKCmBgYHtyfQpzZWwgPC0gTV9MUFMuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MUFMuTV9OUy50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTFBTdk1fTlMgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCmBgYAoKQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CgpgYGB7cn0KTV9MUFMuTV9OUy5zaWdHZW5lcyA8LSBNX0xQUy5NX05TLnNpZ0dlbmVzW29yZGVyKC1NX0xQUy5NX05TLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKc2lnR2VuZXMgPC0gTV9MUFMuTV9OUy5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFR19MUFMgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUdfTFBTIDwtIHN1YnNldChERUdfTFBTLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFR19MUFMgPC0gREVHX0xQU1tvcmRlcigtREVHX0xQUyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFR19MUFMgPC0gc3Vic2V0KERFR19MUFMsIGFicyhERUdfTFBTJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFR19MUFMsICJERUdfTV9MUFN2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCndyaXRlLmNzdihERUdfTFBTLCAiREVHX01fTFBTdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsCiAgICAgICAgICByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQpgYGAKCiMjIE1fTFBTIHYgTV9MQQoKYGBge3J9CiNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCk1fTFBTLk1fTEEuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MUFN2TV9MQT0oKGNvbmRNX0xBLWNvbmRNX05TKS0oY29uZE1fTFBTLWNvbmRNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQpNX0xQUy5NX0xBLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MUFMuTV9MQS5jb250ci5tYXQpCk1fTFBTLk1fTEEuZWIgPC0gZUJheWVzKE1fTFBTLk1fTEEuZml0KQpNX0xQUy5NX0xBLnRvcFRhYiA8LSB0b3BUYWJsZShNX0xQUy5NX0xBLmViLCBjb2VmPSJNX0xQU3ZNX0xBIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MUFMuTV9MQS50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoTV9MUFMuTV9MQS50b3BUYWIpLCBNX0xQUy5NX0xBLnRvcFRhYikKY29sbmFtZXMoTV9MUFMuTV9MQS50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoTV9MUFMuTV9MQS50b3BUYWIpIDwtIGMoMTpucm93KE1fTFBTLk1fTEEudG9wVGFiKSkKCmxwc19sYV90YWJsZSA8LSAidG9wVGFiX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LmNzdiIKd3JpdGUuY3N2KE1fTFBTLk1fTEEudG9wVGFiLCBmaWxlPWxwc19sYV90YWJsZSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1Ck1fTFBTLk1fTEEuc2lnR2VuZXMgPC0gTV9MUFMuTV9MQS50b3BUYWJbTV9MUFMuTV9MQS50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChNX0xQUy5NX0xBLnNpZ0dlbmVzJElEKQojI1sxXSA2MTcKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpNX0xQUy5NX0xBLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTFBTLk1fTEEuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoTV9MUFMuTV9MQS5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAyNDAKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpNX0xQUy5NX0xBLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KE1fTFBTLk1fTEEuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoTV9MUFMuTV9MQS5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSA2OQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIE1fTFBTLk1fTEEudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTFBTLk1fTEEudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xQU3ZNX0xBIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKCmRldi5jb3B5KHBuZywgIk1BcGxvdF9NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5wbmciLCB3aWR0aD03MDAsCiAgICAgICAgIGhlaWdodD03MDApCmRldi5vZmYoKQoKTV9MUFMuTV9MQS5zaWdHZW5lcyA8LSBNX0xQUy5NX0xBLnNpZ0dlbmVzW29yZGVyKC1NX0xQUy5NX0xBLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gTV9MUFMuTV9MQS5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiREVHX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBNX0xQUyB2IE1fTFAKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xQUy5NX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTFBTdk1fTFA9KChjb25kTV9MUC1jb25kTV9OUyktKGNvbmRNX0xQUy1jb25kTV9OUykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz12JGRlc2lnbikKTV9MUFMuTV9MUC5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIE1fTFBTLk1fTFAuY29udHIubWF0KQpNX0xQUy5NX0xQLmViIDwtIGVCYXllcyhNX0xQUy5NX0xQLmZpdCkKTV9MUFMuTV9MUC50b3BUYWIgPC0gdG9wVGFibGUoTV9MUFMuTV9MUC5lYiwgY29lZj0iTV9MUFN2TV9MUCIsIG51bWJlcj1ucm93KHYkRSkpCk1fTFBTLk1fTFAudG9wVGFiIDwtIGNiaW5kKHJvd25hbWVzKE1fTFBTLk1fTFAudG9wVGFiKSwgTV9MUFMuTV9MUC50b3BUYWIpCmNvbG5hbWVzKE1fTFBTLk1fTFAudG9wVGFiKSA8LSBjKCJJRCIsICJsb2dGQyIsICJBdmVFeHByIiwgInQiLCAiUC5WYWx1ZSIsICJhZGouUC5WYWwiLCAiQiIpCnJvd25hbWVzKE1fTFBTLk1fTFAudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xQUy5NX0xQLnRvcFRhYikpCgpscHNfbHBfdGFibGUgPC0gInRvcFRhYl9NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiCndyaXRlLmNzdihNX0xQUy5NX0xQLnRvcFRhYiwgZmlsZT1scHNfbHBfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpNX0xQUy5NX0xQLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTFAudG9wVGFiW01fTFBTLk1fTFAudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoTV9MUFMuTV9MUC5zaWdHZW5lcyRJRCkKIyNbMV0gMTQ3MwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCk1fTFBTLk1fTFAuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUFMuTV9MUC5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQUy5NX0xQLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDQ2NwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTFBTLk1fTFAuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUFMuTV9MUC5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQUy5NX0xQLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDEyNQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIE1fTFBTLk1fTFAudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTFBTLk1fTFAudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCIvIixsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iTV9MUFN2TV9MUCBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCwgXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgIk1BcGxvdF9NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYucG5nIiwgd2lkdGg9NzAwLAogICAgICAgICBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCk1fTFBTLk1fTFAuc2lnR2VuZXMgPC0gTV9MUFMuTV9MUC5zaWdHZW5lc1tvcmRlcigtTV9MUFMuTV9MUC5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIE1fTFBTLk1fTFAuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiREVHX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBNX0xQIHYgTV9OUwoKYGBge3J9CiMjZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xQLk1fTlMuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MUHZNX05TPShjb25kTV9MUC1jb25kTV9OUyksIGxldmVscz12JGRlc2lnbikKTV9MUC5NX05TLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MUC5NX05TLmNvbnRyLm1hdCkKTV9MUC5NX05TLmViIDwtIGVCYXllcyhNX0xQLk1fTlMuZml0KQpNX0xQLk1fTlMudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFAuTV9OUy5lYiwgY29lZj0iTV9MUHZNX05TIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MUC5NX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQLk1fTlMudG9wVGFiKSwgTV9MUC5NX05TLnRvcFRhYikKY29sbmFtZXMoTV9MUC5NX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQLk1fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xQLk1fTlMudG9wVGFiKSkKCmxwX25zX3RhYmxlIDwtICJ0b3BUYWJfTV9MUHZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAxOC5jc3YiCndyaXRlLmNzdihNX0xQLk1fTlMudG9wVGFiLCBmaWxlPWxwX25zX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKTV9MUC5NX05TLnNpZ0dlbmVzIDwtIE1fTFAuTV9OUy50b3BUYWJbTV9MUC5NX05TLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKE1fTFAuTV9OUy5zaWdHZW5lcyRJRCkKIyNbMV0gNDM4NgoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCk1fTFAuTV9OUy5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChNX0xQLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoTV9MUC5NX05TLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDE0NTUKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpNX0xQLk1fTlMuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUC5NX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKE1fTFAuTV9OUy5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSA1MTkKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBNX0xQLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTFAuTV9OUy50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTFB2TV9OUyBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCxdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCk1fTFAuTV9OUy5zaWdHZW5lcyA8LSBNX0xQLk1fTlMuc2lnR2VuZXNbb3JkZXIoLU1fTFAuTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIE1fTFAuTV9OUy5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUdfTFA0IDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHX0xQNCA8LSBzdWJzZXQoREVHX0xQNCwgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLAogICAgICAgICAgICAgICAgICBGUz0iL3QiKQpERUdfTFA0IDwtIERFR19MUDRbb3JkZXIoLURFR19MUDQkbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUdfTFA0IDwtIHN1YnNldChERUdfTFA0LCBhYnMoREVHX0xQNCRsb2dGQyk+MSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUdfTFA0LCAiREVHX01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHX0xQNCwgIkRFR19NX0xQdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDE4LmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIE1fTEEgdiBNX05TCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKTV9MQS5NX05TLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTEF2TV9OUz0oY29uZE1fTEEtY29uZE1fTlMpLCBsZXZlbHM9diRkZXNpZ24pCk1fTEEuTV9OUy5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIE1fTEEuTV9OUy5jb250ci5tYXQpCk1fTEEuTV9OUy5lYiA8LSBlQmF5ZXMoTV9MQS5NX05TLmZpdCkKTV9MQS5NX05TLnRvcFRhYiA8LSB0b3BUYWJsZShNX0xBLk1fTlMuZWIsIGNvZWY9Ik1fTEF2TV9OUyIsIG51bWJlcj1ucm93KHYkRSkpCk1fTEEuTV9OUy50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoTV9MQS5NX05TLnRvcFRhYiksIE1fTEEuTV9OUy50b3BUYWIpCmNvbG5hbWVzKE1fTEEuTV9OUy50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoTV9MQS5NX05TLnRvcFRhYikgPC0gYygxOm5yb3coTV9MQS5NX05TLnRvcFRhYikpCgpsYV9uc190YWJsZSA8LSAidG9wVGFiX01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Igp3cml0ZS5jc3YoTV9MQS5NX05TLnRvcFRhYiwgZmlsZT1sYV9uc190YWJsZSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1Ck1fTEEuTV9OUy5zaWdHZW5lcyA8LSBNX0xBLk1fTlMudG9wVGFiW01fTEEuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChNX0xBLk1fTlMuc2lnR2VuZXMkSUQpCiMjWzFdIDYxNwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCk1fTEEuTV9OUy5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChNX0xBLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoTV9MQS5NX05TLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDI0MAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTEEuTV9OUy5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChNX0xBLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoTV9MQS5NX05TLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDY5CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gTV9MQS5NX05TLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBNX0xBLk1fTlMudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xBdk1fTlMgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQoKTV9MQS5NX05TLnNpZ0dlbmVzIDwtIE1fTEEuTV9OUy5zaWdHZW5lc1tvcmRlcigtTV9MQS5NX05TLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gTV9MQS5NX05TLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFR19MQTQgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUdfTEE0IDwtIHN1YnNldChERUdfTEE0LCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksCiAgICAgICAgICAgICAgICAgIEZTPSIvdCIpCkRFR19MQTQgPC0gREVHX0xBNFtvcmRlcigtREVHX0xBNCRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFR19MQTQgPC0gc3Vic2V0KERFR19MQTQsIGFicyhERUdfTEE0JGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFR19MQTQsICJERUdfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VCwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCndyaXRlLmNzdihERUdfTEE0LCAiREVHX01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCmBgYAoKIyNHTV9MUFMgdi4gR01fTlMKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpHTV9MUFMuR01fTlMuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX05TPShjb25kR01fTFBTLWNvbmRHTV9OUyksIGxldmVscz12JGRlc2lnbikKR01fTFBTLkdNX05TLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX05TLmNvbnRyLm1hdCkKR01fTFBTLkdNX05TLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTlMuZml0KQpHTV9MUFMuR01fTlMudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9OUy5lYiwgY29lZj0iR01fTFBTdkdNX05TIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTlMudG9wVGFiKSwgR01fTFBTLkdNX05TLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTlMudG9wVGFiKSkKCmdtX2xwc19uc190YWJsZSA8LSAidG9wVGFiX0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Igp3cml0ZS5jc3YoR01fTFBTLkdNX05TLnRvcFRhYiwgZmlsZT0gZ21fbHBzX25zX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKR01fTFBTLkdNX05TLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9OUy50b3BUYWJbR01fTFBTLkdNX05TLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKEdNX0xQUy5HTV9OUy5zaWdHZW5lcyRJRCkKIyNbMV0gMzAyCgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKR01fTFBTLkdNX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KEdNX0xQUy5HTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChHTV9MUFMuR01fTlMuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMTk3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKR01fTFBTLkdNX05TLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KEdNX0xQUy5HTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChHTV9MUFMuR01fTlMuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gMTAxCgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gR01fTFBTLkdNX05TLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBHTV9MUFMuR01fTlMudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJHTV9MUFN2R01fTlMgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQoKR01fTFBTLkdNX05TLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9OUy5zaWdHZW5lc1tvcmRlcigtR01fTFBTLkdNX05TLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gR01fTFBTLkdNX05TLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFRyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFRyA8LSBzdWJzZXQoREVHLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFRyA8LSBERUdbb3JkZXIoLURFRyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFRyA8LSBzdWJzZXQoREVHLCBhYnMoREVHJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgIkRFR19HTV9MUFN2R01fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19HTV9MUFN2R01fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsCiAgICAgICAgICByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBHTV9MUFMgdiBHTV9MUAoKYGBge3J9CiNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCkdNX0xQUy5HTV9MUC5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhHTV9MUFN2R01fTFA9KChjb25kR01fTFBTLWNvbmRHTV9OUyktKGNvbmRHTV9MUC1jb25kR01fTlMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz12JGRlc2lnbikKR01fTFBTLkdNX0xQLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX0xQLmNvbnRyLm1hdCkKR01fTFBTLkdNX0xQLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTFAuZml0KQpHTV9MUFMuR01fTFAudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9MUC5lYiwgY29lZj0iR01fTFBTdkdNX0xQIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX0xQLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTFAudG9wVGFiKSwgR01fTFBTLkdNX0xQLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX0xQLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTFAudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTFAudG9wVGFiKSkKCmdtX2xwc19scF90YWJsZSA8LSAidG9wVGFiX0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMjMuY3N2Igp3cml0ZS5jc3YoR01fTFBTLkdNX0xQLnRvcFRhYiwgZmlsZT1nbV9scHNfbHBfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpHTV9MUFMuR01fTFAuc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xQLnRvcFRhYltHTV9MUFMuR01fTFAudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoR01fTFBTLkdNX0xQLnNpZ0dlbmVzJElEKQojI1sxXSAxOTQKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpHTV9MUFMuR01fTFAuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoR01fTFBTLkdNX0xQLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKEdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAxMTQKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpHTV9MUFMuR01fTFAuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoR01fTFBTLkdNX0xQLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKEdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSAyNwoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIEdNX0xQUy5HTV9MUC50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gR01fTFBTLkdNX0xQLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iR01fTFBTdkdNX0xQIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLAogICAgICAgICBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCkdNX0xQUy5HTV9MUC5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTFAuc2lnR2VuZXNbb3JkZXIoLUdNX0xQUy5HTV9MUC5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MUC5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUcgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUcgPC0gc3Vic2V0KERFRywgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUcgPC0gREVHW29yZGVyKC1ERUckbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUcgPC0gc3Vic2V0KERFRywgYWJzKERFRyRsb2dGQyk+MSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUcsICJERUdfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VCwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCndyaXRlLmNzdihERUcsICJERUdfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiLAogICAgICAgICAgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCmBgYAoKIyMgR01fTFBTIHYgR01fTEEKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpHTV9MUFMuR01fTEEuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX0xBPSgoY29uZEdNX0xQUy1jb25kR01fTlMpLShjb25kR01fTEEtY29uZEdNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCkdNX0xQUy5HTV9MQS5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIEdNX0xQUy5HTV9MQS5jb250ci5tYXQpCkdNX0xQUy5HTV9MQS5lYiA8LSBlQmF5ZXMoR01fTFBTLkdNX0xBLmZpdCkKR01fTFBTLkdNX0xBLnRvcFRhYiA8LSB0b3BUYWJsZShHTV9MUFMuR01fTEEuZWIsIGNvZWY9IkdNX0xQU3ZHTV9MQSIsIG51bWJlcj1ucm93KHYkRSkpCkdNX0xQUy5HTV9MQS50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoR01fTFBTLkdNX0xBLnRvcFRhYiksIEdNX0xQUy5HTV9MQS50b3BUYWIpCmNvbG5hbWVzKEdNX0xQUy5HTV9MQS50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoR01fTFBTLkdNX0xBLnRvcFRhYikgPC0gYygxOm5yb3coR01fTFBTLkdNX0xBLnRvcFRhYikpCgpnbV9scHNfbGFfdGFibGUgPC0gInRvcFRhYl9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLmNzdiIKd3JpdGUuY3N2KEdNX0xQUy5HTV9MQS50b3BUYWIsIGZpbGU9Z21fbHBzX2xhX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKR01fTFBTLkdNX0xBLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MQS50b3BUYWJbR01fTFBTLkdNX0xBLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKEdNX0xQUy5HTV9MQS5zaWdHZW5lcyRJRCkKIyNbMV0gMTcKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpHTV9MUFMuR01fTEEuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoR01fTFBTLkdNX0xBLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKEdNX0xQUy5HTV9MQS5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAxNQoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCkdNX0xQUy5HTV9MQS5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChHTV9MUFMuR01fTEEuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoR01fTFBTLkdNX0xBLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDcKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBHTV9MUFMuR01fTEEudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIEdNX0xQUy5HTV9MQS50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iR01fTFBTdkdNX0xBIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfR01fTFBTdkdNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfR01fTFBTdkdNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQoKR01fTFBTLkdNX0xBLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MQS5zaWdHZW5lc1tvcmRlcigtR01fTFBTLkdNX0xBLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xBLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFRyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFRyA8LSBzdWJzZXQoREVHLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFRyA8LSBERUdbb3JkZXIoLURFRyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFRyA8LSBzdWJzZXQoREVHLCBhYnMoREVHJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgIkRFR19HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsCiAgICAgICAgICByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBWZW5uIERpYWdyYW0gb2Ygc2hhcmVkIERFRyBiZXR3ZWVuIE0tQ1NGIExQUyB2IExBIHYgTFAKClVwcmVndWxhdGVkIGdlbmVzIGNvbXBhcmVkIHRvIE5TCgpgYGB7cn0Kdl9kYXRhIDwtIGxpc3QoREVHX0xBNFtERUdfTEE0JGxvZ0ZDID4wLCBdJElELAogICAgICAgICAgICAgICBERUdfTFA0W0RFR19MUDQkbG9nRkMgPjAsIF0kSUQsCiAgICAgICAgICAgICAgIERFR19MUFNbREVHX0xQUyRsb2dGQyA+MCwgXSRJRCkKdl9kYXRhIDwtIFZlbm4odl9kYXRhLCBTZXROYW1lcz1jKCJMUFMrQWRvIiwgIkxQUytQR0UyIiwgIkxQUyIpLCBudW1iZXJPZlNldHM9MykKcGxvdCh2X2RhdGEsIGRvV2VpZ2h0cz1GKQojI2Rldi5jb3B5KHBuZywgIlZlbm5EaWFncmFtIFVwcmVndWxhdGVkIExQUyBMQSBMUCIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKIyNkZXYub2ZmKCk7CmBgYAoKRG93bnJlZ3VsYXRlZCBnZW5lcyBjb21wYXJlZCB0byBOUwoKYGBge3J9CnZfZGF0YSA8LSBsaXN0KERFR19MQTRbREVHX0xBNCRsb2dGQyA8MCwgXSRJRCwKICAgICAgICAgICAgICAgREVHX0xQNFtERUdfTFA0JGxvZ0ZDIDwwLCBdJElELAogICAgICAgICAgICAgICBERUdfTFBTW0RFR19MUFMkbG9nRkMgPDAsIF0kSUQpCnZfZGF0YSA8LSBWZW5uKHZfZGF0YSwgU2V0TmFtZXM9YygiTFBTK0FkbyIsICJMUFMrUEdFMiIsICJMUFMiKSwgbnVtYmVyT2ZTZXRzPTMpCnBsb3Qodl9kYXRhLCBkb1dlaWdodHM9RikKIyNkZXYuY29weShwbmcsICJWZW5uRGlhZ3JhbSBEb3ducmVndWxhdGVkIExQUyBMQSBMUCIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKIyNkZXYub2ZmKCk7CmBgYAoKIyMgVm9sY2FubyBQbG90cwoKTV9MUFMgdiBNX0xBCgpgYGB7ciBwcmV2aW91c192b2xjYW5vfQpyZXMgPC0gcmVhZC5jc3YobHBzX2xhX3RhYmxlKQojI3JlcyA8LSByZWFkLnRhYmxlKCJ0b3BUYWJfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwgaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTEEiLCB4bGltPWMoLTcsIDcpKSkKCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQyk+MSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCmRldi5jb3B5KHBuZywgIlZvbGNhbm9QbG90X01fTFBTX3ZfTV9MQS5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCk1fTFBTIHYgTV9MUAoKYGBge3IgdW5ldmFsX3ZvbGNhbm99CnJlcyA8LSByZWFkLmNzdigidG9wVGFiX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LmNzdiIsIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLAogICAgICAgICAgICAgICBtYWluPSJWb2xjYW5vIHBsb3QgTV9MUFMgdiBNX0xQIiwgeGxpbT1jKC03LCA3KSkpCgojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9Im9yYW5nZSIpKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgJiBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJWb2xjYW5vUGxvdF9NX0xQU192X01fTFAucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKYGBgCgojIyBSaWNoIEZhY3RvciBHcmFwaHMKCiMjIEdPIHRlcm1zIHNoYXJlZCBMQSBMUAoKYGBge3J9CkdPU2hhcmVkcGF0aHdheXMgPC0gcmVhZC50YWJsZSgiR08gTUYgRkRSIC4wNSBUT1AgNSBvbmx5LTIudHh0IiwgaGVhZGVyPVRSVUUsIHNlcD0nXHQnKQpHT1NoYXJlZHBhdGh3YXlzIDwtIEdPU2hhcmVkcGF0aHdheXNbb3JkZXIoR09TaGFyZWRwYXRod2F5cyRwLlZhbHVlLCBkZWNyZWFzaW5nPVRSVUUpLCBdCgpjb2xvclJhbXAgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJ0dXJxdW9pc2UxIiwgIm1lZGl1bWJsdWUiKSkoNTApCnBhcihtYXI9Yyg1LCAxOCwgMywgOCkpCnBsb3QoR09TaGFyZWRwYXRod2F5cyRSaWNoLkZhY3RvciwgYygxOjUpLCBheGVzPUYsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MTo1LCB2PXNlcSgwLjEsIDAuNiwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhHT1NoYXJlZHBhdGh3YXlzJEdlbmUuTnVtYmVyKS80LAogICAgIGNvbD1jb2xvclJhbXBbY3V0KGFzLm51bWVyaWMoR09TaGFyZWRwYXRod2F5cyRwLlZhbHVlKSwgYnJlYWtzPTUwKV0sCiAgICAgcGNoPTIwLCB5bGFiPSIgIiwgeGxhYj0iUmljaCBGYWN0b3IiLCBtYWluPSJQYXRod2F5cyBFbnJpY2hlZCIsCiAgICAgeGxpbT1jKDAsIDAuMDQpKQpheGlzKHNpZGU9MiwgYXQ9MTo1LCBsYWJlbHM9YXMuY2hhcmFjdGVyKEdPU2hhcmVkcGF0aHdheXMkR2VuZVNldCksIGxhcz0yLCBjZXguYXhpcz0wLjUpCmF4aXMoc2lkZT0xLCB0aWNrPUdPU2hhcmVkcGF0aHdheXNbWyJSaWNoLkZhY3RvciJdXSkKYGBgCgojIyMgS0VHRyBMQQoKYGBge3IsIGV2YWw9RkFMU0V9CkxBcGF0aHdheXMgPC0gcmVhZC50YWJsZSgiQ3l0b3NjYXBlIFBhdGh3YXlzL0xBIHYgTFBTLnR4dCIsIGhlYWRlcj1UUlVFLCBzZXA9J1x0JykKTEFwYXRod2F5cyA8LSBMQXBhdGh3YXlzW29yZGVyKExBcGF0aHdheXMkcC5WYWx1ZSwgZGVjcmVhc2luZz1UUlVFKSwgXQojcGxvdCB4IHYuIHksIGNoYW5nZSBzaXplLCBhc3NpZ24gY29sb3IgdG8gcC12YWx1ZQpjb2xvclJhbXAgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJ0dXJxdW9pc2UxIiwgIm1lZGl1bWJsdWUiKSkoNTApCnBhcihtYXI9Yyg1LCAxOCwgMywgOCkpCnBsb3QoTEFwYXRod2F5cyRSaWNoLkZhY3RvciwgYygxOjI4KSwgYXhlcz1GLAogICAgIHBhbmVsLmZpcnN0PWFibGluZShoPTE6MjgsIHY9c2VxKDAuMSwgMC40LCAwLjEpLCBjb2w9ImdyZXk5MCIpLAogICAgIGNleD1hcy5udW1lcmljKExBcGF0aHdheXMkR2VuZS5OdW1iZXIpLzEwLAogICAgIGNvbD1jb2xvclJhbXBbY3V0KGFzLm51bWVyaWMoTEFwYXRod2F5cyRwLlZhbHVlKSwgYnJlYWtzPTUwKV0sCiAgICAgcGNoPTIwLCB5bGFiPSIgIiwgeGxhYj0iUmljaCBGYWN0b3IiLCBtYWluPSJQYXRod2F5cyBFbnJpY2hlZCIsCiAgICAgeGxpbT1jKDAsIDAuNCkpCmF4aXMoc2lkZT0yLCBhdD0xOjI4LCBsYWJlbHM9YXMuY2hhcmFjdGVyKExBcGF0aHdheXMkUGF0aHdheSksIGxhcz0yLCBjZXguYXhpcz0wLjgpCmF4aXMoc2lkZT0xLCB0aWNrPUxBcGF0aHdheXMkUmljaC5GYWN0b3IsIHBvcz0wLjQpCmBgYAoKIyMjIEdPIExBCgpgYGB7ciwgZXZhbD1GQUxTRX0KR09MQXBhdGh3YXlzIDwtIHJlYWQudGFibGUoIkN5dG9zY2FwZSBQYXRod2F5cy9HTyBCUCBMQSB3aG9sZSBuZXR3b3JrLnR4dCIsIGhlYWRlcj1UUlVFLCBzZXA9J1x0JykKR09MQXBhdGh3YXlzIDwtIEdPTEFwYXRod2F5c1tvcmRlcihHT0xBcGF0aHdheXMkcC5WYWx1ZSwgZGVjcmVhc2luZz1UUlVFKSwgXQojI3Bsb3QgeCB2LiB5LCBjaGFuZ2Ugc2l6ZSwgYXNzaWduIGNvbG9yIHRvIHAtdmFsdWUKY29sb3JSYW1wIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygidHVycXVvaXNlMSIsICJtZWRpdW1ibHVlIikpKDUwKQpwYXIobWFyPWMoNSwgMjAsIDMsIDgpKQpwbG90KEdPTEFwYXRod2F5cyRSaWNoLkZhY3RvciwgYygxOjU3KSwgYXhlcz1GLAogICAgIHBhbmVsLmZpcnN0PWFibGluZShoPTE6NTcsIHY9c2VxKDAuMSwgMC41LCAwLjEpLCBjb2w9ImdyZXk5MCIpLAogICAgIGNleD1hcy5udW1lcmljKEdPTEFwYXRod2F5cyRHZW5lLk51bWJlcikvMTAsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhHT0xBcGF0aHdheXMkcC5WYWx1ZSksIGJyZWFrcz01MCldLAogICAgIHBjaD0yMCwgeWxhYj0iICIsIHhsYWI9IlJpY2ggRmFjdG9yIiwgbWFpbj0iUGF0aHdheXMgRW5yaWNoZWQiLAogICAgIHhsaW09YygwLCAwLjUpKQpheGlzKHNpZGU9MixhdD0xOjU3LCBsYWJlbHM9YXMuY2hhcmFjdGVyKEdPTEFwYXRod2F5cyRQYXRod2F5KSwgbGFzPTIsIGNleC5heGlzPTAuOCkKYXhpcyhzaWRlPTEsIHRpY2s9R09MQXBhdGh3YXlzJFJpY2guRmFjdG9yLCBwb3M9MC40KQpgYGAKCiMjIyBHTyBMUAoKYGBge3IsIGV2YWw9RkFMU0V9CkdPTFBwYXRod2F5cyA8LSByZWFkLnRhYmxlKCJDeXRvc2NhcGUgUGF0aHdheXMvR09fQlBfTFB2TFBTLnR4dCIsIGhlYWRlcj1UUlVFLCBzZXA9J1x0JykKR09MUHBhdGh3YXlzIDwtIEdPTFBwYXRod2F5c1tvcmRlcihHT0xQcGF0aHdheXMkcC5WYWx1ZSwgZGVjcmVhc2luZz1UUlVFKSwgXQoKY29sb3JSYW1wIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygidHVycXVvaXNlMSIsICJtZWRpdW1ibHVlIikpKDUwKQpwYXIobWFyPWMoNSwgMTgsIDMsIDgpKQpwbG90KEdPTFBwYXRod2F5cyRSaWNoLkZhY3RvciwgYygxOjM1KSwgYXhlcz1GLAogICAgIHBhbmVsLmZpcnN0PWFibGluZShoPTE6MzUsIHY9c2VxKDAuMSwgMC42LCAwLjEpLCBjb2w9ImdyZXk5MCIpLAogICAgIGNleD1hcy5udW1lcmljKEdPTFBwYXRod2F5cyRHZW5lLk51bWJlcikvMjAsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhHT0xQcGF0aHdheXMkcC5WYWx1ZSksIGJyZWFrcz01MCldLAogICAgIHBjaD0yMCwgeWxhYj0iICIsIHhsYWI9IlJpY2ggRmFjdG9yIiwgbWFpbj0iUGF0aHdheXMgRW5yaWNoZWQiLAogICAgIHhsaW09YygwLCAwLjYpKQpheGlzKHNpZGU9MiwgYXQ9MTozNSwgbGFiZWxzPWFzLmNoYXJhY3RlcihHT0xQcGF0aHdheXMkUGF0aHdheSksIGxhcz0yLCBjZXguYXhpcz0wLjUpCmF4aXMoc2lkZT0xLCB0aWNrPUdPTFBwYXRod2F5cyRSaWNoLkZhY3RvciwgcG9zPTAuNCkKYGBgCgojIFZvbGNhbm8gcGxvdCBNX0xQU180IHYgTV9MUF80CgpgYGB7ciBmaXJzdF92b2xjYW5vfQpyZXMgPC0gcmVhZC5jc3YoInRvcFRhYl9NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiLAogICAgICAgICAgICAgICAgaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICBwY2g9MjAsIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTFAiLCB4bGltPWMoLTcsIDcpKSkKIyMgQWRkIGNvbG9yZWQgcG9pbnRzOiByZWQgaWYgcGFkajwwLjA1LCBvcmFuZ2Ugb2YgbG9nMkZDPjEsIGdyZWVuIGlmIGJvdGgpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSApLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0idmlvbGV0cmVkMiIpKQp3aXRoKHN1YnNldChyZXMsIGFicyhsb2dGQyk+MSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQyk+MSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksCiAgICAgICAgICAgIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCmRldi5jb3B5KHBuZywgIlZvbGNhbm9QbG90X01fTFBTX3ZzX01fTFAucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKYGBgCgojIFZvbGNhbm8gcGxvdCBNX0xQU180IHYgTV9MQV80CgpgYGB7ciBzZWNvbmRfdm9sY2Fub30KIyNyZXMgPC0gcmVhZC50YWJsZSgidG9wVGFiX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsCiMjICAgICAgICAgICAgICAgICAgaGVhZGVyPVRSVUUpCnJlcyA8LSByZWFkLmNzdihscHNfbGFfdGFibGUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTEEiLCB4bGltPWMoLTcsIDcpKSkKIyMgQWRkIGNvbG9yZWQgcG9pbnRzOiByZWQgaWYgcGFkajwwLjA1LCBvcmFuZ2Ugb2YgbG9nMkZDPjEsIGdyZWVuIGlmIGJvdGgpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSApLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0idmlvbGV0cmVkMiIpKQp3aXRoKHN1YnNldChyZXMsIGFicyhsb2dGQyk+MSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQyk+MSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksCiAgICAgICAgICAgIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCmRldi5jb3B5KHBuZywgIlZvbGNhbm9QbG90X01fTFBTX3ZfTV9MQS5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMgVm9sY2FubyBwbG90IEdNX0xQU180IHYgR01fTEFfNAoKYGBge3IgdGhpcmRfdm9sY2Fub30KcmVzIDwtIHJlYWQuY3N2KGxwc19sYV90YWJsZSkKIyNyZXMgPC0gcmVhZC50YWJsZSgiR01fTFBTIHYgR01fTEEvdG9wVGFiX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMjMudHh0IiwKIyNoZWFkZXI9VFJVRSkKaGVhZChyZXMpCndpdGgocmVzLCBwbG90KGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwKICAgICAgICAgICAgICAgbWFpbj0iVm9sY2FubyBwbG90IEdNX0xQU180IHYgR01fTEFfNCIsIHhsaW09YygtNywgNykpKQojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3QgR01fTFBTIHYgR01fTEEiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMgVm9sY2FubyBwbG90IEdNX0xQU180IHYgR01fTFBfNAoKYGBge3IgZm91cnRoX3ZvbGNhbm99CiMjcmVzIDwtIHJlYWQudGFibGUoInRvcFRhYl9HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLnR4dCIsCiMjICAgICAgICAgICAgICAgICAgaGVhZGVyPVRSVUUpCnJlcyA8LSByZWFkLmNzdihnbV9scHNfbHBfdGFibGUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBHTV9MUFMgdiBHTV9MUCIsIHhsaW09YygtNywgNykpKQojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3QgR01fTFBTIHYgR01fTFAiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAK