Lyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMTAgSm9lbCBkZSBHdXptYW4KCiAgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLy8gdGhpcyBmaWxlIGRlbGliZXJhdGVseSBjb250YWlucyBub24tYXNjaWkgY2hhcmFjdGVycwovLyBib29zdGluc3BlY3Q6bm9hc2NpaQoKI2luY2x1ZGUgPGJvb3N0L2RldGFpbC9saWdodHdlaWdodF90ZXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpX29wZXJhdG9yLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpX2NoYXIuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcWlfc3RyaW5nLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpX251bWVyaWMuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcWlfYXV4aWxpYXJ5LmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpX2RpcmVjdGl2ZS5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9xaV9ub250ZXJtaW5hbC5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9xaV9hY3Rpb24uaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9jb3JlLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXhfb3BlcmF0b3IuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9vYmplY3QuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9iaW5kLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2Z1c2lvbi9pbmNsdWRlL3N0ZF9wYWlyLmhwcD4KCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlICJ0ZXN0LmhwcCIKCmludAptYWluKCkKewogICAgdXNpbmcgc3Bpcml0X3Rlc3Q6OnRlc3RfYXR0cjsKICAgIHVzaW5nIHNwaXJpdF90ZXN0Ojp0ZXN0OwoKICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0Ojphc2NpaTsKICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0OjpxaTo6bGFiZWxzOwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6cWk6OmxvY2FsczsKICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OnFpOjpydWxlOwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6cWk6OmludF87CiAgICB1c2luZyBib29zdDo6c3Bpcml0OjpxaTo6dWludF87CiAgICB1c2luZyBib29zdDo6c3Bpcml0OjpxaTo6ZmFpbDsKICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OnFpOjpvbl9lcnJvcjsKICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OnFpOjpkZWJ1ZzsKICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OnFpOjpsaXQ7CgogICAgbmFtZXNwYWNlIHBoeCA9IGJvb3N0OjpwaG9lbml4OwoKCiAgICB7IC8vIGJhc2ljIHRlc3RzCgogICAgICAgIHJ1bGU8Y2hhciBjb25zdCo+IGEsIGIsIGMsIHN0YXJ0OwoKICAgICAgICBhID0gJ2EnOwogICAgICAgIGIgPSAnYic7CiAgICAgICAgYyA9ICdjJzsKCiAgICAgICAgYS5uYW1lKCJhIik7CiAgICAgICAgYi5uYW1lKCJiIik7CiAgICAgICAgYy5uYW1lKCJjIik7CiAgICAgICAgc3RhcnQubmFtZSgic3RhcnQiKTsKCiAgICAgICAgZGVidWcoYSk7CiAgICAgICAgZGVidWcoYik7CiAgICAgICAgZGVidWcoYyk7CiAgICAgICAgZGVidWcoc3RhcnQpOwoKICAgICAgICBzdGFydCA9ICooYSB8IGIgfCBjKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFiY2FiY2FjYiIsIHN0YXJ0KSk7CgogICAgICAgIHN0YXJ0ID0gKGEgfCBiKSA+PiAoc3RhcnQgfCBiKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFhYWFiYWJhYmFhYWJiYiIsIHN0YXJ0KSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJhYWFhYmFiYWJhYWFiYmEiLCBzdGFydCwgZmFsc2UpKTsKCiAgICAgICAgLy8gaWdub3JlIHRoZSBza2lwcGVyIQogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYWFhYWJhYmFiYWFhYmJhIiwgc3RhcnQsIHNwYWNlLCBmYWxzZSkpOwogICAgfQoKICAgIHsgLy8gYmFzaWMgdGVzdHMgd2l0aCBkaXJlY3QgaW5pdGlhbGl6YXRpb24KCiAgICAgICAgcnVsZTxjaGFyIGNvbnN0Kj4gYSAoJ2EnKTsKICAgICAgICBydWxlPGNoYXIgY29uc3QqPiBiICgnYicpOwogICAgICAgIHJ1bGU8Y2hhciBjb25zdCo+IGMgKCdjJyk7CiAgICAgICAgcnVsZTxjaGFyIGNvbnN0Kj4gc3RhcnQgPSAoYSB8IGIpID4+IChzdGFydCB8IGIpOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFhYWFiYWJhYmFhYWJiYiIsIHN0YXJ0KSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJhYWFhYmFiYWJhYWFiYmEiLCBzdGFydCwgZmFsc2UpKTsKCiAgICAgICAgLy8gaWdub3JlIHRoZSBza2lwcGVyIQogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYWFhYWJhYmFiYWFhYmJhIiwgc3RhcnQsIHNwYWNlLCBmYWxzZSkpOwogICAgfQoKICAgIHsgLy8gYmFzaWMgdGVzdHMgdy8gc2tpcHBlcgogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIHNwYWNlX3R5cGU+IGEsIGIsIGMsIHN0YXJ0OwoKICAgICAgICBhID0gJ2EnOwogICAgICAgIGIgPSAnYic7CiAgICAgICAgYyA9ICdjJzsKCiAgICAgICAgYS5uYW1lKCJhIik7CiAgICAgICAgYi5uYW1lKCJiIik7CiAgICAgICAgYy5uYW1lKCJjIik7CiAgICAgICAgc3RhcnQubmFtZSgic3RhcnQiKTsKCiAgICAgICAgZGVidWcoYSk7CiAgICAgICAgZGVidWcoYik7CiAgICAgICAgZGVidWcoYyk7CiAgICAgICAgZGVidWcoc3RhcnQpOwoKICAgICAgICBzdGFydCA9ICooYSB8IGIgfCBjKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIiBhIGIgYyBhIGIgYyBhIGMgYiAiLCBzdGFydCwgc3BhY2UpKTsKCiAgICAgICAgc3RhcnQgPSAoYSB8IGIpID4+IChzdGFydCB8IGIpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiIGEgYSBhIGEgYiBhIGIgYSBiIGEgYSBhIGIgYiBiICIsIHN0YXJ0LCBzcGFjZSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiIGEgYSBhIGEgYiBhIGIgYSBiIGEgYSBhIGIgYiBhICIsIHN0YXJ0LCBzcGFjZSwgZmFsc2UpKTsKICAgIH0KCiAgICB7IC8vIGJhc2ljIHRlc3RzIHcvIHNraXBwZXIgYnV0IG5vIGZpbmFsIHBvc3Qtc2tpcAoKICAgICAgICBydWxlPGNoYXIgY29uc3QqLCBzcGFjZV90eXBlPiBhLCBiLCBjLCBzdGFydDsKCiAgICAgICAgYSA9ICdhJzsKICAgICAgICBiID0gJ2InOwogICAgICAgIGMgPSAnYyc7CgogICAgICAgIGEubmFtZSgiYSIpOwogICAgICAgIGIubmFtZSgiYiIpOwogICAgICAgIGMubmFtZSgiYyIpOwogICAgICAgIHN0YXJ0Lm5hbWUoInN0YXJ0Iik7CgogICAgICAgIGRlYnVnKGEpOwogICAgICAgIGRlYnVnKGIpOwogICAgICAgIGRlYnVnKGMpOwogICAgICAgIGRlYnVnKHN0YXJ0KTsKCiAgICAgICAgc3RhcnQgPSAqKGEgfCBiKSA+PiBjOwoKICAgICAgICB1c2luZyBib29zdDo6c3Bpcml0OjpxaTo6cGhyYXNlX3BhcnNlOwogICAgICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OnFpOjpza2lwX2ZsYWc7CiAgICAgICAgewogICAgICAgICAgICBjaGFyIGNvbnN0ICpzMSA9ICIgYSBiIGEgYSBiIGIgYSBjIC4uLiAiCiAgICAgICAgICAgICAgLCAqY29uc3QgZTEgPSBzMSArIHN0ZDo6c3RybGVuKHMxKTsKICAgICAgICAgICAgQk9PU1RfVEVTVChwaHJhc2VfcGFyc2UoczEsIGUxLCBzdGFydCwgc3BhY2UsIHNraXBfZmxhZzo6ZG9udF9wb3N0c2tpcCkKICAgICAgICAgICAgICAmJiBzMSA9PSBlMSAtIDUpOwogICAgICAgIH0KCiAgICAgICAgc3RhcnQgPSAoYSB8IGIpID4+IChzdGFydCB8IGMpOwogICAgICAgIHsKICAgICAgICAgICAgY2hhciBjb25zdCAqczEgPSAiIGEgYSBhIGEgYiBhIGIgYSBiIGEgYSBhIGIgYiBiIGMgIgogICAgICAgICAgICAgICwgKmNvbnN0IGUxID0gczEgKyBzdGQ6OnN0cmxlbihzMSk7CiAgICAgICAgICAgIEJPT1NUX1RFU1QocGhyYXNlX3BhcnNlKHMxLCBlMSwgc3RhcnQsIHNwYWNlLCBza2lwX2ZsYWc6OnBvc3Rza2lwKQogICAgICAgICAgICAgICYmIHMxID09IGUxKTsKICAgICAgICB9CiAgICAgICAgewogICAgICAgICAgICBjaGFyIGNvbnN0ICpzMSA9ICIgYSBhIGEgYSBiIGEgYiBhIGIgYSBhIGEgYiBiIGIgYyAiCiAgICAgICAgICAgICAgLCAqY29uc3QgZTEgPSBzMSArIHN0ZDo6c3RybGVuKHMxKTsKICAgICAgICAgICAgQk9PU1RfVEVTVChwaHJhc2VfcGFyc2UoczEsIGUxLCBzdGFydCwgc3BhY2UsIHNraXBfZmxhZzo6ZG9udF9wb3N0c2tpcCkKICAgICAgICAgICAgICAmJiBzMSA9PSBlMSAtIDEpOwogICAgICAgIH0KICAgIH0KCiAgICB7IC8vIHRlc3QgdW5hc3NpZ25lZCBydWxlCgogICAgICAgIHJ1bGU8Y2hhciBjb25zdCo+IGE7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgieCIsIGEpKTsKICAgIH0KCiAgICB7IC8vIGFsaWFzIHRlc3RzCgogICAgICAgIHJ1bGU8Y2hhciBjb25zdCo+IGEsIGIsIGMsIGQsIHN0YXJ0OwoKICAgICAgICBhID0gJ2EnOwogICAgICAgIGIgPSAnYic7CiAgICAgICAgYyA9ICdjJzsKICAgICAgICBkID0gc3RhcnQuYWxpYXMoKTsgLy8gZCB3aWxsIGFsd2F5cyB0cmFjayBzdGFydAoKICAgICAgICBzdGFydCA9ICooYSB8IGIgfCBjKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFiY2FiY2FjYiIsIGQpKTsKCiAgICAgICAgc3RhcnQgPSAoYSB8IGIpID4+IChzdGFydCB8IGIpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYWFhYWJhYmFiYWFhYmJiIiwgZCkpOwogICAgfQoKICAgIHsgLy8gY29weSB0ZXN0cwoKICAgICAgICBydWxlPGNoYXIgY29uc3QqPiBhLCBiLCBjLCBzdGFydDsKCiAgICAgICAgYSA9ICdhJzsKICAgICAgICBiID0gJ2InOwogICAgICAgIGMgPSAnYyc7CgogICAgICAgIC8vIFRoZSBGRiBpcyB0aGUgZHluYW1pYyBlcXVpdmFsZW50IG9mIHN0YXJ0ID0gKihhIHwgYiB8IGMpOwogICAgICAgIHN0YXJ0ID0gYTsKICAgICAgICBzdGFydCA9IHN0YXJ0LmNvcHkoKSB8IGI7CiAgICAgICAgc3RhcnQgPSBzdGFydC5jb3B5KCkgfCBjOwogICAgICAgIHN0YXJ0ID0gKihzdGFydC5jb3B5KCkpOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFiY2FiY2FjYiIsIHN0YXJ0KSk7CgogICAgICAgIC8vIFRoZSBGRiBpcyB0aGUgZHluYW1pYyBlcXVpdmFsZW50IG9mIHN0YXJ0ID0gKGEgfCBiKSA+PiAoc3RhcnQgfCBiKTsKICAgICAgICBzdGFydCA9IGI7CiAgICAgICAgc3RhcnQgPSBhIHwgc3RhcnQuY29weSgpOwogICAgICAgIHN0YXJ0ID0gc3RhcnQuY29weSgpID4+IChzdGFydCB8IGIpOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFhYWFiYWJhYmFhYWJiYiIsIHN0YXJ0KSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJhYWFhYmFiYWJhYWFiYmEiLCBzdGFydCwgZmFsc2UpKTsKICAgIH0KCiAgICB7IC8vIGNvbnRleHQgdGVzdHMKCiAgICAgICAgY2hhciBjaDsKICAgICAgICBydWxlPGNoYXIgY29uc3QqLCBjaGFyKCk+IGE7CiAgICAgICAgYSA9IGFscGhhW192YWwgPSBfMV07CgogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIGFbcGh4OjpyZWYoY2gpID0gXzFdKSk7CiAgICAgICAgQk9PU1RfVEVTVChjaCA9PSAneCcpOwoKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigieiIsIGEsIGNoKSk7IC8vIGF0dHJpYnV0ZSBpcyBnaXZlbi4KICAgICAgICBCT09TVF9URVNUKGNoID09ICd6Jyk7CiAgICB9CgogICAgeyAvLyBhdXRvIHJ1bGVzIHRlc3RzCgogICAgICAgIGNoYXIgY2ggPSAnXDAnOwogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIGNoYXIoKT4gYTsKICAgICAgICBhICU9IGFscGhhOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoIngiLCBhW3BoeDo6cmVmKGNoKSA9IF8xXSkpOwogICAgICAgIEJPT1NUX1RFU1QoY2ggPT0gJ3gnKTsKICAgICAgICBjaCA9ICdcMCc7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0X2F0dHIoInoiLCBhLCBjaCkpOyAvLyBhdHRyaWJ1dGUgaXMgZ2l2ZW4uCiAgICAgICAgQk9PU1RfVEVTVChjaCA9PSAneicpOwoKICAgICAgICBhID0gYWxwaGE7ICAgIC8vIHRlc3QgZGVkdWNlZCBhdXRvIHJ1bGUgYmVoYXZpb3IKICAgICAgICBjaCA9ICdcMCc7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4IiwgYVtwaHg6OnJlZihjaCkgPSBfMV0pKTsKICAgICAgICBCT09TVF9URVNUKGNoID09ICd4Jyk7CiAgICAgICAgY2ggPSAnXDAnOwogICAgICAgIEJPT1NUX1RFU1QodGVzdF9hdHRyKCJ6IiwgYSwgY2gpKTsgLy8gYXR0cmlidXRlIGlzIGdpdmVuLgogICAgICAgIEJPT1NUX1RFU1QoY2ggPT0gJ3onKTsKICAgIH0KCiAgICB7IC8vIGF1dG8gcnVsZXMgdGVzdHM6IGFsbG93IHN0bCBjb250YWluZXJzIGFzIGF0dHJpYnV0ZXMgdG8KICAgICAgLy8gc2VxdWVuY2VzIChpbiBjYXNlcyB3aGVyZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50cwogICAgICAvLyBhcmUgY29udmVydGlibGUgdG8gdGhlIHZhbHVlX3R5cGUgb2YgdGhlIGNvbnRhaW5lciBvciBpZgogICAgICAvLyB0aGUgZWxlbWVudCBpdHNlbGYgaXMgYW4gc3RsIGNvbnRhaW5lciB3aXRoIHZhbHVlX3R5cGUKICAgICAgLy8gdGhhdCBpcyBjb252ZXJ0aWJsZSB0byB0aGUgdmFsdWVfdHlwZSBvZiB0aGUgYXR0cmlidXRlKS4KCiAgICAgICAgc3RkOjpzdHJpbmcgczsKICAgICAgICBydWxlPGNoYXIgY29uc3QqLCBzdGQ6OnN0cmluZygpPiByOwogICAgICAgIHIgJT0gY2hhcl8gPj4gKignLCcgPj4gY2hhcl8pOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoImEsYixjLGQsZSxmIiwgcltwaHg6OnJlZihzKSA9IF8xXSkpOwogICAgICAgIEJPT1NUX1RFU1QocyA9PSAiYWJjZGVmIik7CgogICAgICAgIHIgPSBjaGFyXyA+PiAqKCcsJyA+PiBjaGFyXyk7ICAgIC8vIHRlc3QgZGVkdWNlZCBhdXRvIHJ1bGUgYmVoYXZpb3IKICAgICAgICBzLmNsZWFyKCk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJhLGIsYyxkLGUsZiIsIHJbcGh4OjpyZWYocykgPSBfMV0pKTsKICAgICAgICBCT09TVF9URVNUKHMgPT0gImFiY2RlZiIpOwoKICAgICAgICByICU9IGNoYXJfID4+IGNoYXJfID4+IGNoYXJfID4+IGNoYXJfID4+IGNoYXJfID4+IGNoYXJfOwogICAgICAgIHMuY2xlYXIoKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoImFiY2RlZiIsIHJbcGh4OjpyZWYocykgPSBfMV0pKTsKICAgICAgICBCT09TVF9URVNUKHMgPT0gImFiY2RlZiIpOwoKICAgICAgICByID0gY2hhcl8gPj4gY2hhcl8gPj4gY2hhcl8gPj4gY2hhcl8gPj4gY2hhcl8gPj4gY2hhcl87CiAgICAgICAgcy5jbGVhcigpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYWJjZGVmIiwgcltwaHg6OnJlZihzKSA9IF8xXSkpOwogICAgICAgIEJPT1NUX1RFU1QocyA9PSAiYWJjZGVmIik7CiAgICB9CgogICAgeyAvLyBzeW50aCBhdHRyaWJ1dGUgdmFsdWUtaW5pdAoKICAgICAgICBzdGQ6OnN0cmluZyBzOwogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIGNoYXIoKT4gcjsKICAgICAgICByID0gYWxwaGFbX3ZhbCArPSBfMV07CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0X2F0dHIoImFiY2RlZiIsICtyLCBzKSk7CiAgICAgICAgQk9PU1RfVEVTVChzID09ICJhYmNkZWYiKTsKICAgIH0KCiAgICB7IC8vIGF1dG8gcnVsZXMgYWxpYXNpbmcgdGVzdHMKCiAgICAgICAgY2hhciBjaCA9ICdcMCc7CiAgICAgICAgcnVsZTxjaGFyIGNvbnN0KiwgY2hhcigpPiBhLCBiOwogICAgICAgIGEgJT0gYjsKICAgICAgICBiICU9IGFscGhhOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoIngiLCBhW3BoeDo6cmVmKGNoKSA9IF8xXSkpOwogICAgICAgIEJPT1NUX1RFU1QoY2ggPT0gJ3gnKTsKICAgICAgICBjaCA9ICdcMCc7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0X2F0dHIoInoiLCBhLCBjaCkpOyAvLyBhdHRyaWJ1dGUgaXMgZ2l2ZW4uCiAgICAgICAgQk9PU1RfVEVTVChjaCA9PSAneicpOwoKICAgICAgICBhID0gYjsgICAgICAgICAgICAvLyB0ZXN0IGRlZHVjZWQgYXV0byBydWxlIGJlaGF2aW9yCiAgICAgICAgYiA9IGFscGhhOwoKICAgICAgICBjaCA9ICdcMCc7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4IiwgYVtwaHg6OnJlZihjaCkgPSBfMV0pKTsKICAgICAgICBCT09TVF9URVNUKGNoID09ICd4Jyk7CiAgICAgICAgY2ggPSAnXDAnOwogICAgICAgIEJPT1NUX1RFU1QodGVzdF9hdHRyKCJ6IiwgYSwgY2gpKTsgLy8gYXR0cmlidXRlIGlzIGdpdmVuLgogICAgICAgIEJPT1NUX1RFU1QoY2ggPT0gJ3onKTsKICAgIH0KCiAgICB7IC8vIGNvbnRleHQgKHcvYXJnKSB0ZXN0cwoKICAgICAgICBjaGFyIGNoOwogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIGNoYXIoaW50KT4gYTsgLy8gMSBhcmcKICAgICAgICBhID0gYWxwaGFbX3ZhbCA9IF8xICsgX3IxXTsKCiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4IiwgYShwaHg6OnZhbCgxKSlbcGh4OjpyZWYoY2gpID0gXzFdKSk7CiAgICAgICAgQk9PU1RfVEVTVChjaCA9PSAneCcgKyAxKTsKCiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0X2F0dHIoImEiLCBhKDEpLCBjaCkpOyAvLyBhbGxvdyBzY2FsYXJzIGFzIHJ1bGUgYXJncyB0b28uCiAgICAgICAgQk9PU1RfVEVTVChjaCA9PSAnYScgKyAxKTsKCiAgICAgICAgcnVsZTxjaGFyIGNvbnN0KiwgY2hhcihpbnQsIGludCk+IGI7IC8vIDIgYXJncwogICAgICAgIGIgPSBhbHBoYVtfdmFsID0gXzEgKyBfcjEgKyBfcjJdOwogICAgICAgIEJPT1NUX1RFU1QodGVzdF9hdHRyKCJhIiwgYigxLCAyKSwgY2gpKTsKICAgICAgICBCT09TVF9URVNUKGNoID09ICdhJyArIDEgKyAyKTsKICAgIH0KCiAgICB7IC8vIGNvbnRleHQgKHcvIHJlZmVyZW5jZSBhcmcpIHRlc3RzCgogICAgICAgIGNoYXIgY2g7CiAgICAgICAgcnVsZTxjaGFyIGNvbnN0Kiwgdm9pZChjaGFyJik+IGE7IC8vIDEgYXJnIChyZWZlcmVuY2UpCiAgICAgICAgYSA9IGFscGhhW19yMSA9IF8xXTsKCiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4IiwgYShwaHg6OnJlZihjaCkpKSk7CiAgICAgICAgQk9PU1RfVEVTVChjaCA9PSAneCcpOwogICAgfQoKICAgIHsgLy8gY29udGV4dCAody9sb2NhbHMpIHRlc3RzCgogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIGxvY2FsczxjaGFyPiA+IGE7IC8vIDEgbG9jYWwKICAgICAgICBhID0gYWxwaGFbX2EgPSBfMV0gPj4gY2hhcl8oX2EpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYWEiLCBhKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiYXgiLCBhKSk7CiAgICB9CgogICAgeyAvLyBjb250ZXh0ICh3L2FyZ3MgYW5kIGxvY2FscykgdGVzdHMKCiAgICAgICAgcnVsZTxjaGFyIGNvbnN0Kiwgdm9pZChpbnQpLCBsb2NhbHM8Y2hhcj4gPiBhOyAvLyAxIGFyZyArIDEgbG9jYWwKICAgICAgICBhID0gYWxwaGFbX2EgPSBfMSArIF9yMV0gPj4gY2hhcl8oX2EpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYWIiLCBhKHBoeDo6dmFsKDEpKSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieHkiLCBhKHBoeDo6dmFsKDEpKSkpOwogICAgICAgIEJPT1NUX1RFU1QoIXRlc3QoImF4IiwgYShwaHg6OnZhbCgxKSkpKTsKICAgIH0KCiAgICB7IC8vIHZvaWQoKSBoYXMgdW51c2VkIHR5cGUgKHZvaWQgPT0gdW51c2VkX3R5cGUpCgogICAgICAgIHN0ZDo6cGFpcjxpbnQsIGNoYXI+IGF0dHI7CiAgICAgICAgcnVsZTxjaGFyIGNvbnN0Kiwgdm9pZCgpPiByOwogICAgICAgIHIgPSBjaGFyXzsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMTIzYXgiLCBpbnRfID4+IGNoYXJfID4+IHIsIGF0dHIpKTsKICAgICAgICBCT09TVF9URVNUKGF0dHIuZmlyc3QgPT0gMTIzKTsKICAgICAgICBCT09TVF9URVNUKGF0dHIuc2Vjb25kID09ICdhJyk7CiAgICB9CgogICAgeyAvLyBidWc6IHRlc3QgdGhhdCBpbmplY3RlZCBhdHRyaWJ1dGVzIGFyZSBvawoKICAgICAgICBydWxlPGNoYXIgY29uc3QqLCBjaGFyKGludCkgPiByOwoKICAgICAgICAvLyBwcm9ibGVtIGNvZGU6CiAgICAgICAgciA9IGNoYXJfKF9yMSlbX3ZhbCA9IF8xXTsKICAgIH0KCiAgICB7IC8vIHNob3cgdGhhdCByYSA9IHJiIGFuZCByYSAlPSByYiB3b3JrcyBhcyBleHBlY3RlZAogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIGludCgpID4gcmEsIHJiOwogICAgICAgIGludCBhdHRyOwoKICAgICAgICByYSAlPSBpbnRfOwogICAgICAgIEJPT1NUX1RFU1QodGVzdF9hdHRyKCIxMjMiLCByYSwgYXR0cikpOwogICAgICAgIEJPT1NUX1RFU1QoYXR0ciA9PSAxMjMpOwoKICAgICAgICByYiAlPSByYTsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMTIzIiwgcmIsIGF0dHIpKTsKICAgICAgICBCT09TVF9URVNUKGF0dHIgPT0gMTIzKTsKCiAgICAgICAgcmIgPSByYTsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMTIzIiwgcmIsIGF0dHIpKTsKICAgICAgICBCT09TVF9URVNUKGF0dHIgPT0gMTIzKTsKICAgIH0KCiAgICB7IC8vIHN0ZDo6c3RyaW5nIGFzIGNvbnRhaW5lciBhdHRyaWJ1dGUgd2l0aCBhdXRvIHJ1bGVzCgogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIHN0ZDo6c3RyaW5nKCk+IHRleHQ7CiAgICAgICAgdGV4dCAlPSArKCFjaGFyXygnKScpID4+ICFjaGFyXygnPicpID4+IGNoYXJfKTsKICAgICAgICBzdGQ6OnN0cmluZyBhdHRyOwogICAgICAgIEJPT1NUX1RFU1QodGVzdF9hdHRyKCJ4IiwgdGV4dCwgYXR0cikpOwogICAgICAgIEJPT1NUX1RFU1QoYXR0ciA9PSAieCIpOwoKICAgICAgICAvLyB0ZXN0IGRlZHVjZWQgYXV0byBydWxlIGJlaGF2aW9yCiAgICAgICAgdGV4dCA9ICsoIWNoYXJfKCcpJykgPj4gIWNoYXJfKCc+JykgPj4gY2hhcl8pOwogICAgICAgIGF0dHIuY2xlYXIoKTsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigieCIsIHRleHQsIGF0dHIpKTsKICAgICAgICBCT09TVF9URVNUKGF0dHIgPT0gIngiKTsKICAgIH0KCiAgICB7IC8vIGVycm9yIGhhbmRsaW5nCgogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0Ojphc2NpaTsKICAgICAgICB1c2luZyBib29zdDo6cGhvZW5peDo6Y29uc3RydWN0OwogICAgICAgIHVzaW5nIGJvb3N0OjpwaG9lbml4OjpiaW5kOwoKICAgICAgICBydWxlPGNoYXIgY29uc3QqPiByOwogICAgICAgIHIgPSAnKCcgPiBpbnRfID4gJywnID4gaW50XyA+ICcpJzsKCiAgICAgICAgb25fZXJyb3I8ZmFpbD4KICAgICAgICAoCiAgICAgICAgICAgIHIsIHN0ZDo6Y291dAogICAgICAgICAgICAgICAgPDwgcGh4Ojp2YWwoIkVycm9yISBFeHBlY3Rpbmc6ICIpCiAgICAgICAgICAgICAgICA8PCBfNAogICAgICAgICAgICAgICAgPDwgcGh4Ojp2YWwoIiwgZ290OiBcIiIpCiAgICAgICAgICAgICAgICA8PCBjb25zdHJ1Y3Q8c3RkOjpzdHJpbmc+KF8zLCBfMikKICAgICAgICAgICAgICAgIDw8IHBoeDo6dmFsKCJcIiIpCiAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwKICAgICAgICApOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoIigxMjMsNDU2KSIsIHIpKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCIoYWJjLGRlZikiLCByKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiKDEyMyw0NTZdIiwgcikpOwogICAgICAgIEJPT1NUX1RFU1QoIXRlc3QoIigxMjM7NDU2KSIsIHIpKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCJbMTIzLDQ1Nl0iLCByKSk7CiAgICB9CgojaWYgQk9PU1RfV09SS0FST1VORChCT09TVF9NU1ZDLCBCT09TVF9URVNURURfQVQoMTMxMCkpCiNwcmFnbWEgc2V0bG9jYWxlKCJmcmVuY2giKQojZW5kaWYKICAgIHsgLy8gc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcKCiAgICAgICAgdHlwZWRlZiBib29zdDo6c3Bpcml0OjpjaGFyX2VuY29kaW5nOjppc284ODU5XzEgaXNvODg1OV8xOwogICAgICAgIHJ1bGU8Y2hhciBjb25zdCosIGlzbzg4NTlfMT4gcjsKCiAgICAgICAgciA9IG5vX2Nhc2VbJ+EnXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsEiLCByKSk7CiAgICAgICAgciA9IG5vX2Nhc2VbY2hhcl8oJ+EnKV07CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLBIiwgcikpOwoKICAgICAgICByID0gbm9fY2FzZVtjaGFyXygi5S3vIildOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiySIsIHIpKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCL/IiwgcikpOwoKICAgICAgICByID0gbm9fY2FzZVsi4cEiXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsHhIiwgcikpOwogICAgICAgIHIgPSBub19jYXNlW2xpdCgi4cEiKV07CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLB4SIsIHIpKTsKICAgIH0KCiNpZiBCT09TVF9XT1JLQVJPVU5EKEJPT1NUX01TVkMsIEJPT1NUX1RFU1RFRF9BVCgxMzEwKSkKI3ByYWdtYSBzZXRsb2NhbGUoIiIpCiNlbmRpZgoKICAgIHsKICAgICAgICB0eXBlZGVmIGJvb3N0Ojp2YXJpYW50PGRvdWJsZSwgaW50PiB2X3R5cGU7CiAgICAgICAgcnVsZTxjb25zdCBjaGFyKiwgdl90eXBlKCk+IHIxID0gaW50XzsKICAgICAgICB2X3R5cGUgdjsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMSIsIHIxLCB2KSAmJiB2LndoaWNoKCkgPT0gMSAmJiAKICAgICAgICAgICAgYm9vc3Q6OmdldDxpbnQ+KHYpID09IDEpOwoKICAgICAgICB0eXBlZGVmIGJvb3N0OjpvcHRpb25hbDxpbnQ+IG92X3R5cGU7CiAgICAgICAgcnVsZTxjb25zdCBjaGFyKiwgb3ZfdHlwZSgpPiByMiA9IGludF87CiAgICAgICAgb3ZfdHlwZSBvdjsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMSIsIHIyLCBvdikgJiYgb3YgJiYgYm9vc3Q6OmdldDxpbnQ+KG92KSA9PSAxKTsKICAgIH0KCiAgICAvLyB0ZXN0IGhhbmRsaW5nIG9mIHNpbmdsZSBlbGVtZW50IGZ1c2lvbiBzZXF1ZW5jZXMKICAgIHsKICAgICAgICB1c2luZyBib29zdDo6ZnVzaW9uOjp2ZWN0b3I7CiAgICAgICAgdXNpbmcgYm9vc3Q6OmZ1c2lvbjo6YXRfYzsKICAgICAgICBydWxlPGNvbnN0IGNoYXIqLCB2ZWN0b3I8aW50PigpPiByID0gaW50XzsKCiAgICAgICAgdmVjdG9yPGludD4gdigwKTsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMSIsIHIsIHYpICYmIGF0X2M8MD4odikgPT0gMSk7CiAgICB9CgogICAgewogICAgICAgIHVzaW5nIGJvb3N0OjpmdXNpb246OnZlY3RvcjsKICAgICAgICB1c2luZyBib29zdDo6ZnVzaW9uOjphdF9jOwogICAgICAgIHJ1bGU8Y29uc3QgY2hhciosIHZlY3Rvcjx1bnNpZ25lZCBpbnQ+KCk+IHIgPSB1aW50XzsKCiAgICAgICAgdmVjdG9yPHVuc2lnbmVkIGludD4gdigwKTsKICAgICAgICBCT09TVF9URVNUKHRlc3RfYXR0cigiMSIsIHIsIHYpICYmIGF0X2M8MD4odikgPT0gMSk7CiAgICB9CgogICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cn0KCg==