This file contains statistics and figures from the paper, “Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.

The paper can be found here:

Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution



Co-expression of chemosensory receptors

Shannon Indices showing the specificity of receptor expression. High values indicate more co-expression

Prevalence and level of receptor co-expression by age and cell-type for the V1R and V2R lineages, respectively

V1R

V2R

Circos plot of genomic loci for significantly co-expressed receptor pairs in the V1R, V2R, and across-type populations

V1R Co-expression

V2R Co-expression

Interclass Co-expression

Detection of receptor gene co-expression using Molecular Cartography©

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSA1IgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KICAKICAKYGBge3IsIHJlc3VsdHM9J2FzaXMnfQoKY2F0KCI8YnV0dG9uIG9uY2xpY2s9J2hpc3RvcnkuYmFjaygpJyBzdHlsZT0nZm9udC1zaXplOiAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNXB4Oyc+Q2xpY2sgSGVyZSB0byBSZXR1cm4gdG8gUHJldmlvdXMgUGFnZTwvYnV0dG9uPiIpCgpgYGAKICAKYGBge3IsIGVuZ2luZT0nY3NzJywgZWNobyA9IEZBTFNFfQoKLm5hdi1waWxscyA+IGxpID4gYSB7CiAgY29sb3I6IGJsYWNrOyAvKiBTZXQgaW5hY3RpdmUgdGFiIHRleHQgY29sb3IgdG8gYmxhY2sgKi8KfQoKLm5hdi1waWxscyA+IGxpID4gYTpob3ZlciwgLm5hdi1waWxscyA+IGxpID4gYTpmb2N1cywgLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGEsCi5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYTpmb2N1cyB7CiAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IC8qIFNldCBob3ZlciBiYWNrZ3JvdW5kIGNvbG9yIHRvIGEgZGFya2VyIGdyYXkgKi8KICBjb2xvcjogd2hpdGU7IC8qIFNldCBob3ZlciB0ZXh0IGNvbG9yIHRvIHdoaXRlIGZvciBiZXR0ZXIgY29udHJhc3QgKi8KfQogICAgIApgYGAgIAogIAo+VGhpcyBmaWxlIGNvbnRhaW5zIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgZnJvbSB0aGUgcGFwZXIsICJNb2xlY3VsYXIsIENlbGx1bGFyLCBhbmQgRGV2ZWxvcG1lbnRhbCBPcmdhbml6YXRpb24gb2YgdGhlIE1vdXNlIFZvbWVyb25hc2FsIG9yZ2FuIGF0IFNpbmdsZSBDZWxsIFJlc29sdXRpb24iIGJ5IE1heCBIaWxscyBKci4sIExpbWVpIE1hLCBBaSBGYW5nLCBUaGVsbWEgQ2hpcmVtYmEsIFNldGggTWFsbG95LCBBbGxpc29uIFNjb3R0LCBBbm9qYSBQZXJlcmEsIGFuZCBDLiBSb24gWXUuICAgIAoKVGhlIHBhcGVyIGNhbiBiZSBmb3VuZCBoZXJlOiAgCgpbTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uXShodHRwczovL2VsaWZlc2NpZW5jZXMub3JnL3Jldmlld2VkLXByZXByaW50cy85NzM1NiN0YWItY29udGVudCkKCioqKiAgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiMgUi1NYXJrZG93biBHbG9iYWwgU2V0dGluZ3MgIAoKIyBTZXQtdXAgYSBkZWZhdWx0IGltYWdlIHNpemUgb2YgMTAgWCAxMCBpbmNoZXMuIFN1cHByZXNzIHdhcm5pbmcKIyBhbmQgZXJyb3IgbWVzc2FnZXMuIEhpZGUgY29kZS4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9IiIsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCBjYWNoZT1GQUxTRSkKCmBgYAoKYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQoKIyBMaWJyYXJ5IExvYWRpbmcgIAoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KGtpdCk7IGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShzdHJpbmdyKTsgbGlicmFyeShwbG90M0QpIAogIGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoZGF0YS50YWJsZSk7IGxpYnJhcnkob3JnLk1tLmVnLmRiKQogIGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KFNldXJhdCk7IGxpYnJhcnkoREJJKTsgbGlicmFyeShjb3dwbG90KQogIGxpYnJhcnkoTWF0cml4KTsgbGlicmFyeShnbG1HYW1Qb2kpOyBsaWJyYXJ5KGNpcmNsaXplKQogIGxpYnJhcnkodGliYmxlKTsgbGlicmFyeShnZ3B1YnIpOyBsaWJyYXJ5KHN2Z2xpdGUpOyBsaWJyYXJ5KGdnc2lnbmlmKQogIGxpYnJhcnkoc3RhdHMpOyBsaWJyYXJ5KHZlZ2FuKTsgbGlicmFyeShzY2FsZXMpOyBsaWJyYXJ5KGNhcmV0KQogIGxpYnJhcnkocGF0Y2h3b3JrKTsgbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdlb210ZXh0cGF0aCkKICBsaWJyYXJ5KG9wZW54bHN4KTsgbGlicmFyeShncmlkRXh0cmEpOyBsaWJyYXJ5KGdncmVwZWwpCiAgbGlicmFyeShHZW5lT3ZlcmxhcCk7IGxpYnJhcnkoYmlvbWFSdCk7IGxpYnJhcnkoZ2dwb2ludGRlbnNpdHkpCiAgbGlicmFyeShzbGluZ3Nob3QpOyBsaWJyYXJ5KHRyYWRlU2VxKTsgbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKICBsaWJyYXJ5KHZpcmlkaXMpOyBsaWJyYXJ5KFVwU2V0Uik7IGxpYnJhcnkocGhlYXRtYXApOyBsaWJyYXJ5KG1zaWdkYnIpCiAgbGlicmFyeShmZ3NlYSk7IGxpYnJhcnkoZ3JpZCk7IGxpYnJhcnkoSURQbWlzYyk7IGxpYnJhcnkoTUFTUykKICBsaWJyYXJ5KFJtaXNjKTsgbGlicmFyeShnZ3Bsb3RpZnkpOyBsaWJyYXJ5KGdncG1pc2MpOyBsaWJyYXJ5KHNjYWxlcykKICBsaWJyYXJ5KGhlYXRtYXBseSk7IGxpYnJhcnkoZGVuZGV4dGVuZCkKfSkKCmBgYAoKYGBge3J9CgojIEdsb2JhbCBWYXJpYWJsZXMKCiMgVGhlIGhvbWUgZGlyZWN0b3J5CmhvbWVfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvc2NfVk5PLyIKIyBEaXJlY3RvcnkgZm9yIHN0b3JpbmcgZGF0YSBvYmplY3RzIGF0IGNydWNpYWwgc3RhZ2VzCm9iamVjdF9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbC5zZXUub2Jqcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZyb20gdGhlIGZpbmFsIGFuYWx5c2lzCmltYWdlX2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsX2ltYWdlcy8iKQphZG9iZV9pbWFnZXMgPC0gcGFzdGUwKGltYWdlX2RpciwgImFkb2JlX2lsbHVzdHJhdG9yX3N2Z19maWxlcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZvciB0aGUgZmluYWwgcGFwZXIKY2x1c3RyZWVfZGlyIDwtIHBhc3RlMChpbWFnZV9kaXIsImNsdXN0cmVlLyIpCiMgQSBkaXJlY3RvcnkgZm9yIFRyYWRlU2VxIGZpdEdBTSBvdXRwdXQKZml0R0FNX2RpciA8LSBwYXN0ZTAob2JqZWN0X2RpciwgImZpdEdBTS8iKQptb2VfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvbW9sbmdfMjQwN18yNDUzL1Jfb2JqLyIKCiMgT1BFTiBgYGB2bm8uc2V1LmludGVncmF0ZWRgYGAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsInZuby5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKI0xvYWQgTmV1cm9uYWwgTGluZWFnZSBTZXVyYXQgT2JqZWN0ICAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIm5ldXJvbi5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKCiMgUmVuYW1lIHVua25vd25fbVZTTiB0byBzVlNOCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgoKIyBHZXQgY29sb3Igc2NoZW1lIGZvciB0aGUgd2hvbGUgdm5vIGRhdGFzZXQKdm5vLmNlbGxfdHlwZS5jb2xvcnMgPC0gaHVlX3BhbCgpKGxlbmd0aChsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpKQpuYW1lcyh2bm8uY2VsbF90eXBlLmNvbG9ycykgPC0gbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpCgojIEtlZXAgbmV1cm9uIGRhdGFzZXQgY29sb3Igc2NoZW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2hvbGUgdm5vIGNvbG9yIHNjaGVtZSwgd2hlcmUgcG9zc2libGUgIApuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSB2bm8uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iLCJWMVJfaVZTTiIsIlYyUl9pVlNOIiwiR0JDIildCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHNldE5hbWVzKGMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMsIiMwMEIwRjYiLCIjOTU5MEZGIiwiI0U3NkJGMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKG5hbWVzKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzKSwiaU9TTiIsImxhdGVfSU5QIiwiZWFybHlfSU5QIikpCgptYXR1cmUubmV1cm9ucyA8LSBzdWJzZXQobmV1cm9uLmludGVncmF0ZWQsaWRlbnRzPWMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpKQptYXR1cmUuY2VsbF90eXBlLmNvbG9ycyA8LSBuZXVyb24uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKV0KCmdsb2JhbC52YXJzIDwtIGMobHMoKSwiZ2xvYmFsLnZhcnMiKQoKYGBgCgoqKiogIAoKIyBDby1leHByZXNzaW9uIG9mIGNoZW1vc2Vuc29yeSByZWNlcHRvcnMgey50YWJzZXQgLnRhYnNldC1waWxsc30gIAoKIyMgU2hhbm5vbiBJbmRpY2VzIHNob3dpbmcgdGhlIHNwZWNpZmljaXR5IG9mIHJlY2VwdG9yIGV4cHJlc3Npb24uIEhpZ2ggdmFsdWVzIGluZGljYXRlIG1vcmUgY28tZXhwcmVzc2lvbiAgCgpgYGB7cn0KCmFscGhhLmRpdmVyc2l0eS5kZiA8LSBGZXRjaERhdGEobmV1cm9uLmludGVncmF0ZWQsdmFycz1jKCJhZ2UiLCJjZWxsX3R5cGUiLCJTaGFubm9uLkluZGV4IikpCgpgYGAKCmBgYHtyfQoKZmlnNV9hIDwtIGdncGxvdChhbHBoYS5kaXZlcnNpdHkuZGYsYWVzKHg9Y2VsbF90eXBlLHk9U2hhbm5vbi5JbmRleCxmaWxsPWNlbGxfdHlwZSkpICsgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJDZWxsIFR5cGUiLHZhbHVlcz1uZXVyb24uY2VsbF90eXBlLmNvbG9ycykgKyAjdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sZ2VvbT0ncG9pbnQnLHNpemU9MTAsY29sb3VyPSJ3aGl0ZSIsc2hhcGU9OTUsc2hvd19ndWlkZT1GQUxTRSkgKwogIGZhY2V0X2dyaWQoLiB+IGFnZSkgKwogICMgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zPWFscGhhX2NvbXBhcmlzb25zLmxpc3QsdGlwLmxlbmd0aD0wLjAxLAogICMgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0id2lsY294LnRlc3QiLGxhYmVsPSJwLnNpZ25pZiIsdmp1c3Q9MC4zKSArCiAgeWxhYigiU2hhbm5vbiBJbmRleCIpICsgeGxhYigiQ2VsbCBUeXBlIikgKyB0aGVtZV9idygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MiwgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0zMixmYWNlPSJib2xkIiksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LHZqdXN0PTEsaGp1c3Q9MSksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCkpICsgCiAgTm9MZWdlbmQoKSAKCmZpZzVfYQoKYGBgCgojIyBQcmV2YWxlbmNlIGFuZCBsZXZlbCBvZiByZWNlcHRvciBjby1leHByZXNzaW9uIGJ5IGFnZSBhbmQgY2VsbC10eXBlIGZvciB0aGUgVjFSIGFuZCBWMlIgbGluZWFnZXMsIHJlc3BlY3RpdmVseSB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCnJlY2VwdG9yLm1ldGFkYXRhIDwtIEZldGNoRGF0YShuZXVyb24uaW50ZWdyYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnM9YygiY2VsbF90eXBlIiwiYWdlIiwiZmlyc3QucmVjZXB0b3IuY291bnQiLCJyZWNlcHRvci5zcGVjaWVzIikpCgpgYGAKCmBgYHtyfQoKVjFSLnJlY2VwdG9yLm1ldGFkYXRhIDwtIHJlY2VwdG9yLm1ldGFkYXRhW3JlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSAlaW4lIGMoImxhdGVfSU5QIiwiVjFSX2lWU04iLCJWMVJfbVZTTiIpLCBdCgpgYGAKCmBgYHtyLGluY2x1ZGU9RkFMU0V9CgojIyMjIyBWMVIgIyMjIyMKIyBHcm91cCBkYXRhIGJ5IGFnZS9jZWxsX3R5cGUgY29tYmluYXRpb25zLCBhbmQgaG93IG1hbnkgTiBjZWxscyAKVjFSLmNvX2V4cC5jZWxsX3R5cGUgPC0gCiAgIHN1bW1hcnlTRShWMVIucmVjZXB0b3IubWV0YWRhdGEsIAogICAgICAgICAgICAgbWVhc3VyZXZhciA9ICJmaXJzdC5yZWNlcHRvci5jb3VudCIsIAogICAgICAgICAgICAgZ3JvdXB2YXJzID0gYygiYWdlIiwiY2VsbF90eXBlIikpCgpWMVIuY29fZXhwLmNlbGxfdHlwZSROb25lIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjFSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjFSLnJlY2VwdG9yLm1ldGFkYXRhW1YxUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAwLCBdKS9WMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkT25lIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjFSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjFSLnJlY2VwdG9yLm1ldGFkYXRhW1YxUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAxLCBdKS9WMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkVHdvIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjFSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjFSLnJlY2VwdG9yLm1ldGFkYXRhW1YxUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAyLCBdKS9WMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkVGhyZWVfb3JfbW9yZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYxUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYxUi5yZWNlcHRvci5tZXRhZGF0YVtWMVIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPj0gMywgXSkvVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKCmBgYAoKYGBge3IsaW5jbHVkZT1GQUxTRX0KClYxUi5wbG90LmRmIDwtIFYxUi5jb19leHAuY2VsbF90eXBlICU+JSBnYXRoZXIoUmVjZXB0b3JzLCBSYXRpbywgYygiVGhyZWVfb3JfbW9yZSIsIlR3byIsIk9uZSIsIk5vbmUiKSkKCmBgYAoKYGBge3IsaW5jbHVkZT1GQUxTRX0KCiMjIE9yZGVyIHRoZSBmYWN0b3JzIGFuZCByb3VuZCB0aGUgZmxvYXRzIGluIHRoZSBERiAgCiMjIyMjIFYxUiAjIyMjIwojIE9yZGVyIHRoZSBSZWNlcHRvcnMgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjFSLnBsb3QuZGYkUmVjZXB0b3JzIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMVIucGxvdC5kZiRSZWNlcHRvcnMpLCAKICAgICAgICAgbGV2ZWxzID0gYygiVGhyZWVfb3JfbW9yZSIsIlR3byIsIk9uZSIsIk5vbmUiKSkKCiMgT3JkZXIgdGhlIGFnZSBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpWMVIucGxvdC5kZiRhZ2UgPC0KICBmYWN0b3IoYXMuZmFjdG9yKFYxUi5wbG90LmRmJGFnZSksIAogICAgICAgICBsZXZlbHMgPSBjKCJQMTQiLCJQNTYiKSkKCiMgT3JkZXIgdGhlIGNlbGxfdHlwZSBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpWMVIucGxvdC5kZiRjZWxsX3R5cGUgPC0KICBmYWN0b3IoYXMuZmFjdG9yKFYxUi5wbG90LmRmJGNlbGxfdHlwZSksIAogICAgICAgICBsZXZlbHMgPSBjKCJsYXRlX0lOUCIsIlYxUl9pVlNOIiwiVjFSX21WU04iKSkKCiMgUm91bmQgdGhlIHJhdGlvIHRvIDQgZGlnaXRzClYxUi5wbG90LmRmJFJhdGlvIDwtIHJvdW5kKFYxUi5wbG90LmRmJFJhdGlvLCBkaWdpdHMgPSA0KQoKYGBgCgojIyMgVjFSICAKCmBgYHtyfQoKZmlnNV9iIDwtIGdncGxvdChWMVIucGxvdC5kZiwgYWVzKHggPSBhZ2UsIHkgPSBSYXRpbywgZmlsbCA9IFJlY2VwdG9ycywgbGFiZWwgPSBSYXRpbykpICsgCiAgZ2VvbV9jb2woKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0zLHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjQpLGxlZ2VuZC5wb3NpdGlvbj0idG9wIikgKwogIGZhY2V0X2dyaWQoLiB+IGNlbGxfdHlwZSkgKwogIGdlb21fdGV4dChkYXRhID0gc3Vic2V0KFYxUi5wbG90LmRmLCBSYXRpbyA+IDApLCBzaXplPTUsIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKwogIGdlb21fdGV4dChkYXRhID0gc3Vic2V0KFYxUi5wbG90LmRmLCBSZWNlcHRvcnMgPT0gIk5vbmUiKSwgc2l6ZT01LCBhZXMoeD1hZ2UsIHk9LTAuMDEsIGxhYmVsPXBhc3RlMCgiTj0iLE4pKSkKCmZpZzVfYgoKYGBgCgpgYGB7cn0KClYyUi5yZWNlcHRvci5tZXRhZGF0YSA8LSByZWNlcHRvci5tZXRhZGF0YVtyZWNlcHRvci5tZXRhZGF0YSRjZWxsX3R5cGUgJWluJSBjKCJsYXRlX0lOUCIsIlYyUl9pVlNOIiwiVjJSX21WU04iKSwgXQoKYGBgCgpgYGB7cn0KCiMjIyMjIFYyUiAjIyMjIwoKVjJSLmNvX2V4cC5jZWxsX3R5cGUgPC0gCiAgIHN1bW1hcnlTRShWMlIucmVjZXB0b3IubWV0YWRhdGEsIAogICAgICAgICAgICAgbWVhc3VyZXZhciA9ICJmaXJzdC5yZWNlcHRvci5jb3VudCIsIAogICAgICAgICAgICAgZ3JvdXB2YXJzID0gYygiYWdlIiwiY2VsbF90eXBlIikpCgpWMlIuY29fZXhwLmNlbGxfdHlwZSROb25lIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjJSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjJSLnJlY2VwdG9yLm1ldGFkYXRhW1YyUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAwLCBdKS9WMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjJSLmNvX2V4cC5jZWxsX3R5cGUkT25lIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjJSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjJSLnJlY2VwdG9yLm1ldGFkYXRhW1YyUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAxLCBdKS9WMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjJSLmNvX2V4cC5jZWxsX3R5cGUkVHdvIDwtIHVubGlzdChsYXBwbHkocm93bmFtZXMoVjJSLmNvX2V4cC5jZWxsX3R5cGUpLCBmdW5jdGlvbihpKXsKICAgYWdlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJhZ2UiXQogICBjZWxsX3R5cGUgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImNlbGxfdHlwZSJdCiAgIG5yb3coVjJSLnJlY2VwdG9yLm1ldGFkYXRhW1YyUi5yZWNlcHRvci5tZXRhZGF0YSRhZ2UgPT0gYWdlICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlIucmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlID09IGNlbGxfdHlwZSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMlIucmVjZXB0b3IubWV0YWRhdGEkcmVjZXB0b3Iuc3BlY2llcyA9PSAyLCBdKS9WMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiTiJdCn0pKQoKVjJSLmNvX2V4cC5jZWxsX3R5cGUkVGhyZWVfb3JfbW9yZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPj0gMywgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKCmBgYAoKYGBge3J9CgpWMlIucGxvdC5kZiA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZSAlPiUgZ2F0aGVyKFJlY2VwdG9ycywgUmF0aW8sIGMoIlRocmVlX29yX21vcmUiLCJUd28iLCJPbmUiLCJOb25lIikpCgpgYGAKCmBgYHtyfQoKIyMjIyMgVjJSICMjIyMjCgojIE9yZGVyIHRoZSBSZWNlcHRvcnMgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjJSLnBsb3QuZGYkUmVjZXB0b3JzIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMlIucGxvdC5kZiRSZWNlcHRvcnMpLCAKICAgICAgICAgbGV2ZWxzID0gYygiVGhyZWVfb3JfbW9yZSIsIlR3byIsIk9uZSIsIk5vbmUiKSkKCiMgT3JkZXIgdGhlIGFnZSBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpWMlIucGxvdC5kZiRhZ2UgPC0KICBmYWN0b3IoYXMuZmFjdG9yKFYyUi5wbG90LmRmJGFnZSksIAogICAgICAgICBsZXZlbHMgPSBjKCJQMTQiLCJQNTYiKSkKCiMgT3JkZXIgdGhlIGNlbGxfdHlwZSBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpWMlIucGxvdC5kZiRjZWxsX3R5cGUgPC0KICBmYWN0b3IoYXMuZmFjdG9yKFYyUi5wbG90LmRmJGNlbGxfdHlwZSksIAogICAgICAgICBsZXZlbHMgPSBjKCJlYXJseV9JTlAiLCJsYXRlX0lOUCIsIlYyUl9pVlNOIiwiVjJSX21WU04iKSkKCiMgUm91bmQgdGhlIHJhdGlvIHRvIDQgZGlnaXRzClYyUi5wbG90LmRmJFJhdGlvIDwtIHJvdW5kKFYyUi5wbG90LmRmJFJhdGlvLCBkaWdpdHMgPSA0KQoKYGBgCgojIyMgVjJSICAKCmBgYHtyfQoKZmlnNV9jIDwtIGdncGxvdChWMlIucGxvdC5kZiwgYWVzKHggPSBhZ2UsIHkgPSBSYXRpbywgZmlsbCA9IFJlY2VwdG9ycywgbGFiZWwgPSBSYXRpbykpICsKICBnZW9tX2NvbCgpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTMsdGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yNCksbGVnZW5kLnBvc2l0aW9uPSJ0b3AiKSArCiAgZmFjZXRfZ3JpZCguIH4gY2VsbF90eXBlKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBzdWJzZXQoVjJSLnBsb3QuZGYsIFJhdGlvID4gMCksIHNpemU9NSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBnZW9tX3RleHQoZGF0YSA9IHN1YnNldChWMlIucGxvdC5kZiwgUmVjZXB0b3JzID09ICJOb25lIiksIHNpemU9NSwgYWVzKHg9YWdlLCB5PS0wLjAxLCBsYWJlbD1wYXN0ZTAoIk49IixOKSkpCgpmaWc1X2MKCmBgYAoKIyMgQ2lyY29zIHBsb3Qgb2YgZ2Vub21pYyBsb2NpIGZvciBzaWduaWZpY2FudGx5IGNvLWV4cHJlc3NlZCByZWNlcHRvciBwYWlycyBpbiB0aGUgVjFSLCBWMlIsIGFuZCBhY3Jvc3MtdHlwZSBwb3B1bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgpgYGB7cn0KCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInNpZy52MXIuY29leHByZXNzIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInYxci5jaXJjb3MuYmVkIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInYxci5iZWQxIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInYxci5iZWQyIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInNpZy52MnIuY29leHByZXNzIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInYyci5jaXJjb3MuYmVkIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInYyci5iZWQxIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInYyci5iZWQyIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgInNpZy5pbnRlcmNsYXNzLmNvZXhwcmVzcyIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJpbnRlcmNsYXNzLmNpcmNvcy5iZWQiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAiaW50ZXJjbGFzcy5iZWQxIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgImludGVyY2xhc3MuYmVkMiIpKQoKYGBgCgpgYGB7cn0KCnYxci5zZWN0b3JzIDwtIGxhcHBseSh1bmlxdWUodjFyLmNpcmNvcy5iZWQkY2hyKSwgZnVuY3Rpb24oY2hyKXsKICBwYWRkaW5nIDwtIDEwMDAwMAogIHNlY3Rvci5zdGFydCA8LSBtaW4odjFyLmNpcmNvcy5iZWRbdjFyLmNpcmNvcy5iZWQkY2hyID09IGNociwgInN0YXJ0Il0pIC0gcGFkZGluZwogIHNlY3Rvci5lbmQgPC0gbWF4KHYxci5jaXJjb3MuYmVkW3Yxci5jaXJjb3MuYmVkJGNociA9PSBjaHIsICJlbmQiXSkgKyBwYWRkaW5nCiAgcmV0dXJuKGMoY2hyLHNlY3Rvci5zdGFydCxzZWN0b3IuZW5kKSkKfSkKCnYxci5jaHIuY29vcmQgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCB2MXIuc2VjdG9ycykpCmNvbG5hbWVzKHYxci5jaHIuY29vcmQpIDwtIGMoImNociIsInN0YXJ0IiwiZW5kIikKCm1ham9yLnRpeCA8LSBzZXEoZnJvbT0wLHRvPTI1MDAwMDAwMCxieT0xMDAwMDApCgpgYGAKCiMjIyBWMVIgQ28tZXhwcmVzc2lvbiAgCgpgYGB7ciwgZmlnLndpZHRoPTQwLGZpZy5oZWlnaHQ9NDB9Cgpmb250LnNjYWxlIDwtIDcKCmNpcmNvcy5wYXIoc3RhcnQuZGVncmVlPTkwLCBnYXAuZGVncmVlPTIsIHRyYWNrLm1hcmdpbj1jKDAuMDAwNSwwLjAwMDUpKQpjaXJjb3MuZ2Vub21pY0luaXRpYWxpemUodjFyLmNoci5jb29yZCxwbG90VHlwZSA9IE5VTEwpCiMgQWRkIHRoZSBnZW5lU3ltYm9sIGxhYmVscwpjaXJjb3MuZ2Vub21pY0xhYmVscyh2MXIuY2lyY29zLmJlZCwgbGFiZWxzLmNvbHVtbj00LCBzaWRlPSJvdXRzaWRlIiwgbGFiZWxzX2hlaWdodD0wLjI5LCBjZXg9Zm9udC5zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgcGFkZGluZz0wLjA0LCBjb25uZWN0aW9uX2hlaWdodD1tbV9oKDE1KSwgbGluZV9sd2Q9NSkKCiMgRHJhdyB0aGUgc2VjdG9ycyBhbmQgYWRkIGNociBJRCBhcyB0ZXh0CmNpcmNvcy50cmFjayh5bGltPWMoMCwxKSwgcGFuZWwuZnVuPWZ1bmN0aW9uKHgseSl7CiAgY2hyPUNFTExfTUVUQSRzZWN0b3IuaW5kZXgKICB4bGltPUNFTExfTUVUQSR4bGltCiAgeWxpbT1DRUxMX01FVEEkeWxpbQogIGNpcmNvcy5yZWN0KHhsaW1bMV0sIDAsIHhsaW1bMl0sIDEsIGNvbD0iZGFya3JlZCIpCiAgY2lyY29zLnRleHQobWVhbih4bGltKSwgbWVhbih5bGltKSwgY2hyLCBjZXg9Zm9udC5zY2FsZSwgY29sPSJ3aGl0ZSIsIGZhY2luZz0iY2xvY2t3aXNlIiwgbmljZUZhY2luZz1UUlVFKQogIGNpcmNvcy54YXhpcyhoPTEsIGxhYmVscz1GQUxTRSwgZGlyZWN0aW9uPSJvdXRzaWRlIiwgbWlub3IudGlja3M9MSwKICAgICAgICAgICAgICAgbWFqb3IudGljay5sZW5ndGg9MC4wNSwgbWFqb3IuYXQ9bWFqb3IudGl4LCBsd2Q9NSkKICB9LCB0cmFjay5oZWlnaHQ9MC4yMiwgYmcuYm9yZGVyPU5BKQpjaXJjb3MuZ2Vub21pY0xpbmsodjFyLmJlZDEsIHYxci5iZWQyLCBjb2w9c2lnLnYxci5jb2V4cHJlc3MkY29sb3IsIGx3ZD01LCBib3JkZXI9TkEpCgpgYGAKCmBgYHtyfQoKdjJyLnNlY3RvcnMgPC0gbGFwcGx5KHVuaXF1ZSh2MnIuY2lyY29zLmJlZCRjaHIpLCBmdW5jdGlvbihjaHIpewogIHBhZGRpbmcgPC0gMTAwMDAwCiAgc2VjdG9yLnN0YXJ0IDwtIG1pbih2MnIuY2lyY29zLmJlZFt2MnIuY2lyY29zLmJlZCRjaHIgPT0gY2hyLCAic3RhcnQiXSkgLSBwYWRkaW5nCiAgc2VjdG9yLmVuZCA8LSBtYXgodjJyLmNpcmNvcy5iZWRbdjJyLmNpcmNvcy5iZWQkY2hyID09IGNociwgImVuZCJdKSArIHBhZGRpbmcKICByZXR1cm4oYyhjaHIsc2VjdG9yLnN0YXJ0LHNlY3Rvci5lbmQpKQp9KQoKdjJyLmNoci5jb29yZCA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwocmJpbmQsIHYyci5zZWN0b3JzKSkKY29sbmFtZXModjJyLmNoci5jb29yZCkgPC0gYygiY2hyIiwic3RhcnQiLCJlbmQiKQoKY29scy5udW0gPC0gYygic3RhcnQiLCJlbmQiKQp2MnIuY2hyLmNvb3JkW2NvbHMubnVtXSA8LSBzYXBwbHkodjJyLmNoci5jb29yZFtjb2xzLm51bV0sYXMubnVtZXJpYykKCmBgYAoKIyMjIFYyUiBDby1leHByZXNzaW9uICAKCmBgYHtyLCBmaWcud2lkdGg9NTAsZmlnLmhlaWdodD01MH0KCmZvbnQuc2NhbGUgPC0gNwoKY2lyY29zLnBhcihzdGFydC5kZWdyZWU9OTAsIGdhcC5kZWdyZWU9MiwgdHJhY2subWFyZ2luPWMoMC4wMDA1LDAuMDAwNSkpCmNpcmNvcy5nZW5vbWljSW5pdGlhbGl6ZSh2MnIuY2hyLmNvb3JkLHBsb3RUeXBlID0gTlVMTCkKIyBBZGQgdGhlIGdlbmVTeW1ib2wgbGFiZWxzCmNpcmNvcy5nZW5vbWljTGFiZWxzKHYyci5jaXJjb3MuYmVkLCBsYWJlbHMuY29sdW1uPTQsIHNpZGU9Im91dHNpZGUiLCBsYWJlbHNfaGVpZ2h0PTAuMjksIGNleD1mb250LnNjYWxlLAogICAgICAgICAgICAgICAgICAgICBwYWRkaW5nPTAuMDQsIGNvbm5lY3Rpb25faGVpZ2h0PW1tX2goMTUpLCBsaW5lX2x3ZD01KQoKIyBEcmF3IHRoZSBzZWN0b3JzIGFuZCBhZGQgY2hyIElEIGFzIHRleHQKY2lyY29zLnRyYWNrKHlsaW09YygwLDEpLCBwYW5lbC5mdW49ZnVuY3Rpb24oeCx5KXsKICBjaHI9Q0VMTF9NRVRBJHNlY3Rvci5pbmRleAogIHhsaW09Q0VMTF9NRVRBJHhsaW0KICB5bGltPUNFTExfTUVUQSR5bGltCiAgY2lyY29zLnJlY3QoeGxpbVsxXSwgMCwgeGxpbVsyXSwgMSwgY29sPSJkYXJrYmx1ZSIpCiAgY2lyY29zLnRleHQobWVhbih4bGltKSwgbWVhbih5bGltKSwgY2hyLCBjZXg9Zm9udC5zY2FsZSwgY29sPSJ3aGl0ZSIsIGZhY2luZz0iY2xvY2t3aXNlIiwgbmljZUZhY2luZz1UUlVFKQogIGNpcmNvcy54YXhpcyhoPTEsIGxhYmVscz1GQUxTRSwgZGlyZWN0aW9uPSJvdXRzaWRlIiwgbWlub3IudGlja3M9MSwKICAgICAgICAgICAgICAgbWFqb3IudGljay5sZW5ndGg9MC4wNSwgbWFqb3IuYXQ9bWFqb3IudGl4LCBsd2Q9NSkKICB9LCB0cmFjay5oZWlnaHQ9MC4yMiwgYmcuYm9yZGVyPU5BKQpjaXJjb3MuZ2Vub21pY0xpbmsodjJyLmJlZDEsIHYyci5iZWQyLCBjb2w9c2lnLnYyci5jb2V4cHJlc3MkY29sb3IsIGx3ZD01LCBib3JkZXI9TkEpCgpgYGAKCiMjIyBJbnRlcmNsYXNzIENvLWV4cHJlc3Npb24gIAoKYGBge3J9CgppbnRlcmNsYXNzLnNlY3RvcnMgPC0gbGFwcGx5KHVuaXF1ZShpbnRlcmNsYXNzLmNpcmNvcy5iZWQkY2hyKSwgZnVuY3Rpb24oY2hyKXsKICBwYWRkaW5nIDwtIDEwMDAwMAogIHNlY3Rvci5zdGFydCA8LSBtaW4oaW50ZXJjbGFzcy5jaXJjb3MuYmVkW2ludGVyY2xhc3MuY2lyY29zLmJlZCRjaHIgPT0gY2hyLCAic3RhcnQiXSkgLSBwYWRkaW5nCiAgc2VjdG9yLmVuZCA8LSBtYXgoaW50ZXJjbGFzcy5jaXJjb3MuYmVkW2ludGVyY2xhc3MuY2lyY29zLmJlZCRjaHIgPT0gY2hyLCAiZW5kIl0pICsgcGFkZGluZwogIHJldHVybihjKGNocixzZWN0b3Iuc3RhcnQsc2VjdG9yLmVuZCkpCn0pCgppbnRlcmNsYXNzLmNoci5jb29yZCA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwocmJpbmQsIGludGVyY2xhc3Muc2VjdG9ycykpCmNvbG5hbWVzKGludGVyY2xhc3MuY2hyLmNvb3JkKSA8LSBjKCJjaHIiLCJzdGFydCIsImVuZCIpCgptYWpvci50aXggPC0gc2VxKGZyb209MCx0bz0yNTAwMDAwMDAsYnk9MTAwMDAwKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTUwLGZpZy5oZWlnaHQ9NTB9Cgpmb250LnNjYWxlIDwtIDcKCmNpcmNvcy5wYXIoc3RhcnQuZGVncmVlPTkwLCBnYXAuZGVncmVlPTIsIHRyYWNrLm1hcmdpbj1jKDAuMDAwNSwwLjAwMDUpKQpjaXJjb3MuZ2Vub21pY0luaXRpYWxpemUoaW50ZXJjbGFzcy5jaHIuY29vcmQscGxvdFR5cGUgPSBOVUxMKQojIEFkZCB0aGUgZ2VuZVN5bWJvbCBsYWJlbHMKY2lyY29zLmdlbm9taWNMYWJlbHMoaW50ZXJjbGFzcy5jaXJjb3MuYmVkLCBsYWJlbHMuY29sdW1uPTQsIHNpZGU9Im91dHNpZGUiLCBsYWJlbHNfaGVpZ2h0PTAuMjksIGNleD1mb250LnNjYWxlLAogICAgICAgICAgICAgICAgICAgICBwYWRkaW5nPTAuMDQsIGNvbm5lY3Rpb25faGVpZ2h0PW1tX2goMTUpLCBsaW5lX2x3ZD01KQoKIyBEcmF3IHRoZSBzZWN0b3JzIGFuZCBhZGQgY2hyIElEIGFzIHRleHQKY2lyY29zLnRyYWNrKHlsaW09YygwLDEpLCBwYW5lbC5mdW49ZnVuY3Rpb24oeCx5KXsKICBjaHI9Q0VMTF9NRVRBJHNlY3Rvci5pbmRleAogIHhsaW09Q0VMTF9NRVRBJHhsaW0KICB5bGltPUNFTExfTUVUQSR5bGltCiAgY2lyY29zLnJlY3QoeGxpbVsxXSwgMCwgeGxpbVsyXSwgMSwgY29sPSJkYXJrZ3JlZW4iKQogIGNpcmNvcy50ZXh0KG1lYW4oeGxpbSksIG1lYW4oeWxpbSksIGNociwgY2V4PWZvbnQuc2NhbGUsIGNvbD0id2hpdGUiLCBmYWNpbmc9ImNsb2Nrd2lzZSIsIG5pY2VGYWNpbmc9VFJVRSkKICBjaXJjb3MueGF4aXMoaD0xLCBsYWJlbHM9RkFMU0UsIGRpcmVjdGlvbj0ib3V0c2lkZSIsIG1pbm9yLnRpY2tzPTEsCiAgICAgICAgICAgICAgIG1ham9yLnRpY2subGVuZ3RoPTAuMDUsIG1ham9yLmF0PW1ham9yLnRpeCwgbHdkPTUpCiAgfSwgdHJhY2suaGVpZ2h0PTAuMjIsIGJnLmJvcmRlcj1OQSkKY2lyY29zLmdlbm9taWNMaW5rKGludGVyY2xhc3MuYmVkMSwgaW50ZXJjbGFzcy5iZWQyLCBjb2w9c2lnLmludGVyY2xhc3MuY29leHByZXNzJGNvbG9yLCBsd2Q9NSwgYm9yZGVyPU5BKQoKYGBgCgojIyBEZXRlY3Rpb24gb2YgcmVjZXB0b3IgZ2VuZSBjby1leHByZXNzaW9uIHVzaW5nIE1vbGVjdWxhciBDYXJ0b2dyYXBoecKpICAKCiFbXSgvbC9ZdS9ZdUxhYi9MYWIgUGFwZXIvSW5QcmVwL1ZOT19hdGxhcy9GaW5hbCBWZXJzaW9ucy9maWd1cmVfcGFuZWxzL0ZpZ3VyZV81LkdISUoucG5nKQoKCgo=