ZGlmZiAtLWdpdCBhL2puaS9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC01ODYucGwgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOWFjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtNTg2LnBsCkBAIC0wLDAgKzEsNDEwIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgW1JlXXdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEF0IHNvbWUgcG9pbnQgaXQgYmVjYW1lIGFwcGFyZW50IHRoYXQgdGhlIG9yaWdpbmFsIFNTTGVheSBSQzQKKyMgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIHN1Ym9wdGltYWxseSBvbiBsYXRlc3QgSUEtMzIKKyMgbWljcm9hcmNoaXRlY3R1cmVzLiBBZnRlciByZS10dW5pbmcgcGVyZm9ybWFuY2UgaGFzIGNoYW5nZWQgYXMKKyMgZm9sbG93aW5nOgorIworIyBQZW50aXVtCS0xMCUKKyMgUGVudGl1bSBJSUkJKzEyJQorIyBBTUQJCSs1MCUoKikKKyMgUDQJCSsyNTAlKCoqKQorIworIyAoKikJVGhpcyBudW1iZXIgaXMgYWN0dWFsbHkgYSB0cmFkZS1vZmY6LSkgSXQncyBwb3NzaWJsZSB0bworIwlhY2hpZXZlCSs3MiUsIGJ1dCBhdCB0aGUgY29zdCBvZiAtNDglIG9mZiBQSUlJIHBlcmZvcm1hbmNlLgorIwlJbiBvdGhlciB3b3JkcyBjb2RlIHBlcmZvcm1pbmcgZnVydGhlciAxMyUgZmFzdGVyIG9uIEFNRAorIwl3b3VsZCBwZXJmb3JtIGFsbW9zdCAyIHRpbWVzIHNsb3dlciBvbiBJbnRlbCBQSUlJLi4uCisjCUZvciByZWZlcmVuY2UhIFRoaXMgY29kZSBkZWxpdmVycyB+ODAlIG9mIHJjNC1hbWQ2NC5wbAorIwlwZXJmb3JtYW5jZSBvbiB0aGUgc2FtZSBPcHRlcm9uIG1hY2hpbmUuCisjICgqKikJVGhpcyBudW1iZXIgcmVxdWlyZXMgY29tcHJlc3NlZCBrZXkgc2NoZWR1bGUgc2V0IHVwIGJ5CisjCVJDNF9zZXRfa2V5IFtzZWUgY29tbWVudGFyeSBiZWxvdyBmb3IgZnVydGhlciBkZXRhaWxzXS4KKyMKKyMJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKworIyBNYXkgMjAxMQorIworIyBPcHRpbWl6ZSBmb3IgQ29yZTIgYW5kIFdlc3RtZXJlIFthbmQgaW5jaWRlbnRhbGx5IE9wdGVyb25dLiBDdXJyZW50CisjIHBlcmZvcm1hbmNlIGluIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUgKGxlc3MgaXMgYmV0dGVyKSBhbmQKKyMgaW1wcm92ZW1lbnQgcmVsYXRpdmUgdG8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSBpczoKKyMKKyMgUGVudGl1bQkxMC4yCQkJIyBvcmlnaW5hbCBudW1iZXJzCisjIFBlbnRpdW0gSUlJCTcuOCgqKQorIyBJbnRlbCBQNAk3LjUKKyMKKyMgT3B0ZXJvbgk2LjEvKzIwJQkJIyBuZXcgTU1YIG51bWJlcnMKKyMgQ29yZTIJCTUuMy8rNjclKCoqKQorIyBXZXN0bWVyZQk1LjEvKzk0JSgqKikKKyMgU2FuZHkgQnJpZGdlCTUuMC8rOCUKKyMgQXRvbQkJMTIuNi8rNiUKKyMKKyMgKCopCVBJSUkgY2FuIGFjdHVhbGx5IGRlbGl2ZXIgNi42IGN5Y2xlcyBwZXIgYnl0ZSB3aXRoIE1NWCBjb2RlLAorIwlidXQgdGhpcyBzcGVjaWZpYyBjb2RlIHBlcmZvcm1zIHBvb3JseSBvbiBDb3JlMi4gQW5kIHZpY2UKKyMJdmVyc2EsIGJlbG93IE1NWC9TU0UgY29kZSBkZWxpdmVyaW5nIDUuOC83LjEgb24gQ29yZTIgcGVyZm9ybXMKKyMJcG9vcmx5IG9uIFBJSUksIGF0IDguMC8xNC41Oi0oIEFzIFBJSUkgaXMgbm90IGEgImhvdCIgQ1BVCisjCVthbnltb3JlXSwgSSBjaG9zZSB0byBkaXNjYXJkIFBJSUktc3BlY2lmaWMgY29kZSBwYXRoIGFuZCBvcHQKKyMJZm9yIG9yaWdpbmFsIElBTFUtb25seSBjb2RlLCB3aGljaCBpcyB3aHkgTU1YL1NTRSBjb2RlIHBhdGgKKyMJaXMgZ3VhcmRlZCBieSBTU0UyIGJpdCAoc2VlIGJlbG93KSwgbm90IE1NWC9TU0UuCisjICgqKikJUGVyZm9ybWFuY2UgdnMuIGJsb2NrIHNpemUgb24gQ29yZTIgYW5kIFdlc3RtZXJlIGhhZCBhIG1heGltdW0KKyMJYXQgLi4uIDY0IGJ5dGVzIGJsb2NrIHNpemUuIEFuZCBpdCB3YXMgcXVpdGUgYSBtYXhpbXVtLCA0MC02MCUKKyMJaW4gY29tcGFyaXNvbiB0byBsYXJnZXN0IDhLQiBibG9jayBzaXplLiBBYm92ZSBpbXByb3ZlbWVudAorIwljb2VmZmljaWVudHMgYXJlIGZvciB0aGUgbGFyZ2VzdCBibG9jayBzaXplLgorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sInJjNC01ODYucGwiKTsKKworJHh4PSJlYXgiOworJHl5PSJlYngiOworJHR4PSJlY3giOworJHR5PSJlZHgiOworJGlucD0iZXNpIjsKKyRvdXQ9ImVicCI7CiskZGF0PSJlZGkiOworCitzdWIgUkM0X2xvb3AgeworICBteSAkaT1zaGlmdDsKKyAgbXkgJGZ1bmMgPSAoJGk9PTApPyptb3Y6Km9yOworCisJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOworCSZtb3YJKCR0eSwmRFdQKDAsJGRhdCwkeXksNCkpOworCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOworCSZtb3YJKCZEV1AoMCwkZGF0LCR4eCw0KSwkdHkpOworCSZhZGQJKCR0eSwkdHgpOworCSZpbmMJKCZMQigkeHgpKTsKKwkmYW5kCSgkdHksMHhmZik7CisJJnJvcgkoJG91dCw4KQlpZiAoJGkhPTApOworCWlmICgkaTwzKSB7CisJICAmbW92CSgkdHgsJkRXUCgwLCRkYXQsJHh4LDQpKTsKKwl9IGVsc2UgeworCSAgJm1vdgkoJHR4LCZ3cGFyYW0oMykpOwkjIHJlbG9hZCBbcmUtYmlhc2VkXSBvdXQKKwl9CisJJiRmdW5jCSgkb3V0LCZEV1AoMCwkZGF0LCR0eSw0KSk7Cit9CisKK2lmICgkYWx0PTApIHsKKyAgIyA+MjAlIGZhc3RlciBvbiBBdG9tIGFuZCBTYW5keSBCcmlkZ2VbIV0sIDglIGZhc3RlciBvbiBPcHRlcm9uLAorICAjIGJ1dCB+NDAlIHNsb3dlciBvbiBDb3JlMiBhbmQgV2VzdG1lcmUuLi4gQXR0ZW1wdCB0byBhZGQgbW92egorICAjIGJyaW5ncyBkb3duIE9wdGVyb24gYnkgMjUlLCBBdG9tIGFuZCBTYW5keSBCcmlkZ2UgYnkgMTUlLCB5ZXQKKyAgIyBvbiBDb3JlMiB3aXRoIG1vdnogaXQncyBhbG1vc3QgMjAlIHNsb3dlciB0aGFuIGJlbG93IGFsdGVybmF0aXZlCisgICMgY29kZS4uLiBZZXMsIGl0J3MgYSB0b3RhbCBtZXNzLi4uCisgIG15IEBYWD0oJHh4LCRvdXQpOworICAkUkM0X2xvb3BfbW14ID0gc3ViIHsJCSMgU1NFIGFjdHVhbGx5Li4uCisgICAgbXkgJGk9c2hpZnQ7CisgICAgbXkgJGo9JGk8PTA/MDokaT4+MTsKKyAgICBteSAkbW09JGk8PTA/Im1tMCI6Im1tIi4oJGkmMSk7CisKKwkmYWRkCSgmTEIoJHl5KSwmTEIoJHR4KSk7CisJJmxlYQkoQFhYWzFdLCZEV1AoMSxAWFhbMF0pKTsKKwkmcHhvcgkoIm1tMiIsIm1tMCIpCQkJCWlmICgkaT09MCk7CisJJnBzbGxxCSgibW0xIiw4KQkJCQlpZiAoJGk9PTApOworCSZhbmQJKEBYWFsxXSwweGZmKTsKKwkmcHhvcgkoIm1tMCIsIm1tMCIpCQkJCWlmICgkaTw9MCk7CisJJm1vdgkoJHR5LCZEV1AoMCwkZGF0LCR5eSw0KSk7CisJJm1vdgkoJkRXUCgwLCRkYXQsJHl5LDQpLCR0eCk7CisJJnB4b3IJKCJtbTEiLCJtbTIiKQkJCQlpZiAoJGk9PTApOworCSZtb3YJKCZEV1AoMCwkZGF0LCRYWFswXSw0KSwkdHkpOworCSZhZGQJKCZMQigkdHkpLCZMQigkdHgpKTsKKwkmbW92ZAkoQFhYWzBdLCJtbTciKQkJCQlpZiAoJGk9PTApOworCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCxAWFhbMV0sNCkpOworCSZweG9yCSgibW0xIiwibW0xIikJCQkJaWYgKCRpPT0xKTsKKwkmbW92cQkoIm1tMiIsJlFXUCgwLCRpbnApKQkJCWlmICgkaT09MSk7CisJJm1vdnEJKCZRV1AoLTgsKEBYWFswXSwkaW5wKSksIm1tMSIpCQlpZiAoJGk9PTApOworCSZwaW5zcncJKCRtbSwmRFdQKDAsJGRhdCwkdHksNCksJGopOworCisJcHVzaAkoQFhYLHNoaWZ0KEBYWCkpCQkJaWYgKCRpPj0wKTsKKyAgfQorfSBlbHNlIHsKKyAgIyBVc2luZyBwaW5zcncgaGVyZSBpbXByb3ZlcyBwZXJmb3JtYW5lIG9uIEludGVsIENQVXMgYnkgMi0zJSwgYnV0CisgICMgYnJpbmdzIGRvd24gQU1EIGJ5IDclLi4uCisgICRSQzRfbG9vcF9tbXggPSBzdWIgeworICAgIG15ICRpPXNoaWZ0OworCisJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOworCSZwc2xscQkoIm1tMSIsOCooKCRpLTEpJjcpKQkJCWlmIChhYnMoJGkpIT0xKTsKKwkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHl5LDQpKTsKKwkmbW92CSgmRFdQKDAsJGRhdCwkeXksNCksJHR4KTsKKwkmbW92CSgmRFdQKDAsJGRhdCwkeHgsNCksJHR5KTsKKwkmaW5jCSgkeHgpOworCSZhZGQJKCR0eSwkdHgpOworCSZtb3Z6CSgkeHgsJkxCKCR4eCkpOwkJCQkjICgqKQorCSZtb3Z6CSgkdHksJkxCKCR0eSkpOwkJCQkjICgqKQorCSZweG9yCSgibW0yIiwkaT09MT8ibW0wIjoibW0xIikJCWlmICgkaT49MCk7CisJJm1vdnEJKCJtbTAiLCZRV1AoMCwkaW5wKSkJCQlpZiAoJGk8PTApOworCSZtb3ZxCSgmUVdQKC04LCgkb3V0LCRpbnApKSwibW0yIikJCWlmICgkaT09MCk7CisJJm1vdgkoJHR4LCZEV1AoMCwkZGF0LCR4eCw0KSk7CisJJm1vdmQJKCRpPjA/Im1tMSI6Im1tMiIsJkRXUCgwLCRkYXQsJHR5LDQpKTsKKworCSMgKCopCVRoaXMgaXMgdGhlIGtleSB0byBDb3JlMiBhbmQgV2VzdG1lcmUgcGVyZm9ybWFuY2UuCisJIwlXaGl0aG91dCBtb3Z6IG91dC1vZi1vcmRlciBleGVjdXRpb24gbG9naWMgY29uZnVzZXMKKwkjCWl0c2VsZiBhbmQgZmFpbHMgdG8gcmVvcmRlciBsb2FkcyBhbmQgc3RvcmVzLiBQcm9ibGVtCisJIwlhcHBlYXJzIHRvIGJlIGZpeGVkIGluIFNhbmR5IEJyaWRnZS4uLgorICB9Cit9CisKKyZleHRlcm5hbF9sYWJlbCgiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKworIyB2b2lkIFJDNChSQzRfS0VZICprZXksc2l6ZV90IGxlbixjb25zdCB1bnNpZ25lZCBjaGFyICppbnAsdW5zaWduZWQgY2hhciAqb3V0KTsKKyZmdW5jdGlvbl9iZWdpbigiUkM0Iik7CisJJm1vdgkoJGRhdCwmd3BhcmFtKDApKTsJIyBsb2FkIGtleSBzY2hlZHVsZSBwb2ludGVyCisJJm1vdgkoJHR5LCAmd3BhcmFtKDEpKTsJIyBsb2FkIGxlbgorCSZtb3YJKCRpbnAsJndwYXJhbSgyKSk7CSMgbG9hZCBpbnAKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMykpOwkjIGxvYWQgb3V0CisKKwkmeG9yCSgkeHgsJHh4KTsJCSMgYXZvaWQgcGFydGlhbCByZWdpc3RlciBzdGFsbHMKKwkmeG9yCSgkeXksJHl5KTsKKworCSZjbXAJKCR0eSwwKTsJCSMgc2FmZXR5IG5ldAorCSZqZQkoJmxhYmVsKCJhYm9ydCIpKTsKKworCSZtb3YJKCZMQigkeHgpLCZCUCgwLCRkYXQpKTsJIyBsb2FkIGtleS0+eAorCSZtb3YJKCZMQigkeXkpLCZCUCg0LCRkYXQpKTsJIyBsb2FkIGtleS0+eQorCSZhZGQJKCRkYXQsOCk7CisKKwkmbGVhCSgkdHgsJkRXUCgwLCRpbnAsJHR5KSk7CisJJnN1YgkoJG91dCwkaW5wKTsJCSMgcmUtYmlhcyBvdXQKKwkmbW92CSgmd3BhcmFtKDEpLCR0eCk7CSMgc2F2ZSBpbnB1dCtsZW4KKworCSZpbmMJKCZMQigkeHgpKTsKKworCSMgZGV0ZWN0IGNvbXByZXNzZWQga2V5IHNjaGVkdWxlLi4uCisJJmNtcAkoJkRXUCgyNTYsJGRhdCksLTEpOworCSZqZQkoJmxhYmVsKCJSQzRfQ0hBUiIpKTsKKworCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCisJJmFuZAkoJHR5LC00KTsJCSMgaG93IG1hbnkgNC1ieXRlIGNodW5rcz8KKwkmanoJKCZsYWJlbCgibG9vcDEiKSk7CisKKwkmdGVzdAkoJHR5LC04KTsKKwkmbW92CSgmd3BhcmFtKDMpLCRvdXQpOwkjICRvdXQgYXMgYWNjdW11bGF0b3IgaW4gdGhlc2UgbG9vcHMKKwkmanoJKCZsYWJlbCgiZ280bG9vcDQiKSk7CisKKwkmcGljbWV1cCgkb3V0LCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCSZidAkoJkRXUCgwLCRvdXQpLDI2KTsJIyBjaGVjayBTU0UyIGJpdCBbY291bGQgaGF2ZSBiZWVuIE1NWF0KKwkmam5jCSgmbGFiZWwoImdvNGxvb3A0IikpOworCisJJm1vdgkoJG91dCwmd3BhcmFtKDMpKQlpZiAoISRhbHQpOworCSZtb3ZkCSgibW03Iiwmd3BhcmFtKDMpKQlpZiAoJGFsdCk7CisJJmFuZAkoJHR5LC04KTsKKwkmbGVhCSgkdHksJkRXUCgtOCwkaW5wLCR0eSkpOworCSZtb3YJKCZEV1AoLTQsJGRhdCksJHR5KTsJIyBzYXZlIGlucHV0KyhsZW4vOCkqOC04CisKKwkmJFJDNF9sb29wX21teCgtMSk7CisJJmptcCgmbGFiZWwoImxvb3BfbW14X2VudGVyIikpOworCisJJnNldF9sYWJlbCgibG9vcF9tbXgiLDE2KTsKKwkJJiRSQzRfbG9vcF9tbXgoMCk7CisJJnNldF9sYWJlbCgibG9vcF9tbXhfZW50ZXIiKTsKKwkJZm9yIAkoJGk9MTskaTw4OyRpKyspIHsgJiRSQzRfbG9vcF9tbXgoJGkpOyB9CisJCSZtb3YJKCR0eSwkeXkpOworCQkmeG9yCSgkeXksJHl5KTsJCSMgdGhpcyBpcyBzZWNvbmQga2V5IHRvIENvcmUyCisJCSZtb3YJKCZMQigkeXkpLCZMQigkdHkpKTsJIyBhbmQgV2VzdG1lcmUgcGVyZm9ybWFuY2UuLi4KKwkJJmNtcAkoJGlucCwmRFdQKC00LCRkYXQpKTsKKwkJJmxlYQkoJGlucCwmRFdQKDgsJGlucCkpOworCSZqYgkoJmxhYmVsKCJsb29wX21teCIpKTsKKworICAgIGlmICgkYWx0KSB7CisJJm1vdmQJKCRvdXQsIm1tNyIpOworCSZweG9yCSgibW0yIiwibW0wIik7CisJJnBzbGxxCSgibW0xIiw4KTsKKwkmcHhvcgkoIm1tMSIsIm1tMiIpOworCSZtb3ZxCSgmUVdQKC04LCRvdXQsJGlucCksIm1tMSIpOworICAgIH0gZWxzZSB7CisJJnBzbGxxCSgibW0xIiw1Nik7CisJJnB4b3IJKCJtbTIiLCJtbTEiKTsKKwkmbW92cQkoJlFXUCgtOCwkb3V0LCRpbnApLCJtbTIiKTsKKyAgICB9CisJJmVtbXMJKCk7CisKKwkmY21wCSgkaW5wLCZ3cGFyYW0oMSkpOwkjIGNvbXBhcmUgdG8gaW5wdXQrbGVuCisJJmplCSgmbGFiZWwoImRvbmUiKSk7CisJJmptcAkoJmxhYmVsKCJsb29wMSIpKTsKKworJnNldF9sYWJlbCgiZ280bG9vcDQiLDE2KTsKKwkmbGVhCSgkdHksJkRXUCgtNCwkaW5wLCR0eSkpOworCSZtb3YJKCZ3cGFyYW0oMiksJHR5KTsJIyBzYXZlIGlucHV0KyhsZW4vNCkqNC00CisKKwkmc2V0X2xhYmVsKCJsb29wNCIpOworCQlmb3IgKCRpPTA7JGk8NDskaSsrKSB7IFJDNF9sb29wKCRpKTsgfQorCQkmcm9yCSgkb3V0LDgpOworCQkmeG9yCSgkb3V0LCZEV1AoMCwkaW5wKSk7CisJCSZjbXAJKCRpbnAsJndwYXJhbSgyKSk7CSMgY29tcGFyZSB0byBpbnB1dCsobGVuLzQpKjQtNAorCQkmbW92CSgmRFdQKDAsJHR4LCRpbnApLCRvdXQpOyMgJHR4IGhvbGRzIHJlLWJpYXNlZCBvdXQgaGVyZQorCQkmbGVhCSgkaW5wLCZEV1AoNCwkaW5wKSk7CisJCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCSZqYgkoJmxhYmVsKCJsb29wNCIpKTsKKworCSZjbXAJKCRpbnAsJndwYXJhbSgxKSk7CSMgY29tcGFyZSB0byBpbnB1dCtsZW4KKwkmamUJKCZsYWJlbCgiZG9uZSIpKTsKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMykpOwkjIHJlc3RvcmUgJG91dAorCisJJnNldF9sYWJlbCgibG9vcDEiLDE2KTsKKwkJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOworCQkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHl5LDQpKTsKKwkJJm1vdgkoJkRXUCgwLCRkYXQsJHl5LDQpLCR0eCk7CisJCSZtb3YJKCZEV1AoMCwkZGF0LCR4eCw0KSwkdHkpOworCQkmYWRkCSgkdHksJHR4KTsKKwkJJmluYwkoJkxCKCR4eCkpOworCQkmYW5kCSgkdHksMHhmZik7CisJCSZtb3YJKCR0eSwmRFdQKDAsJGRhdCwkdHksNCkpOworCQkmeG9yCSgmTEIoJHR5KSwmQlAoMCwkaW5wKSk7CisJCSZsZWEJKCRpbnAsJkRXUCgxLCRpbnApKTsKKwkJJm1vdgkoJHR4LCZEV1AoMCwkZGF0LCR4eCw0KSk7CisJCSZjbXAJKCRpbnAsJndwYXJhbSgxKSk7CSMgY29tcGFyZSB0byBpbnB1dCtsZW4KKwkJJm1vdgkoJkJQKC0xLCRvdXQsJGlucCksJkxCKCR0eSkpOworCSZqYgkoJmxhYmVsKCJsb29wMSIpKTsKKworCSZqbXAJKCZsYWJlbCgiZG9uZSIpKTsKKworIyB0aGlzIGlzIGVzc2VudGlhbGx5IEludGVsIFA0IHNwZWNpZmljIGNvZGVwYXRoLi4uCismc2V0X2xhYmVsKCJSQzRfQ0hBUiIsMTYpOworCSZtb3Z6CSgkdHgsJkJQKDAsJGRhdCwkeHgpKTsKKwkjIHN0cmFuZ2VseSBlbm91Z2ggdW5yb2xsZWQgbG9vcCBwZXJmb3JtcyBvdmVyIDIwJSBzbG93ZXIuLi4KKwkmc2V0X2xhYmVsKCJjbG9vcDEiKTsKKwkJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOworCQkmbW92egkoJHR5LCZCUCgwLCRkYXQsJHl5KSk7CisJCSZtb3YJKCZCUCgwLCRkYXQsJHl5KSwmTEIoJHR4KSk7CisJCSZtb3YJKCZCUCgwLCRkYXQsJHh4KSwmTEIoJHR5KSk7CisJCSZhZGQJKCZMQigkdHkpLCZMQigkdHgpKTsKKwkJJm1vdnoJKCR0eSwmQlAoMCwkZGF0LCR0eSkpOworCQkmYWRkCSgmTEIoJHh4KSwxKTsKKwkJJnhvcgkoJkxCKCR0eSksJkJQKDAsJGlucCkpOworCQkmbGVhCSgkaW5wLCZEV1AoMSwkaW5wKSk7CisJCSZtb3Z6CSgkdHgsJkJQKDAsJGRhdCwkeHgpKTsKKwkJJmNtcAkoJGlucCwmd3BhcmFtKDEpKTsKKwkJJm1vdgkoJkJQKC0xLCRvdXQsJGlucCksJkxCKCR0eSkpOworCSZqYgkoJmxhYmVsKCJjbG9vcDEiKSk7CisKKyZzZXRfbGFiZWwoImRvbmUiKTsKKwkmZGVjCSgmTEIoJHh4KSk7CisJJm1vdgkoJkRXUCgtNCwkZGF0KSwkeXkpOwkJIyBzYXZlIGtleS0+eQorCSZtb3YJKCZCUCgtOCwkZGF0KSwmTEIoJHh4KSk7CSMgc2F2ZSBrZXktPngKKyZzZXRfbGFiZWwoImFib3J0Iik7CismZnVuY3Rpb25fZW5kKCJSQzQiKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyRpbnA9ImVzaSI7Ciskb3V0PSJlZGkiOworJGlkaT0iZWJwIjsKKyRpZG89ImVjeCI7CiskaWR4PSJlZHgiOworCisjIHZvaWQgUkM0X3NldF9rZXkoUkM0X0tFWSAqa2V5LGludCBsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CismZnVuY3Rpb25fYmVnaW4oInByaXZhdGVfUkM0X3NldF9rZXkiKTsKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMCkpOwkJIyBsb2FkIGtleQorCSZtb3YJKCRpZGksJndwYXJhbSgxKSk7CQkjIGxvYWQgbGVuCisJJm1vdgkoJGlucCwmd3BhcmFtKDIpKTsJCSMgbG9hZCBkYXRhCisJJnBpY21ldXAoJGlkeCwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKworCSZsZWEJKCRvdXQsJkRXUCgyKjQsJG91dCkpOwkJIyAma2V5LT5kYXRhCisJJmxlYQkoJGlucCwmRFdQKDAsJGlucCwkaWRpKSk7CSMgJGlucCB0byBwb2ludCBhdCB0aGUgZW5kCisJJm5lZwkoJGlkaSk7CisJJnhvcgkoImVheCIsImVheCIpOworCSZtb3YJKCZEV1AoLTQsJG91dCksJGlkaSk7CQkjIGJvcnJvdyBrZXktPnkKKworCSZidAkoJkRXUCgwLCRpZHgpLDIwKTsJCSMgY2hlY2sgZm9yIGJpdCMyMAorCSZqYwkoJmxhYmVsKCJjMXN0bG9vcCIpKTsKKworJnNldF9sYWJlbCgidzFzdGxvb3AiLDE2KTsKKwkmbW92CSgmRFdQKDAsJG91dCwiZWF4Iiw0KSwiZWF4Iik7CSMga2V5LT5kYXRhW2ldPWk7CisJJmFkZAkoJkxCKCJlYXgiKSwxKTsJCQkjIGkrKzsKKwkmam5jCSgmbGFiZWwoIncxc3Rsb29wIikpOworCisJJnhvcgkoJGlkbywkaWRvKTsKKwkmeG9yCSgkaWR4LCRpZHgpOworCismc2V0X2xhYmVsKCJ3Mm5kbG9vcCIsMTYpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkb3V0LCRpZG8sNCkpOworCSZhZGQJKCZMQigkaWR4KSwmQlAoMCwkaW5wLCRpZGkpKTsKKwkmYWRkCSgmTEIoJGlkeCksJkxCKCJlYXgiKSk7CisJJmFkZAkoJGlkaSwxKTsKKwkmbW92CSgiZWJ4IiwmRFdQKDAsJG91dCwkaWR4LDQpKTsKKwkmam56CSgmbGFiZWwoIndub3dyYXAiKSk7CisJICAmbW92CSgkaWRpLCZEV1AoLTQsJG91dCkpOworCSZzZXRfbGFiZWwoIndub3dyYXAiKTsKKwkmbW92CSgmRFdQKDAsJG91dCwkaWR4LDQpLCJlYXgiKTsKKwkmbW92CSgmRFdQKDAsJG91dCwkaWRvLDQpLCJlYngiKTsKKwkmYWRkCSgmTEIoJGlkbyksMSk7CisJJmpuYwkoJmxhYmVsKCJ3Mm5kbG9vcCIpKTsKKyZqbXAJKCZsYWJlbCgiZXhpdCIpKTsKKworIyBVbmxpa2UgYWxsIG90aGVyIHg4NiBbYW5kIHg4Nl82NF0gaW1wbGVtZW50YXRpb25zLCBJbnRlbCBQNCBjb3JlCisjIFtpbmNsdWRpbmcgRU02NFRdIHdhcyBmb3VuZCB0byBwZXJmb3JtIHBvb3JseSB3aXRoIGFib3ZlICIzMi1iaXQiIGtleQorIyBzY2hlZHVsZSwgYS5rLmEuIFJDNF9JTlQuIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciBJQS0zMiBoYW5kLWNvZGVkCisjIGFzc2VtYmxlciB0dXJuZWQgb3V0IHRvIGJlIDMuNXggaWYgcmUtY29kZWQgZm9yIGNvbXByZXNzZWQgOC1iaXQgb25lLAorIyBhLmsuYS4gUkM0X0NIQVIhIEl0J3MgaG93ZXZlciBpbmFwcHJvcHJpYXRlIHRvIGp1c3Qgc3dpdGNoIHRvIDgtYml0CisjIHNjaGVkdWxlIGZvciB4ODZbXzY0XSwgYmVjYXVzZSBub24tUDQgaW1wbGVtZW50YXRpb25zIHN1ZmZlciBmcm9tCisjIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGxvc3NlcyB0aGVuLCBlLmcuIFBJSUkgZXhoaWJpdHMgPjJ4CisjIGRldGVyaW9yYXRpb24sIGFuZCBzbyBkb2VzIE9wdGVyb24uIEluIG9yZGVyIHRvIGFzc3VyZSBvcHRpbWFsCisjIGFsbC1yb3VuZCBwZXJmb3JtYW5jZSwgd2UgZGV0ZWN0IFA0IGF0IHJ1bi10aW1lIGFuZCBzZXQgdXAgY29tcHJlc3NlZAorIyBrZXkgc2NoZWR1bGUsIHdoaWNoIGlzIHJlY29nbml6ZWQgYnkgUkM0IHByb2NlZHVyZS4KKworJnNldF9sYWJlbCgiYzFzdGxvb3AiLDE2KTsKKwkmbW92CSgmQlAoMCwkb3V0LCJlYXgiKSwmTEIoImVheCIpKTsJIyBrZXktPmRhdGFbaV09aTsKKwkmYWRkCSgmTEIoImVheCIpLDEpOwkJCSMgaSsrOworCSZqbmMJKCZsYWJlbCgiYzFzdGxvb3AiKSk7CisKKwkmeG9yCSgkaWRvLCRpZG8pOworCSZ4b3IJKCRpZHgsJGlkeCk7CisJJnhvcgkoImVieCIsImVieCIpOworCismc2V0X2xhYmVsKCJjMm5kbG9vcCIsMTYpOworCSZtb3YJKCZMQigiZWF4IiksJkJQKDAsJG91dCwkaWRvKSk7CisJJmFkZAkoJkxCKCRpZHgpLCZCUCgwLCRpbnAsJGlkaSkpOworCSZhZGQJKCZMQigkaWR4KSwmTEIoImVheCIpKTsKKwkmYWRkCSgkaWRpLDEpOworCSZtb3YJKCZMQigiZWJ4IiksJkJQKDAsJG91dCwkaWR4KSk7CisJJmpuegkoJmxhYmVsKCJjbm93cmFwIikpOworCSAgJm1vdgkoJGlkaSwmRFdQKC00LCRvdXQpKTsKKwkmc2V0X2xhYmVsKCJjbm93cmFwIik7CisJJm1vdgkoJkJQKDAsJG91dCwkaWR4KSwmTEIoImVheCIpKTsKKwkmbW92CSgmQlAoMCwkb3V0LCRpZG8pLCZMQigiZWJ4IikpOworCSZhZGQJKCZMQigkaWRvKSwxKTsKKwkmam5jCSgmbGFiZWwoImMybmRsb29wIikpOworCisJJm1vdgkoJkRXUCgyNTYsJG91dCksLTEpOwkJIyBtYXJrIHNjaGVkdWxlIGFzIGNvbXByZXNzZWQKKworJnNldF9sYWJlbCgiZXhpdCIpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmbW92CSgmRFdQKC04LCRvdXQpLCJlYXgiKTsJCSMga2V5LT54PTA7CisJJm1vdgkoJkRXUCgtNCwkb3V0KSwiZWF4Iik7CQkjIGtleS0+eT0wOworJmZ1bmN0aW9uX2VuZCgicHJpdmF0ZV9SQzRfc2V0X2tleSIpOworCisjIGNvbnN0IGNoYXIgKlJDNF9vcHRpb25zKHZvaWQpOworJmZ1bmN0aW9uX2JlZ2luX0IoIlJDNF9vcHRpb25zIik7CisJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOworJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCJlYXgiKTsKKwkmbGVhCSgiZWF4IiwmRFdQKCZsYWJlbCgib3B0cyIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCJlYXgiKSk7CisJJnBpY21ldXAoImVkeCIsIk9QRU5TU0xfaWEzMmNhcF9QIik7CisJJm1vdgkoImVkeCIsJkRXUCgwLCJlZHgiKSk7CisJJmJ0CSgiZWR4IiwyMCk7CisJJmpjCSgmbGFiZWwoIjF4Y2hhciIpKTsKKwkmYnQJKCJlZHgiLDI2KTsKKwkmam5jCSgmbGFiZWwoInJldCIpKTsKKwkmYWRkCSgiZWF4IiwyNSk7CisJJnJldAkoKTsKKyZzZXRfbGFiZWwoIjF4Y2hhciIpOworCSZhZGQJKCJlYXgiLDEyKTsKKyZzZXRfbGFiZWwoInJldCIpOworCSZyZXQJKCk7Cismc2V0X2xhYmVsKCJvcHRzIiw2NCk7CismYXNjaXoJKCJyYzQoNHgsaW50KSIpOworJmFzY2l6CSgicmM0KDF4LGNoYXIpIik7CismYXNjaXoJKCJyYzQoOHgsbW14KSIpOworJmFzY2l6CSgiUkM0IGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKyZhbGlnbgkoNjQpOworJmZ1bmN0aW9uX2VuZF9CKCJSQzRfb3B0aW9ucyIpOworCismYXNtX2ZpbmlzaCgpOworCmRpZmYgLS1naXQgYS9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtaWE2NC5wbCBiL2puaS9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC1pYTY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2Q1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtaWE2NC5wbApAQCAtMCwwICsxLDc1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IERhdmlkIE1vc2JlcmdlciA8RGF2aWQuTW9zYmVyZ2VyQGFjbS5vcmc+IGJhc2VkIG9uIHRoZQorIyBJdGFuaXVtIG9wdGltaXplZCBDcnlwdG8gY29kZSB3aGljaCB3YXMgcmVsZWFzZWQgYnkgSFAgTGFicyBhdAorIyBodHRwOi8vd3d3LmhwbC5ocC5jb20vcmVzZWFyY2gvbGludXgvY3J5cHRvLy4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKyMgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorIyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyMgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAqLworCisKKworIyBUaGlzIGlzIGEgbGl0dGxlIGhlbHBlciBwcm9ncmFtIHdoaWNoIGdlbmVyYXRlcyBhIHNvZnR3YXJlLXBpcGVsaW5lZAorIyBmb3IgUkM0IGVuY3J5cHRpb24uICBUaGUgYmFzaWMgYWxnb3JpdGhtIGxvb2tzIGxpa2UgdGhpczoKKyMKKyMgICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbGVuOyArK2NvdW50ZXIpCisjICAgICB7CisjICAgICAgIGluID0gaW5wW2NvdW50ZXJdOworIyAgICAgICBTSSA9IFNbSV07CisjICAgICAgIEogPSAoU0kgKyBKKSAmIDB4ZmY7CisjICAgICAgIFNKID0gU1tKXTsKKyMgICAgICAgVCA9IChTSSArIFNKKSAmIDB4ZmY7CisjICAgICAgIFNbSV0gPSBTSiwgU1tKXSA9IFNJOworIyAgICAgICBTVCA9IFNbVF07CisjICAgICAgIG91dHBbY291bnRlcl0gPSBpbiBeIFNUOworIyAgICAgICBJID0gKEkgKyAxKSAmIDB4ZmY7CisjICAgICB9CisjCisjIFBpcGVsaW5pbmcgdGhpcyBsb29wIGlzbid0IGVhc3ksIGJlY2F1c2UgdGhlIHN0b3JlcyB0byB0aGUgU1tdIGFycmF5CisjIG5lZWQgdG8gYmUgb2JzZXJ2ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyLiAgVGhlIGxvb3AgZ2VuZXJhdGVkIGJ5IHRoZQorIyBjb2RlIGJlbG93IGhhcyB0aGUgZm9sbG93aW5nIHBpcGVsaW5lIGRpYWdyYW06CisjCisjICAgICAgY3ljbGUKKyMgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOSB8MTAgfDExIHwxMiB8MTMgfDE0IHwxNSB8MTYgfDE3IHwKKyMgaXRlcgorIyAgIDE6IHh4eCBMREkgeHh4IHh4eCB4eHggTERKIHh4eCBTV1AgeHh4IExEVCB4eHggeHh4CisjICAgMjogICAgICAgICAgICAgeHh4IExESSB4eHggeHh4IHh4eCBMREogeHh4IFNXUCB4eHggTERUIHh4eCB4eHgKKyMgICAzOiAgICAgICAgICAgICAgICAgICAgICAgICB4eHggTERJIHh4eCB4eHggeHh4IExESiB4eHggU1dQIHh4eCBMRFQgeHh4IHh4eAorIworIyAgIHdoZXJlOgorIyAJTERJID0gbG9hZCBvZiBTW0ldCisjIAlMREogPSBsb2FkIG9mIFNbSl0KKyMgCVNXUCA9IHN3YXAgb2YgU1tJXSBhbmQgU1tKXQorIyAJTERUID0gbG9hZCBvZiBTW1RdCisjCisjIE5vdGUgdGhhdCBpbiB0aGUgYWJvdmUgZGlhZ3JhbSwgdGhlIG1ham9yIHRyb3VibGUtc3BvdCBpcyB0aGF0IExESQorIyBvZiB0aGUgMm5kIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQgQkVGT1JFIHRoZSBTV1Agb2YgdGhlIGZpcnN0CisjIGl0ZXJhdGlvbi4gIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIGVhc3kgdG8gZGV0ZWN0IChJIG9mIHRoZSAxc3QKKyMgaXRlcmF0aW9uIHdpbGwgYmUgZXF1YWwgdG8gSiBvZiB0aGUgMm5kIGl0ZXJhdGlvbikgYW5kIHdoZW4gdGhpcworIyBoYXBwZW5zLCB3ZSBzaW1wbHkgZm9yd2FyZCB0aGUgcHJvcGVyIHZhbHVlIGZyb20gdGhlIDFzdCBpdGVyYXRpb24KKyMgdG8gdGhlIDJuZCBvbmUuICBUaGUgcHJvcGVyIHZhbHVlIGluIHRoaXMgY2FzZSBpcyBzaW1wbHkgdGhlIHZhbHVlCisjIG9mIFNbSV0gZnJvbSB0aGUgZmlyc3QgaXRlcmF0aW9uICh0aGFua3MgdG8gdGhlIGZhY3QgdGhhdCBTV1AKKyMgc2ltcGx5IHN3YXBzIHRoZSBjb250ZW50cyBvZiBTW0ldIGFuZCBTW0pdKS4KKyMKKyMgQW5vdGhlciBwb3RlbnRpYWwgdHJvdWJsZS1zcG90IGlzIGluIGN5Y2xlIDcsIHdoZXJlIFNXUCBvZiB0aGUgMXN0CisjIGl0ZXJhdGlvbiBpc3N1ZXMgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgTERJIG9mIHRoZSAzcmQgaXRlcmF0aW9uLgorIyBIb3dldmVyLCB0aGFua3MgdG8gSUEtNjQgZXhlY3V0aW9uIHNlbWFudGljcywgdGhpcyBjYW4gYmUgdGFrZW4KKyMgY2FyZSBvZiBzaW1wbHkgYnkgcGxhY2luZyBMREkgbGF0ZXIgaW4gdGhlIGluc3RydWN0aW9uLWdyb3VwIHRoYW4KKyMgU1dQLiAgSUEtNjQgQ1BVcyB3aWxsIGF1dG9tYXRpY2FsbHkgZm9yd2FyZCB0aGUgdmFsdWUgaWYgdGhleQorIyBkZXRlY3QgdGhhdCB0aGUgU1dQIGFuZCBMREkgYXJlIGFjY2Vzc2luZyB0aGUgc2FtZSBtZW1vcnktbG9jYXRpb24uCisKKyMgVGhlIGNvcmUtbG9vcCB0aGF0IGNhbiBiZSBwaXBlbGluZWQgdGhlbiBsb29rcyBsaWtlIHRoaXMgKGFubm90YXRlZAorIyB3aXRoIE1jS2lubGV5L01hZGlzb24gaXNzdWUgcG9ydCAmIGxhdGVuY3kgbnVtYmVycywgYXNzdW1pbmcgTDEKKyMgY2FjaGUgaGl0cyBmb3IgdGhlIG1vc3QgcGFydCk6CisKKyMgb3BlcmF0aW9uOgkgICAgaW5zdHJ1Y3Rpb246CQkgICAgaXNzdWUtcG9ydHM6ICBsYXRlbmN5CisjIC0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tIC0tLS0tLS0KKworIyBEYXRhID0gKmlucCsrICAgICAgIGxkMSBkYXRhID0gW2lucF0sIDEgICAgICAgICAgICAgTTAtTTEgICAgICAgICAxIGN5YyAgICAgYzAKKyMgICAgICAgICAgICAgICAgICAgICBzaGxhZGQgSXB0ciA9IEksIEtleVRhYmxlLCAzICAgIE0wLU0zLCBJMCwgSTEgMSBjeWMKKyMgSSA9IChJICsgMSkgJiAweGZmICBwYWRkMSBuZXh0SSA9IEksIG9uZSAgICAgICAgICAgIE0wLU0zLCBJMCwgSTEgMyBjeWMKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyBTSSA9IFNbSV0gICAgICAgICAgIGxkOCBTSSA9IFtJcHRyXSAgICAgICAgICAgICAgICAgTTAtTTEgICAgICAgICAxIGN5YyAgICAgYzEgKiBhZnRlciBTV0FQIQorIyAgICAgICAgICAgICAgICAgICAgIDs7CisjICAgICAgICAgICAgICAgICAgICAgY21wLmVxLnVuYyBwQnlwYXNzID0gSSwgSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFmdGVyIEogaXMgdmFsaWQhCisjIEogPSBTSSArIEogICAgICAgICAgYWRkIEogPSBKLCBTSSAgICAgICAgICAgICAgICAgICBNMC1NMywgSTAsIEkxIDEgY3ljICAgICBjMgorIyAgICAgICAgICAgICAgICAgICAgIChwQnlwYXNzKSBici5jb25kLnNwbnQgQnlwYXNzCisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEogPSBKICYgMHhmZiAgICAgICAgenh0MSBKID0gSiAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIDEgY3ljICAgICAgICAgICBjMworIyAgICAgICAgICAgICAgICAgICAgIDs7CisjICAgICAgICAgICAgICAgICAgICAgc2hsYWRkIEpwdHIgPSBKLCBLZXlUYWJsZSwgMyAgICBNMC1NMywgSTAsIEkxIDEgY3ljICAgICBjNAorIyAgICAgICAgICAgICAgICAgICAgIDs7CisjIFNKID0gU1tKXSAgICAgICAgICAgbGQ4IFNKID0gW0pwdHJdICAgICAgICAgICAgICAgICBNMC1NMSAgICAgICAgIDEgY3ljICAgICBjNQorIyAgICAgICAgICAgICAgICAgICAgIDs7CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUID0gKFNJICsgU0opICAgICAgIGFkZCBUID0gU0ksIFNKICAgICAgICAgICAgICAgICAgTTAtTTMsIEkwLCBJMSAxIGN5YyAgICAgYzYKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyBUID0gVCAmIDB4ZmYgICAgICAgIHp4dDEgVCA9IFQgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxICAgICAgICAxIGN5YworIyBTW0ldID0gU0ogICAgICAgICAgIHN0OCBbSXB0cl0gPSBTSiAgICAgICAgICAgICAgICAgTTItTTMgICAgICAgICAgICAgICAgICAgYzcKKyMgU1tKXSA9IFNJICAgICAgICAgICBzdDggW0pwdHJdID0gU0kgICAgICAgICAgICAgICAgIE0yLU0zCisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgICAgICAgICAgICAgICAgICAgICBzaGxhZGQgVHB0ciA9IFQsIEtleVRhYmxlLCAzICAgIE0wLU0zLCBJMCwgSTEgMSBjeWMgICAgIGM4CisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFQgPSBTW1RdICAgICAgICAgICAgbGQ4IFQgPSBbVHB0cl0gICAgICAgICAgICAgICAgICBNMC1NMSAgICAgICAgIDEgY3ljICAgICBjOQorIyAgICAgICAgICAgICAgICAgICAgIDs7CisjIGRhdGEgXj0gVCAgICAgICAgICAgeG9yIGRhdGEgPSBkYXRhLCBUICAgICAgICAgICAgICBNMC1NMywgSTAsIEkxIDEgY3ljICAgICBjMTAKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyAqb3V0KysgPSBEYXRhIF4gVCAgIGRlcCB3b3JkID0gd29yZCwgZGF0YSwgOCwgUE9TICAgSTAsIEkxICAgICAgICAxIGN5YyAgICAgYzExCisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlcmUgYXJlIHNldmVyYWwgcG9pbnRzIHdvcnRoIG1ha2luZyBoZXJlOgorCisjICAgLSBOb3RlIHRoYXQgZHVlIHRvIHRoZSBieXBhc3MvZm9yd2FyZGluZy1wYXRoLCB0aGUgZmlyc3QgdHdvCisjICAgICBwaGFzZXMgb2YgdGhlIGxvb3AgYXJlIHN0cmFuZ2x5IG1pbmdsZWQgdG9nZXRoZXIuICBJbgorIyAgICAgcGFydGljdWxhciwgbm90ZSB0aGF0IHRoZSBmaXJzdCBzdGFnZSBvZiB0aGUgcGlwZWxpbmUgaXMKKyMgICAgIHVzaW5nIHRoZSB2YWx1ZSBvZiAiSiIsIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIHNlY29uZCBzdGFnZS4KKyMgICAtIEVhY2ggYnVuZGxlLXBhaXIgd2lsbCBoYXZlIGV4YWN0bHkgNiBpbnN0cnVjdGlvbnMuCisjICAgLSBQaXBlbGluZWQsIHRoZSBsb29wIGNhbiBleGVjdXRlIGluIDMgY3ljbGVzL2l0ZXJhdGlvbiBhbmQKKyMgICAgIDQgc3RhZ2VzLiAgSG93ZXZlciwgTWNLaW5sZXkvTWFkaXNvbiBjYW4gaXNzdWUgInN0MSIgdG8KKyMgICAgIHRoZSBzYW1lIGJhbmsgYXQgYSByYXRlIG9mIGF0IG1vc3Qgb25lIHBlciA0IGN5Y2xlcy4gIFRodXMsCisjICAgICBpbnN0ZWFkIG9mIHN0b3JpbmcgZWFjaCBieXRlLCB3ZSBhY2N1bXVsYXRlIHRoZW0gaW4gYSB3b3JkCisjICAgICBhbmQgdGhlbiB3cml0ZSB0aGVtIGJhY2sgYXQgb25jZSB3aXRoIGEgc2luZ2xlICJzdDgiICh0aGlzCisjICAgICBpbXBsaWVzIHRoYXQgdGhlIHNldHVwIGNvZGUgbmVlZHMgdG8gZW5zdXJlIHRoYXQgdGhlIG91dHB1dAorIyAgICAgYnVmZmVyIGlzIHByb3Blcmx5IGFsaWduZWQsIGlmIG5lZWQgYmUsIGJ5IGVuY29kaW5nIHRoZQorIyAgICAgZmlyc3QgZmV3IGJ5dGVzIHNlcGFyYXRlbHkpLgorIyAgIC0gVGhlcmUgaXMgbm8gc3BhY2UgZm9yIGEgImJyLmN0b3AiIGluc3RydWN0aW9uLiAgRm9yIHRoaXMKKyMgICAgIHJlYXNvbiB3ZSBjYW4ndCB1c2UgbW9kdWxlLWxvb3Agc3VwcG9ydCBpbiBJQS02NCBhbmQgaGF2ZQorIyAgICAgdG8gZG8gYSB0cmFkaXRpb25hbCwgcHVyZWx5IHNvZnR3YXJlLXBpcGVsaW5lZCBsb29wLgorIyAgIC0gV2UgY2FuJ3QgcmVwbGFjZSBhbnkgb2YgdGhlIHJlbWFpbmluZyAiYWRkL3p4dDEiIHBhaXJzIHdpdGgKKyMgICAgICJwYWRkMSIgYmVjYXVzZSB0aGUgbGF0ZW5jeSBmb3IgdGhhdCBpbnN0cnVjdGlvbiBpcyB0b28gaGlnaAorIyAgICAgYW5kIHdvdWxkIHB1c2ggdGhlIGxvb3AgdG8gdGhlIHBvaW50IHdoZXJlIG1vcmUgYnlwYXNzZXMKKyMgICAgIHdvdWxkIGJlIG5lZWRlZCwgd2hpY2ggd2UgZG9uJ3QgaGF2ZSBzcGFjZSBmb3IuCisjICAgLSBUaGUgYWJvdmUgbG9vcCBydW5zIGF0IGFyb3VuZCAzLjI2IGN5Y2xlcy9ieXRlLCBvciByb3VnaGx5CisjICAgICA0NDAgTUJ5dGUvc2VjIG9uIGEgMS41R0h6IE1hZGlzb24uICBUaGlzIGlzIHdlbGwgYmVsb3cgdGhlCisjICAgICBzeXN0ZW0gYnVzIGJhbmR3aWR0aCBhbmQgaGVuY2Ugd2l0aCBqdWRpY2lvdXMgdXNlIG9mCisjICAgICAibGZldGNoIiB0aGlzIGxvb3AgY2FuIHJ1biBhdCAoYWxtb3N0KSBwZWFrIHNwZWVkIGV2ZW4gd2hlbgorIyAgICAgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSByZXNpZGUgaW4gbWVtb3J5LiAgVGhlCisjICAgICBtYXguIGxhdGVuY3kgdGhhdCBjYW4gYmUgdG9sZXJhdGVkIGlzIChQUkVGRVRDSF9ESVNUQU5DRSAqCisjICAgICBMMl9MSU5FX1NJWkUgKiAzIGN5YyksIG9yIGFib3V0IDM4NCBjeWNsZXMgYXNzdW1pbmcgKGF0CisjICAgICBsZWFzdCkgMS1haGVhZCBwcmVmZXRjaGluZyBvZiAxMjggYnl0ZSBjYWNoZS1saW5lcy4gIE5vdGUKKyMgICAgIHRoYXQgd2UgZG8gTk9UIHByZWZldGNoIGludG8gTDEsIHNpbmNlIHRoYXQgd291bGQgb25seQorIyAgICAgaW50ZXJmZXJlIHdpdGggdGhlIFNbXSB0YWJsZSB2YWx1ZXMgc3RvcmVkIHRoZXJlLiAgVGhpcyBpcworIyAgICAgYWNjZXB0YWJsZSBiZWNhdXNlIHRoZXJlIGlzIGEgMTAgY3ljbGUgbGF0ZW5jeSBiZXR3ZWVuCisjICAgICBsb2FkIGFuZCBmaXJzdCB1c2Ugb2YgdGhlIGlucHV0IGRhdGEuCisjICAgLSBXZSB1c2UgYSBicmFuY2ggdG8gb3V0LW9mLWxpbmUgYnlwYXNzLWNvZGUgb2YgY3ljbGUtcHJlc3N1cmU6CisjICAgICB3ZSBjYWxjdWxhdGUgdGhlIG5leHQgSiwgY2hlY2sgZm9yIHRoZSBuZWVkIHRvIGFjdGl2YXRlIHRoZQorIyAgICAgYnlwYXNzIHBhdGgsIGFuZCBhY3RpdmF0ZSB0aGUgYnlwYXNzIHBhdGggQUxMIElOIFRIRSBTQU1FCisjICAgICBDWUNMRS4gIElmIHdlIGRpZG4ndCBoYXZlIHRoZXNlIGNvbnN0cmFpbnRzLCB3ZSBjb3VsZCBkbworIyAgICAgdGhlIGJ5cGFzcyB3aXRoIGEgc2ltcGxlIGNvbmRpdGlvbmFsIG1vdmUgaW5zdHJ1Y3Rpb24uCisjICAgICBGb3J0dW5hdGVseSwgdGhlIGJ5cGFzcyBwYXRocyBnZXQgYWN0aXZhdGVkIHJlbGF0aXZlbHkKKyMgICAgIGluZnJlcXVlbnRseSwgc28gdGhlIGV4dHJhIGJyYW5jaGVzIGRvbid0IGNvc3QgYWxsIHRoYXQgbXVjaAorIyAgICAgKGFib3V0IDAuMDQgY3ljbGVzL2J5dGUsIG1lYXN1cmVkIG9uIGEgMTYzOTYgYnl0ZSBmaWxlIHdpdGgKKyMgICAgIHJhbmRvbSBpbnB1dCBkYXRhKS4KKyMKKworJHBoYXNlcyA9IDQ7CQkjIG51bWJlciBvZiBzdGFnZXMvcGhhc2VzIGluIHRoZSBwaXBlbGluZWQtbG9vcAorJHVucm9sbF9jb3VudCA9IDY7CSMgbnVtYmVyIG9mIHRpbWVzIHdlIHVucm9sbGVkIGl0CiskcENvbUkgPSAoMSA8PCAwKTsKKyRwQ29tSiA9ICgxIDw8IDEpOworJHBDb21UID0gKDEgPDwgMik7CiskcE91dCAgPSAoMSA8PCAzKTsKKworJE5EYXRhID0gNDsKKyROSVAgPSAzOworJE5KUCA9IDI7CiskTkkgPSAyOworJE5TSSA9IDM7CiskTlNKID0gMjsKKyROVCA9IDI7CiskTk91dFdvcmQgPSAyOworCisjCisjICR0aHJlc2hvbGQgaXMgdGhlIG1pbmltdW0gbGVuZ3RoIGJlZm9yZSB3ZSBhdHRlbXB0IHRvIHVzZSB0aGUKKyMgYmlnIHNvZnR3YXJlLXBpcGVsaW5lZCBsb29wLiAgSXQgTVVTVCBiZSBncmVhdGVyLW9yLWVxdWFsCisjIHRvOgorIyAgCQlQSEFTRVMgKiAoVU5ST0xMX0NPVU5UICsgMSkgKyA3CisjCisjIFRoZSAiKyA3IiBjb21lcyBmcm9tIHRoZSBmYWN0IHdlIG1heSBoYXZlIHRvIGVuY29kZSB1cCB0bworIyAgIDcgYnl0ZXMgc2VwYXJhdGVseSBiZWZvcmUgdGhlIG91dHB1dCBwb2ludGVyIGlzIGFsaWduZWQuCisjCiskdGhyZXNob2xkID0gKDMgKiAoJHBoYXNlcyAqICgkdW5yb2xsX2NvdW50ICsgMSkpICsgNyk7CisKK3N1YiBJIHsKKyAgICBsb2NhbCAqY29kZSA9IHNoaWZ0OworICAgIGxvY2FsICRmb3JtYXQgPSBzaGlmdDsKKyAgICAkY29kZSAuPSBzcHJpbnRmICgiXHRcdCIuJGZvcm1hdC4iXG4iLCBAXyk7Cit9CisKK3N1YiBQIHsKKyAgICBsb2NhbCAqY29kZSA9IHNoaWZ0OworICAgIGxvY2FsICRmb3JtYXQgPSBzaGlmdDsKKyAgICAkY29kZSAuPSBzcHJpbnRmICgkZm9ybWF0LiJcbiIsIEBfKTsKK30KKworc3ViIFNUT1AgeworICAgIGxvY2FsICpjb2RlID0gc2hpZnQ7CisgICAgJGNvZGUgLj08PF9fXzsKKwkJOzsKK19fXworfQorCitzdWIgZW1pdF9ib2R5IHsKKyAgICBsb2NhbCAqYyA9IHNoaWZ0OworICAgIGxvY2FsICpieXBhc3MgPSBzaGlmdDsKKyAgICBsb2NhbCAoJGl0ZXJhdGlvbiwgJHApID0gQF87CisKKyAgICBsb2NhbCAkaTAgPSAkaXRlcmF0aW9uOworICAgIGxvY2FsICRpMSA9ICRpdGVyYXRpb24gLSAxOworICAgIGxvY2FsICRpMiA9ICRpdGVyYXRpb24gLSAyOworICAgIGxvY2FsICRpMyA9ICRpdGVyYXRpb24gLSAzOworICAgIGxvY2FsICRpdzAgPSAoJGl0ZXJhdGlvbiAtIDMpIC8gODsKKyAgICBsb2NhbCAkaXcxID0gKCRpdGVyYXRpb24gPiAzKSA/ICgkaXRlcmF0aW9uIC0gNCkgLyA4IDogMTsKKyAgICBsb2NhbCAkYnl0ZV9udW0gPSAoJGl0ZXJhdGlvbiAtIDMpICUgODsKKyAgICBsb2NhbCAkbGFiZWwgPSAkaXRlcmF0aW9uICsgMTsKKyAgICBsb2NhbCAkcEFueSA9ICgkcCAmIDB4ZikgPT0gMHhmOworICAgIGxvY2FsICRwQnlwID0gKCgkcCAmICRwQ29tSSkgJiYgKCRpdGVyYXRpb24gPiAwKSk7CisKKyAgICAkYy49PDxfX187CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworX19fCisKKyAgICBpZiAoKCRwICYgMHhmKSA9PSAwKSB7CisJJGMuPSIjaWZkZWYgSE9TVF9JU19CSUdfRU5ESUFOXG4iOworCSZJKFwkYywic2hyLnUJT3V0V29yZFsldV0gPSBPdXRXb3JkWyV1XSwgMzI7OyIsCisJCQkJJGl3MSAlICROT3V0V29yZCwgJGl3MSAlICROT3V0V29yZCk7CisJJGMuPSIjZW5kaWZcbiI7CisJJkkoXCRjLCAic3Q0IFtPdXRQdHJdID0gT3V0V29yZFsldV0sIDQiLCAkaXcxICUgJE5PdXRXb3JkKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgIyBDeWNsZSAwCisgICAgJkkoXCRjLCAieyAubW1pIikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAibGQxICAgIERhdGFbJXVdID0gW0luUHRyXSwgMSIsICRpMCAlICRORGF0YSkgICAgIGlmICgkcCAmICRwQ29tSSk7CisgICAgJkkoXCRjLCAicGFkZDEgIElbJXVdID0gT25lLCBJWyV1XSIsICRpMCAlICROSSwgJGkxICUgJE5JKWlmICgkcCAmICRwQ29tSSk7CisgICAgJkkoXCRjLCAienh0MSAgIEogPSBKIikJCQkJICAgICAgaWYgKCRwICYgJHBDb21KKTsKKyAgICAmSShcJGMsICJ9IikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAieyAubW1pIikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAiTEtFWSAgIFRbJXVdID0gW1RbJXVdXSIsICRpMSAlICROVCwgJGkxICUgJE5UKSAgIGlmICgkcCAmICRwT3V0KTsKKyAgICAmSShcJGMsICJhZGQgICAgVFsldV0gPSBTSVsldV0sIFNKWyV1XSIsCisgICAgICAgJGkwICUgJE5ULCAkaTIgJSAkTlNJLCAkaTEgJSAkTlNKKQkJICAgICAgaWYgKCRwICYgJHBDb21UKTsKKyAgICAmSShcJGMsICJLRVlBRERSKElQclsldV0sIElbJXVdKSIsICRpMCAlICROSVAsICRpMSAlICROSSkgaWYgKCRwICYgJHBDb21JKTsKKyAgICAmSShcJGMsICJ9IikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJlNUT1AoXCRjKTsKKworICAgICMgQ3ljbGUgMQorICAgICZJKFwkYywgInsgLm1taSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZJKFwkYywgIlNLRVkgICBbSVByWyV1XV0gPSBTSlsldV0iLCAkaTIgJSAkTklQLCAkaTElJE5TSilpZiAoJHAgJiAkcENvbVQpOworICAgICZJKFwkYywgIlNLRVkgICBbSlBbJXVdXSA9IFNJWyV1XSIsICRpMSAlICROSlAsICRpMiUkTlNJKSBpZiAoJHAgJiAkcENvbVQpOworICAgICZJKFwkYywgInp4dDEgICBUWyV1XSA9IFRbJXVdIiwgJGkwICUgJE5ULCAkaTAgJSAkTlQpICAgICBpZiAoJHAgJiAkcENvbVQpOworICAgICZJKFwkYywgIn0iKQkJCQkJICAgICAgaWYgKCRwQW55KTsKKyAgICAmSShcJGMsICJ7IC5tbWkiKQkJCQkJICAgICAgaWYgKCRwQW55KTsKKyAgICAmSShcJGMsICJMS0VZICAgU0lbJXVdID0gW0lQclsldV1dIiwgJGkwICUgJE5TSSwgJGkwJSROSVApaWYgKCRwICYgJHBDb21JKTsKKyAgICAmSShcJGMsICJLRVlBRERSKEpQWyV1XSwgSikiLCAkaTAgJSAkTkpQKQkJICAgICAgaWYgKCRwICYgJHBDb21KKTsKKyAgICAmSShcJGMsICJ4b3IgICAgRGF0YVsldV0gPSBEYXRhWyV1XSwgVFsldV0iLAorICAgICAgICRpMyAlICRORGF0YSwgJGkzICUgJE5EYXRhLCAkaTEgJSAkTlQpCQkgICAgICBpZiAoJHAgJiAkcE91dCk7CisgICAgJkkoXCRjLCAifSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZTVE9QKFwkYyk7CisKKyAgICAjIEN5Y2xlIDIKKyAgICAmSShcJGMsICJ7IC5tbWkiKQkJCQkJICAgICAgaWYgKCRwQW55KTsKKyAgICAmSShcJGMsICJMS0VZICAgU0pbJXVdID0gW0pQWyV1XV0iLCAkaTAgJSAkTlNKLCAkaTAlJE5KUCkgaWYgKCRwICYgJHBDb21KKTsKKyAgICAmSShcJGMsICJjbXAuZXEgcEJ5cGFzcywgcDAgPSBJWyV1XSwgSiIsICRpMSAlICROSSkJICAgICAgaWYgKCRwQnlwKTsKKyAgICAmSShcJGMsICJkZXAgT3V0V29yZFsldV0gPSBEYXRhWyV1XSwgT3V0V29yZFsldV0sIEJZVEVfUE9TKCV1KSwgOCIsCisgICAgICAgJGl3MCUkTk91dFdvcmQsICRpMyUkTkRhdGEsICRpdzElJE5PdXRXb3JkLCAkYnl0ZV9udW0pIGlmICgkcCAmICRwT3V0KTsKKyAgICAmSShcJGMsICJ9IikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAieyAubW1iIikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAiYWRkICAgIEogPSBKLCBTSVsldV0iLCAkaTAgJSAkTlNJKQkJICAgICAgaWYgKCRwICYgJHBDb21JKTsKKyAgICAmSShcJGMsICJLRVlBRERSKFRbJXVdLCBUWyV1XSkiLCAkaTAgJSAkTlQsICRpMCAlICROVCkgICAgaWYgKCRwICYgJHBDb21UKTsKKyAgICAmUChcJGMsICIocEJ5cGFzcylcdGJyLmNvbmQuc3BudC5tYW55IC5yYzRCeXBhc3MldSIsJGxhYmVsKWlmICgkcEJ5cCk7CisgICAgJkkoXCRjLCAifSIpIGlmICgkcEFueSk7CisgICAgJlNUT1AoXCRjKTsKKworICAgICZQKFwkYywgIi5yYzRSZXN1bWUldToiLCAkbGFiZWwpCQkJICAgICAgaWYgKCRwQnlwKTsKKyAgICBpZiAoJGJ5dGVfbnVtID09IDAgJiYgJGl0ZXJhdGlvbiA+PSAkcGhhc2VzKSB7CisJJkkoXCRjLCAic3Q4IFtPdXRQdHJdID0gT3V0V29yZFsldV0sIDgiLAorCSAgICRpdzEgJSAkTk91dFdvcmQpCQkJCSAgICAgIGlmICgkcCAmICRwT3V0KTsKKwlpZiAoJGl0ZXJhdGlvbiA9PSAoMSArICR1bnJvbGxfY291bnQpICogJHBoYXNlcyAtIDEpIHsKKwkgICAgaWYgKCR1bnJvbGxfY291bnQgPT0gNikgeworCQkmSShcJGMsICJtb3YgT3V0V29yZFsldV0gPSBPdXRXb3JkWyV1XSIsCisJCSAgICRpdzEgJSAkTk91dFdvcmQsICRpdzAgJSAkTk91dFdvcmQpOworCSAgICB9CisJICAgICZJKFwkYywgImxmZXRjaC5udDEgW0luUHJlZmV0Y2hdLCAldSIsCisJICAgICAgICR1bnJvbGxfY291bnQgKiAkcGhhc2VzKTsKKwkgICAgJkkoXCRjLCAibGZldGNoLmV4Y2wubnQxIFtPdXRQcmVmZXRjaF0sICV1IiwKKwkgICAgICAgJHVucm9sbF9jb3VudCAqICRwaGFzZXMpOworCSAgICAmSShcJGMsICJici5jbG9vcC5zcHRrLmZldyAucmM0TG9vcCIpOworCX0KKyAgICB9CisKKyAgICBpZiAoJHBCeXApIHsKKwkmUChcJGJ5cGFzcywgIi5yYzRCeXBhc3MldToiLCAkbGFiZWwpOworCSZJKFwkYnlwYXNzLCAic3ViIEogPSBKLCBTSVsldV0iLCAkaTAgJSAkTlNJKTsKKwkmSShcJGJ5cGFzcywgIm5vcCAwIik7CisJJkkoXCRieXBhc3MsICJub3AgMCIpOworCSZJKFwkYnlwYXNzLCAiOzsiKTsKKwkmSShcJGJ5cGFzcywgImFkZCBKID0gSiwgU0lbJXVdIiwgJGkxICUgJE5TSSk7CisJJkkoXCRieXBhc3MsICJtb3YgU0lbJXVdID0gU0lbJXVdIiwgJGkwICUgJE5TSSwgJGkxICUgJE5TSSk7CisJJkkoXCRieXBhc3MsICJici5zcHRrLm1hbnkgLnJjNFJlc3VtZSV1XG4iLCAkbGFiZWwpOworCSZJKFwkYnlwYXNzLCAiOzsiKTsKKyAgICB9Cit9CisKKyRjb2RlPTw8X19fOworLmlkZW50IFwicmM0LWlhNjQucywgdmVyc2lvbiAzLjBcIgorLmlkZW50IFwiQ29weXJpZ2h0IChjKSAyMDA1IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuXCIKKworI2RlZmluZSBMQ1NhdmUJCXI4CisjZGVmaW5lIFBSU2F2ZQkJcjkKKworLyogSW5wdXRzIGJlY29tZSBpbnZhbGlkIG9uY2Ugcm90YXRpb24gYmVnaW5zISAgKi8KKworI2RlZmluZSBTdGF0ZVRhYmxlCWluMAorI2RlZmluZSBEYXRhTGVuCQlpbjEKKyNkZWZpbmUgSW5wdXRCdWZmZXIJaW4yCisjZGVmaW5lIE91dHB1dEJ1ZmZlcglpbjMKKworI2RlZmluZSBLVGFibGUJCXIxNAorI2RlZmluZSBKCQlyMTUKKyNkZWZpbmUgSW5QdHIJCXIxNgorI2RlZmluZSBPdXRQdHIJCXIxNworI2RlZmluZSBJblByZWZldGNoCXIxOAorI2RlZmluZSBPdXRQcmVmZXRjaAlyMTkKKyNkZWZpbmUgT25lCQlyMjAKKyNkZWZpbmUgTG9vcENvdW50CXIyMQorI2RlZmluZSBSZW1haW5kZXIJcjIyCisjZGVmaW5lIElGaW5hbAkJcjIzCisjZGVmaW5lIEVuZFB0cgkJcjI0CisKKyNkZWZpbmUgdG1wMAkJcjI1CisjZGVmaW5lIHRtcDEJCXIyNgorCisjZGVmaW5lIHBCeXBhc3MJCXA2CisjZGVmaW5lIHBEb25lCQlwNworI2RlZmluZSBwU21hbGwJCXA4CisjZGVmaW5lIHBBbGlnbmVkCXA5CisjZGVmaW5lIHBVbmFsaWduZWQJcDEwCisKKyNkZWZpbmUgcENvbXB1dGVJCXBQaGFzZVswXQorI2RlZmluZSBwQ29tcHV0ZUoJcFBoYXNlWzFdCisjZGVmaW5lIHBDb21wdXRlVAlwUGhhc2VbMl0KKyNkZWZpbmUgcE91dHB1dAkJcFBoYXNlWzNdCisKKyNkZWZpbmUgUmV0VmFsCQlyOAorI2RlZmluZSBMX09LCQlwNworI2RlZmluZSBMX05PSwkJcDgKKworI2RlZmluZQlfTklOUFVUUwk0CisjZGVmaW5lCV9OT1VUUFVUCTAKKworI2RlZmluZQlfTlJPVEFURQkyNAorI2RlZmluZQlfTkxPQ0FMUwkoX05ST1RBVEUgLSBfTklOUFVUUyAtIF9OT1VUUFVUKQorCisjaWZuZGVmIFNaCisjIGRlZmluZSBTWgk0CS8vIHRoaXMgbXVzdCBiZSBzZXQgdG8gc2l6ZW9mKFJDNF9JTlQpCisjZW5kaWYKKworI2lmIFNaID09IDEKKyMgZGVmaW5lIExLRVkJCQlsZDEKKyMgZGVmaW5lIFNLRVkJCQlzdDEKKyMgZGVmaW5lIEtFWUFERFIoZHN0LCBpKQlhZGQgZHN0ID0gaSwgS1RhYmxlCisjZWxpZiBTWiA9PSAyCisjIGRlZmluZSBMS0VZCQkJbGQyCisjIGRlZmluZSBTS0VZCQkJc3QyCisjIGRlZmluZSBLRVlBRERSKGRzdCwgaSkJc2hsYWRkIGRzdCA9IGksIDEsIEtUYWJsZQorI2VsaWYgU1ogPT0gNAorIyBkZWZpbmUgTEtFWQkJCWxkNAorIyBkZWZpbmUgU0tFWQkJCXN0NAorIyBkZWZpbmUgS0VZQUREUihkc3QsIGkpCXNobGFkZCBkc3QgPSBpLCAyLCBLVGFibGUKKyNlbHNlCisjIGRlZmluZSBMS0VZCQkJbGQ4CisjIGRlZmluZSBTS0VZCQkJc3Q4CisjIGRlZmluZSBLRVlBRERSKGRzdCwgaSkJc2hsYWRkIGRzdCA9IGksIDMsIEtUYWJsZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9IUFVYX1NPVVJDRSkgJiYgIWRlZmluZWQoX0xQNjQpCisjIGRlZmluZSBBRERQCWFkZHA0CisjZWxzZQorIyBkZWZpbmUgQUREUAlhZGQKKyNlbmRpZgorCisvKiBEZWZpbmUgYSBtYWNybyBmb3IgdGhlIGJpdCBudW1iZXIgb2YgdGhlIG4tdGggYnl0ZTogKi8KKworI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKSB8fCBkZWZpbmVkKEJfRU5ESUFOKQorIyBkZWZpbmUgSE9TVF9JU19CSUdfRU5ESUFOCisjIGRlZmluZSBCWVRFX1BPUyhuKQkoNTYgLSAoOCAqIChuKSkpCisjZWxzZQorIyBkZWZpbmUgQllURV9QT1MobikJKDggKiAobikpCisjZW5kaWYKKworLyoKKyAgIFdlIG11c3QgcGVyZm9ybSB0aGUgZmlyc3QgcGhhc2Ugb2YgdGhlIHBpcGVsaW5lIGV4cGxpY2l0bHkgc2luY2UKKyAgIHdlIHdpbGwgYWx3YXlzIGxvYWQgZnJvbSB0aGUgc3RhYmxlIHRoZSBmaXJzdCB0aW1lLiBUaGUgYnIuY2V4aXQKKyAgIHdpbGwgbmV2ZXIgYmUgdGFrZW4gc2luY2UgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJlY2F1c2UKKyAgIHRoZSBlcGlsb2d1ZSBjb3VudCBpcyA0LgorKi8KKy8qIE1PRFNDSEVEX1JDNCBtYWNybyB3YXMgc3BsaXQgdG8gX1BST0xPR1VFIGFuZCBfTE9PUCwgYmVjYXVzZSBIUC1VWAorICAgYXNzZW1ibGVyIGZhaWxlZCBvbiBvcmlnaW5hbCBtYWNybyB3aXRoIHN5bnRheCBlcnJvci4gPGFwcHJvPiAqLworI2RlZmluZSBNT0RTQ0hFRF9SQzRfUFJPTE9HVUUJCQkJCQkgICBcXAorCXsJCQkJCQkJCSAgIFxcCisJCQkJbGQxCQlEYXRhWzBdID0gW0luUHRyXSwgMTsJICAgXFwKKwkJCQlhZGQJCUlGaW5hbCA9IDEsIElbMV07CSAgIFxcCisJCQkJS0VZQUREUihJUHJbMF0sIElbMV0pOwkJCSAgIFxcCisJfSA7OwkJCQkJCQkJICAgXFwKKwl7CQkJCQkJCQkgICBcXAorCQkJCUxLRVkJCVNJWzBdID0gW0lQclswXV07CSAgIFxcCisJCQkJbW92CQlwci5yb3QgPSAweDEwMDAwOwkgICBcXAorCQkJCW1vdgkJYXIuZWMgPSA0OwkJICAgXFwKKwl9IDs7CQkJCQkJCQkgICBcXAorCXsJCQkJCQkJCSAgIFxcCisJCQkJYWRkCQlKID0gSiwgU0lbMF07CQkgICBcXAorCQkJCXp4dDEJCUlbMF0gPSBJRmluYWw7CQkgICBcXAorCQkJCWJyLmNleGl0LnNwbnQuZmV3IC4rMTY7IC8qIG5ldmVyIHRha2VuICovICBcXAorCX0gOzsKKyNkZWZpbmUgTU9EU0NIRURfUkM0X0xPT1AobGFiZWwpCQkJCQkgICBcXAorbGFiZWw6CQkJCQkJCQkJICAgXFwKKwl7CS5tbWk7CQkJCQkJCSAgIFxcCisJCShwQ29tcHV0ZUkpCWxkMQkJRGF0YVswXSA9IFtJblB0cl0sIDE7CSAgIFxcCisJCShwQ29tcHV0ZUkpCWFkZAkJSUZpbmFsID0gMSwgSVsxXTsJICAgXFwKKwkJKHBDb21wdXRlSikJenh0MQkJSiA9IEo7CQkJICAgXFwKKwl9ewkubW1pOwkJCQkJCQkgICBcXAorCQkocE91dHB1dCkJTEtFWQkJVFsxXSA9IFtUWzFdXTsJCSAgIFxcCisJCShwQ29tcHV0ZVQpCWFkZAkJVFswXSA9IFNJWzJdLCBTSlsxXTsJICAgXFwKKwkJKHBDb21wdXRlSSkJS0VZQUREUihJUHJbMF0sIElbMV0pOwkJCSAgIFxcCisJfSA7OwkJCQkJCQkJICAgXFwKKwl7CS5tbWk7CQkJCQkJCSAgIFxcCisJCShwQ29tcHV0ZVQpCVNLRVkJCVtJUHJbMl1dID0gU0pbMV07CSAgIFxcCisJCShwQ29tcHV0ZVQpCVNLRVkJCVtKUFsxXV0gPSBTSVsyXTsJICAgXFwKKwkJKHBDb21wdXRlVCkJenh0MQkJVFswXSA9IFRbMF07CQkgICBcXAorCX17CS5tbWk7CQkJCQkJCSAgIFxcCisJCShwQ29tcHV0ZUkpCUxLRVkJCVNJWzBdID0gW0lQclswXV07CSAgIFxcCisJCShwQ29tcHV0ZUopCUtFWUFERFIoSlBbMF0sIEopOwkJCSAgIFxcCisJCShwQ29tcHV0ZUkpCWNtcC5lcS51bmMJcEJ5cGFzcywgcDAgPSBJWzFdLCBKOwkgICBcXAorCX0gOzsJCQkJCQkJCSAgIFxcCisJewkubW1pOwkJCQkJCQkgICBcXAorCQkocENvbXB1dGVKKQlMS0VZCQlTSlswXSA9IFtKUFswXV07CSAgIFxcCisJCShwT3V0cHV0KQl4b3IJCURhdGFbM10gPSBEYXRhWzNdLCBUWzFdOyAgIFxcCisJCQkJbm9wCQkweDA7CQkJICAgXFwKKwl9ewkubW1pOwkJCQkJCQkgICBcXAorCQkocENvbXB1dGVUKQlLRVlBRERSKFRbMF0sIFRbMF0pOwkJCSAgIFxcCisJCShwQnlwYXNzKQltb3YJCVNJWzBdID0gU0lbMV07CQkgICBcXAorCQkocENvbXB1dGVJKQl6eHQxCQlJWzBdID0gSUZpbmFsOwkJICAgXFwKKwl9IDs7CQkJCQkJCQkgICBcXAorCXsJLm1tYjsJCQkJCQkJICAgXFwKKwkJKHBPdXRwdXQpCXN0MQkJW091dFB0cl0gPSBEYXRhWzNdLCAxOwkgICBcXAorCQkocENvbXB1dGVJKQlhZGQJCUogPSBKLCBTSVswXTsJCSAgIFxcCisJCQkJYnIuY3RvcC5zcHRrLmZldyBsYWJlbDsJCQkgICBcXAorCX0gOzsKKworCS50ZXh0CisKKwkuYWxpZ24JMzIKKworCS50eXBlCVJDNCwgXEBmdW5jdGlvbgorCS5nbG9iYWwJUkM0CisKKwkucHJvYwlSQzQKKwkucHJvbG9ndWUKKworUkM0OgorCXsKKwkgIAkubW1pCisJCWFsbG9jCXIyID0gYXIucGZzLCBfTklOUFVUUywgX05MT0NBTFMsIF9OT1VUUFVULCBfTlJPVEFURQorCisJCS5yb3RyIERhdGFbNF0sIElbMl0sIElQclszXSwgU0lbM10sIEpQWzJdLCBTSlsyXSwgVFsyXSwgXFwKKwkJICAgICAgT3V0V29yZFsyXQorCQkucm90cCBwUGhhc2VbNF0KKworCQlBRERQCQlJblByZWZldGNoID0gMCwgSW5wdXRCdWZmZXIKKwkJQUREUAkJS1RhYmxlID0gMCwgU3RhdGVUYWJsZQorCX0KKwl7CisJCS5tbWkKKwkJQUREUAkJSW5QdHIgPSAwLCBJbnB1dEJ1ZmZlcgorCQlBRERQCQlPdXRQdHIgPSAwLCBPdXRwdXRCdWZmZXIKKwkJbW92CQlSZXRWYWwgPSByMAorCX0KKwk7OworCXsKKwkJLm1taQorCQlsZmV0Y2gubnQxCVtJblByZWZldGNoXSwgMHg4MAorCQlBRERQCQlPdXRQcmVmZXRjaCA9IDAsIE91dHB1dEJ1ZmZlcgorCX0KKwl7ICAgICAgICAgICAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIGlucHV0IGxlbmd0aCBpcyBub25zZW5zaWNhbAorICAgICAgICAJLm1pYgorCQlBRERQCQlTdGF0ZVRhYmxlID0gMCwgU3RhdGVUYWJsZQorICAgICAgICAJY21wLmdlLnVuYyAgCUxfTk9LLCBMX09LID0gcjAsIERhdGFMZW4KKwkoTF9OT0spIGJyLnJldC5zcHRrLmZldyBycAorCX0KKwk7OworCXsKKyAgICAgICAgCS5taWIKKyAgICAgICAgCWNtcC5lcS5vciAgCUxfTk9LLCBMX09LID0gcjAsIEluUHRyCisgICAgICAgIAljbXAuZXEub3IgIAlMX05PSywgTF9PSyA9IHIwLCBPdXRQdHIKKwkJbm9wCQkweDAKKwl9CisJeworCQkubWliCisgICAgICAgIAljbXAuZXEub3IgIAlMX05PSywgTF9PSyA9IHIwLCBTdGF0ZVRhYmxlCisJCW5vcAkJMHgwCisJKExfTk9LKSBici5yZXQuc3B0ay5mZXcgcnAKKwl9CisJOzsKKwkJTEtFWQkJSVsxXSA9IFtLVGFibGVdLCBTWgorLyogUHJlZmV0Y2ggdGhlIHN0YXRlLXRhYmxlLiBJdCBjb250YWlucyAyNTYgZWxlbWVudHMgb2Ygc2l6ZSBTWiAqLworCisjaWYgU1ogPT0gMQorCQlBRERQCQl0bXAwID0gMSoxMjgsIFN0YXRlVGFibGUKKyNlbGlmIFNaID09IDIKKwkJQUREUAkJdG1wMCA9IDMqMTI4LCBTdGF0ZVRhYmxlCisJCUFERFAJCXRtcDEgPSAyKjEyOCwgU3RhdGVUYWJsZQorI2VsaWYgU1ogPT0gNAorCQlBRERQCQl0bXAwID0gNyoxMjgsIFN0YXRlVGFibGUKKwkJQUREUAkJdG1wMSA9IDYqMTI4LCBTdGF0ZVRhYmxlCisjZWxpZiBTWiA9PSA4CisJCUFERFAJCXRtcDAgPSAxNSoxMjgsIFN0YXRlVGFibGUKKwkJQUREUAkJdG1wMSA9IDE0KjEyOCwgU3RhdGVUYWJsZQorI2VuZGlmCisJCTs7CisjaWYgU1ogPj0gOAorCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMF0sIC0yNTYJLy8gMTUKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDFdLCAtMjU2OzsKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDBdLCAtMjU2CS8vIDEzCisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAxXSwgLTI1Njs7CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAwXSwgLTI1NgkvLyAxMQorCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMV0sIC0yNTY7OworCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMF0sIC0yNTYJLy8gIDkKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDFdLCAtMjU2OzsKKyNlbmRpZgorI2lmIFNaID49IDQKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDBdLCAtMjU2CS8vICA3CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAxXSwgLTI1Njs7CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAwXSwgLTI1NgkvLyAgNQorCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMV0sIC0yNTY7OworI2VuZGlmCisjaWYgU1ogPj0gMgorCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMF0sIC0yNTYJLy8gIDMKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDFdLCAtMjU2OzsKKyNlbmRpZgorCXsKKwkJLm1paQorCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMF0JCS8vICAxCisJCWFkZAkJSVsxXT0xLElbMV07OworCQl6eHQxCQlJWzFdPUlbMV0KKwl9CisJeworCQkubW1pCisJCWxmZXRjaC5udDEJW0luUHJlZmV0Y2hdLCAweDgwCisJCWxmZXRjaC5leGNsLm50MQlbT3V0UHJlZmV0Y2hdLCAweDgwCisJCS5zYXZlCQlwciwgUFJTYXZlCisJCW1vdgkJUFJTYXZlID0gcHIKKwl9IDs7CisJeworCQkubW1pCisJCWxmZXRjaC5leGNsLm50MQlbT3V0UHJlZmV0Y2hdLCAweDgwCisJCUxLRVkJCUogPSBbS1RhYmxlXSwgU1oKKwkJQUREUAkJRW5kUHRyID0gRGF0YUxlbiwgSW5QdHIKKwl9ICA7OworCXsKKwkJLm1taQorCQlBRERQCQlFbmRQdHIgPSAtMSwgRW5kUHRyCS8vIE1ha2UgaXQgcG9pbnQgdG8KKwkJCQkJCQkvLyBsYXN0IGRhdGEgYnl0ZS4KKwkJbW92CQlPbmUgPSAxCisJCS5zYXZlCQlhci5sYywgTENTYXZlCisJCW1vdgkJTENTYXZlID0gYXIubGMKKwkJLmJvZHkKKwl9IDs7CisJeworCQkubW1iCisJCXN1YgkJUmVtYWluZGVyID0gMCwgT3V0UHRyCisJCWNtcC5ndHUJCXBTbWFsbCwgcDAgPSAkdGhyZXNob2xkLCBEYXRhTGVuCisocFNtYWxsKQlici5jb25kLmRwbnQJLnJjNFJlbWFpbmRlcgkJLy8gRGF0YSB0b28gc21hbGwgZm9yCisJCQkJCQkJLy8gYmlnIGxvb3AuCisJfSA7OworCXsKKwkJLm1taQorCQlhbmQJCVJlbWFpbmRlciA9IDB4NywgUmVtYWluZGVyCisJCTs7CisJCWNtcC5lcQkJcEFsaWduZWQsIHBVbmFsaWduZWQgPSBSZW1haW5kZXIsIHIwCisJCW5vcAkJMHgwCisJfSA7OworCXsKKwkJLm1tYgorLnByZWQucmVsCSJtdXRleCIscFVuYWxpZ25lZCxwQWxpZ25lZAorKHBVbmFsaWduZWQpCWFkZAkJUmVtYWluZGVyID0gLTEsIFJlbWFpbmRlcgorKHBBbGlnbmVkKQlzdWIJCVJlbWFpbmRlciA9IEVuZFB0ciwgSW5QdHIKKyhwQWxpZ25lZCkJYnIuY29uZC5kcHRrLm1hbnkgLnJjNEFsaWduZWQKKwl9IDs7CisJeworCQkubW1pCisJCW5vcAkJMHgwCisJCW5vcAkJMHgwCisJCW1vdi5pCQlhci5sYyA9IFJlbWFpbmRlcgorCX0KKworLyogRG8gdGhlIGluaXRpYWwgZmV3IGJ5dGVzIHZpYSB0aGUgY29tcGFjdCwgbW9kdWxvLXNjaGVkdWxlZCBsb29wCisgICB1bnRpbCB0aGUgb3V0cHV0IHBvaW50ZXIgaXMgOC1ieXRlLWFsaWduZWQuICAqLworCisJCU1PRFNDSEVEX1JDNF9QUk9MT0dVRQorCQlNT0RTQ0hFRF9SQzRfTE9PUCguUkM0QWxpZ25Mb29wKQorCisJeworCQkubWliCisJCXN1YgkJUmVtYWluZGVyID0gRW5kUHRyLCBJblB0cgorCQl6eHQxCQlJRmluYWwgPSBJRmluYWwKKwkJY2xycnJiCQkJCS8vIENsZWFyIENGTS5ycmIucHIgc28KKwkJOzsJCQkJLy8gbmV4dCAibW92IHByLnJvdCA9IE4iCisJCQkJCQkvLyBkb2VzIHRoZSByaWdodCB0aGluZy4KKwl9CisJeworCQkubW1pCisJCW1vdgkJSVsxXSA9IElGaW5hbAorCQlub3AJCTB4MAorCQlub3AJCTB4MAorCX0gOzsKKworCisucmM0QWxpZ25lZDoKKworLyoKKyAgIFVucm9sbGVkIGxvb3AgY291bnQgPSAoUmVtYWluZGVyIC0gKCR1bnJvbGxfY291bnQrMSkqJHBoYXNlcykvKCR1bnJvbGxfY291bnQqJHBoYXNlcykKKyAqLworCisJeworCQkubWx4CisJCWFkZAlMb29wQ291bnQgPSAxIC0gKCR1bnJvbGxfY291bnQgKyAxKSokcGhhc2VzLCBSZW1haW5kZXIKKwkJbW92bAkJUmVtYWluZGVyID0gMHhhYWFhYWFhYWFhYWFhYWFiCisJfSA7OworCXsKKwkJLm1taQorCQlzZXRmLnNpZwlmNiA9IExvb3BDb3VudAkJLy8gTTIsIE0zCTYgY3ljCisJCXNldGYuc2lnCWY3ID0gUmVtYWluZGVyCQkvLyBNMiwgTTMJNiBjeWMKKwkJbm9wCQkweDAKKwl9IDs7CisJeworCQkubWZiCisJCW5vcAkJMHgwCisJCXhtcHkuaHUJCWY2ID0gZjYsIGY3CisJCW5vcAkJMHgwCisJfSA7OworCXsKKwkJLm1taQorCQlnZXRmLnNpZwlMb29wQ291bnQgPSBmNjs7CS8vIE0yCQk1IGN5YworCQlub3AJCTB4MAorCQlzaHIudQkJTG9vcENvdW50ID0gTG9vcENvdW50LCA0CisJfSA7OworCXsKKwkJLm1taQorCQlub3AJCTB4MAorCQlub3AJCTB4MAorCQltb3YuaQkJYXIubGMgPSBMb29wQ291bnQKKwl9IDs7CisKKy8qIE5vdyBjb21lcyB0aGUgdW5yb2xsZWQgbG9vcDogKi8KKworLnJjNFByb2xvZ3VlOgorX19fCisKKyRpdGVyYXRpb24gPSAwOworCisjIEdlbmVyYXRlIHRoZSBwcm9sb2d1ZToKKyRwcmVkaWNhdGVzID0gMTsKK2ZvciAoJGkgPSAwOyAkaSA8ICRwaGFzZXM7ICsrJGkpIHsKKyAgICAmZW1pdF9ib2R5IChcJGNvZGUsIFwkYnlwYXNzLCAkaXRlcmF0aW9uKyssICRwcmVkaWNhdGVzKTsKKyAgICAkcHJlZGljYXRlcyA9ICgkcHJlZGljYXRlcyA8PCAxKSB8IDE7Cit9CisKKyRjb2RlLj08PF9fXzsKKy5yYzRMb29wOgorX19fCisKKyMgR2VuZXJhdGUgdGhlIGJvZHk6Citmb3IgKCRpID0gMDsgJGkgPCAkdW5yb2xsX2NvdW50KiRwaGFzZXM7ICsrJGkpIHsKKyAgICAmZW1pdF9ib2R5IChcJGNvZGUsIFwkYnlwYXNzLCAkaXRlcmF0aW9uKyssICRwcmVkaWNhdGVzKTsKK30KKworJGNvZGUuPTw8X19fOworLnJjNEVwaWxvZ3VlOgorX19fCisKKyMgR2VuZXJhdGUgdGhlIGVwaWxvZ3VlOgorZm9yICgkaSA9IDA7ICRpIDwgJHBoYXNlczsgKyskaSkgeworICAgICRwcmVkaWNhdGVzIDw8PSAxOworICAgICZlbWl0X2JvZHkgKFwkY29kZSwgXCRieXBhc3MsICRpdGVyYXRpb24rKywgJHByZWRpY2F0ZXMpOworfQorCiskY29kZS49PDxfX187CisJeworCQkubW1pCisJCWxmZXRjaC5udDEJW0VuZFB0cl0JLy8gZmV0Y2ggbGluZSB3aXRoIGxhc3QgYnl0ZQorCQltb3YJCUlGaW5hbCA9IElbMV0KKwkJbm9wCQkweDAKKwl9CisKKy5yYzRSZW1haW5kZXI6CisJeworCQkubW1pCisJCXN1YgkJUmVtYWluZGVyID0gRW5kUHRyLCBJblB0cgkvLyBDYWxjdWxhdGUKKwkJCQkJCQkJLy8gIyBvZiBieXRlcworCQkJCQkJCQkvLyBsZWZ0IC0gMQorCQlub3AJCTB4MAorCQlub3AJCTB4MAorCX0gOzsKKwl7CisJCS5taWIKKwkJY21wLmVxCQlwRG9uZSwgcDAgPSAtMSwgUmVtYWluZGVyIC8vIGRvbmUgYWxyZWFkeT8KKwkJbW92LmkJCWFyLmxjID0gUmVtYWluZGVyCisocERvbmUpCQlici5jb25kLmRwdGsuZmV3IC5yYzRDb21wbGV0ZQorCX0KKworLyogRG8gdGhlIHJlbWFpbmluZyBieXRlcyB2aWEgdGhlIGNvbXBhY3QsIG1vZHVsby1zY2hlZHVsZWQgbG9vcCAqLworCisJCU1PRFNDSEVEX1JDNF9QUk9MT0dVRQorCQlNT0RTQ0hFRF9SQzRfTE9PUCguUkM0UmVzdExvb3ApCisKKy5yYzRDb21wbGV0ZToKKwl7CisJCS5tbWkKKwkJYWRkCQlLVGFibGUgPSAtU1osIEtUYWJsZQorCQlhZGQJCUlGaW5hbCA9IC0xLCBJRmluYWwKKwkJbW92CQlhci5sYyA9IExDU2F2ZQorCX0gOzsKKwl7CisJCS5taWkKKwkJU0tFWQkJW0tUYWJsZV0gPSBKLC1TWgorCQl6eHQxCQlJRmluYWwgPSBJRmluYWwKKwkJbW92CQlwciA9IFBSU2F2ZSwgMHgxRkZGRgorCX0gOzsKKwl7CisJCS5taWIKKwkJU0tFWQkJW0tUYWJsZV0gPSBJRmluYWwKKwkJYWRkCQlSZXRWYWwgPSAxLCByMAorCQlici5yZXQuc3B0ay5mZXcJcnAKKwl9IDs7CitfX18KKworIyBMYXN0IGJ1dCBub3QgbGVhc3QsIGVtaXQgdGhlIGNvZGUgZm9yIHRoZSBieXBhc3MtY29kZSBvZiB0aGUgdW5yb2xsZWQgbG9vcDoKKworJGNvZGUuPSRieXBhc3M7CisKKyRjb2RlLj08PF9fXzsKKwkuZW5kcCBSQzQKK19fXworCitwcmludCAkY29kZTsKZGlmZiAtLWdpdCBhL2puaS9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC1tZDUteDg2XzY0LnBsIGIvam5pL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LW1kNS14ODZfNjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ODQwOQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC1tZDUteDg2XzY0LnBsCkBAIC0wLDAgKzEsNjMxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEp1bmUgMjAxMQorIworIyBUaGlzIGlzIFJDNCtNRDUgInN0aXRjaCIgaW1wbGVtZW50YXRpb24uIFRoZSBpZGVhLCBhcyBzcGVsbGVkIGluCisjIGh0dHA6Ly9kb3dubG9hZC5pbnRlbC5jb20vZGVzaWduL2ludGFyY2gvcGFwZXJzLzMyMzY4Ni5wZGYsIGlzIHRoYXQKKyMgc2luY2UgYm90aCBhbGdvcml0aG1zIGV4aGliaXQgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20sIElMUCwKKyMgYmVsb3cgdGhlb3JldGljYWwgbWF4aW11bSwgaW50ZXJsZWF2aW5nIHRoZW0gd291bGQgYWxsb3cgdG8gdXRpbGl6ZQorIyBwcm9jZXNzb3IgcmVzb3VyY2VzIGJldHRlciBhbmQgYWNoaWV2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UuIFJDNAorIyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBpcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIHRvIHJjNC14ODZfNjQucGwsIHdoaWNoCisjIGlzIGhlYXZpbHkgYmFzZWQgb24gc3VibWlzc2lvbiBieSBNYXhpbSBQZXJtaW5vdiwgTWF4aW0gTG9ja3R5dWtoaW4KKyMgYW5kIEppbSBHdWlsZm9yZCBvZiBJbnRlbC4gTUQ1IGlzIGZyZXNoIGltcGxlbWVudGF0aW9uIGFpbWluZyB0bworIyBtaW5pbWl6ZSByZWdpc3RlciB1c2FnZSwgd2hpY2ggd2FzIHVzZWQgYXMgIm1haW4gdGhyZWFkIiB3aXRoIFJDNAorIyB3ZWF2ZWQgaW50byBpdCwgb25lIFJDNCByb3VuZCBwZXIgb25lIE1ENSByb3VuZC4gSW4gYWRkaXRpb24gdG8gdGhlCisjIHN0aWNoZWQgc3Vicm91dGluZSB0aGUgc2NyaXB0IGNhbiBnZW5lcmF0ZSBzdGFuZGFsb25lIHJlcGxhY2VtZW50CisjIG1kNV9ibG9ja19hc21fZGF0YV9vcmRlciBhbmQgUkM0LiBCZWxvdyBhcmUgcGVyZm9ybWFuY2UgbnVtYmVycyBpbgorIyBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLCBsZXNzIGlzIGJldHRlciwgZm9yIHRoZXNlIHRoZSBzdGFuZGFsb25lCisjIHN1YnJvdXRpbmVzLCBzdW0gb2YgdGhlbSwgYW5kIHN0aXRjaGVkIG9uZToKKyMKKyMJCVJDNAlNRDUJUkM0K01ENQlzdGl0Y2gJZ2FpbgorIyBPcHRlcm9uCTYuNSgqKQk1LjQJMTEuOQk3LjAJKzcwJSgqKQorIyBDb3JlMgkJNi41CTUuOAkxMi4zCTcuNwkrNjAlCisjIFdlc3RtZXJlCTQuMwk1LjIJOS41CTcuMAkrMzYlCisjIFNhbmR5IEJyaWRnZQk0LjIJNS41CTkuNwk2LjgJKzQzJQorIyBBdG9tCQk5LjMJNi41CTE1LjgJMTEuMQkrNDIlCisjCisjICgqKQlyYzQteDg2XzY0LnBsIGRlbGl2ZXJzIDUuMyBvbiBPcHRlcm9uLCBzbyByZWFsIGltcHJvdmVtZW50CisjCWlzICs1MyUuLi4KKworbXkgKCRyYzQsJG1kNSk9KDEsMSk7CSMgd2hhdCB0byBnZW5lcmF0ZT8KK215ICREPSIjIiBpZiAoISRtZDUpOwkjIGlmIHNldCB0byAiIyIsIE1ENSBpcyBzdGl0Y2hlZCBpbnRvIFJDNCgpLAorCQkJIyBidXQgaXRzIHJlc3VsdCBpcyBkaXNjYXJkZWQuIElkZWEgaGVyZSBpcworCQkJIyB0byBiZSBhYmxlIHRvIHVzZSAnb3BlbnNzbCBzcGVlZCByYzQnIGZvcgorCQkJIyBiZW5jaG1hcmtpbmcgdGhlIHN0aXRjaGVkIHN1YnJvdXRpbmUuLi4gCisKK215ICRmbGF2b3VyID0gc2hpZnQ7CitteSAkb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCitteSAkd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyBteSAkZGlyPSQxOyBteSAkeGxhdGU7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisKK215ICgkZGF0LCRpbjAsJG91dCwkY3R4LCRpbnAsJGxlbiwgJGZ1bmMsJG5hcmdzKTsKKworaWYgKCRyYzQgJiYgISRtZDUpIHsKKyAgKCRkYXQsJGxlbiwkaW4wLCRvdXQpID0gKCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4Iik7CisgICRmdW5jPSJSQzQiOwkJCQkkbmFyZ3M9NDsKK30gZWxzaWYgKCRtZDUgJiYgISRyYzQpIHsKKyAgKCRjdHgsJGlucCwkbGVuKSA9ICgiJXJkaSIsIiVyc2kiLCIlcmR4Iik7CisgICRmdW5jPSJtZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIiOwkkbmFyZ3M9MzsKK30gZWxzZSB7CisgICgkZGF0LCRpbjAsJG91dCwkY3R4LCRpbnAsJGxlbikgPSAoIiVyZGkiLCIlcnNpIiwiJXJkeCIsIiVyY3giLCIlcjgiLCIlcjkiKTsKKyAgJGZ1bmM9InJjNF9tZDVfZW5jIjsJCQkkbmFyZ3M9NjsKKyAgIyB2b2lkIHJjNF9tZDVfZW5jKAorICAjCQlSQzRfS0VZICprZXksCQkjCisgICMJCWNvbnN0IHZvaWQgKmluMCwJIyBSQzQgaW5wdXQKKyAgIwkJdm9pZCAqb3V0LAkJIyBSQzQgb3V0cHV0CisgICMJCU1ENV9DVFggKmN0eCwJCSMKKyAgIwkJY29uc3Qgdm9pZCAqaW5wLAkjIE1ENSBpbnB1dAorICAjCQlzaXplX3QgbGVuKTsJCSMgbnVtYmVyIG9mIDY0LWJ5dGUgYmxvY2tzCit9CisKK215IEBLPSgJMHhkNzZhYTQ3OCwweGU4YzdiNzU2LDB4MjQyMDcwZGIsMHhjMWJkY2VlZSwKKwkweGY1N2MwZmFmLDB4NDc4N2M2MmEsMHhhODMwNDYxMywweGZkNDY5NTAxLAorCTB4Njk4MDk4ZDgsMHg4YjQ0ZjdhZiwweGZmZmY1YmIxLDB4ODk1Y2Q3YmUsCisJMHg2YjkwMTEyMiwweGZkOTg3MTkzLDB4YTY3OTQzOGUsMHg0OWI0MDgyMSwKKworCTB4ZjYxZTI1NjIsMHhjMDQwYjM0MCwweDI2NWU1YTUxLDB4ZTliNmM3YWEsCisJMHhkNjJmMTA1ZCwweDAyNDQxNDUzLDB4ZDhhMWU2ODEsMHhlN2QzZmJjOCwKKwkweDIxZTFjZGU2LDB4YzMzNzA3ZDYsMHhmNGQ1MGQ4NywweDQ1NWExNGVkLAorCTB4YTllM2U5MDUsMHhmY2VmYTNmOCwweDY3NmYwMmQ5LDB4OGQyYTRjOGEsCisKKwkweGZmZmEzOTQyLDB4ODc3MWY2ODEsMHg2ZDlkNjEyMiwweGZkZTUzODBjLAorCTB4YTRiZWVhNDQsMHg0YmRlY2ZhOSwweGY2YmI0YjYwLDB4YmViZmJjNzAsCisJMHgyODliN2VjNiwweGVhYTEyN2ZhLDB4ZDRlZjMwODUsMHgwNDg4MWQwNSwKKwkweGQ5ZDRkMDM5LDB4ZTZkYjk5ZTUsMHgxZmEyN2NmOCwweGM0YWM1NjY1LAorCisJMHhmNDI5MjI0NCwweDQzMmFmZjk3LDB4YWI5NDIzYTcsMHhmYzkzYTAzOSwKKwkweDY1NWI1OWMzLDB4OGYwY2NjOTIsMHhmZmVmZjQ3ZCwweDg1ODQ1ZGQxLAorCTB4NmZhODdlNGYsMHhmZTJjZTZlMCwweGEzMDE0MzE0LDB4NGUwODExYTEsCisJMHhmNzUzN2U4MiwweGJkM2FmMjM1LDB4MmFkN2QyYmIsMHhlYjg2ZDM5MQkpOworCitteSBAVj0oIiVyOGQiLCIlcjlkIiwiJXIxMGQiLCIlcjExZCIpOwkjIE1ENSByZWdpc3RlcnMKK215ICR0bXA9IiVyMTJkIjsKKworbXkgQFhYPSgiJXJicCIsIiVyc2kiKTsJCQkjIFJDNCByZWdpc3RlcnMKK215IEBUWD0oIiVyYXgiLCIlcmJ4Iik7CitteSAkWVk9IiVyY3giOworbXkgJFRZPSIlcmR4IjsKKworbXkgJE1PRD0zMjsJCQkJIyAxNiwgMzIgb3IgNjQKKworJGNvZGUuPTw8X19fOworLnRleHQKKy5hbGlnbiAxNgorCisuZ2xvYmwJJGZ1bmMKKy50eXBlCSRmdW5jLFxAZnVuY3Rpb24sJG5hcmdzCiskZnVuYzoKKwljbXAJXCQwLCRsZW4KKwlqZQkuTGFib3J0CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJc3ViCVwkNDAsJXJzcAorLkxib2R5OgorX19fCitpZiAoJHJjNCkgeworJGNvZGUuPTw8X19fOworJEQjbWQ1Iwltb3YJJGN0eCwlcjExCQkjIHJlYXNzaWduIGFyZ3VtZW50cworCW1vdgkkbGVuLCVyMTIKKwltb3YJJGluMCwlcjEzCisJbW92CSRvdXQsJXIxNAorJEQjbWQ1Iwltb3YJJGlucCwlcjE1CitfX18KKyAgICAkY3R4PSIlcjExIglpZiAoJG1kNSk7CQkjIHJlYXNzaWduIGFyZ3VtZW50cworICAgICRsZW49IiVyMTIiOworICAgICRpbjA9IiVyMTMiOworICAgICRvdXQ9IiVyMTQiOworICAgICRpbnA9IiVyMTUiCWlmICgkbWQ1KTsKKyAgICAkaW5wPSRpbjAJaWYgKCEkbWQ1KTsKKyRjb2RlLj08PF9fXzsKKwl4b3IJJFhYWzBdLCRYWFswXQorCXhvcgkkWVksJFlZCisKKwlsZWEJOCgkZGF0KSwkZGF0CisJbW92CS04KCRkYXQpLCRYWFswXSNiCisJbW92CS00KCRkYXQpLCRZWSNiCisKKwlpbmMJJFhYWzBdI2IKKwlzdWIJJGluMCwkb3V0CisJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKK19fXworJGNvZGUuPTw8X19fIGlmICghJG1kNSk7CisJeG9yCSRUWFsxXSwkVFhbMV0KKwl0ZXN0CVwkLTEyOCwkbGVuCisJanoJLkxvb3AxCisJc3ViCSRYWFswXSwkVFhbMV0KKwlhbmQJXCRgJE1PRC0xYCwkVFhbMV0KKwlqegkuTG9vcCR7TU9EfV9pc19ob3QKKwlzdWIJJFRYWzFdLCRsZW4KKy5Mb29wJHtNT0R9X3dhcm11cDoKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAorCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCisJbW92bAkkVFkjZCwoJGRhdCwkWFhbMF0sNCkKKwlhZGQJJFRZI2IsJFRYWzBdI2IKKwlpbmMJJFhYWzBdI2IKKwltb3ZsCSgkZGF0LCRUWFswXSw0KSwkVFkjZAorCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCisJeG9yYgkoJGluMCksJFRZI2IKKwltb3ZiCSRUWSNiLCgkb3V0LCRpbjApCisJbGVhCTEoJGluMCksJGluMAorCWRlYwkkVFhbMV0KKwlqbnoJLkxvb3Ake01PRH1fd2FybXVwCisKKwltb3YJJFlZLCRUWFsxXQorCXhvcgkkWVksJFlZCisJbW92CSRUWFsxXSNiLCRZWSNiCisKKy5Mb29wJHtNT0R9X2lzX2hvdDoKKwltb3YJJGxlbiwzMiglcnNwKQkJIyBzYXZlIG9yaWdpbmFsICRsZW4KKwlzaHIJXCQ2LCRsZW4JCSMgbnVtYmVyIG9mIDY0LWJ5dGUgYmxvY2tzCitfX18KKyAgaWYgKCREICYmICEkbWQ1KSB7CQkJIyBzdGl0Y2ggaW4gZHVtbXkgTUQ1CisgICAgJG1kNT0xOworICAgICRjdHg9IiVyMTEiOworICAgICRpbnA9IiVyMTUiOworICAgICRjb2RlLj08PF9fXzsKKwltb3YJJXJzcCwkY3R4CisJbW92CSRpbjAsJGlucAorX19fCisgIH0KK30KKyRjb2RlLj08PF9fXzsKKyNyYzQjCWFkZAkkVFhbMF0jYiwkWVkjYgorI3JjNCMJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV0KKwlzaGwJXCQ2LCRsZW4KKwlhZGQJJGlucCwkbGVuCQkjIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiBpbnB1dAorCW1vdgkkbGVuLDE2KCVyc3ApCisKKyNtZDUjCW1vdgkkY3R4LDI0KCVyc3ApCQkjIHNhdmUgcG9pbnRlciB0byBNRDVfQ1RYCisjbWQ1Iwltb3YJMCo0KCRjdHgpLCRWWzBdCQkjIGxvYWQgY3VycmVudCBoYXNoIHZhbHVlIGZyb20gTUQ1X0NUWAorI21kNSMJbW92CTEqNCgkY3R4KSwkVlsxXQorI21kNSMJbW92CTIqNCgkY3R4KSwkVlsyXQorI21kNSMJbW92CTMqNCgkY3R4KSwkVlszXQorCWptcAkuTG9vcAorCisuYWxpZ24JMTYKKy5Mb29wOgorI21kNSMJbW92CSRWWzBdLDAqNCglcnNwKQkJIyBwdXQgYXNpZGUgY3VycmVudCBoYXNoIHZhbHVlCisjbWQ1Iwltb3YJJFZbMV0sMSo0KCVyc3ApCisjbWQ1Iwltb3YJJFZbMl0sMio0KCVyc3ApCisjbWQ1Iwltb3YJJFZbM10sJHRtcAkJIyBmb3J3YXJkIHJlZmVyZW5jZQorI21kNSMJbW92CSRWWzNdLDMqNCglcnNwKQorX19fCisKK3N1YiBSMCB7CisgIG15ICgkaSwkYSwkYiwkYywkZCk9QF87CisgIG15IEByb3QwPSg3LDEyLDE3LDIyKTsKKyAgbXkgJGo9JGklMTY7CisgIG15ICRrPSRpJSRNT0Q7CisgIG15ICR4bW09IiV4bW0iLigkaiYxKTsKKyAgICAkY29kZS49Igltb3ZkcXUJKCRpbjApLCV4bW0yXG4iCQlpZiAoJHJjNCAmJiAkaj09MTUpOworICAgICRjb2RlLj0iCWFkZAlcJCRNT0QsJFhYWzBdI2JcbiIJaWYgKCRyYzQgJiYgJGo9PTE1ICYmICRrPT0kTU9ELTEpOworICAgICRjb2RlLj0iCXB4b3IJJHhtbSwkeG1tXG4iCQlpZiAoJHJjNCAmJiAkajw9MSk7CisgICAgJGNvZGUuPTw8X19fOworI3JjNCMJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKyNtZDUjCXhvcgkkYywkdG1wCisjcmM0Iwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorI21kNSMJYW5kCSRiLCR0bXAKKyNtZDUjCWFkZAk0KmAkamAoJGlucCksJGEKKyNyYzQjCWFkZAkkVFkjYiwkVFhbMF0jYgorI3JjNCMJbW92bAlgNCooKCRrKzEpJSRNT0QpYChgJGs9PSRNT0QtMT8iJGRhdCwkWFhbMF0sNCI6IiRYWFsxXSJgKSwkVFhbMV0jZAorI21kNSMJYWRkCVwkJEtbJGldLCRhCisjbWQ1Iwl4b3IJJGQsJHRtcAorI3JjNCMJbW92egkkVFhbMF0jYiwkVFhbMF0jZAorI3JjNCMJbW92bAkkVFkjZCw0KiRrKCRYWFsxXSkKKyNtZDUjCWFkZAkkdG1wLCRhCisjcmM0IwlhZGQJJFRYWzFdI2IsJFlZI2IKKyNtZDUjCXJvbAlcJCRyb3QwWyRqJTRdLCRhCisjbWQ1Iwltb3YJYCRqPT0xNT8iJGIiOiIkYyJgLCR0bXAJCSMgZm9yd2FyZCByZWZlcmVuY2UKKyNyYzQjCXBpbnNydwlcJGAoJGo+PjEpJjdgLCgkZGF0LCRUWFswXSw0KSwkeG1tXG4KKyNtZDUjCWFkZAkkYiwkYQorX19fCisgICAgJGNvZGUuPTw8X19fIGlmICgkcmM0ICYmICRqPT0xNSAmJiAkaz09JE1PRC0xKTsKKwltb3YJJFlZLCRYWFsxXQorCXhvcgkkWVksJFlZCQkJCSMga2V5d29yZCB0byBwYXJ0aWFsIHJlZ2lzdGVyCisJbW92CSRYWFsxXSNiLCRZWSNiCisJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV0KK19fXworICAgICRjb2RlLj08PF9fXyBpZiAoJHJjNCAmJiAkaj09MTUpOworCXBzbGxxCVwkOCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0yCitfX18KK30KK3N1YiBSMSB7CisgIG15ICgkaSwkYSwkYiwkYywkZCk9QF87CisgIG15IEByb3QxPSg1LDksMTQsMjApOworICBteSAkaj0kaSUxNjsKKyAgbXkgJGs9JGklJE1PRDsKKyAgbXkgJHhtbT0iJXhtbSIuKCRqJjEpOworICAgICRjb2RlLj0iCW1vdmRxdQkxNigkaW4wKSwleG1tM1xuIglpZiAoJHJjNCAmJiAkaj09MTUpOworICAgICRjb2RlLj0iCWFkZAlcJCRNT0QsJFhYWzBdI2JcbiIJaWYgKCRyYzQgJiYgJGo9PTE1ICYmICRrPT0kTU9ELTEpOworICAgICRjb2RlLj0iCXB4b3IJJHhtbSwkeG1tXG4iCQlpZiAoJHJjNCAmJiAkajw9MSk7CisgICAgJGNvZGUuPTw8X19fOworI3JjNCMJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKyNtZDUjCXhvcgkkYiwkdG1wCisjcmM0Iwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorI21kNSMJYW5kCSRkLCR0bXAKKyNtZDUjCWFkZAk0KmAoKDErNSokaiklMTYpYCgkaW5wKSwkYQorI3JjNCMJYWRkCSRUWSNiLCRUWFswXSNiCisjcmM0Iwltb3ZsCWA0KigoJGsrMSklJE1PRClgKGAkaz09JE1PRC0xPyIkZGF0LCRYWFswXSw0IjoiJFhYWzFdImApLCRUWFsxXSNkCisjbWQ1IwlhZGQJXCQkS1skaV0sJGEKKyNtZDUjCXhvcgkkYywkdG1wCisjcmM0Iwltb3Z6CSRUWFswXSNiLCRUWFswXSNkCisjcmM0Iwltb3ZsCSRUWSNkLDQqJGsoJFhYWzFdKQorI21kNSMJYWRkCSR0bXAsJGEKKyNyYzQjCWFkZAkkVFhbMV0jYiwkWVkjYgorI21kNSMJcm9sCVwkJHJvdDFbJGolNF0sJGEKKyNtZDUjCW1vdglgJGo9PTE1PyIkYyI6IiRiImAsJHRtcAkJIyBmb3J3YXJkIHJlZmVyZW5jZQorI3JjNCMJcGluc3J3CVwkYCgkaj4+MSkmN2AsKCRkYXQsJFRYWzBdLDQpLCR4bW1cbgorI21kNSMJYWRkCSRiLCRhCitfX18KKyAgICAkY29kZS49PDxfX18gaWYgKCRyYzQgJiYgJGo9PTE1ICYmICRrPT0kTU9ELTEpOworCW1vdgkkWVksJFhYWzFdCisJeG9yCSRZWSwkWVkJCQkJIyBrZXl3b3JkIHRvIHBhcnRpYWwgcmVnaXN0ZXIKKwltb3YJJFhYWzFdI2IsJFlZI2IKKwlsZWEJKCRkYXQsJFhYWzBdLDQpLCRYWFsxXQorX19fCisgICAgJGNvZGUuPTw8X19fIGlmICgkcmM0ICYmICRqPT0xNSk7CisJcHNsbHEJXCQ4LCV4bW0xCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTEsJXhtbTMKK19fXworfQorc3ViIFIyIHsKKyAgbXkgKCRpLCRhLCRiLCRjLCRkKT1AXzsKKyAgbXkgQHJvdDI9KDQsMTEsMTYsMjMpOworICBteSAkaj0kaSUxNjsKKyAgbXkgJGs9JGklJE1PRDsKKyAgbXkgJHhtbT0iJXhtbSIuKCRqJjEpOworICAgICRjb2RlLj0iCW1vdmRxdQkzMigkaW4wKSwleG1tNFxuIglpZiAoJHJjNCAmJiAkaj09MTUpOworICAgICRjb2RlLj0iCWFkZAlcJCRNT0QsJFhYWzBdI2JcbiIJaWYgKCRyYzQgJiYgJGo9PTE1ICYmICRrPT0kTU9ELTEpOworICAgICRjb2RlLj0iCXB4b3IJJHhtbSwkeG1tXG4iCQlpZiAoJHJjNCAmJiAkajw9MSk7CisgICAgJGNvZGUuPTw8X19fOworI3JjNCMJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKyNtZDUjCXhvcgkkYywkdG1wCisjcmM0Iwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorI21kNSMJeG9yCSRiLCR0bXAKKyNtZDUjCWFkZAk0KmAoKDUrMyokaiklMTYpYCgkaW5wKSwkYQorI3JjNCMJYWRkCSRUWSNiLCRUWFswXSNiCisjcmM0Iwltb3ZsCWA0KigoJGsrMSklJE1PRClgKGAkaz09JE1PRC0xPyIkZGF0LCRYWFswXSw0IjoiJFhYWzFdImApLCRUWFsxXSNkCisjbWQ1IwlhZGQJXCQkS1skaV0sJGEKKyNyYzQjCW1vdnoJJFRYWzBdI2IsJFRYWzBdI2QKKyNtZDUjCWFkZAkkdG1wLCRhCisjcmM0Iwltb3ZsCSRUWSNkLDQqJGsoJFhYWzFdKQorI3JjNCMJYWRkCSRUWFsxXSNiLCRZWSNiCisjbWQ1Iwlyb2wJXCQkcm90MlskaiU0XSwkYQorI21kNSMJbW92CWAkaj09MTU/IlxcXCQtMSI6IiRjImAsJHRtcAkjIGZvcndhcmQgcmVmZXJlbmNlCisjcmM0IwlwaW5zcncJXCRgKCRqPj4xKSY3YCwoJGRhdCwkVFhbMF0sNCksJHhtbVxuCisjbWQ1IwlhZGQJJGIsJGEKK19fXworICAgICRjb2RlLj08PF9fXyBpZiAoJHJjNCAmJiAkaj09MTUgJiYgJGs9PSRNT0QtMSk7CisJbW92CSRZWSwkWFhbMV0KKwl4b3IJJFlZLCRZWQkJCQkjIGtleXdvcmQgdG8gcGFydGlhbCByZWdpc3RlcgorCW1vdgkkWFhbMV0jYiwkWVkjYgorCWxlYQkoJGRhdCwkWFhbMF0sNCksJFhYWzFdCitfX18KKyAgICAkY29kZS49PDxfX18gaWYgKCRyYzQgJiYgJGo9PTE1KTsKKwlwc2xscQlcJDgsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJcHhvcgkleG1tMSwleG1tNAorX19fCit9CitzdWIgUjMgeworICBteSAoJGksJGEsJGIsJGMsJGQpPUBfOworICBteSBAcm90Mz0oNiwxMCwxNSwyMSk7CisgIG15ICRqPSRpJTE2OworICBteSAkaz0kaSUkTU9EOworICBteSAkeG1tPSIleG1tIi4oJGomMSk7CisgICAgJGNvZGUuPSIJbW92ZHF1CTQ4KCRpbjApLCV4bW01XG4iCWlmICgkcmM0ICYmICRqPT0xNSk7CisgICAgJGNvZGUuPSIJYWRkCVwkJE1PRCwkWFhbMF0jYlxuIglpZiAoJHJjNCAmJiAkaj09MTUgJiYgJGs9PSRNT0QtMSk7CisgICAgJGNvZGUuPSIJcHhvcgkkeG1tLCR4bW1cbiIJCWlmICgkcmM0ICYmICRqPD0xKTsKKyAgICAkY29kZS49PDxfX187CisjcmM0Iwltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAorI21kNSMJeG9yCSRkLCR0bXAKKyNyYzQjCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCisjbWQ1IwlvcgkkYiwkdG1wCisjbWQ1IwlhZGQJNCpgKCg3KiRqKSUxNilgKCRpbnApLCRhCisjcmM0IwlhZGQJJFRZI2IsJFRYWzBdI2IKKyNyYzQjCW1vdmwJYDQqKCgkaysxKSUkTU9EKWAoYCRrPT0kTU9ELTE/IiRkYXQsJFhYWzBdLDQiOiIkWFhbMV0iYCksJFRYWzFdI2QKKyNtZDUjCWFkZAlcJCRLWyRpXSwkYQorI3JjNCMJbW92egkkVFhbMF0jYiwkVFhbMF0jZAorI21kNSMJeG9yCSRjLCR0bXAKKyNyYzQjCW1vdmwJJFRZI2QsNCokaygkWFhbMV0pCisjbWQ1IwlhZGQJJHRtcCwkYQorI3JjNCMJYWRkCSRUWFsxXSNiLCRZWSNiCisjbWQ1Iwlyb2wJXCQkcm90M1skaiU0XSwkYQorI21kNSMJbW92CVwkLTEsJHRtcAkJCSMgZm9yd2FyZCByZWZlcmVuY2UKKyNyYzQjCXBpbnNydwlcJGAoJGo+PjEpJjdgLCgkZGF0LCRUWFswXSw0KSwkeG1tXG4KKyNtZDUjCWFkZAkkYiwkYQorX19fCisgICAgJGNvZGUuPTw8X19fIGlmICgkcmM0ICYmICRqPT0xNSk7CisJbW92CSRYWFswXSwkWFhbMV0KKwl4b3IJJFhYWzBdLCRYWFswXQkJCSMga2V5d29yZCB0byBwYXJ0aWFsIHJlZ2lzdGVyCisJbW92CSRYWFsxXSNiLCRYWFswXSNiCisJbW92CSRZWSwkWFhbMV0KKwl4b3IJJFlZLCRZWQkJCQkjIGtleXdvcmQgdG8gcGFydGlhbCByZWdpc3RlcgorCW1vdgkkWFhbMV0jYiwkWVkjYgorCWxlYQkoJGRhdCwkWFhbMF0sNCksJFhYWzFdCisJcHNsbHEJXCQ4LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNQorCXB4b3IJJXhtbTEsJXhtbTUKK19fXworfQorCitteSAkaT0wOworZm9yKDskaTwxNjskaSsrKSB7IFIwKCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgcHVzaChAVFgsc2hpZnQoQFRYKSk7IH0KK2Zvcig7JGk8MzI7JGkrKykgeyBSMSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IHB1c2goQFRYLHNoaWZ0KEBUWCkpOyB9Citmb3IoOyRpPDQ4OyRpKyspIHsgUjIoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyBwdXNoKEBUWCxzaGlmdChAVFgpKTsgfQorZm9yKDskaTw2NDskaSsrKSB7IFIzKCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgcHVzaChAVFgsc2hpZnQoQFRYKSk7IH0KKworJGNvZGUuPTw8X19fOworI21kNSMJYWRkCTAqNCglcnNwKSwkVlswXQkJIyBhY2N1bXVsYXRlIGhhc2ggdmFsdWUKKyNtZDUjCWFkZAkxKjQoJXJzcCksJFZbMV0KKyNtZDUjCWFkZAkyKjQoJXJzcCksJFZbMl0KKyNtZDUjCWFkZAkzKjQoJXJzcCksJFZbM10KKworI3JjNCMJbW92ZHF1CSV4bW0yLCgkb3V0LCRpbjApCSMgd3JpdGUgUkM0IG91dHB1dAorI3JjNCMJbW92ZHF1CSV4bW0zLDE2KCRvdXQsJGluMCkKKyNyYzQjCW1vdmRxdQkleG1tNCwzMigkb3V0LCRpbjApCisjcmM0Iwltb3ZkcXUJJXhtbTUsNDgoJG91dCwkaW4wKQorI21kNSMJbGVhCTY0KCRpbnApLCRpbnAKKyNyYzQjCWxlYQk2NCgkaW4wKSwkaW4wCisJY21wCTE2KCVyc3ApLCRpbnAJCSMgYXJlIHdlIGRvbmU/CisJamIJLkxvb3AKKworI21kNSMJbW92CTI0KCVyc3ApLCRsZW4JCSMgcmVzdG9yZSBwb2ludGVyIHRvIE1ENV9DVFgKKyNyYzQjCXN1YgkkVFhbMF0jYiwkWVkjYgkJIyBjb3JyZWN0ICRZWQorI21kNSMJbW92CSRWWzBdLDAqNCgkbGVuKQkJIyB3cml0ZSBNRDVfQ1RYCisjbWQ1Iwltb3YJJFZbMV0sMSo0KCRsZW4pCisjbWQ1Iwltb3YJJFZbMl0sMio0KCRsZW4pCisjbWQ1Iwltb3YJJFZbM10sMyo0KCRsZW4pCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHJjNCAmJiAoISRtZDUgfHwgJEQpKTsKKwltb3YJMzIoJXJzcCksJGxlbgkJIyByZXN0b3JlIG9yaWdpbmFsICRsZW4KKwlhbmQJXCQ2MywkbGVuCQkjIHJlbWFpbmluZyBieXRlcworCWpuegkuTG9vcDEKKwlqbXAJLkxkb25lCisJCisuYWxpZ24JMTYKKy5Mb29wMToKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAorCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCisJbW92bAkkVFkjZCwoJGRhdCwkWFhbMF0sNCkKKwlhZGQJJFRZI2IsJFRYWzBdI2IKKwlpbmMJJFhYWzBdI2IKKwltb3ZsCSgkZGF0LCRUWFswXSw0KSwkVFkjZAorCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCisJeG9yYgkoJGluMCksJFRZI2IKKwltb3ZiCSRUWSNiLCgkb3V0LCRpbjApCisJbGVhCTEoJGluMCksJGluMAorCWRlYwkkbGVuCisJam56CS5Mb29wMQorCisuTGRvbmU6CitfX18KKyRjb2RlLj08PF9fXzsKKyNyYzQjCXN1YglcJDEsJFhYWzBdI2IKKyNyYzQjCW1vdmwJJFhYWzBdI2QsLTgoJGRhdCkKKyNyYzQjCW1vdmwJJFlZI2QsLTQoJGRhdCkKKworCW1vdgk0MCglcnNwKSwlcjE1CisJbW92CTQ4KCVyc3ApLCVyMTQKKwltb3YJNTYoJXJzcCksJXIxMworCW1vdgk2NCglcnNwKSwlcjEyCisJbW92CTcyKCVyc3ApLCVyYnAKKwltb3YJODAoJXJzcCksJXJieAorCWxlYQk4OCglcnNwKSwlcnNwCisuTGVwaWxvZ3VlOgorLkxhYm9ydDoKKwlyZXQKKy5zaXplICRmdW5jLC4tJGZ1bmMKK19fXworCitpZiAoJHJjNCAmJiAkRCkgewkjIHNvbGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gaXMgdG8gcHJvdmlkZQorCQkJIyBvcHRpb24gdG8gdXNlIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIGFzIGRyb3AtaW4KKwkJCSMgcmVwbGFjZW1lbnQgZm9yIHJjNC14ODZfNjQucGwgZm9yIGRlYnVnZ2luZworCQkJIyBhbmQgdGVzdGluZyBwdXJwb3Nlcy4uLgorbXkgKCRpZHgsJGlkbyk9KCIlcjgiLCIlcjkiKTsKK215ICgkZGF0LCRsZW4sJGlucCk9KCIlcmRpIiwiJXJzaSIsIiVyZHgiKTsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCVJDNF9zZXRfa2V5CisudHlwZQlSQzRfc2V0X2tleSxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorUkM0X3NldF9rZXk6CisJbGVhCTgoJGRhdCksJGRhdAorCWxlYQkoJGlucCwkbGVuKSwkaW5wCisJbmVnCSRsZW4KKwltb3YJJGxlbiwlcmN4CisJeG9yCSVlYXgsJWVheAorCXhvcgkkaWRvLCRpZG8KKwl4b3IJJXIxMCwlcjEwCisJeG9yCSVyMTEsJXIxMQorCWptcAkuTHcxc3Rsb29wCisKKy5hbGlnbgkxNgorLkx3MXN0bG9vcDoKKwltb3YJJWVheCwoJGRhdCwlcmF4LDQpCisJYWRkCVwkMSwlYWwKKwlqbmMJLkx3MXN0bG9vcAorCisJeG9yCSRpZG8sJGlkbworCXhvcgkkaWR4LCRpZHgKKy5hbGlnbgkxNgorLkx3Mm5kbG9vcDoKKwltb3YJKCRkYXQsJGlkbyw0KSwlcjEwZAorCWFkZAkoJGlucCwkbGVuLDEpLCRpZHgjYgorCWFkZAklcjEwYiwkaWR4I2IKKwlhZGQJXCQxLCRsZW4KKwltb3YJKCRkYXQsJGlkeCw0KSwlcjExZAorCWNtb3Z6CSVyY3gsJGxlbgorCW1vdgklcjEwZCwoJGRhdCwkaWR4LDQpCisJbW92CSVyMTFkLCgkZGF0LCRpZG8sNCkKKwlhZGQJXCQxLCRpZG8jYgorCWpuYwkuTHcybmRsb29wCisKKwl4b3IJJWVheCwlZWF4CisJbW92CSVlYXgsLTgoJGRhdCkKKwltb3YJJWVheCwtNCgkZGF0KQorCXJldAorLnNpemUJUkM0X3NldF9rZXksLi1SQzRfc2V0X2tleQorCisuZ2xvYmwJUkM0X29wdGlvbnMKKy50eXBlCVJDNF9vcHRpb25zLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorUkM0X29wdGlvbnM6CisJbGVhCS5Mb3B0cyglcmlwKSwlcmF4CisJcmV0CisuYWxpZ24JNjQKKy5Mb3B0czoKKy5hc2NpegkicmM0KDY0eCxpbnQpIgorLmFsaWduCTY0Cisuc2l6ZQlSQzRfb3B0aW9ucywuLVJDNF9vcHRpb25zCitfX18KK30KKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CitteSAkcmVjPSIlcmN4IjsKK215ICRmcmFtZT0iJXJkeCI7CitteSAkY29udGV4dD0iJXI4IjsKK215ICRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXNlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5MYm9keSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8Lkxib2R5CisJamIJLkxpbl9wcm9sb2d1ZQorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwlsZWEJLkxlcGlsb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PS5MZXBpbG9ndWUKKwlqYWUJLkxpbl9wcm9sb2d1ZQorCisJbW92CTQwKCVyYXgpLCVyMTUKKwltb3YJNDgoJXJheCksJXIxNAorCW1vdgk1NiglcmF4KSwlcjEzCisJbW92CTY0KCVyYXgpLCVyMTIKKwltb3YJNzIoJXJheCksJXJicAorCW1vdgk4MCglcmF4KSwlcmJ4CisJbGVhCTg4KCVyYXgpLCVyYXgKKworCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCisuTGluX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJc2VfaGFuZGxlciwuLXNlX2hhbmRsZXIKKworLnNlY3Rpb24JLnBkYXRhCisuYWxpZ24JNAorCS5ydmEJLkxTRUhfYmVnaW5fJGZ1bmMKKwkucnZhCS5MU0VIX2VuZF8kZnVuYworCS5ydmEJLkxTRUhfaW5mb18kZnVuYworCisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvXyRmdW5jOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKK19fXworfQorCitzdWIgcmVnX3BhcnQgeworbXkgKCRyZWcsJGNvbnYpPUBfOworICAgIGlmICgkcmVnID1+IC8lclswLTldKy8pICAgICB7ICRyZWcgLj0gJGNvbnY7IH0KKyAgICBlbHNpZiAoJGNvbnYgZXEgImIiKSAgICAgICAgeyAkcmVnID1+IHMvJVtlcl0oW154XSspeD8vJSQxbC87ICAgICAgIH0KKyAgICBlbHNpZiAoJGNvbnYgZXEgInciKSAgICAgICAgeyAkcmVnID1+IHMvJVtlcl0oLispLyUkMS87ICAgICAgICAgICAgIH0KKyAgICBlbHNpZiAoJGNvbnYgZXEgImQiKSAgICAgICAgeyAkcmVnID1+IHMvJVtlcl0oLispLyVlJDEvOyAgICAgICAgICAgIH0KKyAgICByZXR1cm4gJHJlZzsKK30KKworJGNvZGUgPX4gcy8oJVthLXowLTldKykjKFtid2RdKS9yZWdfcGFydCgkMSwkMikvZ2VtOworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CiskY29kZSA9fiBzL3BpbnNyd1xzK1wkMCwvbW92ZAkvZ207CisKKyRjb2RlID1+IHMvI21kNSMvL2dtCWlmICgkbWQ1KTsKKyRjb2RlID1+IHMvI3JjNCMvL2dtCWlmICgkcmM0KTsKKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2puaS9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC1wYXJpc2MucGwgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtcGFyaXNjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjUwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtcGFyaXNjLnBsCkBAIC0wLDAgKzEsMzEzIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgUkM0IGZvciBQQS1SSVNDLgorCisjIEp1bmUgMjAwOS4KKyMKKyMgUGVyZm9ybWFuY2UgaXMgMzMlIGJldHRlciB0aGFuIGdjYyAzLjIgZ2VuZXJhdGVkIGNvZGUgb24gUEEtNzEwMExDLgorIyBGb3IgcmVmZXJlbmNlLCBbNHhdIHVucm9sbGVkIGxvb3AgaXMgPjQwJSBmYXN0ZXIgdGhhbiBmb2xkZWQgb25lLgorIyBJdCdzIHBvc3NpYmxlIHRvIHVucm9sbCBsb29wIDggdGltZXMgb24gUEEtUklTQyAyLjAsIGJ1dCBpbXByb3ZlbWVudAorIyBpcyBiZWxpZXZlZCB0byBiZSBub3Qgc3VmZmljaWVudCB0byBqdXN0aWZ5IHRoZSBlZmZvcnQuLi4KKyMKKyMgU3BlY2lhbCB0aGFua3MgdG8gcG9sYXJob21lLmNvbSBmb3IgcHJvdmlkaW5nIEhQLVVYIGFjY291bnQuCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ID0gc2hpZnQ7CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCitpZiAoJGZsYXZvdXIgPX4gLzY0LykgeworCSRMRVZFTAkJPSIyLjBXIjsKKwkkU0laRV9UCQk9ODsKKwkkRlJBTUVfTUFSS0VSCT04MDsKKwkkU0FWRURfUlAJPTE2OworCSRQVVNICQk9InN0ZCI7CisJJFBVU0hNQQkJPSJzdGQsbWEiOworCSRQT1AJCT0ibGRkIjsKKwkkUE9QTUIJCT0ibGRkLG1iIjsKK30gZWxzZSB7CisJJExFVkVMCQk9IjEuMCI7CisJJFNJWkVfVAkJPTQ7CisJJEZSQU1FX01BUktFUgk9NDg7CisJJFNBVkVEX1JQCT0yMDsKKwkkUFVTSAkJPSJzdHciOworCSRQVVNITUEJCT0ic3R3bSI7CisJJFBPUAkJPSJsZHciOworCSRQT1BNQgkJPSJsZHdtIjsKK30KKworJEZSQU1FPTQqJFNJWkVfVCskRlJBTUVfTUFSS0VSOwkjIDQgc2F2ZWQgcmVncyArIGZyYW1lIG1hcmtlcgorCQkJCSMgICAgICAgICAgICAgICAgWysgYXJndW1lbnQgdHJhbnNmZXJdCiskU1o9MTsJCQkJIyBkZWZhdWx0cyB0byBSQzRfQ0hBUgoraWYgKG9wZW4gQ09ORiwiPCR7ZGlyfS4uLy4uL29wZW5zc2xjb25mLmgiKSB7CisgICAgd2hpbGUoPENPTkY+KSB7CisJaWYgKG0vI1xzKmRlZmluZVxzK1JDNF9JTlRccysoLiopLykgeworCSAgICAkU1ogPSAoJDE9fi9jaGFyJC8pID8gMSA6IDQ7CisJICAgIGxhc3Q7CisJfQorICAgIH0KKyAgICBjbG9zZSBDT05GOworfQorCitpZiAoJFNaPT0xKSB7CSMgUkM0X0NIQVIKKyAgICAkTEQ9ImxkYiI7CisgICAgJExEWD0ibGRieCI7CisgICAgJE1LWD0iYWRkbCI7CisgICAgJFNUPSJzdGIiOworfSBlbHNlIHsJIyBSQzRfSU5UICh+NSUgZmFzdGVyIHRoYW4gUkM0X0NIQVIgb24gUEEtNzEwMExDKQorICAgICRMRD0ibGR3IjsKKyAgICAkTERYPSJsZHd4LHMiOworICAgICRNS1g9InNoMmFkZGwiOworICAgICRTVD0ic3R3IjsKK30KKworJGtleT0iJXIyNiI7CiskbGVuPSIlcjI1IjsKKyRpbnA9IiVyMjQiOworJG91dD0iJXIyMyI7CisKK0BYWD0oIiVyMTkiLCIlcjIwIik7CitAVFg9KCIlcjIxIiwiJXIyMiIpOworJFlZPSIlcjI4IjsKKyRUWT0iJXIyOSI7CisKKyRhY2M9IiVyMSI7CiskaXg9IiVyMiI7CiskaXk9IiVyMyI7CiskZGF0MD0iJXI0IjsKKyRkYXQxPSIlcjUiOworJHJlbT0iJXI2IjsKKyRtYXNrPSIlcjMxIjsKKworc3ViIHVucm9sbGVkbG9vcGJvZHkgeworZm9yICgkaT0wOyRpPDQ7JGkrKykgeworJGNvZGUuPTw8X19fOworCWxkbwkxKCRYWFswXSksJFhYWzFdCisJYHNwcmludGYoIiRMRFgJJSRUWSglJGtleSksJSRkYXQxIikgaWYgKCRpPjApYAkKKwlhbmQJJG1hc2ssJFhYWzFdLCRYWFsxXQorCSRMRFgJJFlZKCRrZXkpLCRUWQorCSRNS1gJJFlZLCRrZXksJGl4CisJJExEWAkkWFhbMV0oJGtleSksJFRYWzFdCisJJE1LWAkkWFhbMF0sJGtleSwkaXkKKwkkU1QJJFRYWzBdLDAoJGl4KQorCWNvbWNsciw8PiAkWFhbMV0sJFlZLCVyMAk7IGNvbmRpdGlvbmFsCisJY29weQkkVFhbMF0sJFRYWzFdCQk7IG1vdmUKKwlgc3ByaW50ZigiJXNkZXAJJSRkYXQxLCVkLDgsJSRhY2MiLCRpPT0xPyJ6IjoiIiw4KigkaS0xKSs3KSBpZiAoJGk+MClgCisJJFNUCSRUWSwwKCRpeSkKKwlhZGRsCSRUWFswXSwkVFksJFRZCisJYWRkbAkkVFhbMV0sJFlZLCRZWQorCWFuZAkkbWFzaywkVFksJFRZCisJYW5kCSRtYXNrLCRZWSwkWVkKK19fXworcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycworfSB9CisKK3N1YiBmb2xkZWRsb29wIHsKK215ICgkbGFiZWwsJGNvdW50KT1AXzsKKyRjb2RlLj08PF9fXzsKKyRsYWJlbAorCSRNS1gJJFlZLCRrZXksJGl5CisJJExEWAkkWVkoJGtleSksJFRZCisJJE1LWAkkWFhbMF0sJGtleSwkaXgKKwkkU1QJJFRYWzBdLDAoJGl5KQorCWxkbwkxKCRYWFswXSksJFhYWzBdCisJJFNUCSRUWSwwKCRpeCkKKwlhZGRsCSRUWFswXSwkVFksJFRZCisJbGRieAkkaW5wKCRvdXQpLCRkYXQxCisJYW5kCSRtYXNrLCRUWSwkVFkKKwlhbmQJJG1hc2ssJFhYWzBdLCRYWFswXQorCSRMRFgJJFRZKCRrZXkpLCRhY2MKKwkkTERYCSRYWFswXSgka2V5KSwkVFhbMF0KKwlsZG8JMSgkb3V0KSwkb3V0CisJeG9yCSRkYXQxLCRhY2MsJGFjYworCWFkZGwJJFRYWzBdLCRZWSwkWVkKKwlzdGIJJGFjYywtMSgkb3V0KQorCWFkZGliLDw+IC0xLCRjb3VudCwkbGFiZWwJOyAkY291bnQgaXMgYWx3YXlzIHNtYWxsCisJYW5kCSRtYXNrLCRZWSwkWVkKK19fXworfQorCiskY29kZT08PF9fXzsKKwkuTEVWRUwJJExFVkVMCisJLlNQQUNFCVwkVEVYVFwkCisJLlNVQlNQQQlcJENPREVcJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9MHgyQyxDT0RFX09OTFkKKworCS5FWFBPUlQJUkM0LEVOVFJZLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCitSQzQKKwkuUFJPQworCS5DQUxMSU5GTwlGUkFNRT1gJEZSQU1FLTQqJFNJWkVfVGAsTk9fQ0FMTFMsU0FWRV9SUCxFTlRSWV9HUj02CisJLkVOVFJZCisJJFBVU0gJJXIyLC0kU0FWRURfUlAoJXNwKQk7IHN0YW5kYXJkIHByb2xvZ3VlCisJJFBVU0hNQQklcjMsJEZSQU1FKCVzcCkKKwkkUFVTSAklcjQsYC0kRlJBTUUrMSokU0laRV9UYCglc3ApCisJJFBVU0gJJXI1LGAtJEZSQU1FKzIqJFNJWkVfVGAoJXNwKQorCSRQVVNICSVyNixgLSRGUkFNRSszKiRTSVpFX1RgKCVzcCkKKworCWNtcGliLCo9IDAsJGxlbixMXCRhYm9ydAorCXN1YgkkaW5wLCRvdXQsJGlucAkJOyBkaXN0YW5jZSBiZXR3ZWVuICRpbnAgYW5kICRvdXQKKworCSRMRAlgMCokU1pgKCRrZXkpLCRYWFswXQorCSRMRAlgMSokU1pgKCRrZXkpLCRZWQorCWxkbwlgMiokU1pgKCRrZXkpLCRrZXkKKworCWxkaQkweGZmLCRtYXNrCisJbGRpCTMsJGRhdDAJCQorCisJbGRvCTEoJFhYWzBdKSwkWFhbMF0JOyB3YXJtIHVwIGxvb3AKKwlhbmQJJG1hc2ssJFhYWzBdLCRYWFswXQorCSRMRFgJJFhYWzBdKCRrZXkpLCRUWFswXQorCWFkZGwJJFRYWzBdLCRZWSwkWVkKKwljbXBpYiwqPj49IDYsJGxlbixMXCRvb3AxCTsgaXMgJGxlbiBsYXJnZSBlbm91Z2ggdG8gYm90aGVyPworCWFuZAkkbWFzaywkWVksJFlZCisKKwlhbmQsPD4JJG91dCwkZGF0MCwkcmVtCQk7IGlzICRvdXQgYWxpZ25lZD8KKwliCUxcJGFsaWduZWRvdXQKKwlzdWJpCTQsJHJlbSwkcmVtCisJc3ViCSRsZW4sJHJlbSwkbGVuCitfX18KKyZmb2xkZWRsb29wKCJMXCRhbGlnbm91dCIsJHJlbSk7CSMgcHJvY2VzcyB0aWxsICRvdXQgaXMgYWxpZ25lZAorCiskY29kZS49PDxfX187CitMXCRhbGlnbmVkb3V0CQkJCTsgJGxlbiBpcyBhdCBsZWFzdCA0IGhlcmUKKwlhbmQsPD4JJGlucCwkZGF0MCwkYWNjCQk7IGlzICRpbnAgYWxpZ25lZD8KKwliCUxcJG9vcDQKKwlzdWIJJGlucCwkYWNjLCRyZW0JCTsgYWxpZ24gJGlucAorCisJc2gzYWRkbAkkYWNjLCVyMCwkYWNjCisJc3ViaQkzMiwkYWNjLCRhY2MKKwltdGN0bAkkYWNjLCVjcjExCQk7IGxvYWQgJXNhciB3aXRoIHZzaGQgYWxpZ24gZmFjdG9yCisJbGR3eAkkcmVtKCRvdXQpLCRkYXQwCisJbGRvCTQoJHJlbSksJHJlbQorTFwkb29wNG1pc2FsaWduZWRpbnAKK19fXworJnVucm9sbGVkbG9vcGJvZHkoKTsKKyRjb2RlLj08PF9fXzsKKwkkTERYCSRUWSgka2V5KSwkaXgKKwlsZHd4CSRyZW0oJG91dCksJGRhdDEKKwlsZG8JLTQoJGxlbiksJGxlbgorCW9yCSRpeCwkYWNjLCRhY2MJCTsgbGFzdCBwaWVjZSwgbm8gbmVlZCB0byBkZXAKKwl2c2hkCSRkYXQwLCRkYXQxLCRpeQkJOyBhbGlnbiBkYXRhCisJY29weQkkZGF0MSwkZGF0MAorCXhvcgkkaXksJGFjYywkYWNjCisJc3R3CSRhY2MsMCgkb3V0KQorCWNtcGliLCo8PCAzLCRsZW4sTFwkb29wNG1pc2FsaWduZWRpbnAKKwlsZG8JNCgkb3V0KSwkb3V0CisJY21waWIsKj0gMCwkbGVuLExcJGRvbmUKKwlub3AKKwliCUxcJG9vcDEKKwlub3AKKworCS5BTElHTgk4CitMXCRvb3A0CitfX18KKyZ1bnJvbGxlZGxvb3Bib2R5KCk7CiskY29kZS49PDxfX187CisJJExEWAkkVFkoJGtleSksJGl4CisJbGR3eAkkaW5wKCRvdXQpLCRkYXQwCisJbGRvCS00KCRsZW4pLCRsZW4KKwlvcgkkaXgsJGFjYywkYWNjCQk7IGxhc3QgcGllY2UsIG5vIG5lZWQgdG8gZGVwCisJeG9yCSRkYXQwLCRhY2MsJGFjYworCXN0dwkkYWNjLDAoJG91dCkKKwljbXBpYiwqPDwgMywkbGVuLExcJG9vcDQKKwlsZG8JNCgkb3V0KSwkb3V0CisJY21waWIsKj0gMCwkbGVuLExcJGRvbmUKKwlub3AKK19fXworJmZvbGRlZGxvb3AoIkxcJG9vcDEiLCRsZW4pOworJGNvZGUuPTw8X19fOworTFwkZG9uZQorCSRQT1AJYC0kRlJBTUUtJFNBVkVEX1JQYCglc3ApLCVyMgorCWxkbwktMSgkWFhbMF0pLCRYWFswXQk7IGNoaWxsIG91dCBsb29wCisJc3ViCSRZWSwkVFhbMF0sJFlZCisJYW5kCSRtYXNrLCRYWFswXSwkWFhbMF0KKwlhbmQJJG1hc2ssJFlZLCRZWQorCSRTVAkkWFhbMF0sYC0yKiRTWmAoJGtleSkKKwkkU1QJJFlZLGAtMSokU1pgKCRrZXkpCisJJFBPUAlgLSRGUkFNRSsxKiRTSVpFX1RgKCVzcCksJXI0CisJJFBPUAlgLSRGUkFNRSsyKiRTSVpFX1RgKCVzcCksJXI1CisJJFBPUAlgLSRGUkFNRSszKiRTSVpFX1RgKCVzcCksJXI2CitMXCRhYm9ydAorCWJ2CSglcjIpCisJLkVYSVQKKwkkUE9QTUIJLSRGUkFNRSglc3ApLCVyMworCS5QUk9DRU5ECitfX18KKworJGNvZGUuPTw8X19fOworCisJLkVYUE9SVAlwcml2YXRlX1JDNF9zZXRfa2V5LEVOVFJZLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJLkFMSUdOCTgKK3ByaXZhdGVfUkM0X3NldF9rZXkKKwkuUFJPQworCS5DQUxMSU5GTwlOT19DQUxMUworCS5FTlRSWQorCSRTVAklcjAsYDAqJFNaYCgka2V5KQorCSRTVAklcjAsYDEqJFNaYCgka2V5KQorCWxkbwlgMiokU1pgKCRrZXkpLCRrZXkKKwljb3B5CSVyMCxAWFhbMF0KK0xcJDFzdAorCSRTVAlAWFhbMF0sMCgka2V5KQorCWxkbwkxKEBYWFswXSksQFhYWzBdCisJYmIsPj0JQFhYWzBdLGAzMS04YCxMXCQxc3QJOyBAWFhbMF08MjU2CisJbGRvCSRTWigka2V5KSwka2V5CisKKwlsZG8JYC0yNTYqJFNaYCgka2V5KSwka2V5CTsgcmV3aW5kICRrZXkKKwlhZGRsCSRsZW4sJGlucCwkaW5wCQk7ICRpbnAgdG8gcG9pbnQgYXQgdGhlIGVuZAorCXN1YgklcjAsJGxlbiwlcjIzCQk7IGludmVyc2UgaW5kZXgKKwljb3B5CSVyMCxAWFhbMF0KKwljb3B5CSVyMCxAWFhbMV0KKwlsZGkJMHhmZiwkbWFzaworCitMXCQybmQKKwkkTERYCUBYWFswXSgka2V5KSxAVFhbMF0KKwlsZGJ4CSVyMjMoJGlucCksQFRYWzFdCisJYWRkaSxudXYgMSwlcjIzLCVyMjMJCTsgaW5jcmVtZW50IGFuZCBjb25kaXRpb25hbAorCXN1YgklcjAsJGxlbiwlcjIzCQk7IGludmVyc2UgaW5kZXgKKwlhZGRsCUBUWFswXSxAWFhbMV0sQFhYWzFdCisJYWRkbAlAVFhbMV0sQFhYWzFdLEBYWFsxXQorCWFuZAkkbWFzayxAWFhbMV0sQFhYWzFdCisJJE1LWAlAWFhbMF0sJGtleSwkVFkKKwkkTERYCUBYWFsxXSgka2V5KSxAVFhbMV0KKwkkTUtYCUBYWFsxXSwka2V5LCRZWQorCWxkbwkxKEBYWFswXSksQFhYWzBdCisJJFNUCUBUWFswXSwwKCRZWSkKKwliYiw+PQlAWFhbMF0sYDMxLThgLExcJDJuZAk7IEBYWFswXTwyNTYKKwkkU1QJQFRYWzFdLDAoJFRZKQorCisJYnYsbgkoJXIyKQorCS5FWElUCisJbm9wCisJLlBST0NFTkQKKworCS5FWFBPUlQJUkM0X29wdGlvbnMsRU5UUlkKKwkuQUxJR04JOAorUkM0X29wdGlvbnMKKwkuUFJPQworCS5DQUxMSU5GTwlOT19DQUxMUworCS5FTlRSWQorCWJscgklcjAsJXIyOAorCWxkaQkzLCVyMQorTFwkcGljCisJYW5kY20JJXIyOCwlcjEsJXIyOAorCWJ2CSglcjIpCisJLkVYSVQKKwlsZG8JTFwkb3B0cy1MXCRwaWMoJXIyOCksJXIyOAorCS5QUk9DRU5ECisJLkFMSUdOCTgKK0xcJG9wdHMKKwkuU1RSSU5HWiAicmM0KDR4LGAkU1o9PTE/ImNoYXIiOiJpbnQiYCkiCisJLlNUUklOR1ogIlJDNCBmb3IgUEEtUklTQywgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CiskY29kZSA9fiBzL2NtcGliLFwqL2NvbWliLC9nbSBpZiAoJFNJWkVfVD09NCk7CisKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvam5pL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LXMzOTB4LnBsIGIvam5pL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LXMzOTB4LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjhlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtczM5MHgucGwKQEAgLTAsMCArMSwyMzQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIEZlYnJ1YXJ5IDIwMDkKKyMKKyMgUGVyZm9ybWFuY2UgaXMgMnggb2YgZ2NjIDMuNC42IG9uIHoxMC4gQ29kaW5nICJzZWNyZXQiIGlzIHRvCisjICJjbHVzdGVyIiBBZGRyZXNzIEdlbmVyYXRpb24gSW50ZXJsb2Nrcywgc28gdGhhdCBvbmUgcGlwZWxpbmUgc3RhbGwKKyMgcmVzb2x2ZXMgc2V2ZXJhbCBkZXBlbmRlbmNpZXMuCisKKyMgTm92ZW1iZXIgMjAxMC4KKyMKKyMgQWRhcHQgZm9yIC1tMzEgYnVpbGQuIElmIGtlcm5lbCBzdXBwb3J0cyB3aGF0J3MgY2FsbGVkICJoaWdoZ3BycyIKKyMgZmVhdHVyZSBvbiBMaW51eCBbc2VlIC9wcm9jL2NwdWluZm9dLCBpdCdzIHBvc3NpYmxlIHRvIHVzZSA2NC1iaXQKKyMgaW5zdHJ1Y3Rpb25zIGFuZCBhY2hpZXZlICI2NC1iaXQiIHBlcmZvcm1hbmNlIGV2ZW4gaW4gMzEtYml0IGxlZ2FjeQorIyBhcHBsaWNhdGlvbiBjb250ZXh0LiBUaGUgZmVhdHVyZSBpcyBub3Qgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIKKyMgcHJvY2Vzc29yLCBhcyBsb25nIGFzIGl0J3MgInotQ1BVIi4gTGF0dGVyIGltcGxpZXMgdGhhdCB0aGUgY29kZQorIyByZW1haW5zIHovQXJjaGl0ZWN0dXJlIHNwZWNpZmljLiBPbiB6OTkwIGl0IHdhcyBtZWFzdXJlZCB0byBwZXJmb3JtCisjIDUwJSBiZXR0ZXIgdGhhbiBjb2RlIGdlbmVyYXRlZCBieSBnY2MgNC4zLgorCiskZmxhdm91ciA9IHNoaWZ0OworCitpZiAoJGZsYXZvdXIgPX4gLzNbMTJdLykgeworCSRTSVpFX1Q9NDsKKwkkZz0iIjsKK30gZWxzZSB7CisJJFNJWkVfVD04OworCSRnPSJnIjsKK30KKword2hpbGUgKCgkb3V0cHV0PXNoaWZ0KSAmJiAoJG91dHB1dCF+L15cd1tcd1wtXSpcLlx3KyQvKSkge30KK29wZW4gU1RET1VULCI+JG91dHB1dCI7CisKKyRycD0iJXIxNCI7Ciskc3A9IiVyMTUiOworJGNvZGU9PDxfX187CisudGV4dAorCitfX18KKworIyB2b2lkIFJDNChSQzRfS0VZICprZXksc2l6ZV90IGxlbixjb25zdCB2b2lkICppbnAsdm9pZCAqb3V0KQoreworJGFjYz0iJXIwIjsKKyRjbnQ9IiVyMSI7Ciska2V5PSIlcjIiOworJGxlbj0iJXIzIjsKKyRpbnA9IiVyNCI7Ciskb3V0PSIlcjUiOworCitAWFg9KCIlcjYiLCIlcjciKTsKK0BUWD0oIiVyOCIsIiVyOSIpOworJFlZPSIlcjEwIjsKKyRUWT0iJXIxMSI7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlSQzQKKy50eXBlCVJDNCxcQGZ1bmN0aW9uCisuYWxpZ24JNjQKK1JDNDoKKwlzdG0ke2d9CSVyNiwlcjExLDYqJFNJWkVfVCgkc3ApCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGZsYXZvdXIgPX4gLzNbMTJdLyk7CisJbGxnZnIJJGxlbiwkbGVuCitfX18KKyRjb2RlLj08PF9fXzsKKwlsbGdjCSRYWFswXSwwKCRrZXkpCisJbGxnYwkkWVksMSgka2V5KQorCWxhCSRYWFswXSwxKCRYWFswXSkKKwluaWxsCSRYWFswXSwweGZmCisJc3JsZwkkY250LCRsZW4sMworCWx0Z3IJJGNudCwkY250CisJbGxnYwkkVFhbMF0sMigkWFhbMF0sJGtleSkKKwlqegkuTHNob3J0CisJagkuTG9vcDgKKworLmFsaWduCTY0CisuTG9vcDg6CitfX18KK2ZvciAoJGk9MDskaTw4OyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwlsYQkkWVksMCgkWVksJFRYWzBdKQkjICRpCisJbmlsbAkkWVksMjU1CisJbGEJJFhYWzFdLDEoJFhYWzBdKQorCW5pbGwJJFhYWzFdLDI1NQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPT0xKTsKKwlsbGdjCSRhY2MsMigkVFksJGtleSkKK19fXworJGNvZGUuPTw8X19fIGlmICgkaT4xKTsKKwlzbGxnCSRhY2MsJGFjYyw4CisJaWMJJGFjYywyKCRUWSwka2V5KQorX19fCiskY29kZS49PDxfX187CisJbGxnYwkkVFksMigkWVksJGtleSkKKwlzdGMJJFRYWzBdLDIoJFlZLCRrZXkpCisJbGxnYwkkVFhbMV0sMigkWFhbMV0sJGtleSkKKwlzdGMJJFRZLDIoJFhYWzBdLCRrZXkpCisJY3IJJFhYWzFdLCRZWQorCWpuZQkuTGNtb3YkaQorCWxhCSRUWFsxXSwwKCRUWFswXSkKKy5MY21vdiRpOgorCWxhCSRUWSwwKCRUWSwkVFhbMF0pCisJbmlsbAkkVFksMjU1CitfX18KK3B1c2goQFRYLHNoaWZ0KEBUWCkpOyBwdXNoKEBYWCxzaGlmdChAWFgpKTsgICAgICMgInJvdGF0ZSIgcmVnaXN0ZXJzCit9CisKKyRjb2RlLj08PF9fXzsKKwlsZwkkVFhbMV0sMCgkaW5wKQorCXNsbGcJJGFjYywkYWNjLDgKKwlsYQkkaW5wLDgoJGlucCkKKwlpYwkkYWNjLDIoJFRZLCRrZXkpCisJeGdyCSRhY2MsJFRYWzFdCisJc3RnCSRhY2MsMCgkb3V0KQorCWxhCSRvdXQsOCgkb3V0KQorCWJyY3RnCSRjbnQsLkxvb3A4CisKKy5Mc2hvcnQ6CisJbGdoaQkkYWNjLDcKKwluZ3IJJGxlbiwkYWNjCisJanoJLkxleGl0CisJagkuTG9vcDEKKworLmFsaWduCTE2CisuTG9vcDE6CisJbGEJJFlZLDAoJFlZLCRUWFswXSkKKwluaWxsCSRZWSwyNTUKKwlsbGdjCSRUWSwyKCRZWSwka2V5KQorCXN0YwkkVFhbMF0sMigkWVksJGtleSkKKwlzdGMJJFRZLDIoJFhYWzBdLCRrZXkpCisJYXIJJFRZLCRUWFswXQorCWFoaQkkWFhbMF0sMQorCW5pbGwJJFRZLDI1NQorCW5pbGwJJFhYWzBdLDI1NQorCWxsZ2MJJGFjYywwKCRpbnApCisJbGEJJGlucCwxKCRpbnApCisJbGxnYwkkVFksMigkVFksJGtleSkKKwlsbGdjCSRUWFswXSwyKCRYWFswXSwka2V5KQorCXhyCSRhY2MsJFRZCisJc3RjCSRhY2MsMCgkb3V0KQorCWxhCSRvdXQsMSgkb3V0KQorCWJyY3QJJGxlbiwuTG9vcDEKKworLkxleGl0OgorCWFoaQkkWFhbMF0sLTEKKwlzdGMJJFhYWzBdLDAoJGtleSkKKwlzdGMJJFlZLDEoJGtleSkKKwlsbSR7Z30JJXI2LCVyMTEsNiokU0laRV9UKCRzcCkKKwlicgkkcnAKKy5zaXplCVJDNCwuLVJDNAorLnN0cmluZwkiUkM0IGZvciBzMzkweCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKworX19fCit9CisKKyMgdm9pZCBSQzRfc2V0X2tleShSQzRfS0VZICprZXksdW5zaWduZWQgaW50IGxlbixjb25zdCB2b2lkICppbnApCit7CiskY250PSIlcjAiOworJGlkeD0iJXIxIjsKKyRrZXk9IiVyMiI7CiskbGVuPSIlcjMiOworJGlucD0iJXI0IjsKKyRhY2M9IiVyNSI7CiskZGF0PSIlcjYiOworJGlrZXk9IiVyNyI7CiskaWlucD0iJXI4IjsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCXByaXZhdGVfUkM0X3NldF9rZXkKKy50eXBlCXByaXZhdGVfUkM0X3NldF9rZXksXEBmdW5jdGlvbgorLmFsaWduCTY0Citwcml2YXRlX1JDNF9zZXRfa2V5OgorCXN0bSR7Z30JJXI2LCVyOCw2KiRTSVpFX1QoJHNwKQorCWxoaQkkY250LDI1NgorCWxhCSRpZHgsMCglcjApCisJc3RoCSRpZHgsMCgka2V5KQorLmFsaWduCTQKKy5MMXN0bG9vcDoKKwlzdGMJJGlkeCwyKCRpZHgsJGtleSkKKwlsYQkkaWR4LDEoJGlkeCkKKwlicmN0CSRjbnQsLkwxc3Rsb29wCisKKwlsZ2hpCSRpa2V5LC0yNTYKKwlscgkkY250LCRsZW4KKwlsYQkkaWlucCwwKCVyMCkKKwlsYQkkaWR4LDAoJXIwKQorLmFsaWduCTE2CisuTDJuZGxvb3A6CisJbGxnYwkkYWNjLDIrMjU2KCRpa2V5LCRrZXkpCisJbGxnYwkkZGF0LDAoJGlpbnAsJGlucCkKKwlsYQkkaWR4LDAoJGlkeCwkYWNjKQorCWxhCSRpa2V5LDEoJGlrZXkpCisJbGEJJGlkeCwwKCRpZHgsJGRhdCkKKwluaWxsCSRpZHgsMjU1CisJbGEJJGlpbnAsMSgkaWlucCkKKwl0bWwJJGlrZXksMjU1CisJbGxnYwkkZGF0LDIoJGlkeCwka2V5KQorCXN0YwkkZGF0LDIrMjU2LTEoJGlrZXksJGtleSkKKwlzdGMJJGFjYywyKCRpZHgsJGtleSkKKwlqegkuTGRvbmUKKwlicmN0CSRjbnQsLkwybmRsb29wCisJbHIJJGNudCwkbGVuCisJbGEJJGlpbnAsMCglcjApCisJagkuTDJuZGxvb3AKKy5MZG9uZToKKwlsbSR7Z30JJXI2LCVyOCw2KiRTSVpFX1QoJHNwKQorCWJyCSRycAorLnNpemUJcHJpdmF0ZV9SQzRfc2V0X2tleSwuLXByaXZhdGVfUkM0X3NldF9rZXkKKworX19fCit9CisKKyMgY29uc3QgY2hhciAqUkM0X29wdGlvbnMoKQorJGNvZGUuPTw8X19fOworLmdsb2JsCVJDNF9vcHRpb25zCisudHlwZQlSQzRfb3B0aW9ucyxcQGZ1bmN0aW9uCisuYWxpZ24JMTYKK1JDNF9vcHRpb25zOgorCWxhcmwJJXIyLC5Mb3B0aW9ucworCWJyCSVyMTQKKy5zaXplCVJDNF9vcHRpb25zLC4tUkM0X29wdGlvbnMKKy5zZWN0aW9uCS5yb2RhdGEKKy5Mb3B0aW9uczoKKy5hbGlnbgk4Cisuc3RyaW5nCSJyYzQoOHgsY2hhcikiCitfX18KKworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CSMgZm9yY2UgZmx1c2gKZGlmZiAtLWdpdCBhL2puaS9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC14ODZfNjQucGwgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2ZWFjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsCkBAIC0wLDAgKzEsNjc2IEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBKdWx5IDIwMDQKKyMKKyMgMi4yMnggUkM0IHR1bmUtdXA6LSkgSXQgc2hvdWxkIGJlIG5vdGVkIHRob3VnaCB0aGF0IG15IGhhbmQgW2FzIGluCisjICJoYW5kLWNvZGVkIGFzc2VtYmxlciJdIGRvZXNuJ3Qgc3RhbmQgZm9yIHRoZSB3aG9sZSBpbXByb3ZlbWVudAorIyBjb2VmZmljaWVudC4gSXQgdHVybmVkIG91dCB0aGF0IGVsaW1pbmF0aW5nIFJDNF9DSEFSIGZyb20gY29uZmlnCisjIGxpbmUgcmVzdWx0cyBpbiB+NDAlIGltcHJvdmVtZW50ICh5ZXMsIGV2ZW4gZm9yIEMgaW1wbGVtZW50YXRpb24pLgorIyBQcmVzdW1hYmx5IGl0IGhhcyBldmVyeXRoaW5nIHRvIGRvIHdpdGggQU1EIGNhY2hlIGFyY2hpdGVjdHVyZSBhbmQKKyMgUkFXIG9yIHdoYXRldmVyIHBlbmFsdGllcy4gT25jZSBhZ2FpbiEgVGhlIG1vZHVsZSAqcmVxdWlyZXMqIGNvbmZpZworIyBsaW5lICp3aXRob3V0KiBSQzRfQ0hBUiEgQXMgZm9yIGNvZGluZyAic2VjcmV0LCIgSSBiZXQgb24gcGFydGlhbAorIyByZWdpc3RlciBhcml0aG1ldGljcy4gRm9yIGV4YW1wbGUgaW5zdGVhZCBvZiAnaW5jICVyODsgYW5kICQyNTUsJXI4JworIyBJIHNpbXBseSAnaW5jICVyOGInLiBFdmVuIHRob3VnaCBvcHRpbWl6YXRpb24gbWFudWFsIGRpc2NvdXJhZ2VzCisjIHRvIG9wZXJhdGUgb24gcGFydGlhbCByZWdpc3RlcnMsIGl0IHR1cm5lZCBvdXQgdG8gYmUgdGhlIGJlc3QgYmV0LgorIyBBdCBsZWFzdCBmb3IgQU1ELi4uIEhvdyBJQTMyRSB3b3VsZCBwZXJmb3JtIHJlbWFpbnMgdG8gYmUgc2Vlbi4uLgorCisjIE5vdmVtYmVyIDIwMDQKKyMKKyMgQXMgd2FzIHNob3duIGJ5IE1hcmMgQmV2YW5kIHJlb3JkZXJpbmcgb2YgY291cGxlIG9mIGxvYWQgb3BlcmF0aW9ucworIyByZXN1bHRzIGluIGV2ZW4gaGlnaGVyIHBlcmZvcm1hbmNlIGdhaW4gb2YgMy4zeDotKSBBdCBsZWFzdCBvbgorIyBPcHRlcm9uLi4uIEZvciByZWZlcmVuY2UsIDF4IGluIHRoaXMgY2FzZSBpcyBSQzRfQ0hBUiBDLWNvZGUKKyMgY29tcGlsZWQgd2l0aCBnY2MgMy4zLjIsIHdoaWNoIHBlcmZvcm1zIGF0IH41NE1CcHMgcGVyIDFHSHogY2xvY2suCisjIExhdHRlciBtZWFucyB0aGF0IGlmIHlvdSB3YW50IHRvICplc3RpbWF0ZSogd2hhdCB0byBleHBlY3QgZnJvbQorIyAqeW91ciogT3B0ZXJvbiwgdGhlbiBtdWx0aXBseSA1NCBieSAzLjMgYW5kIGNsb2NrIGZyZXF1ZW5jeSBpbiBHSHouCisKKyMgTm92ZW1iZXIgMjAwNAorIworIyBJbnRlbCBQNCBFTTY0VCBjb3JlIHdhcyBmb3VuZCB0byBydW4gdGhlIEFNRDY0IGNvZGUgcmVhbGx5IHNsb3cuLi4KKyMgVGhlIG9ubHkgd2F5IHRvIGFjaGlldmUgY29tcGFyYWJsZSBwZXJmb3JtYW5jZSBvbiBQNCB3YXMgdG8ga2VlcAorIyBSQzRfQ0hBUi4gS2luZCBvZiBpcm9uaWMsIGh1aD8gQXMgaXQncyBhcHBhcmVudGx5IGltcG9zc2libGUgdG8KKyMgY29tcG9zZSBibGVuZGVkIGNvZGUsIHdoaWNoIHdvdWxkIHBlcmZvcm0gZXZlbiB3aXRoaW4gMzAlIG1hcmdpbmFsCisjIG9uIGVpdGhlciBBTUQgYW5kIEludGVsIHBsYXRmb3JtcywgSSBpbXBsZW1lbnQgYm90aCBjYXNlcy4gU2VlCisjIHJjNF9za2V5LmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4uLgorCisjIEFwcmlsIDIwMDUKKyMKKyMgUDQgRU02NFQgY29yZSBhcHBlYXJzIHRvIGJlICJhbGxlcmdpYyIgdG8gNjQtYml0IGluYy9kZWMuIFJlcGxhY2luZyAKKyMgdGhvc2Ugd2l0aCBhZGQvc3ViIHJlc3VsdHMgaW4gNTAlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9mIGZvbGRlZAorIyBsb29wLi4uCisKKyMgTWF5IDIwMDUKKyMKKyMgQXMgd2FzIHNob3duIGJ5IFpvdSBOYW5oYWkgbG9vcCB1bnJvbGxpbmcgY2FuIGltcHJvdmUgSW50ZWwgRU02NFQKKyMgcGVyZm9ybWFuY2UgYnkgPjMwJSBbdW5saWtlIFA0IDMyLWJpdCBjYXNlIHRoYXQgaXNdLiBCdXQgdGhpcyBpcworIyBwcm92aWRlZCB0aGF0IGxvYWRzIGFyZSByZW9yZGVyZWQgZXZlbiBtb3JlIGFnZ3Jlc3NpdmVseSEgQm90aCBjb2RlCisjIHBhdGhlcywgQU1ENjQgYW5kIEVNNjRULCByZW9yZGVyIGxvYWRzIGluIGVzc2VudGlhbGx5IHNhbWUgbWFubmVyCisjIGFzIG15IElBLTY0IGltcGxlbWVudGF0aW9uLiBPbiBPcHRlcm9uIHRoaXMgcmVzdWx0ZWQgaW4gbW9kZXN0IDUlCisjIGltcHJvdmVtZW50IFtJIGhhZCB0byB0ZXN0IGl0XSwgd2hpbGUgZmluYWwgSW50ZWwgUDQgcGVyZm9ybWFuY2UKKyMgYWNoaWV2ZXMgcmVzcGVjdGZ1bCA0MzJNQnBzIG9uIDIuOEdIeiBwcm9jZXNzb3Igbm93LiBGb3IgcmVmZXJlbmNlLgorIyBJZiBleGVjdXRlZCBvbiBYZW9uLCBjdXJyZW50IFJDNF9DSEFSIGNvZGUtcGF0aCBpcyAyLjd4IGZhc3RlciB0aGFuCisjIFJDNF9JTlQgY29kZS1wYXRoLiBXaGlsZSBpZiBleGVjdXRlZCBvbiBPcHRlcm9uLCBpdCdzIG9ubHkgMjUlCisjIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSC1LWFyY2ggZGV0ZWN0aW9uCisjIGlzIG5vdCBpbXBsZW1lbnRlZCwgdGhlbiB0aGlzIGZpbmFsIFJDNF9DSEFSIGNvZGUtcGF0aCBzaG91bGQgYmUKKyMgcHJlZmVycmVkLCBhcyBpdCBwcm92aWRlcyBiZXR0ZXIgKmFsbC1yb3VuZCogcGVyZm9ybWFuY2VdLgorCisjIE1hcmNoIDIwMDcKKyMKKyMgSW50ZWwgQ29yZTIgd2FzIG9ic2VydmVkIHRvIHBlcmZvcm0gcG9vcmx5IG9uIGJvdGggY29kZSBwYXRoczotKCBJdAorIyBhcHBhcmVudGx5IHN1ZmZlcnMgZnJvbSBzb21lIGtpbmQgb2YgcGFydGlhbCByZWdpc3RlciBzdGFsbCwgd2hpY2gKKyMgb2NjdXJzIGluIDY0LWJpdCBtb2RlIG9ubHkgW2FzIHZpcnR1YWxseSBpZGVudGljYWwgMzItYml0IGxvb3Agd2FzCisjIG9ic2VydmVkIHRvIG91dHBlcmZvcm0gNjQtYml0IG9uZSBieSBhbG1vc3QgNTAlXS4gQWRkaW5nIHR3byBtb3Z6YiB0bworIyBjbG9vcDEgYm9vc3RzIGl0cyBwZXJmb3JtYW5jZSBieSA4MCUhIFRoaXMgbG9vcCBhcHBlYXJzIHRvIGJlIG9wdGltYWwKKyMgZml0IGZvciBDb3JlMiBhbmQgdGhlcmVmb3JlIHRoZSBjb2RlIHdhcyBtb2RpZmllZCB0byBza2lwIGNsb29wOCBvbgorIyB0aGlzIENQVS4KKworIyBNYXkgMjAxMAorIworIyBJbnRlbCBXZXN0bWVyZSB3YXMgb2JzZXJ2ZWQgdG8gcGVyZm9ybSBzdWJvcHRpbWFsbHkuIEFkZGluZyB5ZXQKKyMgYW5vdGhlciBtb3Z6YiB0byBjbG9vcDEgaW1wcm92ZWQgcGVyZm9ybWFuY2UgYnkgYWxtb3N0IDUwJSEgQ29yZTIKKyMgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQgdG9vLCBidXQgbm9taW5hbGx5Li4uCisKKyMgTWF5IDIwMTEKKyMKKyMgVGhlIG9ubHkgY29kZSBwYXRoIHRoYXQgd2FzIG5vdCBtb2RpZmllZCBpcyBQNC1zcGVjaWZpYyBvbmUuIE5vbi1QNAorIyBJbnRlbCBjb2RlIHBhdGggb3B0aW1pemF0aW9uIGlzIGhlYXZpbHkgYmFzZWQgb24gc3VibWlzc2lvbiBieSBNYXhpbQorIyBQZXJtaW5vdiwgTWF4aW0gTG9ja3R5dWtoaW4gYW5kIEppbSBHdWlsZm9yZCBvZiBJbnRlbC4gSSd2ZSB1c2VkCisjIHNvbWUgb2YgdGhlIGlkZWFzIGV2ZW4gaW4gYXR0ZW1wdCB0byBvcHRtaXplIHRoZSBvcmlnaW5hbCBSQzRfSU5UCisjIGNvZGUgcGF0aC4uLiBDdXJyZW50IHBlcmZvcm1hbmNlIGluIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUgKGxlc3MKKyMgaXMgYmV0dGVyKSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnRzIHJlbGF0aXZlIHRvIHByZXZpb3VzCisjIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgYXJlOgorIworIyBPcHRlcm9uCTUuMy8rMCUoKikKKyMgUDQJCTYuNQorIyBDb3JlMgkJNi4yLysxNSUoKiopCisjIFdlc3RtZXJlCTQuMi8rNjAlCisjIFNhbmR5IEJyaWRnZQk0LjIvKzEyMCUKKyMgQXRvbQkJOS4zLys4MCUKKyMKKyMgKCopCUJ1dCBjb3JyZXNwb25kaW5nIGxvb3AgaGFzIGxlc3MgaW5zdHJ1Y3Rpb25zLCB3aGljaCBzaG91bGQgaGF2ZQorIwlwb3NpdGl2ZSBlZmZlY3Qgb24gdXBjb21pbmcgQnVsbGRvemVyLCB3aGljaCBoYXMgb25lIGxlc3MgQUxVLgorIwlGb3IgcmVmZXJlbmNlLCBJbnRlbCBjb2RlIHJ1bnMgYXQgNi44IGNwYiByYXRlIG9uIE9wdGVyb24uCisjICgqKikJTm90ZSB0aGF0IENvcmUyIHJlc3VsdCBpcyB+MTUlIGxvd2VyIHRoYW4gY29ycmVzcG9uZGluZyByZXN1bHQKKyMJZm9yIDMyLWJpdCBjb2RlLCBtZWFuaW5nIHRoYXQgaXQncyBwb3NzaWJsZSB0byBpbXByb3ZlIGl0LAorIwlidXQgbW9yZSB0aGFuIGxpa2VseSBhdCB0aGUgY29zdCBvZiB0aGUgb3RoZXJzIChzZWUgcmM0LTU4Ni5wbAorIwl0byBnZXQgdGhlIGlkZWEpLi4uCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitvcGVuIFNURE9VVCwifCAkXlggJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworCiskZGF0PSIlcmRpIjsJICAgICMgYXJnMQorJGxlbj0iJXJzaSI7CSAgICAjIGFyZzIKKyRpbnA9IiVyZHgiOwkgICAgIyBhcmczCiskb3V0PSIlcmN4IjsJICAgICMgYXJnNAorCit7CiskY29kZT08PF9fXzsKKy50ZXh0CisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisKKy5nbG9ibAlSQzQKKy50eXBlCVJDNCxcQGZ1bmN0aW9uLDQKKy5hbGlnbgkxNgorUkM0OglvcgkkbGVuLCRsZW4KKwlqbmUJLkxlbnRyeQorCXJldAorLkxlbnRyeToKKwlwdXNoCSVyYngKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKy5McHJvbG9ndWU6CisJbW92CSRsZW4sJXIxMQorCW1vdgkkaW5wLCVyMTIKKwltb3YJJG91dCwlcjEzCitfX18KK215ICRsZW49IiVyMTEiOwkJIyByZWFzc2lnbiBpbnB1dCBhcmd1bWVudHMKK215ICRpbnA9IiVyMTIiOworbXkgJG91dD0iJXIxMyI7CisKK215IEBYWD0oIiVyMTAiLCIlcnNpIik7CitteSBAVFg9KCIlcmF4IiwiJXJieCIpOworbXkgJFlZPSIlcmN4IjsKK215ICRUWT0iJXJkeCI7CisKKyRjb2RlLj08PF9fXzsKKwl4b3IJJFhYWzBdLCRYWFswXQorCXhvcgkkWVksJFlZCisKKwlsZWEJOCgkZGF0KSwkZGF0CisJbW92CS04KCRkYXQpLCRYWFswXSNiCisJbW92CS00KCRkYXQpLCRZWSNiCisJY21wbAlcJC0xLDI1NigkZGF0KQorCWplCS5MUkM0X0NIQVIKKwltb3YJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXI4ZAorCXhvcgkkVFhbMV0sJFRYWzFdCisJaW5jCSRYWFswXSNiCisJc3ViCSRYWFswXSwkVFhbMV0KKwlzdWIJJGlucCwkb3V0CisJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKKwl0ZXN0CVwkLTE2LCRsZW4KKwlqegkuTGxvb3AxCisJYnQJXCQzMCwlcjhkCSMgSW50ZWwgQ1BVPworCWpjCS5MaW50ZWwKKwlhbmQJXCQ3LCRUWFsxXQorCWxlYQkxKCRYWFswXSksJFhYWzFdCisJanoJLkxvb3A4CisJc3ViCSRUWFsxXSwkbGVuCisuTG9vcDhfd2FybXVwOgorCWFkZAkkVFhbMF0jYiwkWVkjYgorCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCisJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKKwltb3ZsCSRUWSNkLCgkZGF0LCRYWFswXSw0KQorCWFkZAkkVFkjYiwkVFhbMF0jYgorCWluYwkkWFhbMF0jYgorCW1vdmwJKCRkYXQsJFRYWzBdLDQpLCRUWSNkCisJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKKwl4b3JiCSgkaW5wKSwkVFkjYgorCW1vdmIJJFRZI2IsKCRvdXQsJGlucCkKKwlsZWEJMSgkaW5wKSwkaW5wCisJZGVjCSRUWFsxXQorCWpuegkuTG9vcDhfd2FybXVwCisKKwlsZWEJMSgkWFhbMF0pLCRYWFsxXQorCWptcAkuTG9vcDgKKy5hbGlnbgkxNgorLkxvb3A4OgorX19fCitmb3IgKCRpPTA7JGk8ODskaSsrKSB7CiskY29kZS49PDxfX18gaWYgKCRpPT03KTsKKwlhZGQJXCQ4LCRYWFsxXSNiCitfX18KKyRjb2RlLj08PF9fXzsKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAorCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCisJbW92bAlgNCooJGk9PTc/LTE6JGkpYCgkZGF0LCRYWFsxXSw0KSwkVFhbMV0jZAorCXJvcglcJDgsJXI4CQkJCSMgcm9yIGlzIHJlZHVuZGFudCB3aGVuICRpPTAKKwltb3ZsCSRUWSNkLDQqJGkoJGRhdCwkWFhbMF0sNCkKKwlhZGQJJFRYWzBdI2IsJFRZI2IKKwltb3ZiCSgkZGF0LCRUWSw0KSwlcjhiCitfX18KK3B1c2goQFRYLHNoaWZ0KEBUWCkpOyAjcHVzaChAWFgsc2hpZnQoQFhYKSk7CSMgInJvdGF0ZSIgcmVnaXN0ZXJzCit9CiskY29kZS49PDxfX187CisJYWRkCVwkOCwkWFhbMF0jYgorCXJvcglcJDgsJXI4CisJc3ViCVwkOCwkbGVuCisKKwl4b3IJKCRpbnApLCVyOAorCW1vdgklcjgsKCRvdXQsJGlucCkKKwlsZWEJOCgkaW5wKSwkaW5wCisKKwl0ZXN0CVwkLTgsJGxlbgorCWpuegkuTG9vcDgKKwljbXAJXCQwLCRsZW4KKwlqbmUJLkxsb29wMQorCWptcAkuTGV4aXQKKworLmFsaWduCTE2CisuTGludGVsOgorCXRlc3QJXCQtMzIsJGxlbgorCWp6CS5MbG9vcDEKKwlhbmQJXCQxNSwkVFhbMV0KKwlqegkuTG9vcDE2X2lzX2hvdAorCXN1YgkkVFhbMV0sJGxlbgorLkxvb3AxNl93YXJtdXA6CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCisJYWRkCSRUWSNiLCRUWFswXSNiCisJaW5jCSRYWFswXSNiCisJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKKwltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAorCXhvcmIJKCRpbnApLCRUWSNiCisJbW92YgkkVFkjYiwoJG91dCwkaW5wKQorCWxlYQkxKCRpbnApLCRpbnAKKwlkZWMJJFRYWzFdCisJam56CS5Mb29wMTZfd2FybXVwCisKKwltb3YJJFlZLCRUWFsxXQorCXhvcgkkWVksJFlZCisJbW92CSRUWFsxXSNiLCRZWSNiCisKKy5Mb29wMTZfaXNfaG90OgorCWxlYQkoJGRhdCwkWFhbMF0sNCksJFhYWzFdCitfX18KK3N1YiBSQzRfbG9vcCB7CisgIG15ICRpPXNoaWZ0OworICBteSAkaj0kaTwwPzA6JGk7CisgIG15ICR4bW09IiV4bW0iLigkaiYxKTsKKworICAgICRjb2RlLj0iCWFkZAlcJDE2LCRYWFswXSNiXG4iCQlpZiAoJGk9PTE1KTsKKyAgICAkY29kZS49Igltb3ZkcXUJKCRpbnApLCV4bW0yXG4iCQkJaWYgKCRpPT0xNSk7CisgICAgJGNvZGUuPSIJYWRkCSRUWFswXSNiLCRZWSNiXG4iCQlpZiAoJGk8PTApOworICAgICRjb2RlLj0iCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkXG4iOworICAgICRjb2RlLj0iCXB4b3IJJXhtbTAsJXhtbTJcbiIJCQlpZiAoJGk9PTApOworICAgICRjb2RlLj0iCXBzbGxxCVwkOCwleG1tMVxuIgkJCWlmICgkaT09MCk7CisgICAgJGNvZGUuPSIJcHhvcgkkeG1tLCR4bW1cbiIJCQlpZiAoJGk8PTEpOworICAgICRjb2RlLj0iCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpXG4iOworICAgICRjb2RlLj0iCWFkZAkkVFkjYiwkVFhbMF0jYlxuIjsKKyAgICAkY29kZS49Igltb3ZsCWA0KigkaisxKWAoJFhYWzFdKSwkVFhbMV0jZFxuIglpZiAoJGk8MTUpOworICAgICRjb2RlLj0iCW1vdnoJJFRYWzBdI2IsJFRYWzBdI2RcbiI7CisgICAgJGNvZGUuPSIJbW92bAkkVFkjZCw0KiRqKCRYWFsxXSlcbiI7CisgICAgJGNvZGUuPSIJcHhvcgkleG1tMSwleG1tMlxuIgkJCWlmICgkaT09MCk7CisgICAgJGNvZGUuPSIJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV1cbiIJaWYgKCRpPT0xNSk7CisgICAgJGNvZGUuPSIJYWRkCSRUWFsxXSNiLCRZWSNiXG4iCQlpZiAoJGk8MTUpOworICAgICRjb2RlLj0iCXBpbnNydwlcJGAoJGo+PjEpJjdgLCgkZGF0LCRUWFswXSw0KSwkeG1tXG4iOworICAgICRjb2RlLj0iCW1vdmRxdQkleG1tMiwoJG91dCwkaW5wKVxuIgkJaWYgKCRpPT0wKTsKKyAgICAkY29kZS49IglsZWEJMTYoJGlucCksJGlucFxuIgkJaWYgKCRpPT0wKTsKKyAgICAkY29kZS49Igltb3ZsCSgkWFhbMV0pLCRUWFsxXSNkXG4iCQlpZiAoJGk9PTE1KTsKK30KKwlSQzRfbG9vcCgtMSk7CiskY29kZS49PDxfX187CisJam1wCS5Mb29wMTZfZW50ZXIKKy5hbGlnbgkxNgorLkxvb3AxNjoKK19fXworCitmb3IgKCRpPTA7JGk8MTY7JGkrKykgeworICAgICRjb2RlLj0iLkxvb3AxNl9lbnRlcjpcbiIJCWlmICgkaT09MSk7CisJUkM0X2xvb3AoJGkpOworCXB1c2goQFRYLHNoaWZ0KEBUWCkpOyAJCSMgInJvdGF0ZSIgcmVnaXN0ZXJzCit9CiskY29kZS49PDxfX187CisJbW92CSRZWSwkVFhbMV0KKwl4b3IJJFlZLCRZWQkJCSMga2V5d29yZCB0byBwYXJ0aWFsIHJlZ2lzdGVyCisJc3ViCVwkMTYsJGxlbgorCW1vdgkkVFhbMV0jYiwkWVkjYgorCXRlc3QJXCQtMTYsJGxlbgorCWpuegkuTG9vcDE2CisKKwlwc2xscQlcJDgsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMgorCW1vdmRxdQkleG1tMiwoJG91dCwkaW5wKQorCWxlYQkxNigkaW5wKSwkaW5wCisKKwljbXAJXCQwLCRsZW4KKwlqbmUJLkxsb29wMQorCWptcAkuTGV4aXQKKworLmFsaWduCTE2CisuTGxvb3AxOgorCWFkZAkkVFhbMF0jYiwkWVkjYgorCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCisJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKKwltb3ZsCSRUWSNkLCgkZGF0LCRYWFswXSw0KQorCWFkZAkkVFkjYiwkVFhbMF0jYgorCWluYwkkWFhbMF0jYgorCW1vdmwJKCRkYXQsJFRYWzBdLDQpLCRUWSNkCisJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKKwl4b3JiCSgkaW5wKSwkVFkjYgorCW1vdmIJJFRZI2IsKCRvdXQsJGlucCkKKwlsZWEJMSgkaW5wKSwkaW5wCisJZGVjCSRsZW4KKwlqbnoJLkxsb29wMQorCWptcAkuTGV4aXQKKworLmFsaWduCTE2CisuTFJDNF9DSEFSOgorCWFkZAlcJDEsJFhYWzBdI2IKKwltb3Z6YgkoJGRhdCwkWFhbMF0pLCRUWFswXSNkCisJdGVzdAlcJC04LCRsZW4KKwlqegkuTGNsb29wMQorCWptcAkuTGNsb29wOAorLmFsaWduCTE2CisuTGNsb29wODoKKwltb3YJKCRpbnApLCVyOGQKKwltb3YJNCgkaW5wKSwlcjlkCitfX18KKyMgdW5yb2xsIDJ4NC13aXNlLCBiZWNhdXNlIDY0LWJpdCByb3RhdGVzIGtpbGwgSW50ZWwgUDQuLi4KK2ZvciAoJGk9MDskaTw0OyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwlsZWEJMSgkWFhbMF0pLCRYWFsxXQorCW1vdnpiCSgkZGF0LCRZWSksJFRZI2QKKwltb3Z6YgkkWFhbMV0jYiwkWFhbMV0jZAorCW1vdnpiCSgkZGF0LCRYWFsxXSksJFRYWzFdI2QKKwltb3ZiCSRUWFswXSNiLCgkZGF0LCRZWSkKKwljbXAJJFhYWzFdLCRZWQorCW1vdmIJJFRZI2IsKCRkYXQsJFhYWzBdKQorCWpuZQkuTGNtb3YkaQkJCSMgSW50ZWwgY21vdiBpcyBzbG9vb293Li4uCisJbW92CSRUWFswXSwkVFhbMV0KKy5MY21vdiRpOgorCWFkZAkkVFhbMF0jYiwkVFkjYgorCXhvcgkoJGRhdCwkVFkpLCVyOGIKKwlyb3IJXCQ4LCVyOGQKK19fXworcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycworfQorZm9yICgkaT00OyRpPDg7JGkrKykgeworJGNvZGUuPTw8X19fOworCWFkZAkkVFhbMF0jYiwkWVkjYgorCWxlYQkxKCRYWFswXSksJFhYWzFdCisJbW92emIJKCRkYXQsJFlZKSwkVFkjZAorCW1vdnpiCSRYWFsxXSNiLCRYWFsxXSNkCisJbW92emIJKCRkYXQsJFhYWzFdKSwkVFhbMV0jZAorCW1vdmIJJFRYWzBdI2IsKCRkYXQsJFlZKQorCWNtcAkkWFhbMV0sJFlZCisJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCisJam5lCS5MY21vdiRpCQkJIyBJbnRlbCBjbW92IGlzIHNsb29vb3cuLi4KKwltb3YJJFRYWzBdLCRUWFsxXQorLkxjbW92JGk6CisJYWRkCSRUWFswXSNiLCRUWSNiCisJeG9yCSgkZGF0LCRUWSksJXI5YgorCXJvcglcJDgsJXI5ZAorX19fCitwdXNoKEBUWCxzaGlmdChAVFgpKTsgcHVzaChAWFgsc2hpZnQoQFhYKSk7CSMgInJvdGF0ZSIgcmVnaXN0ZXJzCit9CiskY29kZS49PDxfX187CisJbGVhCS04KCRsZW4pLCRsZW4KKwltb3YJJXI4ZCwoJG91dCkKKwlsZWEJOCgkaW5wKSwkaW5wCisJbW92CSVyOWQsNCgkb3V0KQorCWxlYQk4KCRvdXQpLCRvdXQKKworCXRlc3QJXCQtOCwkbGVuCisJam56CS5MY2xvb3A4CisJY21wCVwkMCwkbGVuCisJam5lCS5MY2xvb3AxCisJam1wCS5MZXhpdAorX19fCiskY29kZS49PDxfX187CisuYWxpZ24JMTYKKy5MY2xvb3AxOgorCWFkZAkkVFhbMF0jYiwkWVkjYgorCW1vdnpiCSRZWSNiLCRZWSNkCisJbW92emIJKCRkYXQsJFlZKSwkVFkjZAorCW1vdmIJJFRYWzBdI2IsKCRkYXQsJFlZKQorCW1vdmIJJFRZI2IsKCRkYXQsJFhYWzBdKQorCWFkZAkkVFhbMF0jYiwkVFkjYgorCWFkZAlcJDEsJFhYWzBdI2IKKwltb3Z6YgkkVFkjYiwkVFkjZAorCW1vdnpiCSRYWFswXSNiLCRYWFswXSNkCisJbW92emIJKCRkYXQsJFRZKSwkVFkjZAorCW1vdnpiCSgkZGF0LCRYWFswXSksJFRYWzBdI2QKKwl4b3JiCSgkaW5wKSwkVFkjYgorCWxlYQkxKCRpbnApLCRpbnAKKwltb3ZiCSRUWSNiLCgkb3V0KQorCWxlYQkxKCRvdXQpLCRvdXQKKwlzdWIJXCQxLCRsZW4KKwlqbnoJLkxjbG9vcDEKKwlqbXAJLkxleGl0CisKKy5hbGlnbgkxNgorLkxleGl0OgorCXN1YglcJDEsJFhYWzBdI2IKKwltb3ZsCSRYWFswXSNkLC04KCRkYXQpCisJbW92bAkkWVkjZCwtNCgkZGF0KQorCisJbW92CSglcnNwKSwlcjEzCisJbW92CTgoJXJzcCksJXIxMgorCW1vdgkxNiglcnNwKSwlcmJ4CisJYWRkCVwkMjQsJXJzcAorLkxlcGlsb2d1ZToKKwlyZXQKKy5zaXplCVJDNCwuLVJDNAorX19fCit9CisKKyRpZHg9IiVyOCI7CiskaWRvPSIlcjkiOworCiskY29kZS49PDxfX187CisuZ2xvYmwJcHJpdmF0ZV9SQzRfc2V0X2tleQorLnR5cGUJcHJpdmF0ZV9SQzRfc2V0X2tleSxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorcHJpdmF0ZV9SQzRfc2V0X2tleToKKwlsZWEJOCgkZGF0KSwkZGF0CisJbGVhCSgkaW5wLCRsZW4pLCRpbnAKKwluZWcJJGxlbgorCW1vdgkkbGVuLCVyY3gKKwl4b3IJJWVheCwlZWF4CisJeG9yCSRpZG8sJGlkbworCXhvcgklcjEwLCVyMTAKKwl4b3IJJXIxMSwlcjExCisKKwltb3YJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJGlkeCNkCisJYnQJXCQyMCwkaWR4I2QJIyBSQzRfQ0hBUj8KKwlqYwkuTGMxc3Rsb29wCisJam1wCS5MdzFzdGxvb3AKKworLmFsaWduCTE2CisuTHcxc3Rsb29wOgorCW1vdgklZWF4LCgkZGF0LCVyYXgsNCkKKwlhZGQJXCQxLCVhbAorCWpuYwkuTHcxc3Rsb29wCisKKwl4b3IJJGlkbywkaWRvCisJeG9yCSRpZHgsJGlkeAorLmFsaWduCTE2CisuTHcybmRsb29wOgorCW1vdgkoJGRhdCwkaWRvLDQpLCVyMTBkCisJYWRkCSgkaW5wLCRsZW4sMSksJGlkeCNiCisJYWRkCSVyMTBiLCRpZHgjYgorCWFkZAlcJDEsJGxlbgorCW1vdgkoJGRhdCwkaWR4LDQpLCVyMTFkCisJY21vdnoJJXJjeCwkbGVuCisJbW92CSVyMTBkLCgkZGF0LCRpZHgsNCkKKwltb3YJJXIxMWQsKCRkYXQsJGlkbyw0KQorCWFkZAlcJDEsJGlkbyNiCisJam5jCS5MdzJuZGxvb3AKKwlqbXAJLkxleGl0X2tleQorCisuYWxpZ24JMTYKKy5MYzFzdGxvb3A6CisJbW92CSVhbCwoJGRhdCwlcmF4KQorCWFkZAlcJDEsJWFsCisJam5jCS5MYzFzdGxvb3AKKworCXhvcgkkaWRvLCRpZG8KKwl4b3IJJGlkeCwkaWR4CisuYWxpZ24JMTYKKy5MYzJuZGxvb3A6CisJbW92CSgkZGF0LCRpZG8pLCVyMTBiCisJYWRkCSgkaW5wLCRsZW4pLCRpZHgjYgorCWFkZAklcjEwYiwkaWR4I2IKKwlhZGQJXCQxLCRsZW4KKwltb3YJKCRkYXQsJGlkeCksJXIxMWIKKwlqbnoJLkxjbm93cmFwCisJbW92CSVyY3gsJGxlbgorLkxjbm93cmFwOgorCW1vdgklcjEwYiwoJGRhdCwkaWR4KQorCW1vdgklcjExYiwoJGRhdCwkaWRvKQorCWFkZAlcJDEsJGlkbyNiCisJam5jCS5MYzJuZGxvb3AKKwltb3ZsCVwkLTEsMjU2KCRkYXQpCisKKy5hbGlnbgkxNgorLkxleGl0X2tleToKKwl4b3IJJWVheCwlZWF4CisJbW92CSVlYXgsLTgoJGRhdCkKKwltb3YJJWVheCwtNCgkZGF0KQorCXJldAorLnNpemUJcHJpdmF0ZV9SQzRfc2V0X2tleSwuLXByaXZhdGVfUkM0X3NldF9rZXkKKworLmdsb2JsCVJDNF9vcHRpb25zCisudHlwZQlSQzRfb3B0aW9ucyxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK1JDNF9vcHRpb25zOgorCWxlYQkuTG9wdHMoJXJpcCksJXJheAorCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlZWR4CisJYnQJXCQyMCwlZWR4CisJamMJLkw4eGNoYXIKKwlidAlcJDMwLCVlZHgKKwlqbmMJLkxkb25lCisJYWRkCVwkMjUsJXJheAorCXJldAorLkw4eGNoYXI6CisJYWRkCVwkMTIsJXJheAorLkxkb25lOgorCXJldAorLmFsaWduCTY0CisuTG9wdHM6CisuYXNjaXoJInJjNCg4eCxpbnQpIgorLmFzY2l6CSJyYzQoOHgsY2hhcikiCisuYXNjaXoJInJjNCgxNngsaW50KSIKKy5hc2NpegkiUkM0IGZvciB4ODZfNjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JNjQKKy5zaXplCVJDNF9vcHRpb25zLC4tUkM0X29wdGlvbnMKK19fXworCisjIEVYQ0VQVElPTl9ESVNQT1NJVElPTiBoYW5kbGVyIChFWENFUFRJT05fUkVDT1JEICpyZWMsVUxPTkc2NCBmcmFtZSwKKyMJCUNPTlRFWFQgKmNvbnRleHQsRElTUEFUQ0hFUl9DT05URVhUICpkaXNwKQoraWYgKCR3aW42NCkgeworJHJlYz0iJXJjeCI7CiskZnJhbWU9IiVyZHgiOworJGNvbnRleHQ9IiVyOCI7CiskZGlzcD0iJXI5IjsKKworJGNvZGUuPTw8X19fOworLmV4dGVybglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisudHlwZQlzdHJlYW1fc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3N0cmVhbV9zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5McHJvbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPHByb2xvZ3VlIGxhYmVsCisJamIJLkxpbl9wcm9sb2d1ZQorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwlsZWEJLkxlcGlsb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MaW5fcHJvbG9ndWUKKworCWxlYQkyNCglcmF4KSwlcmF4CisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXIxMgorCW1vdgktMjQoJXJheCksJXIxMworCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMworCisuTGluX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJam1wCS5MY29tbW9uX3NlaF9leGl0Cisuc2l6ZQlzdHJlYW1fc2VfaGFuZGxlciwuLXN0cmVhbV9zZV9oYW5kbGVyCisKKy50eXBlCWtleV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgora2V5X3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKy5MY29tbW9uX3NlaF9leGl0OgorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJa2V5X3NlX2hhbmRsZXIsLi1rZXlfc2VfaGFuZGxlcgorCisuc2VjdGlvbgkucGRhdGEKKy5hbGlnbgk0CisJLnJ2YQkuTFNFSF9iZWdpbl9SQzQKKwkucnZhCS5MU0VIX2VuZF9SQzQKKwkucnZhCS5MU0VIX2luZm9fUkM0CisKKwkucnZhCS5MU0VIX2JlZ2luX3ByaXZhdGVfUkM0X3NldF9rZXkKKwkucnZhCS5MU0VIX2VuZF9wcml2YXRlX1JDNF9zZXRfa2V5CisJLnJ2YQkuTFNFSF9pbmZvX3ByaXZhdGVfUkM0X3NldF9rZXkKKworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb19SQzQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc3RyZWFtX3NlX2hhbmRsZXIKKy5MU0VIX2luZm9fcHJpdmF0ZV9SQzRfc2V0X2tleToKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlrZXlfc2VfaGFuZGxlcgorX19fCit9CisKK3N1YiByZWdfcGFydCB7CitteSAoJHJlZywkY29udik9QF87CisgICAgaWYgKCRyZWcgPX4gLyVyWzAtOV0rLykJeyAkcmVnIC49ICRjb252OyB9CisgICAgZWxzaWYgKCRjb252IGVxICJiIikJeyAkcmVnID1+IHMvJVtlcl0oW154XSspeD8vJSQxbC87CX0KKyAgICBlbHNpZiAoJGNvbnYgZXEgInciKQl7ICRyZWcgPX4gcy8lW2VyXSguKykvJSQxLzsJCX0KKyAgICBlbHNpZiAoJGNvbnYgZXEgImQiKQl7ICRyZWcgPX4gcy8lW2VyXSguKykvJWUkMS87CQl9CisgICAgcmV0dXJuICRyZWc7Cit9CisKKyRjb2RlID1+IHMvKCVbYS16MC05XSspIyhbYndkXSkvcmVnX3BhcnQoJDEsJDIpL2dlbTsKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworCitwcmludCAkY29kZTsKKworY2xvc2UgU1RET1VUOwo=