LyogbWVtLmMgLS0tIG1lbW9yeSBmb3IgUlggc2ltdWxhdG9yLgoKQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgpDb250cmlidXRlZCBieSBSZWQgSGF0LCBJbmMuCgpUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCi8qIFRoaXMgc2xvd3MgZG93biB0aGUgc2ltdWxhdG9yIGFuZCB3ZSBnZXQgc29tZSBmYWxzZSBuZWdhdGl2ZXMgZnJvbQogICBnY2MsIGxpa2Ugd2hlbiBpdCB1c2VzIGEgbG9uZy1zaXplZCBob2xlIHRvIGhvbGQgYSBieXRlLXNpemVkCiAgIHZhcmlhYmxlLCBrbm93aW5nIHRoYXQgaXQgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBvdGhlciBiaXRzLiAgQnV0LAogICBpZiB5b3UgbmVlZCB0byB0cmFjayBkb3duIGEgcmVhZC1mcm9tLXVuaXRpYWxpemVkIGJ1Zywgc2V0IHRoaXMgdG8KICAgMS4gICovCiNkZWZpbmUgUkRDSEVDSyAwCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAibWVtLmgiCiNpbmNsdWRlICJjcHUuaCIKI2luY2x1ZGUgInN5c2NhbGxzLmgiCiNpbmNsdWRlICJtaXNjLmgiCiNpbmNsdWRlICJlcnIuaCIKCiNkZWZpbmUgTDFfQklUUyAgKDEwKQojZGVmaW5lIEwyX0JJVFMgICgxMCkKI2RlZmluZSBPRkZfQklUUyAoMTIpCgojZGVmaW5lIEwxX0xFTiAgKDEgPDwgTDFfQklUUykKI2RlZmluZSBMMl9MRU4gICgxIDw8IEwyX0JJVFMpCiNkZWZpbmUgT0ZGX0xFTiAoMSA8PCBPRkZfQklUUykKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoqcHRbTDFfTEVOXTsKc3RhdGljIHVuc2lnbmVkIGNoYXIgKipwdHJbTDFfTEVOXTsKCi8qIFsgZ2V0PTAvcHV0PTEgXVsgYnl0ZSBzaXplIF0gKi8Kc3RhdGljIHVuc2lnbmVkIGludCBtZW1fY291bnRlcnNbMl1bNV07CgojZGVmaW5lIENPVU5UKGlzcHV0LGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIGlmICh2ZXJib3NlICYmIGVuYWJsZV9jb3VudGluZykgbWVtX2NvdW50ZXJzW2lzcHV0XVtieXRlc10rKwoKdm9pZAppbml0X21lbSAodm9pZCkKewogIGludCBpLCBqOwoKICBmb3IgKGkgPSAwOyBpIDwgTDFfTEVOOyBpKyspCiAgICBpZiAocHRbaV0pCiAgICAgIHsKCWZvciAoaiA9IDA7IGogPCBMMl9MRU47IGorKykKCSAgaWYgKHB0W2ldW2pdKQoJICAgIGZyZWUgKHB0W2ldW2pdKTsKCWZyZWUgKHB0W2ldKTsKICAgICAgfQogIG1lbXNldCAocHQsIDAsIHNpemVvZiAocHQpKTsKICBtZW1zZXQgKHB0ciwgMCwgc2l6ZW9mIChwdHIpKTsKICBtZW1zZXQgKG1lbV9jb3VudGVycywgMCwgc2l6ZW9mIChtZW1fY291bnRlcnMpKTsKfQoKZW51bSBtZW1fcHRyX2FjdGlvbgp7CiAgTVBBX1dSSVRJTkcsCiAgTVBBX1JFQURJTkcsCiAgTVBBX0NPTlRFTlRfVFlQRQp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKgptZW1fcHRyICh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGVudW0gbWVtX3B0cl9hY3Rpb24gYWN0aW9uKQp7CiAgaW50IHB0MSA9IChhZGRyZXNzID4+IChMMl9CSVRTICsgT0ZGX0JJVFMpKSAmICgoMSA8PCBMMV9CSVRTKSAtIDEpOwogIGludCBwdDIgPSAoYWRkcmVzcyA+PiBPRkZfQklUUykgJiAoKDEgPDwgTDJfQklUUykgLSAxKTsKICBpbnQgcHRvID0gYWRkcmVzcyAmICgoMSA8PCBPRkZfQklUUykgLSAxKTsKCiAgaWYgKGFkZHJlc3MgPT0gMCkKICAgIGV4ZWN1dGlvbl9lcnJvciAoU0lNX0VSUl9OVUxMX1BPSU5URVJfREVSRUZFUkVOQ0UsIDApOwoKICBpZiAocHRbcHQxXSA9PSAwKQogICAgewogICAgICBwdFtwdDFdID0gKHVuc2lnbmVkIGNoYXIgKiopIGNhbGxvYyAoTDJfTEVOLCBzaXplb2YgKGNoYXIgKiopKTsKICAgICAgcHRyW3B0MV0gPSAodW5zaWduZWQgY2hhciAqKikgY2FsbG9jIChMMl9MRU4sIHNpemVvZiAoY2hhciAqKikpOwogICAgfQogIGlmIChwdFtwdDFdW3B0Ml0gPT0gMCkKICAgIHsKICAgICAgaWYgKGFjdGlvbiA9PSBNUEFfUkVBRElORykKCWV4ZWN1dGlvbl9lcnJvciAoU0lNX0VSUl9SRUFEX1VOV1JJVFRFTl9QQUdFUywgYWRkcmVzcyk7CgogICAgICBwdFtwdDFdW3B0Ml0gPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9GRl9MRU4pOwogICAgICBtZW1zZXQgKHB0W3B0MV1bcHQyXSwgMCwgT0ZGX0xFTik7CiAgICAgIHB0cltwdDFdW3B0Ml0gPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9GRl9MRU4pOwogICAgICBtZW1zZXQgKHB0cltwdDFdW3B0Ml0sIE1DX1VOSU5JVCwgT0ZGX0xFTik7CiAgICB9CiAgZWxzZSBpZiAoYWN0aW9uID09IE1QQV9SRUFESU5HCgkgICAmJiBwdHJbcHQxXVtwdDJdW3B0b10gPT0gTUNfVU5JTklUKQogICAgZXhlY3V0aW9uX2Vycm9yIChTSU1fRVJSX1JFQURfVU5XUklUVEVOX0JZVEVTLCBhZGRyZXNzKTsKCiAgaWYgKGFjdGlvbiA9PSBNUEFfV1JJVElORykKICAgIHsKICAgICAgaWYgKHB0cltwdDFdW3B0Ml1bcHRvXSA9PSBNQ19QVVNIRURfUEMpCglleGVjdXRpb25fZXJyb3IgKFNJTV9FUlJfQ09SUlVQVF9TVEFDSywgYWRkcmVzcyk7CiAgICAgIHB0cltwdDFdW3B0Ml1bcHRvXSA9IE1DX0RBVEE7CiAgICB9CgogIGlmIChhY3Rpb24gPT0gTVBBX0NPTlRFTlRfVFlQRSkKICAgIHJldHVybiBwdHJbcHQxXVtwdDJdICsgcHRvOwoKICByZXR1cm4gcHRbcHQxXVtwdDJdICsgcHRvOwp9CgpzdGF0aWMgaW5saW5lIGludAppc19yZXNlcnZlZF9hZGRyZXNzICh1bnNpZ25lZCBpbnQgYWRkcmVzcykKewogIHJldHVybiAoYWRkcmVzcyA+PSAweDAwMDIwMDAwICYmIGFkZHJlc3MgPCAweDAwMDgwMDAwKQogICAgfHwgICAoYWRkcmVzcyA+PSAweDAwMTAwMDAwICYmIGFkZHJlc3MgPCAweDAxMDAwMDAwKQogICAgfHwgICAoYWRkcmVzcyA+PSAweDA4MDAwMDAwICYmIGFkZHJlc3MgPCAweGZmMDAwMDAwKTsKfQoKc3RhdGljIHZvaWQKdXNlZCAoaW50IHJzdGFydCwgaW50IGksIGludCBqKQp7CiAgaW50IHJlbmQgPSBpIDw8IChMMl9CSVRTICsgT0ZGX0JJVFMpOwogIHJlbmQgKz0gaiA8PCBPRkZfQklUUzsKICBpZiAocnN0YXJ0ID09IDB4ZTAwMDAgJiYgcmVuZCA9PSAweGUxMDAwKQogICAgcmV0dXJuOwogIHByaW50ZiAoIm1lbTogICAlMDh4IC0gJTA4eCAoJWRrIGJ5dGVzKVxuIiwgcnN0YXJ0LCByZW5kIC0gMSwKCSAgKHJlbmQgLSByc3RhcnQpIC8gMTAyNCk7Cn0KCnN0YXRpYyBjaGFyICoKbWNzIChpbnQgaXNwdXQsIGludCBieXRlcykKewogIHJldHVybiBjb21tYSAobWVtX2NvdW50ZXJzW2lzcHV0XVtieXRlc10pOwp9Cgp2b2lkCm1lbV91c2FnZV9zdGF0cyAoKQp7CiAgaW50IGksIGo7CiAgaW50IHJzdGFydCA9IDA7CiAgaW50IHBlbmRpbmcgPSAwOwoKICBmb3IgKGkgPSAwOyBpIDwgTDFfTEVOOyBpKyspCiAgICBpZiAocHRbaV0pCiAgICAgIHsKCWZvciAoaiA9IDA7IGogPCBMMl9MRU47IGorKykKCSAgaWYgKHB0W2ldW2pdKQoJICAgIHsKCSAgICAgIGlmICghcGVuZGluZykKCQl7CgkJICBwZW5kaW5nID0gMTsKCQkgIHJzdGFydCA9IChpIDw8IChMMl9CSVRTICsgT0ZGX0JJVFMpKSArIChqIDw8IE9GRl9CSVRTKTsKCQl9CgkgICAgfQoJICBlbHNlIGlmIChwZW5kaW5nKQoJICAgIHsKCSAgICAgIHBlbmRpbmcgPSAwOwoJICAgICAgdXNlZCAocnN0YXJ0LCBpLCBqKTsKCSAgICB9CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJaWYgKHBlbmRpbmcpCgkgIHsKCSAgICBwZW5kaW5nID0gMDsKCSAgICB1c2VkIChyc3RhcnQsIGksIDApOwoJICB9CiAgICAgIH0KICAvKiAgICAgICBtZW0gZm9vOiAxMjM0NTY3ODkwMTIgMTIzNDU2Nzg5MDEyIDEyMzQ1Njc4OTAxMiAxMjM0NTY3ODkwMTIKICAgICAgICAgICAgMTIzNDU2Nzg5MDEyICovCiAgcHJpbnRmICgiICAgICAgICAgICAgICAgICBieXRlICAgICAgICBzaG9ydCAgICAgICAgM2J5dGUgICAgICAgICBsb25nIgogICAgICAgICAgIiAgICAgICBvcGNvZGVcbiIpOwogIGlmICh2ZXJib3NlID4gMSkKICAgIHsKICAgICAgLyogT25seSB1c2UgY29tbWEgc2VwYXJhdGVkIG51bWJlcnMgd2hlbiBiZWluZyB2ZXJ5IHZlcmJvc2UuCgkgQ29tbWEgc2VwYXJhdGVkIG51bWJlcnMgYXJlIGhhcmQgdG8gcGFyc2UgaW4gYXdrIHNjcmlwdHMuICAqLwogICAgICBwcmludGYgKCJtZW0gZ2V0OiAlMTJzICUxMnMgJTEycyAlMTJzICUxMnNcbiIsIG1jcyAoMCwgMSksIG1jcyAoMCwgMiksCgkgICAgICBtY3MgKDAsIDMpLCBtY3MgKDAsIDQpLCBtY3MgKDAsIDApKTsKICAgICAgcHJpbnRmICgibWVtIHB1dDogJTEycyAlMTJzICUxMnMgJTEyc1xuIiwgbWNzICgxLCAxKSwgbWNzICgxLCAyKSwKCSAgICAgIG1jcyAoMSwgMyksIG1jcyAoMSwgNCkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgcHJpbnRmICgibWVtIGdldDogJTEydSAlMTJ1ICUxMnUgJTEydSAlMTJ1XG4iLAoJICAgICAgbWVtX2NvdW50ZXJzWzBdWzFdLCBtZW1fY291bnRlcnNbMF1bMl0sCgkgICAgICBtZW1fY291bnRlcnNbMF1bM10sIG1lbV9jb3VudGVyc1swXVs0XSwKCSAgICAgIG1lbV9jb3VudGVyc1swXVswXSk7CiAgICAgIHByaW50ZiAoIm1lbSBwdXQ6ICUxMnUgJTEydSAlMTJ1ICUxMnVcbiIsCgkgICAgICBtZW1fY291bnRlcnMgWzFdWzFdLCBtZW1fY291bnRlcnMgWzFdWzJdLAoJICAgICAgbWVtX2NvdW50ZXJzIFsxXVszXSwgbWVtX2NvdW50ZXJzIFsxXVs0XSk7CiAgICB9Cn0KCnVuc2lnbmVkIGxvbmcKbWVtX3VzYWdlX2N5Y2xlcyAodm9pZCkKewogIHVuc2lnbmVkIGxvbmcgcnYgPSBtZW1fY291bnRlcnNbMF1bMF07CiAgcnYgKz0gbWVtX2NvdW50ZXJzWzBdWzFdICogMTsKICBydiArPSBtZW1fY291bnRlcnNbMF1bMl0gKiAyOwogIHJ2ICs9IG1lbV9jb3VudGVyc1swXVszXSAqIDM7CiAgcnYgKz0gbWVtX2NvdW50ZXJzWzBdWzRdICogNDsKICBydiArPSBtZW1fY291bnRlcnNbMV1bMV0gKiAxOwogIHJ2ICs9IG1lbV9jb3VudGVyc1sxXVsyXSAqIDI7CiAgcnYgKz0gbWVtX2NvdW50ZXJzWzFdWzNdICogMzsKICBydiArPSBtZW1fY291bnRlcnNbMV1bNF0gKiA0OwogIHJldHVybiBydjsKfQoKc3RhdGljIGludCB0cHIgPSAwOwpzdGF0aWMgdm9pZApzIChpbnQgYWRkcmVzcywgY2hhciAqZGlyKQp7CiAgaWYgKHRwciA9PSAwKQogICAgcHJpbnRmICgiTUVNWyUwOHhdICVzIiwgYWRkcmVzcywgZGlyKTsKICB0cHIrKzsKfQoKI2RlZmluZSBTKGQpIGlmICh0cmFjZSkgcyhhZGRyZXNzLCBkKQpzdGF0aWMgdm9pZAplICgpCnsKICBpZiAoIXRyYWNlKQogICAgcmV0dXJuOwogIHRwci0tOwogIGlmICh0cHIgPT0gMCkKICAgIHByaW50ZiAoIlxuIik7Cn0KCnN0YXRpYyBjaGFyCm10eXBlYyAoaW50IGFkZHJlc3MpCnsKICB1bnNpZ25lZCBjaGFyICpjcCA9IG1lbV9wdHIgKGFkZHJlc3MsIE1QQV9DT05URU5UX1RZUEUpOwogIHJldHVybiAidWRwIlsqY3BdOwp9CgojZGVmaW5lIEUoKSBpZiAodHJhY2UpIGUoKQoKdm9pZAptZW1fcHV0X2J5dGUgKHVuc2lnbmVkIGludCBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQp7CiAgdW5zaWduZWQgY2hhciAqbTsKICBjaGFyIHRjID0gJyAnOwoKICBpZiAodHJhY2UpCiAgICB0YyA9IG10eXBlYyAoYWRkcmVzcyk7CiAgbSA9IG1lbV9wdHIgKGFkZHJlc3MsIE1QQV9XUklUSU5HKTsKICBpZiAodHJhY2UpCiAgICBwcmludGYgKCIgJTAyeCVjIiwgdmFsdWUsIHRjKTsKICAqbSA9IHZhbHVlOwogIHN3aXRjaCAoYWRkcmVzcykKICAgIHsKICAgIGNhc2UgMHgwMGUxOgogICAgICB7CglzdGF0aWMgaW50IG9sZF9sZWQgPSAtMTsKCXN0YXRpYyBjaGFyICpsZWRfb25bXSA9CgkgIHsgIlwwMzNbMzFtIE8gIiwgIlwwMzNbMzJtIE8gIiwgIlwwMzNbMzRtIE8gIiB9OwoJc3RhdGljIGNoYXIgKmxlZF9vZmZbXSA9IHsgIlwwMzNbMG0gtyAiLCAiXDAzM1swbSC3ICIsICJcMDMzWzBtILcgIiB9OwoJaW50IGk7CglpZiAob2xkX2xlZCAhPSB2YWx1ZSkKCSAgewoJICAgIGZwdXRzICgiICAiLCBzdGRvdXQpOwoJICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCgkgICAgICBpZiAodmFsdWUgJiAoMSA8PCBpKSkKCQlmcHV0cyAobGVkX29mZltpXSwgc3Rkb3V0KTsKCSAgICAgIGVsc2UKCQlmcHV0cyAobGVkX29uW2ldLCBzdGRvdXQpOwoJICAgIGZwdXRzICgiXDAzM1swbVxyIiwgc3Rkb3V0KTsKCSAgICBmZmx1c2ggKHN0ZG91dCk7CgkgICAgb2xkX2xlZCA9IHZhbHVlOwoJICB9CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSAweDNhYTogLyogdWFydDF0eCAqLwogICAgICB7CglzdGF0aWMgaW50IHBlbmRpbmdfZXhpdCA9IDA7CglpZiAodmFsdWUgPT0gMCkKCSAgewoJICAgIGlmIChwZW5kaW5nX2V4aXQpCgkgICAgICB7CgkJc3RlcF9yZXN1bHQgPSBSWF9NQUtFX0VYSVRFRCh2YWx1ZSk7CgkJcmV0dXJuOwoJICAgICAgfQoJICAgIHBlbmRpbmdfZXhpdCA9IDE7CgkgIH0KCWVsc2UKCSAgcHV0Y2hhcih2YWx1ZSk7CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgaWYgKGlzX3Jlc2VydmVkX2FkZHJlc3MgKGFkZHJlc3MpKQoJZ2VuZXJhdGVfYWNjZXNzX2V4Y2VwdGlvbiAoKTsKICAgIH0KfQoKdm9pZAptZW1fcHV0X3FpIChpbnQgYWRkcmVzcywgdW5zaWduZWQgY2hhciB2YWx1ZSkKewogIFMgKCI8PSIpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcywgdmFsdWUgJiAweGZmKTsKICBFICgpOwogIENPVU5UICgxLCAxKTsKfQoKdm9pZAptZW1fcHV0X2hpIChpbnQgYWRkcmVzcywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCnsKICBTICgiPD0iKTsKICBpZiAocnhfYmlnX2VuZGlhbikKICAgIHsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzLCB2YWx1ZSA+PiA4KTsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMSwgdmFsdWUgJiAweGZmKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcywgdmFsdWUgJiAweGZmKTsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMSwgdmFsdWUgPj4gOCk7CiAgICB9CiAgRSAoKTsKICBDT1VOVCAoMSwgMik7Cn0KCnZvaWQKbWVtX3B1dF9wc2kgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHZhbHVlKQp7CiAgUyAoIjw9Iik7CiAgaWYgKHJ4X2JpZ19lbmRpYW4pCiAgICB7CiAgICAgIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcywgdmFsdWUgPj4gMTYpOwogICAgICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAxLCAodmFsdWUgPj4gOCkgJiAweGZmKTsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMiwgdmFsdWUgJiAweGZmKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcywgdmFsdWUgJiAweGZmKTsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMSwgKHZhbHVlID4+IDgpICYgMHhmZik7CiAgICAgIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDIsIHZhbHVlID4+IDE2KTsKICAgIH0KICBFICgpOwogIENPVU5UICgxLCAzKTsKfQoKdm9pZAptZW1fcHV0X3NpIChpbnQgYWRkcmVzcywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKewogIFMgKCI8PSIpOwogIGlmIChyeF9iaWdfZW5kaWFuKQogICAgewogICAgICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAwLCAodmFsdWUgPj4gMjQpICYgMHhmZik7CiAgICAgIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDEsICh2YWx1ZSA+PiAxNikgJiAweGZmKTsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMiwgKHZhbHVlID4+IDgpICYgMHhmZik7CiAgICAgIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDMsIHZhbHVlICYgMHhmZik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAwLCB2YWx1ZSAmIDB4ZmYpOwogICAgICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAxLCAodmFsdWUgPj4gOCkgJiAweGZmKTsKICAgICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMiwgKHZhbHVlID4+IDE2KSAmIDB4ZmYpOwogICAgICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAzLCAodmFsdWUgPj4gMjQpICYgMHhmZik7CiAgICB9CiAgRSAoKTsKICBDT1VOVCAoMSwgNCk7Cn0KCnZvaWQKbWVtX3B1dF9ibGsgKGludCBhZGRyZXNzLCB2b2lkICpidWZwdHIsIGludCBuYnl0ZXMpCnsKICBTICgiPD0iKTsKICBpZiAoZW5hYmxlX2NvdW50aW5nKQogICAgbWVtX2NvdW50ZXJzWzFdWzFdICs9IG5ieXRlczsKICB3aGlsZSAobmJ5dGVzLS0pCiAgICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MrKywgKih1bnNpZ25lZCBjaGFyICopIGJ1ZnB0cisrKTsKICBFICgpOwp9Cgp1bnNpZ25lZCBjaGFyCm1lbV9nZXRfcGMgKGludCBhZGRyZXNzKQp7CiAgdW5zaWduZWQgY2hhciAqbSA9IG1lbV9wdHIgKGFkZHJlc3MsIE1QQV9SRUFESU5HKTsKICBDT1VOVCAoMCwgMCk7CiAgcmV0dXJuICptOwp9CgpzdGF0aWMgdW5zaWduZWQgY2hhcgptZW1fZ2V0X2J5dGUgKHVuc2lnbmVkIGludCBhZGRyZXNzKQp7CiAgdW5zaWduZWQgY2hhciAqbTsKCiAgUyAoIj0+Iik7CiAgbSA9IG1lbV9wdHIgKGFkZHJlc3MsIE1QQV9SRUFESU5HKTsKICBzd2l0Y2ggKGFkZHJlc3MpCiAgICB7CiAgICBjYXNlIDB4M2FkOiAvKiB1YXJ0MWMxICovCiAgICAgIEUoKTsKICAgICAgcmV0dXJuIDI7IC8qIHRyYW5zbWl0dGVyIGVtcHR5ICovCiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDogCiAgICAgIGlmICh0cmFjZSkKCXByaW50ZiAoIiAlMDJ4JWMiLCAqbSwgbXR5cGVjIChhZGRyZXNzKSk7CiAgICAgIGlmIChpc19yZXNlcnZlZF9hZGRyZXNzIChhZGRyZXNzKSkKCWdlbmVyYXRlX2FjY2Vzc19leGNlcHRpb24gKCk7CiAgICAgIGJyZWFrOwogICAgfQogIEUgKCk7CiAgcmV0dXJuICptOwp9Cgp1bnNpZ25lZCBjaGFyCm1lbV9nZXRfcWkgKGludCBhZGRyZXNzKQp7CiAgdW5zaWduZWQgY2hhciBydjsKICBTICgiPT4iKTsKICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgQ09VTlQgKDAsIDEpOwogIEUgKCk7CiAgcmV0dXJuIHJ2Owp9Cgp1bnNpZ25lZCBzaG9ydAptZW1fZ2V0X2hpIChpbnQgYWRkcmVzcykKewogIHVuc2lnbmVkIHNob3J0IHJ2OwogIFMgKCI9PiIpOwogIGlmIChyeF9iaWdfZW5kaWFuKQogICAgewogICAgICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcykgPDwgODsKICAgICAgcnYgfD0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDEpIDw8IDg7CiAgICB9CiAgQ09VTlQgKDAsIDIpOwogIEUgKCk7CiAgcmV0dXJuIHJ2Owp9Cgp1bnNpZ25lZCBsb25nCm1lbV9nZXRfcHNpIChpbnQgYWRkcmVzcykKewogIHVuc2lnbmVkIGxvbmcgcnY7CiAgUyAoIj0+Iik7CiAgaWYgKHJ4X2JpZ19lbmRpYW4pCiAgICB7CiAgICAgIHJ2ID0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMik7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDEpIDw8IDg7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcykgPDwgMTY7CiAgICB9CiAgZWxzZQogICAgewogICAgICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDEpIDw8IDg7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDIpIDw8IDE2OwogICAgfQogIENPVU5UICgwLCAzKTsKICBFICgpOwogIHJldHVybiBydjsKfQoKdW5zaWduZWQgbG9uZwptZW1fZ2V0X3NpIChpbnQgYWRkcmVzcykKewogIHVuc2lnbmVkIGxvbmcgcnY7CiAgUyAoIj0+Iik7CiAgaWYgKHJ4X2JpZ19lbmRpYW4pCiAgICB7CiAgICAgIHJ2ID0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMyk7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDIpIDw8IDg7CiAgICAgIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDEpIDw8IDE2OwogICAgICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MpIDw8IDI0OwogICAgfQogIGVsc2UKICAgIHsKICAgICAgcnYgPSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MpOwogICAgICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MgKyAxKSA8PCA4OwogICAgICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MgKyAyKSA8PCAxNjsKICAgICAgcnYgfD0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMykgPDwgMjQ7CiAgICB9CiAgQ09VTlQgKDAsIDQpOwogIEUgKCk7CiAgcmV0dXJuIHJ2Owp9Cgp2b2lkCm1lbV9nZXRfYmxrIChpbnQgYWRkcmVzcywgdm9pZCAqYnVmcHRyLCBpbnQgbmJ5dGVzKQp7CiAgUyAoIj0+Iik7CiAgaWYgKGVuYWJsZV9jb3VudGluZykKICAgIG1lbV9jb3VudGVyc1swXVsxXSArPSBuYnl0ZXM7CiAgd2hpbGUgKG5ieXRlcy0tKQogICAgKihjaGFyICopIGJ1ZnB0cisrID0gbWVtX2dldF9ieXRlIChhZGRyZXNzKyspOwogIEUgKCk7Cn0KCmludApzaWduX2V4dCAoaW50IHYsIGludCBiaXRzKQp7CiAgaWYgKGJpdHMgPCAzMikKICAgIHsKICAgICAgdiAmPSAoMSA8PCBiaXRzKSAtIDE7CiAgICAgIGlmICh2ICYgKDEgPDwgKGJpdHMgLSAxKSkpCgl2IC09ICgxIDw8IGJpdHMpOwogICAgfQogIHJldHVybiB2Owp9Cgp2b2lkCm1lbV9zZXRfY29udGVudF90eXBlIChpbnQgYWRkcmVzcywgZW51bSBtZW1fY29udGVudF90eXBlIHR5cGUpCnsKICB1bnNpZ25lZCBjaGFyICptdCA9IG1lbV9wdHIgKGFkZHJlc3MsIE1QQV9DT05URU5UX1RZUEUpOwogICptdCA9IHR5cGU7Cn0KCnZvaWQKbWVtX3NldF9jb250ZW50X3JhbmdlIChpbnQgc3RhcnRfYWRkcmVzcywgaW50IGVuZF9hZGRyZXNzLCBlbnVtIG1lbV9jb250ZW50X3R5cGUgdHlwZSkKewogIHdoaWxlIChzdGFydF9hZGRyZXNzIDwgZW5kX2FkZHJlc3MpCiAgICB7CiAgICAgIGludCBzeiwgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyICptdDsKCiAgICAgIHN6ID0gZW5kX2FkZHJlc3MgLSBzdGFydF9hZGRyZXNzOwogICAgICBvZnMgPSBzdGFydF9hZGRyZXNzICUgTDFfTEVOOwogICAgICBpZiAoc3ogKyBvZnMgPiBMMV9MRU4pCglzeiA9IEwxX0xFTiAtIG9mczsKCiAgICAgIG10ID0gbWVtX3B0ciAoc3RhcnRfYWRkcmVzcywgTVBBX0NPTlRFTlRfVFlQRSk7CiAgICAgIG1lbXNldCAobXQsIHR5cGUsIHN6KTsKCiAgICAgIHN0YXJ0X2FkZHJlc3MgKz0gc3o7CiAgICB9Cn0KCmVudW0gbWVtX2NvbnRlbnRfdHlwZQptZW1fZ2V0X2NvbnRlbnRfdHlwZSAoaW50IGFkZHJlc3MpCnsKICB1bnNpZ25lZCBjaGFyICptdCA9IG1lbV9wdHIgKGFkZHJlc3MsIE1QQV9DT05URU5UX1RZUEUpOwogIHJldHVybiAqbXQ7Cn0K