Data preparation

Analysis is conducted on sample and comparative data where contaminants have been removed (see authentication report).

The data frame with species counts is converted to the appropriate format with one sample per row, and one column per taxon

Metadata for the included samples are prepared,

and for samples from this study only.

Data are converted to a matrix in 04-diversity.R for further analysis with the mixOmics and vegan R packages.

Diversity

Alpha

Experiment duration

Shannon index across the course of the experiment.

Not really enough samples to make any relevant interpretations.

Days were grouped for increased sample sizes.

  • inoc = days 0,3,5
  • treatment = days 7,9,12,15,18,21
  • final = day 24

Slight decrease in Shannon diversity over the course of the experiment.

Sample types

Shannon index compared between sample types.

Higher overall alpha diversity in the comparative samples than the artificial samples, both medium and final calculus product. Saliva samples from this study (NA) had a lower mean Shannon index than saliva samples from other studies (NA).

Shannon vegan::diversity(species_otu_matrix) and unbiased Simpson simpson.unb(species_otu_matrix,inverse = T).

Beta

Sparse principal components analysis (sPCA) was conducted on the experimental samples only using the mixOmics R package, and a separate analysis was conducted on the experimental and oral reference samples. Prior to sPCA, the sample counts underwent a centered log-ratio (CLR) transformation with +1 offset to avoid taking the log of zero.

Experiment samples only

PC1 discriminates the saliva samples and early medium samples from the later medium and calculus samples, while PC2 mainly discriminates calculus from medium. Medium and final product are distinct from the saliva samples used for inoculation.

PC1 sees mostly negative loadings on aerobes and facultative anaerobes, while positive loadings are mostly anaerobes. PC2 is slightly more balanced.

Artificial calculus and comparative oral sources

Scree plot of components.

sPCA plots of PC1 on PC2 and PC1 on PC3.

PC1 separates all artificial samples from the reference samples, while PC2 separates some modern calculus samples from other oral reference samples, as well as separating the artificial calculus from this study from the comparative in vitro biofilms. PC3 separates some modern calculus samples from other comparative oral samples.

Main drivers of discrimination. Top loading vectors for PC1 and PC2.

Component 1 loadings are a mix of species of all oxygen tolerance, and is the only component with high loadings from aerobes. All aerobes have a negative loading on component 1. Component 2 contains only anaerobes and facultative anaerobes, while component 3 contains only anaerobes in the top 15 loadings.

Time-lag plot of Bray-Curtis data (under construction)

Discussion

Main takeaway is the loss of diversity across the experiment and compared to reference samples. The donated saliva for the experiment had a lower diversity than the reference saliva samples, and may have contributed to a lower diversity in experiment samples. Community profile of artificial calculus differs from the oral reference samples, while modern calculus mostly resembles oral reference samples. The main difference between artificial and reference samples seems to be a lack of aerobes in artificial samples and a dominance by Enterococcus spp.

LS0tCnRpdGxlOiAiUENBIGFuZCBkaXZlcnNpdHkgYW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojbGlicmFyeSh2ZWdhbikKbGlicmFyeShtaXhPbWljcykKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGhlcmUpCgpsb2FkKGhlcmUoIjA1LXJlc3VsdHMvc3BjYV9ieW9jLnJkYSIpKQpsb2FkKGhlcmUoIjA1LXJlc3VsdHMvc3BjYV9zcGVjaWVzLnJkYSIpKQoKYWxwaGFfZGl2IDwtIHJlYWRfdHN2KGhlcmUoIjA1LXJlc3VsdHMvYWxwaGEtZGl2ZXJzaXR5LnRzdiIpKQptZXRhZGF0YSA8LSByZWFkX3RzdihoZXJlKCIwMS1kb2N1bWVudGF0aW9uL21ldGFkYXRhLnRzdiIpKQphbmFseXNpc19tZXRhZGF0YSA8LSByZWFkX3RzdihoZXJlKCIwMS1kb2N1bWVudGF0aW9uL2FuYWx5c2lzLW1ldGFkYXRhLnRzdiIpKQpleHBlcmltZW50X21ldGFkYXRhIDwtIHJlYWRfdHN2KGhlcmUoIjAxLWRvY3VtZW50YXRpb24vZXhwZXJpbWVudC1tZXRhZGF0YS50c3YiKSkgJT4lCiAgZmlsdGVyKGAjU2FtcGxlSURgICVpbiUgYW5hbHlzaXNfbWV0YWRhdGEkYCNTYW1wbGVJRGApCmJhY19wcm9wZXJ0aWVzIDwtIHJlYWRyOjpyZWFkX3RzdihoZXJlKCIwMS1kb2N1bWVudGF0aW9uL3NwZWNpZXMtcHJvcGVydGllcy50c3YiKSkKCnRyZWF0bWVudF9jb2xvdXJzIDwtIHZpcmlkaXNMaXRlOjppbmZlcm5vKG4gPSBsZW5ndGgodW5pcXVlKGV4cGVyaW1lbnRfbWV0YWRhdGEkdHJlYXRtZW50KSkpICMgZGVmaW5lIHBhbGxldHRlIGFuZCBudW1iZXIgb2YgY29sb3VycwplbnZfY29sb3VycyA8LSB2aXJpZGlzTGl0ZTo6bWFnbWEobiA9IGxlbmd0aCh1bmlxdWUoYW5hbHlzaXNfbWV0YWRhdGEkRW52KSkpICMgZGVmaW5lIHBhbGxldHRlIGFuZCBudW1iZXIgb2YgY29sb3VycwoKYWxwaGFfZGl2X2xvbmcgPC0gYWxwaGFfZGl2ICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gd2hlcmUoaXMubnVtZXJpYyksIG5hbWVzX3RvID0gImluZGV4IikgJT4lCiAgbGVmdF9qb2luKGRuYV9tZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKSAlPiUKICBsZWZ0X2pvaW4oZG5hX2V4cGVyaW1lbnRfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICIjU2FtcGxlSUQiLCAiRW52IikpICU+JQogIG11dGF0ZShkYXlfZ3JvdXBlZCA9IGNhc2Vfd2hlbiggIyBncm91cCBkYXlzIHRvIGluY3JlYXNlIHNhbXBsZSBzaXplCiAgICBkYXkgPCA2IH4gImlub2MiLAogICAgZGF5ID4gNiAmIGRheSA8IDI0IH4gInRyZWF0bSIsCiAgICBkYXkgPT0gMjQgfiAiZmluYWwiKSwKICAgIGRheV9ncm91cGVkID0gZmFjdG9yKGRheV9ncm91cGVkLCBsZXZlbHMgPSBjKCJpbm9jIiwgInRyZWF0bSIsICJmaW5hbCIpKQogICAgKQoKZXhwZXJpbWVudF9jb2xvdXJzIDwtIGV4cGVyaW1lbnRfbWV0YWRhdGEgJT4lCiAgYXJyYW5nZShkZXNjKGRheSkpICU+JSAKICBtdXRhdGUodHJlYXRfY29sID0gY2FzZV93aGVuKAogICAgICAgICAgIHRyZWF0bWVudCA9PSAicG90YXRvIiB+IHRyZWF0bWVudF9jb2xvdXJzWzFdLAogICAgICAgICAgIHRyZWF0bWVudCA9PSAid2hlYXQiIH4gdHJlYXRtZW50X2NvbG91cnNbMl0sCiAgICAgICAgICAgdHJlYXRtZW50ID09ICJtaXgiIH4gdHJlYXRtZW50X2NvbG91cnNbM10sCiAgICAgICAgICAgdHJlYXRtZW50ID09ICJjb250cm9sIiB+IHRyZWF0bWVudF9jb2xvdXJzWzRdLAogICAgICAgICAgIGlzLm5hKHRyZWF0bWVudCkgfiAiZ3JleSIpLAogICAgICAgICBlbnZfY29sID0gY2FzZV93aGVuKAogICAgICAgICAgIEVudiA9PSAic2FsaXZhIiB+IGVudl9jb2xvdXJzWzVdLAogICAgICAgICAgIEVudiA9PSAiYnlvY19jYWxjdWx1cyIgfiBlbnZfY29sb3Vyc1sxXSwKICAgICAgICAgICBFbnYgPT0gIm1lZGl1bSIgfiBlbnZfY29sb3Vyc1s4XQogICAgICAgICApKQphbmFseXNpc19jb2xvdXJzIDwtIGFuYWx5c2lzX21ldGFkYXRhICU+JQogIG11dGF0ZShlbnZfY29sID0gY2FzZV93aGVuKAogICAgRW52ID09ICJzYWxpdmEiIH4gZW52X2NvbG91cnNbNV0sCiAgICBFbnYgPT0gImJ5b2NfY2FsY3VsdXMiIH4gZW52X2NvbG91cnNbMV0sCiAgICBFbnYgPT0gIm1lZGl1bSIgfiBlbnZfY29sb3Vyc1s4XSwKICAgIEVudiA9PSAiYnVjY2FsX211Y29zYSIgfiBlbnZfY29sb3Vyc1s2XSwKICAgIEVudiA9PSAic3ViZ2luZ2l2YWxfcGxhcXVlIiB+IGVudl9jb2xvdXJzWzJdLAogICAgRW52ID09ICJzdXByYWdpbmdpdmFsX3BsYXF1ZSIgfiBlbnZfY29sb3Vyc1szXSwKICAgIEVudiA9PSAibW9kZXJuX2NhbGN1bHVzIiB+IGVudl9jb2xvdXJzWzRdCiAgICAgICAgICkpCgpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKQW5hbHlzaXMgaXMgY29uZHVjdGVkIG9uIHNhbXBsZSBhbmQgY29tcGFyYXRpdmUgZGF0YSB3aGVyZSBjb250YW1pbmFudHMgaGF2ZQpiZWVuIHJlbW92ZWQgKHNlZSBbYXV0aGVudGljYXRpb24gcmVwb3J0XSguL2F1dGhlbnRpY2F0aW9uLlJtZCkpLgoKVGhlIGRhdGEgZnJhbWUgd2l0aCBzcGVjaWVzIGNvdW50cyBpcyBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCB3aXRoIG9uZQpzYW1wbGUgcGVyIHJvdywgYW5kIG9uZSBjb2x1bW4gcGVyIHRheG9uCgpgYGB7ciBjb252ZXJ0LXRhYmxlfQojIHNwZWNpZXNfb3R1X3RhYmxlIDwtIG90dV90YWJsZSAlPiUKIyAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiI09UVSBJRCIpICU+JQojICAgdCgpICU+JQojICAgYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpCmBgYAoKTWV0YWRhdGEgZm9yIHRoZSBpbmNsdWRlZCBzYW1wbGVzIGFyZSBwcmVwYXJlZCwKCmBgYHtyIG1ldGFkYXRhfQpjb21wX21ldGFkYXRhIDwtIGFuYWx5c2lzX21ldGFkYXRhICU+JQogIGZpbHRlcigKICAgIEVudiAhPSAibWVkaXVtIiwKICAgIEVudiAhPSAic2VkaW1lbnQiLCAKICAgIEVudiAhPSAic2tpbiIsICAKICAgIEVudiAhPSAic3Rvb2wiLCAKICAgIEVudiAhPSAiaW5kb29yX2FpciIKICApCmBgYAoKYW5kIGZvciBzYW1wbGVzIGZyb20gdGhpcyBzdHVkeSBvbmx5LgoKYGBge3J9CnNhbXBsZV9tZXRhZGF0YSA8LSBleHBlcmltZW50X21ldGFkYXRhICU+JQogIGZpbHRlcihgI1NhbXBsZUlEYCAlaW4lIGFuYWx5c2lzX21ldGFkYXRhJGAjU2FtcGxlSURgKQpgYGAKCgpEYXRhIGFyZSBjb252ZXJ0ZWQgdG8gYSBtYXRyaXggaW4gWyowNC1kaXZlcnNpdHkuUipdKC4uLzAyLXNjcmlwdHMvMDQtZGl2ZXJzaXR5LlIpCmZvciBmdXJ0aGVyIGFuYWx5c2lzIHdpdGggdGhlClsqKm1peE9taWNzKipdKGh0dHA6Ly9taXhvbWljcy5vcmcvKSBhbmQKWyoqdmVnYW4qKl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3ZlZ2FuL2luZGV4Lmh0bWwpClIgcGFja2FnZXMuCgoKIyBEaXZlcnNpdHkKCiMjIEFscGhhCgojIyMgRXhwZXJpbWVudCBkdXJhdGlvbgoKU2hhbm5vbiBpbmRleCBhY3Jvc3MgdGhlIGNvdXJzZSBvZiB0aGUgZXhwZXJpbWVudC4KCjwhLS0gbmVlZCB0byBjb21iaW5lIGRheXMgaW50byBsYXJnZXIgZ3JvdXBzIC0tPgoKYGBge3J9CiMgcGxvdCBzaGFubm9uIGluZGV4IGFjcm9zcyBzYW1wbGVzCmFscGhhX2RpdiAlPiUgCiAgI2FzX3RpYmJsZShyb3duYW1lcyA9ICJzYW1wbGUiKSAlPiUKICAjcmVuYW1lKCIjU2FtcGxlSUQiID0gc2FtcGxlKSAlPiUgCiAgbGVmdF9qb2luKGV4cGVyaW1lbnRfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICIjU2FtcGxlSUQiKSkgJT4lIAogIG11dGF0ZShkYXkgPSBhc19mYWN0b3IoZGF5KSkgJT4lIAogIGZpbHRlcighaXMubmEoZGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGRheSwgeSA9IHNoYW5ub24sIGNvbCA9IGRheSkpICsKICAgIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91ciA9IE5BKSArCiAgICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpOb3QgcmVhbGx5IGVub3VnaCBzYW1wbGVzIHRvIG1ha2UgYW55IHJlbGV2YW50IGludGVycHJldGF0aW9ucy4KCkRheXMgd2VyZSBncm91cGVkIGZvciBpbmNyZWFzZWQgc2FtcGxlIHNpemVzLgoKLSBpbm9jID0gZGF5cyAwLDMsNQotIHRyZWF0bWVudCA9IGRheXMgNyw5LDEyLDE1LDE4LDIxCi0gZmluYWwgPSBkYXkgMjQKCmBgYHtyfQpleHBlcmltZW50X21ldGFkYXRhX2V4dCA8LSBleHBlcmltZW50X21ldGFkYXRhICU+JQogIG11dGF0ZShkYXlfZ3JvdXAgPSBjYXNlX3doZW4oZGF5IDwgNiB+ICJpbm9jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheSA+IDYgJiBkYXkgPCAyNCB+ICJ0cmVhdG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID09IDI0IH4gImZpbmFsIikKICAgICAgICAgKQoKIyBhbHBoYV9kaXYgJT4lIAojICAgI2FzX3RpYmJsZShyb3duYW1lcyA9ICJzYW1wbGUiKSAlPiUKIyAgICNyZW5hbWUoIiNTYW1wbGVJRCIgPSBzYW1wbGUpICU+JSAKIyAgIGxlZnRfam9pbihleHBlcmltZW50X21ldGFkYXRhX2V4dCwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKSAlPiUgCiMgICBtdXRhdGUoZGF5ID0gYXNfZmFjdG9yKGRheSkpICU+JSAKIyAgIGZpbHRlcighaXMubmEoZGF5KSkgJT4lIAojICAgZ2dwbG90KGFlcyh4ID0gZGF5X2dyb3VwLCB5ID0gc2hhbm5vbiwgY29sID0gZGF5X2dyb3VwKSkgKwojICAgICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXIgPSBOQSkgKwojICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwojICAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJEIikgKwojICAgICB0aGVtZV9taW5pbWFsKCkgKwojICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiMgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJpbm9jIiwgInRyZWF0bSIsICJmaW5hbCIpKQoKYWxwaGFfZGl2X2xvbmcgJT4lIAogICNhc190aWJibGUocm93bmFtZXMgPSAic2FtcGxlIikgJT4lCiAgI3JlbmFtZSgiI1NhbXBsZUlEIiA9IHNhbXBsZSkgJT4lIAogICNsZWZ0X2pvaW4oZXhwZXJpbWVudF9tZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKSAjJT4lIAogIG11dGF0ZShkYXkgPSBhc19mYWN0b3IoZGF5KSkgJT4lIAogIGZpbHRlcighaXMubmEoZGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGRheV9ncm91cGVkLCB5ID0gdmFsdWUsIGNvbCA9IGRheV9ncm91cGVkKSkgKwogICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gTkEpICsKICAgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArCiAgICBmYWNldF93cmFwKH4gaW5kZXgsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJEIikgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgIysKICAgICNzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoImlub2MiLCAidHJlYXRtIiwgImZpbmFsIikpCgpgYGAKClNsaWdodCBkZWNyZWFzZSBpbiBTaGFubm9uIGRpdmVyc2l0eSBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIGV4cGVyaW1lbnQuCgojIyMgU2FtcGxlIHR5cGVzCgpTaGFubm9uIGluZGV4IGNvbXBhcmVkIGJldHdlZW4gc2FtcGxlIHR5cGVzLgoKYGBge3J9CmFscGhhX2RpdiAlPiUKICAjYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpICU+JQogICNyZW5hbWUoIiNTYW1wbGVJRCIgPSBzYW1wbGUpICU+JSAKICBsZWZ0X2pvaW4oYW5hbHlzaXNfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICIjU2FtcGxlSUQiKSkgJT4lIAogIGZpbHRlcihFbnYgIT0gInNlZGltZW50IiwgCiAgICAgICAgIEVudiAhPSAic2tpbiIsICAKICAgICAgICAgRW52ICE9ICJzdG9vbCIsIAogICAgICAgICBFbnYgIT0gImluZG9vcl9haXIiKSAlPiUKICByZW1vdmVfbWlzc2luZygpICU+JQogIGdncGxvdChhZXMoeCA9IEVudiwgeSA9IHNpbXBfdW5iLCBjb2wgPSBFbnYpKSArCiAgICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXIgPSBOQSkgKwogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEsIGFuZ2xlID0gNDUpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJDIikKYGBgCgpIaWdoZXIgb3ZlcmFsbCBhbHBoYSBkaXZlcnNpdHkgaW4gdGhlIGNvbXBhcmF0aXZlIHNhbXBsZXMgdGhhbiB0aGUgYXJ0aWZpY2lhbApzYW1wbGVzLCBib3RoIG1lZGl1bSBhbmQgZmluYWwgY2FsY3VsdXMgcHJvZHVjdC4gU2FsaXZhIHNhbXBsZXMgZnJvbSB0aGlzIHN0dWR5CihgciBtZWFuKGFscGhhX2RpdiRzaGFubm9uW2MoIlNZTjAwMS5BMDEwMSIsIlNZTjAwMi5BMDEwMSIsICJTWU4wMDMuQTAxMDEiKV0pYCkKaGFkIGEgbG93ZXIgbWVhbiBTaGFubm9uIGluZGV4IHRoYW4gc2FsaXZhIHNhbXBsZXMgZnJvbSBvdGhlciBzdHVkaWVzCihgciBtZWFuKGFscGhhX2RpdiRzaGFubm9uW2MoIlNSUzAxOTEyMCIsICJTUlMwMTQ0NjgiLCAiU1JTMDE1MDU1IiwgIlNSUzAxNDY5MiIsICJTUlMwMTM5NDIiKV0pYCkuCgpTaGFubm9uIGB2ZWdhbjo6ZGl2ZXJzaXR5KHNwZWNpZXNfb3R1X21hdHJpeClgIGFuZCB1bmJpYXNlZCBTaW1wc29uCmBzaW1wc29uLnVuYihzcGVjaWVzX290dV9tYXRyaXgsaW52ZXJzZSA9IFQpYC4KCmBgYHtyfQphbHBoYV9kaXYgJT4lCiAgbGVmdF9qb2luKGFuYWx5c2lzX21ldGFkYXRhLCBieSA9IGMoInNhbXBsZSIgPSAiI1NhbXBsZUlEIikpICU+JSAKICBmaWx0ZXIoRW52ICE9ICJzZWRpbWVudCIsIAogICAgICAgICBFbnYgIT0gInNraW4iLCAgCiAgICAgICAgIEVudiAhPSAic3Rvb2wiLCAKICAgICAgICAgRW52ICE9ICJpbmRvb3JfYWlyIikgJT4lCiAgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzaGFubm9uLCB5ID0gc2ltcF91bmIsIGNvbCA9IEVudikpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZCgpCmBgYAoKIyMgQmV0YQoKU3BhcnNlIHByaW5jaXBhbCBjb21wb25lbnRzIGFuYWx5c2lzIChzUENBKSB3YXMgY29uZHVjdGVkIG9uIHRoZSBleHBlcmltZW50YWwKc2FtcGxlcyBvbmx5IHVzaW5nIHRoZSAqKm1peE9taWNzKiogUiBwYWNrYWdlLCBhbmQgYSBzZXBhcmF0ZSBhbmFseXNpcyB3YXMKY29uZHVjdGVkIG9uIHRoZSBleHBlcmltZW50YWwgYW5kIG9yYWwgcmVmZXJlbmNlIHNhbXBsZXMuIFByaW9yIHRvIHNQQ0EsIHRoZQpzYW1wbGUgY291bnRzIHVuZGVyd2VudCBhIGNlbnRlcmVkIGxvZy1yYXRpbyAoQ0xSKSB0cmFuc2Zvcm1hdGlvbiB3aXRoICsxIG9mZnNldAp0byBhdm9pZCB0YWtpbmcgdGhlIGxvZyBvZiB6ZXJvLgoKIyMjIEV4cGVyaW1lbnQgc2FtcGxlcyBvbmx5CgpgYGB7cn0KI2Nscl9ieW9jIDwtIGxvZ3JhdGlvLnRyYW5zZm8oYnlvY19vdHVfbWF0cml4LCAiQ0xSIiwgMSkKYGBgCgpgYGB7cn0KI3NwY2FfYnlvYyA8LSBzcGNhKGNscl9ieW9jLCBuY29tcCA9IDEwLCBzY2FsZSA9IEYpCmJ5b2NfZXhwbGFpbl92YXIgPC0gc3BjYV9ieW9jJHByb3BfZXhwbF92YXIkWApgYGAKCmBgYHtyfQpwbG90KHNwY2FfYnlvYywgdHlwZSA9ICJsIikKYGBgCgoKYGBge3J9CmJ5b2NfcHJpbmNvbXAgPC0gc3BjYV9ieW9jJHggJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpICU+JQogIGxlZnRfam9pbihleHBlcmltZW50X21ldGFkYXRhLCBieSA9IGMoInNhbXBsZSIgPSAiI1NhbXBsZUlEIikpCmJ5b2NfcHJpbmNvbXAgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gUEMxLCB5ID0gUEMyLCAKICAgICAgY29sID0gYXNfZmFjdG9yKGRheSksCiAgICAgIHNoYXBlID0gRW52CiAgICAgKQogICAgKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgICBsYWJzKAogICAgICB4ID0gcGFzdGUoCiAgICAgICAgIlBDMSIsIAogICAgICAgIHNjYWxlczo6cGVyY2VudChieW9jX2V4cGxhaW5fdmFyW1sxXV0sIGFjY3VyYWN5ID0gMC4xKSksCiAgICAgIHkgPSBwYXN0ZSgKICAgICAgICAiUEMyIiwgCiAgICAgICAgc2NhbGVzOjpwZXJjZW50KGJ5b2NfZXhwbGFpbl92YXJbWzJdXSwgYWNjdXJhY3kgPSAwLjEpKSwKICAgICAgY29sID0gIlNhbXBsaW5nIGRheSIsCiAgICAgIHNoYXBlID0gIlNhbXBsZSB0eXBlIgogICAgICApICsKICAgIHRoZW1lX2J3KCkgKwogICAgc2NhbGVfc2hhcGVfZGlzY3JldGUoc29saWQgPSBGKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkKYGBgCgpQQzEgZGlzY3JpbWluYXRlcyB0aGUgc2FsaXZhIHNhbXBsZXMgYW5kIGVhcmx5IG1lZGl1bSBzYW1wbGVzIGZyb20gdGhlIGxhdGVyIG1lZGl1bQphbmQgY2FsY3VsdXMgc2FtcGxlcywgd2hpbGUgUEMyIG1haW5seSBkaXNjcmltaW5hdGVzIGNhbGN1bHVzIGZyb20gbWVkaXVtLgpNZWRpdW0gYW5kIGZpbmFsIHByb2R1Y3QgYXJlIGRpc3RpbmN0IGZyb20gdGhlIHNhbGl2YSBzYW1wbGVzIHVzZWQgZm9yIGlub2N1bGF0aW9uLgoKYGBge3J9CmV4cF9wY2FfbG9hZGluZ3MgPC0gc3BjYV9ieW9jJGxvYWRpbmdzJFggJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInNwZWNpZXMiKSAlPiUKICBsZWZ0X2pvaW4oYmFjX3Byb3BlcnRpZXMsIGJ5ID0gInNwZWNpZXMiKSAlPiUgCiAgZHBseXI6OnNlbGVjdChzcGVjaWVzLFBDMSxQQzIsIGBPeHlnZW4gdG9sZXJhbmNlYCkgJT4lCiAgYXJyYW5nZShkZXNjKGFicyhQQzEpKSkKZXhwX3BjYV9sb2FkaW5ncwoKbG9hZGluZ190aGVtZSA8LSAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKAogICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRpY2tzLnguYm90dG9tID0gZWxlbWVudF9saW5lKHNpemUgPSAxKSwKICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoKSwKICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAtMC4yKSwKICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoKSwKICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIKICAgICAgICAgICkKbWluX1BDMSA8LSBtaW4oZXhwX3BjYV9sb2FkaW5ncyRQQzEpCm1pbl9QQzIgPC0gbWluKGV4cF9wY2FfbG9hZGluZ3MkUEMyKQptYXhfUEMxIDwtIG1heChleHBfcGNhX2xvYWRpbmdzJFBDMSkKbWF4X1BDMiA8LSBtYXgoZXhwX3BjYV9sb2FkaW5ncyRQQzIpCmBgYAoKYGBge3J9CmV4cF9wY2FfbG9hZGluZ3MgJT4lCiAgYXJyYW5nZShkZXNjKFBDMSkpICU+JQogIG11dGF0ZShzcGVjaWVzID0gZmN0X3Jlb3JkZXIoc3BlY2llcywgZGVzYyhQQzEpKSkgJT4lCiAgIyB0b3AgMjAgcG9zaXRpdmUgYW5kIHRvcCAyMCBuZWdhdGl2ZSBsb2FkaW5ncwogIHNsaWNlKGMoCiAgICAxOjIwLCAKICAgIHNlcShmcm9tID0gbnJvdyhleHBfcGNhX2xvYWRpbmdzKS0xOSwgdG8gPSBucm93KGV4cF9wY2FfbG9hZGluZ3MpKQogICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUEMxLCB5ID0gc3BlY2llcywgZmlsbCA9IGBPeHlnZW4gdG9sZXJhbmNlYCkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluX1BDMSxtYXhfUEMxKSkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IHZpcmlkaXNMaXRlOjp0dXJibyhuID0gbGVuZ3RoKGxldmVscyhhcy5mYWN0b3IoYmFjX3Byb3BlcnRpZXMkYE94eWdlbiB0b2xlcmFuY2VgKSkpKSkgKwogICAgbGFicyh0aXRsZSA9ICJjb21wb25lbnQgMSIsIHggPSAiIikgKwogICAgbG9hZGluZ190aGVtZQoKZXhwX3BjYV9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGRlc2MoUEMyKSkgJT4lCiAgbXV0YXRlKHNwZWNpZXMgPSBmY3RfcmVvcmRlcihzcGVjaWVzLCBkZXNjKFBDMikpKSAlPiUKICBzbGljZShjKAogICAgMToyMCwKICAgIHNlcShmcm9tID0gbnJvdyhleHBfcGNhX2xvYWRpbmdzKS0xOSwgdG8gPSBucm93KGV4cF9wY2FfbG9hZGluZ3MpKQogICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUEMyLCB5ID0gc3BlY2llcywgZmlsbCA9IGBPeHlnZW4gdG9sZXJhbmNlYCkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuMTgsMC4xKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgICB2YWx1ZXMgPSB2aXJpZGlzTGl0ZTo6dHVyYm8oCiAgICAgICAgbiA9IGxlbmd0aChsZXZlbHMoYXMuZmFjdG9yKGJhY19wcm9wZXJ0aWVzJGBPeHlnZW4gdG9sZXJhbmNlYCkpKQogICAgICAgICkKICAgICAgKSArCiAgICBsYWJzKHRpdGxlID0gImNvbXBvbmVudCAyIiwgeCA9ICIiKSArCiAgICBsb2FkaW5nX3RoZW1lCgoKI3Bsb3RMb2FkaW5ncyhzcGNhX2J5b2MsIG5kaXNwbGF5ID0gMTUpCiNwbG90TG9hZGluZ3Moc3BjYV9ieW9jLCAyLCBuZGlzcGxheSA9IDE1KQpgYGAKClBDMSBzZWVzIG1vc3RseSBuZWdhdGl2ZSBsb2FkaW5ncyBvbiBhZXJvYmVzIGFuZCBmYWN1bHRhdGl2ZSBhbmFlcm9iZXMsIHdoaWxlCnBvc2l0aXZlIGxvYWRpbmdzIGFyZSBtb3N0bHkgYW5hZXJvYmVzLiBQQzIgaXMgc2xpZ2h0bHkgbW9yZSBiYWxhbmNlZC4KCiMjIyBBcnRpZmljaWFsIGNhbGN1bHVzIGFuZCBjb21wYXJhdGl2ZSBvcmFsIHNvdXJjZXMKClNjcmVlIHBsb3Qgb2YgY29tcG9uZW50cy4KCmBgYHtyfQpwbG90KHNwY2Ffc3BlY2llcywgdHlwZSA9ICJsIikKYGBgCgpzUENBIHBsb3RzIG9mIFBDMSBvbiBQQzIgYW5kIFBDMSBvbiBQQzMuCgpgYGB7cn0Kc3BjYV9jb21wYXIgPC0gc3BjYV9zcGVjaWVzJHggJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpICU+JQogIGxlZnRfam9pbihtZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKQpjb21wYXJfZXhwbGFpbl92YXIgPC0gc3BjYV9zcGVjaWVzJHByb3BfZXhwbF92YXIkWAoKc3BjYV9jb21wYXIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUEMxLCB5ID0gUEMyLCBjb2wgPSBFbnYsIHNoYXBlID0gRW52KSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuMikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuMikgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHggPSBwYXN0ZSgKICAgICAgIlBDMSIsIHNjYWxlczo6cGVyY2VudChjb21wYXJfZXhwbGFpbl92YXJbWzFdXSwgYWNjdXJhY3kgPSAwLjEpCiAgICAgICksCiAgICAgIHkgPSBwYXN0ZSgKICAgICAgICAiUEMyIiwgc2NhbGVzOjpwZXJjZW50KGNvbXBhcl9leHBsYWluX3ZhcltbMl1dLCBhY2N1cmFjeSA9IDAuMSkKICAgICAgKQogICAgKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChvcHRpb24gPSAiQyIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMTpsZW5ndGgobGV2ZWxzKGFzLmZhY3RvcihzcGNhX2NvbXBhciRFbnYpKSkpCgpzcGNhX2NvbXBhciAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQQzEsIHkgPSBQQzMsIGNvbCA9IEVudiwgc2hhcGUgPSBFbnYpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBzaXplID0gMC4yKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBzaXplID0gMC4yKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnMoeCA9IHBhc3RlKAogICAgICAiUEMxIiwgc2NhbGVzOjpwZXJjZW50KGNvbXBhcl9leHBsYWluX3ZhcltbMV1dLCBhY2N1cmFjeSA9IDAuMSkKICAgICAgKSwKICAgICAgeSA9IHBhc3RlKAogICAgICAgICJQQzMiLCBzY2FsZXM6OnBlcmNlbnQoY29tcGFyX2V4cGxhaW5fdmFyW1szXV0sIGFjY3VyYWN5ID0gMC4xKQogICAgICApCiAgICApICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJDIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAxOmxlbmd0aChsZXZlbHMoYXMuZmFjdG9yKHNwY2FfY29tcGFyJEVudikpKSkgKwogIGxhYnMoY29sID0gIkVudiIsIHNoYXBlID0gIkVudiIpCmBgYAoKUEMxIHNlcGFyYXRlcyBhbGwgYXJ0aWZpY2lhbCBzYW1wbGVzIGZyb20gdGhlIHJlZmVyZW5jZSBzYW1wbGVzLCB3aGlsZQpQQzIgc2VwYXJhdGVzIHNvbWUgbW9kZXJuIGNhbGN1bHVzIHNhbXBsZXMgZnJvbSBvdGhlciBvcmFsIHJlZmVyZW5jZSBzYW1wbGVzLAphcyB3ZWxsIGFzIHNlcGFyYXRpbmcgdGhlIGFydGlmaWNpYWwgY2FsY3VsdXMgZnJvbSB0aGlzIHN0dWR5IGZyb20gdGhlIGNvbXBhcmF0aXZlCippbiB2aXRybyogYmlvZmlsbXMuIFBDMyBzZXBhcmF0ZXMgc29tZSBtb2Rlcm4gY2FsY3VsdXMgc2FtcGxlcyBmcm9tIG90aGVyIGNvbXBhcmF0aXZlCm9yYWwgc2FtcGxlcy4KCk1haW4gZHJpdmVycyBvZiBkaXNjcmltaW5hdGlvbi4gVG9wIGxvYWRpbmcgdmVjdG9ycyBmb3IgUEMxIGFuZCBQQzIuCgpgYGB7cn0KcGNhX2xvYWRpbmdzIDwtIHNwY2Ffc3BlY2llcyRyb3RhdGlvbiAlPiUKICBhc190aWJibGUocm93bmFtZXMgPSAic3BlY2llcyIpICU+JQogIGxlZnRfam9pbihiYWNfcHJvcGVydGllcywgYnkgPSAic3BlY2llcyIpICU+JSAKICBkcGx5cjo6c2VsZWN0KHNwZWNpZXMsUEMxLFBDMixQQzMsYE94eWdlbiB0b2xlcmFuY2VgKSAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKFBDMSkpKQoKcGNhX2xvYWRpbmdzICU+JQogIGFycmFuZ2UoZGVzYyhQQzEpKQoKcGNhX2xvYWRpbmdzICU+JQogIGFycmFuZ2UoZGVzYyhhYnMoUEMyKSkpCmBgYAoKYGBge3J9CnBjYV9sb2FkaW5ncyAlPiUKICBtdXRhdGUoc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIGRlc2MoYWJzKFBDMSkpKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMTUpICU+JQogIGdncGxvdChhZXMoeCA9IFBDMSwgeSA9IHNwZWNpZXMsIGZpbGwgPSBgT3h5Z2VuIHRvbGVyYW5jZWApKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjE4LDAuMTgpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IHZpcmlkaXNMaXRlOjp0dXJibygKICAgICAgICBuID0gbGVuZ3RoKGxldmVscyhhcy5mYWN0b3IoYmFjX3Byb3BlcnRpZXMkYE94eWdlbiB0b2xlcmFuY2VgKSkpCiAgICAgICAgKQogICAgICApICsKICAgIGxhYnModGl0bGUgPSAiY29tcG9uZW50IDEiLCB4ID0gIiIpICsKICAgIGxvYWRpbmdfdGhlbWUKCnBjYV9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKFBDMikpKSAlPiUKICBtdXRhdGUoc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIGRlc2MoYWJzKFBDMikpKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMTUpICU+JQogIGdncGxvdChhZXMoeCA9IFBDMiwgeSA9IHNwZWNpZXMsIGZpbGwgPSBgT3h5Z2VuIHRvbGVyYW5jZWApKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjE1LDAuMTUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IHZpcmlkaXNMaXRlOjp0dXJibygKICAgICAgICBuID0gbGVuZ3RoKGxldmVscyhhcy5mYWN0b3IoYmFjX3Byb3BlcnRpZXMkYE94eWdlbiB0b2xlcmFuY2VgKSkpCiAgICAgICAgKQogICAgICApICsKICAgIGxhYnModGl0bGUgPSAiY29tcG9uZW50IDIiLCB4ID0gIiIpICsKICAgIGxvYWRpbmdfdGhlbWUKCnBjYV9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKFBDMykpKSAlPiUKICBtdXRhdGUoc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIGRlc2MoYWJzKFBDMykpKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMTUpICU+JQogIGdncGxvdChhZXMoeCA9IFBDMywgeSA9IHNwZWNpZXMsIGZpbGwgPSBgT3h5Z2VuIHRvbGVyYW5jZWApKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjEyLDAuMTIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgKICAgICAgdmFsdWVzID0gdmlyaWRpc0xpdGU6OnR1cmJvKAogICAgICAgIG4gPSBsZW5ndGgobGV2ZWxzKGFzLmZhY3RvcihiYWNfcHJvcGVydGllcyRgT3h5Z2VuIHRvbGVyYW5jZWApKSkKICAgICAgICApCiAgICAgICkgKwogICAgbGFicyh0aXRsZSA9ICJjb21wb25lbnQgMyIsIHggPSAiIikgKwogICAgbG9hZGluZ190aGVtZQoKIyBwbG90TG9hZGluZ3Moc3BjYV9zcGVjaWVzLCBuZGlzcGxheSA9IDE1KQojIHBsb3RMb2FkaW5ncyhzcGNhX3NwZWNpZXMsIDIsIG5kaXNwbGF5ID0gMTUpCiMgcGxvdExvYWRpbmdzKHNwY2Ffc3BlY2llcywgMywgbmRpc3BsYXkgPSAxNSkKYGBgCgpDb21wb25lbnQgMSBsb2FkaW5ncyBhcmUgYSBtaXggb2Ygc3BlY2llcyBvZiBhbGwgb3h5Z2VuIHRvbGVyYW5jZSwgYW5kIGlzIHRoZQpvbmx5IGNvbXBvbmVudCB3aXRoIGhpZ2ggbG9hZGluZ3MgZnJvbSBhZXJvYmVzLiBBbGwgYWVyb2JlcyBoYXZlIGEgbmVnYXRpdmUKbG9hZGluZyBvbiBjb21wb25lbnQgMS4gQ29tcG9uZW50IDIgY29udGFpbnMgb25seQphbmFlcm9iZXMgYW5kIGZhY3VsdGF0aXZlIGFuYWVyb2Jlcywgd2hpbGUgY29tcG9uZW50IDMgY29udGFpbnMgb25seSBhbmFlcm9iZXMKaW4gdGhlIHRvcCAxNSBsb2FkaW5ncy4KCmBgYHtyfQpwbG90VmFyKHNwY2Ffc3BlY2llcywgY3V0b2ZmID0gMC45MCkKYGBgCgpgYGB7cn0KIyBzcGNhX2NvbXBhciAlPiUKIyAgIGdncGxvdChhZXMoeCA9IFBDMSwgeSA9IFBDMiwgY29sID0gYW5hbHlzaXNfbWV0YWRhdGEgJT4lCiMgICAgICAgICAgICAgICAgZmlsdGVyKGAjU2FtcGxlSURgICVpbiUgcm93bmFtZXMoY29tcF9vdHVfbWF0cml4KSkgJT4lCiMgICAgICAgICAgICAgICAgLiRFbnYsIHNoYXBlID0gYW5hbHlzaXNfbWV0YWRhdGEgJT4lCiMgICAgICAgICAgICAgICAgZmlsdGVyKGAjU2FtcGxlSURgICVpbiUgcm93bmFtZXMoY29tcF9vdHVfbWF0cml4KSkgJT4lCiMgICAgICAgICAgICAgICAgLiRFbnYpKSArCiMgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgICAgZ2VvbV9zZWdtZW50KGRhdGEgPSBwY2FfbG9hZGluZ3NbMTozLF0sIGFlcyh4ID0gMCwgeSA9IDAsIHhlbmQgPSAoUEMxKjUwMCksCiMgICAgICB5ZW5kID0gKFBDMio1MDApKSwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDAuMiwgImNtIikpLAojICAgICAgY29sb3IgPSAiYmxhY2siLCBpbmhlcml0LmFlcyA9IEYpICsKIyAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuMikgKwojICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBzaXplID0gMC4yKSArCiMgICAgIHRoZW1lX2J3KCkgKwojICAgICBsYWJzKHggPSBwYXN0ZSgKIyAgICAgICAiUEMxIiwgc2NhbGVzOjpwZXJjZW50KGNvbXBhcl9leHBsYWluX3ZhcltbMV1dLCBhY2N1cmFjeSA9IDAuMSkKIyAgICAgICApLAojICAgICAgIHkgPSBwYXN0ZSgKIyAgICAgICAgICJQQzIiLCBzY2FsZXM6OnBlcmNlbnQoY29tcGFyX2V4cGxhaW5fdmFyW1syXV0sIGFjY3VyYWN5ID0gMC4xKQojICAgICAgICkKIyAgICAgKSArCiMgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDE6OCkgKwojICAgbGFicyhjb2wgPSAiRW52Iiwgc2hhcGUgPSAiRW52IikKYGBgCgoKYGBge3J9CiNlbnZfZ3JvdXAgPC0gY29tcF9tZXRhZGF0YSRFbnZbY29tcF9tZXRhZGF0YSRgI1NhbXBsZUlEYCAlaW4lIHJvd25hbWVzKGNvbXBfb3R1X21hdHJpeCldCmJpcGxvdCgKICBzcGNhX3NwZWNpZXMsCiAgY29tcCA9IDE6MiwKICBjdXRvZmYgPSAwLjkwLAogIGluZC5uYW1lcyA9IEYsIHZhci5uYW1lcy5zaXplID0gMykKYGBgCgpgYGB7cn0Kcm93X3NpZGVfY29sb3VycyA8LSBhbmFseXNpc19jb2xvdXJzICU+JQogIGZpbHRlcihgI1NhbXBsZUlEYCAlaW4lIHJvd25hbWVzKHNwY2Ffc3BlY2llcyRYKSkgJT4lCiAgYXJyYW5nZShyb3duYW1lcyhzcGNhX3NwZWNpZXMkeCkpCmNpbShzcGNhX3NwZWNpZXMsIGN1dG9mZiA9IDAuNSwgcm93LnNpZGVDb2xvcnMgPSByb3dfc2lkZV9jb2xvdXJzJGVudl9jb2wpCmBgYAoKVGltZS1sYWcgcGxvdCBvZiBCcmF5LUN1cnRpcyBkYXRhICh1bmRlciBjb25zdHJ1Y3Rpb24pCgpgYGB7cn0KIyBjb21tX21hdHJpeCA8LSBieW9jX290dV9tYXRyaXggJT4lCiMgICBhc190aWJibGUocm93bmFtZXMgPSAic2FtcGxlIikgJT4lCiMgICBsZWZ0X2pvaW4oZHBseXI6OnNlbGVjdChleHBlcmltZW50X21ldGFkYXRhLCBjKGAjU2FtcGxlSURgLCBkYXkpKSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKQpgYGAKCiMgRGlzY3Vzc2lvbgoKTWFpbiB0YWtlYXdheSBpcyB0aGUgbG9zcyBvZiBkaXZlcnNpdHkgYWNyb3NzIHRoZSBleHBlcmltZW50IGFuZCBjb21wYXJlZCB0bwpyZWZlcmVuY2Ugc2FtcGxlcy4gVGhlIGRvbmF0ZWQgc2FsaXZhIGZvciB0aGUgZXhwZXJpbWVudCBoYWQgYSBsb3dlciBkaXZlcnNpdHkKdGhhbiB0aGUgcmVmZXJlbmNlIHNhbGl2YSBzYW1wbGVzLCBhbmQgbWF5IGhhdmUgY29udHJpYnV0ZWQgdG8gYSBsb3dlciBkaXZlcnNpdHkKaW4gZXhwZXJpbWVudCBzYW1wbGVzLiBDb21tdW5pdHkgcHJvZmlsZSBvZiBhcnRpZmljaWFsIGNhbGN1bHVzIGRpZmZlcnMgZnJvbQp0aGUgb3JhbCByZWZlcmVuY2Ugc2FtcGxlcywgd2hpbGUgbW9kZXJuIGNhbGN1bHVzIG1vc3RseSByZXNlbWJsZXMgb3JhbCByZWZlcmVuY2UKc2FtcGxlcy4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGFydGlmaWNpYWwgYW5kIHJlZmVyZW5jZSBzYW1wbGVzIHNlZW1zIHRvIGJlCmEgbGFjayBvZiBhZXJvYmVzIGluIGFydGlmaWNpYWwgc2FtcGxlcyBhbmQgYSBkb21pbmFuY2UgYnkgKkVudGVyb2NvY2N1cyogc3BwLgo=