Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDEwIEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmFuIFRob21hcyA8dGhvbWFzQGVsb2FkMjQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGFycnkgUm9iZXJ0cyA8aGFycnkucm9iZXJ0c0BtaWRuaWdodC1sYWJzLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW1wbGVtZW50YXRpb24KI2VuZGlmCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlICJnb28vZ21lbS5oIgojaW5jbHVkZSAiU3BsYXNoRXJyb3JDb2Rlcy5oIgojaW5jbHVkZSAiU3BsYXNoQml0bWFwLmgiCiNpbmNsdWRlICJwb3BwbGVyL0Vycm9yLmgiCiNpbmNsdWRlICJnb28vSnBlZ1dyaXRlci5oIgojaW5jbHVkZSAiZ29vL1BOR1dyaXRlci5oIgojaW5jbHVkZSAiZ29vL1RpZmZXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9JbWdXcml0ZXIuaCIKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaEJpdG1hcAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3BsYXNoQml0bWFwOjpTcGxhc2hCaXRtYXAoaW50IHdpZHRoQSwgaW50IGhlaWdodEEsIGludCByb3dQYWRBLAoJCQkgICBTcGxhc2hDb2xvck1vZGUgbW9kZUEsIEdCb29sIGFscGhhQSwKCQkJICAgR0Jvb2wgdG9wRG93bikgewogIHdpZHRoID0gd2lkdGhBOwogIGhlaWdodCA9IGhlaWdodEE7CiAgbW9kZSA9IG1vZGVBOwogIHJvd1BhZCA9IHJvd1BhZEE7CiAgc3dpdGNoIChtb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgIHJvd1NpemUgPSAod2lkdGggKyA3KSA+PiAzOwogICAgfSBlbHNlIHsKICAgICAgcm93U2l6ZSA9IC0xOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgIHJvd1NpemUgPSB3aWR0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDMpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogMzsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8PSBJTlRfTUFYIC8gNCkgewogICAgICByb3dTaXplID0gd2lkdGggKiA0OwogICAgfSBlbHNlIHsKICAgICAgcm93U2l6ZSA9IC0xOwogICAgfQogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8PSBJTlRfTUFYIC8gNCkgewogICAgICByb3dTaXplID0gd2lkdGggKiA0OwogICAgfSBlbHNlIHsKICAgICAgcm93U2l6ZSA9IC0xOwogICAgfQogICAgYnJlYWs7CiNlbmRpZgogIH0KICBpZiAocm93U2l6ZSA+IDApIHsKICAgIHJvd1NpemUgKz0gcm93UGFkIC0gMTsKICAgIHJvd1NpemUgLT0gcm93U2l6ZSAlIHJvd1BhZDsKICB9CiAgZGF0YSA9IChTcGxhc2hDb2xvclB0cilnbWFsbG9jbihyb3dTaXplLCBoZWlnaHQpOwogIGlmICghdG9wRG93bikgewogICAgZGF0YSArPSAoaGVpZ2h0IC0gMSkgKiByb3dTaXplOwogICAgcm93U2l6ZSA9IC1yb3dTaXplOwogIH0KICBpZiAoYWxwaGFBKSB7CiAgICBhbHBoYSA9IChHdWNoYXIgKilnbWFsbG9jbih3aWR0aCwgaGVpZ2h0KTsKICB9IGVsc2UgewogICAgYWxwaGEgPSBOVUxMOwogIH0KfQoKClNwbGFzaEJpdG1hcDo6flNwbGFzaEJpdG1hcCgpIHsKICBpZiAocm93U2l6ZSA8IDApIHsKICAgIGdmcmVlKGRhdGEgKyAoaGVpZ2h0IC0gMSkgKiByb3dTaXplKTsKICB9IGVsc2UgewogICAgZ2ZyZWUoZGF0YSk7CiAgfQogIGdmcmVlKGFscGhhKTsKfQoKClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVQTk1GaWxlKGNoYXIgKmZpbGVOYW1lKSB7CiAgRklMRSAqZjsKICBTcGxhc2hFcnJvciBlOwoKICBpZiAoIShmID0gZm9wZW4oZmlsZU5hbWUsICJ3YiIpKSkgewogICAgcmV0dXJuIHNwbGFzaEVyck9wZW5GaWxlOwogIH0KCiAgZSA9IHRoaXMtPndyaXRlUE5NRmlsZShmKTsKICAKICBmY2xvc2UoZik7CiAgcmV0dXJuIGU7Cn0KCgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlUE5NRmlsZShGSUxFICpmKSB7CiAgU3BsYXNoQ29sb3JQdHIgcm93LCBwOwogIGludCB4LCB5OwoKICBzd2l0Y2ggKG1vZGUpIHsKCiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBmcHJpbnRmKGYsICJQNFxuJWQgJWRcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gOCkgewoJZnB1dGMoKnAgXiAweGZmLCBmKTsKCSsrcDsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIGZwcmludGYoZiwgIlA1XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKCWZwdXRjKCpwLCBmKTsKCSsrcDsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogICAgZnByaW50ZihmLCAiUDZcbiVkICVkXG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewoJZnB1dGMoc3BsYXNoUkdCOFIocCksIGYpOwoJZnB1dGMoc3BsYXNoUkdCOEcocCksIGYpOwoJZnB1dGMoc3BsYXNoUkdCOEIocCksIGYpOwoJcCArPSAzOwogICAgICB9CiAgICAgIHJvdyArPSByb3dTaXplOwogICAgfQogICAgYnJlYWs7CgogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgZnByaW50ZihmLCAiUDZcbiVkICVkXG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewoJZnB1dGMoc3BsYXNoQkdSOFIocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEcocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEIocCksIGYpOwoJcCArPSA0OwogICAgICB9CiAgICAgIHJvdyArPSByb3dTaXplOwogICAgfQogICAgYnJlYWs7CgoKICBjYXNlIHNwbGFzaE1vZGVCR1I4OgogICAgZnByaW50ZihmLCAiUDZcbiVkICVkXG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewoJZnB1dGMoc3BsYXNoQkdSOFIocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEcocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEIocCksIGYpOwoJcCArPSAzOwogICAgICB9CiAgICAgIHJvdyArPSByb3dTaXplOwogICAgfQogICAgYnJlYWs7CgojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIC8vIFBOTSBkb2Vzbid0IHN1cHBvcnQgQ01ZSwogICAgZXJyb3IoLTEsICJ1bnN1cHBvcnRlZCBTcGxhc2hCaXRtYXAgbW9kZSIpOwogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICBicmVhazsKI2VuZGlmCiAgfQogIHJldHVybiBzcGxhc2hPazsKfQoKCnZvaWQgU3BsYXNoQml0bWFwOjpnZXRQaXhlbChpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIHBpeGVsKSB7CiAgU3BsYXNoQ29sb3JQdHIgcDsKCiAgaWYgKHkgPCAwIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHggPj0gd2lkdGgpIHsKICAgIHJldHVybjsKICB9CiAgc3dpdGNoIChtb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAoeCA+PiAzKV07CiAgICBwaXhlbFswXSA9IChwWzBdICYgKDB4ODAgPj4gKHggJiA3KSkpID8gMHhmZiA6IDB4MDA7CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgcGl4ZWxbMF0gPSBwWzBdOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDMgKiB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFsyXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgcCA9ICZkYXRhW3kgKiByb3dTaXplICsgNCAqIHhdOwogICAgcGl4ZWxbMF0gPSBwWzJdOwogICAgcGl4ZWxbMV0gPSBwWzFdOwogICAgcGl4ZWxbMl0gPSBwWzBdOwogICAgcGl4ZWxbM10gPSBwWzNdOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDMgKiB4XTsKICAgIHBpeGVsWzBdID0gcFsyXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFswXTsKICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDQgKiB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFsyXTsKICAgIHBpeGVsWzNdID0gcFszXTsKICAgIGJyZWFrOwojZW5kaWYKICB9Cn0KCkd1Y2hhciBTcGxhc2hCaXRtYXA6OmdldEFscGhhKGludCB4LCBpbnQgeSkgewogIHJldHVybiBhbHBoYVt5ICogd2lkdGggKyB4XTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgY2hhciAqZmlsZU5hbWUsIGludCBoRFBJLCBpbnQgdkRQSSwgY29uc3QgY2hhciAqY29tcHJlc3Npb25TdHJpbmcpIHsKICBGSUxFICpmOwogIFNwbGFzaEVycm9yIGU7CgogIGlmICghKGYgPSBmb3BlbihmaWxlTmFtZSwgIndiIikpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyT3BlbkZpbGU7CiAgfQoKICBlID0gd3JpdGVJbWdGaWxlKGZvcm1hdCwgZiwgaERQSSwgdkRQSSwgY29tcHJlc3Npb25TdHJpbmcpOwogIAogIGZjbG9zZShmKTsKICByZXR1cm4gZTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgRklMRSAqZiwgaW50IGhEUEksIGludCB2RFBJLCBjb25zdCBjaGFyICpjb21wcmVzc2lvblN0cmluZykgewogIEltZ1dyaXRlciAqd3JpdGVyOwoJU3BsYXNoRXJyb3IgZTsKICAKICBzd2l0Y2ggKGZvcm1hdCkgewogICAgI2lmZGVmIEVOQUJMRV9MSUJQTkcKICAgIGNhc2Ugc3BsYXNoRm9ybWF0UG5nOgoJICB3cml0ZXIgPSBuZXcgUE5HV3JpdGVyKCk7CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCgogICAgI2lmZGVmIEVOQUJMRV9MSUJKUEVHCiAgICAjaWZkZWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoRm9ybWF0SnBlZ0NNWUs6CiAgICAgIHdyaXRlciA9IG5ldyBKcGVnV3JpdGVyKEpDU19DTVlLKTsKICAgICAgYnJlYWs7CiAgICAjZW5kaWYKICAgIGNhc2Ugc3BsYXNoRm9ybWF0SnBlZzoKICAgICAgd3JpdGVyID0gbmV3IEpwZWdXcml0ZXIoKTsKICAgICAgYnJlYWs7CiAgICAjZW5kaWYKCQogICAgI2lmZGVmIEVOQUJMRV9MSUJUSUZGCiAgICBjYXNlIHNwbGFzaEZvcm1hdFRpZmY6CiAgICAgIHdyaXRlciA9IG5ldyBUaWZmV3JpdGVyKCk7CiAgICAgIGlmICh3cml0ZXIpIHsKICAgICAgICAoKFRpZmZXcml0ZXIgKil3cml0ZXIpLT5zZXRDb21wcmVzc2lvblN0cmluZyhjb21wcmVzc2lvblN0cmluZyk7CiAgICAgICAgKChUaWZmV3JpdGVyICopd3JpdGVyKS0+c2V0U3BsYXNoTW9kZShtb2RlKTsKICAgICAgfQogICAgICBicmVhazsKICAgICNlbmRpZgoKICAgIGRlZmF1bHQ6CiAgICAgIC8vIE5vdCB0aGUgZ3JlYXRlc3QgZXJyb3IgbWVzc2FnZSwgYnV0IHVzZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkCiAgICAgIC8vIGhhdmUgYWxyZWFkeSBjaGVja2VkIHdoZXRoZXIgdGhlaXIgZGVzaXJlZCBmb3JtYXQgaXMgY29tcGlsZWQgaW4uCiAgICAgIGVycm9yKC0xLCAiU3VwcG9ydCBmb3IgdGhpcyBpbWFnZSB0eXBlIG5vdCBjb21waWxlZCBpbiIpOwogICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgoJZSA9IHdyaXRlSW1nRmlsZSh3cml0ZXIsIGYsIGhEUEksIHZEUEkpOwoJZGVsZXRlIHdyaXRlcjsKCXJldHVybiBlOwp9CgojaW5jbHVkZSAicG9wcGxlci9HZnhTdGF0ZV9oZWxwZXJzLmgiCgp2b2lkIFNwbGFzaEJpdG1hcDo6Z2V0UkdCTGluZShpbnQgeWwsIFNwbGFzaENvbG9yUHRyIGxpbmUpIHsKICBTcGxhc2hDb2xvciBjb2w7CiAgZG91YmxlIGMsIG0sIHksIGssIGMxLCBtMSwgeTEsIGsxLCByLCBnLCBiOwoKICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgIGdldFBpeGVsKHgsIHlsLCBjb2wpOwogICAgYyA9IGJ5dGVUb0RibChjb2xbMF0pOwogICAgbSA9IGJ5dGVUb0RibChjb2xbMV0pOwogICAgeSA9IGJ5dGVUb0RibChjb2xbMl0pOwogICAgayA9IGJ5dGVUb0RibChjb2xbM10pOwogICAgYzEgPSAxIC0gYzsKICAgIG0xID0gMSAtIG07CiAgICB5MSA9IDEgLSB5OwogICAgazEgPSAxIC0gazsKICAgIGNteWtUb1JHQk1hdHJpeE11bHRpcGxpY2F0aW9uKGMsIG0sIHksIGssIGMxLCBtMSwgeTEsIGsxLCByLCBnLCBiKTsKICAgICpsaW5lKysgPSBkYmxUb0J5dGUoY2xpcDAxKHIpKTsKICAgICpsaW5lKysgPSBkYmxUb0J5dGUoY2xpcDAxKGcpKTsKICAgICpsaW5lKysgPSBkYmxUb0J5dGUoY2xpcDAxKGIpKTsKICB9Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKEltZ1dyaXRlciAqd3JpdGVyLCBGSUxFICpmLCBpbnQgaERQSSwgaW50IHZEUEkpIHsKICBpZiAobW9kZSAhPSBzcGxhc2hNb2RlUkdCOCAmJiBtb2RlICE9IHNwbGFzaE1vZGVNb25vOCAmJiBtb2RlICE9IHNwbGFzaE1vZGVNb25vMSAmJiBtb2RlICE9IHNwbGFzaE1vZGVYQkdSOAojaWYgU1BMQVNIX0NNWUsKICAgICAgJiYgbW9kZSAhPSBzcGxhc2hNb2RlQ01ZSzgKI2VuZGlmCiAgICAgKSB7CiAgICBlcnJvcigtMSwgInVuc3VwcG9ydGVkIFNwbGFzaEJpdG1hcCBtb2RlIik7CiAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgogIGlmICghd3JpdGVyLT5pbml0KGYsIHdpZHRoLCBoZWlnaHQsIGhEUEksIHZEUEkpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgogIHN3aXRjaCAobW9kZSkgewojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICBpZiAod3JpdGVyLT5zdXBwb3J0Q01ZSygpKSB7CiAgICAgICAgU3BsYXNoQ29sb3JQdHIgcm93OwogICAgICAgIHVuc2lnbmVkIGNoYXIgKipyb3dfcG9pbnRlcnMgPSBuZXcgdW5zaWduZWQgY2hhcipbaGVpZ2h0XTsKICAgICAgICByb3cgPSBkYXRhOwoKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgICByb3dfcG9pbnRlcnNbeV0gPSByb3c7CiAgICAgICAgICByb3cgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUG9pbnRlcnMocm93X3BvaW50ZXJzLCBoZWlnaHQpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgICAgZGVsZXRlW10gcm93X3BvaW50ZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgICAgZ2V0UkdCTGluZSh5LCByb3cpOwogICAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgfQogICAgYnJlYWs7CiNlbmRpZgogICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIHsKICAgICAgU3BsYXNoQ29sb3JQdHIgcm93OwogICAgICB1bnNpZ25lZCBjaGFyICoqcm93X3BvaW50ZXJzID0gbmV3IHVuc2lnbmVkIGNoYXIqW2hlaWdodF07CiAgICAgIHJvdyA9IGRhdGE7CgogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgcm93X3BvaW50ZXJzW3ldID0gcm93OwogICAgICAgIHJvdyArPSByb3dTaXplOwogICAgICB9CiAgICAgIGlmICghd3JpdGVyLT53cml0ZVBvaW50ZXJzKHJvd19wb2ludGVycywgaGVpZ2h0KSkgewogICAgICAgIGRlbGV0ZVtdIHJvd19wb2ludGVyczsKICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgfQogICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAvLyBDb252ZXJ0IGludG8gYSBQTkcgcm93CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICByb3dbMyp4XSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4ICogNCArIDJdOwogICAgICAgICAgcm93WzMqeCsxXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4ICogNCArIDFdOwogICAgICAgICAgcm93WzMqeCsyXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4ICogNF07CiAgICAgICAgfQoKICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVSb3coJnJvdykpIHsKICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGVbXSByb3c7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAvLyBDb252ZXJ0IGludG8gYSBQTkcgcm93CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICByb3dbMyp4XSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgICAgICAgIHJvd1szKngrMV0gPSBkYXRhW3kgKiByb3dTaXplICsgeF07CiAgICAgICAgICByb3dbMyp4KzJdID0gZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93OwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgewogICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgLy8gQ29udmVydCBpbnRvIGEgUE5HIHJvdwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgZ2V0UGl4ZWwoeCwgeSwgJnJvd1szKnhdKTsKICAgICAgICAgIHJvd1szKngrMV0gPSByb3dbMyp4XTsKICAgICAgICAgIHJvd1szKngrMl0gPSByb3dbMyp4XTsKICAgICAgICB9CgogICAgICAgIGlmICghd3JpdGVyLT53cml0ZVJvdygmcm93KSkgewogICAgICAgICAgZGVsZXRlW10gcm93OwogICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRlbGV0ZVtdIHJvdzsKICAgIH0KICAgIGJyZWFrOwogICAgCiAgICBkZWZhdWx0OgogICAgLy8gY2FuJ3QgaGFwcGVuCiAgICBicmVhazsKICB9CiAgCiAgaWYgKHdyaXRlci0+Y2xvc2UoKSkgewogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgfQoKICByZXR1cm4gc3BsYXNoT2s7Cn0K