Running ARGweaver

Sample information

ARGweaver is applied on an empirical, phased dataset of Heliconius erato butterflies, generated by haplotagging, a technique that produces synthetic linked-read sequence data. We used parts of two scaffolds - Herato1801:1362067-1405605 (coincides with the previously identified gene optix that has undergone a selective sweep) and Herato1603:3450000-3493538 (a neutral background region) (Supplementary Data 1). This dataset is previously published in Meier et al, 2021. 10 individuals of H.e.lativitta and H.e.notabilis were chosen from opposite ends of the hybrid zone transect for ARG inference (Supplementary Data 2).

Preprocessing files for ARGweaver

To preprocess the input files for ARGweaver, we first subset our 20 diploid individuals from the full VCF files (see Supplementary information in Meier et al, 2021), and then convert the SNP information into the .sites format required for ARGweaver. The .sites format only contains information on the positions that are varying within the 20 individuals that we chose. (see .Rmd file for full code)

In the optix region (43538 bp long), there are 2812 sites altogether - 2426 are variant positions, while 330 and 56 sites are fixed for one or the other allele. Genomic positions that are neither variant nor fixed to one or the other allele (in other words, positions absent in the VCF file) are considered missing information and therefore masked from being used as input data for ARGweaver. Altogether, ARGweaver uses information of variant alleles and invariant alleles; whereas the rest is masked and treated as missing information.

# Keep only the sites that are variant to this subset of 20 diploid individuals
bcftools view -c1 -C39 -Oz ${regionName}_Herato.vcf.gz > ${regionName}_Herato_variants.vcf.gz
bcftools query --format '%CHROM\t%POS\t%REF\t%ALT\t[%GT\t]\n' ${regionName}_Herato_variants.vcf.gz > ${regionName}_Herato_variants.gt
#check numbers of sites in the VCF file
bcftools view -H ${regionName}_Herato.vcf.gz | wc -l #Total sites = 2812
bcftools view -H -c1 -C39 ${regionName}_Herato.vcf.gz | wc -l #Total variant sites = 2426
bcftools view -H -C0 ${regionName}_Herato.vcf.gz | wc -l #Sites fixed to REF allele = 330 (REF according to the VCF format nomenclature)
bcftools view -H -c40 ${regionName}_Herato.vcf.gz | wc -l #SItes fixed to ALT allele = 56 (ALT according to the VCF format nomenclature)
# Create sites file 
# USAGE: Rscript vcf2sites.R <sample.txt> <input.gt> <chr> <begin> <end> #
Rscript $workdir/scripts/vcf2sites.R $workdir/sample/all_sample.txt ${regionName}_Herato_variants.gt $chrom $chromStart $chromEnd
cat <(head -2 ${regionName}_Herato_variants_RefAlt.sites) <(cut -f1,2 <(tail +3 ${regionName}_Herato_variants_RefAlt.sites)) > ../${regionName}_Herato.sites
# Create mask file
bcftools view -H ${regionName}_Herato_variants.vcf.gz | awk '$0 !~ /^#/ {print $1,$2-1,$2}' | bedops -d <(echo -e "$chrom\t$(($chromStart-1))\t$chromEnd") - | bgzip > ../${regionName}_Herato_mask.bed.gz

We repeated the same steps for the neutral background region, Scaffold Herato1603:3450000-3493538. In that region (43538 bp), there are 6407 sites altogether - 4926 is variant positions, while 1405 and 76 sites are fixed for one or the other allele. (see .Rmd file for full code).

Input parameters

In order to run ARGweaver, we consider \(\mu\) (mutation rate) = \(2.9 \times 10^{-9}\) per bp per generation, and its ratio to recombination rate, \(\frac{\mu}{r}\) = 1. We estimate \(N_e\) by calculating Tajima’s \(\pi\) (= \(4N_e r\)) from the neutral region. \(\pi\) = 0.0225049, \(N_e\) = 1940078. The total map length of both optix and neutral region is 0.01262602 cM. (see .Rmd file for full code)

Moreover, ARGweaver allows coalescence and recombination events to take place only at discretized time points, that are defined by an exponential function, \(t(i)=\frac {exp(\frac{ i}{K−1}log(1+\delta t_{max}))−1}{\delta}\); for K time points and \(i\in{\{0, 1, …, K−1\}}\). Very small values of \(\delta ( <\frac {1}{t_{max}})\) will yield roughly linear distribution of times, whereas larger values of \(\delta\) will place more time points in recent past and less in deep past. For this analysis, we set K = 30, the maximum time for total coalescence (\(t_{max}\)) = 20\(N_e\), and the shape parameter (\(\delta\)) = 0.01.

Fig S1: Discrete time points for ARGweaver analysis - 30 time steps, \(N_e\) = 1940078, Left y-axis shows the time points in \(N_e\), while right y-axis in number of generations. Red line denotes 1\(N_e\).

Run ARGweaver

ARGweaver is run for 5000 iterations and then resumed for another 5000 iterations for the optix region, whereas only 5000 iterations for the neutral region.

# Run ARGweaver
~/.local/bin/arg-sample -s  sites/${regionName}_Herato.sites \
    --maskmap masks/${regionName}_Herato_mask.bed.gz \
    -N 1940078 \
    -m 2.9e-9 \
    -r 2.9e-9 \
    --ntimes 30 \
    --maxtime $((1940078*20)) \
    --iters 5000 \
    --delta 0.01 \
    --output {regionName}/sample/${regionName}

# Resume ARGweaver for more iterations
~/.local/bin/arg-sample -s sites/${regionName}_Herato.sites \
    --maskmap masks/${regionName}_Herato_mask.bed.gz \
    -N 1940078 \
    -m 2.9e-9 \
    -r 2.9e-9 \
    --ntimes 30 \
    --maxtime $((1940078*20)) \
    --iters 10000 \
    --delta 0.01 \
    --output {regionName}/sample/${regionName} \
    --resume

Analysis of ARGweaver output

MCMC summary

Visualizing the traces of likelihood, prior and joint probabilities from the MCMC iterations, we decided to set the first 3000 iterations as burnin. The plot below is for the optix region.

Fig S2: Traces across all MCMC iterations of prior (log probability of the sampled ARG given the model), likelihood (log probability of the data given the sampled ARG), joint (total log probability of the ARG and the data (prior + likelihood)), recombs (number of recombination events in the sampled ARG), arglen (total length of all branches summed across sites) and noncompats (number of variant sites that cannot be explained by infinite sites mutation model).

Process output from ARGweaver

The ARGweaver output .smc files are then converted to easily maniputable .bed format to extract TMRCAs, trees, recomination breakpoints and total tree branch lengths across all iterations (except burnin). Then, 2 specific iterations (Iteration 8250 and 9000) are chosen for further analysis and identification of haplotype blocks (see .Rmd file for full code, and analysis for the neutral region)

#### OPTIX ####

# Load variables
workdir=$HOME/Proj-Def-Haplo
prefix=optix_newNe
regionName=optix
chrom=Herato1801
chromStart=1362067
chromEnd=1405605

# Convert .smc to .bed format for all iterations
cd $workdir/optix_newrun/$prefix
smc2bed-all $workdir/optix_newrun/$prefix/sample/$prefix

## Check mcmc stats to check burnin
burnin=3000
# Compute TMRCA estimates for between and within popualtions from all iterations
for pop in all_sample Herato_notabilis Herato_lativitta; do
    echo Summarizing $pop
    arg-summarize --arg-file ./sample/$prefix.bed.gz \
             --subset-inds $workdir/sample/$pop.txt \
             --log-file ./sample/$prefix.log \
             --tmrca \
             --burnin $burnin \
             --mean --stdev --quantile 0.05,0.5,0.95 |\
        bgzip > $prefix.tmrca.$pop.bed.gz
        echo " -> Done"
done

## The same is repeated for the neutral region below
## Compute TMRCA, and branch length from individual iterations
stats_list=(tmrca branchlen)
iters_list=(8250 9000)

for pop in all_sample Herato_notabilis Herato_lativitta; do
    echo Summarizing $pop
    for sample_no in ${iters_list[*]}; do
        echo -n "Computing $sample_no"
        for stat in ${stats_list[*]}; do
          echo -n "Computing $stat"
          arg-summarize --arg-file ./sample/$prefix.bed.gz \
                --subset-inds $workdir/sample/$pop.txt \
                --sample $sample_no \
                --log-file ./sample/$prefix.log \
                --$stat \
                --mean --quantile 0.05,0.5,0.95 |\
              bgzip > $prefix.$stat.$pop.${sample_no}.bed.gz
              echo " -> Done"
            done
    done
done

Read SNPs

SNPs are changed from its nucloetide asignment to 0/1; based on allele frequency within the H.e.lativitta samples. (Higher allele frequency - 1, Lower allele frequency - 0)

## Read all SNPs
optix_sites <- readSites("~/Proj-Def-Haplo/optix_newrun/sites/optix_Herato.sites")
#
## Read all sites (SNPs+invariant)
optixALL_sites <- readSites("~/Proj-Def-Haplo/optix_newrun/sites/optixALL_Herato.sites")
#
## Change SNPs to 0 and 1 based on major allele in lativitta
sites<- data.frame(pos=optix_sites$pos, optix_sites$sites)
for (snpID in c(1:nrow(sites))){
  cat(snpID, sites[snpID,'pos'])
  alleles <- sites[snpID,sampID$ID]
  alleles <- as.factor(alleles)
  
  alleleCount1 <- sum(alleles[lat] == levels(alleles)[1])
  alleleCount2 <- sum(alleles[lat] == levels(alleles)[2])
  
  majAllele <- ifelse(alleleCount1 > alleleCount2, levels(alleles)[1], levels(alleles)[2])
  minAllele <- setdiff(levels(alleles), majAllele)

  sites[snpID,which(sites[snpID,] == majAllele)] <- 1
  sites[snpID,which(sites[snpID,] == minAllele)] <- 0
}

TMRCA

We first examine the TMRCA of the total tree and the individual populations - H.e.lativitta (in red) and H.e.notabilis (in yellow). Unlike the neutral region (Herato1603) where all TMRCA estimates are fairly constrained between 1 and 10 \(N_e\), TMRCA traces for individual populations in the optix region exhibit shallow coalescence times at multiple positions throughout the entire ~50kb region. In case of a selective sweeps, where a beneficial mutation sweeps through the population, TMRCA tends to be shallow since all samples in the swept population coalesces quickly to the initial “lucky” ancestor. Moving away from the focal mutations, lineages recombine away from the swept ancestral background. The TMRCA estimates from the optix region is consistent with the previously identified selected region in optix. To investigate further the haplotype block structures, we focus into a 3kb region at optix:1385966-1388966.

Fig S3: TMRCA (Ne) for each position in the optix (top panel) and the neutral genomic region (bottom panel). Black line: total TMRCA, Red: Median TMRCA for H.e.lativitta, Yellow: TMRCA for H.e.notabilis. Corresponding shaded regions are the 0.05 and 0.95 percentile intervals.

In the focal region, there are 137 SNPs.

FigS4: TMRCA for each position in focal genomic region (optix:1385966-1388966). Same colour schemes as above. Top panel: TMRCA plot, Bottom panel: SNPs in both populations; RED and YELLOW alleles are variant positions, coloured according to the respective higher and lower allele counts in the H.e.lativitta population. BLACK alleles are fixed (invariant) in both populations. All other positions (in white) are unknown, since those positions do not have SNP information. These unknown positions are masked while running ARGWeaver, therefore they are treated as missing information and NOT as invariant sites.

Masking sites can have a critical effect on sampling ARGs, since invariant sites can shift priors towards a recent coalescence (because there hasn’t been enough time yet for a mutation to occur in any of the branches), whereas missing information does not shift priors and therefore ARGs are sampled neutrally in those regions. In the above region of 3kb, there are 137 SNPs and 16 invariant positions. Out of the 137 SNPs, only 59 SNPs are segregating within the H.e.lativitta population in focus. Below is the folded SNP frequency spectrum.

FigS5: Folded SNP frequency spectrum of the focal region, optix:1385966-1388966.

Hereafter, alleles with lower frequency within the H.e.lativitta population is referred to as the minor allele, and individuals who share the minor allele is the minor clade. Conversely, individuals that carry that major allele is called major clade. Minor allele is coded as 0 and major as 1.

General comments on identifying haplotype blocks as edges from empirical datasets

In a series of marginal genealogical trees along the genome, an edge is considered unique if it originates at a particular coalescent time point, and is ancestral to a given set of samples. Unique edges extend along the genome until recombination breaks them down, but can further re-emerge in a disjunct genomic region if recombination brings the given set of samples back together. Moreover, each edge goes back in time until further coalescence events in deeper past. (Figure 3 in main text, and Box 2). Unlike a simulation where the ground truth about origin and extend of each unique edge is precisely known, inferred edges from sampled ARGs are consistent with the data, but not necessarily supported by the SNP configuration. Those edges on which mutations appear can be reliably inferred given the SNP configuration, whereas the rest are random samples from the posterior distribution and is subject to stochastic noise, suggesting inference be made from edges supported by SNPs.

ARGweaver outputs genealogical trees along the genome, and each recombination breakpoints and time. For each tree, nodes and tips are labelled uniquely. For each recombination event, the new ancestral node ID of the recombined branch becomes the old node ID from the previous tree. Therefore, across trees, all nodes except the one that underwent recombination in the preceding tree shares the same node ID. Although it is easy to track unique nodes over a short genomic distance by just tracking the SPR (subtree prune and regraft) event; one needs to develop more sophisticated code/algorithm to track over longer distances than considered in this analysis (which we did not attempt here!). Instead, we leveraged the artifact left behind by time-discretization in ARGweaver to identify unique edges.

The exact step-by-step process that we used to identify edges supported by SNPs is described below. We specifically chose 2 separate iteraions (iteration ID - 8250 and 9000), sufficiently separated to avoid autocorelations between them to demonstrate the noise in identifying haplotype blocks as edges based on ARG samples. We only focus on the H.e.lativitta population (always in red labels).

Iteration 1 (MCMC iter: 8250)

We extract ARGs sampled by ARGweaver in its MCMC iteration: 8250, and estimate the TMRCA (total and within population), total branch length of each marginal tree and the recombination breakpoints. Altogether in the ~50kb region, there are 6571 trees (and 6570 recombination events), of which only 464 trees are present in the focal 3kb region, optix:1385966-1388966.

We investigate the distribution of branch length of trees with respect to their genomic spans (Fig S6). We find average tree span in the whole region is ~7 bp. We expect from theory assuming standard coalescence, \(P_r(d \mid \tau)\)=\(\frac {\rho}{2}L(\tau)\) exp\([-\frac {\rho}{2}L(\tau) d]\) where \(L(\tau)\) is in coalescent unit of \(2N_e\) generations and \(\frac {\rho}{2}\)=\(2N_er\) denotes the population-scaled recombination rate per bp. Given the parameters, and mean \(L(\tau)\) = 2, this gives mean d = \(\frac {1} {\frac {\rho}{2}L(\tau)}\) ~ 45bp. It seems in this region, ARGweaver seems to change the tree topology more often than the expected mean. We have not explored this closely (beyond the main reach of this analysis), however, we note that although the ARGs are consistent with the data, we need to take caution in biological inference from these sampled ARGs.

## Read all 6571 tree lengths ----
treelen1 <- readArgSummary("~/Proj-Def-Haplo/optix_newrun/optix_newNe/optix_newNe.branchlen.all_sample.8250.bed.gz")
treelen1$treespan <- treelen1$chromEnd-treelen1$chromStart
## Read 464 tree lengths in the focal genomic region ----
treelen1_sub <- subset_genomic_interval(treelen1, chromStart, chromEnd)

mean(treelen1$treespan) # 6.625932
mean(treelen1_sub$treespan) # 6.460215
## Plot ----
par(mfrow=c(1,3), cex.main=1.5, cex.lab=1.7, cex.axis=1.5)
# Histogram
hist(treelen1$treespan, xlab = "Tree Span")
# Branch Length vs Tree span (all 6571 trees)
plot(treelen1$treespan, treelen1$branchlen_mean, xlab="Tree Span", ylab="Tree Length")
points(aggregate(treelen1$branchlen_mean~treelen1$treespan, FUN=mean), col="red", pch=19, cex=1.5)
# Branch Length vs Tree span (464 trees in the focal genomic region)
plot(treelen1_sub$treespan, treelen1_sub$branchlen_mean, xlab="Tree Span", ylab="Tree Length")
points(aggregate(treelen1_sub$branchlen_mean~treelen1_sub$treespan, FUN=mean), col="red", pch=19, cex=1.5)

FigS6: Left: Histogram of tree spans; Center: Branch length vs tree span for all 6571 marginal trees along the genome; Right: Branch length vs tree spans for 464 trees in the focal genomic region. RED points are average tree lengths for each tree span.

For our analysis, we strictly focus on identifying edges supported by SNPs. In practice, this is done in few steps - First, for each sampled tree along the genome (= 464 trees), we extract the following information - ancestral and descendant node of each edge, edge height (=length), time-point of the descendant node, i.e., when the edge originated (=depth, NOTE: due to rounding errors in Newick format, we round the depth values to 3 significant digits) and the samples (=tips.from.dec) that each edge is ancestral to. NOTE: Although we are identifying haplotype blocks in the H.e.lativitta (red) population, we use genealogical trees that include both populations. This is done in order to estimate the edge height of the most recent common ancestor to all individuals in the red population. Ideally for making biological inferences from only one population, this need not be done. However in our analysis, in order to illustrate the haplotype block patterns generated in a selected genomic region, we decided to incorporate both populations to generate trees along the genome. Nevertheless, it is important to note that the identified haplotype blocks will stay the same irrespective of which and how many populations are included in the analysis; however, the edge height will change along the genome.

## Store edge information of all 464 trees as a list
tr1_sub_list <- extract_edges(tr1_sub)

Second, for every tree at each SNP position (= 137 SNPs), we identify most recent tree node that is commonly ancestral to all individuals that share the same allele. (Note: this assumes infinite sites mutation model, which is generally the default option in ARGweaver). This allows identification of 1 node for the major and 1 for the minor allele at each SNP position, hereafter called major and minor node for each tree.

The table below illustrates information from the tree whose genomic span coincides with the first SNP position - 1385985.

anc.label dec.label length depth tips.from.dec
66 75 3.1531464 0.2364560 18, 22
75 18 0.2364539 0.0000021 18
75 22 0.2364539 0.0000021 22
66 72 2.4942915 0.8953109 39, 33, 11, 34, 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13
72 76 0.7979937 0.0973172 39, 33
76 39 0.0973136 0.0000036 39
76 33 0.0973136 0.0000036 33
72 55 0.3208752 0.5744357 11, 34, 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13
55 40 0.4227382 0.1516975 11, 34
40 11 0.1516965 0.0000010 11
40 34 0.1516965 0.0000010 34
55 68 0.0000000 0.5744357 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13
68 0 0.5744357 0.0000000 0
68 63 0.0000000 0.5744357 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13
63 14 0.5744357 0.0000000 14
63 46 0.2058814 0.3685543 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13
46 60 0.0000000 0.3685543 3, 9
60 3 0.3685527 0.0000015 3
60 9 0.3685527 0.0000015 9
46 44 0.0000000 0.3685543 37, 15, 32, 25, 21, 19, 30, 17, 26, 13
44 57 0.0000000 0.3685543 37, 15, 32, 25, 21, 19, 30, 17
57 37 0.3685527 0.0000015 37
57 77 0.0000000 0.3685543 15, 32, 25, 21, 19, 30, 17
77 52 0.0000000 0.3685543 15, 32, 25
52 15 0.3685527 0.0000015 15
52 54 0.3285208 0.0400334 32, 25
54 32 0.0400319 0.0000015 32
54 25 0.0400319 0.0000015 25
77 53 0.1320988 0.2364554 21, 19, 30, 17
53 21 0.2364539 0.0000015 21
53 65 0.0000000 0.2364554 19, 30, 17
65 73 0.0847579 0.1516975 19, 30
73 19 0.1516965 0.0000010 19
73 30 0.1516965 0.0000010 30
65 17 0.2364539 0.0000015 17
44 71 0.2712391 0.0973152 26, 13
71 26 0.0973136 0.0000015 26
71 13 0.0973136 0.0000015 13
-1 66 16.6103976 3.3896024 18, 22, 39, 33, 11, 34, 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13

Table S1: For the above tree at SNP position 1385985, individuals 18 and 22 share allele 0, and therefore their most recent common ancestor is node 75 (called as minor node) which originated at time (in \(N_e\)) = 0.236 and has a length of 3.153 (in \(N_e\)).

Third, for each minor node (and major node if the SNP is fixed within the H.e.lativitta population) identified from trees at each of the 137 SNPs, we identify all trees along the genome which contains that unique ancestral node. Since we do not know the ancestral reference allele at each SNP position and we assume infinite sites mutation, any minor node that is ancestral exclusively to the minor clade is assumed to contain the causal alternate allele and is considered as a branch on which a mutation has occurred. The table below shows the extent of the above node 75 that is ancestral to indnividuals 18 and 22 at SNP position 1385985. (NOTE: only 10 rows showed for illustration. In other words, this is how the haplotype blocks are encoded as edges.

anc.label dec.label length depth tips.from.dec treeID chromStart chromEnd tree.len area
2 55 42 0.0000000 0.236454 18, 22 1 1385966 1385966 1 0.000000
21 55 42 0.0000000 0.236454 18, 22 2 1385967 1385967 1 0.000000
22 55 42 0.0000000 0.236454 18, 22 3 1385968 1385968 1 0.000000
23 55 42 0.0000000 0.236454 18, 22 4 1385969 1385972 4 0.000000
24 55 42 0.0000000 0.236454 18, 22 5 1385973 1385973 1 0.000000
25 55 42 0.0000000 0.236454 18, 22 6 1385974 1385993 20 0.000000
41 55 42 0.3379803 0.236454 18, 22 7 1385994 1386005 12 4.055763
36 55 42 0.3379803 0.236454 18, 22 8 1386006 1386008 3 1.013941
34 55 42 0.3379803 0.236454 18, 22 9 1386009 1386022 14 4.731724
341 55 42 0.3379803 0.236454 18, 22 10 1386023 1386025 3 1.013941

Table S2: Haplotype block as a unique edge that contains the mutation at pos: 1385985, shared between individuals 18, 22. Each row represents 1 tree. For example, tree 7 spans from 1385994 to 1386005, is 12 bp long; the haplotype block at this tree has a height of 0.3379 and therefore an area (height x tree span) of 4.055763.

Following the above steps, we can identify each major/minor node ancestral to each major/minor clade and occurs at a particular time point in the past, that in practice informs us of all the edges informed by SNPs. With 137 SNPs, we have 36 edges supported by SNPs (table below).

depth tips.from.dec snpID No.of.SNPs edgeID
0.3686 9 , 3 , 11, 21, 14, 34, 32, 25, 26, 13 8 1 1
3.3896 30, 17, 22, 0 , 33, 18, 15, 19, 39, 37 11, 12 2 2
2.1748 15, 37, 3 , 19, 14, 21, 22, 0 , 39, 33 111 1 3
0.5744 3 , 15, 19, 14, 25, 33, 9 , 21, 22 99, 100 2 4
0.8953 37, 3 , 19, 14, 21, 22, 0 , 39, 33 106 1 5
1.3954 30, 0 , 39, 33, 18, 34, 17, 32, 26 113 1 6
0.2365 39, 11, 18, 17, 34, 32, 26 102 1 7
2.1748 17, 33, 18, 15, 19, 22 7 1 8
0.3686 21, 14, 32, 25, 26, 13 13 1 9
0.8953 30, 0 , 39, 11, 19, 14 88 1 10
NA 19, 0, 33, 30, 22 6 1 11
NA 9, 13, 14, 37, 22 40 1 12
0.5744 30, 18, 32, 34 61 1 13
1.3954 34, 30, 17 9, 10, 15 3 14
0.2365 14, 9 , 37 43 1 15
0.2365 9 , 33, 19 80 1 16
0.2365 18, 22 1, 2, 3 3 17
0.1517 22, 17 56 1 18
0.0624 21, 22 92, 122, 126 3 19
NA 9, 11 97 1 20
1.3954 30, 13 105 1 21
0.0000 11 5 1 22
0.0000 30 14, 34, 70, 91, 110, 120, 127, 131, 136 9 23
0.0000 34 17, 109 2 24
0.0000 13 25, 26, 27, 29, 32, 33, 35, 36, 37, 38, 41, 112, 116, 118 14 25
0.0000 17 31 1 26
0.0000 3 60 1 27
0.0000 15 108 1 28
0.0000 18 117 1 29
3.3896 ALL 4, 16, 42, 54, 62, 64, 65, 66, 93, 94, 95, 96, 98, 101 14 30
2.1748 ALL 18, 19, 21, 22, 23, 24, 63, 119, 121, 123, 124, 125, 128, 129, 135, 137 16 31
1.3954 ALL 20, 57, 58, 59, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86 22 32
12.8325 ALL 28, 30, 39 3 33
0.8953 ALL 44, 45, 46, 47, 48, 49, 50, 51, 52 9 34
5.2829 ALL 53, 87, 103, 104, 130, 132 6 35
8.2336 ALL 55, 89, 90, 107, 114, 115, 133, 134 8 36

Table S3: All 36 haplotype blocks as edges from iteration 8250; each row represents an unique edge. As mentioned above, each edge is defined uniquely by its origin time-point (=depth) and the set of descendent individuals (=tips.from.dec). For example, edge 17 (same edge as the Table S1, S2 refers to) originates at 0.2365 (time in Ne), shared by individuals 18, 22 and is supported by 3 SNPs at position (rank sum order) 1,2,3. Edges with depth = NA refers to SNPs that are incompatible with the infinite sites mutation model, and hence cannot be explained by one mutation event.

It is important to clarify that this strategy of identifying nodes across successive trees along the genome can easily be translated to the mathematical notation used for the haplotype block simulations. For example, the above edge can be represented as {0, {34}, {{18,22},{}}}, i.e., the ancestral genome on this haplotype block carries the allele 0 at SNP position 1; and is broken down into regions defined by trees {1,93}, {94,464} and is ancestral to samples {18,22},{} respectively.

Haplotype block visualization

For visualization, we choose to only plot the edges that are supported by 3 or more SNPs. Moreover, for SNPs that are fixed in the red population, we only show edges that originate at any time-point below 5\(N_e\). This leaves us with only 8 edgee. (see .Rmd file for full code)

## Select edges supported by 3 or more SNPs
imp_edges1 <- edges1[edges1$No.of.SNPs >=3 & edges1$depth <=5 , ] #12 important edges
nrow(imp_edges1)
imp_edges1 <- imp_edges1[order(imp_edges1$depth),]
par(mfrow=c(2,1), cex.lab=1.5, cex.axis=1.3)

plot_all_sites(focal_sites, as.character(1)) +
  axis(side =2, tick =T, at = c(21:40), labels = F) +
  points(bl1_c1$pos, rep(which(sampID$ARGweaverID == c(30)),nrow(bl1_c1)), col='black', pch=19, cex = 1)
plot(hapblock1_c1$chromStart, hapblock1_c1$length, type="n", log="y", ylim=c(0.05,15), xlab="Position (bp)", ylab="Time (Ne)", xlim=c(chromStart, chromEnd)) +   
  plot_hapblock(hapblock1_c1_all, "black", T)

Fig S7: Haplotype block that is supported by singletons. These edges originate directly from the tree tips, ie, the samples and therefore extends all along the genomic region. Although for biological inference, singletons are often uninformative, this shows the feature of an edge supported by singletons, which extends all along the genome, is normally shallow with certain regions that go are high, where a lot of singleton clusters together. These are normally regions of the genome, which have recombined out and goes all the way back to an ancestor in the deep past. The orange block shows clustering of SNPs in the higher region of the edges, whereas, the green edge shows how SNPs can also occur by chance at other regions.

Now, ploting all the haploype blocks except singletons (Fig S8), same as the figure in main text (see Main Text for caption).

See .Rmd file for all 137 trees at each SNP position.

Case 2: iteration 9000

There are altogether 6457 trees in the ~50kb region, and 425 in the focal genomic region.

Hapotype blocks from both iterations

FigS9 shows the haplotype blocks and the SNPs that support each block from both iterations.

LS0tCnRpdGxlOiAiQVJHd2VhdmVyIEFuYWx5c2lzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge3IgaW5jbHVkZT1GfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GKQpgYGAKCmBgYHtiYXNofQojIyBMb2FkIGFsbCBtb2R1bGVzCm1vZHVsZSBsb2FkIHNhbXRvb2xzIGJlZG9wcyBiY2Z0b29scyBSIApzb3VyY2Ugfi8uYmFzaHJjCmV4cG9ydCBQWVRIT05QQVRIPSRIT01FLy5sb2NhbC9iaW4Kd29ya2Rpcj0iL25mcy9zY2lzdG9yZTAzL2JhcnRvZ3JwL2FwYWwvUHJvai1EZWYtSGFwbG8iCmBgYAoKIyMgUnVubmluZyBBUkd3ZWF2ZXIKCiMjIyMgU2FtcGxlIGluZm9ybWF0aW9uCkFSR3dlYXZlciBpcyBhcHBsaWVkIG9uIGFuIGVtcGlyaWNhbCwgcGhhc2VkIGRhdGFzZXQgb2YgKkhlbGljb25pdXMgZXJhdG8qIGJ1dHRlcmZsaWVzLCBnZW5lcmF0ZWQgYnkgaGFwbG90YWdnaW5nLCBhIHRlY2huaXF1ZSB0aGF0IHByb2R1Y2VzIHN5bnRoZXRpYyBsaW5rZWQtcmVhZCBzZXF1ZW5jZSBkYXRhLiBXZSB1c2VkIHBhcnRzIG9mIHR3byBzY2FmZm9sZHMgLSBIZXJhdG8xODAxOjEzNjIwNjctMTQwNTYwNSAoY29pbmNpZGVzIHdpdGggdGhlIHByZXZpb3VzbHkgaWRlbnRpZmllZCBnZW5lICpvcHRpeCogdGhhdCBoYXMgdW5kZXJnb25lIGEgc2VsZWN0aXZlIHN3ZWVwKSBhbmQgSGVyYXRvMTYwMzozNDUwMDAwLTM0OTM1MzggKGEgbmV1dHJhbCBiYWNrZ3JvdW5kIHJlZ2lvbikgKFN1cHBsZW1lbnRhcnkgRGF0YSAxKS4gVGhpcyBkYXRhc2V0IGlzIHByZXZpb3VzbHkgcHVibGlzaGVkIGluIE1laWVyIGV0IGFsLCAyMDIxLiAxMCBpbmRpdmlkdWFscyBvZiAqSC5lLmxhdGl2aXR0YSogYW5kICpILmUubm90YWJpbGlzKiB3ZXJlIGNob3NlbiBmcm9tIG9wcG9zaXRlIGVuZHMgb2YgdGhlIGh5YnJpZCB6b25lIHRyYW5zZWN0IGZvciBBUkcgaW5mZXJlbmNlIChTdXBwbGVtZW50YXJ5IERhdGEgMikuCmBgYHtiYXNofQojc2VsZWN0IHNhbXBsZXMKdGFpbCArMiBzYW1wbGUuY3N2IHwgc2VkICdzL1wsL1x0LycgfCBjdXQgLWYgMSA+IGFsbF9zYW1wbGUudHh0CmBgYAoKIyMjIyBQcmVwcm9jZXNzaW5nIGZpbGVzIGZvciBBUkd3ZWF2ZXIKVG8gcHJlcHJvY2VzcyB0aGUgaW5wdXQgZmlsZXMgZm9yIEFSR3dlYXZlciwgd2UgZmlyc3Qgc3Vic2V0IG91ciAyMCBkaXBsb2lkIGluZGl2aWR1YWxzIGZyb20gdGhlIGZ1bGwgVkNGIGZpbGVzIChzZWUgU3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvbiBpbiBNZWllciBldCBhbCwgMjAyMSksIGFuZCB0aGVuIGNvbnZlcnQgdGhlIFNOUCBpbmZvcm1hdGlvbiBpbnRvIHRoZSAqLnNpdGVzKiBmb3JtYXQgcmVxdWlyZWQgZm9yIEFSR3dlYXZlci4gVGhlICouc2l0ZXMqIGZvcm1hdCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBwb3NpdGlvbnMgdGhhdCBhcmUgdmFyeWluZyB3aXRoaW4gdGhlIDIwIGluZGl2aWR1YWxzIHRoYXQgd2UgY2hvc2UuIChzZWUgKi5SbWQqIGZpbGUgZm9yIGZ1bGwgY29kZSkKCkluIHRoZSAqb3B0aXgqIHJlZ2lvbiAoNDM1MzggYnAgbG9uZyksIHRoZXJlIGFyZSAyODEyIHNpdGVzIGFsdG9nZXRoZXIgLSAyNDI2IGFyZSB2YXJpYW50IHBvc2l0aW9ucywgd2hpbGUgMzMwIGFuZCA1NiBzaXRlcyBhcmUgZml4ZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIgYWxsZWxlLiBHZW5vbWljIHBvc2l0aW9ucyB0aGF0IGFyZSBuZWl0aGVyIHZhcmlhbnQgbm9yIGZpeGVkIHRvIG9uZSBvciB0aGUgb3RoZXIgYWxsZWxlIChpbiBvdGhlciB3b3JkcywgcG9zaXRpb25zIGFic2VudCBpbiB0aGUgVkNGIGZpbGUpIGFyZSBjb25zaWRlcmVkIG1pc3NpbmcgaW5mb3JtYXRpb24gYW5kIHRoZXJlZm9yZSBtYXNrZWQgZnJvbSBiZWluZyB1c2VkIGFzIGlucHV0IGRhdGEgZm9yIEFSR3dlYXZlci4gQWx0b2dldGhlciwgQVJHd2VhdmVyIHVzZXMgaW5mb3JtYXRpb24gb2YgdmFyaWFudCBhbGxlbGVzIGFuZCBpbnZhcmlhbnQgYWxsZWxlczsgd2hlcmVhcyB0aGUgcmVzdCBpcyBtYXNrZWQgYW5kIHRyZWF0ZWQgYXMgbWlzc2luZyBpbmZvcm1hdGlvbi4KCmBgYHtiYXNoLCBlY2hvPVQsIHdhcm5pbmc9RiwgcmVzdWx0cz1GfQojIyBPUFRJWDogSGVyYXRvMTgwMToxMzYyMDY3LTE0MDU2MDUKIyBJbml0aWF0ZSB2YXJpYWJsZXMKcmVnaW9uTmFtZT1vcHRpeApjaHJvbT1IZXJhdG8xODAxCmNocm9tU3RhcnQ9MTM2MjA2NwpjaHJvbUVuZD0xNDA1NjA1CiMgU3Vic2V0IHNhbXBsZXMgZnJvbSBmdWxsIFZDRiAKY2Qgfi9Qcm9qLURlZi1IYXBsby9WQ0ZzLwpiY2Z0b29scyB2aWV3IC1TIC4uL3NhbXBsZS9hbGxfc2FtcGxlLnR4dCAtTyB6IFwKUEMwNjJfbWVyZ2VkX0hlcmF0bzE4MDEuUEwuQUQuSEFQQ1VUMi5zaXRlX2FsbC52Y2YuZ3ogPiAke2Nocm9tfV8ke2Nocm9tU3RhcnR9LSR7Y2hyb21FbmR9X3N1YnNldC52Y2YuZ3oKdGFiaXggJHtjaHJvbX1fJHtjaHJvbVN0YXJ0fS0ke2Nocm9tRW5kfV9zdWJzZXQudmNmLmd6CmBgYAoKYGBge2Jhc2gsIGVjaG89Rn0KIyBNYWtlIG5ldyBmb2xkZXIgZm9yIG9wdGl4Cm1rZGlyIH4vUHJvai1EZWYtSGFwbG8vJHtyZWdpb25OYW1lfV9uZXdydW4KbWtkaXIgfi9Qcm9qLURlZi1IYXBsby8ke3JlZ2lvbk5hbWV9X25ld3J1bi9WQ0ZzCmNkIH4vUHJvai1EZWYtSGFwbG8vJHtyZWdpb25OYW1lfV9uZXdydW4vVkNGcy8KIyBNYWtlIHN5bWJvbGljIGxpbmsgdG8gdGhlIG9yZ2luYWwgZmlsZQpsbiAtcyAvbmZzL3NjaXN0b3JlMDMvYmFydG9ncnAvYXBhbC9Qcm9qLURlZi1IYXBsby9WQ0ZzLyR7Y2hyb219XyR7Y2hyb21TdGFydH0tJHtjaHJvbUVuZH1fc3Vic2V0LnZjZi5neiAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3oKbG4gLXMgL25mcy9zY2lzdG9yZTAzL2JhcnRvZ3JwL2FwYWwvUHJvai1EZWYtSGFwbG8vVkNGcy8ke2Nocm9tfV8ke2Nocm9tU3RhcnR9LSR7Y2hyb21FbmR9X3N1YnNldC52Y2YuZ3oudGJpICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5nei50YmkKYGBgCgpgYGB7YmFzaCwgZWNobz1UfQojIEtlZXAgb25seSB0aGUgc2l0ZXMgdGhhdCBhcmUgdmFyaWFudCB0byB0aGlzIHN1YnNldCBvZiAyMCBkaXBsb2lkIGluZGl2aWR1YWxzCmJjZnRvb2xzIHZpZXcgLWMxIC1DMzkgLU96ICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5negpiY2Z0b29scyBxdWVyeSAtLWZvcm1hdCAnJUNIUk9NXHQlUE9TXHQlUkVGXHQlQUxUXHRbJUdUXHRdXG4nICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0CmBgYAoKYGBge2Jhc2gsIGVjaG89VH0KI2NoZWNrIG51bWJlcnMgb2Ygc2l0ZXMgaW4gdGhlIFZDRiBmaWxlCmJjZnRvb2xzIHZpZXcgLUggJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6IHwgd2MgLWwgI1RvdGFsIHNpdGVzID0gMjgxMgpiY2Z0b29scyB2aWV3IC1IIC1jMSAtQzM5ICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiB8IHdjIC1sICNUb3RhbCB2YXJpYW50IHNpdGVzID0gMjQyNgpiY2Z0b29scyB2aWV3IC1IIC1DMCAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3ogfCB3YyAtbCAjU2l0ZXMgZml4ZWQgdG8gUkVGIGFsbGVsZSA9IDMzMCAoUkVGIGFjY29yZGluZyB0byB0aGUgVkNGIGZvcm1hdCBub21lbmNsYXR1cmUpCmJjZnRvb2xzIHZpZXcgLUggLWM0MCAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3ogfCB3YyAtbCAjU0l0ZXMgZml4ZWQgdG8gQUxUIGFsbGVsZSA9IDU2IChBTFQgYWNjb3JkaW5nIHRvIHRoZSBWQ0YgZm9ybWF0IG5vbWVuY2xhdHVyZSkKYGBgCgpgYGB7YmFzaCwgZWNobz1UfQojIENyZWF0ZSBzaXRlcyBmaWxlIAojIFVTQUdFOiBSc2NyaXB0IHZjZjJzaXRlcy5SIDxzYW1wbGUudHh0PiA8aW5wdXQuZ3Q+IDxjaHI+IDxiZWdpbj4gPGVuZD4gIwpSc2NyaXB0ICR3b3JrZGlyL3NjcmlwdHMvdmNmMnNpdGVzLlIgJHdvcmtkaXIvc2FtcGxlL2FsbF9zYW1wbGUudHh0ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0ICRjaHJvbSAkY2hyb21TdGFydCAkY2hyb21FbmQKY2F0IDwoaGVhZCAtMiAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpIDwoY3V0IC1mMSwyIDwodGFpbCArMyAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpKSA+IC4uLyR7cmVnaW9uTmFtZX1fSGVyYXRvLnNpdGVzCmBgYAoKYGBge2Jhc2gsIGVjaG89VH0KIyBDcmVhdGUgbWFzayBmaWxlCmJjZnRvb2xzIHZpZXcgLUggJHtyZWdpb25OYW1lfV9IZXJhdG9fdmFyaWFudHMudmNmLmd6IHwgYXdrICckMCAhfiAvXiMvIHtwcmludCAkMSwkMi0xLCQyfScgfCBiZWRvcHMgLWQgPChlY2hvIC1lICIkY2hyb21cdCQoKCRjaHJvbVN0YXJ0LTEpKVx0JGNocm9tRW5kIikgLSB8IGJnemlwID4gLi4vJHtyZWdpb25OYW1lfV9IZXJhdG9fbWFzay5iZWQuZ3oKYGBgCgpXZSByZXBlYXRlZCB0aGUgc2FtZSBzdGVwcyBmb3IgdGhlIG5ldXRyYWwgYmFja2dyb3VuZCByZWdpb24sIFNjYWZmb2xkIEhlcmF0bzE2MDM6MzQ1MDAwMC0zNDkzNTM4LiBJbiB0aGF0IHJlZ2lvbiAoNDM1MzggYnApLCB0aGVyZSBhcmUgNjQwNyBzaXRlcyBhbHRvZ2V0aGVyIC0gNDkyNiBpcyB2YXJpYW50IHBvc2l0aW9ucywgd2hpbGUgMTQwNSBhbmQgNzYgc2l0ZXMgYXJlIGZpeGVkIGZvciBvbmUgb3IgdGhlIG90aGVyIGFsbGVsZS4gKHNlZSAqLlJtZCogZmlsZSBmb3IgZnVsbCBjb2RlKS4gCgpgYGB7YmFzaCwgZWNobz1GfQojIyBOZXV0cmFsOiBIZXJhdG8xNjAzOjM0NTAwMDAtMzQ5MzUzOAoKIyBJbml0aWF0ZSB2YXJpYWJsZXMKcmVnaW9uTmFtZT1IZXJhdG8xNjAzLTEgIyB3ZSBjYWxsIGl0IEhlcmF0bzE2MDMtMSBzaW5jZSB3ZSBzdWJzZXQgZXhhY3RseSB0aGUgc2FtZSBnZW5vbWljIGxlbmd0aCAoNDM1MzggYnApIGFzIHRoZSBvcHRpeCByZWdpb24KY2hyb209SGVyYXRvMTYwMwpjaHJvbVN0YXJ0PTM0NTAwMDAKY2hyb21FbmQ9MzQ5MzUzOApjZCB+L1Byb2otRGVmLUhhcGxvL1ZDRnMvCgojIFN1YnNldCBzYW1wbGVzIGZyb20gZnVsbCBWQ0YgCmJjZnRvb2xzIHZpZXcgLVMgLi4vc2FtcGxlL2FsbF9zYW1wbGUudHh0IFwKICAtciAkY2hyb206JGNocm9tU3RhcnQtJGNocm9tRW5kIFwKICAtT3ogUEMwNjJfbWVyZ2VkX0hlcmF0bzE2MDMuMy40NU1iLlBMLkFELkhBUENVVDIudmNmLmd6ID4gJHtjaHJvbX1fJHtjaHJvbVN0YXJ0fS0ke2Nocm9tRW5kfV9zdWJzZXQudmNmLmd6CnRhYml4ICR7Y2hyb219XyR7Y2hyb21TdGFydH0tJHtjaHJvbUVuZH1fc3Vic2V0LnZjZi5negoKIyBNYWtlIG5ldyBmb2xkZXIgZm9yIEhlcmF0bzE2MDMKbWtkaXIgfi9Qcm9qLURlZi1IYXBsby8ke3JlZ2lvbk5hbWV9X25ld3J1bgpta2RpciB+L1Byb2otRGVmLUhhcGxvLyR7cmVnaW9uTmFtZX1fbmV3cnVuL1ZDRnMKY2Qgfi9Qcm9qLURlZi1IYXBsby8ke3JlZ2lvbk5hbWV9X25ld3J1bi9WQ0ZzLwoKbG4gLXMgJHdvcmtkaXIvVkNGcy8ke2Nocm9tfV8ke2Nocm9tU3RhcnR9LSR7Y2hyb21FbmR9X3N1YnNldC52Y2YuZ3ogJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6CmxuIC1zICR3b3JrZGlyL1ZDRnMvJHtjaHJvbX1fJHtjaHJvbVN0YXJ0fS0ke2Nocm9tRW5kfV9zdWJzZXQudmNmLmd6LnRiaSAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3oudGJpCgojIEtlZXAgb25seSB0aGUgc2l0ZXMgdGhhdCBhcmUgdmFyaWFudCB0byB0aGlzIHN1YnNldCBvZiAyMCBkaXBsb2lkIGluZGl2aWR1YWxzCmJjZnRvb2xzIHZpZXcgLWMxIC1DMzkgLU96ICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5negpiY2Z0b29scyBxdWVyeSAtLWZvcm1hdCAnJUNIUk9NXHQlUE9TXHQlUkVGXHQlQUxUXHRbJUdUXHRdXG4nICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0CgojY2hlY2sgbnVtYmVycyBvZiBzaXRlcyBpbiB0aGUgVkNGIGZpbGUKYmNmdG9vbHMgdmlldyAtSCAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3ogfCB3YyAtbCAjVG90YWwgc2l0ZXMgPSA2NDA3CmJjZnRvb2xzIHZpZXcgLUggLWMxIC1DMzkgJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6IHwgd2MgLWwgI1RvdGFsIHZhcmlhbnQgc2l0ZXMgPSA0OTI2CmJjZnRvb2xzIHZpZXcgLUggLUMwICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiB8IHdjIC1sICNTaXRlcyBmaXhlZCB0byBSRUYgYWxsZWxlID0gMTQwNQpiY2Z0b29scyB2aWV3IC1IIC1jNDAgJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6IHwgd2MgLWwgI1NpdGVzIGZpeGVkIHRvIEFMVCBhbGxlbGUgPSA3NgoKI0NyZWF0ZSBzaXRlcyBmaWxlIAojVVNBR0U6IFJzY3JpcHQgdmNmMnNpdGVzLlIgPHNhbXBsZS50eHQ+IDxpbnB1dC5ndD4gPGNocj4gPGJlZ2luPiA8ZW5kPgpSc2NyaXB0ICR3b3JrZGlyL3NjcmlwdHMvdmNmMnNpdGVzLlIgJHdvcmtkaXIvc2FtcGxlL2FsbF9zYW1wbGUudHh0ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0ICRjaHJvbSAkY2hyb21TdGFydCAkY2hyb21FbmQKY2F0IDwoaGVhZCAtMiAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpIDwoY3V0IC1mMSwyIDwodGFpbCArMyAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpKSA+IC4uLyR7cmVnaW9uTmFtZX1fSGVyYXRvLnNpdGVzCgojIyBDcmVhdGUgbWFzayBmaWxlCmJjZnRvb2xzIHZpZXcgLUggJHtyZWdpb25OYW1lfV9IZXJhdG9fdmFyaWFudHMudmNmLmd6IHwgYXdrICckMCAhfiAvXiMvIHtwcmludCAkMSwkMi0xLCQyfScgfCBiZWRvcHMgLWQgPChlY2hvIC1lICIkY2hyb21cdCQoKCRjaHJvbVN0YXJ0LTEpKVx0JGNocm9tRW5kIikgLSB8IGJnemlwID4gLi4vJHtyZWdpb25OYW1lfV9IZXJhdG9fbWFzay5iZWQuZ3oKYGBgCgojIyMjIElucHV0IHBhcmFtZXRlcnMKSW4gb3JkZXIgdG8gcnVuIEFSR3dlYXZlciwgd2UgY29uc2lkZXIgKiRcbXUkKiAobXV0YXRpb24gcmF0ZSkgPSAkMi45IFx0aW1lcyAxMF57LTl9JCBwZXIgYnAgcGVyIGdlbmVyYXRpb24sIGFuZCBpdHMgcmF0aW8gdG8gcmVjb21iaW5hdGlvbiByYXRlLCAkXGZyYWN7XG11fXtyfSQgPSAxLiBXZSBlc3RpbWF0ZSAkTl9lJCBieSBjYWxjdWxhdGluZyBUYWppbWEncyAkXHBpJCAoPSAqJDROX2UgciQqKSBmcm9tIHRoZSBuZXV0cmFsIHJlZ2lvbi4gKiRccGkkKiA9IDAuMDIyNTA0OSwgJE5fZSQgPSAxOTQwMDc4LiBUaGUgdG90YWwgbWFwIGxlbmd0aCBvZiBib3RoICpvcHRpeCogYW5kIG5ldXRyYWwgcmVnaW9uIGlzIDAuMDEyNjI2MDIgY00uIChzZWUgKi5SbWQqIGZpbGUgZm9yIGZ1bGwgY29kZSkKYGBge2Jhc2gsIGVjaG89Rn0KIyMgQ2FsY3VsYXRpbmcgcGkgZnJvbSBvcmlnaW5hbCBIZXJhdG8xNjAzIHNjYWZmb2xkIHBvczozLjQ1LTMuNTUgKDFNQikKIyBUaGlzIG91dHB1dHMgcGkgcGVyIHNpdGUgCnZjZnRvb2xzIC0tZ3p2Y2YgJHdvcmtkaXIvVkNGcy9QQzA2Ml9tZXJnZWRfSGVyYXRvMTYwMy4zLjQ1TWIuUEwuQUQuSEFQQ1VUMi52Y2YuZ3ogXAotLXNpdGUtcGkgXAotLWtlZXAgJHdvcmtkaXIvc2FtcGxlL2FsbF9zYW1wbGUudHh0IFwKLS1vdXQgSGVyYXRvMTYwMwojIFN1bSBvZiBwaSBlc3RpbWF0ZXMgYWNyb3NzIGFsbCBzaXRlcwphd2sgJ3tTVU0rPSQzfSBFTkQge3ByaW50IFNVTX0nIEhlcmF0bzE2MDMuc2l0ZXMucGkgCmBgYApgYGB7ciwgZWNobz1GfQojIyBDYWxjdWxhdGlnIE5lIGZyb20gSGVyYXRvMTYwMzozNDUwMDAwLTM1NTAwMDAKcj0yLjllLTA5ICNyZWNvbWJpbmF0aW9uIHJhdGUKTD0zNTUwMDAwLTM0NTAwMDAgI0dlbm9taWMgbGVuZ3RoCm49NDAgIyBuby4gb2Ygc2FtcGxlcwpwaV9zdW0gPSAyMjUwLjQ5ICMgU3VtIG9mIHBpIGVzdGltYXRlcyBhY3Jvc3MgYWxsIHNpdGVzCnBpID0gcGlfc3VtL0wgI3BpIGVzdGltYXRlClM9MTA1NzEgIyBObyBvZiBzZWdncmVnYXRpbmcgc2l0ZXMgaW4gdGhpcyByZWdpb24gCk5lX3RhamltYT1waS8oNCpyKSAKTmVfd2F0dGVyc29uPVMvKDQqcipMKSooc3VtKGMoMToobi0xKSleKC0xKSkpXi0xICMgV2F0dGVyc29uJ3MgTmUgZm9yIHNhbml0eSBjaGVjawpjYXQocGksIE5lX3RhamltYSwgTmVfd2F0dGVyc29uLCBOZV90YWppbWEvTmVfd2F0dGVyc29uKSAgCiMgMC4wMjI1MDQ5IDE5NDAwNzggMjE0MjQzMyAwLjkwNTU0ODgKCiMjIENhbGN1bGF0aW5nIG1hcCBsZW5ndGgKMi45ZS05KjEwMCo0MzUzOApgYGAKTW9yZW92ZXIsIEFSR3dlYXZlciBhbGxvd3MgY29hbGVzY2VuY2UgYW5kIHJlY29tYmluYXRpb24gZXZlbnRzIHRvIHRha2UgcGxhY2Ugb25seSBhdCBkaXNjcmV0aXplZCB0aW1lIHBvaW50cywgdGhhdCBhcmUgZGVmaW5lZCBieSBhbiBleHBvbmVudGlhbCBmdW5jdGlvbiwgJHQoaSk9XGZyYWMge2V4cChcZnJhY3sgaX17S+KIkjF9bG9nKDErXGRlbHRhIHRfe21heH0pKeKIkjF9e1xkZWx0YX0kOyBmb3IgKksqIHRpbWUgcG9pbnRzIGFuZCAkaVxpbntcezAsIDEsIOKApiwgS+KIkjFcfX0kLiBWZXJ5IHNtYWxsIHZhbHVlcyBvZiAkXGRlbHRhICggPFxmcmFjIHsxfXt0X3ttYXh9fSkkIHdpbGwgeWllbGQgcm91Z2hseSBsaW5lYXIgZGlzdHJpYnV0aW9uIG9mIHRpbWVzLCB3aGVyZWFzIGxhcmdlciB2YWx1ZXMgb2YgJFxkZWx0YSQgd2lsbCBwbGFjZSBtb3JlIHRpbWUgcG9pbnRzIGluIHJlY2VudCBwYXN0IGFuZCBsZXNzIGluIGRlZXAgcGFzdC4gRm9yIHRoaXMgYW5hbHlzaXMsIHdlIHNldCAqSyogPSAzMCwgdGhlIG1heGltdW0gdGltZSBmb3IgdG90YWwgY29hbGVzY2VuY2UgKCokdF97bWF4fSQqKSA9IDIwKiROX2UkKiwgYW5kIHRoZSBzaGFwZSBwYXJhbWV0ZXIgKCokXGRlbHRhJCopID0gMC4wMS4gCmBgYHtyIGZpZzEsICBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02LCBlY2hvPUYsIHJlc3VsdHMgPSBGfQp0aW1lcG9pbnRzPWZ1bmN0aW9uKEssIGRlbHRhLCB0bWF4KXsoZXhwKChzZXEoSyktMSkvKEstMSkqbG9nKDErZGVsdGEqKHRtYXgpKSktMSkvZGVsdGF9IAoKcGFyKG1hciA9IGMoNSwgNCwgNCwgNCkgKyAxKQpOZT0xOTQwMDc4OyBLPTMwOyB0bWF4PTIwKk5lOyAKI2RhdGEuZnJhbWUoTmUyID0gdGltZXBvaW50cyhLLCAxZS0yLCB0bWF4MikvTmUyLCB0aW1lID0gdGltZXBvaW50cyhLLCAxZS0yLCB0bWF4MikpCnBsb3Qoc2VxKEspLHRpbWVwb2ludHMoSywgMWUtMiwgdG1heCkvTmUsIHlsaW09YygwLDIwKSwgeWxhYiA9ICJUaW1lIChOZSkiLCB4bGFiID0gIlRpbWUgc3RlcHMiLCB0eXBlID0gJ28nLCBwY2g9MjAsIGNvbD0iYmxhY2siLCBsd2Q9MywgbWFpbj0iRGlzY3JldGUgVGltZSBQb2ludHMiKSArCiAgYWJsaW5lKGg9MSwgbHdkPTIsIGNvbD0icmVkIikgKwogIGF4aXMoc2lkZSA9IDQsIGF0PWMoMCwgMWU3LCAyZTcsIDNlNywgNGU3KS9OZSwgbGFiZWxzPWMoMCwxZTcsIDJlNywgM2U3LCA0ZTcpKSArCiAgbXRleHQoIlRpbWUgKGdlbmVyYXRpb25zKSIsIHNpZGUgPSA0LCBsaW5lID0gMykKYGBgCioqRmlnIFMxOioqIERpc2NyZXRlIHRpbWUgcG9pbnRzIGZvciBBUkd3ZWF2ZXIgYW5hbHlzaXMgLSAzMCB0aW1lIHN0ZXBzLCAkTl9lJCA9IDE5NDAwNzgsIExlZnQgeS1heGlzIHNob3dzIHRoZSB0aW1lIHBvaW50cyBpbiAkTl9lJCwgd2hpbGUgcmlnaHQgeS1heGlzIGluIG51bWJlciBvZiBnZW5lcmF0aW9ucy4gUmVkIGxpbmUgZGVub3RlcyAxJE5fZSQuCgoKCiMjIyMgUnVuIEFSR3dlYXZlcgoKQVJHd2VhdmVyIGlzIHJ1biBmb3IgNTAwMCBpdGVyYXRpb25zIGFuZCB0aGVuIHJlc3VtZWQgZm9yIGFub3RoZXIgNTAwMCBpdGVyYXRpb25zIGZvciB0aGUgKm9wdGl4KiByZWdpb24sIHdoZXJlYXMgb25seSA1MDAwIGl0ZXJhdGlvbnMgZm9yIHRoZSBuZXV0cmFsIHJlZ2lvbi4gCmBgYHtiYXNoLCBlY2hvPVR9CiMgUnVuIEFSR3dlYXZlcgp+Ly5sb2NhbC9iaW4vYXJnLXNhbXBsZSAtcyAgc2l0ZXMvJHtyZWdpb25OYW1lfV9IZXJhdG8uc2l0ZXMgXAoJLS1tYXNrbWFwIG1hc2tzLyR7cmVnaW9uTmFtZX1fSGVyYXRvX21hc2suYmVkLmd6IFwKCS1OIDE5NDAwNzggXAoJLW0gMi45ZS05IFwKCS1yIDIuOWUtOSBcCgktLW50aW1lcyAzMCBcCgktLW1heHRpbWUgJCgoMTk0MDA3OCoyMCkpIFwKCS0taXRlcnMgNTAwMCBcCgktLWRlbHRhIDAuMDEgXAoJLS1vdXRwdXQge3JlZ2lvbk5hbWV9L3NhbXBsZS8ke3JlZ2lvbk5hbWV9CgojIFJlc3VtZSBBUkd3ZWF2ZXIgZm9yIG1vcmUgaXRlcmF0aW9ucwp+Ly5sb2NhbC9iaW4vYXJnLXNhbXBsZSAtcyBzaXRlcy8ke3JlZ2lvbk5hbWV9X0hlcmF0by5zaXRlcyBcCgktLW1hc2ttYXAgbWFza3MvJHtyZWdpb25OYW1lfV9IZXJhdG9fbWFzay5iZWQuZ3ogXAoJLU4gMTk0MDA3OCBcCgktbSAyLjllLTkgXAoJLXIgMi45ZS05IFwKCS0tbnRpbWVzIDMwIFwKCS0tbWF4dGltZSAkKCgxOTQwMDc4KjIwKSkgXAoJLS1pdGVycyAxMDAwMCBcCgktLWRlbHRhIDAuMDEgXAoJLS1vdXRwdXQge3JlZ2lvbk5hbWV9L3NhbXBsZS8ke3JlZ2lvbk5hbWV9IFwKCS0tcmVzdW1lCmBgYAoKCgojIyBBbmFseXNpcyBvZiBBUkd3ZWF2ZXIgb3V0cHV0CgpgYGB7cn0KIyMgTG9hZCBwYWNrYWdlcyBhbmQgaW5pdGlhdGUgZnVuY3Rpb25zCnNvdXJjZShmaWxlID0gIn4vUHJvai1EZWYtSGFwbG8vc2NyaXB0cy9mdW5jdGlvbnMuUiIpCmBgYAoKIyMjIyBNQ01DIHN1bW1hcnkKClZpc3VhbGl6aW5nIHRoZSB0cmFjZXMgb2YgbGlrZWxpaG9vZCwgcHJpb3IgYW5kIGpvaW50IHByb2JhYmlsaXRpZXMgZnJvbSB0aGUgTUNNQyBpdGVyYXRpb25zLCB3ZSBkZWNpZGVkIHRvIHNldCB0aGUgZmlyc3QgMzAwMCBpdGVyYXRpb25zIGFzIGJ1cm5pbi4gVGhlIHBsb3QgYmVsb3cgaXMgZm9yIHRoZSAqb3B0aXgqIHJlZ2lvbi4KYGBge3IgZmlnMiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTUsIGVjaG89RiwgbWVzc2FnZT1GLCByZXN1bHRzPUZ9CiNNQ01DIHN1bW1hcnkKbWNtY19zdW1tYXJ5IDwtICJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuc3RhdHMiCnBsb3RUcmFjZXMobWNtY19zdW1tYXJ5LCBzdGF0cz1jKCJwcmlvciIsICJsaWtlbGlob29kIiwgImpvaW50IiwgInJlY29tYnMiLCAiYXJnbGVuIiwgIm5vbmNvbXBhdHMiKSkKYGBgCioqRmlnIFMyOioqIFRyYWNlcyBhY3Jvc3MgYWxsIE1DTUMgaXRlcmF0aW9ucyBvZiAqKnByaW9yKiogKGxvZyBwcm9iYWJpbGl0eSBvZiB0aGUgc2FtcGxlZCBBUkcgZ2l2ZW4gdGhlIG1vZGVsKSwgKipsaWtlbGlob29kKiogKGxvZyBwcm9iYWJpbGl0eSBvZiB0aGUgZGF0YSBnaXZlbiB0aGUgc2FtcGxlZCBBUkcpLCAqKmpvaW50KiogKHRvdGFsIGxvZyBwcm9iYWJpbGl0eSBvZiB0aGUgQVJHIGFuZCB0aGUgZGF0YSAoKnByaW9yKiArICpsaWtlbGlob29kKikpLCAqKnJlY29tYnMqKiAobnVtYmVyIG9mIHJlY29tYmluYXRpb24gZXZlbnRzIGluIHRoZSBzYW1wbGVkIEFSRyksICoqYXJnbGVuKiogKHRvdGFsIGxlbmd0aCBvZiBhbGwgYnJhbmNoZXMgc3VtbWVkIGFjcm9zcyBzaXRlcykgYW5kICoqbm9uY29tcGF0cyoqIChudW1iZXIgb2YgdmFyaWFudCBzaXRlcyB0aGF0IGNhbm5vdCBiZSBleHBsYWluZWQgYnkgaW5maW5pdGUgc2l0ZXMgbXV0YXRpb24gbW9kZWwpLgoKIyMjIyBQcm9jZXNzIG91dHB1dCBmcm9tIEFSR3dlYXZlcgpUaGUgQVJHd2VhdmVyIG91dHB1dCAqLnNtYyogZmlsZXMgYXJlIHRoZW4gY29udmVydGVkIHRvIGVhc2lseSBtYW5pcHV0YWJsZSAqLmJlZCogZm9ybWF0IHRvIGV4dHJhY3QgVE1SQ0FzLCB0cmVlcywgcmVjb21pbmF0aW9uIGJyZWFrcG9pbnRzIGFuZCB0b3RhbCB0cmVlIGJyYW5jaCBsZW5ndGhzIGFjcm9zcyBhbGwgaXRlcmF0aW9ucyAoZXhjZXB0IGJ1cm5pbikuIFRoZW4sIDIgc3BlY2lmaWMgaXRlcmF0aW9ucyAoSXRlcmF0aW9uIDgyNTAgYW5kIDkwMDApIGFyZSBjaG9zZW4gZm9yIGZ1cnRoZXIgYW5hbHlzaXMgYW5kIGlkZW50aWZpY2F0aW9uIG9mIGhhcGxvdHlwZSBibG9ja3MgKHNlZSAqLlJtZCogZmlsZSBmb3IgZnVsbCBjb2RlLCBhbmQgYW5hbHlzaXMgZm9yIHRoZSBuZXV0cmFsIHJlZ2lvbikKCmBgYHtiYXNoLCBlY2hvPUZ9CiMjIExvYWQgbW9kdWxlcyBhbmQgc291cmNlIC5iYXNocmMgCm1vZHVsZSBsb2FkIHNhbXRvb2xzIGJlZG9wcyBiY2Z0b29scyBSIApzb3VyY2Ugfi8uYmFzaHJjCmV4cG9ydCBQWVRIT05QQVRIPSRIT01FLy5sb2NhbC9iaW4KYGBgCgpgYGB7YmFzaCBlY2hvPVR9CiMjIyMgT1BUSVggIyMjIwoKIyBMb2FkIHZhcmlhYmxlcwp3b3JrZGlyPSRIT01FL1Byb2otRGVmLUhhcGxvCnByZWZpeD1vcHRpeF9uZXdOZQpyZWdpb25OYW1lPW9wdGl4CmNocm9tPUhlcmF0bzE4MDEKY2hyb21TdGFydD0xMzYyMDY3CmNocm9tRW5kPTE0MDU2MDUKCiMgQ29udmVydCAuc21jIHRvIC5iZWQgZm9ybWF0IGZvciBhbGwgaXRlcmF0aW9ucwpjZCAkd29ya2Rpci9vcHRpeF9uZXdydW4vJHByZWZpeApzbWMyYmVkLWFsbCAkd29ya2Rpci9vcHRpeF9uZXdydW4vJHByZWZpeC9zYW1wbGUvJHByZWZpeAoKIyMgQ2hlY2sgbWNtYyBzdGF0cyB0byBjaGVjayBidXJuaW4KYnVybmluPTMwMDAKIyBDb21wdXRlIFRNUkNBIGVzdGltYXRlcyBmb3IgYmV0d2VlbiBhbmQgd2l0aGluIHBvcHVhbHRpb25zIGZyb20gYWxsIGl0ZXJhdGlvbnMKZm9yIHBvcCBpbiBhbGxfc2FtcGxlIEhlcmF0b19ub3RhYmlsaXMgSGVyYXRvX2xhdGl2aXR0YTsgZG8KICAgIGVjaG8gU3VtbWFyaXppbmcgJHBvcAogICAgYXJnLXN1bW1hcml6ZSAtLWFyZy1maWxlIC4vc2FtcGxlLyRwcmVmaXguYmVkLmd6IFwKCQkJIC0tc3Vic2V0LWluZHMgJHdvcmtkaXIvc2FtcGxlLyRwb3AudHh0IFwKCQkJIC0tbG9nLWZpbGUgLi9zYW1wbGUvJHByZWZpeC5sb2cgXAoJCQkgLS10bXJjYSBcCgkJCSAtLWJ1cm5pbiAkYnVybmluIFwKCQkJIC0tbWVhbiAtLXN0ZGV2IC0tcXVhbnRpbGUgMC4wNSwwLjUsMC45NSB8XAoJCWJnemlwID4gJHByZWZpeC50bXJjYS4kcG9wLmJlZC5negoJCWVjaG8gIiAtPiBEb25lIgpkb25lCgojIyBUaGUgc2FtZSBpcyByZXBlYXRlZCBmb3IgdGhlIG5ldXRyYWwgcmVnaW9uIGJlbG93CmBgYAoKYGBge2Jhc2ggZWNobz1UfQojIyBDb21wdXRlIFRNUkNBLCBhbmQgYnJhbmNoIGxlbmd0aCBmcm9tIGluZGl2aWR1YWwgaXRlcmF0aW9ucwpzdGF0c19saXN0PSh0bXJjYSBicmFuY2hsZW4pCml0ZXJzX2xpc3Q9KDgyNTAgOTAwMCkKCmZvciBwb3AgaW4gYWxsX3NhbXBsZSBIZXJhdG9fbm90YWJpbGlzIEhlcmF0b19sYXRpdml0dGE7IGRvCiAgICBlY2hvIFN1bW1hcml6aW5nICRwb3AKICAgIGZvciBzYW1wbGVfbm8gaW4gJHtpdGVyc19saXN0WypdfTsgZG8KICAgIAllY2hvIC1uICJDb21wdXRpbmcgJHNhbXBsZV9ubyIKICAgIAlmb3Igc3RhdCBpbiAke3N0YXRzX2xpc3RbKl19OyBkbwogICAgCSAgZWNobyAtbiAiQ29tcHV0aW5nICRzdGF0IgogICAgCSAgYXJnLXN1bW1hcml6ZSAtLWFyZy1maWxlIC4vc2FtcGxlLyRwcmVmaXguYmVkLmd6IFwKCQkJICAgIC0tc3Vic2V0LWluZHMgJHdvcmtkaXIvc2FtcGxlLyRwb3AudHh0IFwKCQkJICAgIC0tc2FtcGxlICRzYW1wbGVfbm8gXAoJCQkgICAgLS1sb2ctZmlsZSAuL3NhbXBsZS8kcHJlZml4LmxvZyBcCgkJCSAgICAtLSRzdGF0IFwKCQkJICAgIC0tbWVhbiAtLXF1YW50aWxlIDAuMDUsMC41LDAuOTUgfFwKCQkJICBiZ3ppcCA+ICRwcmVmaXguJHN0YXQuJHBvcC4ke3NhbXBsZV9ub30uYmVkLmd6CgkJCSAgZWNobyAiIC0+IERvbmUiCgkJCWRvbmUKICAgIGRvbmUKZG9uZQpgYGAKCmBgYHtiYXNoIGVjaG89Rn0KIyMgR2V0IHRyZWVzIGZyb20gaXRlcmF0aW9uIDgwMDAgYW5kIDkwMDAKemNhdCAkcHJlZml4LjgwMDAuc21jLmd6ID4gJHByZWZpeC44MDAwLnNtYwp0YWlsICszICRwcmVmaXguODAwMC5zbWMgfCBncmVwIFRSRUUgPiAkcHJlZml4LjgwMDBfdHJlZXMudHh0CnRhaWwgKzMgJHByZWZpeC44MDAwLnNtYyB8IGdyZXAgU1BSID4gJHByZWZpeC44MDAwX1NQUi50eHQKCnpjYXQgJHByZWZpeC45MDAwLnNtYy5neiA+ICRwcmVmaXguNTAwMC5zbWMKdGFpbCArMyAkcHJlZml4LjkwMDAuc21jIHwgZ3JlcCBUUkVFID4gJHByZWZpeC45MDAwX3RyZWVzLnR4dAp0YWlsICszICRwcmVmaXguOTAwMC5zbWMgfCBncmVwIFNQUiA+ICRwcmVmaXguOTAwMF9TUFIudHh0Cgp6Y2F0ICRwcmVmaXguODI1MC5zbWMuZ3ogPiAkcHJlZml4LjgyNTAuc21jCnRhaWwgKzMgJHByZWZpeC44MjUwLnNtYyB8IGdyZXAgVFJFRSA+ICRwcmVmaXguODI1MF90cmVlcy50eHQKdGFpbCArMyAkcHJlZml4LjgyNTAuc21jIHwgZ3JlcCBTUFIgPiAkcHJlZml4LjgyNTBfU1BSLnR4dAoKemNhdCAkcHJlZml4LjkyMDAuc21jLmd6ID4gJHByZWZpeC45MjAwLnNtYwp0YWlsICszICRwcmVmaXguOTIwMC5zbWMgfCBncmVwIFRSRUUgPiAkcHJlZml4LjkyMDBfdHJlZXMudHh0CnRhaWwgKzMgJHByZWZpeC45MjAwLnNtYyB8IGdyZXAgU1BSID4gJHByZWZpeC45MjAwX1NQUi50eHQKYGBgCgpgYGB7ciBlY2hvPUYsIHJlc3VsdHM9RiwgbWVzc2FnZT1GLCBpbmNsdWRlPUZ9CiNNQ01DIHN1bW1hcnkgZm9yIHRoZSBuZXV0cmFsIHJlZ2lvbgptY21jX3N1bW1hcnlfbmV1dHJhbCA8LSAifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9zYW1wbGUvSGVyYXRvMTYwMy0xX25ld05lLnN0YXRzIgpwbG90VHJhY2VzKG1jbWNfc3VtbWFyeV9uZXV0cmFsLCBzdGF0cz1jKCJwcmlvciIsICJsaWtlbGlob29kIiwgImpvaW50IiwgInJlY29tYnMiLCAiYXJnbGVuIiwgIm5vbmNvbXBhdHMiKSkKYGBgCgpgYGB7YmFzaCBlY2hvPUZ9CiMjIyMgSGVyYXRvMTYwMyAjIyMjCgojIENvbnZlcnQgLnNtYyB0byAuYmVkIGZvcm1hdCBmb3IgYWxsIGl0ZXJhdGlvbnMKc21jMmJlZC1hbGwgfi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9zYW1wbGUvSGVyYXRvMTYwMy0xX25ld05lCgojIFNldCB2YXJpYWJsZQp3b3JrZGlyPSRIT01FL1Byb2otRGVmLUhhcGxvCnByZWZpeD1IZXJhdG8xNjAzLTFfbmV3TmUKCiMgQ2hlY2sgbWNtYyBzdGF0cyB0byBjaGVjayBidXJuaW4KYnVybmluPTIwMDAKCiMgQ29tcHV0ZSBUTVJDQSBlc3RpbWF0ZXMgZm9yIGJldHdlZW4gYW5kIHdpdGhpbiBwb3B1YWx0aW9ucyBmcm9tIGFsbCBpdGVyYXRpb25zCmZvciBwb3AgaW4gYWxsX3NhbXBsZSBIZXJhdG9fbm90YWJpbGlzIEhlcmF0b19sYXRpdml0dGE7IGRvCiAgICBlY2hvIFN1bW1hcml6aW5nICRwb3AKICAgIGFyZy1zdW1tYXJpemUgLS1hcmctZmlsZSAuL3NhbXBsZS8kcHJlZml4LmJlZC5neiBcCgkJCSAtLXN1YnNldC1pbmRzICR3b3JrZGlyL3NhbXBsZS8kcG9wLnR4dCBcCgkJCSAtLWxvZy1maWxlIC4vc2FtcGxlLyRwcmVmaXgubG9nIFwKCQkJIC0tdG1yY2EgXAoJCQkgLS1idXJuaW4gJGJ1cm5pbiBcCgkJCSAtLW1lYW4gLS1zdGRldiAtLXF1YW50aWxlIDAuMDUsMC41LDAuOTUgfFwKCQliZ3ppcCA+ICRwcmVmaXgudG1yY2EuJHBvcC5iZWQuZ3oKCQllY2hvICIgLT4gRG9uZSIKZG9uZQpgYGAKCmBgYHtiYXNoIGVjaG89Rn0KIyMgR2V0IHNhbXBsZSBJRHMKemNhdCAkcHJlZml4Ljk1MDAuc21jLmd6IHwgaGVhZCAtMiA+IC4uLy4uLy4uL3NhbXBsZS9uZXdBUkdzYW1wbGVJRC50eHQKYGBgCgpgYGB7ciwgZWNobz1GfQojIyBSZWFkIHNhbXBsZSBJRHMgYW5kIGFzc2lnbiBjb2xvdXJzIGFuZCBJRHMgCiMgUmVhZCBzYW1wbGVzIC0tLS0Kc2FtcElEIDwtIHJlYWQudGFibGUoIn4vUHJvai1EZWYtSGFwbG8vc2FtcGxlL2FsbC5uZXdJRC50eHQiKQpzaG9ydElEIDwtIHJlYWQudGFibGUoIn4vUHJvai1EZWYtSGFwbG8vc2FtcGxlL3Nob3J0SUQudHh0IikKc2FtcElEIDwtIGNiaW5kKHNhbXBJRCxzaG9ydElEKQpjb2xuYW1lcyhzYW1wSUQpIDwtIGMoIklEIiwicGxvdElEIiwic2hvcnRJRCIpCnNhbXBJRCRwb3AgPC0gYyhyZXAoIkhlcmF0b19ub3RhYmlsaXMiLCAyMCksIHJlcCgiSGVyYXRvX2xhdGl2aXR0YSIsIDIwKSkKc2FtcElEJGNvbCA8LSBjKHJlcCgiI0NDQ0MwMCIsIDIwKSwgcmVwKCIjQzAwQzI4IiwgMjApKQojc2FtcElECgojIE1ha2UgbGlzdCBvZiBpbmlkdmlkdWFscyB0byBhc2lnbiBjb2xvdXJzIC0tLS0KaW5kQ29sb3VyPWxpc3QoKQpmb3IgKGlkIGluIHNhbXBJRCRJRCl7aW5kQ29sb3VyW1tpZF1dIDwtIHNhbXBJRFt3aGljaChzYW1wSUQkSUQ9PWlkKSwiY29sIl19CmluZENvbG91cgoKIyBNYWtlIGxpc3Qgb2YgaW5kaXZpZHVhbHMgdG8gYXNpZ24gbmFtZXMgLS0tLQppbmRMYWJlbD1saXN0KCkKZm9yIChpZCBpbiBzYW1wSUQkSUQpe2luZExhYmVsW1tpZF1dIDwtIHNhbXBJRFt3aGljaChzYW1wSUQkSUQ9PWlkKSwic2hvcnRJRCJdfQojaW5kTGFiZWwKCiMgQVJHV0VBVkVSIGhhcyBkaWZmZXJlbnQgc2V0cyBvZiBJRHMgZGVwZW5kaW5nIG9uIGl0cyBpbml0aWFsIEFSRyBzYW1wbGUsIHNvIGZpeCB0aGF0ISAtLS0tCmFyZ0lEX25ldyA8LSByZWFkLnRhYmxlKGZpbGUgPSAic2FtcGxlL25ld0FSR3NhbXBsZUlELnR4dCIsIGhlYWRlciA9IFQpCmNvbG5hbWVzKGFyZ0lEX25ldykgPC0gYygiSUQiLCJBUkd3ZWF2ZXJJRCIpCiMgYXJnSURbNDAsMV0gPC0gMQojIGFyZ0lEWzQwLDJdIDwtIHNldGRpZmYoc2FtcElEJElELCBhcmdJRCRJRCkKIyBhcmdJRCRBUkd3ZWF2ZXJJRCA8LSBhcmdJRCRBUkd3ZWF2ZXJJRC0xCnNhbXBJRCA8LSBtZXJnZShzYW1wSUQsYXJnSURfbmV3LGFsbD1ULCBieT0iSUQiKQoKIyBzZXQgSURzIGZvciBmaW5hbCBwbG90IChvbmx5IGluY2x1ZGluZyBsYXRpdml0dGEgaW5kaXZpZHVhbHMpIC0tLS0KaW5kTGFiZWxfQVJHX2xhdD1saXN0KCkKZm9yIChpZCBpbiBzYW1wSUQkQVJHd2VhdmVySUQpe2luZExhYmVsX0FSR19sYXRbW2FzLmNoYXJhY3RlcihpZCldXSA8LSB3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gaWQpLTIwfQoKCmluZENvbG91cl9hcmdJRHMgPC0gaW5kQ29sb3VyCm5hbWVzKGluZENvbG91cl9hcmdJRHMpIDwtIGFzLmNoYXJhY3RlcihzYW1wSURbLCJBUkd3ZWF2ZXJJRCJdKQppbmRDb2xvdXJfYXJnSURzCiNpbmRDb2xvdXJfYXJnSURzCgpub3RhYmlsaXNfaW5kaXZpZHVhbHMgPC0gc2FtcElEW3doaWNoKHNhbXBJRCRwb3AgPT0gIkhlcmF0b19ub3RhYmlsaXMiKSwiQVJHd2VhdmVySUQiXQpsYXRpdml0dGFfaW5kaXZpZHVhbHMgPC0gc2FtcElEW3doaWNoKHNhbXBJRCRwb3AgPT0gIkhlcmF0b19sYXRpdml0dGEiKSwiQVJHd2VhdmVySUQiXQoKYGBgCgojIyMjIFJlYWQgU05QcwoKU05QcyBhcmUgY2hhbmdlZCBmcm9tIGl0cyBudWNsb2V0aWRlIGFzaWdubWVudCB0byAwLzE7IGJhc2VkIG9uIGFsbGVsZSBmcmVxdWVuY3kgd2l0aGluIHRoZSAqSC5lLmxhdGl2aXR0YSogc2FtcGxlcy4gKEhpZ2hlciBhbGxlbGUgZnJlcXVlbmN5IC0gMSwgTG93ZXIgYWxsZWxlIGZyZXF1ZW5jeSAtIDApCmBgYHtyLCBlY2hvPVR9CiMjIFJlYWQgYWxsIFNOUHMKb3B0aXhfc2l0ZXMgPC0gcmVhZFNpdGVzKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9zaXRlcy9vcHRpeF9IZXJhdG8uc2l0ZXMiKQojCiMjIFJlYWQgYWxsIHNpdGVzIChTTlBzK2ludmFyaWFudCkKb3B0aXhBTExfc2l0ZXMgPC0gcmVhZFNpdGVzKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9zaXRlcy9vcHRpeEFMTF9IZXJhdG8uc2l0ZXMiKQojCiMjIENoYW5nZSBTTlBzIHRvIDAgYW5kIDEgYmFzZWQgb24gbWFqb3IgYWxsZWxlIGluIGxhdGl2aXR0YQpzaXRlczwtIGRhdGEuZnJhbWUocG9zPW9wdGl4X3NpdGVzJHBvcywgb3B0aXhfc2l0ZXMkc2l0ZXMpCmZvciAoc25wSUQgaW4gYygxOm5yb3coc2l0ZXMpKSl7CiAgY2F0KHNucElELCBzaXRlc1tzbnBJRCwncG9zJ10pCiAgYWxsZWxlcyA8LSBzaXRlc1tzbnBJRCxzYW1wSUQkSURdCiAgYWxsZWxlcyA8LSBhcy5mYWN0b3IoYWxsZWxlcykKICAKICBhbGxlbGVDb3VudDEgPC0gc3VtKGFsbGVsZXNbbGF0XSA9PSBsZXZlbHMoYWxsZWxlcylbMV0pCiAgYWxsZWxlQ291bnQyIDwtIHN1bShhbGxlbGVzW2xhdF0gPT0gbGV2ZWxzKGFsbGVsZXMpWzJdKQogIAogIG1hakFsbGVsZSA8LSBpZmVsc2UoYWxsZWxlQ291bnQxID4gYWxsZWxlQ291bnQyLCBsZXZlbHMoYWxsZWxlcylbMV0sIGxldmVscyhhbGxlbGVzKVsyXSkKICBtaW5BbGxlbGUgPC0gc2V0ZGlmZihsZXZlbHMoYWxsZWxlcyksIG1hakFsbGVsZSkKCiAgc2l0ZXNbc25wSUQsd2hpY2goc2l0ZXNbc25wSUQsXSA9PSBtYWpBbGxlbGUpXSA8LSAxCiAgc2l0ZXNbc25wSUQsd2hpY2goc2l0ZXNbc25wSUQsXSA9PSBtaW5BbGxlbGUpXSA8LSAwCn0KYGBgCgpgYGB7ciBpbmNsdWRlPUZ9CnBsb3Qoc2l0ZXMkcG9zLCByZXAoMSwgbnNpdGVzKSwgdHlwZT0nbicsIHlsaW09YygxLDQwKSwgeGxhYiA9ICJQb3NpdGlvbiIsIHlsYWIgPSAiSW5kaXZpZHVhbCBJRCIpICsKICBwbG90X3NucHMoc2l0ZXMsIDEsICIjQzAwQzI4IikgKwogIHBsb3Rfc25wcyhzaXRlcywgMCwgIiNDQ0NDMDAiKSArCiAgZm9yKGkgaW4gc2V0ZGlmZihzaXRlc0FMTCRwb3MsIHNpdGVzJHBvcykpe3BvaW50cyhyZXAoaSw0MCksIDE6NDAsIGNvbCA9ICJibGFjayIsIGNleCA9IDAuNzUpfQpgYGAKCgojIyMjIFRNUkNBCgpXZSBmaXJzdCBleGFtaW5lIHRoZSBUTVJDQSBvZiB0aGUgdG90YWwgdHJlZSBhbmQgdGhlIGluZGl2aWR1YWwgcG9wdWxhdGlvbnMgLSAqSC5lLmxhdGl2aXR0YSogKGluIHJlZCkgYW5kICpILmUubm90YWJpbGlzKiAoaW4geWVsbG93KS4gVW5saWtlIHRoZSBuZXV0cmFsIHJlZ2lvbiAoKkhlcmF0bzE2MDMqKSB3aGVyZSBhbGwgVE1SQ0EgZXN0aW1hdGVzIGFyZSBmYWlybHkgY29uc3RyYWluZWQgYmV0d2VlbiAxIGFuZCAxMCAkTl9lJCwgVE1SQ0EgdHJhY2VzIGZvciBpbmRpdmlkdWFsIHBvcHVsYXRpb25zIGluIHRoZSAqb3B0aXgqIHJlZ2lvbiBleGhpYml0IHNoYWxsb3cgY29hbGVzY2VuY2UgdGltZXMgYXQgbXVsdGlwbGUgcG9zaXRpb25zIHRocm91Z2hvdXQgdGhlIGVudGlyZSB+NTBrYiByZWdpb24uIEluIGNhc2Ugb2YgYSBzZWxlY3RpdmUgc3dlZXBzLCB3aGVyZSBhIGJlbmVmaWNpYWwgbXV0YXRpb24gc3dlZXBzIHRocm91Z2ggdGhlIHBvcHVsYXRpb24sIFRNUkNBIHRlbmRzIHRvIGJlIHNoYWxsb3cgc2luY2UgYWxsIHNhbXBsZXMgaW4gdGhlIHN3ZXB0IHBvcHVsYXRpb24gY29hbGVzY2VzIHF1aWNrbHkgdG8gdGhlIGluaXRpYWwgImx1Y2t5IiBhbmNlc3Rvci4gTW92aW5nIGF3YXkgZnJvbSB0aGUgZm9jYWwgbXV0YXRpb25zLCBsaW5lYWdlcyByZWNvbWJpbmUgYXdheSBmcm9tIHRoZSBzd2VwdCBhbmNlc3RyYWwgYmFja2dyb3VuZC4gVGhlIFRNUkNBIGVzdGltYXRlcyBmcm9tIHRoZSAqb3B0aXgqIHJlZ2lvbiBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHByZXZpb3VzbHkgaWRlbnRpZmllZCBzZWxlY3RlZCByZWdpb24gaW4gKm9wdGl4Ki4gVG8gaW52ZXN0aWdhdGUgZnVydGhlciB0aGUgaGFwbG90eXBlIGJsb2NrIHN0cnVjdHVyZXMsIHdlIGZvY3VzIGludG8gYSAza2IgcmVnaW9uIGF0IG9wdGl4OjEzODU5NjYtMTM4ODk2Ni4gCgpgYGB7ciBmaWczMCwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUYsIGVjaG89RiwgcmVzdWx0cz1GfQoKIyMjIyBPUFRJWCAjIyMjIC0tLS0KIyBSRUFEIHRtcmNhCnRtcmNhIDwtIHJlYWRBcmdTdW1tYXJ5KCJvcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUudG1yY2EuYWxsX3NhbXBsZS5iZWQuZ3oiKQp0bXJjYV9ub3QgPC0gcmVhZEFyZ1N1bW1hcnkoIm9wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9vcHRpeF9uZXdOZS50bXJjYS5IZXJhdG9fbm90YWJpbGlzLmJlZC5neiIpCnRtcmNhX2xhdCA8LSByZWFkQXJnU3VtbWFyeSgib3B0aXhfbmV3cnVuL29wdGl4X25ld05lL29wdGl4X25ld05lLnRtcmNhLkhlcmF0b19sYXRpdml0dGEuYmVkLmd6IikKCiMjIFNldCBnZW5vbWljIHNwYW4gYW5kIE5lCk5lPTE5NDAwNzgKZ2VuIDwtIHRtcmNhJGNocm9tU3RhcnQKZ2VuX25vdCA8LSB0bXJjYV9ub3QkY2hyb21TdGFydApnZW5fbGF0IDwtIHRtcmNhX2xhdCRjaHJvbVN0YXJ0CgojIyMjIEhlcmF0bzE2MDMtMSAjIyMjIC0tLS0KICAKdG1yY2FfbmV1dHJhbCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9IZXJhdG8xNjAzLTFfbmV3TmUudG1yY2EuYWxsX3NhbXBsZS5iZWQuZ3oiKQp0bXJjYV9ub3RfbmV1dHJhbCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9IZXJhdG8xNjAzLTFfbmV3TmUudG1yY2EuSGVyYXRvX25vdGFiaWxpcy5iZWQuZ3oiKQp0bXJjYV9sYXRfbmV1dHJhbCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9IZXJhdG8xNjAzLTFfbmV3TmUudG1yY2EuSGVyYXRvX2xhdGl2aXR0YS5iZWQuZ3oiKQoKIyMgU2V0IGdlbm9taWMgc3BhbgpnZW5fbmV1dHJhbCA8LSB0bXJjYV9uZXV0cmFsJGNocm9tU3RhcnQKZ2VuX25vdF9uZXV0cmFsIDwtIHRtcmNhX25vdF9uZXV0cmFsJGNocm9tU3RhcnQKZ2VuX2xhdF9uZXV0cmFsIDwtIHRtcmNhX2xhdF9uZXV0cmFsJGNocm9tU3RhcnQKCiMjIFBsb3QgVE1SQ0EgIC0tLS0KCnBhcihtZnJvdz1jKDIsMSksIGNleC5sYWI9MS41LCBjZXguYXhpcz0xLjIsIGNleC5tYWluPTEuNSkKIyMgb3B0aXgKcGxvdChnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBsb2c9InkiLCB5bGltPWMoMWUtMiwyMCksIHR5cGU9J24nLCBjb2wgPSAnYmxhY2snLCBsd2Q9MiwgeWF4dD0ibiIsCiAgICAgeGxhYiA9ICJQb3NpdGlvbiAoTUIpIiwgeWxhYiA9ICJUTVJDQSAoTmUpIiwgbWFpbiA9ICJvcHRpeDogMTM2MjA2Ny0xNDA1NjA1ICg0My41a2IpIikgCiAgcG9seWdvbih4ID0gYyhnZW4sIHJldihnZW4pKSwgeSA9IGModG1yY2EkdG1yY2FfcXVhbnRpbGVfMC4wNTAvTmUsIHJldih0bXJjYSR0bXJjYV9xdWFudGlsZV8wLjk1MC9OZSkpLCAKICAgICAgICBjb2wgPSBhZGp1c3Rjb2xvcigiI0UwRTBFMCIsMC40KSwgYm9yZGVyID0gYWRqdXN0Y29sb3IoIiNFMEUwRTAiLCAwLjQpKSArCiAgcG9seWdvbih4ID0gYyhnZW5fbm90LCByZXYoZ2VuX25vdCkpLCB5ID0gYyh0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC4wNTAvTmUsIHJldih0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC45NTAvTmUpKSwgCiAgICAgICAgY29sID0gYWRqdXN0Y29sb3IoIiNDQ0NDNzUiLDAuNCksIGJvcmRlciA9IGFkanVzdGNvbG9yKCIjQ0NDQzc1IiwgMC40KSkgKwogIHBvbHlnb24oeCA9IGMoZ2VuX2xhdCwgcmV2KGdlbl9sYXQpKSwgeSA9IGModG1yY2FfbGF0JHRtcmNhX3F1YW50aWxlXzAuMDUwL05lLCByZXYodG1yY2FfbGF0JHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjRkY2NjY2IiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0ZGNjY2NiIsIDAuNCkpICsKICBsaW5lcyhnZW5fbm90LCB0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQ0NDQzAwJywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW5fbGF0LCB0bXJjYV9sYXQkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQzAwQzI4JywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignYmxhY2snKSwgbHdkPTAuNSwgKSArCiAgYXhpcyhzaWRlID0gMiwgYXQgPSBjKDAuMDAxLDAuMDEsMC4xLDEsMTApLCBsYWJlbHMgPSBleHByZXNzaW9uKDEwXi0zLDEwXi0yLDEwXi0xLDEwXjAsMTBeMSkpICsKICBhYmxpbmUgKGg9YygxLDIwKSwgbHdkPTEpCiMjIEhlcmF0bzE2MDMtMQpwbG90KGdlbl9uZXV0cmFsLCB0bXJjYV9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBsb2c9InkiLCB5bGltPWMoMWUtMiwyMCksCiAgICAgdHlwZT0nbicsIGNvbCA9ICdibGFjaycsIGx3ZD0yLCB5YXh0PSJuIiwKICAgICB4bGFiID0gIlBvc2l0aW9uIChNQikiLCB5bGFiID0gIlRNUkNBIChOZSkiLCBtYWluID0gIkhlcmF0bzE2MDM6IDM0NTAwMDAtMzQ5MzUzOCAoNDMuNWtiKSIpICArCiAgcG9seWdvbih4ID0gYyhnZW5fbmV1dHJhbCwgcmV2KGdlbl9uZXV0cmFsKSksIHkgPSBjKHRtcmNhX25ldXRyYWwkdG1yY2FfcXVhbnRpbGVfMC4wNTAvTmUsIHJldih0bXJjYV9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjRTBFMEUwIiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0UwRTBFMCIsIDAuNCkpICsKICBwb2x5Z29uKHggPSBjKGdlbl9ub3RfbmV1dHJhbCwgcmV2KGdlbl9ub3RfbmV1dHJhbCkpLCB5ID0gYyh0bXJjYV9ub3RfbmV1dHJhbCR0bXJjYV9xdWFudGlsZV8wLjA1MC9OZSwgcmV2KHRtcmNhX25vdF9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjQ0NDQzc1IiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0NDQ0M3NSIsIDAuNCkpICsKICBwb2x5Z29uKHggPSBjKGdlbl9sYXRfbmV1dHJhbCwgcmV2KGdlbl9sYXRfbmV1dHJhbCkpLCB5ID0gYyh0bXJjYV9sYXRfbmV1dHJhbCR0bXJjYV9xdWFudGlsZV8wLjA1MC9OZSwgcmV2KHRtcmNhX2xhdF9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjRkY2NjY2IiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0ZGNjY2NiIsIDAuNCkpICsKICBsaW5lcyhnZW5fbm90X25ldXRyYWwsIHRtcmNhX25vdF9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignI0NDQ0MwMCcsIDAuNyksIGx3ZD0yKSArCiAgbGluZXMoZ2VuX2xhdF9uZXV0cmFsLCB0bXJjYV9sYXRfbmV1dHJhbCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgY29sID0gYWRqdXN0Y29sb3IoJyNDMDBDMjgnLCAwLjcpLCBsd2Q9MikgKwogIGxpbmVzKGdlbl9uZXV0cmFsLCB0bXJjYV9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignYmxhY2snKSwgbHdkPTAuNSwgKSArCiAgYXhpcyhzaWRlID0gMiwgYXQgPSBjKDAuMDAxLDAuMDEsMC4xLDEsMTApLCBsYWJlbHMgPSBleHByZXNzaW9uKDEwXi0zLDEwXi0yLDEwXi0xLDEwXjAsMTBeMSkpICsKICBhYmxpbmUgKGg9YygxLDIwKSwgbHdkPTEpCmBgYAoqKkZpZyBTMzoqKiBUTVJDQSAoTmUpIGZvciBlYWNoIHBvc2l0aW9uIGluIHRoZSAqb3B0aXgqICh0b3AgcGFuZWwpIGFuZCB0aGUgbmV1dHJhbCBnZW5vbWljIHJlZ2lvbiAoYm90dG9tIHBhbmVsKS4gQmxhY2sgbGluZTogdG90YWwgVE1SQ0EsIFJlZDogTWVkaWFuIFRNUkNBIGZvciAqSC5lLmxhdGl2aXR0YSosIFllbGxvdzogVE1SQ0EgZm9yICpILmUubm90YWJpbGlzKi4gQ29ycmVzcG9uZGluZyBzaGFkZWQgcmVnaW9ucyBhcmUgdGhlIDAuMDUgYW5kIDAuOTUgcGVyY2VudGlsZSBpbnRlcnZhbHMuICAKCmBgYHtyfQpjaHJvbVN0YXJ0PTEzODU5NjYKY2hyb21FbmQ9MTM4ODk2NgpjaHJvbUlEcyA8LSByYW5nZSh3aGljaChzaXRlcyRwb3MgPj0gY2hyb21TdGFydCAmIHNpdGVzJHBvcyA8PSBjaHJvbUVuZCkpCmZvY2FsX3NpdGVzIDwtIHNpdGVzW2Nocm9tSURzWzFdOmNocm9tSURzWzJdLF0KbnJvdyhmb2NhbF9zaXRlcykgI3RoZXJlIGFyZSAxMzcgU05QcyAKYGBgCgpJbiB0aGUgZm9jYWwgcmVnaW9uLCB0aGVyZSBhcmUgMTM3IFNOUHMuIAoKYGBge3IgZmlnNCwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUYsIGVjaG89RiwgcmVzdWx0cz1GfQpwYXIobWZyb3c9YygyLDEpLCBjZXgubWFpbj0xLjUsIGNleC5sYWI9MS41LCBjZXguYXhpcz0gMS4yKQoKcGxvdChnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBsb2c9InkiLCB5bGltPWMoMWUtMiwyMCksCiAgICAgeGxpbT1jKGNocm9tU3RhcnQsIGNocm9tRW5kKSwKICAgICB0eXBlPSdsJywgY29sID0gJ2JsYWNrJywgbHdkPTIsIAogICAgIHhsYWIgPSAiUG9zaXRpb24gKE1CKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIsIG1haW4gPSAib3B0aXg6IDEzODU5NjYtMTM4ODk2NiAoM2tiKSIpICsKICBsaW5lcyhnZW5fbm90LCB0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQ0NDQzAwJywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW5fbGF0LCB0bXJjYV9sYXQkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQzAwQzI4JywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignYmxhY2snKSwgbHdkPTEgKQoKcGxvdChmb2NhbF9zaXRlcyRwb3MsIHJlcCgxLCBucm93KGZvY2FsX3NpdGVzKSksIHR5cGU9J24nLCB5bGltPWMoMSw0MCksIHhsYWIgPSAiUG9zaXRpb24iLCB5bGFiID0gIkluZGl2aWR1YWwgSUQiKSArCiAgcGxvdF9zbnBzKGZvY2FsX3NpdGVzLCAxLCAiI0MwMEMyOCIpICsKICBwbG90X3NucHMoZm9jYWxfc2l0ZXMsIDAsICIjQ0NDQzAwIikgKwogIGZvcihpIGluIHNldGRpZmYob3B0aXhBTExfc2l0ZXMkcG9zLCBmb2NhbF9zaXRlcyRwb3MpKXtwb2ludHMocmVwKGksNDApLCAxOjQwLCBjb2wgPSAiYmxhY2siLCBjZXggPSAwLjc1KX0KYGBgCgoKKipGaWdTNDoqKiBUTVJDQSBmb3IgZWFjaCBwb3NpdGlvbiBpbiBmb2NhbCBnZW5vbWljIHJlZ2lvbiAob3B0aXg6MTM4NTk2Ni0xMzg4OTY2KS4gU2FtZSBjb2xvdXIgc2NoZW1lcyBhcyBhYm92ZS4gKipUb3AgcGFuZWw6KiogVE1SQ0EgcGxvdCwgKipCb3R0b20gcGFuZWw6KiogU05QcyBpbiBib3RoIHBvcHVsYXRpb25zOyBSRUQgYW5kIFlFTExPVyBhbGxlbGVzIGFyZSB2YXJpYW50IHBvc2l0aW9ucywgY29sb3VyZWQgYWNjb3JkaW5nIHRvIHRoZSByZXNwZWN0aXZlIGhpZ2hlciBhbmQgbG93ZXIgYWxsZWxlIGNvdW50cyBpbiB0aGUgKkguZS5sYXRpdml0dGEqIHBvcHVsYXRpb24uIEJMQUNLIGFsbGVsZXMgYXJlIGZpeGVkIChpbnZhcmlhbnQpIGluIGJvdGggcG9wdWxhdGlvbnMuIEFsbCBvdGhlciBwb3NpdGlvbnMgKGluIHdoaXRlKSBhcmUgdW5rbm93biwgc2luY2UgdGhvc2UgcG9zaXRpb25zIGRvIG5vdCBoYXZlIFNOUCBpbmZvcm1hdGlvbi4gVGhlc2UgdW5rbm93biBwb3NpdGlvbnMgYXJlIG1hc2tlZCB3aGlsZSBydW5uaW5nIEFSR1dlYXZlciwgdGhlcmVmb3JlIHRoZXkgYXJlIHRyZWF0ZWQgYXMgbWlzc2luZyBpbmZvcm1hdGlvbiBhbmQgTk9UIGFzIGludmFyaWFudCBzaXRlcy4gCgpNYXNraW5nIHNpdGVzIGNhbiBoYXZlIGEgY3JpdGljYWwgZWZmZWN0IG9uIHNhbXBsaW5nIEFSR3MsIHNpbmNlIGludmFyaWFudCBzaXRlcyBjYW4gc2hpZnQgcHJpb3JzIHRvd2FyZHMgYSByZWNlbnQgY29hbGVzY2VuY2UgKGJlY2F1c2UgdGhlcmUgaGFzbid0IGJlZW4gZW5vdWdoIHRpbWUgeWV0IGZvciBhIG11dGF0aW9uIHRvIG9jY3VyIGluIGFueSBvZiB0aGUgYnJhbmNoZXMpLCB3aGVyZWFzIG1pc3NpbmcgaW5mb3JtYXRpb24gZG9lcyBub3Qgc2hpZnQgcHJpb3JzIGFuZCB0aGVyZWZvcmUgQVJHcyBhcmUgc2FtcGxlZCBuZXV0cmFsbHkgaW4gdGhvc2UgcmVnaW9ucy4gSW4gdGhlIGFib3ZlIHJlZ2lvbiBvZiAza2IsIHRoZXJlIGFyZSAxMzcgU05QcyBhbmQgMTYgaW52YXJpYW50IHBvc2l0aW9ucy4gT3V0IG9mIHRoZSAxMzcgU05Qcywgb25seSA1OSBTTlBzIGFyZSBzZWdyZWdhdGluZyB3aXRoaW4gdGhlICpILmUubGF0aXZpdHRhKiBwb3B1bGF0aW9uIGluIGZvY3VzLiBCZWxvdyBpcyB0aGUgZm9sZGVkIFNOUCBmcmVxdWVuY3kgc3BlY3RydW0uIApgYGB7ciBmaWc1LCBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD01fQpiYXJwbG90KHRhYmxlKDIwLSh0cjFfc25wcyRtYWpBbGxlbGVDb3VudF9sYXQpKSwgeWxhYiA9ICJObyBvZiBwb3NpdGlvbnMiLCB4bGFiID0gIkFsbGVsZSBDb3VudCIpCmBgYAoqKkZpZ1M1OioqIEZvbGRlZCBTTlAgZnJlcXVlbmN5IHNwZWN0cnVtIG9mIHRoZSBmb2NhbCByZWdpb24sIG9wdGl4OjEzODU5NjYtMTM4ODk2Ni4KCkhlcmVhZnRlciwgYWxsZWxlcyB3aXRoIGxvd2VyIGZyZXF1ZW5jeSB3aXRoaW4gdGhlICpILmUubGF0aXZpdHRhKiBwb3B1bGF0aW9uIGlzIHJlZmVycmVkIHRvIGFzIHRoZSBtaW5vciBhbGxlbGUsIGFuZCBpbmRpdmlkdWFscyB3aG8gc2hhcmUgdGhlIG1pbm9yIGFsbGVsZSBpcyB0aGUgbWlub3IgY2xhZGUuIENvbnZlcnNlbHksIGluZGl2aWR1YWxzIHRoYXQgY2FycnkgdGhhdCBtYWpvciBhbGxlbGUgaXMgY2FsbGVkIG1ham9yIGNsYWRlLiBNaW5vciBhbGxlbGUgaXMgY29kZWQgYXMgMCBhbmQgbWFqb3IgYXMgMS4gCgojIyMjIEdlbmVyYWwgY29tbWVudHMgb24gaWRlbnRpZnlpbmcgaGFwbG90eXBlIGJsb2NrcyBhcyBlZGdlcyBmcm9tIGVtcGlyaWNhbCBkYXRhc2V0cwpJbiBhIHNlcmllcyBvZiBtYXJnaW5hbCBnZW5lYWxvZ2ljYWwgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZSwgYW4gZWRnZSBpcyBjb25zaWRlcmVkIHVuaXF1ZSBpZiBpdCBvcmlnaW5hdGVzIGF0IGEgcGFydGljdWxhciBjb2FsZXNjZW50IHRpbWUgcG9pbnQsIGFuZCBpcyBhbmNlc3RyYWwgdG8gYSBnaXZlbiBzZXQgb2Ygc2FtcGxlcy4gVW5pcXVlIGVkZ2VzIGV4dGVuZCBhbG9uZyB0aGUgZ2Vub21lIHVudGlsIHJlY29tYmluYXRpb24gYnJlYWtzIHRoZW0gZG93biwgYnV0IGNhbiBmdXJ0aGVyIHJlLWVtZXJnZSBpbiBhIGRpc2p1bmN0IGdlbm9taWMgcmVnaW9uIGlmIHJlY29tYmluYXRpb24gYnJpbmdzIHRoZSBnaXZlbiBzZXQgb2Ygc2FtcGxlcyBiYWNrIHRvZ2V0aGVyLiBNb3Jlb3ZlciwgZWFjaCBlZGdlIGdvZXMgYmFjayBpbiB0aW1lIHVudGlsIGZ1cnRoZXIgY29hbGVzY2VuY2UgZXZlbnRzIGluIGRlZXBlciBwYXN0LiAoRmlndXJlIDMgaW4gbWFpbiB0ZXh0LCBhbmQgQm94IDIpLiBVbmxpa2UgYSBzaW11bGF0aW9uIHdoZXJlIHRoZSBncm91bmQgdHJ1dGggYWJvdXQgb3JpZ2luIGFuZCBleHRlbmQgb2YgZWFjaCB1bmlxdWUgZWRnZSBpcyBwcmVjaXNlbHkga25vd24sIGluZmVycmVkIGVkZ2VzIGZyb20gc2FtcGxlZCBBUkdzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGEsIGJ1dCBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydGVkIGJ5IHRoZSBTTlAgY29uZmlndXJhdGlvbi4gVGhvc2UgZWRnZXMgb24gd2hpY2ggbXV0YXRpb25zIGFwcGVhciBjYW4gYmUgcmVsaWFibHkgaW5mZXJyZWQgZ2l2ZW4gdGhlIFNOUCBjb25maWd1cmF0aW9uLCB3aGVyZWFzIHRoZSByZXN0IGFyZSByYW5kb20gc2FtcGxlcyBmcm9tIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIHN0b2NoYXN0aWMgbm9pc2UsIHN1Z2dlc3RpbmcgaW5mZXJlbmNlIGJlIG1hZGUgZnJvbSBlZGdlcyBzdXBwb3J0ZWQgYnkgU05Qcy4gCgpBUkd3ZWF2ZXIgb3V0cHV0cyBnZW5lYWxvZ2ljYWwgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZSwgYW5kIGVhY2ggcmVjb21iaW5hdGlvbiBicmVha3BvaW50cyBhbmQgdGltZS4gRm9yIGVhY2ggdHJlZSwgbm9kZXMgYW5kIHRpcHMgYXJlIGxhYmVsbGVkIHVuaXF1ZWx5LiBGb3IgZWFjaCByZWNvbWJpbmF0aW9uIGV2ZW50LCB0aGUgbmV3IGFuY2VzdHJhbCBub2RlIElEIG9mIHRoZSByZWNvbWJpbmVkIGJyYW5jaCBiZWNvbWVzIHRoZSBvbGQgbm9kZSBJRCBmcm9tIHRoZSBwcmV2aW91cyB0cmVlLiBUaGVyZWZvcmUsIGFjcm9zcyB0cmVlcywgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgb25lIHRoYXQgdW5kZXJ3ZW50IHJlY29tYmluYXRpb24gaW4gdGhlIHByZWNlZGluZyB0cmVlIHNoYXJlcyB0aGUgc2FtZSBub2RlIElELiBBbHRob3VnaCBpdCBpcyBlYXN5IHRvIHRyYWNrIHVuaXF1ZSBub2RlcyBvdmVyIGEgc2hvcnQgZ2Vub21pYyBkaXN0YW5jZSBieSBqdXN0IHRyYWNraW5nIHRoZSBTUFIgKHN1YnRyZWUgcHJ1bmUgYW5kIHJlZ3JhZnQpIGV2ZW50OyBvbmUgbmVlZHMgdG8gZGV2ZWxvcCBtb3JlIHNvcGhpc3RpY2F0ZWQgY29kZS9hbGdvcml0aG0gdG8gdHJhY2sgb3ZlciBsb25nZXIgZGlzdGFuY2VzIHRoYW4gY29uc2lkZXJlZCBpbiB0aGlzIGFuYWx5c2lzICh3aGljaCB3ZSBkaWQgbm90IGF0dGVtcHQgaGVyZSEpLiBJbnN0ZWFkLCB3ZSBsZXZlcmFnZWQgdGhlIGFydGlmYWN0IGxlZnQgYmVoaW5kIGJ5IHRpbWUtZGlzY3JldGl6YXRpb24gaW4gQVJHd2VhdmVyIHRvIGlkZW50aWZ5IHVuaXF1ZSBlZGdlcy4gCgpUaGUgZXhhY3Qgc3RlcC1ieS1zdGVwIHByb2Nlc3MgdGhhdCB3ZSB1c2VkIHRvIGlkZW50aWZ5IGVkZ2VzIHN1cHBvcnRlZCBieSBTTlBzIGlzIGRlc2NyaWJlZCBiZWxvdy4gV2Ugc3BlY2lmaWNhbGx5IGNob3NlIDIgc2VwYXJhdGUgaXRlcmFpb25zIChpdGVyYXRpb24gSUQgLSA4MjUwIGFuZCA5MDAwKSwgc3VmZmljaWVudGx5IHNlcGFyYXRlZCB0byBhdm9pZCBhdXRvY29yZWxhdGlvbnMgYmV0d2VlbiB0aGVtIHRvIGRlbW9uc3RyYXRlIHRoZSBub2lzZSBpbiBpZGVudGlmeWluZyBoYXBsb3R5cGUgYmxvY2tzIGFzIGVkZ2VzIGJhc2VkIG9uIEFSRyBzYW1wbGVzLiBXZSBvbmx5IGZvY3VzIG9uIHRoZSAqSC5lLmxhdGl2aXR0YSogcG9wdWxhdGlvbiAoYWx3YXlzIGluIHJlZCBsYWJlbHMpLgoKIyMgSXRlcmF0aW9uIDEgKE1DTUMgaXRlcjogODI1MCkKCmBgYHtyLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NX0KI1JlYWQgdG1yY2EKdG1yY2E4MjUwIDwtIHJlYWRBcmdTdW1tYXJ5KCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9vcHRpeF9uZXdOZS50bXJjYS5hbGxfc2FtcGxlLjgyNTAuYmVkLmd6IikKdG1yY2E4MjUwX25vdCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUudG1yY2EuSGVyYXRvX25vdGFiaWxpcy44MjUwLmJlZC5neiIpCnRtcmNhODI1MF9sYXQgPC0gcmVhZEFyZ1N1bW1hcnkoIn4vUHJvai1EZWYtSGFwbG8vb3B0aXhfbmV3cnVuL29wdGl4X25ld05lL29wdGl4X25ld05lLnRtcmNhLkhlcmF0b19sYXRpdml0dGEuODI1MC5iZWQuZ3oiKQoKIyMgU2V0IGdlbm9taWMgc3BhbiBhbmQgTmUgLS0tLQpOZT0xOTQwMDc4CmdlbjgyNTAgPC0gKHRtcmNhODI1MCRjaHJvbVN0YXJ0KSMvMWUzCmdlbjgyNTBfbm90IDwtICh0bXJjYTgyNTBfbm90JGNocm9tU3RhcnQpIy8xZTMKZ2VuODI1MF9sYXQgPC0gKHRtcmNhODI1MF9sYXQkY2hyb21TdGFydCkjLzFlMwoKcGxvdChnZW44MjUwLCB0bXJjYTgyNTAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwyMCksIHhsaW09YygxMzg2MDAwLCAxMzg5MDAwKSwgeGxhYiA9ICJQb3NpdGlvbiAoa0IpIiwgeWxhYiA9ICJUTVJDQSAoTmUpIikgKwogIGxpbmVzKGdlbjgyNTBfbm90LCB0bXJjYTgyNTBfbm90JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDQ0NDMDAiLCBsd2Q9MSkgKwogICAgbGluZXMoZ2VuODI1MF9sYXQsIHRtcmNhODI1MF9sYXQkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9InMiLCBjb2wgPSAiI0MwMEMyOCIsIGx3ZD0zKQpgYGAKCmBgYHtyIGVjaG89VCwgbWVzc2FnZT1GLCByZXN1bHRzPUZ9CiMgUmVhZCB0cmVlcyBpbiB0aGUgd2hvbGUgcmVnaW9uCnRyMSA8LSByZWFkLnRhYmxlKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuODI1MF90cmVlcy50eHQiKQpjb2xuYW1lcyh0cjEpIDwtIGMoImV2ZW50IiwiY2hyb21TdGFydCIsImNocm9tRW5kIiwidHJlZSIpCnN0cih0cjEpCgojIFJlYWQgU1BScyBpbiB0aGUgd2hvbGUgcmVnaW9uCnNwcjEgPC0gcmVhZC50YWJsZSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvc2FtcGxlL29wdGl4X25ld05lLjgyNTBfU1BSLnR4dCIpCmNvbG5hbWVzKHNwcjEpIDwtIGMoImV2ZW50IiwicG9zaXRpb24iLCAicmVjb21iX25vZGUiLCAicmVjb21iX3RpbWUiLCAiY29hbF9ub2RlIiwgImNvYWxfdGltZSIpCnN0cihzcHIxKQoKIyBGaW5kIHRyZWVzIGluIHRoZSBmb2NhbCByZWdpb24uCmNocm9tU3RhcnQgPC0gMTM4NTk2NgpjaHJvbUVuZCA8LSAxMzg4OTY2CnRyMV9zdWIgPC0gc3Vic2V0X2dlbm9taWNfaW50ZXJ2YWwodHIxLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkgIzQ2NCB0cmVlcwpzcHIxX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbChzcHIxLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkKYGBgCgpXZSBleHRyYWN0IEFSR3Mgc2FtcGxlZCBieSBBUkd3ZWF2ZXIgaW4gaXRzIE1DTUMgaXRlcmF0aW9uOiA4MjUwLCBhbmQgZXN0aW1hdGUgdGhlIFRNUkNBICh0b3RhbCBhbmQgd2l0aGluIHBvcHVsYXRpb24pLCB0b3RhbCBicmFuY2ggbGVuZ3RoIG9mIGVhY2ggbWFyZ2luYWwgdHJlZSBhbmQgdGhlIHJlY29tYmluYXRpb24gYnJlYWtwb2ludHMuIEFsdG9nZXRoZXIgaW4gdGhlIH41MGtiIHJlZ2lvbiwgdGhlcmUgYXJlIDY1NzEgdHJlZXMgKGFuZCA2NTcwIHJlY29tYmluYXRpb24gZXZlbnRzKSwgb2Ygd2hpY2ggb25seSA0NjQgdHJlZXMgYXJlIHByZXNlbnQgaW4gdGhlIGZvY2FsIDNrYiByZWdpb24sIG9wdGl4OjEzODU5NjYtMTM4ODk2Ni4KCldlIGludmVzdGlnYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgYnJhbmNoIGxlbmd0aCBvZiB0cmVlcyB3aXRoIHJlc3BlY3QgdG8gdGhlaXIgZ2Vub21pYyBzcGFucyAoRmlnIFM2KS4gV2UgZmluZCBhdmVyYWdlIHRyZWUgc3BhbiBpbiB0aGUgd2hvbGUgcmVnaW9uIGlzIH43IGJwLiBXZSBleHBlY3QgZnJvbSB0aGVvcnkgYXNzdW1pbmcgc3RhbmRhcmQgY29hbGVzY2VuY2UsICRQX3IoZCBcbWlkIFx0YXUpJD0kXGZyYWMge1xyaG99ezJ9TChcdGF1KSQgZXhwJFstXGZyYWMge1xyaG99ezJ9TChcdGF1KSBkXSQgd2hlcmUgJEwoXHRhdSkkIGlzIGluIGNvYWxlc2NlbnQgdW5pdCBvZiAkMk5fZSQgZ2VuZXJhdGlvbnMgYW5kICRcZnJhYyB7XHJob317Mn0kPSQyTl9lciQgZGVub3RlcyB0aGUgcG9wdWxhdGlvbi1zY2FsZWQgcmVjb21iaW5hdGlvbiByYXRlIHBlciBicC4gR2l2ZW4gdGhlIHBhcmFtZXRlcnMsIGFuZCBtZWFuICRMKFx0YXUpJCA9IDIsIHRoaXMgZ2l2ZXMgbWVhbiAqZCogPSAkXGZyYWMgezF9IHtcZnJhYyB7XHJob317Mn1MKFx0YXUpfSQgfiA0NWJwLiBJdCBzZWVtcyBpbiB0aGlzIHJlZ2lvbiwgQVJHd2VhdmVyIHNlZW1zIHRvIGNoYW5nZSB0aGUgdHJlZSB0b3BvbG9neSBtb3JlIG9mdGVuIHRoYW4gdGhlIGV4cGVjdGVkIG1lYW4uIFdlIGhhdmUgbm90IGV4cGxvcmVkIHRoaXMgY2xvc2VseSAoYmV5b25kIHRoZSBtYWluIHJlYWNoIG9mIHRoaXMgYW5hbHlzaXMpLCBob3dldmVyLCB3ZSBub3RlIHRoYXQgYWx0aG91Z2ggdGhlIEFSR3MgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSwgd2UgbmVlZCB0byB0YWtlIGNhdXRpb24gaW4gYmlvbG9naWNhbCBpbmZlcmVuY2UgZnJvbSB0aGVzZSBzYW1wbGVkIEFSR3MuIAoKYGBge3IgZmlnNjAsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD01LCBlY2hvPVQsIHJlc3VsdHM9Riwgd2FybmluZz1GfQojIyBSZWFkIGFsbCA2NTcxIHRyZWUgbGVuZ3Rocwp0cmVlbGVuMSA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUuYnJhbmNobGVuLmFsbF9zYW1wbGUuODI1MC5iZWQuZ3oiKQp0cmVlbGVuMSR0cmVlc3BhbiA8LSB0cmVlbGVuMSRjaHJvbUVuZC10cmVlbGVuMSRjaHJvbVN0YXJ0CiMjIFJlYWQgNDY0IHRyZWUgbGVuZ3RocyBpbiB0aGUgZm9jYWwgZ2Vub21pYyByZWdpb24KdHJlZWxlbjFfc3ViIDwtIHN1YnNldF9nZW5vbWljX2ludGVydmFsKHRyZWVsZW4xLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkKbWVhbih0cmVlbGVuMSR0cmVlc3BhbikKbWVhbih0cmVlbGVuMV9zdWIkdHJlZXNwYW4pCiMjIFBsb3QKcGFyKG1mcm93PWMoMSwzKSwgY2V4Lm1haW49MS41LCBjZXgubGFiPTEuNywgY2V4LmF4aXM9MS41KQojIEhpc3RvZ3JhbQpoaXN0KHRyZWVsZW4xJHRyZWVzcGFuLCB4bGFiID0gIlRyZWUgU3BhbiIpCiMgQnJhbmNoIExlbmd0aCB2cyBUcmVlIHNwYW4gKGFsbCA2NTcxIHRyZWVzKQpwbG90KHRyZWVsZW4xJHRyZWVzcGFuLCB0cmVlbGVuMSRicmFuY2hsZW5fbWVhbiwgeGxhYj0iVHJlZSBTcGFuIiwgeWxhYj0iVHJlZSBMZW5ndGgiKQpwb2ludHMoYWdncmVnYXRlKHRyZWVsZW4xJGJyYW5jaGxlbl9tZWFufnRyZWVsZW4xJHRyZWVzcGFuLCBGVU49bWVhbiksIGNvbD0icmVkIiwgcGNoPTE5LCBjZXg9MS41KQojIEJyYW5jaCBMZW5ndGggdnMgVHJlZSBzcGFuICg0NjQgdHJlZXMgaW4gdGhlIGZvY2FsIGdlbm9taWMgcmVnaW9uKQpwbG90KHRyZWVsZW4xX3N1YiR0cmVlc3BhbiwgdHJlZWxlbjFfc3ViJGJyYW5jaGxlbl9tZWFuLCB4bGFiPSJUcmVlIFNwYW4iLCB5bGFiPSJUcmVlIExlbmd0aCIpCnBvaW50cyhhZ2dyZWdhdGUodHJlZWxlbjFfc3ViJGJyYW5jaGxlbl9tZWFufnRyZWVsZW4xX3N1YiR0cmVlc3BhbiwgRlVOPW1lYW4pLCBjb2w9InJlZCIsIHBjaD0xOSwgY2V4PTEuNSkKYGBgCioqRmlnUzY6KiogKipMZWZ0OioqIEhpc3RvZ3JhbSBvZiB0cmVlIHNwYW5zOyAqKkNlbnRlcjoqKiBCcmFuY2ggbGVuZ3RoIHZzIHRyZWUgc3BhbiBmb3IgYWxsIDY1NzEgbWFyZ2luYWwgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZTsgKipSaWdodDoqKiBCcmFuY2ggbGVuZ3RoIHZzIHRyZWUgc3BhbnMgZm9yIDQ2NCB0cmVlcyBpbiB0aGUgZm9jYWwgZ2Vub21pYyByZWdpb24uIFJFRCBwb2ludHMgYXJlIGF2ZXJhZ2UgdHJlZSBsZW5ndGhzIGZvciBlYWNoIHRyZWUgc3Bhbi4KCkZvciBvdXIgYW5hbHlzaXMsIHdlIHN0cmljdGx5IGZvY3VzIG9uIGlkZW50aWZ5aW5nIGVkZ2VzIHN1cHBvcnRlZCBieSBTTlBzLiBJbiBwcmFjdGljZSwgdGhpcyBpcyBkb25lIGluIGZldyBzdGVwcyAtIEZpcnN0LCBmb3IgZWFjaCBzYW1wbGVkIHRyZWUgYWxvbmcgdGhlIGdlbm9tZSAoPSA0NjQgdHJlZXMpLCB3ZSBleHRyYWN0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gLSBhbmNlc3RyYWwgYW5kIGRlc2NlbmRhbnQgbm9kZSBvZiBlYWNoIGVkZ2UsIGVkZ2UgaGVpZ2h0ICg9bGVuZ3RoKSwgdGltZS1wb2ludCBvZiB0aGUgZGVzY2VuZGFudCBub2RlLCBpLmUuLCB3aGVuIHRoZSBlZGdlIG9yaWdpbmF0ZWQgKD1kZXB0aCwgTk9URTogZHVlIHRvIHJvdW5kaW5nIGVycm9ycyBpbiBOZXdpY2sgZm9ybWF0LCB3ZSByb3VuZCB0aGUgZGVwdGggdmFsdWVzIHRvIDMgc2lnbmlmaWNhbnQgZGlnaXRzKSBhbmQgdGhlIHNhbXBsZXMgKD10aXBzLmZyb20uZGVjKSB0aGF0IGVhY2ggZWRnZSBpcyBhbmNlc3RyYWwgdG8uIE5PVEU6IEFsdGhvdWdoIHdlIGFyZSBpZGVudGlmeWluZyBoYXBsb3R5cGUgYmxvY2tzIGluIHRoZSAqSC5lLmxhdGl2aXR0YSogKHJlZCkgcG9wdWxhdGlvbiwgd2UgdXNlIGdlbmVhbG9naWNhbCB0cmVlcyB0aGF0IGluY2x1ZGUgYm90aCBwb3B1bGF0aW9ucy4gVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIGVzdGltYXRlIHRoZSBlZGdlIGhlaWdodCBvZiB0aGUgbW9zdCByZWNlbnQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBpbmRpdmlkdWFscyBpbiB0aGUgcmVkIHBvcHVsYXRpb24uIElkZWFsbHkgZm9yIG1ha2luZyBiaW9sb2dpY2FsIGluZmVyZW5jZXMgZnJvbSBvbmx5IG9uZSBwb3B1bGF0aW9uLCB0aGlzIG5lZWQgbm90IGJlIGRvbmUuIEhvd2V2ZXIgaW4gb3VyIGFuYWx5c2lzLCBpbiBvcmRlciB0byBpbGx1c3RyYXRlIHRoZSBoYXBsb3R5cGUgYmxvY2sgcGF0dGVybnMgZ2VuZXJhdGVkIGluIGEgc2VsZWN0ZWQgZ2Vub21pYyByZWdpb24sIHdlIGRlY2lkZWQgdG8gaW5jb3Jwb3JhdGUgYm90aCBwb3B1bGF0aW9ucyB0byBnZW5lcmF0ZSB0cmVlcyBhbG9uZyB0aGUgZ2Vub21lLiBOZXZlcnRoZWxlc3MsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGlkZW50aWZpZWQgaGFwbG90eXBlIGJsb2NrcyB3aWxsIHN0YXkgdGhlIHNhbWUgaXJyZXNwZWN0aXZlIG9mIHdoaWNoIGFuZCBob3cgbWFueSBwb3B1bGF0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGFuYWx5c2lzOyBob3dldmVyLCB0aGUgZWRnZSBoZWlnaHQgd2lsbCBjaGFuZ2UgYWxvbmcgdGhlIGdlbm9tZS4KCmBgYHtyIGVjaG89VH0KIyMgU3RvcmUgZWRnZSBpbmZvcm1hdGlvbiBvZiBhbGwgNDY0IHRyZWVzIGFzIGEgbGlzdAp0cjFfc3ViX2xpc3QgPC0gZXh0cmFjdF9lZGdlcyh0cjFfc3ViKQpgYGAKClNlY29uZCwgZm9yIGV2ZXJ5IHRyZWUgYXQgZWFjaCBTTlAgcG9zaXRpb24gKD0gMTM3IFNOUHMpLCB3ZSBpZGVudGlmeSBtb3N0IHJlY2VudCB0cmVlIG5vZGUgdGhhdCBpcyBjb21tb25seSBhbmNlc3RyYWwgdG8gYWxsIGluZGl2aWR1YWxzIHRoYXQgc2hhcmUgdGhlIHNhbWUgYWxsZWxlLiAoTm90ZTogdGhpcyBhc3N1bWVzIGluZmluaXRlIHNpdGVzIG11dGF0aW9uIG1vZGVsLCB3aGljaCBpcyBnZW5lcmFsbHkgdGhlIGRlZmF1bHQgb3B0aW9uIGluIEFSR3dlYXZlcikuIFRoaXMgYWxsb3dzIGlkZW50aWZpY2F0aW9uIG9mIDEgbm9kZSBmb3IgdGhlIG1ham9yIGFuZCAxIGZvciB0aGUgbWlub3IgYWxsZWxlIGF0IGVhY2ggU05QIHBvc2l0aW9uLCBoZXJlYWZ0ZXIgY2FsbGVkIG1ham9yIGFuZCBtaW5vciBub2RlIGZvciBlYWNoIHRyZWUuIAoKYGBge3IgZWNobyA9Rn0KIyMgdGhpcyBvbmx5IGV4dHJhY3RzIHRyZWVzIGF0IFNOUHMKdHIxX3NucHMgPC0gZXh0cmFjdF90cmVlc19hdF9TTlBzKGZvY2FsX3NpdGVzLCB0cjEsIHNwcjEpCgp0aW1lU2NhbGUgPSAxL05lCnRyMV9zbnBzX2xpc3QgPC0gbGlzdCgpCmxhdCA8LSBzYW1wSUQkSURbd2hpY2goc2FtcElEJHBvcD09IkhlcmF0b19sYXRpdml0dGEiKV0Kbm90IDwtIHNhbXBJRCRJRFt3aGljaChzYW1wSUQkcG9wPT0iSGVyYXRvX25vdGFiaWxpcyIpXQpmb3IgKHNucElEIGluIGMoMTpucm93KHRyMV9zbnBzKSkpewogIGNhdChzbnBJRCwgdHIxX3NucHNbc25wSUQsInBvcyJdKQogIGFsbGVsZXMgPC0gdHIxX3NucHNbc25wSUQsc2FtcElEJElEXQogIGFsbGVsZXMgPC0gYXMuZmFjdG9yKGFsbGVsZXMpCiAgCiAgYWxsZWxlQ291bnQxIDwtIHN1bShhbGxlbGVzW2xhdF0gPT0gbGV2ZWxzKGFsbGVsZXMpWzFdKQogIGFsbGVsZUNvdW50MiA8LSBzdW0oYWxsZWxlc1tsYXRdID09IGxldmVscyhhbGxlbGVzKVsyXSkKICAKICBtYWpBbGxlbGUgPC0gaWZlbHNlKGFsbGVsZUNvdW50MSA+IGFsbGVsZUNvdW50MiwgbGV2ZWxzKGFsbGVsZXMpWzFdLCBsZXZlbHMoYWxsZWxlcylbMl0pCiAgdHIxX3NucHMkbWFqQWxsZWxlW3NucElEXSA8LSBtYWpBbGxlbGUKICBtaW5BbGxlbGUgPC0gc2V0ZGlmZihsZXZlbHMoYWxsZWxlcyksIG1hakFsbGVsZSkKICB0cjFfc25wcyRtaW5BbGxlbGVbc25wSURdIDwtIG1pbkFsbGVsZQogIAogICNtYWpDbGFkZV9sYXQgPC0gc2V0ZGlmZih3aGljaChhbGxlbGVzID09IG1hakFsbGVsZSksIG5vdGFiaWxpc19pbmRpdmlkdWFscysxKSAjIDEtaW5kZXhlZAogICNtaW5DbGFkZV9sYXQgPC0gc2V0ZGlmZih3aGljaChhbGxlbGVzID09IG1pbkFsbGVsZSksIG5vdGFiaWxpc19pbmRpdmlkdWFscysxKSAjIDEtaW5kZXhlZAogIG1hakNsYWRlX2xhdF9uYW1lcyA8LSBzZXRkaWZmKG5hbWVzKGFsbGVsZXNbd2hpY2goYWxsZWxlcyA9PSBtYWpBbGxlbGUpXSksbm90KQogIG1pbkNsYWRlX2xhdF9uYW1lcyA8LSBzZXRkaWZmKGxhdCwgbWFqQ2xhZGVfbGF0X25hbWVzKQogIAogIG1hakNsYWRlX2xhdCA8LSBzYW1wSURbd2hpY2goc2FtcElEJElEICVpbiUgbWFqQ2xhZGVfbGF0X25hbWVzKSwiQVJHd2VhdmVySUQiXSAjIDAtaW5kZXhlZAogIHRyMV9zbnBzJG1hakNsYWRlX2xhdFtzbnBJRF0gPC0gbGlzdChtYWpDbGFkZV9sYXQpCiAgdHIxX3NucHMkbWFqQWxsZWxlQ291bnRfbGF0W3NucElEXSA8LSBsZW5ndGgodHIxX3NucHMkbWFqQ2xhZGVfbGF0W3NucElEXVtbMV1dKSAKICAKICBtaW5DbGFkZV9sYXQgPC0gc2FtcElEW3doaWNoKHNhbXBJRCRJRCAlaW4lIG1pbkNsYWRlX2xhdF9uYW1lcyksIkFSR3dlYXZlcklEIl0gIyAwLWluZGV4ZWQKICB0cjFfc25wcyRtaW5DbGFkZV9sYXRbc25wSURdIDwtIGxpc3QobWluQ2xhZGVfbGF0KQogIHRyMV9zbnBzJG1pbkFsbGVsZUNvdW50X2xhdFtzbnBJRF0gPC0gMjAtdHIxX3NucHMkbWFqQWxsZWxlQ291bnRfbGF0W3NucElEXQogIAogIHRyZWUgPC0gdHIxX3NucHNbc25wSUQsInRyZWUiXQogIHRyLm5vdCA8LSBwcnVuZVRyZWUodHJlZSA9IHRyZWUsIHNlcXMgPSBhcy5jaGFyYWN0ZXIobm90YWJpbGlzX2luZGl2aWR1YWxzKSkgIyAwLWluZGV4ZWQKICB0ci5sYXQgPC0gcHJ1bmVUcmVlKHRyZWUgPSB0cmVlLCBzZXFzID0gYXMuY2hhcmFjdGVyKGxhdGl2aXR0YV9pbmRpdmlkdWFscykpICMgMC1pbmRleGVkCiAgCiAgdHIxX3NucHNfbGlzdCR0cmVlW3NucElEXSA8LSB0ci5sYXQKICBhcGVUcmVlIDwtIHJlYWQudHJlZSh0ZXh0PXRyLmxhdCkKICAKICAjIyBUcmVlCiAgbmxlYWYgPC0gbGVuZ3RoKGFwZVRyZWUkdGlwLmxhYmVsKQogIHJvb3RhZ2UgPC0gZ2V0VHJlZURlcHRoKGFwZVRyZWUpKnRpbWVTY2FsZQogIHJvb3ROb2RlIDwtIGdldFJvb3ROb2RlKGFwZVRyZWUpCiAgZWRnZSA8LSBhcy5kYXRhLmZyYW1lKGFwZVRyZWUkZWRnZSkKICBuYW1lcyhlZGdlKSA8LSBjKCJhbmMiLCAiZGVjIikKICBlZGdlJGFuYy5sYWJlbCA8LSBzYXBwbHkoYXBlVHJlZSRlZGdlWywxXSwgc2VsZWN0LnRpcC5vci5ub2RlLCB0cmVlID0gYXBlVHJlZSkKICBlZGdlJGRlYy5sYWJlbCA8LSBzYXBwbHkoYXBlVHJlZSRlZGdlWywyXSwgc2VsZWN0LnRpcC5vci5ub2RlLCB0cmVlID0gYXBlVHJlZSkKICAKICBlZGdlIDwtIHJiaW5kKGVkZ2UsIGRhdGEuZnJhbWUoYW5jPS0xLCBkZWM9cm9vdE5vZGUsIGFuYy5sYWJlbD0tMSwgZGVjLmxhYmVsPXJvb3ROb2RlKSkKICBubm9kZSA8LSBucm93KGVkZ2UpCiAgZWRnZSRsZW5ndGggPC0gYyhhcGVUcmVlJGVkZ2UubGVuZ3RoKnRpbWVTY2FsZSwgbWF4KG1heHRpbWUgLSByb290YWdlLCAxKSkKICBlZGdlJGRlcHRoIDwtIHJlcChyb290YWdlLCBubm9kZSkKICBmb3IgKGkgaW4gMTpubm9kZSkge2ogPC0gaQogICAgd2hpbGUgKDEpIHtpZiAoZWRnZSRkZWNbal0gPT0gcm9vdE5vZGUpIGJyZWFrCiAgICAgICAgZWRnZSRkZXB0aFtpXSA8LSBlZGdlJGRlcHRoW2ldIC0gZWRnZSRsZW5ndGhbal0KICAgICAgICBqIDwtIHdoaWNoKGVkZ2VbLCJkZWMiXSA9PSBlZGdlW2osImFuYyJdKX19CiAgCiAgZWRnZVt3aGljaChlZGdlJGFuYyA9PSAtMSksImRlYy5sYWJlbCJdIDwtIGVkZ2VbMSwiYW5jLmxhYmVsIl0KICAjIGVkZ2UkdGlwLmxhYmVsIDwtIHJlcCgiIiwgbnJvdyhlZGdlKSkKICAjIGZvciAoaSBpbiAxOmxlbmd0aChhcGVUcmVlJHRpcC5sYWJlbCkpe2VkZ2VbZWRnZSRkZWM9PWksInRpcC5sYWJlbCJdIDwtIGFwZVRyZWUkdGlwLmxhYmVsW2ldfQoKICBmb3IgKGRlYy5ub2RlSUQgaW4gYygxOm5yb3coZWRnZSkpKXsKICAgIGRlY3MgPC0gRGVzY2VuZGFudHMoYXBlVHJlZSwgZWRnZSRkZWNbZGVjLm5vZGVJRF0sInRpcHMiKVtbMV1dCiAgICBlZGdlJHRpcHMuZnJvbS5kZWNbZGVjLm5vZGVJRF0gPC0gbGlzdChhcGVUcmVlJHRpcC5sYWJlbFtkZWNzXSkKICAgIGVkZ2UkbWFqQ2xhZGUubm9kZVtkZWMubm9kZUlEXSA8LSBhbGwoYXMuY2hhcmFjdGVyKG1hakNsYWRlX2xhdCkgJWluJSBhcGVUcmVlJHRpcC5sYWJlbFtkZWNzXSkKICAgIGVkZ2UkbWluQ2xhZGUubm9kZVtkZWMubm9kZUlEXSA8LSBpZmVsc2UobGVuZ3RoKG1pbkNsYWRlX2xhdCkgIT0gMCwgYWxsKGFzLmNoYXJhY3RlcihtaW5DbGFkZV9sYXQpICVpbiUgYXBlVHJlZSR0aXAubGFiZWxbZGVjc10pLCdOQScpCiAgfQogIAogIHRyMV9zbnBzX2xpc3QkdHJlZS5hdHRyaWJ1dGVzW1tzbnBJRF1dIDwtIGRhdGEuZnJhbWUoZWRnZSkKICBtYWpDbGFkZS5ub2RlIDwtIGVkZ2Vbd2hpY2goZWRnZSRtYWpDbGFkZS5ub2RlPT1UKSwnZGVjLmxhYmVsJ10KICBpZiAobGVuZ3RoKG1hakNsYWRlLm5vZGUpIT0xKXttYWpDbGFkZS5ub2RlIDwtIGVkZ2Vbd2hpY2goZWRnZSRhbmMgIT0gLTEgJiBlZGdlJG1hakNsYWRlLm5vZGU9PVQpLCdkZWMubGFiZWwnXX0KICBpZiAobGVuZ3RoKG1hakNsYWRlLm5vZGUpIT0xKXttYWpDbGFkZS5ub2RlIDwtIGVkZ2Vbd2hpY2goZWRnZSRhbmMgIT0gLTEgJiBlZGdlJG1hakNsYWRlLm5vZGU9PVQpLCdkZWMubGFiZWwnXX0KICBpZiAobGVuZ3RoKG1hakNsYWRlLm5vZGUpIT0xKXsKICAgICBmb3IgKGkgaW4gbWFqQ2xhZGUubm9kZSl7CiAgICAgIGlmIChsZW5ndGgoZWRnZSR0aXBzLmZyb20uZGVjW2ldW1sxXV0pID09IGxlbmd0aChtaW5DbGFkZV9sYXQpKXsKICAgICAgICBtYWpDbGFkZS5ub2RlLmZpbmFsIDwtIGkKICAgICAgfQogICAgfQogIH1lbHNle21hakNsYWRlLm5vZGUuZmluYWwgPC0gbWFqQ2xhZGUubm9kZX0KICAKICB0cjFfc25wcyRtYWpDbGFkZS5ub2RlLmRlcHRoW3NucElEXSA8LSBlZGdlW3doaWNoKGVkZ2UkZGVjLmxhYmVsID09IG1hakNsYWRlLm5vZGUuZmluYWwpLCdkZXB0aCddCiAgdHIxX3NucHMkc25wSURbc25wSURdIDwtIHNucElECn0KdHIxX3NucHMkbm9kZS5qdW1wIDwtIGMoJ05BJyxkaWZmKGZsb29yKGFzLm51bWVyaWModHIxX3NucHMkbWFqQ2xhZGUubm9kZSkpKSkKdHIxX3NucHMkZGVwdGguanVtcCA8LSBjKCdOQScsZGlmZihmbG9vcih0cjFfc25wcyRtYWpDbGFkZS5ub2RlLmRlcHRoKSkpCmBgYAoKVGhlIHRhYmxlIGJlbG93IGlsbHVzdHJhdGVzIGluZm9ybWF0aW9uIGZyb20gdGhlIHRyZWUgd2hvc2UgZ2Vub21pYyBzcGFuIGNvaW5jaWRlcyB3aXRoIHRoZSBmaXJzdCBTTlAgcG9zaXRpb24gLSAxMzg1OTg1LiAKCmBgYHtyIGVjaG89Rn0KdGFiMSA8LSB0cjFfc25wc19saXN0JHRyZWUuYXR0cmlidXRlc1tbMV1dWywzOjddCmtuaXRyOjprYWJsZSh0YWIxKQpgYGAKKipUYWJsZSBTMSoqOiBGb3IgdGhlIGFib3ZlIHRyZWUgYXQgU05QIHBvc2l0aW9uIDEzODU5ODUsIGluZGl2aWR1YWxzIDE4IGFuZCAyMiBzaGFyZSBhbGxlbGUgMCwgYW5kIHRoZXJlZm9yZSB0aGVpciBtb3N0IHJlY2VudCBjb21tb24gYW5jZXN0b3IgaXMgbm9kZSA3NSAoY2FsbGVkIGFzIG1pbm9yIG5vZGUpIHdoaWNoIG9yaWdpbmF0ZWQgYXQgdGltZSAoaW4gJE5fZSQpID0gMC4yMzYgYW5kIGhhcyBhIGxlbmd0aCBvZiAzLjE1MyAoaW4gJE5fZSQpLiAKClRoaXJkLCBmb3IgZWFjaCBtaW5vciBub2RlIChhbmQgbWFqb3Igbm9kZSBpZiB0aGUgU05QIGlzIGZpeGVkIHdpdGhpbiB0aGUgKkguZS5sYXRpdml0dGEqIHBvcHVsYXRpb24pIGlkZW50aWZpZWQgZnJvbSB0cmVlcyBhdCBlYWNoIG9mIHRoZSAxMzcgU05Qcywgd2UgaWRlbnRpZnkgYWxsIHRyZWVzIGFsb25nIHRoZSBnZW5vbWUgd2hpY2ggY29udGFpbnMgdGhhdCB1bmlxdWUgYW5jZXN0cmFsIG5vZGUuIFNpbmNlIHdlIGRvIG5vdCBrbm93IHRoZSBhbmNlc3RyYWwgcmVmZXJlbmNlIGFsbGVsZSBhdCBlYWNoIFNOUCBwb3NpdGlvbiBhbmQgd2UgYXNzdW1lIGluZmluaXRlIHNpdGVzIG11dGF0aW9uLCBhbnkgbWlub3Igbm9kZSB0aGF0IGlzIGFuY2VzdHJhbCBleGNsdXNpdmVseSB0byB0aGUgbWlub3IgY2xhZGUgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBjYXVzYWwgYWx0ZXJuYXRlIGFsbGVsZSBhbmQgaXMgY29uc2lkZXJlZCBhcyBhIGJyYW5jaCBvbiB3aGljaCBhIG11dGF0aW9uIGhhcyBvY2N1cnJlZC4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBleHRlbnQgb2YgdGhlIGFib3ZlIG5vZGUgNzUgdGhhdCBpcyBhbmNlc3RyYWwgdG8gaW5kbml2aWR1YWxzIDE4IGFuZCAyMiBhdCBTTlAgcG9zaXRpb24gMTM4NTk4NS4gKE5PVEU6IG9ubHkgMTAgcm93cyBzaG93ZWQgZm9yIGlsbHVzdHJhdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgaG93IHRoZSBoYXBsb3R5cGUgYmxvY2tzIGFyZSBlbmNvZGVkIGFzIGVkZ2VzLiAKYGBge3IgZWNobyA9Rn0KdGFiMiA8LSBoYXBibG9jazRfYzJfYWxsW1sxXV1bMToxMCxjKDM6Nyw5OjEzKV0gCmtuaXRyOjprYWJsZSh0YWIyKQpgYGAKKipUYWJsZSBTMioqOiBIYXBsb3R5cGUgYmxvY2sgYXMgYSB1bmlxdWUgZWRnZSB0aGF0IGNvbnRhaW5zIHRoZSBtdXRhdGlvbiBhdCBwb3M6IDEzODU5ODUsIHNoYXJlZCBiZXR3ZWVuIGluZGl2aWR1YWxzIDE4LCAyMi4gRWFjaCByb3cgcmVwcmVzZW50cyAxIHRyZWUuIEZvciBleGFtcGxlLCB0cmVlIDcgc3BhbnMgZnJvbSAxMzg1OTk0IHRvCTEzODYwMDUsIGlzCTEyIGJwIGxvbmc7IHRoZSBoYXBsb3R5cGUgYmxvY2sgYXQgdGhpcyB0cmVlIGhhcyBhIGhlaWdodCBvZiAwLjMzNzkgYW5kIHRoZXJlZm9yZSBhbiBhcmVhIChoZWlnaHQgeCB0cmVlIHNwYW4pIG9mIDQuMDU1NzYzLgoKRm9sbG93aW5nIHRoZSBhYm92ZSBzdGVwcywgd2UgY2FuIGlkZW50aWZ5IGVhY2ggbWFqb3IvbWlub3Igbm9kZSBhbmNlc3RyYWwgdG8gZWFjaCBtYWpvci9taW5vciBjbGFkZSBhbmQgb2NjdXJzIGF0IGEgcGFydGljdWxhciB0aW1lIHBvaW50IGluIHRoZSBwYXN0LCB0aGF0IGluIHByYWN0aWNlIGluZm9ybXMgdXMgb2YgYWxsIHRoZSBlZGdlcyBpbmZvcm1lZCBieSBTTlBzLiBXaXRoIDEzNyBTTlBzLCB3ZSBoYXZlIDM2IGVkZ2VzIHN1cHBvcnRlZCBieSBTTlBzICh0YWJsZSBiZWxvdykuCgpgYGB7ciwgZWNobz1GfQplZGdlczE8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gYygxMDoxMSwxMzoxOSkpewogIGNhdChpLCJcbiIpCiAgbm9kZXMgPC0gc3Vic2V0X2NsYWRlcyh0cjFfc25wcywgaSkKICBpZihucm93KG5vZGUpIT0wKXsKICAgICAgbm9kZXMgJT4lCiAgICAgICAgZHBseXI6OmRpc3RpbmN0KG1pbkNsYWRlX2xhdCkgLT4gdW5pcXVlSW5kcwogICAgZm9yIChqIGluIHNlcShucm93KHVuaXF1ZUluZHMpKSl7CiAgICAgIGNhdCgiXHQiLGosIlxuIikKICAgICAgaW5kcyA9IHVuaXF1ZUluZHNbaixdW1sxXV0KICAgICAgZWRnZXNfcmF3IDwtIGZpbmRfY2xhZGVfZGVwdGhzKG5vZGVzLCB0cjFfc25wc19saXN0LCBjb3VudCA9IGksIGluZHMpCiAgICAgIAogICAgICBpZihucm93KGVkZ2VzX3JhdykgPT0gMCl7CiAgICAgICAgZWRnZXNfcmF3IDwtIGRhdGEuZnJhbWUoZGVwdGggPSBOQSkKICAgICAgICBlZGdlc19yYXckdGlwcy5mcm9tLmRlY1sxXSA8LSBsaXN0KGluZHMpCiAgICAgICAgcm93SUQgPC0gc2FwcGx5KG5vZGVzJG1pbkNsYWRlX2xhdCwgZnVuY3Rpb24oZGVjcykgYWxsKGluZHMgJWluJSBkZWNzKSkKICAgICAgICBlZGdlc19yYXckc25wSUQgPC0gbGlzdChub2Rlc1tyb3dJRCwic25wSUQiXSkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgfWVsc2V7CiAgICAgICAgZWRnZXNfcmF3JHNucElEIDwtIGxpc3QoZWRnZXNfcmF3JHNucElEKQogICAgICAgIGVkZ2VzX3JhdyRkZXB0aCA8LSByb3VuZChlZGdlc19yYXckZGVwdGgsNCkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogICAgICB9CiAgICAgIGVkZ2VzMSA8LSByYmluZChlZGdlczEsIGVkZ2VzX3JhdykKICAgIH0KICB9ZWxzZXsKICAgIGVkZ2VzMSA8LSBlZGdlczEKICB9Cn0KCm5vZGVzIDwtIHN1YnNldF9jbGFkZXModHIxX3NucHMsMjApCm5vZGVzJG1hakNsYWRlLm5vZGUuZGVwdGggPC0gcm91bmQobm9kZXMkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KQpub2RlcyAlPiUKICBkcGx5cjo6ZGlzdGluY3QobWFqQ2xhZGUubm9kZS5kZXB0aCkgLT4gdW5pcXVlQ29hbFRpbWUKZm9yIChpIGluIHNlcShucm93KHVuaXF1ZUNvYWxUaW1lKSkpewogIGVkZ2VzX3JhdyA8LSBub2Rlc1t3aGljaChub2RlcyRtYWpDbGFkZS5ub2RlLmRlcHRoID09IHVuaXF1ZUNvYWxUaW1lW2ksXSksXQogIGVkZ2VzX3JhdyRzbnBJRCA8LSBsaXN0KGVkZ2VzX3JhdyRzbnBJRCkKICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICBlZGdlc19yYXckdGlwcy5mcm9tLmRlYyA8LSAiQUxMIgogIGVkZ2VzX3JhdyRkZXB0aCAgPC0gZWRnZXNfcmF3JG1hakNsYWRlLm5vZGUuZGVwdGgKICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogIGVkZ2VzMTwtIHJiaW5kKGVkZ2VzMSwgZWRnZXNfcmF3KQp9CnJvdy5uYW1lcyhlZGdlczEpIDwtIHNlcShucm93KGVkZ2VzMSkpCmVkZ2VzMSRlZGdlSUQgPC0gc2VxKG5yb3coZWRnZXMxKSkKYGBgCgpgYGB7ciwgZWNobz1GfQp0YWIzIDwtIGVkZ2VzMVssMTo1XQprbml0cjo6a2FibGUodGFiMykKYGBgCgoqKlRhYmxlIFMzKio6IEFsbCAzNiBoYXBsb3R5cGUgYmxvY2tzIGFzIGVkZ2VzIGZyb20gaXRlcmF0aW9uIDgyNTA7IGVhY2ggcm93IHJlcHJlc2VudHMgYW4gdW5pcXVlIGVkZ2UuIEFzIG1lbnRpb25lZCBhYm92ZSwgZWFjaCBlZGdlIGlzIGRlZmluZWQgdW5pcXVlbHkgYnkgaXRzIG9yaWdpbiB0aW1lLXBvaW50ICg9ZGVwdGgpIGFuZCB0aGUgc2V0IG9mIGRlc2NlbmRlbnQgaW5kaXZpZHVhbHMgKD10aXBzLmZyb20uZGVjKS4gRm9yIGV4YW1wbGUsIGVkZ2UgMTcgKHNhbWUgZWRnZSBhcyB0aGUgVGFibGUgUzEsIFMyIHJlZmVycyB0bykgb3JpZ2luYXRlcyBhdCAwLjIzNjUgKHRpbWUgaW4gTmUpLCBzaGFyZWQgYnkgaW5kaXZpZHVhbHMgMTgsIDIyIGFuZCBpcyBzdXBwb3J0ZWQgYnkgMyBTTlBzIGF0IHBvc2l0aW9uIChyYW5rIHN1bSBvcmRlcikgMSwyLDMuIEVkZ2VzIHdpdGggZGVwdGggPSBOQSByZWZlcnMgdG8gU05QcyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaW5maW5pdGUgc2l0ZXMgbXV0YXRpb24gbW9kZWwsIGFuZCBoZW5jZSBjYW5ub3QgYmUgZXhwbGFpbmVkIGJ5IG9uZSBtdXRhdGlvbiBldmVudC4gCgpJdCBpcyBpbXBvcnRhbnQgdG8gY2xhcmlmeSB0aGF0IHRoaXMgc3RyYXRlZ3kgb2YgaWRlbnRpZnlpbmcgbm9kZXMgYWNyb3NzIHN1Y2Nlc3NpdmUgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZSBjYW4gZWFzaWx5IGJlIHRyYW5zbGF0ZWQgdG8gdGhlIG1hdGhlbWF0aWNhbCBub3RhdGlvbiB1c2VkIGZvciB0aGUgaGFwbG90eXBlIGJsb2NrIHNpbXVsYXRpb25zLiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIGVkZ2UgY2FuIGJlIHJlcHJlc2VudGVkIGFzIHswLCB7MzR9LCB7ezE4LDIyfSx7fX19LCBpLmUuLCB0aGUgYW5jZXN0cmFsIGdlbm9tZSBvbiB0aGlzIGhhcGxvdHlwZSBibG9jayBjYXJyaWVzIHRoZSBhbGxlbGUgMCBhdCBTTlAgcG9zaXRpb24gMTsgYW5kIGlzIGJyb2tlbiBkb3duIGludG8gcmVnaW9ucyBkZWZpbmVkIGJ5IHRyZWVzIHsxLDkzfSwgezk0LDQ2NH0gYW5kIGlzIGFuY2VzdHJhbCB0byBzYW1wbGVzIHsxOCwyMn0se30gcmVzcGVjdGl2ZWx5LiAKCiMjIyMgSGFwbG90eXBlIGJsb2NrIHZpc3VhbGl6YXRpb24KCkZvciB2aXN1YWxpemF0aW9uLCB3ZSBjaG9vc2UgdG8gb25seSBwbG90IHRoZSBlZGdlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgMyBvciBtb3JlIFNOUHMuIE1vcmVvdmVyLCBmb3IgU05QcyB0aGF0IGFyZSBmaXhlZCBpbiB0aGUgcmVkIHBvcHVsYXRpb24sIHdlIG9ubHkgc2hvdyBlZGdlcyB0aGF0IG9yaWdpbmF0ZSBhdCBhbnkgdGltZS1wb2ludCBiZWxvdyA1JE5fZSQuIFRoaXMgbGVhdmVzIHVzIHdpdGggb25seSA4IGVkZ2VlLiAoc2VlIC5SbWQgZmlsZSBmb3IgZnVsbCBjb2RlKQoKYGBge3IgZWNobz1UfQojIyBTZWxlY3QgZWRnZXMgc3VwcG9ydGVkIGJ5IDMgb3IgbW9yZSBTTlBzCmltcF9lZGdlczEgPC0gZWRnZXMxW2VkZ2VzMSROby5vZi5TTlBzID49MyAmIGVkZ2VzMSRkZXB0aCA8PTUgLCBdICMxMiBpbXBvcnRhbnQgZWRnZXMKbnJvdyhpbXBfZWRnZXMxKQppbXBfZWRnZXMxIDwtIGltcF9lZGdlczFbb3JkZXIoaW1wX2VkZ2VzMSRkZXB0aCksXQpgYGAKCmBgYHtyIGVjaG89Rn0KIyMgRmluZCBoYXBsb3R5cGUgYmxvY2tzCgojc2luZ2xldG9ucwpibDFfYzE8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIxX3NucHMsIDE5KSwgdHIxX3NucHNfbGlzdCwgY291bnQgPSAxOSwgaW5kcyA9IGMoMzApKQppbmRzMV9jMSA8LSBjKDMwKQpoYXBibG9jazFfYzEgPC0gZmluZF9oYXBibG9ja3MoaW5kczFfYzEsIGltcF9lZGdlczEkZGVwdGhbMV0sICJhbGwiLCBULCB0cjFfc3ViX2xpc3QpCmhhcGJsb2NrMV9jMV9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2sxX2MxKQoKYmwyX2MxPC1maW5kX2NsYWRlX2RlcHRocyhzdWJzZXRfY2xhZGVzKHRyMV9zbnBzLCAxOSksIHRyMV9zbnBzX2xpc3QsIGNvdW50ID0gMTksIGluZHMgPSBjKDEzKSkKaW5kczJfYzEgPC0gYygxMykKaGFwYmxvY2syX2MxIDwtIGZpbmRfaGFwYmxvY2tzKGluZHMyX2MxLCBpbXBfZWRnZXMxJGRlcHRoWzJdLCAiYWxsIiwgVCwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazJfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrMl9jMSkKCiNkb3VibGV0b25zCmJsM19jMTwtZmluZF9jbGFkZV9kZXB0aHMoc3Vic2V0X2NsYWRlcyh0cjFfc25wcywgMTgpLCB0cjFfc25wc19saXN0LCBjb3VudCA9IDE4LCBpbmRzID0gYygyMSwyMikpCmluZHMzX2MxIDwtIGMoMjEsMjIpCmhhcGJsb2NrM19jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzM19jMSwgaW1wX2VkZ2VzMSRkZXB0aFszXSwgImFsbCIsIEYsIHRyMV9zdWJfbGlzdCkKaGFwYmxvY2szX2MxX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazNfYzEpCgpibDRfYzE8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIxX3NucHMsIDE4KSwgdHIxX3NucHNfbGlzdCwgY291bnQgPSAxOCwgaW5kcyA9IGMoMTgsMjIpKQppbmRzNF9jMSA8LSBjKDE4LDIyKQpoYXBibG9jazRfYzEgPC0gZmluZF9oYXBibG9ja3MoaW5kczRfYzEsIGltcF9lZGdlczEkZGVwdGhbNF0sICJhbGwiLCBGLCB0cjFfc3ViX2xpc3QpCmhhcGJsb2NrNF9jMV9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2s0X2MxKQoKIyMgRml4ZWQgU05QcwppbmRzQUxMIDwtIGxhdGl2aXR0YV9pbmRpdmlkdWFscwp0cjFfY291bnQyMCA8LSBzdWJzZXRfY2xhZGVzKHRyMV9zbnBzLCAyMCkKCmJsNl9jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbNV0pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrNl9jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzVdLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazZfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrNl9jMSkKCmJsN19jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbN10pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrN19jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzddLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazdfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrN19jMSkKCmJsOF9jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbOF0pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrOF9jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzhdLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazhfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrOF9jMSkKCmJsOV9jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbOV0pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrOV9jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzldLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazlfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrOV9jMSkKYGBgCgpgYGB7ciBmaWc3LCBmaWcud2lkdGg9MTcsIGZpZy5oZWlnaHQ9OCwgZWNobyA9IFQsIHJlc3VsdHM9Riwgd2FybmluZz1GIH0KcGFyKG1mcm93PWMoMiwxKSwgY2V4LmxhYj0xLjUsIGNleC5heGlzPTEuMykKcGxvdF9hbGxfc2l0ZXMoZm9jYWxfc2l0ZXMsIGFzLmNoYXJhY3RlcigxKSkgKwogIGF4aXMoc2lkZSA9MiwgdGljayA9VCwgYXQgPSBjKDIxOjQwKSwgbGFiZWxzID0gRikgKwogIHBvaW50cyhibDFfYzEkcG9zLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMzApKSxucm93KGJsMV9jMSkpLCBjb2w9J2JsYWNrJywgcGNoPTE5LCBjZXggPSAxKQpwbG90KGhhcGJsb2NrMV9jMSRjaHJvbVN0YXJ0LCBoYXBibG9jazFfYzEkbGVuZ3RoLCB0eXBlPSJuIiwgbG9nPSJ5IiwgeWxpbT1jKDAuMDUsMTUpLCB4bGFiPSJQb3NpdGlvbiAoYnApIiwgeWxhYj0iVGltZSAoTmUpIiwgeGxpbT1jKGNocm9tU3RhcnQsIGNocm9tRW5kKSkgKyAgIAogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2sxX2MxX2FsbCwgImJsYWNrIiwgVCkKYGBgCioqRmlnIFM3Kio6IEhhcGxvdHlwZSBibG9jayB0aGF0IGlzIHN1cHBvcnRlZCBieSBzaW5nbGV0b25zLiBUaGVzZSBlZGdlcyBvcmlnaW5hdGUgZGlyZWN0bHkgZnJvbSB0aGUgdHJlZSB0aXBzLCBpZSwgdGhlIHNhbXBsZXMgYW5kIHRoZXJlZm9yZSBleHRlbmRzIGFsbCBhbG9uZyB0aGUgZ2Vub21pYyByZWdpb24uIEFsdGhvdWdoIGZvciBiaW9sb2dpY2FsIGluZmVyZW5jZSwgc2luZ2xldG9ucyBhcmUgb2Z0ZW4gdW5pbmZvcm1hdGl2ZSwgdGhpcyBzaG93cyB0aGUgZmVhdHVyZSBvZiBhbiBlZGdlIHN1cHBvcnRlZCBieSBzaW5nbGV0b25zLCB3aGljaCBleHRlbmRzIGFsbCBhbG9uZyB0aGUgZ2Vub21lLCBpcyBub3JtYWxseSBzaGFsbG93IHdpdGggY2VydGFpbiByZWdpb25zIHRoYXQgZ28gYXJlIGhpZ2gsIHdoZXJlIGEgbG90IG9mIHNpbmdsZXRvbiBjbHVzdGVycyB0b2dldGhlci4gVGhlc2UgYXJlIG5vcm1hbGx5IHJlZ2lvbnMgb2YgdGhlIGdlbm9tZSwgd2hpY2ggaGF2ZSByZWNvbWJpbmVkIG91dCBhbmQgZ29lcyBhbGwgdGhlIHdheSBiYWNrIHRvIGFuIGFuY2VzdG9yIGluIHRoZSBkZWVwIHBhc3QuIFRoZSBvcmFuZ2UgYmxvY2sgc2hvd3MgY2x1c3RlcmluZyBvZiBTTlBzIGluIHRoZSBoaWdoZXIgcmVnaW9uIG9mIHRoZSBlZGdlcywgd2hlcmVhcywgdGhlIGdyZWVuIGVkZ2Ugc2hvd3MgaG93IFNOUHMgY2FuIGFsc28gb2NjdXIgYnkgY2hhbmNlIGF0IG90aGVyIHJlZ2lvbnMuIAoKTm93LCBwbG90aW5nIGFsbCB0aGUgaGFwbG95cGUgYmxvY2tzIGV4Y2VwdCBzaW5nbGV0b25zIChGaWcgUzgpLCBzYW1lIGFzIHRoZSBmaWd1cmUgaW4gbWFpbiB0ZXh0IChzZWUgTWFpbiBUZXh0IGZvciBjYXB0aW9uKS4KYGBge3IgZmlnIDEwMDAwLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNSwgcmVzdWx0cz1GLCBlY2hvPUYsIHdhcm5pbmc9Rn0KdHJlZXNfdG9fcGxvdCA8LSBjKDIsIDIzLCA1MSwgNTcsIDc1LCA5NSwgMTM3KQoKcGFyKG1mcm93PWMoMywxKSwgY2V4Lm1haW49MS41LCBjZXgubGFiPTEuMywgY2V4LmF4aXM9MS4yKQoKcGxvdF9hbGxfc2l0ZXMoZm9jYWxfc2l0ZXMsIGFzLmNoYXJhY3RlcigxKSkgKwogIGF4aXMoc2lkZSA9MiwgdGljayA9VCwgYXQgPSBjKDIxOjQwKSwgbGFiZWxzID0gRikgKwogIHBvaW50cyhyZXAoKGJsM19jMSRwb3MpLCBlYWNoID0gMiksIHJlcCh3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gYygyMSwyMikpLG5yb3coYmwzX2MxKSkgLCBjb2w9J3BpbmsnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDRfYzEkcG9zKSwgZWFjaCA9IDIpLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMTgsMjIpKSxucm93KGJsNF9jMSkpICwgY29sPSd5ZWxsb3cnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDZfYzEkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsNl9jMSkpICwgY29sPSdkYXJrYmx1ZScsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsN19jMSRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw3X2MxKSkgLCBjb2w9J2N5YW4nLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDhfYzEkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsOF9jMSkpICwgY29sPSdtYWdlbnRhJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw5X2MxJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDlfYzEpKSAsIGNvbD0nc2llbm5hJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKChmb2NhbF9zaXRlcyRwb3Nbd2hpY2goZm9jYWxfc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMSw3KSwgcGNoID0xNywgY2V4ID0gMikgKwogICAgYWJsaW5lKHY9KGZvY2FsX3NpdGVzJHBvc1t3aGljaChmb2NhbF9zaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXSksIGx0eSA9IDIsIGx3ZCA9IDAuOCkKCgoKcGxvdChoYXBibG9jazFfYzEkY2hyb21TdGFydCwgaGFwYmxvY2sxX2MxJGxlbmd0aCwgdHlwZT0ibiIsIGxvZz0ieSIsIHlsaW09YygwLjA1LDE1KSwgeGxhYj0iIiwgeWxhYj0iVGltZSAoTmUpIiwgeGxpbT1jKGNocm9tU3RhcnQsIGNocm9tRW5kKSkgKwogICNwbG90X2hhcGJsb2NrKGhhcGJsb2NrMl9jMV9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2szX2MxX2FsbCwgInBpbmsiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazRfYzFfYWxsLCAieWVsbG93IiwgRikgKwogICMgcGxvdF9oYXBibG9jayhoYXBibG9jazVfYzFfYWxsLCAiYmx1ZSIsIFQpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrNl9jMV9hbGwsICJkYXJrYmx1ZSIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrN19jMV9hbGwsICJjeWFuIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s4X2MxX2FsbCwgIm1hZ2VudGEiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazlfYzFfYWxsLCAic2llbm5hIiwgRikgKwogIHBvaW50cyhmb2NhbF9zaXRlcyRwb3Nbd2hpY2goZm9jYWxfc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0sIHJlcCgwLjA1LDcpLCBwY2ggPTE3LCBjZXggPSAyKSArCiAgYWJsaW5lKHY9KGZvY2FsX3NpdGVzJHBvc1t3aGljaChmb2NhbF9zaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXSksIGx0eSA9IDIsIGx3ZCA9IDAuOCkKCgpwbG90KGdlbjgyNTAsIHRtcmNhODI1MCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0ncycsIGNvbCA9ICJibGFjayIsIGx3ZD0zLCBsb2c9InkiLCAKICAgICB5bGltPWMoMC4wNSwxNSksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGJwKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICAgIGxpbmVzKGdlbjgyNTBfbGF0LCB0bXJjYTgyNTBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykgKwogICAgcG9pbnRzKGZvY2FsX3NpdGVzJHBvc1t3aGljaChmb2NhbF9zaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXSwgcmVwKDAuMDUsNyksIHBjaCA9MTcsIGNleCA9IDIpICsKICBhYmxpbmUodj0oZm9jYWxfc2l0ZXMkcG9zW3doaWNoKGZvY2FsX3NpdGVzJHNucElEICVpbiUgdHJlZXNfdG9fcGxvdCldKSwgbHR5ID0gMiwgbHdkID0gMC44KQpgYGAKCgpTZWUgKi5SbWQqIGZpbGUgZm9yIGFsbCAxMzcgdHJlZXMgYXQgZWFjaCBTTlAgcG9zaXRpb24uCmBgYHtyIGZpZzEwMCwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTcsIGVjaG89RiwgcmVzdWx0cz1GLCBtZXNzYWdlPUYsIGluY2x1ZGU9Rn0KcGFyKG1mcm93PWMoMiw0KSkKZm9yIChpIGluIDE6MTM3KXsKICBwbG90VHJlZSh0cjFfc25wcyR0cmVlW2ldLCAKICAgICAgICAgICNrZWVwU2VxcyA9IGFzLmNoYXJhY3RlcihsYXRpdml0dGFfaW5kaXZpZHVhbHMpLAogICAgICAgICAgbGVhZkNvbCA9IGluZENvbG91cl9hcmdJRHMsIHlsYWI9aSwgCiAgICAgICAgICBsb2dTY2FsZSA9IFQsIHlsaW09Yyg0ZS0zLDIwKSwgdGltZVNjYWxlID0gMS9OZSwgY2V4LmxhYiA9IDEuMykKfQpgYGAKCiMjIyMgQ2FzZSAyOiBpdGVyYXRpb24gOTAwMApUaGVyZSBhcmUgYWx0b2dldGhlciA2NDU3IHRyZWVzIGluIHRoZSB+NTBrYiByZWdpb24sIGFuZCA0MjUgaW4gdGhlIGZvY2FsIGdlbm9taWMgcmVnaW9uLiAKCmBgYHtyIGVjaG89Rn0KIyMgUmVhZCB0cmVlIGxlbmd0aAp0cmVlbGVuMiA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUuYnJhbmNobGVuLmFsbF9zYW1wbGUuOTIwMC5iZWQuZ3oiKQpzdHIodHJlZWxlbjIpCnRyZWVsZW4yJHRyZWVzcGFuIDwtIHRyZWVsZW4yJGNocm9tRW5kLXRyZWVsZW4yJGNocm9tU3RhcnQKCnRyZWVsZW4yX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbCh0cmVlbGVuMiwgY2hyb21TdGFydCwgY2hyb21FbmQpCnBhcihtZnJvdz1jKDIsMSkpCnBsb3QodHJlZWxlbjJfc3ViJGNocm9tU3RhcnQsIHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbiwgdHlwZT0icyIsIGxvZz0ieSIsIHhsYWI9IlBvc2l0aW9uIiwgeWxhYj0iVHJlZSBMZW5ndGgiKQpwbG90KHRyZWVsZW4yX3N1YiRjaHJvbUVuZCwodHJlZWxlbjJfc3ViJGNocm9tRW5kLXRyZWVsZW4yX3N1YiRjaHJvbVN0YXJ0KSwgdHlwZT0icyIsIGxvZz0ieSIsIHhsYWI9IlBvc2l0aW9uIiwgeWxhYj0iVHJlZSBTcGFuIikKYGBgCmBgYHtyIGZpZywgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTUsIGluY2x1ZGU9RkFMU0V9CiNwbG90KHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbiwgdHJlZWxlbjJfc3ViJHRyZWVzcGFuLCB4bGFiPSJUcmVlIExlbmd0aCIsIHlsYWI9IlRyZWUgU3BhbiIpCm1lYW4odHJlZWxlbjIkdHJlZXNwYW4pCm1lYW4odHJlZWxlbjJfc3ViJHRyZWVzcGFuKQp0YWJsZSh0cmVlbGVuMiR0cmVlc3BhbikKbnJvdyh0cmVlbGVuMikKcGFyKG1mcm93PWMoMSwyKSkKcGxvdCh0cmVlbGVuMiR0cmVlc3BhbiwgdHJlZWxlbjIkYnJhbmNobGVuX21lYW4sIHhsYWI9IlRyZWUgU3BhbiIsIHlsYWI9IlRyZWUgTGVuZ3RoIikKcG9pbnRzKGFnZ3JlZ2F0ZSh0cmVlbGVuMiRicmFuY2hsZW5fbWVhbn50cmVlbGVuMiR0cmVlc3BhbiwgRlVOPW1lYW4pLCBjb2w9InJlZCIsIHBjaD0xOSkKcGxvdCh0cmVlbGVuMl9zdWIkdHJlZXNwYW4sIHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbiwgeGxhYj0iVHJlZSBTcGFuIiwgeWxhYj0iVHJlZSBMZW5ndGgiKQpwb2ludHMoYWdncmVnYXRlKHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbn50cmVlbGVuMl9zdWIkdHJlZXNwYW4sIEZVTj1tZWFuKSwgY29sPSJyZWQiLCBwY2g9MTkpCmBgYAoKYGBge3IsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD0xMCwgaW5jbHVkZT1GfQojUmVhZCB0bXJjYQp0bXJjYTkyMDAgPC0gcmVhZEFyZ1N1bW1hcnkoIn4vUHJvai1EZWYtSGFwbG8vb3B0aXhfbmV3cnVuL29wdGl4X25ld05lL29wdGl4X25ld05lLnRtcmNhLmFsbF9zYW1wbGUuOTIwMC5iZWQuZ3oiKQp0bXJjYTkyMDBfbm90IDwtIHJlYWRBcmdTdW1tYXJ5KCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9vcHRpeF9uZXdOZS50bXJjYS5IZXJhdG9fbm90YWJpbGlzLjkyMDAuYmVkLmd6IikKdG1yY2E5MjAwX2xhdCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUudG1yY2EuSGVyYXRvX2xhdGl2aXR0YS45MjAwLmJlZC5neiIpCiMjIFNldCBnZW5vbWljIHNwYW4gYW5kIE5lIApOZT0xOTQwMDc4CmdlbjkyMDAgPC0gKHRtcmNhOTIwMCRjaHJvbVN0YXJ0KSMvMWUzCmdlbjkyMDBfbm90IDwtICh0bXJjYTkyMDBfbm90JGNocm9tU3RhcnQpIy8xZTMKZ2VuOTIwMF9sYXQgPC0gKHRtcmNhOTIwMF9sYXQkY2hyb21TdGFydCkjLzFlMwoKcGxvdChnZW45MjAwLCB0bXJjYTkyMDAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwyMCksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGtCKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICBsaW5lcyhnZW45MjAwX25vdCwgdG1yY2E5MjAwX25vdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQ0NDQzAwIiwgbHdkPTEpICsKICAgIGxpbmVzKGdlbjkyMDBfbGF0LCB0bXJjYTkyMDBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykKYGBgCgpgYGB7ciBpbmNsdWRlPUZ9CiNSZWFkIHRyZWVzCnRyMiA8LSByZWFkLnRhYmxlKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuOTIwMF90cmVlcy50eHQiKQpjb2xuYW1lcyh0cjIpIDwtIGMoImV2ZW50IiwiY2hyb21TdGFydCIsImNocm9tRW5kIiwidHJlZSIpCnN0cih0cjIpCiNSZWFkIFNQUnMKc3ByMiA8LSByZWFkLnRhYmxlKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuOTIwMF9TUFIudHh0IikKY29sbmFtZXMoc3ByMikgPC0gYygiZXZlbnQiLCJwb3NpdGlvbiIsICJyZWNvbWJfbm9kZSIsICJyZWNvbWJfdGltZSIsICJjb2FsX25vZGUiLCAiY29hbF90aW1lIikKc3RyKHNwcjIpCmBgYAoKYGBge3J9CiNGaW5kIHRyZWVzIGluIHRoZSByZWdpb24gb2YgaW50ZXJlc3QKdHIyX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbCh0cjIsIGNocm9tU3RhcnQsIGNocm9tRW5kKSAjNDI1IHRyZWVzCnN0cih0cjJfc3ViKQpzcHIyX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbChzcHIyLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkKYGBgCgpgYGB7cn0KI1N0b3JlIHRyZWVzIGFuZCBlZGdlIGluZm9ybWF0aW9uIGFzIGEgbGlzdAp0cjJfc3ViX2xpc3QgPC0gZXh0cmFjdF9lZGdlcyh0cjJfc3ViKQpgYGAKYGBge3J9CiMjIHRoaXMgb25seSBleHRyYWN0cyB0cmVlcyBhdCBTTlBzCnRyMl9zbnBzIDwtIGV4dHJhY3RfdHJlZXNfYXRfU05Qcyhmb2NhbF9zaXRlcywgdHIyLCBzcHIyKQpzdHIodHIyX3NucHMpCmBgYAoKYGBge3J9CnRpbWVTY2FsZSA9IDEvTmUKdHIyX3NucHNfbGlzdCA8LSBsaXN0KCkKbGF0IDwtIHNhbXBJRCRJRFt3aGljaChzYW1wSUQkcG9wPT0iSGVyYXRvX2xhdGl2aXR0YSIpXQpub3QgPC0gc2FtcElEJElEW3doaWNoKHNhbXBJRCRwb3A9PSJIZXJhdG9fbm90YWJpbGlzIildCmZvciAoc25wSUQgaW4gYygxOm5yb3codHIyX3NucHMpKSl7CiAgY2F0KHNucElELCB0cjJfc25wc1tzbnBJRCwicG9zIl0pCiAgYWxsZWxlcyA8LSB0cjJfc25wc1tzbnBJRCxzYW1wSUQkSURdCiAgYWxsZWxlcyA8LSBhcy5mYWN0b3IoYWxsZWxlcykKICAKICBhbGxlbGVDb3VudDEgPC0gc3VtKGFsbGVsZXNbbGF0XSA9PSBsZXZlbHMoYWxsZWxlcylbMV0pCiAgYWxsZWxlQ291bnQyIDwtIHN1bShhbGxlbGVzW2xhdF0gPT0gbGV2ZWxzKGFsbGVsZXMpWzJdKQogIAogIG1hakFsbGVsZSA8LSBpZmVsc2UoYWxsZWxlQ291bnQxID4gYWxsZWxlQ291bnQyLCBsZXZlbHMoYWxsZWxlcylbMV0sIGxldmVscyhhbGxlbGVzKVsyXSkKICB0cjJfc25wcyRtYWpBbGxlbGVbc25wSURdIDwtIG1hakFsbGVsZQogIG1pbkFsbGVsZSA8LSBzZXRkaWZmKGxldmVscyhhbGxlbGVzKSwgbWFqQWxsZWxlKQogIHRyMl9zbnBzJG1pbkFsbGVsZVtzbnBJRF0gPC0gbWluQWxsZWxlCiAgCiAgI21hakNsYWRlX2xhdCA8LSBzZXRkaWZmKHdoaWNoKGFsbGVsZXMgPT0gbWFqQWxsZWxlKSwgbm90YWJpbGlzX2luZGl2aWR1YWxzKzEpICMgMS1pbmRleGVkCiAgI21pbkNsYWRlX2xhdCA8LSBzZXRkaWZmKHdoaWNoKGFsbGVsZXMgPT0gbWluQWxsZWxlKSwgbm90YWJpbGlzX2luZGl2aWR1YWxzKzEpICMgMS1pbmRleGVkCiAgbWFqQ2xhZGVfbGF0X25hbWVzIDwtIHNldGRpZmYobmFtZXMoYWxsZWxlc1t3aGljaChhbGxlbGVzID09IG1hakFsbGVsZSldKSxub3QpCiAgbWluQ2xhZGVfbGF0X25hbWVzIDwtIHNldGRpZmYobGF0LCBtYWpDbGFkZV9sYXRfbmFtZXMpCiAgCiAgbWFqQ2xhZGVfbGF0IDwtIHNhbXBJRFt3aGljaChzYW1wSUQkSUQgJWluJSBtYWpDbGFkZV9sYXRfbmFtZXMpLCJBUkd3ZWF2ZXJJRCJdICMgMC1pbmRleGVkCiAgdHIyX3NucHMkbWFqQ2xhZGVfbGF0W3NucElEXSA8LSBsaXN0KG1hakNsYWRlX2xhdCkKICB0cjJfc25wcyRtYWpBbGxlbGVDb3VudF9sYXRbc25wSURdIDwtIGxlbmd0aCh0cjJfc25wcyRtYWpDbGFkZV9sYXRbc25wSURdW1sxXV0pIAogIAogIG1pbkNsYWRlX2xhdCA8LSBzYW1wSURbd2hpY2goc2FtcElEJElEICVpbiUgbWluQ2xhZGVfbGF0X25hbWVzKSwiQVJHd2VhdmVySUQiXSAjIDAtaW5kZXhlZAogIHRyMl9zbnBzJG1pbkNsYWRlX2xhdFtzbnBJRF0gPC0gbGlzdChtaW5DbGFkZV9sYXQpCiAgdHIyX3NucHMkbWluQWxsZWxlQ291bnRfbGF0W3NucElEXSA8LSAyMC10cjJfc25wcyRtYWpBbGxlbGVDb3VudF9sYXRbc25wSURdCiAgCiAgdHJlZSA8LSB0cjJfc25wc1tzbnBJRCwidHJlZSJdCiAgdHIubm90IDwtIHBydW5lVHJlZSh0cmVlID0gdHJlZSwgc2VxcyA9IGFzLmNoYXJhY3Rlcihub3RhYmlsaXNfaW5kaXZpZHVhbHMpKSAjIDAtaW5kZXhlZAogIHRyLmxhdCA8LSBwcnVuZVRyZWUodHJlZSA9IHRyZWUsIHNlcXMgPSBhcy5jaGFyYWN0ZXIobGF0aXZpdHRhX2luZGl2aWR1YWxzKSkgIyAwLWluZGV4ZWQKICAKICB0cjJfc25wc19saXN0JHRyZWVbc25wSURdIDwtIHRyLmxhdAogIGFwZVRyZWUgPC0gcmVhZC50cmVlKHRleHQ9dHIubGF0KQogIAogICMjIFRyZWUKICBubGVhZiA8LSBsZW5ndGgoYXBlVHJlZSR0aXAubGFiZWwpCiAgcm9vdGFnZSA8LSBnZXRUcmVlRGVwdGgoYXBlVHJlZSkqdGltZVNjYWxlCiAgcm9vdE5vZGUgPC0gZ2V0Um9vdE5vZGUoYXBlVHJlZSkKICBlZGdlIDwtIGFzLmRhdGEuZnJhbWUoYXBlVHJlZSRlZGdlKQogIG5hbWVzKGVkZ2UpIDwtIGMoImFuYyIsICJkZWMiKQogIGVkZ2UkYW5jLmxhYmVsIDwtIHNhcHBseShhcGVUcmVlJGVkZ2VbLDFdLCBzZWxlY3QudGlwLm9yLm5vZGUsIHRyZWUgPSBhcGVUcmVlKQogIGVkZ2UkZGVjLmxhYmVsIDwtIHNhcHBseShhcGVUcmVlJGVkZ2VbLDJdLCBzZWxlY3QudGlwLm9yLm5vZGUsIHRyZWUgPSBhcGVUcmVlKQogIAogIGVkZ2UgPC0gcmJpbmQoZWRnZSwgZGF0YS5mcmFtZShhbmM9LTEsIGRlYz1yb290Tm9kZSwgYW5jLmxhYmVsPS0xLCBkZWMubGFiZWw9cm9vdE5vZGUpKQogIG5ub2RlIDwtIG5yb3coZWRnZSkKICBlZGdlJGxlbmd0aCA8LSBjKGFwZVRyZWUkZWRnZS5sZW5ndGgqdGltZVNjYWxlLCBtYXgobWF4dGltZSAtIHJvb3RhZ2UsIDEpKQogIGVkZ2UkZGVwdGggPC0gcmVwKHJvb3RhZ2UsIG5ub2RlKQogIGZvciAoaSBpbiAxOm5ub2RlKSB7aiA8LSBpCiAgICB3aGlsZSAoMSkge2lmIChlZGdlJGRlY1tqXSA9PSByb290Tm9kZSkgYnJlYWsKICAgICAgICBlZGdlJGRlcHRoW2ldIDwtIGVkZ2UkZGVwdGhbaV0gLSBlZGdlJGxlbmd0aFtqXQogICAgICAgIGogPC0gd2hpY2goZWRnZVssImRlYyJdID09IGVkZ2VbaiwiYW5jIl0pfX0KICAKICBlZGdlW3doaWNoKGVkZ2UkYW5jID09IC0xKSwiZGVjLmxhYmVsIl0gPC0gZWRnZVsxLCJhbmMubGFiZWwiXQogICMgZWRnZSR0aXAubGFiZWwgPC0gcmVwKCIiLCBucm93KGVkZ2UpKQogICMgZm9yIChpIGluIDE6bGVuZ3RoKGFwZVRyZWUkdGlwLmxhYmVsKSl7ZWRnZVtlZGdlJGRlYz09aSwidGlwLmxhYmVsIl0gPC0gYXBlVHJlZSR0aXAubGFiZWxbaV19CgogIGZvciAoZGVjLm5vZGVJRCBpbiBjKDE6bnJvdyhlZGdlKSkpewogICAgZGVjcyA8LSBEZXNjZW5kYW50cyhhcGVUcmVlLCBlZGdlJGRlY1tkZWMubm9kZUlEXSwidGlwcyIpW1sxXV0KICAgIGVkZ2UkdGlwcy5mcm9tLmRlY1tkZWMubm9kZUlEXSA8LSBsaXN0KGFwZVRyZWUkdGlwLmxhYmVsW2RlY3NdKQogICAgZWRnZSRtYWpDbGFkZS5ub2RlW2RlYy5ub2RlSURdIDwtIGFsbChhcy5jaGFyYWN0ZXIobWFqQ2xhZGVfbGF0KSAlaW4lIGFwZVRyZWUkdGlwLmxhYmVsW2RlY3NdKQogICAgZWRnZSRtaW5DbGFkZS5ub2RlW2RlYy5ub2RlSURdIDwtIGlmZWxzZShsZW5ndGgobWluQ2xhZGVfbGF0KSAhPSAwLCBhbGwoYXMuY2hhcmFjdGVyKG1pbkNsYWRlX2xhdCkgJWluJSBhcGVUcmVlJHRpcC5sYWJlbFtkZWNzXSksJ05BJykKICB9CiAgCiAgdHIyX3NucHNfbGlzdCR0cmVlLmF0dHJpYnV0ZXNbW3NucElEXV0gPC0gZGF0YS5mcmFtZShlZGdlKQogIG1hakNsYWRlLm5vZGUgPC0gZWRnZVt3aGljaChlZGdlJG1hakNsYWRlLm5vZGU9PVQpLCdkZWMubGFiZWwnXQogIGlmIChsZW5ndGgobWFqQ2xhZGUubm9kZSkhPTEpe21hakNsYWRlLm5vZGUgPC0gZWRnZVt3aGljaChlZGdlJGFuYyAhPSAtMSAmIGVkZ2UkbWFqQ2xhZGUubm9kZT09VCksJ2RlYy5sYWJlbCddfQogIGlmIChsZW5ndGgobWFqQ2xhZGUubm9kZSkhPTEpe21hakNsYWRlLm5vZGUgPC0gZWRnZVt3aGljaChlZGdlJGFuYyAhPSAtMSAmIGVkZ2UkbWFqQ2xhZGUubm9kZT09VCksJ2RlYy5sYWJlbCddfQogIGlmIChsZW5ndGgobWFqQ2xhZGUubm9kZSkhPTEpewogICAgIGZvciAoaSBpbiBtYWpDbGFkZS5ub2RlKXsKICAgICAgaWYgKGxlbmd0aChlZGdlJHRpcHMuZnJvbS5kZWNbaV1bWzFdXSkgPT0gbGVuZ3RoKG1pbkNsYWRlX2xhdCkpewogICAgICAgIG1hakNsYWRlLm5vZGUuZmluYWwgPC0gaQogICAgICB9CiAgICB9CiAgfWVsc2V7bWFqQ2xhZGUubm9kZS5maW5hbCA8LSBtYWpDbGFkZS5ub2RlfQogIAogIHRyMl9zbnBzJG1hakNsYWRlLm5vZGUuZGVwdGhbc25wSURdIDwtIGVkZ2Vbd2hpY2goZWRnZSRkZWMubGFiZWwgPT0gbWFqQ2xhZGUubm9kZS5maW5hbCksJ2RlcHRoJ10KICB0cjJfc25wcyRzbnBJRFtzbnBJRF0gPC0gc25wSUQKfQojY29sbmFtZXModHIyX3NucHMpW25jb2wodHIyX3NucHMpXSA8LSAic25wSUQiCnRyMl9zbnBzJG5vZGUuanVtcCA8LSBjKCdOQScsZGlmZihmbG9vcihhcy5udW1lcmljKHRyMl9zbnBzJG1hakNsYWRlLm5vZGUpKSkpCnRyMl9zbnBzJGRlcHRoLmp1bXAgPC0gYygnTkEnLGRpZmYoZmxvb3IodHIyX3NucHMkbWFqQ2xhZGUubm9kZS5kZXB0aCkpKQpgYGAKCmBgYHtyfQplZGdlczI8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gYygxMDoxMSwxMzoxOSkpewogIGNhdChpLCJcbiIpCiAgbm9kZXMgPC0gc3Vic2V0X2NsYWRlcyh0cjJfc25wcywgaSkKICBpZihucm93KG5vZGUpIT0wKXsKICAgICAgbm9kZXMgJT4lCiAgICAgICAgZHBseXI6OmRpc3RpbmN0KG1pbkNsYWRlX2xhdCkgLT4gdW5pcXVlSW5kcwogICAgZm9yIChqIGluIHNlcShucm93KHVuaXF1ZUluZHMpKSl7CiAgICAgIGNhdCgiXHQiLGosIlxuIikKICAgICAgaW5kcyA9IHVuaXF1ZUluZHNbaixdW1sxXV0KICAgICAgZWRnZXNfcmF3IDwtIGZpbmRfY2xhZGVfZGVwdGhzKG5vZGVzLCB0cjJfc25wc19saXN0LCBjb3VudCA9IGksIGluZHMpCiAgICAgIAogICAgICBpZihucm93KGVkZ2VzX3JhdykgPT0gMCl7CiAgICAgICAgZWRnZXNfcmF3IDwtIGRhdGEuZnJhbWUoZGVwdGggPSBOQSkKICAgICAgICBlZGdlc19yYXckdGlwcy5mcm9tLmRlY1sxXSA8LSBsaXN0KGluZHMpCiAgICAgICAgcm93SUQgPC0gc2FwcGx5KG5vZGVzJG1pbkNsYWRlX2xhdCwgZnVuY3Rpb24oZGVjcykgYWxsKGluZHMgJWluJSBkZWNzKSkKICAgICAgICBlZGdlc19yYXckc25wSUQgPC0gbGlzdChub2Rlc1tyb3dJRCwic25wSUQiXSkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgfWVsc2V7CiAgICAgICAgZWRnZXNfcmF3JHNucElEIDwtIGxpc3QoZWRnZXNfcmF3JHNucElEKQogICAgICAgIGVkZ2VzX3JhdyRkZXB0aCA8LSByb3VuZChlZGdlc19yYXckZGVwdGgsNCkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogICAgICB9CiAgICAgIGVkZ2VzMiA8LSByYmluZChlZGdlczIsIGVkZ2VzX3JhdykKICAgIH0KICB9ZWxzZXsKICAgIGVkZ2VzMiA8LSBlZGdlczIKICB9Cn0KCm5vZGVzIDwtIHN1YnNldF9jbGFkZXModHIyX3NucHMsMjApCm5vZGVzJG1hakNsYWRlLm5vZGUuZGVwdGggPC0gcm91bmQobm9kZXMkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KQpub2RlcyAlPiUKICBkcGx5cjo6ZGlzdGluY3QobWFqQ2xhZGUubm9kZS5kZXB0aCkgLT4gdW5pcXVlQ29hbFRpbWUKZm9yIChpIGluIHNlcShucm93KHVuaXF1ZUNvYWxUaW1lKSkpewogIGVkZ2VzX3JhdyA8LSBub2Rlc1t3aGljaChub2RlcyRtYWpDbGFkZS5ub2RlLmRlcHRoID09IHVuaXF1ZUNvYWxUaW1lW2ksXSksXQogIGVkZ2VzX3JhdyRzbnBJRCA8LSBsaXN0KGVkZ2VzX3JhdyRzbnBJRCkKICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICBlZGdlc19yYXckdGlwcy5mcm9tLmRlYyA8LSAiQUxMIgogIGVkZ2VzX3JhdyRkZXB0aCAgPC0gZWRnZXNfcmF3JG1hakNsYWRlLm5vZGUuZGVwdGgKICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogIGVkZ2VzMjwtIHJiaW5kKGVkZ2VzMiwgZWRnZXNfcmF3KQp9CnJvdy5uYW1lcyhlZGdlczIpIDwtIHNlcShucm93KGVkZ2VzMikpCmVkZ2VzMiRlZGdlSUQgPC0gc2VxKG5yb3coZWRnZXMyKSkKYGBgCgpgYGB7cn0KIyMgU2VsZWN0IGVkZ2VzIHN1cHBvcnRlZCBieSAzIG9yIG1vcmUgU05QcwppbXBfZWRnZXMyIDwtIGVkZ2VzMltlZGdlczIkTm8ub2YuU05QcyA+PTMgJiBlZGdlczIkZGVwdGggPD01ICwgXSAjMTIgaW1wb3J0YW50IGVkZ2VzCm5yb3coaW1wX2VkZ2VzMikKaW1wX2VkZ2VzMiA8LSBpbXBfZWRnZXMyW29yZGVyKGltcF9lZGdlczIkZGVwdGgpLF0KYGBgCgpgYGB7cn0KIyMgRmluZCBoYXBsb3R5cGUgYmxvY2tzCgojc2luZ2xldG9ucwpibDFfYzI8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIyX3NucHMsIDE5KSwgdHIyX3NucHNfbGlzdCwgY291bnQgPSAxOSwgaW5kcyA9IGMoMzApKQppbmRzMV9jMiA8LSBjKDMwKQpoYXBibG9jazFfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kczFfYzIsIGltcF9lZGdlczIkZGVwdGhbMV0sICJhbGwiLCBULCB0cjJfc3ViX2xpc3QpCmhhcGJsb2NrMV9jMl9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2sxX2MyKQoKYmwyX2MyPC1maW5kX2NsYWRlX2RlcHRocyhzdWJzZXRfY2xhZGVzKHRyMl9zbnBzLCAxOSksIHRyMl9zbnBzX2xpc3QsIGNvdW50ID0gMTksIGluZHMgPSBjKDEzKSkKaW5kczJfYzIgPC0gYygxMykKaGFwYmxvY2syX2MyIDwtIGZpbmRfaGFwYmxvY2tzKGluZHMyX2MyLCBpbXBfZWRnZXMyJGRlcHRoWzJdLCAiYWxsIiwgVCwgdHIyX3N1Yl9saXN0KQpoYXBibG9jazJfYzJfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrMl9jMikKCiNkb3VibGV0b25zCmJsM19jMjwtZmluZF9jbGFkZV9kZXB0aHMoc3Vic2V0X2NsYWRlcyh0cjJfc25wcywgMTgpLCB0cjJfc25wc19saXN0LCBjb3VudCA9IDE4LCBpbmRzID0gYygyMiwyMSkpCmluZHMzX2MyIDwtIGMoMjIsMjEpCmhhcGJsb2NrM19jMiA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzM19jMiwgaW1wX2VkZ2VzMiRkZXB0aFszXSwgImFsbCIsIFQsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2szX2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazNfYzIpCgpibDRfYzI8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIyX3NucHMsIDE4KSwgdHIyX3NucHNfbGlzdCwgY291bnQgPSAxOCwgaW5kcyA9IGMoMTgsMjIpKQppbmRzNF9jMiA8LSBjKDE4LDIyKQpoYXBibG9jazRfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kczRfYzIsIGltcF9lZGdlczIkZGVwdGhbNF0sICJhbGwiLCBULCB0cjJfc3ViX2xpc3QpCmhhcGJsb2NrNF9jMl9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2s0X2MyKQoKCiMjIEZpeGVkIFNOUHMKaW5kc0FMTCA8LSBsYXRpdml0dGFfaW5kaXZpZHVhbHMKdHIyX2NvdW50MjAgPC0gc3Vic2V0X2NsYWRlcyh0cjJfc25wcywgMjApCgpibDZfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzZdKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazZfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs2XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s2X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazZfYzIpCgpibDdfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzddKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazdfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs3XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s3X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazdfYzIpCgpibDhfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzhdKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazhfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs4XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s4X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazhfYzIpCgpibDlfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzldKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazlfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs5XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s5X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazlfYzIpCgojIGJsMTBfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzEwXSksYygicG9zIiwic25wSUQiKV0KIyBoYXBibG9jazEwX2MyIDwtIGZpbmRfaGFwYmxvY2tzKGluZHNBTEwsIGltcF9lZGdlczIkZGVwdGhbMTBdLCAiYWxsIiwgRiwgdHIyX3N1Yl9saXN0KQojIGhhcGJsb2NrMTBfYzJfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrMTBfYzIpCiMgCiMgYmwxMV9jMiA8LSB0cjJfY291bnQyMFt3aGljaChyb3VuZCh0cjJfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczIkZGVwdGhbMTFdKSxjKCJwb3MiLCJzbnBJRCIpXQojIGhhcGJsb2NrMTFfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFsxMV0sICJhbGwiLCBGLCB0cjJfc3ViX2xpc3QpCiMgaGFwYmxvY2sxMV9jMl9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2sxMV9jMikKIyAKIyBibDEyX2MyIDwtIHRyMl9jb3VudDIwW3doaWNoKHJvdW5kKHRyMl9jb3VudDIwJG1hakNsYWRlLm5vZGUuZGVwdGgsNCkgPT0gaW1wX2VkZ2VzMiRkZXB0aFsxMl0pLGMoInBvcyIsInNucElEIildCiMgaGFwYmxvY2sxMl9jMiA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMyJGRlcHRoWzEyXSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKIyBoYXBibG9jazEyX2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazEyX2MyKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MjAsIGVjaG89RiwgcmVzdWx0cz1GLCB3YXJuaW5nPUYsIGluY2x1ZGU9Rn0KcGFyKG1mcm93PWMoMywxKSkKCnBsb3RfYWxsX3NpdGVzKGZvY2FsX3NpdGVzLCBhcy5jaGFyYWN0ZXIoMSkpICsKICAjYXhpcyhzaWRlID0yLCB0aWNrID1ULCBhdCA9IGMoMjE6NDApLCBsYWJlbHMgPSBGKSArCiAgcG9pbnRzKHJlcCgoYmwzX2MyJHBvcyksIGVhY2ggPSAyKSwgcmVwKHdoaWNoKHNhbXBJRCRBUkd3ZWF2ZXJJRCA9PSBjKDIxLDIyKSksbnJvdyhibDNfYzIpKSAsIGNvbD0ncGluaycsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsNF9jMiRwb3MpLCBlYWNoID0gMiksIHJlcCh3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gYygxOCwyMikpLG5yb3coYmw0X2MyKSkgLCBjb2w9J3llbGxvdycsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsNl9jMiRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw2X2MyKSkgLCBjb2w9J2RhcmtibHVlJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw3X2MyJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDdfYzIpKSAsIGNvbD0nY3lhbicsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsOF9jMiRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw4X2MyKSkgLCBjb2w9J21hZ2VudGEnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDlfYzIkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsOV9jMikpICwgY29sPSdzaWVubmEnLCBwY2g9MTksIGNleCA9IDEpCgogIyBwb2ludHMoKHNpdGVzJHBvc1t3aGljaChzaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXS1wb3MwKS8xZTMsIHJlcCgxLDYpLCBwY2ggPTE3LCBjZXggPSAyKQoKCnBsb3QoaGFwYmxvY2s0X2MyJGNocm9tU3RhcnQsIGhhcGJsb2NrNF9jMiRsZW5ndGgsIHR5cGU9Im4iLCBsb2c9InkiLCB5bGltPWMoMC4wMSwxNSksIHhsYWI9IiIsIHlsYWI9IlRpbWUgKE5lKSIsIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCkpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrM19jMl9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgInllbGxvdyIsIEYpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2szX2MyX2FsbCwgInJlZCIsIFQpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgImJsdWUiLCBUKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazZfYzJfYWxsLCAiZGFya2JsdWUiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazdfYzJfYWxsLCAiY3lhbiIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrOF9jMl9hbGwsICJtYWdlbnRhIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s5X2MyX2FsbCwgInNpZW5uYSIsIEYpCgogICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMC4wMDEsNiksIHBjaCA9MTcsIGNleCA9IDIpICsKICAjIGFibGluZSh2PShzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCBsdHkgPSAyLCBsd2QgPSAwLjgpCgoKcGxvdChnZW45MjAwLCB0bXJjYTkyMDAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwxNSksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGtCKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICBsaW5lcyhnZW45MjAwX25vdCwgdG1yY2E5MjAwX25vdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQ0NDQzAwIiwgbHdkPTEpICsKICAgIGxpbmVzKGdlbjkyMDBfbGF0LCB0bXJjYTkyMDBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykKYGBgCgpgYGB7ciBmaWc2LCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NywgZWNobz1GLCByZXN1bHRzPUYsIG1lc3NhZ2U9RiwgaW5jbHVkZT1GfQpwYXIobWZyb3c9YygyLDUpKQpmb3IgKGkgaW4gYygxOjEzNykpewogIHBsb3RUcmVlKHRyMl9zbnBzJHRyZWVbaV0sIAogICAgICAgICAgI2tlZXBTZXFzID0gYXMuY2hhcmFjdGVyKGxhdGl2aXR0YV9pbmRpdmlkdWFscyksCiAgICAgICAgICBsZWFmQ29sID0gaW5kQ29sb3VyX2FyZ0lEcywgeWxhYj1pLCAKICAgICAgICAgIGxvZ1NjYWxlID0gVCwgeWxpbT1jKDFlLTIsMTUpLCB0aW1lU2NhbGUgPSAxL05lLCBjZXgubGFiID0gMS4zKQp9CmBgYAoKIyMjIyBIYXBvdHlwZSBibG9ja3MgZnJvbSBib3RoIGl0ZXJhdGlvbnMKKipGaWdTOSoqIHNob3dzIHRoZSBoYXBsb3R5cGUgYmxvY2tzIGFuZCB0aGUgU05QcyB0aGF0IHN1cHBvcnQgZWFjaCBibG9jayBmcm9tIGJvdGggaXRlcmF0aW9ucy4gCgoKYGBge3IgZmlnOSwgZmlnLndpZHRoPTE3LCBmaWcuaGVpZ2h0PTgsIGVjaG89RiwgcmVzdWx0cz1GLCBtZXNzYWdlPUZ9CiMjIHBsb3QgMiBpdGVyYXRpb25zIHNpZGUgYnkgc2lkZQpwYXIobWZyb3c9YygzLDIpLCBjZXgubGFiID0gMS40LCBjZXguYXhpcyA9IDEuMikKCnBsb3RfYWxsX3NpdGVzKGZvY2FsX3NpdGVzLCBhcy5jaGFyYWN0ZXIoMSkpICsKICBheGlzKHNpZGUgPTIsIHRpY2sgPVQsIGF0ID0gYygyMTo0MCksIGxhYmVscyA9IEYpICsKICBwb2ludHMocmVwKChibDNfYzEkcG9zKSwgZWFjaCA9IDIpLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMjEsMjIpKSxucm93KGJsM19jMSkpICwgY29sPSdwaW5rJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw0X2MxJHBvcyksIGVhY2ggPSAyKSwgcmVwKHdoaWNoKHNhbXBJRCRBUkd3ZWF2ZXJJRCA9PSBjKDE4LDIyKSksbnJvdyhibDRfYzEpKSAsIGNvbD0neWVsbG93JywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw2X2MxJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDZfYzEpKSAsIGNvbD0nZGFya2JsdWUnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDdfYzEkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsN19jMSkpICwgY29sPSdjeWFuJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw4X2MxJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDhfYzEpKSAsIGNvbD0nbWFnZW50YScsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsOV9jMSRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw5X2MxKSkgLCBjb2w9J3NpZW5uYScsIHBjaD0xOSwgY2V4ID0gMSkgIysKCiAjIHBvaW50cygoc2l0ZXMkcG9zW3doaWNoKHNpdGVzJHNucElEICVpbiUgdHJlZXNfdG9fcGxvdCldLXBvczApLzFlMywgcmVwKDEsNiksIHBjaCA9MTcsIGNleCA9IDIpCgpwbG90X2FsbF9zaXRlcyhmb2NhbF9zaXRlcywgYXMuY2hhcmFjdGVyKDEpKSArCiAgI2F4aXMoc2lkZSA9MiwgdGljayA9VCwgYXQgPSBjKDIxOjQwKSwgbGFiZWxzID0gRikgKwogIHBvaW50cyhyZXAoKGJsM19jMiRwb3MpLCBlYWNoID0gMiksIHJlcCh3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gYygyMSwyMikpLG5yb3coYmwzX2MyKSkgLCBjb2w9J3BpbmsnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDRfYzIkcG9zKSwgZWFjaCA9IDIpLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMTgsMjIpKSxucm93KGJsNF9jMikpICwgY29sPSd5ZWxsb3cnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDZfYzIkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsNl9jMikpICwgY29sPSdkYXJrYmx1ZScsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsN19jMiRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw3X2MyKSkgLCBjb2w9J2N5YW4nLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDhfYzIkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsOF9jMikpICwgY29sPSdtYWdlbnRhJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw5X2MyJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDlfYzIpKSAsIGNvbD0nc2llbm5hJywgcGNoPTE5LCBjZXggPSAxKQoKICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMSw2KSwgcGNoID0xNywgY2V4ID0gMikKCnBsb3QoaGFwYmxvY2sxX2MxJGNocm9tU3RhcnQsIGhhcGJsb2NrMV9jMSRsZW5ndGgsIHR5cGU9Im4iLCBsb2c9InkiLCB5bGltPWMoMC4wMSwxNSksIHhsYWI9IiIsIHlsYWI9IlRpbWUgKE5lKSIsIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCkpICsKICAjcGxvdF9oYXBibG9jayhoYXBibG9jazJfYzFfYWxsLCAicGluayIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrM19jMV9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MxX2FsbCwgInllbGxvdyIsIEYpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s1X2MxX2FsbCwgImJsdWUiLCBUKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazZfYzFfYWxsLCAiZGFya2JsdWUiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazdfYzFfYWxsLCAiY3lhbiIsIEYpICMrCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazhfYzFfYWxsLCAibWFnZW50YSIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrOV9jMV9hbGwsICJzaWVubmEiLCBGKQogICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMC4wMDEsNiksIHBjaCA9MTcsIGNleCA9IDIpICsKICAjIGFibGluZSh2PShzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCBsdHkgPSAyLCBsd2QgPSAwLjgpCgoKCnBsb3QoaGFwYmxvY2s0X2MyJGNocm9tU3RhcnQsIGhhcGJsb2NrNF9jMiRsZW5ndGgsIHR5cGU9Im4iLCBsb2c9InkiLCB5bGltPWMoMC4wMSwxNSksIHhsYWI9IiIsIHlsYWI9IlRpbWUgKE5lKSIsIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCkpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrM19jMl9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgInllbGxvdyIsIEYpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2szX2MyX2FsbCwgInJlZCIsIFQpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgImJsdWUiLCBUKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazZfYzJfYWxsLCAiZGFya2JsdWUiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazdfYzJfYWxsLCAiY3lhbiIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrOF9jMl9hbGwsICJtYWdlbnRhIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s5X2MyX2FsbCwgInNpZW5uYSIsIEYpCgogICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMC4wMDEsNiksIHBjaCA9MTcsIGNleCA9IDIpICsKICAjIGFibGluZSh2PShzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCBsdHkgPSAyLCBsd2QgPSAwLjgpCgpwbG90KGdlbjgyNTAsIHRtcmNhODI1MCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0ncycsIGNvbCA9ICJibGFjayIsIGx3ZD0wLjgsIGxvZz0ieSIsIAogICAgIHlsaW09YygxZS0yLDE1KSwgeGxpbT1jKDEzODYwMDAsIDEzODkwMDApLCB4bGFiID0gIlBvc2l0aW9uIChrQikiLCB5bGFiID0gIlRNUkNBIChOZSkiKSArCiAgbGluZXMoZ2VuODI1MF9ub3QsIHRtcmNhODI1MF9ub3QkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9InMiLCBjb2wgPSAiI0NDQ0MwMCIsIGx3ZD0xKSArCiAgICBsaW5lcyhnZW44MjUwX2xhdCwgdG1yY2E4MjUwX2xhdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQzAwQzI4IiwgbHdkPTMpCgoKcGxvdChnZW45MjAwLCB0bXJjYTkyMDAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwxNSksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGtCKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICBsaW5lcyhnZW45MjAwX25vdCwgdG1yY2E5MjAwX25vdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQ0NDQzAwIiwgbHdkPTEpICsKICAgIGxpbmVzKGdlbjkyMDBfbGF0LCB0bXJjYTkyMDBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykKYGBgCgo=