Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyB1cGQuYwovLwovLyAkSWQ6IHVwZC5jIDg4NTAgMjAxNC0wNi0xMyAyMTozNDo0NFogWmVzc3RyYSAkCiNwcmFnbWEgc3RyaWN0X3R5cGVzCiNwcmFnbWEgc2F2ZV90eXBlcwojcHJhZ21hIHJhbmdlX2NoZWNrCiNwcmFnbWEgbm9fY2xvbmUKI3ByYWdtYSBwZWRhbnRpYwoKI2RlZmluZSBORUVEX1BST1RPVFlQRVMKI2luY2x1ZGUgPG1hZ2llci5oPgojaW5jbHVkZSA8cGxheWVyLmg+CiN1bmRlZiBORUVEX1BST1RPVFlQRVMKI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KI2luY2x1ZGUgPHdpemxldmVscy5oPgojaW5jbHVkZSA8bW92aW5nLmg+CiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CiNpbmNsdWRlIDxsb2dnaW5nLmg+CiNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+Cgp2YXJhcmdzIHN0YXRpYyBpbnQgX21ha2Uoc3RyaW5nIGZpbGUsIGludCBmbGFncywgaW50IHJlY3Vyc2l2ZSk7CgpzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpCnsKICByZXR1cm4gKHsoeyJ1cGQiLCJfdXBkIiwwLExFQVJORVJfTFZMfSksCiAgICAgICAgICAgKHsibG9hZCIsIl9sb2FkIiwwLExFQVJORVJfTFZMfSl9KTsKfQoKLy8KLy8gX3NhdmUoKTogU3BpZWxlciBpbiBSZXR0dW5nc3JhdW0gcmV0dGVuCi8vIG9iajogICAgICBTcGllbGVyb2JqZWt0KD8pCi8vIGludl9zYXZlOiBSZXR0dW5nc3JhdW1uYW1lIAovLyBSdWVja2dhYmU6IDAgd2VubiBrZWluIFNwaWVsZXJvYmpla3QKLy8gICAgICAgICAgICBTcGllbGVyb2JqZWt0LCBmYWxscyBkb2NoCi8vCgpzdGF0aWMgbWl4ZWQgX3NhdmUoIG9iamVjdCBvYmosIG9iamVjdCBpbnZfc2F2ZXIgKQp7IAogICAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaikgKQogICAgICB7IAogICAgICAgIG9iai0+bW92ZSggaW52X3NhdmVyLCBOT19DSEVDSyApOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgIHJldHVybiAwOwp9CgoKLy8KLy8gX3JlbG9hZCgpOiBPYmpla3QgbGFkZW4KLy8gZmlsZTogIEZpbGVuYW1lLiBNdXNzIGluIGRlciBGb3JtIC94eC94eC94eC5jIHZvcmxpZWdlbgovLyBjbG9uZTogID4gMCAtPiBFcyBzb2xsIGdlY2xvbnQgd2VyZGVuLCBlbnRoYWVsdCBPYmpla3RudW1tZXIgZGVzCi8vICAgICAgICAgICAgICAgIFZvcmdhZW5nZXJvYmpla3RlcwovLyBmbGFnczogS29tbWFuZG96ZWlsZW5vcHRpb25lbgovLyBlcnI6ICAgTGVlcnN0cmluZyBhbHMgUmVmZXJlbnogdWViZXJnZWJlbi4gRW50aGFlbHQgbmFjaCBkZW0KLy8gICAgICAgIEF1ZnJ1ZiB2b20gX3JlbG9hZCgpIGRpZSBGZWhsZXJtZWxkdW5nZW4gYWxzIFN0cmluZy4KLy8gUnVlY2tnYWJlOiBEYXMgbmV1IGVyemV1Z3RlIE9iamVrdCBiencuIGRhcyBzY2hvbiB2b3JoYW5kZW5lIE9iamVrdAovLyAgICAgICAgICAgIGJ6dy4gMCwgd2VubiBGZWhsZXIgYXVmdHJhdC4KLy8KCnByaXZhdGUgb2JqZWN0IF9yZWxvYWQoc3RyaW5nIGZpbGUsIGludCBjbG9uZSwgaW50IGZsYWdzLCBzdHJpbmcgZXJyKQp7CiAgb2JqZWN0IG9iajsKICAKICBpZiAoIW9iaj1maW5kX29iamVjdChmaWxlWzAuLjwzXSsoY2xvbmU/KCIjIitjbG9uZSk6IiIpKSkKICB7CiAgICBpbnQgcG9zLHBvczI7CiAgICBzdHJpbmcgYnQ7CgogICAgaWYoZmlsZV9zaXplKGZpbGUpPDApCiAgICB7CiAgICAgIGlmIChmaWxlX3NpemUoZmlsZSk9PS0xKQogICAgICAgIGVyciA9IHNwcmludGYoInVwZDogJXM6IERhdGVpIGV4aXN0aWVydCBuaWNodC5cbiIsIGZpbGUpOwogICAgICBlbHNlIC8vIGRpcmVjdG9yeQogICAgICAgIGVyciA9IHNwcmludGYoInVwZDogJXM6IFZlcnplaWNobmlzc2Uga29lbm5lbiBuaWNodCBnZWxhZGVuICIKICAgICAgICAgICAgICAgICAgICAgICJ3ZXJkZW4uXG4iLGZpbGUpOwogICAgICByZXR1cm4gb2JqOyAvLyAwCiAgICB9CiAgICBwb3MgPSBtYXgoZmlsZV9zaXplKF9fREVCVUdfTE9HX18pLDApOwoKICAgIGlmICgoZXJyID0gKGNsb25lP2NhdGNoKG9iaiA9IGNsb25lX29iamVjdChmaWxlKSk6CiAgICAgICAgICAgICAgICBjYXRjaChsb2FkX29iamVjdChmaWxlKSkgKSkgJiYgKGZsYWdzICYgVVBEX0IpKSAgICAgICAgCiAgICB7ICAgICAKICAgICAgaWYgKCggcG9zMj1maWxlX3NpemUoX19ERUJVR19MT0dfXykpID4gcG9zICkKICAgICAgICBlcnIrPXNwcmludGYoIlxuQmFja3RyYWNlOlxuJXMiLAogICAgICAgICAgICAgICAgICAgICByZWFkX2J5dGVzKF9fREVCVUdfTE9HX18scG9zLCBwb3MyLXBvcyApKTsKICAgICAgZWxzZQogICAgICAgIGVycis9c3ByaW50ZigiXG5LRUlOIEJBQ0tUUkFDRSBWRVJGVUVHQkFSIVxuIik7CiAgICB9CiAgICBpZiAoIWVyciYmIW9iaiYmKCFvYmogPSBmaW5kX29iamVjdChmaWxlWzAuLjwzXSkpKQogICAgICBlcnIgKz0gc3ByaW50ZiggInVwZDogJXM6IEJsdWVwcmludCBuYWNoIGRlbSBMYWRlbiB6ZXJzdG9lcnQuXG4iLGZpbGUgKTsKICB9CiAgZWxzZQogICAgZXJyPXNwcmludGYoInVwZDogT2JqZWt0IGV4aXN0aWVydCBzY2hvbjogJU9cbiIsb2JqKTsKICByZXR1cm4gb2JqOwp9CgoKLy8KLy8gX3VwZGF0ZSgpOiBGaWxlIHVwZGF0ZW4gLT4gQmx1ZXByaW50IGRlc3RydWN0ZW4KLy8gZmlsZTogIEZpbGVuYW1lCi8vIGR1bW15OiBzaW11bGllcmVuPyAoMS0+d2lyZCBuaWNodCBha3R1YWxpc2llcnQpCi8vIGZsYWdzOiBLb21tYW5kb3plaWxlbm9wdGlvbmVuCi8vIFJ1ZWNrZ2FiZTogLTE6IEtlaW5lIFZvbGx6dWdyaWZmCi8vICAgICAgICAgICAgIDA6IE9iamVrdCBpc3QgbmljaHQgZ2VsYWRlbgovLyAgICAgICAgICAgICAxOiBPcGVyYXRpb24gd2lyZCBkdXJjaGdlZnVlaHJ0Ci8vCgpwcml2YXRlIHZhcmFyZ3MgaW50IF91cGRhdGUoc3RyaW5nIGZpbGUsIGludCBkdW1teSwgaW50IGZsYWdzKQp7CiAgb2JqZWN0IG9iajsKICBzdHJpbmcgZXJyOwogIGlmICghZHVtbXkgJiYgIW9iamVjdHAob2JqID0gZmluZF9vYmplY3QoZmlsZSkpKSByZXR1cm4gMDsKICBpZiAoIUlTX0FSQ0godGhpc19vYmplY3QoKSkpCiAgewogICAgLy8gU2NocmVpYnJlY2h0ZSBudXIgcHJ1ZWZlbiwgd2VubiBlY2h0IGFrdHVhbGlzaWVydCB3ZXJkZW4gc29sbC4KICAgIGlmKCFkdW1teSAmJiAhTUFZX1dSSVRFKGZpbGUpKQogICAgICByZXR1cm4gKHByaW50ZigidXBkOqAlczogS2VpbmUgU2NocmVpYnJlY2h0ZSFcbiIsZmlsZSksIC0xKTsKICAgIGlmKCFNQVlfUkVBRChmaWxlKSkgCiAgICAgIHJldHVybiAocHJpbnRmKCJ1cGQ6ICVzOiBLZWluZSBMZXNlcmVjaHRlIVxuIiwgZmlsZSksIC0xKTsKICB9CiAgaWYgKGR1bW15KSByZXR1cm4gMTsKICAKICBpZiAoIGZsYWdzICYgVVBEX0QgKQogIHsKICAgIG9iamVjdCAqaW52OwogICAgaWYgKHNpemVvZihpbnYgPSBkZWVwX2ludmVudG9yeShvYmopKSkKICAgIHsKICAgICAgcHJpbnRmKCJ1cGQ6ICVzOiBFbnRmZXJuZSBPYmpla3RlIGltIEludmVudGFyXG4iLCBmaWxlICk7CiAgICAgIGlmICghKGZsYWdzJlVQRF9IKSkKICAgICAgewogICAgICAgIGlmKGVycj1jYXRjaChmaWx0ZXJfb2JqZWN0cyggaW52LCAicmVtb3ZlIiwgMSApKSkKICAgICAgICAgIHByaW50ZigidXBkOiAlczogRmVobGdlc2NobGFnZW4uIEdydW5kOlxuJXNcbiIsCiAgICAgICAgICAgICAgICAgZmlsZSxlcnIpOwogICAgICB9CiAgICAgIGlmIChzaXplb2YoaW52ID0gZGVlcF9pbnZlbnRvcnkob2JqKSkpCiAgICAgICAgZmlsdGVyKGludiwgZnVuY3Rpb24gdm9pZCAob2JqZWN0IG9iKQogICAgICAgICAgICB7ZGVzdHJ1Y3Qob2IpO30pOwogICAgfQogIH0KICBpZiAoIShmbGFncyZVUERfSCkpCiAgewogICAgaWYoZXJyID0gY2F0Y2gob2JqLT5yZW1vdmUoKSkpCiAgICAgIHByaW50ZigidXBkOiAlczogcmVtb3ZlKCkgZmVobGdlc2NobGFnZW4uIEF1ZnJ1ZiB2b24gIiArCiAgICAgICAgICAgICAiZGVzdHJ1Y3QoKS5cbiIsZmlsZSk7CiAgfQogIGlmKG9iamVjdHAob2JqKSkgZGVzdHJ1Y3Qob2JqKTsKICByZXR1cm4gMTsKfQoKCi8vCi8vIF9pbnN0YW5jZV91cGQoKTogQWxsZSBPYmpla3RlIG5hY2ggQ2xvbmVzIGRlcyBPYmpla3RzIGR1cmNoc3VjaGVuCi8vIGZpbGU6ICBGaWxlbmFtZSBkZXMgT2JqZWt0ZXMKLy8gZmxhZ3M6IEtvbW1hbmRvemVpbGVuYXJndW1lbnRlCi8vIG9iajogICBBa3R1ZWxsZXMgT2JqZWt0Ci8vIGluc3RhbmNlczogWmFobCBkZXIgZ2VmdW5kZW5lbiBJbnN0YW56ZW4KLy8KCnByaXZhdGUgdm9pZCBfaW5zdGFuY2VfdXBkKHN0cmluZyBmaWxlLCBpbnQgZmxhZ3MsIG1peGVkIG9iaiwgaW50IGluc3RhbmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0Y2FsbCkKewogaW50IGk7CiBpZiAoZmlyc3RjYWxsKQogICAgcHJpbnRmKCJ1cGQ6ICVzOiAlcyBJbnN0YW56ZW4uXG4iLGZpbGUsZmxhZ3MmVVBEX0E/IkFrdHVhbGlzaWVyZSI6IlN1Y2hlIik7CiAgCiAgd2hpbGUgKGdldF9ldmFsX2Nvc3QoKT4yMjAwMDAgJiYgaSA8IHNpemVvZihvYmopKQogIHsKICAgIGlmICghb2JqZWN0cChvYmpbaV0pKQogICAgICBpbnN0YW5jZXMtLTsKICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGZsYWdzJlVQRF9GJiYhKGZsYWdzJlVQRF9TKSkKICAgICAgICBwcmludGYoICJ1cGQ6ICVPIGdlZnVuZGVuIGluICVzXG4iLCBvYmpbaV0sCiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChvYmpbaV0pP29iamVjdF9uYW1lKGVudmlyb25tZW50KG9ialtpXSkpIAogICAgICAgICAgICAgICAgOiAia2VpbmVyIFVtZ2VidW5nIiApOwogICAgICBpZiAoZmxhZ3MmVVBEX0EpIF9tYWtlKG9iamVjdF9uYW1lKG9ialtpXSksIGZsYWdzICYgfihVUERfQXxVUERfRiksMSApOwogICAgfQogICAgaSsrOwogIH0KICBpZiAoaSA8IHNpemVvZihvYmopKSAKICAgIGNhbGxfb3V0KCAjJ19pbnN0YW5jZV91cGQvKicqLywyLGZpbGUsZmxhZ3Msb2JqW2kuLl0saW5zdGFuY2VzLDApOwogIGVsc2UKICAgIHByaW50ZiggInVwZDogJXM6ICVkIEluc3RhbnplbiAlc1xuIiwgZmlsZSwgaW5zdGFuY2VzLAogICAgICAgICAgICAoZmxhZ3MgJiBVUERfQSkgPyAiYWt0dWFsaXNpZXJ0IiA6ICJnZWZ1bmRlbiIgKTsKICByZXR1cm47Cn0KICAKICAKLy8KLy8gX2RvX21ha2UoKTogQWxsZSBnZWVyYnRlbiBPYmpla3RlIGJlYXJiZWl0ZW4gKGZ1ZXIgLW0vLXYpCi8vIGZpbGU6ICBOYW1lIGRlcyBGaWxlcwovLyBjbG9uZTogMCwgd2VubiBibHVlcHJpbnQsIGFuc29uc3RlbiBDbG9uZW51bW1lcgovLyBmbGFnczogS29tbWFuZG96ZWlsZW5wYXJhbWV0ZXIKLy8gZGVwOiAgIGdlc2NoYWNodGVsdGVzIEFycmF5IG1pdCBNZWxkdW5nZW4gKHdnLiBSZWt1cnNpb24pCi8vIHJlYWR5OiBBcnJheSBkZXIgc2Nob24gYmVhcmJlaXRldGVuIE9iamVrdGUgKHdnLiBSZWt1cnNpb24pCi8vIFJ1ZWNrZ2FiZTogQXJyYXkgZGVyIE9iamVrdG5hbWVuLCBkaWUgYmVhcmJlaXRldCB3dXJkZW4KLy8gICAgICAgICAgICAoQXJyYXkgaW4gQXJyYXkgaW4gLi4uKQovLyAKCnZhcmFyZ3MgcHJpdmF0ZSBpbnQgX2RvX21ha2UoIHN0cmluZyBmaWxlLGludCBjbG9uZSxpbnQgZmxhZ3MsbWl4ZWQgZGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKnJlYWR5ICkKewogIG9iamVjdCBvYmo7CiAgc3RyaW5nIGVycjsKICBzdHJpbmcgKmlsaXN0OwogIG1peGVkIGRvd25kZXBzOwogIGludCByZXQ7CiAgCiAgaWYgKCFwb2ludGVycChyZWFkeSkpIHJlYWR5ID0gKHt9KTsKICByZWFkeSArPSAoeyBmaWxlIH0pOwogIAogIGlmICggIShvYmogPSBfcmVsb2FkKGZpbGUsY2xvbmUsZmxhZ3MsJmVycikpKQogIHsKICAgIGRlcCArPSAoeyBlcnIgfSk7CiAgICByZXR1cm4gMDsKICB9CiAgCiAgaWxpc3QgPSBpbmhlcml0X2xpc3Qob2JqKS1yZWFkeTsKICAKICBkb3duZGVwcyA9ICh7fSk7CiAgCiAgd2hpbGUgKHNpemVvZihpbGlzdCkpCiAgewogICAgcmV0ID0gX2RvX21ha2UoIGlsaXN0WzBdLDAsZmxhZ3MsICZkb3duZGVwcywgJnJlYWR5ICl8fHJldDsKICAgIGlsaXN0WzAuLjBdID0gKHt9KTsKICAgIGlsaXN0IC09IHJlYWR5OwogIH0KICAKICBpZiAoIHJldHx8ZmlsZV90aW1lKGZpbGUpPnByb2dyYW1fdGltZShvYmopfHwoZmxhZ3MgJlVQRF9JKSkKICAgIGlmICggX21ha2UoIGZpbGUsIGZsYWdzICYgfihVUERfTXxVUERfSSkgLDEpIDwgMCApIAogICAgICBkZXAgPSAoeyAieyIgKyBleHBsb2RlKGZpbGUsIi8iKVs8MV0gKyAifSIsIGRvd25kZXBzIH0pOwogICAgZWxzZXsKICAgICAgZGVwID0gKHsgIlsiICsgZXhwbG9kZShmaWxlLCIvIilbPDFdICsgIl0iLCBkb3duZGVwcyB9KTsKICAgICAgcmV0ID0gMTsKICAgIH0KICBlbHNlIGlmIChmbGFncyZVUERfVikgZGVwICs9ICh7IGV4cGxvZGUoZmlsZSwiLyIpWzwxXSwgZG93bmRlcHMgfSk7CiAgcmV0dXJuIHJldDsKfQoKCi8vCi8vIF9tYWtlX2RlcCgpOiBBdXNnYWJlIGRlcyBFcmVyYnVuZ3NiYXVtZXMKLy8gT2JqZWt0ZSBpbSBBcnJheSBkZXAKLy8gcHJlZml4IGVudGhhZWx0IFplaWxlbmFuZmFuZyAoZnVlciBSZWt1cnNpb24pCi8vIFJ1ZWNrZ2FiZTogU3RyaW5nIG1pdCBkZW0gVmVyZXJidW5nc2JhdW0gZGVzIE9iamVrdGVzCi8vCgpwcml2YXRlIHN0cmluZyBfbWFrZV9kZXAoIG1peGVkIGRlcCwgc3RyaW5nIHByZWZpeCApCnsKICBzdHJpbmcgcmV0OwogIGludCBpLCBzaXplOwogIAogIHJldD0iIjsKICBzaXplPXNpemVvZihkZXApOwogIGZvciAoaT0wOyBpPHNpemU7aSsrKQogICAgaWYgKHBvaW50ZXJwKGRlcFtpXSkpCiAgICAgIHJldCArPSBfbWFrZV9kZXAoZGVwW2ldLHByZWZpeCArIChpIDwgKHNpemUtMSkgPyAifCAiOiIgIikpOwogICAgZWxzZSAKICAgICAgcmV0ICs9IHByZWZpeCArICIrLSIgKyBkZXBbaV0gKyAiXG4iOwogIHJldHVybiByZXQ7Cn0KCgovLwovLyBfaWxsZWdhbF9jbG9zdXJlKCk6IGlzdCBjbG9zdXJlIGluIGFyZyBhbiBvYmpla3QgZ2VidW5kZW4/Ci8vIGFyZzogY2xvc3VyZSgtYXJyYXkvbWFwcGluZykKLy8gUnVlY2tnYWJlOiAwIHdlbm4gYWxsZXMgb2theQovLyAgICAgICAgICAgIDEgd2VubiBjbG9zdXJlIGdlbG9lc2NodCB3ZXJkZW4gbXVzcwovLwoKcHJpdmF0ZSBpbnQgX2lsbGVnYWxfY2xvc3VyZSggbWl4ZWQgYXJnICkKewogIGludCBpLCBqOwogIHN0cmluZyAqaW5kaWNlczsKICAKICBpZiAoIGNsb3N1cmVwKGFyZykgJiYgIW9iamVjdHAocXVlcnlfY2xvc3VyZV9vYmplY3QoYXJnKSkgKQogICAgcmV0dXJuIDE7CiAgCiAgaWYgKCBwb2ludGVycChhcmcpICl7CiAgICBmb3IgKCBpID0gc2l6ZW9mKGFyZyk7IGktLTsgKQogICAgICBpZiAoIF9pbGxlZ2FsX2Nsb3N1cmUoYXJnW2ldKSApCiAgICAgICAgcmV0dXJuIDE7CiAgfQogIGVsc2UgaWYgKCBtYXBwaW5ncChhcmcpICl7CiAgICBpbmRpY2VzID0gbV9pbmRpY2VzKGFyZyk7CiAgICBmb3IgKCBpID0gc2l6ZW9mKGluZGljZXMpOyBpLS07ICkKICAgICAgZm9yICggaiA9IGdldF90eXBlX2luZm8oIGFyZywgMSApOyBqLS07ICkKICAgICAgICBpZiAoIF9pbGxlZ2FsX2Nsb3N1cmUoYXJnW2luZGljZXNbaV0sIGpdKSApCiAgICAgICAgICByZXR1cm4gMTsKICB9CiAgcmV0dXJuIDA7Cn0KCi8vCi8vIF9tYWtlKCk6IFVwZGF0ZSBmaWxlCi8vIGZpbGU6ICBGaWxlbmFtZQovLyBmbGFnczogS29tbWFuZG96ZWlsZW5hcmd1bWVudGUKLy8KCnZhcmFyZ3Mgc3RhdGljIGludCBfbWFrZShzdHJpbmcgZmlsZSwgaW50IGZsYWdzLGludCByZWN1cnNpdmUpCnsKICBzdHJpbmcgbXNnLCBlcnIsIGJsdWU7CiAgaW50IGluc3Q7CiAgb2JqZWN0IG9iaiwgaW52X3NhdmVyOwogIG1peGVkIHRtcDsKICAKICBtc2cgPSAiIjsKCiAgaWYgKCFmaWxlKSByZXR1cm4gcHJpbnRmKCAidXBkOiBLZWluIEZpbGVuYW1lIHVlYmVyZ2ViZW4hXG4iICksIFJFVF9GQUlMOwogICAgCi8vIEZpbGVuYW1lIGluIEJsdWUsIE9iamVrdG5hbWUgaW4gYmx1ZSwgSW5zdGFuem51bW1lciBpbiBpbnN0CgogIGlmIChzc2NhbmYoZmlsZSwiJXMjJWQiLGJsdWUsaW5zdCk9PTIpIGJsdWUgKz0gIi5jIjsKICBlbHNlIGJsdWUgPSBmaWxlICsgKGZpbGVbPDIuLl09PSIuYyIgPyAiIiA6ICIuYyIpOwoKLy8gQWxsZSBJbnN0YW56ZW4gZHVyY2hzdWNoZW4gaW0gRmFsbGUgdm9uIC1hIG9kZXIgLWYgCgogIGlmICgoZmxhZ3MgJiBVUERfTE9BRCkmJmZpbmRfb2JqZWN0KGZpbGUpKQogICAgcmV0dXJuIHByaW50ZigibG9hZDogJXM6IE9iamVrdCBpc3Qgc2Nob24gZ2VsYWRlbi5cbiIsZmlsZSksUkVUX09LOwogIAogIGlmICggZmxhZ3MgJiAoVVBEX0Z8VVBEX0EpKQogIHsKICAgIGlmIChpbnN0KSByZXR1cm4gcHJpbnRmKCAidXBkOiAlczogRWluZSBJbnN0YW56IGthbm4ga2VpbmUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb25lcyBoYWJlbi5cbiIsZmlsZSApLCBSRVRfRkFJTDsKICAgIGlmICgodG1wPV91cGRhdGUoZmlsZSwgMSxmbGFncykpPT0tMSkgCiAgICAgIHJldHVybiBwcmludGYoICJ1cGQ6ICVzOiBLZWluIFZvbGx6dWdyaWZmIGF1ZiBkaWUgIiArCiAgICAgICAgICAgICAgICAgICAgICJEYXRlaSBlcmxhdWJ0LlxuIixmaWxlKSwgUkVUX0ZBSUw7CiAgICBpZiAodG1wPT0wKSByZXR1cm4gUkVUX0ZBSUw7CgogICB0bXA9Y2xvbmVzKGJsdWVbMC4uPDNdLDIpOwogICAgaWYgKHNpemVvZih0bXApKQogICAgICBjYWxsX291dCggIydfaW5zdGFuY2VfdXBkLyonKi8sIDAsIGZpbGUsZmxhZ3MsdG1wLHNpemVvZih0bXApLDEpOwogICAgZWxzZQogICAgICBwcmludGYoICJ1cGQ6ICVzOiBLZWluZSBDbG9uZXMgdm9yaGFuZGVuIVxuIiwgYmx1ZVswLi48M10pOwoKICAgIGlmICggKGZsYWdzICYgVVBEX0YpICYmICEoZmxhZ3MgJihVUERfUnxVUERfTHxVUERfTE9BRCkpKSByZXR1cm4gUkVUX09LOyAKICAgIC8vIE5pY2h0cyBsYWRlbiAtPiBBdWNoIGtlaW4gQmFja3VwCiAgfQoKLy8gQmFja3VwcmF1bSBmZXN0bGVnZW4KICAgCiAgaWYoIGJsdWU9PUlOVl9TQVZFICkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJ1cGQ6IEFjaHR1bmc6IFJhdW0genVtIFp3aXNjaGVuc3BlaWNoZXJuIHNvbGwgZ2VsYWRlbiB3ZXJkZW4/IVxuIik7CiAgICAgICAgfSAKICBpZiAoICEoaW52X3NhdmVyPWxvYWRfb2JqZWN0KElOVl9TQVZFKSkgKQogIHsKICAgIHByaW50ZigidXBkOiAlczogUmF1bSB6dW0gWndpc2NoZW5zcGVpY2hlcm4gZGVzICIgKwogICAgICAgICAgICJSYXVtaW5oYWx0cyBpc3QgbmljaHQgbGFkYmFyLlxuIiArCiAgICAgICAgICAgIiAgICAgICAgICVzXG4iLGZpbGUsSU5WX1NBVkUpOwogICAgcmV0dXJuIFJFVF9GQUlMOwogIH0KCi8vIFdlbm4gZGFzIE9iamVrdCBleGlzdGllcnQgYnp3LiBEZWVwIGFrdHVhbGlzaWVydCB3ZXJkZW4gc29sbAoKICBpZiAoICghKGZsYWdzJlVQRF9MT0FEKSkmJgogICAgICAgKChvYmogPSBmaW5kX29iamVjdChmaWxlKSkgfHwgKGZsYWdzICYgKFVQRF9NfFVQRF9JKSkpKQogIHsKICAgIG9iamVjdCAqaW52LCBlbnYsICpwbF9pbnY7CiAgICBtYXBwaW5nIHBybzsKICAgIGludCBpOwogICAgbWl4ZWQgY29uZmlnZGF0YTsKICAgIGludCByZXN0b3JlX2NvbmZpZzsKCiAgICAvLyBXZW5uIE9iamVrdCBleGlzdGllcnQsIGRhbm4gSW5oYWx0IHVuZCBnZ2YuIERhdGVuIGF1cyBDb25maWd1cmUoKSBvZGVyCiAgICAvLyBQcm9wcyBzaWNoZXJuOgogICAgaWYgKG9iaikKICAgIHsKICAgICAgLy8gaW0gRmFsbCBVUERfQyBlcmZvbGd0IF9rZWluXyBBdXNsZXNlbiB1bmQgX2tlaW5lXyBSZXN0YXVyYXRpb24KICAgICAgLy8gbWl0dGVscyBDb25maWd1cmUoKQogICAgICBpZiAoICEgKGZsYWdzICYgVVBEX0MgKSApCiAgICAgIHsKICAgICAgICBjYXRjaChyZXN0b3JlX2NvbmZpZz0obWl4ZWQpY2FsbF9yZXNvbHZlZCgmY29uZmlnZGF0YSxvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyZSIsMCk7CiAgICAgICAgICAgICAgcHVibGlzaCk7CiAgICAgICAgLy8gV2VubiBVUERfQ09ORiBnZXNldHp0IHdpcmQsIF9tdXNzXyBkYXMgT2JqZWt0IGVpbiBvZWZmZW50bGljaGVzCiAgICAgICAgLy8gQ29uZmlndXJlKCkgZGVmaW5pZXJlbiwgc29uc3QgZXJmb2xndCBBYmJydWNoLgogICAgICAgIGlmICgoZmxhZ3MgJiBVUERfQ09ORikgJiYgIXJlc3RvcmVfY29uZmlnKQogICAgICAgIHsKICAgICAgICAgIHByaW50ZigidXBkOiAlczogaGF0IGtlaW4gQ29uZmlndXJlKCksIFplcnN0b2VydW5nIGFiZ2Vicm9jaGVuLlxuIixmaWxlKTsKICAgICAgICAgIHJldHVybiBSRVRfRkFJTDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCEoZmxhZ3MmVVBEX0QpJiYoZmxhZ3MmKFVQRF9MfFVQRF9SKSkpCiAgICAgIHsKICAgICAgICBpZiAoaT1zaXplb2YoaW52PShhbGxfaW52ZW50b3J5KG9iaiktKHswfSkpKSkKICAgICAgICB7CiAgICAgICAgICBtaXhlZCBpdGVtczsKICAgICAgICAgIC8vIEhlcmF1c2Jla29tbWVuLCBvYiBoaWVyIEl0ZW1zIGV4aXN0aWVyZW4sIGRpZSBwZXIgQWRkSXRlbSAKICAgICAgICAgIC8vIGVyemV1Z3Qgd2VyZGVuLiBEaWUgZHVlcmZlbiBuaWNodCBnZXNpY2hlcnQgd2VyZGVuLgogICAgICAgICAgaXRlbXM9KG1peGVkKW9iai0+UXVlcnlQcm9wKFBfSVRFTVMpOyAvLyBtaXhlZCwgZGEgYXJyYXkgb2YgYXJyYXlzCiAgICAgICAgICBpZiAocG9pbnRlcnAoaXRlbXMpJiZzaXplb2YoaXRlbXMpKQogICAgICAgICAgewogICAgICAgICAgICBpdGVtcz10cmFuc3Bvc2VfYXJyYXkoaXRlbXMpWzBdOwogICAgICAgICAgICB3aGlsZSAoaS0tKQogICAgICAgICAgICAgIGlmIChtZW1iZXIoaXRlbXMsIGludltpXSk9PS0xKQogICAgICAgICAgICAgICAgICAgIGludltpXS0+bW92ZShpbnZfc2F2ZXIsTk9fQ0hFQ0spOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSAvLyBJbiBkaWVzZW0gT2JqZWt0IHNpbmQga2VpbmUgSXRlbXMgZ2VzZXR6dC4KICAgICAgICAgICAgd2hpbGUgKGktLSkgaW52W2ldLT5tb3ZlKGludl9zYXZlcixOT19DSEVDSyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGludj1tYXAoIGRlZXBfaW52ZW50b3J5KG9iaiksICMnX3NhdmUvKicqLywgaW52X3NhdmVyICktKHswfSk7CiAgICAgIH0KICAgICAgZW52ID0gZW52aXJvbm1lbnQob2JqKTsKICAgICAgaWYgKCBmbGFncyAmIFVQRF9DICkKICAgICAgewogICAgICAgIHBybyA9IChtYXBwaW5nKShvYmotPlF1ZXJ5UHJvcGVydGllcygpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpbnYgPSAoe30pOwoKLy8gRXJlcmJ0ZSBPYmpla3RlIGR1cmNoc3VjaGVuLgogICAgaWYgKCBmbGFncyAmIChVUERfTXxVUERfSSkgKQogICAgewogICAgICBtaXhlZCBkZXA7CiAgICAgIGRlcCA9ICh7fSk7CiAgICAgIF9kb19tYWtlKCBibHVlLCBpbnN0LCBmbGFncyAmIH4oVVBEX018VVBEX0x8VVBEX1J8VVBEX0Z8VVBEX0EpLCAmZGVwICk7CiAgICAgIHByaW50ZiggX21ha2VfZGVwKCBkZXAsICIiICkgKyAiXG4iICk7CiAgICB9CiAgIAovLyBUYXRzYWVjaGxpY2hlbiBVcGRhdGUgZHVyY2hmdWVocmVuCiAgIAogICAgaWYgKCBfdXBkYXRlKGZpbGUsIDAsIGZsYWdzKTwgMCkgcmV0dXJuIFJFVF9GQUlMOwogICAgbXNnICs9IChpbnN0ID8gInplcnN0b2VydCIgOiAiYWt0dWFsaXNpZXJ0Iik7CiAgICAKLy8gTmV1IGxhZGVuID8/CiAgICBpZiAoIGZsYWdzICYgKFVQRF9SfFVQRF9MKSApCiAgICB7CiAgICAgIGlmICggb2JqID0gX3JlbG9hZCggYmx1ZSxpbnN0LGZsYWdzLCAmZXJyICkgKQogICAgICAgIG1zZyArPSAiLCAiICsgKGluc3QgPyAibmV1IGdlY2xvbnQiIDogIm5ldSBnZWxhZGVuIik7CiAgICAgCi8vIE5ldSBnZWxhZGVuOiBQcm9wZXJ0aWVzIHdpZWRlcmhlcnN0ZWxsZW4sIENsb3N1cmVzIGZpbHRlcm4gCiAgICAgIGlmICghZXJyKQogICAgICB7CiAgICAgICAgaWYgKCFvYmopIG9iaiA9IGZpbmRfb2JqZWN0KGZpbGUpOwogICAgICAgIC8vIFdlbm4gZ2V3dWVuc2NodCwgUHJvcHMgenVydWVja3NjaHJlaWJlbiAoaGF0IFByaW9yaXRhZXQgdm9yCiAgICAgICAgLy8gQ29uZmlndXJlKCksIHdlaWwgZXhwbGl6aXQgdm9tIE1hZ2llciBhbmdlZm9yZGVydCkuCiAgICAgICAgaWYgKCBwcm8gJiYgKGZsYWdzICYgVVBEX0MpICkKICAgICAgICB7CiAgICAgICAgICBzdHJpbmcgKm5hbWVzOwogICAgICAgICAgCiAgICAgICAgICBuYW1lcyA9IG1faW5kaWNlcyhwcm8pOwogICAgICAgICAgCiAgICAgICAgICAvLyBDbG9zdXJlcyBpbiAobWl0dGxlcndlaWxlKSB6ZXJzdG9lcnRlbiBPYmpla3RlbgogICAgICAgICAgLy8gcmF1c2ZpbHRlcm4sIGRhbWl0IGRpZSAoaG9mZmVudGxpY2gga29ycmVrdGVuKSBDbG9zdXJlcwogICAgICAgICAgLy8gaW0gbmV1IGdlY2xvbnRlbiBPYmpla3QgZXJoYWx0ZW4gYmxlaWJlbgogICAgICAgICAgZm9yICggaSA9IHNpemVvZihuYW1lcyk7IGktLTsgKQogICAgICAgICAgICBpZiAoIF9pbGxlZ2FsX2Nsb3N1cmUocHJvW25hbWVzW2ldLCBGX1ZBTFVFXSkgfHwKICAgICAgICAgICAgICAgICBfaWxsZWdhbF9jbG9zdXJlKHByb1tuYW1lc1tpXSwgRl9RVUVSWV9NRVRIT0RdKSB8fAogICAgICAgICAgICAgICAgIF9pbGxlZ2FsX2Nsb3N1cmUocHJvW25hbWVzW2ldLCBGX1NFVF9NRVRIT0RdKSApCiAgICAgICAgICAgICAgbV9kZWxldGUoIHBybywgbmFtZXNbaV0gKTsKICAgICAgICAgIAogICAgICAgICAgb2JqLT5TZXRQcm9wZXJ0aWVzKHBybyk7CiAgICAgICAgICBtc2cgKz0gIiwgUHJvcGVydGllcyBnZXNldHp0IjsKICAgICAgICB9CiAgICAgICAgLy8gV2VubiBrZWluIFVQRF9DLCB3aXJkIGdnZi4gZGFzIEVyZ2VibmlzIHZvbiBDb25maWd1cmUoKSB3aWVkZXIKICAgICAgICAvLyB1ZWJlcmdlYmVuLgogICAgICAgIGVsc2UgaWYgKHJlc3RvcmVfY29uZmlnKQogICAgICAgIHsKICAgICAgICAgIGludCBjb25mX3JlczsKICAgICAgICAgIGlmICghY2F0Y2goY29uZl9yZXM9KGludClvYmotPkNvbmZpZ3VyZShjb25maWdkYXRhKTsgcHVibGlzaCkKICAgICAgICAgICAgICAmJiBjb25mX3JlcyA9PSAxKQogICAgICAgICAgewogICAgICAgICAgICBtc2cgKz0gIiwgKHJlLSlrb25maWd1cmllcnQiOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICBtc2cgKz0gIiwgKFJlLSlLb25maWd1cmF0aW9uIGZlaGxnZXNjaGxhZ2VuIjsKICAgICAgICAgICAgaWYgKGZsYWdzICYgVVBEX0NPTkYpCiAgICAgICAgICAgICAgcHJpbnRmKCJ1cGQ6IERhdGVuIHZvbiAlcyBrb25udGVuIG5pY2h0IHJla29uZmlndXJpZXJ0IHdlcmRlbjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiJU9cbiIsIGZpbGUsIGNvbmZpZ2RhdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZW52KQogICAgICAgIHsKICAgICAgICAgIGlmICggb2JqLT5tb3ZlKCBlbnYsIE5PX0NIRUNLICkgPD0gMCApCiAgICAgICAgICAgIHByaW50ZiggInVwZDogLyVPIGtvbm50ZSBuaWNodCBpbiAvJU8genVydWVja2Jld2VndCB3ZXJkZW5cbiIsCiAgICAgICAgICAgICAgICAgICAgb2JqLCBlbnYgKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgbXNnICs9ICIsIGJld2VndCI7CiAgICAgICAgfQogICAgICAgIGlmIChpPXNpemVvZihpbnYpKQogICAgICAgIHsKICAgICAgICAgIHdoaWxlKGktLSkgaWYgKGludltpXSkgaW52W2ldLT5tb3ZlKG9iaiwgTk9fQ0hFQ0sgKTsKICAgICAgICAgIG1zZyArPSAiLCBJbmhhbHQgenVydWVja2Jld2VndCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgCiAgICAgICAgcmV0dXJuIHByaW50ZiggInVwZDogJXM6ICVzIiwgZmlsZSwgZXJyICksIFJFVF9GQUlMOwogICAgfQogIH0KICBlbHNlIAogICAgaWYgKCAhX3VwZGF0ZShmaWxlLCAwLCBmbGFncykgJiYgKGZsYWdzICYgKFVQRF9MfFVQRF9MT0FEKSkgKQogICAgICBpZiAoICFfcmVsb2FkKCBibHVlLCBpbnN0LCBmbGFncywgJmVyciApICkKICAgICAgICByZXR1cm4gcHJpbnRmKCAiJXM6ICVzOiAlcyIsIChmbGFncyZVUERfTE9BRD8ibG9hZCI6InVwZCIpLGZpbGUsIGVyciApLAogICAgICAgICAgUkVUX0ZBSUw7CiAgICAgIGVsc2UKICAgICAgICBtc2cgKz0gImdlbGFkZW4iOwogIAogIGlmICggc2l6ZW9mKG1zZykmJiEoZmxhZ3MmVVBEX1MmJnJlY3Vyc2l2ZSkgKQogICAgcHJpbnRmKCIlczogJXM6ICVzLlxuIiwoZmxhZ3MmVVBEX0xPQUQ/ImxvYWQiOiJ1cGQiKSxmaWxlLG1zZyk7CiAgcmV0dXJuIFJFVF9PSzsKfQoKLy8KLy8gX3VwZDogT2JqZWt0ZSBsYWRlbiwgemVyc3RvZXJlbiB1bmQgYWt0dWFsaXNpZXJlbgovLwoKc3RhdGljIGludCBfdXBkKHN0cmluZyBjbWRsaW5lKQp7CiAgaW50IGZsYWdzOwogIG1peGVkICphcmdzOwoKICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CiAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsVVBEX09QVFMsMSk7CiAgaWYoZmxhZ3M9PS0xfHwhc2l6ZW9mKGFyZ3MpKQogICAgcmV0dXJuIFVTQUdFKCJ1cGQgWy0iK1VQRF9PUFRTKyJdIDxkYXRlaT4gWzxkYXRlaT4gLi5dIik7CiAgaWYgKChmbGFncyAmIFVQRF9DKSAmJiAoZmxhZ3MgJiBVUERfQ09ORikpCiAgewogICAgcHJpbnRmKCJ1cGQ6IC1jIHVuZCAtQyBnbGVpY2h6ZWl0aWcgd2VyZGVuIG5pY2h0IHVudGVyc3R1ZXR6dC5cbiIpOwogICAgcmV0dXJuIDE7CiAgfQogIGFyZ3M9ZmlsZV9saXN0KGFyZ3MsTU9ERV9VUEQsMCwiLyIpOwogIGlmKCFzaXplb2YoYXJncykpIHJldHVybiBwcmludGYoInVwZDogS2VpbmUgcGFzc2VuZGUgRGF0ZWkgZ2VmdW5kZW4hXG4iKSwxOwoKICBhcmdzPW1hcChhcmdzLCg6ICQxW0ZVTExOQU1FXSA6KSktKHswfSk7CgogIGlmKCFzaXplb2YoYXJncykpCiAgewogICAgcHJpbnRmKCJ1cGQ6IFZlcnplaWNobmlzc2Uga29lbm5lbiBuaWNodCBha3R1YWxpc2llcnQgd2VyZGVuIVxuIik7CiAgICByZXR1cm4gMTsKICB9CiAgYXN5bmNocm9uKGFyZ3MsIydfbWFrZSxmbGFncywwLDApOwogIHJldHVybiAxOwp9CgovLwovLyBfbG9hZDogT2JqZWt0ZSBsYWRlbgovLwoKc3RhdGljIGludCBfbG9hZChzdHJpbmcgY21kbGluZSkKewogIGludCBmbGFnczsKICBtaXhlZCAqYXJnczsKCiAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOwogIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLCIiLDEpOwogIGlmKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkKICAgIHJldHVybiBVU0FHRSgibG9hZCA8ZGF0ZWk+IFs8ZGF0ZWk+IC4uXSIpOwogIGFyZ3M9ZmlsZV9saXN0KGFyZ3MsTU9ERV9VUEQsMCwiLyIpOwogIGlmKCFzaXplb2YoYXJncykpIHJldHVybiBwcmludGYoImxvYWQ6IEtlaW5lIHBhc3NlbmRlIERhdGVpIGdlZnVuZGVuIVxuIiksMTsKICBhcmdzPW1hcChhcmdzLCg6ICgoJDFbRklMRVNJWkVdIT0tMnx8ZmluZF9vYmplY3QoJDFbRlVMTE5BTUVdKSk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgJDFbRlVMTE5BTUVdOjApIDopKS0oezB9KTsKCiAgaWYoIXNpemVvZihhcmdzKSkKICAgIHJldHVybiBwcmludGYoImxvYWQ6IFZlcnplaWNobmlzc2Uga29lbm5lbiBuaWNodCBnZWxhZGVuIHdlcmRlbiFcbiIpLDE7CiAgYXN5bmNocm9uKGFyZ3MsIydfbWFrZSxVUERfTE9BRCwwLDApOwogIHJldHVybiAxOwp9Cg==