Comparison of all fitted models

Figure X below shows the maxium ICL value for each cluster number over 10,000 iterations; the text labels within the figure show the absolute maximum. For both Forest- and Praat-tracker formant values, 4 is the optimal number of clusters, marginally better than 3, but considerably better than both 2 and 5 clusters.

Figure X Maximum integrated complete-data likelihood (ICL) values from 10,000 iterations of fitting Gaussian mixture models (GMMs) onto z-normalized mid-point formant first and second formant values, measured using two formant trackers (Forest, Praat). Arrowed text labels annotated the maximum ICL value for G, the number of clusters fitted by the GMM.

Comparison between optimal models and human annotators

2-cluster and 3-cluster models

4-cluster and 5-cluster models

Comparison across optimal models and human annotators

Distribution of non-tonic schwas

Distribution of contexts within vowel categories

Distribution of vowel categories across vowel positions

LS0tCnRpdGxlOiAiUmVwcm9kdWNpYmxlIHJlc3VsdHMgYW5kIGRpc2N1c3Npb24gc3Vic2VjdGlvbnMgZm9yIEtheXRldHllIG1lZGlhbCB2b3dlbHMgcGFwZXIiCmF1dGhvcjogIk5heSBTYW4iCmRhdGU6ICJHZW5lcmF0ZWQgYHIgZm9ybWF0KFN5cy50aW1lKCksICclRiAlUiBVVEMleicpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBrYWJsZQogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdG9jOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKcGFyYW1zOgogICAgcmFuZG9tX3NlZWQ6IDMKLS0tCgpgYGB7ciBTZXR1cCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICAgIAogICAgCmxpYnJhcnkobWNsdXN0KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShoZXJlKQpsaWJyYXJ5KERUKSAgICAKICAgIApzb3VyY2UoaGVyZSgic3JjL3Zpc3VhbGl6YXRpb24vbWNsdXN0LXBsb3RfaGVscGVyLlIiKSkKc291cmNlKGhlcmUoInNyYy9kYXRhL21jbHVzdF9oZWxwZXJzLlIiKSkgICAgCiAgICAKdm93ZWxzX21lZF9hbmFseXNpcyA8LSByZWFkX2NzdihoZXJlKCJkYXRhL3Byb2Nlc3NlZC92b3dlbHNfbWVkX2FuYWx5c2lzLmNzdiIpLCBjb2xfdHlwZXMgPSAiY2lpY2NjY2NkZGNkZGRkZGRkZGRkIikKbWljbF9yZXN1bHRzIDwtIHJlYWRfY3N2KGhlcmUoImRhdGEvcHJvY2Vzc2VkL21pY2xfcmVzdWx0cy5jc3YiKSwgY29sX3R5cGVzID0gImljaWljZCIpICAgIAoKIyBTb21lIGhlbHBlcnMKcGxhY2Vob2xkZXIgPC0gJzxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlg8L3NwYW4+JwoKIyBTZXQgdXAgZ2dwbG90IHRoZW1lCmJ3X2N1c3RvbSA8LSB0aGVtZV9zZXQoCiAgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKwogICAgdGhlbWUoCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICkKKQoKIyBTb21lIGhlbHBlcnMKcGxhY2Vob2xkZXIgPC0gJzxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlg8L3NwYW4+JwpgYGAKCiMgQ29tcGFyaXNvbiBvZiBhbGwgZml0dGVkIG1vZGVscwoKRmlndXJlIGByIHBsYWNlaG9sZGVyYCBiZWxvdyBzaG93cyB0aGUgbWF4aXVtIElDTCB2YWx1ZSBmb3IgZWFjaCBjbHVzdGVyIG51bWJlciBvdmVyIDEwLDAwMCBpdGVyYXRpb25zOyB0aGUgdGV4dCBsYWJlbHMgd2l0aGluIHRoZSBmaWd1cmUgc2hvdyB0aGUgYWJzb2x1dGUgbWF4aW11bS4KRm9yIGJvdGggRm9yZXN0LSBhbmQgUHJhYXQtdHJhY2tlciBmb3JtYW50IHZhbHVlcywgNCBpcyB0aGUgb3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMsIG1hcmdpbmFsbHkgYmV0dGVyIHRoYW4gMywgYnV0IGNvbnNpZGVyYWJseSBiZXR0ZXIgdGhhbiBib3RoIDIgYW5kIDUgY2x1c3RlcnMuCgpgYGB7ciBTaG93IG1heC4gSUNMIGdyYXBocywgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Mi41LCBmaWcuYWxpZ249J2NlbnRlcid9Cm1pY2xfYmVzdCA8LQogICAgbWljbF9yZXN1bHRzICU+JQogICAgZ3JvdXBfYnkodHJhY2tlciwgRykgJT4lCiAgICBmaWx0ZXIoSUNMID09IG1heChJQ0wpKSAlPiUKICAgIGFycmFuZ2UodHJhY2tlciwgRykgJT4lIAogICAgdW5ncm91cCAlPiUgCiAgICBtdXRhdGUoVHJhY2tlciA9IHN0cl90b190aXRsZSh0cmFja2VyKSkgJT4lCiAgICBzZWxlY3QoVHJhY2tlciwgRywgbWF4SUNMID0gSUNMLCBtb2RlbE5hbWUsIHNlZWQsIGl0ZXJhdGlvbikKCm1pY2xfcmVzdWx0cyAlPiUKICAgIGdyb3VwX2J5KGl0ZXJhdGlvbiwgdHJhY2tlciwgRykgJT4lCiAgICBzdW1tYXJpc2UobWF4SUNMID0gbWF4KElDTCkpICU+JSAKICAgIHVuZ3JvdXAoKSAlPiUKICAgIGZpbHRlcih0cmFja2VyID09ICJwcmFhdCIpICU+JSAKICAgICMgbXV0YXRlKFRyYWNrZXIgPSBzdHJfdG9fdGl0bGUodHJhY2tlcikpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKEcpLCB5ID0gbWF4SUNMKSkgKwogICAgZ2dyYXN0cjo6Z2VvbV9wb2ludF9yYXN0KCkgKwogICAgIyBmYWNldF93cmFwKH4gVHJhY2tlciwgbmNvbCA9IDIpICsKICAgIGdncmVwZWw6Omdlb21fbGFiZWxfcmVwZWwoCiAgICAgICAgZGF0YSA9IGZpbHRlcihtaWNsX2Jlc3QsIFRyYWNrZXIgPT0gIlByYWF0IiksCiAgICAgICAgYWVzKGxhYmVsID0gcm91bmQobWF4SUNMLCBkaWdpdHMgPSAwKSksCiAgICAgICAgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDAuMDMsICJucGMiKSwgdHlwZSA9ICJjbG9zZWQiLCBlbmRzID0gImxhc3QiKSwKICAgICAgICB2anVzdCA9IC0yLAogICAgICAgIGhqdXN0ID0gLTAuMjUKICAgICkgKwogICAgeGxhYigiRyAobnVtYmVyIG9mIGNsdXN0ZXJzKSIpICsKICAgIHlsYWIoIk1heC4gSUNMIikgCiAgICAKYGBgCioqRmlndXJlIGByIHBsYWNlaG9sZGVyYCoqIE1heGltdW0gaW50ZWdyYXRlZCBjb21wbGV0ZS1kYXRhIGxpa2VsaWhvb2QgKElDTCkgdmFsdWVzIGZyb20gMTAsMDAwIGl0ZXJhdGlvbnMgb2YgZml0dGluZyBHYXVzc2lhbiBtaXh0dXJlIG1vZGVscyAoR01Ncykgb250byB6LW5vcm1hbGl6ZWQgbWlkLXBvaW50IGZvcm1hbnQgZmlyc3QgYW5kIHNlY29uZCBmb3JtYW50IHZhbHVlcywgbWVhc3VyZWQgdXNpbmcgdHdvIGZvcm1hbnQgdHJhY2tlcnMgKEZvcmVzdCwgUHJhYXQpLiBBcnJvd2VkIHRleHQgbGFiZWxzIGFubm90YXRlZCB0aGUgbWF4aW11bSBJQ0wgdmFsdWUgZm9yIEcsIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgZml0dGVkIGJ5IHRoZSBHTU0uIAoKIyBDb21wYXJpc29uIGJldHdlZW4gb3B0aW1hbCBtb2RlbHMgYW5kIGh1bWFuIGFubm90YXRvcnMKCmBgYHtyIFNldHVwIHRvIHNob3cgb3B0aW1hbCBtb2RlbHMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cmdyb3VwX2NvbG9ycyA8LSBjKCIjZTQxYTFjIiwgIiMzNzdlYjgiLCAiIzRkYWY0YSIsICIjOTg0ZWEzIiwgIiNmZjdmMDAiKQpncm91cF9zaGFwZXMgPC0gYygwLDEsMiw1LDYpCgptY2x1c3RfYmVzdF9yZXN1bHRzIDwtIHdpdGgoCiAgICBkYXRhID0gbWljbF9iZXN0LAogICAgcG1hcCgKICAgICAgICBsaXN0KHN0cl90b19sb3dlcihUcmFja2VyKSwgRywgbW9kZWxOYW1lLCBzZWVkKSwKICAgICAgICBmdW5jdGlvbih0cmFja2VyLCBHLCBtb2RlbE5hbWUsIHNlZWQpIHsKICAgICAgICAgICAgICAgIGRmIDwtIHNhbXBsZV92b3dlbF9taWRwb2ludHModHJhY2tlciA9IHRyYWNrZXIsIHNlZWQgPSBzZWVkKQogICAgICAgICAgICAgICAgbmFtZXMoZGYpWzE6Ml0gPC0gYygiZjFfeiIsICJmMl96IikKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0LnNlZWQoc2VlZCkKICAgICAgICAgICAgICAgIG1jbHVzdF9maXQgPC0gTWNsdXN0KAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZlssIDE6Ml0sCiAgICAgICAgICAgICAgICAgICAgRyA9IEcsCiAgICAgICAgICAgICAgICAgICAgbW9kZWxOYW1lID0gbW9kZWxOYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9ucyA8LQogICAgICAgICAgICAgICAgICAgIGNiaW5kKAogICAgICAgICAgICAgICAgICAgICAgICBHLAogICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLCAKICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCwKICAgICAgICAgICAgICAgICAgICAgICAgZGYsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ID0gbWNsdXN0X2ZpdCRjbGFzc2lmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5jZXJ0YWludHkgPSBtY2x1c3RfZml0JHVuY2VydGFpbnR5LAogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKICAgICAgICAgICAgICAgICAgICApICU+JQogICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihzZWxlY3Qodm93ZWxzX21lZF9hbmFseXNpcywgc291cmNlX2ZpbGU6YmFzZV92b3dlbCwgYW5ub3RhdG9yKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgY2VudHJlcyA8LQogICAgICAgICAgICAgICAgICAgIG1jbHVzdF9maXQkcGFyYW1ldGVycyRtZWFuICU+JQogICAgICAgICAgICAgICAgICAgIGNiaW5kKHJvdy5uYW1lcyguKSwgLikgJT4lCiAgICAgICAgICAgICAgICAgICAgYXNfdGliYmxlKCkgJT4lCiAgICAgICAgICAgICAgICAgICAgc2V0X25hbWVzKGMoImZvcm1hbnQiLCAxOm1jbHVzdF9maXQkRykpICU+JQogICAgICAgICAgICAgICAgICAgIGdhdGhlcihrZXkgPSBjbHVzdCwgdmFsdWUgPSBjZW50cmUsIC1mb3JtYW50KSAlPiUKICAgICAgICAgICAgICAgICAgICBzcHJlYWQoa2V5ID0gZm9ybWFudCwgdmFsdWUgPSBjZW50cmUpICU+JQogICAgICAgICAgICAgICAgICAgIG11dGF0ZV9hbGwoYXMubnVtZXJpYykKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAiY2xhc3NpZmljYXRpb25zIiA9IGNsYXNzaWZpY2F0aW9ucywKICAgICAgICAgICAgICAgICAgICAiY2VudHJlcyIgPSBjZW50cmVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgKQoKIyBSZS1tYXAgbWNsdXN0J3MgW2FyYml0cmFyeV0gcmV0dXJuZWQgY2x1c3RlciBudW1iZXJzIG9mIGNyb3NzLWNvbXBhcmFibGUgZ3JvdXBzCnRocmVlX21hcHBpbmdzIDwtIC4gJT4lCiAgICBtdXRhdGUoCiAgICAgICAgb2NsdXN0ID0gY2x1c3QsCiAgICAgICAgY2x1c3QgID0gY2FzZV93aGVuKAogICAgICAgICAgICBvY2x1c3QgPT0gMSB+IDEsCiAgICAgICAgICAgIG9jbHVzdCA9PSAyIH4gMywKICAgICAgICAgICAgVFJVRSB+IDIKICAgICAgICApCiAgICApCgptY2x1c3RfYmVzdF9yZXN1bHRzW1syXV0kY2xhc3NpZmljYXRpb25zIDwtIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzJdXSRjbGFzc2lmaWNhdGlvbnMgJT4lIHRocmVlX21hcHBpbmdzCm1jbHVzdF9iZXN0X3Jlc3VsdHNbWzJdXSRjZW50cmVzIDwtIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzJdXSRjZW50cmVzICU+JSB0aHJlZV9tYXBwaW5ncwptY2x1c3RfYmVzdF9yZXN1bHRzW1s2XV0kY2xhc3NpZmljYXRpb25zIDwtIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzZdXSRjbGFzc2lmaWNhdGlvbnMgJT4lIHRocmVlX21hcHBpbmdzCm1jbHVzdF9iZXN0X3Jlc3VsdHNbWzZdXSRjZW50cmVzIDwtIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzZdXSRjZW50cmVzICU+JSB0aHJlZV9tYXBwaW5ncwoKIyBoYXZlIHRvIGRvIDQgZm9yZXN0IGFuZCA0IHByYWF0IGRpZmZlcmVudGx5IDooCmZvdXJfZl9tYXBwaW5ncyA8LSAuICU+JQogICAgbXV0YXRlKAogICAgICAgIG9jbHVzdCA9IGNsdXN0LAogICAgICAgIGNsdXN0ICA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgb2NsdXN0ID09IDIgfiAxLAogICAgICAgICAgICBvY2x1c3QgPT0gMSB+IDIsCiAgICAgICAgICAgIG9jbHVzdCA9PSAzIH4gMywKICAgICAgICAgICAgVFJVRSB+IDQKICAgICAgICApCiAgICApCgptY2x1c3RfYmVzdF9yZXN1bHRzW1szXV0kY2xhc3NpZmljYXRpb25zIDwtIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzNdXSRjbGFzc2lmaWNhdGlvbnMgJT4lIGZvdXJfZl9tYXBwaW5ncwptY2x1c3RfYmVzdF9yZXN1bHRzW1szXV0kY2VudHJlcyA8LSBtY2x1c3RfYmVzdF9yZXN1bHRzW1szXV0kY2VudHJlcyAlPiUgZm91cl9mX21hcHBpbmdzCgpmb3VyX3BfbWFwcGluZ3MgPC0gLiAlPiUKICAgIG11dGF0ZSgKICAgICAgICBvY2x1c3QgPSBjbHVzdCwKICAgICAgICBjbHVzdCAgPSBjYXNlX3doZW4oCiAgICAgICAgICAgIG9jbHVzdCA9PSAxIH4gMSwKICAgICAgICAgICAgb2NsdXN0ID09IDIgfiA0LAogICAgICAgICAgICBvY2x1c3QgPT0gNCB+IDMsCiAgICAgICAgICAgIFRSVUUgfiAyCiAgICAgICAgKQogICAgKQoKbWNsdXN0X2Jlc3RfcmVzdWx0c1tbN11dJGNsYXNzaWZpY2F0aW9ucyA8LSBtY2x1c3RfYmVzdF9yZXN1bHRzW1s3XV0kY2xhc3NpZmljYXRpb25zICU+JSBmb3VyX3BfbWFwcGluZ3MKbWNsdXN0X2Jlc3RfcmVzdWx0c1tbN11dJGNlbnRyZXMgPC0gbWNsdXN0X2Jlc3RfcmVzdWx0c1tbN11dJGNlbnRyZXMgJT4lIGZvdXJfcF9tYXBwaW5ncwoKIyBoYXZlIHRvIGRvIDUgZm9yZXN0IGFuZCA1IHByYWF0IGRpZmZlcmVudGx5IHRvbyA6KApmaXZlX2ZfbWFwcGluZ3MgPC0gLiAlPiUKICAgIG11dGF0ZSgKICAgICAgICBvY2x1c3QgPSBjbHVzdCwKICAgICAgICBjbHVzdCA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgb2NsdXN0ID09IDEgfiAxLAogICAgICAgICAgICBvY2x1c3QgPT0gMiB+IDMsCiAgICAgICAgICAgIG9jbHVzdCA9PSA1IH4gMiwKICAgICAgICAgICAgb2NsdXN0ID09IDMgfiA1LAogICAgICAgICAgICBUUlVFIH4gNAogICAgICAgICkKICAgICkKCm1jbHVzdF9iZXN0X3Jlc3VsdHNbWzRdXSRjbGFzc2lmaWNhdGlvbnMgPC0gbWNsdXN0X2Jlc3RfcmVzdWx0c1tbNF1dJGNsYXNzaWZpY2F0aW9ucyAlPiUgZml2ZV9mX21hcHBpbmdzCm1jbHVzdF9iZXN0X3Jlc3VsdHNbWzRdXSRjZW50cmVzIDwtIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzRdXSRjZW50cmVzICU+JSBmaXZlX2ZfbWFwcGluZ3MKCmZpdmVfcF9tYXBwaW5ncyA8LSAuICU+JQogICAgbXV0YXRlKAogICAgICAgIG9jbHVzdCA9IGNsdXN0LAogICAgICAgIGNsdXN0ID0gY2FzZV93aGVuKAogICAgICAgICAgICBvY2x1c3QgPT0gNCB+IDEsCiAgICAgICAgICAgIG9jbHVzdCA9PSAzIH4gMiwKICAgICAgICAgICAgb2NsdXN0ID09IDUgfiAzLAogICAgICAgICAgICBvY2x1c3QgPT0gMSB+IDQsCiAgICAgICAgICAgIFRSVUUgfiA1CiAgICAgICAgKQogICAgKQoKbWNsdXN0X2Jlc3RfcmVzdWx0c1tbOF1dJGNsYXNzaWZpY2F0aW9ucyA8LSBtY2x1c3RfYmVzdF9yZXN1bHRzW1s4XV0kY2xhc3NpZmljYXRpb25zICU+JSBmaXZlX3BfbWFwcGluZ3MKbWNsdXN0X2Jlc3RfcmVzdWx0c1tbOF1dJGNlbnRyZXMgPC0gbWNsdXN0X2Jlc3RfcmVzdWx0c1tbOF1dJGNlbnRyZXMgJT4lIGZpdmVfcF9tYXBwaW5ncwoKYGBgCgpgYGB7ciBTZXR1cCBjb21wYXJpc29uIHdpdGggYW5ub3RhdG9ycywgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KCnZvd2VsX2xldmVscyA8LSBjKAogICAgImEiLCAiw6YiLCAiyZAiLCAiyZEiLCAiyZIiLAogICAgIsmZIiwgIsmbIiwgIsmYIiwgIsmaIiwgIsmcIiwKICAgICJlIiwgIs61IiwgImkiLCAixK0iLCAiyaoiLCAiyagiLAogICAgIm8iLCAiyZQiLCAidSIsICLKiSIsICLKiiIsICLKjCIKKQoKdGFsbHlfcGlwZWxpbmUgPC0gLiAlPiUKICAgIGdyb3VwX2J5KEcsIHRyYWNrZXIsIGNsdXN0LCBiYXNlX3Zvd2VsKSAlPiUKICAgIHN1bW1hcmlzZShuX3Zvd2VscyA9IG4oKSkgJT4lCiAgICB1bmdyb3VwICU+JQogICAgdGlkeXI6OmNvbXBsZXRlKEcsIHRyYWNrZXIsIGNsdXN0LCBiYXNlX3Zvd2VsLCBmaWxsID0gbGlzdChuX3Zvd2VscyA9IDApKSAlPiUKICAgIGdyb3VwX2J5KEcsIHRyYWNrZXIsIGNsdXN0KSAlPiUgCiAgICBtdXRhdGUoCiAgICAgICAgcGNfdm93ZWxzICAgPSBuX3Zvd2VscyAvIHN1bShuX3Zvd2VscykgKiAxMDAsCiAgICAgICAgY2x1c3RfdG90YWwgPSBzdW0obl92b3dlbHMpCiAgICApICU+JSAKICAgIHVuZ3JvdXAgJT4lCiAgICBtdXRhdGUoCiAgICAgICAgIyBjbHVzdCAgICAgID0gcGFzdGUoY2x1c3QsICIgKG4gPSAiLCBjbHVzdF90b3RhbCwgIikiLCBzZXAgPSAiIiksCiAgICAgICAgYmFzZV92b3dlbCA9IGZhY3RvcihiYXNlX3Zvd2VsLCBsZXZlbHMgPSB2b3dlbF9sZXZlbHMpCiAgICApCgpwbG90X3Zvd2VsX3RhbGxpZXMgPC0gZnVuY3Rpb24oZGYpIHsKICAgIGRmICU+JQogICAgbXV0YXRlKGNsdXN0ID0gcGFzdGUobWF4KGRmJEcpLCAiRyIsIGNsdXN0LCBzZXAgPSAiIikpICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGJhc2Vfdm93ZWwsIHkgPSBwY192b3dlbHMpKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgYWVzKGZpbGwgPSB0cmFja2VyKSwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvciA9ICJibGFjayIpICsKICAgIGZhY2V0X3dyYXAofiBjbHVzdCwgc2NhbGVzID0gImZyZWVfeCIsIG5jb2wgPSAxKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMDApKSArCiAgICB5bGFiKCJQZXJjZW50IGxhYmVsIHVzYWdlIHdpdGhpbiBjbHVzdGVyIikgKwogICAgeGxhYigiSVBBIGxhYmVsIHVzZWQgYnkgYW5ub3RhdG9ycyIpICsgCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ3aGl0ZSIsICJncmV5IikpCiAgICAjICsgZ2d0aXRsZShwYXN0ZTAoIkcgPSAiLCBtYXgoZGYkRykpKQp9CgptY2x1c3RfYmVzdF90YWxsaWVzIDwtIGxhcHBseShtY2x1c3RfYmVzdF9yZXN1bHRzLCBmdW5jdGlvbihmaXQpIHsgdGFsbHlfcGlwZWxpbmUoZml0JGNsYXNzaWZpY2F0aW9ucykgfSApCgpgYGAKCiMjIyAyLWNsdXN0ZXIgYW5kIDMtY2x1c3RlciBtb2RlbHMKCmBgYHtyIFBsb3QgMi0gYW5kIDMtY2x1c3RlciBtb2RlbHMsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQoKZ3JpZC5hcnJhbmdlKAogICAgcGxvdF9tY2x1c3RfZm9ybWFudHMobWNsdXN0X2Jlc3RfcmVzdWx0c1tbNV1dLCBncm91cF9jb2xvcnMsIGdyb3VwX3NoYXBlcyksCiAgICBtY2x1c3RfYmVzdF90YWxsaWVzW1s1XV0gJT4lIHBsb3Rfdm93ZWxfdGFsbGllcygpLAogICAgbmNvbCA9IDIsCiAgICBsYXlvdXRfbWF0cml4ID0gcmJpbmQoCiAgICAgICAgYygxLDEsMSxOQSxOQSxOQSksCiAgICAgICAgYygxLDEsMSxOQSxOQSxOQSksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSxOQSxOQSxOQSksCiAgICAgICAgYygxLDEsMSxOQSxOQSxOQSkKICAgICkKKQoKCmdyaWQuYXJyYW5nZSgKICAgIHBsb3RfbWNsdXN0X2Zvcm1hbnRzKG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzZdXSwgZ3JvdXBfY29sb3JzLCBncm91cF9zaGFwZXMpLAogICAgbWNsdXN0X2Jlc3RfdGFsbGllc1tbNl1dICU+JSBwbG90X3Zvd2VsX3RhbGxpZXMoKSwKICAgIG5jb2wgPSAyLAogICAgbGF5b3V0X21hdHJpeCA9IHJiaW5kKAogICAgICAgIGMoMSwxLDEsTkEsTkEsTkEpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsMiwyLDIpLAogICAgICAgIGMoMSwxLDEsTkEsTkEsTkEpCiAgICApCikKCmBgYAoKIyMjIDQtY2x1c3RlciBhbmQgNS1jbHVzdGVyIG1vZGVscwoKYGBge3IgUGxvdCA0LSBhbmQgNS1jbHVzdGVyIG1vZGVscywgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTd9CgpncmlkLmFycmFuZ2UoCiAgICBwbG90X21jbHVzdF9mb3JtYW50cyhtY2x1c3RfYmVzdF9yZXN1bHRzW1s3XV0sIGdyb3VwX2NvbG9ycywgZ3JvdXBfc2hhcGVzKSwKICAgIG1jbHVzdF9iZXN0X3RhbGxpZXNbWzddXSAlPiUgcGxvdF92b3dlbF90YWxsaWVzKCksCiAgICBuY29sID0gMiwKICAgIGxheW91dF9tYXRyaXggPSByYmluZCgKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKSwKICAgICAgICBjKDEsMSwxLDIsMiwyKQogICAgKQopCgpncmlkLmFycmFuZ2UoCiAgICBwbG90X21jbHVzdF9mb3JtYW50cyhtY2x1c3RfYmVzdF9yZXN1bHRzW1s4XV0sIGdyb3VwX2NvbG9ycywgZ3JvdXBfc2hhcGVzKSwKICAgIG1jbHVzdF9iZXN0X3RhbGxpZXNbWzhdXSAlPiUgcGxvdF92b3dlbF90YWxsaWVzKCksCiAgICBuY29sID0gMiwKICAgIGxheW91dF9tYXRyaXggPSByYmluZCgKICAgICAgICAjIGMoMSwxLDEsTkEsTkEsTkEpLAogICAgICAgICMgYygxLDEsMSxOQSxOQSxOQSksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYygxLDEsMSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMiksCiAgICAgICAgYyhOQSxOQSxOQSwyLDIsMikKICAgICAgICAjIGMoMSwxLDEsTkEsTkEsTkEpLAogICAgICAgICMgYygxLDEsMSxOQSxOQSxOQSkKICAgICkKKQoKYGBgCgojIENvbXBhcmlzb24gYWNyb3NzIG9wdGltYWwgbW9kZWxzIGFuZCBodW1hbiBhbm5vdGF0b3JzCgpgYGB7ciBNb3N0IGZyZXF1ZW50bHktYXNzaWduZWQgSVBBIGxhYmVsc30KbWNsdXN0X2Jlc3RfdGFsbGllc1s1OjhdICU+JQogICAgYmluZF9yb3dzKCkgJT4lCiAgICBmaWx0ZXIocGNfdm93ZWxzID4gMTApICU+JQogICAgc2VsZWN0KC10cmFja2VyKSAlPiUKICAgIG11dGF0ZShwY192b3dlbHMgPSByb3VuZChwY192b3dlbHMsIGRpZ2l0cyA9IDApKQpgYGAKCiMjIERpc3RyaWJ1dGlvbiBvZiBub24tdG9uaWMgc2Nod2FzCgpgYGB7ciBOb24tdG9uaWMgc2Nod2FzLCBtZXNzYWdlPUZBTFNFfQptY2x1c3RfYmVzdF9yZXN1bHRzWzU6OF0gJT4lCiAgICBtYXBfZGYofiAuJGNsYXNzaWZpY2F0aW9ucykgJT4lCiAgICBsZWZ0X2pvaW4oCiAgICAgICAgdGliYmxlKAogICAgICAgICAgICBHID0gYygyLDMsNCw1KSwKICAgICAgICAgICAgY2x1c3QgPSBjKDIsMiw0LDUpLAogICAgICAgICAgICBiYXNlX3Zvd2VsID0gIsmZIgogICAgICAgICksCiAgICAgICAgLgogICAgKSAlPiUKICAgIG11dGF0ZShpc190b25pYyA9IHZvd2VsX251bSA9PSAxKSAlPiUKICAgIGdyb3VwX2J5KEcsIGNsdXN0LCBpc190b25pYykgJT4lCiAgICB0YWxseSgpICU+JQogICAgZ3JvdXBfYnkoRywgY2x1c3QpICU+JQogICAgbXV0YXRlKHBjID0gbiAvIHN1bShuKSAqIDEwMCkKCmBgYAoKCiMgRGlzdHJpYnV0aW9uIG9mIGNvbnRleHRzIHdpdGhpbiB2b3dlbCBjYXRlZ29yaWVzCgpgYGB7ciBDb21wdXRlIGRpc3RyaWJ1dGlvbiBvZiBjb250ZXh0cywgaW5jbHVkZT1GQUxTRX0KY29uc29uYW50cyA8LSByZWFkX2NzdihoZXJlKCJkYXRhL2V4dGVybmFsL2NvbnNvbmFudHMuY3N2IikpCnZvd2VscyAgICAgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YS9leHRlcm5hbC92b3dlbHMuY3N2IikpCmhlYWR3b3JkcyAgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YS9leHRlcm5hbC9oZWFkd29yZHMuY3N2IikpCgpwcmVjbHVzdGVyX2Fubm90YXRpb25zIDwtIAogICAgdm93ZWxzX21lZF9hbmFseXNpcyAlPiUKICAgIGdyb3VwX2J5KHNvdXJjZV9maWxlLCByZXBfbnVtLCB2b3dlbF9udW0pICU+JQogICAgc2VsZWN0KGFubm90YXRvcikgJT4lIAogICAgbmVzdCgpICU+JQogICAgbXV0YXRlKHRva2VuX2Fubm90YXRvcnMgPSBtYXBfY2hyKGRhdGEsIH4gcHVsbCguLCAiYW5ub3RhdG9yIikgJT4lIHBhc3RlMChjb2xsYXBzZSA9ICIsICIpKSkgJT4lCiAgICB1bm5lc3QoKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUKICAgICMgVG8gc29sdmUuIFdoYXQgdG8gZG8gYWJvdXQgdG9rZW5zIHdpdGggbm90IGV4YWN0bHkgMiBhbm5vdGF0b3JzIChzb21lIDEsIHNvbWUgbW9yZSB0aGFuIDIpOyB2ZXJ5IHJhcmUsIHRob3VnaAogICAgZmlsdGVyKHN0cl9jb3VudCh0b2tlbl9hbm5vdGF0b3JzLCAiLCIpID09IDEpCgpjb25zdF9ncm91cHMgPC0gZXhwYW5kLmdyaWQoCiAgICBjMSA9IGNvbnNvbmFudHMkY29uc3QsCiAgICBjMiA9IGNvbnNvbmFudHMkY29uc3QsCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JQogICAgbXV0YXRlKGNvbnN0X2N0eCA9IHBhc3RlKGMxLCBjMiwgc2VwID0gIl8iKSkgJT4lCiAgICBsZWZ0X2pvaW4ocmVuYW1lKGNvbnNvbmFudHMsIGMxID0gY29uc3QsIGMxX2dyb3VwID0gY29uc3RfcGxhY2UpKSU+JQogICAgbGVmdF9qb2luKHJlbmFtZShjb25zb25hbnRzLCBjMiA9IGNvbnN0LCBjMl9ncm91cCA9IGNvbnN0X3BsYWNlKSkgJT4lCiAgICBtdXRhdGUoY29uc3RfZ3JvdXAgPSBwYXN0ZShjMV9ncm91cCwgYzJfZ3JvdXAsIHNlcCA9ICJfIikpICU+JQogICAgc2VsZWN0KGNvbnN0X2N0eCwgY29uc3RfZ3JvdXApCgpjb25zdF9kaXN0c19hbmFseXNpcyA8LSAKICAgIG1jbHVzdF9iZXN0X3Jlc3VsdHNbWzddXSRjbGFzc2lmaWNhdGlvbnMgJT4lCiAgICBsZWZ0X2pvaW4ocHJlY2x1c3Rlcl9hbm5vdGF0aW9ucykgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKHRva2VuX2Fubm90YXRvcnMpKSAlPiUgCiAgICAjIFNlZSBwcm9ibGVtIGFib3ZlLiBTZXBhcmF0ZSB3aWxsIGZhaWwgaWYgbm90IGV4YWN0bHkgMiBwaWVjZXMgdG8gc2VwYXJhdGUgaW50by4KICAgIHNlcGFyYXRlKHRva2VuX2Fubm90YXRvcnMsIGludG8gPSBjKCJhMSIsICJhMiIpLCBzZXAgPSAiLCAiKSAlPiUgCiAgICBtdXRhdGUoCiAgICAgICAgb3RoZXJfYW5ub3QgPSBpZmVsc2UoYW5ub3RhdG9yICE9IGExLCBhMSwgYTIpIAogICAgKSAlPiUKICAgIGxlZnRfam9pbih2b3dlbHNfbWVkX2FuYWx5c2lzICU+JSBzZWxlY3Qoc291cmNlX2ZpbGUsIHJlcF9udW0sIHZvd2VsX251bSwgYW5ub3RhdG9yLCBjb25zdF9jdHgpKSAlPiUKICAgIGxlZnRfam9pbih2b3dlbHNfbWVkX2FuYWx5c2lzICU+JSBzZWxlY3Qoc291cmNlX2ZpbGUsIHJlcF9udW0sIHZvd2VsX251bSwgb3RoZXJfYW5ub3QgPSBhbm5vdGF0b3IsIG90aGVyX3Zvd2VsID0gYmFzZV92b3dlbCwgb3RoZXJfY3R4ID0gY29uc3RfY3R4KSkgJT4lCiAgICBsZWZ0X2pvaW4oCiAgICAgICAgdGliYmxlKAogICAgICAgICAgICBjbHVzdCA9IGMoMSwgMiwgMywgNCksCiAgICAgICAgICAgIGdtbV9ncm91cCA9IGMoImNlbnRyYWwiLCAibG93IiwgImZyb250IiwgImJhY2siKQogICAgICAgICkKICAgICkgJT4lCiAgICBsZWZ0X2pvaW4ocmVuYW1lKHZvd2VscywgYTFfdmdyb3VwID0gdm93ZWxfZ3JvdXApKSAlPiUKICAgIGxlZnRfam9pbihyZW5hbWUodm93ZWxzLCBvdGhlcl92b3dlbCA9IGJhc2Vfdm93ZWwsIGEyX3Zncm91cCA9IHZvd2VsX2dyb3VwKSkgJT4lIAogICAgZmlsdGVyKGdtbV9ncm91cCA9PSBhMV92Z3JvdXAgfCBhMV92Z3JvdXAgPT0gYTJfdmdyb3VwKSAlPiUKICAgIGxlZnRfam9pbihjb25zdF9ncm91cHMpICU+JQogICAgbGVmdF9qb2luKHJlbmFtZShjb25zdF9ncm91cHMsIG90aGVyX2N0eCA9IGNvbnN0X2N0eCwgYTJfY29uc3RfZ3JvdXAgPSBjb25zdF9ncm91cCkpICU+JQogICAgZmlsdGVyKGNvbnN0X2dyb3VwID09IGEyX2NvbnN0X2dyb3VwKSAlPiUKICAgIGxlZnRfam9pbihtdXRhdGUoaGVhZHdvcmRzLCBoZWFkd29yZCA9IHN0cl90b19sb3dlcihoZWFkd29yZCkpKSAlPiUgCiAgICBzZXBhcmF0ZShjb25zdF9ncm91cCwgaW50byA9IGMoImNvbnN0X2xlZnQiLCAiY29uc3RfcmlnaHQiKSwgc2VwID0gIl8iKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKCJnbW1fZ3JvdXAiLCAiY29uc3RfbGVmdCIsICJjb25zdF9yaWdodCIpLCBmdW5zKHN0cl90b190aXRsZSkpCgpjb25zdF9kaXN0c19wbG90IDwtCiAgICBjb25zdF9kaXN0c19hbmFseXNpcyAlPiUgCiAgICBncm91cF9ieShnbW1fZ3JvdXAsIGNvbnN0X2xlZnQsIGNvbnN0X3JpZ2h0KSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgICBuX3Rva2VucyA9IG4oKSwKICAgICAgICBuX3R5cGVzICA9IHVuaXF1ZShoZWFkd29yZCkgJT4lIGxlbmd0aCgpCiAgICApICU+JQogICAgZ3JvdXBfYnkoZ21tX2dyb3VwKSAlPiUKICAgIG11dGF0ZSgKICAgICAgICBuX3Zvd2VscyA9IHN1bShuX3Rva2VucyksCiAgICAgICAgcGNfdG9rZW4gPSByb3VuZChuX3Rva2VucyAvIG5fdm93ZWxzICogMTAwLCAxKSwKICAgICAgICB0ZXh0ICAgICA9IHBhc3RlKHBjX3Rva2VuLCAiJVxuICgiLCBuX3R5cGVzLCAiKSIsIHNlcCA9ICIiKSwKICAgICAgICB2Z3JvdXBfbGFiZWwgPSBwYXN0ZShnbW1fZ3JvdXAsICIgKG4gPSAiLCBuX3Zvd2VscywgIikiLCBzZXAgPSAiIikKICAgICkKYGBgCgpgYGB7ciBQbG90IGNvbnRleHQgZGlzdHJpYnV0aW9ucywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY29uc3RfZGlzdHNfcGxvdCAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSBjb25zdF9yaWdodCwgeSA9IGNvbnN0X2xlZnQpKSArCiAgICBnZW9tX3RpbGUoYWVzKGZpbGwgPSBwY190b2tlbiksIGNvbG9yID0gImJsYWNrIikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHRleHQpKSArCiAgICBmYWNldF93cmFwKH4gdmdyb3VwX2xhYmVsLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIiNmZmZmZmYiLCBoaWdoID0gIiM5Njk2OTYiKSArCiAgICB4bGFiKCJGb2xsb3dpbmcgY29uc29uYW50IikgKwogICAgeWxhYigiUHJlY2VkaW5nIGNvbnNvbmFudCIpCmBgYAoKIyBEaXN0cmlidXRpb24gb2Ygdm93ZWwgY2F0ZWdvcmllcyBhY3Jvc3Mgdm93ZWwgcG9zaXRpb25zCgpgYGB7ciBQbG90IHBvc2l0aW9uIGRpc3RyaWJ1dGlvbnMsIGZpZy53aWR0aD04fQpjb25zdF9kaXN0c19hbmFseXNpcyAlPiUgCiAgICBncm91cF9ieSh2b3dlbF9udW0sIGdtbV9ncm91cCkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgICAgbl90b2tlbnMgPSBuKCksCiAgICAgICAgbl90eXBlcyAgPSB1bmlxdWUoaGVhZHdvcmQpICU+JSBsZW5ndGgoKQogICAgKSAlPiUKICAgIGZpbHRlcih2b3dlbF9udW0gPD0gNCkgJT4lIAogICAgZ3JvdXBfYnkodm93ZWxfbnVtKSAlPiUgCiAgICBtdXRhdGUoCiAgICAgICAgbl92b3dlbHMgPSBzdW0obl90b2tlbnMpLAogICAgICAgIHBjX3Rva2VuID0gcm91bmQobl90b2tlbnMgLyBuX3Zvd2VscyAqIDEwMCwgMSksCiAgICAgICAgdGV4dCAgICAgPSBwYXN0ZShwY190b2tlbiwgIiVcbiAoIiwgbl90b2tlbnMsICIpIiwgc2VwID0gIiIpLAogICAgICAgIHZncm91cF9sYWJlbCA9IHBhc3RlKGdtbV9ncm91cCwgIiAobiA9ICIsIG5fdm93ZWxzLCAiKSIsIHNlcCA9ICIiKQogICAgKSAlPiUKICAgIHVuZ3JvdXAgJT4lIAogICAgbXV0YXRlKAogICAgICAgIGJhcl9sYWJlbCA9IHBhc3RlKCIoIiwgbl90eXBlcywgIikiLCBzZXAgPSAiIiksCiAgICAgICAgdm93ZWxfbnVtID0gcGFzdGUoIk0iLCB2b3dlbF9udW0sICIgKG4gPSAiLCBuX3Zvd2VscywgIikiLCBzZXAgPSAiIikKICAgICkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoZ21tX2dyb3VwKSwgeSA9IHBjX3Rva2VuKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMC44KSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYmFyX2xhYmVsKSwgdmp1c3QgPSAtMC42LCB5ID0gMCkrCiAgICBmYWNldF93cmFwKH4gdm93ZWxfbnVtLCBuY29sID0gNSwgc2NhbGVzID0gImZyZWVfeCIpICsKICAgIHhsYWIoIk1lZGlhbCB2b3dlbCBwb3NpdGlvbiBpbiB3b3JkIikgKwogICAgeWxhYigiUHJvcG9ydGlvbiBvZiBvY2N1cnJlbmNlIHdpdGhpbiBwb3NpdGlvbiIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDY1KSkgKwogICAgdGhlbWUoCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiI2YwZjBmMCIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkKICAgICkKCmBgYAoKCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmgxLCBoMiwgaDMsIGg0LCBoNSB7IGZvbnQtc2l6ZToxLjFlbSB9Cjwvc3R5bGU+Cg==