diff --git a/README.md b/README.md
index 4231ae5..d29e09e 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,14 @@
-# Modeling the metabolic changes of the epithelial-to-mesenchymal transition
+# Constraint-based modeling identifies cell-state specific metabolic vulnerabilities during the epithelial to mesenchymal transition
## Summary
-This repository identifies metabolic enzymes that are essential to the epithelial-to-mesenchymal transition (EMT) in the context of lung adenocarcinoma.
-**Three analyses are performed:**
+This repository contains the code from the paper Constraint-based modeling identifies cell-state specific metabolic vulnerabilities during the epithelial to mesenchymal transition by Campit, S.E., Keshamouni, V.G., and Chandrasekaran, S.
- 1. Enrichment and differential expression of multiple lung adenocarcinoma omics datasets (Bulk RNA-Seq, single-cell RNA-Seq, Proteomics, and more)
- 2. Constraint-based metabolic reconstruction and analysis for metabolic flux analysis and fitness evaluation from gene and reaction knockouts.
- 3. Hypothesis generation from differential flux and growth sensitivty analysis
+**Key analyses contained in notebooks:**
+
+ 1. Data preprocessing for transcriptomics, proteomics, single-cell transcriptomics, CERES Score data, and other =omics datasets.
+ 2. Constraint-based metabolic reconstruction and analysis code for simulating metabolic fluxes and growth resulting from gene and reaction knockout.
+ 3. Statistical analyses for assessing differences between groups.
## Programming languages used in this analysis
@@ -15,17 +16,19 @@ This repository identifies metabolic enzymes that are essential to the epithelia
* R version 4.03
* Python version 3.8.6
-## Getting Started
-
-
-## TO DO:
-- [ ] Create Docker container for dependencies
-- [ ] Clean up all code base further
-- [ ] Edit all notebooks
-- [ ] Update static website for short and graphical representation of paper
-
## Usage
-COMING SOON
+Three programming languages (Python / R / MATLAB) were used, based on availability of scientific libraries and strengths in specific tasks. Thus, we would recommend the following workflow to perform the entire analysis end-to-end. We will point to specific directories and scripts that are numbered by usage.
+
+ 1. Exploratory data analysis and general understanding of data distributions: `notebooks/r/01_EDA/*.Rmd`
+ 2. Preprocessing bulk -omics data for COBRA: `notebooks/r/02_DifferentialExpression/*.Rmd`
+ 3. Preprocessing single-cell omics data for COBRA: `notebooks/r/03_Preprocess/*.Rmd`
+ 4. Performing MAGIC data imputation for single-cell COBRA analysis: `notebooks/python/magic.ipynb`
+ 5. Constraint-based reconstruction and analysis for bulk -omics data: `notebooks/matlab/01_bulk_analysis/RECON1/*.mlx`
+ 6. Constraint-based reconstruction and analysis for single-cell -omics data: `notebooks/matlab/02_single_cell_analysis/recon1_scCOBRA.mlx`
+ 7. Generating FBA-UMAP profiles: `notebooks/r/05_Embeddings/*.Rmd`
+ 8. Statistical analyses: Google Colab notebooks can be found [here](https://drive.google.com/drive/folders/1kCNsrULvzgaTEH3387mAx7KbB_dJSO4p).
+
+Note that there are additional QA/QC scripts and notebooks available as well.
## Contributing
Contributions to make this analysis better, more robust, and easier to follow are greatly appreciated. Here are the steps we ask of you:
@@ -40,4 +43,4 @@ Contributions to make this analysis better, more robust, and easier to follow ar
Distributed under the GNU License. See `LICENSE` for more information.
## Contact
-For questions regarding the code deposited in this repository, please reach out to Scott Campit via email at: scampit [at] umich [dot] edu or via Twitter at @secampit.
+For questions regarding the code deposited in this repository, please reach out to Scott Campit via email at: scampit [at] umich [dot] edu or via Twitter at [at] secampit.
diff --git a/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.Rmd b/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.Rmd
index 399e99d..dc67851 100644
--- a/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.Rmd
+++ b/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.Rmd
@@ -188,7 +188,10 @@ to_use = names(mnorm_ko) %in% c("GLCt1", "HEX1", "PGI", "PFK", "FBA", "GAPD", "P
glycolysis_ko = mnorm_ko[, to_use]
merged_meanko = cbind(time, glycolysis_ko)
tmp = melt(merged_meanko, id=c('a549.meta.data.Time'))
-tmp2 = tmp[tmp$variable == "ENO", ]
+
+minmax <- function(x){(x-min(x))/(max(x)-min(x))}
+
+tmp$density = minmax(tmp$value)
library(dplyr)
library(tidyr)
@@ -196,14 +199,31 @@ library(ggplot2)
tmp %>%
ggplot(aes(x=value, color=a549.meta.data.Time, fill=a549.meta.data.Time)) +
- geom_density(alpha=0.4) +
+ geom_density(aes(y=..scaled.., alpha=0.4)) +
facet_wrap(~variable, ncol=4) +
- #scale_y_log10()
-
labs(x="KO Growth Score", y="Density")
```
+```{r}
+set.seed(1234)
+df = data.frame(value =round(c(rnorm(200,
+ mean=100,
+ sd=7))))
+
+# import libraries ggplot2
+library(ggplot2)
+
+# create density plot
+ggplot(df, aes(x=value)) + geom_density()
+```
+
+```{r}
+ggplot(tmp, aes(x=value, color=a549.meta.data.Time, fill=a549.meta.data.Time)) +
+geom_density(aes(y=..scaled.., alpha=0.4)) +
+labs(x="KO Growth Score", y="Density")
+```
+
### C. Merge with UMAP embedding
This combines the reaction ko data with the UMAP embedding.
```{r}
@@ -791,12 +811,16 @@ library(ggplot2)
tmp %>%
ggplot(aes(x=value, color=a549.meta.data.Time, fill=a549.meta.data.Time)) +
- geom_density(alpha=0.4) +
+ geom_density(aes(y=..scaled.., alpha=0.4)) +
facet_wrap(~variable, ncol=4) +
- #scale_y_log10()
+ labs(x="Glycolysis flux profile (individual reactions)", y="Density")
- labs(x="Flux profiles", y="Density")
+```
+```{r}
+ggplot(tmp, aes(x=value, color=a549.meta.data.Time, fill=a549.meta.data.Time)) +
+geom_density(aes(y=..scaled.., alpha=0.4)) +
+labs(x="Glycolysis flux profile (all)", y="Density")
```
### C. Merge with UMAP embedding
diff --git a/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.nb.html b/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.nb.html
index e654387..70523c6 100644
--- a/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.nb.html
+++ b/notebooks/r/05_Embeddings/03_MAGIC_UMAP_99.nb.html
@@ -2007,7 +2007,33 @@
Create density map profiles for glycolysis
-
+
+
+
+
+
+
+
+set.seed(1234)
+df = data.frame(value =round(c(rnorm(200,
+ mean=100,
+ sd=7))))
+
+# import libraries ggplot2
+library(ggplot2)
+
+# create density plot
+ggplot(df, aes(x=value)) + geom_density()
+
+
+
+
+
+
+
+
+
+
@@ -2037,12 +2063,11 @@ i. Mean Normalization
ii. Z-score
-
-merged_zko = merge(umap_data, zko, by.x='row.names', by.y='row.names')
+
+merged_zko = merge(umap_data, zko, by.x='row.names', by.y='row.names')
+rownames(merged_zko) = merged_zko$Row.names
+merged_zko = merged_zko[, -1]
-
-Error in as.data.frame(y) : object 'zko' not found
-
@@ -2085,13 +2110,12 @@ D. Visualize KO Data
Okay, we’re going to select 4 reactions from the top 100, plus enolase.
-
+
reactions_to_visualize = c("FACOAL204i", "CSm", "ACCOACm", "ENMAN6g", "NNATn")
reaction_names = rxnmap[rxnmap$rxn_ids %in% reactions_to_visualize, ]
reaction_names = reaction_names$rxn_name
#reaction_names[4] = "Enolase"
-#reaction_names[3] = "Nicotinamide-nucleotide adenylyltransferase"
-
+#reaction_names[3] = "Nicotinamide-nucleotide adenylyltransferase"
@@ -2639,8 +2663,39 @@ Create density map profiles for glycolysis
First, change the row to map to time.
+
+time = data.frame(a549@meta.data$Time)
+to_use = names(mnorm_flux) %in% c("GLCt1", "HEX1", "PGI", "PFK", "FBA", "GAPD", "PGK", "PGM", "ENO", "PYK", "PYRt2m", "PDHm")
+glycolysis_ko = mnorm_flux[, to_use]
+merged_meanko = cbind(time, glycolysis_ko)
+tmp = melt(merged_meanko, id=c('a549.meta.data.Time'))
+tmp2 = tmp[tmp$variable == "ENO", ]
+
+library(dplyr)
+library(tidyr)
+library(ggplot2)
+
+tmp %>%
+ ggplot(aes(x=value, color=a549.meta.data.Time, fill=a549.meta.data.Time)) +
+ geom_density(aes(y=..scaled.., alpha=0.4)) +
+ facet_wrap(~variable, ncol=4) +
+ labs(x="Glycolysis flux profile (individual reactions)", y="Density")
+
+
-
+
+
+
+
+
+
+
+ggplot(tmp, aes(x=value, color=a549.meta.data.Time, fill=a549.meta.data.Time)) +
+geom_density(aes(y=..scaled.., alpha=0.4)) +
+labs(x="Glycolysis flux profile (all)", y="Density")
+
+
+
@@ -2939,7 +2994,7 @@ v. Visualize Z-score KO
-LS0tDQp0aXRsZTogIk1BR0lDX1VNQVBfOTkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBTdW1tYXJ5DQpUaGlzIG5vdGVib29rIHByb2Nlc3NlcyBzY1JOQVNlcSB0aW1lIGNvdXJzZSBkYXRhLiBTb21lIG9mIHRoZSBjb2RlIHdhcyBhZGFwdGVkIGZyb20gQ29vayBldCBhbC4sIDIwMjAuDQoNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCiMjIDEuIExvYWQgTGlicmFyaWVzDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh1bWFwKQ0KbGlicmFyeShTZXVyYXQpDQpsaWJyYXJ5KHdyaXRleGwpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShleHRyYWZvbnQpDQpsaWJyYXJ5KHRvb2xzKQ0KI2xvYWRmb250cyhkZXZpY2U9IndpbiIpDQpgYGANCg0KIyMgMi4gTG9hZCBzY1JOQVNlcSBkYXRhc2V0cw0KTmV4dCwgd2UnbGwgbG9hZCB0aGUgQTU0OSBkYXRhc2V0LCB3aGljaCBpcyB0aGUgbHVuZyBjYW5jZXIgY2VsbCBsaW5lIGludmVzdGlnYXRlZCBpbiBHU0UxNDc0MDUuIEFkZGl0aW9uYWxseSwgd2UnbGwgZm9jdXMgb24gdGhlICRUR0YgXGJldGEgMSQgc2FtcGxlLCBzaW5jZSB0aGlzIHdhcyB0aGUgd2F5IEVNVCB3YXMgaW5kdWNlZCBpbiBtYW55IGJ1bGsgZXhwZXJpbWVudHMuDQoNCmBgYHtyLCBpbmNsdWRlPVRSVUV9DQpmaWxlcGF0aCA9ICdEOi9DaGFuZHJhc2VrYXJhbi9Qcm9qZWN0cy9FTVQvRGF0YS9zY1JOQVNlcS9hNTQ5X3F1YW50aWxlLnJkcycNCmE1NDkgPSByZWFkUkRTKGZpbGVwYXRoKQ0KYGBgDQoNCiMjIyBBLiBWaXN1YWxpemUgVGltZS1Db3Vyc2UNClRoaXMgYml0IG9mIGNvZGUgc2VwYXJhdGVzIGdyb3VwcyBieSB0aW1lIHBvaW50IGFuZCBjcmVhdGVzIGluZGl2aWR1YWwgVU1BUCBwbG90cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBsYXRlci4NCg0KYGBge3IsIGZpZy53aWR0aD0yNCwgZmlnLmhlaWdodD0xMiwgcmVzdWx0cz0naGlkZScsIGRwaT0zMDB9DQpjb2xtYXAgPSBjKCcwZCcgPSAnIzk3RUFEMicsDQogICAgICAgICAgICc4aHInPSAnIzhDQzdBMScsDQogICAgICAgICAgICcxZCcgPSAnIzgxNkU5NCcsDQogICAgICAgICAgICczZCcgPSAnIzc0MjI2QycsDQogICAgICAgICAgICc3ZCcgPSAnIzRCMjE0MicpDQpwQSA9IERpbVBsb3QoYTU0OSwgDQogICAgICAgIHJlZHVjdGlvbj0idW1hcCIsDQogICAgICAgIGRpbXM9YygxLCAyKSwNCiAgICAgICAgc3BsaXQuYnk9J1RpbWUnLA0KICAgICAgICBncm91cC5ieT0nVGltZScsDQogICAgICAgIGNvbHM9Y29sbWFwLA0KICAgICAgICBsYWJlbD1GQUxTRSwNCiAgICAgICAgcmVwZWw9VFJVRSwNCiAgICAgICAgbGFiZWwuc2l6ZT00LA0KICAgICAgICBwdC5zaXplPTUsIA0KICAgICAgICBuYS52YWx1ZSA9ICJncmV5NTAiKSArIA0KICAgICAgICBsYWJzKHRpdGxlPSJBNTQ5IFRpbWUtQ291cnNlIiwgDQogICAgICAgICAgICAgeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgeT0iVU1BUCAyIikgKw0KICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgKw0KICAgICAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcz1saXN0KHNpemU9MikpKQ0KDQpwQQ0KYGBgDQoNClRoaXMgZW1iZWRkaW5nIGp1c3QgY2hhbmdlcyBzdWJwb3B1bGF0aW9ucyB0byB0aW1lLCB3aGljaCBpcyB3aGF0IEkgb3JpZ2luYWxseSB3YW50ZWQuDQoNCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTIsIHJlc3VsdHM9J2hpZGUnLCBkcGk9MzAwfQ0KcEIgPSBEaW1QbG90KGE1NDksIA0KICAgICAgICByZWR1Y3Rpb249InVtYXAiLA0KICAgICAgICBkaW1zPWMoMSwgMiksDQogICAgICAgIGdyb3VwLmJ5PSdUaW1lJywNCiAgICAgICAgY29scyA9IGNvbG1hcCwNCiAgICAgICAgbGFiZWw9RkFMU0UsDQogICAgICAgIHJlcGVsPVRSVUUsDQogICAgICAgIGxhYmVsLnNpemU9NCwNCiAgICAgICAgcHQuc2l6ZT01LCANCiAgICAgICAgbmEudmFsdWUgPSAiZ3JleTUwIikgKyANCiAgICAgICAgbGFicyh0aXRsZT0iQTU0OSBUaW1lLUNvdXJzZSIsIA0KICAgICAgICAgICAgIHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgdGFnPSJBLiIsDQopICsNCiAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQoNCnBCDQpgYGANCg0KIyMgMy4gT3ZlcmxheSBncm93dGggcmF0ZXMgZnJvbSBLTyBvbnRvIHRoZSBVTUFQIGVtYmVkZGluZw0KDQojIyMgQS4gTG9hZCB1cCBhbmQgbWFwIHRoZSBrbm9ja291dCBkYXRhDQpXZSdsbCByZWFkIGluIHRoZSBtZXRhYm9saWMgS08gZGF0YSBjb21wdXRlZCBmcm9tIHNpbmdsZS1jZWxsIEZsdXggQmFsYW5jZSBBbmFseXNpcw0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0Ka29fcGF0aCA9ICdEOi9DaGFuZHJhc2VrYXJhbi9Qcm9qZWN0cy9FTVQvQW5hbHlzaXMvaTk5L3J4bmtvX2k5OS5jc3YnDQprb19kYXRhID0gcmVhZHI6OnJlYWRfY3N2KGtvX3BhdGgpDQoNCmE1NDlfaWRfbWFwID0gcmVhZF9jc3YoIkQ6L0NoYW5kcmFzZWthcmFuL1Byb2plY3RzL0VNVC9BbmFseXNpcy9kYXRhL2E1NDlfY29sbWFwLmNzdiIpDQoNCmNvbF9uYW1lcyA9IGNvbG5hbWVzKGtvX2RhdGFbLCA0Om5jb2woa29fZGF0YSldKQ0KY29sX25hbWVzID0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoY29sX25hbWVzLCAnX1teX10rJCcsICcnKQ0KY29sX25hbWVzID0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoY29sX25hbWVzLCAneCcsICcnKQ0KDQpyeG5tYXAgPSBrb19kYXRhWzE6M10NCmtvX2RhdGFbMTozXSA9IE5VTEwNCg0Ka29fZGF0YSA9IHQoa29fZGF0YSkNCmtvX2RhdGEgPSBhcy5kYXRhLmZyYW1lKGtvX2RhdGEpDQoNCnJvd25hbWVzKGtvX2RhdGEpID0gYTU0OV9pZF9tYXAkb3JpZ19pZA0KY29sbmFtZXMoa29fZGF0YSkgPSByeG5tYXAkcnhuX2lkcw0KYGBgDQoNCk5vdyBsZXQncyBsb2FkIHVwIHRoZSBjb250cm9sLg0KYGBge3J9DQp4bF9wYXRoID0gIkQ6L0NoYW5kcmFzZWthcmFuL1Byb2plY3RzL0VNVC9EYXRhL0NPQlJBL1VuY29uc3RyYWluZWQgaTk5IEtPIEdyYXRlLnhsc3giDQpjbnRyX2dyYXRlID0gcmVhZF9leGNlbCh4bF9wYXRoLCBzaGVldD0iY250cl9yeG5fZ3JhdGUiKQ0KYGBgDQoNCiMjIyBCLiBEYXRhIFRyYW5zZm9ybWF0aW9ucw0KDQojIyMjIGkuIENvbnRyb2wgZm9sZCBjaGFuZ2UgTm9ybWFsaXphdGlvbg0KRmlyc3QsIGxldCdzIHBlcmZvcm0gYSBtZWFuIG5vcm1hbGl6YXRpb24uIFdlJ2xsIHNwZWNpZmljYWxseSBzdWJ0cmFjdCB0aGUgbWVhbiBLTyBhY3Jvc3MgYWxsIGNlbGxzIGZvciBhIGdpdmVuIHJlYWN0aW9uLiBBbHNvIGlnbm9yZSBOQS4NCmBgYHtyfQ0KdG1wID0gY250cl9ncmF0ZVssIDJdDQptbm9ybV9rbyA9ICgoa29fZGF0YSsxKSAvICh0KHRtcCkrMSkpLTENCmBgYA0KDQpMZXQncyB2aXN1YWxpemUgdGhlIGZvbGQgY2hhbmdlIGRpc3RyaWJ1dGlvbi4NCmBgYHtyfQ0KbGlicmFyeShyZXNoYXBlMikNCnRtcCA9IG1lbHQobW5vcm1fa28pDQpnZ3Bsb3QodG1wLCBhZXMoeD12YWx1ZSkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnM9MTAwKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZzEwJykgKw0KICBnZ3RpdGxlKCJSRUNPTjEgc2NSTkFTZXEgS08gZGlzdHJpYnV0aW9uIikgKw0KICB4bGFiKCJSZWFjdGlvbiBLTyBEaXN0cmlidXRpb24iKSArDQogIHlsYWIoIkZyZXF1ZW5jeSAobG9nLXNjYWxlKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMjIyBpaS4gWi1zY29yZSBUcmFuc2Zvcm1hdGlvbg0KDQpBbHRlcm5hdGl2ZWx5LCBsZXQncyBzZWUgdGhlIGltcGFjdCBvZiBhIFotc2NvcmUgdHJhbnNmb3JtYXRpb24uDQpgYGB7cn0NCnRtcCA9IGNudHJfZ3JhdGVbLCAyXQ0KemtvID0gKGtvX2RhdGEgLSB0KHRtcCkpIC8gYXBwbHkoa29fZGF0YSwgMiwgc2QsIG5hLnJtPVRSVUUpDQpgYGANCg0KTGV0J3MgdmlzdWFsaXplIHRoZSBaLXNjb3JlIGRpc3RpcmJ1dGlvbi4NCmBgYHtyfQ0KbGlicmFyeShyZXNoYXBlMikNCnRtcCA9IG1lbHQoemtvKQ0KZ2dwbG90KHRtcCwgYWVzKHg9dmFsdWUpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwMCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cxMCcpICsNCiAgZ2d0aXRsZSgiUkVDT04xIHNjUk5BU2VxIEtPIGRpc3RyaWJ1dGlvbiIpICsNCiAgeGxhYigiUmVhY3Rpb24gS08gRGlzdHJpYnV0aW9uIikgKw0KICB5bGFiKCJGcmVxdWVuY3kgKGxvZy1zY2FsZSkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQojIyBDcmVhdGUgZGVuc2l0eSBtYXAgcHJvZmlsZXMgZm9yIGdseWNvbHlzaXMNCkluIE1vaGl0J3MgcGFwZXIsIHRoZXkgYXJlIGFibGUgdG8gc2hvdyB0aHJvdWdoIGRlbnNpdHkgcGxvdHMgdGhhdCB0aGVyZSBhcmUgZGVmZXJlbnRpYWxseSBhY3RpdmUgbWV0YWJvbGljIHBhdGh3YXlzLiBXaGF0IHRoaXMgZGVuc2l0eSBwbG90IHdpbGwgc2hvdyBhcmUgbWV0YWJvbGljIHJlYWN0aW9ucyBmb3IgQTU0OSBnbHljb2x5c2lzIG92ZXIgdGltZS4NCg0KRmlyc3QsIGNoYW5nZSB0aGUgcm93IHRvIG1hcCB0byB0aW1lLg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMiwgcmVzdWx0cz0naGlkZSd9DQp0aW1lID0gZGF0YS5mcmFtZShhNTQ5QG1ldGEuZGF0YSRUaW1lKQ0KdG9fdXNlID0gbmFtZXMobW5vcm1fa28pICVpbiUgYygiR0xDdDEiLCAiSEVYMSIsICJQR0kiLCAiUEZLIiwgIkZCQSIsICJHQVBEIiwgIlBHSyIsICJQR00iLCAiRU5PIiwgIlBZSyIsICJQWVJ0Mm0iLCAiUERIbSIpDQpnbHljb2x5c2lzX2tvID0gbW5vcm1fa29bLCB0b191c2VdDQptZXJnZWRfbWVhbmtvID0gY2JpbmQodGltZSwgZ2x5Y29seXNpc19rbykNCnRtcCA9IG1lbHQobWVyZ2VkX21lYW5rbywgaWQ9YygnYTU0OS5tZXRhLmRhdGEuVGltZScpKQ0KdG1wMiA9IHRtcFt0bXAkdmFyaWFibGUgPT0gIkVOTyIsIF0NCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCnRtcCAlPiUNCiAgZ2dwbG90KGFlcyh4PXZhbHVlLCBjb2xvcj1hNTQ5Lm1ldGEuZGF0YS5UaW1lLCBmaWxsPWE1NDkubWV0YS5kYXRhLlRpbWUpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYT0wLjQpICsgDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlLCBuY29sPTQpICsgDQogICNzY2FsZV95X2xvZzEwKCkgDQoNCiAgbGFicyh4PSJLTyBHcm93dGggU2NvcmUiLCB5PSJEZW5zaXR5IikNCg0KYGBgDQoNCiMjIyBDLiBNZXJnZSB3aXRoIFVNQVAgZW1iZWRkaW5nDQpUaGlzIGNvbWJpbmVzIHRoZSByZWFjdGlvbiBrbyBkYXRhIHdpdGggdGhlIFVNQVAgZW1iZWRkaW5nLg0KYGBge3J9DQp1bWFwX2RhdGEgPSBkYXRhLmZyYW1lKGE1NDlAcmVkdWN0aW9ucyR1bWFwQGNlbGwuZW1iZWRkaW5ncykNCmBgYA0KDQojIyMjIGkuIE1lYW4gTm9ybWFsaXphdGlvbg0KYGBge3J9DQptZXJnZWRfbWVhbmtvID0gbWVyZ2UodW1hcF9kYXRhLCBtbm9ybV9rbywgYnkueD0ncm93Lm5hbWVzJywgYnkueT0ncm93Lm5hbWVzJykNCnJvd25hbWVzKG1lcmdlZF9tZWFua28pID0gbWVyZ2VkX21lYW5rbyRSb3cubmFtZXMNCm1lcmdlZF9tZWFua28gPSBtZXJnZWRfbWVhbmtvWywgLTFdDQpgYGANCg0KIyMjIyBpaS4gWi1zY29yZQ0KYGBge3J9DQptZXJnZWRfemtvID0gbWVyZ2UodW1hcF9kYXRhLCB6a28sIGJ5Lng9J3Jvdy5uYW1lcycsIGJ5Lnk9J3Jvdy5uYW1lcycpDQpyb3duYW1lcyhtZXJnZWRfemtvKSA9IG1lcmdlZF96a28kUm93Lm5hbWVzDQptZXJnZWRfemtvID0gbWVyZ2VkX3prb1ssIC0xXQ0KYGBgDQoNCiMjIyBELiBWaXN1YWxpemUgS08gRGF0YQ0KTGV0J3MgaW50aWFsaXplIHNvbWUgdmFyaWFibGVzIHdlIG5lZWQgdG8gZGVjbGFyZSBmb3IgdGhlIHZpc3VhbGl6YXRpb24uDQoNClRoaXMgY29kZSBibG9jayBkb2VzIGl0IGJ5IHNvcnRpbmcgdGhlIHJlYWN0aW9ucyBiYXNlZCBvbiBzdGFuZGFyZCBkZXZpYXRpb24uDQpgYGB7cn0NCmNvbF9zZCA9IGFwcGx5KG1ub3JtX2tvLCAyLCBzZCwgbmEucm09VFJVRSkNCnNvcnRlZF9zZCA9IHNvcnQoY29sX3NkLCBpbmRleC5yZXR1cm49VFJVRSwgZGVjcmVhc2luZz1UUlVFKQ0KdG1wX3J4bnMgPSBtbm9ybV9rb1ssIHNvcnRlZF9zZCRpeF0NCmBgYA0KDQpOb3cgbWVyZ2Ugd2l0aCB0aGUgVU1BUCBjb29yZGluYXRlcy4NCmBgYHtyfQ0KbWVyZ2VkX21lYW5rbyA9IG1lcmdlKHVtYXBfZGF0YSwgdG1wX3J4bnMsIGJ5Lng9J3Jvdy5uYW1lcycsIGJ5Lnk9J3Jvdy5uYW1lcycpDQpyb3duYW1lcyhtZXJnZWRfbWVhbmtvKSA9IG1lcmdlZF9tZWFua28kUm93Lm5hbWVzDQptZXJnZWRfbWVhbmtvID0gbWVyZ2VkX21lYW5rb1ssIC0xXQ0KYGBgDQoNCkxldCdzIGxvb2sgYXQgdGhlIHRvcCAxMDAgbW9zdCB2YXJpZWQgcmVhY3Rpb25zDQpgYGB7cn0NCiN0bXAyID0gbWVyZ2VkX21lYW5rb1ssIDkwMDoxMDAwXQ0KdG1wMiA9IG1lcmdlZF9tZWFua29bLCAxOjEwMF0NCnRtcDMgPSBkYXRhLmZyYW1lKGNvbG5hbWVzKHRtcDIpKQ0KcmVhY3Rpb25fbmFtZXMgPSByeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSB0bXAzWzM6bnJvdyh0bXAzKSwgXSwgXQ0KcmVhY3Rpb25fbmFtZXMgPSByZWFjdGlvbl9uYW1lcyRyeG5fbmFtZQ0KYGBgDQoNCk9rYXksIHdlJ3JlIGdvaW5nIHRvIHNlbGVjdCA0IHJlYWN0aW9ucyBmcm9tIHRoZSB0b3AgMTAwLCBwbHVzIGVub2xhc2UuDQpgYGB7cn0NCnJlYWN0aW9uc190b192aXN1YWxpemUgPSBjKCJGQUNPQUwyMDRpIiwgIkNTbSIsICJBQ0NPQUNtIiwgIkVOTUFONmciLCAiTk5BVG4iKQ0KcmVhY3Rpb25fbmFtZXMgPSByeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSByZWFjdGlvbnNfdG9fdmlzdWFsaXplLCBdDQpyZWFjdGlvbl9uYW1lcyA9IHJlYWN0aW9uX25hbWVzJHJ4bl9uYW1lDQojcmVhY3Rpb25fbmFtZXNbNF0gPSAiRW5vbGFzZSINCiNyZWFjdGlvbl9uYW1lc1szXSA9ICJOaWNvdGluYW1pZGUtbnVjbGVvdGlkZSBhZGVueWx5bHRyYW5zZmVyYXNlIg0KYGBgDQoNCmBgYHtyfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIkFLR01BTHRtIiwgIkNTTkFUbSIsICJBQ0lUTCIsICJFTk1BTjZnIiwgIkNTbSIpDQpyZWFjdGlvbl9uYW1lcyA9IHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIHJlYWN0aW9uc190b192aXN1YWxpemUsIF0NCnJlYWN0aW9uX25hbWVzID0gcmVhY3Rpb25fbmFtZXMkcnhuX25hbWUNCiNyZWFjdGlvbl9uYW1lc1s0XSA9ICJFbm9sYXNlIg0KI3JlYWN0aW9uX25hbWVzWzNdID0gIk5pY290aW5hbWlkZS1udWNsZW90aWRlIGFkZW55bHlsdHJhbnNmZXJhc2UiDQpgYGANCg0KRmluYWxseSwgZ3JhYiBnbHljb2x5c2lzIHJlYWN0aW9ucw0KYGBge3J9DQojdG1wID0gRmluZEFsbE1hcmtlcnMoYTU0OSwgYXNzYXk9IkZCQSIpDQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygNCiAgJ0VOTUFONmcnLA0KICAnRkJBJywNCiAgJ0dBUEQnLA0KICAnSEVYMScsDQogICdMREhfTCcsDQogICdQREhtJywNCiAgJ1BFUENLJywNCiAgJ1BFUENLbScsDQogICdQRksnLA0KICAnUEdJJywNCiAgJ1BHSycsDQogICdQR00nLA0KICAnUEdNVCcsDQogICdQWUsnLA0KICAnVFBJJw0KKQ0KcmVhY3Rpb25fbmFtZXMgPSByeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSByZWFjdGlvbnNfdG9fdmlzdWFsaXplLCBdDQpyZWFjdGlvbl9uYW1lcyA9IHJlYWN0aW9uX25hbWVzJHJ4bl9uYW1lDQpgYGANCg0KYGBge3J9DQpyZWFjdGlvbl9uYW1lcw0KYGBgDQoNCiMjIyMgaS4gU2V0IDE6IEZsdXgNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCnJlYWN0aW9uc190b192aXN1YWxpemUgPSBjKCJBRFNMMSIsICJDWVNUUyIsICJQRVBDS20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDSVRMIiwgIkNZU08iLCAiREhGUiIpDQpyZWFjdGlvbl9uYW1lcyA9IGMoImFkZW55bG9zdWNjaW5hdGUgbHlhc2UiLCANCiAgICAgICAgICAgICAgICAgICAiY3lzdGF0aGlvbmluZSBiZXRhLXN5bnRoYXNlIiwgDQogICAgICAgICAgICAgICAgICAgIlBob3NwaG9lbm9scHlydXZhdGUgY2FyYm94eWtpbmFzZSAoR1RQKSIsDQogICAgICAgICAgICAgICAgICAgIkFUUC1DaXRyYXRlIGx5YXNlIiwNCiAgICAgICAgICAgICAgICAgICAiY3lzdGVpbmUgb3hpZGFzZSIsDQogICAgICAgICAgICAgICAgICAgImRpaHlkcm9mb2xhdGUgcmVkdWN0YXNlIikNCmBgYA0KDQojIyMjIGlpLiBTZXQgMjogS08NCmBgYHtyfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIkFQQVQycm0iLCAiQkFMQXRtciIsICJNTVNBRDNtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQ20iLCAiR0FQRCIsICJFWF9oX2UiKQ0KcmVhY3Rpb25fbmFtZXMgPSBjKCIzLUFtaW5vcHJvcGFub2F0ZToyLW94b2dsdXRhcmF0ZSBhbWlub3RyYW5zZmVyYXNlIChtKSIsDQogICAgICAgICAgICAgICAgICAgIkJldGEtYWxhbmluZSByZXZlcnNpYmxlIG1pdG9jaG9uZHJpYWwgdHJhbnNwb3J0IChkaWZmdXNpb24pIiwNCiAgICAgICAgICAgICAgICAgICAibWV0aHlsbWFsb25hdGUtc2VtaWFsZGVoeWRlIGRlaHlkcm9nZW5hc2UgKG1hbG9uaWMgc2VtaWFsZGVoeWRlKSwgbWl0b2Nob25kcmlhbCIsIA0KICAgICAgICAgICAgICAgICAgICJweXJ1dmF0ZSBjYXJib3h5bGFzZSIsDQogICAgICAgICAgICAgICAgICAgImdseWNlcmFsZGVoeWRlLTMtcGhvc3BoYXRlIGRlaHlkcm9nZW5hc2UiLA0KICAgICAgICAgICAgICAgICAgICJIKyBleGNoYW5nZSIpDQpgYGANCg0KIyMjIyBpaWkuIFNldCAzOiBLTw0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIkFLR01BTHRtIiwgIkVOTyIsICJBQ0lUTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NOQVRyIiwgIk1ESG0iLCAiTERIX0wiKQ0KcmVhY3Rpb25fbmFtZXMgPSBjKCJBS0cgVHJhbnNwb3J0ZXIiLCANCiAgICAgICAgICAgICAgICAgICAiRW5vbGFzZSIsIA0KICAgICAgICAgICAgICAgICAgICJBVFAgQ2l0cmF0ZSBMeWFzZSIsDQogICAgICAgICAgICAgICAgICAgIkNhcm5pdGluZSBvLWFjZXR5bHRyYW5zZmVyYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiTWFsYXRlIGRlaHlkcm9nZW5hc2UiKQ0KYGBgDQoNCiMjIyMgaXYuIFNldCA0OiBLTw0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIlBHQ0QiLCAiUFNFUlQiLCAiVFBJIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQ20iLCAiR0FQRCIsICJMREhfTCIpDQpyZWFjdGlvbl9uYW1lcyA9IGMoInBob3NwaG9nbHljZXJhdGUgZGVoeWRyb2dlbmFzZSIsIA0KICAgICAgICAgICAgICAgICAgICJwaG9zcGhvc2VyaW5lIHRyYW5zYW1pbmFzZSIsIA0KICAgICAgICAgICAgICAgICAgICJ0cmlvc2UgcGhvc3BoYXRlIGlzb21lcmFzZSIsDQogICAgICAgICAgICAgICAgICAgInB5cnV2YXRlIGNhcmJveHlsYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiZ2x5Y2VyYWxkZWh5ZGUtMy1waG9zcGhhdGUgZGVoeWRyb2dlbmFzZSIsDQogICAgICAgICAgICAgICAgICAgIkxhY3RhdGUgZGVoeWRyb2dlbmFzZSIpDQpgYGANCg0KIyMjIyB2LiBWaXN1YWxpemUgbWVhbi1ub3JtIEtPDQpgYGB7cn0NCnRtcCA9IG1lcmdlZF9tZWFua29bLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplXQ0KdG1wW2lzLm5hKHRtcCldID0gLTENCg0KdG1wMiA9IHRtcA0KdG1wMlt0bXAgPiAwLjNdID0gIkVuaGFuY2luZyINCnRtcDJbdG1wID4gMCAmIHRtcCA8IDAuM10gPSAiTWlsZHkgZW5oYW5jaW5nIg0KdG1wMlt0bXAgPCAwXSA9ICJTZW5zaXRpdmUiDQoNCnRtcDJbaXMubmEodG1wKV0gPSAwDQp0bXAyW3RtcCA9PSAwXSA9ICJOb3QgU2Vuc2l0aXZlIg0KDQp0bXAzID0gcnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMiksIF0NCmBgYA0KDQpgYGB7cn0NCnAgPSBsaXN0KCkNCnBbWzFdXSA9IGdncGxvdChtZXJnZWRfbWVhbmtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXAyWywgMV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iQi4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzFdLCAncnhuX25hbWUnXSkpLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJHcm93dGggY2xhc3NpZmljYXRpb24iKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmxhY2snLCBuYS52YWx1ZT0nZ3JheScsIGxpbWl0cz1jKG1pbih0bXApLCAxKSwgbWlkcG9pbnQ9MCkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpICANCiAgICAgICAgICAgICAgICANCg0KcFtbMl1dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCAzXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJDLiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbM10sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmwNCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KcFtbM11dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCA0XSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJELiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbNF0sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTZW5zaXRpdmUiPSJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBTZW5zaXRpdmUiPSJncmF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbGRseSBlbmhhbmNpbmciPSIjNkQ2QTZBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2luZyI9ImJsYWNrIikpICsgDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibGFjaycsIG5hLnZhbHVlPSdncmF5JywgbGltaXRzPWMobWluKHRtcCksIDEpLCBtaWRwb2ludD0wKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRhZz1lbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgIA0KDQpwW1s0XV0gPSBnZ3Bsb3QobWVyZ2VkX21lYW5rbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wMlssIDddKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0YWc9IkUuIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXRvVGl0bGVDYXNlKGFzLmNoYXJhY3RlcihyeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKVs3XSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KcFtbNV1dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCAxMl0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iRi4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzEyXSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KYGBgDQoNCg0KQ3JlYXRlIGFuZCB2aXN1YWxpemUgdGhlIGZpbmFsIFVNQVAgZmx1eCBwbG90IG9iamVjdC4NCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTIsIHJlc3VsdHM9J2hpZGUnfQ0KcEMgPSBzY2F0ZXI6Om11bHRpcGxvdChwQiwgICAgIHBbWzFdXSwgcFtbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgcFtbNF1dLCBwW1szXV0sIHBbWzVdXSwgY29scz0zKQ0KcEMNCmBgYA0KDQpOb3csIGxldCdzIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9ucyBvZiBrbm9ja291dHMNCmBgYHtyfQ0KdG1wMiR0aW1lID0gYTU0OSRUaW1lDQpuZXdfdG1wMiA9IHJlc2hhcGUyOjptZWx0KHRtcDIsIGlkPSJ0aW1lIikNCm5ld190bXAyID0gbmV3X3RtcDJbb3JkZXIobmV3X3RtcDIkdGltZSksXQ0KZ2dwbG90KCkgKyANCmdlb21fYmFyKG5ld190bXAyLCANCiAgICAgICAgIG1hcHBpbmc9YWVzKGZpbGw9YXMuZmFjdG9yKHZhbHVlKSwgDQogICAgICAgICAgICAgICAgICAgICB4PXZhcmlhYmxlLCB5PWFzLmZhY3Rvcih0aW1lKSksIA0KICAgICAgICAgc3RhdD0naWRlbnRpdHknLCBwb3NpdGlvbj0nc3RhY2snKQ0KYGBgDQoNCiMjIyMgdi4gVmlzdWFsaXplIFotc2NvcmUgS08NCmBgYHtyfQ0KdG1wID0gbWVyZ2VkX3prb1ssIHJlYWN0aW9uc190b192aXN1YWxpemVdDQp0bXBbaXMubmEodG1wKV0gPSAwDQpgYGANCg0KYGBge3J9DQpwID0gbGlzdCgpDQoNCnBbWzFdXSA9IGdncGxvdChtZXJnZWRfemtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzFdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbMV0sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQgPSAnZ3JheScsIGhpZ2g9J2JsYWNrJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCiAgICAgICAgICAgICAgICANCg0KcFtbMl1dID0gZ2dwbG90KG1lcmdlZF96a28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbMl1dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1syXSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZCA9ICdncmF5JywgaGlnaD0nYmxhY2snKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpDQoNCnBbWzNdXSA9IGdncGxvdChtZXJnZWRfemtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzNdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbM10sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQgPSAnZ3JheScsIGhpZ2g9J2JsYWNrJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KcFtbNF1dID0gZ2dwbG90KG1lcmdlZF96a28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbNF1dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1s0XSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZCA9ICdncmF5JywgaGlnaD0nYmxhY2snKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQpwW1s1XV0gPSBnZ3Bsb3QobWVyZ2VkX3prbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wWywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZVs1XV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXJlYWN0aW9uX25hbWVzWzVdLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJGbHV4IikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkID0gJ2dyYXknLCBoaWdoPSdibGFjaycpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCmBgYA0KDQoNCkNyZWF0ZSBhbmQgdmlzdWFsaXplIHRoZSBmaW5hbCBVTUFQIGZsdXggcGxvdCBvYmplY3QuDQpgYGB7ciwgZmlnLndpZHRoPTI0LCBmaWcuaGVpZ2h0PTEyLCByZXN1bHRzPSdoaWRlJ30NCnBDID0gc2NhdGVyOjptdWx0aXBsb3QocEIsIHBbWzFdXSwgcFtbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgcFtbNF1dLCBwW1szXV0sIHBbWzVdXSwgY29scz0zKQ0KcEMNCmBgYA0KDQojIyA0LiBTYXZlIHRoZSBkYXRhDQpGaXJzdCwgd2UgbmVlZCB0byBmb3JtYXQgdGhlIGRhdGEsIHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgREdFIE1hdHJpeCwgd2hlcmUgcm93cyBhcmUgcmVhY3Rpb25zIGFuZCBjb2x1bW5zIGFyZSBjZWxsIElEcy4NCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCmZiYSA9IGZsdXhfZGF0YQ0KDQojIFJlZm9ybWF0DQpmYmEgPSB0KGZiYSkNCmZiYSA9IGFzLnNwYXJzZShmYmEpDQpgYGANCg0KTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBleHByZXNzaW9uIG1hdHJpeCBoYXMgdGhlIHNhbWUgY2VsbHMgYXMgdGhlIGZiYSBtYXRyaXgsIGFuZCBhbHNvIGVuc3VyZSB0aGUgYGFjdGl2ZS5pZGVudGAgYW5kIHRoZSBgVGltZWAgZGF0YXBvaW50cyB3ZSdsbCBtYXAgdG8uDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQojIEdldCBuYW1lcyBhbmQgaW5kaWNlcw0KaW50ZXJzZWN0X2NlbGxzID0gaW50ZXJzZWN0KGNvbG5hbWVzKGE1NDlAYXNzYXlzJFJOQUBjb3VudHMpLCBjb2xuYW1lcyhmYmEpKQ0KY2VsbF9pZHggPSB3aGljaChjb2xuYW1lcyhhNTQ5QGFzc2F5cyRSTkFAY291bnRzKSAlaW4lIGludGVyc2VjdF9jZWxscykNCg0KIyBSZWZvcm1hdCBkYXRhDQphNTQ5X3N1YnNldCA9IHN1YnNldChhNTQ5LCBjZWxscz1pbnRlcnNlY3RfY2VsbHMpDQpmYmEgPSBmYmFbLCBpbnRlcnNlY3RfY2VsbHNdDQoNCmE1NDlfc3Vic2V0W1siRkJBIl1dID0gQ3JlYXRlQXNzYXlPYmplY3QoY291bnRzPWZiYSkNCnNhdmVSRFMoYTU0OV9zdWJzZXQsIGZpbGUgPSAiRDovQ2hhbmRyYXNla2FyYW4vUHJvamVjdHMvRU1UL0RhdGEvc2NSTkFTZXEvYTU0OV9xdWFudGlsZS5yZHMiKQ0KDQpgYGANCg0KTGV0J3MgY3JlYXRlIGEgcHJlcHJvY2Vzc2luZyBwaXBlbGluZSBmb3IgZG93bnN0cmVhbSBhbmFseXNlcw0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KcHJlcHJvY2Vzc19mbHV4ID0gZnVuY3Rpb24oZ2VuZV9vYmosIGFzc2F5KXsNCiAgIyBMb2cgbm9ybWFsaXplIGRhdGENCiAgZ2VuZV9vYmogPSBOb3JtYWxpemVEYXRhKGdlbmVfb2JqLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5PWFzc2F5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXphdGlvbi5tZXRob2Q9J0xvZ05vcm1hbGl6ZScsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUuZmFjdG9yPTEwMDAwKQ0KICANCiAgIyBTY2FsZSBkYXRhDQogIGdlbmVfb2JqID0gU2NhbGVEYXRhKGdlbmVfb2JqLCANCiAgICAgICAgICAgICAgICAgICAgICAgYXNzYXk9YXNzYXkpDQogIHJldHVybihnZW5lX29iaikNCn0NCmBgYA0KDQpOb3cgbGV0J3MgcGVyZm9ybSB0aGUgZGF0YSBwcmVwcm9jZXNzaW5nDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQojYTU0OV9zdWJzZXQgPSBwcmVwcm9jZXNzX2ZsdXgoYTU0OV9zdWJzZXQsIGFzc2F5PSJGQkEiKQ0KYGBgDQoNCiMjIDUuIEdldCBNZXRhYm9saWMgTWFya2Vycw0KV2UnbGwgZ2V0IG1ldGFib2xpYyBtYXJrZXJzIGJhc2VkIG9uIHN1YnBvcHVsYXRpb25zLiBUaGlzIG1vZHVsZSBkaWQgbm90IHlpZWxkIGFueSByZXN1bHQNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCmE1NDlfc3Vic2V0QGFjdGl2ZS5pZGVudCA9IGFzLmZhY3RvcihhNTQ5X3N1YnNldEBtZXRhLmRhdGEkVGltZSkNCnN1YnBvcF9yZWFjdGlvbnMgPSBGaW5kQWxsTWFya2VycyhhNTQ5X3N1YnNldCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NheT0iRkJBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5wY3Q9MC4yNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQ9MC4wNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnVzZT0iTUFTVCIpDQojd3JpdGUudGFibGUoc3VicG9wX3JlYWN0aW9ucywgImNsaXBib2FyZCIsIHNlcD0iXHQiKQ0KYGBgDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCiN2YXJfZmVhdHMgPSBGaW5kVmFyaWFibGVGZWF0dXJlcyhvYmplY3Q9YTU0OV9zdWJzZXQpDQpEb0hlYXRtYXAob2JqZWN0PWE1NDlfc3Vic2V0LA0KICAgICAgICAgIGFzc2F5PSJGQkEiLA0KICAgICAgICAgIHNsb3Q9J2NvdW50cycsDQogICAgICAgICAgbGFiZWw9RkFMU0UsDQogICAgICAgICAgZHJhdy5saW5lcz1UUlVFLA0KICAgICAgICAgIGxpbmVzLndpZHRoPTEwLA0KICAgICAgICAgIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0nc2FucycsIHNpemU9MTYpLA0KICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSwNCiAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjApLA0KICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMCksDQogICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTYpLA0KICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTE2KSwNCiAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjApKSkNCmBgYA0KDQojIyA2LiBPdmVybGF5IG1ldGFib2xpYyBmbHV4ZXMgDQpOb3cgbGV0J3MgcmVwZWF0IGZvciBtZXRhYm9saWMgZmx1eGVzLg0KDQojIyMgQS4gTG9hZCB1cCBhbmQgbWFwIHRoZSBmbHV4IGRhdGENCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCmZsdXhfcGF0aCA9ICdEOi9DaGFuZHJhc2VrYXJhbi9Qcm9qZWN0cy9FTVQvQW5hbHlzaXMvaTk5L2ZsdXhfaTk5LmNzdicNCmZsdXhfZGF0YSA9IHJlYWRyOjpyZWFkX2NzdihmbHV4X3BhdGgpDQoNCmE1NDlfaWRfbWFwID0gcmVhZF9jc3YoIkQ6L0NoYW5kcmFzZWthcmFuL1Byb2plY3RzL0VNVC9BbmFseXNpcy9kYXRhL2E1NDlfY29sbWFwLmNzdiIpDQoNCmNvbF9uYW1lcyA9IGNvbG5hbWVzKGZsdXhfZGF0YVssIDQ6bmNvbChmbHV4X2RhdGEpXSkNCmNvbF9uYW1lcyA9IHN0cmluZ3I6OnN0cl9yZXBsYWNlKGNvbF9uYW1lcywgJ19bXl9dKyQnLCAnJykNCmNvbF9uYW1lcyA9IHN0cmluZ3I6OnN0cl9yZXBsYWNlKGNvbF9uYW1lcywgJ3gnLCAnJykNCg0KcnhubWFwID0gZmx1eF9kYXRhWzE6M10NCmZsdXhfZGF0YVsxOjNdID0gTlVMTA0KDQpmbHV4X2RhdGEgPSB0KGZsdXhfZGF0YSkNCmZsdXhfZGF0YSA9IGFzLmRhdGEuZnJhbWUoZmx1eF9kYXRhKQ0KDQpyb3duYW1lcyhmbHV4X2RhdGEpID0gYTU0OV9pZF9tYXAkb3JpZ19pZA0KY29sbmFtZXMoZmx1eF9kYXRhKSA9IHJ4bm1hcCRyeG5faWRzDQoNCmZsdXhfZGF0YSA9IGFicyhmbHV4X2RhdGEpDQpgYGANCg0KIyMjIEIuIERhdGEgVHJhbnNmb3JtYXRpb25zDQojIyMjIGkuIE1pbi1tYXggc2NhbGUNCkZpcnN0LCBsZXQncyBwZXJmb3JtIGEgbWVhbiBub3JtYWxpemF0aW9uLiBXZSdsbCBzcGVjaWZpY2FsbHkgc3VidHJhY3QgdGhlIG1lYW4gS08gYWNyb3NzIGFsbCBjZWxscyBmb3IgYSBnaXZlbiByZWFjdGlvbi4gQWxzbyBpZ25vcmUgTkEuDQpgYGB7cn0NCiN4bWluID0gYXBwbHkoZmx1eF9kYXRhLCAyLCBGVU49bWluLCBuYS5ybSA9IFRSVUUpDQojeG1heCA9IGFwcGx5KGZsdXhfZGF0YSwgMiwgRlVOPW1heCwgbmEucm0gPSBUUlVFKQ0KDQp4bWluID0gbWluKGZsdXhfZGF0YSwgbmEucm0gPSBUUlVFKQ0KeG1heCA9IG1heChmbHV4X2RhdGEsIG5hLnJtID0gVFJVRSkNCm1ub3JtX2ZsdXggPSAoZmx1eF9kYXRhIC0geG1pbikgLyAoeG1heCAtIHhtaW4pDQpgYGANCg0KTGV0J3MgdmlzdWFsaXplIHRoZSBtZWFuLW5vcm1hbGl6ZWQgZGlzdHJpYnV0aW9uLg0KYGBge3J9DQpsaWJyYXJ5KHJlc2hhcGUyKQ0KdG1wID0gbWVsdChtbm9ybV9mbHV4KQ0KDQpnZ3Bsb3QodG1wLCBhZXMoeD12YWx1ZSkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnM9MTAwKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZzEwJykgKw0KICBnZ3RpdGxlKCJSRUNPTjEgc2NSTkFTZXEgRmx1eCBkaXN0cmlidXRpb24iKSArDQogIHhsYWIoIlJlYWN0aW9uIEZsdXggRGlzdHJpYnV0aW9uIikgKw0KICB5bGFiKCJGcmVxdWVuY3kgKGxvZy1zY2FsZSkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyMgaWkuIFotc2NvcmUgVHJhbnNmb3JtYXRpb24NCg0KQWx0ZXJuYXRpdmVseSwgbGV0J3Mgc2VlIHRoZSBpbXBhY3Qgb2YgYSBaLXNjb3JlIHRyYW5zZm9ybWF0aW9uLg0KYGBge3J9DQp0bXAgPSBhYnMobW5vcm1fZmx1eCkNCnpmbHV4ID0gKHRtcCAtIGNvbE1lYW5zKHRtcCwgbmEucm09VFJVRSkpIC8gYXBwbHkodG1wLCAyLCBzZCwgbmEucm09VFJVRSkNCmBgYA0KDQpMZXQncyB2aXN1YWxpemUgdGhlIFotc2NvcmUgZGlzdGlyYnV0aW9uLg0KYGBge3J9DQpsaWJyYXJ5KHJlc2hhcGUyKQ0KdG1wID0gbWVsdCh6Zmx1eCkNCmdncGxvdCh0bXAsIGFlcyh4PXZhbHVlKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz0xMDApICsgDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArDQogIGdndGl0bGUoIlJFQ09OMSBzY1JOQVNlcSBLTyBkaXN0cmlidXRpb24iKSArDQogIHhsYWIoIlJlYWN0aW9uIEtPIERpc3RyaWJ1dGlvbiIpICsNCiAgeWxhYigiRnJlcXVlbmN5IChsb2ctc2NhbGUpIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyBDcmVhdGUgZGVuc2l0eSBtYXAgcHJvZmlsZXMgZm9yIGdseWNvbHlzaXMNCkluIE1vaGl0J3MgcGFwZXIsIHRoZXkgYXJlIGFibGUgdG8gc2hvdyB0aHJvdWdoIGRlbnNpdHkgcGxvdHMgdGhhdCB0aGVyZSBhcmUgZGVmZXJlbnRpYWxseSBhY3RpdmUgbWV0YWJvbGljIHBhdGh3YXlzLiBXaGF0IHRoaXMgZGVuc2l0eSBwbG90IHdpbGwgc2hvdyBhcmUgbWV0YWJvbGljIHJlYWN0aW9ucyBmb3IgQTU0OSBnbHljb2x5c2lzIG92ZXIgdGltZS4NCg0KRmlyc3QsIGNoYW5nZSB0aGUgcm93IHRvIG1hcCB0byB0aW1lLg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMiwgcmVzdWx0cz0naGlkZSd9DQp0aW1lID0gZGF0YS5mcmFtZShhNTQ5QG1ldGEuZGF0YSRUaW1lKQ0KdG9fdXNlID0gbmFtZXMobW5vcm1fZmx1eCkgJWluJSBjKCJHTEN0MSIsICJIRVgxIiwgIlBHSSIsICJQRksiLCAiRkJBIiwgIkdBUEQiLCAiUEdLIiwgIlBHTSIsICJFTk8iLCAiUFlLIiwgIlBZUnQybSIsICJQREhtIikNCmdseWNvbHlzaXNfa28gPSBtbm9ybV9mbHV4WywgdG9fdXNlXQ0KbWVyZ2VkX21lYW5rbyA9IGNiaW5kKHRpbWUsIGdseWNvbHlzaXNfa28pDQp0bXAgPSBtZWx0KG1lcmdlZF9tZWFua28sIGlkPWMoJ2E1NDkubWV0YS5kYXRhLlRpbWUnKSkNCnRtcDIgPSB0bXBbdG1wJHZhcmlhYmxlID09ICJFTk8iLCBdDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQp0bXAgJT4lDQogIGdncGxvdChhZXMoeD12YWx1ZSwgY29sb3I9YTU0OS5tZXRhLmRhdGEuVGltZSwgZmlsbD1hNTQ5Lm1ldGEuZGF0YS5UaW1lKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGE9MC40KSArIA0KICBmYWNldF93cmFwKH52YXJpYWJsZSwgbmNvbD00KSArIA0KICAjc2NhbGVfeV9sb2cxMCgpIA0KDQogIGxhYnMoeD0iRmx1eCBwcm9maWxlcyIsIHk9IkRlbnNpdHkiKQ0KDQpgYGANCg0KIyMjIEMuIE1lcmdlIHdpdGggVU1BUCBlbWJlZGRpbmcNClRoaXMgY29tYmluZXMgdGhlIHJlYWN0aW9uIGtvIGRhdGEgd2l0aCB0aGUgVU1BUCBlbWJlZGRpbmcuDQpgYGB7cn0NCnVtYXBfZGF0YSA9IGRhdGEuZnJhbWUoYTU0OUByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzKQ0KYGBgDQoNCiMjIyMgaS4gTWVhbiBOb3JtYWxpemF0aW9uDQpgYGB7cn0NCm1lcmdlZF9tZWFuZmx1eCA9IG1lcmdlKHVtYXBfZGF0YSwgbW5vcm1fZmx1eCwgYnkueD0ncm93Lm5hbWVzJywgYnkueT0ncm93Lm5hbWVzJykNCnJvd25hbWVzKG1lcmdlZF9tZWFuZmx1eCkgPSBtZXJnZWRfbWVhbmZsdXgkUm93Lm5hbWVzDQptZXJnZWRfbWVhbmZsdXggPSBtZXJnZWRfbWVhbmZsdXhbLCAtMV0NCmBgYA0KDQojIyMjIGlpLiBaLXNjb3JlDQpgYGB7cn0NCm1lcmdlZF96Zmx1eCA9IG1lcmdlKHVtYXBfZGF0YSwgemZsdXgsIGJ5Lng9J3Jvdy5uYW1lcycsIGJ5Lnk9J3Jvdy5uYW1lcycpDQpyb3duYW1lcyhtZXJnZWRfemZsdXgpID0gbWVyZ2VkX3pmbHV4JFJvdy5uYW1lcw0KbWVyZ2VkX3pmbHV4ID0gbWVyZ2VkX3pmbHV4WywgLTFdDQpgYGANCg0KIyMjIEQuIFZpc3VhbGl6ZSBLTyBEYXRhDQpMZXQncyBpbnRpYWxpemUgc29tZSB2YXJpYWJsZXMgd2UgbmVlZCB0byBkZWNsYXJlIGZvciB0aGUgdmlzdWFsaXphdGlvbg0KDQojIyMjIGkuIFNldCAxOiBGbHV4DQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiQURTTDEiLCAiQ1lTVFMiLCAiUEVQQ0ttIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ0lUTCIsICJDWVNPIiwgIkRIRlIiKQ0KcmVhY3Rpb25fbmFtZXMgPSBjKCJhZGVueWxvc3VjY2luYXRlIGx5YXNlIiwgDQogICAgICAgICAgICAgICAgICAgImN5c3RhdGhpb25pbmUgYmV0YS1zeW50aGFzZSIsIA0KICAgICAgICAgICAgICAgICAgICJQaG9zcGhvZW5vbHB5cnV2YXRlIGNhcmJveHlraW5hc2UgKEdUUCkiLA0KICAgICAgICAgICAgICAgICAgICJBVFAtQ2l0cmF0ZSBseWFzZSIsDQogICAgICAgICAgICAgICAgICAgImN5c3RlaW5lIG94aWRhc2UiLA0KICAgICAgICAgICAgICAgICAgICJkaWh5ZHJvZm9sYXRlIHJlZHVjdGFzZSIpDQpgYGANCg0KIyMjIyBpaS4gU2V0IDI6IEtPDQpgYGB7cn0NCnJlYWN0aW9uc190b192aXN1YWxpemUgPSBjKCJBUEFUMnJtIiwgIkJBTEF0bXIiLCAiTU1TQUQzbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUENtIiwgIkdBUEQiLCAiRVhfaF9lIikNCnJlYWN0aW9uX25hbWVzID0gYygiMy1BbWlub3Byb3Bhbm9hdGU6Mi1veG9nbHV0YXJhdGUgYW1pbm90cmFuc2ZlcmFzZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICJCZXRhLWFsYW5pbmUgcmV2ZXJzaWJsZSBtaXRvY2hvbmRyaWFsIHRyYW5zcG9ydCAoZGlmZnVzaW9uKSIsDQogICAgICAgICAgICAgICAgICAgIm1ldGh5bG1hbG9uYXRlLXNlbWlhbGRlaHlkZSBkZWh5ZHJvZ2VuYXNlIChtYWxvbmljIHNlbWlhbGRlaHlkZSksIG1pdG9jaG9uZHJpYWwiLCANCiAgICAgICAgICAgICAgICAgICAicHlydXZhdGUgY2FyYm94eWxhc2UiLA0KICAgICAgICAgICAgICAgICAgICJnbHljZXJhbGRlaHlkZS0zLXBob3NwaGF0ZSBkZWh5ZHJvZ2VuYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiSCsgZXhjaGFuZ2UiKQ0KYGBgDQoNCiMjIyMgaWlpLiBTZXQgMzogS08NCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCnJlYWN0aW9uc190b192aXN1YWxpemUgPSBjKCJBS0dNQUx0bSIsICJFTk8iLCAiQUNJVEwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTTkFUciIsICJNREhtIiwgIkxESF9MIikNCnJlYWN0aW9uX25hbWVzID0gYygiQUtHIFRyYW5zcG9ydGVyIiwgDQogICAgICAgICAgICAgICAgICAgIkVub2xhc2UiLCANCiAgICAgICAgICAgICAgICAgICAiQVRQIENpdHJhdGUgTHlhc2UiLA0KICAgICAgICAgICAgICAgICAgICJDYXJuaXRpbmUgby1hY2V0eWx0cmFuc2ZlcmFzZSIsDQogICAgICAgICAgICAgICAgICAgIk1hbGF0ZSBkZWh5ZHJvZ2VuYXNlIikNCmBgYA0KDQojIyMjIGl2LiBTZXQgNDogS08NCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCnJlYWN0aW9uc190b192aXN1YWxpemUgPSBjKCJQR0NEIiwgIlBTRVJUIiwgIlRQSSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUENtIiwgIkdBUEQiLCAiTERIX0wiKQ0KcmVhY3Rpb25fbmFtZXMgPSBjKCJwaG9zcGhvZ2x5Y2VyYXRlIGRlaHlkcm9nZW5hc2UiLCANCiAgICAgICAgICAgICAgICAgICAicGhvc3Bob3NlcmluZSB0cmFuc2FtaW5hc2UiLCANCiAgICAgICAgICAgICAgICAgICAidHJpb3NlIHBob3NwaGF0ZSBpc29tZXJhc2UiLA0KICAgICAgICAgICAgICAgICAgICJweXJ1dmF0ZSBjYXJib3h5bGFzZSIsDQogICAgICAgICAgICAgICAgICAgImdseWNlcmFsZGVoeWRlLTMtcGhvc3BoYXRlIGRlaHlkcm9nZW5hc2UiLA0KICAgICAgICAgICAgICAgICAgICJMYWN0YXRlIGRlaHlkcm9nZW5hc2UiKQ0KYGBgDQoNCiMjIyMgdi4gVmlzdWFsaXplIG1lYW4tbm9ybSBLTw0KYGBge3J9DQp0bXAgPSBtZXJnZWRfbWVhbmZsdXhbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplXQ0KdG1wW2lzLm5hKHRtcCldID0gMA0KYGBgDQoNCmBgYHtyfQ0KdG1wID0gbWVyZ2VkX21lYW5rb1ssIHJlYWN0aW9uc190b192aXN1YWxpemVdDQp0bXBbaXMubmEodG1wKV0gPSAtMQ0KDQp0bXAzID0gcnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMiksIF0NCmBgYA0KDQpgYGB7cn0NCnBbWzFdXSA9IGdncGxvdChtZXJnZWRfbWVhbmtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXAyWywgMV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iQi4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzFdLCAncnhuX25hbWUnXSkpLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJHcm93dGggY2xhc3NpZmljYXRpb24iKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmxhY2snLCBuYS52YWx1ZT0nZ3JheScsIGxpbWl0cz1jKG1pbih0bXApLCAxKSwgbWlkcG9pbnQ9MCkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpICANCiAgICAgICAgICAgICAgICANCg0KcFtbMl1dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCAzXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJDLiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbM10sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmwNCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KcFtbM11dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCA0XSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJELiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbNF0sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTZW5zaXRpdmUiPSJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBTZW5zaXRpdmUiPSJncmF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbGRseSBlbmhhbmNpbmciPSIjNkQ2QTZBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2luZyI9ImJsYWNrIikpICsgDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibGFjaycsIG5hLnZhbHVlPSdncmF5JywgbGltaXRzPWMobWluKHRtcCksIDEpLCBtaWRwb2ludD0wKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRhZz1lbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgIA0KDQpwW1s0XV0gPSBnZ3Bsb3QobWVyZ2VkX21lYW5rbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wMlssIDddKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0YWc9IkUuIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXRvVGl0bGVDYXNlKGFzLmNoYXJhY3RlcihyeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKVs3XSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KcFtbNV1dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCAxMl0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iRi4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzEyXSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KYGBgDQoNCg0KQ3JlYXRlIGFuZCB2aXN1YWxpemUgdGhlIGZpbmFsIFVNQVAgZmx1eCBwbG90IG9iamVjdC4NCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTIsIHJlc3VsdHM9J2hpZGUnfQ0KcEMgPSBzY2F0ZXI6Om11bHRpcGxvdChwQiwgcFtbMV1dLCBwW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICBwW1s0XV0sIHBbWzNdXSwgcFtbNV1dLCBjb2xzPTMpDQpwQw0KYGBgDQoNCiMjIyMgdi4gVmlzdWFsaXplIFotc2NvcmUgS08NCmBgYHtyfQ0KdG1wID0gbWVyZ2VkX3pmbHV4WywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZV0NCnRtcFtpcy5uYSh0bXApXSA9IDANCmBgYA0KDQpgYGB7cn0NCnAgPSBsaXN0KCkNCnBbWzFdXSA9IGdncGxvdChtZXJnZWRfemZsdXgsIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbMV1dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1sxXSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsYWNrIiwgbWlkID0gJ3doaXRlJywgaGlnaD0ncmVkJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCiAgICAgICAgICAgICAgICANCg0KcFtbMl1dID0gZ2dwbG90KG1lcmdlZF96Zmx1eCwgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wWywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZVsyXV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXJlYWN0aW9uX25hbWVzWzJdLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJGbHV4IikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmxhY2siLCBtaWQgPSAnd2hpdGUnLCBoaWdoPSdyZWQnKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpDQoNCnBbWzNdXSA9IGdncGxvdChtZXJnZWRfemZsdXgsIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbM11dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1szXSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsYWNrIiwgbWlkID0gJ3doaXRlJywgaGlnaD0ncmVkJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKQ0KDQpwW1s0XV0gPSBnZ3Bsb3QobWVyZ2VkX3pmbHV4LCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzRdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbNF0sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibGFjayIsIG1pZCA9ICd3aGl0ZScsIGhpZ2g9J3JlZCcpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCnBbWzVdXSA9IGdncGxvdChtZXJnZWRfemZsdXgsIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbNV1dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1s1XSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsYWNrIiwgbWlkID0gJ3doaXRlJywgaGlnaD0ncmVkJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KYGBgDQoNCg0KQ3JlYXRlIGFuZCB2aXN1YWxpemUgdGhlIGZpbmFsIFVNQVAgZmx1eCBwbG90IG9iamVjdC4NCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTIsIHJlc3VsdHM9J2hpZGUnfQ0KcEMgPSBzY2F0ZXI6Om11bHRpcGxvdChwQiwgcFtbMV1dLCBwW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICBwW1s0XV0sIHBbWzNdXSwgcFtbNV1dLCBjb2xzPTMpDQpwQw0KYGBg
+LS0tDQp0aXRsZTogIk1BR0lDX1VNQVBfOTkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBTdW1tYXJ5DQpUaGlzIG5vdGVib29rIHByb2Nlc3NlcyBzY1JOQVNlcSB0aW1lIGNvdXJzZSBkYXRhLiBTb21lIG9mIHRoZSBjb2RlIHdhcyBhZGFwdGVkIGZyb20gQ29vayBldCBhbC4sIDIwMjAuDQoNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCiMjIDEuIExvYWQgTGlicmFyaWVzDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh1bWFwKQ0KbGlicmFyeShTZXVyYXQpDQpsaWJyYXJ5KHdyaXRleGwpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShleHRyYWZvbnQpDQpsaWJyYXJ5KHRvb2xzKQ0KI2xvYWRmb250cyhkZXZpY2U9IndpbiIpDQpgYGANCg0KIyMgMi4gTG9hZCBzY1JOQVNlcSBkYXRhc2V0cw0KTmV4dCwgd2UnbGwgbG9hZCB0aGUgQTU0OSBkYXRhc2V0LCB3aGljaCBpcyB0aGUgbHVuZyBjYW5jZXIgY2VsbCBsaW5lIGludmVzdGlnYXRlZCBpbiBHU0UxNDc0MDUuIEFkZGl0aW9uYWxseSwgd2UnbGwgZm9jdXMgb24gdGhlICRUR0YgXGJldGEgMSQgc2FtcGxlLCBzaW5jZSB0aGlzIHdhcyB0aGUgd2F5IEVNVCB3YXMgaW5kdWNlZCBpbiBtYW55IGJ1bGsgZXhwZXJpbWVudHMuDQoNCmBgYHtyLCBpbmNsdWRlPVRSVUV9DQpmaWxlcGF0aCA9ICdEOi9DaGFuZHJhc2VrYXJhbi9Qcm9qZWN0cy9FTVQvRGF0YS9zY1JOQVNlcS9hNTQ5X3F1YW50aWxlLnJkcycNCmE1NDkgPSByZWFkUkRTKGZpbGVwYXRoKQ0KYGBgDQoNCiMjIyBBLiBWaXN1YWxpemUgVGltZS1Db3Vyc2UNClRoaXMgYml0IG9mIGNvZGUgc2VwYXJhdGVzIGdyb3VwcyBieSB0aW1lIHBvaW50IGFuZCBjcmVhdGVzIGluZGl2aWR1YWwgVU1BUCBwbG90cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBsYXRlci4NCg0KYGBge3IsIGZpZy53aWR0aD0yNCwgZmlnLmhlaWdodD0xMiwgcmVzdWx0cz0naGlkZScsIGRwaT0zMDB9DQpjb2xtYXAgPSBjKCcwZCcgPSAnIzk3RUFEMicsDQogICAgICAgICAgICc4aHInPSAnIzhDQzdBMScsDQogICAgICAgICAgICcxZCcgPSAnIzgxNkU5NCcsDQogICAgICAgICAgICczZCcgPSAnIzc0MjI2QycsDQogICAgICAgICAgICc3ZCcgPSAnIzRCMjE0MicpDQpwQSA9IERpbVBsb3QoYTU0OSwgDQogICAgICAgIHJlZHVjdGlvbj0idW1hcCIsDQogICAgICAgIGRpbXM9YygxLCAyKSwNCiAgICAgICAgc3BsaXQuYnk9J1RpbWUnLA0KICAgICAgICBncm91cC5ieT0nVGltZScsDQogICAgICAgIGNvbHM9Y29sbWFwLA0KICAgICAgICBsYWJlbD1GQUxTRSwNCiAgICAgICAgcmVwZWw9VFJVRSwNCiAgICAgICAgbGFiZWwuc2l6ZT00LA0KICAgICAgICBwdC5zaXplPTUsIA0KICAgICAgICBuYS52YWx1ZSA9ICJncmV5NTAiKSArIA0KICAgICAgICBsYWJzKHRpdGxlPSJBNTQ5IFRpbWUtQ291cnNlIiwgDQogICAgICAgICAgICAgeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgeT0iVU1BUCAyIikgKw0KICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgKw0KICAgICAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcz1saXN0KHNpemU9MikpKQ0KDQpwQQ0KYGBgDQoNClRoaXMgZW1iZWRkaW5nIGp1c3QgY2hhbmdlcyBzdWJwb3B1bGF0aW9ucyB0byB0aW1lLCB3aGljaCBpcyB3aGF0IEkgb3JpZ2luYWxseSB3YW50ZWQuDQoNCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTIsIHJlc3VsdHM9J2hpZGUnLCBkcGk9MzAwfQ0KcEIgPSBEaW1QbG90KGE1NDksIA0KICAgICAgICByZWR1Y3Rpb249InVtYXAiLA0KICAgICAgICBkaW1zPWMoMSwgMiksDQogICAgICAgIGdyb3VwLmJ5PSdUaW1lJywNCiAgICAgICAgY29scyA9IGNvbG1hcCwNCiAgICAgICAgbGFiZWw9RkFMU0UsDQogICAgICAgIHJlcGVsPVRSVUUsDQogICAgICAgIGxhYmVsLnNpemU9NCwNCiAgICAgICAgcHQuc2l6ZT01LCANCiAgICAgICAgbmEudmFsdWUgPSAiZ3JleTUwIikgKyANCiAgICAgICAgbGFicyh0aXRsZT0iQTU0OSBUaW1lLUNvdXJzZSIsIA0KICAgICAgICAgICAgIHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgdGFnPSJBLiIsDQopICsNCiAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQoNCnBCDQpgYGANCg0KIyMgMy4gT3ZlcmxheSBncm93dGggcmF0ZXMgZnJvbSBLTyBvbnRvIHRoZSBVTUFQIGVtYmVkZGluZw0KDQojIyMgQS4gTG9hZCB1cCBhbmQgbWFwIHRoZSBrbm9ja291dCBkYXRhDQpXZSdsbCByZWFkIGluIHRoZSBtZXRhYm9saWMgS08gZGF0YSBjb21wdXRlZCBmcm9tIHNpbmdsZS1jZWxsIEZsdXggQmFsYW5jZSBBbmFseXNpcw0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0Ka29fcGF0aCA9ICdEOi9DaGFuZHJhc2VrYXJhbi9Qcm9qZWN0cy9FTVQvQW5hbHlzaXMvaTk5L3J4bmtvX2k5OS5jc3YnDQprb19kYXRhID0gcmVhZHI6OnJlYWRfY3N2KGtvX3BhdGgpDQoNCmE1NDlfaWRfbWFwID0gcmVhZF9jc3YoIkQ6L0NoYW5kcmFzZWthcmFuL1Byb2plY3RzL0VNVC9BbmFseXNpcy9kYXRhL2E1NDlfY29sbWFwLmNzdiIpDQoNCmNvbF9uYW1lcyA9IGNvbG5hbWVzKGtvX2RhdGFbLCA0Om5jb2woa29fZGF0YSldKQ0KY29sX25hbWVzID0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoY29sX25hbWVzLCAnX1teX10rJCcsICcnKQ0KY29sX25hbWVzID0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoY29sX25hbWVzLCAneCcsICcnKQ0KDQpyeG5tYXAgPSBrb19kYXRhWzE6M10NCmtvX2RhdGFbMTozXSA9IE5VTEwNCg0Ka29fZGF0YSA9IHQoa29fZGF0YSkNCmtvX2RhdGEgPSBhcy5kYXRhLmZyYW1lKGtvX2RhdGEpDQoNCnJvd25hbWVzKGtvX2RhdGEpID0gYTU0OV9pZF9tYXAkb3JpZ19pZA0KY29sbmFtZXMoa29fZGF0YSkgPSByeG5tYXAkcnhuX2lkcw0KYGBgDQoNCk5vdyBsZXQncyBsb2FkIHVwIHRoZSBjb250cm9sLg0KYGBge3J9DQp4bF9wYXRoID0gIkQ6L0NoYW5kcmFzZWthcmFuL1Byb2plY3RzL0VNVC9EYXRhL0NPQlJBL1VuY29uc3RyYWluZWQgaTk5IEtPIEdyYXRlLnhsc3giDQpjbnRyX2dyYXRlID0gcmVhZF9leGNlbCh4bF9wYXRoLCBzaGVldD0iY250cl9yeG5fZ3JhdGUiKQ0KYGBgDQoNCiMjIyBCLiBEYXRhIFRyYW5zZm9ybWF0aW9ucw0KDQojIyMjIGkuIENvbnRyb2wgZm9sZCBjaGFuZ2UgTm9ybWFsaXphdGlvbg0KRmlyc3QsIGxldCdzIHBlcmZvcm0gYSBtZWFuIG5vcm1hbGl6YXRpb24uIFdlJ2xsIHNwZWNpZmljYWxseSBzdWJ0cmFjdCB0aGUgbWVhbiBLTyBhY3Jvc3MgYWxsIGNlbGxzIGZvciBhIGdpdmVuIHJlYWN0aW9uLiBBbHNvIGlnbm9yZSBOQS4NCmBgYHtyfQ0KdG1wID0gY250cl9ncmF0ZVssIDJdDQptbm9ybV9rbyA9ICgoa29fZGF0YSsxKSAvICh0KHRtcCkrMSkpLTENCmBgYA0KDQpMZXQncyB2aXN1YWxpemUgdGhlIGZvbGQgY2hhbmdlIGRpc3RyaWJ1dGlvbi4NCmBgYHtyfQ0KbGlicmFyeShyZXNoYXBlMikNCnRtcCA9IG1lbHQobW5vcm1fa28pDQpnZ3Bsb3QodG1wLCBhZXMoeD12YWx1ZSkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnM9MTAwKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZzEwJykgKw0KICBnZ3RpdGxlKCJSRUNPTjEgc2NSTkFTZXEgS08gZGlzdHJpYnV0aW9uIikgKw0KICB4bGFiKCJSZWFjdGlvbiBLTyBEaXN0cmlidXRpb24iKSArDQogIHlsYWIoIkZyZXF1ZW5jeSAobG9nLXNjYWxlKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMjIyBpaS4gWi1zY29yZSBUcmFuc2Zvcm1hdGlvbg0KDQpBbHRlcm5hdGl2ZWx5LCBsZXQncyBzZWUgdGhlIGltcGFjdCBvZiBhIFotc2NvcmUgdHJhbnNmb3JtYXRpb24uDQpgYGB7cn0NCnRtcCA9IGNudHJfZ3JhdGVbLCAyXQ0KemtvID0gKGtvX2RhdGEgLSB0KHRtcCkpIC8gYXBwbHkoa29fZGF0YSwgMiwgc2QsIG5hLnJtPVRSVUUpDQpgYGANCg0KTGV0J3MgdmlzdWFsaXplIHRoZSBaLXNjb3JlIGRpc3RpcmJ1dGlvbi4NCmBgYHtyfQ0KbGlicmFyeShyZXNoYXBlMikNCnRtcCA9IG1lbHQoemtvKQ0KZ2dwbG90KHRtcCwgYWVzKHg9dmFsdWUpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwMCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cxMCcpICsNCiAgZ2d0aXRsZSgiUkVDT04xIHNjUk5BU2VxIEtPIGRpc3RyaWJ1dGlvbiIpICsNCiAgeGxhYigiUmVhY3Rpb24gS08gRGlzdHJpYnV0aW9uIikgKw0KICB5bGFiKCJGcmVxdWVuY3kgKGxvZy1zY2FsZSkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQojIyBDcmVhdGUgZGVuc2l0eSBtYXAgcHJvZmlsZXMgZm9yIGdseWNvbHlzaXMNCkluIE1vaGl0J3MgcGFwZXIsIHRoZXkgYXJlIGFibGUgdG8gc2hvdyB0aHJvdWdoIGRlbnNpdHkgcGxvdHMgdGhhdCB0aGVyZSBhcmUgZGVmZXJlbnRpYWxseSBhY3RpdmUgbWV0YWJvbGljIHBhdGh3YXlzLiBXaGF0IHRoaXMgZGVuc2l0eSBwbG90IHdpbGwgc2hvdyBhcmUgbWV0YWJvbGljIHJlYWN0aW9ucyBmb3IgQTU0OSBnbHljb2x5c2lzIG92ZXIgdGltZS4NCg0KRmlyc3QsIGNoYW5nZSB0aGUgcm93IHRvIG1hcCB0byB0aW1lLg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMiwgcmVzdWx0cz0naGlkZSd9DQp0aW1lID0gZGF0YS5mcmFtZShhNTQ5QG1ldGEuZGF0YSRUaW1lKQ0KdG9fdXNlID0gbmFtZXMobW5vcm1fa28pICVpbiUgYygiR0xDdDEiLCAiSEVYMSIsICJQR0kiLCAiUEZLIiwgIkZCQSIsICJHQVBEIiwgIlBHSyIsICJQR00iLCAiRU5PIiwgIlBZSyIsICJQWVJ0Mm0iLCAiUERIbSIpDQpnbHljb2x5c2lzX2tvID0gbW5vcm1fa29bLCB0b191c2VdDQptZXJnZWRfbWVhbmtvID0gY2JpbmQodGltZSwgZ2x5Y29seXNpc19rbykNCnRtcCA9IG1lbHQobWVyZ2VkX21lYW5rbywgaWQ9YygnYTU0OS5tZXRhLmRhdGEuVGltZScpKQ0KDQptaW5tYXggPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQoNCnRtcCRkZW5zaXR5ID0gbWlubWF4KHRtcCR2YWx1ZSkNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCnRtcCAlPiUNCiAgZ2dwbG90KGFlcyh4PXZhbHVlLCBjb2xvcj1hNTQ5Lm1ldGEuZGF0YS5UaW1lLCBmaWxsPWE1NDkubWV0YS5kYXRhLlRpbWUpKSArDQogIGdlb21fZGVuc2l0eShhZXMoeT0uLnNjYWxlZC4uLCBhbHBoYT0wLjQpKSArIA0KICBmYWNldF93cmFwKH52YXJpYWJsZSwgbmNvbD00KSArIA0KICBsYWJzKHg9IktPIEdyb3d0aCBTY29yZSIsIHk9IkRlbnNpdHkiKQ0KDQpgYGANCg0KYGBge3J9DQpzZXQuc2VlZCgxMjM0KQ0KZGYgPSBkYXRhLmZyYW1lKHZhbHVlID1yb3VuZChjKHJub3JtKDIwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbj0xMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkPTcpKSkpDQogIA0KIyBpbXBvcnQgbGlicmFyaWVzIGdncGxvdDINCmxpYnJhcnkoZ2dwbG90MikgIA0KICANCiMgY3JlYXRlIGRlbnNpdHkgcGxvdA0KZ2dwbG90KGRmLCBhZXMoeD12YWx1ZSkpICsgZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdCh0bXAsIGFlcyh4PXZhbHVlLCBjb2xvcj1hNTQ5Lm1ldGEuZGF0YS5UaW1lLCBmaWxsPWE1NDkubWV0YS5kYXRhLlRpbWUpKSArDQpnZW9tX2RlbnNpdHkoYWVzKHk9Li5zY2FsZWQuLiwgYWxwaGE9MC40KSkgKyANCmxhYnMoeD0iS08gR3Jvd3RoIFNjb3JlIiwgeT0iRGVuc2l0eSIpDQpgYGANCg0KIyMjIEMuIE1lcmdlIHdpdGggVU1BUCBlbWJlZGRpbmcNClRoaXMgY29tYmluZXMgdGhlIHJlYWN0aW9uIGtvIGRhdGEgd2l0aCB0aGUgVU1BUCBlbWJlZGRpbmcuDQpgYGB7cn0NCnVtYXBfZGF0YSA9IGRhdGEuZnJhbWUoYTU0OUByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzKQ0KYGBgDQoNCiMjIyMgaS4gTWVhbiBOb3JtYWxpemF0aW9uDQpgYGB7cn0NCm1lcmdlZF9tZWFua28gPSBtZXJnZSh1bWFwX2RhdGEsIG1ub3JtX2tvLCBieS54PSdyb3cubmFtZXMnLCBieS55PSdyb3cubmFtZXMnKQ0Kcm93bmFtZXMobWVyZ2VkX21lYW5rbykgPSBtZXJnZWRfbWVhbmtvJFJvdy5uYW1lcw0KbWVyZ2VkX21lYW5rbyA9IG1lcmdlZF9tZWFua29bLCAtMV0NCmBgYA0KDQojIyMjIGlpLiBaLXNjb3JlDQpgYGB7cn0NCm1lcmdlZF96a28gPSBtZXJnZSh1bWFwX2RhdGEsIHprbywgYnkueD0ncm93Lm5hbWVzJywgYnkueT0ncm93Lm5hbWVzJykNCnJvd25hbWVzKG1lcmdlZF96a28pID0gbWVyZ2VkX3prbyRSb3cubmFtZXMNCm1lcmdlZF96a28gPSBtZXJnZWRfemtvWywgLTFdDQpgYGANCg0KIyMjIEQuIFZpc3VhbGl6ZSBLTyBEYXRhDQpMZXQncyBpbnRpYWxpemUgc29tZSB2YXJpYWJsZXMgd2UgbmVlZCB0byBkZWNsYXJlIGZvciB0aGUgdmlzdWFsaXphdGlvbi4NCg0KVGhpcyBjb2RlIGJsb2NrIGRvZXMgaXQgYnkgc29ydGluZyB0aGUgcmVhY3Rpb25zIGJhc2VkIG9uIHN0YW5kYXJkIGRldmlhdGlvbi4NCmBgYHtyfQ0KY29sX3NkID0gYXBwbHkobW5vcm1fa28sIDIsIHNkLCBuYS5ybT1UUlVFKQ0Kc29ydGVkX3NkID0gc29ydChjb2xfc2QsIGluZGV4LnJldHVybj1UUlVFLCBkZWNyZWFzaW5nPVRSVUUpDQp0bXBfcnhucyA9IG1ub3JtX2tvWywgc29ydGVkX3NkJGl4XQ0KYGBgDQoNCk5vdyBtZXJnZSB3aXRoIHRoZSBVTUFQIGNvb3JkaW5hdGVzLg0KYGBge3J9DQptZXJnZWRfbWVhbmtvID0gbWVyZ2UodW1hcF9kYXRhLCB0bXBfcnhucywgYnkueD0ncm93Lm5hbWVzJywgYnkueT0ncm93Lm5hbWVzJykNCnJvd25hbWVzKG1lcmdlZF9tZWFua28pID0gbWVyZ2VkX21lYW5rbyRSb3cubmFtZXMNCm1lcmdlZF9tZWFua28gPSBtZXJnZWRfbWVhbmtvWywgLTFdDQpgYGANCg0KTGV0J3MgbG9vayBhdCB0aGUgdG9wIDEwMCBtb3N0IHZhcmllZCByZWFjdGlvbnMNCmBgYHtyfQ0KI3RtcDIgPSBtZXJnZWRfbWVhbmtvWywgOTAwOjEwMDBdDQp0bXAyID0gbWVyZ2VkX21lYW5rb1ssIDE6MTAwXQ0KdG1wMyA9IGRhdGEuZnJhbWUoY29sbmFtZXModG1wMikpDQpyZWFjdGlvbl9uYW1lcyA9IHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIHRtcDNbMzpucm93KHRtcDMpLCBdLCBdDQpyZWFjdGlvbl9uYW1lcyA9IHJlYWN0aW9uX25hbWVzJHJ4bl9uYW1lDQpgYGANCg0KT2theSwgd2UncmUgZ29pbmcgdG8gc2VsZWN0IDQgcmVhY3Rpb25zIGZyb20gdGhlIHRvcCAxMDAsIHBsdXMgZW5vbGFzZS4NCmBgYHtyfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIkZBQ09BTDIwNGkiLCAiQ1NtIiwgIkFDQ09BQ20iLCAiRU5NQU42ZyIsICJOTkFUbiIpDQpyZWFjdGlvbl9uYW1lcyA9IHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIHJlYWN0aW9uc190b192aXN1YWxpemUsIF0NCnJlYWN0aW9uX25hbWVzID0gcmVhY3Rpb25fbmFtZXMkcnhuX25hbWUNCiNyZWFjdGlvbl9uYW1lc1s0XSA9ICJFbm9sYXNlIg0KI3JlYWN0aW9uX25hbWVzWzNdID0gIk5pY290aW5hbWlkZS1udWNsZW90aWRlIGFkZW55bHlsdHJhbnNmZXJhc2UiDQpgYGANCg0KYGBge3J9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiQUtHTUFMdG0iLCAiQ1NOQVRtIiwgIkFDSVRMIiwgIkVOTUFONmciLCAiQ1NtIikNCnJlYWN0aW9uX25hbWVzID0gcnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSwgXQ0KcmVhY3Rpb25fbmFtZXMgPSByZWFjdGlvbl9uYW1lcyRyeG5fbmFtZQ0KI3JlYWN0aW9uX25hbWVzWzRdID0gIkVub2xhc2UiDQojcmVhY3Rpb25fbmFtZXNbM10gPSAiTmljb3RpbmFtaWRlLW51Y2xlb3RpZGUgYWRlbnlseWx0cmFuc2ZlcmFzZSINCmBgYA0KDQpGaW5hbGx5LCBncmFiIGdseWNvbHlzaXMgcmVhY3Rpb25zDQpgYGB7cn0NCiN0bXAgPSBGaW5kQWxsTWFya2VycyhhNTQ5LCBhc3NheT0iRkJBIikNCnJlYWN0aW9uc190b192aXN1YWxpemUgPSBjKA0KICAnRU5NQU42ZycsDQogICdGQkEnLA0KICAnR0FQRCcsDQogICdIRVgxJywNCiAgJ0xESF9MJywNCiAgJ1BESG0nLA0KICAnUEVQQ0snLA0KICAnUEVQQ0ttJywNCiAgJ1BGSycsDQogICdQR0knLA0KICAnUEdLJywNCiAgJ1BHTScsDQogICdQR01UJywNCiAgJ1BZSycsDQogICdUUEknDQopDQpyZWFjdGlvbl9uYW1lcyA9IHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIHJlYWN0aW9uc190b192aXN1YWxpemUsIF0NCnJlYWN0aW9uX25hbWVzID0gcmVhY3Rpb25fbmFtZXMkcnhuX25hbWUNCmBgYA0KDQpgYGB7cn0NCnJlYWN0aW9uX25hbWVzDQpgYGANCg0KIyMjIyBpLiBTZXQgMTogRmx1eA0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIkFEU0wxIiwgIkNZU1RTIiwgIlBFUENLbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNJVEwiLCAiQ1lTTyIsICJESEZSIikNCnJlYWN0aW9uX25hbWVzID0gYygiYWRlbnlsb3N1Y2NpbmF0ZSBseWFzZSIsIA0KICAgICAgICAgICAgICAgICAgICJjeXN0YXRoaW9uaW5lIGJldGEtc3ludGhhc2UiLCANCiAgICAgICAgICAgICAgICAgICAiUGhvc3Bob2Vub2xweXJ1dmF0ZSBjYXJib3h5a2luYXNlIChHVFApIiwNCiAgICAgICAgICAgICAgICAgICAiQVRQLUNpdHJhdGUgbHlhc2UiLA0KICAgICAgICAgICAgICAgICAgICJjeXN0ZWluZSBveGlkYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiZGloeWRyb2ZvbGF0ZSByZWR1Y3Rhc2UiKQ0KYGBgDQoNCiMjIyMgaWkuIFNldCAyOiBLTw0KYGBge3J9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiQVBBVDJybSIsICJCQUxBdG1yIiwgIk1NU0FEM20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBDbSIsICJHQVBEIiwgIkVYX2hfZSIpDQpyZWFjdGlvbl9uYW1lcyA9IGMoIjMtQW1pbm9wcm9wYW5vYXRlOjItb3hvZ2x1dGFyYXRlIGFtaW5vdHJhbnNmZXJhc2UgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAiQmV0YS1hbGFuaW5lIHJldmVyc2libGUgbWl0b2Nob25kcmlhbCB0cmFuc3BvcnQgKGRpZmZ1c2lvbikiLA0KICAgICAgICAgICAgICAgICAgICJtZXRoeWxtYWxvbmF0ZS1zZW1pYWxkZWh5ZGUgZGVoeWRyb2dlbmFzZSAobWFsb25pYyBzZW1pYWxkZWh5ZGUpLCBtaXRvY2hvbmRyaWFsIiwgDQogICAgICAgICAgICAgICAgICAgInB5cnV2YXRlIGNhcmJveHlsYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiZ2x5Y2VyYWxkZWh5ZGUtMy1waG9zcGhhdGUgZGVoeWRyb2dlbmFzZSIsDQogICAgICAgICAgICAgICAgICAgIkgrIGV4Y2hhbmdlIikNCmBgYA0KDQojIyMjIGlpaS4gU2V0IDM6IEtPDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiQUtHTUFMdG0iLCAiRU5PIiwgIkFDSVRMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU05BVHIiLCAiTURIbSIsICJMREhfTCIpDQpyZWFjdGlvbl9uYW1lcyA9IGMoIkFLRyBUcmFuc3BvcnRlciIsIA0KICAgICAgICAgICAgICAgICAgICJFbm9sYXNlIiwgDQogICAgICAgICAgICAgICAgICAgIkFUUCBDaXRyYXRlIEx5YXNlIiwNCiAgICAgICAgICAgICAgICAgICAiQ2Fybml0aW5lIG8tYWNldHlsdHJhbnNmZXJhc2UiLA0KICAgICAgICAgICAgICAgICAgICJNYWxhdGUgZGVoeWRyb2dlbmFzZSIpDQpgYGANCg0KIyMjIyBpdi4gU2V0IDQ6IEtPDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiUEdDRCIsICJQU0VSVCIsICJUUEkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBDbSIsICJHQVBEIiwgIkxESF9MIikNCnJlYWN0aW9uX25hbWVzID0gYygicGhvc3Bob2dseWNlcmF0ZSBkZWh5ZHJvZ2VuYXNlIiwgDQogICAgICAgICAgICAgICAgICAgInBob3NwaG9zZXJpbmUgdHJhbnNhbWluYXNlIiwgDQogICAgICAgICAgICAgICAgICAgInRyaW9zZSBwaG9zcGhhdGUgaXNvbWVyYXNlIiwNCiAgICAgICAgICAgICAgICAgICAicHlydXZhdGUgY2FyYm94eWxhc2UiLA0KICAgICAgICAgICAgICAgICAgICJnbHljZXJhbGRlaHlkZS0zLXBob3NwaGF0ZSBkZWh5ZHJvZ2VuYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiTGFjdGF0ZSBkZWh5ZHJvZ2VuYXNlIikNCmBgYA0KDQojIyMjIHYuIFZpc3VhbGl6ZSBtZWFuLW5vcm0gS08NCmBgYHtyfQ0KdG1wID0gbWVyZ2VkX21lYW5rb1ssIHJlYWN0aW9uc190b192aXN1YWxpemVdDQp0bXBbaXMubmEodG1wKV0gPSAtMQ0KDQp0bXAyID0gdG1wDQp0bXAyW3RtcCA+IDAuM10gPSAiRW5oYW5jaW5nIg0KdG1wMlt0bXAgPiAwICYgdG1wIDwgMC4zXSA9ICJNaWxkeSBlbmhhbmNpbmciDQp0bXAyW3RtcCA8IDBdID0gIlNlbnNpdGl2ZSINCg0KdG1wMltpcy5uYSh0bXApXSA9IDANCnRtcDJbdG1wID09IDBdID0gIk5vdCBTZW5zaXRpdmUiDQoNCnRtcDMgPSByeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKSwgXQ0KYGBgDQoNCmBgYHtyfQ0KcCA9IGxpc3QoKQ0KcFtbMV1dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCAxXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJCLiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbMV0sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTZW5zaXRpdmUiPSJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBTZW5zaXRpdmUiPSJncmF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbGRseSBlbmhhbmNpbmciPSIjNkQ2QTZBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2luZyI9ImJsYWNrIikpICsgDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibGFjaycsIG5hLnZhbHVlPSdncmF5JywgbGltaXRzPWMobWluKHRtcCksIDEpLCBtaWRwb2ludD0wKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRhZz1lbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgIA0KICAgICAgICAgICAgICAgIA0KDQpwW1syXV0gPSBnZ3Bsb3QobWVyZ2VkX21lYW5rbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wMlssIDNdKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0YWc9IkMuIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXRvVGl0bGVDYXNlKGFzLmNoYXJhY3RlcihyeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKVszXSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyAgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTZW5zaXRpdmUiPSJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBTZW5zaXRpdmUiPSJncmF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbGRseSBlbmhhbmNpbmciPSIjNkQ2QTZBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2luZyI9ImJsYWNrIikpICsgDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmxhY2snLCBuYS52YWx1ZT0nZ3JheScsIGxpbWl0cz1jKG1pbih0bXApLCAxKSwgbWlkcG9pbnQ9MCkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQpwW1szXV0gPSBnZ3Bsb3QobWVyZ2VkX21lYW5rbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wMlssIDRdKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0YWc9IkQuIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXRvVGl0bGVDYXNlKGFzLmNoYXJhY3RlcihyeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKVs0XSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSAgDQoNCnBbWzRdXSA9IGdncGxvdChtZXJnZWRfbWVhbmtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXAyWywgN10pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iRS4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzddLCAncnhuX25hbWUnXSkpLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJHcm93dGggY2xhc3NpZmljYXRpb24iKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmxhY2snLCBuYS52YWx1ZT0nZ3JheScsIGxpbWl0cz1jKG1pbih0bXApLCAxKSwgbWlkcG9pbnQ9MCkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQpwW1s1XV0gPSBnZ3Bsb3QobWVyZ2VkX21lYW5rbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wMlssIDEyXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJGLiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbMTJdLCAncnhuX25hbWUnXSkpLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJHcm93dGggY2xhc3NpZmljYXRpb24iKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmxhY2snLCBuYS52YWx1ZT0nZ3JheScsIGxpbWl0cz1jKG1pbih0bXApLCAxKSwgbWlkcG9pbnQ9MCkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQpgYGANCg0KDQpDcmVhdGUgYW5kIHZpc3VhbGl6ZSB0aGUgZmluYWwgVU1BUCBmbHV4IHBsb3Qgb2JqZWN0Lg0KYGBge3IsIGZpZy53aWR0aD0yNCwgZmlnLmhlaWdodD0xMiwgcmVzdWx0cz0naGlkZSd9DQpwQyA9IHNjYXRlcjo6bXVsdGlwbG90KHBCLCAgICAgcFtbMV1dLCBwW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICBwW1s0XV0sIHBbWzNdXSwgcFtbNV1dLCBjb2xzPTMpDQpwQw0KYGBgDQoNCk5vdywgbGV0J3MgdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb25zIG9mIGtub2Nrb3V0cw0KYGBge3J9DQp0bXAyJHRpbWUgPSBhNTQ5JFRpbWUNCm5ld190bXAyID0gcmVzaGFwZTI6Om1lbHQodG1wMiwgaWQ9InRpbWUiKQ0KbmV3X3RtcDIgPSBuZXdfdG1wMltvcmRlcihuZXdfdG1wMiR0aW1lKSxdDQpnZ3Bsb3QoKSArIA0KZ2VvbV9iYXIobmV3X3RtcDIsIA0KICAgICAgICAgbWFwcGluZz1hZXMoZmlsbD1hcy5mYWN0b3IodmFsdWUpLCANCiAgICAgICAgICAgICAgICAgICAgIHg9dmFyaWFibGUsIHk9YXMuZmFjdG9yKHRpbWUpKSwgDQogICAgICAgICBzdGF0PSdpZGVudGl0eScsIHBvc2l0aW9uPSdzdGFjaycpDQpgYGANCg0KIyMjIyB2LiBWaXN1YWxpemUgWi1zY29yZSBLTw0KYGBge3J9DQp0bXAgPSBtZXJnZWRfemtvWywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZV0NCnRtcFtpcy5uYSh0bXApXSA9IDANCmBgYA0KDQpgYGB7cn0NCnAgPSBsaXN0KCkNCg0KcFtbMV1dID0gZ2dwbG90KG1lcmdlZF96a28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbMV1dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1sxXSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZCA9ICdncmF5JywgaGlnaD0nYmxhY2snKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KICAgICAgICAgICAgICAgIA0KDQpwW1syXV0gPSBnZ3Bsb3QobWVyZ2VkX3prbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wWywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZVsyXV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXJlYWN0aW9uX25hbWVzWzJdLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJGbHV4IikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkID0gJ2dyYXknLCBoaWdoPSdibGFjaycpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkNCg0KcFtbM11dID0gZ2dwbG90KG1lcmdlZF96a28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbM11dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1szXSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZCA9ICdncmF5JywgaGlnaD0nYmxhY2snKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQpwW1s0XV0gPSBnZ3Bsb3QobWVyZ2VkX3prbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wWywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZVs0XV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXJlYWN0aW9uX25hbWVzWzRdLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJGbHV4IikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkID0gJ2dyYXknLCBoaWdoPSdibGFjaycpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCnBbWzVdXSA9IGdncGxvdChtZXJnZWRfemtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzVdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbNV0sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQgPSAnZ3JheScsIGhpZ2g9J2JsYWNrJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSANCg0KYGBgDQoNCg0KQ3JlYXRlIGFuZCB2aXN1YWxpemUgdGhlIGZpbmFsIFVNQVAgZmx1eCBwbG90IG9iamVjdC4NCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTIsIHJlc3VsdHM9J2hpZGUnfQ0KcEMgPSBzY2F0ZXI6Om11bHRpcGxvdChwQiwgcFtbMV1dLCBwW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICBwW1s0XV0sIHBbWzNdXSwgcFtbNV1dLCBjb2xzPTMpDQpwQw0KYGBgDQoNCiMjIDQuIFNhdmUgdGhlIGRhdGENCkZpcnN0LCB3ZSBuZWVkIHRvIGZvcm1hdCB0aGUgZGF0YSwgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSBER0UgTWF0cml4LCB3aGVyZSByb3dzIGFyZSByZWFjdGlvbnMgYW5kIGNvbHVtbnMgYXJlIGNlbGwgSURzLg0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KZmJhID0gZmx1eF9kYXRhDQoNCiMgUmVmb3JtYXQNCmZiYSA9IHQoZmJhKQ0KZmJhID0gYXMuc3BhcnNlKGZiYSkNCmBgYA0KDQpOb3cgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGV4cHJlc3Npb24gbWF0cml4IGhhcyB0aGUgc2FtZSBjZWxscyBhcyB0aGUgZmJhIG1hdHJpeCwgYW5kIGFsc28gZW5zdXJlIHRoZSBgYWN0aXZlLmlkZW50YCBhbmQgdGhlIGBUaW1lYCBkYXRhcG9pbnRzIHdlJ2xsIG1hcCB0by4NCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCiMgR2V0IG5hbWVzIGFuZCBpbmRpY2VzDQppbnRlcnNlY3RfY2VsbHMgPSBpbnRlcnNlY3QoY29sbmFtZXMoYTU0OUBhc3NheXMkUk5BQGNvdW50cyksIGNvbG5hbWVzKGZiYSkpDQpjZWxsX2lkeCA9IHdoaWNoKGNvbG5hbWVzKGE1NDlAYXNzYXlzJFJOQUBjb3VudHMpICVpbiUgaW50ZXJzZWN0X2NlbGxzKQ0KDQojIFJlZm9ybWF0IGRhdGENCmE1NDlfc3Vic2V0ID0gc3Vic2V0KGE1NDksIGNlbGxzPWludGVyc2VjdF9jZWxscykNCmZiYSA9IGZiYVssIGludGVyc2VjdF9jZWxsc10NCg0KYTU0OV9zdWJzZXRbWyJGQkEiXV0gPSBDcmVhdGVBc3NheU9iamVjdChjb3VudHM9ZmJhKQ0Kc2F2ZVJEUyhhNTQ5X3N1YnNldCwgZmlsZSA9ICJEOi9DaGFuZHJhc2VrYXJhbi9Qcm9qZWN0cy9FTVQvRGF0YS9zY1JOQVNlcS9hNTQ5X3F1YW50aWxlLnJkcyIpDQoNCmBgYA0KDQpMZXQncyBjcmVhdGUgYSBwcmVwcm9jZXNzaW5nIHBpcGVsaW5lIGZvciBkb3duc3RyZWFtIGFuYWx5c2VzDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpwcmVwcm9jZXNzX2ZsdXggPSBmdW5jdGlvbihnZW5lX29iaiwgYXNzYXkpew0KICAjIExvZyBub3JtYWxpemUgZGF0YQ0KICBnZW5lX29iaiA9IE5vcm1hbGl6ZURhdGEoZ2VuZV9vYmosIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXk9YXNzYXksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemF0aW9uLm1ldGhvZD0nTG9nTm9ybWFsaXplJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS5mYWN0b3I9MTAwMDApDQogIA0KICAjIFNjYWxlIGRhdGENCiAgZ2VuZV9vYmogPSBTY2FsZURhdGEoZ2VuZV9vYmosIA0KICAgICAgICAgICAgICAgICAgICAgICBhc3NheT1hc3NheSkNCiAgcmV0dXJuKGdlbmVfb2JqKQ0KfQ0KYGBgDQoNCk5vdyBsZXQncyBwZXJmb3JtIHRoZSBkYXRhIHByZXByb2Nlc3NpbmcNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCiNhNTQ5X3N1YnNldCA9IHByZXByb2Nlc3NfZmx1eChhNTQ5X3N1YnNldCwgYXNzYXk9IkZCQSIpDQpgYGANCg0KIyMgNS4gR2V0IE1ldGFib2xpYyBNYXJrZXJzDQpXZSdsbCBnZXQgbWV0YWJvbGljIG1hcmtlcnMgYmFzZWQgb24gc3VicG9wdWxhdGlvbnMuIFRoaXMgbW9kdWxlIGRpZCBub3QgeWllbGQgYW55IHJlc3VsdA0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KYTU0OV9zdWJzZXRAYWN0aXZlLmlkZW50ID0gYXMuZmFjdG9yKGE1NDlfc3Vic2V0QG1ldGEuZGF0YSRUaW1lKQ0Kc3VicG9wX3JlYWN0aW9ucyA9IEZpbmRBbGxNYXJrZXJzKGE1NDlfc3Vic2V0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5PSJGQkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLnBjdD0wLjI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ZjLnRocmVzaG9sZD0wLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudXNlPSJNQVNUIikNCiN3cml0ZS50YWJsZShzdWJwb3BfcmVhY3Rpb25zLCAiY2xpcGJvYXJkIiwgc2VwPSJcdCIpDQpgYGANCg0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KI3Zhcl9mZWF0cyA9IEZpbmRWYXJpYWJsZUZlYXR1cmVzKG9iamVjdD1hNTQ5X3N1YnNldCkNCkRvSGVhdG1hcChvYmplY3Q9YTU0OV9zdWJzZXQsDQogICAgICAgICAgYXNzYXk9IkZCQSIsDQogICAgICAgICAgc2xvdD0nY291bnRzJywNCiAgICAgICAgICBsYWJlbD1GQUxTRSwNCiAgICAgICAgICBkcmF3LmxpbmVzPVRSVUUsDQogICAgICAgICAgbGluZXMud2lkdGg9MTAsDQogICAgICAgICAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSdzYW5zJywgc2l6ZT0xNiksDQogICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpLA0KICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMCksDQogICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIwKSwNCiAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xNiksDQogICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MTYpLA0KICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yMCkpKQ0KYGBgDQoNCiMjIDYuIE92ZXJsYXkgbWV0YWJvbGljIGZsdXhlcyANCk5vdyBsZXQncyByZXBlYXQgZm9yIG1ldGFib2xpYyBmbHV4ZXMuDQoNCiMjIyBBLiBMb2FkIHVwIGFuZCBtYXAgdGhlIGZsdXggZGF0YQ0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KZmx1eF9wYXRoID0gJ0Q6L0NoYW5kcmFzZWthcmFuL1Byb2plY3RzL0VNVC9BbmFseXNpcy9pOTkvZmx1eF9pOTkuY3N2Jw0KZmx1eF9kYXRhID0gcmVhZHI6OnJlYWRfY3N2KGZsdXhfcGF0aCkNCg0KYTU0OV9pZF9tYXAgPSByZWFkX2NzdigiRDovQ2hhbmRyYXNla2FyYW4vUHJvamVjdHMvRU1UL0FuYWx5c2lzL2RhdGEvYTU0OV9jb2xtYXAuY3N2IikNCg0KY29sX25hbWVzID0gY29sbmFtZXMoZmx1eF9kYXRhWywgNDpuY29sKGZsdXhfZGF0YSldKQ0KY29sX25hbWVzID0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoY29sX25hbWVzLCAnX1teX10rJCcsICcnKQ0KY29sX25hbWVzID0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoY29sX25hbWVzLCAneCcsICcnKQ0KDQpyeG5tYXAgPSBmbHV4X2RhdGFbMTozXQ0KZmx1eF9kYXRhWzE6M10gPSBOVUxMDQoNCmZsdXhfZGF0YSA9IHQoZmx1eF9kYXRhKQ0KZmx1eF9kYXRhID0gYXMuZGF0YS5mcmFtZShmbHV4X2RhdGEpDQoNCnJvd25hbWVzKGZsdXhfZGF0YSkgPSBhNTQ5X2lkX21hcCRvcmlnX2lkDQpjb2xuYW1lcyhmbHV4X2RhdGEpID0gcnhubWFwJHJ4bl9pZHMNCg0KZmx1eF9kYXRhID0gYWJzKGZsdXhfZGF0YSkNCmBgYA0KDQojIyMgQi4gRGF0YSBUcmFuc2Zvcm1hdGlvbnMNCiMjIyMgaS4gTWluLW1heCBzY2FsZQ0KRmlyc3QsIGxldCdzIHBlcmZvcm0gYSBtZWFuIG5vcm1hbGl6YXRpb24uIFdlJ2xsIHNwZWNpZmljYWxseSBzdWJ0cmFjdCB0aGUgbWVhbiBLTyBhY3Jvc3MgYWxsIGNlbGxzIGZvciBhIGdpdmVuIHJlYWN0aW9uLiBBbHNvIGlnbm9yZSBOQS4NCmBgYHtyfQ0KI3htaW4gPSBhcHBseShmbHV4X2RhdGEsIDIsIEZVTj1taW4sIG5hLnJtID0gVFJVRSkNCiN4bWF4ID0gYXBwbHkoZmx1eF9kYXRhLCAyLCBGVU49bWF4LCBuYS5ybSA9IFRSVUUpDQoNCnhtaW4gPSBtaW4oZmx1eF9kYXRhLCBuYS5ybSA9IFRSVUUpDQp4bWF4ID0gbWF4KGZsdXhfZGF0YSwgbmEucm0gPSBUUlVFKQ0KbW5vcm1fZmx1eCA9IChmbHV4X2RhdGEgLSB4bWluKSAvICh4bWF4IC0geG1pbikNCmBgYA0KDQpMZXQncyB2aXN1YWxpemUgdGhlIG1lYW4tbm9ybWFsaXplZCBkaXN0cmlidXRpb24uDQpgYGB7cn0NCmxpYnJhcnkocmVzaGFwZTIpDQp0bXAgPSBtZWx0KG1ub3JtX2ZsdXgpDQoNCmdncGxvdCh0bXAsIGFlcyh4PXZhbHVlKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz0xMDApICsgDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArDQogIGdndGl0bGUoIlJFQ09OMSBzY1JOQVNlcSBGbHV4IGRpc3RyaWJ1dGlvbiIpICsNCiAgeGxhYigiUmVhY3Rpb24gRmx1eCBEaXN0cmlidXRpb24iKSArDQogIHlsYWIoIkZyZXF1ZW5jeSAobG9nLXNjYWxlKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMjIyBpaS4gWi1zY29yZSBUcmFuc2Zvcm1hdGlvbg0KDQpBbHRlcm5hdGl2ZWx5LCBsZXQncyBzZWUgdGhlIGltcGFjdCBvZiBhIFotc2NvcmUgdHJhbnNmb3JtYXRpb24uDQpgYGB7cn0NCnRtcCA9IGFicyhtbm9ybV9mbHV4KQ0KemZsdXggPSAodG1wIC0gY29sTWVhbnModG1wLCBuYS5ybT1UUlVFKSkgLyBhcHBseSh0bXAsIDIsIHNkLCBuYS5ybT1UUlVFKQ0KYGBgDQoNCkxldCdzIHZpc3VhbGl6ZSB0aGUgWi1zY29yZSBkaXN0aXJidXRpb24uDQpgYGB7cn0NCmxpYnJhcnkocmVzaGFwZTIpDQp0bXAgPSBtZWx0KHpmbHV4KQ0KZ2dwbG90KHRtcCwgYWVzKHg9dmFsdWUpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwMCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cxMCcpICsNCiAgZ2d0aXRsZSgiUkVDT04xIHNjUk5BU2VxIEtPIGRpc3RyaWJ1dGlvbiIpICsNCiAgeGxhYigiUmVhY3Rpb24gS08gRGlzdHJpYnV0aW9uIikgKw0KICB5bGFiKCJGcmVxdWVuY3kgKGxvZy1zY2FsZSkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIENyZWF0ZSBkZW5zaXR5IG1hcCBwcm9maWxlcyBmb3IgZ2x5Y29seXNpcw0KSW4gTW9oaXQncyBwYXBlciwgdGhleSBhcmUgYWJsZSB0byBzaG93IHRocm91Z2ggZGVuc2l0eSBwbG90cyB0aGF0IHRoZXJlIGFyZSBkZWZlcmVudGlhbGx5IGFjdGl2ZSBtZXRhYm9saWMgcGF0aHdheXMuIFdoYXQgdGhpcyBkZW5zaXR5IHBsb3Qgd2lsbCBzaG93IGFyZSBtZXRhYm9saWMgcmVhY3Rpb25zIGZvciBBNTQ5IGdseWNvbHlzaXMgb3ZlciB0aW1lLg0KDQpGaXJzdCwgY2hhbmdlIHRoZSByb3cgdG8gbWFwIHRvIHRpbWUuDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCByZXN1bHRzPSdoaWRlJ30NCnRpbWUgPSBkYXRhLmZyYW1lKGE1NDlAbWV0YS5kYXRhJFRpbWUpDQp0b191c2UgPSBuYW1lcyhtbm9ybV9mbHV4KSAlaW4lIGMoIkdMQ3QxIiwgIkhFWDEiLCAiUEdJIiwgIlBGSyIsICJGQkEiLCAiR0FQRCIsICJQR0siLCAiUEdNIiwgIkVOTyIsICJQWUsiLCAiUFlSdDJtIiwgIlBESG0iKQ0KZ2x5Y29seXNpc19rbyA9IG1ub3JtX2ZsdXhbLCB0b191c2VdDQptZXJnZWRfbWVhbmtvID0gY2JpbmQodGltZSwgZ2x5Y29seXNpc19rbykNCnRtcCA9IG1lbHQobWVyZ2VkX21lYW5rbywgaWQ9YygnYTU0OS5tZXRhLmRhdGEuVGltZScpKQ0KdG1wMiA9IHRtcFt0bXAkdmFyaWFibGUgPT0gIkVOTyIsIF0NCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCnRtcCAlPiUNCiAgZ2dwbG90KGFlcyh4PXZhbHVlLCBjb2xvcj1hNTQ5Lm1ldGEuZGF0YS5UaW1lLCBmaWxsPWE1NDkubWV0YS5kYXRhLlRpbWUpKSArDQogIGdlb21fZGVuc2l0eShhZXMoeT0uLnNjYWxlZC4uLCBhbHBoYT0wLjQpKSArIA0KICBmYWNldF93cmFwKH52YXJpYWJsZSwgbmNvbD00KSArIA0KICBsYWJzKHg9IkdseWNvbHlzaXMgZmx1eCBwcm9maWxlIChpbmRpdmlkdWFsIHJlYWN0aW9ucykiLCB5PSJEZW5zaXR5IikNCg0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KHRtcCwgYWVzKHg9dmFsdWUsIGNvbG9yPWE1NDkubWV0YS5kYXRhLlRpbWUsIGZpbGw9YTU0OS5tZXRhLmRhdGEuVGltZSkpICsNCmdlb21fZGVuc2l0eShhZXMoeT0uLnNjYWxlZC4uLCBhbHBoYT0wLjQpKSArIA0KbGFicyh4PSJHbHljb2x5c2lzIGZsdXggcHJvZmlsZSAoYWxsKSIsIHk9IkRlbnNpdHkiKQ0KYGBgDQoNCiMjIyBDLiBNZXJnZSB3aXRoIFVNQVAgZW1iZWRkaW5nDQpUaGlzIGNvbWJpbmVzIHRoZSByZWFjdGlvbiBrbyBkYXRhIHdpdGggdGhlIFVNQVAgZW1iZWRkaW5nLg0KYGBge3J9DQp1bWFwX2RhdGEgPSBkYXRhLmZyYW1lKGE1NDlAcmVkdWN0aW9ucyR1bWFwQGNlbGwuZW1iZWRkaW5ncykNCmBgYA0KDQojIyMjIGkuIE1lYW4gTm9ybWFsaXphdGlvbg0KYGBge3J9DQptZXJnZWRfbWVhbmZsdXggPSBtZXJnZSh1bWFwX2RhdGEsIG1ub3JtX2ZsdXgsIGJ5Lng9J3Jvdy5uYW1lcycsIGJ5Lnk9J3Jvdy5uYW1lcycpDQpyb3duYW1lcyhtZXJnZWRfbWVhbmZsdXgpID0gbWVyZ2VkX21lYW5mbHV4JFJvdy5uYW1lcw0KbWVyZ2VkX21lYW5mbHV4ID0gbWVyZ2VkX21lYW5mbHV4WywgLTFdDQpgYGANCg0KIyMjIyBpaS4gWi1zY29yZQ0KYGBge3J9DQptZXJnZWRfemZsdXggPSBtZXJnZSh1bWFwX2RhdGEsIHpmbHV4LCBieS54PSdyb3cubmFtZXMnLCBieS55PSdyb3cubmFtZXMnKQ0Kcm93bmFtZXMobWVyZ2VkX3pmbHV4KSA9IG1lcmdlZF96Zmx1eCRSb3cubmFtZXMNCm1lcmdlZF96Zmx1eCA9IG1lcmdlZF96Zmx1eFssIC0xXQ0KYGBgDQoNCiMjIyBELiBWaXN1YWxpemUgS08gRGF0YQ0KTGV0J3MgaW50aWFsaXplIHNvbWUgdmFyaWFibGVzIHdlIG5lZWQgdG8gZGVjbGFyZSBmb3IgdGhlIHZpc3VhbGl6YXRpb24NCg0KIyMjIyBpLiBTZXQgMTogRmx1eA0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZSA9IGMoIkFEU0wxIiwgIkNZU1RTIiwgIlBFUENLbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNJVEwiLCAiQ1lTTyIsICJESEZSIikNCnJlYWN0aW9uX25hbWVzID0gYygiYWRlbnlsb3N1Y2NpbmF0ZSBseWFzZSIsIA0KICAgICAgICAgICAgICAgICAgICJjeXN0YXRoaW9uaW5lIGJldGEtc3ludGhhc2UiLCANCiAgICAgICAgICAgICAgICAgICAiUGhvc3Bob2Vub2xweXJ1dmF0ZSBjYXJib3h5a2luYXNlIChHVFApIiwNCiAgICAgICAgICAgICAgICAgICAiQVRQLUNpdHJhdGUgbHlhc2UiLA0KICAgICAgICAgICAgICAgICAgICJjeXN0ZWluZSBveGlkYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiZGloeWRyb2ZvbGF0ZSByZWR1Y3Rhc2UiKQ0KYGBgDQoNCiMjIyMgaWkuIFNldCAyOiBLTw0KYGBge3J9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiQVBBVDJybSIsICJCQUxBdG1yIiwgIk1NU0FEM20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBDbSIsICJHQVBEIiwgIkVYX2hfZSIpDQpyZWFjdGlvbl9uYW1lcyA9IGMoIjMtQW1pbm9wcm9wYW5vYXRlOjItb3hvZ2x1dGFyYXRlIGFtaW5vdHJhbnNmZXJhc2UgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAiQmV0YS1hbGFuaW5lIHJldmVyc2libGUgbWl0b2Nob25kcmlhbCB0cmFuc3BvcnQgKGRpZmZ1c2lvbikiLA0KICAgICAgICAgICAgICAgICAgICJtZXRoeWxtYWxvbmF0ZS1zZW1pYWxkZWh5ZGUgZGVoeWRyb2dlbmFzZSAobWFsb25pYyBzZW1pYWxkZWh5ZGUpLCBtaXRvY2hvbmRyaWFsIiwgDQogICAgICAgICAgICAgICAgICAgInB5cnV2YXRlIGNhcmJveHlsYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiZ2x5Y2VyYWxkZWh5ZGUtMy1waG9zcGhhdGUgZGVoeWRyb2dlbmFzZSIsDQogICAgICAgICAgICAgICAgICAgIkgrIGV4Y2hhbmdlIikNCmBgYA0KDQojIyMjIGlpaS4gU2V0IDM6IEtPDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiQUtHTUFMdG0iLCAiRU5PIiwgIkFDSVRMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU05BVHIiLCAiTURIbSIsICJMREhfTCIpDQpyZWFjdGlvbl9uYW1lcyA9IGMoIkFLRyBUcmFuc3BvcnRlciIsIA0KICAgICAgICAgICAgICAgICAgICJFbm9sYXNlIiwgDQogICAgICAgICAgICAgICAgICAgIkFUUCBDaXRyYXRlIEx5YXNlIiwNCiAgICAgICAgICAgICAgICAgICAiQ2Fybml0aW5lIG8tYWNldHlsdHJhbnNmZXJhc2UiLA0KICAgICAgICAgICAgICAgICAgICJNYWxhdGUgZGVoeWRyb2dlbmFzZSIpDQpgYGANCg0KIyMjIyBpdi4gU2V0IDQ6IEtPDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpyZWFjdGlvbnNfdG9fdmlzdWFsaXplID0gYygiUEdDRCIsICJQU0VSVCIsICJUUEkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBDbSIsICJHQVBEIiwgIkxESF9MIikNCnJlYWN0aW9uX25hbWVzID0gYygicGhvc3Bob2dseWNlcmF0ZSBkZWh5ZHJvZ2VuYXNlIiwgDQogICAgICAgICAgICAgICAgICAgInBob3NwaG9zZXJpbmUgdHJhbnNhbWluYXNlIiwgDQogICAgICAgICAgICAgICAgICAgInRyaW9zZSBwaG9zcGhhdGUgaXNvbWVyYXNlIiwNCiAgICAgICAgICAgICAgICAgICAicHlydXZhdGUgY2FyYm94eWxhc2UiLA0KICAgICAgICAgICAgICAgICAgICJnbHljZXJhbGRlaHlkZS0zLXBob3NwaGF0ZSBkZWh5ZHJvZ2VuYXNlIiwNCiAgICAgICAgICAgICAgICAgICAiTGFjdGF0ZSBkZWh5ZHJvZ2VuYXNlIikNCmBgYA0KDQojIyMjIHYuIFZpc3VhbGl6ZSBtZWFuLW5vcm0gS08NCmBgYHtyfQ0KdG1wID0gbWVyZ2VkX21lYW5mbHV4WywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZV0NCnRtcFtpcy5uYSh0bXApXSA9IDANCmBgYA0KDQpgYGB7cn0NCnRtcCA9IG1lcmdlZF9tZWFua29bLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplXQ0KdG1wW2lzLm5hKHRtcCldID0gLTENCg0KdG1wMyA9IHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpLCBdDQpgYGANCg0KYGBge3J9DQpwW1sxXV0gPSBnZ3Bsb3QobWVyZ2VkX21lYW5rbywgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wMlssIDFdKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0YWc9IkIuIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXRvVGl0bGVDYXNlKGFzLmNoYXJhY3RlcihyeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKVsxXSwgJ3J4bl9uYW1lJ10pKSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iR3Jvd3RoIGNsYXNzaWZpY2F0aW9uIikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsYWNrJywgbmEudmFsdWU9J2dyYXknLCBsaW1pdHM9YyhtaW4odG1wKSwgMSksIG1pZHBvaW50PTApICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGFnPWVsZW1lbnRfdGV4dChzaXplPTI2LCBmYWNlPSJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMTUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKSAgDQogICAgICAgICAgICAgICAgDQoNCnBbWzJdXSA9IGdncGxvdChtZXJnZWRfbWVhbmtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXAyWywgM10pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iQy4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzNdLCAncnhuX25hbWUnXSkpLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJHcm93dGggY2xhc3NpZmljYXRpb24iKSArICANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNlbnNpdGl2ZSI9InJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFNlbnNpdGl2ZSI9ImdyYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlsZGx5IGVuaGFuY2luZyI9IiM2RDZBNkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5oYW5jaW5nIj0iYmxhY2siKSkgKyANCiAgICAgICAgICAgICAgICAjc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9InJlZCIsIG1pZD0nI0YwNzQ3MCcsIGhpZ2g9J2JsDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibGFjaycsIG5hLnZhbHVlPSdncmF5JywgbGltaXRzPWMobWluKHRtcCksIDEpLCBtaWRwb2ludD0wKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRhZz1lbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCnBbWzNdXSA9IGdncGxvdChtZXJnZWRfbWVhbmtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXAyWywgNF0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRhZz0iRC4iLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9dG9UaXRsZUNhc2UoYXMuY2hhcmFjdGVyKHJ4bm1hcFtyeG5tYXAkcnhuX2lkcyAlaW4lIGNvbG5hbWVzKHRtcDIpWzRdLCAncnhuX25hbWUnXSkpLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJHcm93dGggY2xhc3NpZmljYXRpb24iKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiU2Vuc2l0aXZlIj0icmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgU2Vuc2l0aXZlIj0iZ3JheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWxkbHkgZW5oYW5jaW5nIj0iIzZENkE2QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmhhbmNpbmciPSJibGFjayIpKSArIA0KICAgICAgICAgICAgICAgICNzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0icmVkIiwgbWlkPScjRjA3NDcwJywgaGlnaD0nYmxhY2snLCBuYS52YWx1ZT0nZ3JheScsIGxpbWl0cz1jKG1pbih0bXApLCAxKSwgbWlkcG9pbnQ9MCkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50YWc9ZWxlbWVudF90ZXh0KHNpemU9MjYsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4xNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpICANCg0KcFtbNF1dID0gZ2dwbG90KG1lcmdlZF9tZWFua28sIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcDJbLCA3XSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGFnPSJFLiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT10b1RpdGxlQ2FzZShhcy5jaGFyYWN0ZXIocnhubWFwW3J4bm1hcCRyeG5faWRzICVpbiUgY29sbmFtZXModG1wMilbN10sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTZW5zaXRpdmUiPSJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBTZW5zaXRpdmUiPSJncmF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbGRseSBlbmhhbmNpbmciPSIjNkQ2QTZBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2luZyI9ImJsYWNrIikpICsgDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibGFjaycsIG5hLnZhbHVlPSdncmF5JywgbGltaXRzPWMobWluKHRtcCksIDEpLCBtaWRwb2ludD0wKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRhZz1lbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCnBbWzVdXSA9IGdncGxvdChtZXJnZWRfbWVhbmtvLCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXAyWywgMTJdKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0YWc9IkYuIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXRvVGl0bGVDYXNlKGFzLmNoYXJhY3RlcihyeG5tYXBbcnhubWFwJHJ4bl9pZHMgJWluJSBjb2xuYW1lcyh0bXAyKVsxMl0sICdyeG5fbmFtZSddKSksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9Ikdyb3d0aCBjbGFzc2lmaWNhdGlvbiIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTZW5zaXRpdmUiPSJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBTZW5zaXRpdmUiPSJncmF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbGRseSBlbmhhbmNpbmciPSIjNkQ2QTZBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2luZyI9ImJsYWNrIikpICsgDQogICAgICAgICAgICAgICAgI3NjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJyZWQiLCBtaWQ9JyNGMDc0NzAnLCBoaWdoPSdibGFjaycsIG5hLnZhbHVlPSdncmF5JywgbGltaXRzPWMobWluKHRtcCksIDEpLCBtaWRwb2ludD0wKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRhZz1lbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCmBgYA0KDQoNCkNyZWF0ZSBhbmQgdmlzdWFsaXplIHRoZSBmaW5hbCBVTUFQIGZsdXggcGxvdCBvYmplY3QuDQpgYGB7ciwgZmlnLndpZHRoPTI0LCBmaWcuaGVpZ2h0PTEyLCByZXN1bHRzPSdoaWRlJ30NCnBDID0gc2NhdGVyOjptdWx0aXBsb3QocEIsIHBbWzFdXSwgcFtbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgcFtbNF1dLCBwW1szXV0sIHBbWzVdXSwgY29scz0zKQ0KcEMNCmBgYA0KDQojIyMjIHYuIFZpc3VhbGl6ZSBaLXNjb3JlIEtPDQpgYGB7cn0NCnRtcCA9IG1lcmdlZF96Zmx1eFssIHJlYWN0aW9uc190b192aXN1YWxpemVdDQp0bXBbaXMubmEodG1wKV0gPSAwDQpgYGANCg0KYGBge3J9DQpwID0gbGlzdCgpDQpwW1sxXV0gPSBnZ3Bsb3QobWVyZ2VkX3pmbHV4LCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzFdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbMV0sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibGFjayIsIG1pZCA9ICd3aGl0ZScsIGhpZ2g9J3JlZCcpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQogICAgICAgICAgICAgICAgDQoNCnBbWzJdXSA9IGdncGxvdChtZXJnZWRfemZsdXgsIGFlcyh4PVVNQVBfMSwgeT1VTUFQXzIsIGNvbG9yPXRtcFssIHJlYWN0aW9uc190b192aXN1YWxpemVbMl1dKSkgKyANCiAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemU9NSkgKw0KICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgICAgICAgICAgICAgbGFicyh4PSJVTUFQIDEiLCANCiAgICAgICAgICAgICAgICAgICAgIHk9IlVNQVAgMiIsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZT1yZWFjdGlvbl9uYW1lc1syXSwgDQogICAgICAgICAgICAgICAgICAgICBjb2xvcj0iRmx1eCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsYWNrIiwgbWlkID0gJ3doaXRlJywgaGlnaD0ncmVkJykgKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuMTUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3g9InZlcnRpY2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0ic2FucyIpKQ0KDQpwW1szXV0gPSBnZ3Bsb3QobWVyZ2VkX3pmbHV4LCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzNdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbM10sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibGFjayIsIG1pZCA9ICd3aGl0ZScsIGhpZ2g9J3JlZCcpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkNCg0KcFtbNF1dID0gZ2dwbG90KG1lcmdlZF96Zmx1eCwgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3I9dG1wWywgcmVhY3Rpb25zX3RvX3Zpc3VhbGl6ZVs0XV0pKSArIA0KICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZT01KSArDQogICAgICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgICAgICBsYWJzKHg9IlVNQVAgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgeT0iVU1BUCAyIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXJlYWN0aW9uX25hbWVzWzRdLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJGbHV4IikgKyANCiAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmxhY2siLCBtaWQgPSAnd2hpdGUnLCBoaWdoPSdyZWQnKSArDQogICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC4xNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveD0idmVydGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJzYW5zIikpIA0KDQpwW1s1XV0gPSBnZ3Bsb3QobWVyZ2VkX3pmbHV4LCBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvcj10bXBbLCByZWFjdGlvbnNfdG9fdmlzdWFsaXplWzVdXSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludChzaXplPTUpICsNCiAgICAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgICAgIGxhYnMoeD0iVU1BUCAxIiwgDQogICAgICAgICAgICAgICAgICAgICB5PSJVTUFQIDIiLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGU9cmVhY3Rpb25fbmFtZXNbNV0sIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3I9IkZsdXgiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibGFjayIsIG1pZCA9ICd3aGl0ZScsIGhpZ2g9J3JlZCcpICsNCiAgICAgICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjE1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94PSJ2ZXJ0aWNhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbj1tYXJnaW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNhbnMiKSkgDQoNCmBgYA0KDQoNCkNyZWF0ZSBhbmQgdmlzdWFsaXplIHRoZSBmaW5hbCBVTUFQIGZsdXggcGxvdCBvYmplY3QuDQpgYGB7ciwgZmlnLndpZHRoPTI0LCBmaWcuaGVpZ2h0PTEyLCByZXN1bHRzPSdoaWRlJ30NCnBDID0gc2NhdGVyOjptdWx0aXBsb3QocEIsIHBbWzFdXSwgcFtbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgcFtbNF1dLCBwW1szXV0sIHBbWzVdXSwgY29scz0zKQ0KcEMNCmBgYA==