IyEvdXNyL2Jpbi9lbnYgcGVybAoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFtSZV13cml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBBdCBzb21lIHBvaW50IGl0IGJlY2FtZSBhcHBhcmVudCB0aGF0IHRoZSBvcmlnaW5hbCBTU0xlYXkgUkM0CiMgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIHN1Ym9wdGltYWxseSBvbiBsYXRlc3QgSUEtMzIKIyBtaWNyb2FyY2hpdGVjdHVyZXMuIEFmdGVyIHJlLXR1bmluZyBwZXJmb3JtYW5jZSBoYXMgY2hhbmdlZCBhcwojIGZvbGxvd2luZzoKIwojIFBlbnRpdW0JLTEwJQojIFBlbnRpdW0gSUlJCSsxMiUKIyBBTUQJCSs1MCUoKikKIyBQNAkJKzI1MCUoKiopCiMKIyAoKikJVGhpcyBudW1iZXIgaXMgYWN0dWFsbHkgYSB0cmFkZS1vZmY6LSkgSXQncyBwb3NzaWJsZSB0bwojCWFjaGlldmUJKzcyJSwgYnV0IGF0IHRoZSBjb3N0IG9mIC00OCUgb2ZmIFBJSUkgcGVyZm9ybWFuY2UuCiMJSW4gb3RoZXIgd29yZHMgY29kZSBwZXJmb3JtaW5nIGZ1cnRoZXIgMTMlIGZhc3RlciBvbiBBTUQKIwl3b3VsZCBwZXJmb3JtIGFsbW9zdCAyIHRpbWVzIHNsb3dlciBvbiBJbnRlbCBQSUlJLi4uCiMJRm9yIHJlZmVyZW5jZSEgVGhpcyBjb2RlIGRlbGl2ZXJzIH44MCUgb2YgcmM0LWFtZDY0LnBsCiMJcGVyZm9ybWFuY2Ugb24gdGhlIHNhbWUgT3B0ZXJvbiBtYWNoaW5lLgojICgqKikJVGhpcyBudW1iZXIgcmVxdWlyZXMgY29tcHJlc3NlZCBrZXkgc2NoZWR1bGUgc2V0IHVwIGJ5CiMJUkM0X3NldF9rZXkgW3NlZSBjb21tZW50YXJ5IGJlbG93IGZvciBmdXJ0aGVyIGRldGFpbHNdLgojCiMJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KCiMgTWF5IDIwMTEKIwojIE9wdGltaXplIGZvciBDb3JlMiBhbmQgV2VzdG1lcmUgW2FuZCBpbmNpZGVudGFsbHkgT3B0ZXJvbl0uIEN1cnJlbnQKIyBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzIGlzIGJldHRlcikgYW5kCiMgaW1wcm92ZW1lbnQgcmVsYXRpdmUgdG8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSBpczoKIwojIFBlbnRpdW0JMTAuMgkJCSMgb3JpZ2luYWwgbnVtYmVycwojIFBlbnRpdW0gSUlJCTcuOCgqKQojIEludGVsIFA0CTcuNQojCiMgT3B0ZXJvbgk2LjEvKzIwJQkJIyBuZXcgTU1YIG51bWJlcnMKIyBDb3JlMgkJNS4zLys2NyUoKiopCiMgV2VzdG1lcmUJNS4xLys5NCUoKiopCiMgU2FuZHkgQnJpZGdlCTUuMC8rOCUKIyBBdG9tCQkxMi42Lys2JQojIFZJQSBOYW5vCTYuNC8rOSUKIyBJdnkgQnJpZGdlCTQuOS+xMCUKIyBCdWxsZG96ZXIJNC45LysxNSUKIwojICgqKQlQSUlJIGNhbiBhY3R1YWxseSBkZWxpdmVyIDYuNiBjeWNsZXMgcGVyIGJ5dGUgd2l0aCBNTVggY29kZSwKIwlidXQgdGhpcyBzcGVjaWZpYyBjb2RlIHBlcmZvcm1zIHBvb3JseSBvbiBDb3JlMi4gQW5kIHZpY2UKIwl2ZXJzYSwgYmVsb3cgTU1YL1NTRSBjb2RlIGRlbGl2ZXJpbmcgNS44LzcuMSBvbiBDb3JlMiBwZXJmb3JtcwojCXBvb3JseSBvbiBQSUlJLCBhdCA4LjAvMTQuNTotKCBBcyBQSUlJIGlzIG5vdCBhICJob3QiIENQVQojCVthbnltb3JlXSwgSSBjaG9zZSB0byBkaXNjYXJkIFBJSUktc3BlY2lmaWMgY29kZSBwYXRoIGFuZCBvcHQKIwlmb3Igb3JpZ2luYWwgSUFMVS1vbmx5IGNvZGUsIHdoaWNoIGlzIHdoeSBNTVgvU1NFIGNvZGUgcGF0aAojCWlzIGd1YXJkZWQgYnkgU1NFMiBiaXQgKHNlZSBiZWxvdyksIG5vdCBNTVgvU1NFLgojICgqKikJUGVyZm9ybWFuY2UgdnMuIGJsb2NrIHNpemUgb24gQ29yZTIgYW5kIFdlc3RtZXJlIGhhZCBhIG1heGltdW0KIwlhdCAuLi4gNjQgYnl0ZXMgYmxvY2sgc2l6ZS4gQW5kIGl0IHdhcyBxdWl0ZSBhIG1heGltdW0sIDQwLTYwJQojCWluIGNvbXBhcmlzb24gdG8gbGFyZ2VzdCA4S0IgYmxvY2sgc2l6ZS4gQWJvdmUgaW1wcm92ZW1lbnQKIwljb2VmZmljaWVudHMgYXJlIGZvciB0aGUgbGFyZ2VzdCBibG9jayBzaXplLgoKJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CnJlcXVpcmUgIng4NmFzbS5wbCI7CgomYXNtX2luaXQoJEFSR1ZbMF0sInJjNC01ODYucGwiLCR4ODZvbmx5ID0gJEFSR1ZbJCNBUkdWXSBlcSAiMzg2Iik7CgokeHg9ImVheCI7CiR5eT0iZWJ4IjsKJHR4PSJlY3giOwokdHk9ImVkeCI7CiRpbnA9ImVzaSI7CiRvdXQ9ImVicCI7CiRkYXQ9ImVkaSI7CgpzdWIgUkM0X2xvb3AgewogIG15ICRpPXNoaWZ0OwogIG15ICRmdW5jID0gKCRpPT0wKT8qbW92OipvcjsKCgkmYWRkCSgmTEIoJHl5KSwmTEIoJHR4KSk7CgkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHl5LDQpKTsKCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOwoJJm1vdgkoJkRXUCgwLCRkYXQsJHh4LDQpLCR0eSk7CgkmYWRkCSgkdHksJHR4KTsKCSZpbmMJKCZMQigkeHgpKTsKCSZhbmQJKCR0eSwweGZmKTsKCSZyb3IJKCRvdXQsOCkJaWYgKCRpIT0wKTsKCWlmICgkaTwzKSB7CgkgICZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOwoJfSBlbHNlIHsKCSAgJm1vdgkoJHR4LCZ3cGFyYW0oMykpOwkjIHJlbG9hZCBbcmUtYmlhc2VkXSBvdXQKCX0KCSYkZnVuYwkoJG91dCwmRFdQKDAsJGRhdCwkdHksNCkpOwp9CgppZiAoJGFsdD0wKSB7CiAgIyA+MjAlIGZhc3RlciBvbiBBdG9tIGFuZCBTYW5keSBCcmlkZ2VbIV0sIDglIGZhc3RlciBvbiBPcHRlcm9uLAogICMgYnV0IH40MCUgc2xvd2VyIG9uIENvcmUyIGFuZCBXZXN0bWVyZS4uLiBBdHRlbXB0IHRvIGFkZCBtb3Z6CiAgIyBicmluZ3MgZG93biBPcHRlcm9uIGJ5IDI1JSwgQXRvbSBhbmQgU2FuZHkgQnJpZGdlIGJ5IDE1JSwgeWV0CiAgIyBvbiBDb3JlMiB3aXRoIG1vdnogaXQncyBhbG1vc3QgMjAlIHNsb3dlciB0aGFuIGJlbG93IGFsdGVybmF0aXZlCiAgIyBjb2RlLi4uIFllcywgaXQncyBhIHRvdGFsIG1lc3MuLi4KICBteSBAWFg9KCR4eCwkb3V0KTsKICAkUkM0X2xvb3BfbW14ID0gc3ViIHsJCSMgU1NFIGFjdHVhbGx5Li4uCiAgICBteSAkaT1zaGlmdDsKICAgIG15ICRqPSRpPD0wPzA6JGk+PjE7CiAgICBteSAkbW09JGk8PTA/Im1tMCI6Im1tIi4oJGkmMSk7CgoJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOwoJJmxlYQkoQFhYWzFdLCZEV1AoMSxAWFhbMF0pKTsKCSZweG9yCSgibW0yIiwibW0wIikJCQkJaWYgKCRpPT0wKTsKCSZwc2xscQkoIm1tMSIsOCkJCQkJaWYgKCRpPT0wKTsKCSZhbmQJKEBYWFsxXSwweGZmKTsKCSZweG9yCSgibW0wIiwibW0wIikJCQkJaWYgKCRpPD0wKTsKCSZtb3YJKCR0eSwmRFdQKDAsJGRhdCwkeXksNCkpOwoJJm1vdgkoJkRXUCgwLCRkYXQsJHl5LDQpLCR0eCk7CgkmcHhvcgkoIm1tMSIsIm1tMiIpCQkJCWlmICgkaT09MCk7CgkmbW92CSgmRFdQKDAsJGRhdCwkWFhbMF0sNCksJHR5KTsKCSZhZGQJKCZMQigkdHkpLCZMQigkdHgpKTsKCSZtb3ZkCShAWFhbMF0sIm1tNyIpCQkJCWlmICgkaT09MCk7CgkmbW92CSgkdHgsJkRXUCgwLCRkYXQsQFhYWzFdLDQpKTsKCSZweG9yCSgibW0xIiwibW0xIikJCQkJaWYgKCRpPT0xKTsKCSZtb3ZxCSgibW0yIiwmUVdQKDAsJGlucCkpCQkJaWYgKCRpPT0xKTsKCSZtb3ZxCSgmUVdQKC04LChAWFhbMF0sJGlucCkpLCJtbTEiKQkJaWYgKCRpPT0wKTsKCSZwaW5zcncJKCRtbSwmRFdQKDAsJGRhdCwkdHksNCksJGopOwoKCXB1c2gJKEBYWCxzaGlmdChAWFgpKQkJCWlmICgkaT49MCk7CiAgfQp9IGVsc2UgewogICMgVXNpbmcgcGluc3J3IGhlcmUgaW1wcm92ZXMgcGVyZm9ybWFuZSBvbiBJbnRlbCBDUFVzIGJ5IDItMyUsIGJ1dAogICMgYnJpbmdzIGRvd24gQU1EIGJ5IDclLi4uCiAgJFJDNF9sb29wX21teCA9IHN1YiB7CiAgICBteSAkaT1zaGlmdDsKCgkmYWRkCSgmTEIoJHl5KSwmTEIoJHR4KSk7CgkmcHNsbHEJKCJtbTEiLDgqKCgkaS0xKSY3KSkJCQlpZiAoYWJzKCRpKSE9MSk7CgkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHl5LDQpKTsKCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOwoJJm1vdgkoJkRXUCgwLCRkYXQsJHh4LDQpLCR0eSk7CgkmaW5jCSgkeHgpOwoJJmFkZAkoJHR5LCR0eCk7CgkmbW92egkoJHh4LCZMQigkeHgpKTsJCQkJIyAoKikKCSZtb3Z6CSgkdHksJkxCKCR0eSkpOwkJCQkjICgqKQoJJnB4b3IJKCJtbTIiLCRpPT0xPyJtbTAiOiJtbTEiKQkJaWYgKCRpPj0wKTsKCSZtb3ZxCSgibW0wIiwmUVdQKDAsJGlucCkpCQkJaWYgKCRpPD0wKTsKCSZtb3ZxCSgmUVdQKC04LCgkb3V0LCRpbnApKSwibW0yIikJCWlmICgkaT09MCk7CgkmbW92CSgkdHgsJkRXUCgwLCRkYXQsJHh4LDQpKTsKCSZtb3ZkCSgkaT4wPyJtbTEiOiJtbTIiLCZEV1AoMCwkZGF0LCR0eSw0KSk7CgoJIyAoKikJVGhpcyBpcyB0aGUga2V5IHRvIENvcmUyIGFuZCBXZXN0bWVyZSBwZXJmb3JtYW5jZS4KCSMJV2hpdGhvdXQgbW92eiBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uIGxvZ2ljIGNvbmZ1c2VzCgkjCWl0c2VsZiBhbmQgZmFpbHMgdG8gcmVvcmRlciBsb2FkcyBhbmQgc3RvcmVzLiBQcm9ibGVtCgkjCWFwcGVhcnMgdG8gYmUgZml4ZWQgaW4gU2FuZHkgQnJpZGdlLi4uCiAgfQp9CgomZXh0ZXJuYWxfbGFiZWwoIk9QRU5TU0xfaWEzMmNhcF9QIik7CgojIHZvaWQgUkM0KFJDNF9LRVkgKmtleSxzaXplX3QgbGVuLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucCx1bnNpZ25lZCBjaGFyICpvdXQpOwomZnVuY3Rpb25fYmVnaW4oIlJDNCIpOwoJJm1vdgkoJGRhdCwmd3BhcmFtKDApKTsJIyBsb2FkIGtleSBzY2hlZHVsZSBwb2ludGVyCgkmbW92CSgkdHksICZ3cGFyYW0oMSkpOwkjIGxvYWQgbGVuCgkmbW92CSgkaW5wLCZ3cGFyYW0oMikpOwkjIGxvYWQgaW5wCgkmbW92CSgkb3V0LCZ3cGFyYW0oMykpOwkjIGxvYWQgb3V0CgoJJnhvcgkoJHh4LCR4eCk7CQkjIGF2b2lkIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGxzCgkmeG9yCSgkeXksJHl5KTsKCgkmY21wCSgkdHksMCk7CQkjIHNhZmV0eSBuZXQKCSZqZQkoJmxhYmVsKCJhYm9ydCIpKTsKCgkmbW92CSgmTEIoJHh4KSwmQlAoMCwkZGF0KSk7CSMgbG9hZCBrZXktPngKCSZtb3YJKCZMQigkeXkpLCZCUCg0LCRkYXQpKTsJIyBsb2FkIGtleS0+eQoJJmFkZAkoJGRhdCw4KTsKCgkmbGVhCSgkdHgsJkRXUCgwLCRpbnAsJHR5KSk7Cgkmc3ViCSgkb3V0LCRpbnApOwkJIyByZS1iaWFzIG91dAoJJm1vdgkoJndwYXJhbSgxKSwkdHgpOwkjIHNhdmUgaW5wdXQrbGVuCgoJJmluYwkoJkxCKCR4eCkpOwoKCSMgZGV0ZWN0IGNvbXByZXNzZWQga2V5IHNjaGVkdWxlLi4uCgkmY21wCSgmRFdQKDI1NiwkZGF0KSwtMSk7CgkmamUJKCZsYWJlbCgiUkM0X0NIQVIiKSk7CgoJJm1vdgkoJHR4LCZEV1AoMCwkZGF0LCR4eCw0KSk7CgoJJmFuZAkoJHR5LC00KTsJCSMgaG93IG1hbnkgNC1ieXRlIGNodW5rcz8KCSZqegkoJmxhYmVsKCJsb29wMSIpKTsKCgkmbW92CSgmd3BhcmFtKDMpLCRvdXQpOwkjICRvdXQgYXMgYWNjdW11bGF0b3IgaW4gdGhlc2UgbG9vcHMKCQkJCQlpZiAoJHg4Nm9ubHkpIHsKCSZqbXAJKCZsYWJlbCgiZ280bG9vcDQiKSk7CgkJCQkJfSBlbHNlIHsKCSZ0ZXN0CSgkdHksLTgpOwoJJmp6CSgmbGFiZWwoImdvNGxvb3A0IikpOwoKCSZwaWNtZXVwKCRvdXQsIk9QRU5TU0xfaWEzMmNhcF9QIik7CgkmYnQJKCZEV1AoMCwkb3V0KSwyNik7CSMgY2hlY2sgU1NFMiBiaXQgW2NvdWxkIGhhdmUgYmVlbiBNTVhdCgkmam5jCSgmbGFiZWwoImdvNGxvb3A0IikpOwoKCSZtb3YJKCRvdXQsJndwYXJhbSgzKSkJaWYgKCEkYWx0KTsKCSZtb3ZkCSgibW03Iiwmd3BhcmFtKDMpKQlpZiAoJGFsdCk7CgkmYW5kCSgkdHksLTgpOwoJJmxlYQkoJHR5LCZEV1AoLTgsJGlucCwkdHkpKTsKCSZtb3YJKCZEV1AoLTQsJGRhdCksJHR5KTsJIyBzYXZlIGlucHV0KyhsZW4vOCkqOC04CgoJJiRSQzRfbG9vcF9tbXgoLTEpOwoJJmptcCgmbGFiZWwoImxvb3BfbW14X2VudGVyIikpOwoKCSZzZXRfbGFiZWwoImxvb3BfbW14IiwxNik7CgkJJiRSQzRfbG9vcF9tbXgoMCk7Cgkmc2V0X2xhYmVsKCJsb29wX21teF9lbnRlciIpOwoJCWZvciAJKCRpPTE7JGk8ODskaSsrKSB7ICYkUkM0X2xvb3BfbW14KCRpKTsgfQoJCSZtb3YJKCR0eSwkeXkpOwoJCSZ4b3IJKCR5eSwkeXkpOwkJIyB0aGlzIGlzIHNlY29uZCBrZXkgdG8gQ29yZTIKCQkmbW92CSgmTEIoJHl5KSwmTEIoJHR5KSk7CSMgYW5kIFdlc3RtZXJlIHBlcmZvcm1hbmNlLi4uCgkJJmNtcAkoJGlucCwmRFdQKC00LCRkYXQpKTsKCQkmbGVhCSgkaW5wLCZEV1AoOCwkaW5wKSk7CgkmamIJKCZsYWJlbCgibG9vcF9tbXgiKSk7CgogICAgaWYgKCRhbHQpIHsKCSZtb3ZkCSgkb3V0LCJtbTciKTsKCSZweG9yCSgibW0yIiwibW0wIik7CgkmcHNsbHEJKCJtbTEiLDgpOwoJJnB4b3IJKCJtbTEiLCJtbTIiKTsKCSZtb3ZxCSgmUVdQKC04LCRvdXQsJGlucCksIm1tMSIpOwogICAgfSBlbHNlIHsKCSZwc2xscQkoIm1tMSIsNTYpOwoJJnB4b3IJKCJtbTIiLCJtbTEiKTsKCSZtb3ZxCSgmUVdQKC04LCRvdXQsJGlucCksIm1tMiIpOwogICAgfQoJJmVtbXMJKCk7CgoJJmNtcAkoJGlucCwmd3BhcmFtKDEpKTsJIyBjb21wYXJlIHRvIGlucHV0K2xlbgoJJmplCSgmbGFiZWwoImRvbmUiKSk7Cgkmam1wCSgmbGFiZWwoImxvb3AxIikpOwoJCQkJCX0KCiZzZXRfbGFiZWwoImdvNGxvb3A0IiwxNik7CgkmbGVhCSgkdHksJkRXUCgtNCwkaW5wLCR0eSkpOwoJJm1vdgkoJndwYXJhbSgyKSwkdHkpOwkjIHNhdmUgaW5wdXQrKGxlbi80KSo0LTQKCgkmc2V0X2xhYmVsKCJsb29wNCIpOwoJCWZvciAoJGk9MDskaTw0OyRpKyspIHsgUkM0X2xvb3AoJGkpOyB9CgkJJnJvcgkoJG91dCw4KTsKCQkmeG9yCSgkb3V0LCZEV1AoMCwkaW5wKSk7CgkJJmNtcAkoJGlucCwmd3BhcmFtKDIpKTsJIyBjb21wYXJlIHRvIGlucHV0KyhsZW4vNCkqNC00CgkJJm1vdgkoJkRXUCgwLCR0eCwkaW5wKSwkb3V0KTsjICR0eCBob2xkcyByZS1iaWFzZWQgb3V0IGhlcmUKCQkmbGVhCSgkaW5wLCZEV1AoNCwkaW5wKSk7CgkJJm1vdgkoJHR4LCZEV1AoMCwkZGF0LCR4eCw0KSk7CgkmamIJKCZsYWJlbCgibG9vcDQiKSk7CgoJJmNtcAkoJGlucCwmd3BhcmFtKDEpKTsJIyBjb21wYXJlIHRvIGlucHV0K2xlbgoJJmplCSgmbGFiZWwoImRvbmUiKSk7CgkmbW92CSgkb3V0LCZ3cGFyYW0oMykpOwkjIHJlc3RvcmUgJG91dAoKCSZzZXRfbGFiZWwoImxvb3AxIiwxNik7CgkJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOwoJCSZtb3YJKCR0eSwmRFdQKDAsJGRhdCwkeXksNCkpOwoJCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOwoJCSZtb3YJKCZEV1AoMCwkZGF0LCR4eCw0KSwkdHkpOwoJCSZhZGQJKCR0eSwkdHgpOwoJCSZpbmMJKCZMQigkeHgpKTsKCQkmYW5kCSgkdHksMHhmZik7CgkJJm1vdgkoJHR5LCZEV1AoMCwkZGF0LCR0eSw0KSk7CgkJJnhvcgkoJkxCKCR0eSksJkJQKDAsJGlucCkpOwoJCSZsZWEJKCRpbnAsJkRXUCgxLCRpbnApKTsKCQkmbW92CSgkdHgsJkRXUCgwLCRkYXQsJHh4LDQpKTsKCQkmY21wCSgkaW5wLCZ3cGFyYW0oMSkpOwkjIGNvbXBhcmUgdG8gaW5wdXQrbGVuCgkJJm1vdgkoJkJQKC0xLCRvdXQsJGlucCksJkxCKCR0eSkpOwoJJmpiCSgmbGFiZWwoImxvb3AxIikpOwoKCSZqbXAJKCZsYWJlbCgiZG9uZSIpKTsKCiMgdGhpcyBpcyBlc3NlbnRpYWxseSBJbnRlbCBQNCBzcGVjaWZpYyBjb2RlcGF0aC4uLgomc2V0X2xhYmVsKCJSQzRfQ0hBUiIsMTYpOwoJJm1vdnoJKCR0eCwmQlAoMCwkZGF0LCR4eCkpOwoJIyBzdHJhbmdlbHkgZW5vdWdoIHVucm9sbGVkIGxvb3AgcGVyZm9ybXMgb3ZlciAyMCUgc2xvd2VyLi4uCgkmc2V0X2xhYmVsKCJjbG9vcDEiKTsKCQkmYWRkCSgmTEIoJHl5KSwmTEIoJHR4KSk7CgkJJm1vdnoJKCR0eSwmQlAoMCwkZGF0LCR5eSkpOwoJCSZtb3YJKCZCUCgwLCRkYXQsJHl5KSwmTEIoJHR4KSk7CgkJJm1vdgkoJkJQKDAsJGRhdCwkeHgpLCZMQigkdHkpKTsKCQkmYWRkCSgmTEIoJHR5KSwmTEIoJHR4KSk7CgkJJm1vdnoJKCR0eSwmQlAoMCwkZGF0LCR0eSkpOwoJCSZhZGQJKCZMQigkeHgpLDEpOwoJCSZ4b3IJKCZMQigkdHkpLCZCUCgwLCRpbnApKTsKCQkmbGVhCSgkaW5wLCZEV1AoMSwkaW5wKSk7CgkJJm1vdnoJKCR0eCwmQlAoMCwkZGF0LCR4eCkpOwoJCSZjbXAJKCRpbnAsJndwYXJhbSgxKSk7CgkJJm1vdgkoJkJQKC0xLCRvdXQsJGlucCksJkxCKCR0eSkpOwoJJmpiCSgmbGFiZWwoImNsb29wMSIpKTsKCiZzZXRfbGFiZWwoImRvbmUiKTsKCSZkZWMJKCZMQigkeHgpKTsKCSZtb3YJKCZEV1AoLTQsJGRhdCksJHl5KTsJCSMgc2F2ZSBrZXktPnkKCSZtb3YJKCZCUCgtOCwkZGF0KSwmTEIoJHh4KSk7CSMgc2F2ZSBrZXktPngKJnNldF9sYWJlbCgiYWJvcnQiKTsKJmZ1bmN0aW9uX2VuZCgiUkM0Iik7CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiRpbnA9ImVzaSI7CiRvdXQ9ImVkaSI7CiRpZGk9ImVicCI7CiRpZG89ImVjeCI7CiRpZHg9ImVkeCI7CgojIHZvaWQgUkM0X3NldF9rZXkoUkM0X0tFWSAqa2V5LGludCBsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CiZmdW5jdGlvbl9iZWdpbigiUkM0X3NldF9rZXkiKTsKCSZtb3YJKCRvdXQsJndwYXJhbSgwKSk7CQkjIGxvYWQga2V5CgkmbW92CSgkaWRpLCZ3cGFyYW0oMSkpOwkJIyBsb2FkIGxlbgoJJm1vdgkoJGlucCwmd3BhcmFtKDIpKTsJCSMgbG9hZCBkYXRhCgkmcGljbWV1cCgkaWR4LCJPUEVOU1NMX2lhMzJjYXBfUCIpOwoKCSZsZWEJKCRvdXQsJkRXUCgyKjQsJG91dCkpOwkJIyAma2V5LT5kYXRhCgkmbGVhCSgkaW5wLCZEV1AoMCwkaW5wLCRpZGkpKTsJIyAkaW5wIHRvIHBvaW50IGF0IHRoZSBlbmQKCSZuZWcJKCRpZGkpOwoJJnhvcgkoImVheCIsImVheCIpOwoJJm1vdgkoJkRXUCgtNCwkb3V0KSwkaWRpKTsJCSMgYm9ycm93IGtleS0+eQoKCSZidAkoJkRXUCgwLCRpZHgpLDIwKTsJCSMgY2hlY2sgZm9yIGJpdCMyMAoJJmpjCSgmbGFiZWwoImMxc3Rsb29wIikpOwoKJnNldF9sYWJlbCgidzFzdGxvb3AiLDE2KTsKCSZtb3YJKCZEV1AoMCwkb3V0LCJlYXgiLDQpLCJlYXgiKTsJIyBrZXktPmRhdGFbaV09aTsKCSZhZGQJKCZMQigiZWF4IiksMSk7CQkJIyBpKys7Cgkmam5jCSgmbGFiZWwoIncxc3Rsb29wIikpOwoKCSZ4b3IJKCRpZG8sJGlkbyk7CgkmeG9yCSgkaWR4LCRpZHgpOwoKJnNldF9sYWJlbCgidzJuZGxvb3AiLDE2KTsKCSZtb3YJKCJlYXgiLCZEV1AoMCwkb3V0LCRpZG8sNCkpOwoJJmFkZAkoJkxCKCRpZHgpLCZCUCgwLCRpbnAsJGlkaSkpOwoJJmFkZAkoJkxCKCRpZHgpLCZMQigiZWF4IikpOwoJJmFkZAkoJGlkaSwxKTsKCSZtb3YJKCJlYngiLCZEV1AoMCwkb3V0LCRpZHgsNCkpOwoJJmpuegkoJmxhYmVsKCJ3bm93cmFwIikpOwoJICAmbW92CSgkaWRpLCZEV1AoLTQsJG91dCkpOwoJJnNldF9sYWJlbCgid25vd3JhcCIpOwoJJm1vdgkoJkRXUCgwLCRvdXQsJGlkeCw0KSwiZWF4Iik7CgkmbW92CSgmRFdQKDAsJG91dCwkaWRvLDQpLCJlYngiKTsKCSZhZGQJKCZMQigkaWRvKSwxKTsKCSZqbmMJKCZsYWJlbCgidzJuZGxvb3AiKSk7CiZqbXAJKCZsYWJlbCgiZXhpdCIpKTsKCiMgVW5saWtlIGFsbCBvdGhlciB4ODYgW2FuZCB4ODZfNjRdIGltcGxlbWVudGF0aW9ucywgSW50ZWwgUDQgY29yZQojIFtpbmNsdWRpbmcgRU02NFRdIHdhcyBmb3VuZCB0byBwZXJmb3JtIHBvb3JseSB3aXRoIGFib3ZlICIzMi1iaXQiIGtleQojIHNjaGVkdWxlLCBhLmsuYS4gUkM0X0lOVC4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIElBLTMyIGhhbmQtY29kZWQKIyBhc3NlbWJsZXIgdHVybmVkIG91dCB0byBiZSAzLjV4IGlmIHJlLWNvZGVkIGZvciBjb21wcmVzc2VkIDgtYml0IG9uZSwKIyBhLmsuYS4gUkM0X0NIQVIhIEl0J3MgaG93ZXZlciBpbmFwcHJvcHJpYXRlIHRvIGp1c3Qgc3dpdGNoIHRvIDgtYml0CiMgc2NoZWR1bGUgZm9yIHg4NltfNjRdLCBiZWNhdXNlIG5vbi1QNCBpbXBsZW1lbnRhdGlvbnMgc3VmZmVyIGZyb20KIyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBsb3NzZXMgdGhlbiwgZS5nLiBQSUlJIGV4aGliaXRzID4yeAojIGRldGVyaW9yYXRpb24sIGFuZCBzbyBkb2VzIE9wdGVyb24uIEluIG9yZGVyIHRvIGFzc3VyZSBvcHRpbWFsCiMgYWxsLXJvdW5kIHBlcmZvcm1hbmNlLCB3ZSBkZXRlY3QgUDQgYXQgcnVuLXRpbWUgYW5kIHNldCB1cCBjb21wcmVzc2VkCiMga2V5IHNjaGVkdWxlLCB3aGljaCBpcyByZWNvZ25pemVkIGJ5IFJDNCBwcm9jZWR1cmUuCgomc2V0X2xhYmVsKCJjMXN0bG9vcCIsMTYpOwoJJm1vdgkoJkJQKDAsJG91dCwiZWF4IiksJkxCKCJlYXgiKSk7CSMga2V5LT5kYXRhW2ldPWk7CgkmYWRkCSgmTEIoImVheCIpLDEpOwkJCSMgaSsrOwoJJmpuYwkoJmxhYmVsKCJjMXN0bG9vcCIpKTsKCgkmeG9yCSgkaWRvLCRpZG8pOwoJJnhvcgkoJGlkeCwkaWR4KTsKCSZ4b3IJKCJlYngiLCJlYngiKTsKCiZzZXRfbGFiZWwoImMybmRsb29wIiwxNik7CgkmbW92CSgmTEIoImVheCIpLCZCUCgwLCRvdXQsJGlkbykpOwoJJmFkZAkoJkxCKCRpZHgpLCZCUCgwLCRpbnAsJGlkaSkpOwoJJmFkZAkoJkxCKCRpZHgpLCZMQigiZWF4IikpOwoJJmFkZAkoJGlkaSwxKTsKCSZtb3YJKCZMQigiZWJ4IiksJkJQKDAsJG91dCwkaWR4KSk7Cgkmam56CSgmbGFiZWwoImNub3dyYXAiKSk7CgkgICZtb3YJKCRpZGksJkRXUCgtNCwkb3V0KSk7Cgkmc2V0X2xhYmVsKCJjbm93cmFwIik7CgkmbW92CSgmQlAoMCwkb3V0LCRpZHgpLCZMQigiZWF4IikpOwoJJm1vdgkoJkJQKDAsJG91dCwkaWRvKSwmTEIoImVieCIpKTsKCSZhZGQJKCZMQigkaWRvKSwxKTsKCSZqbmMJKCZsYWJlbCgiYzJuZGxvb3AiKSk7CgoJJm1vdgkoJkRXUCgyNTYsJG91dCksLTEpOwkJIyBtYXJrIHNjaGVkdWxlIGFzIGNvbXByZXNzZWQKCiZzZXRfbGFiZWwoImV4aXQiKTsKCSZ4b3IJKCJlYXgiLCJlYXgiKTsKCSZtb3YJKCZEV1AoLTgsJG91dCksImVheCIpOwkJIyBrZXktPng9MDsKCSZtb3YJKCZEV1AoLTQsJG91dCksImVheCIpOwkJIyBrZXktPnk9MDsKJmZ1bmN0aW9uX2VuZCgiUkM0X3NldF9rZXkiKTsKCiMgY29uc3QgY2hhciAqUkM0X29wdGlvbnModm9pZCk7CiZmdW5jdGlvbl9iZWdpbl9CKCJSQzRfb3B0aW9ucyIpOwoJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOwomc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKCSZibGluZHBvcCgiZWF4Iik7CgkmbGVhCSgiZWF4IiwmRFdQKCZsYWJlbCgib3B0cyIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCJlYXgiKSk7CgkmcGljbWV1cCgiZWR4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKCSZtb3YJKCJlZHgiLCZEV1AoMCwiZWR4IikpOwoJJmJ0CSgiZWR4IiwyMCk7CgkmamMJKCZsYWJlbCgiMXhjaGFyIikpOwoJJmJ0CSgiZWR4IiwyNik7Cgkmam5jCSgmbGFiZWwoInJldCIpKTsKCSZhZGQJKCJlYXgiLDI1KTsKCSZyZXQJKCk7CiZzZXRfbGFiZWwoIjF4Y2hhciIpOwoJJmFkZAkoImVheCIsMTIpOwomc2V0X2xhYmVsKCJyZXQiKTsKCSZyZXQJKCk7CiZzZXRfbGFiZWwoIm9wdHMiLDY0KTsKJmFzY2l6CSgicmM0KDR4LGludCkiKTsKJmFzY2l6CSgicmM0KDF4LGNoYXIpIik7CiZhc2NpegkoInJjNCg4eCxtbXgpIik7CiZhc2NpegkoIlJDNCBmb3IgeDg2LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+Iik7CiZhbGlnbgkoNjQpOwomZnVuY3Rpb25fZW5kX0IoIlJDNF9vcHRpb25zIik7CgomYXNtX2ZpbmlzaCgpOwoK