1 Participants

  • Okezie Uche-Ikonne, Department of Mathematics and Statistics, Lancaster University, Lancaster, UK,
  • Michael Holmes, Medical Research Council Population Health Research Unit at the University of Oxford, Oxford, UK.
  • Frank Dondelinger, Faculty of Health and Medicine, Lancaster University, Lancaster, UK.
  • Tom Palmer, Department of Mathematics and Statistics, Lancaster University, Lancaster, UK.

2 Motivation

There has been considerable research on the role of blood lipids and their associations with various cardiovascular traits (Holmes and Davey Smith 2018). While observational analyses have led to naïve classifications of “good” (higher density lipoprotein, HDL) and “bad” (lower density lipoprotein, LDL) blood lipids, the underlying causal relationships suggest that while LDL and triglycerides may have atherogenic characteristics, HDL-cholesterol is unlikely to play an important role in atherogenesis.

The MRDataChallenge provides a summary level dataset by which contains the associations of genotypes (comprising 148 SNPs) with lipid traits and the associations of genotypes with 7 outcomes (W. Spiller, Bowden, and Zuber 2019). Of the seven outcomes, we selected ischemic stroke to investigate the casual relationship of LDL and HDL lipid traits using the Mendelian randomization (MR) approach (Davey Smith and Ibrahim 2003). Figures 2.1 and 2.2 represent the DAGs for the proposed analysis.

Figure 2.1: Directed acyclic graph (DAG) of the MR analysis to investigate the effect of LDL to ischemic stroke.

Figure 2.2: DAG representing the MR analysis for the effect of HDL on ischemic stroke.

One cause of ischaemic stroke is the development of atherosclerosis, in which build-up of fatty deposits in the arterial wall leads to development of a plaque, which can disrupt the supply of oxygenated blood flow to the brain. There is strong evidence that LDL-related lipid phenotypes are causally implicated in the aetiology of atherosclerosis and coronary heart disease.

In a recent comment piece, Holmes and Ala-Korpela (2019) discussed that there is a size dependent threshold whereby lipid species that are bigger than small VLDLs, are too large to enter the arterial intima, as shown in Figure 2.3. Therefore, in our analysis we focused our investigation on those lipid species smaller than small VLDL: i.e. IDL and LDL. In addition, we wished to assess the causal relevance of HDL species.

Figure 1 of @holmes2019ldl showing which sizes of lipid trait enter the arterial intima.

Figure 2.3: Figure 1 of Holmes and Ala-Korpela (2019) showing which sizes of lipid trait enter the arterial intima.

3 Data

The MR Challenge data consists of summary data of the association of 148 genotypes with 118 lipid traits and 7 outcomes. We have trimmed the number of exposures used. Our low-density lipoprotein (LDL) analysis consists of 11 exposures whilst we have used 14 lipid traits associated with high-density lipoproteins (HDL).

The atherogenic lipid traits we investigated are;

  • Concentration of IDL particles
  • Free cholesterol in IDL
  • Cholesterol esters in large LDL
  • Free cholesterol in large LDL
  • Phospholipids in IDL
  • Concentration of Large LDL particles
  • Phospholipids in large LDL
  • Cholesterol esters in medium LDL
  • Concentration of medium LDL particles
  • Phospholipids in medium LDL
  • Concentration of small LDL particles.

The lipid traits related to HDL that we investigated are;

  • Cholesterol esters in large HDL
  • Concentration of large HDL particles
  • Phospholipids in large HDL
  • Cholesterol esters in medium HDL
  • Free cholesterol in medium HDL
  • Concentration of medium HDL particles
  • Phospholipids in medium HDL
  • Concentration of small HDL particles
  • Triglycerides in small HDL
  • Cholesterol esters in very large HDL
  • Free cholesterol in very large HDL
  • Concentration of very large HDL particles
  • Phospholipids in very large HDL
  • Triglycerides in very large HDL.

4 Analysis Methods

We used the inverse variance weighted (IVW) method to estimate the causal effect in summary-level data (Burgess, Butterworth, and Thompson 2013). The IVW model is denoted in equation (4.1) where for a genotype \(j\), \(\widehat\Gamma_j\) represents the estimated genotype-outcome associations, \(\widehat\gamma_j\) represents the estimated genotype-phenotype associations, and \(\sigma_{yj}\) represents the estimated standard errors of the genotype-outcome associations.

\[ \frac{\hat{\Gamma}_{j}}{\sigma_{y_j}} = \frac{\beta\gamma_j}{\sigma_{y_j}} + \varepsilon_j, \quad \varepsilon_j \sim N(0,1) \tag{4.1} \]

We perform sensitivity analysis for our IVW estimates using the MR-Egger model (Bowden, Davey Smith, and Burgess 2015). The MR-Egger model is an extension of the IVW model (4.1) which includes the average pleiotropic effect as an intercept. By convention the residual variance is constrained to be greater than 1, which usually means that the MR-Egger model gives larger standard errors on its estimated causal effect than the IVW model. Equation (4.2) denotes the MR-Egger model.

\[ \frac{\hat{\Gamma}_{j}}{\sigma_{y_j}} = \frac{\beta_0}{\sigma_{y_j}} + \frac{\beta\gamma_j}{\sigma_{y_j}} + \varepsilon_j, \quad \varepsilon_j \sim N(0,\sigma^2) \tag{4.2} \] We also investigated causal effects of lipid traits adjusted for other traits using the multivariable MR (MVMR) method (Burgess, Dudbridge, and Thompson 2015) as shown in equation (4.3). \[ \hat{\Gamma}_j = \beta_1\hat{\gamma}_{1,j} + \beta_2\hat{\gamma}_{2,j} + \varepsilon_j, \quad \varepsilon_j \sim N(0,\sigma^2). \tag{4.3} \]

To select which of the 148 genotypes to include in our analysis we took two approaches:

  1. We selected genotypes with genome-wide significant p-values (\(p < 5 \times 10^{-8}\)) with the specific lipid trait of interest. These results are in Section 4;
  2. We also selected genotypes based upon their individual contribution towards the Q-statistic, for either the IVW or MR-Egger model (Bowden et al. 2018). Therefore, in this case we selected genotypes with Q-statistic p-values \(\geq 0.05\). These results are in Section 5.

We investigated the causal effect of each selected lipid trait and we then perform a meta-analysis our causal effect estimates according to their size and their specific trait.

5 Results

5.1 GWAS-significant genotype-phenotype associations

5.1.1 IVW estimates

IVW estimates of the causal effect of lipid fractions related to LDLs are shown in Table 5.1 and Figure 5.1. We can see from the SNPs column that the number of selected SNPs is small for all the traits. The MR point estimates are positive which means that on average a higher level of LDL related lipid is related to a higher risk of ischemic stroke (since the associations are risk estimates on the log scale). However, the estimates all report confidence intervals spanning the null. The positive point estimates concur with our scientific expectations as the atherogenic characteristic increase the risk of ischemic stroke. However, more instruments would be needed to increase the statistical power of these estimates.

Table 5.1: IVW estimates for exposures related LDLs
Exposures Estimate SE LI UI Pval SNPs
Free cholesterol in IDL 0.0168 0.0723 -0.1249 0.1584 0.8165 4
Concentration of IDL particles 0.0137 0.058 -0.1 0.1274 0.8131 5
Phospholipids in IDL 0.0178 0.0756 -0.1303 0.1659 0.8138 4
Cholesterol esters in large LDL 0.0446 0.0659 -0.0846 0.1738 0.4988 3
Free cholesterol in large LDL 0.0926 0.0863 -0.0765 0.2616 0.2831 4
Concentration of large LDL particles 0.0483 0.0651 -0.0792 0.1759 0.4578 3
Phospholipids in large LDL 0.0411 0.0742 -0.1043 0.1864 0.5797 6
Cholesterol esters in medium LDL 0.0423 0.0674 -0.0898 0.1744 0.5306 3
Concentration of medium LDL particles 0.0445 0.0675 -0.0879 0.1768 0.5101 3
Phospholipids in medium LDL 0.091 0.0923 -0.09 0.272 0.3247 4
Concentration of small LDL particles 0.0344 0.0738 -0.1102 0.179 0.6408 4
IVW Estimates for LDLs

Figure 5.1: IVW Estimates for LDLs

Table 5.2 and Figure 5.2 show causal estimates of lipid fractions related to the HDLs. These point estimates are generally negative with confidence intervals spanning the null. In the Table shaded cells indicate a small number of genotypes, which is of interest because the MR-Egger estimator cannot be performed with these lipid traits due to the low number of instruments.

Table 5.2: IVW estimates for exposures related HDLs
Exposures Estimate SE LI UI Pval SNPs
Cholesterol esters in large HDL -0.0134 0.048 -0.1075 0.0807 0.7807 3
Concentration of large HDL particles -0.0179 0.0471 -0.1102 0.0745 0.7045 3
Phospholipids in large HDL -0.0222 0.0505 -0.1211 0.0767 0.66 3
Cholesterol esters in medium HDL -0.0399 0.1071 -0.2497 0.17 0.7096 1
Free cholesterol in medium HDL -0.0486 0.1306 -0.3045 0.2073 0.7096 1
Concentration of medium HDL particles -0.1014 0.1221 -0.3407 0.1379 0.4064 1
Phospholipids in medium HDL -0.1212 0.146 -0.4074 0.1649 0.4064 1
Concentration of small HDL particles -0.0225 0.0524 -0.1253 0.0802 0.6673 2
Triglycerides in small HDL -0.0268 0.0901 -0.2035 0.1498 0.7659 2
Cholesterol esters in very large HDL -0.0048 0.056 -0.1145 0.1049 0.932 2
Free cholesterol in very large HDL 8e-04 0.0482 -0.0937 0.0952 0.9875 3
Concentration of very large HDL particles -0.0042 0.0479 -0.098 0.0896 0.9297 2
Phospholipids in very large HDL -0.0032 0.0393 -0.0802 0.0738 0.9357 4
Triglycerides in very large HDL -0.0121 0.0385 -0.0875 0.0633 0.7524 2
IVW Estimates for HDLs

Figure 5.2: IVW Estimates for HDLs

5.1.2 MR-Egger estimates

In this section, we use the MR-Egger model to perform sensitivity analysis for the IVW estimates. Table 5.3 shows estimates from the MR-Egger model for lipid fractions related to LDLs. In general the point estimates are positive and larger in magnitude than the IVW estimates. The one exception is the point estimate for phospholipids in medium LDL, which shows a negative causal estimate with a confidence interval spanning the null. We find no strong evidence against the null hypothesis of no pleiotropy, since the estimates of the intercepts (AvgPleio) are all close to the null with large p-values.

Table 5.3: MR-Egger estimates for LDL related phenotypes
Estimate SE LI UI Pval
Free cholesterol in IDL
AvgPleio -0.0156 0.0277 -0.0699 0.0387 0.5738
Causal 0.1787 0.2994 -0.4081 0.7654 0.5506
Concentration of IDL particles
AvgPleio -0.0151 0.0257 -0.0656 0.0353 0.5563
Causal 0.1674 0.2688 -0.3594 0.6942 0.5335
Phospholipids in IDL
AvgPleio -0.0196 0.0299 -0.0781 0.0390 0.5128
Causal 0.2321 0.3380 -0.4304 0.8945 0.4923
Concentration of IDL particles
AvgPleio -0.0462 0.0627 -0.1691 0.0766 0.4608
Causal 0.5433 0.6840 -0.7973 1.8840 0.4270
Free cholesterol in large LDL
AvgPleio 0.0020 0.0339 -0.0645 0.0685 0.9531
Causal 0.0688 0.4174 -0.7493 0.8870 0.8690
Concentration of large LDL particles
AvgPleio -0.0451 0.0470 -0.1372 0.0471 0.3377
Causal 0.5262 0.5064 -0.4664 1.5188 0.2988
Phospholipids in large LDL
AvgPleio -0.0092 0.0268 -0.0618 0.0433 0.7307
Causal 0.1594 0.3535 -0.5334 0.8523 0.6519
Cholesterol esters in medium LDL
AvgPleio -0.0531 0.0828 -0.2152 0.1091 0.5214
Causal 0.6299 0.9232 -1.1795 2.4394 0.4950
Concentration of medium LDL particles
AvgPleio -0.0536 0.0701 -0.1911 0.0839 0.4447
Causal 0.6382 0.7838 -0.8979 2.1743 0.4155
Phospholipids in medium LDL
AvgPleio 0.0210 0.0606 -0.0977 0.1397 0.7287
Causal -0.1769 0.7799 -1.7056 1.3518 0.8206
Concentration of small LDL particles
AvgPleio -0.0046 0.0452 -0.0932 0.0840 0.9193
Causal 0.0853 0.5099 -0.9140 1.0846 0.8672

Sensitivity analysis of the lipid traits related to HDLs in Table 5.4 show negative point estimates with confidence intervals spanning the null. This would fit with a narrative of HDL either being protective or having a null effect on the risk of ischemic stroke, however the evidence against the null hypothesis is very weak.

Table 5.4: MR-Egger estimates for HDL related phenotypes
Estimate SE LI UI Pval
Cholesterol esters in large HDL
AvgPleio 0.0407 0.0442 -0.0459 0.1274 0.3570
Causal -0.2675 0.2801 -0.8165 0.2814 0.3395
Concentration of large HDL particles
AvgPleio 0.0359 0.0328 -0.0284 0.1002 0.2741
Causal -0.2350 0.2040 -0.6348 0.1649 0.2495
Phospholipids in large HDL
AvgPleio 0.0282 0.0265 -0.0237 0.0800 0.2869
Causal -0.2019 0.1761 -0.5471 0.1433 0.2517
Free cholesterol in very large HDL
AvgPleio 0.0249 0.0285 -0.0310 0.0808 0.3819
Causal -0.1686 0.1996 -0.5599 0.2226 0.3983
Phospholipids in very large HDL
AvgPleio 0.0182 0.0253 -0.0314 0.0678 0.4714
Causal -0.1080 0.1508 -0.4037 0.1876 0.4737

5.1.3 Meta-analysis of exposure traits

In an attempt to increase statistical power, we performed a meta-analysis of the results by lipid category and molecular size.

5.1.3.1 Risk factor categories

Table 5.5 shows results from the meta-analysis of the IVW estimates. The point estimates show null or positive estimates with confidence intervals spanning the null, however given the number of instruments the estimates show how despite the meta-analysis, the analyses yield imprecise causal estimates. Results in Table 5.6 are similar to the risk factor categories of LDLs. The point estimates show null or negative estimates with confidence intervals spanning the null.

Table 5.5: Meta-analysis of IVW estimates from LDL related phenotypes
N Estimate SE LI UI Pval
Concentration 4 0.0337 0.0327 -0.0304 0.0978 0.3025
Phospholipids 3 0.0449 0.0459 -0.0452 0.1349 0.3288
Free Cholesterol 2 0.0481 0.0554 -0.0606 0.1567 0.3858
Cholesterol esters 2 0.0435 0.0471 -0.0489 0.1358 0.3562
Table 5.6: Meta-analysis of IVW estimates for HDL related phenotypes
N Mean SE LI UI Pval
Cholesterol Esters 3 -0.0129 0.0345 -0.0805 0.0547 0.7088
Free Cholesterol 2 -0.0051 0.0452 -0.0937 0.0835 0.9098
Concentration 4 -0.0189 0.0275 -0.0729 0.0351 0.4929
phospholipids 3 -0.0203 0.0300 -0.0790 0.0385 0.4991
Triglycerides 2 -0.0144 0.0354 -0.0838 0.0550 0.6848

5.1.3.2 Sizes

In this section we present result meta-analysing over the lipid traits for each size of molecule. LDL results are shown in Table 5.7. Similar to the risk factor categories in 5.5 the sizes have null or positive causal estimate with no strong evidence against the null. Table 5.7 shows that the medium and large sized LDLs have a greater magnitude of effect than the intermediates sizes which matches our scientific rationale.

Table 5.7: Meta-analysis of IVW estimates for LDL sizes
N Mean SE LI UI P-val
Intermediate 3 0.0157 0.0388 -0.0604 0.0918 0.6864
Medium 3 0.0534 0.0424 -0.0296 0.1365 0.2073
Large 4 0.0531 0.0358 -0.0169 0.1232 0.1372

For the HDL sizes in Table 5.8 the point estimates show negative point estimates close to the null however none of the estimates are statistically significant. We find that the pooled point estimated for the very large HDL molecules is closest to the null.

Table 5.8: Meta-analysis of IVW estimates for HDL Sizes
N Mean SE LI UI P-val
Small 2 -0.0236 0.0453 -0.1124 0.0652 0.6026
Medium 4 -0.0724 0.0620 -0.1940 0.0492 0.2431
Large 3 -0.0177 0.0280 -0.0725 0.0372 0.5273
Very Large 5 -0.0053 0.0200 -0.0444 0.0339 0.7913

5.1.4 Multivariate Meta-analysis of MR-Egger estimates

We also present equivalent meta-analysis estimates for our MR-Egger results, the difference being that we use multivariate meta-analysis since the MR-Egger model returns 2 parameters (slope and intercept). The low number of MR-Egger estimates from the exposure traits related to HDL-related phenotypes meant that we could not report any estimates. The results of the risk factor categories in Table 5.9 show no strong evidence against the null of no pleiotropy. Cholesterol esters show a greater effect on ischemic stroke within the different LDL traits. Table 5.10 shows no strong evidence against the null hypothesis of no pleiotropy. The summary point estimates are bigger in magnitude than the IVW estimates in Table 5.7. The intermediate sized traits returned a positive estimate suggesting an increased risk of ischemic stroke.

Table 5.9: Results from Multivariate Meta-analysis of LDL related phenotypes
N AVg Pleio Slope Pval(Pleio) Pval(Est)
Free Cholesterol 4 -0.0086 0.1414 0.6902 0.5612
Concentration 3 -0.0213 0.2471 0.2737 0.2339
Phospholipids 2 -0.0104 0.1639 0.5824 0.4819
Cholesterol esters 2 -0.0487 0.5740 0.3295 0.2963
Table 5.10: Multivariate meta-analysis of MR-Egger estimates for LDL sizes
N Avg Pleio Estimate Pval(Pleio) Pval(Est)
Intermediate 3 -0.0165 0.1789 0.2995 0.0000
Medium 3 -0.0208 0.3346 0.6044 0.4806
Large 4 -0.0146 0.2469 0.4269 0.2721

5.2 Selecting genetic variants using Q-statistics

As most of the results presented hitherto have lacked statistical power, we therefore sought to increase the number of SNPs used as instruments, with the hope of increasing power, through the use of Q-statistics. This section presents results using genotypes based on their contribution to the Q-statistic in the IVW models.

5.2.1 IVW estimates

The estimates from the IVW model are given in Tables 5.11 and 5.12.

MR estimates in Table 5.11 show positive point estimates which agree with our expectations, the estimates also show significance (confidence intervals exclude null). However a major limitation here is that the SNPs used in the models are the same or largely overlapping, meaning that the MR estimates are unlikely to be valid. This is because the estimates from the genotype-outcome association are the same in each model with the genotype-exposure association varying for each lipid trait leading to a simple scaling of the genotype-outcome associations for each trait. This makes it impossible to disentangle which trait has a true causal effect and which is confounded by using the same SNPs. This issue has been discussed previously by Holmes, Ala-Korpela, and Davey Smith (2017).
Table 5.11: IVW estimates for exposures related LDLs
Exposures Estimates SE LI UI Pval SNPs
Free cholesterol in IDL 0.0965 0.0338 0.0302 0.1629 0.0043 133
Concentration of IDL particles 0.0991 0.0326 0.0353 0.163 0.0024 133
Phospholipids in IDL 0.102 0.0341 0.0352 0.1688 0.0028 134
Cholesterol esters in large LDL 0.1068 0.0358 0.0366 0.177 0.0029 133
Free cholesterol in large LDL 0.0984 0.0361 0.0277 0.1692 0.0064 133
Concentration of large LDL particles 0.1039 0.0343 0.0367 0.1712 0.0025 133
Phospholipids in large LDL 0.0991 0.0359 0.0287 0.1695 0.0058 133
Cholesterol esters in medium LDL 0.1105 0.0363 0.0393 0.1818 0.0024 133
Concentration of medium LDL particles 0.107 0.0357 0.037 0.1769 0.0027 133
Phospholipids in medium LDL 0.0946 0.0373 0.0214 0.1678 0.0113 133
Concentration of small LDL particles 0.0993 0.0362 0.0284 0.1703 0.0061 133

Results from Table 5.12 show causal estimates of lipid traits related to HDL with the increased number of SNPs. The point estimates are generally null or negative with small p-values. Triglycerides in small HDL show a positive causal effect on ischemic stroke with statistical significance. We show the MR-Egger model for this estimate below. Precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning the effect estimates from MR are unlikely to be valid.

Table 5.12: IVW estimates for exposures related HDLs
Exposures Estimates SE LI UI Pval SNPs
Cholesterol esters in large HDL -0.0967 0.0301 -0.1557 -0.0378 0.0013 134
Concentration of large HDL particles -0.0879 0.0302 -0.1471 -0.0288 0.0036 133
Phospholipids in large HDL -0.0924 0.0312 -0.1535 -0.0313 0.0031 133
Cholesterol esters in medium HDL -0.1651 0.0419 -0.2472 -0.083 1e-04 135
Free cholesterol in medium HDL -0.1531 0.0442 -0.2396 -0.0665 5e-04 135
Concentration of medium HDL particles -0.1391 0.0447 -0.2267 -0.0515 0.0019 135
Phospholipids in medium HDL -0.1567 0.0454 -0.2456 -0.0678 6e-04 135
Concentration of small HDL particles -0.0656 0.0409 -0.1458 0.0146 0.1091 135
Triglycerides in small HDL 0.1583 0.0411 0.0778 0.2387 1e-04 134
Cholesterol esters in very large HDL -0.0832 0.0385 -0.1586 -0.0078 0.0305 131
Free cholesterol in very large HDL -0.0827 0.0348 -0.1509 -0.0145 0.0174 132
Concentration of very large HDL particles -0.0692 0.0348 -0.1374 -0.001 0.0467 131
Phospholipids in very large HDL -0.0655 0.0299 -0.1242 -0.0068 0.0288 132
Triglycerides in very large HDL 0.026 0.0301 -0.033 0.085 0.3874 134

5.2.2 MR-Egger estimates

Table 5.13 shows results from the MR-Egger model for the lipid fractions related to LDLs. The results show no strong evidence against no pleiotropy with values from the AvgPleio being close to the null with large p-values.

Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MR are unlikely to be valid.

Table 5.13: MR-Egger estimates for LDLs
Estimate SE LI UI Pval
Free cholesterol in IDL
AvgPleio 0.0010 0.0014 -0.0016 0.0037 0.4465
Causal 0.0689 0.0497 -0.0285 0.1662 0.1655
Concentration of IDL particles
AvgPleio 0.0019 0.0013 -0.0007 0.0045 0.1482
Causal 0.0501 0.0471 -0.0421 0.1423 0.2872
Phospholipids in IDL
AvgPleio 0.0025 0.0014 -0.0002 0.0051 0.0689
Causal 0.0349 0.0502 -0.0635 0.1333 0.4873
Concentration of IDL particles
AvgPleio 0.0006 0.0014 -0.0021 0.0032 0.6729
Causal 0.0906 0.0525 -0.0123 0.1935 0.0844
Free cholesterol in large LDL
AvgPleio 0.0018 0.0014 -0.0009 0.0044 0.1874
Causal 0.0474 0.0529 -0.0564 0.1512 0.3706
Concentration of large LDL particles
AvgPleio 0.0010 0.0013 -0.0016 0.0037 0.4469
Causal 0.0763 0.0500 -0.0217 0.1742 0.1268
Phospholipids in large LDL
AvgPleio 0.0013 0.0014 -0.0013 0.0040 0.3232
Causal 0.0608 0.0528 -0.0427 0.1643 0.2495
Cholesterol esters in medium LDL
AvgPleio 0.0004 0.0014 -0.0023 0.0031 0.7494
Causal 0.0978 0.0540 -0.0080 0.2036 0.0701
Concentration of medium LDL particles
AvgPleio 0.0000 0.0014 -0.0027 0.0027 0.9774
Causal 0.1058 0.0532 0.0016 0.2101 0.0465
Phospholipids in medium LDL
AvgPleio 0.0015 0.0014 -0.0013 0.0042 0.2917
Causal 0.0506 0.0560 -0.0591 0.1604 0.3657
Concentration of small LDL particles
AvgPleio 0.0003 0.0014 -0.0024 0.0030 0.8324
Causal 0.0907 0.0546 -0.0162 0.1976 0.0965

Results from Table 5.14 show some statistically significant average pleiotropic estimates and non-significant estimates, however the estimates are close to the null. The point estimate of triglycerides in small HDL shows an increase compared to its IVW estimate, and we note that both are positive. There was no evidence against no pleiotropy for this estimate. Figure 5.3 shows the association of triglycerides in small HDL and ischemic stroke. Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MR are unlikely to be valid.

Table 5.14: MR-Egger estimates for HDLs
Estimate SE LI UI Pval
Cholesterol esters in large HDL
AvgPleio -0.0043 0.0013 -0.0067 -0.0018 0.0006
Causal -0.0016 0.0409 -0.0818 0.0787 0.9695
Concentration of large HDL particles
AvgPleio -0.0029 0.0012 -0.0053 -0.0004 0.0213
Causal -0.0258 0.0405 -0.1051 0.0535 0.5236
Phospholipids in large HDL
AvgPleio -0.0040 0.0013 -0.0065 -0.0016 0.0014
Causal -0.0004 0.0424 -0.0836 0.0827 0.9918
Cholesterol esters in medium HDL
AvgPleio -0.0028 0.0013 -0.0053 -0.0002 0.0328
Causal -0.0756 0.0593 -0.1918 0.0406 0.2024
Free cholesterol in medium HDL
AvgPleio -0.0016 0.0013 -0.0041 0.0009 0.2164
Causal -0.0993 0.0620 -0.2208 0.0222 0.1094
Concentration of medium HDL particles
AvgPleio -0.0019 0.0012 -0.0044 0.0005 0.1190
Causal -0.0754 0.0605 -0.1940 0.0433 0.2130
Phospholipids in medium HDL
AvgPleio -0.0035 0.0013 -0.0060 -0.0010 0.0054
Causal -0.0362 0.0627 -0.1591 0.0866 0.5632
Concentration of small HDL particles
AvgPleio -0.0003 0.0012 -0.0026 0.0020 0.7868
Causal -0.0576 0.0505 -0.1567 0.0414 0.2539
Triglycerides in small HDL
AvgPleio -0.0004 0.0014 -0.0032 0.0024 0.7743
Causal 0.1719 0.0629 0.0486 0.2952 0.0063
Cholesterol esters in very large HDL
AvgPleio -0.0009 0.0012 -0.0032 0.0015 0.4675
Causal -0.0605 0.0496 -0.1577 0.0367 0.2226
Free cholesterol in very large HDL
AvgPleio -0.0032 0.0012 -0.0054 -0.0009 0.0067
Causal -0.0117 0.0435 -0.0971 0.0736 0.7875
Concentration of small HDL particles
AvgPleio -0.0015 0.0012 -0.0038 0.0008 0.2037
Causal -0.0362 0.0434 -0.1213 0.0490 0.4051
Phospholipids in very large HDL
AvgPleio -0.0032 0.0012 -0.0055 -0.0010 0.0053
Causal -0.0021 0.0376 -0.0758 0.0716 0.9561
Triglycerides in very large HDL
AvgPleio -0.0007 0.0012 -0.0029 0.0016 0.5665
Causal 0.0382 0.0369 -0.0341 0.1104 0.3007
Association of triglycerides in small HDLs and ischemic stroke. Caution should be applied in interpreting these data as the SNPs used are pleiotropic.

Figure 5.3: Association of triglycerides in small HDLs and ischemic stroke. Caution should be applied in interpreting these data as the SNPs used are pleiotropic.

5.2.3 Meta-analysis of exposure traits

Selection of SNPs through their individual contribution to the Q-statistics yielded a large number of instruments and therefore statistical power. As before, we sought to combine categories of traits to increase power further.

The meta-analysis exposure trait estimates in Table 5.15 are statistically significant, with the estimate for cholesterol esters being the largest in magnitude. The results in Table 5.16 show similar characteristics in terms of statistical significance, apart from risk categories of triglycerides related to HDLs which show a positive effect estimate with a large p-values.

Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MR are unlikely to be valid.

Table 5.15: Meta-analysis of risk factors for LDLs using IVW estimates
N Estimate SE LI UI Pval
Free Cholesterol 2 0.0974 0.0247 0.0490 0.1457 1e-04
Concentration 4 0.1022 0.0173 0.0683 0.1361 0e+00
Phospholipids 3 0.0988 0.0206 0.0584 0.1392 0e+00
Cholesterol esters 2 0.1086 0.0255 0.0587 0.1586 0e+00
Table 5.16: Meta-analysis of risk factors for HDLs using IVW estimates
N Estimate SE LI UI Pval
Cholesterol esters 3 -0.1095 0.0209 -0.1505 -0.0686 0.0000
Concentration 4 -0.0869 0.0182 -0.1225 -0.0512 0.0000
Phospholipids 3 -0.1023 0.0207 -0.1429 -0.0618 0.0000
Triglycerides 2 0.0892 0.0661 -0.0403 0.2187 0.1771

5.2.4 Multivariate Meta-analysis of MR-Egger estimates

We explore the results from the MR-Egger model using multivariate meta-analysis, the analysis is performed on the risk factor categories for LDLs (Table 5.17) and HDLs (Table 5.18). Results from Table 5.17 show no statistically significant intercept estimates except for the phospholipids risk factor categories. The slope for the cholesterol esters and concentration groups show statistical significance.

From Table 5.18, the risk factor group of triglycerides in HDLs show estimates of the intercept and slope of no statistical significance. The other risk factor groups have statistically significant intercept estimates and non significant slopes.

We note that the same SNPs have been used multiple times for each exposures, and then fitted in a multivariate meta-analysis model. To our minds the multivariate meta-analysis of these MR-Egger estimates cannot yield valid causal estimates given that in effect the same SNPs are used to instrument different exposures.

Table 5.17: Results from Multivariate Meta-analysis LDL risk factor categories
N AVg Pleio Slope Pval(Pleio) Pval(Est)
Free Cholesterol 4 0.0013 0.0616 0.9504 0.8002
Concentration 3 0.0008 0.0785 0.2150 0.0020
Phospholipids 2 0.0018 0.0482 0.0256 0.1140
Cholesterol esters 2 0.0005 0.0941 0.5997 0.0124
Table 5.18: Results from Multivariate Meta-analysis HDL risk factor categories
N AVg Pleio Slope Pval(Pleio) Pval(Est)
Cholesterol esters 3 -0.0026 -0.0398 0.0127 0.2132
Concentration 4 -0.0016 -0.0433 0.0078 0.0661
Phospholipids 3 -0.0035 -0.0117 0.0000 0.6685
Triglycerides 2 -0.0005 0.0954 0.5480 0.1498

5.3 MVMR of Concentration

We were additionally interested in whether mutually adjusting for lipid traits in our IVW models would affect our causal effects. We therefore fitted MVMR models as shown in Figure 5.4.

Figure 5.4: Directed acyclic graph (DAG) of Multivariable MR analysis of concentration risk factor categories in LDLs.

We fitted MVMR models using the MVMR package (W. Spiller, Bowden, and Sanderson 2019). We investigated invalid instruments using each genotype’s contribution to the adjusted Q-statistic (Sanderson et al. 2018) and only found 2 outlying genotypes, hence for simplicity we performed these analyses using all 148 genotypes.

5.3.1 LDL

The results of the MVMR analysis for the concentration of LDL particles is shown in Table 5.19. Concentration for IDLs and medium LDL particles have negative causal estimates, with the concentration of IDL particles estimate giving a small p-value.

The column of Q-statistics (Q) shows evidence of heterogeneity. In the MVMR context, this suggests that there is enough information from the instruments to predict the exposures. The test based on the adjusted Q statistic (\(p(Q_A) = 0.99\)) shows evidence of pleiotropy, which can suggest that there are instruments which are related to the outcome through other pathways (more exposures).

Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MVMR are unlikely to be valid.

Table 5.19: IVW Estimates from Multivariate MR using 148 SNPs
Estimate Std. Error t value Pr(>|t|) Q
Concentration of IDL particles -1.7362 0.2718 -6.3866 0.0000 10.5582
Concentration of Large LDL particles 2.1343 0.3712 5.7491 0.0000 93.5366
Concentration of Medium LDL particles -0.0861 0.3069 -0.2807 0.7793 105.3149
Concentration of Small particles 0.8309 0.0900 9.2292 0.0000 1187.1912

5.3.2 HDL

The results from the MVMR analysis for concentrations of HDL particles are shown in Table 5.20. These show positive causal estimates for medium and very large HDL, however the estimates should be interpreted with caution. The Q-statistic column suggests that there is enough information from the instruments to predict the exposure variables. The adjusted Q-statistic for this model gave a p-value of 0.88, which suggests that there are instruments which affect ischemic stroke through other exposures.

Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MVMR are unlikely to be valid.

Table 5.20: IVW Estimates from Multivariate MR for HDLs using 148 SNPs
Estimate Std. Error t value Pr(>|t|) Q
Concentration of Large HDL particles -0.1188 0.1611 -0.7371 0.4622 26.0627
Concentration of Medium HDL particles 0.5846 0.1928 3.0329 0.0029 29.2731
Concentration of Small HDL particles -0.2440 0.1108 -2.2026 0.0292 33.5726
Concentration of Very Large HDL particles 0.5252 0.1097 4.7892 0.0000 28.5134

6 Discussion and Conclusions

We have presented estimates of the effect of different traits related to LDL and HDL on the risk of ischemic stroke and attempted to group traits based on characteristics of lipid or size.

Selecting instruments for each trait based on SNPs that surpass conventional levels of genome-wide significance led to no meaningful conclusions being drawn based on limited statistical power.

In contrast, selecting instruments based on their individual contribution to the Q-statistics led to instruments consisting of many more SNPs and therefore greater statistical power. In this setting, we identified many strong MR associations, which could be construed as evidence of causation. However this approach has a major flaw insofar as the same SNPs were used as IVs for multiple exposures. In this context, it becomes impossible to disentangle which of the traits are causal because in essence the genotype-disease association is fixed and all that varies in each MR model is the genotype-exposure association. Furthermore, in the context of MVMR, we cannot see how using the same SNPs for multiple exposures in the same model can lead to valid MR estimates.

Thus, this MR data challenge nicely demonstrates a key challenge in conducting MR of highly correlated traits. Selecting SNPs on the basis of GWAS significance derived from modestly-sized GWAS studies is likely to lead to poorly performing instruments on the basis of lack of statistical power. Inclusion of greater numbers of SNPs by more permissive entry criteria, especially in the context of only 148 SNPs in total across the lipid traits in this data example, means that we in essence use the same SNPs multiple times which means that we cannot use MR in either the univariate or multivariate setting to disentangle which traits are driving the causal relationship. We are not therefore able to make any meaningful conclusions about the causal role of these traits in ischaemic stroke. Our analyses highlight a potential misuse of genetic instruments where the same instruments are used for multiple exposures, which might lead to erroneous interpretations.

7 Software

The R Markdown code is available by clicking on the Code button in the top righthand corner of this document. Click here to navigate to the top of the document.

References

Bowden, Jack, George Davey Smith, and Stephen Burgess. 2015. “Mendelian Randomization with Invalid Instruments: Effect Estimation and Bias Detection Through Egger Regression.” International Journal of Epidemiology 44 (2): 512–25.

Bowden, Jack, Wesley Spiller, Fabiola Del Greco M, Nuala Sheehan, John Thompson, Cosetta Minelli, and George Davey Smith. 2018. “Improving the Visualization, Interpretation and Analysis of Two-Sample Summary Data Mendelian Randomization via the Radial Plot and Radial Regression.” International Journal of Epidemiology 47 (4): 1264–78.

Burgess, Stephen, Adam Butterworth, and Simon G Thompson. 2013. “Mendelian Randomization Analysis with Multiple Genetic Variants Using Summarized Data.” Genetic Epidemiology 37 (7): 658–65.

Burgess, Stephen, Frank Dudbridge, and Simon G Thompson. 2015. “Re:“Multivariable Mendelian Randomization: The Use of Pleiotropic Genetic Variants to Estimate Causal Effects".” American Journal of Epidemiology 181 (4): 290–91.

Davey Smith, G., and S. Ibrahim. 2003. “‘Mendelian randomization’: can genetic epidemiology contribute to understanding environmental determinants of disease?” International Journal of Epidemiology 32 (1): 1–22.

Holmes, Michael V, and Mika Ala-Korpela. 2019. “What is ‘LDL cholesterol’?” Nature Reviews Cardiology 16: 197–98.

Holmes, Michael V., Mika Ala-Korpela, and George Davey Smith. 2017. “Mendelian randomization in cardiometabolic disease: challenges in evaluating causality.” Nature Reviews Cardiology 14: 577–90. https://doi.org/10.1038/nrcardio.2017.78.

Holmes, M. V., and G. Davey Smith. 2018. “Challenges in Interpreting Multivariable Mendelian Randomization: Might ‘Good Cholesterol’ Be Good After All?” 71 (2): 149–53.

Sanderson, Eleanor, George Davey Smith, Frank Windmeijer, and Jack Bowden. 2018. “An examination of multivariable Mendelian randomization in the single-sample and two-sample summary data settings.” International Journal of Epidemiology, December. https://doi.org/10.1093/ije/dyy262.

Spiller, Wes, Jack Bowden, and Eleanor Sanderson. 2019. MVMR: R package to perform multivariable Mendelian randomization analyses. https://github.com/WSpiller/MVMR.

Spiller, Wes, Jack Bowden, and Verena Zuber. 2019. MRChallenge2019: An R package containing data for the MR Conference Data Challenge 2019. https://github.com/WSpiller/MRChallenge2019.

LS0tDQp0aXRsZTogIk1SIERhdGEgQ2hhbGxlbmdlIDIwMTk6IEludmVzdGlnYXRpbmcgdGhlIENhdXNhbCBFZmZlY3Qgb2YgTERMIGFuZCBIREwgb24gSXNjaGVtaWMgU3Ryb2tlIg0KIyBhdXRob3I6DQojIC0gbmFtZTogIk9rZXppZSBVY2hlLUlrb25uZSINCiMgICBhZmZpbGlhdGlvbjogIkRlcGFydG1lbnQgb2YgTWF0aGVtYXRpY3MgYW5kIFN0YXRpc3RpY3MsIExhbmNhc3RlciBVbml2ZXJzaXR5LCBMYW5jYXN0ZXIsIFVLIg0KIyAgIGVtYWlsOiBvLnVjaGUtaWtvbm5lQGxhbmNhc3Rlci5hYy51aw0KIyAtIG5hbWU6ICJNaWNoYWVsIEhvbG1lcyINCiMgICBhZmZpbGlhdGlvbjogIk1lZGljYWwgUmVzZWFyY2ggQ291bmNpbCBQb3B1bGF0aW9uIEhlYWx0aCBSZXNlYXJjaCBVbml0IGF0IHRoZSBVbml2ZXJzaXR5IG9mIE94Zm9yZCwgT3hmb3JkLCBVSy4iDQojICAgZW1haWw6IG1pY2hhZWwuaG9sbWVzQG5kcGgub3guYWMudWsNCiMgLSBuYW1lOiAiRnJhbmsgRG9uZGVsaW5nZXIiDQojICAgYWZmaWxpYXRpb246ICJGYWN1bHR5IG9mIEhlYWx0aCBhbmQgTWVkaWNpbmUsIExhbmNhc3RlciBVbml2ZXJzaXR5LCBMYW5jYXN0ZXIsIFVLIg0KIyAgIGVtYWlsOiBmLmRvbmRlbGluZ2VyQGxhbmNhc3Rlci5hYy51aw0KIyAtIG5hbWU6ICJUb20gUGFsbWVyIg0KIyAgIGFmZmlsaWF0aW9uOiAiRGVwYXJ0bWVudCBvZiBNYXRoZW1hdGljcyBhbmQgU3RhdGlzdGljcywgTGFuY2FzdGVyIFVuaXZlcnNpdHksIExhbmNhc3RlciwgVUsiDQojICAgZW1haWw6IHRvbS5wYWxtZXJAbGFuY2FzdGVyLmFjLnVrDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlLmJpYg0KbGluay1jaXRhdGlvbnM6IFRSVUUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gRkFMU0UpDQpsaWJyYXJ5KE1SQ2hhbGxlbmdlMjAxOSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoTWVuZGVsaWFuUmFuZG9taXphdGlvbikNCnJlcXVpcmUoa25pdHIpDQpyZXF1aXJlKHJtYXJrZG93bikNCnJlcXVpcmUoYm9va2Rvd24pDQpyZXF1aXJlKHN0eWxlcikNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShtdm1ldGEpDQpsaWJyYXJ5KG1ldGEpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShkaWFncmFtKQ0KbGlicmFyeShNVk1SKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0Kc291cmNlKCJtdm1yMi5SIikNCmBgYA0KDQpgYGB7cn0NCmRhdGEoQ2hhbGxlbmdlX2RhdCkNCmJldGFfbWF0IDwtIENoYWxsZW5nZV9kYXRbMzI6MTQ5XQ0KcF9tYXQgPC0gQ2hhbGxlbmdlX2RhdFsxNTA6MjY3XQ0KDQojIyMgT3V0Y29tZXMgDQpvdXRfeWJldGE8LSBjYmluZChDaGFsbGVuZ2VfZGF0JGJldGFfYW1kLENoYWxsZW5nZV9kYXQkYmV0YV9hbHosQ2hhbGxlbmdlX2RhdCRiZXRhX3QyZCxDaGFsbGVuZ2VfZGF0JGJldGFfaXNjaCxDaGFsbGVuZ2VfZGF0JGJldGFfbGFzLENoYWxsZW5nZV9kYXQkYmV0YV9jZXMsQ2hhbGxlbmdlX2RhdCRiZXRhX3N2cykNCg0Kb3V0X3lzZTwtIGNiaW5kKENoYWxsZW5nZV9kYXQkc2VfYW1kLENoYWxsZW5nZV9kYXQkc2VfYWx6LENoYWxsZW5nZV9kYXQkc2VfdDJkLENoYWxsZW5nZV9kYXQkc2VfaXNjaCxDaGFsbGVuZ2VfZGF0JHNlX2xhcyxDaGFsbGVuZ2VfZGF0JHNlX2NlcyxDaGFsbGVuZ2VfZGF0JHNlX3N2cykNCg0KIyMgZXhwb3N1cmVzIChMRExzKQ0KbGRsX3hiZXRhPC0gY2JpbmQoYmV0YV9tYXRbMzBdLGJldGFfbWF0WzMyXSxiZXRhX21hdFszM10sYmV0YV9tYXRbNDJdLGJldGFfbWF0WzQzXSxiZXRhX21hdFs0NV0sYmV0YV9tYXRbNDZdLGJldGFfbWF0WzY2XSxiZXRhX21hdFs2OF0sYmV0YV9tYXRbNjldLGJldGFfbWF0Wzg2XSkNCg0KbGRsX3B2YWw8LSBjYmluZChwX21hdFszMF0scF9tYXRbMzJdLHBfbWF0WzMzXSxwX21hdFs0Ml0scF9tYXRbNDNdLHBfbWF0WzQ1XSxwX21hdFs0Nl0scF9tYXRbNjZdLHBfbWF0WzY4XSxwX21hdFs2OV0scF9tYXRbODZdKQ0KDQojIyBleHBvc3VyZXMgKEhETHMpDQpoZGxfeGJldGEgPC0gY2JpbmQoYmV0YV9tYXRbMzddLGJldGFfbWF0WzM5XSxiZXRhX21hdFs0MF0sYmV0YV9tYXRbNjBdLGJldGFfbWF0WzYxXSxiZXRhX21hdFs2M10sYmV0YV9tYXRbNjRdLGJldGFfbWF0WzgyXSxiZXRhX21hdFs4M10sYmV0YV9tYXRbMTAzXSxiZXRhX21hdFsxMDRdLGJldGFfbWF0WzEwNl0sYmV0YV9tYXRbMTA3XSxiZXRhX21hdFsxMDhdKQ0KDQpoZGxfcHZhbCA8LSBjYmluZChwX21hdFszN10scF9tYXRbMzldLHBfbWF0WzQwXSxwX21hdFs2MF0scF9tYXRbNjFdLHBfbWF0WzYzXSxwX21hdFs2NF0scF9tYXRbODJdLHBfbWF0WzgzXSxwX21hdFsxMDNdLHBfbWF0WzEwNF0scF9tYXRbMTA2XSxwX21hdFsxMDddLHBfbWF0WzEwOF0pDQpgYGANCg0KIyBQYXJ0aWNpcGFudHMNCg0KLSBPa2V6aWUgVWNoZS1Ja29ubmUsIERlcGFydG1lbnQgb2YgTWF0aGVtYXRpY3MgYW5kIFN0YXRpc3RpY3MsIExhbmNhc3RlciBVbml2ZXJzaXR5LCBMYW5jYXN0ZXIsIFVLLCBvLnVjaGUtaWtvbm5lQGxhbmNhc3Rlci5hYy51aw0KLSBNaWNoYWVsIEhvbG1lcywgTWVkaWNhbCBSZXNlYXJjaCBDb3VuY2lsIFBvcHVsYXRpb24gSGVhbHRoIFJlc2VhcmNoIFVuaXQgYXQgdGhlIFVuaXZlcnNpdHkgb2YgT3hmb3JkLCBPeGZvcmQsIFVLLg0KLSBGcmFuayBEb25kZWxpbmdlciwgRmFjdWx0eSBvZiBIZWFsdGggYW5kIE1lZGljaW5lLCBMYW5jYXN0ZXIgVW5pdmVyc2l0eSwgTGFuY2FzdGVyLCBVSy4NCi0gVG9tIFBhbG1lciwgRGVwYXJ0bWVudCBvZiBNYXRoZW1hdGljcyBhbmQgU3RhdGlzdGljcywgTGFuY2FzdGVyIFVuaXZlcnNpdHksIExhbmNhc3RlciwgVUsuDQoNCiMgTW90aXZhdGlvbg0KDQpUaGVyZSBoYXMgYmVlbiBjb25zaWRlcmFibGUgcmVzZWFyY2ggb24gdGhlIHJvbGUgb2YgYmxvb2QgbGlwaWRzIGFuZCB0aGVpciBhc3NvY2lhdGlvbnMgd2l0aCB2YXJpb3VzIGNhcmRpb3Zhc2N1bGFyIHRyYWl0cyBbQGhvbG1lc2Fqa2QyMDE4XS4gV2hpbGUgb2JzZXJ2YXRpb25hbCBhbmFseXNlcyBoYXZlIGxlZCB0byBuYcOvdmUgY2xhc3NpZmljYXRpb25zIG9mICJnb29kIiAoaGlnaGVyIGRlbnNpdHkgbGlwb3Byb3RlaW4sIEhETCkgYW5kICJiYWQiIChsb3dlciBkZW5zaXR5IGxpcG9wcm90ZWluLCBMREwpIGJsb29kIGxpcGlkcywgdGhlIHVuZGVybHlpbmcgY2F1c2FsIHJlbGF0aW9uc2hpcHMgc3VnZ2VzdCB0aGF0IHdoaWxlIExETCBhbmQgdHJpZ2x5Y2VyaWRlcyBtYXkgaGF2ZSBhdGhlcm9nZW5pYyBjaGFyYWN0ZXJpc3RpY3MsIEhETC1jaG9sZXN0ZXJvbCBpcyB1bmxpa2VseSB0byBwbGF5IGFuIGltcG9ydGFudCByb2xlIGluIGF0aGVyb2dlbmVzaXMuDQoNClRoZSBbTVJEYXRhQ2hhbGxlbmdlXShodHRwczovL3d3dy5tZW5kZWxpYW5yYW5kb21pemF0aW9uLm9yZy51ay90aGUtbXItZGF0YS1jaGFsbGVuZ2UtMjAxOS8pIHByb3ZpZGVzIGEgc3VtbWFyeSBsZXZlbCBkYXRhc2V0IGJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGlvbnMgb2YgZ2Vub3R5cGVzIChjb21wcmlzaW5nIDE0OCBTTlBzKSB3aXRoIGxpcGlkIHRyYWl0cyBhbmQgdGhlIGFzc29jaWF0aW9ucyBvZiBnZW5vdHlwZXMgd2l0aCA3IG91dGNvbWVzIFtAbXJjaGFsbGVuZ2UyMDE5XS4gT2YgdGhlIHNldmVuIG91dGNvbWVzLCB3ZSBzZWxlY3RlZCBpc2NoZW1pYyBzdHJva2UgdG8gaW52ZXN0aWdhdGUgdGhlIGNhc3VhbCByZWxhdGlvbnNoaXAgb2YgTERMIGFuZCBIREwgbGlwaWQgdHJhaXRzIHVzaW5nIHRoZSBNZW5kZWxpYW4gcmFuZG9taXphdGlvbiAoTVIpIGFwcHJvYWNoIFtAZGF2ZXlzbWl0aF0uIEZpZ3VyZXMgXEByZWYoZmlnOmRhZzEpIGFuZCBcQHJlZihmaWc6ZGFnMikgcmVwcmVzZW50IHRoZSBEQUdzIGZvciB0aGUgcHJvcG9zZWQgYW5hbHlzaXMuIA0KDQpgYGB7ciBkYWcxLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iRGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCAoREFHKSBvZiB0aGUgTVIgYW5hbHlzaXMgdG8gaW52ZXN0aWdhdGUgdGhlIGVmZmVjdCBvZiBMREwgdG8gaXNjaGVtaWMgc3Ryb2tlLiJ9DQpEaWFncmFtbWVSOjpnclZpeigiDQogICAgICBkaWdyYXBoIG1yZGFnIHsNCg0KICAgICAgZ3JhcGggW3JhbmtkaXI9VEIsIGxheW91dD1uZWF0b10NCg0KICAgICAgbm9kZSBbc2hhcGU9Ym94LGVpZ2h0PTAuMywgd2lkdGg9MC4zXQ0KICAgICAgVSBbbGFiZWw9J0NvbmZvdW5kZXJzJywgcG9zPSczLDEhJ10NCiAgICAgIA0KICAgICAgbm9kZSBbc2hhcGU9Ym94LCBoZWlnaHQ9MC41LCB3aWR0aD0wLjVdDQogICAgICBZMSBbbGFiZWw9J0lzY2hlbWljIFN0cm9rZScsIHBvcz0nNCwwISddDQoNCiAgICAgIG5vZGUgW3NoYXBlPWJveCwgaGVpZ2h0PTAuMywgd2lkdGg9MC4zXQ0KICAgICAgRzEgW2xhYmVsPSdHQF97MX0nLCBwb3M9JzAsMSEnXQ0KCSAgICBHMiBbbGFiZWw9J0dAX3syfScsIHBvcz0nMCwwISddDQoJICAgIEczIFtsYWJlbD0nR0BfezN9JywgcG9zPScwLC0xISddDQogICAgICBYMSBbbGFiZWw9J0xETCcsIHBvcz0nMiwwISddDQogICAgICANCiAgICAgIHsgcmFuayA9IHNhbWU7ICBZMSB9DQoNCiAgICAgIEcxIC0+IHtYMX0NCgkgICAgRzIgLT4ge1gxfQ0KCSAgICBHMyAtPiB7WDF9DQogICAgICBVIC0+IFgxDQogICAgICBVIC0+IFkxDQogICAgICBYMSAtPiB7WTF9DQogICAgICANCiAgICAgIH0NCiAgICAgICIsIGhlaWdodCA9IDMwMCkNCmBgYA0KDQpgYGB7ciBkYWcyLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iREFHIHJlcHJlc2VudGluZyB0aGUgTVIgYW5hbHlzaXMgZm9yIHRoZSBlZmZlY3Qgb2YgSERMIG9uIGlzY2hlbWljIHN0cm9rZS4ifQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KICAgICAgZGlncmFwaCBtcmRhZyB7DQoNCiAgICAgIGdyYXBoIFtyYW5rZGlyPVRCLCBsYXlvdXQ9bmVhdG9dDQoNCiAgICAgIG5vZGUgW3NoYXBlPWJveCxlaWdodD0wLjMsIHdpZHRoPTAuM10NCiAgICAgIFUgW2xhYmVsPSdDb25mb3VuZGVycycsIHBvcz0nMywxISddDQogICAgICANCiAgICAgIG5vZGUgW3NoYXBlPWJveCwgaGVpZ2h0PTAuNSwgd2lkdGg9MC41XQ0KICAgICAgWTEgW2xhYmVsPSdJc2NoZW1pYyBTdHJva2UnLCBwb3M9JzQsMCEnXQ0KDQogICAgICBub2RlIFtzaGFwZT1ib3gsIGhlaWdodD0wLjMsIHdpZHRoPTAuM10NCiAgICAgIEcxIFtsYWJlbD0nR0BfezF9JywgcG9zPScwLDEhJ10NCgkgICAgRzIgW2xhYmVsPSdHQF97Mn0nLCBwb3M9JzAsMCEnXQ0KCSAgICBHMyBbbGFiZWw9J0dAX3szfScsIHBvcz0nMCwtMSEnXQ0KICAgICAgWDEgW2xhYmVsPSdIREwnLCBwb3M9JzIsMCEnXQ0KICAgICAgDQogICAgICB7IHJhbmsgPSBzYW1lOyAgWTEgfQ0KDQogICAgICBHMSAtPiB7WDF9DQoJICAgIEcyIC0+IHtYMX0NCgkgICAgRzMgLT4ge1gxfQ0KICAgICAgVSAtPiBYMQ0KICAgICAgVSAtPiBZMQ0KICAgICAgWDEgLT4ge1kxfQ0KICAgICAgDQogICAgICB9DQogICAgICAiLCBoZWlnaHQgPSAzMDApDQpgYGANCg0KT25lIGNhdXNlIG9mIGlzY2hhZW1pYyBzdHJva2UgaXMgdGhlIGRldmVsb3BtZW50IG9mIGF0aGVyb3NjbGVyb3NpcywgaW4gd2hpY2ggYnVpbGQtdXAgb2YgZmF0dHkgZGVwb3NpdHMgaW4gdGhlIGFydGVyaWFsIHdhbGwgbGVhZHMgdG8gZGV2ZWxvcG1lbnQgb2YgYSBwbGFxdWUsIHdoaWNoIGNhbiBkaXNydXB0IHRoZSBzdXBwbHkgb2Ygb3h5Z2VuYXRlZCBibG9vZCBmbG93IHRvIHRoZSBicmFpbi4gVGhlcmUgaXMgc3Ryb25nIGV2aWRlbmNlIHRoYXQgTERMLXJlbGF0ZWQgbGlwaWQgcGhlbm90eXBlcyBhcmUgY2F1c2FsbHkgaW1wbGljYXRlZCBpbiB0aGUgYWV0aW9sb2d5IG9mIGF0aGVyb3NjbGVyb3NpcyBhbmQgY29yb25hcnkgaGVhcnQgZGlzZWFzZS4NCg0KSW4gYSByZWNlbnQgY29tbWVudCBwaWVjZSwgQGhvbG1lczIwMTlsZGwgZGlzY3Vzc2VkIHRoYXQgdGhlcmUgaXMgYSBzaXplIGRlcGVuZGVudCB0aHJlc2hvbGQgd2hlcmVieSBsaXBpZCBzcGVjaWVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIHNtYWxsIFZMRExzLCBhcmUgdG9vIGxhcmdlIHRvIGVudGVyIHRoZSBhcnRlcmlhbCBpbnRpbWEsIGFzIHNob3duIGluIEZpZ3VyZSBcQHJlZihmaWc6aG9sbWVzMjAxOWZpZzEpLiBUaGVyZWZvcmUsIGluIG91ciBhbmFseXNpcyB3ZSBmb2N1c2VkIG91ciBpbnZlc3RpZ2F0aW9uIG9uIHRob3NlIGxpcGlkIHNwZWNpZXMgc21hbGxlciB0aGFuIHNtYWxsIFZMREw6IGkuZS4gSURMIGFuZCBMREwuIEluIGFkZGl0aW9uLCB3ZSB3aXNoZWQgdG8gYXNzZXNzIHRoZSBjYXVzYWwgcmVsZXZhbmNlIG9mIEhETCBzcGVjaWVzLg0KDQpgYGB7ciwgaG9sbWVzMjAxOWZpZzEsIGZpZy5jYXA9J0ZpZ3VyZSAxIG9mIEBob2xtZXMyMDE5bGRsIHNob3dpbmcgd2hpY2ggc2l6ZXMgb2YgbGlwaWQgdHJhaXQgZW50ZXIgdGhlIGFydGVyaWFsIGludGltYS4nLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJob2xtZXMtbnJjLTIwMTktZmlnMS5wbmciKQ0KYGBgDQoNCiMgRGF0YQ0KDQpUaGUgTVIgQ2hhbGxlbmdlIGRhdGEgY29uc2lzdHMgb2Ygc3VtbWFyeSBkYXRhIG9mIHRoZSBhc3NvY2lhdGlvbiBvZiAxNDggZ2Vub3R5cGVzIHdpdGggMTE4IGxpcGlkIHRyYWl0cyBhbmQgNyBvdXRjb21lcy4gV2UgaGF2ZSB0cmltbWVkIHRoZSBudW1iZXIgb2YgZXhwb3N1cmVzIHVzZWQuIE91ciBsb3ctZGVuc2l0eSBsaXBvcHJvdGVpbiAoTERMKSBhbmFseXNpcyBjb25zaXN0cyBvZiAxMSBleHBvc3VyZXMgd2hpbHN0IHdlIGhhdmUgdXNlZCAxNCBsaXBpZCB0cmFpdHMgYXNzb2NpYXRlZCB3aXRoIGhpZ2gtZGVuc2l0eSBsaXBvcHJvdGVpbnMgKEhETCkuIA0KDQpUaGUgYXRoZXJvZ2VuaWMgbGlwaWQgdHJhaXRzIHdlIGludmVzdGlnYXRlZCBhcmU7DQoNCiAgKiBDb25jZW50cmF0aW9uIG9mIElETCBwYXJ0aWNsZXMNCiAgKiBGcmVlIGNob2xlc3Rlcm9sIGluIElETA0KICAqIENob2xlc3Rlcm9sIGVzdGVycyBpbiBsYXJnZSBMREwNCiAgKiBGcmVlIGNob2xlc3Rlcm9sIGluIGxhcmdlIExETA0KICAqIFBob3NwaG9saXBpZHMgaW4gSURMDQogICogQ29uY2VudHJhdGlvbiBvZiBMYXJnZSBMREwgcGFydGljbGVzDQogICogUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBMREwNCiAgKiBDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbWVkaXVtIExETA0KICAqIENvbmNlbnRyYXRpb24gb2YgbWVkaXVtIExETCBwYXJ0aWNsZXMNCiAgKiBQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBMREwNCiAgKiBDb25jZW50cmF0aW9uIG9mIHNtYWxsIExETCBwYXJ0aWNsZXMuDQoNClRoZSBsaXBpZCB0cmFpdHMgcmVsYXRlZCB0byBIREwgdGhhdCB3ZSBpbnZlc3RpZ2F0ZWQgYXJlOw0KDQogICogQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIGxhcmdlIEhETCAgICAgICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiBsYXJnZSBIREwgcGFydGljbGVzDQogICogUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBIREwgDQogICogQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBIREwgICAgICAgICAgDQogICogRnJlZSBjaG9sZXN0ZXJvbCBpbiBtZWRpdW0gSERMICAgICAgICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gSERMIHBhcnRpY2xlcyAgICAgDQogICogUGhvc3Bob2xpcGlkcyBpbiBtZWRpdW0gSERMICAgICAgICAgICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBIREwgcGFydGljbGVzICAgICAgDQogICogVHJpZ2x5Y2VyaWRlcyBpbiBzbWFsbCBIREwNCiAgKiBDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gdmVyeSBsYXJnZSBIREwgICAgICANCiAgKiBGcmVlIGNob2xlc3Rlcm9sIGluIHZlcnkgbGFyZ2UgSERMICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiB2ZXJ5IGxhcmdlIEhETCBwYXJ0aWNsZXMgDQogICogUGhvc3Bob2xpcGlkcyBpbiB2ZXJ5IGxhcmdlIEhETCAgICAgICAgICAgDQogICogVHJpZ2x5Y2VyaWRlcyBpbiB2ZXJ5IGxhcmdlIEhETC4NCg0KIyBBbmFseXNpcyBNZXRob2RzDQoNCldlIHVzZWQgdGhlIGludmVyc2UgdmFyaWFuY2Ugd2VpZ2h0ZWQgKElWVykgbWV0aG9kIHRvIGVzdGltYXRlIHRoZSBjYXVzYWwgZWZmZWN0IGluIHN1bW1hcnktbGV2ZWwgZGF0YSBbQGJ1cmdlc3MyMDEzbWVuZGVsaWFuXS4gVGhlIElWVyBtb2RlbCBpcyBkZW5vdGVkIGluIGVxdWF0aW9uIFxAcmVmKGVxOklWVykgd2hlcmUgZm9yIGEgZ2Vub3R5cGUgJGokLCAkXHdpZGVoYXRcR2FtbWFfaiQgcmVwcmVzZW50cyB0aGUgZXN0aW1hdGVkIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb25zLCAkXHdpZGVoYXRcZ2FtbWFfaiQgcmVwcmVzZW50cyB0aGUgZXN0aW1hdGVkIGdlbm90eXBlLXBoZW5vdHlwZSBhc3NvY2lhdGlvbnMsIGFuZCAkXHNpZ21hX3t5an0kIHJlcHJlc2VudHMgdGhlIGVzdGltYXRlZCBzdGFuZGFyZCBlcnJvcnMgb2YgdGhlIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb25zLg0KDQokJA0KXGZyYWN7XGhhdHtcR2FtbWF9X3tqfX17XHNpZ21hX3t5X2p9fSA9IFxmcmFje1xiZXRhXGdhbW1hX2p9e1xzaWdtYV97eV9qfX0gKyBcdmFyZXBzaWxvbl9qLCBccXVhZCBcdmFyZXBzaWxvbl9qIFxzaW0gTigwLDEpDQooXCNlcTpJVlcpDQokJA0KDQpXZSBwZXJmb3JtIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGZvciBvdXIgSVZXIGVzdGltYXRlcyB1c2luZyB0aGUgTVItRWdnZXIgbW9kZWwgW0Bib3dkZW4yMDE1bWVuZGVsaWFuXS4gVGhlIE1SLUVnZ2VyIG1vZGVsIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgSVZXIG1vZGVsIFxAcmVmKGVxOklWVykgd2hpY2ggaW5jbHVkZXMgdGhlIGF2ZXJhZ2UgcGxlaW90cm9waWMgZWZmZWN0IGFzIGFuIGludGVyY2VwdC4gQnkgY29udmVudGlvbiB0aGUgcmVzaWR1YWwgdmFyaWFuY2UgaXMgY29uc3RyYWluZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDEsIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdCB0aGUgTVItRWdnZXIgbW9kZWwgZ2l2ZXMgbGFyZ2VyIHN0YW5kYXJkIGVycm9ycyBvbiBpdHMgZXN0aW1hdGVkIGNhdXNhbCBlZmZlY3QgdGhhbiB0aGUgSVZXIG1vZGVsLiBFcXVhdGlvbiBcQHJlZihlcTplZ2dlcikgZGVub3RlcyB0aGUgTVItRWdnZXIgbW9kZWwuDQoNCiQkDQpcZnJhY3tcaGF0e1xHYW1tYX1fe2p9fXtcc2lnbWFfe3lfan19ID0gXGZyYWN7XGJldGFfMH17XHNpZ21hX3t5X2p9fSArIFxmcmFje1xiZXRhXGdhbW1hX2p9e1xzaWdtYV97eV9qfX0gKyBcdmFyZXBzaWxvbl9qLCBccXVhZCBcdmFyZXBzaWxvbl9qIFxzaW0gTigwLFxzaWdtYV4yKQ0KKFwjZXE6ZWdnZXIpDQokJA0KV2UgYWxzbyBpbnZlc3RpZ2F0ZWQgY2F1c2FsIGVmZmVjdHMgb2YgbGlwaWQgdHJhaXRzIGFkanVzdGVkIGZvciBvdGhlciB0cmFpdHMgdXNpbmcgdGhlIG11bHRpdmFyaWFibGUgTVIgKE1WTVIpIG1ldGhvZCBbQGJ1cmdlc3MyMDE1cmVdIGFzIHNob3duIGluIGVxdWF0aW9uIFxAcmVmKGVxOm12bXJyKS4NCiQkDQpcaGF0e1xHYW1tYX1faiA9IFxiZXRhXzFcaGF0e1xnYW1tYX1fezEsan0gKyBcYmV0YV8yXGhhdHtcZ2FtbWF9X3syLGp9ICsgXHZhcmVwc2lsb25faiwgXHF1YWQgXHZhcmVwc2lsb25faiBcc2ltIE4oMCxcc2lnbWFeMikuDQooXCNlcTptdm1ycikNCiQkDQoNClRvIHNlbGVjdCB3aGljaCBvZiB0aGUgMTQ4IGdlbm90eXBlcyB0byBpbmNsdWRlIGluIG91ciBhbmFseXNpcyB3ZSB0b29rIHR3byBhcHByb2FjaGVzOg0KDQppLiBXZSBzZWxlY3RlZCBnZW5vdHlwZXMgd2l0aCBnZW5vbWUtd2lkZSBzaWduaWZpY2FudCBwLXZhbHVlcyAoJHAgPCA1IFx0aW1lcyAxMF57LTh9JCkgd2l0aCB0aGUgc3BlY2lmaWMgbGlwaWQgdHJhaXQgb2YgaW50ZXJlc3QuIFRoZXNlIHJlc3VsdHMgYXJlIGluIFtTZWN0aW9uIDRdKCNzZWN0aW9uNCk7DQppaS4gV2UgYWxzbyBzZWxlY3RlZCBnZW5vdHlwZXMgYmFzZWQgdXBvbiB0aGVpciBpbmRpdmlkdWFsIGNvbnRyaWJ1dGlvbiB0b3dhcmRzIHRoZSBRLXN0YXRpc3RpYywgZm9yIGVpdGhlciB0aGUgSVZXIG9yIE1SLUVnZ2VyIG1vZGVsIFtAYm93ZGVuMjAxOGltcHJvdmluZ10uIFRoZXJlZm9yZSwgaW4gdGhpcyBjYXNlIHdlIHNlbGVjdGVkIGdlbm90eXBlcyB3aXRoIFEtc3RhdGlzdGljIHAtdmFsdWVzICRcZ2VxIDAuMDUkLiBUaGVzZSByZXN1bHRzIGFyZSBpbiBbU2VjdGlvbiA1XSgjc2VjdGlvbjUpLg0KDQpXZSBpbnZlc3RpZ2F0ZWQgdGhlIGNhdXNhbCBlZmZlY3Qgb2YgZWFjaCBzZWxlY3RlZCBsaXBpZCB0cmFpdCBhbmQgd2UgdGhlbiBwZXJmb3JtIGEgbWV0YS1hbmFseXNpcyBvdXIgY2F1c2FsIGVmZmVjdCBlc3RpbWF0ZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHNpemUgYW5kIHRoZWlyIHNwZWNpZmljIHRyYWl0Lg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMgRnVuY3Rpb25zICMjIyMjIyMjIyMNCg0KI0Z1bmN0aW9uIGZvciBHV0FTIHNpZ25pZmljYW50IHNucHMNCnNpZXZlIDwtIGZ1bmN0aW9uKHhiZXRhLHB2YWwseWJldGEseXNlKXsNCiAgZGYgPSBjYmluZCh4YmV0YSxwdmFsLHliZXRhLHlzZSkNCiAgZGF0ID0gc3Vic2V0KGRmLCBwdmFsIDwgNWUtOCwgc2VsZWN0ID0gYyh4YmV0YSxwdmFsLHliZXRhLHlzZSkpDQogIGRhdDIgPSBuYS5leGNsdWRlKGRhdCkNCiAgcmV0dXJuKGRhdDIpDQp9DQoNCiNGdW5jdGlvbiBmb3IgSVZXDQppdncgPC0gZnVuY3Rpb24oeCwgeHNlLCB5LCB5c2UpIHsNCiAgZGF0ID0gbXJfaW5wdXQoeCwgeHNlLCB5LCB5c2UpDQogIG1yaXZ3ID0gTWVuZGVsaWFuUmFuZG9taXphdGlvbjo6bXJfaXZ3KGRhdCkNCiAgZXN0ID0gbXJpdndARXN0aW1hdGUNCiAgc2UgPSBtcml2d0BTdGRFcnJvcg0KICBMQ0kgPSBtcml2d0BDSUxvd2VyDQogIFVDSSA9IG1yaXZ3QENJVXBwZXINCiAgUHZhbCA9IG1yaXZ3QFB2YWx1ZQ0KICBzbnBzID0gbXJpdndAU05Qcw0KICBhbnMgPSBjKGVzdCwgc2UsIExDSSwgVUNJLCBQdmFsLCBzbnBzKQ0KICBhbnMgPSByb3VuZChhbnMsIGRpZ2l0cyA9IDQpDQogIHJldHVybihhbnMpDQp9DQoNCiNGdW5jdGlvbiBmb3IgTVItRWdnZXINCm1yZWdnZXIgPC0gZnVuY3Rpb24oeCwgeHNlLCB5LCB5c2UpIHsNCiAgZGF0ID0gbXJfaW5wdXQoeCwgeHNlLCB5LCB5c2UpDQogIG1yZWdnZXIgPSBNZW5kZWxpYW5SYW5kb21pemF0aW9uOjptcl9lZ2dlcihkYXQpDQogIGludCA9IG1yZWdnZXJASW50ZXJjZXB0DQogIGludF9zZSA9IG1yZWdnZXJAU3RkRXJyb3IuSW50DQogIGludF9MSSA9IG1yZWdnZXJAQ0lMb3dlci5JbnQNCiAgaW50X1VJID0gbXJlZ2dlckBDSVVwcGVyLkludA0KICBpbnRfcHZhbCA9IG1yZWdnZXJAUHZhbHVlLkludA0KICBlc3QgPSBtcmVnZ2VyQEVzdGltYXRlDQogIHNlID0gbXJlZ2dlckBTdGRFcnJvci5Fc3QNCiAgTENJID0gbXJlZ2dlckBDSUxvd2VyLkVzdA0KICBVQ0kgPSBtcmVnZ2VyQENJVXBwZXIuRXN0DQogIGVzdF9wdmFsID0gbXJlZ2dlckBQdmFsdWUuRXN0DQogIEF2Z1BsZWlvID0gYyhpbnQsIGludF9zZSxpbnRfTEksaW50X1VJLGludF9wdmFsKQ0KICBDYXVzYWwgPSBjKGVzdCwgc2UsIExDSSwgVUNJLCBlc3RfcHZhbCkNCiAgYW5zID0gcmJpbmQoQXZnUGxlaW8sQ2F1c2FsKQ0KICByZXR1cm4oYW5zKQ0KfQ0KDQojIyBTZWxlY3RpbmcgZ2VuZXRpYyB2YXJpYW50cyBiYXNlZCBvbiB0aGVpciBpbmRpdmlkdWFsIGNvbnRyaWJ1dGlvbiB0byBRLXN0YXRpc3RpY3MNCg0Kc2VsZWN0c25wPC0gZnVuY3Rpb24ocnNpZCx4YmV0YSx5YmV0YSx5c2Upew0KICANCiAgZGF0ID0gZGF0YS5mcmFtZShyc2lkLHhiZXRhLHliZXRhLHlzZSkNCiAgI2RhdCA9IG5hLmV4Y2x1ZGUoZGF0KQ0KICANCiAgIyByYXRpbyBlc3RpbWF0ZQ0KICByYXRpbyA9IHliZXRhL3hiZXRhDQogICMgZmlyc3Qgb3JkZXIgd2VpZ2h0cw0KICB3ZWlnaHQgPSAoeGJldGEveXNlKV4yDQogICMgTXVsdGlwbGljYXRpb24gb2Ygd2VpZ2h0cyBhbmQgcmF0aW8gZXN0aW1hdGUNCiAgcmF0d2VpZ2h0ID0gcmF0aW8gKiBzcXJ0KHdlaWdodCkNCiAgIyBFc3RpbWF0aW5nIGNhdXNhbGl0eSB1c2luZyBJVlcNCiAgY2F1c2FsID0gc3VtbWFyeShsbShyYXR3ZWlnaHQgfiAwICsgc3FydCh3ZWlnaHQpKSkkY29lZlsxXQ0KICAjIENhbGN1bGF0aW5nIGluZGl2aWR1YWwgUS1zdGF0aXN0aWNzDQogIFFqID0gd2VpZ2h0ICogKHJhdGlvIC0gY2F1c2FsKV4yDQogICMgRGVmaW5lIGNoaS1zcXVhcmUgdGVzdCANCiAgY2hpX1FqID0gMA0KICAjIENoaS1zcXVhcmVkIHRlc3QgZm9yIGVhY2ggUS1zdGF0cw0KICBmb3IoIGkgaW4gMTpsZW5ndGgoUWopKXsNCiAgICBjaGlfUWpbaV0gPSBwY2hpc3EoUWpbaV0sMSxsb3dlci50YWlsID0gRkFMU0UpDQogIH0NCiAgDQogIA0KICAgIyBpbmRpY2F0aW5nIG91dGxpZXIgZm9yIGVhY2ggUS1zdGF0cw0KICAgIyBvdXRsaWVyIDwtIHJlcCgwLGxlbmd0aChkYXRbLDJdKSkNCiAgIA0KICAgZGF0JFFqIDwtIFFqDQogICBkYXQkY2hpX1FqIDwtIGNoaV9Rag0KICAgZGF0JG91dGxpZXIgPC0gcmVwKDAsbGVuZ3RoKGRhdFssMV0pKQ0KICAgDQogICBkYXQgPSBuYS5leGNsdWRlKGRhdCkNCiAgIA0KICAgYWxwaGEgPSAwLjA1DQoNCiAgIGZvciAoaSBpbiAxOmxlbmd0aChkYXRbLDFdKSl7DQogICAgIGlmKGRhdCRjaGlfUWpbaV08YWxwaGEpIHsNCiAgICAgICBkYXQkb3V0bGllcltpXSA8LSAxDQogICAgIH0NCiAgIH0NCg0KICAjIEV4dHJhY3Rpbmcgbm9uLW91dGxpZXJzIGJhc2VkIG9uIHRoZWlyIFEgY29udHJpYnV0aW9uDQogICBkYXQkT3V0bGllcjwtZmFjdG9yKGRhdCRvdXRsaWVyKQ0KICAgbGV2ZWxzKGRhdCRPdXRsaWVyKVtsZXZlbHMoZGF0JE91dGxpZXIpPT0iMCJdIDwtICJWYXJpYW50Ig0KICAgbGV2ZWxzKGRhdCRPdXRsaWVyKVtsZXZlbHMoZGF0JE91dGxpZXIpPT0iMSJdIDwtICJPdXRsaWVyIg0KICAgDQogICANCiAgZGF0X291dCA9IHN1YnNldChkYXQsIE91dGxpZXIgPT0gIlZhcmlhbnQiKQ0KDQogIHJldHVybihkYXRfb3V0KQ0KfQ0KDQojIyBzaWV2aW5nIHNucHMgd2l0aCBHV0FTIHNpZ25maWNhbnQgdmFsdWVzDQpsZGxfbWF0MTwtc2lldmUobGRsX3hiZXRhWywxXSxsZGxfcHZhbFssMV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQyPC1zaWV2ZShsZGxfeGJldGFbLDJdLGxkbF9wdmFsWywyXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsX21hdDM8LXNpZXZlKGxkbF94YmV0YVssM10sbGRsX3B2YWxbLDNdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxfbWF0NDwtc2lldmUobGRsX3hiZXRhWyw0XSxsZGxfcHZhbFssNF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQ1PC1zaWV2ZShsZGxfeGJldGFbLDVdLGxkbF9wdmFsWyw1XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsX21hdDY8LXNpZXZlKGxkbF94YmV0YVssNl0sbGRsX3B2YWxbLDZdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxfbWF0Nzwtc2lldmUobGRsX3hiZXRhWyw3XSxsZGxfcHZhbFssN10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQ4PC1zaWV2ZShsZGxfeGJldGFbLDhdLGxkbF9wdmFsWyw4XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsX21hdDk8LXNpZXZlKGxkbF94YmV0YVssOV0sbGRsX3B2YWxbLDldLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxfbWF0MTA8LXNpZXZlKGxkbF94YmV0YVssMTBdLGxkbF9wdmFsWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQxMTwtc2lldmUobGRsX3hiZXRhWywxMV0sbGRsX3B2YWxbLDExXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KDQpoZGxfbWF0MTwtc2lldmUoaGRsX3hiZXRhWywxXSxoZGxfcHZhbFssMV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQyPC1zaWV2ZShoZGxfeGJldGFbLDJdLGhkbF9wdmFsWywyXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDM8LXNpZXZlKGhkbF94YmV0YVssM10saGRsX3B2YWxbLDNdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0NDwtc2lldmUoaGRsX3hiZXRhWyw0XSxoZGxfcHZhbFssNF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQ1PC1zaWV2ZShoZGxfeGJldGFbLDVdLGhkbF9wdmFsWyw1XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDY8LXNpZXZlKGhkbF94YmV0YVssNl0saGRsX3B2YWxbLDZdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0Nzwtc2lldmUoaGRsX3hiZXRhWyw3XSxoZGxfcHZhbFssN10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQ4PC1zaWV2ZShoZGxfeGJldGFbLDhdLGhkbF9wdmFsWyw4XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDk8LXNpZXZlKGhkbF94YmV0YVssOV0saGRsX3B2YWxbLDldLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0MTA8LXNpZXZlKGhkbF94YmV0YVssMTBdLGhkbF9wdmFsWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQxMTwtc2lldmUoaGRsX3hiZXRhWywxMV0saGRsX3B2YWxbLDExXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDEyPC1zaWV2ZShoZGxfeGJldGFbLDEyXSxoZGxfcHZhbFssMTJdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0MTM8LXNpZXZlKGhkbF94YmV0YVssMTNdLGhkbF9wdmFsWywxM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQxNDwtc2lldmUoaGRsX3hiZXRhWywxNF0saGRsX3B2YWxbLDE0XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KDQojIFNlbGVjdGluZyBpbnN0cnVtZW50cyB1c2luZyB0aGVpciBpbmRpdmlkdWFsIFEtc3RhdGlzdGljcyBMRExzDQpsZGxzbnBzX1E8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWywxXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsc25wc19RMTwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxsZGxfeGJldGFbLDJdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxzbnBzX1EyPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTM8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWyw0XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsc25wc19RNDwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxsZGxfeGJldGFbLDVdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxzbnBzX1E1PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssNl0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTY8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWyw3XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsc25wc19RNzwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxsZGxfeGJldGFbLDhdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxzbnBzX1E4PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssOV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTk8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTEwPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssMTFdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQoNCiNIRExzDQpoZGxzbnBzX1E8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWywxXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RMTwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDJdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1EyPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTM8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWyw0XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RNDwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDVdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1E1PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssNl0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTY8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWyw3XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RNzwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDhdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1E4PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssOV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTk8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTEwPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssMTFdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1ExMTwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDEyXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RMTI8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWywxM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTEzPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssMTRdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpgYGANCg0KIyBSZXN1bHRzDQoNCiMjIEdXQVMtc2lnbmlmaWNhbnQgZ2Vub3R5cGUtcGhlbm90eXBlIGFzc29jaWF0aW9ucyB7I3NlY3Rpb240fQ0KDQojIyMgSVZXIGVzdGltYXRlcw0KDQpgYGB7cn0NCiMjIyBJVlcgZm9yIExETA0KbGRsX2l2dzE8LWl2dyhsZGxfbWF0MVssMV0sbGRsX21hdDFbLDFdLGxkbF9tYXQxWywzXSxsZGxfbWF0MVssNF0pDQpsZGxfaXZ3MjwtaXZ3KGxkbF9tYXQyWywxXSxsZGxfbWF0MlssMl0sbGRsX21hdDJbLDNdLGxkbF9tYXQyWyw0XSkNCmxkbF9pdnczPC1pdncobGRsX21hdDNbLDFdLGxkbF9tYXQzWywyXSxsZGxfbWF0M1ssM10sbGRsX21hdDNbLDRdKQ0KbGRsX2l2dzQ8LWl2dyhsZGxfbWF0NFssMV0sbGRsX21hdDRbLDJdLGxkbF9tYXQ0WywzXSxsZGxfbWF0NFssNF0pDQpsZGxfaXZ3NTwtaXZ3KGxkbF9tYXQ1WywxXSxsZGxfbWF0NVssMl0sbGRsX21hdDVbLDNdLGxkbF9tYXQ1Wyw0XSkNCmxkbF9pdnc2PC1pdncobGRsX21hdDZbLDFdLGxkbF9tYXQ2WywyXSxsZGxfbWF0NlssM10sbGRsX21hdDZbLDRdKQ0KbGRsX2l2dzc8LWl2dyhsZGxfbWF0N1ssMV0sbGRsX21hdDdbLDJdLGxkbF9tYXQ3WywzXSxsZGxfbWF0N1ssNF0pDQpsZGxfaXZ3ODwtaXZ3KGxkbF9tYXQ4WywxXSxsZGxfbWF0OFssMl0sbGRsX21hdDhbLDNdLGxkbF9tYXQ4Wyw0XSkNCmxkbF9pdnc5PC1pdncobGRsX21hdDlbLDFdLGxkbF9tYXQ5WywyXSxsZGxfbWF0OVssM10sbGRsX21hdDlbLDRdKQ0KbGRsX2l2dzEwPC1pdncobGRsX21hdDEwWywxXSxsZGxfbWF0MTBbLDJdLGxkbF9tYXQxMFssM10sbGRsX21hdDEwWyw0XSkNCmxkbF9pdncxMTwtaXZ3KGxkbF9tYXQxMVssMV0sbGRsX21hdDExWywyXSxsZGxfbWF0MTFbLDNdLGxkbF9tYXQxMVssNF0pDQoNCnRhYiA8LSByYmluZChsZGxfaXZ3MSxsZGxfaXZ3MixsZGxfaXZ3MyxsZGxfaXZ3NCxsZGxfaXZ3NSxsZGxfaXZ3NixsZGxfaXZ3NyxsZGxfaXZ3OCxsZGxfaXZ3OSxsZGxfaXZ3MTAsbGRsX2l2dzExKQ0KbGlwaWRfdHJhaXRzIDwtIGMoDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIElETCIsICAgICAgICAgICAgICAgICAgICANCiAgIkNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyIsICAgICAgICAgICANCiAgIlBob3NwaG9saXBpZHMgaW4gSURMIiwgICAgICAgICAgICAgICAgICAgICAgIA0KICAiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIGxhcmdlIExETCIsDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIGxhcmdlIExETCIsDQogICJDb25jZW50cmF0aW9uIG9mIGxhcmdlIExETCBwYXJ0aWNsZXMiLA0KICAiUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBMREwiLA0KICAiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBMREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gTERMIHBhcnRpY2xlcyIsDQogICJQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBMREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBMREwgcGFydGljbGVzIg0KICApDQoNCnRhYiA8LSBjYmluZCAobGlwaWRfdHJhaXRzLHVubmFtZSh0YWIpKQ0KY29sbmFtZXModGFiKSA8LSBjKCJFeHBvc3VyZXMiLCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCAiUHZhbCIsIlNOUHMiKQ0KDQojIyMgSERMcyMjDQpoZGxfaXZ3MTwtaXZ3KGhkbF9tYXQxWywxXSxoZGxfbWF0MVssMl0saGRsX21hdDFbLDNdLGhkbF9tYXQxWyw0XSkNCmhkbF9pdncyPC1pdncoaGRsX21hdDJbLDFdLGhkbF9tYXQyWywyXSxoZGxfbWF0MlssM10saGRsX21hdDJbLDRdKQ0KaGRsX2l2dzM8LWl2dyhoZGxfbWF0M1ssMV0saGRsX21hdDNbLDJdLGhkbF9tYXQzWywzXSxoZGxfbWF0M1ssNF0pDQpoZGxfaXZ3NDwtaXZ3KGhkbF9tYXQ0WywxXSxoZGxfbWF0NFssMl0saGRsX21hdDRbLDNdLGhkbF9tYXQ0Wyw0XSkNCmhkbF9pdnc1PC1pdncoaGRsX21hdDVbLDFdLGhkbF9tYXQ1WywyXSxoZGxfbWF0NVssM10saGRsX21hdDVbLDRdKQ0KaGRsX2l2dzY8LWl2dyhoZGxfbWF0NlssMV0saGRsX21hdDZbLDJdLGhkbF9tYXQ2WywzXSxoZGxfbWF0NlssNF0pDQpoZGxfaXZ3NzwtaXZ3KGhkbF9tYXQ3WywxXSxoZGxfbWF0N1ssMl0saGRsX21hdDdbLDNdLGhkbF9tYXQ3Wyw0XSkNCmhkbF9pdnc4PC1pdncoaGRsX21hdDhbLDFdLGhkbF9tYXQ4WywyXSxoZGxfbWF0OFssM10saGRsX21hdDhbLDRdKQ0KaGRsX2l2dzk8LWl2dyhoZGxfbWF0OVssMV0saGRsX21hdDlbLDJdLGhkbF9tYXQ5WywzXSxoZGxfbWF0OVssNF0pDQpoZGxfaXZ3MTA8LWl2dyhoZGxfbWF0MTBbLDFdLGhkbF9tYXQxMFssMl0saGRsX21hdDEwWywzXSxoZGxfbWF0MTBbLDRdKQ0KaGRsX2l2dzExPC1pdncoaGRsX21hdDExWywxXSxoZGxfbWF0MTFbLDJdLGhkbF9tYXQxMVssM10saGRsX21hdDExWyw0XSkNCmhkbF9pdncxMjwtaXZ3KGhkbF9tYXQxMlssMV0saGRsX21hdDEyWywyXSxoZGxfbWF0MTJbLDNdLGhkbF9tYXQxMlssNF0pDQpoZGxfaXZ3MTM8LWl2dyhoZGxfbWF0MTNbLDFdLGhkbF9tYXQxM1ssMl0saGRsX21hdDEzWywzXSxoZGxfbWF0MTNbLDRdKQ0KaGRsX2l2dzE0PC1pdncoaGRsX21hdDE0WywxXSxoZGxfbWF0MTRbLDJdLGhkbF9tYXQxNFssM10saGRsX21hdDE0Wyw0XSkNCg0KdGFiMSA8LSByYmluZChoZGxfaXZ3MSxoZGxfaXZ3MixoZGxfaXZ3MyxoZGxfaXZ3NCxoZGxfaXZ3NSxoZGxfaXZ3NixoZGxfaXZ3NyxoZGxfaXZ3OCxoZGxfaXZ3OSxoZGxfaXZ3MTAsaGRsX2l2dzExLGhkbF9pdncxMixoZGxfaXZ3MTMsaGRsX2l2dzE0KQ0KdHJhaXRzIDwtIGMoDQogICJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbGFyZ2UgSERMIiwNCiAgIkNvbmNlbnRyYXRpb24gb2YgbGFyZ2UgSERMIHBhcnRpY2xlcyIsDQogICJQaG9zcGhvbGlwaWRzIGluIGxhcmdlIEhETCIsDQogICJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbWVkaXVtIEhETCIsDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIG1lZGl1bSBIREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gSERMIHBhcnRpY2xlcyIsDQogICJQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBIREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBIREwgcGFydGljbGVzIiwNCiAgIlRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIiwNCiAgIkNob2xlc3Rlcm9sIGVzdGVycyBpbiB2ZXJ5IGxhcmdlIEhETCIsDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIHZlcnkgbGFyZ2UgSERMIiwNCiAgIkNvbmNlbnRyYXRpb24gb2YgdmVyeSBsYXJnZSBIREwgcGFydGljbGVzIiwNCiAgIlBob3NwaG9saXBpZHMgaW4gdmVyeSBsYXJnZSBIREwiLA0KICAiVHJpZ2x5Y2VyaWRlcyBpbiB2ZXJ5IGxhcmdlIEhETCINCiAgKQ0KDQp0YWIxIDwtIGNiaW5kKHRyYWl0cywgdW5uYW1lKHRhYjEpKQ0KY29sbmFtZXModGFiMSkgPC0gYygiRXhwb3N1cmVzIiwiRXN0aW1hdGUiLCAiU0UiLCJMSSIsIlVJIiwgIlB2YWwiLCAiU05QcyIpDQpgYGANCg0KSVZXIGVzdGltYXRlcyBvZiB0aGUgY2F1c2FsIGVmZmVjdCBvZiBsaXBpZCBmcmFjdGlvbnMgcmVsYXRlZCB0byBMRExzIGFyZSBzaG93biBpbiBUYWJsZSBcQHJlZih0YWI6dGFiKSBhbmQgRmlndXJlIFxAcmVmKGZpZzpwbDEpLiBXZSBjYW4gc2VlIGZyb20gdGhlIFNOUHMgY29sdW1uIHRoYXQgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBTTlBzIGlzIHNtYWxsIGZvciBhbGwgdGhlIHRyYWl0cy4gVGhlIE1SIHBvaW50IGVzdGltYXRlcyBhcmUgcG9zaXRpdmUgd2hpY2ggbWVhbnMgdGhhdCBvbiBhdmVyYWdlIGEgaGlnaGVyIGxldmVsIG9mIExETCByZWxhdGVkIGxpcGlkIGlzIHJlbGF0ZWQgdG8gYSBoaWdoZXIgcmlzayBvZiBpc2NoZW1pYyBzdHJva2UgKHNpbmNlIHRoZSBhc3NvY2lhdGlvbnMgYXJlIHJpc2sgZXN0aW1hdGVzIG9uIHRoZSBsb2cgc2NhbGUpLiBIb3dldmVyLCB0aGUgZXN0aW1hdGVzIGFsbCByZXBvcnQgY29uZmlkZW5jZSBpbnRlcnZhbHMgc3Bhbm5pbmcgdGhlIG51bGwuIFRoZSBwb3NpdGl2ZSBwb2ludCBlc3RpbWF0ZXMgY29uY3VyIHdpdGggb3VyIHNjaWVudGlmaWMgZXhwZWN0YXRpb25zIGFzIHRoZSBhdGhlcm9nZW5pYyBjaGFyYWN0ZXJpc3RpYyBpbmNyZWFzZSB0aGUgcmlzayBvZiBpc2NoZW1pYyBzdHJva2UuIEhvd2V2ZXIsIG1vcmUgaW5zdHJ1bWVudHMgd291bGQgYmUgbmVlZGVkIHRvIGluY3JlYXNlIHRoZSBzdGF0aXN0aWNhbCBwb3dlciBvZiB0aGVzZSBlc3RpbWF0ZXMuIA0KDQpgYGB7ciB0YWIsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRhYiA8LSBhcy5kYXRhLmZyYW1lKHRhYikNCg0KdGFiICU+JQ0KICBtdXRhdGUoU05QcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTTlBzKSkgPCAyLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU05QcykpLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU05QcykpLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAid2hpdGUiKQ0KICApKSU+JQ0KICBtdXRhdGUoRXN0aW1hdGUgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSA8IDAsDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZSkpLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSwgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiSVZXIGVzdGltYXRlcyBmb3IgZXhwb3N1cmVzIHJlbGF0ZWQgTERMcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQoNCg0KYGBge3J9DQp0YWJ4IDwtDQogIHJiaW5kKA0KICAgIGxkbF9pdncxLA0KICAgIGxkbF9pdncyLA0KICAgIGxkbF9pdnczLA0KICAgIGxkbF9pdnc0LA0KICAgIGxkbF9pdnc1LA0KICAgIGxkbF9pdnc2LA0KICAgIGxkbF9pdnc3LA0KICAgIGxkbF9pdnc4LA0KICAgIGxkbF9pdnc5LA0KICAgIGxkbF9pdncxMCwNCiAgICBsZGxfaXZ3MTENCiAgKQ0KdGFiZyA8LQ0KICBkYXRhLmZyYW1lKA0KICAgIEVzdGltYXRlcyA9IHRhYnhbLCAxXSwNCiAgICBTRSA9IHRhYnhbLCAyXSwNCiAgICBMSSA9IHRhYnhbLCAzXSwNCiAgICBVSSA9IHRhYnhbLCA0XSwNCiAgICBleHBvc3VyZXMgPSBsaXBpZF90cmFpdHMNCiAgKQ0KDQpwbDEgPC0NCiAgZ2dwbG90KCkgKyBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IHRhYmcsIGFlcygNCiAgICB4ID0gZXhwb3N1cmVzLA0KICAgIHkgPSBFc3RpbWF0ZXMsDQogICAgeW1pbiA9IExJLA0KICAgIHltYXggPSBVSQ0KICApKSArIHhsYWIoIkV4cG9zdXJlcyIpICsgeWxhYigiRXN0aW1hdGVzIikgKyBnZ3RpdGxlKCJMRExzIikgKyBjb29yZF9mbGlwKCkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbHR5ID0gMikNCmBgYA0KDQpgYGB7ciwgcGwxLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iSVZXIEVzdGltYXRlcyBmb3IgTERMcyJ9DQpwbDENCmBgYA0KDQpUYWJsZSBcQHJlZih0YWI6dGFiMSkgYW5kIEZpZ3VyZSBcQHJlZihmaWc6cGwyKSBzaG93IGNhdXNhbCBlc3RpbWF0ZXMgb2YgbGlwaWQgZnJhY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIEhETHMuIFRoZXNlIHBvaW50IGVzdGltYXRlcyBhcmUgZ2VuZXJhbGx5IG5lZ2F0aXZlIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMgc3Bhbm5pbmcgdGhlIG51bGwuIEluIHRoZSBUYWJsZSBzaGFkZWQgY2VsbHMgaW5kaWNhdGUgYSBzbWFsbCBudW1iZXIgb2YgZ2Vub3R5cGVzLCB3aGljaCBpcyBvZiBpbnRlcmVzdCBiZWNhdXNlIHRoZSBNUi1FZ2dlciBlc3RpbWF0b3IgY2Fubm90IGJlIHBlcmZvcm1lZCB3aXRoIHRoZXNlIGxpcGlkIHRyYWl0cyBkdWUgdG8gdGhlIGxvdyBudW1iZXIgb2YgaW5zdHJ1bWVudHMuDQoNCmBgYHtyIHRhYjEsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRhYjEgPC0gYXMuZGF0YS5mcmFtZSh0YWIxKQ0KDQp0YWIxICU+JQ0KICBtdXRhdGUoU05QcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKFNOUHMpIDwgMywNCiAgY2VsbF9zcGVjKFNOUHMsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICJncmV5IiksDQogIGNlbGxfc3BlYyhTTlBzLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAid2hpdGUiKQ0KICApKSU+JQ0KICBtdXRhdGUoRXN0aW1hdGUgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSA+IDAuMDEsDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZSkpLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSwgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiSVZXIGVzdGltYXRlcyBmb3IgZXhwb3N1cmVzIHJlbGF0ZWQgSERMcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCnRhYngxIDwtIHJiaW5kKGhkbF9pdncxLGhkbF9pdncyLGhkbF9pdnczLGhkbF9pdnc0LGhkbF9pdnc1LGhkbF9pdnc2LGhkbF9pdnc3LGhkbF9pdnc4LGhkbF9pdnc5LGhkbF9pdncxMCxoZGxfaXZ3MTEsaGRsX2l2dzEyLGhkbF9pdncxMyxoZGxfaXZ3MTQpDQp0YWJnMSA8LSBkYXRhLmZyYW1lKEVzdGltYXRlcyA9IHRhYngxWywxXSwgU0UgPSB0YWJ4MVssMl0sIExJID0gdGFieDFbLDNdLCBVSSA9IHRhYngxWyw0XSwgZXhwb3N1cmVzID0gdHJhaXRzKQ0KDQpwbDIgPC0gZ2dwbG90KGRhdGE9dGFiZzEsIGFlcyh4PWV4cG9zdXJlcyx5PUVzdGltYXRlcywgeW1pbj1MSSwgeW1heD1VSSkpICsgZ2VvbV9wb2ludHJhbmdlKCkgK3hsYWIoIkV4cG9zdXJlcyIpKyB5bGFiKCJFc3RpbWF0ZXMiKSArIGdndGl0bGUoIkhETHMiKSArIGNvb3JkX2ZsaXAoKSArIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsdHk9MikNCmBgYA0KDQpgYGB7ciwgcGwyLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iSVZXIEVzdGltYXRlcyBmb3IgSERMcyJ9DQpwbDINCmBgYA0KDQojIyMgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KbGRsX21yZWdnZXIxPC1tcmVnZ2VyKGxkbF9tYXQxWywxXSxsZGxfbWF0MVssMl0sbGRsX21hdDFbLDNdLGxkbF9tYXQxWyw0XSkNCmxkbF9tcmVnZ2VyMjwtbXJlZ2dlcihsZGxfbWF0MlssMV0sbGRsX21hdDJbLDJdLGxkbF9tYXQyWywzXSxsZGxfbWF0MlssNF0pDQpsZGxfbXJlZ2dlcjM8LW1yZWdnZXIobGRsX21hdDNbLDFdLGxkbF9tYXQzWywyXSxsZGxfbWF0M1ssM10sbGRsX21hdDNbLDRdKQ0KbGRsX21yZWdnZXI0PC1tcmVnZ2VyKGxkbF9tYXQ0WywxXSxsZGxfbWF0NFssMl0sbGRsX21hdDRbLDNdLGxkbF9tYXQ0Wyw0XSkNCmxkbF9tcmVnZ2VyNTwtbXJlZ2dlcihsZGxfbWF0NVssMV0sbGRsX21hdDVbLDJdLGxkbF9tYXQ1WywzXSxsZGxfbWF0NVssNF0pDQpsZGxfbXJlZ2dlcjY8LW1yZWdnZXIobGRsX21hdDZbLDFdLGxkbF9tYXQ2WywyXSxsZGxfbWF0NlssM10sbGRsX21hdDZbLDRdKQ0KbGRsX21yZWdnZXI3PC1tcmVnZ2VyKGxkbF9tYXQ3WywxXSxsZGxfbWF0N1ssMl0sbGRsX21hdDdbLDNdLGxkbF9tYXQ3Wyw0XSkNCmxkbF9tcmVnZ2VyODwtbXJlZ2dlcihsZGxfbWF0OFssMV0sbGRsX21hdDhbLDJdLGxkbF9tYXQ4WywzXSxsZGxfbWF0OFssNF0pDQpsZGxfbXJlZ2dlcjk8LW1yZWdnZXIobGRsX21hdDlbLDFdLGxkbF9tYXQ5WywyXSxsZGxfbWF0OVssM10sbGRsX21hdDlbLDRdKQ0KbGRsX21yZWdnZXIxMDwtbXJlZ2dlcihsZGxfbWF0MTBbLDFdLGxkbF9tYXQxMFssMl0sbGRsX21hdDEwWywzXSxsZGxfbWF0MTBbLDRdKQ0KbGRsX21yZWdnZXIxMTwtbXJlZ2dlcihsZGxfbWF0MTFbLDFdLGxkbF9tYXQxMVssMl0sbGRsX21hdDExWywzXSxsZGxfbWF0MTFbLDRdKQ0KDQp0YWJrIDwtIHJiaW5kKGxkbF9tcmVnZ2VyMSxsZGxfbXJlZ2dlcjIsbGRsX21yZWdnZXIzLGxkbF9tcmVnZ2VyNCxsZGxfbXJlZ2dlcjUsbGRsX21yZWdnZXI2LGxkbF9tcmVnZ2VyNyxsZGxfbXJlZ2dlcjgsbGRsX21yZWdnZXI5LGxkbF9tcmVnZ2VyMTAsbGRsX21yZWdnZXIxMSkNCmNvbG5hbWVzKHRhYmspIDwtIGMoIkVzdGltYXRlIiwgIlNFIiwiTEkiLCJVSSIsICJQdmFsIikNCg0KIyMjIEhETHMjIw0KaGRsX21yZWdnZXIxPC1tcmVnZ2VyKGhkbF9tYXQxWywxXSxoZGxfbWF0MVssMl0saGRsX21hdDFbLDNdLGhkbF9tYXQxWyw0XSkNCmhkbF9tcmVnZ2VyMjwtbXJlZ2dlcihoZGxfbWF0MlssMV0saGRsX21hdDJbLDJdLGhkbF9tYXQyWywzXSxoZGxfbWF0MlssNF0pDQpoZGxfbXJlZ2dlcjM8LW1yZWdnZXIoaGRsX21hdDNbLDFdLGhkbF9tYXQzWywyXSxoZGxfbWF0M1ssM10saGRsX21hdDNbLDRdKQ0KaGRsX21yZWdnZXI0PC1tcmVnZ2VyKGhkbF9tYXQxMVssMV0saGRsX21hdDExWywyXSxoZGxfbWF0MTFbLDNdLGhkbF9tYXQxMVssNF0pDQpoZGxfbXJlZ2dlcjU8LW1yZWdnZXIoaGRsX21hdDEzWywxXSxoZGxfbWF0MTNbLDJdLGhkbF9tYXQxM1ssM10saGRsX21hdDEzWyw0XSkNCg0KdGFiazEgPC0gcmJpbmQoaGRsX21yZWdnZXIxLGhkbF9tcmVnZ2VyMixoZGxfbXJlZ2dlcjMsaGRsX21yZWdnZXI0LGhkbF9tcmVnZ2VyNSkNCmNvbG5hbWVzKHRhYmsxKSA8LSBjKCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCAiUHZhbCIpDQpgYGANCg0KSW4gdGhpcyBzZWN0aW9uLCB3ZSB1c2UgdGhlIE1SLUVnZ2VyIG1vZGVsIHRvIHBlcmZvcm0gc2Vuc2l0aXZpdHkgYW5hbHlzaXMgZm9yIHRoZSBJVlcgZXN0aW1hdGVzLiBUYWJsZSBcQHJlZih0YWI6dGFiaykgc2hvd3MgZXN0aW1hdGVzIGZyb20gdGhlIE1SLUVnZ2VyIG1vZGVsIGZvciBsaXBpZCBmcmFjdGlvbnMgcmVsYXRlZCB0byBMRExzLiBJbiBnZW5lcmFsIHRoZSBwb2ludCBlc3RpbWF0ZXMgYXJlIHBvc2l0aXZlIGFuZCBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gdGhlIElWVyBlc3RpbWF0ZXMuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBwb2ludCBlc3RpbWF0ZSBmb3IgcGhvc3Bob2xpcGlkcyBpbiBtZWRpdW0gTERMLCB3aGljaCBzaG93cyBhIG5lZ2F0aXZlIGNhdXNhbCBlc3RpbWF0ZSB3aXRoIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBzcGFubmluZyB0aGUgbnVsbC4gV2UgZmluZCBubyBzdHJvbmcgZXZpZGVuY2UgYWdhaW5zdCB0aGUgbnVsbCBoeXBvdGhlc2lzIG9mIG5vIHBsZWlvdHJvcHksIHNpbmNlIHRoZSBlc3RpbWF0ZXMgb2YgdGhlIGludGVyY2VwdHMgKGBBdmdQbGVpb2ApIGFyZSBhbGwgY2xvc2UgdG8gdGhlIG51bGwgd2l0aCBsYXJnZSBwLXZhbHVlcy4NCg0KYGBge3IgdGFiaywgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9DQojIHRhYmUxIDwtIGthYmxlKHRhYjEsIGRpZ2l0cyA9IDMpDQojIGthYmxlX3N0eWxpbmcodGFiZTEsICJzdHJpcGVkIiwgcG9zaXRpb24gPSAiY2VudGVyIikNCg0Ka2FibGUodGFiaywgY2FwdGlvbiA9ICJNUi1FZ2dlciBlc3RpbWF0ZXMgZm9yIExETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUKSAlPiUNCiAgcGFja19yb3dzKCJGcmVlIGNob2xlc3Rlcm9sIGluIElETCIsIDEsIDIpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyIsIDMsIDQpICU+JQ0KICBwYWNrX3Jvd3MoIlBob3NwaG9saXBpZHMgaW4gSURMIiwgNSwgNikgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBJREwgcGFydGljbGVzIiwgNywgOCkgJT4lDQogIHBhY2tfcm93cygiRnJlZSBjaG9sZXN0ZXJvbCBpbiBsYXJnZSBMREwiLCA5LCAxMCkgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBsYXJnZSBMREwgcGFydGljbGVzIiwgMTEsIDEyKSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluIGxhcmdlIExETCIsIDEzLCAxNCkgJT4lDQogIHBhY2tfcm93cygiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBMREwiLCAxNSwgMTYpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgbWVkaXVtIExETCBwYXJ0aWNsZXMiLCAxNywgMTgpICU+JQ0KICBwYWNrX3Jvd3MoIlBob3NwaG9saXBpZHMgaW4gbWVkaXVtIExETCIsIDE5LCAyMCkgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBMREwgcGFydGljbGVzIiwgMjEsIDIyKQ0KYGBgDQoNClNlbnNpdGl2aXR5IGFuYWx5c2lzIG9mIHRoZSBsaXBpZCB0cmFpdHMgcmVsYXRlZCB0byBIRExzIGluIFRhYmxlIFxAcmVmKHRhYjp0YWJrMSkgc2hvdyBuZWdhdGl2ZSBwb2ludCBlc3RpbWF0ZXMgd2l0aCBjb25maWRlbmNlIGludGVydmFscyBzcGFubmluZyB0aGUgbnVsbC4gVGhpcyB3b3VsZCBmaXQgd2l0aCBhIG5hcnJhdGl2ZSBvZiBIREwgZWl0aGVyIGJlaW5nIHByb3RlY3RpdmUgb3IgaGF2aW5nIGEgbnVsbCBlZmZlY3Qgb24gdGhlIHJpc2sgb2YgaXNjaGVtaWMgc3Ryb2tlLCBob3dldmVyIHRoZSBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdmVyeSB3ZWFrLg0KDQpgYGB7ciB0YWJrMSwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9DQprYWJsZSh0YWJrMSwgY2FwdGlvbiA9ICJNUi1FZ2dlciBlc3RpbWF0ZXMgZm9yIEhETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUKSAlPiUNCiAgcGFja19yb3dzKCJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbGFyZ2UgSERMIiwgMSwgMikgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBsYXJnZSBIREwgcGFydGljbGVzIiwgMywgNCkgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBIREwiLCA1LCA2KSAlPiUNCiAgcGFja19yb3dzKCJGcmVlIGNob2xlc3Rlcm9sIGluIHZlcnkgbGFyZ2UgSERMIiwgNywgOCkgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiB2ZXJ5IGxhcmdlIEhETCIsIDksIDEwKQ0KYGBgDQoNCiMjIyBNZXRhLWFuYWx5c2lzIG9mIGV4cG9zdXJlIHRyYWl0cw0KDQpJbiBhbiBhdHRlbXB0IHRvIGluY3JlYXNlIHN0YXRpc3RpY2FsIHBvd2VyLCB3ZSBwZXJmb3JtZWQgYSBtZXRhLWFuYWx5c2lzIG9mIHRoZSByZXN1bHRzIGJ5IGxpcGlkIGNhdGVnb3J5IGFuZCBtb2xlY3VsYXIgc2l6ZS4NCg0KIyMjIyBSaXNrIGZhY3RvciBjYXRlZ29yaWVzDQoNCmBgYHtyfQ0KIyMjIExETCBncm91cHMNCiMjIw0KY29uX2xkbDwtIHJiaW5kKHRhYmdbMixdLHRhYmdbNixdLHRhYmdbOSxdLHRhYmdbMTEsXSkNCg0KbGRsbWV0YW4yIDwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gY29uX2xkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkNvbmNlbnRyYXRpb24iKQ0KDQojIyMNCnBob19sZGwgPC0gcmJpbmQodGFiZ1szLF0sdGFiZ1s3LF0sdGFiZ1sxMCxdKQ0KDQpsZGxtZXRhbjMgPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBwaG9fbGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiUGhvc3Bob2xpcGlkcyIpDQoNCiMjIw0KZnJlZWNob2xfbGRsIDwtIHJiaW5kKHRhYmdbMSxdLHRhYmdbNSxdKQ0KDQpsZGxtZXRhbjQgPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBmcmVlY2hvbF9sZGwsIHN0dWRsYWIgPSBwYXN0ZShleHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJGcmVlIENob2xlc3Rlcm9sIikNCg0KI3Bsb3RtZXRhbjQ8LW1ldGE6OmZvcmVzdChsZGxtZXRhbjQpDQoNCiMjIw0KY2hvbGVzdF9sZGwgPC0gcmJpbmQodGFiZ1s0LF0sdGFiZ1s4LF0pDQoNCmxkbG1ldGFuNSA8LSBtZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IGNob2xlc3RfbGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ2hvbGVzdGVyb2wgRXN0ZXJzIikNCg0KI3Bsb3RtZXRhbjU8LW1ldGE6OmZvcmVzdChsZGxtZXRhbjUpDQpyZXNsZGxlc3QyPC1jKGxkbG1ldGFuMiRrLGxkbG1ldGFuMiRURS5yYW5kb20sbGRsbWV0YW4yJHNlVEUucmFuZG9tLGxkbG1ldGFuMiRsb3dlci5yYW5kb20sbGRsbWV0YW4yJHVwcGVyLnJhbmRvbSxyb3VuZChsZGxtZXRhbjIkcHZhbC5yYW5kb20sIGRpZ2l0cyA9IDQpKQ0KcmVzbGRsZXN0MzwtYyhsZGxtZXRhbjMkayxsZGxtZXRhbjMkVEUucmFuZG9tLGxkbG1ldGFuMyRzZVRFLnJhbmRvbSxsZGxtZXRhbjMkbG93ZXIucmFuZG9tLGxkbG1ldGFuMyR1cHBlci5yYW5kb20scm91bmQobGRsbWV0YW4zJHB2YWwucmFuZG9tLCBkaWdpdHMgPSA0KSkNCnJlc2xkbGVzdDQ8LWMobGRsbWV0YW40JGssbGRsbWV0YW40JFRFLnJhbmRvbSxsZGxtZXRhbjQkc2VURS5yYW5kb20sbGRsbWV0YW40JGxvd2VyLnJhbmRvbSxsZGxtZXRhbjQkdXBwZXIucmFuZG9tLHJvdW5kKGxkbG1ldGFuNCRwdmFsLnJhbmRvbSwgZGlnaXRzID0gNCkpDQpyZXNsZGxlc3Q1PC1jKGxkbG1ldGFuNSRrLGxkbG1ldGFuNSRURS5yYW5kb20sbGRsbWV0YW41JHNlVEUucmFuZG9tLGxkbG1ldGFuNSRsb3dlci5yYW5kb20sbGRsbWV0YW41JHVwcGVyLnJhbmRvbSxyb3VuZChsZGxtZXRhbjUkcHZhbC5yYW5kb20sIGRpZ2l0cyA9IDQpKQ0KdGFiZmY8LSByYmluZChyZXNsZGxlc3QyLHJlc2xkbGVzdDMscmVzbGRsZXN0NCxyZXNsZGxlc3Q1KQ0KY29sbmFtZXModGFiZmYpPC0gYygiTiIsIkVzdGltYXRlIiwgIlNFIiwiTEkiLCJVSSIsIlB2YWwiKQ0Kcm93bmFtZXModGFiZmYpPC0gYygiQ29uY2VudHJhdGlvbiIsICJQaG9zcGhvbGlwaWRzIiwiRnJlZSBDaG9sZXN0ZXJvbCIsIkNob2xlc3Rlcm9sIGVzdGVycyIpDQpgYGANCg0KVGFibGUgXEByZWYodGFiOnRhYmZmKSBzaG93cyByZXN1bHRzIGZyb20gdGhlIG1ldGEtYW5hbHlzaXMgb2YgdGhlIElWVyBlc3RpbWF0ZXMuIFRoZSBwb2ludCBlc3RpbWF0ZXMgc2hvdyBudWxsIG9yIHBvc2l0aXZlIGVzdGltYXRlcyB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHNwYW5uaW5nIHRoZSBudWxsLCBob3dldmVyIGdpdmVuIHRoZSBudW1iZXIgb2YgaW5zdHJ1bWVudHMgdGhlIGVzdGltYXRlcyBzaG93IGhvdyBkZXNwaXRlIHRoZSBtZXRhLWFuYWx5c2lzLCB0aGUgYW5hbHlzZXMgeWllbGQgaW1wcmVjaXNlIGNhdXNhbCBlc3RpbWF0ZXMuIFJlc3VsdHMgaW4gVGFibGUgXEByZWYodGFiOnRhYmZmMSkgYXJlIHNpbWlsYXIgdG8gdGhlIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgb2YgTERMcy4gVGhlIHBvaW50IGVzdGltYXRlcyBzaG93IG51bGwgb3IgbmVnYXRpdmUgZXN0aW1hdGVzIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMgc3Bhbm5pbmcgdGhlIG51bGwuDQoNCmBgYHtyIHRhYmZmLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0V9DQp0YWJmZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmZmKQ0KdGFiZmYgJT4lDQogIGthYmxlKCJodG1sIixlc2NhcGUgPSBGLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgSVZXIGVzdGltYXRlcyBmcm9tIExETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQojIyMgSERMIGdyb3Vwcw0KbWV0YXRhYmcxPC0gY2JpbmQodGFiZzEsYXMuY2hhcmFjdGVyKHRyYWl0cykpDQpoZGxtZXRhbjwtbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBtZXRhdGFiZzEsIHN0dWRsYWIgPSBwYXN0ZShleHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJUb3RhbCBDaG9sZXN0ZXJvbCIpDQoNCiMjIw0KY2hvbGVzdF9oZGw8LSByYmluZCh0YWJnMVsxLF0sdGFiZzFbNCxdLHRhYmcxWzEwLF0pDQoNCmhkbG1ldGExPC1tZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IGNob2xlc3RfaGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ2hvbGVzdGVyb2wgZXN0ZXJzIikNCg0KIyMjDQpmcmVlY2hvbF9oZGw8LSByYmluZCh0YWJnMVs1LF0sIHRhYmcxWzExLF0pDQoNCmhkbG1ldGEyPC1tZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IGZyZWVjaG9sX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkZyZWUgQ2hvbGVzdGVyb2wiKQ0KDQojIyMNCmNvbl9oZGw8LSByYmluZCh0YWJnMVsyLF0sdGFiZzFbNixdLHRhYmcxWzgsXSx0YWJnMVsxMixdKQ0KDQpoZGxtZXRhMzwtbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBjb25faGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ29uY2VudHJhdGlvbiIpDQoNCiMjIw0KcGhvX2hkbDwtIHJiaW5kKHRhYmcxWzMsXSx0YWJnMVs3LF0sdGFiZzFbMTQsXSkNCg0KaGRsbWV0YTQ8LW1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gcGhvX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIlBob3NwaG9saXBpZHMiKQ0KDQojIyMNCnRyaWdfaGRsPC0gcmJpbmQodGFiZzFbOSxdLHRhYmcxWzE0LF0pDQoNCmhkbG1ldGE1PC1tZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IHRyaWdfaGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiVHJpZ2x5Y2VyaWRlcyIpDQoNCnJlc2hkbGVzdDE8LWMoaGRsbWV0YTEkayxoZGxtZXRhMSRURS5yYW5kb20saGRsbWV0YTEkc2VURS5yYW5kb20saGRsbWV0YTEkbG93ZXIucmFuZG9tLGhkbG1ldGExJHVwcGVyLnJhbmRvbSxoZGxtZXRhMSRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDI8LWMoaGRsbWV0YTIkayxoZGxtZXRhMiRURS5yYW5kb20saGRsbWV0YTIkc2VURS5yYW5kb20saGRsbWV0YTIkbG93ZXIucmFuZG9tLGhkbG1ldGEyJHVwcGVyLnJhbmRvbSxoZGxtZXRhMiRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDM8LWMoaGRsbWV0YTMkayxoZGxtZXRhMyRURS5yYW5kb20saGRsbWV0YTMkc2VURS5yYW5kb20saGRsbWV0YTMkbG93ZXIucmFuZG9tLGhkbG1ldGEzJHVwcGVyLnJhbmRvbSxoZGxtZXRhMyRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDQ8LWMoaGRsbWV0YTQkayxoZGxtZXRhNCRURS5yYW5kb20saGRsbWV0YTQkc2VURS5yYW5kb20saGRsbWV0YTQkbG93ZXIucmFuZG9tLGhkbG1ldGE0JHVwcGVyLnJhbmRvbSxoZGxtZXRhNCRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDU8LWMoaGRsbWV0YTUkayxoZGxtZXRhNSRURS5yYW5kb20saGRsbWV0YTUkc2VURS5yYW5kb20saGRsbWV0YTUkbG93ZXIucmFuZG9tLGhkbG1ldGE1JHVwcGVyLnJhbmRvbSxoZGxtZXRhNSRwdmFsLnJhbmRvbSkNCg0KdGFiZmYxPC0gcmJpbmQocmVzaGRsZXN0MSxyZXNoZGxlc3QyLHJlc2hkbGVzdDMscmVzaGRsZXN0NCxyZXNoZGxlc3Q1KQ0KY29sbmFtZXModGFiZmYxKTwtIGMoIk4iLCJNZWFuIiwgIlNFIiwiTEkiLCJVSSIsIlB2YWwiKQ0Kcm93bmFtZXModGFiZmYxKTwtIGMoIkNob2xlc3Rlcm9sIEVzdGVycyIsIkZyZWUgQ2hvbGVzdGVyb2wiLCANCiAgICAgICAgICAgICAgICAiQ29uY2VudHJhdGlvbiIsInBob3NwaG9saXBpZHMiLCJUcmlnbHljZXJpZGVzIikNCmBgYA0KDQpgYGB7ciB0YWJmZjEsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRhYmZmMSA8LSBhcy5kYXRhLmZyYW1lKHRhYmZmMSkNCg0KdGFiZmYxICU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJNZXRhLWFuYWx5c2lzIG9mIElWVyBlc3RpbWF0ZXMgZm9yIEhETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KIyMjIyBTaXplcw0KYGBge3J9DQojIyMgTERMIHNpemVzDQppbnRlcm1lZGlhdGVfbGRsPC0gcmJpbmQodGFiZ1sxLF0sdGFiZ1syLF0sdGFiZ1szLF0pDQpsZGxzaXplMTwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gaW50ZXJtZWRpYXRlX2xkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkludGVybWVkaWF0ZSBMRExzIikNCg0KbWVkX2xkbDwtIHJiaW5kKHRhYmdbOCxdLHRhYmdbOSxdLHRhYmdbMTAsXSkNCmxkbHNpemUyPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBtZWRfbGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiTWVkaXVtIExETHMiKQ0KDQpsYXJfbGRsPC0gcmJpbmQodGFiZ1s0LF0sdGFiZ1s1LF0sdGFiZ1s2LF0sdGFiZ1s3LF0pDQpsZGxzaXplMzwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gbGFyX2xkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkxhcmdlIExETHMiKQ0KDQpsZGxzaXplczE8LSBjKGxkbHNpemUxJGssbGRsc2l6ZTEkVEUucmFuZG9tLGxkbHNpemUxJHNlVEUucmFuZG9tLGxkbHNpemUxJGxvd2VyLnJhbmRvbSxsZGxzaXplMSR1cHBlci5yYW5kb20scm91bmQobGRsc2l6ZTEkcHZhbC5yYW5kb20sZGlnaXRzID0gNCkpDQpsZGxzaXplczI8LSBjKGxkbHNpemUyJGssbGRsc2l6ZTIkVEUucmFuZG9tLGxkbHNpemUyJHNlVEUucmFuZG9tLGxkbHNpemUyJGxvd2VyLnJhbmRvbSxsZGxzaXplMiR1cHBlci5yYW5kb20scm91bmQobGRsc2l6ZTIkcHZhbC5yYW5kb20sZGlnaXRzID0gNCkpDQpsZGxzaXplczM8LSBjKGxkbHNpemUzJGssbGRsc2l6ZTMkVEUucmFuZG9tLGxkbHNpemUzJHNlVEUucmFuZG9tLGxkbHNpemUzJGxvd2VyLnJhbmRvbSxsZGxzaXplMyR1cHBlci5yYW5kb20scm91bmQobGRsc2l6ZTMkcHZhbC5yYW5kb20sZGlnaXRzID0gNCkpDQp0YWJiZjwtIHJiaW5kKGxkbHNpemVzMSxsZGxzaXplczIsbGRsc2l6ZXMzKQ0KY29sbmFtZXModGFiYmYpPC0gYygiTiIsIk1lYW4iLCAiU0UiLCJMSSIsIlVJIiwiUC12YWwiKQ0Kcm93bmFtZXModGFiYmYpPC0gYygiSW50ZXJtZWRpYXRlIiwiTWVkaXVtIiwiTGFyZ2UiKQ0KYGBgDQoNCkluIHRoaXMgc2VjdGlvbiB3ZSBwcmVzZW50IHJlc3VsdCBtZXRhLWFuYWx5c2luZyBvdmVyIHRoZSBsaXBpZCB0cmFpdHMgZm9yIGVhY2ggc2l6ZSBvZiBtb2xlY3VsZS4gTERMIHJlc3VsdHMgYXJlIHNob3duIGluIFRhYmxlIFxAcmVmKHRhYjp0YWJiZikuIFNpbWlsYXIgdG8gdGhlIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgaW4gXEByZWYodGFiOnRhYmZmKSB0aGUgc2l6ZXMgaGF2ZSBudWxsIG9yIHBvc2l0aXZlIGNhdXNhbCBlc3RpbWF0ZSB3aXRoIG5vIHN0cm9uZyBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsLiBUYWJsZSBcQHJlZih0YWI6dGFiYmYpIHNob3dzIHRoYXQgdGhlIG1lZGl1bSBhbmQgbGFyZ2Ugc2l6ZWQgTERMcyBoYXZlIGEgZ3JlYXRlciBtYWduaXR1ZGUgb2YgZWZmZWN0IHRoYW4gdGhlIGludGVybWVkaWF0ZXMgc2l6ZXMgd2hpY2ggbWF0Y2hlcyBvdXIgc2NpZW50aWZpYyByYXRpb25hbGUuDQoNCmBgYHtyLCB0YWJiZiwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0KdGFiYmYgPC0gYXMuZGF0YS5mcmFtZSh0YWJiZikNCg0KdGFiYmYgJT4lDQogIGthYmxlKCJodG1sIixlc2NhcGUgPSBGLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgSVZXIGVzdGltYXRlcyBmb3IgTERMIHNpemVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIEhETCBzaXplcw0Kc21hbGxfaGRsPC0gcmJpbmQodGFiZzFbOCxdLHRhYmcxWzksXSkNCmhkbHNpemUxPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBzbWFsbF9oZGwsIHN0dWRsYWIgPSBwYXN0ZShleHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJTbWFsbCBoZGxzIikNCg0KbWVkX2hkbDwtIHJiaW5kKHRhYmcxWzQsXSx0YWJnMVs1LF0sdGFiZzFbNixdLHRhYmcxWzcsXSkNCmhkbHNpemUyPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBtZWRfaGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiTWVkaXVtIGhkbHMiKQ0KDQpsYXJfaGRsPC0gcmJpbmQodGFiZzFbMSxdLHRhYmcxWzIsXSx0YWJnMVszLF0pDQpoZGxzaXplMzwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gbGFyX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkxhcmdlIGhkbHMiKQ0KDQp2bGFyX2hkbDwtIHJiaW5kKHRhYmcxWzEwLF0sdGFiZzFbMTEsXSx0YWJnMVsxMixdLHRhYmcxWzEzLF0sdGFiZzFbMTQsXSkNCmhkbHNpemU0PC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSB2bGFyX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIlZlcnkgbGFyZ2UgaGRscyIpDQoNCmhkbHNpemVzMTwtIGMoaGRsc2l6ZTEkayxoZGxzaXplMSRURS5yYW5kb20saGRsc2l6ZTEkc2VURS5yYW5kb20saGRsc2l6ZTEkbG93ZXIucmFuZG9tLGhkbHNpemUxJHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplMSRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCmhkbHNpemVzMjwtIGMoaGRsc2l6ZTIkayxoZGxzaXplMiRURS5yYW5kb20saGRsc2l6ZTIkc2VURS5yYW5kb20saGRsc2l6ZTIkbG93ZXIucmFuZG9tLGhkbHNpemUyJHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplMiRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCmhkbHNpemVzMzwtIGMoaGRsc2l6ZTMkayxoZGxzaXplMyRURS5yYW5kb20saGRsc2l6ZTMkc2VURS5yYW5kb20saGRsc2l6ZTMkbG93ZXIucmFuZG9tLGhkbHNpemUzJHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplMyRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCmhkbHNpemVzNDwtIGMoaGRsc2l6ZTQkayxoZGxzaXplNCRURS5yYW5kb20saGRsc2l6ZTQkc2VURS5yYW5kb20saGRsc2l6ZTQkbG93ZXIucmFuZG9tLGhkbHNpemU0JHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplNCRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCnRhYmJmMTwtIHJiaW5kKGhkbHNpemVzMSxoZGxzaXplczIsaGRsc2l6ZXMzLGhkbHNpemVzNCkNCmNvbG5hbWVzKHRhYmJmMSk8LSBjKCJOIiwiTWVhbiIsICJTRSIsIkxJIiwiVUkiLCJQLXZhbCIpDQpyb3duYW1lcyh0YWJiZjEpPC0gYygiU21hbGwiLCJNZWRpdW0iLCJMYXJnZSIsIlZlcnkgTGFyZ2UiKQ0KYGBgDQoNCkZvciB0aGUgSERMIHNpemVzIGluIFRhYmxlIFxAcmVmKHRhYjp0YWJiZjEpIHRoZSBwb2ludCBlc3RpbWF0ZXMgc2hvdyBuZWdhdGl2ZSBwb2ludCBlc3RpbWF0ZXMgY2xvc2UgdG8gdGhlIG51bGwgaG93ZXZlciBub25lIG9mIHRoZSBlc3RpbWF0ZXMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFdlIGZpbmQgdGhhdCB0aGUgcG9vbGVkIHBvaW50IGVzdGltYXRlZCBmb3IgdGhlIHZlcnkgbGFyZ2UgSERMIG1vbGVjdWxlcyBpcyBjbG9zZXN0IHRvIHRoZSBudWxsLg0KDQpgYGB7ciwgdGFiYmYxLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhYmJmMSA8LSBhcy5kYXRhLmZyYW1lKHRhYmJmMSkNCg0KdGFiYmYxICU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJNZXRhLWFuYWx5c2lzIG9mIElWVyBlc3RpbWF0ZXMgZm9yIEhETCBTaXplcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQojIyMgTXVsdGl2YXJpYXRlIE1ldGEtYW5hbHlzaXMgb2YgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KIyMjIyAgRnJlZSBDaG9sZXN0ZXJvbA0KYmV0YWxkbDE8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YWxkbDFbMSxdIDwtIGModGFia1sxLDFdLHRhYmtbMiwxXSkNCmJldGFsZGwxWzIsXSA8LSBjKHRhYmtbOSwxXSx0YWJrWzEwLDFdKQ0KDQpsZGwxY292PC0gbWF0cml4KGMoKHRhYmtbMSwyXSleMiwwLDAsKHRhYmtbMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbDJjb3Y8LSBtYXRyaXgoYygodGFia1s5LDJdKV4yLDAsMCwodGFia1sxMCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21hdGxpc3QxPC0gbGlzdChsZGwxY292LCBsZGwyY292KQ0KbGRsMW12bWV0YTwtIG12bWV0YShiZXRhbGRsMSwgc21hdGxpc3QxKQ0KDQojIyMjIENvbmNlbnRyYXRpb24NCmJldGFsZGwzPC0gbWF0cml4KG5yb3cgPSA0LCBuY29sID0gMiwgTkEpDQoNCmJldGFsZGwzWzEsXSA8LSBjKHRhYmtbMywxXSx0YWJrWzQsMV0pDQpiZXRhbGRsM1syLF0gPC0gYyh0YWJrWzExLDFdLHRhYmtbMTIsMV0pDQpiZXRhbGRsM1szLF0gPC0gYyh0YWJrWzE3LDFdLHRhYmtbMTgsMV0pDQpiZXRhbGRsM1s0LF0gPC0gYyh0YWJrWzIxLDFdLHRhYmtbMjIsMV0pDQoNCmxkbHZjb292PC0gbWF0cml4KGMoKHRhYmtbMywyXSleMiwwLDAsKHRhYmtbNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbHZjb292MTwtIG1hdHJpeChjKCh0YWJrWzExLDJdKV4yLDAsMCwodGFia1sxMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbHZjb292MjwtIG1hdHJpeChjKCh0YWJrWzE3LDJdKV4yLDAsMCwodGFia1sxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbHZjb292MzwtIG1hdHJpeChjKCh0YWJrWzIxLDJdKV4yLDAsMCwodGFia1syMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21hdGxpc3QzPC0gbGlzdChsZGx2Y29vdiwgbGRsdmNvb3YxLCBsZGx2Y29vdjIsIGxkbHZjb292MykNCmxkbDNtdm1ldGE8LSBtdm1ldGEoYmV0YWxkbDMsIHNtYXRsaXN0MykNCg0KIyMjIyBwaG9zcGhvbGlwaWRzDQpiZXRhbGRsNDwtIG1hdHJpeChucm93ID0gMywgbmNvbCA9IDIsIE5BKQ0KDQpiZXRhbGRsNFsxLF0gPC0gYyh0YWJrWzUsMV0sdGFia1s2LDFdKQ0KYmV0YWxkbDRbMixdIDwtIGModGFia1sxMywxXSx0YWJrWzE0LDFdKQ0KYmV0YWxkbDRbMyxdIDwtIGModGFia1sxOSwxXSx0YWJrWzIwLDFdKQ0KDQpsZGwxY29vdjwtIG1hdHJpeChjKCh0YWJrWzUsMl0pXjIsMCwwLCh0YWJrWzYsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGwyY29vdjwtIG1hdHJpeChjKCh0YWJrWzEzLDJdKV4yLDAsMCwodGFia1sxNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbDNjb292PC0gbWF0cml4KGMoKHRhYmtbMTksMl0pXjIsMCwwLCh0YWJrWzIwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpzbWF0bGlzdDQ8LSBsaXN0KGxkbDFjb292LCBsZGwyY29vdiwgbGRsM2Nvb3YpDQpsZGw0bXZtZXRhPC0gbXZtZXRhKGJldGFsZGw0LCBzbWF0bGlzdDQpDQoNCiMjIyMgQ2hvbGVzdGVyb2wgZXN0ZXJzDQpiZXRhbGRsNTwtIG1hdHJpeChucm93ID0gMiwgbmNvbCA9IDIsIE5BKQ0KDQpiZXRhbGRsNVsxLF0gPC0gYyh0YWJrWzcsMV0sdGFia1s4LDFdKQ0KYmV0YWxkbDVbMixdIDwtIGModGFia1sxNSwxXSx0YWJrWzE2LDFdKQ0KDQpsZGRsMWNvdjwtIG1hdHJpeChjKCh0YWJrWzcsMl0pXjIsMCwwLCh0YWJrWzgsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGRsMmNvdjwtIG1hdHJpeChjKCh0YWJrWzE1LDJdKV4yLDAsMCwodGFia1sxNiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21hdGxpc3Q1PC0gbGlzdChsZGRsMWNvdiwgbGRkbDJjb3YpDQpsZGw1bXZtZXRhPC0gbXZtZXRhKGJldGFsZGw1LCBzbWF0bGlzdDUpDQoNCiMjIyMgY29sbGF0ZSByZXN1bHRzDQp0cmFpdHNfbGRsbXZtZXRhIDwtDQogIHJiaW5kKA0KICBjKGxkbG1ldGFuMiRrLHVubmFtZShsZGwxbXZtZXRhJGNvZWZmaWNpZW50cyksc3VtbWFyeShsZGwxbXZtZXRhKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsMW12bWV0YSkkY29lZlsyLCA0XSksDQogIGMobGRsbWV0YW4zJGssdW5uYW1lKGxkbDNtdm1ldGEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGxkbDNtdm1ldGEpJGNvZWZbMSwgNF0sc3VtbWFyeShsZGwzbXZtZXRhKSRjb2VmWzIsIDRdKSwNCiAgYyhsZGxtZXRhbjQkayx1bm5hbWUobGRsNG12bWV0YSRjb2VmZmljaWVudHMpLHN1bW1hcnkobGRsNG12bWV0YSkkY29lZlsxLCA0XSxzdW1tYXJ5KGxkbDRtdm1ldGEpJGNvZWZbMiwgNF0pLA0KICBjKGxkbG1ldGFuNSRrLHVubmFtZShsZGw1bXZtZXRhJGNvZWZmaWNpZW50cyksc3VtbWFyeShsZGw1bXZtZXRhKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsNW12bWV0YSkkY29lZlsyLCA0XSkNCiAgKQ0Kcm93bmFtZXModHJhaXRzX2xkbG12bWV0YSk8LSBjKCJGcmVlIENob2xlc3Rlcm9sIiwiQ29uY2VudHJhdGlvbiIsIlBob3NwaG9saXBpZHMiLCJDaG9sZXN0ZXJvbCBlc3RlcnMiKQ0KY29sbmFtZXModHJhaXRzX2xkbG12bWV0YSk8LSBjKCJOIiwiQVZnIFBsZWlvIiwgIlNsb3BlIiwgIlB2YWwoUGxlaW8pIiwgIlB2YWwoRXN0KSIpDQpgYGANCg0KV2UgYWxzbyBwcmVzZW50IGVxdWl2YWxlbnQgbWV0YS1hbmFseXNpcyBlc3RpbWF0ZXMgZm9yIG91ciBNUi1FZ2dlciByZXN1bHRzLCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHdlIHVzZSBtdWx0aXZhcmlhdGUgbWV0YS1hbmFseXNpcyBzaW5jZSB0aGUgTVItRWdnZXIgbW9kZWwgcmV0dXJucyAyIHBhcmFtZXRlcnMgKHNsb3BlIGFuZCBpbnRlcmNlcHQpLiBUaGUgbG93IG51bWJlciBvZiBNUi1FZ2dlciBlc3RpbWF0ZXMgZnJvbSB0aGUgZXhwb3N1cmUgdHJhaXRzIHJlbGF0ZWQgdG8gSERMLXJlbGF0ZWQgcGhlbm90eXBlcyBtZWFudCB0aGF0IHdlIGNvdWxkIG5vdCByZXBvcnQgYW55IGVzdGltYXRlcy4gVGhlIHJlc3VsdHMgb2YgdGhlIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgaW4gVGFibGUgXEByZWYodGFiOmxkbG12bWV0YTEpIHNob3cgbm8gc3Ryb25nIGV2aWRlbmNlIGFnYWluc3QgdGhlIG51bGwgb2Ygbm8gcGxlaW90cm9weS4gQ2hvbGVzdGVyb2wgZXN0ZXJzIHNob3cgYSBncmVhdGVyIGVmZmVjdCBvbiBpc2NoZW1pYyBzdHJva2Ugd2l0aGluIHRoZSBkaWZmZXJlbnQgTERMIHRyYWl0cy4gVGFibGUgXEByZWYodGFiOmxkbG12bWV0YTIpIHNob3dzIG5vIHN0cm9uZyBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsIGh5cG90aGVzaXMgb2Ygbm8gcGxlaW90cm9weS4gVGhlIHN1bW1hcnkgcG9pbnQgZXN0aW1hdGVzIGFyZSBiaWdnZXIgaW4gbWFnbml0dWRlIHRoYW4gdGhlIElWVyBlc3RpbWF0ZXMgaW4gVGFibGUgXEByZWYodGFiOnRhYmJmKS4gVGhlIGludGVybWVkaWF0ZSBzaXplZCB0cmFpdHMgcmV0dXJuZWQgYSBwb3NpdGl2ZSBlc3RpbWF0ZSBzdWdnZXN0aW5nIGFuIGluY3JlYXNlZCByaXNrIG9mIGlzY2hlbWljIHN0cm9rZS4NCg0KYGBge3IsIGxkbG12bWV0YTEsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRyYWl0c19sZGxtdm1ldGEgPC0gYXMuZGF0YS5mcmFtZSh0cmFpdHNfbGRsbXZtZXRhKQ0KDQp0cmFpdHNfbGRsbXZtZXRhICU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJSZXN1bHRzIGZyb20gTXVsdGl2YXJpYXRlIE1ldGEtYW5hbHlzaXMgb2YgTERMIHJlbGF0ZWQgcGhlbm90eXBlcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCiMjIGludGVybWVkaWF0ZQ0KDQppYmV0YWxkbDwtIG1hdHJpeChucm93ID0gMywgbmNvbCA9IDIsIE5BKQ0KDQppYmV0YWxkbFsxLF0gPC0gYyh0YWJrWzEsMV0sdGFia1syLDFdKQ0KaWJldGFsZGxbMixdIDwtIGModGFia1szLDFdLHRhYmtbNCwxXSkNCmliZXRhbGRsWzMsXSA8LSBjKHRhYmtbNSwxXSx0YWJrWzYsMV0pDQoNCmlsZGxjb3YxPC0gbWF0cml4KGMoKHRhYmtbMSwyXSleMiwwLDAsKHRhYmtbMSwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmlsZGxjb3YyPC0gbWF0cml4KGMoKHRhYmtbMywyXSleMiwwLDAsKHRhYmtbNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmlsZGxjb3YzPC0gbWF0cml4KGMoKHRhYmtbNSwyXSleMiwwLDAsKHRhYmtbNiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21tYXRsaXN0PC0gbGlzdChpbGRsY292MSwgaWxkbGNvdjIsIGlsZGxjb3YzKQ0KaWxkbG12bWV0YTwtIG12bWV0YShpYmV0YWxkbCwgc21tYXRsaXN0KQ0KDQojIyMgTWVkaXVtDQoNCm1iZXRhbGRsPC0gbWF0cml4KG5yb3cgPSAzLCBuY29sID0gMiwgTkEpDQoNCm1iZXRhbGRsWzEsXSA8LSBjKHRhYmtbMTUsMV0sdGFia1sxNiwxXSkNCm1iZXRhbGRsWzIsXSA8LSBjKHRhYmtbMTcsMV0sdGFia1sxOCwxXSkNCm1iZXRhbGRsWzMsXSA8LSBjKHRhYmtbMTksMV0sdGFia1syMCwxXSkNCg0KbWxkbGNvdjE8LSBtYXRyaXgoYygodGFia1sxNSwyXSleMiwwLDAsKHRhYmtbMTYsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQptbGRsY292MjwtIG1hdHJpeChjKCh0YWJrWzE3LDJdKV4yLDAsMCwodGFia1sxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCm1sZGxjb3YzPC0gbWF0cml4KGMoKHRhYmtbMTksMl0pXjIsMCwwLCh0YWJrWzIwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpzbW1hdGxpc3QxPC0gbGlzdChtbGRsY292MSxtbGRsY292MixtbGRsY292MykNCnNsZGxtdm1ldGExPC0gbXZtZXRhKG1iZXRhbGRsLCBzbW1hdGxpc3QxKQ0KDQojIyMgbGFyZ2UNCg0KbGJldGFsZGw8LSBtYXRyaXgobnJvdyA9IDQsIG5jb2wgPSAyLCBOQSkNCg0KbGJldGFsZGxbMSxdIDwtIGModGFia1s3LDFdLHRhYmtbOCwxXSkNCmxiZXRhbGRsWzIsXSA8LSBjKHRhYmtbOSwxXSx0YWJrWzEwLDFdKQ0KbGJldGFsZGxbMyxdIDwtIGModGFia1sxMSwxXSx0YWJrWzEyLDFdKQ0KbGJldGFsZGxbNCxdIDwtIGModGFia1sxMywxXSx0YWJrWzE0LDFdKQ0KDQpsbGRsY292MTwtIG1hdHJpeChjKCh0YWJrWzcsMl0pXjIsMCwwLCh0YWJrWzgsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsbGRsY292MjwtIG1hdHJpeChjKCh0YWJrWzksMl0pXjIsMCwwLCh0YWJrWzEwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KbGxkbGNvdjM8LSBtYXRyaXgoYygodGFia1sxMSwyXSleMiwwLDAsKHRhYmtbMTIsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsbGRsY292NDwtIG1hdHJpeChjKCh0YWJrWzEzLDJdKV4yLDAsMCwodGFia1sxNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21tYXRsaXN0MjwtIGxpc3QobGxkbGNvdjEsbGxkbGNvdjIsbGxkbGNvdjMsbGxkbGNvdjQpDQpzbGRsbXZtZXRhMjwtIG12bWV0YShsYmV0YWxkbCwgc21tYXRsaXN0MikNCg0Kc2l6ZXNfbGRsbXZtZXRhIDwtDQogIHJiaW5kKA0KICBjKGxkbHNpemUxJGssDQogIHVubmFtZShpbGRsbXZtZXRhJGNvZWZmaWNpZW50cyksDQogIHN1bW1hcnkoaWxkbG12bWV0YSkkY29lZlsxLCA0XSwNCiAgc3VtbWFyeShpbGRsbXZtZXRhKSRjb2VmWzIsIDRdDQogICksDQogIGMobGRsc2l6ZTIkaywNCiAgdW5uYW1lKHNsZGxtdm1ldGExJGNvZWZmaWNpZW50cyksDQogIHN1bW1hcnkoc2xkbG12bWV0YTEpJGNvZWZbMSwgNF0sDQogIHN1bW1hcnkoc2xkbG12bWV0YTEpJGNvZWZbMiwgNF0NCiAgKSwNCiAgYyhsZGxzaXplMyRrLA0KICB1bm5hbWUoc2xkbG12bWV0YTIkY29lZmZpY2llbnRzKSwNCiAgc3VtbWFyeShzbGRsbXZtZXRhMikkY29lZlsxLCA0XSwNCiAgc3VtbWFyeShzbGRsbXZtZXRhMikkY29lZlsyLCA0XQ0KICApDQogICkNCg0Kcm93bmFtZXMoc2l6ZXNfbGRsbXZtZXRhKTwtIGMoIkludGVybWVkaWF0ZSIsICJNZWRpdW0iLCAiTGFyZ2UiKQ0KY29sbmFtZXMoc2l6ZXNfbGRsbXZtZXRhKTwtIGMoIk4iLCJBdmcgUGxlaW8iLCAiRXN0aW1hdGUiLCAiUHZhbChQbGVpbykiLCAiUHZhbChFc3QpIikNCmBgYA0KDQpgYGB7ciwgbGRsbXZtZXRhMiwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Kc2l6ZXNfbGRsbXZtZXRhIDwtIGFzLmRhdGEuZnJhbWUoc2l6ZXNfbGRsbXZtZXRhKQ0KDQpzaXplc19sZGxtdm1ldGEgJT4lDQogIGthYmxlKCJodG1sIixlc2NhcGUgPSBGLCBjYXB0aW9uID0gIk11bHRpdmFyaWF0ZSBtZXRhLWFuYWx5c2lzIG9mIE1SLUVnZ2VyIGVzdGltYXRlcyBmb3IgTERMIHNpemVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCg0KIyMgU2VsZWN0aW5nIGdlbmV0aWMgdmFyaWFudHMgdXNpbmcgUS1zdGF0aXN0aWNzIHsjc2VjdGlvbjV9DQoNCkFzIG1vc3Qgb2YgdGhlIHJlc3VsdHMgcHJlc2VudGVkIGhpdGhlcnRvIGhhdmUgbGFja2VkIHN0YXRpc3RpY2FsIHBvd2VyLCB3ZSB0aGVyZWZvcmUgc291Z2h0IHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgU05QcyB1c2VkIGFzIGluc3RydW1lbnRzLCB3aXRoIHRoZSBob3BlIG9mIGluY3JlYXNpbmcgcG93ZXIsIHRocm91Z2ggdGhlIHVzZSBvZiBRLXN0YXRpc3RpY3MuIFRoaXMgc2VjdGlvbiBwcmVzZW50cyByZXN1bHRzIHVzaW5nIGdlbm90eXBlcyBiYXNlZCBvbiB0aGVpciBjb250cmlidXRpb24gdG8gdGhlIFEtc3RhdGlzdGljIGluIHRoZSBJVlcgbW9kZWxzLg0KDQojIyMgSVZXIGVzdGltYXRlcw0KDQpUaGUgZXN0aW1hdGVzIGZyb20gdGhlIElWVyBtb2RlbCBhcmUgZ2l2ZW4gaW4gVGFibGVzIFxAcmVmKHRhYjpsZGxpdndRKSBhbmQgXEByZWYodGFiOmhkbGl2d1EpLg0KYGBge3J9DQpsZGxRX2l2dyA8LSBpdncobGRsc25wc19RWywyXSxsZGxzbnBzX1FbLDRdLGxkbHNucHNfUVssM10sbGRsc25wc19RWyw0XSkNCmxkbFFfaXZ3MSA8LSBpdncobGRsc25wc19RMVssMl0sbGRsc25wc19RMVssNF0sbGRsc25wc19RMVssM10sbGRsc25wc19RMVssNF0pDQpsZGxRX2l2dzIgPC0gaXZ3KGxkbHNucHNfUTJbLDJdLGxkbHNucHNfUTJbLDRdLGxkbHNucHNfUTJbLDNdLGxkbHNucHNfUTJbLDRdKQ0KbGRsUV9pdnczIDwtIGl2dyhsZGxzbnBzX1EzWywyXSxsZGxzbnBzX1EzWyw0XSxsZGxzbnBzX1EzWywzXSxsZGxzbnBzX1EzWyw0XSkNCmxkbFFfaXZ3NCA8LSBpdncobGRsc25wc19RNFssMl0sbGRsc25wc19RNFssNF0sbGRsc25wc19RNFssM10sbGRsc25wc19RNFssNF0pDQpsZGxRX2l2dzUgPC0gaXZ3KGxkbHNucHNfUTVbLDJdLGxkbHNucHNfUTVbLDRdLGxkbHNucHNfUTVbLDNdLGxkbHNucHNfUTVbLDRdKQ0KbGRsUV9pdnc2IDwtIGl2dyhsZGxzbnBzX1E2WywyXSxsZGxzbnBzX1E2Wyw0XSxsZGxzbnBzX1E2WywzXSxsZGxzbnBzX1E2Wyw0XSkNCmxkbFFfaXZ3NyA8LSBpdncobGRsc25wc19RN1ssMl0sbGRsc25wc19RN1ssNF0sbGRsc25wc19RN1ssM10sbGRsc25wc19RN1ssNF0pDQpsZGxRX2l2dzggPC0gaXZ3KGxkbHNucHNfUThbLDJdLGxkbHNucHNfUThbLDRdLGxkbHNucHNfUThbLDNdLGxkbHNucHNfUThbLDRdKQ0KbGRsUV9pdnc5IDwtIGl2dyhsZGxzbnBzX1E5WywyXSxsZGxzbnBzX1E5Wyw0XSxsZGxzbnBzX1E5WywzXSxsZGxzbnBzX1E5Wyw0XSkNCmxkbFFfaXZ3MTAgPC0gaXZ3KGxkbHNucHNfUTEwWywyXSxsZGxzbnBzX1ExMFssNF0sbGRsc25wc19RMTBbLDNdLGxkbHNucHNfUTEwWyw0XSkNCg0KbGRsaXZ3UTwtIHJiaW5kKGxkbFFfaXZ3LGxkbFFfaXZ3MSxsZGxRX2l2dzIsbGRsUV9pdnczLGxkbFFfaXZ3NCxsZGxRX2l2dzUsbGRsUV9pdnc2LGxkbFFfaXZ3NyxsZGxRX2l2dzgsbGRsUV9pdnc5LGxkbFFfaXZ3MTApDQpsZGxpdndRIDwtIGNiaW5kIChsaXBpZF90cmFpdHMsdW5uYW1lKGxkbGl2d1EpKQ0KY29sbmFtZXMobGRsaXZ3USkgPC0gYygiRXhwb3N1cmVzIiwiRXN0aW1hdGVzIiwgIlNFIiwiTEkiLCJVSSIsICJQdmFsIiwiU05QcyIpDQoNCiMjIEhETFMNCmhkbFFfaXZ3IDwtIGl2dyhoZGxzbnBzX1FbLDJdLGhkbHNucHNfUVssNF0saGRsc25wc19RWywzXSxoZGxzbnBzX1FbLDRdKQ0KaGRsUV9pdncxIDwtIGl2dyhoZGxzbnBzX1ExWywyXSxoZGxzbnBzX1ExWyw0XSxoZGxzbnBzX1ExWywzXSxoZGxzbnBzX1ExWyw0XSkNCmhkbFFfaXZ3MiA8LSBpdncoaGRsc25wc19RMlssMl0saGRsc25wc19RMlssNF0saGRsc25wc19RMlssM10saGRsc25wc19RMlssNF0pDQpoZGxRX2l2dzMgPC0gaXZ3KGhkbHNucHNfUTNbLDJdLGhkbHNucHNfUTNbLDRdLGhkbHNucHNfUTNbLDNdLGhkbHNucHNfUTNbLDRdKQ0KaGRsUV9pdnc0IDwtIGl2dyhoZGxzbnBzX1E0WywyXSxoZGxzbnBzX1E0Wyw0XSxoZGxzbnBzX1E0WywzXSxoZGxzbnBzX1E0Wyw0XSkNCmhkbFFfaXZ3NSA8LSBpdncoaGRsc25wc19RNVssMl0saGRsc25wc19RNVssNF0saGRsc25wc19RNVssM10saGRsc25wc19RNVssNF0pDQpoZGxRX2l2dzYgPC0gaXZ3KGhkbHNucHNfUTZbLDJdLGhkbHNucHNfUTZbLDRdLGhkbHNucHNfUTZbLDNdLGhkbHNucHNfUTZbLDRdKQ0KaGRsUV9pdnc3IDwtIGl2dyhoZGxzbnBzX1E3WywyXSxoZGxzbnBzX1E3Wyw0XSxoZGxzbnBzX1E3WywzXSxoZGxzbnBzX1E3Wyw0XSkNCmhkbFFfaXZ3OCA8LSBpdncoaGRsc25wc19ROFssMl0saGRsc25wc19ROFssNF0saGRsc25wc19ROFssM10saGRsc25wc19ROFssNF0pDQpoZGxRX2l2dzkgPC0gaXZ3KGhkbHNucHNfUTlbLDJdLGhkbHNucHNfUTlbLDRdLGhkbHNucHNfUTlbLDNdLGhkbHNucHNfUTlbLDRdKQ0KaGRsUV9pdncxMCA8LSBpdncoaGRsc25wc19RMTBbLDJdLGhkbHNucHNfUTEwWyw0XSxoZGxzbnBzX1ExMFssM10saGRsc25wc19RMTBbLDRdKQ0KaGRsUV9pdncxMSA8LSBpdncoaGRsc25wc19RMTFbLDJdLGhkbHNucHNfUTExWyw0XSxoZGxzbnBzX1ExMVssM10saGRsc25wc19RMTFbLDRdKQ0KaGRsUV9pdncxMiA8LSBpdncoaGRsc25wc19RMTJbLDJdLGhkbHNucHNfUTEyWyw0XSxoZGxzbnBzX1ExMlssM10saGRsc25wc19RMTJbLDRdKQ0KaGRsUV9pdncxMyA8LSBpdncoaGRsc25wc19RMTNbLDJdLGhkbHNucHNfUTEzWyw0XSxoZGxzbnBzX1ExM1ssM10saGRsc25wc19RMTNbLDRdKQ0KDQpoZGxpdndRPC0gcmJpbmQoaGRsUV9pdncsaGRsUV9pdncxLGhkbFFfaXZ3MixoZGxRX2l2dzMsaGRsUV9pdnc0LGhkbFFfaXZ3NSxoZGxRX2l2dzYsaGRsUV9pdnc3LGhkbFFfaXZ3OCxoZGxRX2l2dzksaGRsUV9pdncxMCxoZGxRX2l2dzExLGhkbFFfaXZ3MTIsaGRsUV9pdncxMykNCmhkbGl2d1EgPC0gY2JpbmQgKHRyYWl0cyx1bm5hbWUoaGRsaXZ3USkpDQpjb2xuYW1lcyhoZGxpdndRKSA8LSBjKCJFeHBvc3VyZXMiLCJFc3RpbWF0ZXMiLCAiU0UiLCJMSSIsIlVJIiwgIlB2YWwiLCJTTlBzIikNCmBgYA0KDQpNUiBlc3RpbWF0ZXMgaW4gVGFibGUgXEByZWYodGFiOmxkbGl2d1EpIHNob3cgcG9zaXRpdmUgcG9pbnQgZXN0aW1hdGVzIHdoaWNoIGFncmVlIHdpdGggb3VyIGV4cGVjdGF0aW9ucywgdGhlIGVzdGltYXRlcyBhbHNvIHNob3cgc2lnbmlmaWNhbmNlIChjb25maWRlbmNlIGludGVydmFscyBleGNsdWRlIG51bGwpLiBIb3dldmVyIGEgbWFqb3IgbGltaXRhdGlvbiBoZXJlIGlzIHRoYXQgdGhlIFNOUHMgdXNlZCBpbiB0aGUgbW9kZWxzIGFyZSB0aGUgc2FtZSBvciBsYXJnZWx5IG92ZXJsYXBwaW5nLCBtZWFuaW5nIHRoYXQgdGhlIE1SIGVzdGltYXRlcyBhcmUgdW5saWtlbHkgdG8gYmUgdmFsaWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgZXN0aW1hdGVzIGZyb20gdGhlIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb24gYXJlIHRoZSBzYW1lIGluIGVhY2ggbW9kZWwgd2l0aCB0aGUgZ2Vub3R5cGUtZXhwb3N1cmUgYXNzb2NpYXRpb24gdmFyeWluZyBmb3IgZWFjaCBsaXBpZCB0cmFpdCBsZWFkaW5nIHRvIGEgc2ltcGxlIHNjYWxpbmcgb2YgdGhlIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb25zIGZvciBlYWNoIHRyYWl0LiBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGlzZW50YW5nbGUgd2hpY2ggdHJhaXQgaGFzIGEgdHJ1ZSBjYXVzYWwgZWZmZWN0IGFuZCB3aGljaCBpcyBjb25mb3VuZGVkIGJ5IHVzaW5nIHRoZSBzYW1lIFNOUHMuIFRoaXMgaXNzdWUgaGFzIGJlZW4gZGlzY3Vzc2VkIHByZXZpb3VzbHkgYnkgQGhvbG1lcy1ucmctMjAxNy4NCmBgYHtyIGxkbGl2d1EsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCmxkbGl2d1EgPC0gYXMuZGF0YS5mcmFtZShsZGxpdndRKQ0KDQpsZGxpdndRICU+JQ0KICBtdXRhdGUoU05QcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigoU05QcykpKSA8IDMsDQogIGNlbGxfc3BlYyhTTlBzLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoU05QcywgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAgbXV0YXRlKEVzdGltYXRlcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSA8IDAuMDEsDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImdyZXkiKSwNCiAgY2VsbF9zcGVjKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAid2hpdGUiKQ0KICApKSU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJJVlcgZXN0aW1hdGVzIGZvciBleHBvc3VyZXMgcmVsYXRlZCBMRExzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNClJlc3VsdHMgZnJvbSBUYWJsZSBcQHJlZih0YWI6aGRsaXZ3USkgc2hvdyBjYXVzYWwgZXN0aW1hdGVzIG9mIGxpcGlkIHRyYWl0cyByZWxhdGVkIHRvIEhETCB3aXRoIHRoZSBpbmNyZWFzZWQgbnVtYmVyIG9mIFNOUHMuIFRoZSBwb2ludCBlc3RpbWF0ZXMgYXJlIGdlbmVyYWxseSBudWxsIG9yIG5lZ2F0aXZlIHdpdGggc21hbGwgcC12YWx1ZXMuIFRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIHNob3cgYSBwb3NpdGl2ZSBjYXVzYWwgZWZmZWN0IG9uIGlzY2hlbWljIHN0cm9rZSB3aXRoIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZS4gV2Ugc2hvdyB0aGUgTVItRWdnZXIgbW9kZWwgZm9yIHRoaXMgZXN0aW1hdGUgYmVsb3cuIFByZWNpc2VseSB0aGUgc2FtZSBpc3N1ZSBhcyBub3RlZCBhYm92ZSBhcHBsaWVzIGluIHRoaXMgc2V0dGluZyB3aGVyZSBTTlBzIHVzZWQgaW4gdGhlIElWcyBvdmVybGFwIGJldHdlZW4gZXhwb3N1cmVzLCBtZWFuaW5nIHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciBoZGxpdndRLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0V9DQpoZGxpdndRIDwtIGFzLmRhdGEuZnJhbWUoaGRsaXZ3USkNCg0KaGRsaXZ3USAlPiUNCiAgbXV0YXRlKFNOUHMgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoKFNOUHMpKSkgPCAzLA0KICBjZWxsX3NwZWMoU05QcywgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImdyZXkiKSwNCiAgY2VsbF9zcGVjKFNOUHMsIGNvbG9yID0gImJsYWNrIiwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIpDQogICkpJT4lDQogIG11dGF0ZShFc3RpbWF0ZXMgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSkgPiAwLjAxLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSksIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICJncmV5IiksDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSwgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiSVZXIGVzdGltYXRlcyBmb3IgZXhwb3N1cmVzIHJlbGF0ZWQgSERMcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQojIyMgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KbGRsUV9tcmVnZ2VyIDwtIG1yZWdnZXIobGRsc25wc19RWywyXSxsZGxzbnBzX1FbLDRdLGxkbHNucHNfUVssM10sbGRsc25wc19RWyw0XSkNCmxkbFFfbXJlZ2dlcjEgPC0gbXJlZ2dlcihsZGxzbnBzX1ExWywyXSxsZGxzbnBzX1ExWyw0XSxsZGxzbnBzX1ExWywzXSxsZGxzbnBzX1ExWyw0XSkNCmxkbFFfbXJlZ2dlcjIgPC0gbXJlZ2dlcihsZGxzbnBzX1EyWywyXSxsZGxzbnBzX1EyWyw0XSxsZGxzbnBzX1EyWywzXSxsZGxzbnBzX1EyWyw0XSkNCmxkbFFfbXJlZ2dlcjMgPC0gbXJlZ2dlcihsZGxzbnBzX1EzWywyXSxsZGxzbnBzX1EzWyw0XSxsZGxzbnBzX1EzWywzXSxsZGxzbnBzX1EzWyw0XSkNCmxkbFFfbXJlZ2dlcjQgPC0gbXJlZ2dlcihsZGxzbnBzX1E0WywyXSxsZGxzbnBzX1E0Wyw0XSxsZGxzbnBzX1E0WywzXSxsZGxzbnBzX1E0Wyw0XSkNCmxkbFFfbXJlZ2dlcjUgPC0gbXJlZ2dlcihsZGxzbnBzX1E1WywyXSxsZGxzbnBzX1E1Wyw0XSxsZGxzbnBzX1E1WywzXSxsZGxzbnBzX1E1Wyw0XSkNCmxkbFFfbXJlZ2dlcjYgPC0gbXJlZ2dlcihsZGxzbnBzX1E2WywyXSxsZGxzbnBzX1E2Wyw0XSxsZGxzbnBzX1E2WywzXSxsZGxzbnBzX1E2Wyw0XSkNCmxkbFFfbXJlZ2dlcjcgPC0gbXJlZ2dlcihsZGxzbnBzX1E3WywyXSxsZGxzbnBzX1E3Wyw0XSxsZGxzbnBzX1E3WywzXSxsZGxzbnBzX1E3Wyw0XSkNCmxkbFFfbXJlZ2dlcjggPC0gbXJlZ2dlcihsZGxzbnBzX1E4WywyXSxsZGxzbnBzX1E4Wyw0XSxsZGxzbnBzX1E4WywzXSxsZGxzbnBzX1E4Wyw0XSkNCmxkbFFfbXJlZ2dlcjkgPC0gbXJlZ2dlcihsZGxzbnBzX1E5WywyXSxsZGxzbnBzX1E5Wyw0XSxsZGxzbnBzX1E5WywzXSxsZGxzbnBzX1E5Wyw0XSkNCmxkbFFfbXJlZ2dlcjEwIDwtIG1yZWdnZXIobGRsc25wc19RMTBbLDJdLGxkbHNucHNfUTEwWyw0XSxsZGxzbnBzX1ExMFssM10sbGRsc25wc19RMTBbLDRdKQ0KDQpsZGxtcmVnZ2VyUTwtIHJiaW5kKGxkbFFfbXJlZ2dlcixsZGxRX21yZWdnZXIxLGxkbFFfbXJlZ2dlcjIsbGRsUV9tcmVnZ2VyMyxsZGxRX21yZWdnZXI0LGxkbFFfbXJlZ2dlcjUsbGRsUV9tcmVnZ2VyNixsZGxRX21yZWdnZXI3LGxkbFFfbXJlZ2dlcjgsbGRsUV9tcmVnZ2VyOSxsZGxRX21yZWdnZXIxMCkNCmNvbG5hbWVzKGxkbG1yZWdnZXJRKSA8LSBjKCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCAiUHZhbCIpDQoNCiMgSGRscw0KaGRsUV9tcmVnZ2VyIDwtIG1yZWdnZXIoaGRsc25wc19RWywyXSxoZGxzbnBzX1FbLDRdLGhkbHNucHNfUVssM10saGRsc25wc19RWyw0XSkNCmhkbFFfbXJlZ2dlcjEgPC0gbXJlZ2dlcihoZGxzbnBzX1ExWywyXSxoZGxzbnBzX1ExWyw0XSxoZGxzbnBzX1ExWywzXSxoZGxzbnBzX1ExWyw0XSkNCmhkbFFfbXJlZ2dlcjIgPC0gbXJlZ2dlcihoZGxzbnBzX1EyWywyXSxoZGxzbnBzX1EyWyw0XSxoZGxzbnBzX1EyWywzXSxoZGxzbnBzX1EyWyw0XSkNCmhkbFFfbXJlZ2dlcjMgPC0gbXJlZ2dlcihoZGxzbnBzX1EzWywyXSxoZGxzbnBzX1EzWyw0XSxoZGxzbnBzX1EzWywzXSxoZGxzbnBzX1EzWyw0XSkNCmhkbFFfbXJlZ2dlcjQgPC0gbXJlZ2dlcihoZGxzbnBzX1E0WywyXSxoZGxzbnBzX1E0Wyw0XSxoZGxzbnBzX1E0WywzXSxoZGxzbnBzX1E0Wyw0XSkNCmhkbFFfbXJlZ2dlcjUgPC0gbXJlZ2dlcihoZGxzbnBzX1E1WywyXSxoZGxzbnBzX1E1Wyw0XSxoZGxzbnBzX1E1WywzXSxoZGxzbnBzX1E1Wyw0XSkNCmhkbFFfbXJlZ2dlcjYgPC0gbXJlZ2dlcihoZGxzbnBzX1E2WywyXSxoZGxzbnBzX1E2Wyw0XSxoZGxzbnBzX1E2WywzXSxoZGxzbnBzX1E2Wyw0XSkNCmhkbFFfbXJlZ2dlcjcgPC0gbXJlZ2dlcihoZGxzbnBzX1E3WywyXSxoZGxzbnBzX1E3Wyw0XSxoZGxzbnBzX1E3WywzXSxoZGxzbnBzX1E3Wyw0XSkNCmhkbFFfbXJlZ2dlcjggPC0gbXJlZ2dlcihoZGxzbnBzX1E4WywyXSxoZGxzbnBzX1E4Wyw0XSxoZGxzbnBzX1E4WywzXSxoZGxzbnBzX1E4Wyw0XSkNCmhkbFFfbXJlZ2dlcjkgPC0gbXJlZ2dlcihoZGxzbnBzX1E5WywyXSxoZGxzbnBzX1E5Wyw0XSxoZGxzbnBzX1E5WywzXSxoZGxzbnBzX1E5Wyw0XSkNCmhkbFFfbXJlZ2dlcjEwIDwtIG1yZWdnZXIoaGRsc25wc19RMTBbLDJdLGhkbHNucHNfUTEwWyw0XSxoZGxzbnBzX1ExMFssM10saGRsc25wc19RMTBbLDRdKQ0KaGRsUV9tcmVnZ2VyMTEgPC0gbXJlZ2dlcihoZGxzbnBzX1ExMVssMl0saGRsc25wc19RMTFbLDRdLGhkbHNucHNfUTExWywzXSxoZGxzbnBzX1ExMVssNF0pDQpoZGxRX21yZWdnZXIxMiA8LSBtcmVnZ2VyKGhkbHNucHNfUTEyWywyXSxoZGxzbnBzX1ExMlssNF0saGRsc25wc19RMTJbLDNdLGhkbHNucHNfUTEyWyw0XSkNCmhkbFFfbXJlZ2dlcjEzIDwtIG1yZWdnZXIgKGhkbHNucHNfUTEzWywyXSxoZGxzbnBzX1ExM1ssNF0saGRsc25wc19RMTNbLDNdLGhkbHNucHNfUTEzWyw0XSkNCg0KaGRsbXJlZ2dlclE8LSByYmluZChoZGxRX21yZWdnZXIsaGRsUV9tcmVnZ2VyMSxoZGxRX21yZWdnZXIyLGhkbFFfbXJlZ2dlcjMsaGRsUV9tcmVnZ2VyNCxoZGxRX21yZWdnZXI1LGhkbFFfbXJlZ2dlcjYsaGRsUV9tcmVnZ2VyNyxoZGxRX21yZWdnZXI4LGhkbFFfbXJlZ2dlcjksaGRsUV9tcmVnZ2VyMTAsaGRsUV9tcmVnZ2VyMTEsaGRsUV9tcmVnZ2VyMTIsaGRsUV9tcmVnZ2VyMTMpDQpjb2xuYW1lcyhoZGxtcmVnZ2VyUSkgPC0gYygiRXN0aW1hdGUiLCAiU0UiLCJMSSIsIlVJIiwgIlB2YWwiKQ0KYGBgDQoNClRhYmxlIFxAcmVmKHRhYjpsZGxtcmVnZ2VycSkgc2hvd3MgcmVzdWx0cyBmcm9tIHRoZSBNUi1FZ2dlciBtb2RlbCBmb3IgdGhlIGxpcGlkIGZyYWN0aW9ucyByZWxhdGVkIHRvIExETHMuIFRoZSByZXN1bHRzIHNob3cgbm8gc3Ryb25nIGV2aWRlbmNlIGFnYWluc3Qgbm8gcGxlaW90cm9weSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBgQXZnUGxlaW9gIGJlaW5nIGNsb3NlIHRvIHRoZSBudWxsIHdpdGggbGFyZ2UgcC12YWx1ZXMuDQoNCk5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciBsZGxtcmVnZ2VycSwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Ka2FibGUobGRsbXJlZ2dlclEsIGNhcHRpb24gPSAiTVItRWdnZXIgZXN0aW1hdGVzIGZvciBMRExzIiwgZGlnaXRzID0gNCkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHBhY2tfcm93cygiRnJlZSBjaG9sZXN0ZXJvbCBpbiBJREwiLCAxLCAyKSAlPiUNCiAgcGFja19yb3dzKCJDb25jZW50cmF0aW9uIG9mIElETCBwYXJ0aWNsZXMiLCAzLCA0KSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluIElETCIsIDUsIDYpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyIsIDcsIDgpICU+JQ0KICBwYWNrX3Jvd3MoIkZyZWUgY2hvbGVzdGVyb2wgaW4gbGFyZ2UgTERMIiwgOSwgMTApICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgbGFyZ2UgTERMIHBhcnRpY2xlcyIsIDExLCAxMikgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBMREwiLCAxMywgMTQpICU+JQ0KICBwYWNrX3Jvd3MoIkNob2xlc3Rlcm9sIGVzdGVycyBpbiBtZWRpdW0gTERMIiwgMTUsIDE2KSAlPiUNCiAgcGFja19yb3dzKCJDb25jZW50cmF0aW9uIG9mIG1lZGl1bSBMREwgcGFydGljbGVzIiwgMTcsIDE4KSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBMREwiLCAxOSwgMjApICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2Ygc21hbGwgTERMIHBhcnRpY2xlcyIsIDIxLCAyMikNCmBgYA0KDQpSZXN1bHRzIGZyb20gVGFibGUgXEByZWYodGFiOmhkbG1yZWdnZXJxKSBzaG93IHNvbWUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdmVyYWdlIHBsZWlvdHJvcGljIGVzdGltYXRlcyBhbmQgbm9uLXNpZ25pZmljYW50IGVzdGltYXRlcywgaG93ZXZlciB0aGUgZXN0aW1hdGVzIGFyZSBjbG9zZSB0byB0aGUgbnVsbC4gVGhlIHBvaW50IGVzdGltYXRlIG9mIHRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIHNob3dzIGFuIGluY3JlYXNlIGNvbXBhcmVkIHRvIGl0cyBJVlcgZXN0aW1hdGUsIGFuZCB3ZSBub3RlIHRoYXQgYm90aCBhcmUgcG9zaXRpdmUuIFRoZXJlIHdhcyBubyBldmlkZW5jZSBhZ2FpbnN0IG5vIHBsZWlvdHJvcHkgZm9yIHRoaXMgZXN0aW1hdGUuIEZpZ3VyZSBcQHJlZihmaWc6dHJpcGxvdCkgc2hvd3MgdGhlIGFzc29jaWF0aW9uIG9mIHRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIGFuZCBpc2NoZW1pYyBzdHJva2UuIE5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLiAgIA0KDQpgYGB7ciBoZGxtcmVnZ2VycSwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Ka2FibGUoaGRsbXJlZ2dlclEsIGNhcHRpb24gPSAiTVItRWdnZXIgZXN0aW1hdGVzIGZvciBIRExzIiwgZGlnaXRzID0gNCkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHBhY2tfcm93cygiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIGxhcmdlIEhETCIsIDEsIDIpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgbGFyZ2UgSERMIHBhcnRpY2xlcyIsIDMsIDQpICU+JQ0KICBwYWNrX3Jvd3MoIlBob3NwaG9saXBpZHMgaW4gbGFyZ2UgSERMIiwgNSwgNikgJT4lDQogIHBhY2tfcm93cygiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBIREwiLCA3LCA4KSAlPiUNCiAgcGFja19yb3dzKCJGcmVlIGNob2xlc3Rlcm9sIGluIG1lZGl1bSBIREwiLCA5LCAxMCkgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gSERMIHBhcnRpY2xlcyIsIDExLCAxMikgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiBtZWRpdW0gSERMIiwgMTMsIDE0KSAlPiUNCiAgcGFja19yb3dzKCJDb25jZW50cmF0aW9uIG9mIHNtYWxsIEhETCBwYXJ0aWNsZXMiLCAxNSwgMTYpICU+JQ0KICBwYWNrX3Jvd3MoIlRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIiwgMTcsIDE4KSAlPiUNCiAgcGFja19yb3dzKCJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gdmVyeSBsYXJnZSBIREwiLCAxOSwgMjApICU+JQ0KICBwYWNrX3Jvd3MoIkZyZWUgY2hvbGVzdGVyb2wgaW4gdmVyeSBsYXJnZSBIREwiLCAyMSwgMjIpJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBIREwgcGFydGljbGVzIiwgMjMsIDI0KSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluICB2ZXJ5IGxhcmdlIEhETCIsIDI1LCAyNikgJT4lDQogIHBhY2tfcm93cygiVHJpZ2x5Y2VyaWRlcyBpbiB2ZXJ5IGxhcmdlIEhETCIsIDI3LCAyOCkNCmBgYA0KDQoNCmBgYHtyIHRyaXBsb3QsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRSwgZmlnLmNhcD0iQXNzb2NpYXRpb24gb2YgdHJpZ2x5Y2VyaWRlcyBpbiBzbWFsbCBIRExzIGFuZCBpc2NoZW1pYyBzdHJva2UuIENhdXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgaW4gaW50ZXJwcmV0aW5nIHRoZXNlIGRhdGEgYXMgdGhlIFNOUHMgdXNlZCBhcmUgcGxlaW90cm9waWMuIiwgZmlnLmFsaWduPSJjZW50ZXIifQ0KdHJpZGF0PC0gZGF0YS5mcmFtZShpbnRlcmNlcHQgPSBjKDAsaGRsUV9tcmVnZ2VyOFsxLDFdKSwgc2xvcGUgPSBjKGhkbFFfaXZ3OFsxXSxoZGxRX21yZWdnZXI4WzIsMV0pLCBtb2RlbCA9IGMoIklWVyIsIk1SLUVnZ2VyIikpDQoNCmdncGxvdChkYXRhID0gaGRsc25wc19ROCwgYWVzKHhiZXRhLHliZXRhKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fYWJsaW5lKGRhdGEgPSB0cmlkYXQsIGFlcyhpbnRlcmNlcHQgPSBpbnRlcmNlcHQsIHNsb3BlID0gc2xvcGUsIGNvbG91cj1tb2RlbCkpICsgDQogIHhsYWIoZXhwcmVzc2lvbihiZXRhW3hdKSkgKyANCiAgeWxhYihleHByZXNzaW9uKGJldGFbeV0pKQ0KYGBgDQoNCiMjIyBNZXRhLWFuYWx5c2lzIG9mIGV4cG9zdXJlIHRyYWl0cw0KDQpTZWxlY3Rpb24gb2YgU05QcyB0aHJvdWdoIHRoZWlyIGluZGl2aWR1YWwgY29udHJpYnV0aW9uIHRvIHRoZSBRLXN0YXRpc3RpY3MgeWllbGRlZCBhIGxhcmdlIG51bWJlciBvZiBpbnN0cnVtZW50cyBhbmQgdGhlcmVmb3JlIHN0YXRpc3RpY2FsIHBvd2VyLiBBcyBiZWZvcmUsIHdlIHNvdWdodCB0byBjb21iaW5lIGNhdGVnb3JpZXMgb2YgdHJhaXRzIHRvIGluY3JlYXNlIHBvd2VyIGZ1cnRoZXIuDQoNClRoZSBtZXRhLWFuYWx5c2lzIGV4cG9zdXJlIHRyYWl0IGVzdGltYXRlcyBpbiBUYWJsZSBcQHJlZih0YWI6bWV0YVFsZGwpIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB3aXRoIHRoZSBlc3RpbWF0ZSBmb3IgY2hvbGVzdGVyb2wgZXN0ZXJzIGJlaW5nIHRoZSBsYXJnZXN0IGluIG1hZ25pdHVkZS4gVGhlIHJlc3VsdHMgaW4gVGFibGUgXEByZWYodGFiOm1ldGFRaGRsKSBzaG93IHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGluIHRlcm1zIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYXBhcnQgZnJvbSByaXNrIGNhdGVnb3JpZXMgb2YgdHJpZ2x5Y2VyaWRlcyByZWxhdGVkIHRvIEhETHMgd2hpY2ggc2hvdyBhIHBvc2l0aXZlIGVmZmVjdCBlc3RpbWF0ZSB3aXRoIGEgbGFyZ2UgcC12YWx1ZXMuDQoNCk5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciBtZXRhUWxkbCwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0KIyBMREwNCmZyZWVRX2xkbCA8LSByYmluZChsZGxpdndRWzEsXSxsZGxpdndRWzUsXSkNCmZyZWVRX21ldGE8LSBtZXRhZ2VuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFNFKSksIGRhdGEgPSBmcmVlUV9sZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJGcmVlIENob2xlc3Rlcm9sIikNCnJlc2ZyZWVRPC0gYyhmcmVlUV9tZXRhJGssZnJlZVFfbWV0YSRURS5yYW5kb20sZnJlZVFfbWV0YSRzZVRFLnJhbmRvbSxmcmVlUV9tZXRhJGxvd2VyLnJhbmRvbSxmcmVlUV9tZXRhJHVwcGVyLnJhbmRvbSxmcmVlUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQoNCmNvblFfbGRsIDwtIHJiaW5kKGxkbGl2d1FbMixdLGxkbGl2d1FbNixdLGxkbGl2d1FbOSxdLGxkbGl2d1FbMTEsXSkNCmNvblFfbWV0YTwtIG1ldGFnZW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSksYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU0UpKSwgZGF0YSA9IGNvblFfbGRsLCBzdHVkbGFiID0gcGFzdGUoRXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ29uY2VudHJhdGlvbiIpDQpyZXNjb25RPC0gYyhjb25RX21ldGEkayxjb25RX21ldGEkVEUucmFuZG9tLGNvblFfbWV0YSRzZVRFLnJhbmRvbSxjb25RX21ldGEkbG93ZXIucmFuZG9tLGNvblFfbWV0YSR1cHBlci5yYW5kb20sY29uUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQoNCnBob1FfbGRsIDwtIHJiaW5kKGxkbGl2d1FbMyxdLGxkbGl2d1FbNyxdLGxkbGl2d1FbMTAsXSkNCnBob1FfbWV0YTwtIG1ldGFnZW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSksYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU0UpKSwgZGF0YSA9IHBob1FfbGRsLCBzdHVkbGFiID0gcGFzdGUoRXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiUGhvc3Bob2xpcGlkcyIpDQpyZXNwaG9RPC0gYyhwaG9RX21ldGEkayxwaG9RX21ldGEkVEUucmFuZG9tLHBob1FfbWV0YSRzZVRFLnJhbmRvbSxwaG9RX21ldGEkbG93ZXIucmFuZG9tLHBob1FfbWV0YSR1cHBlci5yYW5kb20scGhvUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQpjaG9sUV9sZGwgPC0gcmJpbmQobGRsaXZ3UVs0LF0sbGRsaXZ3UVs4LF0pDQpjaG9sUV9tZXRhPC0gbWV0YWdlbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSxhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTRSkpLCBkYXRhID0gY2hvbFFfbGRsLCBzdHVkbGFiID0gcGFzdGUoRXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ2hvbGVzdGVyb2wgZXN0ZXJzIikNCnJlc2Nob2xRPC0gYyhjaG9sUV9tZXRhJGssY2hvbFFfbWV0YSRURS5yYW5kb20sY2hvbFFfbWV0YSRzZVRFLnJhbmRvbSxjaG9sUV9tZXRhJGxvd2VyLnJhbmRvbSxjaG9sUV9tZXRhJHVwcGVyLnJhbmRvbSxjaG9sUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQptZXRhUV9sZGwgPC0gcmJpbmQocmVzZnJlZVEscmVzY29uUSxyZXNwaG9RLHJlc2Nob2xRKQ0KY29sbmFtZXMobWV0YVFfbGRsKSA8LSBjKCJOIiwiRXN0aW1hdGUiLCAiU0UiLCJMSSIsIlVJIiwiUHZhbCIpDQpyb3duYW1lcyhtZXRhUV9sZGwpIDwtIGMoIkZyZWUgQ2hvbGVzdGVyb2wiLCJDb25jZW50cmF0aW9uIiwiUGhvc3Bob2xpcGlkcyIsIkNob2xlc3Rlcm9sIGVzdGVycyIpDQoNCm1ldGFRX2xkbCA8LSBhcy5kYXRhLmZyYW1lKG1ldGFRX2xkbCkNCg0Ka2FibGUobWV0YVFfbGRsLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgcmlzayBmYWN0b3JzIGZvciBMRExzIHVzaW5nIElWVyBlc3RpbWF0ZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFQpDQpgYGANCg0KYGBge3IgbWV0YVFoZGwsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCmNob2xRX2hkbDwtIHJiaW5kKGhkbGl2d1FbMSxdLGhkbGl2d1FbNCxdLGhkbGl2d1FbMTAsXSkNCmNob2xRX21ldGE8LSBtZXRhZ2VuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFNFKSksIGRhdGEgPSBjaG9sUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJDaG9sZXN0ZXJvbCBlc3RlcnMiKQ0KcmVzY2hvbFE8LSBjKGNob2xRX21ldGEkayxjaG9sUV9tZXRhJFRFLnJhbmRvbSxjaG9sUV9tZXRhJHNlVEUucmFuZG9tLGNob2xRX21ldGEkbG93ZXIucmFuZG9tLGNob2xRX21ldGEkdXBwZXIucmFuZG9tLGNob2xRX21ldGEkcHZhbC5yYW5kb20pDQoNCmNvblFfaGRsPC0gcmJpbmQoaGRsaXZ3UVsyLF0saGRsaXZ3UVs2LF0saGRsaXZ3UVs4LF0saGRsaXZ3UVsxMixdKQ0KY29uUV9tZXRhPC0gbWV0YWdlbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSxhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTRSkpLCBkYXRhID0gY29uUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJDb25jZW50cmF0aW9uIikNCnJlc2NvblE8LSBjKGNvblFfbWV0YSRrLGNvblFfbWV0YSRURS5yYW5kb20sY29uUV9tZXRhJHNlVEUucmFuZG9tLGNvblFfbWV0YSRsb3dlci5yYW5kb20sY29uUV9tZXRhJHVwcGVyLnJhbmRvbSxjb25RX21ldGEkcHZhbC5yYW5kb20pDQoNCnBob1FfaGRsPC0gcmJpbmQoaGRsaXZ3UVszLF0saGRsaXZ3UVs3LF0saGRsaXZ3UVsxMSxdKQ0KcGhvUV9tZXRhPC0gbWV0YWdlbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSxhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTRSkpLCBkYXRhID0gcGhvUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJQaG9zcGhvbGlwaWRzIikNCnJlc3Bob1E8LSBjKHBob1FfbWV0YSRrLHBob1FfbWV0YSRURS5yYW5kb20scGhvUV9tZXRhJHNlVEUucmFuZG9tLHBob1FfbWV0YSRsb3dlci5yYW5kb20scGhvUV9tZXRhJHVwcGVyLnJhbmRvbSxwaG9RX21ldGEkcHZhbC5yYW5kb20pDQoNCnRyaWdRX2hkbDwtIHJiaW5kKGhkbGl2d1FbOSxdLGhkbGl2d1FbMTQsXSkNCnRyaWdRX21ldGE8LSBtZXRhZ2VuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFNFKSksIGRhdGEgPSB0cmlnUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJUcmlnbHljZXJpZGVzIikNCnJlc3RyaWdRPC0gYyh0cmlnUV9tZXRhJGssdHJpZ1FfbWV0YSRURS5yYW5kb20sdHJpZ1FfbWV0YSRzZVRFLnJhbmRvbSx0cmlnUV9tZXRhJGxvd2VyLnJhbmRvbSx0cmlnUV9tZXRhJHVwcGVyLnJhbmRvbSx0cmlnUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQptZXRhUV9oZGw8LSByYmluZChyZXNjaG9sUSxyZXNjb25RLHJlc3Bob1EscmVzdHJpZ1EpDQpjb2xuYW1lcyhtZXRhUV9oZGwpIDwtIGMoIk4iLCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCJQdmFsIikNCnJvd25hbWVzKG1ldGFRX2hkbCkgPC0gYygiQ2hvbGVzdGVyb2wgZXN0ZXJzIiwiQ29uY2VudHJhdGlvbiIsIlBob3NwaG9saXBpZHMiLCJUcmlnbHljZXJpZGVzIikNCg0Ka2FibGUobWV0YVFfaGRsLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgcmlzayBmYWN0b3JzIGZvciBIRExzIHVzaW5nIElWVyBlc3RpbWF0ZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFQpDQpgYGANCg0KDQojIyMgTXVsdGl2YXJpYXRlIE1ldGEtYW5hbHlzaXMgb2YgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KIyMjIyAgRnJlZSBDaG9sZXN0ZXJvbA0KYmV0YVFsZGwxPC0gbWF0cml4KG5yb3cgPSAyLCBuY29sID0gMiwgTkEpDQoNCmJldGFRbGRsMVsxLF0gPC0gYyhsZGxtcmVnZ2VyUVsxLDFdLGxkbG1yZWdnZXJRWzIsMV0pDQpiZXRhUWxkbDFbMixdIDwtIGMobGRsbXJlZ2dlclFbOSwxXSxsZGxtcmVnZ2VyUVsxMCwxXSkNCg0KbGRsMVFjb3Y8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbMSwyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzIsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGwyUWNvdjwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVs5LDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbMTAsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQoNCnNtYXRRbGlzdDE8LSBsaXN0KGxkbDFjb3YsIGxkbDJjb3YpDQpsZGwxbXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDEsIHNtYXRRbGlzdDEpDQoNCiMjIyMgQ29uY2VudHJhdGlvbg0KYmV0YVFsZGwzPC0gbWF0cml4KG5yb3cgPSA0LCBuY29sID0gMiwgTkEpDQoNCmJldGFRbGRsM1sxLF0gPC0gYyhsZGxtcmVnZ2VyUVszLDFdLGxkbG1yZWdnZXJRWzQsMV0pDQpiZXRhUWxkbDNbMixdIDwtIGMobGRsbXJlZ2dlclFbMTEsMV0sbGRsbXJlZ2dlclFbMTIsMV0pDQpiZXRhUWxkbDNbMyxdIDwtIGMobGRsbXJlZ2dlclFbMTcsMV0sbGRsbXJlZ2dlclFbMTgsMV0pDQpiZXRhUWxkbDNbNCxdIDwtIGMobGRsbXJlZ2dlclFbMjEsMV0sbGRsbXJlZ2dlclFbMjIsMV0pDQoNCmxkbFF2Y29vdlE8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbMywyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzQsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGxRdmNvb3ZRMTwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVsxMSwyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzEyLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KbGRsUXZjb292UTI8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbMTcsMl0pXjIsMCwwLChsZGxtcmVnZ2VyUVsxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbFF2Y29vdlEzPC0gbWF0cml4KGMoKGxkbG1yZWdnZXJRWzIxLDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbMjIsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQoNCnNtYXRRbGlzdDM8LSBsaXN0KGxkbFF2Y29vdlEsIGxkbFF2Y29vdlExLCBsZGxRdmNvb3ZRMiwgbGRsUXZjb292UTMpDQpsZGwzbXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDMsIHNtYXRRbGlzdDMpDQoNCiMjIyMgcGhvc3Bob2xpcGlkcw0KYmV0YVFsZGw0PC0gbWF0cml4KG5yb3cgPSAzLCBuY29sID0gMiwgTkEpDQoNCmJldGFRbGRsNFsxLF0gPC0gYyhsZGxtcmVnZ2VyUVs1LDFdLGxkbG1yZWdnZXJRWzYsMV0pDQpiZXRhUWxkbDRbMixdIDwtIGMobGRsbXJlZ2dlclFbMTMsMV0sbGRsbXJlZ2dlclFbMTQsMV0pDQpiZXRhUWxkbDRbMyxdIDwtIGMobGRsbXJlZ2dlclFbMTksMV0sbGRsbXJlZ2dlclFbMjAsMV0pDQoNCmxkbDFjb292UTwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVs1LDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbNiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbDJjb292UTwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVsxMywyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzE0LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KbGRsM2Nvb3ZRPC0gbWF0cml4KGMoKGxkbG1yZWdnZXJRWzE5LDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbMjAsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQoNCnNtYXRRbGlzdDQ8LSBsaXN0KGxkbDFjb292USwgbGRsMmNvb3ZRLCBsZGwzY29vdlEpDQpsZGw0bXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDQsIHNtYXRRbGlzdDQpDQoNCiMjIyMgQ2hvbGVzdGVyb2wgZXN0ZXJzDQpiZXRhUWxkbDU8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFsZGw1WzEsXSA8LSBjKGxkbG1yZWdnZXJRWzcsMV0sbGRsbXJlZ2dlclFbOCwxXSkNCmJldGFRbGRsNVsyLF0gPC0gYyhsZGxtcmVnZ2VyUVsxNSwxXSxsZGxtcmVnZ2VyUVsxNiwxXSkNCg0KbGRkbDFjb3Y8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbNywyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzgsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGRsMmNvdjwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVsxNSwyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzE2LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpzbWF0UWxpc3Q1PC0gbGlzdChsZGRsMWNvdiwgbGRkbDJjb3YpDQpsZGw1bXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDUsIHNtYXRRbGlzdDUpDQoNCiMjIyMgY29sbGF0ZSByZXN1bHRzDQp0cmFpdHNfbGRsbXZtZXRhUSA8LQ0KICByYmluZCgNCiAgYyhsZGxtZXRhbjIkayx1bm5hbWUobGRsMW12bWV0YVEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGxkbDFtdm1ldGFRKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsMW12bWV0YVEpJGNvZWZbMiwgNF0pLA0KICBjKGxkbG1ldGFuMyRrLHVubmFtZShsZGwzbXZtZXRhUSRjb2VmZmljaWVudHMpLHN1bW1hcnkobGRsM212bWV0YVEpJGNvZWZbMSwgNF0sc3VtbWFyeShsZGwzbXZtZXRhUSkkY29lZlsyLCA0XSksDQogIGMobGRsbWV0YW40JGssdW5uYW1lKGxkbDRtdm1ldGFRJGNvZWZmaWNpZW50cyksc3VtbWFyeShsZGw0bXZtZXRhUSkkY29lZlsxLCA0XSxzdW1tYXJ5KGxkbDRtdm1ldGFRKSRjb2VmWzIsIDRdKSwNCiAgYyhsZGxtZXRhbjUkayx1bm5hbWUobGRsNW12bWV0YVEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGxkbDVtdm1ldGFRKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsNW12bWV0YVEpJGNvZWZbMiwgNF0pDQogICkNCnJvd25hbWVzKHRyYWl0c19sZGxtdm1ldGFRKTwtIGMoIkZyZWUgQ2hvbGVzdGVyb2wiLCJDb25jZW50cmF0aW9uIiwiUGhvc3Bob2xpcGlkcyIsIkNob2xlc3Rlcm9sIGVzdGVycyIpDQpjb2xuYW1lcyh0cmFpdHNfbGRsbXZtZXRhUSk8LSBjKCJOIiwiQVZnIFBsZWlvIiwgIlNsb3BlIiwgIlB2YWwoUGxlaW8pIiwgIlB2YWwoRXN0KSIpDQpgYGANCg0KV2UgZXhwbG9yZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBNUi1FZ2dlciBtb2RlbCB1c2luZyBtdWx0aXZhcmlhdGUgbWV0YS1hbmFseXNpcywgdGhlIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCBvbiB0aGUgcmlzayBmYWN0b3IgY2F0ZWdvcmllcyBmb3IgTERMcyAoVGFibGUgXEByZWYodGFiOmxkbG12bWV0YVEpKSBhbmQgSERMcyAoVGFibGUgXEByZWYodGFiOmhkbG12bWV0YVEpKS4gUmVzdWx0cyBmcm9tIFRhYmxlIFxAcmVmKHRhYjpsZGxtdm1ldGFRKSBzaG93IG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW50ZXJjZXB0IGVzdGltYXRlcyBleGNlcHQgZm9yIHRoZSBwaG9zcGhvbGlwaWRzIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMuIFRoZSBzbG9wZSBmb3IgdGhlIGNob2xlc3Rlcm9sIGVzdGVycyBhbmQgY29uY2VudHJhdGlvbiBncm91cHMgc2hvdyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIA0KDQpGcm9tIFRhYmxlIFxAcmVmKHRhYjpoZGxtdm1ldGFRKSwgdGhlIHJpc2sgZmFjdG9yIGdyb3VwIG9mIHRyaWdseWNlcmlkZXMgaW4gSERMcyBzaG93IGVzdGltYXRlcyBvZiB0aGUgaW50ZXJjZXB0IGFuZCBzbG9wZSBvZiBubyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIFRoZSBvdGhlciByaXNrIGZhY3RvciBncm91cHMgaGF2ZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGludGVyY2VwdCBlc3RpbWF0ZXMgYW5kIG5vbiBzaWduaWZpY2FudCBzbG9wZXMuDQoNCldlIG5vdGUgdGhhdCB0aGUgc2FtZSBTTlBzIGhhdmUgYmVlbiB1c2VkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGV4cG9zdXJlcywgYW5kIHRoZW4gZml0dGVkIGluIGEgbXVsdGl2YXJpYXRlIG1ldGEtYW5hbHlzaXMgbW9kZWwuIFRvIG91ciBtaW5kcyB0aGUgbXVsdGl2YXJpYXRlIG1ldGEtYW5hbHlzaXMgb2YgdGhlc2UgTVItRWdnZXIgZXN0aW1hdGVzIGNhbm5vdCB5aWVsZCB2YWxpZCBjYXVzYWwgZXN0aW1hdGVzIGdpdmVuIHRoYXQgaW4gZWZmZWN0IHRoZSBzYW1lIFNOUHMgYXJlIHVzZWQgdG8gaW5zdHJ1bWVudCBkaWZmZXJlbnQgZXhwb3N1cmVzLg0KDQpgYGB7ciBsZGxtdm1ldGFRLCBpbmNsdWRlPVRSVUUsZWNobyA9RkFMU0V9DQp0cmFpdHNfbGRsbXZtZXRhUSA8LSBhcy5kYXRhLmZyYW1lKHRyYWl0c19sZGxtdm1ldGFRKQ0KDQp0cmFpdHNfbGRsbXZtZXRhUSAlPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiUmVzdWx0cyBmcm9tIE11bHRpdmFyaWF0ZSBNZXRhLWFuYWx5c2lzIExETCByaXNrIGZhY3RvciBjYXRlZ29yaWVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KIyMgQ2hvbGVzdGVyb2wgZXN0ZXJzDQpiZXRhUWhkbDE8LSBtYXRyaXgobnJvdyA9IDMsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFoZGwxWzEsXSA8LSBjKGhkbG1yZWdnZXJRWzEsMV0saGRsbXJlZ2dlclFbMiwxXSkNCmJldGFRaGRsMVsyLF0gPC0gYyhoZGxtcmVnZ2VyUVs3LDFdLGhkbG1yZWdnZXJRWzgsMV0pDQpiZXRhUWhkbDFbMyxdIDwtIGMoaGRsbXJlZ2dlclFbMTksMV0saGRsbXJlZ2dlclFbMjAsMV0pDQoNCnNoZGwxUWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsxLDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCnNoZGwyUWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVs3LDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCnNoZGwzUWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsxOSwyXSleMiwwLDAsKGhkbG1yZWdnZXJRWzIwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQoNCmhzbWF0UWxpc3QxPC0gbGlzdChzaGRsMVFjb3YsIHNoZGwyUWNvdiwgc2hkbDNRY292KQ0KaGRsMW12bWV0YVE8LSBtdm1ldGEoYmV0YVFoZGwxLCBoc21hdFFsaXN0MSkNCg0KIyMgY29uY2VudHJhdGlvbg0KYmV0YVFoZGwyPC0gbWF0cml4KG5yb3cgPSA0LCBuY29sID0gMiwgTkEpDQoNCmJldGFRaGRsMlsxLF0gPC0gYyhoZGxtcmVnZ2VyUVszLDFdLGhkbG1yZWdnZXJRWzQsMV0pDQpiZXRhUWhkbDJbMixdIDwtIGMoaGRsbXJlZ2dlclFbMTEsMV0saGRsbXJlZ2dlclFbMTIsMV0pDQpiZXRhUWhkbDJbMyxdIDwtIGMoaGRsbXJlZ2dlclFbMTUsMV0saGRsbXJlZ2dlclFbMTYsMV0pDQpiZXRhUWhkbDJbNCxdIDwtIGMoaGRsbXJlZ2dlclFbMjMsMV0saGRsbXJlZ2dlclFbMjQsMV0pDQoNCmhkbDFRY292PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzMsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVs0LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KaGRsMlFjb3Y8LSBtYXRyaXgoYygoaGRsbXJlZ2dlclFbMTEsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVsxMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmhkbDNRY292PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzE1LDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbMTYsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpoZGw0UWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsyMywyXSleMiwwLDAsKGhkbG1yZWdnZXJRWzI0LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpoc21hdFFsaXN0MjwtIGxpc3QoaGRsMVFjb3YsIGhkbDJRY292LCBoZGwzUWNvdiwgaGRsNFFjb3YpDQpoZGwybXZtZXRhUTwtIG12bWV0YShiZXRhUWhkbDIsIGhzbWF0UWxpc3QyKQ0KDQojIyBwaG9zcGhvbGlwaWRzDQpiZXRhUWhkbDM8LSBtYXRyaXgobnJvdyA9IDMsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFoZGwzWzEsXSA8LSBjKGhkbG1yZWdnZXJRWzUsMV0saGRsbXJlZ2dlclFbNiwxXSkNCmJldGFRaGRsM1syLF0gPC0gYyhoZGxtcmVnZ2VyUVsxMywxXSxoZGxtcmVnZ2VyUVsxNCwxXSkNCmJldGFRaGRsM1szLF0gPC0gYyhoZGxtcmVnZ2VyUVsyMSwxXSxoZGxtcmVnZ2VyUVsyMiwxXSkNCg0KaGRsMVFjb3Z2PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzUsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVs2LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KaGRsMlFjb3Z2PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzEyLDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbMTQsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpoZGwzUWNvdnY8LSBtYXRyaXgoYygoaGRsbXJlZ2dlclFbMjEsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVsyMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0KaHNtYXRRbGlzdDM8LSBsaXN0KGhkbDFRY292diwgaGRsMlFjb3Z2LCBoZGwzUWNvdnYpDQpoZGwzbXZtZXRhUTwtIG12bWV0YShiZXRhUWhkbDMsIGhzbWF0UWxpc3QzKQ0KDQojIyB0cmlnbHljZXJpZGVzDQpiZXRhUWhkbDQ8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFoZGw0WzEsXSA8LSBjKGhkbG1yZWdnZXJRWzE3LDFdLGhkbG1yZWdnZXJRWzE4LDFdKQ0KYmV0YVFoZGw0WzIsXSA8LSBjKGhkbG1yZWdnZXJRWzI3LDFdLGhkbG1yZWdnZXJRWzI4LDFdKQ0KDQpoZGwxUWNjb3Y8LSBtYXRyaXgoYygoaGRsbXJlZ2dlclFbMTcsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVsxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmhkbDJRY2NvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsyNywyXSleMiwwLDAsKGhkbG1yZWdnZXJRWzI4LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpoc21hdFFsaXN0NDwtIGxpc3QoaGRsMVFjY292LCBoZGwyUWNjb3YpDQpoZGw0bXZtZXRhUTwtIG12bWV0YShiZXRhUWhkbDQsIGhzbWF0UWxpc3Q0KQ0KDQp0cmFpdHNfaGRsbXZtZXRhUSA8LSByYmluZCggcmJpbmQoDQogIGModW5uYW1lKGhkbDFtdm1ldGFRJGNvZWZmaWNpZW50cyksc3VtbWFyeShoZGwxbXZtZXRhUSkkY29lZlsxLCA0XSxzdW1tYXJ5KGhkbDFtdm1ldGFRKSRjb2VmWzIsIDRdKSwNCiAgYyh1bm5hbWUoaGRsMm12bWV0YVEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGhkbDJtdm1ldGFRKSRjb2VmWzEsIDRdLHN1bW1hcnkoaGRsMm12bWV0YVEpJGNvZWZbMiwgNF0pLA0KICBjKHVubmFtZShoZGwzbXZtZXRhUSRjb2VmZmljaWVudHMpLHN1bW1hcnkoaGRsM212bWV0YVEpJGNvZWZbMSwgNF0sc3VtbWFyeShoZGwzbXZtZXRhUSkkY29lZlsyLCA0XSksDQogIGModW5uYW1lKGhkbDRtdm1ldGFRJGNvZWZmaWNpZW50cyksc3VtbWFyeShoZGw0bXZtZXRhUSkkY29lZlsxLCA0XSxzdW1tYXJ5KGhkbDRtdm1ldGFRKSRjb2VmWzIsIDRdKQ0KICApKQ0KDQpzdHVkeTwtIGMoMyw0LDMsMikNCg0KdHJhaXRzX2hkbG12bWV0YVE8LSBjYmluZChzdHVkeSx0cmFpdHNfaGRsbXZtZXRhUSkNCnJvd25hbWVzKHRyYWl0c19oZGxtdm1ldGFRKTwtIGMoIkNob2xlc3Rlcm9sIGVzdGVycyIsIkNvbmNlbnRyYXRpb24iLCJQaG9zcGhvbGlwaWRzIiwiVHJpZ2x5Y2VyaWRlcyIpDQpjb2xuYW1lcyh0cmFpdHNfaGRsbXZtZXRhUSk8LSBjKCJOIiwiQVZnIFBsZWlvIiwgIlNsb3BlIiwgIlB2YWwoUGxlaW8pIiwgIlB2YWwoRXN0KSIpDQpgYGANCg0KDQpgYGB7ciBoZGxtdm1ldGFRLCBpbmNsdWRlPVRSVUUsZWNobyA9RkFMU0V9DQp0cmFpdHNfaGRsbXZtZXRhUSA8LSBhcy5kYXRhLmZyYW1lKHRyYWl0c19oZGxtdm1ldGFRKQ0KDQp0cmFpdHNfaGRsbXZtZXRhUSAlPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiUmVzdWx0cyBmcm9tIE11bHRpdmFyaWF0ZSBNZXRhLWFuYWx5c2lzIEhETCByaXNrIGZhY3RvciBjYXRlZ29yaWVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCiMjIE1WTVIgb2YgQ29uY2VudHJhdGlvbg0KDQpXZSB3ZXJlIGFkZGl0aW9uYWxseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgbXV0dWFsbHkgYWRqdXN0aW5nIGZvciBsaXBpZCB0cmFpdHMgaW4gb3VyIElWVyBtb2RlbHMgd291bGQgYWZmZWN0IG91ciBjYXVzYWwgZWZmZWN0cy4gV2UgdGhlcmVmb3JlIGZpdHRlZCBNVk1SIG1vZGVscyBhcyBzaG93biBpbiBGaWd1cmUgXEByZWYoZmlnOm12ZGFnKS4gDQpgYGB7ciBtdmRhZywgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9IkRpcmVjdGVkIGFjeWNsaWMgZ3JhcGggKERBRykgb2YgTXVsdGl2YXJpYWJsZSBNUiBhbmFseXNpcyBvZiBjb25jZW50cmF0aW9uIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgaW4gTERMcy4ifQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KICAgICAgZGlncmFwaCBtcmRhZyB7DQoNCiAgICAgIGdyYXBoIFtyYW5rZGlyPVRCLCBsYXlvdXQ9bmVhdG9dDQoNCiAgICAgIG5vZGUgW3NoYXBlPWJveCxlaWdodD0wLjMsIHdpZHRoPTAuM10NCiAgICAgIFUgW2xhYmVsPSdDb25mb3VuZGVycycsIHBvcz0nMywxISddDQogICAgICANCiAgICAgIG5vZGUgW3NoYXBlPWJveCwgaGVpZ2h0PTAuNSwgd2lkdGg9MC41XQ0KICAgICAgWTEgW2xhYmVsPSdJc2NoZW1pYyBTdHJva2UnLCBwb3M9JzQsLTEhJ10NCg0KICAgICAgbm9kZSBbc2hhcGU9Ym94LCBoZWlnaHQ9MC4zLCB3aWR0aD0wLjNdDQogICAgICBHMSBbbGFiZWw9J0dAX3sxfScsIHBvcz0nMCwtMSEnXQ0KCSAgICBHMiBbbGFiZWw9J0dAX3tKfScsIHBvcz0nMCwtMiEnXQ0KICAgICAgWDEgW2xhYmVsPSdTbWFsbCBMREwnLCBwb3M9JzIsMCEnXQ0KICAgICAgWDIgW2xhYmVsPSdNZWRpdW0gTERMJywgcG9zPScyLC0xISddDQogICAgICBYMyBbbGFiZWw9J0xhcmdlIExETCcsIHBvcz0nMiwtMiEnXQ0KICAgICAgWDQgW2xhYmVsPSdJREwnLCBwb3M9JzIsLTMhJ10NCiAgICAgIA0KICAgICAgeyByYW5rID0gc2FtZTsgIFkxIH0NCg0KICAgICAgRzEgLT4ge1gxLFgyLFgzLFg0fQ0KCSAgICBHMiAtPiB7WDEsWDIsWDMsWDR9DQogICAgICBVIC0+IFgxDQogICAgICBVIC0+IFgyDQogICAgICBVIC0+IFgzDQogICAgICBVIC0+IFg0DQogICAgICBVIC0+IFkxDQogICAgICBYMSxYMixYMyxYNCAtPiB7WTF9DQogICAgICANCiAgICAgIH0NCiAgICAgICIsIGhlaWdodCA9IDMwMCkNCmBgYA0KDQpXZSBmaXR0ZWQgTVZNUiBtb2RlbHMgdXNpbmcgdGhlIGBNVk1SYCBwYWNrYWdlIFtAc3BpbGxlci1tdm1yXS4gV2UgaW52ZXN0aWdhdGVkIGludmFsaWQgaW5zdHJ1bWVudHMgdXNpbmcgZWFjaCBnZW5vdHlwZSdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgYWRqdXN0ZWQgUS1zdGF0aXN0aWMgW0BzYW5kZXJzb24taWplLTIwMThdIGFuZCBvbmx5IGZvdW5kIDIgb3V0bHlpbmcgZ2Vub3R5cGVzLCBoZW5jZSBmb3Igc2ltcGxpY2l0eSB3ZSBwZXJmb3JtZWQgdGhlc2UgYW5hbHlzZXMgdXNpbmcgYWxsIDE0OCBnZW5vdHlwZXMuDQoNCmBgYHtyfQ0KY29uY2VsZGw8LSBjKCJDb25jZW50cmF0aW9uIG9mIElETCBwYXJ0aWNsZXMiLA0KICAgICAgICAgICAgICJDb25jZW50cmF0aW9uIG9mIExhcmdlIExETCBwYXJ0aWNsZXMiLA0KICAgICAgICAgICAgICJDb25jZW50cmF0aW9uIG9mIE1lZGl1bSBMREwgcGFydGljbGVzIiwgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICJDb25jZW50cmF0aW9uIG9mIFNtYWxsIHBhcnRpY2xlcyIpDQoNCmNvbmNlaGRsPC0gYygiQ29uY2VudHJhdGlvbiBvZiBMYXJnZSBIREwgcGFydGljbGVzIiwNCiAgICAgICAgICAgICAiQ29uY2VudHJhdGlvbiBvZiBNZWRpdW0gSERMIHBhcnRpY2xlcyIsDQogICAgICAgICAgICAgIkNvbmNlbnRyYXRpb24gb2YgU21hbGwgSERMIHBhcnRpY2xlcyIsDQogICAgICAgICAgICAgIkNvbmNlbnRyYXRpb24gb2YgVmVyeSBMYXJnZSBIREwgcGFydGljbGVzIikNCg0KWUcgPC0gYXMubnVtZXJpYyhvdXRfeWJldGFbLDRdKQ0Kc2VZRzwtIGFzLm51bWVyaWMob3V0X3lzZVssNF0pDQpyc2lkPC0gQ2hhbGxlbmdlX2RhdCRyc2lkDQoNCmRhcms8LSBjYmluZCgoYXMubnVtZXJpYyhiZXRhX21hdFssNjZdKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDQ1XSkpLChhcy5udW1lcmljKGJldGFfbWF0Wyw2OV0pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssMzJdKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDMyXSkpLChhcy5udW1lcmljKG91dF95c2VbLDRdKSksKGFzLm51bWVyaWMob3V0X3lzZVssNF0pKSwoYXMubnVtZXJpYyhvdXRfeXNlWyw0XSkpLFlHLHNlWUcscnNpZCkNCmRhcms8LSBuYS5leGNsdWRlKGRhcmspDQoNCiMjIyBkYXRhDQptdm1yZGF0PC1mb3JtYXRfbXZtcihCWEdzID0gZGFya1ssMTo0XSwgQllHID0gZGFya1ssOV0sIHNlQlhHcyA9IGRhcmtbLDU6OF0sc2VCWUcgPSBkYXJrWywxMF0sIFJTSUQgPSBkYXJrWywxMV0pDQoNCg0KbXZtcm91dCA8LSBtdm1yMihtdm1yZGF0LDAsMSkNCm5ld19kYXQ8LSBjYmluZChtdm1yb3V0JGNvZWYsdChtdm1yb3V0JFFfc3RyZW5ndGgpKQ0Kcm93bmFtZXMobmV3X2RhdCk8LSBjb25jZWxkbA0KDQojIyMjIEhETHMNCmRhcmsyPC0gY2JpbmQoKGFzLm51bWVyaWMoYmV0YV9tYXRbLDM5XSkpLChhcy5udW1lcmljKGJldGFfbWF0Wyw2M10pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssODJdKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDEwNl0pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssMzldKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDYzXSkpLChhcy5udW1lcmljKGJldGFfbWF0Wyw4Ml0pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssMTA2XSkpLFlHLHNlWUcscnNpZCkNCmRhcmsyPC0gbmEuZXhjbHVkZShkYXJrMikNCg0KbXZtcmRhdDI8LWZvcm1hdF9tdm1yKEJYR3MgPSBkYXJrMlssMTo0XSwgQllHID0gZGFyazJbLDldLCBzZUJYR3MgPSBkYXJrMlssNTo4XSxzZUJZRyA9IGRhcmsyWywxMF0sIFJTSUQgPSBkYXJrMlssMTFdKQ0KbXZtcm91dDI8LSBtdm1yMihtdm1yZGF0MiwwLDEpDQpuZXdfZGF0MjwtIGNiaW5kKG12bXJvdXQyJGNvZWYsdChtdm1yb3V0MiRRX3N0cmVuZ3RoKSkNCnJvd25hbWVzKG5ld19kYXQyKTwtIGNvbmNlaGRsDQpgYGANCg0KIyMjIExETA0KDQpUaGUgcmVzdWx0cyBvZiB0aGUgTVZNUiBhbmFseXNpcyBmb3IgdGhlIGNvbmNlbnRyYXRpb24gb2YgTERMIHBhcnRpY2xlcyBpcyBzaG93biBpbiBUYWJsZSBcQHJlZih0YWI6bGRsbXZpdncpLiBDb25jZW50cmF0aW9uIGZvciBJRExzIGFuZCBtZWRpdW0gTERMIHBhcnRpY2xlcyBoYXZlIG5lZ2F0aXZlIGNhdXNhbCBlc3RpbWF0ZXMsIHdpdGggdGhlIGNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyBlc3RpbWF0ZSBnaXZpbmcgYSBzbWFsbCBwLXZhbHVlLg0KDQpUaGUgY29sdW1uIG9mIFEtc3RhdGlzdGljcyAoUSkgc2hvd3MgZXZpZGVuY2Ugb2YgaGV0ZXJvZ2VuZWl0eS4gSW4gdGhlIE1WTVIgY29udGV4dCwgdGhpcyBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0cnVtZW50cyB0byBwcmVkaWN0IHRoZSBleHBvc3VyZXMuIFRoZSB0ZXN0IGJhc2VkIG9uIHRoZSBhZGp1c3RlZCBRIHN0YXRpc3RpYyAoJHAoUV9BKSA9IDAuOTkkKSBzaG93cyBldmlkZW5jZSBvZiBwbGVpb3Ryb3B5LCB3aGljaCBjYW4gc3VnZ2VzdCB0aGF0IHRoZXJlIGFyZSBpbnN0cnVtZW50cyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgb3V0Y29tZSB0aHJvdWdoIG90aGVyIHBhdGh3YXlzIChtb3JlIGV4cG9zdXJlcykuDQoNCk5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVZNUiBhcmUgdW5saWtlbHkgdG8gYmUgdmFsaWQuDQoNCmBgYHtyLCBsZGxtdml2dywgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Ka2FibGUobmV3X2RhdCwgZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJJVlcgRXN0aW1hdGVzIGZyb20gTXVsdGl2YXJpYXRlIE1SIHVzaW5nIDE0OCBTTlBzIiklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCiMjIyBIREwNCg0KVGhlIHJlc3VsdHMgZnJvbSB0aGUgTVZNUiBhbmFseXNpcyBmb3IgY29uY2VudHJhdGlvbnMgb2YgSERMIHBhcnRpY2xlcyBhcmUgc2hvd24gaW4gVGFibGUgXEByZWYodGFiOmhkbG12aXZ3KS4gVGhlc2Ugc2hvdyBwb3NpdGl2ZSBjYXVzYWwgZXN0aW1hdGVzIGZvciBtZWRpdW0gYW5kIHZlcnkgbGFyZ2UgSERMLCBob3dldmVyIHRoZSBlc3RpbWF0ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggY2F1dGlvbi4gVGhlIFEtc3RhdGlzdGljIGNvbHVtbiBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0cnVtZW50cyB0byBwcmVkaWN0IHRoZSBleHBvc3VyZSB2YXJpYWJsZXMuIFRoZSBhZGp1c3RlZCBRLXN0YXRpc3RpYyBmb3IgdGhpcyBtb2RlbCBnYXZlIGEgcC12YWx1ZSBvZiAwLjg4LCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoZXJlIGFyZSBpbnN0cnVtZW50cyB3aGljaCBhZmZlY3QgaXNjaGVtaWMgc3Ryb2tlIHRocm91Z2ggb3RoZXIgZXhwb3N1cmVzLg0KDQpOb3RlIHRoYXQgcHJlY2lzZWx5IHRoZSBzYW1lIGlzc3VlIGFzIG5vdGVkIGFib3ZlIGFwcGxpZXMgaW4gdGhpcyBzZXR0aW5nIHdoZXJlIFNOUHMgdXNlZCBpbiB0aGUgSVZzIG92ZXJsYXAgYmV0d2VlbiBleHBvc3VyZXMsIG1lYW5pbmcgdGhhdCB0aGUgZWZmZWN0IGVzdGltYXRlcyBmcm9tIE1WTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciwgaGRsbXZpdncsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCmthYmxlKG5ld19kYXQyLCBkaWdpdHMgPSA0LCBjYXB0aW9uID0gIklWVyBFc3RpbWF0ZXMgZnJvbSBNdWx0aXZhcmlhdGUgTVIgZm9yIEhETHMgdXNpbmcgMTQ4IFNOUHMiKSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KDQojIERpc2N1c3Npb24gYW5kIENvbmNsdXNpb25zDQoNCldlIGhhdmUgcHJlc2VudGVkIGVzdGltYXRlcyBvZiB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCB0cmFpdHMgcmVsYXRlZCB0byBMREwgYW5kIEhETCBvbiB0aGUgcmlzayBvZiBpc2NoZW1pYyBzdHJva2UgYW5kIGF0dGVtcHRlZCB0byBncm91cCB0cmFpdHMgYmFzZWQgb24gY2hhcmFjdGVyaXN0aWNzIG9mIGxpcGlkIG9yIHNpemUuDQoNClNlbGVjdGluZyBpbnN0cnVtZW50cyBmb3IgZWFjaCB0cmFpdCBiYXNlZCBvbiBTTlBzIHRoYXQgc3VycGFzcyBjb252ZW50aW9uYWwgbGV2ZWxzIG9mIGdlbm9tZS13aWRlIHNpZ25pZmljYW5jZSBsZWQgdG8gbm8gbWVhbmluZ2Z1bCBjb25jbHVzaW9ucyBiZWluZyBkcmF3biBiYXNlZCBvbiBsaW1pdGVkIHN0YXRpc3RpY2FsIHBvd2VyLg0KDQpJbiBjb250cmFzdCwgc2VsZWN0aW5nIGluc3RydW1lbnRzIGJhc2VkIG9uIHRoZWlyIGluZGl2aWR1YWwgY29udHJpYnV0aW9uIHRvIHRoZSBRLXN0YXRpc3RpY3MgbGVkIHRvIGluc3RydW1lbnRzIGNvbnNpc3Rpbmcgb2YgbWFueSBtb3JlIFNOUHMgYW5kIHRoZXJlZm9yZSBncmVhdGVyIHN0YXRpc3RpY2FsIHBvd2VyLiBJbiB0aGlzIHNldHRpbmcsIHdlIGlkZW50aWZpZWQgbWFueSBzdHJvbmcgTVIgYXNzb2NpYXRpb25zLCB3aGljaCBjb3VsZCBiZSBjb25zdHJ1ZWQgYXMgZXZpZGVuY2Ugb2YgY2F1c2F0aW9uLiBIb3dldmVyIHRoaXMgYXBwcm9hY2ggaGFzIGEgbWFqb3IgZmxhdyBpbnNvZmFyIGFzIHRoZSBzYW1lIFNOUHMgd2VyZSB1c2VkIGFzIElWcyBmb3IgbXVsdGlwbGUgZXhwb3N1cmVzLiBJbiB0aGlzIGNvbnRleHQsIGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0byBkaXNlbnRhbmdsZSB3aGljaCBvZiB0aGUgdHJhaXRzIGFyZSBjYXVzYWwgYmVjYXVzZSBpbiBlc3NlbmNlIHRoZSBnZW5vdHlwZS1kaXNlYXNlIGFzc29jaWF0aW9uIGlzIGZpeGVkIGFuZCBhbGwgdGhhdCB2YXJpZXMgaW4gZWFjaCBNUiBtb2RlbCBpcyB0aGUgZ2Vub3R5cGUtZXhwb3N1cmUgYXNzb2NpYXRpb24uIEZ1cnRoZXJtb3JlLCBpbiB0aGUgY29udGV4dCBvZiBNVk1SLCB3ZSBjYW5ub3Qgc2VlIGhvdyB1c2luZyB0aGUgc2FtZSBTTlBzIGZvciBtdWx0aXBsZSBleHBvc3VyZXMgaW4gdGhlIHNhbWUgbW9kZWwgY2FuIGxlYWQgdG8gdmFsaWQgTVIgZXN0aW1hdGVzLiAgDQoNClRodXMsIHRoaXMgTVIgZGF0YSBjaGFsbGVuZ2UgbmljZWx5IGRlbW9uc3RyYXRlcyBhIGtleSBjaGFsbGVuZ2UgaW4gY29uZHVjdGluZyBNUiBvZiBoaWdobHkgY29ycmVsYXRlZCB0cmFpdHMuIFNlbGVjdGluZyBTTlBzIG9uIHRoZSBiYXNpcyBvZiBHV0FTIHNpZ25pZmljYW5jZSBkZXJpdmVkIGZyb20gbW9kZXN0bHktc2l6ZWQgR1dBUyBzdHVkaWVzIGlzIGxpa2VseSB0byBsZWFkIHRvIHBvb3JseSBwZXJmb3JtaW5nIGluc3RydW1lbnRzIG9uIHRoZSBiYXNpcyBvZiBsYWNrIG9mIHN0YXRpc3RpY2FsIHBvd2VyLiBJbmNsdXNpb24gb2YgZ3JlYXRlciBudW1iZXJzIG9mIFNOUHMgYnkgbW9yZSBwZXJtaXNzaXZlIGVudHJ5IGNyaXRlcmlhLCBlc3BlY2lhbGx5IGluIHRoZSBjb250ZXh0IG9mIG9ubHkgMTQ4IFNOUHMgaW4gdG90YWwgYWNyb3NzIHRoZSBsaXBpZCB0cmFpdHMgaW4gdGhpcyBkYXRhIGV4YW1wbGUsIG1lYW5zIHRoYXQgd2UgaW4gZXNzZW5jZSB1c2UgdGhlIHNhbWUgU05QcyBtdWx0aXBsZSB0aW1lcyB3aGljaCBtZWFucyB0aGF0IHdlIGNhbm5vdCB1c2UgTVIgaW4gZWl0aGVyIHRoZSB1bml2YXJpYXRlIG9yIG11bHRpdmFyaWF0ZSBzZXR0aW5nIHRvIGRpc2VudGFuZ2xlIHdoaWNoIHRyYWl0cyBhcmUgZHJpdmluZyB0aGUgY2F1c2FsIHJlbGF0aW9uc2hpcC4gV2UgYXJlIG5vdCB0aGVyZWZvcmUgYWJsZSB0byBtYWtlIGFueSBtZWFuaW5nZnVsIGNvbmNsdXNpb25zIGFib3V0IHRoZSBjYXVzYWwgcm9sZSBvZiB0aGVzZSB0cmFpdHMgaW4gaXNjaGFlbWljIHN0cm9rZS4gT3VyIGFuYWx5c2VzIGhpZ2hsaWdodCBhIHBvdGVudGlhbCBtaXN1c2Ugb2YgZ2VuZXRpYyBpbnN0cnVtZW50cyB3aGVyZSB0aGUgc2FtZSBpbnN0cnVtZW50cyBhcmUgdXNlZCBmb3IgbXVsdGlwbGUgZXhwb3N1cmVzLCB3aGljaCBtaWdodCBsZWFkIHRvIGVycm9uZW91cyBpbnRlcnByZXRhdGlvbnMuDQoNCiMgU29mdHdhcmUNCg0KVGhlIFIgTWFya2Rvd24gY29kZSBpcyBhdmFpbGFibGUgYnkgY2xpY2tpbmcgb24gdGhlIENvZGUgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHRoYW5kIGNvcm5lciBvZiB0aGlzIGRvY3VtZW50LiBbQ2xpY2sgaGVyZV0oI3RvcCkgdG8gbmF2aWdhdGUgdG8gdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuDQoNCiMgUmVmZXJlbmNlcw0K